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,309 @@
|
|
|
1
|
+
import { readFile, readdir, stat } from "node:fs/promises";
|
|
2
|
+
import { join, relative, extname } from "node:path";
|
|
3
|
+
import { getBM25Index, getCodeIndex } from "./index-tools.js";
|
|
4
|
+
import { searchBM25 } from "../search/bm25.js";
|
|
5
|
+
import { loadConfig } from "../config.js";
|
|
6
|
+
const DEFAULT_MAX_TEXT_MATCHES = 500;
|
|
7
|
+
const MAX_FILE_SIZE = 1_000_000; // 1MB — skip giant files
|
|
8
|
+
const MAX_WALK_FILES = 50_000; // Safety limit — stop walking after this many files
|
|
9
|
+
/** Directories to skip during text search file walk */
|
|
10
|
+
const IGNORE_DIRS = new Set([
|
|
11
|
+
"node_modules", ".git", "dist", "build", "coverage",
|
|
12
|
+
".codesift", ".next", "__pycache__", ".pytest_cache",
|
|
13
|
+
".venv", "venv", ".tox", ".mypy_cache", ".turbo",
|
|
14
|
+
"generated", "audit-results", ".backup", "jscpd-report",
|
|
15
|
+
]);
|
|
16
|
+
/** Binary/non-text extensions to skip during text search */
|
|
17
|
+
const BINARY_EXTENSIONS = new Set([
|
|
18
|
+
".png", ".jpg", ".jpeg", ".gif", ".bmp", ".ico", ".svg",
|
|
19
|
+
".woff", ".woff2", ".ttf", ".eot", ".otf",
|
|
20
|
+
".zip", ".gz", ".tar", ".bz2", ".7z", ".rar",
|
|
21
|
+
".pdf", ".doc", ".docx", ".xls", ".xlsx", ".ppt", ".pptx",
|
|
22
|
+
".exe", ".dll", ".so", ".dylib", ".o", ".obj",
|
|
23
|
+
".wasm", ".class", ".pyc", ".pyo",
|
|
24
|
+
".mp3", ".mp4", ".avi", ".mov", ".mkv", ".wav", ".flac",
|
|
25
|
+
".db", ".sqlite", ".sqlite3",
|
|
26
|
+
".lock",
|
|
27
|
+
]);
|
|
28
|
+
/**
|
|
29
|
+
* Match a file path against a simple glob pattern.
|
|
30
|
+
* Supports: "*.ts", "src/*.ts", "src/**\/*.ts", "**\/*.test.ts"
|
|
31
|
+
*/
|
|
32
|
+
function matchFilePattern(filePath, pattern) {
|
|
33
|
+
// Exact match
|
|
34
|
+
if (filePath === pattern)
|
|
35
|
+
return true;
|
|
36
|
+
// "**\/" prefix — match anywhere in path
|
|
37
|
+
if (pattern.startsWith("**/")) {
|
|
38
|
+
const suffix = pattern.slice(3);
|
|
39
|
+
// Recursively match the suffix against every segment tail
|
|
40
|
+
return matchFilePattern(filePath, suffix) ||
|
|
41
|
+
filePath.includes("/" + suffix) ||
|
|
42
|
+
matchFileSuffix(filePath, suffix);
|
|
43
|
+
}
|
|
44
|
+
// "*" at the start — match extension-style patterns like "*.ts"
|
|
45
|
+
if (pattern.startsWith("*") && !pattern.includes("/")) {
|
|
46
|
+
const suffix = pattern.slice(1);
|
|
47
|
+
return filePath.endsWith(suffix);
|
|
48
|
+
}
|
|
49
|
+
// "dir/**" — match everything under directory (e.g., "src/**")
|
|
50
|
+
if (pattern.endsWith("/**")) {
|
|
51
|
+
const prefix = pattern.slice(0, -3);
|
|
52
|
+
return filePath.startsWith(prefix + "/") || filePath === prefix;
|
|
53
|
+
}
|
|
54
|
+
// Pattern with "**" in the middle (e.g., "src/**/*.ts")
|
|
55
|
+
if (pattern.includes("/**/")) {
|
|
56
|
+
const [prefix, suffix] = splitFirst(pattern, "/**/");
|
|
57
|
+
if (!filePath.startsWith(prefix + "/") && filePath !== prefix)
|
|
58
|
+
return false;
|
|
59
|
+
const rest = filePath.slice(prefix.length + 1);
|
|
60
|
+
return matchFilePattern(rest, suffix) ||
|
|
61
|
+
matchFilePattern(rest, "**/" + suffix);
|
|
62
|
+
}
|
|
63
|
+
// Simple directory prefix + filename pattern (e.g., "src/*.ts")
|
|
64
|
+
if (pattern.includes("/") && pattern.includes("*")) {
|
|
65
|
+
const lastSlash = pattern.lastIndexOf("/");
|
|
66
|
+
const dirPart = pattern.slice(0, lastSlash);
|
|
67
|
+
const filePart = pattern.slice(lastSlash + 1);
|
|
68
|
+
const fileLastSlash = filePath.lastIndexOf("/");
|
|
69
|
+
const fileDir = fileLastSlash >= 0 ? filePath.slice(0, fileLastSlash) : "";
|
|
70
|
+
const fileName = fileLastSlash >= 0 ? filePath.slice(fileLastSlash + 1) : filePath;
|
|
71
|
+
if (fileDir !== dirPart)
|
|
72
|
+
return false;
|
|
73
|
+
return matchFilePattern(fileName, filePart);
|
|
74
|
+
}
|
|
75
|
+
// No wildcards: substring match on the full path
|
|
76
|
+
// "risk.service.ts" matches "src/lib/services/risk/risk.service.ts"
|
|
77
|
+
// "validators" matches "src/lib/validators/schema.ts"
|
|
78
|
+
if (!pattern.includes("*")) {
|
|
79
|
+
return filePath.includes(pattern);
|
|
80
|
+
}
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
function matchFileSuffix(filePath, suffix) {
|
|
84
|
+
if (suffix.startsWith("*")) {
|
|
85
|
+
const ext = suffix.slice(1);
|
|
86
|
+
return filePath.endsWith(ext);
|
|
87
|
+
}
|
|
88
|
+
return filePath.endsWith("/" + suffix) || filePath === suffix;
|
|
89
|
+
}
|
|
90
|
+
function splitFirst(str, sep) {
|
|
91
|
+
const idx = str.indexOf(sep);
|
|
92
|
+
if (idx < 0)
|
|
93
|
+
return [str, ""];
|
|
94
|
+
return [str.slice(0, idx), str.slice(idx + sep.length)];
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Walk a directory tree collecting all text files.
|
|
98
|
+
* Returns relative paths from rootPath.
|
|
99
|
+
* Unlike the index walk, this includes ALL text files (not just parseable ones).
|
|
100
|
+
*/
|
|
101
|
+
async function walkAllTextFiles(rootPath) {
|
|
102
|
+
const files = [];
|
|
103
|
+
let limitReached = false;
|
|
104
|
+
async function walk(dirPath) {
|
|
105
|
+
if (limitReached)
|
|
106
|
+
return;
|
|
107
|
+
let entries;
|
|
108
|
+
try {
|
|
109
|
+
entries = await readdir(dirPath, { withFileTypes: true });
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
return; // permission denied, etc.
|
|
113
|
+
}
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
if (limitReached)
|
|
116
|
+
return;
|
|
117
|
+
const fullPath = join(dirPath, entry.name);
|
|
118
|
+
if (entry.isDirectory()) {
|
|
119
|
+
if (IGNORE_DIRS.has(entry.name) || entry.name.startsWith(".")) {
|
|
120
|
+
continue;
|
|
121
|
+
}
|
|
122
|
+
await walk(fullPath);
|
|
123
|
+
}
|
|
124
|
+
else if (entry.isFile()) {
|
|
125
|
+
const ext = extname(entry.name);
|
|
126
|
+
// Skip binary files
|
|
127
|
+
if (BINARY_EXTENSIONS.has(ext))
|
|
128
|
+
continue;
|
|
129
|
+
// Skip files that are too large
|
|
130
|
+
try {
|
|
131
|
+
const fileStat = await stat(fullPath);
|
|
132
|
+
if (fileStat.size > MAX_FILE_SIZE)
|
|
133
|
+
continue;
|
|
134
|
+
}
|
|
135
|
+
catch {
|
|
136
|
+
continue;
|
|
137
|
+
}
|
|
138
|
+
files.push(relative(rootPath, fullPath));
|
|
139
|
+
if (files.length >= MAX_WALK_FILES) {
|
|
140
|
+
console.warn(`[codesift] walkAllTextFiles: reached ${MAX_WALK_FILES} file limit, returning partial results`);
|
|
141
|
+
limitReached = true;
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
await walk(rootPath);
|
|
148
|
+
return files;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Search symbols by name/signature/docstring using BM25 ranking.
|
|
152
|
+
* Supports filtering by symbol kind and file pattern.
|
|
153
|
+
*
|
|
154
|
+
* When query is empty, returns all symbols matching the filters (up to top_k).
|
|
155
|
+
* When kind or file_pattern filters are active, BM25 searches a wider candidate
|
|
156
|
+
* set to avoid post-filter truncation.
|
|
157
|
+
*/
|
|
158
|
+
export async function searchSymbols(repo, query, options) {
|
|
159
|
+
const index = await getBM25Index(repo);
|
|
160
|
+
if (!index) {
|
|
161
|
+
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
162
|
+
}
|
|
163
|
+
const config = loadConfig();
|
|
164
|
+
const topK = options?.top_k ?? config.defaultTopK;
|
|
165
|
+
const includeSource = options?.include_source ?? true;
|
|
166
|
+
const hasKindFilter = !!options?.kind;
|
|
167
|
+
const hasFileFilter = !!options?.file_pattern;
|
|
168
|
+
const hasFilters = hasKindFilter || hasFileFilter;
|
|
169
|
+
let results;
|
|
170
|
+
if (!query.trim()) {
|
|
171
|
+
// Empty query: return all symbols matching filters (no BM25 scoring)
|
|
172
|
+
const allSymbols = [...index.symbols.values()];
|
|
173
|
+
let filtered = allSymbols;
|
|
174
|
+
if (hasKindFilter) {
|
|
175
|
+
const kind = options.kind;
|
|
176
|
+
filtered = filtered.filter((s) => s.kind === kind);
|
|
177
|
+
}
|
|
178
|
+
if (hasFileFilter) {
|
|
179
|
+
const pattern = options.file_pattern;
|
|
180
|
+
filtered = filtered.filter((s) => matchFilePattern(s.file, pattern));
|
|
181
|
+
}
|
|
182
|
+
results = filtered.slice(0, topK).map((symbol) => ({
|
|
183
|
+
symbol,
|
|
184
|
+
score: 0,
|
|
185
|
+
}));
|
|
186
|
+
}
|
|
187
|
+
else {
|
|
188
|
+
// When filters are active, search a wider candidate set from BM25
|
|
189
|
+
// so that post-filter truncation doesn't lose relevant results.
|
|
190
|
+
const searchTopK = hasFilters ? Math.max(topK * 5, 200) : topK;
|
|
191
|
+
results = searchBM25(index, query, searchTopK, config.bm25FieldWeights);
|
|
192
|
+
// Filter by symbol kind
|
|
193
|
+
if (hasKindFilter) {
|
|
194
|
+
const kind = options.kind;
|
|
195
|
+
results = results.filter((r) => r.symbol.kind === kind);
|
|
196
|
+
}
|
|
197
|
+
// Filter by file pattern
|
|
198
|
+
if (hasFileFilter) {
|
|
199
|
+
const pattern = options.file_pattern;
|
|
200
|
+
results = results.filter((r) => matchFilePattern(r.symbol.file, pattern));
|
|
201
|
+
}
|
|
202
|
+
// Re-truncate to requested top_k after filtering
|
|
203
|
+
results = results.slice(0, topK);
|
|
204
|
+
}
|
|
205
|
+
// Strip source if not requested
|
|
206
|
+
if (!includeSource) {
|
|
207
|
+
results = results.map((r) => {
|
|
208
|
+
const { source: _source, ...symbolWithoutSource } = r.symbol;
|
|
209
|
+
return { ...r, symbol: symbolWithoutSource };
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
// Truncate source to source_chars limit (default 500 when include_source=true)
|
|
213
|
+
const sourceChars = options?.source_chars ?? (includeSource ? 500 : undefined);
|
|
214
|
+
if (includeSource && sourceChars !== undefined && sourceChars > 0) {
|
|
215
|
+
results = results.map((r) => {
|
|
216
|
+
const source = r.symbol.source;
|
|
217
|
+
if (source && source.length > sourceChars) {
|
|
218
|
+
return {
|
|
219
|
+
...r,
|
|
220
|
+
symbol: { ...r.symbol, source: source.slice(0, sourceChars) + "..." },
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
return r;
|
|
224
|
+
});
|
|
225
|
+
}
|
|
226
|
+
return results;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Full-text search across all files in a repository.
|
|
230
|
+
* Walks the filesystem to search ALL text files, not just indexed ones.
|
|
231
|
+
*/
|
|
232
|
+
export async function searchText(repo, query, options) {
|
|
233
|
+
const index = await getCodeIndex(repo);
|
|
234
|
+
if (!index) {
|
|
235
|
+
throw new Error(`Repository "${repo}" not found. Run index_folder first.`);
|
|
236
|
+
}
|
|
237
|
+
const contextLines = options?.context_lines ?? 2;
|
|
238
|
+
const useRegex = options?.regex ?? false;
|
|
239
|
+
const filePattern = options?.file_pattern;
|
|
240
|
+
const maxResults = options?.max_results ?? DEFAULT_MAX_TEXT_MATCHES;
|
|
241
|
+
let regex = null;
|
|
242
|
+
if (useRegex) {
|
|
243
|
+
try {
|
|
244
|
+
regex = new RegExp(query);
|
|
245
|
+
}
|
|
246
|
+
catch (err) {
|
|
247
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
248
|
+
throw new Error(`Invalid regex pattern: ${message}`);
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
// Walk the filesystem to find ALL text files (not just indexed/parseable ones)
|
|
252
|
+
const allFiles = await walkAllTextFiles(index.root);
|
|
253
|
+
const matches = [];
|
|
254
|
+
for (const filePath of allFiles) {
|
|
255
|
+
if (matches.length >= maxResults)
|
|
256
|
+
break;
|
|
257
|
+
// Filter by file pattern
|
|
258
|
+
if (filePattern && !matchFilePattern(filePath, filePattern)) {
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
const fullPath = join(index.root, filePath);
|
|
262
|
+
let content;
|
|
263
|
+
try {
|
|
264
|
+
content = await readFile(fullPath, "utf-8");
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
continue; // File may have been deleted or moved
|
|
268
|
+
}
|
|
269
|
+
const lines = content.split("\n");
|
|
270
|
+
for (let i = 0; i < lines.length; i++) {
|
|
271
|
+
if (matches.length >= maxResults)
|
|
272
|
+
break;
|
|
273
|
+
const line = lines[i];
|
|
274
|
+
if (line === undefined)
|
|
275
|
+
continue;
|
|
276
|
+
const isMatch = regex ? regex.test(line) : line.includes(query);
|
|
277
|
+
if (!isMatch)
|
|
278
|
+
continue;
|
|
279
|
+
const contextBefore = [];
|
|
280
|
+
const contextAfter = [];
|
|
281
|
+
for (let j = Math.max(0, i - contextLines); j < i; j++) {
|
|
282
|
+
const ctxLine = lines[j];
|
|
283
|
+
if (ctxLine !== undefined) {
|
|
284
|
+
contextBefore.push(ctxLine);
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
for (let j = i + 1; j <= Math.min(lines.length - 1, i + contextLines); j++) {
|
|
288
|
+
const ctxLine = lines[j];
|
|
289
|
+
if (ctxLine !== undefined) {
|
|
290
|
+
contextAfter.push(ctxLine);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
const match = {
|
|
294
|
+
file: filePath,
|
|
295
|
+
line: i + 1, // 1-based
|
|
296
|
+
content: line,
|
|
297
|
+
};
|
|
298
|
+
if (contextBefore.length > 0) {
|
|
299
|
+
match.context_before = contextBefore;
|
|
300
|
+
}
|
|
301
|
+
if (contextAfter.length > 0) {
|
|
302
|
+
match.context_after = contextAfter;
|
|
303
|
+
}
|
|
304
|
+
matches.push(match);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return matches;
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=search-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"search-tools.js","sourceRoot":"","sources":["../../src/tools/search-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { CodeSymbol, Reference } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Retrieve a single symbol by ID with fresh source from disk.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getSymbol(repo: string, symbolId: string): Promise<CodeSymbol | null>;
|
|
6
|
+
/**
|
|
7
|
+
* Retrieve multiple symbols by ID with fresh source from disk.
|
|
8
|
+
* Groups reads by file to minimize disk I/O.
|
|
9
|
+
*/
|
|
10
|
+
export declare function getSymbols(repo: string, symbolIds: string[]): Promise<CodeSymbol[]>;
|
|
11
|
+
/**
|
|
12
|
+
* Find references to a symbol name across indexed files.
|
|
13
|
+
* Matches whole words only using word-boundary regex.
|
|
14
|
+
*/
|
|
15
|
+
export declare function findReferences(repo: string, symbolName: string, filePattern?: string): Promise<Reference[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Search for a symbol by query and return it with full source.
|
|
18
|
+
* Optionally includes references across the codebase.
|
|
19
|
+
*/
|
|
20
|
+
export declare function findAndShow(repo: string, query: string, includeRefs?: boolean): Promise<{
|
|
21
|
+
symbol: CodeSymbol;
|
|
22
|
+
references?: Reference[];
|
|
23
|
+
} | null>;
|
|
24
|
+
//# sourceMappingURL=symbol-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-tools.d.ts","sourceRoot":"","sources":["../../src/tools/symbol-tools.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAwBzD;;GAEG;AACH,wBAAsB,SAAS,CAC7B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAqB5B;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAC9B,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,EAAE,GAClB,OAAO,CAAC,UAAU,EAAE,CAAC,CA0DvB;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,SAAS,EAAE,CAAC,CAmDtB;AAED;;;GAGG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,EACb,WAAW,CAAC,EAAE,OAAO,GACpB,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,UAAU,CAAC,EAAE,SAAS,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAqBlE"}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import { readFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
import { searchBM25 } from "../search/bm25.js";
|
|
4
|
+
import { loadConfig } from "../config.js";
|
|
5
|
+
import { getCodeIndex, getBM25Index } from "./index-tools.js";
|
|
6
|
+
const MAX_REFERENCES = 200;
|
|
7
|
+
const MAX_CONTEXT_LENGTH = 200; // Truncate context lines to prevent huge output from minified files
|
|
8
|
+
/**
|
|
9
|
+
* Read a source file and extract lines for a symbol (1-based, inclusive).
|
|
10
|
+
* Returns undefined if the file cannot be read.
|
|
11
|
+
*/
|
|
12
|
+
async function extractSource(repoRoot, file, startLine, endLine) {
|
|
13
|
+
try {
|
|
14
|
+
const content = await readFile(join(repoRoot, file), "utf-8");
|
|
15
|
+
const lines = content.split("\n");
|
|
16
|
+
return lines.slice(startLine - 1, endLine).join("\n");
|
|
17
|
+
}
|
|
18
|
+
catch {
|
|
19
|
+
return undefined;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Retrieve a single symbol by ID with fresh source from disk.
|
|
24
|
+
*/
|
|
25
|
+
export async function getSymbol(repo, symbolId) {
|
|
26
|
+
const index = await getCodeIndex(repo);
|
|
27
|
+
if (!index) {
|
|
28
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
29
|
+
}
|
|
30
|
+
const symbol = index.symbols.find((s) => s.id === symbolId);
|
|
31
|
+
if (!symbol)
|
|
32
|
+
return null;
|
|
33
|
+
const source = await extractSource(index.root, symbol.file, symbol.start_line, symbol.end_line);
|
|
34
|
+
const result = { ...symbol };
|
|
35
|
+
if (source !== undefined) {
|
|
36
|
+
result.source = source;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Retrieve multiple symbols by ID with fresh source from disk.
|
|
42
|
+
* Groups reads by file to minimize disk I/O.
|
|
43
|
+
*/
|
|
44
|
+
export async function getSymbols(repo, symbolIds) {
|
|
45
|
+
const index = await getCodeIndex(repo);
|
|
46
|
+
if (!index) {
|
|
47
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
48
|
+
}
|
|
49
|
+
// Build lookup map for requested symbols
|
|
50
|
+
const symbolMap = new Map();
|
|
51
|
+
for (const sym of index.symbols) {
|
|
52
|
+
if (symbolIds.includes(sym.id)) {
|
|
53
|
+
symbolMap.set(sym.id, sym);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Group symbols by file to read each file only once
|
|
57
|
+
const byFile = new Map();
|
|
58
|
+
for (const id of symbolIds) {
|
|
59
|
+
const sym = symbolMap.get(id);
|
|
60
|
+
if (!sym)
|
|
61
|
+
continue;
|
|
62
|
+
let group = byFile.get(sym.file);
|
|
63
|
+
if (!group) {
|
|
64
|
+
group = [];
|
|
65
|
+
byFile.set(sym.file, group);
|
|
66
|
+
}
|
|
67
|
+
group.push(sym);
|
|
68
|
+
}
|
|
69
|
+
// Read each file once, extract source for all symbols in that file
|
|
70
|
+
const results = new Map();
|
|
71
|
+
for (const [file, symbols] of byFile) {
|
|
72
|
+
let fileContent;
|
|
73
|
+
try {
|
|
74
|
+
fileContent = await readFile(join(index.root, file), "utf-8");
|
|
75
|
+
}
|
|
76
|
+
catch {
|
|
77
|
+
// File may have been deleted since indexing
|
|
78
|
+
}
|
|
79
|
+
const lines = fileContent?.split("\n");
|
|
80
|
+
for (const sym of symbols) {
|
|
81
|
+
const result = { ...sym };
|
|
82
|
+
if (lines) {
|
|
83
|
+
result.source = lines.slice(sym.start_line - 1, sym.end_line).join("\n");
|
|
84
|
+
}
|
|
85
|
+
results.set(sym.id, result);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
// Return in the same order as requested, skipping missing IDs
|
|
89
|
+
const ordered = [];
|
|
90
|
+
for (const id of symbolIds) {
|
|
91
|
+
const sym = results.get(id);
|
|
92
|
+
if (sym)
|
|
93
|
+
ordered.push(sym);
|
|
94
|
+
}
|
|
95
|
+
return ordered;
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Find references to a symbol name across indexed files.
|
|
99
|
+
* Matches whole words only using word-boundary regex.
|
|
100
|
+
*/
|
|
101
|
+
export async function findReferences(repo, symbolName, filePattern) {
|
|
102
|
+
const index = await getCodeIndex(repo);
|
|
103
|
+
if (!index) {
|
|
104
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
105
|
+
}
|
|
106
|
+
// Escape special regex characters in symbol name
|
|
107
|
+
const escaped = symbolName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
108
|
+
const pattern = new RegExp(`\\b${escaped}\\b`);
|
|
109
|
+
// Optional file pattern filter
|
|
110
|
+
const fileFilter = filePattern
|
|
111
|
+
? new RegExp(filePattern.replace(/[.*+?^${}()|[\]\\]/g, "\\$&").replace(/\\\*/g, ".*"))
|
|
112
|
+
: null;
|
|
113
|
+
const refs = [];
|
|
114
|
+
for (const fileEntry of index.files) {
|
|
115
|
+
if (refs.length >= MAX_REFERENCES)
|
|
116
|
+
break;
|
|
117
|
+
if (fileFilter && !fileFilter.test(fileEntry.path))
|
|
118
|
+
continue;
|
|
119
|
+
let content;
|
|
120
|
+
try {
|
|
121
|
+
content = await readFile(join(index.root, fileEntry.path), "utf-8");
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
continue; // File may have been deleted
|
|
125
|
+
}
|
|
126
|
+
const lines = content.split("\n");
|
|
127
|
+
for (let i = 0; i < lines.length; i++) {
|
|
128
|
+
if (refs.length >= MAX_REFERENCES)
|
|
129
|
+
break;
|
|
130
|
+
const line = lines[i];
|
|
131
|
+
if (line === undefined)
|
|
132
|
+
continue;
|
|
133
|
+
const match = pattern.exec(line);
|
|
134
|
+
if (match) {
|
|
135
|
+
const rawContext = line.trimEnd();
|
|
136
|
+
refs.push({
|
|
137
|
+
file: fileEntry.path,
|
|
138
|
+
line: i + 1,
|
|
139
|
+
col: match.index + 1,
|
|
140
|
+
context: rawContext.length > MAX_CONTEXT_LENGTH
|
|
141
|
+
? rawContext.slice(0, MAX_CONTEXT_LENGTH) + "..."
|
|
142
|
+
: rawContext,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
return refs;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Search for a symbol by query and return it with full source.
|
|
151
|
+
* Optionally includes references across the codebase.
|
|
152
|
+
*/
|
|
153
|
+
export async function findAndShow(repo, query, includeRefs) {
|
|
154
|
+
const bm25Index = await getBM25Index(repo);
|
|
155
|
+
if (!bm25Index) {
|
|
156
|
+
throw new Error(`Repository "${repo}" not found. Index it first with index_folder.`);
|
|
157
|
+
}
|
|
158
|
+
const config = loadConfig();
|
|
159
|
+
const results = searchBM25(bm25Index, query, 1, config.bm25FieldWeights);
|
|
160
|
+
const topResult = results[0];
|
|
161
|
+
if (!topResult)
|
|
162
|
+
return null;
|
|
163
|
+
const fullSymbol = await getSymbol(repo, topResult.symbol.id);
|
|
164
|
+
if (!fullSymbol)
|
|
165
|
+
return null;
|
|
166
|
+
if (includeRefs) {
|
|
167
|
+
const references = await findReferences(repo, fullSymbol.name);
|
|
168
|
+
return { symbol: fullSymbol, references };
|
|
169
|
+
}
|
|
170
|
+
return { symbol: fullSymbol };
|
|
171
|
+
}
|
|
172
|
+
//# sourceMappingURL=symbol-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"symbol-tools.js","sourceRoot":"","sources":["../../src/tools/symbol-tools.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export type SymbolKind = "function" | "method" | "class" | "interface" | "type" | "variable" | "constant" | "field" | "enum" | "namespace" | "module" | "section" | "metadata" | "test_suite" | "test_case" | "test_hook" | "default_export" | "unknown";
|
|
2
|
+
export interface FileLocation {
|
|
3
|
+
file: string;
|
|
4
|
+
start_line: number;
|
|
5
|
+
end_line: number;
|
|
6
|
+
start_col?: number;
|
|
7
|
+
end_col?: number;
|
|
8
|
+
}
|
|
9
|
+
export interface CodeSymbol extends FileLocation {
|
|
10
|
+
id: string;
|
|
11
|
+
repo: string;
|
|
12
|
+
name: string;
|
|
13
|
+
kind: SymbolKind;
|
|
14
|
+
signature?: string;
|
|
15
|
+
docstring?: string;
|
|
16
|
+
source?: string;
|
|
17
|
+
parent?: string;
|
|
18
|
+
tokens?: string[];
|
|
19
|
+
}
|
|
20
|
+
export interface FileEntry {
|
|
21
|
+
path: string;
|
|
22
|
+
language: string;
|
|
23
|
+
symbol_count: number;
|
|
24
|
+
last_modified: number;
|
|
25
|
+
}
|
|
26
|
+
export interface CodeIndex {
|
|
27
|
+
repo: string;
|
|
28
|
+
root: string;
|
|
29
|
+
symbols: CodeSymbol[];
|
|
30
|
+
files: FileEntry[];
|
|
31
|
+
created_at: number;
|
|
32
|
+
updated_at: number;
|
|
33
|
+
symbol_count: number;
|
|
34
|
+
file_count: number;
|
|
35
|
+
}
|
|
36
|
+
export interface RepoMeta {
|
|
37
|
+
name: string;
|
|
38
|
+
root: string;
|
|
39
|
+
index_path: string;
|
|
40
|
+
symbol_count: number;
|
|
41
|
+
file_count: number;
|
|
42
|
+
updated_at: number;
|
|
43
|
+
}
|
|
44
|
+
export interface Registry {
|
|
45
|
+
repos: Record<string, RepoMeta>;
|
|
46
|
+
updated_at: number;
|
|
47
|
+
}
|
|
48
|
+
export interface SearchResult {
|
|
49
|
+
symbol: CodeSymbol;
|
|
50
|
+
score: number;
|
|
51
|
+
matches?: string[];
|
|
52
|
+
}
|
|
53
|
+
export interface Reference {
|
|
54
|
+
file: string;
|
|
55
|
+
line: number;
|
|
56
|
+
col?: number;
|
|
57
|
+
context: string;
|
|
58
|
+
}
|
|
59
|
+
export interface TextMatch {
|
|
60
|
+
file: string;
|
|
61
|
+
line: number;
|
|
62
|
+
content: string;
|
|
63
|
+
context_before?: string[];
|
|
64
|
+
context_after?: string[];
|
|
65
|
+
}
|
|
66
|
+
export type Direction = "callers" | "callees";
|
|
67
|
+
export interface CallNode {
|
|
68
|
+
symbol: CodeSymbol;
|
|
69
|
+
children: CallNode[];
|
|
70
|
+
}
|
|
71
|
+
export interface ImpactResult {
|
|
72
|
+
changed_files: string[];
|
|
73
|
+
affected_symbols: CodeSymbol[];
|
|
74
|
+
dependency_graph: Record<string, string[]>;
|
|
75
|
+
}
|
|
76
|
+
export interface EmbeddingMeta {
|
|
77
|
+
model: string;
|
|
78
|
+
provider: "voyage" | "openai" | "ollama";
|
|
79
|
+
dimensions: number;
|
|
80
|
+
symbol_count: number;
|
|
81
|
+
updated_at: number;
|
|
82
|
+
}
|
|
83
|
+
export interface CodeChunk {
|
|
84
|
+
id: string;
|
|
85
|
+
file: string;
|
|
86
|
+
startLine: number;
|
|
87
|
+
endLine: number;
|
|
88
|
+
text: string;
|
|
89
|
+
tokenCount: number;
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,iCAAiC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git ref/URL validation utilities — shared across tools that invoke git.
|
|
3
|
+
* Prevents command injection when refs/URLs are passed to execFileSync.
|
|
4
|
+
*/
|
|
5
|
+
/** Allows alphanumeric, `/`, `.`, `-`, `_`, `~`, `^`, `@`, `{`, `}`. */
|
|
6
|
+
export declare const GIT_REF_PATTERN: RegExp;
|
|
7
|
+
export declare function validateGitRef(ref: string): void;
|
|
8
|
+
/** Allows HTTPS, SSH, git://, and file:// protocols. */
|
|
9
|
+
export declare const GIT_URL_PATTERN: RegExp;
|
|
10
|
+
export declare function validateGitUrl(url: string): void;
|
|
11
|
+
//# sourceMappingURL=git-validation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"git-validation.d.ts","sourceRoot":"","sources":["../../src/utils/git-validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,wEAAwE;AACxE,eAAO,MAAM,eAAe,QAA6B,CAAC;AAE1D,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIhD;AAED,wDAAwD;AACxD,eAAO,MAAM,eAAe,QAA2D,CAAC;AAExF,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAIhD"}
|