code-auditor-mcp 3.4.14 → 3.4.16

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 (93) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/CHANGELOG.md +83 -0
  3. package/dist/analyzers/applicability.d.ts +41 -0
  4. package/dist/analyzers/applicability.d.ts.map +1 -0
  5. package/dist/analyzers/applicability.js +96 -0
  6. package/dist/analyzers/applicability.js.map +1 -0
  7. package/dist/analyzers/ruleRegistry.js +1 -1
  8. package/dist/analyzers/ruleRegistry.js.map +1 -1
  9. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts +2 -2
  10. package/dist/analyzers/universal/UniversalSchemaAnalyzer.d.ts.map +1 -1
  11. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js +2 -2
  12. package/dist/analyzers/universal/UniversalSchemaAnalyzer.js.map +1 -1
  13. package/dist/analyzers/universal/UniversalStylesAnalyzer.d.ts.map +1 -1
  14. package/dist/analyzers/universal/UniversalStylesAnalyzer.js +20 -9
  15. package/dist/analyzers/universal/UniversalStylesAnalyzer.js.map +1 -1
  16. package/dist/analyzers/universal/schema/migrations.d.ts +11 -0
  17. package/dist/analyzers/universal/schema/migrations.d.ts.map +1 -1
  18. package/dist/analyzers/universal/schema/migrations.js +127 -4
  19. package/dist/analyzers/universal/schema/migrations.js.map +1 -1
  20. package/dist/auditRunner.d.ts.map +1 -1
  21. package/dist/auditRunner.js +62 -23
  22. package/dist/auditRunner.js.map +1 -1
  23. package/dist/cli.js +406 -1
  24. package/dist/cli.js.map +1 -1
  25. package/dist/codeIndexDB.d.ts +40 -1
  26. package/dist/codeIndexDB.d.ts.map +1 -1
  27. package/dist/codeIndexDB.js +222 -50
  28. package/dist/codeIndexDB.js.map +1 -1
  29. package/dist/config/defaults.js +1 -1
  30. package/dist/config/defaults.js.map +1 -1
  31. package/dist/config/pathProfiles.d.ts +7 -0
  32. package/dist/config/pathProfiles.d.ts.map +1 -1
  33. package/dist/config/pathProfiles.js +7 -1
  34. package/dist/config/pathProfiles.js.map +1 -1
  35. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.d.ts.map +1 -1
  36. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js +1 -1
  37. package/dist/languages/typescript/TreeSitterTypeScriptAdapter.js.map +1 -1
  38. package/dist/ledger.d.ts +163 -2
  39. package/dist/ledger.d.ts.map +1 -1
  40. package/dist/ledger.js +528 -7
  41. package/dist/ledger.js.map +1 -1
  42. package/dist/mcp.js +3 -3
  43. package/dist/mcp.js.map +1 -1
  44. package/dist/mcpAuditJobs.d.ts +24 -2
  45. package/dist/mcpAuditJobs.d.ts.map +1 -1
  46. package/dist/mcpAuditJobs.js +364 -58
  47. package/dist/mcpAuditJobs.js.map +1 -1
  48. package/dist/pipeline.d.ts +9 -2
  49. package/dist/pipeline.d.ts.map +1 -1
  50. package/dist/pipeline.js +165 -18
  51. package/dist/pipeline.js.map +1 -1
  52. package/dist/pipelineAdapters.d.ts.map +1 -1
  53. package/dist/pipelineAdapters.js +45 -10
  54. package/dist/pipelineAdapters.js.map +1 -1
  55. package/dist/scripts/benchmarkWorkers.js +1 -1
  56. package/dist/scripts/benchmarkWorkers.js.map +1 -1
  57. package/dist/services/auditJobService.d.ts +22 -5
  58. package/dist/services/auditJobService.d.ts.map +1 -1
  59. package/dist/services/auditJobService.js +67 -26
  60. package/dist/services/auditJobService.js.map +1 -1
  61. package/dist/services/fileAccounting.d.ts +83 -0
  62. package/dist/services/fileAccounting.d.ts.map +1 -0
  63. package/dist/services/fileAccounting.js +215 -0
  64. package/dist/services/fileAccounting.js.map +1 -0
  65. package/dist/styles/styleExtractor.d.ts +2 -2
  66. package/dist/styles/styleExtractor.d.ts.map +1 -1
  67. package/dist/styles/styleExtractor.js +83 -11
  68. package/dist/styles/styleExtractor.js.map +1 -1
  69. package/dist/styles/styleIndexer.d.ts +8 -0
  70. package/dist/styles/styleIndexer.d.ts.map +1 -1
  71. package/dist/styles/styleIndexer.js +103 -15
  72. package/dist/styles/styleIndexer.js.map +1 -1
  73. package/dist/styles/tailwindUtilityExpander.d.ts +3 -0
  74. package/dist/styles/tailwindUtilityExpander.d.ts.map +1 -1
  75. package/dist/styles/tailwindUtilityExpander.js +35 -1
  76. package/dist/styles/tailwindUtilityExpander.js.map +1 -1
  77. package/dist/styles/types.d.ts +11 -0
  78. package/dist/styles/types.d.ts.map +1 -1
  79. package/dist/types.d.ts +133 -0
  80. package/dist/types.d.ts.map +1 -1
  81. package/dist/types.js.map +1 -1
  82. package/dist/utils/fileDiscovery.d.ts +98 -0
  83. package/dist/utils/fileDiscovery.d.ts.map +1 -1
  84. package/dist/utils/fileDiscovery.js +246 -29
  85. package/dist/utils/fileDiscovery.js.map +1 -1
  86. package/dist/workers/auditJobRunner.d.ts +2 -0
  87. package/dist/workers/auditJobRunner.d.ts.map +1 -0
  88. package/dist/workers/auditJobRunner.js +37 -0
  89. package/dist/workers/auditJobRunner.js.map +1 -0
  90. package/dist/workers/auditWorker.js +26 -0
  91. package/dist/workers/auditWorker.js.map +1 -1
  92. package/package.json +2 -2
  93. package/plugin/.claude-plugin/plugin.json +1 -1
