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.
Files changed (177) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +241 -0
  3. package/dist/cli/args.d.ts +13 -0
  4. package/dist/cli/args.d.ts.map +1 -0
  5. package/dist/cli/args.js +79 -0
  6. package/dist/cli/args.js.map +1 -0
  7. package/dist/cli/commands.d.ts +4 -0
  8. package/dist/cli/commands.d.ts.map +1 -0
  9. package/dist/cli/commands.js +336 -0
  10. package/dist/cli/commands.js.map +1 -0
  11. package/dist/cli/help.d.ts +3 -0
  12. package/dist/cli/help.d.ts.map +1 -0
  13. package/dist/cli/help.js +271 -0
  14. package/dist/cli/help.js.map +1 -0
  15. package/dist/cli.d.ts +3 -0
  16. package/dist/cli.d.ts.map +1 -0
  17. package/dist/cli.js +80 -0
  18. package/dist/cli.js.map +1 -0
  19. package/dist/config.d.ts +23 -0
  20. package/dist/config.d.ts.map +1 -0
  21. package/dist/config.js +49 -0
  22. package/dist/config.js.map +1 -0
  23. package/dist/parser/extractors/go.d.ts +4 -0
  24. package/dist/parser/extractors/go.d.ts.map +1 -0
  25. package/dist/parser/extractors/go.js +185 -0
  26. package/dist/parser/extractors/go.js.map +1 -0
  27. package/dist/parser/extractors/javascript.d.ts +9 -0
  28. package/dist/parser/extractors/javascript.d.ts.map +1 -0
  29. package/dist/parser/extractors/javascript.js +10 -0
  30. package/dist/parser/extractors/javascript.js.map +1 -0
  31. package/dist/parser/extractors/markdown.d.ts +15 -0
  32. package/dist/parser/extractors/markdown.d.ts.map +1 -0
  33. package/dist/parser/extractors/markdown.js +217 -0
  34. package/dist/parser/extractors/markdown.js.map +1 -0
  35. package/dist/parser/extractors/prisma.d.ts +17 -0
  36. package/dist/parser/extractors/prisma.d.ts.map +1 -0
  37. package/dist/parser/extractors/prisma.js +121 -0
  38. package/dist/parser/extractors/prisma.js.map +1 -0
  39. package/dist/parser/extractors/python.d.ts +4 -0
  40. package/dist/parser/extractors/python.d.ts.map +1 -0
  41. package/dist/parser/extractors/python.js +203 -0
  42. package/dist/parser/extractors/python.js.map +1 -0
  43. package/dist/parser/extractors/rust.d.ts +4 -0
  44. package/dist/parser/extractors/rust.d.ts.map +1 -0
  45. package/dist/parser/extractors/rust.js +178 -0
  46. package/dist/parser/extractors/rust.js.map +1 -0
  47. package/dist/parser/extractors/typescript.d.ts +4 -0
  48. package/dist/parser/extractors/typescript.d.ts.map +1 -0
  49. package/dist/parser/extractors/typescript.js +296 -0
  50. package/dist/parser/extractors/typescript.js.map +1 -0
  51. package/dist/parser/languages/tree-sitter-css.wasm +0 -0
  52. package/dist/parser/languages/tree-sitter-go.wasm +0 -0
  53. package/dist/parser/languages/tree-sitter-java.wasm +0 -0
  54. package/dist/parser/languages/tree-sitter-javascript.wasm +0 -0
  55. package/dist/parser/languages/tree-sitter-json.wasm +0 -0
  56. package/dist/parser/languages/tree-sitter-php.wasm +0 -0
  57. package/dist/parser/languages/tree-sitter-python.wasm +0 -0
  58. package/dist/parser/languages/tree-sitter-ruby.wasm +0 -0
  59. package/dist/parser/languages/tree-sitter-rust.wasm +0 -0
  60. package/dist/parser/languages/tree-sitter-tsx.wasm +0 -0
  61. package/dist/parser/languages/tree-sitter-typescript.wasm +0 -0
  62. package/dist/parser/parser-manager.d.ts +6 -0
  63. package/dist/parser/parser-manager.d.ts.map +1 -0
  64. package/dist/parser/parser-manager.js +60 -0
  65. package/dist/parser/parser-manager.js.map +1 -0
  66. package/dist/parser/symbol-extractor.d.ts +22 -0
  67. package/dist/parser/symbol-extractor.d.ts.map +1 -0
  68. package/dist/parser/symbol-extractor.js +115 -0
  69. package/dist/parser/symbol-extractor.js.map +1 -0
  70. package/dist/retrieval/codebase-retrieval.d.ts +27 -0
  71. package/dist/retrieval/codebase-retrieval.d.ts.map +1 -0
  72. package/dist/retrieval/codebase-retrieval.js +472 -0
  73. package/dist/retrieval/codebase-retrieval.js.map +1 -0
  74. package/dist/search/bm25.d.ts +22 -0
  75. package/dist/search/bm25.d.ts.map +1 -0
  76. package/dist/search/bm25.js +179 -0
  77. package/dist/search/bm25.js.map +1 -0
  78. package/dist/search/chunker.d.ts +9 -0
  79. package/dist/search/chunker.d.ts.map +1 -0
  80. package/dist/search/chunker.js +91 -0
  81. package/dist/search/chunker.js.map +1 -0
  82. package/dist/search/hybrid.d.ts +16 -0
  83. package/dist/search/hybrid.d.ts.map +1 -0
  84. package/dist/search/hybrid.js +51 -0
  85. package/dist/search/hybrid.js.map +1 -0
  86. package/dist/search/semantic.d.ts +44 -0
  87. package/dist/search/semantic.d.ts.map +1 -0
  88. package/dist/search/semantic.js +194 -0
  89. package/dist/search/semantic.js.map +1 -0
  90. package/dist/server.d.ts +2 -0
  91. package/dist/server.d.ts.map +1 -0
  92. package/dist/server.js +285 -0
  93. package/dist/server.js.map +1 -0
  94. package/dist/storage/chunk-store.d.ts +32 -0
  95. package/dist/storage/chunk-store.d.ts.map +1 -0
  96. package/dist/storage/chunk-store.js +144 -0
  97. package/dist/storage/chunk-store.js.map +1 -0
  98. package/dist/storage/embedding-store.d.ts +41 -0
  99. package/dist/storage/embedding-store.d.ts.map +1 -0
  100. package/dist/storage/embedding-store.js +149 -0
  101. package/dist/storage/embedding-store.js.map +1 -0
  102. package/dist/storage/index-store.d.ts +23 -0
  103. package/dist/storage/index-store.d.ts.map +1 -0
  104. package/dist/storage/index-store.js +95 -0
  105. package/dist/storage/index-store.js.map +1 -0
  106. package/dist/storage/registry.d.ts +35 -0
  107. package/dist/storage/registry.d.ts.map +1 -0
  108. package/dist/storage/registry.js +99 -0
  109. package/dist/storage/registry.js.map +1 -0
  110. package/dist/storage/usage-stats.d.ts +32 -0
  111. package/dist/storage/usage-stats.d.ts.map +1 -0
  112. package/dist/storage/usage-stats.js +180 -0
  113. package/dist/storage/usage-stats.js.map +1 -0
  114. package/dist/storage/usage-tracker.d.ts +35 -0
  115. package/dist/storage/usage-tracker.d.ts.map +1 -0
  116. package/dist/storage/usage-tracker.js +245 -0
  117. package/dist/storage/usage-tracker.js.map +1 -0
  118. package/dist/storage/watcher.d.ts +12 -0
  119. package/dist/storage/watcher.d.ts.map +1 -0
  120. package/dist/storage/watcher.js +66 -0
  121. package/dist/storage/watcher.js.map +1 -0
  122. package/dist/tools/context-tools.d.ts +31 -0
  123. package/dist/tools/context-tools.d.ts.map +1 -0
  124. package/dist/tools/context-tools.js +219 -0
  125. package/dist/tools/context-tools.js.map +1 -0
  126. package/dist/tools/diff-tools.d.ts +22 -0
  127. package/dist/tools/diff-tools.d.ts.map +1 -0
  128. package/dist/tools/diff-tools.js +165 -0
  129. package/dist/tools/diff-tools.js.map +1 -0
  130. package/dist/tools/generate-tools.d.ts +11 -0
  131. package/dist/tools/generate-tools.d.ts.map +1 -0
  132. package/dist/tools/generate-tools.js +135 -0
  133. package/dist/tools/generate-tools.js.map +1 -0
  134. package/dist/tools/graph-tools.d.ts +60 -0
  135. package/dist/tools/graph-tools.d.ts.map +1 -0
  136. package/dist/tools/graph-tools.js +313 -0
  137. package/dist/tools/graph-tools.js.map +1 -0
  138. package/dist/tools/index-tools.d.ts +39 -0
  139. package/dist/tools/index-tools.d.ts.map +1 -0
  140. package/dist/tools/index-tools.js +451 -0
  141. package/dist/tools/index-tools.js.map +1 -0
  142. package/dist/tools/outline-tools.d.ts +59 -0
  143. package/dist/tools/outline-tools.d.ts.map +1 -0
  144. package/dist/tools/outline-tools.js +342 -0
  145. package/dist/tools/outline-tools.js.map +1 -0
  146. package/dist/tools/search-tools.d.ts +29 -0
  147. package/dist/tools/search-tools.d.ts.map +1 -0
  148. package/dist/tools/search-tools.js +309 -0
  149. package/dist/tools/search-tools.js.map +1 -0
  150. package/dist/tools/symbol-tools.d.ts +24 -0
  151. package/dist/tools/symbol-tools.d.ts.map +1 -0
  152. package/dist/tools/symbol-tools.js +172 -0
  153. package/dist/tools/symbol-tools.js.map +1 -0
  154. package/dist/types.d.ts +91 -0
  155. package/dist/types.d.ts.map +1 -0
  156. package/dist/types.js +3 -0
  157. package/dist/types.js.map +1 -0
  158. package/dist/utils/git-validation.d.ts +11 -0
  159. package/dist/utils/git-validation.d.ts.map +1 -0
  160. package/dist/utils/git-validation.js +19 -0
  161. package/dist/utils/git-validation.js.map +1 -0
  162. package/dist/utils/test-file.d.ts +11 -0
  163. package/dist/utils/test-file.d.ts.map +1 -0
  164. package/dist/utils/test-file.js +27 -0
  165. package/dist/utils/test-file.js.map +1 -0
  166. package/package.json +62 -0
  167. package/src/parser/languages/tree-sitter-css.wasm +0 -0
  168. package/src/parser/languages/tree-sitter-go.wasm +0 -0
  169. package/src/parser/languages/tree-sitter-java.wasm +0 -0
  170. package/src/parser/languages/tree-sitter-javascript.wasm +0 -0
  171. package/src/parser/languages/tree-sitter-json.wasm +0 -0
  172. package/src/parser/languages/tree-sitter-php.wasm +0 -0
  173. package/src/parser/languages/tree-sitter-python.wasm +0 -0
  174. package/src/parser/languages/tree-sitter-ruby.wasm +0 -0
  175. package/src/parser/languages/tree-sitter-rust.wasm +0 -0
  176. package/src/parser/languages/tree-sitter-tsx.wasm +0 -0
  177. package/src/parser/languages/tree-sitter-typescript.wasm +0 -0
