repo-codegraph 0.0.0-stage → 0.2.1

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 (74) hide show
  1. package/README.md +462 -2
  2. package/dist/analyzer/analyzeProject.d.ts +17 -0
  3. package/dist/analyzer/analyzeProject.d.ts.map +1 -0
  4. package/dist/analyzer/analyzeProject.js +338 -0
  5. package/dist/analyzer/analyzeProject.js.map +1 -0
  6. package/dist/analyzer/buildDefinitionGraph.d.ts +47 -0
  7. package/dist/analyzer/buildDefinitionGraph.d.ts.map +1 -0
  8. package/dist/analyzer/buildDefinitionGraph.js +60 -0
  9. package/dist/analyzer/buildDefinitionGraph.js.map +1 -0
  10. package/dist/analyzer/incrementalIndex.d.ts +21 -0
  11. package/dist/analyzer/incrementalIndex.d.ts.map +1 -0
  12. package/dist/analyzer/incrementalIndex.js +115 -0
  13. package/dist/analyzer/incrementalIndex.js.map +1 -0
  14. package/dist/cli.d.ts +3 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +249 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/files/discoverSourceFiles.d.ts +8 -0
  19. package/dist/files/discoverSourceFiles.d.ts.map +1 -0
  20. package/dist/files/discoverSourceFiles.js +46 -0
  21. package/dist/files/discoverSourceFiles.js.map +1 -0
  22. package/dist/git/diffImpact.d.ts +22 -0
  23. package/dist/git/diffImpact.d.ts.map +1 -0
  24. package/dist/git/diffImpact.js +113 -0
  25. package/dist/git/diffImpact.js.map +1 -0
  26. package/dist/graph/DirectedGraph.d.ts +44 -0
  27. package/dist/graph/DirectedGraph.d.ts.map +1 -0
  28. package/dist/graph/DirectedGraph.js +258 -0
  29. package/dist/graph/DirectedGraph.js.map +1 -0
  30. package/dist/graph/types.d.ts +13 -0
  31. package/dist/graph/types.d.ts.map +1 -0
  32. package/dist/graph/types.js +2 -0
  33. package/dist/graph/types.js.map +1 -0
  34. package/dist/index.d.ts +21 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +13 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/mcp/projectSession.d.ts +18 -0
  39. package/dist/mcp/projectSession.d.ts.map +1 -0
  40. package/dist/mcp/projectSession.js +86 -0
  41. package/dist/mcp/projectSession.js.map +1 -0
  42. package/dist/mcp/server.d.ts +23 -0
  43. package/dist/mcp/server.d.ts.map +1 -0
  44. package/dist/mcp/server.js +512 -0
  45. package/dist/mcp/server.js.map +1 -0
  46. package/dist/mcp/stdio.d.ts +3 -0
  47. package/dist/mcp/stdio.d.ts.map +1 -0
  48. package/dist/mcp/stdio.js +35 -0
  49. package/dist/mcp/stdio.js.map +1 -0
  50. package/dist/parser/extractDeclarations.d.ts +30 -0
  51. package/dist/parser/extractDeclarations.d.ts.map +1 -0
  52. package/dist/parser/extractDeclarations.js +83 -0
  53. package/dist/parser/extractDeclarations.js.map +1 -0
  54. package/dist/parser/parseSourceFile.d.ts +4 -0
  55. package/dist/parser/parseSourceFile.d.ts.map +1 -0
  56. package/dist/parser/parseSourceFile.js +9 -0
  57. package/dist/parser/parseSourceFile.js.map +1 -0
  58. package/dist/persistence/jsonPersistence.d.ts +7 -0
  59. package/dist/persistence/jsonPersistence.d.ts.map +1 -0
  60. package/dist/persistence/jsonPersistence.js +98 -0
  61. package/dist/persistence/jsonPersistence.js.map +1 -0
  62. package/dist/queries/analyzeImpact.d.ts +14 -0
  63. package/dist/queries/analyzeImpact.d.ts.map +1 -0
  64. package/dist/queries/analyzeImpact.js +56 -0
  65. package/dist/queries/analyzeImpact.js.map +1 -0
  66. package/dist/queries/codeGraphQueries.d.ts +7 -0
  67. package/dist/queries/codeGraphQueries.d.ts.map +1 -0
  68. package/dist/queries/codeGraphQueries.js +86 -0
  69. package/dist/queries/codeGraphQueries.js.map +1 -0
  70. package/dist/visualization/viewer.d.ts +17 -0
  71. package/dist/visualization/viewer.d.ts.map +1 -0
  72. package/dist/visualization/viewer.js +349 -0
  73. package/dist/visualization/viewer.js.map +1 -0
  74. package/package.json +55 -3