@@ -7,8 +7,19 @@
7
7
  */
8
8
  import { promises as fs } from 'fs';
9
9
  import path from 'path';
10
- // Default directories to exclude from analysis
11
- export const DEFAULT_EXCLUDED_DIRS = [
10
+ /**
11
+ * Spec 44 — the excluded-directory split. The two halves of the default
12
+ * exclusion set behave differently under file accounting:
13
+ *
14
+ * - **Infra** dirs are toolchain artifacts (never source). They are pruned
15
+ * silently and recorded only as an aggregate `infraPruned` line, because
16
+ * enumerating `node_modules` per-file is impossible at scale.
17
+ * - **Content** dirs (docs, specs, tmp, …) are small and genuinely "source the
18
+ * user might have meant to include". They are enumerated per-file and each
19
+ * file is recorded `dropped: directory pruned` — which is what makes an
20
+ * `.mdx` under `docs/` appear in the report instead of vanishing.
21
+ */
22
+ export const DEFAULT_EXCLUDED_INFRA_DIRS = [
12
23
  'node_modules',
13
24
  '.next',
14
25
  'dist',
@@ -18,20 +29,78 @@ export const DEFAULT_EXCLUDED_DIRS = [
18
29
  '.turbo',
19
30
  'out',
20
31
  '.cache',
21
- 'tmp',
22
- 'temp',
23
32
  '.vscode',
24
33
  '.idea',
25
- // Documentation, specs, and backups — rarely contain production source code
26
- 'docs',
27
- 'specs',
28
- 'backup',
29
- 'backups',
30
34
  // The tool's own on-disk index (CodeIndexDB). A prior audit run writes
31
35
  // `.code-index/index.db` into the project root; it must never be re-scanned
32
36
  // as source on a subsequent run (Bug #3).
33
37
  '.code-index',
34
38
  ];
39
+ // Documentation, specs, and backups — rarely contain production source code,
40
+ // but enumerated per-file under accounting so they are reported, not silent.
41
+ export const DEFAULT_EXCLUDED_CONTENT_DIRS = [
42
+ 'tmp',
43
+ 'temp',
44
+ 'docs',
45
+ 'specs',
46
+ 'backup',
47
+ 'backups',
48
+ ];
49
+ // Backward-compatible union — still the default `excludeDirs` for discovery.
50
+ export const DEFAULT_EXCLUDED_DIRS = [
51
+ ...DEFAULT_EXCLUDED_INFRA_DIRS,
52
+ ...DEFAULT_EXCLUDED_CONTENT_DIRS,
53
+ ];
54
+ /**
55
+ * Spec 45 R1 — the per-entry anchoring choice. Each directory basename in
56
+ * `DEFAULT_EXCLUDED_DIRS` is either *any-depth* or *root-anchored* depending on
57
+ * whether the name is an unambiguous toolchain/transient marker (never a source
58
+ * route) or an ambiguous one (could be user source when nested).
59
+ *
60
+ * ANY-DEPTH (13 entries) — toolchain artifacts wherever they appear; nested
61
+ * occurrences are never source, so they are excluded at every depth below the
62
+ * scan root:
63
+ *
64
+ * - `node_modules` — package deps; monorepo workspaces are still deps.
65
+ * - `.git` — VCS metadata; submodules are still VCS.
66
+ * - `.next` — Next.js build output (reserved name).
67
+ * - `dist`, `out` — build/export output.
68
+ * - `coverage` — test coverage report.
69
+ * - `.turbo` — Turborepo cache.
70
+ * - `.cache` — cache (recall's `scripts/.cache` holds generated build JSON).
71
+ * - `.vscode`, `.idea` — editor state.
72
+ * - `.code-index` — the tool's own SQLite index (Bug #3); a prior scoped run
73
+ * can leave `src/agents/.code-index` nested.
74
+ * - `tmp`, `temp` — transient (recall's `scripts/.wrangler/tmp` is Wrangler
75
+ * build cache; never source).
76
+ *
77
+ * ROOT-ANCHORED (5 entries) — ambiguous: they can be a real file-router route
78
+ * or user source when nested under `src/`, so they are excluded only as the
79
+ * first component below the scan root. File-based routers (Astro, Next,
80
+ * SvelteKit, Nuxt) make `src/pages/docs/…` and `src/pages/…/build/…` real
81
+ * routes:
82
+ *
83
+ * - `build` — a nested `src/pages/…/build/…` dir is a route; root `build` is
84
+ * build output.
85
+ * - `docs` — `src/pages/docs/…` is a route (recall's two R1 source files);
86
+ * root `docs` is documentation.
87
+ * - `specs`, `backup`, `backups` — can be in-repo source.
88
+ */
89
+ export const DEFAULT_EXCLUDED_ANY_DEPTH_DIRS = new Set([
90
+ 'node_modules',
91
+ '.git',
92
+ '.next',
93
+ 'dist',
94
+ 'out',
95
+ 'coverage',
96
+ '.turbo',
97
+ '.cache',
98
+ '.vscode',
99
+ '.idea',
100
+ '.code-index',
101
+ 'tmp',
102
+ 'temp',
103
+ ]);
35
104
  /**
36
105
  * Basenames the tool itself writes into the project, which must never be
37
106
  * re-discovered as source on a subsequent run (Bug #3 — "exclude the tool's
@@ -47,31 +116,107 @@ export const DEFAULT_EXCLUDED_FILES = new Set([
47
116
  'audit-report.sarif',
48
117
  ]);
49
118
  // Supported file extensions
50
- export const TYPESCRIPT_EXTENSIONS = ['.ts', '.tsx'];
51
- export const JAVASCRIPT_EXTENSIONS = ['.js', '.jsx'];
119
+ export const TYPESCRIPT_EXTENSIONS = ['.ts', '.tsx', '.mts', '.cts'];
120
+ export const JAVASCRIPT_EXTENSIONS = ['.js', '.jsx', '.mjs', '.cjs'];
52
121
  export const JSON_EXTENSIONS = ['.json'];
53
122
  export const GO_EXTENSIONS = ['.go'];
54
123
  export const CSS_EXTENSIONS = ['.css', '.scss'];
124
+ // Markup extensions that carry `<style>` blocks (Spec 42 R1). Discovered so the
125
+ // style indexer can extract their embedded stylesheets; the pipeline itself has
126
+ // no language adapter for them, so they are consumed only by syncStyleIndex.
127
+ export const MARKUP_EXTENSIONS = ['.astro', '.vue', '.svelte'];
128
+ // Markup/component extensions the style extractor reads (embedded <style> blocks
129
+ // and class attributes). This is the single source of truth for the extractor's
130
+ // markup dispatch — the gates in styleIndexer.ts and the dispatch in
131
+ // styleExtractor.ts derive from it so a newly supported dialect is handled
132
+ // everywhere at once instead of silently dropped from one list. `.html` is
133
+ // included because scoped runs may pass HTML files, even though `.html` is NOT
134
+ // discovered by default (recall-protocol's ~11,928 spec-dump `.html` files would
135
+ // blow up a full audit).
136
+ export const STYLE_MARKUP_EXTENSIONS = ['.html', ...MARKUP_EXTENSIONS];
137
+ // Dialects the style indexer cannot yet read (Sass/SCSS indented syntax, Less,
138
+ // Stylus). Not discovered as source — the indexer records them as *unread*
139
+ // stylesheet sources (Spec 42 R2) so undefined-class never asserts on a class
140
+ // that could be defined in one of these.
141
+ export const UNREAD_STYLE_EXTENSIONS = ['.less', '.styl', '.sass'];
55
142
  // Raw-source extensions — no tree-sitter grammar, included for visitors that
56
143
  // read sourceCode directly (e.g. SQL migrations, TOML config, Prisma schemas)
57
144
  export const SQL_EXTENSIONS = ['.sql'];
58
145
  export const TOML_EXTENSIONS = ['.toml'];
59
146
  export const PRISMA_EXTENSIONS = ['.prisma'];
60
147
  export const RAW_EXTENSIONS = [...SQL_EXTENSIONS, ...TOML_EXTENSIONS, ...PRISMA_EXTENSIONS];
61
- export const ALL_EXTENSIONS = [...TYPESCRIPT_EXTENSIONS, ...JAVASCRIPT_EXTENSIONS, ...JSON_EXTENSIONS, ...GO_EXTENSIONS, ...CSS_EXTENSIONS, ...RAW_EXTENSIONS];
148
+ // NOTE: .html is deliberately NOT here recall-protocol has ~11,928 .html
149
+ // files (spec dumps) and reading them all would blow up the audit. Markup
150
+ // extensions are added because they are real component files with styles.
151
+ export const ALL_EXTENSIONS = [...TYPESCRIPT_EXTENSIONS, ...JAVASCRIPT_EXTENSIONS, ...JSON_EXTENSIONS, ...GO_EXTENSIONS, ...CSS_EXTENSIONS, ...RAW_EXTENSIONS, ...MARKUP_EXTENSIONS];
152
+ // Every extension the analysis layer understands as source — style-bearing
153
+ // (TS/JS/markup/CSS) plus non-style (JSON/Go/SQL/TOML/Prisma), with `.html`
154
+ // added since scoped runs may pass it even though it is not discovered by
155
+ // default. Single source of truth for the style extractor's "loud" default
156
+ // branch: an extension that reaches it unhandled is recorded as an unread
157
+ // source (Spec 42 R2) *only* when it is NOT in this set, so a genuinely unknown
158
+ // dialect (`.mdx`, `.md`, …) surfaces instead of a silent zero while legitimate
159
+ // non-style source and `.css`/`.scss` (handled by the AST pipeline) stay silent.
160
+ export const KNOWN_SOURCE_EXTENSIONS = [...ALL_EXTENSIONS, '.html'];
62
161
  /**
63
- * Check if a path should be excluded based on directory names.
64
- * Only checks directory components *below* the scan root to avoid
65
- * false matches against filesystem roots like /tmp or /temp.
162
+ * Classify a path against the excluded-directory split (Spec 44 + Spec 45 R1).
163
+ *
164
+ * Only checks directory components *below* the scan root to avoid false
165
+ * matches against filesystem roots like /tmp or /temp. A component that is a
166
+ * default *infra* dir prunes silently (aggregate); every other excluded
167
+ * component — default *content* dirs and any user-supplied dir — is enumerated
168
+ * per-file so nothing is silently dropped.
169
+ *
170
+ * Spec 45 R1: a basename matches only as the *first* component below the scan
171
+ * root, unless it is one of the `DEFAULT_EXCLUDED_ANY_DEPTH_DIRS` entries
172
+ * (unambiguous toolchain/transient names — see the per-entry list on that
173
+ * constant), which match at any depth. This keeps `src/pages/docs/…` and
174
+ * `src/pages/…/build/…` as source instead of silently pruning them, while still
175
+ * pruning nested `node_modules`, `.cache`, `.code-index`, and `tmp`.
66
176
  */
67
- function shouldExcludeDir(filePath, excludeDirs, scanRoot) {
177
+ function classifyExcludedDir(filePath, excludeDirs, scanRoot) {
68
178
  // Get the relative path below scanRoot
69
179
  const relPath = path.relative(scanRoot, filePath);
70
180
  // If the path is outside scanRoot (shouldn't happen), don't exclude
71
181
  if (relPath.startsWith('..'))
72
- return false;
182
+ return null;
73
183
  const parts = relPath.split(path.sep);
74
- return parts.some(part => excludeDirs.includes(part));
184
+ for (let i = 0; i < parts.length; i++) {
185
+ const part = parts[i];
186
+ if (!excludeDirs.includes(part))
187
+ continue;
188
+ // Root-anchored entries match only at the first component; any-depth
189
+ // entries (`node_modules`, `.git`) match anywhere below the scan root.
190
+ if (i !== 0 && !DEFAULT_EXCLUDED_ANY_DEPTH_DIRS.has(part))
191
+ continue;
192
+ if (DEFAULT_EXCLUDED_INFRA_DIRS.includes(part))
193
+ return { kind: 'infra', dir: part };
194
+ return { kind: 'content', dir: part };
195
+ }
196
+ return null;
197
+ }
198
+ /**
199
+ * Recursively list every file under a directory, any extension. Used only for
200
+ * *content* exclude dirs (small, enumerated per-file under accounting).
201
+ */
202
+ async function enumerateAllFiles(dir) {
203
+ const out = [];
204
+ try {
205
+ const entries = await fs.readdir(dir, { withFileTypes: true });
206
+ for (const entry of entries) {
207
+ const fullPath = path.join(dir, entry.name);
208
+ if (entry.isDirectory()) {
209
+ out.push(...(await enumerateAllFiles(fullPath)));
210
+ }
211
+ else if (entry.isFile()) {
212
+ out.push(fullPath);
213
+ }
214
+ }
215
+ }
216
+ catch {
217
+ // Unreadable subtree — skip (mirrors the walk's EACCES tolerance).
218
+ }
219
+ return out;
75
220
  }
76
221
  /**
77
222
  * Recursively find files matching criteria
@@ -82,7 +227,21 @@ async function findFilesRecursive(dir, options) {
82
227
  const entries = await fs.readdir(dir, { withFileTypes: true });
83
228
  for (const entry of entries) {
84
229
  const fullPath = path.join(dir, entry.name);
85
- if (shouldExcludeDir(fullPath, options.excludeDirs, options.scanRoot)) {
230
+ const excl = classifyExcludedDir(fullPath, options.excludeDirs, options.scanRoot);
231
+ if (excl) {
232
+ const rule = DEFAULT_EXCLUDED_DIRS.includes(excl.dir) ? 'DEFAULT_EXCLUDED_DIRS' : 'excludeDirs';
233
+ if (excl.kind === 'infra') {
234
+ // Aggregate — never per-file (node_modules is not enumerable at scale).
235
+ options.fileAccounting?.recordInfraPruned(excl.dir, rule);
236
+ }
237
+ else if (entry.isDirectory() && options.fileAccounting) {
238
+ // Content dir — enumerated per-file, each dropped: directory pruned.
239
+ // This is what makes `.mdx` under `docs/` appear (Spec 44 acceptance 5).
240
+ const contentFiles = await enumerateAllFiles(fullPath);
241
+ for (const f of contentFiles) {
242
+ options.fileAccounting.recordDropped('directory pruned', f, { directory: excl.dir, rule });
243
+ }
244
+ }
86
245
  continue;
87
246
  }
88
247
  if (entry.isDirectory()) {
@@ -99,6 +258,18 @@ async function findFilesRecursive(dir, options) {
99
258
  results.push(fullPath);
100
259
  }
101
260
  }
261
+ else if (ext !== '') {
262
+ // Record the extension discovery skipped so the report can answer
263
+ // "what isn't being analyzed here" (Spec 43 R5 follow-up) rather than
264
+ // silently dropping the file at discovery.
265
+ options.onSkippedExtension?.(ext, fullPath);
266
+ // Spec 44 reason 2 — a file with a known (or unknown) extension that
267
+ // is simply not in the discovery set.
268
+ options.fileAccounting?.recordDropped('extension not known', fullPath, {
269
+ ext,
270
+ kind: KNOWN_SOURCE_EXTENSIONS.includes(ext) ? 'known-but-not-discovered' : 'unknown',
271
+ });
272
+ }
102
273
  }
103
274
  }
104
275
  }
@@ -119,13 +290,24 @@ export async function findFiles(rootDir = process.cwd(), options = {}) {
119
290
  const files = await findFilesRecursive(rootDir, {
120
291
  extensions,
121
292
  excludeDirs,
122
- scanRoot: rootDir
293
+ scanRoot: rootDir,
294
+ ...(options.onSkippedExtension ? { onSkippedExtension: options.onSkippedExtension } : {}),
295
+ ...(options.fileAccounting ? { fileAccounting: options.fileAccounting } : {})
123
296
  });
124
297
  // Apply additional filtering
125
- let filtered = filterFiles(files, {
298
+ const filtered = filterFiles(files, {
126
299
  includePaths: options.includePaths,
127
- excludePaths: options.excludePaths
300
+ excludePaths: options.excludePaths,
301
+ fileAccounting: options.fileAccounting
128
302
  });
303
+ // Spec 44 — every candidate that survives discovery filtering is "touched"
304
+ // (it will be classified analyzed/dropped in stage 2). Recording it here —
305
+ // after include/exclude filtering — means a positive-selection `includePaths`
306
+ // narrows the universe instead of producing touched-but-dropped entries.
307
+ if (options.fileAccounting) {
308
+ for (const f of filtered)
309
+ options.fileAccounting.recordTouched(f);
310
+ }
129
311
  // Sort for consistent output
130
312
  return filtered.sort();
131
313
  }
@@ -170,13 +352,20 @@ export async function findFilesByPattern(rootDir = process.cwd(), pattern, optio
170
352
  extensions,
171
353
  excludeDirs,
172
354
  pattern: regex,
173
- scanRoot: rootDir
355
+ scanRoot: rootDir,
356
+ ...(options.onSkippedExtension ? { onSkippedExtension: options.onSkippedExtension } : {}),
357
+ ...(options.fileAccounting ? { fileAccounting: options.fileAccounting } : {})
174
358
  });
175
359
  // Apply additional filtering
176
- let filtered = filterFiles(files, {
360
+ const filtered = filterFiles(files, {
177
361
  includePaths: options.includePaths,
178
- excludePaths: options.excludePaths
362
+ excludePaths: options.excludePaths,
363
+ fileAccounting: options.fileAccounting
179
364
  });
365
+ if (options.fileAccounting) {
366
+ for (const f of filtered)
367
+ options.fileAccounting.recordTouched(f);
368
+ }
180
369
  return filtered.sort();
181
370
  }
182
371
  /**
@@ -184,7 +373,8 @@ export async function findFilesByPattern(rootDir = process.cwd(), pattern, optio
184
373
  */
185
374
  export function filterFiles(files, options = {}) {
186
375
  let filtered = [...files];
187
- // Apply include patterns
376
+ // Apply include patterns (positive selection — narrows the universe; a file
377
+ // removed here is simply not "touched", not dropped).
188
378
  if (options.includePaths && options.includePaths.length > 0) {
189
379
  filtered = filtered.filter(file => {
190
380
  return options.includePaths.some(pattern => {
@@ -196,13 +386,22 @@ export function filterFiles(files, options = {}) {
196
386
  }
197
387
  // Apply exclude patterns
198
388
  if (options.excludePaths && options.excludePaths.length > 0) {
199
- filtered = filtered.filter(file => {
200
- return !options.excludePaths.some(pattern => {
389
+ const kept = [];
390
+ for (const file of filtered) {
391
+ const matched = options.excludePaths.find(pattern => {
201
392
  // Convert glob patterns to regex
202
393
  const regex = globToRegex(pattern);
203
394
  return regex.test(file);
204
395
  });
205
- });
396
+ if (matched) {
397
+ // Spec 44 reason 1 — a user `excludePaths` prune, rule = the glob.
398
+ options.fileAccounting?.recordDropped('directory pruned', file, { rule: matched });
399
+ }
400
+ else {
401
+ kept.push(file);
402
+ }
403
+ }
404
+ filtered = kept;
206
405
  }
207
406
  return filtered;
208
407
  }
@@ -258,4 +457,22 @@ export async function isReadableFile(filePath) {
258
457
  * Alias for findFiles to match expected import
259
458
  */
260
459
  export const discoverFiles = findFiles;
460
+ /**
461
+ * Discover files and simultaneously record the extensions discovery skipped.
462
+ * Mirrors `findFiles` (same defaults and filtering), but the returned
463
+ * `skippedExtensions` is aggregated during the recursive walk — before
464
+ * `includePaths`/`excludePaths` filtering — so it reflects the full scan, not
465
+ * just the filtered subset. Sorted by count descending, then extension.
466
+ */
467
+ export async function discoverFilesDetailed(rootDir = process.cwd(), options = {}) {
468
+ const counts = new Map();
469
+ const onSkippedExtension = (ext) => {
470
+ counts.set(ext, (counts.get(ext) ?? 0) + 1);
471
+ };
472
+ const files = await findFiles(rootDir, { ...options, onSkippedExtension });
473
+ const skippedExtensions = [...counts.entries()]
474
+ .map(([ext, count]) => ({ ext, count }))
475
+ .sort((a, b) => b.count - a.count || a.ext.localeCompare(b.ext));
476
+ return { files, skippedExtensions };
477
+ }
261
478
  //# sourceMappingURL=fileDiscovery.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fileDiscovery.js","sourceRoot":"","sources":["../../src/utils/fileDiscovery.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fileDiscovery.js","sourceRoot":"","sources":["../../src/utils/fileDiscovery.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,QAAQ,IAAI,EAAE,EAAE,MAAM,IAAI,CAAC;AACpC,OAAO,IAAI,MAAM,MAAM,CAAC;AAGxB;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG;IACzC,cAAc;IACd,OAAO;IACP,MAAM;IACN,OAAO;IACP,MAAM;IACN,UAAU;IACV,QAAQ;IACR,KAAK;IACL,QAAQ;IACR,SAAS;IACT,OAAO;IACP,uEAAuE;IACvE,4EAA4E;IAC5E,0CAA0C;IAC1C,aAAa;CACd,CAAC;AAEF,6EAA6E;AAC7E,6EAA6E;AAC7E,MAAM,CAAC,MAAM,6BAA6B,GAAG;IAC3C,KAAK;IACL,MAAM;IACN,MAAM;IACN,OAAO;IACP,QAAQ;IACR,SAAS;CACV,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,qBAAqB,GAAG;IACnC,GAAG,2BAA2B;IAC9B,GAAG,6BAA6B;CACjC,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,MAAM,CAAC,MAAM,+BAA+B,GAAG,IAAI,GAAG,CAAC;IACrD,cAAc;IACd,MAAM;IACN,OAAO;IACP,MAAM;IACN,KAAK;IACL,UAAU;IACV,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,OAAO;IACP,aAAa;IACb,KAAK;IACL,MAAM;CACP,CAAC,CAAC;AAEH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,IAAI,GAAG,CAAC;IAC5C,mBAAmB;IACnB,mBAAmB;IACnB,kBAAkB;IAClB,oBAAoB;CACrB,CAAC,CAAC;AAEH,4BAA4B;AAC5B,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AACrE,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAAK,CAAC,CAAC;AACrC,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAChD,gFAAgF;AAChF,gFAAgF;AAChF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC;AAC/D,iFAAiF;AACjF,gFAAgF;AAChF,qEAAqE;AACrE,2EAA2E;AAC3E,2EAA2E;AAC3E,+EAA+E;AAC/E,iFAAiF;AACjF,yBAAyB;AACzB,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,GAAG,iBAAiB,CAAC,CAAC;AACvE,+EAA+E;AAC/E,2EAA2E;AAC3E,8EAA8E;AAC9E,yCAAyC;AACzC,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AACnE,6EAA6E;AAC7E,8EAA8E;AAC9E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,MAAM,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,OAAO,CAAC,CAAC;AACzC,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,SAAS,CAAC,CAAC;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,cAAc,EAAE,GAAG,eAAe,EAAE,GAAG,iBAAiB,CAAC,CAAC;AAC5F,2EAA2E;AAC3E,0EAA0E;AAC1E,0EAA0E;AAC1E,MAAM,CAAC,MAAM,cAAc,GAAG,CAAC,GAAG,qBAAqB,EAAE,GAAG,qBAAqB,EAAE,GAAG,eAAe,EAAE,GAAG,aAAa,EAAE,GAAG,cAAc,EAAE,GAAG,cAAc,EAAE,GAAG,iBAAiB,CAAC,CAAC;AACrL,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAC1E,2EAA2E;AAC3E,0EAA0E;AAC1E,gFAAgF;AAChF,gFAAgF;AAChF,iFAAiF;AACjF,MAAM,CAAC,MAAM,uBAAuB,GAAG,CAAC,GAAG,cAAc,EAAE,OAAO,CAAC,CAAC;AA8BpE;;;;;;;;;;;;;;;GAeG;AACH,SAAS,mBAAmB,CAC1B,QAAgB,EAChB,WAAqB,EACrB,QAAgB;IAEhB,uCAAuC;IACvC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClD,oEAAoE;IACpE,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1C,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,qEAAqE;QACrE,uEAAuE;QACvE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QACpE,IAAI,2BAA2B,CAAC,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;QACpF,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;IACxC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;GAGG;AACH,KAAK,UAAU,iBAAiB,CAAC,GAAW;IAC1C,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,mEAAmE;IACrE,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;GAEG;AACH,KAAK,UAAU,kBAAkB,CAC/B,GAAW,EACX,OAOC;IAED,MAAM,OAAO,GAAa,EAAE,CAAC;IAE7B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE5C,MAAM,IAAI,GAAG,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClF,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,IAAI,GAAG,qBAAqB,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,uBAAuB,CAAC,CAAC,CAAC,aAAa,CAAC;gBAChG,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAC1B,wEAAwE;oBACxE,OAAO,CAAC,cAAc,EAAE,iBAAiB,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAC5D,CAAC;qBAAM,IAAI,KAAK,CAAC,WAAW,EAAE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;oBACzD,qEAAqE;oBACrE,yEAAyE;oBACzE,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,QAAQ,CAAC,CAAC;oBACvD,KAAK,MAAM,CAAC,IAAI,YAAY,EAAE,CAAC;wBAC7B,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC7F,CAAC;gBACH,CAAC;gBACD,SAAS;YACX,CAAC;YAED,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,MAAM,UAAU,GAAG,MAAM,kBAAkB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC/D,OAAO,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,CAAC;YAC9B,CAAC;iBAAM,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC1B,0DAA0D;gBAC1D,IAAI,sBAAsB,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;oBAAE,SAAS;gBACrD,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrC,IAAI,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;oBACrC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;wBACzD,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,CAAC;gBACH,CAAC;qBAAM,IAAI,GAAG,KAAK,EAAE,EAAE,CAAC;oBACtB,kEAAkE;oBAClE,sEAAsE;oBACtE,2CAA2C;oBAC3C,OAAO,CAAC,kBAAkB,EAAE,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;oBAC5C,qEAAqE;oBACrE,sCAAsC;oBACtC,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,qBAAqB,EAAE,QAAQ,EAAE;wBACrE,GAAG;wBACH,IAAI,EAAE,uBAAuB,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0BAA0B,CAAC,CAAC,CAAC,SAAS;qBACrF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,0CAA0C;QAC1C,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YACvD,OAAO,CAAC,KAAK,CAAC,2BAA2B,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,OAAO,GAAW,OAAO,CAAC,GAAG,EAAE,EAC/B,OAAO,GAAyB,EAAE;IAElC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IAEjE,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE;QAC9C,UAAU;QACV,WAAW;QACX,QAAQ,EAAE,OAAO;QACjB,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,2EAA2E;IAC3E,8EAA8E;IAC9E,yEAAyE;IACzE,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,6BAA6B;IAC7B,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAO,GAAW,OAAO,CAAC,GAAG,EAAE,EAC/B,OAAO,GAA6C,EAAE;IAEtD,OAAO,SAAS,CAAC,OAAO,EAAE;QACxB,GAAG,OAAO;QACV,UAAU,EAAE,qBAAqB;KAClC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAO,GAAW,OAAO,CAAC,GAAG,EAAE,EAC/B,OAAO,GAA6C,EAAE;IAEtD,OAAO,SAAS,CAAC,OAAO,EAAE;QACxB,GAAG,OAAO;QACV,UAAU,EAAE,qBAAqB;KAClC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,OAAO,GAAW,OAAO,CAAC,GAAG,EAAE,EAC/B,OAAO,GAA6C,EAAE;IAEtD,OAAO,SAAS,CAAC,OAAO,EAAE;QACxB,GAAG,OAAO;QACV,UAAU,EAAE,eAAe;KAC5B,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAO,GAAW,OAAO,CAAC,GAAG,EAAE,EAC/B,OAAwB,EACxB,OAAO,GAAyB,EAAE;IAElC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,cAAc,CAAC;IACxD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,qBAAqB,CAAC;IAEjE,6CAA6C;IAC7C,MAAM,KAAK,GAAG,OAAO,OAAO,KAAK,QAAQ;QACvC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC1C,CAAC,CAAC,OAAO,CAAC;IAEZ,MAAM,KAAK,GAAG,MAAM,kBAAkB,CAAC,OAAO,EAAE;QAC9C,UAAU;QACV,WAAW;QACX,OAAO,EAAE,KAAK;QACd,QAAQ,EAAE,OAAO;QACjB,GAAG,CAAC,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzF,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC9E,CAAC,CAAC;IAEH,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,EAAE;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,YAAY,EAAE,OAAO,CAAC,YAAY;QAClC,cAAc,EAAE,OAAO,CAAC,cAAc;KACvC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;QAC3B,KAAK,MAAM,CAAC,IAAI,QAAQ;YAAE,OAAO,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CACzB,KAAe,EACf,OAAO,GAIH,EAAE;IAEN,IAAI,QAAQ,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;IAE1B,4EAA4E;IAC5E,sDAAsD;IACtD,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,OAAO,CAAC,YAAa,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBAC1C,iCAAiC;gBACjC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,yBAAyB;IACzB,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5D,MAAM,IAAI,GAAa,EAAE,CAAC;QAC1B,KAAK,MAAM,IAAI,IAAI,QAAQ,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;gBAClD,iCAAiC;gBACjC,MAAM,KAAK,GAAG,WAAW,CAAC,OAAO,CAAC,CAAC;gBACnC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,IAAI,OAAO,EAAE,CAAC;gBACZ,mEAAmE;gBACnE,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,kBAAkB,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;YACrF,CAAC;iBAAM,CAAC;gBACN,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QACD,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAe;IAClC,iDAAiD;IACjD,IAAI,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE,MAAM,CAAC,CAAC;IACzD,sEAAsE;IACtE,sEAAsE;IACtE,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IACzC,4CAA4C;IAC5C,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACvD,wDAAwD;IACxD,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;IACzC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG,CAAC,CAAC;AAClC,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IAKjD,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEtC,6BAA6B;IAC7B,IAAI,KAAyB,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACrD,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,qCAAqC;IACvC,CAAC;IAED,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,QAAQ,EAAE,KAAK,CAAC,KAAK;QACrB,KAAK;KACN,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgB;IACnD,IAAI,CAAC;QACH,MAAM,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACtC,OAAO,KAAK,CAAC,MAAM,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,SAAS,CAAC;AAcvC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,OAAO,GAAW,OAAO,CAAC,GAAG,EAAE,EAC/B,OAAO,GAAyB,EAAE;IAElC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,kBAAkB,GAAG,CAAC,GAAW,EAAE,EAAE;QACzC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC;IACF,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,OAAO,EAAE,EAAE,GAAG,OAAO,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAC3E,MAAM,iBAAiB,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SAC5C,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;SACvC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACnE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,CAAC;AACtC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=auditJobRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auditJobRunner.d.ts","sourceRoot":"","sources":["../../src/workers/auditJobRunner.ts"],"names":[],"mappings":""}
@@ -0,0 +1,37 @@
1
+ import { initParsers, initializeLanguages } from '../languages/index.js';
2
+ import { runAuditJob } from '../mcpAuditJobs.js';
3
+ import { CodeIndexDB } from '../codeIndexDB.js';
4
+ /**
5
+ * Forkable entrypoint for Spec 41 `--detach`.
6
+ *
7
+ * Reads jobId / args / defaults from argv, initializes parsers, and runs the
8
+ * shared `runAuditJob` path — the same path MCP's `audit.start` schedules via
9
+ * setTimeout. There is no second runner: the child exists only to give `--detach`
10
+ * a detached process whose stderr the parent captures to a per-run log.
11
+ *
12
+ * `runAuditJob` records lifecycle state (including failure) on the run row and
13
+ * resolves normally, so this process exits non-zero only when `runAuditJob`
14
+ * itself rejects before its own try/catch takes over (e.g. a broken argv).
15
+ */
16
+ async function main() {
17
+ const [, , jobId, argsJson, defaultsJson] = process.argv;
18
+ if (!jobId || !argsJson || !defaultsJson) {
19
+ console.error('usage: auditJobRunner <jobId> <argsJson> <defaultsJson>');
20
+ process.exitCode = 2;
21
+ return;
22
+ }
23
+ initializeLanguages();
24
+ await initParsers();
25
+ // This process is a fresh fork of a parent that already opened CodeIndexDB.
26
+ // fork() copies the singleton (including `isInitialized = true` and a native
27
+ // better-sqlite3 handle that does not survive the fork), so `getInstance`
28
+ // would short-circuit and hand back a dead connection. Reset the singleton so
29
+ // runAuditJob opens a fresh per-project connection.
30
+ CodeIndexDB.resetInstance();
31
+ await runAuditJob(jobId, JSON.parse(argsJson), JSON.parse(defaultsJson));
32
+ }
33
+ main().catch((err) => {
34
+ console.error(err instanceof Error ? (err.stack ?? err.message) : String(err));
35
+ process.exitCode = 1;
36
+ });
37
+ //# sourceMappingURL=auditJobRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auditJobRunner.js","sourceRoot":"","sources":["../../src/workers/auditJobRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,IAAI;IACjB,MAAM,CAAC,EAAE,AAAD,EAAG,KAAK,EAAE,QAAQ,EAAE,YAAY,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IACzD,IAAI,CAAC,KAAK,IAAI,CAAC,QAAQ,IAAI,CAAC,YAAY,EAAE,CAAC;QACzC,OAAO,CAAC,KAAK,CAAC,yDAAyD,CAAC,CAAC;QACzE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,mBAAmB,EAAE,CAAC;IACtB,MAAM,WAAW,EAAE,CAAC;IAEpB,4EAA4E;IAC5E,6EAA6E;IAC7E,0EAA0E;IAC1E,8EAA8E;IAC9E,oDAAoD;IACpD,WAAW,CAAC,aAAa,EAAE,CAAC;IAE5B,MAAM,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,QAAQ,CAA4B,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAU,CAAC,CAAC;AAC/G,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/E,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import { createAuditRunner } from '../auditRunner.js';
2
2
  import { AuditAbortedError, AuditHandoffError } from '../types.js';
3
3
  import { initParsers } from '../languages/index.js';
4
+ import { CodeIndexDB } from '../codeIndexDB.js';
4
5
  import { continuationConfigAfterHandoff, toAuditRunnerOptions, } from './auditWorkerProtocol.js';
5
6
  const abortControllers = new Map();
6
7
  /** One audit at a time per process so the parent can safely recycle workers on timeout. */
@@ -25,6 +26,10 @@ async function handleRun(message) {
25
26
  const base = toAuditRunnerOptions(message.config);
26
27
  const runner = createAuditRunner({
27
28
  ...base,
29
+ // The parent (runAuditJob) is the single ledger writer; a worker writing
30
+ // the ledger concurrently contends with the parent's syncFileIndex
31
+ // (SQLITE_BUSY) and pollutes listRuns with stray completed rows.
32
+ writeToLedger: false,
28
33
  abortSignal: ac.signal,
29
34
  progressCallback: (progress) => {
30
35
  send({
@@ -36,6 +41,15 @@ async function handleRun(message) {
36
41
  },
37
42
  });
38
43
  const result = await runner.run();
44
+ // Close this worker's DB connection before signaling the parent. The
45
+ // parent (runAuditJob) proceeds straight into syncFileIndex the moment it
46
+ // receives worker-result; if this worker is then SIGTERM'd by
47
+ // disposeAllWorkers while its syncStyleIndex-opened connection is still
48
+ // open, the abrupt exit leaves the shared WAL -shm in a state that makes
49
+ // the parent's next write fail with "database is locked". Closing here —
50
+ // before the send — guarantees the connection is gone by the time the
51
+ // parent reads the message.
52
+ CodeIndexDB.resetInstance();
39
53
  send({
40
54
  kind: 'worker-result',
41
55
  requestId,
@@ -44,6 +58,9 @@ async function handleRun(message) {
44
58
  });
45
59
  }
46
60
  catch (error) {
61
+ // Same rationale as the success path: never leave a DB connection open
62
+ // across the worker's (imminent) SIGTERM, whichever way this shard ends.
63
+ CodeIndexDB.resetInstance();
47
64
  if (error instanceof AuditHandoffError) {
48
65
  send({
49
66
  kind: 'worker-handoff',
@@ -118,6 +135,15 @@ process.on('message', (raw) => {
118
135
  });
119
136
  // ── Initialize parsers then signal readiness ──────────────────────────────
120
137
  async function main() {
138
+ // This process is a fresh exec of a forked parent (auditJobRunner) that may
139
+ // have left a module-level singleton on its stack before exec. The child does
140
+ // not inherit the parent's SQLite fd (better-sqlite3 opens it O_CLOEXEC), but
141
+ // the singleton module state — `isInitialized = true` and a stale native
142
+ // handle — does carry over if the parent initialized the parser before
143
+ // forking. Reset the singleton immediately so this worker drops any inherited
144
+ // module state and the worker's own audit-runner opens a fresh per-process
145
+ // connection.
146
+ CodeIndexDB.resetInstance();
121
147
  await initParsers();
122
148
  send({
123
149
  kind: 'worker-ready',
@@ -1 +1 @@
1
- {"version":3,"file":"auditWorker.js","sourceRoot":"","sources":["../../src/workers/auditWorker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"auditWorker.js","sourceRoot":"","sources":["../../src/workers/auditWorker.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "code-auditor-mcp",
3
- "version": "3.4.14",
3
+ "version": "3.4.16",
4
4
  "description": "Architectural invariants and code quality analysis, enforced inside your AI agent's edit loop. MCP server + CLI + Claude Code plugin. TypeScript, JavaScript, Go.",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -33,7 +33,7 @@
33
33
  "verify:dist": "npm pack --silent && bash scripts/verify-dist.sh && rm -f code-auditor-mcp-*.tgz",
34
34
  "verify:self": "node scripts/verify-self.mjs",
35
35
  "verify:gate-budget": "node scripts/verify-gate-budget.mjs",
36
- "verify:close": "npm run test && npm run test:integration && npm run verify:dist && npm run verify:self && npm run verify:gate-budget"
36
+ "verify:close": "npm run test && npm run test:integration && npm run verify:gate-budget && npm run verify:dist && npm run verify:self"
37
37
  },
38
38
  "keywords": [
39
39
  "mcp",
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "code-auditor",
3
3
  "description": "Diff-scoped code quality auditing on every edit. Indexes your codebase, enforces invariants, and feeds violations back to the agent so fixes happen inline.",
4
- "version": "3.4.13",
4
+ "version": "3.4.16",
5
5
  "author": {
6
6
  "name": "Ben Hammond",
7
7
  "email": "ben@benhammond.tech"