lmgrep 0.1.0 → 0.1.1
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/dist/cli.js +559 -13
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +32 -0
- package/dist/index.js +180 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/build.d.ts +7 -0
- package/dist/lib/build.js +222 -0
- package/dist/lib/build.js.map +1 -0
- package/dist/{chunker → lib/chunker}/context.d.ts +0 -4
- package/dist/{chunker → lib/chunker}/context.js +3 -76
- package/dist/lib/chunker/context.js.map +1 -0
- package/dist/lib/chunker/index.d.ts +7 -0
- package/dist/{chunker → lib/chunker}/index.js +10 -5
- package/dist/lib/chunker/index.js.map +1 -0
- package/dist/lib/chunker/languages.js.map +1 -0
- package/dist/lib/config.d.ts +12 -0
- package/dist/lib/config.js +82 -0
- package/dist/lib/config.js.map +1 -0
- package/dist/lib/embedder.d.ts +55 -0
- package/dist/lib/embedder.js +221 -0
- package/dist/lib/embedder.js.map +1 -0
- package/dist/{providers.js → lib/providers.js} +0 -2
- package/dist/lib/providers.js.map +1 -0
- package/dist/lib/repair.d.ts +3 -0
- package/dist/lib/repair.js +104 -0
- package/dist/lib/repair.js.map +1 -0
- package/dist/lib/scanner.d.ts +34 -0
- package/dist/lib/scanner.js +219 -0
- package/dist/lib/scanner.js.map +1 -0
- package/dist/lib/serve.d.ts +11 -0
- package/dist/lib/serve.js +124 -0
- package/dist/lib/serve.js.map +1 -0
- package/dist/lib/store.d.ts +147 -0
- package/dist/lib/store.js +673 -0
- package/dist/lib/store.js.map +1 -0
- package/dist/lib/types.d.ts +118 -0
- package/dist/lib/types.js +13 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/mcp.js +160 -45
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunker/context.js.map +0 -1
- package/dist/chunker/index.d.ts +0 -3
- package/dist/chunker/index.js.map +0 -1
- package/dist/chunker/languages.js.map +0 -1
- package/dist/config.d.ts +0 -2
- package/dist/config.js +0 -31
- package/dist/config.js.map +0 -1
- package/dist/embedder.d.ts +0 -3
- package/dist/embedder.js +0 -55
- package/dist/embedder.js.map +0 -1
- package/dist/index-cmd.d.ts +0 -9
- package/dist/index-cmd.js +0 -250
- package/dist/index-cmd.js.map +0 -1
- package/dist/providers.js.map +0 -1
- package/dist/repair-cmd.d.ts +0 -5
- package/dist/repair-cmd.js +0 -112
- package/dist/repair-cmd.js.map +0 -1
- package/dist/search-cmd.d.ts +0 -10
- package/dist/search-cmd.js +0 -60
- package/dist/search-cmd.js.map +0 -1
- package/dist/serve-cmd.d.ts +0 -1
- package/dist/serve-cmd.js +0 -139
- package/dist/serve-cmd.js.map +0 -1
- package/dist/status-cmd.d.ts +0 -5
- package/dist/status-cmd.js +0 -119
- package/dist/status-cmd.js.map +0 -1
- package/dist/store.d.ts +0 -25
- package/dist/store.js +0 -207
- package/dist/store.js.map +0 -1
- package/dist/types.d.ts +0 -40
- package/dist/types.js +0 -2
- package/dist/types.js.map +0 -1
- package/dist/walker.d.ts +0 -3
- package/dist/walker.js +0 -90
- package/dist/walker.js.map +0 -1
- /package/dist/{chunker → lib/chunker}/languages.d.ts +0 -0
- /package/dist/{chunker → lib/chunker}/languages.js +0 -0
- /package/dist/{providers.d.ts → lib/providers.d.ts} +0 -0
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
+
process.title = "lmgrep";
|
|
2
3
|
import { Command } from "commander";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
4
|
+
import { createHash } from "node:crypto";
|
|
5
|
+
import { readFileSync, writeFileSync, existsSync, rmSync, mkdirSync, } from "node:fs";
|
|
6
|
+
import { homedir } from "node:os";
|
|
7
|
+
import { join, resolve } from "node:path";
|
|
8
|
+
import { execSync } from "node:child_process";
|
|
9
|
+
import { createIndex } from "./index.js";
|
|
10
|
+
import { getGlobalConfigPath } from "./lib/config.js";
|
|
11
|
+
import { walkFiles } from "./lib/scanner.js";
|
|
12
|
+
import { Store, getDbPath, getLegacyDbPath, isDbLocked, readProjectMetadata, extractModelFamily, discoverRunningProcesses, } from "./lib/store.js";
|
|
8
13
|
const program = new Command();
|
|
9
14
|
program
|
|
10
15
|
.name("lmgrep")
|
|
@@ -20,7 +25,19 @@ program
|
|
|
20
25
|
.option("-d, --dry", "Show what would be indexed without actually doing it")
|
|
21
26
|
.action(async (opts) => {
|
|
22
27
|
const cwd = process.cwd();
|
|
23
|
-
|
|
28
|
+
if (!opts.dry && isDbLocked(cwd)) {
|
|
29
|
+
console.error("Another process is writing to this index (serve or another lmgrep instance). Try again later.");
|
|
30
|
+
process.exit(1);
|
|
31
|
+
}
|
|
32
|
+
const index = await createIndex({ cwd });
|
|
33
|
+
await index.build({
|
|
34
|
+
reset: opts.reset,
|
|
35
|
+
verbose: opts.verbose,
|
|
36
|
+
since: opts.since,
|
|
37
|
+
force: opts.force,
|
|
38
|
+
dry: opts.dry,
|
|
39
|
+
});
|
|
40
|
+
await index.close();
|
|
24
41
|
});
|
|
25
42
|
program
|
|
26
43
|
.command("search <query>")
|
|
@@ -28,42 +45,571 @@ program
|
|
|
28
45
|
.option("-m, --limit <n>", "Max results", "25")
|
|
29
46
|
.option("--scores", "Show relevance scores")
|
|
30
47
|
.option("--compact", "Show file paths only")
|
|
48
|
+
.option("--json", "Output results as JSON")
|
|
31
49
|
.option("--min-score <n>", "Minimum score threshold")
|
|
32
50
|
.option("--file-prefix <prefix>", "Only search files matching this path prefix")
|
|
33
51
|
.option("--not <query>", "Exclude results similar to this query")
|
|
52
|
+
.option("--type <types>", "Only return chunks of these AST types (comma-separated)")
|
|
53
|
+
.option("--language <langs>", "Only return chunks from files with these extensions (comma-separated, e.g. .ts,.py)")
|
|
54
|
+
.option("--project <path>", "Search a different project's index")
|
|
55
|
+
.option("--across <paths>", "Search multiple project indexes (comma-separated paths)")
|
|
34
56
|
.action(async (query, opts) => {
|
|
35
57
|
const cwd = process.cwd();
|
|
36
|
-
await
|
|
58
|
+
const index = await createIndex({ cwd });
|
|
59
|
+
const results = await index.search(query, {
|
|
37
60
|
limit: Number.parseInt(opts.limit, 10),
|
|
38
|
-
scores: opts.scores,
|
|
39
|
-
compact: opts.compact,
|
|
40
|
-
minScore: opts.minScore ? Number.parseFloat(opts.minScore) : undefined,
|
|
41
61
|
filePrefix: opts.filePrefix,
|
|
42
62
|
not: opts.not,
|
|
63
|
+
minScore: opts.minScore
|
|
64
|
+
? Number.parseFloat(opts.minScore)
|
|
65
|
+
: undefined,
|
|
66
|
+
type: opts.type
|
|
67
|
+
? opts.type.split(",").map((s) => s.trim())
|
|
68
|
+
: undefined,
|
|
69
|
+
language: opts.language
|
|
70
|
+
? opts.language.split(",").map((s) => s.trim())
|
|
71
|
+
: undefined,
|
|
72
|
+
project: opts.project,
|
|
73
|
+
across: opts.across
|
|
74
|
+
? opts.across.split(",").map((s) => s.trim())
|
|
75
|
+
: undefined,
|
|
43
76
|
});
|
|
77
|
+
if (opts.json) {
|
|
78
|
+
console.log(JSON.stringify(results, null, 2));
|
|
79
|
+
await index.close();
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
if (results.length === 0) {
|
|
83
|
+
console.log("No results found.");
|
|
84
|
+
}
|
|
85
|
+
else if (opts.compact) {
|
|
86
|
+
const seen = new Set();
|
|
87
|
+
for (const r of results) {
|
|
88
|
+
if (!seen.has(r.filePath)) {
|
|
89
|
+
seen.add(r.filePath);
|
|
90
|
+
console.log(r.filePath);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
for (const r of results) {
|
|
96
|
+
const header = `${r.filePath}:${r.startLine}-${r.endLine} [${r.type}] ${r.name}`;
|
|
97
|
+
const score = opts.scores
|
|
98
|
+
? ` (score: ${r.score.toFixed(3)})`
|
|
99
|
+
: "";
|
|
100
|
+
console.log(`\n${"─".repeat(60)}`);
|
|
101
|
+
console.log(`${header}${score}`);
|
|
102
|
+
console.log(`${"─".repeat(60)}`);
|
|
103
|
+
console.log(r.context);
|
|
104
|
+
console.log();
|
|
105
|
+
console.log(r.content);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
await index.close();
|
|
44
109
|
});
|
|
45
110
|
program
|
|
46
111
|
.command("status")
|
|
47
112
|
.description("Show index stats and check embedding connectivity")
|
|
48
113
|
.option("-c, --changes", "Scan for changed files since last index")
|
|
114
|
+
.option("--json", "Output status as JSON")
|
|
49
115
|
.action(async (opts) => {
|
|
50
116
|
const cwd = process.cwd();
|
|
51
|
-
await
|
|
117
|
+
const index = await createIndex({ cwd });
|
|
118
|
+
const info = await index.status();
|
|
119
|
+
const processes = discoverRunningProcesses();
|
|
120
|
+
if (opts.json) {
|
|
121
|
+
const output = { ...info, processes };
|
|
122
|
+
if (opts.changes) {
|
|
123
|
+
const projectRoot = info.projectRoot;
|
|
124
|
+
const projectStore = Store.forProject(projectRoot);
|
|
125
|
+
const storedFileHashes = await projectStore.getFileHashes();
|
|
126
|
+
const currentFiles = walkFiles(projectRoot);
|
|
127
|
+
const changes = computeChanges(projectRoot, currentFiles, storedFileHashes);
|
|
128
|
+
output.changes = changes;
|
|
129
|
+
await projectStore.close();
|
|
130
|
+
}
|
|
131
|
+
console.log(JSON.stringify(output, null, 2));
|
|
132
|
+
await index.close();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
console.log(`Project root: ${info.projectRoot}`);
|
|
136
|
+
if (info.prefix)
|
|
137
|
+
console.log(`Subdirectory: ${info.prefix}`);
|
|
138
|
+
console.log(`Model: ${info.config.model}`);
|
|
139
|
+
if (info.config.provider)
|
|
140
|
+
console.log(`Provider: ${info.config.provider}`);
|
|
141
|
+
if (info.config.baseURL)
|
|
142
|
+
console.log(`Base URL: ${info.config.baseURL}`);
|
|
143
|
+
console.log(`Batch size: ${info.config.batchSize}`);
|
|
144
|
+
if (info.config.maxTokens)
|
|
145
|
+
console.log(`Max tokens: ${info.config.maxTokens}`);
|
|
146
|
+
if (info.fileCount === 0) {
|
|
147
|
+
console.log("\nNo index found. Run `lmgrep index` first.");
|
|
148
|
+
await index.close();
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
console.log(`\nIndex stats:`);
|
|
152
|
+
console.log(` Files: ${info.fileCount}`);
|
|
153
|
+
console.log(` Chunks: ${info.chunkCount}`);
|
|
154
|
+
console.log(` Unique hashes: ${info.uniqueHashes}`);
|
|
155
|
+
if (info.indexModel)
|
|
156
|
+
console.log(` Index model: ${info.indexModel}`);
|
|
157
|
+
if (info.indexDimensions)
|
|
158
|
+
console.log(` Dimensions: ${info.indexDimensions}`);
|
|
159
|
+
if (info.chunkCount !== info.uniqueHashes) {
|
|
160
|
+
console.log(` Duplicates: ${info.chunkCount - info.uniqueHashes}`);
|
|
161
|
+
}
|
|
162
|
+
console.log(`\nEmbedding check:`);
|
|
163
|
+
if (info.embeddingOk) {
|
|
164
|
+
console.log(` OK (${info.embeddingLatencyMs}ms)`);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
console.log(` FAILED`);
|
|
168
|
+
}
|
|
169
|
+
if (processes.length > 0) {
|
|
170
|
+
console.log(`\nRunning processes:`);
|
|
171
|
+
for (const proc of processes) {
|
|
172
|
+
const kindLabel = proc.kind === "mcp" ? "MCP server" :
|
|
173
|
+
proc.kind === "serve" ? "serve" :
|
|
174
|
+
"CLI";
|
|
175
|
+
const project = proc.projectRoot ?? "unknown";
|
|
176
|
+
const watching = proc.watching ? ", watching" : "";
|
|
177
|
+
console.log(` ${kindLabel} (pid ${proc.pid})${watching}`);
|
|
178
|
+
console.log(` index: ${project}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
else {
|
|
182
|
+
console.log(`\nNo running lmgrep processes.`);
|
|
183
|
+
}
|
|
184
|
+
if (opts.changes) {
|
|
185
|
+
console.log(`\nScanning for changes...`);
|
|
186
|
+
const projectRoot = info.projectRoot;
|
|
187
|
+
const projectStore = Store.forProject(projectRoot);
|
|
188
|
+
const storedFileHashes = await projectStore.getFileHashes();
|
|
189
|
+
const currentFiles = walkFiles(projectRoot);
|
|
190
|
+
const { added, modified, deleted } = computeChanges(projectRoot, currentFiles, storedFileHashes);
|
|
191
|
+
const total = added.length + modified.length + deleted.length;
|
|
192
|
+
if (total === 0) {
|
|
193
|
+
console.log(" No changes detected.");
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
if (added.length > 0) {
|
|
197
|
+
console.log(` Added: ${added.length}`);
|
|
198
|
+
for (const f of added.slice(0, 10))
|
|
199
|
+
console.log(` + ${f}`);
|
|
200
|
+
if (added.length > 10)
|
|
201
|
+
console.log(` ... and ${added.length - 10} more`);
|
|
202
|
+
}
|
|
203
|
+
if (modified.length > 0) {
|
|
204
|
+
console.log(` Modified: ${modified.length}`);
|
|
205
|
+
for (const f of modified.slice(0, 10))
|
|
206
|
+
console.log(` ~ ${f}`);
|
|
207
|
+
if (modified.length > 10)
|
|
208
|
+
console.log(` ... and ${modified.length - 10} more`);
|
|
209
|
+
}
|
|
210
|
+
if (deleted.length > 0) {
|
|
211
|
+
console.log(` Deleted: ${deleted.length}`);
|
|
212
|
+
for (const f of deleted.slice(0, 10))
|
|
213
|
+
console.log(` - ${f}`);
|
|
214
|
+
if (deleted.length > 10)
|
|
215
|
+
console.log(` ... and ${deleted.length - 10} more`);
|
|
216
|
+
}
|
|
217
|
+
console.log(`\n Run \`lmgrep index\` to update the index.`);
|
|
218
|
+
}
|
|
219
|
+
await projectStore.close();
|
|
220
|
+
}
|
|
221
|
+
await index.close();
|
|
52
222
|
});
|
|
53
223
|
program
|
|
54
224
|
.command("repair")
|
|
55
225
|
.description("Detect and fix index inconsistencies (orphaned/stale chunks)")
|
|
56
226
|
.option("-d, --dry", "Show what would be repaired without making changes")
|
|
227
|
+
.option("--json", "Output repair results as JSON")
|
|
57
228
|
.action(async (opts) => {
|
|
58
229
|
const cwd = process.cwd();
|
|
59
|
-
await
|
|
230
|
+
const index = await createIndex({ cwd });
|
|
231
|
+
const result = await index.repair(opts.dry);
|
|
232
|
+
if (opts.json) {
|
|
233
|
+
console.log(JSON.stringify(result, null, 2));
|
|
234
|
+
}
|
|
235
|
+
await index.close();
|
|
60
236
|
});
|
|
61
237
|
program
|
|
62
238
|
.command("serve")
|
|
63
239
|
.description("Watch the current directory and re-index on changes")
|
|
64
240
|
.action(async () => {
|
|
65
241
|
const cwd = process.cwd();
|
|
66
|
-
await
|
|
242
|
+
const index = await createIndex({ cwd });
|
|
243
|
+
await index.watch();
|
|
244
|
+
});
|
|
245
|
+
program
|
|
246
|
+
.command("mcp")
|
|
247
|
+
.description("Start the MCP server (stdio transport)")
|
|
248
|
+
.action(async () => {
|
|
249
|
+
await import("./mcp.js");
|
|
250
|
+
});
|
|
251
|
+
program
|
|
252
|
+
.command("init")
|
|
253
|
+
.description("Detect your embedding setup and create config")
|
|
254
|
+
.option("--force", "Overwrite existing config")
|
|
255
|
+
.option("--local", "Write a project-local .lmgrep.yml instead of the global config")
|
|
256
|
+
.action(async (opts) => {
|
|
257
|
+
const cwd = process.cwd();
|
|
258
|
+
const configPath = opts.local
|
|
259
|
+
? join(cwd, ".lmgrep.yml")
|
|
260
|
+
: getGlobalConfigPath();
|
|
261
|
+
if (existsSync(configPath) && !opts.force) {
|
|
262
|
+
console.error(`Config already exists at ${configPath}. Use --force to overwrite.`);
|
|
263
|
+
process.exit(1);
|
|
264
|
+
}
|
|
265
|
+
// Check if there's an existing index with model info
|
|
266
|
+
const dbPath = getDbPath(cwd);
|
|
267
|
+
const meta = existsSync(dbPath)
|
|
268
|
+
? readProjectMetadata(dbPath)
|
|
269
|
+
: undefined;
|
|
270
|
+
const indexFamily = meta?.model
|
|
271
|
+
? extractModelFamily(meta.model)
|
|
272
|
+
: undefined;
|
|
273
|
+
// Detect Ollama
|
|
274
|
+
const ollama = await detectOllama();
|
|
275
|
+
if (!ollama.running) {
|
|
276
|
+
console.log("Ollama not detected.\n");
|
|
277
|
+
console.log("Install Ollama:");
|
|
278
|
+
console.log(" curl -fsSL https://ollama.com/install.sh | sh\n");
|
|
279
|
+
if (indexFamily) {
|
|
280
|
+
console.log(`This index was built with "${meta.model}" (${meta.dimensions} dims).`);
|
|
281
|
+
console.log(`After installing Ollama, pull a compatible model and run \`lmgrep init\` again.`);
|
|
282
|
+
}
|
|
283
|
+
else {
|
|
284
|
+
console.log("After installing, run `lmgrep init` again to auto-configure.");
|
|
285
|
+
}
|
|
286
|
+
// Still write a template config
|
|
287
|
+
mkdirSync(join(configPath, ".."), { recursive: true });
|
|
288
|
+
writeFileSync(configPath, buildConfigTemplate());
|
|
289
|
+
console.log(`\nWrote ${configPath} (edit model before indexing)`);
|
|
290
|
+
return;
|
|
291
|
+
}
|
|
292
|
+
console.log("Found Ollama.");
|
|
293
|
+
// If we have index metadata, try to find a compatible model
|
|
294
|
+
let selectedModel;
|
|
295
|
+
if (indexFamily && meta?.dimensions) {
|
|
296
|
+
console.log(`Index built with "${meta.model}" (${indexFamily}, ${meta.dimensions} dims)`);
|
|
297
|
+
// Check if a compatible model is already pulled
|
|
298
|
+
const compatible = ollama.models.find((m) => {
|
|
299
|
+
const family = extractModelFamily(`ollama:${m}`);
|
|
300
|
+
return family === indexFamily;
|
|
301
|
+
});
|
|
302
|
+
if (compatible) {
|
|
303
|
+
selectedModel = compatible;
|
|
304
|
+
console.log(`Found compatible model: ${compatible}`);
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
console.log(`\nNo compatible model found locally. You need a model from the "${indexFamily}" family.`);
|
|
308
|
+
console.log("Pull one with:");
|
|
309
|
+
console.log(` ollama pull ${indexFamily}\n`);
|
|
310
|
+
console.log("Then run `lmgrep init` again to auto-configure.");
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
// If no index constraint, pick the first embedding model or suggest one
|
|
314
|
+
if (!selectedModel && !indexFamily) {
|
|
315
|
+
if (ollama.models.length > 0) {
|
|
316
|
+
// Prefer embedding-oriented models
|
|
317
|
+
const embeddingModel = ollama.models.find((m) => m.includes("embed") ||
|
|
318
|
+
m.includes("nomic") ||
|
|
319
|
+
m.includes("bge") ||
|
|
320
|
+
m.includes("minilm"));
|
|
321
|
+
selectedModel = embeddingModel ?? ollama.models[0];
|
|
322
|
+
console.log(`Using model: ${selectedModel}`);
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
console.log("\nNo models found. Pull an embedding model:");
|
|
326
|
+
console.log(" ollama pull nomic-embed-text\n");
|
|
327
|
+
console.log("Then run `lmgrep init` again.");
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
const modelString = selectedModel
|
|
331
|
+
? `ollama:${selectedModel}`
|
|
332
|
+
: undefined;
|
|
333
|
+
mkdirSync(join(configPath, ".."), { recursive: true });
|
|
334
|
+
writeFileSync(configPath, buildConfigTemplate({
|
|
335
|
+
model: modelString,
|
|
336
|
+
baseURL: modelString
|
|
337
|
+
? "http://localhost:11434/v1"
|
|
338
|
+
: undefined,
|
|
339
|
+
}));
|
|
340
|
+
console.log(`Wrote ${configPath}`);
|
|
341
|
+
});
|
|
342
|
+
program
|
|
343
|
+
.command("config")
|
|
344
|
+
.description("Open the global config file in your editor")
|
|
345
|
+
.action(() => {
|
|
346
|
+
const configPath = getGlobalConfigPath();
|
|
347
|
+
if (!existsSync(configPath)) {
|
|
348
|
+
console.error(`No config found at ${configPath}. Run \`lmgrep init\` first.`);
|
|
349
|
+
process.exit(1);
|
|
350
|
+
}
|
|
351
|
+
const editor = process.env.VISUAL ?? process.env.EDITOR ?? "vi";
|
|
352
|
+
console.log(`Opening ${configPath}`);
|
|
353
|
+
try {
|
|
354
|
+
execSync(`${editor} ${configPath}`, { stdio: "inherit" });
|
|
355
|
+
}
|
|
356
|
+
catch {
|
|
357
|
+
console.error(`Could not open editor "${editor}". Set $EDITOR or $VISUAL.`);
|
|
358
|
+
process.exit(1);
|
|
359
|
+
}
|
|
360
|
+
});
|
|
361
|
+
program
|
|
362
|
+
.command("compact")
|
|
363
|
+
.description("Compact the index to reclaim disk space")
|
|
364
|
+
.action(async () => {
|
|
365
|
+
const cwd = process.cwd();
|
|
366
|
+
const store = Store.forProject(cwd);
|
|
367
|
+
await store.compact();
|
|
368
|
+
console.log("Compaction complete.");
|
|
369
|
+
await store.close();
|
|
67
370
|
});
|
|
371
|
+
program
|
|
372
|
+
.command("prune")
|
|
373
|
+
.description("Delete the index database for the current directory")
|
|
374
|
+
.option("--force", "Skip confirmation")
|
|
375
|
+
.action(async (opts) => {
|
|
376
|
+
const cwd = process.cwd();
|
|
377
|
+
const dbPath = getDbPath(cwd);
|
|
378
|
+
if (!existsSync(dbPath)) {
|
|
379
|
+
console.log("No index found for this directory.");
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
if (!opts.force) {
|
|
383
|
+
const readline = await import("node:readline");
|
|
384
|
+
const rl = readline.createInterface({
|
|
385
|
+
input: process.stdin,
|
|
386
|
+
output: process.stdout,
|
|
387
|
+
});
|
|
388
|
+
const answer = await new Promise((resolve) => {
|
|
389
|
+
rl.question(`Delete index at ${dbPath}? [y/N] `, resolve);
|
|
390
|
+
});
|
|
391
|
+
rl.close();
|
|
392
|
+
if (answer.toLowerCase() !== "y") {
|
|
393
|
+
console.log("Cancelled.");
|
|
394
|
+
return;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
rmSync(dbPath, { recursive: true, force: true });
|
|
398
|
+
console.log(`Deleted index at ${dbPath}`);
|
|
399
|
+
});
|
|
400
|
+
program
|
|
401
|
+
.command("import [db-path]")
|
|
402
|
+
.description("Import chunks and file hashes from another lmgrep database. " +
|
|
403
|
+
"If no path is given, tries to find a legacy index for this directory.")
|
|
404
|
+
.option("--reset", "Reset the current index before importing")
|
|
405
|
+
.action(async (dbPath, opts) => {
|
|
406
|
+
const cwd = process.cwd();
|
|
407
|
+
let sourcePath;
|
|
408
|
+
if (dbPath) {
|
|
409
|
+
sourcePath = resolve(cwd, dbPath);
|
|
410
|
+
}
|
|
411
|
+
else {
|
|
412
|
+
const legacy = getLegacyDbPath(cwd);
|
|
413
|
+
if (existsSync(legacy)) {
|
|
414
|
+
sourcePath = legacy;
|
|
415
|
+
console.log(`Found legacy index at ${legacy}`);
|
|
416
|
+
}
|
|
417
|
+
else {
|
|
418
|
+
console.error("No legacy index found. Provide a path: lmgrep import <db-path>");
|
|
419
|
+
process.exit(1);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
if (!existsSync(sourcePath)) {
|
|
423
|
+
console.error(`Database not found: ${sourcePath}`);
|
|
424
|
+
process.exit(1);
|
|
425
|
+
}
|
|
426
|
+
const newDbPath = getDbPath(cwd);
|
|
427
|
+
if (resolve(sourcePath) === resolve(newDbPath)) {
|
|
428
|
+
console.error("Source and destination are the same database.");
|
|
429
|
+
process.exit(1);
|
|
430
|
+
}
|
|
431
|
+
const store = Store.forProject(cwd);
|
|
432
|
+
if (opts.reset) {
|
|
433
|
+
await store.reset();
|
|
434
|
+
}
|
|
435
|
+
const { chunks, files } = await store.importFrom(sourcePath);
|
|
436
|
+
console.log(`Imported ${chunks} chunks and ${files} file hashes from ${sourcePath}`);
|
|
437
|
+
// Show model info from source to guide the user
|
|
438
|
+
const sourceMeta = readProjectMetadata(sourcePath);
|
|
439
|
+
if (sourceMeta?.model) {
|
|
440
|
+
const family = extractModelFamily(sourceMeta.model);
|
|
441
|
+
console.log(`\nThis index was built with "${sourceMeta.model}" (${family}${sourceMeta.dimensions ? `, ${sourceMeta.dimensions} dims` : ""}).`);
|
|
442
|
+
console.log(`Configure a compatible model in .lmgrep.yml, then run \`lmgrep init\` to auto-detect.`);
|
|
443
|
+
}
|
|
444
|
+
await store.close();
|
|
445
|
+
});
|
|
446
|
+
{
|
|
447
|
+
const completionsCmd = program
|
|
448
|
+
.command("completions")
|
|
449
|
+
.description("Output shell completions");
|
|
450
|
+
// Resolve the completions directory relative to this script
|
|
451
|
+
const completionsDir = join(import.meta.dirname, "..", "completions");
|
|
452
|
+
completionsCmd
|
|
453
|
+
.command("zsh")
|
|
454
|
+
.description("Output zsh completions")
|
|
455
|
+
.option("--install", "Install to site-functions and reload completions")
|
|
456
|
+
.action((opts) => {
|
|
457
|
+
const script = readFileSync(join(completionsDir, "_lmgrep"), "utf-8");
|
|
458
|
+
if (opts.install) {
|
|
459
|
+
const siteFunctions = findZshSiteFunctions();
|
|
460
|
+
if (!siteFunctions) {
|
|
461
|
+
console.error("Could not find a writable zsh site-functions directory.\n" +
|
|
462
|
+
"Output manually with: lmgrep completions zsh > /path/to/_lmgrep");
|
|
463
|
+
process.exit(1);
|
|
464
|
+
}
|
|
465
|
+
const target = join(siteFunctions, "_lmgrep");
|
|
466
|
+
mkdirSync(siteFunctions, { recursive: true });
|
|
467
|
+
writeFileSync(target, script);
|
|
468
|
+
console.log(`Installed completions to ${target}`);
|
|
469
|
+
console.log("Restart your shell or run: exec zsh");
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
console.log(script);
|
|
473
|
+
});
|
|
474
|
+
}
|
|
68
475
|
program.parse();
|
|
476
|
+
// --- Zsh helpers ---
|
|
477
|
+
function findZshSiteFunctions() {
|
|
478
|
+
// Prefer user-local paths, fall back to system paths
|
|
479
|
+
const candidates = [
|
|
480
|
+
join(homedir(), ".local", "share", "zsh", "site-functions"),
|
|
481
|
+
"/usr/local/share/zsh/site-functions",
|
|
482
|
+
"/usr/share/zsh/site-functions",
|
|
483
|
+
];
|
|
484
|
+
// Also check $fpath entries that contain "site-functions"
|
|
485
|
+
try {
|
|
486
|
+
const fpath = execSync("zsh -c 'echo $fpath'", {
|
|
487
|
+
stdio: ["ignore", "pipe", "ignore"],
|
|
488
|
+
timeout: 3000,
|
|
489
|
+
})
|
|
490
|
+
.toString()
|
|
491
|
+
.trim();
|
|
492
|
+
for (const p of fpath.split(" ")) {
|
|
493
|
+
if (p.includes("site-functions") && !candidates.includes(p)) {
|
|
494
|
+
candidates.push(p);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
catch { }
|
|
499
|
+
// Return the first candidate that exists or is in a writable parent
|
|
500
|
+
for (const candidate of candidates) {
|
|
501
|
+
try {
|
|
502
|
+
if (existsSync(candidate)) {
|
|
503
|
+
// Check if writable
|
|
504
|
+
writeFileSync(join(candidate, ".lmgrep-test"), "");
|
|
505
|
+
rmSync(join(candidate, ".lmgrep-test"));
|
|
506
|
+
return candidate;
|
|
507
|
+
}
|
|
508
|
+
// Check if parent is writable (we can create the dir)
|
|
509
|
+
const parent = join(candidate, "..");
|
|
510
|
+
if (existsSync(parent)) {
|
|
511
|
+
mkdirSync(candidate, { recursive: true });
|
|
512
|
+
return candidate;
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
catch {
|
|
516
|
+
// not writable, try next
|
|
517
|
+
}
|
|
518
|
+
}
|
|
519
|
+
return undefined;
|
|
520
|
+
}
|
|
521
|
+
// --- Helpers ---
|
|
522
|
+
async function detectOllama() {
|
|
523
|
+
try {
|
|
524
|
+
const res = await fetch("http://localhost:11434/api/tags", {
|
|
525
|
+
signal: AbortSignal.timeout(3000),
|
|
526
|
+
});
|
|
527
|
+
if (!res.ok)
|
|
528
|
+
return { running: true, models: [] };
|
|
529
|
+
const data = (await res.json());
|
|
530
|
+
const models = (data.models ?? []).map((m) => m.name);
|
|
531
|
+
return { running: true, models };
|
|
532
|
+
}
|
|
533
|
+
catch {
|
|
534
|
+
return { running: false, models: [] };
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
function buildConfigTemplate(overrides) {
|
|
538
|
+
const model = overrides?.model;
|
|
539
|
+
const hasModel = !!model;
|
|
540
|
+
const modelLine = hasModel
|
|
541
|
+
? `model: ${model}`
|
|
542
|
+
: `# model: ollama:nomic-embed-text # ← set your model here`;
|
|
543
|
+
const baseURLLine = overrides?.baseURL
|
|
544
|
+
? `baseURL: ${overrides.baseURL}`
|
|
545
|
+
: `# baseURL: http://localhost:11434/v1`;
|
|
546
|
+
return `# lmgrep configuration
|
|
547
|
+
#
|
|
548
|
+
# Quick start with Ollama:
|
|
549
|
+
# 1. Install: curl -fsSL https://ollama.com/install.sh | sh
|
|
550
|
+
# 2. Pull a model: ollama pull nomic-embed-text
|
|
551
|
+
# 3. Run: lmgrep init --force (to auto-detect)
|
|
552
|
+
|
|
553
|
+
# Embedding model in "provider:model" format
|
|
554
|
+
${modelLine}
|
|
555
|
+
|
|
556
|
+
# Base URL for the embedding API
|
|
557
|
+
${baseURLLine}
|
|
558
|
+
|
|
559
|
+
# Batch size for embedding API calls
|
|
560
|
+
batchSize: 100
|
|
561
|
+
|
|
562
|
+
# Optional: override the provider package
|
|
563
|
+
# provider: "@ai-sdk/openai"
|
|
564
|
+
|
|
565
|
+
# Optional: embedding dimensions (if model supports it)
|
|
566
|
+
# dimensions: 384
|
|
567
|
+
|
|
568
|
+
# Optional: max tokens per chunk (estimated at 4 chars/token)
|
|
569
|
+
# maxTokens: 8192
|
|
570
|
+
|
|
571
|
+
# Optional: prefixes for asymmetric embedding models
|
|
572
|
+
# queryPrefix: "search_query: "
|
|
573
|
+
# documentPrefix: "search_document: "
|
|
574
|
+
|
|
575
|
+
# Optional: additional ignore patterns (merged with .gitignore)
|
|
576
|
+
# ignore:
|
|
577
|
+
# - "*.generated.ts"
|
|
578
|
+
# - "fixtures/"
|
|
579
|
+
|
|
580
|
+
# Optional: extra file extensions to index
|
|
581
|
+
# extensions:
|
|
582
|
+
# include: [".sql", ".graphql", ".proto"]
|
|
583
|
+
# exclude: [".json"]
|
|
584
|
+
`;
|
|
585
|
+
}
|
|
586
|
+
function computeChanges(projectRoot, currentFiles, storedFileHashes) {
|
|
587
|
+
const added = [];
|
|
588
|
+
const modified = [];
|
|
589
|
+
const deleted = [];
|
|
590
|
+
const seen = new Set();
|
|
591
|
+
for (const file of currentFiles) {
|
|
592
|
+
seen.add(file);
|
|
593
|
+
try {
|
|
594
|
+
const content = readFileSync(join(projectRoot, file));
|
|
595
|
+
const fileHash = createHash("sha256")
|
|
596
|
+
.update(content)
|
|
597
|
+
.digest("hex")
|
|
598
|
+
.slice(0, 16);
|
|
599
|
+
const stored = storedFileHashes.get(file);
|
|
600
|
+
if (!stored) {
|
|
601
|
+
added.push(file);
|
|
602
|
+
}
|
|
603
|
+
else if (stored !== fileHash) {
|
|
604
|
+
modified.push(file);
|
|
605
|
+
}
|
|
606
|
+
}
|
|
607
|
+
catch { }
|
|
608
|
+
}
|
|
609
|
+
for (const [fp] of storedFileHashes) {
|
|
610
|
+
if (!seen.has(fp))
|
|
611
|
+
deleted.push(fp);
|
|
612
|
+
}
|
|
613
|
+
return { added, modified, deleted };
|
|
614
|
+
}
|
|
69
615
|
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|