codesift-mcp 0.5.21 → 0.5.27
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.
- package/README.md +9 -9
- package/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +28 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.js +1 -1
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks.d.ts +4 -0
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +15 -4
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/journal-commands.d.ts +9 -0
- package/dist/cli/journal-commands.d.ts.map +1 -0
- package/dist/cli/journal-commands.js +160 -0
- package/dist/cli/journal-commands.js.map +1 -0
- package/dist/cli/wiki-commands.d.ts.map +1 -1
- package/dist/cli/wiki-commands.js +5 -0
- package/dist/cli/wiki-commands.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +41 -47
- package/dist/instructions.js.map +1 -1
- package/dist/parser/extractors/_shared.d.ts +2 -0
- package/dist/parser/extractors/_shared.d.ts.map +1 -1
- package/dist/parser/extractors/_shared.js +4 -0
- package/dist/parser/extractors/_shared.js.map +1 -1
- package/dist/parser/extractors/typescript.d.ts.map +1 -1
- package/dist/parser/extractors/typescript.js +606 -31
- package/dist/parser/extractors/typescript.js.map +1 -1
- package/dist/parser/parse-worker.d.ts +2 -0
- package/dist/parser/parse-worker.d.ts.map +1 -0
- package/dist/parser/parse-worker.js +47 -0
- package/dist/parser/parse-worker.js.map +1 -0
- package/dist/parser/parser-manager.d.ts +10 -1
- package/dist/parser/parser-manager.d.ts.map +1 -1
- package/dist/parser/parser-manager.js +40 -2
- package/dist/parser/parser-manager.js.map +1 -1
- package/dist/parser/parser-pool.d.ts +31 -0
- package/dist/parser/parser-pool.d.ts.map +1 -0
- package/dist/parser/parser-pool.js +211 -0
- package/dist/parser/parser-pool.js.map +1 -0
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +394 -35
- package/dist/register-tools.js.map +1 -1
- package/dist/retrieval/codebase-retrieval.d.ts.map +1 -1
- package/dist/retrieval/codebase-retrieval.js +9 -1
- package/dist/retrieval/codebase-retrieval.js.map +1 -1
- package/dist/search/chunker.d.ts +1 -0
- package/dist/search/chunker.d.ts.map +1 -1
- package/dist/search/chunker.js +8 -1
- package/dist/search/chunker.js.map +1 -1
- package/dist/server-helpers.d.ts +27 -0
- package/dist/server-helpers.d.ts.map +1 -1
- package/dist/server-helpers.js +90 -9
- package/dist/server-helpers.js.map +1 -1
- package/dist/server.js +31 -0
- package/dist/server.js.map +1 -1
- package/dist/storage/index-store.d.ts +41 -4
- package/dist/storage/index-store.d.ts.map +1 -1
- package/dist/storage/index-store.js +89 -6
- package/dist/storage/index-store.js.map +1 -1
- package/dist/storage/watcher.d.ts +33 -6
- package/dist/storage/watcher.d.ts.map +1 -1
- package/dist/storage/watcher.js +73 -34
- package/dist/storage/watcher.js.map +1 -1
- package/dist/storage/workspace-resolver.d.ts +15 -0
- package/dist/storage/workspace-resolver.d.ts.map +1 -0
- package/dist/storage/workspace-resolver.js +130 -0
- package/dist/storage/workspace-resolver.js.map +1 -0
- package/dist/tools/_helpers.d.ts +37 -0
- package/dist/tools/_helpers.d.ts.map +1 -0
- package/dist/tools/_helpers.js +31 -0
- package/dist/tools/_helpers.js.map +1 -0
- package/dist/tools/constant-resolution-tools.d.ts +8 -0
- package/dist/tools/constant-resolution-tools.d.ts.map +1 -0
- package/dist/tools/constant-resolution-tools.js +68 -0
- package/dist/tools/constant-resolution-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +27 -5
- package/dist/tools/graph-tools.d.ts.map +1 -1
- package/dist/tools/graph-tools.js +141 -18
- package/dist/tools/graph-tools.js.map +1 -1
- package/dist/tools/hotspot-tools.d.ts +6 -0
- package/dist/tools/hotspot-tools.d.ts.map +1 -1
- package/dist/tools/hotspot-tools.js +48 -8
- package/dist/tools/hotspot-tools.js.map +1 -1
- package/dist/tools/impact-tools.d.ts.map +1 -1
- package/dist/tools/impact-tools.js +9 -2
- package/dist/tools/impact-tools.js.map +1 -1
- package/dist/tools/index-tools.d.ts +15 -1
- package/dist/tools/index-tools.d.ts.map +1 -1
- package/dist/tools/index-tools.js +161 -16
- package/dist/tools/index-tools.js.map +1 -1
- package/dist/tools/journal-generator-helpers.d.ts +55 -0
- package/dist/tools/journal-generator-helpers.d.ts.map +1 -0
- package/dist/tools/journal-generator-helpers.js +250 -0
- package/dist/tools/journal-generator-helpers.js.map +1 -0
- package/dist/tools/journal-generator.d.ts +48 -0
- package/dist/tools/journal-generator.d.ts.map +1 -0
- package/dist/tools/journal-generator.js +204 -0
- package/dist/tools/journal-generator.js.map +1 -0
- package/dist/tools/journal-git-client.d.ts +20 -0
- package/dist/tools/journal-git-client.d.ts.map +1 -0
- package/dist/tools/journal-git-client.js +57 -0
- package/dist/tools/journal-git-client.js.map +1 -0
- package/dist/tools/journal-llm-client.d.ts +57 -0
- package/dist/tools/journal-llm-client.d.ts.map +1 -0
- package/dist/tools/journal-llm-client.js +175 -0
- package/dist/tools/journal-llm-client.js.map +1 -0
- package/dist/tools/journal-migrator.d.ts +22 -0
- package/dist/tools/journal-migrator.d.ts.map +1 -0
- package/dist/tools/journal-migrator.js +183 -0
- package/dist/tools/journal-migrator.js.map +1 -0
- package/dist/tools/journal-phase-detector.d.ts +26 -0
- package/dist/tools/journal-phase-detector.d.ts.map +1 -0
- package/dist/tools/journal-phase-detector.js +126 -0
- package/dist/tools/journal-phase-detector.js.map +1 -0
- package/dist/tools/journal-sentinel.d.ts +15 -0
- package/dist/tools/journal-sentinel.d.ts.map +1 -0
- package/dist/tools/journal-sentinel.js +110 -0
- package/dist/tools/journal-sentinel.js.map +1 -0
- package/dist/tools/journal-templates.d.ts +28 -0
- package/dist/tools/journal-templates.d.ts.map +1 -0
- package/dist/tools/journal-templates.js +93 -0
- package/dist/tools/journal-templates.js.map +1 -0
- package/dist/tools/pattern-tools.d.ts +2 -0
- package/dist/tools/pattern-tools.d.ts.map +1 -1
- package/dist/tools/pattern-tools.js +73 -0
- package/dist/tools/pattern-tools.js.map +1 -1
- package/dist/tools/perf-tools.d.ts.map +1 -1
- package/dist/tools/perf-tools.js +6 -0
- package/dist/tools/perf-tools.js.map +1 -1
- package/dist/tools/plan-turn-tools.d.ts.map +1 -1
- package/dist/tools/plan-turn-tools.js +38 -2
- package/dist/tools/plan-turn-tools.js.map +1 -1
- package/dist/tools/project-tools.d.ts +6 -0
- package/dist/tools/project-tools.d.ts.map +1 -1
- package/dist/tools/project-tools.js +65 -25
- package/dist/tools/project-tools.js.map +1 -1
- package/dist/tools/python-constants-tools.d.ts +6 -0
- package/dist/tools/python-constants-tools.d.ts.map +1 -1
- package/dist/tools/python-constants-tools.js.map +1 -1
- package/dist/tools/react-tools.d.ts +44 -1
- package/dist/tools/react-tools.d.ts.map +1 -1
- package/dist/tools/react-tools.js +142 -9
- package/dist/tools/react-tools.js.map +1 -1
- package/dist/tools/search-tools.d.ts.map +1 -1
- package/dist/tools/search-tools.js +21 -2
- package/dist/tools/search-tools.js.map +1 -1
- package/dist/tools/status-tools.d.ts +10 -0
- package/dist/tools/status-tools.d.ts.map +1 -1
- package/dist/tools/status-tools.js +53 -2
- package/dist/tools/status-tools.js.map +1 -1
- package/dist/tools/symbol-tools.d.ts +13 -0
- package/dist/tools/symbol-tools.d.ts.map +1 -1
- package/dist/tools/symbol-tools.js +38 -0
- package/dist/tools/symbol-tools.js.map +1 -1
- package/dist/tools/typescript-constants-tools.d.ts +6 -0
- package/dist/tools/typescript-constants-tools.d.ts.map +1 -0
- package/dist/tools/typescript-constants-tools.js +687 -0
- package/dist/tools/typescript-constants-tools.js.map +1 -0
- package/dist/tools/wiki-hub-ranker.d.ts +36 -0
- package/dist/tools/wiki-hub-ranker.d.ts.map +1 -0
- package/dist/tools/wiki-hub-ranker.js +72 -0
- package/dist/tools/wiki-hub-ranker.js.map +1 -0
- package/dist/tools/wiki-lint.d.ts +7 -2
- package/dist/tools/wiki-lint.d.ts.map +1 -1
- package/dist/tools/wiki-lint.js +73 -1
- package/dist/tools/wiki-lint.js.map +1 -1
- package/dist/tools/wiki-manifest.d.ts +129 -21
- package/dist/tools/wiki-manifest.d.ts.map +1 -1
- package/dist/tools/wiki-manifest.js +16 -9
- package/dist/tools/wiki-manifest.js.map +1 -1
- package/dist/tools/wiki-module-builder.d.ts +42 -0
- package/dist/tools/wiki-module-builder.d.ts.map +1 -0
- package/dist/tools/wiki-module-builder.js +449 -0
- package/dist/tools/wiki-module-builder.js.map +1 -0
- package/dist/tools/wiki-overview-sources.d.ts +26 -0
- package/dist/tools/wiki-overview-sources.d.ts.map +1 -0
- package/dist/tools/wiki-overview-sources.js +128 -0
- package/dist/tools/wiki-overview-sources.js.map +1 -0
- package/dist/tools/wiki-page-generators.d.ts +19 -3
- package/dist/tools/wiki-page-generators.d.ts.map +1 -1
- package/dist/tools/wiki-page-generators.js +156 -22
- package/dist/tools/wiki-page-generators.js.map +1 -1
- package/dist/tools/wiki-tools.d.ts +20 -0
- package/dist/tools/wiki-tools.d.ts.map +1 -1
- package/dist/tools/wiki-tools.js +181 -29
- package/dist/tools/wiki-tools.js.map +1 -1
- package/dist/tools/workspace-scope-helper.d.ts +21 -0
- package/dist/tools/workspace-scope-helper.d.ts.map +1 -0
- package/dist/tools/workspace-scope-helper.js +50 -0
- package/dist/tools/workspace-scope-helper.js.map +1 -0
- package/dist/tools/workspace-tools.d.ts +74 -0
- package/dist/tools/workspace-tools.d.ts.map +1 -0
- package/dist/tools/workspace-tools.js +366 -0
- package/dist/tools/workspace-tools.js.map +1 -0
- package/dist/types.d.ts +65 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils/import-graph.d.ts +27 -0
- package/dist/utils/import-graph.d.ts.map +1 -1
- package/dist/utils/import-graph.js +331 -8
- package/dist/utils/import-graph.js.map +1 -1
- package/dist/utils/ts-imports.d.ts +30 -0
- package/dist/utils/ts-imports.d.ts.map +1 -0
- package/dist/utils/ts-imports.js +168 -0
- package/dist/utils/ts-imports.js.map +1 -0
- package/dist/utils/tsconfig-paths.d.ts +59 -0
- package/dist/utils/tsconfig-paths.d.ts.map +1 -0
- package/dist/utils/tsconfig-paths.js +176 -0
- package/dist/utils/tsconfig-paths.js.map +1 -0
- package/dist/utils/walk.d.ts.map +1 -1
- package/dist/utils/walk.js +1 -0
- package/dist/utils/walk.js.map +1 -1
- package/package.json +13 -3
- package/rules/codesift.md +19 -2
- package/rules/codesift.mdc +2 -2
- package/rules/codex.md +13 -2
- 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
|
-
|
|
28
|
-
|
|
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
|
-
}
|
|
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;
|
|
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
|
-
|
|
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
|
-
|
|
10
|
-
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
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
|
-
|
|
122
|
-
|
|
254
|
+
heading, "",
|
|
255
|
+
subtitle, "",
|
|
123
256
|
"**How to read this wiki:**",
|
|
124
|
-
"- **
|
|
125
|
-
"- **
|
|
126
|
-
"- **
|
|
127
|
-
"- **
|
|
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":"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"}
|
|
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":"
|
|
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"}
|
package/dist/tools/wiki-tools.js
CHANGED
|
@@ -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 {
|
|
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
|
-
|
|
193
|
-
const
|
|
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(
|
|
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
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|