projscan 3.3.0 → 3.4.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 (50) hide show
  1. package/README.md +46 -26
  2. package/dist/cli/commands/plugin.js +10 -2
  3. package/dist/cli/commands/plugin.js.map +1 -1
  4. package/dist/cli/commands/understand.d.ts +1 -0
  5. package/dist/cli/commands/understand.js +112 -0
  6. package/dist/cli/commands/understand.js.map +1 -0
  7. package/dist/cli/commands/workplan.js +1 -1
  8. package/dist/cli/commands/workplan.js.map +1 -1
  9. package/dist/cli/commands/workspace.js +3 -2
  10. package/dist/cli/commands/workspace.js.map +1 -1
  11. package/dist/cli/index.js +2 -0
  12. package/dist/cli/index.js.map +1 -1
  13. package/dist/core/pluginDx.d.ts +1 -0
  14. package/dist/core/pluginDx.js +77 -18
  15. package/dist/core/pluginDx.js.map +1 -1
  16. package/dist/core/plugins.d.ts +1 -1
  17. package/dist/core/plugins.js.map +1 -1
  18. package/dist/core/preflight.js +4 -16
  19. package/dist/core/preflight.js.map +1 -1
  20. package/dist/core/privacy.js +6 -0
  21. package/dist/core/privacy.js.map +1 -1
  22. package/dist/core/roadmapCatalog.d.ts +1 -0
  23. package/dist/core/roadmapCatalog.js +14 -11
  24. package/dist/core/roadmapCatalog.js.map +1 -1
  25. package/dist/core/understand.d.ts +8 -0
  26. package/dist/core/understand.js +567 -0
  27. package/dist/core/understand.js.map +1 -0
  28. package/dist/core/workspace.d.ts +4 -2
  29. package/dist/core/workspace.js +63 -4
  30. package/dist/core/workspace.js.map +1 -1
  31. package/dist/mcp/tools/plugin.js +48 -4
  32. package/dist/mcp/tools/plugin.js.map +1 -1
  33. package/dist/mcp/tools/understand.d.ts +2 -0
  34. package/dist/mcp/tools/understand.js +43 -0
  35. package/dist/mcp/tools/understand.js.map +1 -0
  36. package/dist/mcp/tools/workplan.js +3 -2
  37. package/dist/mcp/tools/workplan.js.map +1 -1
  38. package/dist/mcp/tools/workspaceGraph.js +31 -0
  39. package/dist/mcp/tools/workspaceGraph.js.map +1 -1
  40. package/dist/mcp/tools.js +2 -0
  41. package/dist/mcp/tools.js.map +1 -1
  42. package/dist/projscan-sbom.cdx.json +87 -185
  43. package/dist/tool-manifest.json +37 -5
  44. package/dist/types.d.ts +159 -0
  45. package/dist/utils/formatSupport.d.ts +1 -0
  46. package/dist/utils/formatSupport.js +1 -0
  47. package/dist/utils/formatSupport.js.map +1 -1
  48. package/docs/PLUGIN-AUTHORING.md +6 -7
  49. package/docs/PLUGIN-GALLERY.md +2 -1
  50. package/package.json +3 -3
