audit-tools 0.50.13 → 0.50.15

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 (103) hide show
  1. package/dist/audit/cli/nextStepHelpers.js +1 -1
  2. package/dist/audit/cli/nextStepHelpers.js.map +1 -1
  3. package/dist/audit/cli/prompts.js +3 -3
  4. package/dist/audit/cli/reviewRun.js +1 -1
  5. package/dist/audit/cli/reviewRun.js.map +1 -1
  6. package/dist/audit/cli.d.ts.map +1 -1
  7. package/dist/audit/cli.js +6 -1
  8. package/dist/audit/cli.js.map +1 -1
  9. package/dist/audit/orchestrator/ingestionExecutors.js +1 -1
  10. package/dist/audit/orchestrator/ingestionExecutors.js.map +1 -1
  11. package/dist/audit/reporting/mergeFindings.js +1 -1
  12. package/dist/audit/reporting/mergeFindings.js.map +1 -1
  13. package/dist/audit/reporting/workBlocks.js +1 -1
  14. package/dist/audit/reporting/workBlocks.js.map +1 -1
  15. package/dist/remediate/steps/nextStep.js +1 -1
  16. package/dist/remediate/steps/nextStep.js.map +1 -1
  17. package/dist/shared/loopCorePaths.d.ts.map +1 -1
  18. package/dist/shared/loopCorePaths.js +0 -1
  19. package/dist/shared/loopCorePaths.js.map +1 -1
  20. package/dist/shared/tooling/allowlistedExec.d.ts +4 -4
  21. package/dist/shared/tooling/allowlistedExec.js +7 -7
  22. package/package.json +5 -5
  23. package/wrapper/audit-code-wrapper-lib.mjs +5 -2
  24. package/dist/audit/adapters/astGrep.d.ts +0 -30
  25. package/dist/audit/adapters/astGrep.d.ts.map +0 -1
  26. package/dist/audit/adapters/astGrep.js +0 -46
  27. package/dist/audit/adapters/astGrep.js.map +0 -1
  28. package/dist/audit/adapters/codeql.d.ts +0 -47
  29. package/dist/audit/adapters/codeql.d.ts.map +0 -1
  30. package/dist/audit/adapters/codeql.js +0 -52
  31. package/dist/audit/adapters/codeql.js.map +0 -1
  32. package/dist/audit/adapters/coverageSummary.d.ts +0 -9
  33. package/dist/audit/adapters/coverageSummary.d.ts.map +0 -1
  34. package/dist/audit/adapters/coverageSummary.js +0 -18
  35. package/dist/audit/adapters/coverageSummary.js.map +0 -1
  36. package/dist/audit/adapters/eslint.d.ts +0 -14
  37. package/dist/audit/adapters/eslint.d.ts.map +0 -1
  38. package/dist/audit/adapters/eslint.js +0 -28
  39. package/dist/audit/adapters/eslint.js.map +0 -1
  40. package/dist/audit/adapters/npmAudit.d.ts +0 -16
  41. package/dist/audit/adapters/npmAudit.d.ts.map +0 -1
  42. package/dist/audit/adapters/npmAudit.js +0 -24
  43. package/dist/audit/adapters/npmAudit.js.map +0 -1
  44. package/dist/audit/adapters/semgrep.d.ts +0 -42
  45. package/dist/audit/adapters/semgrep.d.ts.map +0 -1
  46. package/dist/audit/adapters/semgrep.js +0 -93
  47. package/dist/audit/adapters/semgrep.js.map +0 -1
  48. package/dist/audit/cli/dispatch.d.ts +0 -10
  49. package/dist/audit/cli/dispatch.d.ts.map +0 -1
  50. package/dist/audit/cli/dispatch.js +0 -10
  51. package/dist/audit/cli/dispatch.js.map +0 -1
  52. package/dist/audit/cli/paths.d.ts +0 -2
  53. package/dist/audit/cli/paths.d.ts.map +0 -1
  54. package/dist/audit/cli/paths.js +0 -10
  55. package/dist/audit/cli/paths.js.map +0 -1
  56. package/dist/audit/orchestrator/chunking.d.ts +0 -6
  57. package/dist/audit/orchestrator/chunking.d.ts.map +0 -1
  58. package/dist/audit/orchestrator/chunking.js +0 -14
  59. package/dist/audit/orchestrator/chunking.js.map +0 -1
  60. package/dist/audit/orchestrator/continuityScore.d.ts +0 -2
  61. package/dist/audit/orchestrator/continuityScore.d.ts.map +0 -1
  62. package/dist/audit/orchestrator/continuityScore.js +0 -9
  63. package/dist/audit/orchestrator/continuityScore.js.map +0 -1
  64. package/dist/audit/orchestrator/fileAnchors.d.ts +0 -69
  65. package/dist/audit/orchestrator/fileAnchors.d.ts.map +0 -1
  66. package/dist/audit/orchestrator/fileAnchors.js +0 -314
  67. package/dist/audit/orchestrator/fileAnchors.js.map +0 -1
  68. package/dist/audit/orchestrator/knipGraphCrosscheck.d.ts +0 -65
  69. package/dist/audit/orchestrator/knipGraphCrosscheck.d.ts.map +0 -1
  70. package/dist/audit/orchestrator/knipGraphCrosscheck.js +0 -85
  71. package/dist/audit/orchestrator/knipGraphCrosscheck.js.map +0 -1
  72. package/dist/audit/orchestrator/selectiveDeepening.d.ts +0 -3
  73. package/dist/audit/orchestrator/selectiveDeepening.d.ts.map +0 -1
  74. package/dist/audit/orchestrator/selectiveDeepening.js +0 -7
  75. package/dist/audit/orchestrator/selectiveDeepening.js.map +0 -1
  76. package/dist/audit/orchestrator.d.ts +0 -7
  77. package/dist/audit/orchestrator.d.ts.map +0 -1
  78. package/dist/audit/orchestrator.js +0 -60
  79. package/dist/audit/orchestrator.js.map +0 -1
  80. package/dist/audit/reporting/findingRanks.d.ts +0 -2
  81. package/dist/audit/reporting/findingRanks.d.ts.map +0 -1
  82. package/dist/audit/reporting/findingRanks.js +0 -7
  83. package/dist/audit/reporting/findingRanks.js.map +0 -1
  84. package/dist/audit/types/workerResult.d.ts +0 -14
  85. package/dist/audit/types/workerResult.d.ts.map +0 -1
  86. package/dist/audit/types/workerResult.js +0 -2
  87. package/dist/audit/types/workerResult.js.map +0 -1
  88. package/dist/audit/validation/anchorGrounding.d.ts +0 -59
  89. package/dist/audit/validation/anchorGrounding.d.ts.map +0 -1
  90. package/dist/audit/validation/anchorGrounding.js +0 -187
  91. package/dist/audit/validation/anchorGrounding.js.map +0 -1
  92. package/dist/audit/validation/quoteGrounding.d.ts +0 -18
  93. package/dist/audit/validation/quoteGrounding.d.ts.map +0 -1
  94. package/dist/audit/validation/quoteGrounding.js +0 -18
  95. package/dist/audit/validation/quoteGrounding.js.map +0 -1
  96. package/dist/remediate/state/accessMemory.d.ts +0 -53
  97. package/dist/remediate/state/accessMemory.d.ts.map +0 -1
  98. package/dist/remediate/state/accessMemory.js +0 -105
  99. package/dist/remediate/state/accessMemory.js.map +0 -1
  100. package/dist/remediate/steps/dispatch.d.ts +0 -4
  101. package/dist/remediate/steps/dispatch.d.ts.map +0 -1
  102. package/dist/remediate/steps/dispatch.js +0 -12
  103. package/dist/remediate/steps/dispatch.js.map +0 -1
