lmgrep 0.1.0 → 0.1.2

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 (79) hide show
  1. package/dist/cli.js +559 -13
  2. package/dist/cli.js.map +1 -1
  3. package/dist/index.d.ts +32 -0
  4. package/dist/index.js +180 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/build.d.ts +7 -0
  7. package/dist/lib/build.js +222 -0
  8. package/dist/lib/build.js.map +1 -0
  9. package/dist/{chunker → lib/chunker}/context.d.ts +0 -4
  10. package/dist/{chunker → lib/chunker}/context.js +3 -76
  11. package/dist/lib/chunker/context.js.map +1 -0
  12. package/dist/lib/chunker/index.d.ts +7 -0
  13. package/dist/{chunker → lib/chunker}/index.js +10 -5
  14. package/dist/lib/chunker/index.js.map +1 -0
  15. package/dist/lib/chunker/languages.js.map +1 -0
  16. package/dist/lib/config.d.ts +12 -0
  17. package/dist/lib/config.js +82 -0
  18. package/dist/lib/config.js.map +1 -0
  19. package/dist/lib/embedder.d.ts +55 -0
  20. package/dist/lib/embedder.js +221 -0
  21. package/dist/lib/embedder.js.map +1 -0
  22. package/dist/{providers.js → lib/providers.js} +0 -2
  23. package/dist/lib/providers.js.map +1 -0
  24. package/dist/lib/repair.d.ts +3 -0
  25. package/dist/lib/repair.js +104 -0
  26. package/dist/lib/repair.js.map +1 -0
  27. package/dist/lib/scanner.d.ts +34 -0
  28. package/dist/lib/scanner.js +219 -0
  29. package/dist/lib/scanner.js.map +1 -0
  30. package/dist/lib/serve.d.ts +11 -0
  31. package/dist/lib/serve.js +124 -0
  32. package/dist/lib/serve.js.map +1 -0
  33. package/dist/lib/store.d.ts +147 -0
  34. package/dist/lib/store.js +673 -0
  35. package/dist/lib/store.js.map +1 -0
  36. package/dist/lib/types.d.ts +118 -0
  37. package/dist/lib/types.js +13 -0
  38. package/dist/lib/types.js.map +1 -0
  39. package/dist/mcp.js +160 -45
  40. package/dist/mcp.js.map +1 -1
  41. package/package.json +1 -1
  42. package/dist/chunker/context.js.map +0 -1
  43. package/dist/chunker/index.d.ts +0 -3
  44. package/dist/chunker/index.js.map +0 -1
  45. package/dist/chunker/languages.js.map +0 -1
  46. package/dist/config.d.ts +0 -2
  47. package/dist/config.js +0 -31
  48. package/dist/config.js.map +0 -1
  49. package/dist/embedder.d.ts +0 -3
  50. package/dist/embedder.js +0 -55
  51. package/dist/embedder.js.map +0 -1
  52. package/dist/index-cmd.d.ts +0 -9
  53. package/dist/index-cmd.js +0 -250
  54. package/dist/index-cmd.js.map +0 -1
  55. package/dist/providers.js.map +0 -1
  56. package/dist/repair-cmd.d.ts +0 -5
  57. package/dist/repair-cmd.js +0 -112
  58. package/dist/repair-cmd.js.map +0 -1
  59. package/dist/search-cmd.d.ts +0 -10
  60. package/dist/search-cmd.js +0 -60
  61. package/dist/search-cmd.js.map +0 -1
  62. package/dist/serve-cmd.d.ts +0 -1
  63. package/dist/serve-cmd.js +0 -139
  64. package/dist/serve-cmd.js.map +0 -1
  65. package/dist/status-cmd.d.ts +0 -5
  66. package/dist/status-cmd.js +0 -119
  67. package/dist/status-cmd.js.map +0 -1
  68. package/dist/store.d.ts +0 -25
  69. package/dist/store.js +0 -207
  70. package/dist/store.js.map +0 -1
  71. package/dist/types.d.ts +0 -40
  72. package/dist/types.js +0 -2
  73. package/dist/types.js.map +0 -1
  74. package/dist/walker.d.ts +0 -3
  75. package/dist/walker.js +0 -90
  76. package/dist/walker.js.map +0 -1
  77. /package/dist/{chunker → lib/chunker}/languages.d.ts +0 -0
  78. /package/dist/{chunker → lib/chunker}/languages.js +0 -0
  79. /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 { indexCommand } from "./index-cmd.js";
4
- import { repairCommand } from "./repair-cmd.js";
5
- import { searchCommand } from "./search-cmd.js";
6
- import { serveCommand } from "./serve-cmd.js";
7
- import { statusCommand } from "./status-cmd.js";
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
- await indexCommand(cwd, opts);
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 searchCommand(query, cwd, {
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 statusCommand(cwd, opts);
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 repairCommand(cwd, opts);
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 serveCommand(cwd);
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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"}