projscan 0.14.0 → 0.16.0

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 (64) hide show
  1. package/README.md +5 -4
  2. package/dist/cli/_shared.js +2 -2
  3. package/dist/cli/_shared.js.map +1 -1
  4. package/dist/cli/commands/coupling.js +4 -0
  5. package/dist/cli/commands/coupling.js.map +1 -1
  6. package/dist/cli/commands/doctor.js +4 -0
  7. package/dist/cli/commands/doctor.js.map +1 -1
  8. package/dist/cli/commands/hotspots.js +4 -0
  9. package/dist/cli/commands/hotspots.js.map +1 -1
  10. package/dist/cli/commands/impact.d.ts +1 -0
  11. package/dist/cli/commands/impact.js +59 -0
  12. package/dist/cli/commands/impact.js.map +1 -0
  13. package/dist/cli/commands/review.js +4 -0
  14. package/dist/cli/commands/review.js.map +1 -1
  15. package/dist/cli/commands/search.js +6 -2
  16. package/dist/cli/commands/search.js.map +1 -1
  17. package/dist/cli/commands/watch.d.ts +1 -0
  18. package/dist/cli/commands/watch.js +58 -0
  19. package/dist/cli/commands/watch.js.map +1 -0
  20. package/dist/cli/index.js +4 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/core/ast.d.ts +8 -0
  23. package/dist/core/ast.js.map +1 -1
  24. package/dist/core/codeGraph.d.ts +16 -0
  25. package/dist/core/codeGraph.js +196 -0
  26. package/dist/core/codeGraph.js.map +1 -1
  27. package/dist/core/fileInspector.js +1 -0
  28. package/dist/core/fileInspector.js.map +1 -1
  29. package/dist/core/impact.d.ts +27 -0
  30. package/dist/core/impact.js +169 -0
  31. package/dist/core/impact.js.map +1 -0
  32. package/dist/core/searchIndex.d.ts +9 -0
  33. package/dist/core/searchIndex.js.map +1 -1
  34. package/dist/core/semanticSearch.d.ts +69 -2
  35. package/dist/core/semanticSearch.js +113 -55
  36. package/dist/core/semanticSearch.js.map +1 -1
  37. package/dist/core/watcher.d.ts +37 -0
  38. package/dist/core/watcher.js +126 -0
  39. package/dist/core/watcher.js.map +1 -0
  40. package/dist/index.d.ts +7 -2
  41. package/dist/index.js +4 -1
  42. package/dist/index.js.map +1 -1
  43. package/dist/mcp/tools/impact.d.ts +2 -0
  44. package/dist/mcp/tools/impact.js +59 -0
  45. package/dist/mcp/tools/impact.js.map +1 -0
  46. package/dist/mcp/tools/search.js +9 -2
  47. package/dist/mcp/tools/search.js.map +1 -1
  48. package/dist/mcp/tools.js +2 -0
  49. package/dist/mcp/tools.js.map +1 -1
  50. package/dist/reporters/consoleReporter.d.ts +2 -1
  51. package/dist/reporters/consoleReporter.js +42 -1
  52. package/dist/reporters/consoleReporter.js.map +1 -1
  53. package/dist/reporters/htmlReporter.d.ts +8 -0
  54. package/dist/reporters/htmlReporter.js +287 -0
  55. package/dist/reporters/htmlReporter.js.map +1 -0
  56. package/dist/reporters/jsonReporter.d.ts +2 -1
  57. package/dist/reporters/jsonReporter.js +3 -0
  58. package/dist/reporters/jsonReporter.js.map +1 -1
  59. package/dist/reporters/markdownReporter.d.ts +2 -1
  60. package/dist/reporters/markdownReporter.js +35 -3
  61. package/dist/reporters/markdownReporter.js.map +1 -1
  62. package/dist/tool-manifest.json +40 -3
  63. package/dist/types.d.ts +48 -1
  64. package/package.json +2 -2
@@ -1,6 +1,22 @@
1
1
  import type { FileEntry } from '../types.js';
