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.
- package/README.md +228 -0
- package/dist/cli/commands/config_cmd.d.ts +2 -0
- package/dist/cli/commands/config_cmd.d.ts.map +1 -0
- package/dist/cli/commands/config_cmd.js +53 -0
- package/dist/cli/commands/config_cmd.js.map +1 -0
- package/dist/cli/commands/doctor_cmd.d.ts +2 -0
- package/dist/cli/commands/doctor_cmd.d.ts.map +1 -0
- package/dist/cli/commands/doctor_cmd.js +32 -0
- package/dist/cli/commands/doctor_cmd.js.map +1 -0
- package/dist/cli/commands/graph.d.ts +2 -0
- package/dist/cli/commands/graph.d.ts.map +1 -0
- package/dist/cli/commands/graph.js +26 -0
- package/dist/cli/commands/graph.js.map +1 -0
- package/dist/cli/commands/index_cmd.d.ts +2 -0
- package/dist/cli/commands/index_cmd.d.ts.map +1 -0
- package/dist/cli/commands/index_cmd.js +110 -0
- package/dist/cli/commands/index_cmd.js.map +1 -0
- package/dist/cli/commands/init.d.ts +2 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +53 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/knowledge-graph.d.ts +8 -0
- package/dist/cli/commands/knowledge-graph.d.ts.map +1 -0
- package/dist/cli/commands/knowledge-graph.js +76 -0
- package/dist/cli/commands/knowledge-graph.js.map +1 -0
- package/dist/cli/commands/models.d.ts +2 -0
- package/dist/cli/commands/models.d.ts.map +1 -0
- package/dist/cli/commands/models.js +17 -0
- package/dist/cli/commands/models.js.map +1 -0
- package/dist/cli/commands/reset.d.ts +2 -0
- package/dist/cli/commands/reset.d.ts.map +1 -0
- package/dist/cli/commands/reset.js +35 -0
- package/dist/cli/commands/reset.js.map +1 -0
- package/dist/cli/commands/search.d.ts +2 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +40 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/start.d.ts +2 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +265 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/status.d.ts +2 -0
- package/dist/cli/commands/status.d.ts.map +1 -0
- package/dist/cli/commands/status.js +47 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/index.d.ts +3 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +121 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/config/index.d.ts +28 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +65 -0
- package/dist/config/index.js.map +1 -0
- package/dist/doctor/index.d.ts +8 -0
- package/dist/doctor/index.d.ts.map +1 -0
- package/dist/doctor/index.js +117 -0
- package/dist/doctor/index.js.map +1 -0
- package/dist/embeddings/provider.d.ts +9 -0
- package/dist/embeddings/provider.d.ts.map +1 -0
- package/dist/embeddings/provider.js +2 -0
- package/dist/embeddings/provider.js.map +1 -0
- package/dist/embeddings/transformers.d.ts +26 -0
- package/dist/embeddings/transformers.d.ts.map +1 -0
- package/dist/embeddings/transformers.js +120 -0
- package/dist/embeddings/transformers.js.map +1 -0
- package/dist/graph/build.d.ts +13 -0
- package/dist/graph/build.d.ts.map +1 -0
- package/dist/graph/build.js +33 -0
- package/dist/graph/build.js.map +1 -0
- package/dist/graph/builder.d.ts +24 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/builder.js +231 -0
- package/dist/graph/builder.js.map +1 -0
- package/dist/graph/render.d.ts +3 -0
- package/dist/graph/render.d.ts.map +1 -0
- package/dist/graph/render.js +60 -0
- package/dist/graph/render.js.map +1 -0
- package/dist/graph/serve.d.ts +6 -0
- package/dist/graph/serve.d.ts.map +1 -0
- package/dist/graph/serve.js +389 -0
- package/dist/graph/serve.js.map +1 -0
- package/dist/graph/service.d.ts +29 -0
- package/dist/graph/service.d.ts.map +1 -0
- package/dist/graph/service.js +73 -0
- package/dist/graph/service.js.map +1 -0
- package/dist/graph/storage.d.ts +33 -0
- package/dist/graph/storage.d.ts.map +1 -0
- package/dist/graph/storage.js +164 -0
- package/dist/graph/storage.js.map +1 -0
- package/dist/graph/svg.d.ts +27 -0
- package/dist/graph/svg.d.ts.map +1 -0
- package/dist/graph/svg.js +212 -0
- package/dist/graph/svg.js.map +1 -0
- package/dist/graph/types.d.ts +34 -0
- package/dist/graph/types.d.ts.map +1 -0
- package/dist/graph/types.js +9 -0
- package/dist/graph/types.js.map +1 -0
- package/dist/indexer/chunker.d.ts +18 -0
- package/dist/indexer/chunker.d.ts.map +1 -0
- package/dist/indexer/chunker.js +139 -0
- package/dist/indexer/chunker.js.map +1 -0
- package/dist/indexer/file-utils.d.ts +17 -0
- package/dist/indexer/file-utils.d.ts.map +1 -0
- package/dist/indexer/file-utils.js +123 -0
- package/dist/indexer/file-utils.js.map +1 -0
- package/dist/indexer/ignore.d.ts +5 -0
- package/dist/indexer/ignore.d.ts.map +1 -0
- package/dist/indexer/ignore.js +96 -0
- package/dist/indexer/ignore.js.map +1 -0
- package/dist/indexer/incremental.d.ts +16 -0
- package/dist/indexer/incremental.d.ts.map +1 -0
- package/dist/indexer/incremental.js +55 -0
- package/dist/indexer/incremental.js.map +1 -0
- package/dist/indexer/indexer.d.ts +36 -0
- package/dist/indexer/indexer.d.ts.map +1 -0
- package/dist/indexer/indexer.js +121 -0
- package/dist/indexer/indexer.js.map +1 -0
- package/dist/indexer/parser.d.ts +30 -0
- package/dist/indexer/parser.d.ts.map +1 -0
- package/dist/indexer/parser.js +225 -0
- package/dist/indexer/parser.js.map +1 -0
- package/dist/logging.d.ts +15 -0
- package/dist/logging.d.ts.map +1 -0
- package/dist/logging.js +42 -0
- package/dist/logging.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +226 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp-config.d.ts +4 -0
- package/dist/mcp-config.d.ts.map +1 -0
- package/dist/mcp-config.js +175 -0
- package/dist/mcp-config.js.map +1 -0
- package/dist/progress.d.ts +12 -0
- package/dist/progress.d.ts.map +1 -0
- package/dist/progress.js +16 -0
- package/dist/progress.js.map +1 -0
- package/dist/retrieval/bm25.d.ts +6 -0
- package/dist/retrieval/bm25.d.ts.map +1 -0
- package/dist/retrieval/bm25.js +20 -0
- package/dist/retrieval/bm25.js.map +1 -0
- package/dist/retrieval/reranker.d.ts +11 -0
- package/dist/retrieval/reranker.d.ts.map +1 -0
- package/dist/retrieval/reranker.js +46 -0
- package/dist/retrieval/reranker.js.map +1 -0
- package/dist/retrieval/search.d.ts +35 -0
- package/dist/retrieval/search.d.ts.map +1 -0
- package/dist/retrieval/search.js +95 -0
- package/dist/retrieval/search.js.map +1 -0
- package/dist/security.d.ts +5 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +42 -0
- package/dist/security.js.map +1 -0
- package/dist/storage/fts.d.ts +30 -0
- package/dist/storage/fts.d.ts.map +1 -0
- package/dist/storage/fts.js +107 -0
- package/dist/storage/fts.js.map +1 -0
- package/dist/storage/metadata.d.ts +46 -0
- package/dist/storage/metadata.d.ts.map +1 -0
- package/dist/storage/metadata.js +133 -0
- package/dist/storage/metadata.js.map +1 -0
- package/dist/vector/lancedb.d.ts +25 -0
- package/dist/vector/lancedb.d.ts.map +1 -0
- package/dist/vector/lancedb.js +93 -0
- package/dist/vector/lancedb.js.map +1 -0
- package/dist/vector/store.d.ts +16 -0
- package/dist/vector/store.d.ts.map +1 -0
- package/dist/vector/store.js +2 -0
- package/dist/vector/store.js.map +1 -0
- package/dist/version.d.ts +12 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +46 -0
- package/dist/version.js.map +1 -0
- package/dist/watcher/index.d.ts +15 -0
- package/dist/watcher/index.d.ts.map +1 -0
- package/dist/watcher/index.js +65 -0
- package/dist/watcher/index.js.map +1 -0
- package/package.json +35 -4
- package/src/cli/commands/graph.ts +30 -0
- package/src/cli/commands/init.ts +41 -3
- package/src/cli/commands/knowledge-graph.ts +85 -0
- package/src/cli/commands/reset.ts +40 -0
- package/src/cli/commands/start.ts +54 -21
- package/src/cli/index.ts +33 -0
- package/src/config/index.ts +13 -0
- package/src/graph/build.ts +45 -0
- package/src/graph/builder.ts +243 -0
- package/src/graph/render.ts +67 -0
- package/src/graph/serve.ts +399 -0
- package/src/graph/service.ts +84 -0
- package/src/graph/storage.ts +181 -0
- package/src/graph/svg.ts +241 -0
- package/src/graph/types.ts +68 -0
- package/src/mcp/server.ts +212 -85
- package/src/mcp-config.ts +185 -0
- package/src/storage/metadata.ts +9 -1
- package/.edhindexignore +0 -66
- package/BUILD_BRIEF.md +0 -228
- package/tsconfig.json +0 -21
package/README.md
ADDED
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
# EDHIndex
|
|
2
|
+
|
|
3
|
+
[](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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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"}
|