codesift-mcp 0.5.24 → 0.5.28

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) hide show
  1. package/README.md +4 -4
  2. package/dist/cli/commands.d.ts.map +1 -1
  3. package/dist/cli/commands.js +28 -0
  4. package/dist/cli/commands.js.map +1 -1
  5. package/dist/cli/help.js +1 -1
  6. package/dist/cli/help.js.map +1 -1
  7. package/dist/cli/hooks.d.ts +4 -0
  8. package/dist/cli/hooks.d.ts.map +1 -1
  9. package/dist/cli/hooks.js +15 -4
  10. package/dist/cli/hooks.js.map +1 -1
  11. package/dist/cli/journal-commands.d.ts +9 -0
  12. package/dist/cli/journal-commands.d.ts.map +1 -0
  13. package/dist/cli/journal-commands.js +160 -0
  14. package/dist/cli/journal-commands.js.map +1 -0
  15. package/dist/cli/wiki-commands.d.ts.map +1 -1
  16. package/dist/cli/wiki-commands.js +5 -0
  17. package/dist/cli/wiki-commands.js.map +1 -1
  18. package/dist/instructions.d.ts +1 -1
  19. package/dist/instructions.d.ts.map +1 -1
  20. package/dist/instructions.js +41 -47
  21. package/dist/instructions.js.map +1 -1
  22. package/dist/parser/extractors/_shared.d.ts +2 -0
  23. package/dist/parser/extractors/_shared.d.ts.map +1 -1
  24. package/dist/parser/extractors/_shared.js +4 -0
  25. package/dist/parser/extractors/_shared.js.map +1 -1
  26. package/dist/parser/extractors/typescript.d.ts.map +1 -1
  27. package/dist/parser/extractors/typescript.js +606 -31
  28. package/dist/parser/extractors/typescript.js.map +1 -1
  29. package/dist/parser/parse-worker.d.ts +2 -0
  30. package/dist/parser/parse-worker.d.ts.map +1 -0
  31. package/dist/parser/parse-worker.js +47 -0
  32. package/dist/parser/parse-worker.js.map +1 -0
  33. package/dist/parser/parser-manager.d.ts +10 -1
  34. package/dist/parser/parser-manager.d.ts.map +1 -1
  35. package/dist/parser/parser-manager.js +40 -2
  36. package/dist/parser/parser-manager.js.map +1 -1
  37. package/dist/parser/parser-pool.d.ts +31 -0
  38. package/dist/parser/parser-pool.d.ts.map +1 -0
  39. package/dist/parser/parser-pool.js +211 -0
  40. package/dist/parser/parser-pool.js.map +1 -0
  41. package/dist/register-tool-loaders.d.ts +1 -1
  42. package/dist/register-tool-loaders.d.ts.map +1 -1
  43. package/dist/register-tool-loaders.js +2 -2
  44. package/dist/register-tool-loaders.js.map +1 -1
  45. package/dist/register-tools.d.ts.map +1 -1
  46. package/dist/register-tools.js +382 -35
  47. package/dist/register-tools.js.map +1 -1
  48. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
  49. package/dist/retrieval/codebase-retrieval.js +9 -1
  50. package/dist/retrieval/codebase-retrieval.js.map +1 -1
  51. package/dist/search/chunker.d.ts +1 -0
  52. package/dist/search/chunker.d.ts.map +1 -1
  53. package/dist/search/chunker.js +8 -1
  54. package/dist/search/chunker.js.map +1 -1
  55. package/dist/server-helpers.d.ts +27 -0
  56. package/dist/server-helpers.d.ts.map +1 -1
  57. package/dist/server-helpers.js +90 -9
  58. package/dist/server-helpers.js.map +1 -1
  59. package/dist/server.js +31 -0
  60. package/dist/server.js.map +1 -1
  61. package/dist/storage/index-store.d.ts +41 -4
  62. package/dist/storage/index-store.d.ts.map +1 -1
  63. package/dist/storage/index-store.js +89 -6
  64. package/dist/storage/index-store.js.map +1 -1
  65. package/dist/storage/watcher.d.ts +33 -6
  66. package/dist/storage/watcher.d.ts.map +1 -1
  67. package/dist/storage/watcher.js +73 -34
  68. package/dist/storage/watcher.js.map +1 -1
  69. package/dist/storage/workspace-resolver.d.ts +15 -0
  70. package/dist/storage/workspace-resolver.d.ts.map +1 -0
  71. package/dist/storage/workspace-resolver.js +130 -0
  72. package/dist/storage/workspace-resolver.js.map +1 -0
  73. package/dist/tools/_helpers.d.ts +37 -0
  74. package/dist/tools/_helpers.d.ts.map +1 -0
  75. package/dist/tools/_helpers.js +31 -0
  76. package/dist/tools/_helpers.js.map +1 -0
  77. package/dist/tools/constant-resolution-tools.d.ts +8 -0
  78. package/dist/tools/constant-resolution-tools.d.ts.map +1 -0
  79. package/dist/tools/constant-resolution-tools.js +68 -0
  80. package/dist/tools/constant-resolution-tools.js.map +1 -0
  81. package/dist/tools/graph-tools.d.ts +27 -5
  82. package/dist/tools/graph-tools.d.ts.map +1 -1
  83. package/dist/tools/graph-tools.js +141 -18
  84. package/dist/tools/graph-tools.js.map +1 -1
  85. package/dist/tools/hotspot-tools.d.ts +6 -0
  86. package/dist/tools/hotspot-tools.d.ts.map +1 -1
  87. package/dist/tools/hotspot-tools.js +48 -8
  88. package/dist/tools/hotspot-tools.js.map +1 -1
  89. package/dist/tools/impact-tools.d.ts.map +1 -1
  90. package/dist/tools/impact-tools.js +9 -2
  91. package/dist/tools/impact-tools.js.map +1 -1
  92. package/dist/tools/index-tools.d.ts +15 -1
  93. package/dist/tools/index-tools.d.ts.map +1 -1
  94. package/dist/tools/index-tools.js +161 -16
  95. package/dist/tools/index-tools.js.map +1 -1
  96. package/dist/tools/journal-generator-helpers.d.ts +55 -0
  97. package/dist/tools/journal-generator-helpers.d.ts.map +1 -0
  98. package/dist/tools/journal-generator-helpers.js +250 -0
  99. package/dist/tools/journal-generator-helpers.js.map +1 -0
  100. package/dist/tools/journal-generator.d.ts +48 -0
  101. package/dist/tools/journal-generator.d.ts.map +1 -0
  102. package/dist/tools/journal-generator.js +204 -0
  103. package/dist/tools/journal-generator.js.map +1 -0
  104. package/dist/tools/journal-git-client.d.ts +20 -0
  105. package/dist/tools/journal-git-client.d.ts.map +1 -0
  106. package/dist/tools/journal-git-client.js +57 -0
  107. package/dist/tools/journal-git-client.js.map +1 -0
  108. package/dist/tools/journal-llm-client.d.ts +57 -0
  109. package/dist/tools/journal-llm-client.d.ts.map +1 -0
  110. package/dist/tools/journal-llm-client.js +175 -0
  111. package/dist/tools/journal-llm-client.js.map +1 -0
  112. package/dist/tools/journal-migrator.d.ts +22 -0
  113. package/dist/tools/journal-migrator.d.ts.map +1 -0
  114. package/dist/tools/journal-migrator.js +183 -0
  115. package/dist/tools/journal-migrator.js.map +1 -0
  116. package/dist/tools/journal-phase-detector.d.ts +26 -0
  117. package/dist/tools/journal-phase-detector.d.ts.map +1 -0
  118. package/dist/tools/journal-phase-detector.js +126 -0
  119. package/dist/tools/journal-phase-detector.js.map +1 -0
  120. package/dist/tools/journal-sentinel.d.ts +15 -0
  121. package/dist/tools/journal-sentinel.d.ts.map +1 -0
  122. package/dist/tools/journal-sentinel.js +110 -0
  123. package/dist/tools/journal-sentinel.js.map +1 -0
  124. package/dist/tools/journal-templates.d.ts +28 -0
  125. package/dist/tools/journal-templates.d.ts.map +1 -0
  126. package/dist/tools/journal-templates.js +93 -0
  127. package/dist/tools/journal-templates.js.map +1 -0
  128. package/dist/tools/pattern-tools.d.ts +2 -0
  129. package/dist/tools/pattern-tools.d.ts.map +1 -1
  130. package/dist/tools/pattern-tools.js +73 -0
  131. package/dist/tools/pattern-tools.js.map +1 -1
  132. package/dist/tools/perf-tools.d.ts.map +1 -1
  133. package/dist/tools/perf-tools.js +6 -0
  134. package/dist/tools/perf-tools.js.map +1 -1
  135. package/dist/tools/plan-turn-tools.d.ts.map +1 -1
  136. package/dist/tools/plan-turn-tools.js +38 -2
  137. package/dist/tools/plan-turn-tools.js.map +1 -1
  138. package/dist/tools/project-tools.d.ts +6 -0
  139. package/dist/tools/project-tools.d.ts.map +1 -1
  140. package/dist/tools/project-tools.js +65 -25
  141. package/dist/tools/project-tools.js.map +1 -1
  142. package/dist/tools/python-constants-tools.d.ts +6 -0
  143. package/dist/tools/python-constants-tools.d.ts.map +1 -1
  144. package/dist/tools/python-constants-tools.js.map +1 -1
  145. package/dist/tools/react-tools.d.ts +44 -1
  146. package/dist/tools/react-tools.d.ts.map +1 -1
  147. package/dist/tools/react-tools.js +142 -9
  148. package/dist/tools/react-tools.js.map +1 -1
  149. package/dist/tools/search-tools.d.ts.map +1 -1
  150. package/dist/tools/search-tools.js +21 -2
  151. package/dist/tools/search-tools.js.map +1 -1
  152. package/dist/tools/status-tools.d.ts +10 -0
  153. package/dist/tools/status-tools.d.ts.map +1 -1
  154. package/dist/tools/status-tools.js +53 -2
  155. package/dist/tools/status-tools.js.map +1 -1
  156. package/dist/tools/symbol-tools.d.ts +13 -0
  157. package/dist/tools/symbol-tools.d.ts.map +1 -1
  158. package/dist/tools/symbol-tools.js +38 -0
  159. package/dist/tools/symbol-tools.js.map +1 -1
  160. package/dist/tools/typescript-constants-tools.d.ts +6 -0
  161. package/dist/tools/typescript-constants-tools.d.ts.map +1 -0
  162. package/dist/tools/typescript-constants-tools.js +687 -0
  163. package/dist/tools/typescript-constants-tools.js.map +1 -0
  164. package/dist/tools/wiki-hub-ranker.d.ts +36 -0
  165. package/dist/tools/wiki-hub-ranker.d.ts.map +1 -0
  166. package/dist/tools/wiki-hub-ranker.js +72 -0
  167. package/dist/tools/wiki-hub-ranker.js.map +1 -0
  168. package/dist/tools/wiki-lint.d.ts +7 -2
  169. package/dist/tools/wiki-lint.d.ts.map +1 -1
  170. package/dist/tools/wiki-lint.js +73 -1
  171. package/dist/tools/wiki-lint.js.map +1 -1
  172. package/dist/tools/wiki-manifest.d.ts +129 -21
  173. package/dist/tools/wiki-manifest.d.ts.map +1 -1
  174. package/dist/tools/wiki-manifest.js +16 -9
  175. package/dist/tools/wiki-manifest.js.map +1 -1
  176. package/dist/tools/wiki-module-builder.d.ts +42 -0
  177. package/dist/tools/wiki-module-builder.d.ts.map +1 -0
  178. package/dist/tools/wiki-module-builder.js +449 -0
  179. package/dist/tools/wiki-module-builder.js.map +1 -0
  180. package/dist/tools/wiki-overview-sources.d.ts +26 -0
  181. package/dist/tools/wiki-overview-sources.d.ts.map +1 -0
  182. package/dist/tools/wiki-overview-sources.js +128 -0
  183. package/dist/tools/wiki-overview-sources.js.map +1 -0
  184. package/dist/tools/wiki-page-generators.d.ts +19 -3
  185. package/dist/tools/wiki-page-generators.d.ts.map +1 -1
  186. package/dist/tools/wiki-page-generators.js +156 -22
  187. package/dist/tools/wiki-page-generators.js.map +1 -1
  188. package/dist/tools/wiki-tools.d.ts +20 -0
  189. package/dist/tools/wiki-tools.d.ts.map +1 -1
  190. package/dist/tools/wiki-tools.js +181 -29
  191. package/dist/tools/wiki-tools.js.map +1 -1
  192. package/dist/tools/workspace-scope-helper.d.ts +21 -0
  193. package/dist/tools/workspace-scope-helper.d.ts.map +1 -0
  194. package/dist/tools/workspace-scope-helper.js +50 -0
  195. package/dist/tools/workspace-scope-helper.js.map +1 -0
  196. package/dist/tools/workspace-tools.d.ts +74 -0
  197. package/dist/tools/workspace-tools.d.ts.map +1 -0
  198. package/dist/tools/workspace-tools.js +366 -0
  199. package/dist/tools/workspace-tools.js.map +1 -0
  200. package/dist/types.d.ts +65 -0
  201. package/dist/types.d.ts.map +1 -1
  202. package/dist/utils/import-graph.d.ts +27 -0
  203. package/dist/utils/import-graph.d.ts.map +1 -1
  204. package/dist/utils/import-graph.js +331 -8
  205. package/dist/utils/import-graph.js.map +1 -1
  206. package/dist/utils/ts-imports.d.ts +30 -0
  207. package/dist/utils/ts-imports.d.ts.map +1 -0
  208. package/dist/utils/ts-imports.js +168 -0
  209. package/dist/utils/ts-imports.js.map +1 -0
  210. package/dist/utils/tsconfig-paths.d.ts +59 -0
  211. package/dist/utils/tsconfig-paths.d.ts.map +1 -0
  212. package/dist/utils/tsconfig-paths.js +176 -0
  213. package/dist/utils/tsconfig-paths.js.map +1 -0
  214. package/dist/utils/walk.d.ts.map +1 -1
  215. package/dist/utils/walk.js +1 -0
  216. package/dist/utils/walk.js.map +1 -1
  217. package/package.json +13 -3
  218. package/rules/codesift.md +19 -2
  219. package/rules/codesift.mdc +2 -2
  220. package/rules/codex.md +13 -2
  221. package/rules/gemini.md +13 -2
