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,258 @@
1
+ /**
2
+ * A generic directed graph with deterministic insertion-order traversal.
3
+ *
4
+ * A -> B means A depends on B. Outgoing adjacency therefore answers
5
+ * dependency queries, while incoming adjacency answers dependent queries.
6
+ */
7
+ export class DirectedGraph {
8
+ nodes = new Map();
9
+ outgoing = new Map();
10
+ incoming = new Map();
11
+ get nodeCount() {
12
+ return this.nodes.size;
13
+ }
14
+ get edgeCount() {
15
+ let count = 0;
16
+ for (const edgesByNeighbor of this.outgoing.values()) {
17
+ for (const edgesByType of edgesByNeighbor.values()) {
18
+ count += edgesByType.size;
19
+ }
20
+ }
21
+ return count;
22
+ }
23
+ addNode(node) {
24
+ if (this.nodes.has(node.id)) {
25
+ throw new Error(`Node already exists: ${node.id}`);
26
+ }
27
+ this.nodes.set(node.id, node);
28
+ this.outgoing.set(node.id, new Map());
29
+ this.incoming.set(node.id, new Map());
30
+ }
31
+ addEdge(edge) {
32
+ this.assertNodeExists(edge.from);
33
+ this.assertNodeExists(edge.to);
34
+ const outgoingFromSource = this.getAdjacencyBucket(this.outgoing, edge.from);
35
+ const edgesToDestination = this.getOrCreateNeighborBucket(outgoingFromSource, edge.to);
36
+ if (edgesToDestination.has(edge.type)) {
37
+ throw new Error(`Edge already exists: ${edge.from} -[${edge.type}]-> ${edge.to}`);
38
+ }
39
+ edgesToDestination.set(edge.type, edge);
40
+ const incomingToDestination = this.getAdjacencyBucket(this.incoming, edge.to);
41
+ const edgesFromSource = this.getOrCreateNeighborBucket(incomingToDestination, edge.from);
42
+ edgesFromSource.set(edge.type, edge);
43
+ }
44
+ removeNode(id) {
45
+ if (!this.nodes.has(id)) {
46
+ return false;
47
+ }
48
+ const outgoing = this.getAdjacencyBucket(this.outgoing, id);
49
+ for (const destinationId of outgoing.keys()) {
50
+ this.getAdjacencyBucket(this.incoming, destinationId).delete(id);
51
+ }
52
+ const incoming = this.getAdjacencyBucket(this.incoming, id);
53
+ for (const sourceId of incoming.keys()) {
54
+ this.getAdjacencyBucket(this.outgoing, sourceId).delete(id);
55
+ }
56
+ this.outgoing.delete(id);
57
+ this.incoming.delete(id);
58
+ this.nodes.delete(id);
59
+ return true;
60
+ }
61
+ removeEdge(from, to, type) {
62
+ this.assertNodeExists(from);
63
+ this.assertNodeExists(to);
64
+ const outgoingByNeighbor = this.getAdjacencyBucket(this.outgoing, from);
65
+ const outgoingByType = outgoingByNeighbor.get(to);
66
+ if (outgoingByType === undefined || !outgoingByType.delete(type)) {
67
+ return false;
68
+ }
69
+ if (outgoingByType.size === 0) {
70
+ outgoingByNeighbor.delete(to);
71
+ }
72
+ const incomingByNeighbor = this.getAdjacencyBucket(this.incoming, to);
73
+ const incomingByType = incomingByNeighbor.get(from);
74
+ incomingByType?.delete(type);
75
+ if (incomingByType?.size === 0) {
76
+ incomingByNeighbor.delete(from);
77
+ }
78
+ return true;
79
+ }
80
+ getNode(id) {
81
+ return this.nodes.get(id);
82
+ }
83
+ getNodes() {
84
+ return [...this.nodes.values()];
85
+ }
86
+ getEdges() {
87
+ const result = [];
88
+ for (const edgesByNeighbor of this.outgoing.values()) {
89
+ for (const edgesByType of edgesByNeighbor.values()) {
90
+ result.push(...edgesByType.values());
91
+ }
92
+ }
93
+ return result;
94
+ }
95
+ getOutgoingEdges(id) {
96
+ this.assertNodeExists(id);
97
+ return this.edgesFromBucket(this.getAdjacencyBucket(this.outgoing, id));
98
+ }
99
+ getIncomingEdges(id) {
100
+ this.assertNodeExists(id);
101
+ return this.edgesFromBucket(this.getAdjacencyBucket(this.incoming, id));
102
+ }
103
+ hasEdge(from, to, type) {
104
+ this.assertNodeExists(from);
105
+ this.assertNodeExists(to);
106
+ return this.getAdjacencyBucket(this.outgoing, from).get(to)?.has(type) ?? false;
107
+ }
108
+ /** Returns nodes at the destination of this node's outgoing edges. */
109
+ getNeighbors(id) {
110
+ return this.getDependencies(id);
111
+ }
112
+ /** Returns the direct nodes that `id` depends on. */
113
+ getDependencies(id) {
114
+ this.assertNodeExists(id);
115
+ return this.nodesForIds(this.getNeighborIds(this.outgoing, id));
116
+ }
117
+ /** Returns the direct nodes that depend on `id`. */
118
+ getDependents(id) {
119
+ this.assertNodeExists(id);
120
+ return this.nodesForIds(this.getNeighborIds(this.incoming, id));
121
+ }
122
+ /** Breadth-first traversal over outgoing edges. */
123
+ bfs(startId) {
124
+ this.assertNodeExists(startId);
125
+ const visited = new Set([startId]);
126
+ const queue = [startId];
127
+ const order = [];
128
+ let nextIndex = 0;
129
+ while (nextIndex < queue.length) {
130
+ const currentId = queue[nextIndex];
131
+ nextIndex += 1;
132
+ // The loop condition guarantees this indexed item exists.
133
+ if (currentId === undefined) {
134
+ continue;
135
+ }
136
+ order.push(currentId);
137
+ for (const neighborId of this.getNeighborIds(this.outgoing, currentId)) {
138
+ if (!visited.has(neighborId)) {
139
+ visited.add(neighborId);
140
+ queue.push(neighborId);
141
+ }
142
+ }
143
+ }
144
+ return order;
145
+ }
146
+ /** Iterative depth-first traversal over outgoing edges. */
147
+ dfs(startId) {
148
+ this.assertNodeExists(startId);
149
+ const visited = new Set();
150
+ const stack = [startId];
151
+ const order = [];
152
+ while (stack.length > 0) {
153
+ const currentId = stack.pop();
154
+ if (currentId === undefined || visited.has(currentId)) {
155
+ continue;
156
+ }
157
+ visited.add(currentId);
158
+ order.push(currentId);
159
+ const neighbors = [...this.getNeighborIds(this.outgoing, currentId)];
160
+ // A stack is last-in, first-out. Reverse insertion preserves the same
161
+ // left-to-right neighbor order users see in dependency queries.
162
+ for (let index = neighbors.length - 1; index >= 0; index -= 1) {
163
+ const neighborId = neighbors[index];
164
+ if (neighborId !== undefined && !visited.has(neighborId)) {
165
+ stack.push(neighborId);
166
+ }
167
+ }
168
+ }
169
+ return order;
170
+ }
171
+ /** Finds a shortest path by edge count, following outgoing edges. */
172
+ findPath(sourceId, targetId) {
173
+ this.assertNodeExists(sourceId);
174
+ this.assertNodeExists(targetId);
175
+ if (sourceId === targetId) {
176
+ return [sourceId];
177
+ }
178
+ const visited = new Set([sourceId]);
179
+ const parent = new Map();
180
+ const queue = [sourceId];
181
+ let nextIndex = 0;
182
+ while (nextIndex < queue.length) {
183
+ const currentId = queue[nextIndex];
184
+ nextIndex += 1;
185
+ if (currentId === undefined) {
186
+ continue;
187
+ }
188
+ for (const neighborId of this.getNeighborIds(this.outgoing, currentId)) {
189
+ if (visited.has(neighborId)) {
190
+ continue;
191
+ }
192
+ visited.add(neighborId);
193
+ parent.set(neighborId, currentId);
194
+ if (neighborId === targetId) {
195
+ return this.reconstructPath(parent, sourceId, targetId);
196
+ }
197
+ queue.push(neighborId);
198
+ }
199
+ }
200
+ return null;
201
+ }
202
+ assertNodeExists(id) {
203
+ if (!this.nodes.has(id)) {
204
+ throw new Error(`Node does not exist: ${id}`);
205
+ }
206
+ }
207
+ getAdjacencyBucket(adjacency, id) {
208
+ const bucket = adjacency.get(id);
209
+ if (bucket === undefined) {
210
+ throw new Error(`Internal graph invariant failed for node: ${id}`);
211
+ }
212
+ return bucket;
213
+ }
214
+ getOrCreateNeighborBucket(adjacency, neighborId) {
215
+ const existing = adjacency.get(neighborId);
216
+ if (existing !== undefined) {
217
+ return existing;
218
+ }
219
+ const created = new Map();
220
+ adjacency.set(neighborId, created);
221
+ return created;
222
+ }
223
+ getNeighborIds(adjacency, id) {
224
+ return this.getAdjacencyBucket(adjacency, id).keys();
225
+ }
226
+ nodesForIds(ids) {
227
+ const result = [];
228
+ for (const id of ids) {
229
+ const node = this.nodes.get(id);
230
+ if (node === undefined) {
231
+ throw new Error(`Internal graph invariant failed for node: ${id}`);
232
+ }
233
+ result.push(node);
234
+ }
235
+ return result;
236
+ }
237
+ edgesFromBucket(bucket) {
238
+ const result = [];
239
+ for (const edgesByType of bucket.values()) {
240
+ result.push(...edgesByType.values());
241
+ }
242
+ return result;
243
+ }
244
+ reconstructPath(parent, sourceId, targetId) {
245
+ const reversedPath = [targetId];
246
+ let currentId = targetId;
247
+ while (currentId !== sourceId) {
248
+ const parentId = parent.get(currentId);
249
+ if (parentId === undefined) {
250
+ throw new Error("Internal graph invariant failed while rebuilding path");
251
+ }
252
+ reversedPath.push(parentId);
253
+ currentId = parentId;
254
+ }
255
+ return reversedPath.reverse();
256
+ }
257
+ }
258
+ //# sourceMappingURL=DirectedGraph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DirectedGraph.js","sourceRoot":"","sources":["../../src/graph/DirectedGraph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /** A vertex in the graph, identified independently of its payload. */
2
+ export interface GraphNode<NodeData> {
3
+ readonly id: string;
4
+ readonly data: NodeData;
5
+ }
6
+ /** A directed, typed relationship from one node to another. */
7
+ export interface GraphEdge<EdgeType extends string, EdgeData> {
8
+ readonly from: string;
9
+ readonly to: string;
10
+ readonly type: EdgeType;
11
+ readonly data?: EdgeData;
12
+ }
13
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":"AAAA,sEAAsE;AACtE,MAAM,WAAW,SAAS,CAAC,QAAQ;IACjC,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;CACzB;AAED,+DAA+D;AAC/D,MAAM,WAAW,SAAS,CAAC,QAAQ,SAAS,MAAM,EAAE,QAAQ;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IACxB,QAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC;CAC1B"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/graph/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,21 @@
1
+ export { analyzeProject } from "./analyzer/analyzeProject.js";
2
+ export type { AnalysisDiagnostic, AnalysisDiagnosticKind, ProjectAnalysis, } from "./analyzer/analyzeProject.js";
3
+ export { defaultIndexPath, updateProjectAnalysis, updateProjectIndex, } from "./analyzer/incrementalIndex.js";
4
+ export type { FileChanges, IncrementalUpdateResult, } from "./analyzer/incrementalIndex.js";
5
+ export { buildDefinitionGraph, createFileNodeId, createSymbolNodeId, } from "./analyzer/buildDefinitionGraph.js";
6
+ export type { BuildDefinitionGraphOptions, CallEdgeData, CodeGraph, CodeGraphEdgeData, CodeGraphEdgeType, CodeGraphNodeData, DefinesEdgeData, DefinitionGraph, FileNodeData, ImportEdgeData, ResolutionConfidence, SymbolNodeData, } from "./analyzer/buildDefinitionGraph.js";
7
+ export { discoverSourceFiles } from "./files/discoverSourceFiles.js";
8
+ export { analyzeDiffImpact, parseGitDiff, readGitDiff, } from "./git/diffImpact.js";
9
+ export type { ChangedFileLines, DiffImpactResult, UnmappedChangedLine, } from "./git/diffImpact.js";
10
+ export { DirectedGraph } from "./graph/DirectedGraph.js";
11
+ export type { GraphEdge, GraphNode } from "./graph/types.js";
12
+ export { extractDeclarations } from "./parser/extractDeclarations.js";
13
+ export type { DeclarationKind, ExtractedDeclaration, SourceLocation, SourceRange, } from "./parser/extractDeclarations.js";
14
+ export { parseSourceFile } from "./parser/parseSourceFile.js";
15
+ export { CODEGRAPH_JSON_SCHEMA_VERSION, deserializeProjectAnalysis, loadProjectAnalysis, saveProjectAnalysis, serializeProjectAnalysis, } from "./persistence/jsonPersistence.js";
16
+ export { analyzeImpact } from "./queries/analyzeImpact.js";
17
+ export type { ImpactOptions, ImpactResult, } from "./queries/analyzeImpact.js";
18
+ export { findCodePath, findSymbols, getCodeDependencies, getCodeDependents, } from "./queries/codeGraphQueries.js";
19
+ export { createVisualizationDocument, startVisualizationServer, writeVisualizationDocument, } from "./visualization/viewer.js";
20
+ export type { VisualizationServer, VisualizationServerOptions, } from "./visualization/viewer.js";
21
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAC9D,YAAY,EACV,kBAAkB,EAClB,sBAAsB,EACtB,eAAe,GAChB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AACxC,YAAY,EACV,WAAW,EACX,uBAAuB,GACxB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAC5C,YAAY,EACV,2BAA2B,EAC3B,YAAY,EACZ,SAAS,EACT,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,EACjB,eAAe,EACf,eAAe,EACf,YAAY,EACZ,cAAc,EACd,oBAAoB,EACpB,cAAc,GACf,MAAM,oCAAoC,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EACV,gBAAgB,EAChB,gBAAgB,EAChB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AACtE,YAAY,EACV,eAAe,EACf,oBAAoB,EACpB,cAAc,EACd,WAAW,GACZ,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAC3D,YAAY,EACV,aAAa,EACb,YAAY,GACb,MAAM,4BAA4B,CAAC;AACpC,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC;AACnC,YAAY,EACV,mBAAmB,EACnB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ export { analyzeProject } from "./analyzer/analyzeProject.js";
2
+ export { defaultIndexPath, updateProjectAnalysis, updateProjectIndex, } from "./analyzer/incrementalIndex.js";
3
+ export { buildDefinitionGraph, createFileNodeId, createSymbolNodeId, } from "./analyzer/buildDefinitionGraph.js";
4
+ export { discoverSourceFiles } from "./files/discoverSourceFiles.js";
5
+ export { analyzeDiffImpact, parseGitDiff, readGitDiff, } from "./git/diffImpact.js";
6
+ export { DirectedGraph } from "./graph/DirectedGraph.js";
7
+ export { extractDeclarations } from "./parser/extractDeclarations.js";
8
+ export { parseSourceFile } from "./parser/parseSourceFile.js";
9
+ export { CODEGRAPH_JSON_SCHEMA_VERSION, deserializeProjectAnalysis, loadProjectAnalysis, saveProjectAnalysis, serializeProjectAnalysis, } from "./persistence/jsonPersistence.js";
10
+ export { analyzeImpact } from "./queries/analyzeImpact.js";
11
+ export { findCodePath, findSymbols, getCodeDependencies, getCodeDependents, } from "./queries/codeGraphQueries.js";
12
+ export { createVisualizationDocument, startVisualizationServer, writeVisualizationDocument, } from "./visualization/viewer.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAM9D,OAAO,EACL,gBAAgB,EAChB,qBAAqB,EACrB,kBAAkB,GACnB,MAAM,gCAAgC,CAAC;AAKxC,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAe5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AACrE,OAAO,EACL,iBAAiB,EACjB,YAAY,EACZ,WAAW,GACZ,MAAM,qBAAqB,CAAC;AAM7B,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAOtE,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAC9D,OAAO,EACL,6BAA6B,EAC7B,0BAA0B,EAC1B,mBAAmB,EACnB,mBAAmB,EACnB,wBAAwB,GACzB,MAAM,kCAAkC,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAK3D,OAAO,EACL,YAAY,EACZ,WAAW,EACX,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EACL,2BAA2B,EAC3B,wBAAwB,EACxB,0BAA0B,GAC3B,MAAM,2BAA2B,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { type ProjectAnalysis } from "../analyzer/analyzeProject.js";
2
+ import { type IncrementalUpdateResult } from "../analyzer/incrementalIndex.js";
3
+ export type RefreshMode = "incremental" | "full";
4
+ /** Maintains one project-scoped graph for the lifetime of an MCP connection. */
5
+ export declare class CodeGraphProjectSession {
6
+ readonly rootDirectory: string;
7
+ readonly indexPath: string;
8
+ private currentAnalysis;
9
+ constructor(rootDirectory: string, indexPath?: string);
10
+ /**
11
+ * Builds a fresh in-memory snapshot on first use. The server deliberately
12
+ * avoids trusting a possibly stale persisted index without an explicit
13
+ * refresh request.
14
+ */
15
+ getAnalysis(): Promise<ProjectAnalysis>;
16
+ refresh(mode: RefreshMode): Promise<IncrementalUpdateResult>;
17
+ }
18
+ //# sourceMappingURL=projectSession.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSession.d.ts","sourceRoot":"","sources":["../../src/mcp/projectSession.ts"],"names":[],"mappings":"AAGA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAGL,KAAK,uBAAuB,EAE7B,MAAM,iCAAiC,CAAC;AAMzC,MAAM,MAAM,WAAW,GAAG,aAAa,GAAG,MAAM,CAAC;AAEjD,gFAAgF;AAChF,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,OAAO,CAAC,eAAe,CAA8B;gBAEzC,aAAa,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;IAOrD;;;;OAIG;IACG,WAAW,IAAI,OAAO,CAAC,eAAe,CAAC;IAOvC,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,uBAAuB,CAAC;CAoBnE"}
@@ -0,0 +1,86 @@
1
+ import { access } from "node:fs/promises";
2
+ import path from "node:path";
3
+ import { analyzeProject, } from "../analyzer/analyzeProject.js";
4
+ import { defaultIndexPath, updateProjectIndex, } from "../analyzer/incrementalIndex.js";
5
+ import { loadProjectAnalysis, saveProjectAnalysis, } from "../persistence/jsonPersistence.js";
6
+ /** Maintains one project-scoped graph for the lifetime of an MCP connection. */
7
+ export class CodeGraphProjectSession {
8
+ rootDirectory;
9
+ indexPath;
10
+ currentAnalysis;
11
+ constructor(rootDirectory, indexPath) {
12
+ this.rootDirectory = path.resolve(rootDirectory);
13
+ this.indexPath = path.resolve(indexPath ?? defaultIndexPath(this.rootDirectory));
14
+ }
15
+ /**
16
+ * Builds a fresh in-memory snapshot on first use. The server deliberately
17
+ * avoids trusting a possibly stale persisted index without an explicit
18
+ * refresh request.
19
+ */
20
+ async getAnalysis() {
21
+ if (this.currentAnalysis === undefined) {
22
+ this.currentAnalysis = await analyzeProject(this.rootDirectory);
23
+ }
24
+ return this.currentAnalysis;
25
+ }
26
+ async refresh(mode) {
27
+ if (mode === "incremental" && await fileExists(this.indexPath)) {
28
+ const result = await updateProjectIndex(this.indexPath, this.rootDirectory);
29
+ this.currentAnalysis = result.analysis;
30
+ return result;
31
+ }
32
+ const previous = this.currentAnalysis ?? await loadIfPresent(this.indexPath);
33
+ const analysis = await analyzeProject(this.rootDirectory);
34
+ await saveProjectAnalysis(analysis, this.indexPath);
35
+ this.currentAnalysis = analysis;
36
+ return {
37
+ analysis,
38
+ files: compareFileHashes(previous?.fileHashes ?? {}, analysis.fileHashes),
39
+ };
40
+ }
41
+ }
42
+ async function loadIfPresent(indexPath) {
43
+ if (!await fileExists(indexPath)) {
44
+ return undefined;
45
+ }
46
+ return loadProjectAnalysis(indexPath);
47
+ }
48
+ async function fileExists(filePath) {
49
+ try {
50
+ await access(filePath);
51
+ return true;
52
+ }
53
+ catch (error) {
54
+ if (error instanceof Error &&
55
+ "code" in error &&
56
+ error.code === "ENOENT") {
57
+ return false;
58
+ }
59
+ throw error;
60
+ }
61
+ }
62
+ function compareFileHashes(previous, current) {
63
+ const previousPaths = new Set(Object.keys(previous));
64
+ const currentPaths = new Set(Object.keys(current));
65
+ const added = [...currentPaths]
66
+ .filter((filePath) => !previousPaths.has(filePath))
67
+ .sort();
68
+ const changed = [...currentPaths]
69
+ .filter((filePath) => previousPaths.has(filePath) &&
70
+ previous[filePath] !== current[filePath])
71
+ .sort();
72
+ const deleted = [...previousPaths]
73
+ .filter((filePath) => !currentPaths.has(filePath))
74
+ .sort();
75
+ const affected = [...new Set([...added, ...changed, ...deleted])].sort();
76
+ return {
77
+ added,
78
+ changed,
79
+ deleted,
80
+ affected,
81
+ reused: [...currentPaths]
82
+ .filter((filePath) => !affected.includes(filePath))
83
+ .sort(),
84
+ };
85
+ }
86
+ //# sourceMappingURL=projectSession.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"projectSession.js","sourceRoot":"","sources":["../../src/mcp/projectSession.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { DeclarationKind } from "../parser/extractDeclarations.js";
3
+ export interface CodeGraphMcpServerOptions {
4
+ readonly rootDirectory?: string;
5
+ readonly indexPath?: string;
6
+ }
7
+ export interface EntitySummary {
8
+ readonly id: string;
9
+ readonly type: "file" | "symbol";
10
+ readonly name: string | null;
11
+ readonly qualifiedName: string | null;
12
+ readonly declarationKind: DeclarationKind | null;
13
+ readonly source: {
14
+ readonly path: string;
15
+ readonly startLine: number | null;
16
+ readonly startColumn: number | null;
17
+ readonly endLine: number | null;
18
+ readonly endColumn: number | null;
19
+ };
20
+ }
21
+ /** Creates one project-scoped MCP server. Callers choose the transport. */
22
+ export declare function createCodeGraphMcpServer(options?: CodeGraphMcpServerOptions): McpServer;
23
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/mcp/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWpE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AA0FxE,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,eAAe,EAAE,eAAe,GAAG,IAAI,CAAC;IACjD,QAAQ,CAAC,MAAM,EAAE;QACf,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QAClC,QAAQ,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QACpC,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;KACnC,CAAC;CACH;AAqBD,2EAA2E;AAC3E,wBAAgB,wBAAwB,CACtC,OAAO,GAAE,yBAA8B,GACtC,SAAS,CAqUX"}