projscan 1.4.0 → 1.6.0

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 (112) hide show
  1. package/README.md +24 -7
  2. package/dist/cli/commands/applyFix.d.ts +7 -0
  3. package/dist/cli/commands/applyFix.js +113 -0
  4. package/dist/cli/commands/applyFix.js.map +1 -0
  5. package/dist/cli/commands/coverage.js +13 -0
  6. package/dist/cli/commands/coverage.js.map +1 -1
  7. package/dist/cli/commands/doctor.js +18 -2
  8. package/dist/cli/commands/doctor.js.map +1 -1
  9. package/dist/cli/commands/explain.js +1 -0
  10. package/dist/cli/commands/explain.js.map +1 -1
  11. package/dist/cli/commands/impact.js +25 -1
  12. package/dist/cli/commands/impact.js.map +1 -1
  13. package/dist/cli/commands/init.d.ts +6 -0
  14. package/dist/cli/commands/init.js +70 -0
  15. package/dist/cli/commands/init.js.map +1 -0
  16. package/dist/cli/commands/installHook.d.ts +9 -0
  17. package/dist/cli/commands/installHook.js +90 -0
  18. package/dist/cli/commands/installHook.js.map +1 -0
  19. package/dist/cli/commands/memory.d.ts +11 -0
  20. package/dist/cli/commands/memory.js +175 -0
  21. package/dist/cli/commands/memory.js.map +1 -0
  22. package/dist/cli/commands/taint.d.ts +6 -0
  23. package/dist/cli/commands/taint.js +74 -0
  24. package/dist/cli/commands/taint.js.map +1 -0
  25. package/dist/cli/commands/workspace.d.ts +11 -0
  26. package/dist/cli/commands/workspace.js +115 -0
  27. package/dist/cli/commands/workspace.js.map +1 -0
  28. package/dist/cli/index.js +12 -0
  29. package/dist/cli/index.js.map +1 -1
  30. package/dist/core/applyFix.d.ts +52 -0
  31. package/dist/core/applyFix.js +220 -0
  32. package/dist/core/applyFix.js.map +1 -0
  33. package/dist/core/ast.d.ts +9 -0
  34. package/dist/core/ast.js +35 -4
  35. package/dist/core/ast.js.map +1 -1
  36. package/dist/core/codeGraph.js +190 -241
  37. package/dist/core/codeGraph.js.map +1 -1
  38. package/dist/core/fileInspector.js +40 -44
  39. package/dist/core/fileInspector.js.map +1 -1
  40. package/dist/core/fixSuggest.d.ts +6 -0
  41. package/dist/core/fixSuggest.js +195 -0
  42. package/dist/core/fixSuggest.js.map +1 -1
  43. package/dist/core/hotspotAnalyzer.js +65 -19
  44. package/dist/core/hotspotAnalyzer.js.map +1 -1
  45. package/dist/core/impact.d.ts +8 -0
  46. package/dist/core/impact.js +41 -3
  47. package/dist/core/impact.js.map +1 -1
  48. package/dist/core/indexCache.js +4 -1
  49. package/dist/core/indexCache.js.map +1 -1
  50. package/dist/core/issueEngine.js +24 -0
  51. package/dist/core/issueEngine.js.map +1 -1
  52. package/dist/core/languages/csharpImports.js +6 -4
  53. package/dist/core/languages/csharpImports.js.map +1 -1
  54. package/dist/core/memory.d.ts +154 -0
  55. package/dist/core/memory.js +277 -0
  56. package/dist/core/memory.js.map +1 -0
  57. package/dist/core/review.d.ts +25 -1
  58. package/dist/core/review.js +133 -2
  59. package/dist/core/review.js.map +1 -1
  60. package/dist/core/taint.d.ts +91 -0
  61. package/dist/core/taint.js +185 -0
  62. package/dist/core/taint.js.map +1 -0
  63. package/dist/core/workspace.d.ts +62 -0
  64. package/dist/core/workspace.js +127 -0
  65. package/dist/core/workspace.js.map +1 -0
  66. package/dist/mcp/prompts.js +274 -0
  67. package/dist/mcp/prompts.js.map +1 -1
  68. package/dist/mcp/server.js +162 -146
  69. package/dist/mcp/server.js.map +1 -1
  70. package/dist/mcp/tokenBudget.d.ts +22 -0
  71. package/dist/mcp/tokenBudget.js +26 -0
  72. package/dist/mcp/tokenBudget.js.map +1 -1
  73. package/dist/mcp/tools/applyFix.d.ts +16 -0
  74. package/dist/mcp/tools/applyFix.js +91 -0
  75. package/dist/mcp/tools/applyFix.js.map +1 -0
  76. package/dist/mcp/tools/doctor.js +65 -2
  77. package/dist/mcp/tools/doctor.js.map +1 -1
  78. package/dist/mcp/tools/explain.js +4 -3
  79. package/dist/mcp/tools/explain.js.map +1 -1
  80. package/dist/mcp/tools/explainIssue.js +3 -2
  81. package/dist/mcp/tools/explainIssue.js.map +1 -1
  82. package/dist/mcp/tools/file.js +3 -2
  83. package/dist/mcp/tools/file.js.map +1 -1
  84. package/dist/mcp/tools/graph.js +16 -11
  85. package/dist/mcp/tools/graph.js.map +1 -1
  86. package/dist/mcp/tools/impact.js +36 -3
  87. package/dist/mcp/tools/impact.js.map +1 -1
  88. package/dist/mcp/tools/memory.d.ts +19 -0
  89. package/dist/mcp/tools/memory.js +134 -0
  90. package/dist/mcp/tools/memory.js.map +1 -0
  91. package/dist/mcp/tools/review.js +25 -4
  92. package/dist/mcp/tools/review.js.map +1 -1
  93. package/dist/mcp/tools/taint.d.ts +15 -0
  94. package/dist/mcp/tools/taint.js +67 -0
  95. package/dist/mcp/tools/taint.js.map +1 -0
  96. package/dist/mcp/tools/upgrade.js +3 -2
  97. package/dist/mcp/tools/upgrade.js.map +1 -1
  98. package/dist/mcp/tools/workspaceGraph.d.ts +18 -0
  99. package/dist/mcp/tools/workspaceGraph.js +188 -0
  100. package/dist/mcp/tools/workspaceGraph.js.map +1 -0
  101. package/dist/mcp/tools.js +8 -0
  102. package/dist/mcp/tools.js.map +1 -1
  103. package/dist/reporters/consoleReporter.d.ts +12 -1
  104. package/dist/reporters/consoleReporter.js +289 -179
  105. package/dist/reporters/consoleReporter.js.map +1 -1
  106. package/dist/reporters/markdownReporter.js +185 -128
  107. package/dist/reporters/markdownReporter.js.map +1 -1
  108. package/dist/tool-manifest.json +129 -6
  109. package/dist/types.d.ts +67 -0
  110. package/dist/utils/config.js +93 -53
  111. package/dist/utils/config.js.map +1 -1
  112. package/package.json +9 -2