@@ -1,4 +1,5 @@
1
1
  import type { SurpriseScore, CommunityInfo } from "./wiki-surprise.js";
2
+ import type { ModuleMetadata, ProjectOverview } from "./wiki-manifest.js";
2
3
  export type { CommunityInfo };
3
4
  export interface HubSymbol {
4
5
  name: string;
@@ -24,8 +25,23 @@ export interface CommunityPageData {
24
25
  hotspots: FileHotspot[];
25
26
  hub_symbols: HubSymbol[];
26
27
  }
27
- export declare function generateCommunityPage(data: CommunityPageData): string;
28
- export declare function generateCommunitySummary(data: CommunityPageData): string;
28
+ /**
29
+ * Generate a community markdown page. When `module` is provided (v2 path),
30
+ * the page leads with Overview / Key Exports / Dependencies sections populated
31
+ * from structured metadata. When `module` is undefined (v1 rollback path),
32
+ * falls back to the legacy generic boilerplate.
33
+ */
34
+ export declare function generateCommunityPage(data: CommunityPageData, module?: ModuleMetadata): string;
35
+ /**
36
+ * Generate the 2500-char `.summary.md` injected by the PreToolUse hook.
37
+ * When `module` is provided, the summary leads with purpose + exports + deps;
38
+ * otherwise falls back to the legacy 4-line format.
39
+ */
40
+ export declare function generateCommunitySummary(data: CommunityPageData, module?: ModuleMetadata): string;
41
+ /** Project-overview landing page (new in v2). */
42
+ export declare function generateOverviewPage(project: ProjectOverview, modules: ModuleMetadata[]): string;
43
+ /** Architecture narrative page — module dependencies + roles. */
44
+ export declare function generateArchitecturePage(modules: ModuleMetadata[]): string;
29
45
  export declare function generateHubsPage(hubs: HubSymbol[]): string;
30
46
  export declare function generateSurprisePage(surprises: SurpriseScore[]): string;
31
47
  export declare function generateHotspotsPage(hotspots: FileHotspot[]): string;
@@ -34,5 +50,5 @@ export declare function generateIndexPage(pages: Array<{
34
50
  slug: string;
35
51
  title: string;
36
52
  type: string;
37
- }>): string;
53
+ }>, project?: ProjectOverview): string;
38
54
  //# sourceMappingURL=wiki-page-generators.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-page-generators.d.ts","sourceRoot":"","sources":["../../src/tools/wiki-page-generators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAEvE,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,SAAS,EAAE,CAAC;CAC1B;AAKD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAsCrE;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,iBAAiB,GAAG,MAAM,CAYxE;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAuB1D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,CAsBvE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAgBpE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAG7E;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GAC1D,MAAM,CAuBR"}
