@mnemonik/shared 5.131.2 → 5.135.4

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.
@@ -29,6 +29,16 @@ export interface ScanOptions {
29
29
  * doc-truth Fingerprint parsing. Operates on relative, forward-slash paths.
30
30
  */
31
31
  export declare const AUTHORITY_FILE_MATCHERS: Array<(relPath: string) => boolean>;
32
+ /**
33
+ * Segment-anchored match for the `tests/fixtures/` ignore pattern above —
34
+ * matches at the path root or immediately after a `/`, mirroring exactly
35
+ * what `shouldIgnore` compiles `'/tests/fixtures/*'` to. Exported so
36
+ * server-side consumers (e.g. the `/scan/push` route) and query-time
37
+ * consumers (e.g. `MemoryManager.searchCodePointers`'s hygiene exclusions)
38
+ * share one definition instead of hand-rolling copies that can drift.
39
+ */
40
+ export declare const FIXTURE_PATH_RE: RegExp;
41
+ export declare function isFixturePath(path: string): boolean;
32
42
  /**
33
43
  * True when `dirPath` is the root of a DIFFERENT repository than the one
34
44
  * being scanned: it carries its own `.git` entry. A `.git` FILE marks a
@@ -56,11 +66,31 @@ export declare class CodeScanner {
56
66
  * Prevents runaway recursion on deep/symlinked structures
57
67
  */
58
68
  private static readonly MAX_DEPTH;
69
+ /**
70
+ * Symlink confinement shared by every walker (traverseDirectory,
71
+ * traversePaths, collectAuthorityFiles): true when the symlink at
72
+ * `fullPath` resolves inside `rootPath` and may be followed, false when
73
+ * it escapes the project root. A dangling link (realpath ENOENT) throws
74
+ * to the caller's per-entry handler.
75
+ */
76
+ private confineSymlink;
59
77
  /**
60
78
  * Scan a directory recursively and extract code chunks
61
79
  * Added max depth (10) to prevent infinite recursion
62
80
  */
63
81
  scanDirectory(rootPath: string): Promise<CodeChunk[]>;
82
+ /**
83
+ * Completeness-aware variant of `scanDirectory`. `complete === false`
84
+ * means at least one fs error was swallowed during the walk, so the
85
+ * chunk set may be missing files that still exist on disk — callers
86
+ * deriving removals from the result must not trust it as an inventory.
87
+ * Chunks are secret-scrubbed before returning (same daemon-side
88
+ * redaction guarantee as `scanFiles`).
89
+ */
90
+ scanDirectoryWithStatus(rootPath: string): Promise<{
91
+ chunks: CodeChunk[];
92
+ complete: boolean;
93
+ }>;
64
94
  /**
65
95
  * Enumerate scan-eligible relative file paths under `rootPath` without
66
96
  * reading or chunking content. Same walk + ignorePatterns + extension
@@ -78,12 +108,34 @@ export declare class CodeScanner {
78
108
  * malformed entry from failing the entire reconcile push.
79
109
  */
80
110
  listFiles(rootPath: string): Promise<string[]>;
111
+ /**
112
+ * Completeness-aware variant of `listFiles`. `complete === false` means
113
+ * an fs error truncated part of the walk — the returned paths may be
114
+ * missing files that still exist on disk. The daemon's reconcile channel
115
+ * MUST NOT derive removedFiles from an incomplete inventory (a truncated
116
+ * walk otherwise reads as mass deletion and deprecates live memories).
117
+ */
118
+ listFilesWithStatus(rootPath: string): Promise<{
119
+ paths: string[];
120
+ complete: boolean;
121
+ }>;
81
122
  private traversePaths;
82
123
  /**
83
124
  * Scan specific files and extract code chunks.
84
125
  * Pass rootPath to compute proper relative file paths in chunk metadata.
85
126
  */
86
127
  scanFiles(filePaths: string[], rootPath: string): Promise<CodeChunk[]>;
128
+ /**
129
+ * Daemon-side secret redaction: scrub credentials from chunk content
130
+ * before they leave this process. contentHash is recomputed from the
131
+ * scrubbed content so the server-side dedup cache (which keys on
132
+ * contentHash) hits when team members push the same scrubbed text.
133
+ * Server still re-applies scrubSecrets in the /scan/push handler as
134
+ * defense in depth (idempotent). Shared by `scanFiles` (watcher path)
135
+ * and `scanDirectoryWithStatus` (initial/full-rescan path) so both
136
+ * honor the same redaction guarantee.
137
+ */
138
+ private scrubChunks;
87
139
  /**
88
140
  * Recursively traverse directory
89
141
  * Added depth parameter with max limit
@@ -157,5 +209,20 @@ export declare class CodeScanner {
157
209
  content: string;
158
210
  hash: string;
159
211
  }>>;
212
+ /**
213
+ * Completeness-aware variant of `collectAuthorityFiles`. `complete ===
214
+ * false` means an fs error hid part of the walk, so authority paths may
215
+ * be missing — the daemon folds this into the same removal gate as
216
+ * `listFilesWithStatus` (a partial authority walk would likewise drop
217
+ * inventory entries and read as deletion).
218
+ */
219
+ collectAuthorityFilesWithStatus(projectRoot: string): Promise<{
220
+ files: Array<{
221
+ path: string;
222
+ content: string;
223
+ hash: string;
224
+ }>;
225
+ complete: boolean;
226
+ }>;
160
227
  }
161
228
  //# sourceMappingURL=codeScanner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeScanner.d.ts","sourceRoot":"","sources":["../src/codeScanner.ts"],"names":[],"mappings":"AAAA;;GAEG;AAcH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,UAAU,GAAG,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC;QACjB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH;AAED,MAAM,WAAW,WAAW;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AAqED;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAiBvE,CAAC;AAEF;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAWrE;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAAwB;gBAE3B,OAAO,GAAE,WAAgB;IAIrC;;;;;OAKG;YACW,uBAAuB;IAarC;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAM;IAEvC;;;OAGG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAM3D;;;;;;;;;;;;;;;OAeG;IACG,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAMtC,aAAa;IA8C3B;;;OAGG;IACG,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA2C5E;;;OAGG;YACW,iBAAiB;IAgE/B;;;;;;;OAOG;IACH,OAAO,CAAC,YAAY;IAepB;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,aAAa,CAAoB;YAE3C,SAAS;IAyFvB;;OAEG;IACH,OAAO,CAAC,cAAc;IAwBtB;;OAEG;IACH,OAAO,CAAC,aAAa;IAoFrB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA0GzB;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAoE/B;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAqD3B;;;;;;;;;;;;;;OAcG;IACH,OAAO,CAAC,QAAQ;IA2FhB;;OAEG;IACH,OAAO,CAAC,IAAI;IAIZ;;;;OAIG;IACG,qBAAqB,CACzB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAqCnE"}
