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
@@ -4,8 +4,9 @@
4
4
  */
5
5
  import Database from 'better-sqlite3';
6
6
  import type { CompleteProjectTaskResult, CreateProjectTaskInput, ListProjectTasksOptions, ListProjectTasksTreeNode, ProjectTask, ProjectTaskDeleteMode } from './types/projectTask.js';
7
- import { EnhancedFunctionMetadata, FunctionMetadata, SearchResult, SearchOptions, SchemaDefinition, SchemaIndexMetadata, SchemaUsage } from './types.js';
7
+ import { EnhancedFunctionMetadata, FunctionMetadata, DryFunctionIndexEntry, SearchResult, SearchOptions, SchemaDefinition, SchemaIndexMetadata, SchemaUsage } from './types.js';
8
8
  import { WhitelistEntry, WhitelistType, WhitelistStatus, WhitelistSuggestion } from './types/whitelist.js';
9
+ export declare const DB_BUSY_TIMEOUT_MS = 30000;
9
10
  export declare class CodeIndexDB {
10
11
  private static instance;
11
12
  /** Subclasses (e.g. EnhancedCodeIndexDB) need access for extra tables without `as any`. */
@@ -38,6 +39,12 @@ export declare class CodeIndexDB {
38
39
  static getInstance(dbPath?: string, projectRoot?: string): CodeIndexDB;
39
40
  /** Reset the singleton — used by tests that need a fresh in-memory instance. */
40
41
  static resetInstance(): void;
42
+ /**
43
+ * The project root the current singleton was opened for (undefined when opened
44
+ * cwd-scoped). Detached-job readers use this to resolve the same DB the writer
45
+ * opened, without re-resolving against cwd and flipping the singleton away.
46
+ */
47
+ static get currentProject(): string | undefined;
41
48
  initialize(): Promise<void>;
42
49
  private initializeInternal;
43
50
  private runMigrations;
@@ -56,11 +63,33 @@ export declare class CodeIndexDB {
56
63
  error: string;
57
64
  }>;
58
65
  }>;
66
+ /**
67
+ * Upsert/remove one file's function rows. Runs inside the caller's
68
+ * transaction (no nested `db.transaction` here) so a batch sync can wrap many
69
+ * files in a single write transaction.
70
+ */
71
+ private syncFileIndexRow;
59
72
  syncFileIndex(filePath: string, currentFunctions: (FunctionMetadata | EnhancedFunctionMetadata)[]): Promise<{
60
73
  added: number;
61
74
  updated: number;
62
75
  removed: number;
63
76
  }>;
77
+ /**
78
+ * Batch variant of {@link syncFileIndex}: upsert many files in a single write
79
+ * transaction, then rebuild the dependency graph once (unscoped). The
80
+ * detached-audit path previously called {@link syncFileIndex} once per file —
81
+ * one transaction plus one dependency-graph rebuild per file, and the
82
+ * rebuild's un-scoped `SELECT` made that O(files × functions). Collapsing it
83
+ * to one transaction is Amendment B2.
84
+ */
85
+ syncFileIndexBatch(entries: Array<{
86
+ filePath: string;
87
+ currentFunctions: (FunctionMetadata | EnhancedFunctionMetadata)[];
88
+ }>): Promise<{
89
+ added: number;
90
+ updated: number;
91
+ removed: number;
92
+ }>;
64
93
  updateDependencyGraph(filePath?: string): Promise<void>;
65
94
  getTransitiveDependencies(functionName: string, maxDepth?: number): Promise<Array<{
66
95
  name: string;
@@ -77,6 +106,16 @@ export declare class CodeIndexDB {
77
106
  private rowToFunctionDoc;
78
107
  findDefinition(name: string, filePath?: string): Promise<EnhancedFunctionMetadata | null>;
79
108
  getAllFunctions(): Promise<EnhancedFunctionMetadata[]>;
109
+ /**
110
+ * Narrow variant for the scoped-DRY gate path (Spec 43 R4). Selects only the
111
+ * columns `buildFullFunctionHashmap` reads — name, file_path, start_line,
112
+ * line_number, body — so the hot `changed` path skips the wide JSON columns
113
+ * (`parameters`, `hooks`, `props`, `signature`, `metadata_json`,
114
+ * `content_hash`) and their per-row `JSON.parse` cost.
115
+ */
116
+ getAllFunctionsForDry(): Promise<DryFunctionIndexEntry[]>;
117
+ /** Row count of the `functions` table — for callers that only need `.length`. */
118
+ getFunctionCount(): Promise<number>;
80
119
  getStats(): Promise<{
81
120
  totalFunctions: number;
82
121
  languages: Record<string, number>;
@@ -1 +1 @@
1
- {"version":3,"file":"codeIndexDB.d.ts","sourceRoot":"","sources":["../src/codeIndexDB.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeIndexDB.d.ts","sourceRoot":"","sources":["../src/codeIndexDB.ts"],"names":[],"mappings":"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"}
@@ -17,6 +17,14 @@ import { QueryParser, compileToSQL } from './search/QueryParser.js';
17
17
  import { getPersistedStorageRoot, resolvePersistedIndexPath } from './dataPaths.js';
18
18
  import { ContextualError, getErrnoCode } from './mcpToolErrors.js';
19
19
  import { WhitelistType, WhitelistStatus } from './types/whitelist.js';
20
+ // ── SQLite busy timeout ─────────────────────────────────────────────────
21
+ // The database is shared across forked processes (a detached audit runner and
22
+ // its shard workers). better-sqlite3's default busy timeout (~5s) is too short
23
+ // for a running job's long completion transaction, so a queued job's lease
24
+ // `BEGIN IMMEDIATE` (or the runner's own writes) would throw SQLITE_BUSY
25
+ // ("database is locked") instead of waiting. A generous timeout makes
26
+ // contention block gracefully; the lease loop also retries SQLITE_BUSY.
27
+ export const DB_BUSY_TIMEOUT_MS = 30_000;
20
28
  // ── Content hash ────────────────────────────────────────────────────────
21
29
  function computeContentHash(body, signature) {
22
30
  const normalized = (body ?? '').replace(/\s+/g, ' ').trim() + '|' + (signature ?? '').trim();
@@ -233,7 +241,7 @@ export class CodeIndexDB {
233
241
  taskRepository = null;
234
242
  stmts = new Map();
235
243
  // ── Schema version ──────────────────────────────────────────────────
236
- static SCHEMA_VERSION = 8;
244
+ static SCHEMA_VERSION = 11;
237
245
  constructor(dbPath = ':memory:') {
238
246
  this.dbPath = dbPath === ':memory:' ? dbPath : path.resolve(dbPath);
239
247
  }
@@ -279,6 +287,14 @@ export class CodeIndexDB {
279
287
  }
280
288
  CodeIndexDB.instance = null;
281
289
  }
290
+ /**
291
+ * The project root the current singleton was opened for (undefined when opened
292
+ * cwd-scoped). Detached-job readers use this to resolve the same DB the writer
293
+ * opened, without re-resolving against cwd and flipping the singleton away.
294
+ */
295
+ static get currentProject() {
296
+ return CodeIndexDB.currentProjectRoot;
297
+ }
282
298
  // ── Lifecycle ───────────────────────────────────────────────────────
283
299
  async initialize() {
284
300
  if (this.isInitialized)
@@ -333,7 +349,7 @@ export class CodeIndexDB {
333
349
  // Open SQLite database (with auto-recovery for corrupted files)
334
350
  let retried = false;
335
351
  try {
336
- this.db = new Database(this.dbPath);
352
+ this.db = new Database(this.dbPath, { timeout: DB_BUSY_TIMEOUT_MS });
337
353
  this.db.pragma('journal_mode = WAL');
338
354
  this.db.pragma('foreign_keys = ON');
339
355
  }
@@ -346,7 +362,7 @@ export class CodeIndexDB {
346
362
  await fs.unlink(this.dbPath);
347
363
  }
348
364
  catch { /* ignore */ }
349
- this.db = new Database(this.dbPath);
365
+ this.db = new Database(this.dbPath, { timeout: DB_BUSY_TIMEOUT_MS });
350
366
  this.db.pragma('journal_mode = WAL');
351
367
  this.db.pragma('foreign_keys = ON');
352
368
  }
@@ -592,6 +608,85 @@ export class CodeIndexDB {
592
608
  this.db.exec(`ALTER TABLE conventions ADD COLUMN export_kind TEXT`);
593
609
  }
594
610
  }
611
+ // Migration 8 → 9: Detached-run lifecycle + queryable coverage (Spec 41).
612
+ // `findings_ledger_runs` gains the job-lifecycle columns (status, timing,
613
+ // provenance, lease heartbeat, progress, stderr log); the one genuinely new
614
+ // table is `findings_ledger_coverage` (per-rule state + reason rows that
615
+ // `writeAuditToLedger` previously dropped).
616
+ if (currentVersion < 9) {
617
+ const runCols = this.db
618
+ .prepare(`PRAGMA table_info('findings_ledger_runs')`)
619
+ .all();
620
+ const hasRunCol = (name) => runCols.some((c) => c.name === name);
621
+ const newRunCols = [
622
+ ['status', "TEXT NOT NULL DEFAULT 'completed'"],
623
+ ['project_root', 'TEXT'],
624
+ ['started_at', 'TEXT'],
625
+ ['heartbeat_at', 'TEXT'],
626
+ ['finished_at', 'TEXT'],
627
+ ['error', 'TEXT'],
628
+ ['progress_json', 'TEXT'],
629
+ ['stderr_log', 'TEXT'],
630
+ ['content_hash', 'TEXT'],
631
+ ['files_count', 'INTEGER'],
632
+ ['file_manifest_json', 'TEXT'],
633
+ ];
634
+ for (const [name, decl] of newRunCols) {
635
+ if (!hasRunCol(name)) {
636
+ this.db.exec(`ALTER TABLE findings_ledger_runs ADD COLUMN ${name} ${decl}`);
637
+ }
638
+ }
639
+ this.db.exec(`
640
+ CREATE TABLE IF NOT EXISTS findings_ledger_coverage (
641
+ run_id TEXT NOT NULL REFERENCES findings_ledger_runs(run_id) ON DELETE CASCADE,
642
+ analyzer TEXT NOT NULL,
643
+ rule_id TEXT NOT NULL,
644
+ state TEXT NOT NULL,
645
+ count INTEGER NOT NULL DEFAULT 0,
646
+ reason TEXT,
647
+ PRIMARY KEY (run_id, analyzer, rule_id)
648
+ );
649
+ CREATE INDEX IF NOT EXISTS idx_ledger_coverage_run ON findings_ledger_coverage(run_id);
650
+ `);
651
+ }
652
+ // Migration 9 → 10: PID-based lease liveness (Spec 41 Amendment B).
653
+ // The heartbeat is no longer the primary liveness signal for the common
654
+ // case (a healthy child whose synchronous `syncFileIndex` phase starves the
655
+ // event loop, so its heartbeat interval cannot fire). The child records its
656
+ // PID + process start time + hostname at lease claim; `reclaimStaleRunning`
657
+ // then skips any `running` row whose PID is still the same live process, and
658
+ // only reclaims when the process is genuinely gone (or on a foreign host,
659
+ // where the PID means nothing and the heartbeat stays the fallback).
660
+ if (currentVersion < 10) {
661
+ const runCols = this.db
662
+ .prepare(`PRAGMA table_info('findings_ledger_runs')`)
663
+ .all();
664
+ const hasRunCol = (name) => runCols.some((c) => c.name === name);
665
+ const newRunCols = [
666
+ ['runner_pid', 'INTEGER'],
667
+ ['runner_pid_started_at', 'TEXT'],
668
+ ['runner_host', 'TEXT'],
669
+ ];
670
+ for (const [name, decl] of newRunCols) {
671
+ if (!hasRunCol(name)) {
672
+ this.db.exec(`ALTER TABLE findings_ledger_runs ADD COLUMN ${name} ${decl}`);
673
+ }
674
+ }
675
+ }
676
+ // Migration 10 → 11: unread stylesheet sources (Spec 42 R2).
677
+ // Records stylesheets whose dialect the style indexer cannot read, so
678
+ // styles/undefined-class can report notApplicable instead of asserting a
679
+ // class is undefined when it may live in one of these files.
680
+ if (currentVersion < 11) {
681
+ this.db.exec(`
682
+ CREATE TABLE IF NOT EXISTS style_unread_sources (
683
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
684
+ file_path TEXT NOT NULL UNIQUE,
685
+ reason TEXT NOT NULL,
686
+ created_at TEXT DEFAULT (datetime('now'))
687
+ );
688
+ `);
689
+ }
595
690
  }
596
691
  // ── SQLite schema ───────────────────────────────────────────────────
597
692
  createSchema() {
@@ -817,7 +912,21 @@ export class CodeIndexDB {
817
912
  target TEXT NOT NULL,
818
913
  duration_ms INTEGER NOT NULL DEFAULT 0,
819
914
  exit_status INTEGER NOT NULL DEFAULT 0,
820
- metadata_json TEXT DEFAULT '{}'
915
+ metadata_json TEXT DEFAULT '{}',
916
+ status TEXT NOT NULL DEFAULT 'completed',
917
+ project_root TEXT,
918
+ started_at TEXT,
919
+ heartbeat_at TEXT,
920
+ finished_at TEXT,
921
+ error TEXT,
922
+ progress_json TEXT,
923
+ stderr_log TEXT,
924
+ content_hash TEXT,
925
+ files_count INTEGER,
926
+ file_manifest_json TEXT,
927
+ runner_pid INTEGER,
928
+ runner_pid_started_at TEXT,
929
+ runner_host TEXT
821
930
  );
822
931
  CREATE TABLE IF NOT EXISTS findings_ledger_findings (
823
932
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -831,8 +940,18 @@ export class CodeIndexDB {
831
940
  symbol TEXT DEFAULT '',
832
941
  fingerprint TEXT NOT NULL
833
942
  );
943
+ CREATE TABLE IF NOT EXISTS findings_ledger_coverage (
944
+ run_id TEXT NOT NULL REFERENCES findings_ledger_runs(run_id) ON DELETE CASCADE,
945
+ analyzer TEXT NOT NULL,
946
+ rule_id TEXT NOT NULL,
947
+ state TEXT NOT NULL,
948
+ count INTEGER NOT NULL DEFAULT 0,
949
+ reason TEXT,
950
+ PRIMARY KEY (run_id, analyzer, rule_id)
951
+ );
834
952
  CREATE INDEX IF NOT EXISTS idx_ledger_runs_surface ON findings_ledger_runs(surface);
835
953
  CREATE INDEX IF NOT EXISTS idx_ledger_runs_timestamp ON findings_ledger_runs(timestamp);
954
+ CREATE INDEX IF NOT EXISTS idx_ledger_coverage_run ON findings_ledger_coverage(run_id);
836
955
  CREATE INDEX IF NOT EXISTS idx_ledger_findings_run ON findings_ledger_findings(run_id);
837
956
  CREATE INDEX IF NOT EXISTS idx_ledger_findings_fp ON findings_ledger_findings(fingerprint);
838
957
  CREATE INDEX IF NOT EXISTS idx_ledger_findings_rule ON findings_ledger_findings(analyzer, rule);
@@ -887,6 +1006,16 @@ export class CodeIndexDB {
887
1006
  CREATE INDEX IF NOT EXISTS idx_style_class_usage_file ON style_class_usage(file_path);
888
1007
  CREATE INDEX IF NOT EXISTS idx_style_class_usage_unres ON style_class_usage(unresolvable);
889
1008
 
1009
+ -- Spec 42 R2: Stylesheet sources the style indexer could not read.
1010
+ -- When any rows exist, styles/undefined-class reports notApplicable
1011
+ -- instead of asserting a class is undefined (it may live in one of these).
1012
+ CREATE TABLE IF NOT EXISTS style_unread_sources (
1013
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
1014
+ file_path TEXT NOT NULL UNIQUE,
1015
+ reason TEXT NOT NULL,
1016
+ created_at TEXT DEFAULT (datetime('now'))
1017
+ );
1018
+
890
1019
  -- Spec 12: Convention mining
891
1020
  CREATE TABLE IF NOT EXISTS conventions (
892
1021
  id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -1020,7 +1149,7 @@ export class CodeIndexDB {
1020
1149
  }
1021
1150
  // Rename old LokiJS file FIRST, then create fresh SQLite DB
1022
1151
  require('fs').renameSync(this.dbPath, bakPath);
1023
- const migDb = new Database(this.dbPath);
1152
+ const migDb = new Database(this.dbPath, { timeout: DB_BUSY_TIMEOUT_MS });
1024
1153
  migDb.pragma('journal_mode = WAL');
1025
1154
  migDb.pragma('foreign_keys = ON');
1026
1155
  // User-authored tables only (function index gets rebuilt by sync).
@@ -1309,52 +1438,72 @@ export class CodeIndexDB {
1309
1438
  errors: errors
1310
1439
  };
1311
1440
  }
1441
+ /**
1442
+ * Upsert/remove one file's function rows. Runs inside the caller's
1443
+ * transaction (no nested `db.transaction` here) so a batch sync can wrap many
1444
+ * files in a single write transaction.
1445
+ */
1446
+ syncFileIndexRow(filePath, currentFunctions, stats) {
1447
+ const existing = this.db.prepare('SELECT id, name, file_path, line_number FROM functions WHERE file_path = ?').all(filePath);
1448
+ const createKey = (f) => `${f.name ?? f.name}:${f.filePath ?? f.file_path}:${f.lineNumber ?? f.line_number}`;
1449
+ const currentMap = new Map(currentFunctions.map(f => [createKey(f), f]));
1450
+ // Insert/update current functions
1451
+ for (const func of currentFunctions) {
1452
+ const exists = existing.find(e => e.name === func.name && e.line_number === func.lineNumber);
1453
+ if (exists) {
1454
+ const row = this.functionToRow(func);
1455
+ const keys = Object.keys(row);
1456
+ const sets = keys.filter(k => k !== 'name' && k !== 'file_path').map(k => `"${k}" = @${k}`);
1457
+ const params = { ...row, _id: exists.id };
1458
+ this.db.prepare(`UPDATE functions SET ${sets.join(', ')} WHERE id = @_id`).run(params);
1459
+ stats.updated++;
1460
+ }
1461
+ else {
1462
+ const row = this.functionToRow(func);
1463
+ const keys = Object.keys(row);
1464
+ const sql = `INSERT INTO functions ("${keys.join('", "')}") VALUES (${keys.map(k => '@' + k).join(', ')})`;
1465
+ this.db.prepare(sql).run(row);
1466
+ stats.added++;
1467
+ }
1468
+ }
1469
+ // Remove stale functions
1470
+ for (const e of existing) {
1471
+ if (!currentMap.has(createKey(e))) {
1472
+ this.db.prepare('DELETE FROM functions WHERE id = ?').run(e.id);
1473
+ stats.removed++;
1474
+ }
1475
+ }
1476
+ }
1312
1477
  async syncFileIndex(filePath, currentFunctions) {
1313
1478
  this.ensureInitialized();
1314
1479
  const stats = { added: 0, updated: 0, removed: 0 };
1315
- const txn = this.db.transaction(() => {
1316
- const existing = this.db.prepare('SELECT id, name, file_path, line_number FROM functions WHERE file_path = ?').all(filePath);
1317
- const createKey = (f) => `${f.name ?? f.name}:${f.filePath ?? f.file_path}:${f.lineNumber ?? f.line_number}`;
1318
- const currentMap = new Map(currentFunctions.map(f => [createKey(f), f]));
1319
- // Insert/update current functions
1320
- for (const func of currentFunctions) {
1321
- const exists = existing.find(e => e.name === func.name && e.line_number === func.lineNumber);
1322
- if (exists) {
1323
- const row = this.functionToRow(func);
1324
- const keys = Object.keys(row);
1325
- const sets = keys.filter(k => k !== 'name' && k !== 'file_path').map(k => `"${k}" = @${k}`);
1326
- const params = { ...row, _id: exists.id };
1327
- this.db.prepare(`UPDATE functions SET ${sets.join(', ')} WHERE id = @_id`).run(params);
1328
- stats.updated++;
1329
- }
1330
- else {
1331
- const row = this.functionToRow(func);
1332
- const keys = Object.keys(row);
1333
- const sql = `INSERT INTO functions ("${keys.join('", "')}") VALUES (${keys.map(k => '@' + k).join(', ')})`;
1334
- this.db.prepare(sql).run(row);
1335
- stats.added++;
1336
- }
1337
- }
1338
- // Remove stale functions
1339
- for (const e of existing) {
1340
- if (!currentMap.has(createKey(e))) {
1341
- this.db.prepare('DELETE FROM functions WHERE id = ?').run(e.id);
1342
- stats.removed++;
1343
- }
1344
- }
1345
- });
1346
- txn();
1480
+ this.db.transaction(() => this.syncFileIndexRow(filePath, currentFunctions, stats)).immediate();
1347
1481
  await this.updateDependencyGraph(filePath);
1348
1482
  return stats;
1349
1483
  }
1484
+ /**
1485
+ * Batch variant of {@link syncFileIndex}: upsert many files in a single write
1486
+ * transaction, then rebuild the dependency graph once (unscoped). The
1487
+ * detached-audit path previously called {@link syncFileIndex} once per file —
1488
+ * one transaction plus one dependency-graph rebuild per file, and the
1489
+ * rebuild's un-scoped `SELECT` made that O(files × functions). Collapsing it
1490
+ * to one transaction is Amendment B2.
1491
+ */
1492
+ async syncFileIndexBatch(entries) {
1493
+ this.ensureInitialized();
1494
+ const stats = { added: 0, updated: 0, removed: 0 };
1495
+ this.db.transaction(() => {
1496
+ for (const { filePath, currentFunctions } of entries) {
1497
+ this.syncFileIndexRow(filePath, currentFunctions, stats);
1498
+ }
1499
+ }).immediate();
1500
+ await this.updateDependencyGraph();
1501
+ return stats;
1502
+ }
1350
1503
  // ── Dependency graph ────────────────────────────────────────────────
1351
1504
  async updateDependencyGraph(filePath) {
1352
1505
  this.ensureInitialized();
1353
1506
  const txn = this.db.transaction(() => {
1354
- // For functions in scope, rebuild their call edges
1355
- const functions = filePath
1356
- ? this.db.prepare('SELECT id, name, file_path FROM functions WHERE file_path = ?').all(filePath)
1357
- : this.db.prepare('SELECT id, name, file_path FROM functions').all();
1358
1507
  // Clear existing call edges for scoped functions
1359
1508
  if (filePath) {
1360
1509
  this.db.prepare(`DELETE FROM function_calls WHERE caller_id IN (SELECT id FROM functions WHERE file_path = ?)`).run(filePath);
@@ -1369,12 +1518,14 @@ export class CodeIndexDB {
1369
1518
  else {
1370
1519
  this.db.prepare('DELETE FROM function_dependencies').run();
1371
1520
  }
1372
- // Rebuild from metadata
1521
+ // Rebuild edges from metadata. When scoped to one file, read only that
1522
+ // file's functions — a per-file call previously re-read every function
1523
+ // in the index, making the detached-audit loop O(files × functions).
1373
1524
  const allFns = filePath
1374
- ? this.db.prepare('SELECT id, name, file_path, metadata_json FROM functions').all()
1525
+ ? this.db.prepare('SELECT id, name, file_path, metadata_json FROM functions WHERE file_path = ?').all(filePath)
1375
1526
  : this.db.prepare('SELECT id, name, file_path, metadata_json FROM functions').all();
1376
1527
  const insertCall = this.db.prepare('INSERT OR IGNORE INTO function_calls (caller_id, callee_name) VALUES (?, ?)');
1377
- const insertDep = this.db.prepare('INSERT OR IGNORE INTO function_dependencies (function_id, dependency) VALUES (?, ?)');
1528
+ const insertFnDep = this.db.prepare('INSERT OR IGNORE INTO function_dependencies (function_id, dependency) VALUES (?, ?)');
1378
1529
  for (const fn of allFns) {
1379
1530
  const meta = tryParseJson(fn.metadata_json) ?? {};
1380
1531
  if (meta.functionCalls) {
@@ -1382,11 +1533,6 @@ export class CodeIndexDB {
1382
1533
  insertCall.run(fn.id, callee);
1383
1534
  }
1384
1535
  }
1385
- }
1386
- // Also rebuild dependency edges from the functions' import data
1387
- const insertFnDep = this.db.prepare('INSERT OR IGNORE INTO function_dependencies (function_id, dependency) VALUES (?, ?)');
1388
- for (const fn of allFns) {
1389
- const meta = tryParseJson(fn.metadata_json) ?? {};
1390
1536
  // Add specifier-level dependencies (e.g., useState, useEffect)
1391
1537
  const usedImports = meta.usedImports ?? [];
1392
1538
  for (const imp of usedImports) {
@@ -1400,7 +1546,7 @@ export class CodeIndexDB {
1400
1546
  }
1401
1547
  }
1402
1548
  });
1403
- txn();
1549
+ txn.immediate();
1404
1550
  }
1405
1551
  async getTransitiveDependencies(functionName, maxDepth = 10) {
1406
1552
  this.ensureInitialized();
@@ -1641,6 +1787,32 @@ export class CodeIndexDB {
1641
1787
  const rows = this.db.prepare('SELECT * FROM functions').all();
1642
1788
  return rows.map((r) => this.rowToFunction(r));
1643
1789
  }
1790
+ /**
1791
+ * Narrow variant for the scoped-DRY gate path (Spec 43 R4). Selects only the
1792
+ * columns `buildFullFunctionHashmap` reads — name, file_path, start_line,
1793
+ * line_number, body — so the hot `changed` path skips the wide JSON columns
1794
+ * (`parameters`, `hooks`, `props`, `signature`, `metadata_json`,
1795
+ * `content_hash`) and their per-row `JSON.parse` cost.
1796
+ */
1797
+ async getAllFunctionsForDry() {
1798
+ this.ensureInitialized();
1799
+ const rows = this.db
1800
+ .prepare('SELECT name, file_path, start_line, line_number, body FROM functions')
1801
+ .all();
1802
+ return rows.map((r) => ({
1803
+ name: r.name,
1804
+ filePath: r.file_path,
1805
+ startLine: r.start_line ?? undefined,
1806
+ lineNumber: r.line_number ?? undefined,
1807
+ body: r.body ?? '',
1808
+ }));
1809
+ }
1810
+ /** Row count of the `functions` table — for callers that only need `.length`. */
1811
+ async getFunctionCount() {
1812
+ this.ensureInitialized();
1813
+ const row = this.db.prepare('SELECT COUNT(*) AS n FROM functions').get();
1814
+ return row?.n ?? 0;
1815
+ }
1644
1816
  async getStats() {
1645
1817
  this.ensureInitialized();
1646
1818
  const totalFunctions = this.db.prepare('SELECT COUNT(*) as cnt FROM functions').get().cnt;