1
+ {"version":3,"file":"wiki-page-generators.d.ts","sourceRoot":"","sources":["../../src/tools/wiki-page-generators.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAE1E,YAAY,EAAE,aAAa,EAAE,CAAC;AAE9B,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,iBAAiB;IAChC,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,WAAW,EAAE,CAAC;IACxB,WAAW,EAAE,SAAS,EAAE,CAAC;CAC1B;AAKD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,cAAc,GACtB,MAAM,CAqER;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CACtC,IAAI,EAAE,iBAAiB,EACvB,MAAM,CAAC,EAAE,cAAc,GACtB,MAAM,CA2BR;AAED,iDAAiD;AACjD,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,cAAc,EAAE,GACxB,MAAM,CAkER;AAED,iEAAiE;AACjE,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,CAc1E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,GAAG,MAAM,CAuB1D;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,aAAa,EAAE,GAAG,MAAM,CAsBvE;AAED,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,MAAM,CAgBpE;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,aAAa,GAAG,IAAI,GAAG,MAAM,CAG7E;AAED,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,EAC3D,OAAO,CAAC,EAAE,eAAe,GACxB,MAAM,CA4BR"}
@@ -1,13 +1,35 @@
1
1
  import { escMd } from "./wiki-escape.js";
2
2
  const MAX_FILES_DISPLAY = 15;
3
3
  const SUMMARY_CHAR_BUDGET = 1600; // ~400 tokens at 4 chars/token
4
- export function generateCommunityPage(data) {
4
+ /**
5
+ * Generate a community markdown page. When `module` is provided (v2 path),
6
+ * the page leads with Overview / Key Exports / Dependencies sections populated
7
+ * from structured metadata. When `module` is undefined (v1 rollback path),
8
+ * falls back to the legacy generic boilerplate.
9
+ */
10
+ export function generateCommunityPage(data, module) {
5
11
  const { community, cohesion, internal_edges, external_edges, hotspots, hub_symbols } = data;
6
12
  const lines = [];
7
13
  lines.push(`# ${escMd(community.name)}`);
8
14
  lines.push("");
9
- lines.push("> A **community** is a group of files that are more tightly connected to each other (via imports) than to the rest of the codebase. Detected automatically by the Louvain algorithm on the import graph.");
10
- lines.push("");
15
+ if (module) {
16
+ lines.push("## Overview", "", escMd(module.description), "");
17
+ if (module.key_exports.length > 0) {
18
+ lines.push("## Key Exports", "");
19
+ if (module.key_exports_approximate) {
20
+ lines.push("> *Approximate list — regenerated after a full reindex will be more precise.*", "");
21
+ }
22
+ lines.push("| Name | Kind | File | Signature |", "| ---- | ---- | ---- | --------- |");
23
+ for (const k of module.key_exports) {
24
+ lines.push(`| \`${escMd(k.name)}\` | ${escMd(k.kind)} | \`${escMd(k.file)}\` | ${k.signature ? escMd(k.signature) : "—"} |`);
25
+ }
26
+ lines.push("");
27
+ }
28
+ }
29
+ else {
30
+ lines.push("> A **community** is a group of files that are more tightly connected to each other (via imports) than to the rest of the codebase. Detected automatically by the Louvain algorithm on the import graph.");
31
+ lines.push("");
32
+ }
11
33
  lines.push(`**Cohesion:** ${(cohesion * 100).toFixed(0)}% *(higher = files in this module import each other more than outsiders)* | ` +
12
34
  `**Internal edges:** ${internal_edges} *(imports within this module)* | ` +
13
35
  `**External edges:** ${external_edges} *(imports crossing module boundary)* | ` +
@@ -21,7 +43,17 @@ export function generateCommunityPage(data) {
21
43
  lines.push(`- *+${extra} more files (use \`codesift wiki-generate --focus\` to see all)*`);
22
44
  }
23
45
  lines.push("");
24
- if (hub_symbols.length > 0) {
46
+ if (module && (module.depends_on.length > 0 || module.depended_by.length > 0)) {
47
+ lines.push("## Dependencies", "");
48
+ if (module.depends_on.length > 0) {
49
+ lines.push(`- **Depends on:** ${module.depends_on.map((s) => `[[${s}]]`).join(", ")}`);
50
+ }
51
+ if (module.depended_by.length > 0) {
52
+ lines.push(`- **Depended by:** ${module.depended_by.map((s) => `[[${s}]]`).join(", ")}`);
53
+ }
54
+ lines.push("");
55
+ }
56
+ if (hub_symbols.length > 0 && (!module || module.role !== "micro-module")) {
25
57
  lines.push("## Hub Symbols", "", "| Symbol | Role | Callers | Callees |", "| ------ | ---- | ------: | ------: |");
26
58
  for (const h of hub_symbols) {
27
59
  lines.push(`| ${escMd(h.name)} | ${escMd(h.role)} | ${h.callers} | ${h.callees} |`);
@@ -37,21 +69,118 @@ export function generateCommunityPage(data) {
37
69
  }
38
70
  return lines.join("\n");
39
71
  }
40
- export function generateCommunitySummary(data) {
72
+ /**
73
+ * Generate the 2500-char `.summary.md` injected by the PreToolUse hook.
74
+ * When `module` is provided, the summary leads with purpose + exports + deps;
75
+ * otherwise falls back to the legacy 4-line format.
76
+ */
77
+ export function generateCommunitySummary(data, module) {
41
78
  const { community, cohesion, hub_symbols } = data;
42
- const lines = [
43
- `**${escMd(community.name)}**`,
44
- `Cohesion: ${(cohesion * 100).toFixed(0)}% | Files: ${community.size}`,
45
- ];
46
- const topFiles = community.files.slice(0, 3);
47
- if (topFiles.length > 0)
48
- lines.push(`Top files: ${topFiles.map(escMd).join(", ")}`);
49
- const topHub = hub_symbols[0];
50
- if (topHub !== undefined)
51
- lines.push(`Top hub: ${escMd(topHub.name)} (${topHub.callers} callers)`);
79
+ const lines = [];
80
+ if (module) {
81
+ lines.push(`**${escMd(community.name)}** ${escMd(module.role)}`);
82
+ lines.push(`Purpose: ${escMd(module.description)}`);
83
+ lines.push(`Cohesion: ${(cohesion * 100).toFixed(0)}% | Files: ${community.size}`);
84
+ if (module.key_exports.length > 0) {
85
+ const names = module.key_exports.slice(0, 5).map((k) => `${k.name} (${k.kind})`).join(", ");
86
+ lines.push(`Key exports: ${names}${module.key_exports_approximate ? " [approximate]" : ""}`);
87
+ }
88
+ if (module.depends_on.length > 0) {
89
+ lines.push(`Depends on: ${module.depends_on.slice(0, 5).join(", ")}`);
90
+ }
91
+ if (module.has_hotspot) {
92
+ lines.push(`⚠ Contains hotspot file — high churn + complexity.`);
93
+ }
94
+ }
95
+ else {
96
+ lines.push(`**${escMd(community.name)}**`);
97
+ lines.push(`Cohesion: ${(cohesion * 100).toFixed(0)}% | Files: ${community.size}`);
98
+ const topFiles = community.files.slice(0, 3);
99
+ if (topFiles.length > 0)
100
+ lines.push(`Top files: ${topFiles.map(escMd).join(", ")}`);
101
+ const topHub = hub_symbols[0];
102
+ if (topHub !== undefined)
103
+ lines.push(`Top hub: ${escMd(topHub.name)} (${topHub.callers} callers)`);
104
+ }
52
105
  const result = lines.join("\n");
53
106
  return result.length <= SUMMARY_CHAR_BUDGET ? result : result.slice(0, SUMMARY_CHAR_BUDGET);
54
107
  }
108
+ /** Project-overview landing page (new in v2). */
109
+ export function generateOverviewPage(project, modules) {
110
+ const lines = [
111
+ `# ${escMd(project.name)}`,
112
+ "",
113
+ `> Project overview — auto-generated from source.`,
114
+ "",
115
+ "## Stack",
116
+ "",
117
+ `- **Language:** ${escMd(project.stack.language)}${project.stack.language_version ? ` ${escMd(project.stack.language_version)}` : ""}`,
118
+ ];
119
+ if (project.stack.framework) {
120
+ lines.push(`- **Framework:** ${escMd(project.stack.framework)}${project.stack.framework_version ? ` ${escMd(project.stack.framework_version)}` : ""}`);
121
+ }
122
+ if (project.stack.test_runner)
123
+ lines.push(`- **Test runner:** ${escMd(project.stack.test_runner)}`);
124
+ if (project.stack.package_manager)
125
+ lines.push(`- **Package manager:** ${escMd(project.stack.package_manager)}`);
126
+ if (project.stack.build_tool)
127
+ lines.push(`- **Build tool:** ${escMd(project.stack.build_tool)}`);
128
+ lines.push("");
129
+ const scriptEntries = Object.entries(project.scripts);
130
+ if (scriptEntries.length > 0) {
131
+ lines.push("## Scripts", "", "| Script | Command |", "| ------ | ------- |");
132
+ for (const [name, cmd] of scriptEntries.slice(0, 10)) {
133
+ lines.push(`| \`${escMd(name)}\` | \`${escMd(cmd)}\` |`);
134
+ }
135
+ lines.push("");
136
+ }
137
+ if (project.entry_points.length > 0) {
138
+ lines.push("## Entry Points", "");
139
+ for (const ep of project.entry_points.slice(0, 10)) {
140
+ lines.push(`- \`${escMd(ep)}\``);
141
+ }
142
+ lines.push("");
143
+ }
144
+ if (project.dependencies.key.length > 0) {
145
+ lines.push("## Key Dependencies", "", `Total: ${project.dependencies.prod_total} prod, ${project.dependencies.dev_total} dev.`, "", "| Package | Version | Kind |", "| ------- | ------- | ---- |");
146
+ for (const d of project.dependencies.key.slice(0, 15)) {
147
+ lines.push(`| \`${escMd(d.name)}\` | ${escMd(d.version || "—")} | ${escMd(d.kind)} |`);
148
+ }
149
+ lines.push("");
150
+ }
151
+ if (project.known_gotchas.length > 0) {
152
+ lines.push("## Known Gotchas", "");
153
+ for (const g of project.known_gotchas.slice(0, 10)) {
154
+ lines.push(`- **[${escMd(g.severity)}]** ${escMd(g.gotcha)}`);
155
+ }
156
+ lines.push("");
157
+ }
158
+ if (modules.length > 0) {
159
+ lines.push("## Modules", "");
160
+ for (const m of modules.slice(0, 20)) {
161
+ lines.push(`- [[${m.slug}]] — *${escMd(m.role)}* · ${escMd(m.description)}`);
162
+ }
163
+ lines.push("");
164
+ }
165
+ lines.push("## Stats", "", `- Files: ${project.stats.total_files}`, project.stats.total_commits !== null ? `- Commits: ${project.stats.total_commits}` : "- Commits: *(shallow clone or no git history)*", project.stats.contributors !== null ? `- Contributors: ${project.stats.contributors}` : "- Contributors: *(shallow clone)*", "");
166
+ return lines.join("\n");
167
+ }
168
+ /** Architecture narrative page — module dependencies + roles. */
169
+ export function generateArchitecturePage(modules) {
170
+ const lines = ["# Architecture", ""];
171
+ if (modules.length === 0) {
172
+ lines.push("*No modules detected.*", "");
173
+ return lines.join("\n");
174
+ }
175
+ lines.push("> Module roles and dependency structure derived from the import graph.", "");
176
+ lines.push("## Roles", "", "| Module | Role | Files | Cohesion | Depends on |", "| ------ | ---- | ----: | -------: | ---------- |");
177
+ for (const m of modules) {
178
+ const deps = m.depends_on.length === 0 ? "—" : m.depends_on.map((s) => `[[${s}]]`).join(", ");
179
+ lines.push(`| [[${m.slug}]] | ${escMd(m.role)} | ${m.files} | ${(m.cohesion * 100).toFixed(0)}% | ${deps} |`);
180
+ }
181
+ lines.push("");
182
+ return lines.join("\n");
183
+ }
55
184
  export function generateHubsPage(hubs) {
56
185
  const lines = [
57
186
  "# Hub Symbols", "",
@@ -116,15 +245,20 @@ export function generateFrameworkPage(framework) {
116
245
  return "";
117
246
  return [`# Framework: ${escMd(framework.name)}`, "", escMd(framework.details), ""].join("\n");
118
247
  }
119
- export function generateIndexPage(pages) {
248
+ export function generateIndexPage(pages, project) {
249
+ const heading = project ? `# ${escMd(project.name)} — Wiki` : "# Wiki Index";
250
+ const subtitle = project
251
+ ? `> **Stack:** ${escMd(project.stack.language)}${project.stack.framework ? ` · ${escMd(project.stack.framework)}` : ""} — ${project.stats.total_files} files.`
252
+ : "> This wiki was auto-generated from your codebase's structure using static analysis — no manual writing needed. It shows how your code is organized into modules (communities), which symbols are most critical (hubs), where hidden coupling exists (surprises), and which files are highest-risk (hotspots).";
120
253
  const lines = [
121
- "# Wiki Index", "",
122
- "> This wiki was auto-generated from your codebase's structure using static analysis — no manual writing needed. It shows how your code is organized into modules (communities), which symbols are most critical (hubs), where hidden coupling exists (surprises), and which files are highest-risk (hotspots).", "",
254
+ heading, "",
255
+ subtitle, "",
123
256
  "**How to read this wiki:**",
124
- "- **Communities** = groups of files that import each other heavily (detected by Louvain algorithm)",
125
- "- **Hubs** = functions/classes that many other files depend on (high fan-in)",
126
- "- **Surprises** = unexpected connections between modules (may indicate missing abstractions)",
127
- "- **Hotspots** = files with high churn + complexity (refactoring candidates)",
257
+ "- **Overview** = project stack, scripts, entry points, key dependencies",
258
+ "- **Communities** = groups of files that import each other heavily (Louvain)",
259
+ "- **Hubs** = functions/classes that many other files depend on (fan-in)",
260
+ "- **Surprises** = unexpected connections between modules",
261
+ "- **Hotspots** = files with high churn + complexity",
128
262
  "",
129
263
  ];
130
264
  const byType = new Map();
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-page-generators.js","sourceRoot":"","sources":["../../src/tools/wiki-page-generators.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AAiCzC,MAAM,iBAAiB,GAAG,EAAE,CAAC;AAC7B,MAAM,mBAAmB,GAAG,IAAI,CAAC,CAAC,+BAA+B;AAEjE,MAAM,UAAU,qBAAqB,CAAC,IAAuB;IAC3D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAC5F,MAAM,KAAK,GAAa,EAAE,CAAC;IAE3B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,0MAA0M,CAAC,CAAC;IACvN,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CACR,iBAAiB,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,gFAAgF;QAC1H,uBAAuB,cAAc,sCAAsC;QAC3E,uBAAuB,cAAc,4CAA4C;QACjF,cAAc,SAAS,CAAC,IAAI,EAAE,CACjC,CAAC;IACF,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;IAC/B,MAAM,YAAY,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACjE,KAAK,MAAM,CAAC,IAAI,YAAY;QAAE,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAC1D,IAAI,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB,EAAE,CAAC;QAC/C,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,GAAG,iBAAiB,CAAC;QACzD,KAAK,CAAC,IAAI,CAAC,OAAO,KAAK,kEAAkE,CAAC,CAAC;IAC7F,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,EAAE,uCAAuC,EACtE,uCAAuC,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC;QACtF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,4BAA4B,EAAE,4BAA4B,CAAC,CAAC;QAC1F,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAuB;IAC9D,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC;IAClD,MAAM,KAAK,GAAa;QACtB,KAAK,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI;QAC9B,aAAa,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,SAAS,CAAC,IAAI,EAAE;KACvE,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC7C,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,cAAc,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACpF,MAAM,MAAM,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;IAC9B,IAAI,MAAM,KAAK,SAAS;QAAE,KAAK,CAAC,IAAI,CAAC,YAAY,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,OAAO,WAAW,CAAC,CAAC;IACnG,MAAM,MAAM,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAChC,OAAO,MAAM,CAAC,MAAM,IAAI,mBAAmB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC;AAC9F,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAiB;IAChD,MAAM,KAAK,GAAa;QACtB,eAAe,EAAE,EAAE;QACnB,0NAA0N,EAAE,EAAE;QAC9N,uFAAuF;QACvF,4EAA4E;QAC5E,yEAAyE;QACzE,mEAAmE;QACnE,EAAE;KACH,CAAC;IACF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,8CAA8C,EACvD,8CAA8C,CAAC,CAAC;QAClD,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,OAAO,IAAI,CAC3F,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,SAA0B;IAC7D,MAAM,KAAK,GAAa;QACtB,wBAAwB,EAAE,EAAE;QAC5B,6VAA6V,EAAE,EAAE;QACjW,uHAAuH,EAAE,EAAE;KAC5H,CAAC;IACF,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC3B,KAAK,CAAC,IAAI,CAAC,mCAAmC,CAAC,CAAC;IAClD,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CACR,+DAA+D,EAC/D,+DAA+D,CAChE,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,SAAS,EAAE,CAAC;YAC1B,MAAM,EAAE,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACzE,KAAK,CAAC,IAAI,CACR,KAAK,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,UAAU,MAAM,EAAE,IAAI,CACnH,CAAC;QACJ,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,QAAuB;IAC1D,MAAM,KAAK,GAAa;QACtB,iBAAiB,EAAE,EAAE;QACrB,0RAA0R,EAAE,EAAE;QAC9R,8EAA8E,EAAE,EAAE;KACnF,CAAC;IACF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,KAAK,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;IAC3C,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,4BAA4B,EAAE,4BAA4B,CAAC,CAAC;QACvE,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;YACzB,KAAK,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,MAAM,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACpF,CAAC;IACH,CAAC;IACD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,SAA+B;IACnE,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IAClC,OAAO,CAAC,gBAAgB,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAChG,CAAC;AAED,MAAM,UAAU,iBAAiB,CAC/B,KAA2D;IAE3D,MAAM,KAAK,GAAa;QACtB,cAAc,EAAE,EAAE;QAClB,gTAAgT,EAAE,EAAE;QACpT,4BAA4B;QAC5B,oGAAoG;QACpG,8EAA8E;QAC9E,8FAA8F;QAC9F,8EAA8E;QAC9E,EAAE;KACH,CAAC;IACF,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1C,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjB,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACpC,KAAK,MAAM,IAAI,IAAI,KAAK;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClF,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
1
+ {"version":3,"file":"wiki-page-generators.js","sourceRoot":"","sources":["../../src/tools/wiki-page-generators.ts"],"names":[],"mappings":"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"}
@@ -10,5 +10,25 @@ export interface WikiResult {
10
10
  export declare function generateWiki(repo: string, options?: {
11
11
  focus?: string;
12
12
  output_dir?: string;
13
+ journal_mode?: "skip" | "refresh-overview" | "append" | "full";
14
+ journal_since_ref?: string;
15
+ journal_bulk_fill?: boolean;
13
16
  }): Promise<WikiResult>;
17
+ /**
18
+ * Delete `.md` files under `outputDir` that are not part of the freshly generated
19
+ * page set, while skipping any entry protected by `protectedPrefixes`.
20
+ *
21
+ * Contract invariant — `protectedPrefixes` are plain path-prefix strings, NOT globs:
22
+ * - Skip `f` where `f === p` OR `f.startsWith(p + "/")` for any `p ∈ protectedPrefixes`.
23
+ * - Skip entries where `!f.endsWith(".md")` (directories and non-markdown files).
24
+ * - Skip entries present in `knownFiles`.
25
+ * - Everything else is `unlink()`-ed.
26
+ *
27
+ * Currently called with a non-recursive `readdir`, but the guard is defence-in-depth
28
+ * for any future refactor that surfaces nested paths such as `"journal/phases/x.md"`
29
+ * (see wiki-journal spec D1 failure mode).
30
+ *
31
+ * @returns absolute paths of the files that were deleted
32
+ */
33
+ export declare function pruneStaleWikiFiles(outputDir: string, knownFiles: Set<string>, protectedPrefixes: string[]): Promise<string[]>;
14
34
  //# sourceMappingURL=wiki-tools.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"wiki-tools.d.ts","sourceRoot":"","sources":["../../src/tools/wiki-tools.ts"],"names":[],"mappings":"AA2DA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAkDD,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,GAChD,OAAO,CAAC,UAAU,CAAC,CA6UrB"}
1
+ {"version":3,"file":"wiki-tools.d.ts","sourceRoot":"","sources":["../../src/tools/wiki-tools.ts"],"names":[],"mappings":"AAgEA,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC7B;AAkDD,wBAAsB,YAAY,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IACR,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,GAAG,kBAAkB,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/D,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B,GACA,OAAO,CAAC,UAAU,CAAC,CA2brB;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,EACvB,iBAAiB,EAAE,MAAM,EAAE,GAC1B,OAAO,CAAC,MAAM,EAAE,CAAC,CAuBnB"}
@@ -8,9 +8,12 @@ import { analyzeHotspots } from "./hotspot-tools.js";
8
8
  import { analyzeProject } from "./project-tools.js";
9
9
  import { computeIndexHash } from "../storage/graph-store.js";
10
10
  import { computeSurpriseScores, } from "./wiki-surprise.js";
11
- import { generateCommunityPage, generateCommunitySummary, generateHubsPage, generateSurprisePage, generateHotspotsPage, generateFrameworkPage, generateIndexPage, } from "./wiki-page-generators.js";
11
+ import { generateCommunityPage, generateCommunitySummary, generateHubsPage, generateSurprisePage, generateHotspotsPage, generateFrameworkPage, generateIndexPage, generateOverviewPage, generateArchitecturePage, } from "./wiki-page-generators.js";
12
12
  import { resolveWikiLinks } from "./wiki-links.js";
13
- import { buildWikiManifest, buildUniqueSlugs } from "./wiki-manifest.js";
13
+ import { buildUniqueSlugs } from "./wiki-manifest.js";
14
+ import { buildWikiManifestV1, buildWikiManifestV2, buildProjectOverview, buildModuleMetadata } from "./wiki-module-builder.js";
15
+ import { rankHubsByPageRank } from "./wiki-hub-ranker.js";
16
+ import { collectImportEdges } from "../utils/import-graph.js";
14
17
  const TIMEOUT_SENTINEL = { status: "timeout" };
15
18
  function withTimeout(promise, ms) {
16
19
  return Promise.race([
@@ -188,9 +191,63 @@ export async function generateWiki(repo, options) {
188
191
  // Compute surprise scores
189
192
  const globalDensity = index.files.length > 0 ? crossEdges.length / (index.files.length * index.files.length) : 0;
190
193
  const surprises = computeSurpriseScores(communities, crossEdges, coChangePairs, globalDensity);
194
+ // --- V2 data pipeline (Task 21) ---------------------------------------
195
+ const v1Mode = process.env.CODESIFT_WIKI_V1 === "1";
196
+ // Load the full ProjectProfile from disk — analyzeProject returns a summary,
197
+ // but module-builder + overview need the full shape (identity, stack details,
198
+ // dependency_health, git_health, known_gotchas).
199
+ let fullProfile = null;
200
+ if (projectResult.status === "fulfilled" && !isTimeout(projectResult.value)) {
201
+ try {
202
+ const profilePath = projectResult.value.profile_path;
203
+ const raw = await readFile(profilePath, "utf-8");
204
+ fullProfile = JSON.parse(raw);
205
+ }
206
+ catch (err) {
207
+ degradedReasons.push(`project_profile_read_error: ${err instanceof Error ? err.message : String(err)}`);
208
+ }
209
+ }
191
210
  // Build unique slugs (collision-safe) before page generation.
192
- // Shared with buildWikiManifest below to keep manifest + summary file slugs aligned.
193
- const slugMap = buildUniqueSlugs(communities);
211
+ const isMonorepo = fullProfile?.identity?.project_type === "monorepo";
212
+ const workspaces = fullProfile?.stack?.monorepo?.workspaces ?? [];
213
+ const slugMap = buildUniqueSlugs(communities, { monorepo: isMonorepo, workspaces });
214
+ let importEdges = [];
215
+ try {
216
+ importEdges = await collectImportEdges(index);
217
+ }
218
+ catch (err) {
219
+ degradedReasons.push(`import_edges_error: ${err instanceof Error ? err.message : String(err)}`);
220
+ }
221
+ // PageRank-ranked hubs with builtin blocklist. Falls back gracefully to the
222
+ // classifySymbolRoles-sorted hubs when the graph is empty.
223
+ const rankedResult = rankHubsByPageRank(importEdges, hubSymbols, { topK: 30 });
224
+ const rankedHubs = rankedResult.hubs;
225
+ if (rankedResult.degraded_reason) {
226
+ degradedReasons.push(`hub_ranker_${rankedResult.degraded_reason}`);
227
+ }
228
+ const effectiveHubs = rankedHubs.length > 0 ? rankedHubs : hubSymbols;
229
+ // Project overview + structured module metadata.
230
+ let projectOverview = null;
231
+ let modules = [];
232
+ if (!v1Mode && fullProfile) {
233
+ try {
234
+ const overview = buildProjectOverview(fullProfile, index);
235
+ const { _degraded, ...clean } = overview;
236
+ if (_degraded)
237
+ degradedReasons.push(_degraded);
238
+ projectOverview = clean;
239
+ }
240
+ catch (err) {
241
+ degradedReasons.push(`project_overview_error: ${err instanceof Error ? err.message : String(err)}`);
242
+ }
243
+ try {
244
+ modules = buildModuleMetadata(communities, fullProfile, index, importEdges, fileHotspots, rankedHubs);
245
+ }
246
+ catch (err) {
247
+ degradedReasons.push(`module_metadata_error: ${err instanceof Error ? err.message : String(err)}`);
248
+ }
249
+ }
250
+ const slugToModule = new Map(modules.map((m) => [m.slug, m]));
194
251
  // Build community page data
195
252
  const communityPages = communities.map((comm) => {
196
253
  const slug = slugMap.get(comm.name) ?? comm.name;
@@ -207,7 +264,7 @@ export async function generateWiki(repo, options) {
207
264
  hotspots: commHotspots,
208
265
  hub_symbols: commHubs,
209
266
  };
210
- const content = generateCommunityPage(data);
267
+ const content = generateCommunityPage(data, slugToModule.get(slug));
211
268
  return { slug, title: comm.name, type: "community", file: `${slug}.md`, content };
212
269
  });
213
270
  // Write community summary files for hook injection
@@ -234,11 +291,11 @@ export async function generateWiki(repo, options) {
234
291
  hotspots: commHotspots,
235
292
  hub_symbols: commHubs,
236
293
  };
237
- const summary = generateCommunitySummary(summaryData);
294
+ const summary = generateCommunitySummary(summaryData, slugToModule.get(comm.slug));
238
295
  await writeFile(join(outputDir, `${comm.slug}.summary.md`), summary, "utf-8");
239
296
  }
240
- // Hubs page
241
- const hubsContent = generateHubsPage(hubSymbols);
297
+ // Hubs page — prefer PageRank-ranked hubs when available
298
+ const hubsContent = generateHubsPage(effectiveHubs);
242
299
  const hubsPage = { slug: "hubs", title: "Hub Symbols", type: "hubs", file: "hubs.md", content: hubsContent };
243
300
  // Surprises page
244
301
  const surprisesContent = generateSurprisePage(surprises);
@@ -254,16 +311,37 @@ export async function generateWiki(repo, options) {
254
311
  frameworkPages.push({ slug: "framework", title: `Framework: ${frameworkInfo.name}`, type: "framework", file: "framework.md", content });
255
312
  }
256
313
  }
314
+ // Overview + architecture pages (v2 only, when overview is available)
315
+ const overviewPages = [];
316
+ if (projectOverview) {
317
+ overviewPages.push({
318
+ slug: "overview",
319
+ title: projectOverview.name,
320
+ type: "overview",
321
+ file: "overview.md",
322
+ content: generateOverviewPage(projectOverview, modules),
323
+ });
324
+ }
325
+ if (modules.length >= 3) {
326
+ overviewPages.push({
327
+ slug: "architecture",
328
+ title: "Architecture",
329
+ type: "architecture",
330
+ file: "architecture.md",
331
+ content: generateArchitecturePage(modules),
332
+ });
333
+ }
257
334
  // Collect all content pages (excluding index) for index generation
258
335
  const contentPages = [
336
+ ...overviewPages,
259
337
  ...communityPages,
260
338
  hubsPage,
261
339
  surprisesPage,
262
340
  hotspotsPage,
263
341
  ...frameworkPages,
264
342
  ];
265
- // Index page
266
- const indexContent = generateIndexPage(contentPages.map((p) => ({ slug: p.slug, title: p.title, type: p.type })));
343
+ // Index page (v2 uses project overview for tailored heading when available)
344
+ const indexContent = generateIndexPage(contentPages.map((p) => ({ slug: p.slug, title: p.title, type: p.type })), projectOverview ?? undefined);
267
345
  const indexPage = { slug: "index", title: "Wiki Index", type: "index", file: "index.md", content: indexContent };
268
346
  const allPages = [indexPage, ...contentPages];
269
347
  // Resolve wiki links (two-pass backlink injection)
@@ -277,19 +355,28 @@ export async function generateWiki(repo, options) {
277
355
  }));
278
356
  // Load old manifest for slug_redirects preservation
279
357
  const oldManifest = await loadOldManifest(outputDir);
280
- // Build manifest
358
+ // Build manifest — v2 by default, v1 when CODESIFT_WIKI_V1=1 or no overview
281
359
  const indexHash = computeIndexHash(index.files);
282
- const manifestOptions = {
283
- index_hash: indexHash,
284
- git_commit: "unknown",
285
- pages: resolvedPageInfos,
286
- communities,
287
- degradedReasons,
288
- };
289
- if (oldManifest !== undefined) {
290
- manifestOptions.oldManifest = oldManifest;
291
- }
292
- const manifest = buildWikiManifest(manifestOptions);
360
+ const useV2 = !v1Mode && projectOverview !== null;
361
+ const manifest = useV2
362
+ ? buildWikiManifestV2({
363
+ index_hash: indexHash,
364
+ git_commit: "unknown",
365
+ pages: resolvedPageInfos,
366
+ communities,
367
+ project: projectOverview,
368
+ modules,
369
+ degradedReasons,
370
+ ...(oldManifest !== undefined ? { oldManifest: oldManifest } : {}),
371
+ })
372
+ : buildWikiManifestV1({
373
+ index_hash: indexHash,
374
+ git_commit: "unknown",
375
+ pages: resolvedPageInfos,
376
+ communities,
377
+ degradedReasons,
378
+ ...(oldManifest !== undefined ? { oldManifest: oldManifest } : {}),
379
+ });
293
380
  // Add lens_data to manifest for dashboard visualization
294
381
  if (communities.length >= 2) {
295
382
  const lensComms = communities.map((c) => {
@@ -320,8 +407,9 @@ export async function generateWiki(repo, options) {
320
407
  for (const page of resolvedPageInfos) {
321
408
  await writeFile(join(outputDir, page.file), page.content, "utf-8");
322
409
  }
323
- // Stale page cleanup: delete .md files from a previous run that are no longer generated
324
- const existingFiles = await readdir(outputDir);
410
+ // Stale page cleanup: delete .md files from a previous run that are no longer generated.
411
+ // Protected prefixes are plain path-prefix strings (NOT globs) — see pruneStaleWikiFiles
412
+ // contract for exact semantics. "journal" protects the wiki journal (D1 safeguard).
325
413
  const newFiles = new Set(resolvedPageInfos.map((p) => p.file));
326
414
  newFiles.add("wiki-manifest.json");
327
415
  newFiles.add("wiki-manifest.json.tmp");
@@ -330,16 +418,40 @@ export async function generateWiki(repo, options) {
330
418
  for (const comm of communityPages) {
331
419
  newFiles.add(`${comm.slug}.summary.md`);
332
420
  }
333
- for (const f of existingFiles) {
334
- if (f.endsWith(".md") && !newFiles.has(f)) {
335
- await unlink(join(outputDir, f));
336
- }
337
- }
421
+ await pruneStaleWikiFiles(outputDir, newFiles, ["journal"]);
338
422
  // Atomic manifest write: write to .tmp then rename
339
423
  const manifestPath = join(outputDir, "wiki-manifest.json");
340
424
  const tmpPath = manifestPath + ".tmp";
341
425
  await writeFile(tmpPath, JSON.stringify(manifest, null, 2));
342
426
  await rename(tmpPath, manifestPath);
427
+ // Journal dispatch (lazy import — no penalty when mode=skip)
428
+ const mode = options?.journal_mode ?? "skip";
429
+ if (mode !== "skip") {
430
+ const { runJournalInit, runJournalAppend, refreshOverviewAndRollup } = await import("./journal-generator.js");
431
+ const baseOpts = { cwd: process.cwd(), outputDir };
432
+ try {
433
+ if (mode === "refresh-overview") {
434
+ await refreshOverviewAndRollup(baseOpts);
435
+ }
436
+ else if (mode === "append") {
437
+ if (!options?.journal_since_ref) {
438
+ degradedReasons.push("journal_since_ref required when journal_mode=append");
439
+ }
440
+ else {
441
+ await runJournalAppend({ ...baseOpts, since: options.journal_since_ref });
442
+ }
443
+ }
444
+ else if (mode === "full") {
445
+ const r = await runJournalInit({ ...baseOpts, bulkFill: options?.journal_bulk_fill ?? false });
446
+ if (r.phases.every((p) => p.costUsd === 0)) {
447
+ degradedReasons.push("journal: no LLM API key, wrote scaffold");
448
+ }
449
+ }
450
+ }
451
+ catch (err) {
452
+ degradedReasons.push(`journal dispatch: ${err.message}`);
453
+ }
454
+ }
343
455
  return {
344
456
  wiki_dir: outputDir,
345
457
  pages: resolvedPageInfos.length,
@@ -354,4 +466,44 @@ export async function generateWiki(repo, options) {
354
466
  await unlink(lockPath).catch(() => { });
355
467
  }
356
468
  }
469
+ /**
470
+ * Delete `.md` files under `outputDir` that are not part of the freshly generated
471
+ * page set, while skipping any entry protected by `protectedPrefixes`.
472
+ *
473
+ * Contract invariant — `protectedPrefixes` are plain path-prefix strings, NOT globs:
474
+ * - Skip `f` where `f === p` OR `f.startsWith(p + "/")` for any `p ∈ protectedPrefixes`.
475
+ * - Skip entries where `!f.endsWith(".md")` (directories and non-markdown files).
476
+ * - Skip entries present in `knownFiles`.
477
+ * - Everything else is `unlink()`-ed.
478
+ *
479
+ * Currently called with a non-recursive `readdir`, but the guard is defence-in-depth
480
+ * for any future refactor that surfaces nested paths such as `"journal/phases/x.md"`
481
+ * (see wiki-journal spec D1 failure mode).
482
+ *
483
+ * @returns absolute paths of the files that were deleted
484
+ */
485
+ export async function pruneStaleWikiFiles(outputDir, knownFiles, protectedPrefixes) {
486
+ const entries = await readdir(outputDir);
487
+ const deleted = [];
488
+ for (const f of entries) {
489
+ // Guard: plain path-prefix match (NOT glob). Exact match or "prefix/" descendant.
490
+ const isProtected = protectedPrefixes.some((p) => f === p || f.startsWith(p + "/"));
491
+ if (isProtected)
492
+ continue;
493
+ if (!f.endsWith(".md"))
494
+ continue;
495
+ if (knownFiles.has(f))
496
+ continue;
497
+ const full = join(outputDir, f);
498
+ try {
499
+ await unlink(full);
500
+ deleted.push(full);
501
+ }
502
+ catch (err) {
503
+ console.warn(`[wiki-cleanup] could not remove stale file ${full}: ${err instanceof Error ? err.message : String(err)}`);
504
+ // continue — best-effort cleanup; see D1 failure mode in spec
505
+ }
506
+ }
507
+ return deleted;
508
+ }
357
509
  //# sourceMappingURL=wiki-tools.js.map