@colbymchenry/codegraph 0.6.6 → 0.7.2
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 +180 -502
- package/dist/bin/codegraph.d.ts +0 -5
- package/dist/bin/codegraph.d.ts.map +1 -1
- package/dist/bin/codegraph.js +217 -263
- package/dist/bin/codegraph.js.map +1 -1
- package/dist/bin/uninstall.d.ts +0 -1
- package/dist/bin/uninstall.d.ts.map +1 -1
- package/dist/bin/uninstall.js +3 -29
- package/dist/bin/uninstall.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -3
- package/dist/config.js.map +1 -1
- package/dist/context/index.d.ts +3 -5
- package/dist/context/index.d.ts.map +1 -1
- package/dist/context/index.js +497 -46
- package/dist/context/index.js.map +1 -1
- package/dist/db/migrations.d.ts +1 -1
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +10 -1
- package/dist/db/migrations.js.map +1 -1
- package/dist/db/queries.d.ts +53 -0
- package/dist/db/queries.d.ts.map +1 -1
- package/dist/db/queries.js +244 -24
- package/dist/db/queries.js.map +1 -1
- package/dist/db/schema.sql +1 -16
- package/dist/errors.d.ts +1 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +1 -7
- package/dist/errors.js.map +1 -1
- package/dist/extraction/dfm-extractor.d.ts +31 -0
- package/dist/extraction/dfm-extractor.d.ts.map +1 -0
- package/dist/extraction/dfm-extractor.js +151 -0
- package/dist/extraction/dfm-extractor.js.map +1 -0
- package/dist/extraction/grammars.d.ts +9 -1
- package/dist/extraction/grammars.d.ts.map +1 -1
- package/dist/extraction/grammars.js +34 -2
- package/dist/extraction/grammars.js.map +1 -1
- package/dist/extraction/index.d.ts +7 -1
- package/dist/extraction/index.d.ts.map +1 -1
- package/dist/extraction/index.js +373 -29
- package/dist/extraction/index.js.map +1 -1
- package/dist/extraction/languages/c-cpp.d.ts +4 -0
- package/dist/extraction/languages/c-cpp.d.ts.map +1 -0
- package/dist/extraction/languages/c-cpp.js +126 -0
- package/dist/extraction/languages/c-cpp.js.map +1 -0
- package/dist/extraction/languages/csharp.d.ts +3 -0
- package/dist/extraction/languages/csharp.d.ts.map +1 -0
- package/dist/extraction/languages/csharp.js +72 -0
- package/dist/extraction/languages/csharp.js.map +1 -0
- package/dist/extraction/languages/dart.d.ts +3 -0
- package/dist/extraction/languages/dart.d.ts.map +1 -0
- package/dist/extraction/languages/dart.js +192 -0
- package/dist/extraction/languages/dart.js.map +1 -0
- package/dist/extraction/languages/go.d.ts +3 -0
- package/dist/extraction/languages/go.d.ts.map +1 -0
- package/dist/extraction/languages/go.js +58 -0
- package/dist/extraction/languages/go.js.map +1 -0
- package/dist/extraction/languages/index.d.ts +10 -0
- package/dist/extraction/languages/index.d.ts.map +1 -0
- package/dist/extraction/languages/index.js +43 -0
- package/dist/extraction/languages/index.js.map +1 -0
- package/dist/extraction/languages/java.d.ts +3 -0
- package/dist/extraction/languages/java.d.ts.map +1 -0
- package/dist/extraction/languages/java.js +64 -0
- package/dist/extraction/languages/java.js.map +1 -0
- package/dist/extraction/languages/javascript.d.ts +3 -0
- package/dist/extraction/languages/javascript.d.ts.map +1 -0
- package/dist/extraction/languages/javascript.js +90 -0
- package/dist/extraction/languages/javascript.js.map +1 -0
- package/dist/extraction/languages/kotlin.d.ts +3 -0
- package/dist/extraction/languages/kotlin.d.ts.map +1 -0
- package/dist/extraction/languages/kotlin.js +253 -0
- package/dist/extraction/languages/kotlin.js.map +1 -0
- package/dist/extraction/languages/pascal.d.ts +3 -0
- package/dist/extraction/languages/pascal.d.ts.map +1 -0
- package/dist/extraction/languages/pascal.js +66 -0
- package/dist/extraction/languages/pascal.js.map +1 -0
- package/dist/extraction/languages/php.d.ts +3 -0
- package/dist/extraction/languages/php.d.ts.map +1 -0
- package/dist/extraction/languages/php.js +107 -0
- package/dist/extraction/languages/php.js.map +1 -0
- package/dist/extraction/languages/python.d.ts +3 -0
- package/dist/extraction/languages/python.d.ts.map +1 -0
- package/dist/extraction/languages/python.js +56 -0
- package/dist/extraction/languages/python.js.map +1 -0
- package/dist/extraction/languages/ruby.d.ts +3 -0
- package/dist/extraction/languages/ruby.d.ts.map +1 -0
- package/dist/extraction/languages/ruby.js +114 -0
- package/dist/extraction/languages/ruby.js.map +1 -0
- package/dist/extraction/languages/rust.d.ts +3 -0
- package/dist/extraction/languages/rust.d.ts.map +1 -0
- package/dist/extraction/languages/rust.js +109 -0
- package/dist/extraction/languages/rust.js.map +1 -0
- package/dist/extraction/languages/swift.d.ts +3 -0
- package/dist/extraction/languages/swift.d.ts.map +1 -0
- package/dist/extraction/languages/swift.js +91 -0
- package/dist/extraction/languages/swift.js.map +1 -0
- package/dist/extraction/languages/typescript.d.ts +3 -0
- package/dist/extraction/languages/typescript.d.ts.map +1 -0
- package/dist/extraction/languages/typescript.js +129 -0
- package/dist/extraction/languages/typescript.js.map +1 -0
- package/dist/extraction/liquid-extractor.d.ts +52 -0
- package/dist/extraction/liquid-extractor.d.ts.map +1 -0
- package/dist/extraction/liquid-extractor.js +313 -0
- package/dist/extraction/liquid-extractor.js.map +1 -0
- package/dist/extraction/parse-worker.d.ts +8 -0
- package/dist/extraction/parse-worker.d.ts.map +1 -0
- package/dist/extraction/parse-worker.js +57 -0
- package/dist/extraction/parse-worker.js.map +1 -0
- package/dist/extraction/svelte-extractor.d.ts +47 -0
- package/dist/extraction/svelte-extractor.d.ts.map +1 -0
- package/dist/extraction/svelte-extractor.js +230 -0
- package/dist/extraction/svelte-extractor.js.map +1 -0
- package/dist/extraction/tree-sitter-helpers.d.ts +28 -0
- package/dist/extraction/tree-sitter-helpers.d.ts.map +1 -0
- package/dist/extraction/tree-sitter-helpers.js +103 -0
- package/dist/extraction/tree-sitter-helpers.js.map +1 -0
- package/dist/extraction/tree-sitter-types.d.ts +179 -0
- package/dist/extraction/tree-sitter-types.d.ts.map +1 -0
- package/dist/extraction/tree-sitter-types.js +10 -0
- package/dist/extraction/tree-sitter-types.js.map +1 -0
- package/dist/extraction/tree-sitter.d.ts +67 -125
- package/dist/extraction/tree-sitter.d.ts.map +1 -1
- package/dist/extraction/tree-sitter.js +1052 -1860
- package/dist/extraction/tree-sitter.js.map +1 -1
- package/dist/graph/traversal.d.ts.map +1 -1
- package/dist/graph/traversal.js +20 -2
- package/dist/graph/traversal.js.map +1 -1
- package/dist/index.d.ts +29 -53
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +88 -117
- package/dist/index.js.map +1 -1
- package/dist/installer/claude-md-template.d.ts +1 -1
- package/dist/installer/claude-md-template.d.ts.map +1 -1
- package/dist/installer/claude-md-template.js +15 -15
- package/dist/installer/config-writer.d.ts +2 -13
- package/dist/installer/config-writer.d.ts.map +1 -1
- package/dist/installer/config-writer.js +4 -87
- package/dist/installer/config-writer.js.map +1 -1
- package/dist/installer/index.d.ts +3 -4
- package/dist/installer/index.d.ts.map +1 -1
- package/dist/installer/index.js +118 -127
- package/dist/installer/index.js.map +1 -1
- package/dist/mcp/index.d.ts +5 -0
- package/dist/mcp/index.d.ts.map +1 -1
- package/dist/mcp/index.js +25 -4
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/tools.d.ts +33 -0
- package/dist/mcp/tools.d.ts.map +1 -1
- package/dist/mcp/tools.js +405 -26
- package/dist/mcp/tools.js.map +1 -1
- package/dist/mcp/transport.d.ts.map +1 -1
- package/dist/mcp/transport.js +0 -2
- package/dist/mcp/transport.js.map +1 -1
- package/dist/resolution/frameworks/csharp.js +29 -84
- package/dist/resolution/frameworks/csharp.js.map +1 -1
- package/dist/resolution/frameworks/express.js +44 -48
- package/dist/resolution/frameworks/express.js.map +1 -1
- package/dist/resolution/frameworks/go.js +34 -70
- package/dist/resolution/frameworks/go.js.map +1 -1
- package/dist/resolution/frameworks/java.js +29 -87
- package/dist/resolution/frameworks/java.js.map +1 -1
- package/dist/resolution/frameworks/laravel.js +6 -6
- package/dist/resolution/frameworks/laravel.js.map +1 -1
- package/dist/resolution/frameworks/python.js +33 -98
- package/dist/resolution/frameworks/python.js.map +1 -1
- package/dist/resolution/frameworks/react.js +53 -76
- package/dist/resolution/frameworks/react.js.map +1 -1
- package/dist/resolution/frameworks/ruby.js +12 -24
- package/dist/resolution/frameworks/ruby.js.map +1 -1
- package/dist/resolution/frameworks/rust.js +26 -66
- package/dist/resolution/frameworks/rust.js.map +1 -1
- package/dist/resolution/frameworks/svelte.js +11 -31
- package/dist/resolution/frameworks/svelte.js.map +1 -1
- package/dist/resolution/frameworks/swift.js +42 -160
- package/dist/resolution/frameworks/swift.js.map +1 -1
- package/dist/resolution/index.d.ts +19 -6
- package/dist/resolution/index.d.ts.map +1 -1
- package/dist/resolution/index.js +300 -144
- package/dist/resolution/index.js.map +1 -1
- package/dist/resolution/name-matcher.d.ts +5 -0
- package/dist/resolution/name-matcher.d.ts.map +1 -1
- package/dist/resolution/name-matcher.js +148 -8
- package/dist/resolution/name-matcher.js.map +1 -1
- package/dist/resolution/types.d.ts +1 -1
- package/dist/resolution/types.d.ts.map +1 -1
- package/dist/search/query-utils.d.ts +26 -1
- package/dist/search/query-utils.d.ts.map +1 -1
- package/dist/search/query-utils.js +209 -9
- package/dist/search/query-utils.js.map +1 -1
- package/dist/sync/index.d.ts +2 -4
- package/dist/sync/index.d.ts.map +1 -1
- package/dist/sync/index.js +4 -3
- package/dist/sync/index.js.map +1 -1
- package/dist/sync/watcher.d.ts +81 -0
- package/dist/sync/watcher.d.ts.map +1 -0
- package/dist/sync/watcher.js +184 -0
- package/dist/sync/watcher.js.map +1 -0
- package/dist/types.d.ts +2 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +0 -1
- package/dist/types.js.map +1 -1
- package/dist/ui/shimmer-progress.d.ts +11 -0
- package/dist/ui/shimmer-progress.d.ts.map +1 -0
- package/dist/ui/shimmer-progress.js +90 -0
- package/dist/ui/shimmer-progress.js.map +1 -0
- package/dist/ui/shimmer-worker.d.ts +2 -0
- package/dist/ui/shimmer-worker.d.ts.map +1 -0
- package/dist/ui/shimmer-worker.js +112 -0
- package/dist/ui/shimmer-worker.js.map +1 -0
- package/dist/ui/types.d.ts +17 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +3 -0
- package/dist/ui/types.js.map +1 -0
- package/dist/vectors/embedder.js +1 -1
- package/dist/vectors/embedder.js.map +1 -1
- package/dist/visualizer/server.d.ts.map +1 -1
- package/dist/visualizer/server.js +3 -11
- package/dist/visualizer/server.js.map +1 -1
- package/package.json +7 -12
- package/scripts/postinstall.js +0 -68
|
@@ -39,8 +39,11 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
39
39
|
})();
|
|
40
40
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
41
41
|
exports.STOP_WORDS = void 0;
|
|
42
|
+
exports.getStemVariants = getStemVariants;
|
|
42
43
|
exports.extractSearchTerms = extractSearchTerms;
|
|
43
44
|
exports.scorePathRelevance = scorePathRelevance;
|
|
45
|
+
exports.isTestFile = isTestFile;
|
|
46
|
+
exports.nameMatchBonus = nameMatchBonus;
|
|
44
47
|
exports.kindBonus = kindBonus;
|
|
45
48
|
const path = __importStar(require("path"));
|
|
46
49
|
/**
|
|
@@ -55,21 +58,104 @@ exports.STOP_WORDS = new Set([
|
|
|
55
58
|
'should', 'may', 'might', 'can', 'shall', 'not', 'no', 'all', 'each',
|
|
56
59
|
'every', 'how', 'what', 'where', 'when', 'who', 'which', 'why',
|
|
57
60
|
'i', 'me', 'my', 'we', 'our', 'you', 'your', 'he', 'she', 'they',
|
|
58
|
-
'
|
|
61
|
+
'show', 'give', 'tell',
|
|
59
62
|
'been', 'done', 'made', 'used', 'using', 'work', 'works', 'found',
|
|
60
63
|
'also', 'into', 'then', 'than', 'just', 'more', 'some', 'such',
|
|
61
|
-
'over', 'only', '
|
|
62
|
-
|
|
64
|
+
'over', 'only', 'out', 'its', 'so', 'up', 'as', 'if',
|
|
65
|
+
'look', 'need', 'needs', 'want', 'happen', 'happens',
|
|
66
|
+
'affect', 'affected', 'break', 'breaks', 'failing',
|
|
67
|
+
'implemented', 'implement',
|
|
68
|
+
// Code-specific noise (avoid filtering common symbol names like get/set/add/build/find/list)
|
|
63
69
|
'code', 'file', 'files', 'function', 'method', 'class', 'type',
|
|
64
|
-
'
|
|
70
|
+
'fix', 'bug', 'called',
|
|
65
71
|
]);
|
|
72
|
+
/**
|
|
73
|
+
* Generate stem variants of a search term by removing common English suffixes.
|
|
74
|
+
* Used for FTS query expansion so "caching" also finds "cache", "eviction" finds "evict", etc.
|
|
75
|
+
* Stems are used as PREFIX matches in FTS, so they don't need to be perfect English words.
|
|
76
|
+
*/
|
|
77
|
+
function getStemVariants(term) {
|
|
78
|
+
const variants = new Set();
|
|
79
|
+
const t = term.toLowerCase();
|
|
80
|
+
// -ing: caching→cach/cache, handling→handl/handle, running→run
|
|
81
|
+
if (t.endsWith('ing') && t.length > 5) {
|
|
82
|
+
const base = t.slice(0, -3);
|
|
83
|
+
variants.add(base);
|
|
84
|
+
variants.add(base + 'e');
|
|
85
|
+
if (base.length >= 2 && base[base.length - 1] === base[base.length - 2]) {
|
|
86
|
+
variants.add(base.slice(0, -1));
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
// -tion/-sion: eviction→evict, expression→express
|
|
90
|
+
if ((t.endsWith('tion') || t.endsWith('sion')) && t.length > 5) {
|
|
91
|
+
variants.add(t.slice(0, -3));
|
|
92
|
+
}
|
|
93
|
+
// -ment: management→manage
|
|
94
|
+
if (t.endsWith('ment') && t.length > 6) {
|
|
95
|
+
variants.add(t.slice(0, -4));
|
|
96
|
+
}
|
|
97
|
+
// -ies: entries→entry
|
|
98
|
+
if (t.endsWith('ies') && t.length > 4) {
|
|
99
|
+
variants.add(t.slice(0, -3) + 'y');
|
|
100
|
+
}
|
|
101
|
+
// -es: processes→process, classes→class
|
|
102
|
+
else if (t.endsWith('es') && t.length > 4) {
|
|
103
|
+
variants.add(t.slice(0, -2));
|
|
104
|
+
}
|
|
105
|
+
// -s: errors→error (skip -ss endings like "class")
|
|
106
|
+
else if (t.endsWith('s') && !t.endsWith('ss') && t.length > 4) {
|
|
107
|
+
variants.add(t.slice(0, -1));
|
|
108
|
+
}
|
|
109
|
+
// -ed: handled→handle, propagated→propagate, carried→carry
|
|
110
|
+
if (t.endsWith('ed') && !t.endsWith('eed') && t.length > 4) {
|
|
111
|
+
variants.add(t.slice(0, -1));
|
|
112
|
+
variants.add(t.slice(0, -2));
|
|
113
|
+
if (t.endsWith('ied') && t.length > 5) {
|
|
114
|
+
variants.add(t.slice(0, -3) + 'y');
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// -er: builder→build/builde, handler→handl/handle, getter→get
|
|
118
|
+
if (t.endsWith('er') && t.length > 4) {
|
|
119
|
+
const base = t.slice(0, -2);
|
|
120
|
+
variants.add(base);
|
|
121
|
+
variants.add(base + 'e');
|
|
122
|
+
if (base.length >= 2 && base[base.length - 1] === base[base.length - 2]) {
|
|
123
|
+
variants.add(base.slice(0, -1));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
return [...variants].filter(v => v.length >= 3 && v !== t);
|
|
127
|
+
}
|
|
66
128
|
/**
|
|
67
129
|
* Extract meaningful search terms from a natural language query.
|
|
68
130
|
* Splits camelCase, PascalCase, snake_case, SCREAMING_SNAKE, and dot.notation
|
|
69
131
|
* into individual tokens before filtering.
|
|
132
|
+
*
|
|
133
|
+
* Preserves original compound identifiers (e.g., "scrapeLoop") alongside
|
|
134
|
+
* their split parts so that FTS can match both the full symbol name and
|
|
135
|
+
* individual words within it.
|
|
136
|
+
*
|
|
137
|
+
* Also generates stem variants (e.g., "caching"→"cache", "eviction"→"evict")
|
|
138
|
+
* so FTS prefix matching can find related code symbols.
|
|
70
139
|
*/
|
|
71
|
-
function extractSearchTerms(query) {
|
|
140
|
+
function extractSearchTerms(query, options) {
|
|
141
|
+
const includeStems = options?.stems !== false;
|
|
72
142
|
const tokens = new Set();
|
|
143
|
+
// First, extract and preserve compound identifiers before splitting
|
|
144
|
+
// CamelCase: scrapeLoop, UserService, getCallGraph
|
|
145
|
+
const compoundPattern = /\b([a-zA-Z][a-zA-Z0-9]*(?:[A-Z][a-z]+)+|[A-Z][a-z]+(?:[A-Z][a-z]*)+)\b/g;
|
|
146
|
+
let match;
|
|
147
|
+
while ((match = compoundPattern.exec(query)) !== null) {
|
|
148
|
+
if (match[1] && match[1].length >= 3) {
|
|
149
|
+
tokens.add(match[1].toLowerCase()); // preserve full compound: "scrapeloop"
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
// snake_case: scrape_loop, user_service
|
|
153
|
+
const snakePattern = /\b([a-zA-Z][a-zA-Z0-9]*(?:_[a-zA-Z0-9]+)+)\b/g;
|
|
154
|
+
while ((match = snakePattern.exec(query)) !== null) {
|
|
155
|
+
if (match[1] && match[1].length >= 3) {
|
|
156
|
+
tokens.add(match[1].toLowerCase());
|
|
157
|
+
}
|
|
158
|
+
}
|
|
73
159
|
// Split camelCase / PascalCase: "getUserName" → "get User Name"
|
|
74
160
|
const camelSplit = query
|
|
75
161
|
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
@@ -86,6 +172,23 @@ function extractSearchTerms(query) {
|
|
|
86
172
|
continue;
|
|
87
173
|
tokens.add(lower);
|
|
88
174
|
}
|
|
175
|
+
// Generate stem variants for broader FTS matching.
|
|
176
|
+
// "caching" → "cache" finds CacheBuilder; "eviction" → "evict" finds evictEntries.
|
|
177
|
+
// Also enables co-occurrence dampening by increasing term count above 1.
|
|
178
|
+
// Stems are skipped when scoring path relevance (stems inflate path scores).
|
|
179
|
+
if (includeStems) {
|
|
180
|
+
const stems = new Set();
|
|
181
|
+
for (const token of tokens) {
|
|
182
|
+
for (const variant of getStemVariants(token)) {
|
|
183
|
+
if (!tokens.has(variant) && !exports.STOP_WORDS.has(variant)) {
|
|
184
|
+
stems.add(variant);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
for (const stem of stems) {
|
|
189
|
+
tokens.add(stem);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
89
192
|
return [...tokens];
|
|
90
193
|
}
|
|
91
194
|
/**
|
|
@@ -93,7 +196,9 @@ function extractSearchTerms(query) {
|
|
|
93
196
|
* Higher score = more relevant path
|
|
94
197
|
*/
|
|
95
198
|
function scorePathRelevance(filePath, query) {
|
|
96
|
-
|
|
199
|
+
// Use base terms only — stem variants inflate path scores by generating
|
|
200
|
+
// many near-duplicate terms that all match the same path segments.
|
|
201
|
+
const terms = extractSearchTerms(query, { stems: false });
|
|
97
202
|
if (terms.length === 0)
|
|
98
203
|
return 0;
|
|
99
204
|
const pathLower = filePath.toLowerCase();
|
|
@@ -111,8 +216,103 @@ function scorePathRelevance(filePath, query) {
|
|
|
111
216
|
else if (pathLower.includes(term))
|
|
112
217
|
score += 3;
|
|
113
218
|
}
|
|
219
|
+
// Deprioritize test files unless the query is explicitly about tests
|
|
220
|
+
const queryLower = query.toLowerCase();
|
|
221
|
+
const isTestQuery = queryLower.includes('test') || queryLower.includes('spec');
|
|
222
|
+
if (!isTestQuery && isTestFile(filePath)) {
|
|
223
|
+
score -= 15;
|
|
224
|
+
}
|
|
114
225
|
return score;
|
|
115
226
|
}
|
|
227
|
+
/**
|
|
228
|
+
* Check if a file path looks like a test file
|
|
229
|
+
*/
|
|
230
|
+
function isTestFile(filePath) {
|
|
231
|
+
const lower = filePath.toLowerCase();
|
|
232
|
+
const fileName = path.basename(lower);
|
|
233
|
+
// Common test file patterns
|
|
234
|
+
return (fileName.startsWith('test_') ||
|
|
235
|
+
fileName.startsWith('test.') ||
|
|
236
|
+
fileName.endsWith('.test.ts') ||
|
|
237
|
+
fileName.endsWith('.test.js') ||
|
|
238
|
+
fileName.endsWith('.test.tsx') ||
|
|
239
|
+
fileName.endsWith('.test.jsx') ||
|
|
240
|
+
fileName.endsWith('.spec.ts') ||
|
|
241
|
+
fileName.endsWith('.spec.js') ||
|
|
242
|
+
fileName.endsWith('_test.go') ||
|
|
243
|
+
fileName.endsWith('_test.py') ||
|
|
244
|
+
fileName.endsWith('_test.rs') ||
|
|
245
|
+
fileName.endsWith('Tests.java') ||
|
|
246
|
+
fileName.endsWith('Test.java') ||
|
|
247
|
+
fileName.endsWith('Tester.java') ||
|
|
248
|
+
fileName.endsWith('TestCase.java') ||
|
|
249
|
+
lower.includes('/tests/') ||
|
|
250
|
+
lower.includes('/test/') ||
|
|
251
|
+
lower.includes('/__tests__/') ||
|
|
252
|
+
lower.includes('/spec/') ||
|
|
253
|
+
lower.includes('/testlib/') ||
|
|
254
|
+
lower.includes('/testing/') ||
|
|
255
|
+
// Non-production directories: examples, samples, benchmarks, fixtures, demos.
|
|
256
|
+
// Check both mid-path (/integration/) and start-of-path (integration/) since
|
|
257
|
+
// file paths may be stored as relative paths without a leading slash.
|
|
258
|
+
matchesNonProductionDir(lower));
|
|
259
|
+
}
|
|
260
|
+
/**
|
|
261
|
+
* Check if a path is in a non-production directory (integration, sample, example, etc.)
|
|
262
|
+
* Handles both absolute paths (/foo/integration/bar) and relative paths (integration/bar).
|
|
263
|
+
*/
|
|
264
|
+
function matchesNonProductionDir(lowerPath) {
|
|
265
|
+
const dirs = [
|
|
266
|
+
'integration', 'sample', 'samples', 'example', 'examples',
|
|
267
|
+
'fixture', 'fixtures', 'benchmark', 'benchmarks', 'demo', 'demos',
|
|
268
|
+
];
|
|
269
|
+
for (const dir of dirs) {
|
|
270
|
+
if (lowerPath.includes('/' + dir + '/') || lowerPath.startsWith(dir + '/')) {
|
|
271
|
+
return true;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
return false;
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Bonus when a node's name matches the search query.
|
|
278
|
+
* Exact matches get the largest boost; prefix matches get smaller boosts.
|
|
279
|
+
* Multi-word queries also check individual term matches against the name.
|
|
280
|
+
*/
|
|
281
|
+
function nameMatchBonus(nodeName, query) {
|
|
282
|
+
const nameLower = nodeName.toLowerCase();
|
|
283
|
+
// Split query into word-level terms (handles "CacheBuilder build" → ["cache","builder","build"])
|
|
284
|
+
const rawTerms = query
|
|
285
|
+
.replace(/([a-z])([A-Z])/g, '$1 $2')
|
|
286
|
+
.split(/[\s_.\-]+/)
|
|
287
|
+
.map(t => t.toLowerCase())
|
|
288
|
+
.filter(t => t.length >= 2);
|
|
289
|
+
// Also keep original space-separated tokens for exact-term matching
|
|
290
|
+
const queryTokens = query.split(/\s+/).map(t => t.toLowerCase()).filter(t => t.length >= 2);
|
|
291
|
+
// Full query as a single token (for compound identifiers like "CacheBuilder")
|
|
292
|
+
const queryLower = query.replace(/[\s]+/g, '').toLowerCase();
|
|
293
|
+
// Exact match: query exactly equals the node name
|
|
294
|
+
if (nameLower === queryLower)
|
|
295
|
+
return 80;
|
|
296
|
+
// Exact match on a query token: "CacheBuilder build" and node name is "build"
|
|
297
|
+
if (queryTokens.length > 1 && queryTokens.includes(nameLower))
|
|
298
|
+
return 60;
|
|
299
|
+
// Name starts with query — scale by length ratio so "Pod"→"Pod" (exact, handled above)
|
|
300
|
+
// scores much higher than "Pod"→"PodGCControllerOptions" (ratio 0.125).
|
|
301
|
+
if (nameLower.startsWith(queryLower)) {
|
|
302
|
+
const ratio = queryLower.length / nameLower.length;
|
|
303
|
+
return Math.round(10 + 30 * ratio);
|
|
304
|
+
}
|
|
305
|
+
// All camelCase-split terms appear in the name
|
|
306
|
+
if (rawTerms.length > 1) {
|
|
307
|
+
const allMatch = rawTerms.every(t => nameLower.includes(t));
|
|
308
|
+
if (allMatch)
|
|
309
|
+
return 15;
|
|
310
|
+
}
|
|
311
|
+
// Name contains the full query as substring
|
|
312
|
+
if (nameLower.includes(queryLower))
|
|
313
|
+
return 10;
|
|
314
|
+
return 0;
|
|
315
|
+
}
|
|
116
316
|
/**
|
|
117
317
|
* Kind-based bonus for search ranking
|
|
118
318
|
* Functions and classes are typically more relevant than variables/imports
|
|
@@ -122,10 +322,10 @@ function kindBonus(kind) {
|
|
|
122
322
|
function: 10,
|
|
123
323
|
method: 10,
|
|
124
324
|
class: 8,
|
|
125
|
-
interface:
|
|
325
|
+
interface: 9,
|
|
126
326
|
type_alias: 6,
|
|
127
327
|
struct: 6,
|
|
128
|
-
trait:
|
|
328
|
+
trait: 9,
|
|
129
329
|
enum: 5,
|
|
130
330
|
component: 8,
|
|
131
331
|
route: 9,
|
|
@@ -139,7 +339,7 @@ function kindBonus(kind) {
|
|
|
139
339
|
parameter: 0,
|
|
140
340
|
namespace: 4,
|
|
141
341
|
file: 0,
|
|
142
|
-
protocol:
|
|
342
|
+
protocol: 9,
|
|
143
343
|
enum_member: 3,
|
|
144
344
|
};
|
|
145
345
|
return bonuses[kind] ?? 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query-utils.js","sourceRoot":"","sources":["../../src/search/query-utils.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"query-utils.js","sourceRoot":"","sources":["../../src/search/query-utils.ts"],"names":[],"mappings":"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"}
|
package/dist/sync/index.d.ts
CHANGED
|
@@ -4,12 +4,10 @@
|
|
|
4
4
|
* Provides synchronization functionality for keeping the code graph
|
|
5
5
|
* up-to-date with file system changes.
|
|
6
6
|
*
|
|
7
|
-
* Note: Git hooks functionality has been removed. CodeGraph sync is now
|
|
8
|
-
* triggered through codegraph's Claude Code hooks integration instead.
|
|
9
|
-
*
|
|
10
7
|
* Components:
|
|
8
|
+
* - FileWatcher: Debounced fs.watch that auto-triggers sync on file changes
|
|
11
9
|
* - Content hashing for change detection (in extraction module)
|
|
12
10
|
* - Incremental reindexing (in extraction module)
|
|
13
11
|
*/
|
|
14
|
-
export {};
|
|
12
|
+
export { FileWatcher, WatchOptions } from './watcher';
|
|
15
13
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/sync/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC"}
|
package/dist/sync/index.js
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
* Provides synchronization functionality for keeping the code graph
|
|
6
6
|
* up-to-date with file system changes.
|
|
7
7
|
*
|
|
8
|
-
* Note: Git hooks functionality has been removed. CodeGraph sync is now
|
|
9
|
-
* triggered through codegraph's Claude Code hooks integration instead.
|
|
10
|
-
*
|
|
11
8
|
* Components:
|
|
9
|
+
* - FileWatcher: Debounced fs.watch that auto-triggers sync on file changes
|
|
12
10
|
* - Content hashing for change detection (in extraction module)
|
|
13
11
|
* - Incremental reindexing (in extraction module)
|
|
14
12
|
*/
|
|
15
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
14
|
+
exports.FileWatcher = void 0;
|
|
15
|
+
var watcher_1 = require("./watcher");
|
|
16
|
+
Object.defineProperty(exports, "FileWatcher", { enumerable: true, get: function () { return watcher_1.FileWatcher; } });
|
|
16
17
|
//# sourceMappingURL=index.js.map
|
package/dist/sync/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":";AAAA
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/sync/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;GAUG;;;AAEH,qCAAsD;AAA7C,sGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* File Watcher
|
|
3
|
+
*
|
|
4
|
+
* Watches the project directory for file changes and triggers
|
|
5
|
+
* debounced sync operations to keep the code graph up-to-date.
|
|
6
|
+
*
|
|
7
|
+
* Uses Node.js native fs.watch with recursive mode (macOS FSEvents,
|
|
8
|
+
* Windows ReadDirectoryChangesW, Linux inotify on Node 19+).
|
|
9
|
+
*/
|
|
10
|
+
import { CodeGraphConfig } from '../types';
|
|
11
|
+
/**
|
|
12
|
+
* Options for the file watcher
|
|
13
|
+
*/
|
|
14
|
+
export interface WatchOptions {
|
|
15
|
+
/**
|
|
16
|
+
* Debounce delay in milliseconds.
|
|
17
|
+
* After the last file change, wait this long before triggering sync.
|
|
18
|
+
* Default: 2000ms
|
|
19
|
+
*/
|
|
20
|
+
debounceMs?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Callback when a sync completes (for logging/diagnostics).
|
|
23
|
+
*/
|
|
24
|
+
onSyncComplete?: (result: {
|
|
25
|
+
filesChanged: number;
|
|
26
|
+
durationMs: number;
|
|
27
|
+
}) => void;
|
|
28
|
+
/**
|
|
29
|
+
* Callback when a sync errors (for logging/diagnostics).
|
|
30
|
+
*/
|
|
31
|
+
onSyncError?: (error: Error) => void;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* FileWatcher monitors a project directory for changes and triggers
|
|
35
|
+
* debounced sync operations via a provided callback.
|
|
36
|
+
*
|
|
37
|
+
* Design goals:
|
|
38
|
+
* - Minimal resource usage (native OS file events, no polling)
|
|
39
|
+
* - Debounced to avoid thrashing on rapid saves
|
|
40
|
+
* - Filters against CodeGraph include/exclude patterns
|
|
41
|
+
* - Ignores .codegraph/ directory changes
|
|
42
|
+
*/
|
|
43
|
+
export declare class FileWatcher {
|
|
44
|
+
private watcher;
|
|
45
|
+
private debounceTimer;
|
|
46
|
+
private hasChanges;
|
|
47
|
+
private syncing;
|
|
48
|
+
private stopped;
|
|
49
|
+
private readonly projectRoot;
|
|
50
|
+
private readonly config;
|
|
51
|
+
private readonly debounceMs;
|
|
52
|
+
private readonly syncFn;
|
|
53
|
+
private readonly onSyncComplete?;
|
|
54
|
+
private readonly onSyncError?;
|
|
55
|
+
constructor(projectRoot: string, config: CodeGraphConfig, syncFn: () => Promise<{
|
|
56
|
+
filesChanged: number;
|
|
57
|
+
durationMs: number;
|
|
58
|
+
}>, options?: WatchOptions);
|
|
59
|
+
/**
|
|
60
|
+
* Start watching for file changes.
|
|
61
|
+
* Returns true if watching started successfully, false otherwise.
|
|
62
|
+
*/
|
|
63
|
+
start(): boolean;
|
|
64
|
+
/**
|
|
65
|
+
* Stop watching for file changes.
|
|
66
|
+
*/
|
|
67
|
+
stop(): void;
|
|
68
|
+
/**
|
|
69
|
+
* Whether the watcher is currently active.
|
|
70
|
+
*/
|
|
71
|
+
isActive(): boolean;
|
|
72
|
+
/**
|
|
73
|
+
* Schedule a debounced sync.
|
|
74
|
+
*/
|
|
75
|
+
private scheduleSync;
|
|
76
|
+
/**
|
|
77
|
+
* Flush pending changes by running sync.
|
|
78
|
+
*/
|
|
79
|
+
private flush;
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=watcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.d.ts","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAK3C;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;OAIG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;OAEG;IACH,cAAc,CAAC,EAAE,CAAC,MAAM,EAAE;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IAEhF;;OAEG;IACH,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACtC;AAED;;;;;;;;;GASG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,aAAa,CAA8C;IACnE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAkB;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8D;IACrF,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAiC;IACjE,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAA8B;gBAGzD,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,eAAe,EACvB,MAAM,EAAE,MAAM,OAAO,CAAC;QAAE,YAAY,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC,EACnE,OAAO,GAAE,YAAiB;IAU5B;;;OAGG;IACH,KAAK,IAAI,OAAO;IAiDhB;;OAEG;IACH,IAAI,IAAI,IAAI;IAiBZ;;OAEG;IACH,QAAQ,IAAI,OAAO;IAInB;;OAEG;IACH,OAAO,CAAC,YAAY;IAUpB;;OAEG;YACW,KAAK;CAuBpB"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* File Watcher
|
|
4
|
+
*
|
|
5
|
+
* Watches the project directory for file changes and triggers
|
|
6
|
+
* debounced sync operations to keep the code graph up-to-date.
|
|
7
|
+
*
|
|
8
|
+
* Uses Node.js native fs.watch with recursive mode (macOS FSEvents,
|
|
9
|
+
* Windows ReadDirectoryChangesW, Linux inotify on Node 19+).
|
|
10
|
+
*/
|
|
11
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
12
|
+
if (k2 === undefined) k2 = k;
|
|
13
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
14
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
15
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
16
|
+
}
|
|
17
|
+
Object.defineProperty(o, k2, desc);
|
|
18
|
+
}) : (function(o, m, k, k2) {
|
|
19
|
+
if (k2 === undefined) k2 = k;
|
|
20
|
+
o[k2] = m[k];
|
|
21
|
+
}));
|
|
22
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
23
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
24
|
+
}) : function(o, v) {
|
|
25
|
+
o["default"] = v;
|
|
26
|
+
});
|
|
27
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
28
|
+
var ownKeys = function(o) {
|
|
29
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
30
|
+
var ar = [];
|
|
31
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
32
|
+
return ar;
|
|
33
|
+
};
|
|
34
|
+
return ownKeys(o);
|
|
35
|
+
};
|
|
36
|
+
return function (mod) {
|
|
37
|
+
if (mod && mod.__esModule) return mod;
|
|
38
|
+
var result = {};
|
|
39
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
40
|
+
__setModuleDefault(result, mod);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
})();
|
|
44
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
45
|
+
exports.FileWatcher = void 0;
|
|
46
|
+
const fs = __importStar(require("fs"));
|
|
47
|
+
const extraction_1 = require("../extraction");
|
|
48
|
+
const errors_1 = require("../errors");
|
|
49
|
+
const utils_1 = require("../utils");
|
|
50
|
+
/**
|
|
51
|
+
* FileWatcher monitors a project directory for changes and triggers
|
|
52
|
+
* debounced sync operations via a provided callback.
|
|
53
|
+
*
|
|
54
|
+
* Design goals:
|
|
55
|
+
* - Minimal resource usage (native OS file events, no polling)
|
|
56
|
+
* - Debounced to avoid thrashing on rapid saves
|
|
57
|
+
* - Filters against CodeGraph include/exclude patterns
|
|
58
|
+
* - Ignores .codegraph/ directory changes
|
|
59
|
+
*/
|
|
60
|
+
class FileWatcher {
|
|
61
|
+
watcher = null;
|
|
62
|
+
debounceTimer = null;
|
|
63
|
+
hasChanges = false;
|
|
64
|
+
syncing = false;
|
|
65
|
+
stopped = false;
|
|
66
|
+
projectRoot;
|
|
67
|
+
config;
|
|
68
|
+
debounceMs;
|
|
69
|
+
syncFn;
|
|
70
|
+
onSyncComplete;
|
|
71
|
+
onSyncError;
|
|
72
|
+
constructor(projectRoot, config, syncFn, options = {}) {
|
|
73
|
+
this.projectRoot = projectRoot;
|
|
74
|
+
this.config = config;
|
|
75
|
+
this.syncFn = syncFn;
|
|
76
|
+
this.debounceMs = options.debounceMs ?? 2000;
|
|
77
|
+
this.onSyncComplete = options.onSyncComplete;
|
|
78
|
+
this.onSyncError = options.onSyncError;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Start watching for file changes.
|
|
82
|
+
* Returns true if watching started successfully, false otherwise.
|
|
83
|
+
*/
|
|
84
|
+
start() {
|
|
85
|
+
if (this.watcher)
|
|
86
|
+
return true; // Already watching
|
|
87
|
+
this.stopped = false;
|
|
88
|
+
try {
|
|
89
|
+
this.watcher = fs.watch(this.projectRoot, { recursive: true }, (_eventType, filename) => {
|
|
90
|
+
if (!filename || this.stopped)
|
|
91
|
+
return;
|
|
92
|
+
// Normalize path separators
|
|
93
|
+
const normalized = (0, utils_1.normalizePath)(filename);
|
|
94
|
+
// Ignore .codegraph/ directory changes (our own DB writes)
|
|
95
|
+
if (normalized === '.codegraph' ||
|
|
96
|
+
normalized.startsWith('.codegraph/') ||
|
|
97
|
+
normalized.startsWith('.codegraph\\')) {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
// Filter against include/exclude patterns
|
|
101
|
+
if (!(0, extraction_1.shouldIncludeFile)(normalized, this.config)) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
(0, errors_1.logDebug)('File change detected', { file: normalized });
|
|
105
|
+
this.hasChanges = true;
|
|
106
|
+
this.scheduleSync();
|
|
107
|
+
});
|
|
108
|
+
// Handle watcher errors gracefully
|
|
109
|
+
this.watcher.on('error', (err) => {
|
|
110
|
+
(0, errors_1.logWarn)('File watcher error', { error: String(err) });
|
|
111
|
+
// Don't crash — watcher may recover or user can restart
|
|
112
|
+
});
|
|
113
|
+
(0, errors_1.logDebug)('File watcher started', { projectRoot: this.projectRoot, debounceMs: this.debounceMs });
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
catch (err) {
|
|
117
|
+
// Recursive watch not supported (e.g., Linux < Node 19)
|
|
118
|
+
(0, errors_1.logWarn)('Could not start file watcher — recursive fs.watch not supported on this platform', { error: String(err) });
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Stop watching for file changes.
|
|
124
|
+
*/
|
|
125
|
+
stop() {
|
|
126
|
+
this.stopped = true;
|
|
127
|
+
if (this.debounceTimer) {
|
|
128
|
+
clearTimeout(this.debounceTimer);
|
|
129
|
+
this.debounceTimer = null;
|
|
130
|
+
}
|
|
131
|
+
if (this.watcher) {
|
|
132
|
+
this.watcher.close();
|
|
133
|
+
this.watcher = null;
|
|
134
|
+
}
|
|
135
|
+
this.hasChanges = false;
|
|
136
|
+
(0, errors_1.logDebug)('File watcher stopped');
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Whether the watcher is currently active.
|
|
140
|
+
*/
|
|
141
|
+
isActive() {
|
|
142
|
+
return this.watcher !== null && !this.stopped;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Schedule a debounced sync.
|
|
146
|
+
*/
|
|
147
|
+
scheduleSync() {
|
|
148
|
+
if (this.debounceTimer) {
|
|
149
|
+
clearTimeout(this.debounceTimer);
|
|
150
|
+
}
|
|
151
|
+
this.debounceTimer = setTimeout(() => {
|
|
152
|
+
this.debounceTimer = null;
|
|
153
|
+
this.flush();
|
|
154
|
+
}, this.debounceMs);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Flush pending changes by running sync.
|
|
158
|
+
*/
|
|
159
|
+
async flush() {
|
|
160
|
+
// If already syncing, the post-sync check will re-trigger
|
|
161
|
+
if (this.syncing || this.stopped)
|
|
162
|
+
return;
|
|
163
|
+
this.hasChanges = false;
|
|
164
|
+
this.syncing = true;
|
|
165
|
+
try {
|
|
166
|
+
const result = await this.syncFn();
|
|
167
|
+
this.onSyncComplete?.(result);
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
const error = err instanceof Error ? err : new Error(String(err));
|
|
171
|
+
(0, errors_1.logWarn)('Watch sync failed', { error: error.message });
|
|
172
|
+
this.onSyncError?.(error);
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
this.syncing = false;
|
|
176
|
+
// If new changes arrived during sync, schedule another
|
|
177
|
+
if (this.hasChanges && !this.stopped) {
|
|
178
|
+
this.scheduleSync();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
exports.FileWatcher = FileWatcher;
|
|
184
|
+
//# sourceMappingURL=watcher.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"watcher.js","sourceRoot":"","sources":["../../src/sync/watcher.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
CHANGED
|
@@ -121,6 +121,8 @@ export interface ExtractionResult {
|
|
|
121
121
|
export interface ExtractionError {
|
|
122
122
|
/** Error message */
|
|
123
123
|
message: string;
|
|
124
|
+
/** File path where the error occurred */
|
|
125
|
+
filePath?: string;
|
|
124
126
|
/** Line number if available */
|
|
125
127
|
line?: number;
|
|
126
128
|
/** Column number if available */
|
|
@@ -290,8 +292,6 @@ export interface CodeGraphConfig {
|
|
|
290
292
|
extractDocstrings: boolean;
|
|
291
293
|
/** Whether to track call sites */
|
|
292
294
|
trackCallSites: boolean;
|
|
293
|
-
/** Whether to compute embeddings for semantic search */
|
|
294
|
-
enableEmbeddings: boolean;
|
|
295
295
|
/** Custom symbol patterns to extract */
|
|
296
296
|
customPatterns?: {
|
|
297
297
|
/** Name for this pattern group */
|