edhindex 1.0.0 → 1.0.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.
Files changed (199) hide show
  1. package/README.md +101 -0
  2. package/dist/cli/commands/config_cmd.d.ts +2 -0
  3. package/dist/cli/commands/config_cmd.d.ts.map +1 -0
  4. package/dist/cli/commands/config_cmd.js +53 -0
  5. package/dist/cli/commands/config_cmd.js.map +1 -0
  6. package/dist/cli/commands/doctor_cmd.d.ts +2 -0
  7. package/dist/cli/commands/doctor_cmd.d.ts.map +1 -0
  8. package/dist/cli/commands/doctor_cmd.js +32 -0
  9. package/dist/cli/commands/doctor_cmd.js.map +1 -0
  10. package/dist/cli/commands/graph.d.ts +2 -0
  11. package/dist/cli/commands/graph.d.ts.map +1 -0
  12. package/dist/cli/commands/graph.js +26 -0
  13. package/dist/cli/commands/graph.js.map +1 -0
  14. package/dist/cli/commands/index_cmd.d.ts +2 -0
  15. package/dist/cli/commands/index_cmd.d.ts.map +1 -0
  16. package/dist/cli/commands/index_cmd.js +110 -0
  17. package/dist/cli/commands/index_cmd.js.map +1 -0
  18. package/dist/cli/commands/init.d.ts +2 -0
  19. package/dist/cli/commands/init.d.ts.map +1 -0
  20. package/dist/cli/commands/init.js +53 -0
  21. package/dist/cli/commands/init.js.map +1 -0
  22. package/dist/cli/commands/knowledge-graph.d.ts +8 -0
  23. package/dist/cli/commands/knowledge-graph.d.ts.map +1 -0
  24. package/dist/cli/commands/knowledge-graph.js +76 -0
  25. package/dist/cli/commands/knowledge-graph.js.map +1 -0
  26. package/dist/cli/commands/models.d.ts +2 -0
  27. package/dist/cli/commands/models.d.ts.map +1 -0
  28. package/dist/cli/commands/models.js +17 -0
  29. package/dist/cli/commands/models.js.map +1 -0
  30. package/dist/cli/commands/reset.d.ts +2 -0
  31. package/dist/cli/commands/reset.d.ts.map +1 -0
  32. package/dist/cli/commands/reset.js +35 -0
  33. package/dist/cli/commands/reset.js.map +1 -0
  34. package/dist/cli/commands/search.d.ts +2 -0
  35. package/dist/cli/commands/search.d.ts.map +1 -0
  36. package/dist/cli/commands/search.js +40 -0
  37. package/dist/cli/commands/search.js.map +1 -0
  38. package/dist/cli/commands/start.d.ts +2 -0
  39. package/dist/cli/commands/start.d.ts.map +1 -0
  40. package/dist/cli/commands/start.js +265 -0
  41. package/dist/cli/commands/start.js.map +1 -0
  42. package/dist/cli/commands/status.d.ts +2 -0
  43. package/dist/cli/commands/status.d.ts.map +1 -0
  44. package/dist/cli/commands/status.js +47 -0
  45. package/dist/cli/commands/status.js.map +1 -0
  46. package/dist/cli/index.d.ts +3 -0
  47. package/dist/cli/index.d.ts.map +1 -0
  48. package/dist/cli/index.js +121 -0
  49. package/dist/cli/index.js.map +1 -0
  50. package/dist/config/index.d.ts +28 -0
  51. package/dist/config/index.d.ts.map +1 -0
  52. package/dist/config/index.js +65 -0
  53. package/dist/config/index.js.map +1 -0
  54. package/dist/doctor/index.d.ts +8 -0
  55. package/dist/doctor/index.d.ts.map +1 -0
  56. package/dist/doctor/index.js +117 -0
  57. package/dist/doctor/index.js.map +1 -0
  58. package/dist/embeddings/provider.d.ts +9 -0
  59. package/dist/embeddings/provider.d.ts.map +1 -0
  60. package/dist/embeddings/provider.js +2 -0
  61. package/dist/embeddings/provider.js.map +1 -0
  62. package/dist/embeddings/transformers.d.ts +26 -0
  63. package/dist/embeddings/transformers.d.ts.map +1 -0
  64. package/dist/embeddings/transformers.js +120 -0
  65. package/dist/embeddings/transformers.js.map +1 -0
  66. package/dist/graph/build.d.ts +13 -0
  67. package/dist/graph/build.d.ts.map +1 -0
  68. package/dist/graph/build.js +33 -0
  69. package/dist/graph/build.js.map +1 -0
  70. package/dist/graph/builder.d.ts +24 -0
  71. package/dist/graph/builder.d.ts.map +1 -0
  72. package/dist/graph/builder.js +231 -0
  73. package/dist/graph/builder.js.map +1 -0
  74. package/dist/graph/render.d.ts +3 -0
  75. package/dist/graph/render.d.ts.map +1 -0
  76. package/dist/graph/render.js +60 -0
  77. package/dist/graph/render.js.map +1 -0
  78. package/dist/graph/serve.d.ts +6 -0
  79. package/dist/graph/serve.d.ts.map +1 -0
  80. package/dist/graph/serve.js +389 -0
  81. package/dist/graph/serve.js.map +1 -0
  82. package/dist/graph/service.d.ts +29 -0
  83. package/dist/graph/service.d.ts.map +1 -0
  84. package/dist/graph/service.js +73 -0
  85. package/dist/graph/service.js.map +1 -0
  86. package/dist/graph/storage.d.ts +33 -0
  87. package/dist/graph/storage.d.ts.map +1 -0
  88. package/dist/graph/storage.js +164 -0
  89. package/dist/graph/storage.js.map +1 -0
  90. package/dist/graph/svg.d.ts +27 -0
  91. package/dist/graph/svg.d.ts.map +1 -0
  92. package/dist/graph/svg.js +212 -0
  93. package/dist/graph/svg.js.map +1 -0
  94. package/dist/graph/types.d.ts +34 -0
  95. package/dist/graph/types.d.ts.map +1 -0
  96. package/dist/graph/types.js +9 -0
  97. package/dist/graph/types.js.map +1 -0
  98. package/dist/indexer/chunker.d.ts +18 -0
  99. package/dist/indexer/chunker.d.ts.map +1 -0
  100. package/dist/indexer/chunker.js +139 -0
  101. package/dist/indexer/chunker.js.map +1 -0
  102. package/dist/indexer/file-utils.d.ts +17 -0
  103. package/dist/indexer/file-utils.d.ts.map +1 -0
  104. package/dist/indexer/file-utils.js +123 -0
  105. package/dist/indexer/file-utils.js.map +1 -0
  106. package/dist/indexer/ignore.d.ts +5 -0
  107. package/dist/indexer/ignore.d.ts.map +1 -0
  108. package/dist/indexer/ignore.js +96 -0
  109. package/dist/indexer/ignore.js.map +1 -0
  110. package/dist/indexer/incremental.d.ts +16 -0
  111. package/dist/indexer/incremental.d.ts.map +1 -0
  112. package/dist/indexer/incremental.js +55 -0
  113. package/dist/indexer/incremental.js.map +1 -0
  114. package/dist/indexer/indexer.d.ts +36 -0
  115. package/dist/indexer/indexer.d.ts.map +1 -0
  116. package/dist/indexer/indexer.js +121 -0
  117. package/dist/indexer/indexer.js.map +1 -0
  118. package/dist/indexer/parser.d.ts +30 -0
  119. package/dist/indexer/parser.d.ts.map +1 -0
  120. package/dist/indexer/parser.js +225 -0
  121. package/dist/indexer/parser.js.map +1 -0
  122. package/dist/logging.d.ts +15 -0
  123. package/dist/logging.d.ts.map +1 -0
  124. package/dist/logging.js +42 -0
  125. package/dist/logging.js.map +1 -0
  126. package/dist/mcp/server.d.ts +4 -0
  127. package/dist/mcp/server.d.ts.map +1 -0
  128. package/dist/mcp/server.js +226 -0
  129. package/dist/mcp/server.js.map +1 -0
  130. package/dist/mcp-config.d.ts +4 -0
  131. package/dist/mcp-config.d.ts.map +1 -0
  132. package/dist/mcp-config.js +175 -0
  133. package/dist/mcp-config.js.map +1 -0
  134. package/dist/progress.d.ts +12 -0
  135. package/dist/progress.d.ts.map +1 -0
  136. package/dist/progress.js +16 -0
  137. package/dist/progress.js.map +1 -0
  138. package/dist/retrieval/bm25.d.ts +6 -0
  139. package/dist/retrieval/bm25.d.ts.map +1 -0
  140. package/dist/retrieval/bm25.js +20 -0
  141. package/dist/retrieval/bm25.js.map +1 -0
  142. package/dist/retrieval/reranker.d.ts +11 -0
  143. package/dist/retrieval/reranker.d.ts.map +1 -0
  144. package/dist/retrieval/reranker.js +46 -0
  145. package/dist/retrieval/reranker.js.map +1 -0
  146. package/dist/retrieval/search.d.ts +35 -0
  147. package/dist/retrieval/search.d.ts.map +1 -0
  148. package/dist/retrieval/search.js +95 -0
  149. package/dist/retrieval/search.js.map +1 -0
  150. package/dist/security.d.ts +5 -0
  151. package/dist/security.d.ts.map +1 -0
  152. package/dist/security.js +42 -0
  153. package/dist/security.js.map +1 -0
  154. package/dist/storage/fts.d.ts +30 -0
  155. package/dist/storage/fts.d.ts.map +1 -0
  156. package/dist/storage/fts.js +107 -0
  157. package/dist/storage/fts.js.map +1 -0
  158. package/dist/storage/metadata.d.ts +46 -0
  159. package/dist/storage/metadata.d.ts.map +1 -0
  160. package/dist/storage/metadata.js +133 -0
  161. package/dist/storage/metadata.js.map +1 -0
  162. package/dist/vector/lancedb.d.ts +25 -0
  163. package/dist/vector/lancedb.d.ts.map +1 -0
  164. package/dist/vector/lancedb.js +93 -0
  165. package/dist/vector/lancedb.js.map +1 -0
  166. package/dist/vector/store.d.ts +16 -0
  167. package/dist/vector/store.d.ts.map +1 -0
  168. package/dist/vector/store.js +2 -0
  169. package/dist/vector/store.js.map +1 -0
  170. package/dist/version.d.ts +12 -0
  171. package/dist/version.d.ts.map +1 -0
  172. package/dist/version.js +46 -0
  173. package/dist/version.js.map +1 -0
  174. package/dist/watcher/index.d.ts +15 -0
  175. package/dist/watcher/index.d.ts.map +1 -0
  176. package/dist/watcher/index.js +65 -0
  177. package/dist/watcher/index.js.map +1 -0
  178. package/package.json +9 -3
  179. package/src/cli/commands/graph.ts +30 -0
  180. package/src/cli/commands/init.ts +41 -3
  181. package/src/cli/commands/knowledge-graph.ts +85 -0
  182. package/src/cli/commands/reset.ts +40 -0
  183. package/src/cli/commands/start.ts +54 -21
  184. package/src/cli/index.ts +33 -0
  185. package/src/config/index.ts +13 -0
  186. package/src/graph/build.ts +45 -0
  187. package/src/graph/builder.ts +243 -0
  188. package/src/graph/render.ts +67 -0
  189. package/src/graph/serve.ts +399 -0
  190. package/src/graph/service.ts +84 -0
  191. package/src/graph/storage.ts +181 -0
  192. package/src/graph/svg.ts +241 -0
  193. package/src/graph/types.ts +68 -0
  194. package/src/mcp/server.ts +212 -85
  195. package/src/mcp-config.ts +185 -0
  196. package/src/storage/metadata.ts +9 -1
  197. package/.edhindexignore +0 -66
  198. package/BUILD_BRIEF.md +0 -228
  199. package/tsconfig.json +0 -21
