edhindex 1.0.0 → 1.0.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 (199) hide show
  1. package/README.md +228 -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 +35 -4
  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,228 @@
1
+ # EDHIndex
2
+
3
+ [![npm version](https://img.shields.io/npm/v/edhindex.svg)](https://www.npmjs.com/package/edhindex)
4
+
5
+ Local-first hybrid code search engine with Knowledge Graph — zero telemetry, fully offline.
6
+
7
+ ```sh
8
+ npm install -g edhindex
9
+ # or
10
+ npx edhindex <command>
11
+ ```
12
+
13
+ ## Quick start
14
+
15
+ ```sh
16
+ cd ~/your-project
17
+ edhinit index # initialize index (pick your model + MCP client)
18
+ edhindex start # build index + start MCP server + watch for changes
19
+ ```
20
+
21
+ Then ask any MCP client (OpenCode, Claude Code, Cline, Cursor, etc.) to search your codebase.
22
+
23
+ ---
24
+
25
+ ## Supported file types
26
+
27
+ | Language | Extensions | Symbols indexed |
28
+ |----------|-----------|----------------|
29
+ | TypeScript | `.ts`, `.tsx`, `.mts`, `.cts` | functions, methods, classes, interfaces, enums |
30
+ | JavaScript | `.js`, `.jsx`, `.mjs`, `.cjs` | functions, methods, classes |
31
+ | Python | `.py`, `.pyw` | functions, classes |
32
+ | Go | `.go` | functions, methods |
33
+
34
+ All files are parsed with tree-sitter for accurate symbol extraction, imports, and exports. Unsupported file extensions are silently skipped. Files larger than 10 MB are also skipped.
35
+
36
+ ## What gets ignored
37
+
38
+ EDHIndex uses three layers of filtering. **Every file must pass all three** to be indexed.
39
+
40
+ ### Layer 1: Default ignore patterns
41
+
42
+ Directories and files ignored by default (no need for a `.edhindexignore`):
43
+
44
+ ```
45
+ Directories: node_modules, .git, dist, build, coverage, .next,
46
+ out, vendor, bin, obj, target, tmp, .cache, .turbo,
47
+ .edhindex
48
+
49
+ Binaries: *.exe, *.dll, *.so, *.dylib, *.bin, *.wasm
50
+ *.o, *.a, *.lib
51
+
52
+ Images/Media: *.png, *.jpg, *.jpeg, *.gif, *.svg, *.ico, *.webp,
53
+ *.bmp, *.tiff
54
+
55
+ Docs/Archives: *.pdf, *.doc, *.docx, *.xls, *.xlsx, *.ppt, *.pptx
56
+ *.zip, *.tar, *.gz, *.bz2, *.7z, *.rar
57
+
58
+ Audio/Video: *.mp3, *.wav, *.flac, *.ogg
59
+ *.mp4, *.avi, *.mov, *.wmv, *.flv, *.mkv
60
+
61
+ Generated/Minified: *.min.js, *.min.css
62
+ package-lock.json, yarn.lock, pnpm-lock.yaml
63
+
64
+ Language artifacts: *.pyc, *.class, *.jar, *.war
65
+ ```
66
+
67
+ ### Layer 2: `.edhindexignore`
68
+
69
+ Add a `.edhindexignore` file at your project root with additional glob patterns. Supports `#` comments and `!` negation (to re-include a pattern).
70
+
71
+ Example:
72
+ ```
73
+ # ignore generated code
74
+ src/generated/
75
+ *.generated.ts
76
+ ```
77
+
78
+ ### Layer 3: Binary + size gate
79
+
80
+ Files are checked against a blocklist of binary/media/archive extensions and must be under 10 MB.
81
+
82
+ ---
83
+
84
+ ## Indexing modes
85
+
86
+ EDHIndex has **three indexing strategies** that work together:
87
+
88
+ ### 1. Full index
89
+
90
+ Scans **every file** from scratch. Runs when no index exists yet, or when the embedding model or chunk schema changes. The full pipeline:
91
+
92
+ ```
93
+ File → tree-sitter parse → extract symbols → chunk (~512 tokens) →
94
+ → SQLite metadata + FTS5 (keyword) → LanceDB vectors (semantic) → Graph (SQLite)
95
+ ```
96
+
97
+ ### 2. Incremental index
98
+
99
+ Compares file hashes against the previous index. Only **added, modified, or removed** files are re-processed. Used by `edhindex index` when an existing compatible index is found.
100
+
101
+ ### 3. Live file watcher
102
+
103
+ When `edhindex start` runs (and `watch: true` in config, which is the default), chokidar watches the filesystem. On every save — removes old chunks for the file, re-parses, re-indexes. Debounced at 300ms.
104
+
105
+ ---
106
+
107
+ ## Search pipeline
108
+
109
+ ```
110
+ User query
111
+
112
+ ┌────────────────┐
113
+ │ Keyword (BM25) │── SQLite FTS5 → top 30
114
+ └────────────────┘
115
+ ┌────────────────┐
116
+ │ Vector (ANN) │── transformers.js → LanceDB → top 30
117
+ └────────────────┘
118
+
119
+ ┌────────────────┐
120
+ │ Deduplicate │── max score for duplicates
121
+ └────────────────┘
122
+
123
+ ┌────────────────┐
124
+ │ Reranker │── cross-encoder → final top N
125
+ └────────────────┘
126
+
127
+ Results with matchType: keyword | vector | hybrid
128
+ ```
129
+
130
+ - **Keyword**: SQLite FTS5 with BM25 scoring (porter + unicode61 tokenizer)
131
+ - **Semantic**: `@huggingface/transformers` embeddings → LanceDB ANN search
132
+ - **Hybrid**: top 30 BM25 + top 30 vectors → deduplicate → rerank → top 10
133
+ - **Reranker**: `Xenova/ms-marco-MiniLM-L-6-v2` cross-encoder (configurable via `edhindex config`)
134
+
135
+ ### Embedding model tiers
136
+
137
+ | Tier | Model | Dimensions | Download size |
138
+ |------|-------|-----------|--------------|
139
+ | `light` | all-MiniLM-L6-v2 | 384 | ~46 MB |
140
+ | `balanced` (default) | bge-base-en-v1.5 | 768 | ~109 MB |
141
+ | `max` | bge-m3 | 1024 | ~1.1 GB |
142
+
143
+ Switch with `edhindex config model <tier>`.
144
+
145
+ ---
146
+
147
+ ## Knowledge Graph
148
+
149
+ Every symbol becomes a node. Imports, exports, and hierarchy become edges. Four graph modes (switch in the UI):
150
+
151
+ | View | Description |
152
+ |------|-------------|
153
+ | **Force** | Physics-based node layout |
154
+ | **Hierarchy** | Directory tree structure |
155
+ | **Circle** | Circular arrangement |
156
+ | **Grid** | Grid layout |
157
+
158
+ ### Commands
159
+
160
+ ```
161
+ edhindex kg --rebuild Build the knowledge graph from the index
162
+ edhindex kg --stats Node/edge counts by type
163
+ edhindex kg --serve Open interactive browser at localhost
164
+ edhindex kg --write Write standalone HTML → .edhindex/knowledge-graph.html
165
+ ```
166
+
167
+ Built on tree-sitter + SQLite + Cytoscape.js — all local, no telemetry, no cloud.
168
+
169
+ ### Node/edge types
170
+
171
+ **Node kinds**: `workspace`, `folder`, `file`, `module`, `class`, `interface`, `enum`, `function`, `method`, `variable`, `import`, `export`
172
+
173
+ **Edge kinds**: `contains`, `imports`, `exports`, `inherits`, `implements`, `calls`, `references`, `defines`, `belongs_to`
174
+
175
+ ---
176
+
177
+ ## Commands
178
+
179
+ | Command | What it does |
180
+ |---------|-------------|
181
+ | `edhindex init` | Initialize `.edhindex/` — pick model + MCP client |
182
+ | `edhindex start` | Full build + MCP server + file watcher |
183
+ | `edhindex index` | Just build/update the index (no server) |
184
+ | `edhindex search <query>` | CLI hybrid search |
185
+ | `edhindex status` | Index stats |
186
+ | `edhindex config` | View/update settings |
187
+ | `edhindex models` | List available embedding models |
188
+ | `edhindex kg ...` | Knowledge graph operations |
189
+ | `edhindex graph` | Static SVG dependency graph |
190
+ | `edhindex doctor` | Diagnostics (10 checks) |
191
+ | `edhindex reset` | Delete the entire `.edhindex/` |
192
+
193
+ ---
194
+
195
+ ## MCP Tools
196
+
197
+ When `edhindex start` is running, any MCP client can call:
198
+
199
+ | Tool | What it does |
200
+ |------|-------------|
201
+ | `search_codebase` | Hybrid search with file/language filters |
202
+ | `get_graph` | Full knowledge graph (nodes + edges) |
203
+ | `get_node` | Node details + neighbors |
204
+ | `search_graph` | Search nodes by name |
205
+ | `get_graph_stats` | Graph statistics |
206
+
207
+ ### Client setup
208
+
209
+ During `edhindex init`, pick your MCP client and the config file is created automatically:
210
+
211
+ - **OpenCode** → `opencode.json`
212
+ - **Cline** → `.cline/mcp.json`
213
+ - **Roo Code** → `.roo/mcp.json`
214
+ - **Claude Code** → `claude.jsonc`
215
+ - **Cursor** → `.cursor/mcp.json`
216
+ - **Windsurf** → `.windsurf/mcp_config.json`
217
+ - **GitHub Copilot** → `.vscode/settings.json`
218
+ - **Continue** → `.continue/config.json`
219
+
220
+ ---
221
+
222
+ ## Requirements
223
+
224
+ - Node.js 18+
225
+
226
+ ## License
227
+
228
+ 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"}