@@ -3,83 +3,125 @@ import path from 'node:path';
3
3
  import { getAdapterFor, listAdapters } from './languages/registry.js';
4
4
  const MAX_FILE_SIZE = 1024 * 1024;
5
5
  export async function buildCodeGraph(rootPath, files, previousGraph) {
6
- // Per-adapter setup (e.g. Python package-root detection).
7
- const contextByAdapter = new Map();
8
- for (const adapter of listAdapters()) {
9
- contextByAdapter.set(adapter, await adapter.preparePackageRoots(rootPath, files));
10
- }
6
+ const contextByAdapter = await prepareAdapterContexts(rootPath, files);
11
7
  const parseable = files
12
8
  .map((f) => ({ file: f, adapter: getAdapterFor(f.relativePath) }))
13
9
  .filter((x) => !!x.adapter && x.file.sizeBytes <= (x.adapter.maxFileSize ?? MAX_FILE_SIZE));
14
10
  const graphFiles = new Map();
15
- const packageImporters = new Map();
16
- const localImporters = new Map();
17
- const symbolDefs = new Map();
18
11
  await Promise.all(parseable.map(async ({ file, adapter }) => {
19
- const absolutePath = path.isAbsolute(file.absolutePath)
20
- ? file.absolutePath
21
- : path.resolve(rootPath, file.relativePath);
22
- let mtimeMs;
23
- try {
24
- const stat = await fs.stat(absolutePath);
25
- mtimeMs = stat.mtimeMs;
26
- }
27
- catch {
28
- return;
29
- }
30
- const cached = previousGraph?.files.get(file.relativePath);
31
- if (cached && cached.mtimeMs === mtimeMs && cached.adapterId === adapter.id) {
32
- graphFiles.set(file.relativePath, cached);
33
- return;
34
- }
35
- let content;
36
- try {
37
- content = await fs.readFile(absolutePath, 'utf-8');
38
- }
39
- catch {
40
- return;
41
- }
42
- let result;
43
- try {
44
- result = await adapter.parse(file.relativePath, content);
45
- }
46
- catch (err) {
47
- const msg = err instanceof Error ? err.message : String(err);
48
- result = {
49
- ok: false,
50
- reason: `adapter ${adapter.id} threw: ${msg.slice(0, 120)}`,
51
- imports: [],
52
- exports: [],
53
- callSites: [],
54
- lineCount: 0,
55
- cyclomaticComplexity: 0,
56
- functions: [],
57
- };
58
- }
59
- graphFiles.set(file.relativePath, {
60
- relativePath: file.relativePath,
61
- imports: result.imports,
62
- exports: result.exports,
63
- callSites: result.callSites,
64
- lineCount: result.lineCount,
65
- cyclomaticComplexity: result.cyclomaticComplexity,
66
- functions: result.functions ?? [],
67
- mtimeMs,
68
- parseOk: result.ok,
69
- parseReason: result.reason,
70
- adapterId: adapter.id,
71
- });
12
+ const entry = await parseFileToGraphEntry(rootPath, file, adapter, previousGraph);
13
+ if (entry)
14
+ graphFiles.set(file.relativePath, entry);
72
15
  }));
16
+ const { localImporters, packageImporters, symbolDefs } = rebuildCrossFileIndexes(graphFiles, contextByAdapter);
17
+ computeFanIn(graphFiles);
18
+ computeFanOut(graphFiles);
19
+ return {
20
+ files: graphFiles,
21
+ packageImporters,
22
+ localImporters,
23
+ symbolDefs,
24
+ scannedFiles: graphFiles.size,
25
+ };
26
+ }
27
+ /**
28
+ * Per-adapter setup (e.g. Python package-root detection from
29
+ * pyproject.toml, Rust workspace detection from Cargo.toml). Run once
30
+ * per graph build; cheap relative to parsing.
31
+ */
32
+ async function prepareAdapterContexts(rootPath, files) {
33
+ const contextByAdapter = new Map();
34
+ for (const adapter of listAdapters()) {
35
+ contextByAdapter.set(adapter, await adapter.preparePackageRoots(rootPath, files));
36
+ }
37
+ return contextByAdapter;
38
+ }
39
+ /**
40
+ * Parse one file into a graph entry, honoring the previous graph's
41
+ * mtime cache. Returns null when the file cannot be stat'd or read
42
+ * (treat as missing). Adapter parse errors do NOT skip — we record an
43
+ * `ok: false` entry so callers can see what failed.
44
+ */
45
+ async function parseFileToGraphEntry(rootPath, file, adapter, previousGraph) {
46
+ const absolutePath = path.isAbsolute(file.absolutePath)
47
+ ? file.absolutePath
48
+ : path.resolve(rootPath, file.relativePath);
49
+ let mtimeMs;
50
+ try {
51
+ const stat = await fs.stat(absolutePath);
52
+ mtimeMs = stat.mtimeMs;
53
+ }
54
+ catch {
55
+ return null;
56
+ }
57
+ const cached = previousGraph?.files.get(file.relativePath);
58
+ if (cached && cached.mtimeMs === mtimeMs && cached.adapterId === adapter.id) {
59
+ return cached;
60
+ }
61
+ let content;
62
+ try {
63
+ content = await fs.readFile(absolutePath, 'utf-8');
64
+ }
65
+ catch {
66
+ return null;
67
+ }
68
+ const result = await safeAdapterParse(adapter, file.relativePath, content);
69
+ return graphFileFromResult(file.relativePath, adapter.id, result, mtimeMs);
70
+ }
71
+ /** Run the adapter's parse and convert any throw into an `ok: false` AstResult. */
72
+ async function safeAdapterParse(adapter, relativePath, content) {
73
+ try {
74
+ return await adapter.parse(relativePath, content);
75
+ }
76
+ catch (err) {
77
+ const msg = err instanceof Error ? err.message : String(err);
78
+ return {
79
+ ok: false,
80
+ reason: `adapter ${adapter.id} threw: ${msg.slice(0, 120)}`,
81
+ imports: [],
82
+ exports: [],
83
+ callSites: [],
84
+ lineCount: 0,
85
+ cyclomaticComplexity: 0,
86
+ functions: [],
87
+ };
88
+ }
89
+ }
90
+ function graphFileFromResult(relativePath, adapterId, result, mtimeMs) {
91
+ return {
92
+ relativePath,
93
+ imports: result.imports,
94
+ exports: result.exports,
95
+ callSites: result.callSites,
96
+ lineCount: result.lineCount,
97
+ cyclomaticComplexity: result.cyclomaticComplexity,
98
+ functions: result.functions ?? [],
99
+ mtimeMs,
100
+ parseOk: result.ok,
101
+ parseReason: result.reason,
102
+ adapterId: adapterId,
103
+ };
104
+ }
105
+ /**
106
+ * Rebuild the three cross-file derived indexes from scratch:
107
+ * - localImporters: target file → set of files importing it
108
+ * - packageImporters: package name → set of files importing it
109
+ * - symbolDefs: exported name → set of files defining it
110
+ *
111
+ * Each adapter gets a shot at local resolution first (matters for
112
+ * Python's `pkg.core` which may be local OR third-party); falls back
113
+ * to package-name classification.
114
+ */
115
+ function rebuildCrossFileIndexes(graphFiles, contextByAdapter) {
116
+ const localImporters = new Map();
117
+ const packageImporters = new Map();
118
+ const symbolDefs = new Map();
73
119
  for (const [importingFile, entry] of graphFiles) {
74
120
  const adapter = getAdapterFor(importingFile);
75
121
  if (!adapter)
76
122
  continue;
77
123
  const context = contextByAdapter.get(adapter) ?? {};
78
124
  for (const imp of entry.imports) {
79
- // Try local resolution first. For JS/TS this is a no-op on bare specifiers
80
- // (resolveImport short-circuits on non-relative paths). For Python it
81
- // matters: `pkg.core` could be either a local module or third-party.
82
- // Local takes precedence when it resolves; otherwise fall back to pkg.
83
125
  const resolved = adapter.resolveImport(importingFile, imp.source, graphFiles, context);
84
126
  if (resolved) {
85
127
  if (!localImporters.has(resolved))
@@ -102,10 +144,15 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
102
144
  symbolDefs.get(exp.name).add(importingFile);
103
145
  }
104
146
  }
105
- // 0.15.0: per-function fan-in. For each function name across the graph,
106
- // count how many OTHER files include the name in their callSites. The
107
- // result is attached to the function entry in-place. Approximate: shared
108
- // names across files attribute to every definition.
147
+ return { localImporters, packageImporters, symbolDefs };
148
+ }
149
+ /**
150
+ * 0.15.0+ per-function fan-in. For each function name across the
151
+ * graph, count how many OTHER files include the name in their
152
+ * `callSites`. Mutates `functions[*].fanIn` in place. Approximate:
153
+ * shared names across files attribute to every definition.
154
+ */
155
+ function computeFanIn(graphFiles) {
109
156
  const callerFilesByName = new Map();
110
157
  for (const gf of graphFiles.values()) {
111
158
  for (const name of gf.callSites ?? []) {
@@ -123,21 +170,20 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
123
170
  for (const fn of gf.functions) {
124
171
  const bare = bareName(fn.name);
125
172
  const callers = callerFilesByName.get(bare);
126
- if (!callers) {
127
- fn.fanIn = 0;
128
- }
129
- else {
130
- // Subtract self if the function's own file appears in the caller set
131
- // (self-call from within the same file).
132
- fn.fanIn = callers.size - (callers.has(gf.relativePath) ? 1 : 0);
133
- }
173
+ // Subtract self if the function's own file appears in the caller
174
+ // set (self-call from within the same file).
175
+ fn.fanIn = !callers ? 0 : callers.size - (callers.has(gf.relativePath) ? 1 : 0);
134
176
  }
135
177
  }
136
- // 1.2.0: per-function fan-out. For each function with per-function
137
- // callSites, count how many distinct callee names match a function name
138
- // defined SOMEWHERE in the graph. Names that don't resolve (libraries,
139
- // constructors, unknown methods) are dropped fan-out is "internal"
140
- // coupling, not raw call count.
178
+ }
179
+ /**
180
+ * 1.2.0+ per-function fan-out. For each function with per-function
181
+ * callSites, count how many distinct callee names match a function
182
+ * defined SOMEWHERE in the graph. Library / constructor / unknown
183
+ * method calls drop — fan-out is "internal" coupling, not raw call
184
+ * count. Mutates `functions[*].fanOut` in place.
185
+ */
186
+ function computeFanOut(graphFiles) {
141
187
  const definedNames = new Set();
142
188
  for (const gf of graphFiles.values()) {
143
189
  if (!gf.functions)
@@ -167,13 +213,6 @@ export async function buildCodeGraph(rootPath, files, previousGraph) {
167
213
  fn.fanOut = count;
168
214
  }
169
215
  }
170
- return {
171
- files: graphFiles,
172
- packageImporters,
173
- localImporters,
174
- symbolDefs,
175
- scannedFiles: graphFiles.size,
176
- };
177
216
  }
178
217
  /**
179
218
  * Function names in the graph are sometimes qualified (`Class.method` for
@@ -215,170 +254,80 @@ export function toPackageName(specifier) {
215
254
  export async function incrementallyUpdateGraph(graph, rootPath, changedPaths) {
216
255
  if (changedPaths.length === 0)
217
256
  return graph;
218
- // Per-adapter context. We re-prepare since changedPaths may include
219
- // manifest edits (pyproject.toml, go.mod) that would shift package roots.
220
- // Run once for the whole batch; cheap relative to parsing.
221
- const contextByAdapter = new Map();
222
- // We need a FileEntry-shaped argument for preparePackageRoots; build one
223
- // from the current graph plus the changed-path stat info as a stand-in.
224
- const fakeFiles = [...graph.files.values()].map((gf) => ({
257
+ const contextByAdapter = await prepareAdapterContexts(rootPath, fakeFilesFromGraph(graph, rootPath));
258
+ await Promise.all(changedPaths.map((rel) => processChangedPath(graph, rootPath, rel)));
259
+ rebuildIndexesIntoGraph(graph, contextByAdapter);
260
+ computeFanIn(graph.files);
261
+ computeFanOut(graph.files);
262
+ graph.scannedFiles = graph.files.size;
263
+ return graph;
264
+ }
265
+ /**
266
+ * Build a FileEntry[]-shaped stand-in from the current graph, used as
267
+ * the input to `preparePackageRoots` during incremental update — the
268
+ * adapters need a complete view of repo layout to detect manifest
269
+ * edits (pyproject.toml, go.mod) that would shift package roots.
270
+ */
271
+ function fakeFilesFromGraph(graph, rootPath) {
272
+ return [...graph.files.values()].map((gf) => ({
225
273
  relativePath: gf.relativePath,
226
274
  absolutePath: path.resolve(rootPath, gf.relativePath),
227
275
  directory: path.dirname(gf.relativePath),
228
276
  extension: path.extname(gf.relativePath),
229
277
  sizeBytes: 0,
230
278
  }));
231
- for (const adapter of listAdapters()) {
232
- contextByAdapter.set(adapter, await adapter.preparePackageRoots(rootPath, fakeFiles));
233
- }
234
- // Step 1: re-parse or delete each changed path.
235
- await Promise.all(changedPaths.map(async (rel) => {
236
- const adapter = getAdapterFor(rel);
237
- if (!adapter) {
238
- // Not a parseable file (e.g. README). If we previously had it in the
239
- // graph drop the entry; otherwise nothing to do.
240
- if (graph.files.has(rel))
241
- graph.files.delete(rel);
242
- return;
243
- }
244
- const abs = path.resolve(rootPath, rel);
245
- let mtimeMs;
246
- try {
247
- const stat = await fs.stat(abs);
248
- mtimeMs = stat.mtimeMs;
249
- }
250
- catch {
251
- // File doesn't exist anymore - treat as deletion.
252
- graph.files.delete(rel);
253
- // Strip its old contributions when we rebuild the indexes below.
254
- return;
255
- }
256
- let content;
257
- try {
258
- content = await fs.readFile(abs, 'utf-8');
259
- }
260
- catch {
279
+ }
280
+ /**
281
+ * Re-parse one changed path, OR drop it from the graph if it's been
282
+ * deleted / become unreadable / is no longer parseable. Mutates graph
283
+ * in place.
284
+ */
285
+ async function processChangedPath(graph, rootPath, rel) {
286
+ const adapter = getAdapterFor(rel);
287
+ if (!adapter) {
288
+ // Not a parseable file (e.g. README). Drop any prior entry; otherwise no-op.
289
+ if (graph.files.has(rel))
261
290
  graph.files.delete(rel);
262
- return;
263
- }
264
- let result;
265
- try {
266
- result = await adapter.parse(rel, content);
267
- }
268
- catch (err) {
269
- const msg = err instanceof Error ? err.message : String(err);
270
- result = {
271
- ok: false,
272
- reason: `adapter ${adapter.id} threw: ${msg.slice(0, 120)}`,
273
- imports: [],
274
- exports: [],
275
- callSites: [],
276
- lineCount: 0,
277
- cyclomaticComplexity: 0,
278
- functions: [],
279
- };
280
- }
281
- graph.files.set(rel, {
282
- relativePath: rel,
283
- imports: result.imports,
284
- exports: result.exports,
285
- callSites: result.callSites,
286
- lineCount: result.lineCount,
287
- cyclomaticComplexity: result.cyclomaticComplexity,
288
- functions: result.functions ?? [],
289
- mtimeMs,
290
- parseOk: result.ok,
291
- parseReason: result.reason,
292
- adapterId: adapter.id,
293
- });
294
- }));
295
- // Step 2: rebuild the cross-file derived indexes from scratch. The graph
296
- // is small relative to parse cost; rebuilding edges in O(N) keeps the
297
- // logic simple and correct (no orphan-edge bugs from in-place patching).
298
- graph.localImporters.clear();
299
- graph.packageImporters.clear();
300
- graph.symbolDefs.clear();
301
- for (const [importingFile, entry] of graph.files) {
302
- const adapter = getAdapterFor(importingFile);
303
- if (!adapter)
304
- continue;
305
- const context = contextByAdapter.get(adapter) ?? {};
306
- for (const imp of entry.imports) {
307
- const resolved = adapter.resolveImport(importingFile, imp.source, graph.files, context);
308
- if (resolved) {
309
- if (!graph.localImporters.has(resolved))
310
- graph.localImporters.set(resolved, new Set());
311
- graph.localImporters.get(resolved).add(importingFile);
312
- continue;
313
- }
314
- const pkg = adapter.toPackageName(imp.source);
315
- if (pkg) {
316
- if (!graph.packageImporters.has(pkg))
317
- graph.packageImporters.set(pkg, new Set());
318
- graph.packageImporters.get(pkg).add(importingFile);
319
- }
320
- }
321
- for (const exp of entry.exports) {
322
- if (!exp.name)
323
- continue;
324
- if (!graph.symbolDefs.has(exp.name))
325
- graph.symbolDefs.set(exp.name, new Set());
326
- graph.symbolDefs.get(exp.name).add(importingFile);
327
- }
291
+ return;
328
292
  }
329
- // Step 3: recompute per-function fan-in. Cheap: iterates files twice.
330
- const callerFilesByName = new Map();
331
- for (const gf of graph.files.values()) {
332
- for (const name of gf.callSites ?? []) {
333
- let set = callerFilesByName.get(name);
334
- if (!set) {
335
- set = new Set();
336
- callerFilesByName.set(name, set);
337
- }
338
- set.add(gf.relativePath);
339
- }
293
+ const abs = path.resolve(rootPath, rel);
294
+ let mtimeMs;
295
+ try {
296
+ const stat = await fs.stat(abs);
297
+ mtimeMs = stat.mtimeMs;
340
298
  }
341
- for (const gf of graph.files.values()) {
342
- if (!gf.functions || gf.functions.length === 0)
343
- continue;
344
- for (const fn of gf.functions) {
345
- const bare = bareName(fn.name);
346
- const callers = callerFilesByName.get(bare);
347
- fn.fanIn = !callers ? 0 : callers.size - (callers.has(gf.relativePath) ? 1 : 0);
348
- }
299
+ catch {
300
+ graph.files.delete(rel);
301
+ return;
349
302
  }
350
- // Per-function fan-out — see buildCodeGraph for shape rationale.
351
- const definedNames = new Set();
352
- for (const gf of graph.files.values()) {
353
- if (!gf.functions)
354
- continue;
355
- for (const fn of gf.functions)
356
- definedNames.add(bareName(fn.name));
303
+ let content;
304
+ try {
305
+ content = await fs.readFile(abs, 'utf-8');
357
306
  }
358
- for (const gf of graph.files.values()) {
359
- if (!gf.functions || gf.functions.length === 0)
360
- continue;
361
- for (const fn of gf.functions) {
362
- if (!fn.callSites) {
363
- fn.fanOut = 0;
364
- continue;
365
- }
366
- let count = 0;
367
- const seen = new Set();
368
- for (const callee of fn.callSites) {
369
- if (seen.has(callee))
370
- continue;
371
- seen.add(callee);
372
- if (callee === bareName(fn.name))
373
- continue;
374
- if (definedNames.has(callee))
375
- count++;
376
- }
377
- fn.fanOut = count;
378
- }
307
+ catch {
308
+ graph.files.delete(rel);
309
+ return;
379
310
  }
380
- graph.scannedFiles = graph.files.size;
381
- return graph;
311
+ const result = await safeAdapterParse(adapter, rel, content);
312
+ graph.files.set(rel, graphFileFromResult(rel, adapter.id, result, mtimeMs));
313
+ }
314
+ /**
315
+ * Rebuild the graph's cross-file indexes in place — clear, then refill
316
+ * from scratch. The graph is small relative to parse cost so rebuilding
317
+ * edges in O(N) keeps the logic simple and avoids orphan-edge bugs from
318
+ * in-place patching.
319
+ */
320
+ function rebuildIndexesIntoGraph(graph, contextByAdapter) {
321
+ const { localImporters, packageImporters, symbolDefs } = rebuildCrossFileIndexes(graph.files, contextByAdapter);
322
+ graph.localImporters.clear();
323
+ for (const [k, v] of localImporters)
324
+ graph.localImporters.set(k, v);
325
+ graph.packageImporters.clear();
326
+ for (const [k, v] of packageImporters)
327
+ graph.packageImporters.set(k, v);
328
+ graph.symbolDefs.clear();
329
+ for (const [k, v] of symbolDefs)
330
+ graph.symbolDefs.set(k, v);
382
331
  }
383
332
  // ── Query API ──────────────────────────────────────────────
384
333
  export function packagesUsed(graph) {
@@ -1 +1 @@
1
- {"version":3,"file":"codeGraph.js","sourceRoot":"","sources":["../../src/core/codeGraph.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeGraph.js","sourceRoot":"","sources":["../../src/core/codeGraph.ts"],"names":[],"mappings":"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"}
@@ -236,53 +236,49 @@ export function extractExports(content) {
236
236
  }
237
237
  return exports;
238
238
  }
239
+ /**
240
+ * Filename-keyword rules. Order matters — first match wins. Each pred
241
+ * runs against the lowercase basename (without extension).
242
+ */
243
+ const NAME_RULES = [
244
+ { pred: (n) => n.includes('test') || n.includes('spec'), label: 'Test file' },
245
+ { pred: (n) => n.includes('config') || n.includes('rc'), label: 'Configuration file' },
246
+ { pred: (n) => n === 'index', label: 'Module entry point / barrel file' },
247
+ { pred: (n) => n === 'main' || n === 'app', label: 'Application entry point' },
248
+ { pred: (n) => n.includes('route') || n.includes('router'), label: 'Route definitions' },
249
+ { pred: (n) => n.includes('middleware'), label: 'Middleware handler' },
250
+ { pred: (n) => n.includes('controller'), label: 'Request controller' },
251
+ { pred: (n) => n.includes('service'), label: 'Service layer logic' },
252
+ { pred: (n) => n.includes('model') || n.includes('schema'), label: 'Data model / schema definition' },
253
+ { pred: (n) => n.includes('util') || n.includes('helper'), label: 'Utility functions' },
254
+ { pred: (n) => n.includes('hook'), label: 'Custom hook' },
255
+ { pred: (n) => n.includes('context') || n.includes('provider'), label: 'Context / state provider' },
256
+ { pred: (n) => n.includes('type') || n.includes('interface'), label: 'Type definitions' },
257
+ { pred: (n) => n.includes('constant'), label: 'Constants / configuration' },
258
+ { pred: (n) => n.includes('migration'), label: 'Database migration' },
259
+ { pred: (n) => n.includes('seed'), label: 'Database seed data' },
260
+ { pred: (n) => n.includes('auth'), label: 'Authentication logic' },
261
+ { pred: (n) => n.includes('api'), label: 'API endpoint handler' },
262
+ ];
263
+ /** Directory-segment rules. Same first-match-wins semantics. */
264
+ const DIR_RULES = [
265
+ { pred: (d) => d.includes('component') || d.includes('pages'), label: 'UI component' },
266
+ { pred: (d) => d.includes('service'), label: 'Service module' },
267
+ { pred: (d) => d.includes('model'), label: 'Data model' },
268
+ { pred: (d) => d.includes('util') || d.includes('lib'), label: 'Library / utility module' },
269
+ ];
239
270
  export function inferPurpose(filePath, exports) {
240
271
  const name = path.basename(filePath, path.extname(filePath)).toLowerCase();
241
272
  const dir = path.dirname(filePath).toLowerCase();
242
- if (name.includes('test') || name.includes('spec'))
243
- return 'Test file';
244
- if (name.includes('config') || name.includes('rc'))
245
- return 'Configuration file';
246
- if (name === 'index')
247
- return 'Module entry point / barrel file';
248
- if (name === 'main' || name === 'app')
249
- return 'Application entry point';
250
- if (name.includes('route') || name.includes('router'))
251
- return 'Route definitions';
252
- if (name.includes('middleware'))
253
- return 'Middleware handler';
254
- if (name.includes('controller'))
255
- return 'Request controller';
256
- if (name.includes('service'))
257
- return 'Service layer logic';
258
- if (name.includes('model') || name.includes('schema'))
259
- return 'Data model / schema definition';
260
- if (name.includes('util') || name.includes('helper'))
261
- return 'Utility functions';
262
- if (name.includes('hook'))
263
- return 'Custom hook';
264
- if (name.includes('context') || name.includes('provider'))
265
- return 'Context / state provider';
266
- if (name.includes('type') || name.includes('interface'))
267
- return 'Type definitions';
268
- if (name.includes('constant'))
269
- return 'Constants / configuration';
270
- if (name.includes('migration'))
271
- return 'Database migration';
272
- if (name.includes('seed'))
273
- return 'Database seed data';
274
- if (name.includes('auth'))
275
- return 'Authentication logic';
276
- if (name.includes('api'))
277
- return 'API endpoint handler';
278
- if (dir.includes('component') || dir.includes('pages'))
279
- return 'UI component';
280
- if (dir.includes('service'))
281
- return 'Service module';
282
- if (dir.includes('model'))
283
- return 'Data model';
284
- if (dir.includes('util') || dir.includes('lib'))
285
- return 'Library / utility module';
273
+ for (const rule of NAME_RULES)
274
+ if (rule.pred(name))
275
+ return rule.label;
276
+ for (const rule of DIR_RULES)
277
+ if (rule.pred(dir))
278
+ return rule.label;
279
+ return inferPurposeFromExports(exports);
280
+ }
281
+ function inferPurposeFromExports(exports) {
286
282
  const exportTypes = exports.map((e) => e.type);
287
283
  if (exportTypes.includes('class'))
288
284
  return 'Class-based module';