@@ -0,0 +1,451 @@
1
+ import { readdir, readFile, stat, unlink, rm, mkdir as mkdirAsync } from "node:fs/promises";
2
+ import { join, relative, extname, resolve, basename } from "node:path";
3
+ import { execFileSync } from "node:child_process";
4
+ import { parseFile } from "../parser/parser-manager.js";
5
+ import { extractSymbols, extractMarkdownSymbols, extractPrismaSymbols } from "../parser/symbol-extractor.js";
6
+ import { getLanguageForExtension } from "../parser/parser-manager.js";
7
+ import { saveIndex, loadIndex, getIndexPath, saveIncremental } from "../storage/index-store.js";
8
+ import { registerRepo, listRepos as listRegistryRepos, getRepo, removeRepo, getRepoName } from "../storage/registry.js";
9
+ import { startWatcher, stopWatcher } from "../storage/watcher.js";
10
+ import { buildBM25Index } from "../search/bm25.js";
11
+ import { buildSymbolText, createEmbeddingProvider } from "../search/semantic.js";
12
+ import { loadEmbeddings, saveEmbeddings, saveEmbeddingMeta, getEmbeddingPath, getEmbeddingMetaPath, batchEmbed } from "../storage/embedding-store.js";
13
+ import { saveChunks, saveChunkEmbeddings, loadChunkEmbeddings, getChunkPath, getChunkEmbeddingPath } from "../storage/chunk-store.js";
14
+ import { chunkFile } from "../search/chunker.js";
15
+ import { loadConfig } from "../config.js";
16
+ import { validateGitUrl, validateGitRef } from "../utils/git-validation.js";
17
+ // Ignore patterns for directory walking (same as watcher)
18
+ const IGNORE_DIRS = new Set([
19
+ "node_modules", ".git", "dist", "build", "coverage",
20
+ ".codesift", ".next", "__pycache__", ".pytest_cache",
21
+ ".venv", "venv", ".tox", ".mypy_cache", ".turbo",
22
+ "generated", "audit-results", ".backup", "jscpd-report",
23
+ ]);
24
+ const MAX_FILE_SIZE = 1_000_000; // 1MB — skip giant files
25
+ const PARSE_CONCURRENCY = 8;
26
+ // Active watchers and in-memory indexes keyed by repo name
27
+ const activeWatchers = new Map();
28
+ const bm25Indexes = new Map();
29
+ const embeddingCaches = new Map();
30
+ /**
31
+ * Walk a directory tree, collecting files that can be parsed.
32
+ * Respects .gitignore patterns and skips known non-source directories.
33
+ */
34
+ async function walkDirectory(rootPath, includePaths) {
35
+ const files = [];
36
+ async function walk(dirPath) {
37
+ let entries;
38
+ try {
39
+ entries = await readdir(dirPath, { withFileTypes: true });
40
+ }
41
+ catch {
42
+ return; // permission denied, etc.
43
+ }
44
+ for (const entry of entries) {
45
+ const fullPath = join(dirPath, entry.name);
46
+ if (entry.isDirectory()) {
47
+ if (IGNORE_DIRS.has(entry.name) || entry.name.startsWith(".")) {
48
+ continue;
49
+ }
50
+ await walk(fullPath);
51
+ }
52
+ else if (entry.isFile()) {
53
+ const ext = extname(entry.name);
54
+ const language = getLanguageForExtension(ext);
55
+ if (!language)
56
+ continue;
57
+ // Filter by include paths if specified
58
+ if (includePaths && includePaths.length > 0) {
59
+ const relPath = relative(rootPath, fullPath);
60
+ const matches = includePaths.some((p) => relPath.startsWith(p));
61
+ if (!matches)
62
+ continue;
63
+ }
64
+ // Skip files that are too large
65
+ try {
66
+ const fileStat = await stat(fullPath);
67
+ if (fileStat.size > MAX_FILE_SIZE)
68
+ continue;
69
+ }
70
+ catch {
71
+ continue;
72
+ }
73
+ files.push(fullPath);
74
+ }
75
+ }
76
+ }
77
+ await walk(rootPath);
78
+ return files;
79
+ }
80
+ /**
81
+ * Parse files in parallel batches.
82
+ */
83
+ async function parseFiles(files, repoRoot, repoName) {
84
+ const allSymbols = [];
85
+ const fileEntries = [];
86
+ // Process in batches for controlled concurrency
87
+ for (let i = 0; i < files.length; i += PARSE_CONCURRENCY) {
88
+ const batch = files.slice(i, i + PARSE_CONCURRENCY);
89
+ const results = await Promise.all(batch.map(async (filePath) => {
90
+ try {
91
+ const source = await readFile(filePath, "utf-8");
92
+ const relPath = relative(repoRoot, filePath);
93
+ const ext = extname(filePath);
94
+ const language = getLanguageForExtension(ext) ?? "unknown";
95
+ let symbols;
96
+ // Markdown and Prisma use custom parsers (no tree-sitter grammar)
97
+ if (language === "markdown") {
98
+ symbols = extractMarkdownSymbols(source, relPath, repoName);
99
+ }
100
+ else if (language === "prisma") {
101
+ symbols = extractPrismaSymbols(source, relPath, repoName);
102
+ }
103
+ else {
104
+ const tree = await parseFile(filePath, source);
105
+ if (!tree)
106
+ return null;
107
+ symbols = extractSymbols(tree, relPath, source, repoName, language);
108
+ }
109
+ const entry = {
110
+ path: relPath,
111
+ language,
112
+ symbol_count: symbols.length,
113
+ last_modified: Date.now(),
114
+ };
115
+ return { symbols, entry };
116
+ }
117
+ catch {
118
+ return null;
119
+ }
120
+ }));
121
+ for (const result of results) {
122
+ if (result) {
123
+ allSymbols.push(...result.symbols);
124
+ fileEntries.push(result.entry);
125
+ }
126
+ }
127
+ }
128
+ return { symbols: allSymbols, fileEntries };
129
+ }
130
+ export async function indexFolder(folderPath, options) {
131
+ const config = loadConfig();
132
+ const startTime = Date.now();
133
+ const rootPath = resolve(folderPath);
134
+ const repoName = getRepoName(rootPath);
135
+ const indexPath = getIndexPath(config.dataDir, rootPath);
136
+ // Check for incremental update
137
+ if (options?.incremental) {
138
+ const existing = await loadIndex(indexPath);
139
+ if (existing) {
140
+ // For now, incremental just returns existing stats.
141
+ // Full incremental support comes via file watcher.
142
+ return {
143
+ repo: repoName,
144
+ root: rootPath,
145
+ file_count: existing.file_count,
146
+ symbol_count: existing.symbol_count,
147
+ duration_ms: Date.now() - startTime,
148
+ };
149
+ }
150
+ }
151
+ // Walk directory and collect parseable files
152
+ const files = await walkDirectory(rootPath, options?.include_paths);
153
+ // Parse all files and extract symbols
154
+ const { symbols, fileEntries } = await parseFiles(files, rootPath, repoName);
155
+ // Build and cache BM25 index
156
+ const bm25 = buildBM25Index(symbols);
157
+ bm25Indexes.set(repoName, bm25);
158
+ // Build code index
159
+ const codeIndex = {
160
+ repo: repoName,
161
+ root: rootPath,
162
+ symbols,
163
+ files: fileEntries,
164
+ created_at: Date.now(),
165
+ updated_at: Date.now(),
166
+ symbol_count: symbols.length,
167
+ file_count: fileEntries.length,
168
+ };
169
+ // Save index to disk
170
+ await saveIndex(indexPath, codeIndex);
171
+ // Embed symbols if an embedding provider is configured (non-fatal if it fails)
172
+ if (config.embeddingProvider) {
173
+ const embeddingPath = getEmbeddingPath(indexPath);
174
+ const metaPath = getEmbeddingMetaPath(indexPath);
175
+ try {
176
+ const provider = createEmbeddingProvider(config.embeddingProvider, config);
177
+ const symbolTexts = new Map(symbols.map((s) => [s.id, buildSymbolText(s)]));
178
+ const existing = await loadEmbeddings(embeddingPath);
179
+ const embeddings = await batchEmbed(symbolTexts, existing, provider.embed.bind(provider), config.embeddingBatchSize);
180
+ await saveEmbeddings(embeddingPath, embeddings);
181
+ await saveEmbeddingMeta(metaPath, {
182
+ model: provider.model,
183
+ provider: config.embeddingProvider,
184
+ dimensions: provider.dimensions,
185
+ symbol_count: embeddings.size,
186
+ updated_at: Date.now(),
187
+ });
188
+ embeddingCaches.set(repoName, embeddings);
189
+ }
190
+ catch (err) {
191
+ const message = err instanceof Error ? err.message : String(err);
192
+ console.error(`[codesift] Embedding failed for ${repoName}: ${message}`);
193
+ // Non-fatal — BM25 search still works
194
+ }
195
+ }
196
+ // Embed file chunks if an embedding provider is configured (non-fatal if it fails)
197
+ if (config.embeddingProvider) {
198
+ const chunkPath = getChunkPath(indexPath);
199
+ const chunkEmbeddingPath = getChunkEmbeddingPath(indexPath);
200
+ try {
201
+ const provider = createEmbeddingProvider(config.embeddingProvider, config);
202
+ // Build chunks for all indexed files
203
+ const allChunks = [];
204
+ for (const entry of fileEntries) {
205
+ const fullPath = join(rootPath, entry.path);
206
+ try {
207
+ const content = await readFile(fullPath, "utf-8");
208
+ const fileChunks = chunkFile(entry.path, content, repoName);
209
+ allChunks.push(...fileChunks);
210
+ }
211
+ catch {
212
+ // Skip unreadable files
213
+ }
214
+ }
215
+ if (allChunks.length > 0) {
216
+ // Load existing chunk embeddings to avoid re-embedding unchanged chunks
217
+ const existingChunkEmbeddings = await loadChunkEmbeddings(chunkEmbeddingPath) ?? new Map();
218
+ const chunkTexts = new Map(allChunks.map((c) => [c.id, c.text]));
219
+ const chunkEmbeddings = await batchEmbed(chunkTexts, existingChunkEmbeddings, provider.embed.bind(provider), 96);
220
+ await saveChunks(chunkPath, allChunks);
221
+ await saveChunkEmbeddings(chunkEmbeddingPath, chunkEmbeddings);
222
+ }
223
+ }
224
+ catch (err) {
225
+ const message = err instanceof Error ? err.message : String(err);
226
+ console.error(`[codesift] Chunk embedding failed for ${repoName}: ${message}`);
227
+ // Non-fatal — symbol-level and BM25 search still work
228
+ }
229
+ }
230
+ // Register in the global registry
231
+ const meta = {
232
+ name: repoName,
233
+ root: rootPath,
234
+ index_path: indexPath,
235
+ symbol_count: symbols.length,
236
+ file_count: fileEntries.length,
237
+ updated_at: Date.now(),
238
+ };
239
+ await registerRepo(config.registryPath, meta);
240
+ // Start file watcher for incremental updates (unless disabled)
241
+ const shouldWatch = options?.watch !== false;
242
+ if (shouldWatch) {
243
+ const existingWatcher = activeWatchers.get(repoName);
244
+ if (existingWatcher) {
245
+ await stopWatcher(existingWatcher);
246
+ }
247
+ const watcher = startWatcher(rootPath, (changedFile) => {
248
+ handleFileChange(rootPath, repoName, indexPath, changedFile).catch((err) => {
249
+ const message = err instanceof Error ? err.message : String(err);
250
+ console.error(`[codesift] Watcher error for ${changedFile}: ${message}`);
251
+ });
252
+ });
253
+ activeWatchers.set(repoName, watcher);
254
+ }
255
+ return {
256
+ repo: repoName,
257
+ root: rootPath,
258
+ file_count: fileEntries.length,
259
+ symbol_count: symbols.length,
260
+ duration_ms: Date.now() - startTime,
261
+ };
262
+ }
263
+ /**
264
+ * Clone a remote git repository and index it.
265
+ * Clones into ~/.codesift/repos/{name}. If already cloned, pulls latest.
266
+ */
267
+ export async function indexRepo(url, options) {
268
+ validateGitUrl(url);
269
+ if (options?.branch) {
270
+ validateGitRef(options.branch);
271
+ }
272
+ const config = loadConfig();
273
+ const reposDir = join(config.dataDir, "repos");
274
+ // Ensure repos directory exists (R-2: git clone requires parent to exist)
275
+ await mkdirAsync(reposDir, { recursive: true });
276
+ // Derive repo name from URL: "https://github.com/user/repo.git" → "repo"
277
+ const urlBasename = basename(url).replace(/\.git$/, "");
278
+ const cloneTarget = join(reposDir, urlBasename);
279
+ // Check if already cloned — pull instead of clone
280
+ let needsClone = true;
281
+ try {
282
+ const s = await stat(join(cloneTarget, ".git"));
283
+ if (s.isDirectory()) {
284
+ needsClone = false;
285
+ }
286
+ }
287
+ catch {
288
+ // Directory doesn't exist — will clone
289
+ }
290
+ // R-1: Use execFileSync (array form) to prevent shell injection.
291
+ // execSync with string interpolation allows $(cmd) expansion in URLs.
292
+ if (needsClone) {
293
+ const args = ["clone", "--depth", "1"];
294
+ if (options?.branch)
295
+ args.push("--branch", options.branch);
296
+ args.push("--", url, cloneTarget);
297
+ execFileSync("git", args, { stdio: "pipe", timeout: 120_000 });
298
+ }
299
+ else {
300
+ // Pull latest changes
301
+ try {
302
+ if (options?.branch) {
303
+ execFileSync("git", ["-C", cloneTarget, "checkout", options.branch], {
304
+ stdio: "pipe",
305
+ timeout: 30_000,
306
+ });
307
+ }
308
+ execFileSync("git", ["-C", cloneTarget, "pull", "--ff-only"], {
309
+ stdio: "pipe",
310
+ timeout: 60_000,
311
+ });
312
+ }
313
+ catch {
314
+ // Pull may fail if detached HEAD — force fresh clone
315
+ await rm(cloneTarget, { recursive: true, force: true });
316
+ const args = ["clone", "--depth", "1"];
317
+ if (options?.branch)
318
+ args.push("--branch", options.branch);
319
+ args.push("--", url, cloneTarget);
320
+ execFileSync("git", args, { stdio: "pipe", timeout: 120_000 });
321
+ }
322
+ }
323
+ // Index the cloned repo (no watcher for remote repos)
324
+ return indexFolder(cloneTarget, {
325
+ include_paths: options?.include_paths,
326
+ watch: false,
327
+ });
328
+ }
329
+ /**
330
+ * Handle a file change event from the watcher.
331
+ * Re-parses the changed file and updates the index incrementally.
332
+ */
333
+ async function handleFileChange(repoRoot, repoName, indexPath, relativeFile) {
334
+ const fullPath = join(repoRoot, relativeFile);
335
+ try {
336
+ const source = await readFile(fullPath, "utf-8");
337
+ const ext = extname(relativeFile);
338
+ const language = getLanguageForExtension(ext) ?? "unknown";
339
+ let symbols;
340
+ // Markdown and Prisma use custom parsers (no tree-sitter grammar)
341
+ if (language === "markdown") {
342
+ symbols = extractMarkdownSymbols(source, relativeFile, repoName);
343
+ }
344
+ else if (language === "prisma") {
345
+ symbols = extractPrismaSymbols(source, relativeFile, repoName);
346
+ }
347
+ else {
348
+ const tree = await parseFile(fullPath, source);
349
+ if (!tree)
350
+ return;
351
+ symbols = extractSymbols(tree, relativeFile, source, repoName, language);
352
+ }
353
+ const fileEntry = {
354
+ path: relativeFile,
355
+ language,
356
+ symbol_count: symbols.length,
357
+ last_modified: Date.now(),
358
+ };
359
+ await saveIncremental(indexPath, relativeFile, symbols, fileEntry);
360
+ // Rebuild in-memory BM25 index
361
+ const index = await loadIndex(indexPath);
362
+ if (index) {
363
+ bm25Indexes.set(repoName, buildBM25Index(index.symbols));
364
+ }
365
+ }
366
+ catch {
367
+ // File may have been deleted between event and read — ignore
368
+ }
369
+ }
370
+ export async function listAllRepos() {
371
+ const config = loadConfig();
372
+ return listRegistryRepos(config.registryPath);
373
+ }
374
+ export async function invalidateCache(repoName) {
375
+ const config = loadConfig();
376
+ const meta = await getRepo(config.registryPath, repoName);
377
+ if (!meta)
378
+ return false;
379
+ // Stop watcher
380
+ const watcher = activeWatchers.get(repoName);
381
+ if (watcher) {
382
+ await stopWatcher(watcher);
383
+ activeWatchers.delete(repoName);
384
+ }
385
+ // Remove in-memory caches
386
+ bm25Indexes.delete(repoName);
387
+ embeddingCaches.delete(repoName);
388
+ // Delete index file + embedding files + chunk files
389
+ const embeddingPath = getEmbeddingPath(meta.index_path);
390
+ const embeddingMetaPath = getEmbeddingMetaPath(meta.index_path);
391
+ const chunkPath = getChunkPath(meta.index_path);
392
+ const chunkEmbeddingPath = getChunkEmbeddingPath(meta.index_path);
393
+ for (const fp of [meta.index_path, embeddingPath, embeddingMetaPath, chunkPath, chunkEmbeddingPath]) {
394
+ try {
395
+ await unlink(fp);
396
+ }
397
+ catch { /* File may not exist */ }
398
+ }
399
+ // Remove from registry
400
+ await removeRepo(config.registryPath, repoName);
401
+ return true;
402
+ }
403
+ /**
404
+ * Get the in-memory BM25 index for a repo.
405
+ * Loads from disk if not cached.
406
+ */
407
+ export async function getBM25Index(repoName) {
408
+ const cached = bm25Indexes.get(repoName);
409
+ if (cached)
410
+ return cached;
411
+ const config = loadConfig();
412
+ const meta = await getRepo(config.registryPath, repoName);
413
+ if (!meta)
414
+ return null;
415
+ const index = await loadIndex(meta.index_path);
416
+ if (!index)
417
+ return null;
418
+ const bm25 = buildBM25Index(index.symbols);
419
+ bm25Indexes.set(repoName, bm25);
420
+ return bm25;
421
+ }
422
+ /**
423
+ * Get the code index for a repo from disk.
424
+ */
425
+ export async function getCodeIndex(repoName) {
426
+ const config = loadConfig();
427
+ const meta = await getRepo(config.registryPath, repoName);
428
+ if (!meta)
429
+ return null;
430
+ return loadIndex(meta.index_path);
431
+ }
432
+ /**
433
+ * Get the in-memory embedding cache for a repo.
434
+ * Loads from disk if not cached. Returns null if no embeddings file exists.
435
+ */
436
+ export async function getEmbeddingCache(repoName) {
437
+ const cached = embeddingCaches.get(repoName);
438
+ if (cached)
439
+ return cached;
440
+ const config = loadConfig();
441
+ const meta = await getRepo(config.registryPath, repoName);
442
+ if (!meta)
443
+ return null;
444
+ const embeddingPath = getEmbeddingPath(meta.index_path);
445
+ const embeddings = await loadEmbeddings(embeddingPath);
446
+ if (embeddings.size === 0)
447
+ return null;
448
+ embeddingCaches.set(repoName, embeddings);
449
+ return embeddings;
450
+ }
451
+ //# sourceMappingURL=index-tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-tools.js","sourceRoot":"","sources":["../../src/tools/index-tools.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import type { SymbolKind } from "../types.js";
2
+ export interface FileTreeNode {
3
+ name: string;
4
+ path: string;
5
+ type: "dir" | "file";
6
+ symbol_count?: number;
7
+ children?: FileTreeNode[];
8
+ }
9
+ export interface FileTreeOptions {
10
+ path_prefix?: string | undefined;
11
+ name_pattern?: string | undefined;
12
+ depth?: number | undefined;
13
+ compact?: boolean | undefined;
14
+ min_symbols?: number | undefined;
15
+ }
16
+ export interface CompactFileEntry {
17
+ path: string;
18
+ symbols: number;
19
+ }
20
+ export interface FileOutlineEntry {
21
+ id: string;
22
+ name: string;
23
+ kind: SymbolKind;
24
+ signature?: string;
25
+ start_line: number;
26
+ end_line: number;
27
+ parent?: string;
28
+ }
29
+ export interface DirectoryOutline {
30
+ path: string;
31
+ file_count: number;
32
+ symbol_count: number;
33
+ languages: string[];
34
+ }
35
+ export interface RepoOutlineResult {
36
+ directories: DirectoryOutline[];
37
+ total_symbols: number;
38
+ total_files: number;
39
+ languages: Record<string, number>;
40
+ }
41
+ /**
42
+ * Get a nested file tree for a repository.
43
+ * Supports filtering by path prefix, name pattern, and depth.
44
+ *
45
+ * When `compact=true`, returns a flat sorted list of `{ path, symbols }`
46
+ * entries instead of the full nested tree — 10-50x less output.
47
+ */
48
+ export declare function getFileTree(repo: string, options?: FileTreeOptions): Promise<FileTreeNode[] | CompactFileEntry[]>;
49
+ /**
50
+ * Get an outline of symbols in a specific file.
51
+ * Returns symbols sorted by start line, with source stripped for brevity.
52
+ */
53
+ export declare function getFileOutline(repo: string, filePath: string): Promise<FileOutlineEntry[]>;
54
+ /**
55
+ * Get a high-level outline of the entire repository.
56
+ * Groups files by directory with symbol counts and language breakdown.
57
+ */
58
+ export declare function getRepoOutline(repo: string): Promise<RepoOutlineResult>;
59
+ //# sourceMappingURL=outline-tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outline-tools.d.ts","sourceRoot":"","sources":["../../src/tools/outline-tools.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAa,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,KAAK,GAAG,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,gBAAgB,EAAE,CAAC;IAChC,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AA+RD;;;;;;GAMG;AACH,wBAAsB,WAAW,CAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,YAAY,EAAE,GAAG,gBAAgB,EAAE,CAAC,CAW9C;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GACf,OAAO,CAAC,gBAAgB,EAAE,CAAC,CA0B7B;AAED;;;GAGG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,MAAM,GACX,OAAO,CAAC,iBAAiB,CAAC,CA8C5B"}