codesift-mcp 0.1.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/LICENSE +21 -0
- package/README.md +241 -0
- package/dist/cli/args.d.ts +13 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +79 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/commands.d.ts +4 -0
- package/dist/cli/commands.d.ts.map +1 -0
- package/dist/cli/commands.js +336 -0
- package/dist/cli/commands.js.map +1 -0
- package/dist/cli/help.d.ts +3 -0
- package/dist/cli/help.d.ts.map +1 -0
- package/dist/cli/help.js +271 -0
- package/dist/cli/help.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +80 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +23 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +49 -0
- package/dist/config.js.map +1 -0
- package/dist/parser/extractors/go.d.ts +4 -0
- package/dist/parser/extractors/go.d.ts.map +1 -0
- package/dist/parser/extractors/go.js +185 -0
- package/dist/parser/extractors/go.js.map +1 -0
- package/dist/parser/extractors/javascript.d.ts +9 -0
- package/dist/parser/extractors/javascript.d.ts.map +1 -0
- package/dist/parser/extractors/javascript.js +10 -0
- package/dist/parser/extractors/javascript.js.map +1 -0
- package/dist/parser/extractors/markdown.d.ts +15 -0
- package/dist/parser/extractors/markdown.d.ts.map +1 -0
- package/dist/parser/extractors/markdown.js +217 -0
- package/dist/parser/extractors/markdown.js.map +1 -0
- package/dist/parser/extractors/prisma.d.ts +17 -0
- package/dist/parser/extractors/prisma.d.ts.map +1 -0
- package/dist/parser/extractors/prisma.js +121 -0
- package/dist/parser/extractors/prisma.js.map +1 -0
- package/dist/parser/extractors/python.d.ts +4 -0
- package/dist/parser/extractors/python.d.ts.map +1 -0
- package/dist/parser/extractors/python.js +203 -0
- package/dist/parser/extractors/python.js.map +1 -0
- package/dist/parser/extractors/rust.d.ts +4 -0
- package/dist/parser/extractors/rust.d.ts.map +1 -0
- package/dist/parser/extractors/rust.js +178 -0
- package/dist/parser/extractors/rust.js.map +1 -0
- package/dist/parser/extractors/typescript.d.ts +4 -0
- package/dist/parser/extractors/typescript.d.ts.map +1 -0
- package/dist/parser/extractors/typescript.js +296 -0
- package/dist/parser/extractors/typescript.js.map +1 -0
- package/dist/parser/languages/tree-sitter-css.wasm +0 -0
- package/dist/parser/languages/tree-sitter-go.wasm +0 -0
- package/dist/parser/languages/tree-sitter-java.wasm +0 -0
- package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/dist/parser/languages/tree-sitter-json.wasm +0 -0
- package/dist/parser/languages/tree-sitter-php.wasm +0 -0
- package/dist/parser/languages/tree-sitter-python.wasm +0 -0
- package/dist/parser/languages/tree-sitter-ruby.wasm +0 -0
- package/dist/parser/languages/tree-sitter-rust.wasm +0 -0
- package/dist/parser/languages/tree-sitter-tsx.wasm +0 -0
- package/dist/parser/languages/tree-sitter-typescript.wasm +0 -0
- package/dist/parser/parser-manager.d.ts +6 -0
- package/dist/parser/parser-manager.d.ts.map +1 -0
- package/dist/parser/parser-manager.js +60 -0
- package/dist/parser/parser-manager.js.map +1 -0
- package/dist/parser/symbol-extractor.d.ts +22 -0
- package/dist/parser/symbol-extractor.d.ts.map +1 -0
- package/dist/parser/symbol-extractor.js +115 -0
- package/dist/parser/symbol-extractor.js.map +1 -0
- package/dist/retrieval/codebase-retrieval.d.ts +27 -0
- package/dist/retrieval/codebase-retrieval.d.ts.map +1 -0
- package/dist/retrieval/codebase-retrieval.js +472 -0
- package/dist/retrieval/codebase-retrieval.js.map +1 -0
- package/dist/search/bm25.d.ts +22 -0
- package/dist/search/bm25.d.ts.map +1 -0
- package/dist/search/bm25.js +179 -0
- package/dist/search/bm25.js.map +1 -0
- package/dist/search/chunker.d.ts +9 -0
- package/dist/search/chunker.d.ts.map +1 -0
- package/dist/search/chunker.js +91 -0
- package/dist/search/chunker.js.map +1 -0
- package/dist/search/hybrid.d.ts +16 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +51 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/semantic.d.ts +44 -0
- package/dist/search/semantic.d.ts.map +1 -0
- package/dist/search/semantic.js +194 -0
- package/dist/search/semantic.js.map +1 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +285 -0
- package/dist/server.js.map +1 -0
- package/dist/storage/chunk-store.d.ts +32 -0
- package/dist/storage/chunk-store.d.ts.map +1 -0
- package/dist/storage/chunk-store.js +144 -0
- package/dist/storage/chunk-store.js.map +1 -0
- package/dist/storage/embedding-store.d.ts +41 -0
- package/dist/storage/embedding-store.d.ts.map +1 -0
- package/dist/storage/embedding-store.js +149 -0
- package/dist/storage/embedding-store.js.map +1 -0
- package/dist/storage/index-store.d.ts +23 -0
- package/dist/storage/index-store.d.ts.map +1 -0
- package/dist/storage/index-store.js +95 -0
- package/dist/storage/index-store.js.map +1 -0
- package/dist/storage/registry.d.ts +35 -0
- package/dist/storage/registry.d.ts.map +1 -0
- package/dist/storage/registry.js +99 -0
- package/dist/storage/registry.js.map +1 -0
- package/dist/storage/usage-stats.d.ts +32 -0
- package/dist/storage/usage-stats.d.ts.map +1 -0
- package/dist/storage/usage-stats.js +180 -0
- package/dist/storage/usage-stats.js.map +1 -0
- package/dist/storage/usage-tracker.d.ts +35 -0
- package/dist/storage/usage-tracker.d.ts.map +1 -0
- package/dist/storage/usage-tracker.js +245 -0
- package/dist/storage/usage-tracker.js.map +1 -0
- package/dist/storage/watcher.d.ts +12 -0
- package/dist/storage/watcher.d.ts.map +1 -0
- package/dist/storage/watcher.js +66 -0
- package/dist/storage/watcher.js.map +1 -0
- package/dist/tools/context-tools.d.ts +31 -0
- package/dist/tools/context-tools.d.ts.map +1 -0
- package/dist/tools/context-tools.js +219 -0
- package/dist/tools/context-tools.js.map +1 -0
- package/dist/tools/diff-tools.d.ts +22 -0
- package/dist/tools/diff-tools.d.ts.map +1 -0
- package/dist/tools/diff-tools.js +165 -0
- package/dist/tools/diff-tools.js.map +1 -0
- package/dist/tools/generate-tools.d.ts +11 -0
- package/dist/tools/generate-tools.d.ts.map +1 -0
- package/dist/tools/generate-tools.js +135 -0
- package/dist/tools/generate-tools.js.map +1 -0
- package/dist/tools/graph-tools.d.ts +60 -0
- package/dist/tools/graph-tools.d.ts.map +1 -0
- package/dist/tools/graph-tools.js +313 -0
- package/dist/tools/graph-tools.js.map +1 -0
- package/dist/tools/index-tools.d.ts +39 -0
- package/dist/tools/index-tools.d.ts.map +1 -0
- package/dist/tools/index-tools.js +451 -0
- package/dist/tools/index-tools.js.map +1 -0
- package/dist/tools/outline-tools.d.ts +59 -0
- package/dist/tools/outline-tools.d.ts.map +1 -0
- package/dist/tools/outline-tools.js +342 -0
- package/dist/tools/outline-tools.js.map +1 -0
- package/dist/tools/search-tools.d.ts +29 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +309 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/tools/symbol-tools.d.ts +24 -0
- package/dist/tools/symbol-tools.d.ts.map +1 -0
- package/dist/tools/symbol-tools.js +172 -0
- package/dist/tools/symbol-tools.js.map +1 -0
- package/dist/types.d.ts +91 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git-validation.d.ts +11 -0
- package/dist/utils/git-validation.d.ts.map +1 -0
- package/dist/utils/git-validation.js +19 -0
- package/dist/utils/git-validation.js.map +1 -0
- package/dist/utils/test-file.d.ts +11 -0
- package/dist/utils/test-file.d.ts.map +1 -0
- package/dist/utils/test-file.js +27 -0
- package/dist/utils/test-file.js.map +1 -0
- package/package.json +62 -0
- package/src/parser/languages/tree-sitter-css.wasm +0 -0
- package/src/parser/languages/tree-sitter-go.wasm +0 -0
- package/src/parser/languages/tree-sitter-java.wasm +0 -0
- package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
- package/src/parser/languages/tree-sitter-json.wasm +0 -0
- package/src/parser/languages/tree-sitter-php.wasm +0 -0
- package/src/parser/languages/tree-sitter-python.wasm +0 -0
- package/src/parser/languages/tree-sitter-ruby.wasm +0 -0
- package/src/parser/languages/tree-sitter-rust.wasm +0 -0
- package/src/parser/languages/tree-sitter-tsx.wasm +0 -0
- package/src/parser/languages/tree-sitter-typescript.wasm +0 -0
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
import { execSync } from "node:child_process";
|
|
2
|
+
import { getCodeIndex } from "./index-tools.js";
|
|
3
|
+
import { validateGitRef } from "../utils/git-validation.js";
|
|
4
|
+
import { isTestFileStrict as isTestFile } from "../utils/test-file.js";
|
|
5
|
+
const DEFAULT_CALL_DEPTH = 1;
|
|
6
|
+
const DEFAULT_IMPACT_DEPTH = 2;
|
|
7
|
+
/** Maximum total nodes in a call tree to prevent runaway expansion */
|
|
8
|
+
const MAX_TREE_NODES = 500;
|
|
9
|
+
/** Maximum children per node to keep output readable */
|
|
10
|
+
const MAX_CHILDREN_PER_NODE = 20;
|
|
11
|
+
/** Minimum symbol name length to consider as a call edge (skip `id`, `e`, etc.) */
|
|
12
|
+
const MIN_CALL_NAME_LENGTH = 3;
|
|
13
|
+
/** Symbol kinds that represent callable entities */
|
|
14
|
+
const CALLABLE_KINDS = new Set([
|
|
15
|
+
"function", "method", "class", "default_export", "variable",
|
|
16
|
+
]);
|
|
17
|
+
/**
|
|
18
|
+
* Extract identifiers that look like function/method calls from source code.
|
|
19
|
+
* Matches patterns like: `functionName(`, `obj.methodName(`, `this.method(`
|
|
20
|
+
* Returns a Set of the called identifier names.
|
|
21
|
+
*/
|
|
22
|
+
function extractCallSites(source) {
|
|
23
|
+
const calls = new Set();
|
|
24
|
+
// Match: word followed by ( — captures function calls and method calls
|
|
25
|
+
// Also handles: this.method(, obj.method(, await func(, new Class(
|
|
26
|
+
const callPattern = /\b([a-zA-Z_$][\w$]*)\s*(?:<[^>]*>)?\s*\(/g;
|
|
27
|
+
let match;
|
|
28
|
+
while ((match = callPattern.exec(source)) !== null) {
|
|
29
|
+
const name = match[1];
|
|
30
|
+
// Skip language keywords that look like calls
|
|
31
|
+
if (!KEYWORD_SET.has(name) && name.length >= MIN_CALL_NAME_LENGTH) {
|
|
32
|
+
calls.add(name);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return calls;
|
|
36
|
+
}
|
|
37
|
+
/** JS/TS keywords that appear with ( but are not function calls */
|
|
38
|
+
const KEYWORD_SET = new Set([
|
|
39
|
+
"if", "for", "while", "switch", "catch", "return", "typeof", "instanceof",
|
|
40
|
+
"new", "throw", "delete", "void", "yield", "await", "import", "export",
|
|
41
|
+
"from", "const", "let", "var", "function", "class", "extends", "implements",
|
|
42
|
+
"interface", "type", "enum", "async", "static", "get", "set", "constructor",
|
|
43
|
+
"super", "this", "true", "false", "null", "undefined", "try", "finally",
|
|
44
|
+
"else", "case", "default", "break", "continue", "do", "in", "of",
|
|
45
|
+
"as", "is", "keyof", "readonly", "declare", "abstract", "override",
|
|
46
|
+
"public", "private", "protected",
|
|
47
|
+
]);
|
|
48
|
+
/**
|
|
49
|
+
* Build caller/callee adjacency lists by extracting actual call sites from source code.
|
|
50
|
+
*
|
|
51
|
+
* For each symbol with source, extracts identifiers used as function calls (pattern: `name(`)
|
|
52
|
+
* and looks them up in the symbol name index. This produces much more accurate edges than
|
|
53
|
+
* simple word-boundary matching, which matches any mention of a symbol name.
|
|
54
|
+
*
|
|
55
|
+
* @param allSymbols - All symbols in the index
|
|
56
|
+
* @param skipTests - If true, exclude symbols from test files (default: true)
|
|
57
|
+
*/
|
|
58
|
+
function buildAdjacencyIndex(allSymbols, skipTests = true) {
|
|
59
|
+
const callees = new Map();
|
|
60
|
+
const callers = new Map();
|
|
61
|
+
// Filter symbols: optionally skip test files
|
|
62
|
+
const symbols = skipTests
|
|
63
|
+
? allSymbols.filter(s => !isTestFile(s.file))
|
|
64
|
+
: allSymbols;
|
|
65
|
+
// Build name → symbols lookup (only callable kinds for callee targets)
|
|
66
|
+
const nameToSymbols = new Map();
|
|
67
|
+
for (const sym of symbols) {
|
|
68
|
+
if (!CALLABLE_KINDS.has(sym.kind))
|
|
69
|
+
continue;
|
|
70
|
+
if (sym.name.length < MIN_CALL_NAME_LENGTH)
|
|
71
|
+
continue;
|
|
72
|
+
const existing = nameToSymbols.get(sym.name);
|
|
73
|
+
if (existing)
|
|
74
|
+
existing.push(sym);
|
|
75
|
+
else
|
|
76
|
+
nameToSymbols.set(sym.name, [sym]);
|
|
77
|
+
}
|
|
78
|
+
// For each symbol with source, extract call sites and find matching targets
|
|
79
|
+
for (const sym of symbols) {
|
|
80
|
+
if (!sym.source)
|
|
81
|
+
continue;
|
|
82
|
+
const callSites = extractCallSites(sym.source);
|
|
83
|
+
const symCallees = [];
|
|
84
|
+
for (const calledName of callSites) {
|
|
85
|
+
const targets = nameToSymbols.get(calledName);
|
|
86
|
+
if (!targets)
|
|
87
|
+
continue;
|
|
88
|
+
for (const target of targets) {
|
|
89
|
+
if (target.id === sym.id)
|
|
90
|
+
continue;
|
|
91
|
+
// Skip self-file references for common patterns (e.g., method calling sibling method)
|
|
92
|
+
// Keep cross-file references always
|
|
93
|
+
symCallees.push(target);
|
|
94
|
+
// Record reverse edge (caller)
|
|
95
|
+
const targetCallers = callers.get(target.id);
|
|
96
|
+
if (targetCallers)
|
|
97
|
+
targetCallers.push(sym);
|
|
98
|
+
else
|
|
99
|
+
callers.set(target.id, [sym]);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
if (symCallees.length > 0) {
|
|
103
|
+
callees.set(sym.id, symCallees);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return { callees, callers };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* BFS traversal to build a call chain tree up to the given depth.
|
|
110
|
+
* Uses pre-built adjacency index for O(1) neighbor lookups.
|
|
111
|
+
* Enforces MAX_TREE_NODES and MAX_CHILDREN_PER_NODE limits.
|
|
112
|
+
*/
|
|
113
|
+
function buildCallTree(root, adjacency, direction, maxDepth) {
|
|
114
|
+
const visited = new Set([root.id]);
|
|
115
|
+
const adj = direction === "callees" ? adjacency.callees : adjacency.callers;
|
|
116
|
+
let totalNodes = 1;
|
|
117
|
+
function expand(symbol, depth) {
|
|
118
|
+
if (depth >= maxDepth || totalNodes >= MAX_TREE_NODES) {
|
|
119
|
+
return { symbol, children: [] };
|
|
120
|
+
}
|
|
121
|
+
const neighbors = adj.get(symbol.id) ?? [];
|
|
122
|
+
const children = [];
|
|
123
|
+
for (const neighbor of neighbors) {
|
|
124
|
+
if (totalNodes >= MAX_TREE_NODES)
|
|
125
|
+
break;
|
|
126
|
+
if (children.length >= MAX_CHILDREN_PER_NODE)
|
|
127
|
+
break;
|
|
128
|
+
if (visited.has(neighbor.id))
|
|
129
|
+
continue;
|
|
130
|
+
visited.add(neighbor.id);
|
|
131
|
+
totalNodes++;
|
|
132
|
+
children.push(expand(neighbor, depth + 1));
|
|
133
|
+
}
|
|
134
|
+
return { symbol, children };
|
|
135
|
+
}
|
|
136
|
+
return expand(root, 0);
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Strip the `source` field from a CodeSymbol, keeping compact metadata.
|
|
140
|
+
*/
|
|
141
|
+
function stripSource(sym) {
|
|
142
|
+
const { source: _, ...rest } = sym;
|
|
143
|
+
return rest;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Recursively strip `source` from all symbols in a CallNode tree.
|
|
147
|
+
*/
|
|
148
|
+
function stripCallTreeSource(node) {
|
|
149
|
+
return {
|
|
150
|
+
symbol: stripSource(node.symbol),
|
|
151
|
+
children: node.children.map(stripCallTreeSource),
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Trace the call chain for a symbol in a repository.
|
|
156
|
+
* Returns a tree of callers or callees up to the specified depth.
|
|
157
|
+
* By default, source code is stripped from symbols to keep output compact.
|
|
158
|
+
* Test files are excluded by default (use include_tests: true to include them).
|
|
159
|
+
*/
|
|
160
|
+
export async function traceCallChain(repo, symbolName, direction, depthOrOptions) {
|
|
161
|
+
const index = await getCodeIndex(repo);
|
|
162
|
+
if (!index) {
|
|
163
|
+
throw new Error(`Repository not found: ${repo}`);
|
|
164
|
+
}
|
|
165
|
+
// Support both legacy (depth: number) and new (options: TraceOptions) signatures
|
|
166
|
+
let maxDepth;
|
|
167
|
+
let includeSource;
|
|
168
|
+
let includeTests;
|
|
169
|
+
if (typeof depthOrOptions === "object" && depthOrOptions !== null) {
|
|
170
|
+
maxDepth = depthOrOptions.depth ?? DEFAULT_CALL_DEPTH;
|
|
171
|
+
includeSource = depthOrOptions.include_source ?? false;
|
|
172
|
+
includeTests = depthOrOptions.include_tests ?? false;
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
maxDepth = depthOrOptions ?? DEFAULT_CALL_DEPTH;
|
|
176
|
+
includeSource = false;
|
|
177
|
+
includeTests = false;
|
|
178
|
+
}
|
|
179
|
+
// Find the target symbol — prefer non-test files when tests are excluded
|
|
180
|
+
const candidates = index.symbols.filter((s) => s.name === symbolName);
|
|
181
|
+
let target;
|
|
182
|
+
if (!includeTests) {
|
|
183
|
+
target = candidates.find((s) => !isTestFile(s.file));
|
|
184
|
+
}
|
|
185
|
+
target ??= candidates[0];
|
|
186
|
+
if (!target) {
|
|
187
|
+
throw new Error(`Symbol "${symbolName}" not found in repository "${repo}"`);
|
|
188
|
+
}
|
|
189
|
+
const adjacency = buildAdjacencyIndex(index.symbols, !includeTests);
|
|
190
|
+
const tree = buildCallTree(target, adjacency, direction, maxDepth);
|
|
191
|
+
return includeSource ? tree : stripCallTreeSource(tree);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Find all callers of the given symbols, recursing up to depth levels.
|
|
195
|
+
* Uses pre-built adjacency index for efficient lookups.
|
|
196
|
+
*/
|
|
197
|
+
function findAffectedSymbols(changedSymbols, adjacency, maxDepth) {
|
|
198
|
+
const affected = new Map();
|
|
199
|
+
for (const sym of changedSymbols) {
|
|
200
|
+
affected.set(sym.id, sym);
|
|
201
|
+
}
|
|
202
|
+
let frontier = changedSymbols;
|
|
203
|
+
for (let d = 0; d < maxDepth; d++) {
|
|
204
|
+
const nextFrontier = [];
|
|
205
|
+
for (const sym of frontier) {
|
|
206
|
+
const symCallers = adjacency.callers.get(sym.id) ?? [];
|
|
207
|
+
for (const caller of symCallers) {
|
|
208
|
+
if (!affected.has(caller.id)) {
|
|
209
|
+
affected.set(caller.id, caller);
|
|
210
|
+
nextFrontier.push(caller);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
if (nextFrontier.length === 0)
|
|
215
|
+
break;
|
|
216
|
+
frontier = nextFrontier;
|
|
217
|
+
}
|
|
218
|
+
return [...affected.values()];
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Build a file-level dependency graph from pre-computed adjacency.
|
|
222
|
+
*/
|
|
223
|
+
function buildFileDependencyGraph(index, adjacency) {
|
|
224
|
+
const graph = {};
|
|
225
|
+
const symbolsByFile = new Map();
|
|
226
|
+
for (const sym of index.symbols) {
|
|
227
|
+
const existing = symbolsByFile.get(sym.file);
|
|
228
|
+
if (existing)
|
|
229
|
+
existing.push(sym);
|
|
230
|
+
else
|
|
231
|
+
symbolsByFile.set(sym.file, [sym]);
|
|
232
|
+
}
|
|
233
|
+
for (const [file, fileSymbols] of symbolsByFile) {
|
|
234
|
+
const dependentFiles = new Set();
|
|
235
|
+
for (const sym of fileSymbols) {
|
|
236
|
+
const symCallers = adjacency.callers.get(sym.id) ?? [];
|
|
237
|
+
for (const caller of symCallers) {
|
|
238
|
+
if (caller.file !== file) {
|
|
239
|
+
dependentFiles.add(caller.file);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
if (dependentFiles.size > 0) {
|
|
244
|
+
graph[file] = [...dependentFiles];
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return graph;
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Run git diff to find changed files between two refs.
|
|
251
|
+
*/
|
|
252
|
+
function getChangedFiles(repoRoot, since, until) {
|
|
253
|
+
validateGitRef(since);
|
|
254
|
+
validateGitRef(until);
|
|
255
|
+
try {
|
|
256
|
+
const output = execSync(`git diff --name-only ${since}..${until}`, {
|
|
257
|
+
cwd: repoRoot,
|
|
258
|
+
encoding: "utf-8",
|
|
259
|
+
timeout: 10_000,
|
|
260
|
+
});
|
|
261
|
+
return output
|
|
262
|
+
.split("\n")
|
|
263
|
+
.map((line) => line.trim())
|
|
264
|
+
.filter((line) => line.length > 0);
|
|
265
|
+
}
|
|
266
|
+
catch (err) {
|
|
267
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
268
|
+
throw new Error(`Git diff failed: ${message}`);
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Analyze the impact of recent git changes on a repository.
|
|
273
|
+
* Finds changed files, affected symbols, and builds a dependency graph.
|
|
274
|
+
* By default, source code is stripped from symbols to keep output compact.
|
|
275
|
+
*/
|
|
276
|
+
export async function impactAnalysis(repo, since, depthOrOptions, until) {
|
|
277
|
+
const index = await getCodeIndex(repo);
|
|
278
|
+
if (!index) {
|
|
279
|
+
throw new Error(`Repository not found: ${repo}`);
|
|
280
|
+
}
|
|
281
|
+
// Support both legacy (depth: number, until: string) and new (options: ImpactOptions) signatures
|
|
282
|
+
let maxDepth;
|
|
283
|
+
let untilRef;
|
|
284
|
+
let includeSource;
|
|
285
|
+
if (typeof depthOrOptions === "object" && depthOrOptions !== null) {
|
|
286
|
+
maxDepth = depthOrOptions.depth ?? DEFAULT_IMPACT_DEPTH;
|
|
287
|
+
untilRef = depthOrOptions.until ?? until ?? "HEAD";
|
|
288
|
+
includeSource = depthOrOptions.include_source ?? false;
|
|
289
|
+
}
|
|
290
|
+
else {
|
|
291
|
+
maxDepth = depthOrOptions ?? DEFAULT_IMPACT_DEPTH;
|
|
292
|
+
untilRef = until ?? "HEAD";
|
|
293
|
+
includeSource = false;
|
|
294
|
+
}
|
|
295
|
+
const changedFiles = getChangedFiles(index.root, since, untilRef);
|
|
296
|
+
// Find all symbols in changed files
|
|
297
|
+
const changedSymbols = index.symbols.filter((s) => changedFiles.includes(s.file));
|
|
298
|
+
// Build adjacency index once, reuse for both affected + dependency graph
|
|
299
|
+
// Include test files for impact analysis (want to know which tests are affected)
|
|
300
|
+
const adjacency = buildAdjacencyIndex(index.symbols, false);
|
|
301
|
+
const affectedSymbols = findAffectedSymbols(changedSymbols, adjacency, maxDepth);
|
|
302
|
+
const dependencyGraph = buildFileDependencyGraph(index, adjacency);
|
|
303
|
+
return {
|
|
304
|
+
changed_files: changedFiles,
|
|
305
|
+
affected_symbols: includeSource
|
|
306
|
+
? affectedSymbols
|
|
307
|
+
: affectedSymbols.map(stripSource),
|
|
308
|
+
dependency_graph: dependencyGraph,
|
|
309
|
+
};
|
|
310
|
+
}
|
|
311
|
+
// Export for testing
|
|
312
|
+
export { buildAdjacencyIndex, extractCallSites, buildCallTree, isTestFile };
|
|
313
|
+
//# sourceMappingURL=graph-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"graph-tools.js","sourceRoot":"","sources":["../../src/tools/graph-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { type BM25Index } from "../search/bm25.js";
|
|
2
|
+
import type { CodeIndex, RepoMeta } from "../types.js";
|
|
3
|
+
export interface IndexFolderResult {
|
|
4
|
+
repo: string;
|
|
5
|
+
root: string;
|
|
6
|
+
file_count: number;
|
|
7
|
+
symbol_count: number;
|
|
8
|
+
duration_ms: number;
|
|
9
|
+
}
|
|
10
|
+
export declare function indexFolder(folderPath: string, options?: {
|
|
11
|
+
incremental?: boolean | undefined;
|
|
12
|
+
include_paths?: string[] | undefined;
|
|
13
|
+
watch?: boolean | undefined;
|
|
14
|
+
}): Promise<IndexFolderResult>;
|
|
15
|
+
/**
|
|
16
|
+
* Clone a remote git repository and index it.
|
|
17
|
+
* Clones into ~/.codesift/repos/{name}. If already cloned, pulls latest.
|
|
18
|
+
*/
|
|
19
|
+
export declare function indexRepo(url: string, options?: {
|
|
20
|
+
branch?: string | undefined;
|
|
21
|
+
include_paths?: string[] | undefined;
|
|
22
|
+
}): Promise<IndexFolderResult>;
|
|
23
|
+
export declare function listAllRepos(): Promise<RepoMeta[]>;
|
|
24
|
+
export declare function invalidateCache(repoName: string): Promise<boolean>;
|
|
25
|
+
/**
|
|
26
|
+
* Get the in-memory BM25 index for a repo.
|
|
27
|
+
* Loads from disk if not cached.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getBM25Index(repoName: string): Promise<BM25Index | null>;
|
|
30
|
+
/**
|
|
31
|
+
* Get the code index for a repo from disk.
|
|
32
|
+
*/
|
|
33
|
+
export declare function getCodeIndex(repoName: string): Promise<CodeIndex | null>;
|
|
34
|
+
/**
|
|
35
|
+
* Get the in-memory embedding cache for a repo.
|
|
36
|
+
* Loads from disk if not cached. Returns null if no embeddings file exists.
|
|
37
|
+
*/
|
|
38
|
+
export declare function getEmbeddingCache(repoName: string): Promise<Map<string, Float32Array> | null>;
|
|
39
|
+
//# sourceMappingURL=index-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-tools.d.ts","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"AASA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAOnE,OAAO,KAAK,EAAc,SAAS,EAAa,QAAQ,EAAE,MAAM,aAAa,CAAC;AA0I9E,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,WAAW,CAC/B,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE;IACR,WAAW,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAClC,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACrC,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;CAC7B,GACA,OAAO,CAAC,iBAAiB,CAAC,CAyJ5B;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE;IACR,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,aAAa,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CACtC,GACA,OAAO,CAAC,iBAAiB,CAAC,CA8D5B;AAkDD,wBAAsB,YAAY,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAGxD;AAED,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CA4BxE;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAc9E;AAED;;GAEG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,CAM9E;AAED;;;GAGG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,GAAG,IAAI,CAAC,CAc3C"}
|