1
+ {"version":3,"file":"codeScanner.d.ts","sourceRoot":"","sources":["../src/codeScanner.ts"],"names":[],"mappings":"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"}
@@ -49,6 +49,23 @@ const DEFAULT_OPTIONS = {
49
49
  '*.bundle.js',
50
50
  '*.legacy.js',
51
51
  '*.map',
52
+ // Test fixture snapshot directories — historical before/after doc-truth
53
+ // dogfood copies (e.g. tests/fixtures/docTruth/*/before/src/...) were
54
+ // getting indexed as if they were real source, and a stale snapshot
55
+ // chunk could outrank the genuine file it duplicates in code_search
56
+ // (MemoryManager.searchCodePointers has a matching interim query-time
57
+ // exclusion for already-indexed rows; this is the scanner-level fix so
58
+ // new scans never pick them up in the first place). Retroactive cleanup
59
+ // of already-indexed fixture chunks happens on the next inventory diff —
60
+ // the daemon picks this up at its next package release, the in-process
61
+ // refresh tool gets it immediately.
62
+ //
63
+ // Leading '/' = segment-anchored (see shouldIgnore): matches tests/fixtures/
64
+ // at the path root or immediately after a '/' — so nested dirs like
65
+ // packages/x/tests/fixtures/ are also excluded, but integration-tests/fixtures/
66
+ // is NOT. The previous unanchored 'tests/fixtures/*' compiled to a bare
67
+ // substring regex and wrongly excluded any directory merely ENDING in "tests".
68
+ '/tests/fixtures/*',
52
69
  // NOTE: transient agent worktrees (previously `.claude/worktrees/*`
53
70
  // here) are no longer excluded by path convention. Linked worktrees,
54
71
  // nested clones, and submodules are all excluded generically by the
@@ -100,6 +117,18 @@ export const AUTHORITY_FILE_MATCHERS = [
100
117
  // every schema_table_enumeration claim falls to unverifiable.
101
118
  (p) => /^migrations\/.*\.sql$/.test(p),
102
119
  ];
120
+ /**
121
+ * Segment-anchored match for the `tests/fixtures/` ignore pattern above —
122
+ * matches at the path root or immediately after a `/`, mirroring exactly
123
+ * what `shouldIgnore` compiles `'/tests/fixtures/*'` to. Exported so
124
+ * server-side consumers (e.g. the `/scan/push` route) and query-time
125
+ * consumers (e.g. `MemoryManager.searchCodePointers`'s hygiene exclusions)
126
+ * share one definition instead of hand-rolling copies that can drift.
127
+ */
128
+ export const FIXTURE_PATH_RE = /(^|\/)tests\/fixtures\//;
129
+ export function isFixturePath(path) {
130
+ return FIXTURE_PATH_RE.test(path);
131
+ }
103
132
  /**
104
133
  * True when `dirPath` is the root of a DIFFERENT repository than the one
105
134
  * being scanned: it carries its own `.git` entry. A `.git` FILE marks a
@@ -150,15 +179,40 @@ export class CodeScanner {
150
179
  * Prevents runaway recursion on deep/symlinked structures
151
180
  */
152
181
  static MAX_DEPTH = 10;
182
+ /**
183
+ * Symlink confinement shared by every walker (traverseDirectory,
184
+ * traversePaths, collectAuthorityFiles): true when the symlink at
185
+ * `fullPath` resolves inside `rootPath` and may be followed, false when
186
+ * it escapes the project root. A dangling link (realpath ENOENT) throws
187
+ * to the caller's per-entry handler.
188
+ */
189
+ async confineSymlink(fullPath, rootPath) {
190
+ const resolved = await realpath(fullPath);
191
+ const resolvedRoot = await realpath(rootPath);
192
+ return resolved.startsWith(resolvedRoot + '/') || resolved === resolvedRoot;
193
+ }
153
194
  /**
154
195
  * Scan a directory recursively and extract code chunks
155
196
  * Added max depth (10) to prevent infinite recursion
156
197
  */
157
198
  async scanDirectory(rootPath) {
158
- const chunks = [];
159
- await this.traverseDirectory(rootPath, rootPath, chunks, 0);
199
+ const { chunks } = await this.scanDirectoryWithStatus(rootPath);
160
200
  return chunks;
161
201
  }
202
+ /**
203
+ * Completeness-aware variant of `scanDirectory`. `complete === false`
204
+ * means at least one fs error was swallowed during the walk, so the
205
+ * chunk set may be missing files that still exist on disk — callers
206
+ * deriving removals from the result must not trust it as an inventory.
207
+ * Chunks are secret-scrubbed before returning (same daemon-side
208
+ * redaction guarantee as `scanFiles`).
209
+ */
210
+ async scanDirectoryWithStatus(rootPath) {
211
+ const chunks = [];
212
+ const walk = { complete: true };
213
+ await this.traverseDirectory(rootPath, rootPath, chunks, 0, walk);
214
+ return { chunks: this.scrubChunks(chunks), complete: walk.complete };
215
+ }
162
216
  /**
163
217
  * Enumerate scan-eligible relative file paths under `rootPath` without
164
218
  * reading or chunking content. Same walk + ignorePatterns + extension
@@ -176,26 +230,49 @@ export class CodeScanner {
176
230
  * malformed entry from failing the entire reconcile push.
177
231
  */
178
232
  async listFiles(rootPath) {
233
+ const { paths } = await this.listFilesWithStatus(rootPath);
234
+ return paths;
235
+ }
236
+ /**
237
+ * Completeness-aware variant of `listFiles`. `complete === false` means
238
+ * an fs error truncated part of the walk — the returned paths may be
239
+ * missing files that still exist on disk. The daemon's reconcile channel
240
+ * MUST NOT derive removedFiles from an incomplete inventory (a truncated
241
+ * walk otherwise reads as mass deletion and deprecates live memories).
242
+ */
243
+ async listFilesWithStatus(rootPath) {
179
244
  const paths = [];
180
- await this.traversePaths(rootPath, rootPath, paths, 0);
181
- return paths.filter((p) => !/(^|[/\\])\.\.([/\\]|$)/.test(p));
245
+ const walk = { complete: true };
246
+ await this.traversePaths(rootPath, rootPath, paths, 0, walk);
247
+ return {
248
+ paths: paths.filter((p) => !/(^|[/\\])\.\.([/\\]|$)/.test(p)),
249
+ complete: walk.complete,
250
+ };
182
251
  }
183
- async traversePaths(currentPath, rootPath, out, depth) {
252
+ async traversePaths(currentPath, rootPath, out, depth, walk) {
184
253
  if (depth >= CodeScanner.MAX_DEPTH)
185
254
  return;
255
+ let entries;
186
256
  try {
187
- const entries = await withTimeout(readdir(currentPath), FILE_OP_TIMEOUT_MS, `readdir timed out: ${currentPath}`);
188
- for (const entry of entries) {
189
- const fullPath = join(currentPath, entry);
190
- const relativePath = relative(rootPath, fullPath);
191
- if (this.shouldIgnore(relativePath))
192
- continue;
257
+ entries = await withTimeout(readdir(currentPath), FILE_OP_TIMEOUT_MS, `readdir timed out: ${currentPath}`);
258
+ }
259
+ catch (error) {
260
+ walk.complete = false;
261
+ logDebug('Error traversing directory (listFiles)', { path: currentPath, error });
262
+ return;
263
+ }
264
+ for (const entry of entries) {
265
+ const fullPath = join(currentPath, entry);
266
+ const relativePath = relative(rootPath, fullPath);
267
+ if (this.shouldIgnore(relativePath))
268
+ continue;
269
+ // Per-entry isolation: a single bad entry (dangling symlink, raced
270
+ // deletion, permission denial, fs timeout) must not abort the rest of
271
+ // the directory — but the inventory is no longer removal-trustworthy.
272
+ try {
193
273
  const lstats = await withTimeout(lstat(fullPath), FILE_OP_TIMEOUT_MS, `lstat timed out: ${fullPath}`);
194
- if (lstats.isSymbolicLink()) {
195
- const resolved = await realpath(fullPath);
196
- const resolvedRoot = await realpath(rootPath);
197
- if (!resolved.startsWith(resolvedRoot + '/') && resolved !== resolvedRoot)
198
- continue;
274
+ if (lstats.isSymbolicLink() && !(await this.confineSymlink(fullPath, rootPath))) {
275
+ continue;
199
276
  }
200
277
  const stats = lstats.isSymbolicLink()
201
278
  ? await withTimeout(stat(fullPath), FILE_OP_TIMEOUT_MS, `stat timed out: ${fullPath}`)
@@ -203,7 +280,7 @@ export class CodeScanner {
203
280
  if (stats.isDirectory()) {
204
281
  if (await isGitBoundary(fullPath))
205
282
  continue; // another repo's subtree
206
- await this.traversePaths(fullPath, rootPath, out, depth + 1);
283
+ await this.traversePaths(fullPath, rootPath, out, depth + 1, walk);
207
284
  }
208
285
  else if (stats.isFile()) {
209
286
  if (this.options.includeExtensions.includes(extname(fullPath))) {
@@ -211,9 +288,10 @@ export class CodeScanner {
211
288
  }
212
289
  }
213
290
  }
214
- }
215
- catch (error) {
216
- logDebug('Error traversing directory (listFiles)', { path: currentPath, error });
291
+ catch (error) {
292
+ walk.complete = false;
293
+ logDebug('Error traversing directory (listFiles)', { path: fullPath, error });
294
+ }
217
295
  }
218
296
  }
219
297
  /**
@@ -244,12 +322,19 @@ export class CodeScanner {
244
322
  logDebug('Error scanning file', { filePath, error });
245
323
  }
246
324
  }
247
- // Daemon-side secret redaction: scrub credentials from chunk content
248
- // before they leave this process. contentHash is recomputed from the
249
- // scrubbed content so the server-side dedup cache (which keys on
250
- // contentHash) hits when team members push the same scrubbed text.
251
- // Server still re-applies scrubSecrets in the /scan/push handler as
252
- // defense in depth (idempotent).
325
+ return this.scrubChunks(chunks);
326
+ }
327
+ /**
328
+ * Daemon-side secret redaction: scrub credentials from chunk content
329
+ * before they leave this process. contentHash is recomputed from the
330
+ * scrubbed content so the server-side dedup cache (which keys on
331
+ * contentHash) hits when team members push the same scrubbed text.
332
+ * Server still re-applies scrubSecrets in the /scan/push handler as
333
+ * defense in depth (idempotent). Shared by `scanFiles` (watcher path)
334
+ * and `scanDirectoryWithStatus` (initial/full-rescan path) so both
335
+ * honor the same redaction guarantee.
336
+ */
337
+ scrubChunks(chunks) {
253
338
  return chunks.map((chunk) => {
254
339
  const scrubbed = scrubSecrets(chunk.content);
255
340
  if (scrubbed === chunk.content)
@@ -265,30 +350,37 @@ export class CodeScanner {
265
350
  * Recursively traverse directory
266
351
  * Added depth parameter with max limit
267
352
  */
268
- async traverseDirectory(currentPath, rootPath, chunks, depth) {
353
+ async traverseDirectory(currentPath, rootPath, chunks, depth, walk) {
269
354
  // Prevent infinite recursion
270
355
  if (depth >= CodeScanner.MAX_DEPTH) {
271
356
  logDebug('Max directory depth reached, skipping', { path: currentPath, depth });
272
357
  return;
273
358
  }
359
+ // Wrap readdir with timeout to prevent hanging
360
+ let entries;
274
361
  try {
275
- // Wrap readdir with timeout to prevent hanging
276
- const entries = await withTimeout(readdir(currentPath), FILE_OP_TIMEOUT_MS, `readdir timed out: ${currentPath}`);
277
- for (const entry of entries) {
278
- const fullPath = join(currentPath, entry);
279
- const relativePath = relative(rootPath, fullPath);
280
- // Check ignore patterns
281
- if (this.shouldIgnore(relativePath)) {
282
- continue;
283
- }
362
+ entries = await withTimeout(readdir(currentPath), FILE_OP_TIMEOUT_MS, `readdir timed out: ${currentPath}`);
363
+ }
364
+ catch (error) {
365
+ walk.complete = false;
366
+ logDebug('Error traversing directory', { path: currentPath, error });
367
+ return;
368
+ }
369
+ for (const entry of entries) {
370
+ const fullPath = join(currentPath, entry);
371
+ const relativePath = relative(rootPath, fullPath);
372
+ // Check ignore patterns
373
+ if (this.shouldIgnore(relativePath)) {
374
+ continue;
375
+ }
376
+ // Per-entry isolation: a single bad entry (dangling symlink, raced
377
+ // deletion, permission denial, fs timeout) must not abort the rest of
378
+ // the directory — but the scan is no longer removal-trustworthy.
379
+ try {
284
380
  const lstats = await withTimeout(lstat(fullPath), FILE_OP_TIMEOUT_MS, `lstat timed out: ${fullPath}`);
285
- if (lstats.isSymbolicLink()) {
286
- const resolved = await realpath(fullPath);
287
- const resolvedRoot = await realpath(rootPath);
288
- if (!resolved.startsWith(resolvedRoot + '/') && resolved !== resolvedRoot) {
289
- logDebug('Skipping symlink escaping project root', { fullPath, resolved, rootPath });
290
- continue;
291
- }
381
+ if (lstats.isSymbolicLink() && !(await this.confineSymlink(fullPath, rootPath))) {
382
+ logDebug('Skipping symlink escaping project root', { fullPath, rootPath });
383
+ continue;
292
384
  }
293
385
  const stats = lstats.isSymbolicLink()
294
386
  ? await withTimeout(stat(fullPath), FILE_OP_TIMEOUT_MS, `stat timed out: ${fullPath}`)
@@ -296,7 +388,7 @@ export class CodeScanner {
296
388
  if (stats.isDirectory()) {
297
389
  if (await isGitBoundary(fullPath))
298
390
  continue; // another repo's subtree
299
- await this.traverseDirectory(fullPath, rootPath, chunks, depth + 1);
391
+ await this.traverseDirectory(fullPath, rootPath, chunks, depth + 1, walk);
300
392
  }
301
393
  else if (stats.isFile()) {
302
394
  const ext = extname(fullPath);
@@ -306,9 +398,10 @@ export class CodeScanner {
306
398
  }
307
399
  }
308
400
  }
309
- }
310
- catch (error) {
311
- logDebug('Error traversing directory', { path: currentPath, error });
401
+ catch (error) {
402
+ walk.complete = false;
403
+ logDebug('Error traversing directory', { path: fullPath, error });
404
+ }
312
405
  }
313
406
  }
314
407
  /**
@@ -323,9 +416,19 @@ export class CodeScanner {
323
416
  const segments = path.split('/');
324
417
  return this.options.ignorePatterns.some((pattern) => {
325
418
  if (pattern.includes('*')) {
419
+ // A leading '/' opts a glob pattern into SEGMENT-ANCHORED matching:
420
+ // the pattern body must start at the beginning of the path or right
421
+ // after a '/'. Without it, glob patterns keep their historical
422
+ // unanchored substring semantics — anchoring is opt-in per pattern so
423
+ // this change cannot alter any existing pattern's behavior.
424
+ // (Motivating bug: unanchored 'tests/fixtures/*' also matched
425
+ // 'integration-tests/fixtures/…' in every indexed project.)
426
+ const anchored = pattern.startsWith('/');
427
+ const body = anchored ? pattern.slice(1) : pattern;
326
428
  // Escape regex special chars, then replace all * with .*
327
- const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
328
- const regex = new RegExp(escaped.replace(/\*/g, '.*'));
429
+ const escaped = body.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
430
+ const source = escaped.replace(/\*/g, '.*');
431
+ const regex = new RegExp(anchored ? `(^|/)${source}` : source);
329
432
  return regex.test(path);
330
433
  }
331
434
  // For non-glob patterns, check if any path segment matches exactly
@@ -352,7 +455,18 @@ export class CodeScanner {
352
455
  return [];
353
456
  }
354
457
  // Wrap readFile with timeout
355
- const content = await withTimeout(readFile(filePath, 'utf-8'), FILE_OP_TIMEOUT_MS, `readFile timed out: ${filePath}`);
458
+ let content = await withTimeout(readFile(filePath, 'utf-8'), FILE_OP_TIMEOUT_MS, `readFile timed out: ${filePath}`);
459
+ // NUL sanitation (ingestion boundary, daemon side): Postgres `text`
460
+ // columns reject the literal NUL byte (U+0000) — a single one aborts
461
+ // the whole INSERT/UPDATE. Some source files legitimately contain
462
+ // them. Strip before any chunking so every chunk's content, its
463
+ // contentHash, and its embedding all agree — mirrors the server-side
464
+ // strip in ProjectManager (kept as defense in depth for content that
465
+ // reaches the server via an older scanner) but doing it here means
466
+ // the daemon never even transmits the NUL bytes.
467
+ if (content.includes('\0')) {
468
+ content = content.replace(/\0/g, '');
469
+ }
356
470
  const relativePath = relative(rootPath, filePath);
357
471
  const language = this.detectLanguage(filePath);
358
472
  // Try to extract functions/classes
@@ -842,7 +956,19 @@ export class CodeScanner {
842
956
  * (not includeExtensions). Content-only — no chunking, no embeddings.
843
957
  */
844
958
  async collectAuthorityFiles(projectRoot) {
959
+ const { files } = await this.collectAuthorityFilesWithStatus(projectRoot);
960
+ return files;
961
+ }
962
+ /**
963
+ * Completeness-aware variant of `collectAuthorityFiles`. `complete ===
964
+ * false` means an fs error hid part of the walk, so authority paths may
965
+ * be missing — the daemon folds this into the same removal gate as
966
+ * `listFilesWithStatus` (a partial authority walk would likewise drop
967
+ * inventory entries and read as deletion).
968
+ */
969
+ async collectAuthorityFilesWithStatus(projectRoot) {
845
970
  const out = [];
971
+ const walkState = { complete: true };
846
972
  // M2: cap walk depth to match the scanner's MAX_DEPTH (10)
847
973
  const walk = async (dir, depth) => {
848
974
  if (depth >= CodeScanner.MAX_DEPTH)
@@ -852,6 +978,7 @@ export class CodeScanner {
852
978
  entries = await readdir(dir, { withFileTypes: true });
853
979
  }
854
980
  catch {
981
+ walkState.complete = false;
855
982
  return;
856
983
  }
857
984
  for (const ent of entries) {
@@ -859,29 +986,60 @@ export class CodeScanner {
859
986
  const rel = relative(projectRoot, full).split(sep).join('/');
860
987
  if (this.shouldIgnore(rel))
861
988
  continue;
862
- if (ent.isDirectory()) {
989
+ // Resolve the entry kind through symlinks, confined to the project
990
+ // root: a symlink named like an authority file (`package.json`,
991
+ // `.env.example`, ...) pointing outside the root would otherwise be
992
+ // read verbatim and exfiltrated to the server. Same predicate as
993
+ // traverseDirectory/traversePaths (confineSymlink). Confined
994
+ // symlinked directories are traversed (Dirent.isDirectory() is
995
+ // false for them, so they were previously silently skipped).
996
+ let isDir = ent.isDirectory();
997
+ let isFile = ent.isFile();
998
+ if (ent.isSymbolicLink()) {
999
+ try {
1000
+ if (!(await this.confineSymlink(full, projectRoot)))
1001
+ continue;
1002
+ const stats = await stat(full);
1003
+ isDir = stats.isDirectory();
1004
+ isFile = stats.isFile();
1005
+ }
1006
+ catch {
1007
+ /* dangling/unreadable link — skip just this entry */
1008
+ walkState.complete = false;
1009
+ continue;
1010
+ }
1011
+ }
1012
+ if (isDir) {
863
1013
  if (await isGitBoundary(full))
864
1014
  continue; // another repo's subtree
865
1015
  await walk(full, depth + 1);
866
1016
  }
867
- else if (AUTHORITY_FILE_MATCHERS.some((m) => m(rel))) {
1017
+ else if (isFile && AUTHORITY_FILE_MATCHERS.some((m) => m(rel))) {
868
1018
  try {
869
- const content = await readFile(full, 'utf-8');
1019
+ let content = await readFile(full, 'utf-8');
870
1020
  // C2: skip files whose content exceeds the server's 5MB cap —
871
1021
  // manifests are tiny; an oversized one is anomalous.
872
1022
  if (content.length > 5_000_000)
873
1023
  continue;
1024
+ // NUL sanitation (ingestion boundary, daemon side): Postgres
1025
+ // `text` columns reject the literal NUL byte (U+0000). Authority
1026
+ // files are shipped verbatim (no chunking), so strip here before
1027
+ // hashing so the hash and the transmitted content always agree.
1028
+ if (content.includes('\0')) {
1029
+ content = content.replace(/\0/g, '');
1030
+ }
874
1031
  const hash = createHash('sha256').update(content).digest('hex');
875
1032
  out.push({ path: rel, content, hash });
876
1033
  }
877
1034
  catch {
878
1035
  /* unreadable — skip */
1036
+ walkState.complete = false;
879
1037
  }
880
1038
  }
881
1039
  }
882
1040
  };
883
1041
  await walk(projectRoot, 0);
884
- return out;
1042
+ return { files: out, complete: walkState.complete };
885
1043
  }
886
1044
  }
887
1045
  //# sourceMappingURL=codeScanner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codeScanner.js","sourceRoot":"","sources":["../src/codeScanner.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codeScanner.js","sourceRoot":"","sources":["../src/codeScanner.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -6,7 +6,7 @@
6
6
  */
7
7
  export { MCP_INSTRUCTIONS, MCP_INSTRUCTIONS_RAW, getMcpInstructions } from './instructions.js';
8
8
  export { USAGE_GUIDE } from './usageGuide.js';
9
- export { CodeScanner, AUTHORITY_FILE_MATCHERS, isGitBoundary, type CodeChunk, type ScanOptions, } from './codeScanner.js';
9
+ export { CodeScanner, AUTHORITY_FILE_MATCHERS, isGitBoundary, FIXTURE_PATH_RE, isFixturePath, type CodeChunk, type ScanOptions, } from './codeScanner.js';
10
10
  export { FileSystemReader, getFileSystemReader, type ScanFilesResult, type ChangedFilesResult, type FileData, } from './FileSystemReader.js';
11
11
  export { SECRET_PATTERNS, SECRET_REDACTION_PLACEHOLDER, scrubSecrets } from './secretPatterns.js';
12
12
  export { FETCH_TIMEOUT_MS, TELEMETRY_TIMEOUT_MS, POST_TOOL_TIMEOUT_MS, MCP_PRECHECK_TIMEOUT_MS, withHookTimeout, } from './hookTimeouts.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,aAAa,EACb,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,aAAa,EACb,eAAe,EACf,aAAa,EACb,KAAK,SAAS,EACd,KAAK,WAAW,GACjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,KAAK,eAAe,EACpB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@
6
6
  */
7
7
  export { MCP_INSTRUCTIONS, MCP_INSTRUCTIONS_RAW, getMcpInstructions } from './instructions.js';
8
8
  export { USAGE_GUIDE } from './usageGuide.js';
9
- export { CodeScanner, AUTHORITY_FILE_MATCHERS, isGitBoundary, } from './codeScanner.js';
9
+ export { CodeScanner, AUTHORITY_FILE_MATCHERS, isGitBoundary, FIXTURE_PATH_RE, isFixturePath, } from './codeScanner.js';
10
10
  export { FileSystemReader, getFileSystemReader, } from './FileSystemReader.js';
11
11
  export { SECRET_PATTERNS, SECRET_REDACTION_PLACEHOLDER, scrubSecrets } from './secretPatterns.js';
12
12
  export { FETCH_TIMEOUT_MS, TELEMETRY_TIMEOUT_MS, POST_TOOL_TIMEOUT_MS, MCP_PRECHECK_TIMEOUT_MS, withHookTimeout, } from './hookTimeouts.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,aAAa,GAGd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAIpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EACL,WAAW,EACX,uBAAuB,EACvB,aAAa,EACb,eAAe,EACf,aAAa,GAGd,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EACL,gBAAgB,EAChB,mBAAmB,GAIpB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,4BAA4B,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAClG,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,GAChB,MAAM,mBAAmB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mnemonik/shared",
3
- "version": "5.131.2",
3
+ "version": "5.135.4",
4
4
  "description": "Shared constants and utilities for Mnemonik packages",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -38,6 +38,18 @@ export interface ScanOptions {
38
38
  includeExtensions?: string[];
39
39
  }
40
40
 
41
+ /**
42
+ * Mutable per-walk state threaded through the recursive traversals.
43
+ * `complete` starts true and is latched false by any caught fs error
44
+ * (readdir failure, per-entry lstat/realpath/stat throw) — meaning the
45
+ * result may be missing entries that still exist on disk. Callers that
46
+ * derive *removals* from a walk must treat an incomplete walk as
47
+ * untrustworthy; adds/changes are unaffected.
48
+ */
49
+ interface WalkState {
50
+ complete: boolean;
51
+ }
52
+
41
53
  const DEFAULT_OPTIONS: Required<ScanOptions> = {
42
54
  maxChunkSize: 8000, // ~2000 tokens
43
55
  minChunkSize: 100,
@@ -76,6 +88,23 @@ const DEFAULT_OPTIONS: Required<ScanOptions> = {
76
88
  '*.bundle.js',
77
89
  '*.legacy.js',
78
90
  '*.map',
91
+ // Test fixture snapshot directories — historical before/after doc-truth
92
+ // dogfood copies (e.g. tests/fixtures/docTruth/*/before/src/...) were
93
+ // getting indexed as if they were real source, and a stale snapshot
94
+ // chunk could outrank the genuine file it duplicates in code_search
95
+ // (MemoryManager.searchCodePointers has a matching interim query-time
96
+ // exclusion for already-indexed rows; this is the scanner-level fix so
97
+ // new scans never pick them up in the first place). Retroactive cleanup
98
+ // of already-indexed fixture chunks happens on the next inventory diff —
99
+ // the daemon picks this up at its next package release, the in-process
100
+ // refresh tool gets it immediately.
101
+ //
102
+ // Leading '/' = segment-anchored (see shouldIgnore): matches tests/fixtures/
103
+ // at the path root or immediately after a '/' — so nested dirs like
104
+ // packages/x/tests/fixtures/ are also excluded, but integration-tests/fixtures/
105
+ // is NOT. The previous unanchored 'tests/fixtures/*' compiled to a bare
106
+ // substring regex and wrongly excluded any directory merely ENDING in "tests".
107
+ '/tests/fixtures/*',
79
108
  // NOTE: transient agent worktrees (previously `.claude/worktrees/*`
80
109
  // here) are no longer excluded by path convention. Linked worktrees,
81
110
  // nested clones, and submodules are all excluded generically by the
@@ -129,6 +158,19 @@ export const AUTHORITY_FILE_MATCHERS: Array<(relPath: string) => boolean> = [
129
158
  (p) => /^migrations\/.*\.sql$/.test(p),
130
159
  ];
131
160
 
161
+ /**
162
+ * Segment-anchored match for the `tests/fixtures/` ignore pattern above —
163
+ * matches at the path root or immediately after a `/`, mirroring exactly
164
+ * what `shouldIgnore` compiles `'/tests/fixtures/*'` to. Exported so
165
+ * server-side consumers (e.g. the `/scan/push` route) and query-time
166
+ * consumers (e.g. `MemoryManager.searchCodePointers`'s hygiene exclusions)
167
+ * share one definition instead of hand-rolling copies that can drift.
168
+ */
169
+ export const FIXTURE_PATH_RE = /(^|\/)tests\/fixtures\//;
170
+ export function isFixturePath(path: string): boolean {
171
+ return FIXTURE_PATH_RE.test(path);
172
+ }
173
+
132
174
  /**
133
175
  * True when `dirPath` is the root of a DIFFERENT repository than the one
134
176
  * being scanned: it carries its own `.git` entry. A `.git` FILE marks a
@@ -185,16 +227,45 @@ export class CodeScanner {
185
227
  */
186
228
  private static readonly MAX_DEPTH = 10;
187
229
 
230
+ /**
231
+ * Symlink confinement shared by every walker (traverseDirectory,
232
+ * traversePaths, collectAuthorityFiles): true when the symlink at
233
+ * `fullPath` resolves inside `rootPath` and may be followed, false when
234
+ * it escapes the project root. A dangling link (realpath ENOENT) throws
235
+ * to the caller's per-entry handler.
236
+ */
237
+ private async confineSymlink(fullPath: string, rootPath: string): Promise<boolean> {
238
+ const resolved = await realpath(fullPath);
239
+ const resolvedRoot = await realpath(rootPath);
240
+ return resolved.startsWith(resolvedRoot + '/') || resolved === resolvedRoot;
241
+ }
242
+
188
243
  /**
189
244
  * Scan a directory recursively and extract code chunks
190
245
  * Added max depth (10) to prevent infinite recursion
191
246
  */
192
247
  async scanDirectory(rootPath: string): Promise<CodeChunk[]> {
193
- const chunks: CodeChunk[] = [];
194
- await this.traverseDirectory(rootPath, rootPath, chunks, 0);
248
+ const { chunks } = await this.scanDirectoryWithStatus(rootPath);
195
249
  return chunks;
196
250
  }
197
251
 
252
+ /**
253
+ * Completeness-aware variant of `scanDirectory`. `complete === false`
254
+ * means at least one fs error was swallowed during the walk, so the
255
+ * chunk set may be missing files that still exist on disk — callers
256
+ * deriving removals from the result must not trust it as an inventory.
257
+ * Chunks are secret-scrubbed before returning (same daemon-side
258
+ * redaction guarantee as `scanFiles`).
259
+ */
260
+ async scanDirectoryWithStatus(
261
+ rootPath: string
262
+ ): Promise<{ chunks: CodeChunk[]; complete: boolean }> {
263
+ const chunks: CodeChunk[] = [];
264
+ const walk: WalkState = { complete: true };
265
+ await this.traverseDirectory(rootPath, rootPath, chunks, 0, walk);
266
+ return { chunks: this.scrubChunks(chunks), complete: walk.complete };
267
+ }
268
+
198
269
  /**
199
270
  * Enumerate scan-eligible relative file paths under `rootPath` without
200
271
  * reading or chunking content. Same walk + ignorePatterns + extension
@@ -212,38 +283,63 @@ export class CodeScanner {
212
283
  * malformed entry from failing the entire reconcile push.
213
284
  */
214
285
  async listFiles(rootPath: string): Promise<string[]> {
286
+ const { paths } = await this.listFilesWithStatus(rootPath);
287
+ return paths;
288
+ }
289
+
290
+ /**
291
+ * Completeness-aware variant of `listFiles`. `complete === false` means
292
+ * an fs error truncated part of the walk — the returned paths may be
293
+ * missing files that still exist on disk. The daemon's reconcile channel
294
+ * MUST NOT derive removedFiles from an incomplete inventory (a truncated
295
+ * walk otherwise reads as mass deletion and deprecates live memories).
296
+ */
297
+ async listFilesWithStatus(rootPath: string): Promise<{ paths: string[]; complete: boolean }> {
215
298
  const paths: string[] = [];
216
- await this.traversePaths(rootPath, rootPath, paths, 0);
217
- return paths.filter((p) => !/(^|[/\\])\.\.([/\\]|$)/.test(p));
299
+ const walk: WalkState = { complete: true };
300
+ await this.traversePaths(rootPath, rootPath, paths, 0, walk);
301
+ return {
302
+ paths: paths.filter((p) => !/(^|[/\\])\.\.([/\\]|$)/.test(p)),
303
+ complete: walk.complete,
304
+ };
218
305
  }
219
306
 
220
307
  private async traversePaths(
221
308
  currentPath: string,
222
309
  rootPath: string,
223
310
  out: string[],
224
- depth: number
311
+ depth: number,
312
+ walk: WalkState
225
313
  ): Promise<void> {
226
314
  if (depth >= CodeScanner.MAX_DEPTH) return;
315
+ let entries: string[];
227
316
  try {
228
- const entries = await withTimeout(
317
+ entries = await withTimeout(
229
318
  readdir(currentPath),
230
319
  FILE_OP_TIMEOUT_MS,
231
320
  `readdir timed out: ${currentPath}`
232
321
  );
233
- for (const entry of entries) {
234
- const fullPath = join(currentPath, entry);
235
- const relativePath = relative(rootPath, fullPath);
236
- if (this.shouldIgnore(relativePath)) continue;
237
-
322
+ } catch (error) {
323
+ walk.complete = false;
324
+ logDebug('Error traversing directory (listFiles)', { path: currentPath, error });
325
+ return;
326
+ }
327
+ for (const entry of entries) {
328
+ const fullPath = join(currentPath, entry);
329
+ const relativePath = relative(rootPath, fullPath);
330
+ if (this.shouldIgnore(relativePath)) continue;
331
+
332
+ // Per-entry isolation: a single bad entry (dangling symlink, raced
333
+ // deletion, permission denial, fs timeout) must not abort the rest of
334
+ // the directory — but the inventory is no longer removal-trustworthy.
335
+ try {
238
336
  const lstats = await withTimeout(
239
337
  lstat(fullPath),
240
338
  FILE_OP_TIMEOUT_MS,
241
339
  `lstat timed out: ${fullPath}`
242
340
  );
243
- if (lstats.isSymbolicLink()) {
244
- const resolved = await realpath(fullPath);
245
- const resolvedRoot = await realpath(rootPath);
246
- if (!resolved.startsWith(resolvedRoot + '/') && resolved !== resolvedRoot) continue;
341
+ if (lstats.isSymbolicLink() && !(await this.confineSymlink(fullPath, rootPath))) {
342
+ continue;
247
343
  }
248
344
  const stats = lstats.isSymbolicLink()
249
345
  ? await withTimeout(stat(fullPath), FILE_OP_TIMEOUT_MS, `stat timed out: ${fullPath}`)
@@ -251,15 +347,16 @@ export class CodeScanner {
251
347
 
252
348
  if (stats.isDirectory()) {
253
349
  if (await isGitBoundary(fullPath)) continue; // another repo's subtree
254
- await this.traversePaths(fullPath, rootPath, out, depth + 1);
350
+ await this.traversePaths(fullPath, rootPath, out, depth + 1, walk);
255
351
  } else if (stats.isFile()) {
256
352
  if (this.options.includeExtensions.includes(extname(fullPath))) {
257
353
  out.push(relativePath);
258
354
  }
259
355
  }
356
+ } catch (error) {
357
+ walk.complete = false;
358
+ logDebug('Error traversing directory (listFiles)', { path: fullPath, error });
260
359
  }
261
- } catch (error) {
262
- logDebug('Error traversing directory (listFiles)', { path: currentPath, error });
263
360
  }
264
361
  }
265
362
 
@@ -293,12 +390,20 @@ export class CodeScanner {
293
390
  }
294
391
  }
295
392
 
296
- // Daemon-side secret redaction: scrub credentials from chunk content
297
- // before they leave this process. contentHash is recomputed from the
298
- // scrubbed content so the server-side dedup cache (which keys on
299
- // contentHash) hits when team members push the same scrubbed text.
300
- // Server still re-applies scrubSecrets in the /scan/push handler as
301
- // defense in depth (idempotent).
393
+ return this.scrubChunks(chunks);
394
+ }
395
+
396
+ /**
397
+ * Daemon-side secret redaction: scrub credentials from chunk content
398
+ * before they leave this process. contentHash is recomputed from the
399
+ * scrubbed content so the server-side dedup cache (which keys on
400
+ * contentHash) hits when team members push the same scrubbed text.
401
+ * Server still re-applies scrubSecrets in the /scan/push handler as
402
+ * defense in depth (idempotent). Shared by `scanFiles` (watcher path)
403
+ * and `scanDirectoryWithStatus` (initial/full-rescan path) so both
404
+ * honor the same redaction guarantee.
405
+ */
406
+ private scrubChunks(chunks: CodeChunk[]): CodeChunk[] {
302
407
  return chunks.map((chunk) => {
303
408
  const scrubbed = scrubSecrets(chunk.content);
304
409
  if (scrubbed === chunk.content) return chunk;
@@ -318,7 +423,8 @@ export class CodeScanner {
318
423
  currentPath: string,
319
424
  rootPath: string,
320
425
  chunks: CodeChunk[],
321
- depth: number
426
+ depth: number,
427
+ walk: WalkState
322
428
  ): Promise<void> {
323
429
  // Prevent infinite recursion
324
430
  if (depth >= CodeScanner.MAX_DEPTH) {
@@ -326,36 +432,42 @@ export class CodeScanner {
326
432
  return;
327
433
  }
328
434
 
435
+ // Wrap readdir with timeout to prevent hanging
436
+ let entries: string[];
329
437
  try {
330
- // Wrap readdir with timeout to prevent hanging
331
- const entries = await withTimeout(
438
+ entries = await withTimeout(
332
439
  readdir(currentPath),
333
440
  FILE_OP_TIMEOUT_MS,
334
441
  `readdir timed out: ${currentPath}`
335
442
  );
443
+ } catch (error) {
444
+ walk.complete = false;
445
+ logDebug('Error traversing directory', { path: currentPath, error });
446
+ return;
447
+ }
336
448
 
337
- for (const entry of entries) {
338
- const fullPath = join(currentPath, entry);
339
- const relativePath = relative(rootPath, fullPath);
449
+ for (const entry of entries) {
450
+ const fullPath = join(currentPath, entry);
451
+ const relativePath = relative(rootPath, fullPath);
340
452
 
341
- // Check ignore patterns
342
- if (this.shouldIgnore(relativePath)) {
343
- continue;
344
- }
453
+ // Check ignore patterns
454
+ if (this.shouldIgnore(relativePath)) {
455
+ continue;
456
+ }
345
457
 
458
+ // Per-entry isolation: a single bad entry (dangling symlink, raced
459
+ // deletion, permission denial, fs timeout) must not abort the rest of
460
+ // the directory — but the scan is no longer removal-trustworthy.
461
+ try {
346
462
  const lstats = await withTimeout(
347
463
  lstat(fullPath),
348
464
  FILE_OP_TIMEOUT_MS,
349
465
  `lstat timed out: ${fullPath}`
350
466
  );
351
467
 
352
- if (lstats.isSymbolicLink()) {
353
- const resolved = await realpath(fullPath);
354
- const resolvedRoot = await realpath(rootPath);
355
- if (!resolved.startsWith(resolvedRoot + '/') && resolved !== resolvedRoot) {
356
- logDebug('Skipping symlink escaping project root', { fullPath, resolved, rootPath });
357
- continue;
358
- }
468
+ if (lstats.isSymbolicLink() && !(await this.confineSymlink(fullPath, rootPath))) {
469
+ logDebug('Skipping symlink escaping project root', { fullPath, rootPath });
470
+ continue;
359
471
  }
360
472
 
361
473
  const stats = lstats.isSymbolicLink()
@@ -364,7 +476,7 @@ export class CodeScanner {
364
476
 
365
477
  if (stats.isDirectory()) {
366
478
  if (await isGitBoundary(fullPath)) continue; // another repo's subtree
367
- await this.traverseDirectory(fullPath, rootPath, chunks, depth + 1);
479
+ await this.traverseDirectory(fullPath, rootPath, chunks, depth + 1, walk);
368
480
  } else if (stats.isFile()) {
369
481
  const ext = extname(fullPath);
370
482
  if (this.options.includeExtensions.includes(ext)) {
@@ -372,9 +484,10 @@ export class CodeScanner {
372
484
  chunks.push(...fileChunks);
373
485
  }
374
486
  }
487
+ } catch (error) {
488
+ walk.complete = false;
489
+ logDebug('Error traversing directory', { path: fullPath, error });
375
490
  }
376
- } catch (error) {
377
- logDebug('Error traversing directory', { path: currentPath, error });
378
491
  }
379
492
  }
380
493
 
@@ -390,9 +503,19 @@ export class CodeScanner {
390
503
  const segments = path.split('/');
391
504
  return this.options.ignorePatterns.some((pattern) => {
392
505
  if (pattern.includes('*')) {
506
+ // A leading '/' opts a glob pattern into SEGMENT-ANCHORED matching:
507
+ // the pattern body must start at the beginning of the path or right
508
+ // after a '/'. Without it, glob patterns keep their historical
509
+ // unanchored substring semantics — anchoring is opt-in per pattern so
510
+ // this change cannot alter any existing pattern's behavior.
511
+ // (Motivating bug: unanchored 'tests/fixtures/*' also matched
512
+ // 'integration-tests/fixtures/…' in every indexed project.)
513
+ const anchored = pattern.startsWith('/');
514
+ const body = anchored ? pattern.slice(1) : pattern;
393
515
  // Escape regex special chars, then replace all * with .*
394
- const escaped = pattern.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
395
- const regex = new RegExp(escaped.replace(/\*/g, '.*'));
516
+ const escaped = body.replace(/[.+?^${}()|[\]\\]/g, '\\$&');
517
+ const source = escaped.replace(/\*/g, '.*');
518
+ const regex = new RegExp(anchored ? `(^|/)${source}` : source);
396
519
  return regex.test(path);
397
520
  }
398
521
  // For non-glob patterns, check if any path segment matches exactly
@@ -426,11 +549,22 @@ export class CodeScanner {
426
549
  }
427
550
 
428
551
  // Wrap readFile with timeout
429
- const content = await withTimeout(
552
+ let content = await withTimeout(
430
553
  readFile(filePath, 'utf-8'),
431
554
  FILE_OP_TIMEOUT_MS,
432
555
  `readFile timed out: ${filePath}`
433
556
  );
557
+ // NUL sanitation (ingestion boundary, daemon side): Postgres `text`
558
+ // columns reject the literal NUL byte (U+0000) — a single one aborts
559
+ // the whole INSERT/UPDATE. Some source files legitimately contain
560
+ // them. Strip before any chunking so every chunk's content, its
561
+ // contentHash, and its embedding all agree — mirrors the server-side
562
+ // strip in ProjectManager (kept as defense in depth for content that
563
+ // reaches the server via an older scanner) but doing it here means
564
+ // the daemon never even transmits the NUL bytes.
565
+ if (content.includes('\0')) {
566
+ content = content.replace(/\0/g, '');
567
+ }
434
568
  const relativePath = relative(rootPath, filePath);
435
569
  const language = this.detectLanguage(filePath);
436
570
 
@@ -970,7 +1104,23 @@ export class CodeScanner {
970
1104
  async collectAuthorityFiles(
971
1105
  projectRoot: string
972
1106
  ): Promise<Array<{ path: string; content: string; hash: string }>> {
1107
+ const { files } = await this.collectAuthorityFilesWithStatus(projectRoot);
1108
+ return files;
1109
+ }
1110
+
1111
+ /**
1112
+ * Completeness-aware variant of `collectAuthorityFiles`. `complete ===
1113
+ * false` means an fs error hid part of the walk, so authority paths may
1114
+ * be missing — the daemon folds this into the same removal gate as
1115
+ * `listFilesWithStatus` (a partial authority walk would likewise drop
1116
+ * inventory entries and read as deletion).
1117
+ */
1118
+ async collectAuthorityFilesWithStatus(projectRoot: string): Promise<{
1119
+ files: Array<{ path: string; content: string; hash: string }>;
1120
+ complete: boolean;
1121
+ }> {
973
1122
  const out: Array<{ path: string; content: string; hash: string }> = [];
1123
+ const walkState: WalkState = { complete: true };
974
1124
 
975
1125
  // M2: cap walk depth to match the scanner's MAX_DEPTH (10)
976
1126
  const walk = async (dir: string, depth: number): Promise<void> => {
@@ -979,31 +1129,63 @@ export class CodeScanner {
979
1129
  try {
980
1130
  entries = await readdir(dir, { withFileTypes: true });
981
1131
  } catch {
1132
+ walkState.complete = false;
982
1133
  return;
983
1134
  }
984
1135
  for (const ent of entries) {
985
1136
  const full = join(dir, ent.name);
986
1137
  const rel = relative(projectRoot, full).split(sep).join('/');
987
1138
  if (this.shouldIgnore(rel)) continue;
988
- if (ent.isDirectory()) {
1139
+
1140
+ // Resolve the entry kind through symlinks, confined to the project
1141
+ // root: a symlink named like an authority file (`package.json`,
1142
+ // `.env.example`, ...) pointing outside the root would otherwise be
1143
+ // read verbatim and exfiltrated to the server. Same predicate as
1144
+ // traverseDirectory/traversePaths (confineSymlink). Confined
1145
+ // symlinked directories are traversed (Dirent.isDirectory() is
1146
+ // false for them, so they were previously silently skipped).
1147
+ let isDir = ent.isDirectory();
1148
+ let isFile = ent.isFile();
1149
+ if (ent.isSymbolicLink()) {
1150
+ try {
1151
+ if (!(await this.confineSymlink(full, projectRoot))) continue;
1152
+ const stats = await stat(full);
1153
+ isDir = stats.isDirectory();
1154
+ isFile = stats.isFile();
1155
+ } catch {
1156
+ /* dangling/unreadable link — skip just this entry */
1157
+ walkState.complete = false;
1158
+ continue;
1159
+ }
1160
+ }
1161
+
1162
+ if (isDir) {
989
1163
  if (await isGitBoundary(full)) continue; // another repo's subtree
990
1164
  await walk(full, depth + 1);
991
- } else if (AUTHORITY_FILE_MATCHERS.some((m) => m(rel))) {
1165
+ } else if (isFile && AUTHORITY_FILE_MATCHERS.some((m) => m(rel))) {
992
1166
  try {
993
- const content = await readFile(full, 'utf-8');
1167
+ let content = await readFile(full, 'utf-8');
994
1168
  // C2: skip files whose content exceeds the server's 5MB cap —
995
1169
  // manifests are tiny; an oversized one is anomalous.
996
1170
  if (content.length > 5_000_000) continue;
1171
+ // NUL sanitation (ingestion boundary, daemon side): Postgres
1172
+ // `text` columns reject the literal NUL byte (U+0000). Authority
1173
+ // files are shipped verbatim (no chunking), so strip here before
1174
+ // hashing so the hash and the transmitted content always agree.
1175
+ if (content.includes('\0')) {
1176
+ content = content.replace(/\0/g, '');
1177
+ }
997
1178
  const hash = createHash('sha256').update(content).digest('hex');
998
1179
  out.push({ path: rel, content, hash });
999
1180
  } catch {
1000
1181
  /* unreadable — skip */
1182
+ walkState.complete = false;
1001
1183
  }
1002
1184
  }
1003
1185
  }
1004
1186
  };
1005
1187
 
1006
1188
  await walk(projectRoot, 0);
1007
- return out;
1189
+ return { files: out, complete: walkState.complete };
1008
1190
  }
1009
1191
  }
package/src/index.ts CHANGED
@@ -11,6 +11,8 @@ export {
11
11
  CodeScanner,
12
12
  AUTHORITY_FILE_MATCHERS,
13
13
  isGitBoundary,
14
+ FIXTURE_PATH_RE,
15
+ isFixturePath,
14
16
  type CodeChunk,
15
17
  type ScanOptions,
16
18
  } from './codeScanner.js';