projscan 0.14.0 → 0.17.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.
- package/README.md +47 -8
- package/dist/cli/_shared.js +2 -2
- package/dist/cli/_shared.js.map +1 -1
- package/dist/cli/commands/coupling.js +4 -0
- package/dist/cli/commands/coupling.js.map +1 -1
- package/dist/cli/commands/doctor.js +4 -0
- package/dist/cli/commands/doctor.js.map +1 -1
- package/dist/cli/commands/hotspots.js +4 -0
- package/dist/cli/commands/hotspots.js.map +1 -1
- package/dist/cli/commands/impact.d.ts +1 -0
- package/dist/cli/commands/impact.js +59 -0
- package/dist/cli/commands/impact.js.map +1 -0
- package/dist/cli/commands/review.js +4 -0
- package/dist/cli/commands/review.js.map +1 -1
- package/dist/cli/commands/search.js +6 -2
- package/dist/cli/commands/search.js.map +1 -1
- package/dist/cli/commands/watch.d.ts +1 -0
- package/dist/cli/commands/watch.js +58 -0
- package/dist/cli/commands/watch.js.map +1 -0
- package/dist/cli/index.js +4 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/core/ast.d.ts +8 -0
- package/dist/core/ast.js.map +1 -1
- package/dist/core/codeGraph.d.ts +16 -0
- package/dist/core/codeGraph.js +196 -0
- package/dist/core/codeGraph.js.map +1 -1
- package/dist/core/fileInspector.d.ts +2 -0
- package/dist/core/fileInspector.js +11 -0
- package/dist/core/fileInspector.js.map +1 -1
- package/dist/core/impact.d.ts +27 -0
- package/dist/core/impact.js +169 -0
- package/dist/core/impact.js.map +1 -0
- package/dist/core/searchIndex.d.ts +9 -0
- package/dist/core/searchIndex.js.map +1 -1
- package/dist/core/semanticSearch.d.ts +69 -2
- package/dist/core/semanticSearch.js +113 -55
- package/dist/core/semanticSearch.js.map +1 -1
- package/dist/core/watcher.d.ts +37 -0
- package/dist/core/watcher.js +126 -0
- package/dist/core/watcher.js.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +4 -1
- package/dist/index.js.map +1 -1
- package/dist/mcp/tools/impact.d.ts +2 -0
- package/dist/mcp/tools/impact.js +59 -0
- package/dist/mcp/tools/impact.js.map +1 -0
- package/dist/mcp/tools/search.js +9 -2
- package/dist/mcp/tools/search.js.map +1 -1
- package/dist/mcp/tools.js +2 -0
- package/dist/mcp/tools.js.map +1 -1
- package/dist/reporters/consoleReporter.d.ts +2 -1
- package/dist/reporters/consoleReporter.js +42 -1
- package/dist/reporters/consoleReporter.js.map +1 -1
- package/dist/reporters/htmlReporter.d.ts +8 -0
- package/dist/reporters/htmlReporter.js +287 -0
- package/dist/reporters/htmlReporter.js.map +1 -0
- package/dist/reporters/jsonReporter.d.ts +2 -1
- package/dist/reporters/jsonReporter.js +3 -0
- package/dist/reporters/jsonReporter.js.map +1 -1
- package/dist/reporters/markdownReporter.d.ts +2 -1
- package/dist/reporters/markdownReporter.js +35 -3
- package/dist/reporters/markdownReporter.js.map +1 -1
- package/dist/tool-manifest.json +40 -3
- package/dist/types.d.ts +48 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact.js","sourceRoot":"","sources":["../../src/core/impact.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,6 +24,15 @@ export interface SearchHit {
|
|
|
24
24
|
pathMatch: boolean;
|
|
25
25
|
excerpt: string;
|
|
26
26
|
line: number;
|
|
27
|
+
/**
|
|
28
|
+
* Function context, set when the hit came from a sub-file semantic chunk
|
|
29
|
+
* (0.15.0+). Absent for file-level / lexical hits.
|
|
30
|
+
*/
|
|
31
|
+
function?: {
|
|
32
|
+
name: string;
|
|
33
|
+
startLine: number;
|
|
34
|
+
endLine: number;
|
|
35
|
+
};
|
|
27
36
|
}
|
|
28
37
|
export interface SearchOptions {
|
|
29
38
|
limit?: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"searchIndex.js","sourceRoot":"","sources":["../../src/core/searchIndex.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"searchIndex.js","sourceRoot":"","sources":["../../src/core/searchIndex.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|
|
33
|
-
*
|
|
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
|
-
*
|
|
6
|
+
* Semantic search over source files.
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
* -
|
|
10
|
-
*
|
|
11
|
-
* implements X?"
|
|
12
|
-
* -
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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 =
|
|
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
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|
-
|
|
44
|
-
const
|
|
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 (
|
|
69
|
-
|
|
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(
|
|
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
|
|
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
|
-
|
|
99
|
-
|
|
100
|
-
:
|
|
101
|
-
|
|
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
|
|
129
|
-
*
|
|
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
|
-
|
|
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.
|
|
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":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,MAAM,MAAM,aAAa,CAAC;
|
|
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
|