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.
- package/README.md +24 -7
- package/dist/cli/commands/applyFix.d.ts +7 -0
- package/dist/cli/commands/applyFix.js +113 -0
- package/dist/cli/commands/applyFix.js.map +1 -0
- package/dist/cli/commands/coverage.js +13 -0
- package/dist/cli/commands/coverage.js.map +1 -1
- package/dist/cli/commands/doctor.js +18 -2
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/explain.js +1 -0
- package/dist/cli/commands/explain.js.map +1 -1
- package/dist/cli/commands/impact.js +25 -1
- package/dist/cli/commands/impact.js.map +1 -1
- package/dist/cli/commands/init.d.ts +6 -0
- package/dist/cli/commands/init.js +70 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/installHook.d.ts +9 -0
- package/dist/cli/commands/installHook.js +90 -0
- package/dist/cli/commands/installHook.js.map +1 -0
- package/dist/cli/commands/memory.d.ts +11 -0
- package/dist/cli/commands/memory.js +175 -0
- package/dist/cli/commands/memory.js.map +1 -0
- package/dist/cli/commands/taint.d.ts +6 -0
- package/dist/cli/commands/taint.js +74 -0
- package/dist/cli/commands/taint.js.map +1 -0
- package/dist/cli/commands/workspace.d.ts +11 -0
- package/dist/cli/commands/workspace.js +115 -0
- package/dist/cli/commands/workspace.js.map +1 -0
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/applyFix.d.ts +52 -0
- package/dist/core/applyFix.js +220 -0
- package/dist/core/applyFix.js.map +1 -0
- package/dist/core/ast.d.ts +9 -0
- package/dist/core/ast.js +35 -4
- package/dist/core/ast.js.map +1 -1
- package/dist/core/codeGraph.js +190 -241
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/fileInspector.js +40 -44
- package/dist/core/fileInspector.js.map +1 -1
- package/dist/core/fixSuggest.d.ts +6 -0
- package/dist/core/fixSuggest.js +195 -0
- package/dist/core/fixSuggest.js.map +1 -1
- package/dist/core/hotspotAnalyzer.js +65 -19
- package/dist/core/hotspotAnalyzer.js.map +1 -1
- package/dist/core/impact.d.ts +8 -0
- package/dist/core/impact.js +41 -3
- package/dist/core/impact.js.map +1 -1
- package/dist/core/indexCache.js +4 -1
- package/dist/core/indexCache.js.map +1 -1
- package/dist/core/issueEngine.js +24 -0
- package/dist/core/issueEngine.js.map +1 -1
- package/dist/core/languages/csharpImports.js +6 -4
- package/dist/core/languages/csharpImports.js.map +1 -1
- package/dist/core/memory.d.ts +154 -0
- package/dist/core/memory.js +277 -0
- package/dist/core/memory.js.map +1 -0
- package/dist/core/review.d.ts +25 -1
- package/dist/core/review.js +133 -2
- package/dist/core/review.js.map +1 -1
- package/dist/core/taint.d.ts +91 -0
- package/dist/core/taint.js +185 -0
- package/dist/core/taint.js.map +1 -0
- package/dist/core/workspace.d.ts +62 -0
- package/dist/core/workspace.js +127 -0
- package/dist/core/workspace.js.map +1 -0
- package/dist/mcp/prompts.js +274 -0
- package/dist/mcp/prompts.js.map +1 -1
- package/dist/mcp/server.js +162 -146
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/tokenBudget.d.ts +22 -0
- package/dist/mcp/tokenBudget.js +26 -0
- package/dist/mcp/tokenBudget.js.map +1 -1
- package/dist/mcp/tools/applyFix.d.ts +16 -0
- package/dist/mcp/tools/applyFix.js +91 -0
- package/dist/mcp/tools/applyFix.js.map +1 -0
- package/dist/mcp/tools/doctor.js +65 -2
- package/dist/mcp/tools/doctor.js.map +1 -1
- package/dist/mcp/tools/explain.js +4 -3
- package/dist/mcp/tools/explain.js.map +1 -1
- package/dist/mcp/tools/explainIssue.js +3 -2
- package/dist/mcp/tools/explainIssue.js.map +1 -1
- package/dist/mcp/tools/file.js +3 -2
- package/dist/mcp/tools/file.js.map +1 -1
- package/dist/mcp/tools/graph.js +16 -11
- package/dist/mcp/tools/graph.js.map +1 -1
- package/dist/mcp/tools/impact.js +36 -3
- package/dist/mcp/tools/impact.js.map +1 -1
- package/dist/mcp/tools/memory.d.ts +19 -0
- package/dist/mcp/tools/memory.js +134 -0
- package/dist/mcp/tools/memory.js.map +1 -0
- package/dist/mcp/tools/review.js +25 -4
- package/dist/mcp/tools/review.js.map +1 -1
- package/dist/mcp/tools/taint.d.ts +15 -0
- package/dist/mcp/tools/taint.js +67 -0
- package/dist/mcp/tools/taint.js.map +1 -0
- package/dist/mcp/tools/upgrade.js +3 -2
- package/dist/mcp/tools/upgrade.js.map +1 -1
- package/dist/mcp/tools/workspaceGraph.d.ts +18 -0
- package/dist/mcp/tools/workspaceGraph.js +188 -0
- package/dist/mcp/tools/workspaceGraph.js.map +1 -0
- package/dist/mcp/tools.js +8 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reporters/consoleReporter.d.ts +12 -1
- package/dist/reporters/consoleReporter.js +289 -179
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/markdownReporter.js +185 -128
- package/dist/reporters/markdownReporter.js.map +1 -1
- package/dist/tool-manifest.json +129 -6
- package/dist/types.d.ts +67 -0
- package/dist/utils/config.js +93 -53
- package/dist/utils/config.js.map +1 -1
- package/package.json +9 -2
package/dist/core/codeGraph.js
CHANGED
|
@@ -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
|
-
|
|
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
|
|
20
|
-
|
|
21
|
-
|
|
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
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
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
|
|
127
|
-
|
|
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
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
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
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
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
|
-
|
|
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
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
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
|
-
|
|
342
|
-
|
|
343
|
-
|
|
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
|
-
|
|
351
|
-
|
|
352
|
-
|
|
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
|
-
|
|
359
|
-
|
|
360
|
-
|
|
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
|
-
|
|
381
|
-
|
|
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
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
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';
|