package/README.md ADDED
@@ -0,0 +1,101 @@
1
+ # EDHIndex
2
+
3
+ Local-first hybrid code search engine with Knowledge Graph — zero telemetry, fully offline.
4
+
5
+ ## Setup
6
+
7
+ ```sh
8
+ git clone <repo>
9
+ cd edhIndex
10
+ npm install # installs deps + auto-builds
11
+ npm link # makes "edhindex" available globally
12
+ ```
13
+
14
+ Then use it in any project:
15
+
16
+ ```sh
17
+ cd ~/your-project
18
+ edhindex init
19
+ edhindex start
20
+ ```
21
+
22
+ ## Commands
23
+
24
+ | Command | What it does |
25
+ |---|---|
26
+ | `edhindex init` | Initialize index in current directory |
27
+ | `edhindex start` | Build index + start MCP server |
28
+ | `edhindex index` | Build or update the index |
29
+ | `edhindex search <query>` | Search the codebase |
30
+ | `edhindex status` | Index stats |
31
+ | `edhindex kg --rebuild` | Build knowledge graph |
32
+ | `edhindex kg --stats` | Graph statistics |
33
+ | `edhindex kg --serve` | Interactive graph in browser |
34
+ | `edhindex kg --write` | Write graph file for VS Code |
35
+ | `edhindex graph` | Static SVG dependency graph |
36
+ | `edhindex config` | View/update settings |
37
+ | `edhindex doctor` | Diagnostics |
38
+ | `edhindex reset` | Delete the index |
39
+
40
+ ## Knowledge Graph
41
+
42
+ Explore your codebase as an interactive node graph.
43
+
44
+ ```
45
+ edhindex kg --serve # Opens in browser (localhost)
46
+ edhindex kg --write # Writes .edhindex/knowledge-graph.html
47
+ # → drag into VS Code to view
48
+ ```
49
+
50
+ Every symbol becomes a glowing node. Imports, exports, and hierarchy become edges. Click any node for details. Search by name. Switch between Force, Hierarchy, Circle, Grid layouts.
51
+
52
+ Built on tree-sitter parsing + SQLite + Cytoscape.js — all local, no telemetry, no cloud.
53
+
54
+ ## MCP Tools
55
+
56
+ When `edhindex start` is running, any MCP client (OpenCode, Claude Code, Cline, etc.) can call:
57
+
58
+ | Tool | What it does |
59
+ |---|---|
60
+ | `search_codebase` | Hybrid search (BM25 + vector + rerank) |
61
+ | `get_graph` | Full knowledge graph (nodes + edges) |
62
+ | `get_node` | Node details with neighbors |
63
+ | `search_graph` | Search nodes by name |
64
+ | `get_graph_stats` | Graph statistics |
65
+
66
+ ## MCP Client Setup
67
+
68
+ During `edhindex init`, pick your MCP client and the config file is created automatically:
69
+
70
+ - **OpenCode** → `opencode.json`
71
+ - **Cline** → `.cline/mcp.json`
72
+ - **Roo Code** → `.roo/mcp.json`
73
+ - **Claude Code** → `claude.jsonc`
74
+ - **Cursor** → `.cursor/mcp.json`
75
+ - **Windsurf** → `.windsurf/mcp_config.json`
76
+ - **GitHub Copilot** → `.vscode/settings.json`
77
+ - **Continue** → `.continue/config.json`
78
+
79
+ ## How it works
80
+
81
+ ```
82
+ Source code → Tree-sitter → Chunks → SQLite (metadata + FTS5)
83
+ → LanceDB (vectors)
84
+ → Graph (SQLite)
85
+
86
+ MCP Server ← Search Engine ← Hybrid Rerank
87
+ ```
88
+
89
+ - **Keyword search**: SQLite FTS5 (BM25)
90
+ - **Semantic search**: transformers.js embeddings → LanceDB vector search
91
+ - **Hybrid**: Top 30 BM25 + top 30 vectors → deduplicate → rerank → top 10
92
+ - **Knowledge Graph**: Symbols, files, folders, imports/exports, hierarchy
93
+
94
+ ## Requirements
95
+
96
+ - Node.js 18+
97
+ - npm
98
+
99
+ ## License
100
+
101
+ MIT
@@ -0,0 +1,2 @@
1
+ export declare function configCommand(rootPath: string, changes: Record<string, string>): void;
2
+ //# sourceMappingURL=config_cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/config_cmd.ts"],"names":[],"mappings":"AAKA,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAoD9E"}
@@ -0,0 +1,53 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { loadConfig, saveConfig } from '../../config/index.js';
4
+ import chalk from 'chalk';
5
+ export function configCommand(rootPath, changes) {
6
+ const indexDir = join(rootPath, '.edhindex');
7
+ if (!existsSync(indexDir)) {
8
+ console.log(chalk.yellow('No .edhindex directory found. Run "edhindex init" first.'));
9
+ return;
10
+ }
11
+ const config = loadConfig(indexDir);
12
+ if (Object.keys(changes).length === 0) {
13
+ console.log(chalk.bold('Current configuration:'));
14
+ console.log(JSON.stringify(config, null, 2));
15
+ return;
16
+ }
17
+ for (const [key, value] of Object.entries(changes)) {
18
+ switch (key) {
19
+ case 'model':
20
+ if (!['light', 'balanced', 'max'].includes(value)) {
21
+ console.log(chalk.red(`Invalid model: ${value}. Must be light, balanced, or max.`));
22
+ return;
23
+ }
24
+ config.model = value;
25
+ break;
26
+ case 'languages':
27
+ config.languages = value.split(',').map(s => s.trim());
28
+ break;
29
+ case 'watch':
30
+ config.watch = value === 'true';
31
+ break;
32
+ case 'rerank':
33
+ config.rerank = value === 'true';
34
+ break;
35
+ case 'maxResults':
36
+ config.maxResults = parseInt(value, 10) || 10;
37
+ break;
38
+ case 'logLevel':
39
+ if (!['silent', 'info', 'verbose', 'debug'].includes(value)) {
40
+ console.log(chalk.red(`Invalid logLevel: ${value}`));
41
+ return;
42
+ }
43
+ config.logLevel = value;
44
+ break;
45
+ default:
46
+ console.log(chalk.yellow(`Unknown config key: ${key}`));
47
+ }
48
+ }
49
+ saveConfig(indexDir, config);
50
+ console.log(chalk.green('Configuration updated.'));
51
+ console.log(JSON.stringify(config, null, 2));
52
+ }
53
+ //# sourceMappingURL=config_cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config_cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/config_cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function doctorCommand(rootPath: string, indexDir: string): Promise<void>;
2
+ //# sourceMappingURL=doctor_cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor_cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/doctor_cmd.ts"],"names":[],"mappings":"AAGA,wBAAsB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,iBA2BrE"}
@@ -0,0 +1,32 @@
1
+ import { runDoctor } from '../../doctor/index.js';
2
+ import chalk from 'chalk';
3
+ export async function doctorCommand(rootPath, indexDir) {
4
+ console.log(chalk.bold('EDHIndex Diagnostics\n'));
5
+ const results = await runDoctor(rootPath, indexDir);
6
+ let okCount = 0;
7
+ let warnCount = 0;
8
+ let errorCount = 0;
9
+ for (const r of results) {
10
+ const icon = r.status === 'ok' ? chalk.green('✓') : r.status === 'warn' ? chalk.yellow('⚠') : chalk.red('✗');
11
+ console.log(` ${icon} ${chalk.bold(r.category)}: ${r.message}`);
12
+ if (r.detail)
13
+ console.log(` ${chalk.dim(r.detail)}`);
14
+ if (r.status === 'ok')
15
+ okCount++;
16
+ else if (r.status === 'warn')
17
+ warnCount++;
18
+ else
19
+ errorCount++;
20
+ }
21
+ console.log('');
22
+ if (errorCount > 0) {
23
+ console.log(chalk.red(` ${errorCount} error(s), ${warnCount} warning(s), ${okCount} ok`));
24
+ }
25
+ else if (warnCount > 0) {
26
+ console.log(chalk.yellow(` ${warnCount} warning(s), ${okCount} ok`));
27
+ }
28
+ else {
29
+ console.log(chalk.green(` All ${okCount} checks passed.`));
30
+ }
31
+ }
32
+ //# sourceMappingURL=doctor_cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor_cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/doctor_cmd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAgB,MAAM,uBAAuB,CAAC;AAChE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,QAAgB,EAAE,QAAgB;IACpE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC,CAAC;IAElD,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEpD,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,UAAU,GAAG,CAAC,CAAC;IAEnB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7G,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACjE,IAAI,CAAC,CAAC,MAAM;YAAE,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAE3D,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI;YAAE,OAAO,EAAE,CAAC;aAC5B,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;YAAE,SAAS,EAAE,CAAC;;YACrC,UAAU,EAAE,CAAC;IACpB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,IAAI,UAAU,GAAG,CAAC,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,UAAU,cAAc,SAAS,gBAAgB,OAAO,KAAK,CAAC,CAAC,CAAC;IAC7F,CAAC;SAAM,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,SAAS,gBAAgB,OAAO,KAAK,CAAC,CAAC,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,OAAO,iBAAiB,CAAC,CAAC,CAAC;IAC9D,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function graphCommand(rootPath: string, outputPath?: string): Promise<void>;
2
+ //# sourceMappingURL=graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/graph.ts"],"names":[],"mappings":"AAOA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,iBAsBvE"}
@@ -0,0 +1,26 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, writeFileSync } from 'node:fs';
3
+ import { MetadataStore } from '../../storage/metadata.js';
4
+ import { buildGraphData } from '../../graph/build.js';
5
+ import { generateSVG } from '../../graph/svg.js';
6
+ import chalk from 'chalk';
7
+ export async function graphCommand(rootPath, outputPath) {
8
+ const indexDir = join(rootPath, '.edhindex');
9
+ if (!existsSync(indexDir)) {
10
+ console.log(chalk.yellow('No EDHIndex index found. Run "edhindex start" first.'));
11
+ return;
12
+ }
13
+ const store = new MetadataStore(indexDir);
14
+ const { nodes, edges, fileCount, edgeCount } = buildGraphData(store);
15
+ store.close();
16
+ if (fileCount === 0) {
17
+ console.log(chalk.yellow('No indexed files found.'));
18
+ return;
19
+ }
20
+ const svg = generateSVG(rootPath, nodes, edges);
21
+ const outFile = outputPath || join(rootPath, 'edhindex-graph.svg');
22
+ writeFileSync(outFile, svg, 'utf-8');
23
+ console.log(chalk.green(`Graph generated: ${outFile}`));
24
+ console.log(chalk.dim(`${fileCount} files, ${edgeCount} dependencies`));
25
+ }
26
+ //# sourceMappingURL=graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph.js","sourceRoot":"","sources":["../../../src/cli/commands/graph.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACpD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB,EAAE,UAAmB;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAClF,OAAO;IACT,CAAC;IAED,MAAM,KAAK,GAAG,IAAI,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC1C,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACrE,KAAK,CAAC,KAAK,EAAE,CAAC;IAEd,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,yBAAyB,CAAC,CAAC,CAAC;QACrD,OAAO;IACT,CAAC;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,UAAU,IAAI,IAAI,CAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACnE,aAAa,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAC;IAErC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC,CAAC;IACxD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,SAAS,WAAW,SAAS,eAAe,CAAC,CAAC,CAAC;AAC1E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function indexCommand(rootPath: string): Promise<void>;
2
+ //# sourceMappingURL=index_cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index_cmd.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/index_cmd.ts"],"names":[],"mappings":"AAcA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,iBA0GlD"}
@@ -0,0 +1,110 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, mkdirSync } from 'node:fs';
3
+ import { loadConfig, MODEL_CONFIGS } from '../../config/index.js';
4
+ import { setLogLevel, LogLevel } from '../../logging.js';
5
+ import { onProgress } from '../../progress.js';
6
+ import { loadVersion, saveVersion, getExpectedVersion, needsRebuild } from '../../version.js';
7
+ import { MetadataStore } from '../../storage/metadata.js';
8
+ import { FTSStore } from '../../storage/fts.js';
9
+ import { TransformersEmbeddingProvider } from '../../embeddings/transformers.js';
10
+ import { LanceDBStore } from '../../vector/lancedb.js';
11
+ import { Indexer } from '../../indexer/indexer.js';
12
+ import cliProgress from 'cli-progress';
13
+ import chalk from 'chalk';
14
+ export async function indexCommand(rootPath) {
15
+ const indexDir = join(rootPath, '.edhindex');
16
+ if (!existsSync(indexDir)) {
17
+ mkdirSync(indexDir, { recursive: true });
18
+ }
19
+ const config = loadConfig(indexDir);
20
+ const modelCfg = MODEL_CONFIGS[config.model];
21
+ setLogLevel(LogLevel.Info);
22
+ // Check version
23
+ const version = loadVersion(indexDir);
24
+ const fullRebuild = needsRebuild(version, config.model);
25
+ if (fullRebuild && version) {
26
+ console.log(chalk.yellow('Index version mismatch — full rebuild.'));
27
+ }
28
+ const metadataStore = new MetadataStore(indexDir);
29
+ const ftsStore = new FTSStore(indexDir);
30
+ const vectorStore = new LanceDBStore(indexDir, modelCfg.dimensions);
31
+ await vectorStore.init();
32
+ const embedder = new TransformersEmbeddingProvider(config.model);
33
+ console.log(chalk.dim('Loading embedding model...'));
34
+ await embedder.load();
35
+ const indexer = new Indexer({
36
+ config,
37
+ rootPath,
38
+ indexDir,
39
+ onIndex: async (result) => {
40
+ for (const chunk of result.chunks) {
41
+ metadataStore.upsertChunk({
42
+ id: chunk.id, file: chunk.file, language: chunk.language,
43
+ symbol: chunk.symbol, kind: chunk.kind, parent: chunk.parent,
44
+ hash: chunk.hash, git_commit: null,
45
+ start_line: chunk.startLine, end_line: chunk.endLine,
46
+ imports: chunk.imports.join('\n'), exports: chunk.exports.join('\n'),
47
+ embedding_model: embedder.name(), last_indexed: new Date().toISOString(),
48
+ checksum: chunk.hash,
49
+ });
50
+ ftsStore.insertChunk(chunk.id, chunk.content, chunk.file, chunk.symbol, chunk.language);
51
+ }
52
+ if (result.chunks.length > 0) {
53
+ const texts = result.chunks.map(c => c.content);
54
+ const embeddings = await embedder.embed(texts);
55
+ await vectorStore.insert(result.chunks.map((c, i) => ({
56
+ id: c.id, values: embeddings[i],
57
+ metadata: { file: c.file, symbol: c.symbol, kind: c.kind, text: c.content, language: c.language },
58
+ })));
59
+ }
60
+ metadataStore.upsertFileHash(result.relativePath, result.hash);
61
+ },
62
+ onDelete: async (chunkIds) => {
63
+ for (const id of chunkIds)
64
+ ftsStore.deleteChunk(id);
65
+ await vectorStore.delete(chunkIds);
66
+ },
67
+ });
68
+ await indexer.initialize();
69
+ const progressBar = new cliProgress.SingleBar({
70
+ format: '{phase} | {bar} | {percentage}% | {value}/{total}',
71
+ barCompleteChar: '\u2588',
72
+ barIncompleteChar: '\u2591',
73
+ hideCursor: true,
74
+ });
75
+ progressBar.start(100, 0, { phase: 'Scanning' });
76
+ const unsub = onProgress((e) => {
77
+ if (e.phase === 'scanning' && e.total) {
78
+ progressBar.setTotal(e.total);
79
+ progressBar.update(e.current || 0);
80
+ }
81
+ else if (e.phase === 'embedding' && e.percent !== undefined) {
82
+ progressBar.setTotal(100);
83
+ progressBar.update(e.percent);
84
+ }
85
+ });
86
+ const existingHashes = metadataStore.getAllFileHashes();
87
+ const doFull = fullRebuild || existingHashes.size === 0;
88
+ if (doFull) {
89
+ await indexer.runFullIndex();
90
+ const newVersion = getExpectedVersion(config.model);
91
+ saveVersion(indexDir, newVersion);
92
+ }
93
+ else {
94
+ const existingChunkHashes = metadataStore.getAllChunkHashes();
95
+ await indexer.runIncremental(existingHashes, existingChunkHashes);
96
+ const ver = version;
97
+ ver.lastIndexed = new Date().toISOString();
98
+ saveVersion(indexDir, ver);
99
+ }
100
+ progressBar.stop();
101
+ unsub();
102
+ const finalChunkCount = metadataStore.getChunkCount();
103
+ const finalFileCount = metadataStore.getFileCount();
104
+ console.log(chalk.green(`Index complete. ${finalChunkCount} chunks across ${finalFileCount} files.`));
105
+ console.log(chalk.dim(`Run "edhindex start" to serve the MCP server.`));
106
+ metadataStore.close();
107
+ ftsStore.close();
108
+ await vectorStore.close();
109
+ }
110
+ //# sourceMappingURL=index_cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index_cmd.js","sourceRoot":"","sources":["../../../src/cli/commands/index_cmd.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function initCommand(rootPath: string): Promise<void>;
2
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"AAuCA,wBAAsB,WAAW,CAAC,QAAQ,EAAE,MAAM,iBAuBjD"}
@@ -0,0 +1,53 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, mkdirSync } from 'node:fs';
3
+ import { loadConfig, saveConfig, defaultConfig, MODEL_CONFIGS } from '../../config/index.js';
4
+ import { promptAndWriteMCPConfigs } from '../../mcp-config.js';
5
+ import { createInterface } from 'node:readline';
6
+ import chalk from 'chalk';
7
+ function isInteractive() {
8
+ return process.stdin.isTTY && process.stdout.isTTY;
9
+ }
10
+ function askModel() {
11
+ return new Promise((resolve) => {
12
+ if (!isInteractive()) {
13
+ resolve('balanced');
14
+ return;
15
+ }
16
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
17
+ const tiers = ['light', 'balanced', 'max'];
18
+ const lines = tiers.map((t, i) => {
19
+ const c = MODEL_CONFIGS[t];
20
+ return ` ${i + 1}. ${c.displayName} (${c.dimensions}d, ${c.size})`;
21
+ });
22
+ rl.question(`\n${chalk.bold('Embedding Model')}\nWhich embedding model do you want to use?\n${lines.join('\n')}\n\nChoose (1-3) [2]: `, (answer) => {
23
+ rl.close();
24
+ const idx = parseInt(answer.trim(), 10);
25
+ if (idx >= 1 && idx <= 3) {
26
+ resolve(tiers[idx - 1]);
27
+ }
28
+ else {
29
+ resolve('balanced');
30
+ }
31
+ });
32
+ });
33
+ }
34
+ export async function initCommand(rootPath) {
35
+ const indexDir = join(rootPath, '.edhindex');
36
+ if (existsSync(indexDir)) {
37
+ console.log(chalk.yellow('EDHIndex is already initialized in this directory.'));
38
+ const config = loadConfig(indexDir);
39
+ console.log(`Current config: model=${config.model}, languages=[${config.languages.join(', ')}]`);
40
+ return;
41
+ }
42
+ mkdirSync(indexDir, { recursive: true });
43
+ const config = defaultConfig();
44
+ config.model = await askModel();
45
+ saveConfig(indexDir, config);
46
+ console.log(chalk.green('EDHIndex initialized.'));
47
+ const mc = MODEL_CONFIGS[config.model];
48
+ console.log(`Model: ${mc.displayName} (${mc.dimensions}d, ${mc.size})`);
49
+ console.log(`Languages: ${config.languages.join(', ')}`);
50
+ await promptAndWriteMCPConfigs(rootPath);
51
+ console.log(chalk.dim('Run "edhindex start" to build the index and start the MCP server.'));
52
+ }
53
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/cli/commands/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function kgCommand(rootPath: string, flags: {
2
+ rebuild?: boolean;
3
+ stats?: boolean;
4
+ serve?: boolean;
5
+ write?: boolean;
6
+ port?: string;
7
+ }): Promise<void>;
8
+ //# sourceMappingURL=knowledge-graph.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/knowledge-graph.ts"],"names":[],"mappings":"AAOA,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,iBA6E/I"}
@@ -0,0 +1,76 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync } from 'node:fs';
3
+ import { GraphService } from '../../graph/service.js';
4
+ import { startGraphServer, writeViewerFile } from '../../graph/serve.js';
5
+ import chalk from 'chalk';
6
+ import { spawn } from 'node:child_process';
7
+ export async function kgCommand(rootPath, flags) {
8
+ const indexDir = join(rootPath, '.edhindex');
9
+ if (!existsSync(indexDir)) {
10
+ console.log(chalk.yellow('No index found. Run "edhindex start" first.'));
11
+ return;
12
+ }
13
+ if (flags.write) {
14
+ console.log(chalk.dim('Writing graph viewer...'));
15
+ const outFile = join(rootPath, '.edhindex', 'knowledge-graph.html');
16
+ writeViewerFile(rootPath, outFile);
17
+ console.log(chalk.green(`\n Viewer written: ${outFile}`));
18
+ console.log(chalk.dim('\n Open in VS Code:'));
19
+ console.log(chalk.dim(' 1. File > Open File... > select the file'));
20
+ console.log(chalk.dim(' 2. Or drag into VS Code and click "Preview"'));
21
+ console.log(chalk.dim(' 3. Or right-click → "Open with Live Server"'));
22
+ console.log(chalk.dim('\n Or open in browser:'));
23
+ console.log(chalk.dim(` file://${outFile}`));
24
+ return;
25
+ }
26
+ if (flags.serve) {
27
+ const port = flags.port ? parseInt(flags.port, 10) : 0;
28
+ console.log(chalk.dim('Starting graph server...'));
29
+ const { port: actualPort, close } = await startGraphServer(rootPath, port);
30
+ const url = `http://127.0.0.1:${actualPort}`;
31
+ console.log(chalk.green(`\n Knowledge Graph: ${url}`));
32
+ console.log(chalk.dim('\n Press Ctrl+C to stop.\n'));
33
+ // Try to open browser
34
+ const cmd = process.platform === 'darwin' ? 'open' : process.platform === 'win32' ? 'start' : 'xdg-open';
35
+ try {
36
+ const child = spawn(cmd, [url], { detached: true, stdio: 'ignore' });
37
+ child.unref();
38
+ }
39
+ catch { /* browser open not critical */ }
40
+ // Keep alive
41
+ process.on('SIGINT', () => { close(); process.exit(0); });
42
+ process.on('SIGTERM', () => { close(); process.exit(0); });
43
+ await new Promise(() => { }); // hang
44
+ return;
45
+ }
46
+ try {
47
+ const svc = new GraphService(rootPath);
48
+ if (flags.rebuild) {
49
+ console.log(chalk.dim('Building knowledge graph...'));
50
+ svc.build();
51
+ }
52
+ const stats = svc.getStats();
53
+ svc.close();
54
+ console.log(chalk.bold('\nKnowledge Graph'));
55
+ console.log(chalk.dim('─'.repeat(40)));
56
+ console.log(` Nodes: ${chalk.cyan(stats.nodeCount)}`);
57
+ console.log(` Edges: ${chalk.cyan(stats.edgeCount)}`);
58
+ if (Object.keys(stats.typeCounts).length > 0) {
59
+ console.log(chalk.dim('\n By type:'));
60
+ for (const [type, count] of Object.entries(stats.typeCounts).sort((a, b) => b[1] - a[1])) {
61
+ console.log(` ${type.padEnd(14)} ${count}`);
62
+ }
63
+ }
64
+ console.log(chalk.dim('\n Commands:'));
65
+ console.log(chalk.dim(' edhindex kg serve — Interactive graph in browser'));
66
+ console.log(chalk.dim(' edhindex graph — Static SVG graph'));
67
+ console.log(chalk.dim('\n MCP tools:'));
68
+ console.log(chalk.dim(' get_graph — Full graph data'));
69
+ console.log(chalk.dim(' get_node — Node details + neighbors'));
70
+ console.log(chalk.dim(' search_graph — Search nodes by name'));
71
+ }
72
+ catch (e) {
73
+ console.error(chalk.red('Failed:'), e instanceof Error ? e.message : e);
74
+ }
75
+ }
76
+ //# sourceMappingURL=knowledge-graph.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knowledge-graph.js","sourceRoot":"","sources":["../../../src/cli/commands/knowledge-graph.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function modelsCommand(): void;
2
+ //# sourceMappingURL=models.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/models.ts"],"names":[],"mappings":"AAGA,wBAAgB,aAAa,SAe5B"}
@@ -0,0 +1,17 @@
1
+ import { MODEL_CONFIGS } from '../../config/index.js';
2
+ import chalk from 'chalk';
3
+ export function modelsCommand() {
4
+ console.log(chalk.bold('Available embedding models:\n'));
5
+ for (const [tier, cfg] of Object.entries(MODEL_CONFIGS)) {
6
+ const tag = tier === 'balanced' ? ' (default)' : '';
7
+ console.log(` ${chalk.cyan(tier)}${chalk.dim(tag)}`);
8
+ console.log(` Model: ${cfg.displayName}`);
9
+ console.log(` Size: ${cfg.size}`);
10
+ console.log(` Dims: ${cfg.dimensions}`);
11
+ console.log(` HF ID: ${cfg.modelId}`);
12
+ console.log('');
13
+ }
14
+ console.log(chalk.dim('Switch models with: edhindex config model <tier>'));
15
+ console.log(chalk.dim('Note: Changing models requires a full re-index.'));
16
+ }
17
+ //# sourceMappingURL=models.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"models.js","sourceRoot":"","sources":["../../../src/cli/commands/models.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,UAAU,aAAa;IAC3B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC,CAAC;IAEzD,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;QACxD,MAAM,GAAG,GAAG,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;QACpD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACtD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;QAChD,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,kDAAkD,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,CAAC,CAAC;AAC5E,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function resetCommand(rootPath: string): Promise<void>;
2
+ //# sourceMappingURL=reset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":"AAuBA,wBAAsB,YAAY,CAAC,QAAQ,EAAE,MAAM,iBAgBlD"}
@@ -0,0 +1,35 @@
1
+ import { join } from 'node:path';
2
+ import { existsSync, rmSync } from 'node:fs';
3
+ import { createInterface } from 'node:readline';
4
+ import chalk from 'chalk';
5
+ function isInteractive() {
6
+ return process.stdin.isTTY && process.stdout.isTTY;
7
+ }
8
+ function confirm(message) {
9
+ return new Promise((resolve) => {
10
+ if (!isInteractive()) {
11
+ resolve(false);
12
+ return;
13
+ }
14
+ const rl = createInterface({ input: process.stdin, output: process.stdout });
15
+ rl.question(`${message} (y/N) `, (answer) => {
16
+ rl.close();
17
+ resolve(answer.trim().toLowerCase() === 'y');
18
+ });
19
+ });
20
+ }
21
+ export async function resetCommand(rootPath) {
22
+ const indexDir = join(rootPath, '.edhindex');
23
+ if (!existsSync(indexDir)) {
24
+ console.log(chalk.yellow('No EDHIndex index found in this directory.'));
25
+ return;
26
+ }
27
+ const ok = await confirm(chalk.red('Delete the entire EDHIndex index (config + vectors + metadata)?'));
28
+ if (!ok) {
29
+ console.log(chalk.dim('Cancelled.'));
30
+ return;
31
+ }
32
+ rmSync(indexDir, { recursive: true, force: true });
33
+ console.log(chalk.green(`Deleted: ${indexDir}`));
34
+ }
35
+ //# sourceMappingURL=reset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reset.js","sourceRoot":"","sources":["../../../src/cli/commands/reset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,SAAS,aAAa;IACpB,OAAO,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;AACrD,CAAC;AAED,SAAS,OAAO,CAAC,OAAe;IAC9B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QACD,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QAC7E,EAAE,CAAC,QAAQ,CAAC,GAAG,OAAO,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;YAC1C,EAAE,CAAC,KAAK,EAAE,CAAC;YACX,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAgB;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAE7C,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC1B,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,4CAA4C,CAAC,CAAC,CAAC;QACxE,OAAO;IACT,CAAC;IAED,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,iEAAiE,CAAC,CAAC,CAAC;IACvG,IAAI,CAAC,EAAE,EAAE,CAAC;QACR,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC;QACrC,OAAO;IACT,CAAC;IAED,MAAM,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,QAAQ,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC"}