@@ -1,69 +0,0 @@
1
- import type { ExternalAnalyzerResults, AnalyzerLeadProvenance } from "audit-tools/shared";
2
- import type { GraphBundle } from "audit-tools/shared";
3
- export type FileAnchorKind = "boundary" | "import" | "export" | "symbol" | "route" | "keyword" | "graph" | "analyzer_signal";
4
- export interface FileAnchor {
5
- kind: FileAnchorKind;
6
- name: string;
7
- line?: number;
8
- /**
9
- * Approximate END line of a `symbol`-kind anchor's body (increment 2d,
10
- * `path::symbol` slicing). Computed deterministically as the line before the
11
- * next top-level declaration boundary (`symbol`/`route` start), clamped to the
12
- * file's line count — a lightweight, language-neutral, brace-agnostic extent
13
- * (no nesting awareness). Advisory ONLY: it seeds a targeted symbol-span read
14
- * so a worker need not re-read a whole god-file, but the worker always
15
- * fail-safes to reading more when evidence crosses the span. Present only on
16
- * `symbol` anchors that have a `line`; absent everywhere else.
17
- */
18
- end_line?: number;
19
- detail?: string;
20
- /**
21
- * Content-anchored lead identity (item C), present only on `analyzer_signal`
22
- * anchors whose source signal carried one. Rendered into the packet prompt so
23
- * the worker can copy it verbatim into `analyzer_provenance` on a finding
24
- * born from this lead.
25
- */
26
- provenance?: AnalyzerLeadProvenance;
27
- }
28
- export interface FileAnchorSummary {
29
- contract_version: "audit-code-file-anchors/v1alpha1";
30
- path: string;
31
- total_lines: number;
32
- review_mode: "isolated_large_file";
33
- scope_basis: string[];
34
- anchors: FileAnchor[];
35
- omitted_anchor_count: number;
36
- counts: {
37
- symbols: number;
38
- routes: number;
39
- keywords: number;
40
- graph_edges: number;
41
- analyzer_signals: number;
42
- };
43
- }
44
- /**
45
- * Path-keyed index of external-analyzer signal anchors (rule/line/summary),
46
- * built ONCE per dispatch from the whole `externalAnalyzerResults` set so
47
- * per-task/per-file prompt rendering is an O(1) map read rather than an
48
- * O(tasks × files × total-results) re-flatten. Key = normalized lowercased
49
- * path; each bucket is pre-sorted by (line_start, id), matching the original
50
- * per-path ordering. See {@link analyzerSignalAnchorsForPath} for the reader.
51
- */
52
- export type AnalyzerSignalAnchorIndex = Map<string, FileAnchor[]>;
53
- export declare function buildAnalyzerSignalAnchorIndex(externalAnalyzerResults: ExternalAnalyzerResults[] | undefined): AnalyzerSignalAnchorIndex;
54
- /**
55
- * External-analyzer signal anchors (rule/line/summary) for one path — an O(1)
56
- * read of the pre-built {@link AnalyzerSignalAnchorIndex}. Split out of
57
- * {@link buildFileAnchorSummary} so packet-level prompt rendering (any
58
- * multi-file packet, not just isolated-large-file mode) can surface the same
59
- * grounded lead detail without paying for whole-file content scanning.
60
- */
61
- export declare function analyzerSignalAnchorsForPath(path: string, index: AnalyzerSignalAnchorIndex | undefined): FileAnchor[];
62
- export declare function buildFileAnchorSummary(params: {
63
- path: string;
64
- content: string;
65
- totalLines: number;
66
- graphBundle?: GraphBundle;
67
- externalAnalyzerResults?: ExternalAnalyzerResults[];
68
- }): FileAnchorSummary;
69
- //# sourceMappingURL=fileAnchors.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fileAnchors.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/fileAnchors.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,uBAAuB,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC1F,OAAO,KAAK,EAAE,WAAW,EAAa,MAAM,oBAAoB,CAAC;AAGjE,MAAM,MAAM,cAAc,GACtB,UAAU,GACV,QAAQ,GACR,QAAQ,GACR,QAAQ,GACR,OAAO,GACP,SAAS,GACT,OAAO,GACP,iBAAiB,CAAC;AAEtB,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,cAAc,CAAC;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;;;OASG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,sBAAsB,CAAC;CACrC;AAED,MAAM,WAAW,iBAAiB;IAChC,gBAAgB,EAAE,kCAAkC,CAAC;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,qBAAqB,CAAC;IACnC,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,OAAO,EAAE,UAAU,EAAE,CAAC;IACtB,oBAAoB,EAAE,MAAM,CAAC;IAC7B,MAAM,EAAE;QACN,OAAO,EAAE,MAAM,CAAC;QAChB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAuGD;;;;;;;GAOG;AACH,MAAM,MAAM,yBAAyB,GAAG,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;AAElE,wBAAgB,8BAA8B,CAC5C,uBAAuB,EAAE,uBAAuB,EAAE,GAAG,SAAS,GAC7D,yBAAyB,CAkC3B;AAED;;;;;;GAMG;AACH,wBAAgB,4BAA4B,CAC1C,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,yBAAyB,GAAG,SAAS,GAC3C,UAAU,EAAE,CAEd;AAyHD,wBAAgB,sBAAsB,CAAC,MAAM,EAAE;IAC7C,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,uBAAuB,CAAC,EAAE,uBAAuB,EAAE,CAAC;CACrD,GAAG,iBAAiB,CA8FpB"}
@@ -1,314 +0,0 @@
1
- import { normalizeRepoRelPath, compareCodeUnits } from "audit-tools/shared";
2
- /**
3
- * Graph buckets in `graph_bundle.json` that carry file-to-file edges relevant to
4
- * large-file anchoring. Named here (rather than inlined as bare strings in the
5
- * collection loop) so the set of scanned buckets is a single typed source of
6
- * truth and each bucket key doubles as a typed fallback edge `kind`. `as const`
7
- * narrows the element type from `string` to the literal union.
8
- */
9
- const GRAPH_EDGE_BUCKETS = ["imports", "calls", "references"];
10
- const MAX_ANCHORS = 160;
11
- // Keywords that signal elevated-risk or review-worthy lines, grouped by concern:
12
- // auth/access: auth, password, permission, role, secret, token
13
- // injection/execution: deserialize, eval, exec, query, spawn, sql
14
- // crypto: decrypt, encrypt
15
- // concurrency/reliability: cache, lock, race, retry, timeout, transaction
16
- // debt markers: FIXME, TODO
17
- const KEYWORD_PATTERN = /\b(auth|password|permission|role|secret|token|deserialize|eval|exec|query|spawn|sql|decrypt|encrypt|cache|lock|race|retry|timeout|transaction|FIXME|TODO)\b/i;
18
- const SYMBOL_PATTERNS = [
19
- {
20
- kind: "import",
21
- pattern: /^\s*import\s+(?:type\s+)?(?:[^"'()]*?\s+from\s+)?["']([^"']+)["']/,
22
- label: "import",
23
- },
24
- {
25
- kind: "symbol",
26
- pattern: /^\s*(?:export\s+)?(?:async\s+)?function\s+([A-Za-z_$][\w$]*)\b/,
27
- label: "function",
28
- },
29
- {
30
- kind: "symbol",
31
- pattern: /^\s*(?:export\s+)?class\s+([A-Za-z_$][\w$]*)\b/,
32
- label: "class",
33
- },
34
- {
35
- kind: "symbol",
36
- pattern: /^\s*(?:export\s+)?interface\s+([A-Za-z_$][\w$]*)\b/,
37
- label: "interface",
38
- },
39
- {
40
- kind: "symbol",
41
- pattern: /^\s*(?:export\s+)?type\s+([A-Za-z_$][\w$]*)\b/,
42
- label: "type",
43
- },
44
- {
45
- kind: "symbol",
46
- pattern: /^\s*(?:export\s+)?(?:const|let|var)\s+([A-Za-z_$][\w$]*)\b/,
47
- label: "binding",
48
- },
49
- {
50
- kind: "export",
51
- pattern: /^\s*export\s+(?:type\s+)?(?:[^"'()]*?\s+from\s+["']([^"']+)["']|(?:default\s+)?(?:async\s+)?(?:function|class|const|let|var|interface|type)\s+([A-Za-z_$][\w$-]*))/,
52
- label: "export",
53
- },
54
- {
55
- kind: "symbol",
56
- pattern: /^\s*(?:export\s+)?def\s+([A-Za-z_][\w]*)\b/,
57
- label: "function",
58
- },
59
- {
60
- kind: "symbol",
61
- pattern: /^\s*(?:export\s+)?func\s+(?:\([^)]+\)\s*)?([A-Za-z_][\w]*)\b/,
62
- label: "function",
63
- },
64
- {
65
- kind: "symbol",
66
- pattern: /^\s*(?:pub\s+)?fn\s+([A-Za-z_][\w]*)\b/,
67
- label: "function",
68
- },
69
- {
70
- kind: "route",
71
- pattern: /\b(?:app|router|server)\s*\.\s*(get|post|put|patch|delete|use)\s*\(/i,
72
- label: "route",
73
- },
74
- {
75
- kind: "route",
76
- pattern: /^\s*@(?:Get|Post|Put|Patch|Delete|Route|Controller)\b/,
77
- label: "route",
78
- },
79
- ];
80
- function truncate(value, maxLength) {
81
- const normalized = value.replace(/\s+/g, " ").trim();
82
- return normalized.length > maxLength
83
- ? `${normalized.slice(0, maxLength - 3)}...`
84
- : normalized;
85
- }
86
- function addAnchor(anchors, seen, anchor) {
87
- const key = `${anchor.kind}\0${anchor.line ?? ""}\0${anchor.name}\0${anchor.detail ?? ""}`;
88
- if (seen.has(key)) {
89
- return;
90
- }
91
- seen.add(key);
92
- anchors.push(anchor);
93
- }
94
- export function buildAnalyzerSignalAnchorIndex(externalAnalyzerResults) {
95
- // Group raw signals by path first so the (line_start, id) sort — and thus the
96
- // rendered order — is byte-identical to the pre-index per-path extraction.
97
- const grouped = new Map();
98
- for (const tool of externalAnalyzerResults ?? []) {
99
- for (const result of tool.results ?? []) {
100
- const key = normalizeRepoRelPath(result.path).toLowerCase();
101
- const bucket = grouped.get(key);
102
- if (bucket) {
103
- bucket.push(result);
104
- }
105
- else {
106
- grouped.set(key, [result]);
107
- }
108
- }
109
- }
110
- const index = new Map();
111
- for (const [key, results] of grouped) {
112
- results.sort((a, b) => (a.line_start ?? 0) - (b.line_start ?? 0) ||
113
- compareCodeUnits(a.id, b.id));
114
- index.set(key, results.map((signal) => ({
115
- kind: "analyzer_signal",
116
- name: truncate(signal.rule ?? signal.category, 80),
117
- line: signal.line_start,
118
- detail: truncate(signal.summary, 180),
119
- ...(signal.provenance !== undefined ? { provenance: signal.provenance } : {}),
120
- })));
121
- }
122
- return index;
123
- }
124
- /**
125
- * External-analyzer signal anchors (rule/line/summary) for one path — an O(1)
126
- * read of the pre-built {@link AnalyzerSignalAnchorIndex}. Split out of
127
- * {@link buildFileAnchorSummary} so packet-level prompt rendering (any
128
- * multi-file packet, not just isolated-large-file mode) can surface the same
129
- * grounded lead detail without paying for whole-file content scanning.
130
- */
131
- export function analyzerSignalAnchorsForPath(path, index) {
132
- return index?.get(normalizeRepoRelPath(path).toLowerCase()) ?? [];
133
- }
134
- function collectGraphEdges(graphBundle, path) {
135
- if (!graphBundle?.graphs) {
136
- return [];
137
- }
138
- const normalizedPath = normalizeRepoRelPath(path).toLowerCase();
139
- const edges = [];
140
- // Typed as `string` (not the literal union) so the lookup resolves through the
141
- // `[key: string]: unknown` index signature on `graphs` — the loop body then
142
- // re-validates each entry's shape, matching the original deterministic parse.
143
- for (const bucket of GRAPH_EDGE_BUCKETS) {
144
- const raw = graphBundle.graphs[bucket];
145
- if (!Array.isArray(raw)) {
146
- continue;
147
- }
148
- for (const item of raw) {
149
- const record = item;
150
- if (item &&
151
- typeof item === "object" &&
152
- !Array.isArray(item) &&
153
- typeof record.from === "string" &&
154
- typeof record.to === "string") {
155
- const from = normalizeRepoRelPath(record.from).toLowerCase();
156
- const to = normalizeRepoRelPath(record.to).toLowerCase();
157
- if (from === normalizedPath || to === normalizedPath) {
158
- edges.push({
159
- from: record.from,
160
- to: record.to,
161
- kind: typeof record.kind === "string" ? record.kind : bucket,
162
- });
163
- }
164
- }
165
- }
166
- }
167
- return edges.sort((a, b) => compareCodeUnits(a.kind ?? "", b.kind ?? "") ||
168
- compareCodeUnits(a.from, b.from) ||
169
- compareCodeUnits(a.to, b.to));
170
- }
171
- /**
172
- * Assigns an approximate `end_line` span to each TOP-LEVEL `symbol`-kind anchor
173
- * (increment 2d, `path::symbol` slicing). A top-level declaration's body runs
174
- * from its line to the line before the NEXT top-level declaration, or to the
175
- * file end for the last one. Only top-level (zero-indentation) declarations are
176
- * boundaries and slice targets — a NESTED binding (an indented `const`/`let`
177
- * the flat regex scanner also matches as a `symbol`) must NOT fragment the
178
- * enclosing function/class span, and is not itself a useful slice, so it gets no
179
- * span. `topLevelDeclLines` is the ascending set of zero-indent symbol/route
180
- * declaration lines gathered during the content scan.
181
- *
182
- * This is a deterministic, content-derived, brace-agnostic heuristic (no nesting
183
- * awareness) — advisory guidance the worker fail-safes past, never a hard read
184
- * boundary. Mutates the anchors in place; must run on the fully line-sorted list
185
- * BEFORE the MAX_ANCHORS cap so a surviving anchor's span is independent of the
186
- * cap.
187
- */
188
- function assignSymbolSpans(sorted, totalLines, topLevelDeclLines) {
189
- const topLevelSet = new Set(topLevelDeclLines);
190
- // Ascending — a linear scan finds the first boundary strictly after a line.
191
- const boundaries = [...topLevelDeclLines].sort((a, b) => a - b);
192
- for (const anchor of sorted) {
193
- if (anchor.kind !== "symbol" || !anchor.line || !topLevelSet.has(anchor.line)) {
194
- continue;
195
- }
196
- const nextBoundary = boundaries.find((line) => line > anchor.line);
197
- const end = nextBoundary !== undefined ? nextBoundary - 1 : totalLines;
198
- anchor.end_line = Math.max(anchor.line, Math.min(end, totalLines));
199
- }
200
- }
201
- function scanSymbol(line, lineNumber, anchors, seen) {
202
- for (const { kind, pattern, label } of SYMBOL_PATTERNS) {
203
- const match = line.match(pattern);
204
- if (!match) {
205
- continue;
206
- }
207
- const name = match.slice(1).find((value) => value && value.trim().length > 0) ?? label;
208
- addAnchor(anchors, seen, {
209
- kind,
210
- name: truncate(name, 80),
211
- line: lineNumber,
212
- detail: truncate(`${label}: ${line}`, 180),
213
- });
214
- return kind;
215
- }
216
- return null;
217
- }
218
- function scanKeyword(line, lineNumber, anchors, seen) {
219
- if (!KEYWORD_PATTERN.test(line)) {
220
- return false;
221
- }
222
- addAnchor(anchors, seen, {
223
- kind: "keyword",
224
- name: truncate(line.match(KEYWORD_PATTERN)?.[1] ?? "keyword", 80),
225
- line: lineNumber,
226
- detail: truncate(line, 180),
227
- });
228
- return true;
229
- }
230
- export function buildFileAnchorSummary(params) {
231
- const anchors = [];
232
- const seen = new Set();
233
- const path = normalizeRepoRelPath(params.path);
234
- const lines = params.content.split(/\r?\n/);
235
- let symbolCount = 0;
236
- let routeCount = 0;
237
- let keywordCount = 0;
238
- // Zero-indent symbol/route declaration lines — the top-level boundaries that
239
- // bound per-symbol slice spans (see assignSymbolSpans). A nested (indented)
240
- // binding the flat scanner also matches is deliberately excluded so it neither
241
- // fragments an enclosing span nor becomes a spurious slice target.
242
- const topLevelDeclLines = [];
243
- addAnchor(anchors, seen, {
244
- kind: "boundary",
245
- name: "file_start",
246
- line: 1,
247
- detail: "Start of isolated large-file review boundary.",
248
- });
249
- if (params.totalLines > 1) {
250
- addAnchor(anchors, seen, {
251
- kind: "boundary",
252
- name: "file_end",
253
- line: params.totalLines,
254
- detail: "End of isolated large-file review boundary.",
255
- });
256
- }
257
- lines.forEach((line, index) => {
258
- const lineNumber = index + 1;
259
- const symbolKind = scanSymbol(line, lineNumber, anchors, seen);
260
- if (symbolKind === "route")
261
- routeCount += 1;
262
- else if (symbolKind === "symbol")
263
- symbolCount += 1;
264
- // A zero-indent symbol/route declaration is a top-level slice boundary.
265
- if ((symbolKind === "symbol" || symbolKind === "route") && /^\S/.test(line)) {
266
- topLevelDeclLines.push(lineNumber);
267
- }
268
- if (scanKeyword(line, lineNumber, anchors, seen))
269
- keywordCount += 1;
270
- });
271
- const graphEdges = collectGraphEdges(params.graphBundle, path);
272
- for (const edge of graphEdges) {
273
- addAnchor(anchors, seen, {
274
- kind: "graph",
275
- name: edge.kind ?? "edge",
276
- detail: normalizeRepoRelPath(edge.from).toLowerCase() === path.toLowerCase()
277
- ? `outbound: ${edge.to}`
278
- : `inbound: ${edge.from}`,
279
- });
280
- }
281
- const analyzerSignals = analyzerSignalAnchorsForPath(path, buildAnalyzerSignalAnchorIndex(params.externalAnalyzerResults));
282
- for (const signal of analyzerSignals) {
283
- addAnchor(anchors, seen, signal);
284
- }
285
- const sorted = anchors.sort((a, b) => (a.line ?? Number.MAX_SAFE_INTEGER) - (b.line ?? Number.MAX_SAFE_INTEGER) ||
286
- compareCodeUnits(a.kind, b.kind) ||
287
- compareCodeUnits(a.name, b.name));
288
- // Seed per-symbol spans on the full sorted list (before the cap) so a
289
- // surviving anchor's span never depends on which anchors the cap dropped.
290
- assignSymbolSpans(sorted, params.totalLines, topLevelDeclLines);
291
- const boundedAnchors = sorted.slice(0, MAX_ANCHORS);
292
- return {
293
- contract_version: "audit-code-file-anchors/v1alpha1",
294
- path,
295
- total_lines: params.totalLines,
296
- review_mode: "isolated_large_file",
297
- scope_basis: [
298
- "single assigned file",
299
- "single review packet",
300
- "mechanically extracted symbols, routes, graph edges, keywords, and analyzer signals",
301
- "host-owned bound result artifact",
302
- ],
303
- anchors: boundedAnchors,
304
- omitted_anchor_count: Math.max(0, sorted.length - boundedAnchors.length),
305
- counts: {
306
- symbols: symbolCount,
307
- routes: routeCount,
308
- keywords: keywordCount,
309
- graph_edges: graphEdges.length,
310
- analyzer_signals: analyzerSignals.length,
311
- },
312
- };
313
- }
314
- //# sourceMappingURL=fileAnchors.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"fileAnchors.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/fileAnchors.ts"],"names":[],"mappings":"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"}
@@ -1,65 +0,0 @@
1
- import type { GraphBundle, SurfaceManifest, CriticalFlowManifest } from "audit-tools/shared";
2
- /**
3
- * Render-time knip↔graph cross-check tag for a single knip "unused export" lead.
4
- *
5
- * - `LIKELY-DEAD` — the lead file has normalized in-degree 0, is NOT a known
6
- * entrypoint, AND its own language analyzer actually ran
7
- * (present in `graph_bundle.analyzers_used`). Only then is a
8
- * zero-in-degree verdict trustworthy for this file.
9
- * - `HAS-IMPORTERS` — the lead file has normalized in-degree > 0 (something
10
- * imports it) → refutes "dead".
11
- * - `ENTRYPOINT` — in-degree 0 but the file is a surface/critical-flow
12
- * entrypoint → reachable by definition, not dead.
13
- * - `UNVERIFIED` — `analyzers_used` is empty OR the lead's language analyzer
14
- * is absent from it → per-file graph fidelity is unknown, so
15
- * the graph cannot confirm or refute deadness.
16
- */
17
- export type KnipGraphTag = "LIKELY-DEAD" | "HAS-IMPORTERS" | "UNVERIFIED" | "ENTRYPOINT";
18
- /**
19
- * A pre-derived, normalized index over one {@link GraphBundle} +
20
- * surface/critical-flow entrypoints, ready for O(1) lookups per lead.
21
- *
22
- * CE-001: `deriveGraphSignals` keys fanIn by the RAW `edge.to`, so a
23
- * Windows-backslash / mixed-case graph node id (`src\\Foo.ts`) never matches a
24
- * POSIX-normalized knip lead path (`src/Foo.ts`). This index re-keys EVERY node
25
- * (both `from` and `to` endpoints) and every entrypoint through
26
- * `normalizeNodeKey` (POSIX separators, `./` stripped, lower-cased) so the lead
27
- * path — normalized the same way — matches regardless of separator or case.
28
- */
29
- export interface KnipGraphIndex {
30
- /** Normalized node id → incoming edge count over the structural edge set. */
31
- inDegree: Map<string, number>;
32
- /** Normalized entrypoint paths from surface_manifest + critical_flows. */
33
- entrypoints: Set<string>;
34
- /** Analyzer ids that actually ran (from graph_bundle.analyzers_used). */
35
- analyzersUsed: Set<string>;
36
- }
37
- /**
38
- * Normalize a graph node id / path / entrypoint to one comparable key:
39
- * backslashes → forward slashes, leading `./` stripped, lower-cased. Single
40
- * source so the index and every lookup key agree (CE-001).
41
- */
42
- export declare function normalizeNodeKey(path: string): string;
43
- /**
44
- * Map a lead file's extension to the id of the language analyzer that owns it
45
- * (CE-003). Reuses the analyzer registry's own `supports(file)` predicate
46
- * so extension→analyzer stays single-sourced in the analyzers, not duplicated.
47
- * Returns null when no registered analyzer claims the file.
48
- */
49
- export declare function analyzerIdForFile(path: string): string | null;
50
- /**
51
- * Build the normalized cross-check index from the three artifacts. Degrades to
52
- * empty (never throws) on any missing/malformed input — an absent bundle yields
53
- * an empty index whose every lead classifies UNVERIFIED.
54
- */
55
- export declare function buildKnipGraphIndex(params: {
56
- graphBundle?: GraphBundle;
57
- surfaceManifest?: SurfaceManifest;
58
- criticalFlows?: CriticalFlowManifest;
59
- }): KnipGraphIndex;
60
- /**
61
- * Classify one knip lead path against the pre-built index. Pure: no IO, no
62
- * mutation. See {@link KnipGraphTag} for the decision table.
63
- */
64
- export declare function classifyKnipLead(leadPath: string, index: KnipGraphIndex): KnipGraphTag;
65
- //# sourceMappingURL=knipGraphCrosscheck.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knipGraphCrosscheck.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/knipGraphCrosscheck.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,WAAW,EACX,eAAe,EACf,oBAAoB,EACrB,MAAM,oBAAoB,CAAC;AAI5B;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,YAAY,GACpB,aAAa,GACb,eAAe,GACf,YAAY,GACZ,YAAY,CAAC;AAEjB;;;;;;;;;;GAUG;AACH,MAAM,WAAW,cAAc;IAC7B,6EAA6E;IAC7E,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC9B,0EAA0E;IAC1E,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACzB,yEAAyE;IACzE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAK7D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE;IAC1C,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,eAAe,CAAC,EAAE,eAAe,CAAC;IAClC,aAAa,CAAC,EAAE,oBAAoB,CAAC;CACtC,GAAG,cAAc,CAoCjB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,cAAc,GACpB,YAAY,CAkBd"}
@@ -1,85 +0,0 @@
1
- import { allGraphEdges } from "../extractors/graphSignals.js";
2
- import { ANALYZER_REGISTRY } from "../extractors/analyzers/registry.js";
3
- /**
4
- * Normalize a graph node id / path / entrypoint to one comparable key:
5
- * backslashes → forward slashes, leading `./` stripped, lower-cased. Single
6
- * source so the index and every lookup key agree (CE-001).
7
- */
8
- export function normalizeNodeKey(path) {
9
- return path.replace(/\\/g, "/").replace(/^\.\//, "").toLowerCase();
10
- }
11
- /**
12
- * Map a lead file's extension to the id of the language analyzer that owns it
13
- * (CE-003). Reuses the analyzer registry's own `supports(file)` predicate
14
- * so extension→analyzer stays single-sourced in the analyzers, not duplicated.
15
- * Returns null when no registered analyzer claims the file.
16
- */
17
- export function analyzerIdForFile(path) {
18
- for (const analyzer of ANALYZER_REGISTRY) {
19
- if (analyzer.supports(path))
20
- return analyzer.id;
21
- }
22
- return null;
23
- }
24
- /**
25
- * Build the normalized cross-check index from the three artifacts. Degrades to
26
- * empty (never throws) on any missing/malformed input — an absent bundle yields
27
- * an empty index whose every lead classifies UNVERIFIED.
28
- */
29
- export function buildKnipGraphIndex(params) {
30
- const inDegree = new Map();
31
- const entrypoints = new Set();
32
- const analyzersUsed = new Set();
33
- const { graphBundle, surfaceManifest, criticalFlows } = params;
34
- if (graphBundle?.graphs) {
35
- for (const edge of allGraphEdges(graphBundle)) {
36
- const to = normalizeNodeKey(edge.to);
37
- inDegree.set(to, (inDegree.get(to) ?? 0) + 1);
38
- // Ensure `from`-only nodes are still known (in-degree 0), so a lead that
39
- // appears only as an edge source is treated as present-but-uncited, not
40
- // absent. Lookups default missing keys to 0 anyway; recording the source
41
- // node keeps the index a faithful node set.
42
- const from = normalizeNodeKey(edge.from);
43
- if (!inDegree.has(from))
44
- inDegree.set(from, 0);
45
- }
46
- }
47
- for (const surface of surfaceManifest?.surfaces ?? []) {
48
- if (typeof surface.entrypoint === "string") {
49
- entrypoints.add(normalizeNodeKey(surface.entrypoint));
50
- }
51
- }
52
- for (const flow of criticalFlows?.flows ?? []) {
53
- for (const entry of flow.entrypoints ?? []) {
54
- if (typeof entry === "string")
55
- entrypoints.add(normalizeNodeKey(entry));
56
- }
57
- }
58
- for (const id of graphBundle?.analyzers_used ?? []) {
59
- if (typeof id === "string")
60
- analyzersUsed.add(id);
61
- }
62
- return { inDegree, entrypoints, analyzersUsed };
63
- }
64
- /**
65
- * Classify one knip lead path against the pre-built index. Pure: no IO, no
66
- * mutation. See {@link KnipGraphTag} for the decision table.
67
- */
68
- export function classifyKnipLead(leadPath, index) {
69
- const key = normalizeNodeKey(leadPath);
70
- const inDegree = index.inDegree.get(key) ?? 0;
71
- if (inDegree > 0)
72
- return "HAS-IMPORTERS";
73
- if (index.entrypoints.has(key))
74
- return "ENTRYPOINT";
75
- // In-degree 0 and non-entrypoint: only trust the "dead" reading when this
76
- // file's OWN language analyzer actually ran (per-file fidelity, CE-003).
77
- const analyzerId = analyzerIdForFile(leadPath);
78
- if (index.analyzersUsed.size === 0 ||
79
- analyzerId === null ||
80
- !index.analyzersUsed.has(analyzerId)) {
81
- return "UNVERIFIED";
82
- }
83
- return "LIKELY-DEAD";
84
- }
85
- //# sourceMappingURL=knipGraphCrosscheck.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"knipGraphCrosscheck.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/knipGraphCrosscheck.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAE,MAAM,qCAAqC,CAAC;AA2CxE;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,KAAK,MAAM,QAAQ,IAAI,iBAAiB,EAAE,CAAC;QACzC,IAAI,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,QAAQ,CAAC,EAAE,CAAC;IAClD,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,MAInC;IACC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,aAAa,EAAE,GAAG,MAAM,CAAC;IAE/D,IAAI,WAAW,EAAE,MAAM,EAAE,CAAC;QACxB,KAAK,MAAM,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC;YAC9C,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,yEAAyE;YACzE,wEAAwE;YACxE,yEAAyE;YACzE,4CAA4C;YAC5C,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,KAAK,MAAM,OAAO,IAAI,eAAe,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC;QACtD,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE,CAAC;YAC3C,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;QACxD,CAAC;IACH,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,aAAa,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;YAC3C,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,WAAW,CAAC,GAAG,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,KAAK,MAAM,EAAE,IAAI,WAAW,EAAE,cAAc,IAAI,EAAE,EAAE,CAAC;QACnD,IAAI,OAAO,EAAE,KAAK,QAAQ;YAAE,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC;AAClD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,KAAqB;IAErB,MAAM,GAAG,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAE9C,IAAI,QAAQ,GAAG,CAAC;QAAE,OAAO,eAAe,CAAC;IACzC,IAAI,KAAK,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IAEpD,0EAA0E;IAC1E,yEAAyE;IACzE,MAAM,UAAU,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IAC/C,IACE,KAAK,CAAC,aAAa,CAAC,IAAI,KAAK,CAAC;QAC9B,UAAU,KAAK,IAAI;QACnB,CAAC,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,UAAU,CAAC,EACpC,CAAC;QACD,OAAO,YAAY,CAAC;IACtB,CAAC;IACD,OAAO,aAAa,CAAC;AACvB,CAAC"}
@@ -1,3 +0,0 @@
1
- export { buildSelectiveDeepeningTasks, } from "./selectiveDeepening/index.js";
2
- export type { BuildSelectiveDeepeningTaskOptions } from "./selectiveDeepening/index.js";
3
- //# sourceMappingURL=selectiveDeepening.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectiveDeepening.d.ts","sourceRoot":"","sources":["../../../src/audit/orchestrator/selectiveDeepening.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,4BAA4B,GAC7B,MAAM,+BAA+B,CAAC;AACvC,YAAY,EAAE,kCAAkC,EAAE,MAAM,+BAA+B,CAAC"}
@@ -1,7 +0,0 @@
1
- // Public entry for selective deepening. The implementation was split by
2
- // task-building strategy into ./selectiveDeepening/ (finding-followup, conflict,
3
- // high-risk-clean, runtime-validation, lens-verification, steward-followup) with
4
- // the shared primitives in ./selectiveDeepening/shared.ts. This barrel preserves
5
- // the original module path so importers and tests are unaffected.
6
- export { buildSelectiveDeepeningTasks, } from "./selectiveDeepening/index.js";
7
- //# sourceMappingURL=selectiveDeepening.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"selectiveDeepening.js","sourceRoot":"","sources":["../../../src/audit/orchestrator/selectiveDeepening.ts"],"names":[],"mappings":"AAAA,wEAAwE;AACxE,iFAAiF;AACjF,iFAAiF;AACjF,iFAAiF;AACjF,kEAAkE;AAClE,OAAO,EACL,4BAA4B,GAC7B,MAAM,+BAA+B,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { AuditTask, UnitManifest } from "./types.js";
2
- export interface TaskBuildOptions {
3
- pass_prefix?: string;
4
- limit_lenses?: string[];
5
- }
6
- export declare function buildAuditTasks(unitManifest: UnitManifest, options?: TaskBuildOptions | string): AuditTask[];
7
- //# sourceMappingURL=orchestrator.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"orchestrator.d.ts","sourceRoot":"","sources":["../../src/audit/orchestrator.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAO1D,MAAM,WAAW,gBAAgB;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;CACzB;AAwDD,wBAAgB,eAAe,CAC7B,YAAY,EAAE,YAAY,EAC1B,OAAO,GAAE,gBAAgB,GAAG,MAAW,GACtC,SAAS,EAAE,CAuBb"}