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,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"}
|