@@ -0,0 +1,8 @@
1
+ import type { UnderstandReport, UnderstandView } from '../types.js';
2
+ export interface ComputeUnderstandOptions {
3
+ view?: UnderstandView;
4
+ intent?: string;
5
+ maxItems?: number;
6
+ changedFiles?: string[];
7
+ }
8
+ export declare function computeUnderstandReport(rootPath: string, options?: ComputeUnderstandOptions): Promise<UnderstandReport>;
@@ -0,0 +1,567 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { analyzeHotspots } from './hotspotAnalyzer.js';
5
+ import { buildCodeGraph } from './codeGraph.js';
6
+ import { computeDataflow } from './dataflow.js';
7
+ import { scanRepository } from './repositoryScanner.js';
8
+ import { buildSemanticGraph } from './semanticGraph.js';
9
+ import { getChangedFiles } from '../utils/changedFiles.js';
10
+ import { applyConfigToIssues, loadConfig } from '../utils/config.js';
11
+ import { collectIssues } from './issueEngine.js';
12
+ const DEFAULT_MAX_ITEMS = 8;
13
+ const CODE_EXTENSIONS = new Set(['.ts', '.tsx', '.js', '.jsx', '.mjs', '.cjs', '.py', '.rb', '.go', '.java', '.rs', '.php', '.cs', '.kt', '.kts', '.swift', '.cpp', '.cc', '.c', '.h', '.hpp']);
14
+ const TEST_PATTERNS = [/\.test\./, /\.spec\./, /(^|\/)(test|tests|__tests__)\//];
15
+ export async function computeUnderstandReport(rootPath, options = {}) {
16
+ const view = normalizeView(options.view);
17
+ const maxItems = normalizeLimit(options.maxItems);
18
+ const configResult = await loadConfig(rootPath).catch(() => ({ config: { ignore: [] } }));
19
+ const scan = await scanRepository(rootPath, { ignore: configResult.config.ignore });
20
+ const issues = applyConfigToIssues(await collectIssues(rootPath, scan.files), configResult.config);
21
+ const graph = await buildCodeGraph(rootPath, scan.files);
22
+ const semantic = buildSemanticGraph(graph, { maxNodes: 10_000, maxEdges: 25_000 });
23
+ const dataflow = computeDataflow(graph, { sources: [], sinks: [] });
24
+ const changedFiles = await resolveChangedFiles(rootPath, options.changedFiles);
25
+ const entrypoints = buildEntrypoints(rootPath, scan.files, graph, maxItems);
26
+ const boundaries = buildBoundaries(graph, maxItems);
27
+ const sideEffects = buildSideEffects(graph, dataflow.risks.flatMap((risk) => risk.files), maxItems);
28
+ const flows = buildFlows(entrypoints, graph, sideEffects, maxItems);
29
+ const contracts = await buildContracts(rootPath, graph, scan.files, changedFiles, maxItems);
30
+ const readFirst = buildReadFirst(entrypoints, boundaries, graph, maxItems);
31
+ const risks = await buildRisks(rootPath, scan.files, issues, graph, dataflow.risks.flatMap((risk) => risk.files), maxItems);
32
+ const verification = buildVerification(scan.files, changedFiles.length > 0 ? changedFiles : readFirst.map((item) => item.file), maxItems);
33
+ const changeReadiness = buildChangeReadiness(options.intent, changedFiles, graph, verification);
34
+ const claims = buildClaims(view, entrypoints, boundaries, flows, contracts, verification, readFirst);
35
+ const unknowns = buildUnknowns(view, graph, contracts, verification);
36
+ return {
37
+ schemaVersion: 1,
38
+ view,
39
+ rootPath,
40
+ ...(options.intent ? { intent: options.intent } : {}),
41
+ summary: summarize(view, entrypoints.length, boundaries.length, flows.length, contracts.publicExports.length),
42
+ claims,
43
+ entrypoints,
44
+ boundaries,
45
+ flows,
46
+ contracts,
47
+ changeReadiness,
48
+ verification,
49
+ readFirst,
50
+ risks,
51
+ unknowns,
52
+ commands: commandsForView(view),
53
+ ...(semantic.truncated || risks.length >= maxItems || readFirst.length >= maxItems ? { truncated: true } : {}),
54
+ };
55
+ }
56
+ function normalizeView(value) {
57
+ if (value === 'flow' || value === 'contracts' || value === 'change' || value === 'verify')
58
+ return value;
59
+ return 'map';
60
+ }
61
+ function normalizeLimit(value) {
62
+ if (typeof value !== 'number' || !Number.isFinite(value))
63
+ return DEFAULT_MAX_ITEMS;
64
+ return Math.max(1, Math.min(30, Math.floor(value)));
65
+ }
66
+ async function resolveChangedFiles(rootPath, explicit) {
67
+ if (explicit?.length)
68
+ return unique(explicit);
69
+ const changed = await getChangedFiles(rootPath).catch(() => ({ available: false, files: [] }));
70
+ return changed.available ? changed.files : [];
71
+ }
72
+ function buildEntrypoints(rootPath, files, graph, maxItems) {
73
+ const packageEntrypoints = packageEntrypointFiles(rootPath);
74
+ const candidates = files
75
+ .filter((file) => CODE_EXTENSIONS.has(file.extension))
76
+ .map((file) => {
77
+ const lower = file.relativePath.toLowerCase();
78
+ const graphFile = graph.files.get(file.relativePath);
79
+ const exports = graphFile?.exports.map((entry) => entry.name).filter(Boolean) ?? [];
80
+ const kind = packageEntrypoints.has(file.relativePath) ? 'package-export'
81
+ : lower.includes('server') || lower.includes('app') ? 'server'
82
+ : lower.includes('route') ? 'route'
83
+ : lower.includes('cli') || lower.includes('bin') ? 'cli'
84
+ : TEST_PATTERNS.some((pattern) => pattern.test(file.relativePath)) ? 'test'
85
+ : lower.endsWith('index.ts') || lower.endsWith('index.js') || exports.length > 0 ? 'module'
86
+ : 'module';
87
+ const score = (kind === 'package-export' ? 50 : 0)
88
+ + (kind === 'server' || kind === 'cli' || kind === 'route' ? 30 : 0)
89
+ + exports.length
90
+ + (graph.localImporters.get(file.relativePath)?.size ?? 0);
91
+ return { file, graphFile, exports, kind, score };
92
+ })
93
+ .filter((entry) => entry.score > 0 || entry.kind !== 'module')
94
+ .sort((a, b) => b.score - a.score || a.file.relativePath.localeCompare(b.file.relativePath))
95
+ .slice(0, maxItems);
96
+ if (candidates.length === 0) {
97
+ return files
98
+ .filter((file) => CODE_EXTENSIONS.has(file.extension))
99
+ .slice(0, Math.min(1, maxItems))
100
+ .map((entry) => entrypoint(entry.relativePath, 'module', [], 'First parseable source file found in the scan.'));
101
+ }
102
+ return candidates.map((entry) => entrypoint(entry.file.relativePath, entry.kind, entry.exports.slice(0, 8), entry.kind === 'package-export'
103
+ ? 'Package metadata points at this file as a public entry.'
104
+ : entry.kind === 'server' || entry.kind === 'route'
105
+ ? 'Filename and graph evidence suggest runtime request handling starts here.'
106
+ : entry.kind === 'cli'
107
+ ? 'Filename suggests this is a command-line entry surface.'
108
+ : 'Exports and importer evidence make this a useful orientation entry.'));
109
+ }
110
+ function packageEntrypointFiles(rootPath) {
111
+ try {
112
+ const pkg = JSON.parse(readFileSync(path.join(rootPath, 'package.json'), 'utf8'));
113
+ const values = [
114
+ pkg.main,
115
+ typeof pkg.bin === 'string' ? pkg.bin : undefined,
116
+ ...(pkg.bin && typeof pkg.bin === 'object' ? Object.values(pkg.bin) : []),
117
+ ...(typeof pkg.exports === 'string' ? [pkg.exports] : []),
118
+ ];
119
+ return new Set(values.filter((value) => typeof value === 'string').map(normalizePackagePath));
120
+ }
121
+ catch {
122
+ return new Set();
123
+ }
124
+ }
125
+ function normalizePackagePath(value) {
126
+ return value.replace(/^\.\//, '').replace(/^dist\//, 'src/').replace(/\.js$/, '.ts');
127
+ }
128
+ function entrypoint(file, kind, symbols, why) {
129
+ return {
130
+ file,
131
+ kind,
132
+ symbols,
133
+ why,
134
+ citations: [citation(file, symbols[0], why)],
135
+ };
136
+ }
137
+ function buildBoundaries(graph, maxItems) {
138
+ const grouped = new Map();
139
+ for (const [relativePath, file] of graph.files) {
140
+ const name = boundaryName(relativePath);
141
+ const list = grouped.get(name) ?? [];
142
+ list.push(file);
143
+ grouped.set(name, list);
144
+ }
145
+ return [...grouped.entries()]
146
+ .map(([name, files]) => {
147
+ const fileNames = new Set(files.map((file) => file.relativePath));
148
+ const dependsOn = new Set();
149
+ for (const file of files) {
150
+ for (const imp of file.imports) {
151
+ const local = [...graph.localImporters.entries()].find(([, importers]) => importers.has(file.relativePath))?.[0];
152
+ if (local && !fileNames.has(local))
153
+ dependsOn.add(boundaryName(local));
154
+ const source = imp.source.split('/')[0];
155
+ if (source && !imp.source.startsWith('.'))
156
+ dependsOn.add(source);
157
+ }
158
+ }
159
+ const publicExports = files.flatMap((file) => file.exports.map((entry) => entry.name).filter(Boolean)).slice(0, 12);
160
+ return {
161
+ name,
162
+ files: files.length,
163
+ publicExports,
164
+ dependsOn: [...dependsOn].filter((entry) => entry !== name).sort().slice(0, 12),
165
+ citations: files.slice(0, 3).map((file) => citation(file.relativePath, publicExports[0], 'Boundary contains parseable source files.')),
166
+ };
167
+ })
168
+ .sort((a, b) => b.files - a.files || a.name.localeCompare(b.name))
169
+ .slice(0, maxItems);
170
+ }
171
+ function boundaryName(relativePath) {
172
+ const parts = relativePath.split('/');
173
+ if (parts.length <= 1)
174
+ return '.';
175
+ return parts[0] ?? '.';
176
+ }
177
+ function buildSideEffects(graph, dataflowFiles, maxItems) {
178
+ const effects = [];
179
+ const seen = new Set();
180
+ for (const [file, entry] of graph.files) {
181
+ const calls = entry.callSites.join(' ');
182
+ const imports = entry.imports.map((imp) => imp.source).join(' ');
183
+ const text = `${calls} ${imports}`;
184
+ const detected = [
185
+ ['database', /\b(query|execute|sql|db|pool|repository)\b/i, 'Database-style query or repository call detected.'],
186
+ ['filesystem', /\b(readFile|writeFile|fs\.|createReadStream|createWriteStream)\b/i, 'Filesystem read/write call detected.'],
187
+ ['network', /\b(fetch|axios|http|https|request)\b/i, 'Network client call detected.'],
188
+ ['process', /\b(spawn|exec|execFile|process\.exit)\b/i, 'Process control call detected.'],
189
+ ['env', /\bprocess\.env\b/i, 'Environment/config read detected.'],
190
+ ];
191
+ for (const [kind, pattern, label] of detected) {
192
+ const key = `${kind}:${file}`;
193
+ if (!seen.has(key) && (pattern.test(text) || (kind === 'database' && dataflowFiles.includes(file)))) {
194
+ seen.add(key);
195
+ effects.push({ kind, label, files: [file], citations: [citation(file, undefined, label)] });
196
+ }
197
+ }
198
+ }
199
+ return effects.slice(0, maxItems);
200
+ }
201
+ function buildFlows(entrypoints, graph, sideEffects, maxItems) {
202
+ const flows = entrypoints
203
+ .filter((entry) => entry.kind === 'server' || entry.kind === 'route' || entry.kind === 'cli' || entry.kind === 'package-export')
204
+ .map((entry, index) => {
205
+ const reachable = reachableFiles(entry.file, graph, 5);
206
+ const effects = sideEffects.filter((effect) => effect.files.some((file) => reachable.includes(file) || file === entry.file));
207
+ const pathFiles = unique([entry.file, ...reachable, ...effects.flatMap((effect) => effect.files)]).slice(0, 8);
208
+ return {
209
+ id: `flow-${index + 1}`,
210
+ label: `${entry.kind} flow from ${entry.file}`,
211
+ entry,
212
+ path: pathFiles,
213
+ sideEffects: effects.length > 0 ? effects : sideEffects.slice(0, 2),
214
+ confidence: pathFiles.length > 1 ? 'medium' : 'low',
215
+ citations: pathFiles.slice(0, 4).map((file) => citation(file, undefined, 'Flow path is derived from local import and side-effect evidence.')),
216
+ };
217
+ })
218
+ .slice(0, maxItems);
219
+ return flows.length > 0 ? flows : entrypoints.slice(0, 1).map((entry) => ({
220
+ id: 'flow-1',
221
+ label: `entry flow from ${entry.file}`,
222
+ entry,
223
+ path: [entry.file],
224
+ sideEffects: sideEffects.slice(0, 2),
225
+ confidence: 'low',
226
+ citations: entry.citations,
227
+ }));
228
+ }
229
+ function reachableFiles(entryFile, graph, maxDepth) {
230
+ const result = [];
231
+ const queue = [{ file: entryFile, depth: 0 }];
232
+ const seen = new Set([entryFile]);
233
+ while (queue.length > 0) {
234
+ const current = queue.shift();
235
+ if (current.depth >= maxDepth)
236
+ continue;
237
+ const graphFile = graph.files.get(current.file);
238
+ if (!graphFile)
239
+ continue;
240
+ for (const imp of graphFile.imports) {
241
+ const target = resolveLocalImport(current.file, imp.source, graph);
242
+ if (target && !seen.has(target)) {
243
+ seen.add(target);
244
+ result.push(target);
245
+ queue.push({ file: target, depth: current.depth + 1 });
246
+ }
247
+ }
248
+ }
249
+ return result;
250
+ }
251
+ function resolveLocalImport(fromFile, source, graph) {
252
+ if (!source.startsWith('.'))
253
+ return null;
254
+ const base = path.posix.normalize(path.posix.join(path.posix.dirname(fromFile), source));
255
+ const candidates = [base, `${base}.ts`, `${base}.tsx`, `${base}.js`, `${base}.jsx`, path.posix.join(base, 'index.ts'), path.posix.join(base, 'index.js')];
256
+ return candidates.find((candidate) => graph.files.has(candidate)) ?? null;
257
+ }
258
+ async function buildContracts(rootPath, graph, files, changedFiles, maxItems) {
259
+ const packageExports = [...packageEntrypointFiles(rootPath)].map((file) => ({
260
+ name: file,
261
+ file,
262
+ kind: 'package',
263
+ citations: [citation('package.json', file, 'Package metadata exposes this file.')],
264
+ }));
265
+ const symbolExports = [...graph.files.values()]
266
+ .flatMap((file) => file.exports.map((entry) => ({
267
+ name: entry.name,
268
+ file: file.relativePath,
269
+ kind: 'symbol',
270
+ citations: [citation(file.relativePath, entry.name, 'Exported symbol is part of the code contract.')],
271
+ })))
272
+ .filter((entry) => Boolean(entry.name));
273
+ const configContracts = await findConfigContracts(rootPath, files, maxItems);
274
+ const focusFiles = changedFiles.length > 0 ? changedFiles : [...new Set([...packageExports.map((entry) => entry.file), ...symbolExports.map((entry) => entry.file)])];
275
+ const breakingChangeRisks = focusFiles.slice(0, maxItems).map((file, index) => ({
276
+ id: `contract-risk-${index + 1}`,
277
+ title: `Changing ${file} may affect public imports or runtime configuration`,
278
+ files: [file],
279
+ why: 'The file is exported, imported, or contains configuration evidence that other code may rely on.',
280
+ command: `projscan impact ${file} --format json`,
281
+ }));
282
+ return {
283
+ publicExports: uniqueBy([...packageExports, ...symbolExports], (entry) => `${entry.kind}:${entry.file}:${entry.name}`).slice(0, maxItems),
284
+ configContracts,
285
+ breakingChangeRisks,
286
+ };
287
+ }
288
+ async function findConfigContracts(rootPath, files, maxItems) {
289
+ const contracts = [];
290
+ const relevant = files.filter((file) => CODE_EXTENSIONS.has(file.extension) || file.relativePath === 'package.json').slice(0, 400);
291
+ for (const file of relevant) {
292
+ if (contracts.length >= maxItems)
293
+ break;
294
+ const full = path.join(rootPath, file.relativePath);
295
+ const content = await fs.readFile(full, 'utf8').catch(() => '');
296
+ for (const match of content.matchAll(/process\.env\.([A-Z0-9_]+)/g)) {
297
+ const name = match[1];
298
+ if (!name || contracts.some((entry) => entry.name === name && entry.file === file.relativePath))
299
+ continue;
300
+ contracts.push({
301
+ name,
302
+ file: file.relativePath,
303
+ kind: 'env',
304
+ required: false,
305
+ citations: [citation(file.relativePath, name, 'Environment variable is read by source code.')],
306
+ });
307
+ }
308
+ }
309
+ return contracts;
310
+ }
311
+ function buildReadFirst(entrypoints, boundaries, graph, maxItems) {
312
+ const candidates = unique([
313
+ ...entrypoints.map((entry) => entry.file),
314
+ ...boundaries.flatMap((boundary) => boundary.citations.map((cite) => cite.file)),
315
+ ...[...graph.files.values()]
316
+ .sort((a, b) => (b.exports.length + b.callSites.length) - (a.exports.length + a.callSites.length))
317
+ .map((file) => file.relativePath),
318
+ ]);
319
+ return candidates.slice(0, maxItems).map((file) => ({
320
+ file,
321
+ why: entrypoints.some((entry) => entry.file === file)
322
+ ? 'Start here because it is an entrypoint into the repo.'
323
+ : 'Read this early because graph evidence shows exports, calls, or package boundary value.',
324
+ command: `projscan file ${file} --format json`,
325
+ citations: [citation(file, undefined, 'Read-first recommendation is backed by graph or entrypoint evidence.')],
326
+ }));
327
+ }
328
+ async function buildRisks(rootPath, files, issues, graph, dataflowFiles, maxItems) {
329
+ const hotspots = await analyzeHotspots(rootPath, files, issues, { limit: maxItems, graph }).catch(() => null);
330
+ const fromHotspots = hotspots?.available
331
+ ? hotspots.hotspots.slice(0, maxItems).map((hotspot) => ({
332
+ id: `understand-hotspot-${slug(hotspot.relativePath)}`,
333
+ priority: hotspot.riskScore >= 70 ? 'p0' : hotspot.riskScore >= 30 ? 'p1' : 'p2',
334
+ title: `Hotspot ${hotspot.relativePath}`,
335
+ files: [hotspot.relativePath],
336
+ why: hotspot.reasons[0] ?? `Risk score ${Math.round(hotspot.riskScore)}`,
337
+ command: `projscan file ${hotspot.relativePath} --format json`,
338
+ }))
339
+ : [];
340
+ const fromDataflow = unique(dataflowFiles).slice(0, maxItems).map((file) => ({
341
+ id: `understand-dataflow-${slug(file)}`,
342
+ priority: 'p1',
343
+ title: `Review side effects in ${file}`,
344
+ files: [file],
345
+ why: 'Dataflow or side-effect evidence touches this file.',
346
+ command: 'projscan dataflow --format json',
347
+ }));
348
+ const fromIssues = issues.slice(0, maxItems).map((issue) => ({
349
+ id: `understand-issue-${issue.id}`,
350
+ priority: issue.severity === 'error' ? 'p0' : issue.severity === 'warning' ? 'p1' : 'p2',
351
+ title: issue.title,
352
+ files: issue.locations?.map((location) => location.file) ?? [],
353
+ why: issue.description,
354
+ command: `projscan explain-issue ${issue.id} --format json`,
355
+ }));
356
+ return uniqueBy([...fromDataflow, ...fromHotspots, ...fromIssues], (risk) => risk.id).slice(0, maxItems);
357
+ }
358
+ function buildChangeReadiness(intent, changedFiles, graph, verification) {
359
+ const focusFiles = changedFiles.length > 0 ? changedFiles : [...graph.files.keys()].slice(0, 1);
360
+ const blastRadius = focusFiles.map((file) => {
361
+ const importers = [...(graph.localImporters.get(file) ?? new Set())].sort();
362
+ return {
363
+ label: `Blast radius for ${file}`,
364
+ files: unique([file, ...importers]),
365
+ why: importers.length > 0
366
+ ? 'Local importers depend on this file and should be reviewed before editing.'
367
+ : 'No local importers were found; inspect the file contract and tests before editing.',
368
+ command: `projscan impact ${file} --format json`,
369
+ };
370
+ });
371
+ const firstFile = focusFiles[0] ?? '.';
372
+ return {
373
+ intent: intent ?? 'understand the next safe change',
374
+ blastRadius,
375
+ safeEdit: {
376
+ title: `Inspect ${firstFile} before editing`,
377
+ files: [firstFile],
378
+ command: `projscan file ${firstFile} --format json`,
379
+ why: 'Start with the smallest cited file that matches the intended change, then follow importers before editing.',
380
+ },
381
+ owners: [
382
+ {
383
+ owner: 'unassigned',
384
+ files: focusFiles,
385
+ reason: 'No CODEOWNERS lookup is required for this local understand report; add ownership metadata to improve routing.',
386
+ },
387
+ ],
388
+ rollback: {
389
+ command: focusFiles.length > 0 ? `git restore ${focusFiles.join(' ')}` : 'git restore .',
390
+ why: 'Keep a simple rollback command visible before making broad edits.',
391
+ },
392
+ verificationCommands: unique([
393
+ 'projscan understand --view verify --format json',
394
+ ...verification.tiers[0].commands,
395
+ ]),
396
+ };
397
+ }
398
+ function buildVerification(files, changedFiles, maxItems) {
399
+ const sourceFiles = unique(changedFiles.filter((file) => !isTestFile(file))).slice(0, maxItems);
400
+ const testFiles = files.filter((file) => isTestFile(file.relativePath));
401
+ const directTests = sourceFiles.map((file) => {
402
+ const base = path.basename(file).replace(/\.[^.]+$/, '');
403
+ const tests = testFiles
404
+ .map((entry) => entry.relativePath)
405
+ .filter((testFile) => testFile.toLowerCase().includes(base.toLowerCase()))
406
+ .slice(0, 5);
407
+ return {
408
+ file,
409
+ tests,
410
+ confidence: tests.length > 0 ? 'medium' : 'none',
411
+ };
412
+ });
413
+ const gaps = directTests
414
+ .filter((entry) => entry.tests.length === 0)
415
+ .map((entry) => ({
416
+ file: entry.file,
417
+ reason: 'No direct test file matched by filename.',
418
+ command: `projscan search ${path.basename(entry.file).replace(/\.[^.]+$/, '')} --format json`,
419
+ }));
420
+ return {
421
+ tiers: verificationTiers(),
422
+ directTests,
423
+ gaps,
424
+ };
425
+ }
426
+ function verificationTiers() {
427
+ return [
428
+ {
429
+ id: 'minimal',
430
+ label: 'Minimal local proof',
431
+ commands: ['projscan preflight --mode before_edit --format json', 'projscan understand --view change --format json'],
432
+ when: 'Before a small edit or exploratory agent pass.',
433
+ },
434
+ {
435
+ id: 'focused',
436
+ label: 'Focused change proof',
437
+ commands: ['projscan understand --view verify --format json', 'npm test'],
438
+ when: 'Before handing a meaningful code change to review.',
439
+ },
440
+ {
441
+ id: 'full',
442
+ label: 'Release-grade proof',
443
+ commands: ['npm run build', 'npm test', 'npm run lint', 'npm run check:stability'],
444
+ when: 'Before merge, release prep, or broad refactors.',
445
+ },
446
+ ];
447
+ }
448
+ function buildClaims(view, entrypoints, boundaries, flows, contracts, verification, readFirst) {
449
+ const claims = [
450
+ {
451
+ id: 'map-entrypoints',
452
+ title: 'Primary entrypoints are identifiable from package and graph evidence',
453
+ detail: `${entrypoints.length} entrypoint candidate(s) found.`,
454
+ confidence: entrypoints.length > 0 ? 'high' : 'low',
455
+ citations: entrypoints.flatMap((entry) => entry.citations).slice(0, 5),
456
+ },
457
+ {
458
+ id: 'map-boundaries',
459
+ title: 'Top module boundaries are visible from source directories',
460
+ detail: `${boundaries.length} boundary candidate(s) found.`,
461
+ confidence: boundaries.length > 0 ? 'medium' : 'low',
462
+ citations: boundaries.flatMap((boundary) => boundary.citations).slice(0, 5),
463
+ },
464
+ ];
465
+ if (view === 'flow' || flows.length > 0) {
466
+ claims.push({
467
+ id: 'flow-runtime-paths',
468
+ title: 'Runtime paths can be followed from entrypoints to side effects',
469
+ detail: `${flows.length} flow candidate(s) found.`,
470
+ confidence: flows.some((flow) => flow.sideEffects.length > 0) ? 'medium' : 'low',
471
+ citations: flows.flatMap((flow) => flow.citations).slice(0, 5),
472
+ });
473
+ }
474
+ if (view === 'contracts' || contracts.publicExports.length > 0) {
475
+ claims.push({
476
+ id: 'contracts-public-surface',
477
+ title: 'Public exports and config reads define the change contract',
478
+ detail: `${contracts.publicExports.length} export(s), ${contracts.configContracts.length} config contract(s).`,
479
+ confidence: contracts.publicExports.length > 0 || contracts.configContracts.length > 0 ? 'high' : 'low',
480
+ citations: [...contracts.publicExports, ...contracts.configContracts].flatMap((entry) => entry.citations).slice(0, 5),
481
+ });
482
+ }
483
+ if (view === 'verify') {
484
+ claims.push({
485
+ id: 'verify-proof-tiers',
486
+ title: 'Verification can be staged by change size',
487
+ detail: `${verification.tiers.length} verification tier(s) available.`,
488
+ confidence: 'high',
489
+ citations: readFirst.slice(0, 1).flatMap((entry) => entry.citations),
490
+ });
491
+ }
492
+ return claims.filter((claim) => claim.citations.length > 0);
493
+ }
494
+ function buildUnknowns(view, graph, contracts, verification) {
495
+ const unknowns = [];
496
+ if (graph.files.size === 0) {
497
+ unknowns.push({
498
+ id: 'no-parseable-graph',
499
+ question: 'Which files define the runtime graph?',
500
+ whyUnknown: 'No parseable files were available to the graph builder.',
501
+ command: 'projscan doctor --format json',
502
+ });
503
+ }
504
+ if (contracts.configContracts.length === 0 && (view === 'contracts' || view === 'map')) {
505
+ unknowns.push({
506
+ id: 'config-contracts-unknown',
507
+ question: 'Which environment or config values are required?',
508
+ whyUnknown: 'No static process.env reads or config files were detected in the sampled source files.',
509
+ command: 'projscan search process.env --format json',
510
+ });
511
+ }
512
+ if (verification.gaps.length > 0 && (view === 'verify' || view === 'change')) {
513
+ unknowns.push({
514
+ id: 'direct-tests-missing',
515
+ question: 'Which tests prove the touched source files?',
516
+ whyUnknown: 'At least one source file has no direct filename-matched test.',
517
+ command: 'projscan understand --view verify --format json',
518
+ });
519
+ }
520
+ return unknowns;
521
+ }
522
+ function commandsForView(view) {
523
+ return unique([
524
+ `projscan understand --view ${view} --format json`,
525
+ 'projscan start --mode before_edit --format json',
526
+ 'projscan preflight --mode before_edit --format json',
527
+ view === 'change' ? 'projscan understand --view verify --format json' : undefined,
528
+ ].filter((command) => Boolean(command)));
529
+ }
530
+ function summarize(view, entrypointCount, boundaryCount, flowCount, contractCount) {
531
+ if (view === 'flow')
532
+ return `flow map: ${flowCount} runtime path(s), ${entrypointCount} entrypoint(s)`;
533
+ if (view === 'contracts')
534
+ return `contract map: ${contractCount} public contract(s), ${boundaryCount} boundary candidate(s)`;
535
+ if (view === 'change')
536
+ return `change readiness: ${entrypointCount} entrypoint(s), ${boundaryCount} boundary candidate(s)`;
537
+ if (view === 'verify')
538
+ return `verification map: proof tiers and direct-test gaps for likely touched files`;
539
+ return `repo map: ${entrypointCount} entrypoint(s), ${boundaryCount} boundary candidate(s)`;
540
+ }
541
+ function citation(file, symbol, reason) {
542
+ return {
543
+ file,
544
+ ...(symbol ? { symbol } : {}),
545
+ reason,
546
+ };
547
+ }
548
+ function isTestFile(file) {
549
+ return TEST_PATTERNS.some((pattern) => pattern.test(file));
550
+ }
551
+ function unique(values) {
552
+ return [...new Set(values.filter(Boolean))];
553
+ }
554
+ function uniqueBy(values, keyFn) {
555
+ const seen = new Set();
556
+ return values.filter((value) => {
557
+ const key = keyFn(value);
558
+ if (seen.has(key))
559
+ return false;
560
+ seen.add(key);
561
+ return true;
562
+ });
563
+ }
564
+ function slug(value) {
565
+ return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-|-$/g, '') || 'item';
566
+ }
567
+ //# sourceMappingURL=understand.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"understand.js","sourceRoot":"","sources":["../../src/core/understand.ts"],"names":[],"mappings":"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"}