codesift-mcp 0.5.6 → 0.5.8
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/dist/cli/commands.d.ts.map +1 -1
- package/dist/cli/commands.js +8 -0
- package/dist/cli/commands.js.map +1 -1
- package/dist/cli/help.d.ts.map +1 -1
- package/dist/cli/help.js +2 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/hooks.d.ts.map +1 -1
- package/dist/cli/hooks.js +87 -1
- package/dist/cli/hooks.js.map +1 -1
- package/dist/cli/wiki-commands.d.ts +4 -0
- package/dist/cli/wiki-commands.d.ts.map +1 -0
- package/dist/cli/wiki-commands.js +53 -0
- package/dist/cli/wiki-commands.js.map +1 -0
- package/dist/formatters.d.ts.map +1 -1
- package/dist/formatters.js +9 -8
- package/dist/formatters.js.map +1 -1
- package/dist/instructions.d.ts +1 -1
- package/dist/instructions.d.ts.map +1 -1
- package/dist/instructions.js +3 -0
- package/dist/instructions.js.map +1 -1
- package/dist/register-tool-loaders.d.ts +1 -0
- package/dist/register-tool-loaders.d.ts.map +1 -1
- package/dist/register-tool-loaders.js +2 -0
- package/dist/register-tool-loaders.js.map +1 -1
- package/dist/register-tools.d.ts +10 -0
- package/dist/register-tools.d.ts.map +1 -1
- package/dist/register-tools.js +53 -8
- package/dist/register-tools.js.map +1 -1
- package/dist/search/tool-ranker.js +1 -1
- package/dist/server-helpers.d.ts.map +1 -1
- package/dist/server-helpers.js +12 -0
- package/dist/server-helpers.js.map +1 -1
- package/dist/tools/lens-template.d.ts +37 -0
- package/dist/tools/lens-template.d.ts.map +1 -0
- package/dist/tools/lens-template.js +326 -0
- package/dist/tools/lens-template.js.map +1 -0
- package/dist/tools/lens-tools.d.ts +12 -0
- package/dist/tools/lens-tools.d.ts.map +1 -0
- package/dist/tools/lens-tools.js +17 -0
- package/dist/tools/lens-tools.js.map +1 -0
- package/dist/tools/nextjs-component-readers.d.ts.map +1 -1
- package/dist/tools/nextjs-component-readers.js +1 -0
- package/dist/tools/nextjs-component-readers.js.map +1 -1
- package/dist/tools/nextjs-component-tools.js +1 -0
- package/dist/tools/nextjs-component-tools.js.map +1 -1
- package/dist/tools/nextjs-framework-audit-tools.d.ts +2 -2
- package/dist/tools/nextjs-framework-audit-tools.d.ts.map +1 -1
- package/dist/tools/plan-turn-tools.d.ts.map +1 -1
- package/dist/tools/plan-turn-tools.js +10 -7
- package/dist/tools/plan-turn-tools.js.map +1 -1
- package/dist/tools/wiki-escape.d.ts +11 -0
- package/dist/tools/wiki-escape.d.ts.map +1 -0
- package/dist/tools/wiki-escape.js +21 -0
- package/dist/tools/wiki-escape.js.map +1 -0
- package/dist/tools/wiki-links.d.ts +23 -0
- package/dist/tools/wiki-links.d.ts.map +1 -0
- package/dist/tools/wiki-links.js +57 -0
- package/dist/tools/wiki-links.js.map +1 -0
- package/dist/tools/wiki-lint.d.ts +13 -0
- package/dist/tools/wiki-lint.d.ts.map +1 -0
- package/dist/tools/wiki-lint.js +70 -0
- package/dist/tools/wiki-lint.js.map +1 -0
- package/dist/tools/wiki-manifest.d.ts +44 -0
- package/dist/tools/wiki-manifest.d.ts.map +1 -0
- package/dist/tools/wiki-manifest.js +72 -0
- package/dist/tools/wiki-manifest.js.map +1 -0
- package/dist/tools/wiki-page-generators.d.ts +38 -0
- package/dist/tools/wiki-page-generators.d.ts.map +1 -0
- package/dist/tools/wiki-page-generators.js +129 -0
- package/dist/tools/wiki-page-generators.js.map +1 -0
- package/dist/tools/wiki-surprise.d.ts +31 -0
- package/dist/tools/wiki-surprise.d.ts.map +1 -0
- package/dist/tools/wiki-surprise.js +77 -0
- package/dist/tools/wiki-surprise.js.map +1 -0
- package/dist/tools/wiki-tools.d.ts +14 -0
- package/dist/tools/wiki-tools.d.ts.map +1 -0
- package/dist/tools/wiki-tools.js +245 -0
- package/dist/tools/wiki-tools.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { escMd } from "./wiki-escape.js";
|
|
2
|
+
const MAX_FILES_DISPLAY = 15;
|
|
3
|
+
const SUMMARY_CHAR_BUDGET = 1600; // ~400 tokens at 4 chars/token
|
|
4
|
+
export function generateCommunityPage(data) {
|
|
5
|
+
const { community, cohesion, internal_edges, external_edges, hotspots, hub_symbols } = data;
|
|
6
|
+
const lines = [];
|
|
7
|
+
lines.push(`# ${escMd(community.name)}`);
|
|
8
|
+
lines.push("");
|
|
9
|
+
lines.push(`**Cohesion:** ${(cohesion * 100).toFixed(0)}% | ` +
|
|
10
|
+
`**Internal edges:** ${internal_edges} | ` +
|
|
11
|
+
`**External edges:** ${external_edges} | ` +
|
|
12
|
+
`**Files:** ${community.size}`);
|
|
13
|
+
lines.push("", "## Files", "");
|
|
14
|
+
const displayFiles = community.files.slice(0, MAX_FILES_DISPLAY);
|
|
15
|
+
for (const f of displayFiles)
|
|
16
|
+
lines.push(`- ${escMd(f)}`);
|
|
17
|
+
if (community.files.length > MAX_FILES_DISPLAY) {
|
|
18
|
+
const extra = community.files.length - MAX_FILES_DISPLAY;
|
|
19
|
+
lines.push(`- *+${extra} more files (use \`codesift wiki-generate --focus\` to see all)*`);
|
|
20
|
+
}
|
|
21
|
+
lines.push("");
|
|
22
|
+
if (hub_symbols.length > 0) {
|
|
23
|
+
lines.push("## Hub Symbols", "", "| Symbol | Role | Callers | Callees |", "| ------ | ---- | ------: | ------: |");
|
|
24
|
+
for (const h of hub_symbols) {
|
|
25
|
+
lines.push(`| ${escMd(h.name)} | ${escMd(h.role)} | ${h.callers} | ${h.callees} |`);
|
|
26
|
+
}
|
|
27
|
+
lines.push("");
|
|
28
|
+
}
|
|
29
|
+
if (hotspots.length > 0) {
|
|
30
|
+
lines.push("## Hotspots", "", "| File | Commits | Score |", "| ---- | ------: | ----: |");
|
|
31
|
+
for (const h of hotspots) {
|
|
32
|
+
lines.push(`| ${escMd(h.file)} | ${h.commits} | ${h.hotspot_score.toFixed(2)} |`);
|
|
33
|
+
}
|
|
34
|
+
lines.push("");
|
|
35
|
+
}
|
|
36
|
+
return lines.join("\n");
|
|
37
|
+
}
|
|
38
|
+
export function generateCommunitySummary(data) {
|
|
39
|
+
const { community, cohesion, hub_symbols } = data;
|
|
40
|
+
const lines = [
|
|
41
|
+
`**${escMd(community.name)}**`,
|
|
42
|
+
`Cohesion: ${(cohesion * 100).toFixed(0)}% | Files: ${community.size}`,
|
|
43
|
+
];
|
|
44
|
+
const topFiles = community.files.slice(0, 3);
|
|
45
|
+
if (topFiles.length > 0)
|
|
46
|
+
lines.push(`Top files: ${topFiles.map(escMd).join(", ")}`);
|
|
47
|
+
const topHub = hub_symbols[0];
|
|
48
|
+
if (topHub !== undefined)
|
|
49
|
+
lines.push(`Top hub: ${escMd(topHub.name)} (${topHub.callers} callers)`);
|
|
50
|
+
const result = lines.join("\n");
|
|
51
|
+
return result.length <= SUMMARY_CHAR_BUDGET ? result : result.slice(0, SUMMARY_CHAR_BUDGET);
|
|
52
|
+
}
|
|
53
|
+
export function generateHubsPage(hubs) {
|
|
54
|
+
const lines = [
|
|
55
|
+
"# Hub Symbols", "",
|
|
56
|
+
"High-centrality symbols that act as architectural connectors.", "",
|
|
57
|
+
];
|
|
58
|
+
if (hubs.length === 0) {
|
|
59
|
+
lines.push("No hub symbols detected.");
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
lines.push("| Symbol | File | Role | Callers | Callees |", "| ------ | ---- | ---- | ------: | ------: |");
|
|
63
|
+
for (const h of hubs) {
|
|
64
|
+
lines.push(`| ${escMd(h.name)} | ${escMd(h.file)} | ${escMd(h.role)} | ${h.callers} | ${h.callees} |`);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
lines.push("");
|
|
68
|
+
return lines.join("\n");
|
|
69
|
+
}
|
|
70
|
+
export function generateSurprisePage(surprises) {
|
|
71
|
+
const lines = [
|
|
72
|
+
"# Surprise Connections", "",
|
|
73
|
+
"Cross-community boundaries with higher coupling than expected (structural + temporal).", "",
|
|
74
|
+
];
|
|
75
|
+
if (surprises.length === 0) {
|
|
76
|
+
lines.push("No surprise connections detected.");
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
lines.push("| Community A | Community B | Score | Edges | Example Files |", "| ----------- | ----------- | ----: | ----: | ------------- |");
|
|
80
|
+
for (const s of surprises) {
|
|
81
|
+
const ex = `${escMd(s.example_files[0])} ↔ ${escMd(s.example_files[1])}`;
|
|
82
|
+
lines.push(`| ${escMd(s.community_a)} | ${escMd(s.community_b)} | ${s.combined_score.toFixed(2)} | ${s.edge_count} | ${ex} |`);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
lines.push("");
|
|
86
|
+
return lines.join("\n");
|
|
87
|
+
}
|
|
88
|
+
export function generateHotspotsPage(hotspots) {
|
|
89
|
+
const lines = [
|
|
90
|
+
"# Hotspot Files", "",
|
|
91
|
+
"Files ranked by churn × complexity (commit frequency × size).", "",
|
|
92
|
+
];
|
|
93
|
+
if (hotspots.length === 0) {
|
|
94
|
+
lines.push("No hotspot data available.");
|
|
95
|
+
}
|
|
96
|
+
else {
|
|
97
|
+
lines.push("| File | Commits | Score |", "| ---- | ------: | ----: |");
|
|
98
|
+
for (const h of hotspots) {
|
|
99
|
+
lines.push(`| ${escMd(h.file)} | ${h.commits} | ${h.hotspot_score.toFixed(2)} |`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
lines.push("");
|
|
103
|
+
return lines.join("\n");
|
|
104
|
+
}
|
|
105
|
+
export function generateFrameworkPage(framework) {
|
|
106
|
+
if (framework === null)
|
|
107
|
+
return "";
|
|
108
|
+
return [`# Framework: ${escMd(framework.name)}`, "", escMd(framework.details), ""].join("\n");
|
|
109
|
+
}
|
|
110
|
+
export function generateIndexPage(pages) {
|
|
111
|
+
const lines = [
|
|
112
|
+
"# Wiki Index", "",
|
|
113
|
+
"Auto-generated codebase wiki. Use the links below to navigate.", "",
|
|
114
|
+
];
|
|
115
|
+
const byType = new Map();
|
|
116
|
+
for (const page of pages) {
|
|
117
|
+
const group = byType.get(page.type) ?? [];
|
|
118
|
+
group.push(page);
|
|
119
|
+
byType.set(page.type, group);
|
|
120
|
+
}
|
|
121
|
+
for (const [type, group] of byType) {
|
|
122
|
+
lines.push(`## ${escMd(type)}`, "");
|
|
123
|
+
for (const page of group)
|
|
124
|
+
lines.push(`- [[${page.slug}]] — ${escMd(page.title)}`);
|
|
125
|
+
lines.push("");
|
|
126
|
+
}
|
|
127
|
+
return lines.join("\n");
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=wiki-page-generators.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-page-generators.js","sourceRoot":"","sources":["../../src/tools/wiki-page-generators.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export interface SurpriseScore {
|
|
2
|
+
community_a: string;
|
|
3
|
+
community_b: string;
|
|
4
|
+
structural_score: number;
|
|
5
|
+
temporal_score: number;
|
|
6
|
+
combined_score: number;
|
|
7
|
+
edge_count: number;
|
|
8
|
+
example_files: [string, string];
|
|
9
|
+
}
|
|
10
|
+
export interface CrossEdge {
|
|
11
|
+
from_community: string;
|
|
12
|
+
to_community: string;
|
|
13
|
+
from_file: string;
|
|
14
|
+
to_file: string;
|
|
15
|
+
}
|
|
16
|
+
export interface CoChangePair {
|
|
17
|
+
file_a: string;
|
|
18
|
+
file_b: string;
|
|
19
|
+
jaccard: number;
|
|
20
|
+
}
|
|
21
|
+
export interface CommunityInfo {
|
|
22
|
+
name: string;
|
|
23
|
+
files: string[];
|
|
24
|
+
size: number;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Pure function — computes surprise scores for cross-community boundaries.
|
|
28
|
+
* No async, no MCP infrastructure imports.
|
|
29
|
+
*/
|
|
30
|
+
export declare function computeSurpriseScores(communities: CommunityInfo[], crossEdges: CrossEdge[], coChangePairs: CoChangePair[], globalDensity: number): SurpriseScore[];
|
|
31
|
+
//# sourceMappingURL=wiki-surprise.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-surprise.d.ts","sourceRoot":"","sources":["../../src/tools/wiki-surprise.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,SAAS;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACd;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,aAAa,EAAE,EAC5B,UAAU,EAAE,SAAS,EAAE,EACvB,aAAa,EAAE,YAAY,EAAE,EAC7B,aAAa,EAAE,MAAM,GACpB,aAAa,EAAE,CA0FjB"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pure function — computes surprise scores for cross-community boundaries.
|
|
3
|
+
* No async, no MCP infrastructure imports.
|
|
4
|
+
*/
|
|
5
|
+
export function computeSurpriseScores(communities, crossEdges, coChangePairs, globalDensity) {
|
|
6
|
+
if (communities.length === 0)
|
|
7
|
+
return [];
|
|
8
|
+
// Build a lookup: community name → file set
|
|
9
|
+
const communityFiles = new Map();
|
|
10
|
+
const communitySize = new Map();
|
|
11
|
+
for (const c of communities) {
|
|
12
|
+
communityFiles.set(c.name, new Set(c.files));
|
|
13
|
+
communitySize.set(c.name, c.size);
|
|
14
|
+
}
|
|
15
|
+
// Canonical pair key: always sort so (A,B) === (B,A)
|
|
16
|
+
function pairKey(a, b) {
|
|
17
|
+
return a < b ? `${a}\0${b}` : `${b}\0${a}`;
|
|
18
|
+
}
|
|
19
|
+
const groups = new Map();
|
|
20
|
+
for (const edge of crossEdges) {
|
|
21
|
+
const ca = edge.from_community;
|
|
22
|
+
const cb = edge.to_community;
|
|
23
|
+
if (ca === cb)
|
|
24
|
+
continue;
|
|
25
|
+
const key = pairKey(ca, cb);
|
|
26
|
+
if (!groups.has(key)) {
|
|
27
|
+
const [a, b] = ca < cb ? [ca, cb] : [cb, ca];
|
|
28
|
+
groups.set(key, { community_a: a, community_b: b, edges: [] });
|
|
29
|
+
}
|
|
30
|
+
groups.get(key).edges.push(edge);
|
|
31
|
+
}
|
|
32
|
+
const results = [];
|
|
33
|
+
for (const [, group] of groups) {
|
|
34
|
+
const { community_a, community_b, edges } = group;
|
|
35
|
+
const sizeA = communitySize.get(community_a) ?? 0;
|
|
36
|
+
const sizeB = communitySize.get(community_b) ?? 0;
|
|
37
|
+
const filesA = communityFiles.get(community_a) ?? new Set();
|
|
38
|
+
const filesB = communityFiles.get(community_b) ?? new Set();
|
|
39
|
+
const edgeCount = edges.length;
|
|
40
|
+
const expected = sizeA * sizeB * globalDensity;
|
|
41
|
+
const structuralScore = expected === 0 ? 0 : edgeCount / expected;
|
|
42
|
+
// Find co-change pairs crossing this boundary
|
|
43
|
+
let temporalScore = 0;
|
|
44
|
+
let bestPair = null;
|
|
45
|
+
for (const pair of coChangePairs) {
|
|
46
|
+
const aInA = filesA.has(pair.file_a);
|
|
47
|
+
const bInB = filesB.has(pair.file_b);
|
|
48
|
+
const aInB = filesB.has(pair.file_a);
|
|
49
|
+
const bInA = filesA.has(pair.file_b);
|
|
50
|
+
const crossesBoundary = (aInA && bInB) || (aInB && bInA);
|
|
51
|
+
if (crossesBoundary && pair.jaccard > temporalScore) {
|
|
52
|
+
temporalScore = pair.jaccard;
|
|
53
|
+
bestPair = (aInA && bInB)
|
|
54
|
+
? [pair.file_a, pair.file_b]
|
|
55
|
+
: [pair.file_b, pair.file_a];
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
// Fall back to first cross edge if no co-change data
|
|
59
|
+
const exampleFiles = bestPair !== null
|
|
60
|
+
? bestPair
|
|
61
|
+
: [edges[0].from_file, edges[0].to_file];
|
|
62
|
+
const combinedScore = 0.6 * structuralScore + 0.4 * temporalScore;
|
|
63
|
+
results.push({
|
|
64
|
+
community_a,
|
|
65
|
+
community_b,
|
|
66
|
+
structural_score: structuralScore,
|
|
67
|
+
temporal_score: temporalScore,
|
|
68
|
+
combined_score: combinedScore,
|
|
69
|
+
edge_count: edgeCount,
|
|
70
|
+
example_files: exampleFiles,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
// Sort by combined_score descending
|
|
74
|
+
results.sort((a, b) => b.combined_score - a.combined_score);
|
|
75
|
+
return results;
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=wiki-surprise.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-surprise.js","sourceRoot":"","sources":["../../src/tools/wiki-surprise.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface WikiResult {
|
|
2
|
+
wiki_dir: string;
|
|
3
|
+
pages: number;
|
|
4
|
+
communities: number;
|
|
5
|
+
hubs: number;
|
|
6
|
+
surprises: number;
|
|
7
|
+
degraded: boolean;
|
|
8
|
+
degraded_reasons?: string[];
|
|
9
|
+
}
|
|
10
|
+
export declare function generateWiki(repo: string, options?: {
|
|
11
|
+
focus?: string;
|
|
12
|
+
output_dir?: string;
|
|
13
|
+
}): Promise<WikiResult>;
|
|
14
|
+
//# sourceMappingURL=wiki-tools.d.ts.map
|
|
@@ -0,0 +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;AA4CD,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,CAmOrB"}
|
|
@@ -0,0 +1,245 @@
|
|
|
1
|
+
import { writeFile, mkdir, readFile, readdir, rename, unlink } from "node:fs/promises";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
4
|
+
import { detectCommunities } from "./community-tools.js";
|
|
5
|
+
import { classifySymbolRoles } from "./graph-tools.js";
|
|
6
|
+
import { coChangeAnalysis, fanInFanOut } from "./coupling-tools.js";
|
|
7
|
+
import { analyzeHotspots } from "./hotspot-tools.js";
|
|
8
|
+
import { analyzeProject } from "./project-tools.js";
|
|
9
|
+
import { computeIndexHash } from "../storage/graph-store.js";
|
|
10
|
+
import { computeSurpriseScores, } from "./wiki-surprise.js";
|
|
11
|
+
import { generateCommunityPage, generateCommunitySummary, generateHubsPage, generateSurprisePage, generateHotspotsPage, generateFrameworkPage, generateIndexPage, } from "./wiki-page-generators.js";
|
|
12
|
+
import { resolveWikiLinks } from "./wiki-links.js";
|
|
13
|
+
import { buildWikiManifest, toSlug } from "./wiki-manifest.js";
|
|
14
|
+
const TIMEOUT_SENTINEL = { status: "timeout" };
|
|
15
|
+
function withTimeout(promise, ms) {
|
|
16
|
+
return Promise.race([
|
|
17
|
+
promise,
|
|
18
|
+
new Promise((resolve) => setTimeout(() => resolve(TIMEOUT_SENTINEL), ms)),
|
|
19
|
+
]);
|
|
20
|
+
}
|
|
21
|
+
function isTimeout(v) {
|
|
22
|
+
return typeof v === "object" && v !== null && "status" in v && v.status === "timeout";
|
|
23
|
+
}
|
|
24
|
+
const ANALYSIS_TIMEOUT = 15000;
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
// Helpers: settled-result unwrapping
|
|
27
|
+
// ---------------------------------------------------------------------------
|
|
28
|
+
function formatDegradedReason(label, result) {
|
|
29
|
+
if (result.status === "rejected") {
|
|
30
|
+
return `${label}_error: ${result.reason instanceof Error ? result.reason.message : String(result.reason)}`;
|
|
31
|
+
}
|
|
32
|
+
return `${label}_timeout`;
|
|
33
|
+
}
|
|
34
|
+
function unwrapSettled(result, label, extractor, fallback, degradedReasons) {
|
|
35
|
+
if (result.status === "fulfilled" && !isTimeout(result.value)) {
|
|
36
|
+
return extractor(result.value);
|
|
37
|
+
}
|
|
38
|
+
degradedReasons.push(formatDegradedReason(label, result));
|
|
39
|
+
return fallback;
|
|
40
|
+
}
|
|
41
|
+
// ---------------------------------------------------------------------------
|
|
42
|
+
// Helper: load old manifest if present
|
|
43
|
+
// ---------------------------------------------------------------------------
|
|
44
|
+
async function loadOldManifest(outputDir) {
|
|
45
|
+
try {
|
|
46
|
+
const raw = await readFile(join(outputDir, "manifest.json"), "utf-8");
|
|
47
|
+
return JSON.parse(raw);
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Main orchestrator
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
export async function generateWiki(repo, options) {
|
|
57
|
+
const index = await getCodeIndex(repo);
|
|
58
|
+
if (!index)
|
|
59
|
+
throw new Error(`Repository "${repo}" not found.`);
|
|
60
|
+
const outputDir = options?.output_dir ?? join(index.root, ".codesift", "wiki");
|
|
61
|
+
// Path traversal guard
|
|
62
|
+
if (options?.output_dir) {
|
|
63
|
+
const resolved = resolve(options.output_dir);
|
|
64
|
+
const root = resolve(index.root);
|
|
65
|
+
if (!resolved.startsWith(root + "/") && resolved !== root) {
|
|
66
|
+
throw new Error(`output_dir "${options.output_dir}" is outside the repository root — path traversal not allowed`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
await mkdir(outputDir, { recursive: true });
|
|
70
|
+
// Lockfile: prevent concurrent wiki generation
|
|
71
|
+
const lockPath = join(outputDir, ".wiki-lock");
|
|
72
|
+
try {
|
|
73
|
+
await writeFile(lockPath, `${process.pid}\n${new Date().toISOString()}`, { flag: "wx" });
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
throw new Error("Wiki generation already in progress (lockfile exists)");
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
// Fan out all analyses in parallel with per-analysis timeout
|
|
80
|
+
const [commResult, rolesResult, fanResult, coChangeResult, hotspotsResult] = await Promise.allSettled([
|
|
81
|
+
withTimeout(detectCommunities(repo, options?.focus), ANALYSIS_TIMEOUT),
|
|
82
|
+
withTimeout(classifySymbolRoles(repo, {}), ANALYSIS_TIMEOUT),
|
|
83
|
+
withTimeout(fanInFanOut(repo, {}), ANALYSIS_TIMEOUT),
|
|
84
|
+
withTimeout(coChangeAnalysis(repo, {}), ANALYSIS_TIMEOUT),
|
|
85
|
+
withTimeout(analyzeHotspots(repo, {}), ANALYSIS_TIMEOUT),
|
|
86
|
+
]);
|
|
87
|
+
// analyzeProject is best-effort only (used for framework detection)
|
|
88
|
+
const [projectResult] = await Promise.allSettled([
|
|
89
|
+
withTimeout(analyzeProject(repo), ANALYSIS_TIMEOUT),
|
|
90
|
+
]);
|
|
91
|
+
const degradedReasons = [];
|
|
92
|
+
const communities = unwrapSettled(commResult, "community_detection", (cr) => {
|
|
93
|
+
if ("communities" in cr) {
|
|
94
|
+
return cr.communities.map((c) => ({ name: c.name, files: c.files, size: c.files.length }));
|
|
95
|
+
}
|
|
96
|
+
return [];
|
|
97
|
+
}, [], degradedReasons);
|
|
98
|
+
const crossEdges = [];
|
|
99
|
+
const hubSymbols = unwrapSettled(rolesResult, "classify_roles", (roles) => roles
|
|
100
|
+
.filter((r) => r.role === "core" || r.role === "utility" || r.callers >= 3)
|
|
101
|
+
.slice(0, 30)
|
|
102
|
+
.map((r) => ({ name: r.name, file: r.file, role: r.role, callers: r.callers, callees: r.callees })), [], degradedReasons);
|
|
103
|
+
const coChangePairs = unwrapSettled(coChangeResult, "cochange", (v) => v.pairs.map((p) => ({ file_a: p.file_a, file_b: p.file_b, jaccard: p.jaccard })), [], degradedReasons);
|
|
104
|
+
// Fan-in/fan-out: only record degraded reason, no data extracted
|
|
105
|
+
unwrapSettled(fanResult, "fanin", () => null, null, degradedReasons);
|
|
106
|
+
const fileHotspots = unwrapSettled(hotspotsResult, "hotspots", (v) => v.hotspots.slice(0, 20).map((h) => ({ file: h.file, commits: h.commits, hotspot_score: h.hotspot_score })), [], degradedReasons);
|
|
107
|
+
const frameworkInfo = unwrapSettled(projectResult, "project", (v) => {
|
|
108
|
+
const fw = v.stack?.framework;
|
|
109
|
+
return fw ? { name: fw, details: `Primary framework detected: ${fw}.` } : null;
|
|
110
|
+
}, null, degradedReasons);
|
|
111
|
+
// Compute surprise scores
|
|
112
|
+
const globalDensity = index.files.length > 0 ? crossEdges.length / (index.files.length * index.files.length) : 0;
|
|
113
|
+
const surprises = computeSurpriseScores(communities, crossEdges, coChangePairs, globalDensity);
|
|
114
|
+
// Build community page data
|
|
115
|
+
const communityPages = communities.map((comm) => {
|
|
116
|
+
const slug = toSlug(comm.name);
|
|
117
|
+
const commHotspots = fileHotspots.filter((h) => comm.files.includes(h.file));
|
|
118
|
+
const commHubs = hubSymbols.filter((h) => comm.files.includes(h.file));
|
|
119
|
+
const rawComm = commResult.status === "fulfilled" && !isTimeout(commResult.value) && "communities" in commResult.value
|
|
120
|
+
? commResult.value.communities.find((c) => c.name === comm.name)
|
|
121
|
+
: undefined;
|
|
122
|
+
const data = {
|
|
123
|
+
community: comm,
|
|
124
|
+
cohesion: rawComm?.cohesion ?? 0,
|
|
125
|
+
internal_edges: rawComm?.internal_edges ?? 0,
|
|
126
|
+
external_edges: rawComm?.external_edges ?? 0,
|
|
127
|
+
hotspots: commHotspots,
|
|
128
|
+
hub_symbols: commHubs,
|
|
129
|
+
};
|
|
130
|
+
const content = generateCommunityPage(data);
|
|
131
|
+
return { slug, title: comm.name, type: "community", file: `${slug}.md`, content };
|
|
132
|
+
});
|
|
133
|
+
// Write community summary files for hook injection
|
|
134
|
+
for (const comm of communityPages) {
|
|
135
|
+
const data = communities.find((c) => toSlug(c.name) === comm.slug);
|
|
136
|
+
if (!data)
|
|
137
|
+
continue;
|
|
138
|
+
const commHotspots = fileHotspots.filter((h) => data.files.includes(h.file));
|
|
139
|
+
const commHubs = hubSymbols.filter((h) => data.files.includes(h.file));
|
|
140
|
+
const rawComm = commResult.status === "fulfilled" && !isTimeout(commResult.value) && "communities" in commResult.value
|
|
141
|
+
? commResult.value.communities.find((c) => c.name === data.name)
|
|
142
|
+
: undefined;
|
|
143
|
+
const summaryData = {
|
|
144
|
+
community: data,
|
|
145
|
+
cohesion: rawComm?.cohesion ?? 0,
|
|
146
|
+
internal_edges: rawComm?.internal_edges ?? 0,
|
|
147
|
+
external_edges: rawComm?.external_edges ?? 0,
|
|
148
|
+
hotspots: commHotspots,
|
|
149
|
+
hub_symbols: commHubs,
|
|
150
|
+
};
|
|
151
|
+
const summary = generateCommunitySummary(summaryData);
|
|
152
|
+
await writeFile(join(outputDir, `${comm.slug}.summary.md`), summary, "utf-8");
|
|
153
|
+
}
|
|
154
|
+
// Hubs page
|
|
155
|
+
const hubsContent = generateHubsPage(hubSymbols);
|
|
156
|
+
const hubsPage = { slug: "hubs", title: "Hub Symbols", type: "hubs", file: "hubs.md", content: hubsContent };
|
|
157
|
+
// Surprises page
|
|
158
|
+
const surprisesContent = generateSurprisePage(surprises);
|
|
159
|
+
const surprisesPage = { slug: "surprises", title: "Surprise Connections", type: "surprises", file: "surprises.md", content: surprisesContent };
|
|
160
|
+
// Hotspots page
|
|
161
|
+
const hotspotsContent = generateHotspotsPage(fileHotspots);
|
|
162
|
+
const hotspotsPage = { slug: "hotspots", title: "Hotspot Files", type: "hotspots", file: "hotspots.md", content: hotspotsContent };
|
|
163
|
+
// Framework page (only if framework detected)
|
|
164
|
+
const frameworkPages = [];
|
|
165
|
+
if (frameworkInfo) {
|
|
166
|
+
const content = generateFrameworkPage(frameworkInfo);
|
|
167
|
+
if (content) {
|
|
168
|
+
frameworkPages.push({ slug: "framework", title: `Framework: ${frameworkInfo.name}`, type: "framework", file: "framework.md", content });
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
// Collect all content pages (excluding index) for index generation
|
|
172
|
+
const contentPages = [
|
|
173
|
+
...communityPages,
|
|
174
|
+
hubsPage,
|
|
175
|
+
surprisesPage,
|
|
176
|
+
hotspotsPage,
|
|
177
|
+
...frameworkPages,
|
|
178
|
+
];
|
|
179
|
+
// Index page
|
|
180
|
+
const indexContent = generateIndexPage(contentPages.map((p) => ({ slug: p.slug, title: p.title, type: p.type })));
|
|
181
|
+
const indexPage = { slug: "index", title: "Wiki Index", type: "index", file: "index.md", content: indexContent };
|
|
182
|
+
const allPages = [indexPage, ...contentPages];
|
|
183
|
+
// Resolve wiki links (two-pass backlink injection)
|
|
184
|
+
const pageMap = new Map(allPages.map((p) => [p.slug, p.content]));
|
|
185
|
+
const knownSlugs = new Set(allPages.map((p) => p.slug));
|
|
186
|
+
const { resolvedPages } = resolveWikiLinks(pageMap, knownSlugs);
|
|
187
|
+
// Update PageInfo content with resolved versions
|
|
188
|
+
const resolvedPageInfos = allPages.map((p) => ({
|
|
189
|
+
...p,
|
|
190
|
+
content: resolvedPages.get(p.slug) ?? p.content,
|
|
191
|
+
}));
|
|
192
|
+
// Load old manifest for slug_redirects preservation
|
|
193
|
+
const oldManifest = await loadOldManifest(outputDir);
|
|
194
|
+
// Build manifest
|
|
195
|
+
const indexHash = computeIndexHash(index.files);
|
|
196
|
+
const manifestOptions = {
|
|
197
|
+
index_hash: indexHash,
|
|
198
|
+
git_commit: "unknown",
|
|
199
|
+
pages: resolvedPageInfos,
|
|
200
|
+
communities,
|
|
201
|
+
degradedReasons,
|
|
202
|
+
};
|
|
203
|
+
if (oldManifest !== undefined) {
|
|
204
|
+
manifestOptions.oldManifest = oldManifest;
|
|
205
|
+
}
|
|
206
|
+
const manifest = buildWikiManifest(manifestOptions);
|
|
207
|
+
// Write pages
|
|
208
|
+
for (const page of resolvedPageInfos) {
|
|
209
|
+
await writeFile(join(outputDir, page.file), page.content, "utf-8");
|
|
210
|
+
}
|
|
211
|
+
// Stale page cleanup: delete .md files from a previous run that are no longer generated
|
|
212
|
+
const existingFiles = await readdir(outputDir);
|
|
213
|
+
const newFiles = new Set(resolvedPageInfos.map((p) => p.file));
|
|
214
|
+
newFiles.add("wiki-manifest.json");
|
|
215
|
+
newFiles.add("wiki-manifest.json.tmp");
|
|
216
|
+
newFiles.add(".wiki-lock");
|
|
217
|
+
// Add summary files to known set so they aren't cleaned up
|
|
218
|
+
for (const comm of communityPages) {
|
|
219
|
+
newFiles.add(`${comm.slug}.summary.md`);
|
|
220
|
+
}
|
|
221
|
+
for (const f of existingFiles) {
|
|
222
|
+
if (f.endsWith(".md") && !newFiles.has(f)) {
|
|
223
|
+
await unlink(join(outputDir, f));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Atomic manifest write: write to .tmp then rename
|
|
227
|
+
const manifestPath = join(outputDir, "wiki-manifest.json");
|
|
228
|
+
const tmpPath = manifestPath + ".tmp";
|
|
229
|
+
await writeFile(tmpPath, JSON.stringify(manifest, null, 2));
|
|
230
|
+
await rename(tmpPath, manifestPath);
|
|
231
|
+
return {
|
|
232
|
+
wiki_dir: outputDir,
|
|
233
|
+
pages: resolvedPageInfos.length,
|
|
234
|
+
communities: communities.length,
|
|
235
|
+
hubs: hubSymbols.length,
|
|
236
|
+
surprises: surprises.length,
|
|
237
|
+
degraded: degradedReasons.length > 0,
|
|
238
|
+
...(degradedReasons.length > 0 ? { degraded_reasons: degradedReasons } : {}),
|
|
239
|
+
};
|
|
240
|
+
}
|
|
241
|
+
finally {
|
|
242
|
+
await unlink(lockPath).catch(() => { });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
//# sourceMappingURL=wiki-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wiki-tools.js","sourceRoot":"","sources":["../../src/tools/wiki-tools.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "codesift-mcp",
|
|
3
|
-
"version": "0.5.
|
|
3
|
+
"version": "0.5.8",
|
|
4
4
|
"description": "MCP server for code intelligence — 146 tools for symbol search, call graph, semantic search, route tracing, community detection, LSP bridge, secret detection, conversation search, and Hono framework intelligence",
|
|
5
5
|
"license": "BSL-1.1",
|
|
6
6
|
"author": "Greg Laskowski",
|