@@ -0,0 +1,512 @@
1
+ import path from "node:path";
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
3
+ import { z } from "zod";
4
+ import { analyzeDiffImpact, readGitDiff } from "../git/diffImpact.js";
5
+ import { analyzeImpact } from "../queries/analyzeImpact.js";
6
+ import { findSymbols } from "../queries/codeGraphQueries.js";
7
+ import { CodeGraphProjectSession, } from "./projectSession.js";
8
+ const SERVER_VERSION = "0.1.0";
9
+ const DEFAULT_LIST_LIMIT = 25;
10
+ const MAX_LIST_LIMIT = 100;
11
+ const DEFAULT_PATH_DEPTH = 10;
12
+ const MAX_PATH_DEPTH = 50;
13
+ const DEFAULT_IMPACT_DEPTH = 5;
14
+ const DEFAULT_IMPACT_RESULTS = 50;
15
+ const MAX_FILE_RESULTS = 100;
16
+ const declarationKindSchema = z.enum([
17
+ "function",
18
+ "class",
19
+ "interface",
20
+ "method",
21
+ ]);
22
+ const relationshipTypeSchema = z.enum(["CALLS", "IMPORTS"]);
23
+ const relationshipTypesInput = z
24
+ .array(relationshipTypeSchema)
25
+ .min(1)
26
+ .max(2)
27
+ .optional();
28
+ const limitInput = z.number().int().min(1).max(MAX_LIST_LIMIT).optional();
29
+ const sourceSummarySchema = z.object({
30
+ path: z.string(),
31
+ startLine: z.number().int().positive().nullable(),
32
+ startColumn: z.number().int().positive().nullable(),
33
+ endLine: z.number().int().positive().nullable(),
34
+ endColumn: z.number().int().positive().nullable(),
35
+ });
36
+ const entitySummarySchema = z.object({
37
+ id: z.string(),
38
+ type: z.enum(["file", "symbol"]),
39
+ name: z.string().nullable(),
40
+ qualifiedName: z.string().nullable(),
41
+ declarationKind: declarationKindSchema.nullable(),
42
+ source: sourceSummarySchema,
43
+ });
44
+ const relationshipSummarySchema = z.object({
45
+ type: relationshipTypeSchema,
46
+ confidence: z.enum(["exact", "inferred"]),
47
+ provenance: z.enum([
48
+ "typescript-type-checker",
49
+ "typescript-module-resolution",
50
+ ]),
51
+ moduleSpecifier: z.string().nullable(),
52
+ source: z
53
+ .object({
54
+ path: z.string(),
55
+ line: z.number().int().positive(),
56
+ column: z.number().int().positive(),
57
+ })
58
+ .nullable(),
59
+ });
60
+ const relationshipResultSchema = z.object({
61
+ entity: entitySummarySchema,
62
+ relationship: relationshipSummarySchema,
63
+ });
64
+ const impactSummarySchema = z.object({
65
+ changed: entitySummarySchema,
66
+ directDependents: z.array(entitySummarySchema),
67
+ indirectDependents: z.array(entitySummarySchema),
68
+ affectedFiles: z.array(z.string()),
69
+ counts: z.object({
70
+ direct: z.number().int().nonnegative(),
71
+ indirect: z.number().int().nonnegative(),
72
+ affectedFiles: z.number().int().nonnegative(),
73
+ }),
74
+ truncated: z.boolean(),
75
+ });
76
+ const READ_ONLY_ANNOTATIONS = {
77
+ readOnlyHint: true,
78
+ destructiveHint: false,
79
+ idempotentHint: true,
80
+ openWorldHint: false,
81
+ };
82
+ /** Creates one project-scoped MCP server. Callers choose the transport. */
83
+ export function createCodeGraphMcpServer(options = {}) {
84
+ const session = new CodeGraphProjectSession(options.rootDirectory ?? process.cwd(), options.indexPath);
85
+ const server = new McpServer({ name: "codegraph", version: SERVER_VERSION }, {
86
+ instructions: [
87
+ "Use find_symbol before relationship tools so names resolve to stable node IDs.",
88
+ "Results are bounded and source-linked; read only the reported source ranges.",
89
+ "Call refresh_index after source files change, then analyze_diff to review blast radius.",
90
+ ].join(" "),
91
+ maxToolInputElements: 100,
92
+ });
93
+ server.registerTool("find_symbol", {
94
+ title: "Find symbol",
95
+ description: "Find TypeScript declarations by name or qualified name. Use this first to obtain stable node IDs and source ranges for follow-up graph queries.",
96
+ inputSchema: {
97
+ query: z.string().trim().min(1).max(300),
98
+ kinds: z.array(declarationKindSchema).min(1).max(4).optional(),
99
+ file: z.string().trim().min(1).optional(),
100
+ limit: limitInput,
101
+ },
102
+ outputSchema: {
103
+ matches: z.array(entitySummarySchema),
104
+ totalMatches: z.number().int().nonnegative(),
105
+ truncated: z.boolean(),
106
+ },
107
+ annotations: READ_ONLY_ANNOTATIONS,
108
+ }, async ({ query, kinds, file, limit }) => {
109
+ const analysis = await session.getAnalysis();
110
+ const kindSet = kinds === undefined
111
+ ? undefined
112
+ : new Set(kinds);
113
+ const filtered = findSymbols(analysis.graph, query).filter((node) => (kindSet === undefined || kindSet.has(node.data.declarationKind)) &&
114
+ (file === undefined || node.data.location.file === file));
115
+ const effectiveLimit = limit ?? DEFAULT_LIST_LIMIT;
116
+ const matches = filtered
117
+ .slice(0, effectiveLimit)
118
+ .map(toEntitySummary);
119
+ const structuredContent = {
120
+ matches,
121
+ totalMatches: filtered.length,
122
+ truncated: filtered.length > matches.length,
123
+ };
124
+ return toolResult(`Found ${filtered.length} matching symbol${filtered.length === 1 ? "" : "s"}; returned ${matches.length}.`, structuredContent);
125
+ });
126
+ registerRelationshipTool(server, session, "get_dependencies", "Get dependencies", "Follow outgoing CALLS or IMPORTS relationships from a node. Use this to learn what a symbol or file relies on before reading or changing it.", "outgoing");
127
+ registerRelationshipTool(server, session, "get_dependents", "Get dependents", "Follow incoming CALLS or IMPORTS relationships to a node. Use this to find immediate callers or importers before changing shared code.", "incoming");
128
+ server.registerTool("find_path", {
129
+ title: "Find dependency path",
130
+ description: "Find a minimum-edge CALLS or IMPORTS path between two stable node IDs. Use this to explain how two code entities are connected without loading the whole graph.",
131
+ inputSchema: {
132
+ fromNodeId: z.string().min(1),
133
+ toNodeId: z.string().min(1),
134
+ relationships: relationshipTypesInput,
135
+ maxDepth: z
136
+ .number()
137
+ .int()
138
+ .min(0)
139
+ .max(MAX_PATH_DEPTH)
140
+ .optional(),
141
+ },
142
+ outputSchema: {
143
+ found: z.boolean(),
144
+ path: z.array(z.object({
145
+ entity: entitySummarySchema,
146
+ via: relationshipSummarySchema.nullable(),
147
+ })),
148
+ edgeCount: z.number().int().nonnegative().nullable(),
149
+ },
150
+ annotations: READ_ONLY_ANNOTATIONS,
151
+ }, async ({ fromNodeId, toNodeId, relationships, maxDepth }) => {
152
+ const analysis = await session.getAnalysis();
153
+ const pathEntries = findBoundedPath(analysis.graph, fromNodeId, toNodeId, relationships ?? ["CALLS", "IMPORTS"], maxDepth ?? DEFAULT_PATH_DEPTH);
154
+ const structuredContent = {
155
+ found: pathEntries !== null,
156
+ path: pathEntries ?? [],
157
+ edgeCount: pathEntries === null ? null : pathEntries.length - 1,
158
+ };
159
+ return toolResult(pathEntries === null
160
+ ? "No dependency path was found within the requested depth."
161
+ : `Found a ${pathEntries.length - 1}-edge dependency path.`, structuredContent);
162
+ });
163
+ server.registerTool("analyze_impact", {
164
+ title: "Analyze symbol impact",
165
+ description: "Calculate bounded reverse CALLS or IMPORTS impact for one stable node ID. Use this before changing shared code to identify direct and transitive dependents and affected files.",
166
+ inputSchema: {
167
+ nodeId: z.string().min(1),
168
+ relationships: relationshipTypesInput,
169
+ maxDepth: z.number().int().min(0).max(MAX_PATH_DEPTH).optional(),
170
+ maxResults: limitInput,
171
+ },
172
+ outputSchema: impactSummarySchema.shape,
173
+ annotations: READ_ONLY_ANNOTATIONS,
174
+ }, async ({ nodeId, relationships, maxDepth, maxResults }) => {
175
+ const analysis = await session.getAnalysis();
176
+ const impact = analyzeImpact(analysis.graph, nodeId, {
177
+ maxDepth: maxDepth ?? DEFAULT_IMPACT_DEPTH,
178
+ relationships: relationships ?? ["CALLS", "IMPORTS"],
179
+ });
180
+ const structuredContent = summarizeImpact(impact, maxResults ?? DEFAULT_IMPACT_RESULTS);
181
+ return toolResult(`Found ${structuredContent.counts.direct} direct and ${structuredContent.counts.indirect} indirect dependents across ${structuredContent.counts.affectedFiles} files.`, structuredContent);
182
+ });
183
+ server.registerTool("analyze_diff", {
184
+ title: "Analyze Git diff impact",
185
+ description: "Map staged and unstaged tracked TypeScript changes relative to HEAD to enclosing symbols, then calculate bounded reverse impact. Use this after editing to guide review and testing.",
186
+ inputSchema: {
187
+ relationships: relationshipTypesInput,
188
+ maxDepth: z.number().int().min(0).max(MAX_PATH_DEPTH).optional(),
189
+ maxChangedSymbols: z.number().int().min(1).max(50).optional(),
190
+ maxResultsPerSymbol: limitInput,
191
+ },
192
+ outputSchema: {
193
+ changedSymbols: z.array(entitySummarySchema),
194
+ impacts: z.array(impactSummarySchema),
195
+ unmappedChanges: z.array(z.object({
196
+ path: z.string(),
197
+ line: z.number().int().nonnegative(),
198
+ })),
199
+ counts: z.object({
200
+ changedSymbols: z.number().int().nonnegative(),
201
+ affectedFiles: z.number().int().nonnegative(),
202
+ unmappedChanges: z.number().int().nonnegative(),
203
+ }),
204
+ truncated: z.boolean(),
205
+ },
206
+ annotations: READ_ONLY_ANNOTATIONS,
207
+ }, async ({ relationships, maxDepth, maxChangedSymbols, maxResultsPerSymbol, }) => {
208
+ const analysis = await session.getAnalysis();
209
+ const diffText = await readGitDiff(session.rootDirectory);
210
+ const diff = analyzeDiffImpact(analysis.graph, diffText, {
211
+ maxDepth: maxDepth ?? DEFAULT_IMPACT_DEPTH,
212
+ relationships: relationships ?? ["CALLS", "IMPORTS"],
213
+ });
214
+ const symbolLimit = maxChangedSymbols ?? 20;
215
+ const resultLimit = maxResultsPerSymbol ?? DEFAULT_IMPACT_RESULTS;
216
+ const selectedImpacts = diff.impacts.slice(0, symbolLimit);
217
+ const impacts = selectedImpacts.map((impact) => summarizeImpact(impact, resultLimit));
218
+ const changedSymbols = diff.changedSymbols
219
+ .slice(0, symbolLimit)
220
+ .map(toEntitySummary);
221
+ const affectedFiles = new Set(diff.impacts.flatMap((impact) => impact.affectedFiles));
222
+ const unmappedChanges = diff.unmappedLines
223
+ .slice(0, MAX_FILE_RESULTS)
224
+ .map((change) => ({ path: change.filePath, line: change.line }));
225
+ const truncated = diff.changedSymbols.length > changedSymbols.length ||
226
+ diff.unmappedLines.length > unmappedChanges.length ||
227
+ impacts.some((impact) => impact.truncated);
228
+ const structuredContent = {
229
+ changedSymbols,
230
+ impacts,
231
+ unmappedChanges,
232
+ counts: {
233
+ changedSymbols: diff.changedSymbols.length,
234
+ affectedFiles: affectedFiles.size,
235
+ unmappedChanges: diff.unmappedLines.length,
236
+ },
237
+ truncated,
238
+ };
239
+ return toolResult(`Mapped ${diff.changedSymbols.length} changed symbol${diff.changedSymbols.length === 1 ? "" : "s"} affecting ${affectedFiles.size} file${affectedFiles.size === 1 ? "" : "s"}.`, structuredContent);
240
+ });
241
+ server.registerTool("refresh_index", {
242
+ title: "Refresh CodeGraph index",
243
+ description: "Refresh the local project graph after source files change. Incremental mode reuses unaffected persisted graph data; full mode rebuilds and replaces the saved index.",
244
+ inputSchema: {
245
+ mode: z.enum(["incremental", "full"]).optional(),
246
+ },
247
+ outputSchema: {
248
+ mode: z.enum(["incremental", "full"]),
249
+ indexPath: z.string(),
250
+ files: z.object({
251
+ added: z.array(z.string()),
252
+ changed: z.array(z.string()),
253
+ deleted: z.array(z.string()),
254
+ affected: z.array(z.string()),
255
+ reusedCount: z.number().int().nonnegative(),
256
+ }),
257
+ graph: z.object({
258
+ fileCount: z.number().int().nonnegative(),
259
+ symbolCount: z.number().int().nonnegative(),
260
+ edgeCount: z.number().int().nonnegative(),
261
+ }),
262
+ diagnostics: z.object({
263
+ total: z.number().int().nonnegative(),
264
+ byKind: z.record(z.string(), z.number().int().nonnegative()),
265
+ }),
266
+ truncated: z.boolean(),
267
+ },
268
+ annotations: {
269
+ readOnlyHint: false,
270
+ destructiveHint: false,
271
+ idempotentHint: true,
272
+ openWorldHint: false,
273
+ },
274
+ }, async ({ mode }) => {
275
+ const effectiveMode = mode ?? "incremental";
276
+ const result = await session.refresh(effectiveMode);
277
+ const nodes = result.analysis.graph.getNodes();
278
+ const diagnosticsByKind = {};
279
+ for (const diagnostic of result.analysis.diagnostics) {
280
+ diagnosticsByKind[diagnostic.kind] =
281
+ (diagnosticsByKind[diagnostic.kind] ?? 0) + 1;
282
+ }
283
+ const added = result.files.added.slice(0, MAX_FILE_RESULTS);
284
+ const changed = result.files.changed.slice(0, MAX_FILE_RESULTS);
285
+ const deleted = result.files.deleted.slice(0, MAX_FILE_RESULTS);
286
+ const affected = result.files.affected.slice(0, MAX_FILE_RESULTS);
287
+ const structuredContent = {
288
+ mode: effectiveMode,
289
+ indexPath: path.relative(session.rootDirectory, session.indexPath),
290
+ files: {
291
+ added,
292
+ changed,
293
+ deleted,
294
+ affected,
295
+ reusedCount: result.files.reused.length,
296
+ },
297
+ graph: {
298
+ fileCount: nodes.filter((node) => node.data.nodeType === "file").length,
299
+ symbolCount: nodes.filter((node) => node.data.nodeType === "symbol").length,
300
+ edgeCount: result.analysis.graph.edgeCount,
301
+ },
302
+ diagnostics: {
303
+ total: result.analysis.diagnostics.length,
304
+ byKind: diagnosticsByKind,
305
+ },
306
+ truncated: result.files.added.length > added.length ||
307
+ result.files.changed.length > changed.length ||
308
+ result.files.deleted.length > deleted.length ||
309
+ result.files.affected.length > affected.length,
310
+ };
311
+ return toolResult(`Refreshed the index in ${effectiveMode} mode; ${result.files.affected.length} files were affected.`, structuredContent);
312
+ });
313
+ return server;
314
+ }
315
+ function registerRelationshipTool(server, session, name, title, description, direction) {
316
+ server.registerTool(name, {
317
+ title,
318
+ description,
319
+ inputSchema: {
320
+ nodeId: z.string().min(1),
321
+ relationships: relationshipTypesInput,
322
+ limit: limitInput,
323
+ },
324
+ outputSchema: {
325
+ subject: entitySummarySchema,
326
+ relationships: z.array(relationshipResultSchema),
327
+ totalRelationships: z.number().int().nonnegative(),
328
+ truncated: z.boolean(),
329
+ },
330
+ annotations: READ_ONLY_ANNOTATIONS,
331
+ }, async ({ nodeId, relationships, limit }) => {
332
+ const analysis = await session.getAnalysis();
333
+ const subject = requiredNode(analysis.graph, nodeId);
334
+ const allowed = new Set(relationships ?? ["CALLS", "IMPORTS"]);
335
+ const edges = direction === "outgoing"
336
+ ? analysis.graph.getOutgoingEdges(nodeId)
337
+ : analysis.graph.getIncomingEdges(nodeId);
338
+ const matching = edges
339
+ .filter((edge) => edge.type !== "DEFINES" && allowed.has(edge.type))
340
+ .map((edge) => {
341
+ const relatedId = direction === "outgoing" ? edge.to : edge.from;
342
+ return {
343
+ entity: toEntitySummary(requiredNode(analysis.graph, relatedId)),
344
+ relationship: toRelationshipSummary(edge),
345
+ };
346
+ })
347
+ .sort((left, right) => entitySortKey(left.entity).localeCompare(entitySortKey(right.entity)));
348
+ const effectiveLimit = limit ?? DEFAULT_LIST_LIMIT;
349
+ const selected = matching.slice(0, effectiveLimit);
350
+ const structuredContent = {
351
+ subject: toEntitySummary(subject),
352
+ relationships: selected,
353
+ totalRelationships: matching.length,
354
+ truncated: matching.length > selected.length,
355
+ };
356
+ return toolResult(`Found ${matching.length} ${direction === "outgoing" ? "dependencies" : "dependents"}; returned ${selected.length}.`, structuredContent);
357
+ });
358
+ }
359
+ function findBoundedPath(graph, fromNodeId, toNodeId, relationships, maxDepth) {
360
+ requiredNode(graph, fromNodeId);
361
+ requiredNode(graph, toNodeId);
362
+ if (fromNodeId === toNodeId) {
363
+ return [{ entity: toEntitySummary(requiredNode(graph, fromNodeId)), via: null }];
364
+ }
365
+ const allowed = new Set(relationships);
366
+ const visited = new Set([fromNodeId]);
367
+ const parent = new Map();
368
+ const queue = [
369
+ { id: fromNodeId, depth: 0 },
370
+ ];
371
+ let nextIndex = 0;
372
+ while (nextIndex < queue.length) {
373
+ const current = queue[nextIndex];
374
+ nextIndex += 1;
375
+ if (current === undefined || current.depth >= maxDepth) {
376
+ continue;
377
+ }
378
+ for (const edge of graph.getOutgoingEdges(current.id)) {
379
+ if (edge.type === "DEFINES" ||
380
+ !allowed.has(edge.type) ||
381
+ visited.has(edge.to)) {
382
+ continue;
383
+ }
384
+ visited.add(edge.to);
385
+ parent.set(edge.to, {
386
+ id: current.id,
387
+ relationship: toRelationshipSummary(edge),
388
+ });
389
+ if (edge.to === toNodeId) {
390
+ return reconstructPath(graph, parent, fromNodeId, toNodeId);
391
+ }
392
+ queue.push({ id: edge.to, depth: current.depth + 1 });
393
+ }
394
+ }
395
+ return null;
396
+ }
397
+ function reconstructPath(graph, parent, fromNodeId, toNodeId) {
398
+ const reversedIds = [toNodeId];
399
+ let currentId = toNodeId;
400
+ while (currentId !== fromNodeId) {
401
+ const entry = parent.get(currentId);
402
+ if (entry === undefined) {
403
+ throw new Error("Internal path reconstruction invariant failed");
404
+ }
405
+ currentId = entry.id;
406
+ reversedIds.push(currentId);
407
+ }
408
+ const ids = reversedIds.reverse();
409
+ return ids.map((id, index) => ({
410
+ entity: toEntitySummary(requiredNode(graph, id)),
411
+ via: index === 0 ? null : parent.get(id)?.relationship ?? null,
412
+ }));
413
+ }
414
+ function summarizeImpact(impact, maxResults) {
415
+ const directDependents = impact.directDependents
416
+ .slice(0, maxResults)
417
+ .map(toEntitySummary);
418
+ const remaining = Math.max(0, maxResults - directDependents.length);
419
+ const indirectDependents = impact.indirectDependents
420
+ .slice(0, remaining)
421
+ .map(toEntitySummary);
422
+ const affectedFiles = impact.affectedFiles.slice(0, maxResults);
423
+ return {
424
+ changed: toEntitySummary(impact.changed),
425
+ directDependents,
426
+ indirectDependents,
427
+ affectedFiles,
428
+ counts: {
429
+ direct: impact.directDependents.length,
430
+ indirect: impact.indirectDependents.length,
431
+ affectedFiles: impact.affectedFiles.length,
432
+ },
433
+ truncated: directDependents.length + indirectDependents.length <
434
+ impact.directDependents.length + impact.indirectDependents.length ||
435
+ affectedFiles.length < impact.affectedFiles.length,
436
+ };
437
+ }
438
+ function requiredNode(graph, nodeId) {
439
+ const node = graph.getNode(nodeId);
440
+ if (node === undefined) {
441
+ throw new Error(`Node does not exist: ${nodeId}`);
442
+ }
443
+ return node;
444
+ }
445
+ function toEntitySummary(node) {
446
+ if (node.data.nodeType === "file") {
447
+ return {
448
+ id: node.id,
449
+ type: "file",
450
+ name: null,
451
+ qualifiedName: null,
452
+ declarationKind: null,
453
+ source: {
454
+ path: node.data.filePath,
455
+ startLine: null,
456
+ startColumn: null,
457
+ endLine: null,
458
+ endColumn: null,
459
+ },
460
+ };
461
+ }
462
+ return {
463
+ id: node.id,
464
+ type: "symbol",
465
+ name: node.data.name,
466
+ qualifiedName: node.data.qualifiedName,
467
+ declarationKind: node.data.declarationKind,
468
+ source: {
469
+ path: node.data.range.file,
470
+ startLine: node.data.range.startLine,
471
+ startColumn: node.data.range.startColumn,
472
+ endLine: node.data.range.endLine,
473
+ endColumn: node.data.range.endColumn,
474
+ },
475
+ };
476
+ }
477
+ function toRelationshipSummary(edge) {
478
+ const data = edge.data;
479
+ if (edge.type === "CALLS" && data?.relationship === "CALLS") {
480
+ return {
481
+ type: "CALLS",
482
+ confidence: data.confidence,
483
+ provenance: data.provenance,
484
+ moduleSpecifier: null,
485
+ source: {
486
+ path: data.location.file,
487
+ line: data.location.line,
488
+ column: data.location.column,
489
+ },
490
+ };
491
+ }
492
+ if (edge.type === "IMPORTS" && data?.relationship === "IMPORTS") {
493
+ return {
494
+ type: "IMPORTS",
495
+ confidence: data.confidence,
496
+ provenance: data.provenance,
497
+ moduleSpecifier: data.moduleSpecifier,
498
+ source: null,
499
+ };
500
+ }
501
+ throw new Error(`Missing ${edge.type} relationship metadata`);
502
+ }
503
+ function entitySortKey(entity) {
504
+ return entity.qualifiedName ?? entity.source.path;
505
+ }
506
+ function toolResult(text, structuredContent) {
507
+ return {
508
+ content: [{ type: "text", text }],
509
+ structuredContent,
510
+ };
511
+ }
512
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export declare function runCodeGraphMcpServer(arguments_: readonly string[]): Promise<void>;
3
+ //# sourceMappingURL=stdio.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.d.ts","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":";AAQA,wBAAsB,qBAAqB,CACzC,UAAU,EAAE,SAAS,MAAM,EAAE,GAC5B,OAAO,CAAC,IAAI,CAAC,CASf"}
@@ -0,0 +1,35 @@
1
+ #!/usr/bin/env node
2
+ import { pathToFileURL } from "node:url";
3
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
4
+ import { createCodeGraphMcpServer } from "./server.js";
5
+ export async function runCodeGraphMcpServer(arguments_) {
6
+ const rootDirectory = optionValue(arguments_, "--root") ?? process.cwd();
7
+ const indexPath = optionValue(arguments_, "--index");
8
+ const server = createCodeGraphMcpServer({
9
+ rootDirectory,
10
+ ...(indexPath === undefined ? {} : { indexPath }),
11
+ });
12
+ const transport = new StdioServerTransport();
13
+ await server.connect(transport);
14
+ }
15
+ function optionValue(arguments_, option) {
16
+ const index = arguments_.indexOf(option);
17
+ if (index === -1) {
18
+ return undefined;
19
+ }
20
+ const value = arguments_[index + 1];
21
+ if (value === undefined || value.startsWith("--")) {
22
+ throw new Error(`${option} requires a value`);
23
+ }
24
+ return value;
25
+ }
26
+ const invokedPath = process.argv[1];
27
+ if (invokedPath !== undefined &&
28
+ import.meta.url === pathToFileURL(invokedPath).href) {
29
+ runCodeGraphMcpServer(process.argv.slice(2)).catch((error) => {
30
+ // stdout is reserved for MCP protocol messages when using stdio.
31
+ console.error(error instanceof Error ? error.message : String(error));
32
+ process.exitCode = 1;
33
+ });
34
+ }
35
+ //# sourceMappingURL=stdio.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stdio.js","sourceRoot":"","sources":["../../src/mcp/stdio.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AAEjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAEvD,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,UAA6B;IAE7B,MAAM,aAAa,GAAG,WAAW,CAAC,UAAU,EAAE,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACzE,MAAM,SAAS,GAAG,WAAW,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;IACrD,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,aAAa;QACb,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;KAClD,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;AAClC,CAAC;AAED,SAAS,WAAW,CAClB,UAA6B,EAC7B,MAAc;IAEd,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE,CAAC;QACjB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;IACpC,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,mBAAmB,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACpC,IACE,WAAW,KAAK,SAAS;IACzB,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,aAAa,CAAC,WAAW,CAAC,CAAC,IAAI,EACnD,CAAC;IACD,qBAAqB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACpE,iEAAiE;QACjE,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,30 @@
1
+ import ts from "typescript";
2
+ export type DeclarationKind = "function" | "class" | "interface" | "method";
3
+ export interface SourceLocation {
4
+ readonly file: string;
5
+ readonly line: number;
6
+ readonly column: number;
7
+ }
8
+ export interface SourceRange {
9
+ readonly file: string;
10
+ readonly startLine: number;
11
+ readonly startColumn: number;
12
+ readonly endLine: number;
13
+ readonly endColumn: number;
14
+ }
15
+ export interface ExtractedDeclaration {
16
+ readonly kind: DeclarationKind;
17
+ readonly name: string;
18
+ readonly qualifiedName: string;
19
+ readonly parentQualifiedName: string | null;
20
+ readonly location: SourceLocation;
21
+ readonly range: SourceRange;
22
+ }
23
+ /**
24
+ * Extracts a deliberately small set of named declarations from one AST.
25
+ *
26
+ * This is syntax extraction, not symbol resolution: two declarations with the
27
+ * same name are still separate syntax nodes and are not linked semantically.
28
+ */
29
+ export declare function extractDeclarations(sourceFile: ts.SourceFile): readonly ExtractedDeclaration[];
30
+ //# sourceMappingURL=extractDeclarations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractDeclarations.d.ts","sourceRoot":"","sources":["../../src/parser/extractDeclarations.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,MAAM,eAAe,GAAG,UAAU,GAAG,OAAO,GAAG,WAAW,GAAG,QAAQ,CAAC;AAE5E,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAC;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;IAClC,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,EAAE,CAAC,UAAU,GACxB,SAAS,oBAAoB,EAAE,CAyIjC"}