2
+ import type { CodeGraph } from './codeGraph.js';
2
3
  export interface SemanticEntry {
4
+ /**
5
+ * Composite key. Equals `relativePath` for file-level entries; equals
6
+ * `<relativePath>#<function-name>` for sub-file entries. Used as the
7
+ * `entries` Map key.
8
+ */
9
+ key: string;
3
10
  relativePath: string;
11
+ /**
12
+ * Function context, present only on sub-file entries. Lets search hits
13
+ * point at the matched function's line range without a second lookup.
14
+ */
15
+ function?: {
16
+ name: string;
17
+ startLine: number;
18
+ endLine: number;
19
+ };
4
20
  contentHash: string;
5
21
  mtimeMs: number;
6
22
  vector: Float32Array;
@@ -15,11 +31,61 @@ export interface BuildOptions {
15
31
  rebuild?: boolean;
16
32
  onProgress?: (done: number, total: number, message?: string) => void;
17
33
  onFirstLoad?: (message: string) => void;
34
+ /**
35
+ * 0.15.0+: when true and `graph` is provided, chunk source files by
36
+ * function boundary and emit one embedding per function (plus one
37
+ * file-level embedding for files with no extracted functions). Default
38
+ * false (file-level only - backward compatible).
39
+ */
40
+ subFile?: boolean;
41
+ /**
42
+ * 0.15.0+: optional code graph. Required for `subFile: true`; ignored
43
+ * otherwise. Provides the per-function line ranges used for chunk
44
+ * extraction.
45
+ */
46
+ graph?: CodeGraph;
18
47
  }
19
48
  export interface SemanticHit {
20
49
  file: string;
21
50
  score: number;
51
+ /** Function context when the hit came from a sub-file chunk. */
52
+ function?: {
53
+ name: string;
54
+ startLine: number;
55
+ endLine: number;
56
+ };
22
57
  }
58
+ /**
59
+ * One chunk descriptor produced by `buildChunks`. Chunks are the unit of
60
+ * embedding: one embedding per chunk. Exported for testing - allows
61
+ * verifying chunk extraction without needing the embedding model.
62
+ */
63
+ export interface SemanticChunk {
64
+ key: string;
65
+ relativePath: string;
66
+ function?: {
67
+ name: string;
68
+ startLine: number;
69
+ endLine: number;
70
+ };
71
+ text: string;
72
+ hash: string;
73
+ mtimeMs: number;
74
+ }
75
+ /**
76
+ * Produce embedding chunk descriptors for the indexable files. Pure-ish:
77
+ * does file IO but no embedding work. Exported so tests can verify chunk
78
+ * extraction without invoking the embedding model.
79
+ *
80
+ * Behavior:
81
+ * - File-level (default, or `subFile: false`, or no graph): one chunk
82
+ * per file. Key = relativePath. Text = `<file>\n\n<first 4KB>`.
83
+ * - Sub-file (`subFile: true` + graph): one chunk per function, plus
84
+ * one file-level chunk for files where the graph reports no
85
+ * functions. Per-function chunk key = `<file>#<fn-name>`. Text =
86
+ * `<file>#<fn-name> (lines a-b)\n\n<extracted lines>` (capped at 4KB).
87
+ */
88
+ export declare function buildChunks(rootPath: string, files: FileEntry[], options?: BuildOptions): Promise<SemanticChunk[]>;
23
89
  /**
24
90
  * Build (or refresh) a semantic index. Reuses cached embeddings for files
25
91
  * whose mtime AND content hash match - both guards are necessary because
@@ -29,8 +95,9 @@ export interface SemanticHit {
29
95
  */
30
96
  export declare function buildSemanticIndex(rootPath: string, files: FileEntry[], options?: BuildOptions): Promise<SemanticIndex | null>;
31
97
  /**
32
- * Query a semantic index. Returns top-K files by cosine similarity.
33
- * Returns an empty array if no files are indexed.
98
+ * Query a semantic index. Returns top-K hits by cosine similarity. Hits
99
+ * carry `function` context when matched against a sub-file chunk.
100
+ * Returns an empty array if the index is empty.
34
101
  */
35
102
  export declare function semanticSearch(index: SemanticIndex, query: string, options?: {
36
103
  limit?: number;
@@ -3,21 +3,29 @@ import path from 'node:path';
3
3
  import crypto from 'node:crypto';
4
4
  import { embedBatch, embedText, cosineSimilarity, isSemanticAvailable, DEFAULT_MODEL, EMBEDDING_DIM, } from './embeddings.js';
5
5
  /**
6
- * File-level semantic search over source files.
6
+ * Semantic search over source files.
7
7
  *
8
- * v1 design decisions:
9
- * - One embedding per file. Sub-file (per-export, per-function) chunking
10
- * is a bigger project; file-level is sufficient to answer "which file
11
- * implements X?"
12
- * - Input text is the first 4KB of the file (captures most semantic
13
- * signal without blowing the context window of small embedding models).
14
- * - Path is prepended as a weak signal: `<file>\n\n<content>`.
15
- * - Cache persisted to .projscan-cache/embeddings.bin, keyed by
16
- * (model, file mtime, content hash). Invalidates on any of those changing.
8
+ * Two modes:
9
+ * - File-level (v1, default): one embedding per file. Input is the path
10
+ * plus the first 4KB of content. Good enough for "which file
11
+ * implements X?".
12
+ * - Sub-file / per-function (v2, opt-in via `subFile: true` + a graph
13
+ * that has `functions` populated): one embedding per function. Input is
14
+ * the function's source range (capped at 4KB). Cache key is
15
+ * `<file>#<fn-name>`, so editing one function does not re-embed
16
+ * siblings. Files without function-level info still get a file-level
17
+ * embedding, so coverage is uniform.
18
+ *
19
+ * Cache persisted to .projscan-cache/embeddings.bin, keyed by composite key
20
+ * + model + content hash + mtime. Invalidates on any of those changing.
21
+ *
22
+ * v1 → v2: cache schema change to support composite keys and optional
23
+ * function-context. v1 caches are discarded silently and rebuilt on first
24
+ * 0.15 run.
17
25
  */
18
26
  const CACHE_DIR = '.projscan-cache';
19
27
  const CACHE_FILE = 'embeddings.bin';
20
- const CACHE_VERSION = 1;
28
+ const CACHE_VERSION = 2;
21
29
  const MAX_FILE_BYTES_FOR_EMBED = 4 * 1024;
22
30
  const MAX_FILE_SIZE = 512 * 1024;
23
31
  const INDEXABLE_EXTS = new Set([
@@ -26,23 +34,22 @@ const INDEXABLE_EXTS = new Set([
26
34
  '.md', '.mdx',
27
35
  ]);
28
36
  /**
29
- * Build (or refresh) a semantic index. Reuses cached embeddings for files
30
- * whose mtime AND content hash match - both guards are necessary because
31
- * git checkouts can preserve mtime while swapping content.
37
+ * Produce embedding chunk descriptors for the indexable files. Pure-ish:
38
+ * does file IO but no embedding work. Exported so tests can verify chunk
39
+ * extraction without invoking the embedding model.
32
40
  *
33
- * Returns null if the peer dep isn't available.
41
+ * Behavior:
42
+ * - File-level (default, or `subFile: false`, or no graph): one chunk
43
+ * per file. Key = relativePath. Text = `<file>\n\n<first 4KB>`.
44
+ * - Sub-file (`subFile: true` + graph): one chunk per function, plus
45
+ * one file-level chunk for files where the graph reports no
46
+ * functions. Per-function chunk key = `<file>#<fn-name>`. Text =
47
+ * `<file>#<fn-name> (lines a-b)\n\n<extracted lines>` (capped at 4KB).
34
48
  */
35
- export async function buildSemanticIndex(rootPath, files, options = {}) {
36
- const available = await isSemanticAvailable();
37
- if (!available)
38
- return null;
39
- const model = options.model ?? DEFAULT_MODEL;
40
- const cached = options.rebuild ? null : await loadCache(rootPath, model);
41
- const entries = cached?.entries ?? new Map();
49
+ export async function buildChunks(rootPath, files, options = {}) {
42
50
  const indexable = files.filter((f) => INDEXABLE_EXTS.has(f.extension) && f.sizeBytes <= MAX_FILE_SIZE);
43
- // Determine which files still need embedding
44
- const toEmbed = [];
45
- const keep = new Set();
51
+ const useSubFile = options.subFile === true && options.graph !== undefined;
52
+ const chunks = [];
46
53
  for (const file of indexable) {
47
54
  const abs = path.isAbsolute(file.absolutePath)
48
55
  ? file.absolutePath
@@ -54,9 +61,6 @@ export async function buildSemanticIndex(rootPath, files, options = {}) {
54
61
  catch {
55
62
  continue;
56
63
  }
57
- const text = `${file.relativePath}\n\n${content.slice(0, MAX_FILE_BYTES_FOR_EMBED)}`;
58
- const hash = sha256(text);
59
- const existing = entries.get(file.relativePath);
60
64
  let mtimeMs = 0;
61
65
  try {
62
66
  const stat = await fs.stat(abs);
@@ -65,14 +69,69 @@ export async function buildSemanticIndex(rootPath, files, options = {}) {
65
69
  catch {
66
70
  // ignore
67
71
  }
68
- if (existing && existing.contentHash === hash && existing.mtimeMs === mtimeMs) {
69
- keep.add(file.relativePath);
72
+ if (useSubFile) {
73
+ const gf = options.graph.files.get(file.relativePath);
74
+ const fns = gf?.functions ?? [];
75
+ if (fns.length > 0) {
76
+ const lines = content.split('\n');
77
+ for (const fn of fns) {
78
+ const start = Math.max(1, fn.line);
79
+ const end = Math.max(start, fn.endLine);
80
+ const slice = lines.slice(start - 1, end).join('\n').slice(0, MAX_FILE_BYTES_FOR_EMBED);
81
+ const text = `${file.relativePath}#${fn.name} (lines ${start}-${end})\n\n${slice}`;
82
+ const hash = sha256(text);
83
+ chunks.push({
84
+ key: `${file.relativePath}#${fn.name}`,
85
+ relativePath: file.relativePath,
86
+ function: { name: fn.name, startLine: start, endLine: end },
87
+ text,
88
+ hash,
89
+ mtimeMs,
90
+ });
91
+ }
92
+ continue;
93
+ }
94
+ // Fall through to file-level when the file has no extracted functions
95
+ // (e.g. config files, README, type-only modules).
96
+ }
97
+ const text = `${file.relativePath}\n\n${content.slice(0, MAX_FILE_BYTES_FOR_EMBED)}`;
98
+ const hash = sha256(text);
99
+ chunks.push({
100
+ key: file.relativePath,
101
+ relativePath: file.relativePath,
102
+ text,
103
+ hash,
104
+ mtimeMs,
105
+ });
106
+ }
107
+ return chunks;
108
+ }
109
+ /**
110
+ * Build (or refresh) a semantic index. Reuses cached embeddings for files
111
+ * whose mtime AND content hash match - both guards are necessary because
112
+ * git checkouts can preserve mtime while swapping content.
113
+ *
114
+ * Returns null if the peer dep isn't available.
115
+ */
116
+ export async function buildSemanticIndex(rootPath, files, options = {}) {
117
+ const available = await isSemanticAvailable();
118
+ if (!available)
119
+ return null;
120
+ const model = options.model ?? DEFAULT_MODEL;
121
+ const cached = options.rebuild ? null : await loadCache(rootPath, model);
122
+ const entries = cached?.entries ?? new Map();
123
+ const chunks = await buildChunks(rootPath, files, options);
124
+ // Determine which chunks still need embedding (cache hit when key + hash + mtime match).
125
+ const toEmbed = [];
126
+ const keep = new Set();
127
+ for (const chunk of chunks) {
128
+ keep.add(chunk.key);
129
+ const existing = entries.get(chunk.key);
130
+ if (existing && existing.contentHash === chunk.hash && existing.mtimeMs === chunk.mtimeMs) {
70
131
  continue;
71
132
  }
72
- toEmbed.push({ file, hash, text });
73
- keep.add(file.relativePath);
133
+ toEmbed.push(chunk);
74
134
  }
75
- // Drop cached entries for files that no longer exist
76
135
  for (const key of [...entries.keys()]) {
77
136
  if (!keep.has(key))
78
137
  entries.delete(key);
@@ -80,35 +139,23 @@ export async function buildSemanticIndex(rootPath, files, options = {}) {
80
139
  if (toEmbed.length === 0) {
81
140
  return { model, dim: cached?.dim ?? EMBEDDING_DIM, entries };
82
141
  }
83
- options.onProgress?.(0, toEmbed.length, 'embedding files');
84
- // Batch embeddings in chunks of 32 to cap peak memory
142
+ options.onProgress?.(0, toEmbed.length, 'embedding chunks');
85
143
  const BATCH = 32;
86
144
  for (let i = 0; i < toEmbed.length; i += BATCH) {
87
145
  const slice = toEmbed.slice(i, i + BATCH);
88
146
  const vectors = await embedBatch(slice.map((s) => s.text), { model, onFirstLoad: options.onFirstLoad });
89
147
  if (!vectors) {
90
- // Peer loaded at start of the build but embedBatch now returns null.
91
- // This is rare (module unloaded, OOM, etc.); log to stderr so operators
92
- // can diagnose instead of silently losing the semantic capability.
93
148
  process.stderr.write(`[projscan] semantic index build aborted at batch ${Math.floor(i / BATCH) + 1}/${Math.ceil(toEmbed.length / BATCH)} (peer dep became unavailable)\n`);
94
149
  return null;
95
150
  }
96
151
  for (let j = 0; j < slice.length; j++) {
97
152
  const s = slice[j];
98
- const abs = path.isAbsolute(s.file.absolutePath)
99
- ? s.file.absolutePath
100
- : path.resolve(rootPath, s.file.relativePath);
101
- let mtimeMs = 0;
102
- try {
103
- mtimeMs = (await fs.stat(abs)).mtimeMs;
104
- }
105
- catch {
106
- // ignore
107
- }
108
- entries.set(s.file.relativePath, {
109
- relativePath: s.file.relativePath,
153
+ entries.set(s.key, {
154
+ key: s.key,
155
+ relativePath: s.relativePath,
156
+ function: s.function,
110
157
  contentHash: s.hash,
111
- mtimeMs,
158
+ mtimeMs: s.mtimeMs,
112
159
  vector: vectors[j],
113
160
  });
114
161
  }
@@ -125,8 +172,9 @@ export async function buildSemanticIndex(rootPath, files, options = {}) {
125
172
  return index;
126
173
  }
127
174
  /**
128
- * Query a semantic index. Returns top-K files by cosine similarity.
129
- * Returns an empty array if no files are indexed.
175
+ * Query a semantic index. Returns top-K hits by cosine similarity. Hits
176
+ * carry `function` context when matched against a sub-file chunk.
177
+ * Returns an empty array if the index is empty.
130
178
  */
131
179
  export async function semanticSearch(index, query, options = {}) {
132
180
  if (index.entries.size === 0)
@@ -138,7 +186,13 @@ export async function semanticSearch(index, query, options = {}) {
138
186
  const scored = [];
139
187
  for (const entry of index.entries.values()) {
140
188
  const score = cosineSimilarity(vector, entry.vector);
141
- scored.push({ file: entry.relativePath, score: Math.round(score * 1000) / 1000 });
189
+ const hit = {
190
+ file: entry.relativePath,
191
+ score: Math.round(score * 1000) / 1000,
192
+ };
193
+ if (entry.function)
194
+ hit.function = entry.function;
195
+ scored.push(hit);
142
196
  }
143
197
  scored.sort((a, b) => b.score - a.score);
144
198
  return scored.slice(0, limit);
@@ -163,8 +217,10 @@ async function loadCache(rootPath, expectedModel) {
163
217
  return null;
164
218
  const entries = new Map();
165
219
  for (const e of parsed.entries) {
166
- entries.set(e.relativePath, {
220
+ entries.set(e.key, {
221
+ key: e.key,
167
222
  relativePath: e.relativePath,
223
+ function: e.function,
168
224
  contentHash: e.contentHash,
169
225
  mtimeMs: e.mtimeMs,
170
226
  vector: new Float32Array(e.vector),
@@ -180,7 +236,9 @@ async function saveCache(rootPath, index) {
180
236
  model: index.model,
181
237
  dim: index.dim,
182
238
  entries: [...index.entries.values()].map((e) => ({
239
+ key: e.key,
183
240
  relativePath: e.relativePath,
241
+ function: e.function,
184
242
  contentHash: e.contentHash,
185
243
  mtimeMs: e.mtimeMs,
186
244
  vector: [...e.vector],
@@ -1 +1 @@
1
- {"version":3,"file":"semanticSearch.js","sourceRoot":"","sources":["../../src/core/semanticSearch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"semanticSearch.js","sourceRoot":"","sources":["../../src/core/semanticSearch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import { type CodeGraph } from './codeGraph.js';
2
+ export interface WatchEvent {
3
+ /** Repo-relative paths reported as changed in this debounced batch. */
4
+ paths: string[];
5
+ /** The current graph (in-place updated). */
6
+ graph: CodeGraph;
7
+ }
8
+ export interface WatchOptions {
9
+ /** Called once for the initial graph build, then for each debounced batch. */
10
+ onChange: (event: WatchEvent) => void | Promise<void>;
11
+ /** Called once if `fs.watch` cannot be initialised. */
12
+ onError?: (err: Error) => void;
13
+ }
14
+ export interface WatchHandle {
15
+ close: () => void;
16
+ /** Resolves once the initial scan + first onChange call have completed. */
17
+ ready: Promise<void>;
18
+ }
19
+ /**
20
+ * Start watching `rootPath` for source file changes. On change, debounce by
21
+ * 200ms then run the incremental graph update and invoke `onChange`. The
22
+ * caller decides what to do with each tick (re-run doctor, re-run hotspots,
23
+ * emit MCP notifications, etc.).
24
+ *
25
+ * Uses node:fs.watch (built-in, no chokidar dep). Caveats:
26
+ * - On Linux, fs.watch in recursive mode requires Node 20+. We use
27
+ * recursive: true and rely on that minimum.
28
+ * - Some editors (vim, IntelliJ) atomically replace files; fs.watch
29
+ * reports those as 'rename' events. We treat both 'change' and
30
+ * 'rename' as candidates and re-stat to decide if the file still exists.
31
+ * - Dotfiles and the gitignore noise list (node_modules, dist, etc.) are
32
+ * filtered out so editing one doesn't trigger a re-scan.
33
+ *
34
+ * Returns a `{close, ready}` handle. `ready` resolves when the initial
35
+ * graph + first `onChange` call complete; close stops the watcher.
36
+ */
37
+ export declare function startWatcher(rootPath: string, options: WatchOptions): WatchHandle;
@@ -0,0 +1,126 @@
1
+ import { watch as fsWatch } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { scanRepository } from './repositoryScanner.js';
4
+ import { buildCodeGraph, incrementallyUpdateGraph } from './codeGraph.js';
5
+ import { loadCachedGraph, saveCachedGraph } from './indexCache.js';
6
+ const DEBOUNCE_MS = 200;
7
+ const STAT_RETRY_MS = 50;
8
+ const SKIP_DIRS = new Set([
9
+ 'node_modules', '.git', '.projscan-cache', '.bench-cache', 'dist', 'build',
10
+ 'coverage', '.cache', '.next', '.nuxt', '.svelte-kit', 'venv', '.venv',
11
+ '__pycache__', '.tox', '.pytest_cache', '.mypy_cache', '.ruff_cache',
12
+ '.eggs',
13
+ ]);
14
+ /**
15
+ * Start watching `rootPath` for source file changes. On change, debounce by
16
+ * 200ms then run the incremental graph update and invoke `onChange`. The
17
+ * caller decides what to do with each tick (re-run doctor, re-run hotspots,
18
+ * emit MCP notifications, etc.).
19
+ *
20
+ * Uses node:fs.watch (built-in, no chokidar dep). Caveats:
21
+ * - On Linux, fs.watch in recursive mode requires Node 20+. We use
22
+ * recursive: true and rely on that minimum.
23
+ * - Some editors (vim, IntelliJ) atomically replace files; fs.watch
24
+ * reports those as 'rename' events. We treat both 'change' and
25
+ * 'rename' as candidates and re-stat to decide if the file still exists.
26
+ * - Dotfiles and the gitignore noise list (node_modules, dist, etc.) are
27
+ * filtered out so editing one doesn't trigger a re-scan.
28
+ *
29
+ * Returns a `{close, ready}` handle. `ready` resolves when the initial
30
+ * graph + first `onChange` call complete; close stops the watcher.
31
+ */
32
+ export function startWatcher(rootPath, options) {
33
+ let watcher = null;
34
+ let debounceTimer = null;
35
+ const pending = new Set();
36
+ let graph = null;
37
+ let closed = false;
38
+ let inFlight = false;
39
+ const ready = (async () => {
40
+ const scan = await scanRepository(rootPath);
41
+ const cached = await loadCachedGraph(rootPath);
42
+ graph = await buildCodeGraph(rootPath, scan.files, cached);
43
+ await saveCachedGraph(rootPath, graph).catch(() => undefined);
44
+ await options.onChange({ paths: [], graph });
45
+ })();
46
+ ready.then(() => {
47
+ if (closed)
48
+ return;
49
+ try {
50
+ watcher = fsWatch(rootPath, { recursive: true }, (_eventType, filename) => {
51
+ if (!filename)
52
+ return;
53
+ const rel = filename.split(path.sep).join('/');
54
+ if (shouldSkip(rel))
55
+ return;
56
+ pending.add(rel);
57
+ if (debounceTimer)
58
+ clearTimeout(debounceTimer);
59
+ debounceTimer = setTimeout(() => void flush(), DEBOUNCE_MS);
60
+ });
61
+ watcher.on('error', (err) => {
62
+ options.onError?.(err);
63
+ });
64
+ }
65
+ catch (err) {
66
+ options.onError?.(err);
67
+ }
68
+ });
69
+ async function flush() {
70
+ if (closed || inFlight || !graph) {
71
+ // If a flush fires while one is already in flight, leave `pending`
72
+ // intact - the next debounce will pick up the accumulated set plus
73
+ // anything new.
74
+ return;
75
+ }
76
+ if (pending.size === 0)
77
+ return;
78
+ const batch = [...pending];
79
+ pending.clear();
80
+ inFlight = true;
81
+ try {
82
+ // Tiny stat-retry: editors that delete-then-write can race the watcher.
83
+ await sleep(STAT_RETRY_MS);
84
+ await incrementallyUpdateGraph(graph, rootPath, batch);
85
+ await saveCachedGraph(rootPath, graph).catch(() => undefined);
86
+ await options.onChange({ paths: batch, graph });
87
+ }
88
+ finally {
89
+ inFlight = false;
90
+ // If new events arrived while we were processing, schedule another flush.
91
+ if (pending.size > 0) {
92
+ if (debounceTimer)
93
+ clearTimeout(debounceTimer);
94
+ debounceTimer = setTimeout(() => void flush(), DEBOUNCE_MS);
95
+ }
96
+ }
97
+ }
98
+ return {
99
+ close: () => {
100
+ closed = true;
101
+ if (debounceTimer)
102
+ clearTimeout(debounceTimer);
103
+ if (watcher)
104
+ watcher.close();
105
+ },
106
+ ready,
107
+ };
108
+ }
109
+ function shouldSkip(rel) {
110
+ if (rel.length === 0)
111
+ return true;
112
+ // Filter out hidden files and known noise directories anywhere in the path.
113
+ const parts = rel.split('/');
114
+ for (const part of parts) {
115
+ if (SKIP_DIRS.has(part))
116
+ return true;
117
+ // Dotfiles in any segment (e.g. .git, .projscan-cache, .DS_Store).
118
+ if (part.startsWith('.') && part !== '.' && part !== '..')
119
+ return true;
120
+ }
121
+ return false;
122
+ }
123
+ function sleep(ms) {
124
+ return new Promise((resolve) => setTimeout(resolve, ms));
125
+ }
126
+ //# sourceMappingURL=watcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/core/watcher.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -13,7 +13,9 @@ export { parseCoverage, coverageMap } from './core/coverageParser.js';
13
13
  export { joinCoverageWithHotspots } from './core/coverageJoin.js';
14
14
  export { parseSource, isParseable } from './core/ast.js';
15
15
  export type { FunctionInfo } from './core/ast.js';
16
- export { buildCodeGraph, filesImportingFile, filesImportingPackage, filesDefiningSymbol, exportsOf, importsOf, importersOf, } from './core/codeGraph.js';
16
+ export { buildCodeGraph, incrementallyUpdateGraph, filesImportingFile, filesImportingPackage, filesDefiningSymbol, exportsOf, importsOf, importersOf, } from './core/codeGraph.js';
17
+ export { startWatcher } from './core/watcher.js';
18
+ export type { WatchEvent, WatchOptions, WatchHandle } from './core/watcher.js';
17
19
  export { loadCachedGraph, saveCachedGraph, invalidateCache } from './core/indexCache.js';
18
20
  export { applyBudget, estimateTokens } from './mcp/tokenBudget.js';
19
21
  export { paginate, encodeCursor, decodeCursor, listChecksum, readPageParams } from './mcp/pagination.js';
@@ -31,8 +33,11 @@ export { issuesToSarif } from './reporters/sarifReporter.js';
31
33
  export { computeReview } from './core/review.js';
32
34
  export { suggestFixForIssue, previewSuggestionForIssue, syntheticIssue, findIssue } from './core/fixSuggest.js';
33
35
  export { explainIssue } from './core/explainIssue.js';
36
+ export { computeImpact } from './core/impact.js';
37
+ export { buildChunks } from './core/semanticSearch.js';
38
+ export type { SemanticChunk } from './core/semanticSearch.js';
34
39
  export { createMcpServer, runMcpServer } from './mcp/server.js';
35
40
  export { getToolDefinitions } from './mcp/tools.js';
36
41
  export { getPromptDefinitions } from './mcp/prompts.js';
37
42
  export { getResourceDefinitions } from './mcp/resources.js';
38
- export type { ScanResult, FileEntry, DirectoryNode, LanguageBreakdown, LanguageStat, FrameworkResult, DetectedFramework, DependencyReport, DependencyRisk, Issue, IssueLocation, IssueSeverity, Fix, FixResult, FileExplanation, FileInspection, FunctionDetail, ImportInfo, ExportInfo, ArchitectureLayer, AnalysisReport, ReportFormat, FileHotspot, HotspotReport, AuthorShare, BaselineHotspot, HotspotDelta, HotspotDiffSummary, McpToolDefinition, McpPromptDefinition, McpResourceDefinition, ProjscanConfig, LoadedConfig, SemverDrift, OutdatedPackage, OutdatedReport, AuditSeverity, AuditFinding, AuditReport, UpgradePreview, CoverageSource, FileCoverage, CoverageReport, CoverageJoinedHotspot, CoverageJoinedReport, ReviewReport, ReviewFile, ReviewCycle, ReviewFunction, ReviewDependencyChange, FixSuggestion, IssueExplanation, ImportPolicyRule, } from './types.js';
43
+ export type { ScanResult, FileEntry, DirectoryNode, LanguageBreakdown, LanguageStat, FrameworkResult, DetectedFramework, DependencyReport, DependencyRisk, Issue, IssueLocation, IssueSeverity, Fix, FixResult, FileExplanation, FileInspection, FunctionDetail, ImportInfo, ExportInfo, ArchitectureLayer, AnalysisReport, ReportFormat, FileHotspot, HotspotReport, AuthorShare, BaselineHotspot, HotspotDelta, HotspotDiffSummary, McpToolDefinition, McpPromptDefinition, McpResourceDefinition, ProjscanConfig, LoadedConfig, SemverDrift, OutdatedPackage, OutdatedReport, AuditSeverity, AuditFinding, AuditReport, UpgradePreview, CoverageSource, FileCoverage, CoverageReport, CoverageJoinedHotspot, CoverageJoinedReport, ReviewReport, ReviewFile, ReviewCycle, ReviewFunction, ReviewDependencyChange, FixSuggestion, IssueExplanation, ImportPolicyRule, ImpactReport, ImpactNode, } from './types.js';
package/dist/index.js CHANGED
@@ -12,7 +12,8 @@ export { previewUpgrade, isValidPackageName } from './core/upgradePreview.js';
12
12
  export { parseCoverage, coverageMap } from './core/coverageParser.js';
13
13
  export { joinCoverageWithHotspots } from './core/coverageJoin.js';
14
14
  export { parseSource, isParseable } from './core/ast.js';
15
- export { buildCodeGraph, filesImportingFile, filesImportingPackage, filesDefiningSymbol, exportsOf, importsOf, importersOf, } from './core/codeGraph.js';
15
+ export { buildCodeGraph, incrementallyUpdateGraph, filesImportingFile, filesImportingPackage, filesDefiningSymbol, exportsOf, importsOf, importersOf, } from './core/codeGraph.js';
16
+ export { startWatcher } from './core/watcher.js';
16
17
  export { loadCachedGraph, saveCachedGraph, invalidateCache } from './core/indexCache.js';
17
18
  export { applyBudget, estimateTokens } from './mcp/tokenBudget.js';
18
19
  export { paginate, encodeCursor, decodeCursor, listChecksum, readPageParams } from './mcp/pagination.js';
@@ -30,6 +31,8 @@ export { issuesToSarif } from './reporters/sarifReporter.js';
30
31
  export { computeReview } from './core/review.js';
31
32
  export { suggestFixForIssue, previewSuggestionForIssue, syntheticIssue, findIssue } from './core/fixSuggest.js';
32
33
  export { explainIssue } from './core/explainIssue.js';
34
+ export { computeImpact } from './core/impact.js';
35
+ export { buildChunks } from './core/semanticSearch.js';
33
36
  export { createMcpServer, runMcpServer } from './mcp/server.js';
34
37
  export { getToolDefinitions } from './mcp/tools.js';
35
38
  export { getPromptDefinitions } from './mcp/prompts.js';
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { McpTool } from './_shared.js';
2
+ export declare const impactTool: McpTool;