claude-eidetic 0.1.2 β†’ 0.1.4

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 CHANGED
@@ -1,333 +1,324 @@
1
- # claude-eidetic
2
-
3
-
4
- [![tests](https://img.shields.io/github/actions/workflow/status/eidetics/claude-eidetic/ci.yml?style=flat-square&label=tests)](https://github.com/eidetics/claude-eidetic/actions/workflows/ci.yml)
5
- [![npm](https://img.shields.io/npm/v/claude-eidetic)](https://www.npmjs.com/package/claude-eidetic)
6
- [![MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
-
8
- Semantic code search, persistent memory, and session continuity for Claude Code. One plugin, not three.
9
-
10
- ---
11
-
12
- ## πŸš€ Quick Start
13
-
14
- ```bash
15
- claude plugin install eidetics/claude-eidetic
16
- ```
17
-
18
- ```bash
19
- export OPENAI_API_KEY=sk-... # for embeddings (default)
20
- export ANTHROPIC_API_KEY=sk-ant-... # for memory extraction (default)
21
- ```
22
-
23
- Index your codebase once, then search by meaning:
24
-
25
- ```
26
- index_codebase(path="/your/project")
27
- search_code("how does authentication work")
28
- ```
29
-
30
- ---
31
-
32
- ## ✨ Features
33
-
34
- ### πŸ” Semantic Code Search
35
-
36
- **Find code by meaning, not keywords.** Search across your entire codebase with natural language, returning the most relevant functions and classes, not a list of files to read.
37
-
38
- ```
39
- search_code("how does the retry logic work")
40
- search_code("authentication middleware", extensionFilter=[".ts"])
41
- search_code(project="backend", query="auth flow")
42
- ```
43
-
44
- ### πŸ—οΈ Architecture at a Glance
45
-
46
- **Get every class, function, and method in one call.** `browse_structure` returns a condensed map of your codebase with signatures, grouped by file, replacing a Glob + Read cascade with a single tool call.
47
-
48
- ```
49
- browse_structure(path="/my/project", kind="class")
50
- list_symbols(path="/my/project", nameFilter="handle")
51
- ```
52
-
53
- ### πŸ“š Documentation Cache
54
-
55
- **Fetch docs once, search them forever.** Cache external documentation as searchable embeddings. Retrieve relevant passages instantly, far cheaper than re-fetching the same page each session.
56
-
57
- ```
58
- index_document(content=..., library="react", topic="hooks", source="https://...")
59
- search_documents("React useCallback dependencies", library="react")
60
- ```
61
-
62
- ### 🧠 Persistent Memory
63
-
64
- **Claude remembers your preferences between sessions.** `add_memory` uses an LLM to extract structured facts from conversation text (coding style, architecture decisions, debugging insights) and deduplicates them semantically. Not a static config file you forget to update.
65
-
66
- ```
67
- add_memory("Always use absolute imports, never relative")
68
- search_memory("how does this team handle errors")
69
- ```
70
-
71
- ### πŸ”„ Session Continuity
72
-
73
- **Every session picks up where the last one left off.** When a session ends (or context compacts mid-session), Eidetic automatically writes a structured note capturing files changed, tasks, commands, and decisions. `/catchup` at the start of a new session reconstructs exactly where you were. No user action required.
74
-
75
- ### πŸ‘» Invisible Optimizations
76
-
77
- Eight hook events fire automatically, nudging toward cheaper tools, redirecting file reads for 15-20% token savings, tracking changed files, and saving session state on exit.
78
-
79
- <details>
80
- <summary><strong>Hook event details</strong></summary>
81
-
82
- | Hook | Trigger | What it does |
83
- |---|---|---|
84
- | `SessionStart` | Session opens | Validates config, injects last-session context |
85
- | `UserPromptSubmit` | Every message | Nudges toward `search_code` over Grep/Explore for conceptual queries |
86
- | `PreToolUse` (Read) | Before every Read | Blocks Read for text files, redirects to `read_file` for 15-20% token savings |
87
- | `PreToolUse` (WebFetch / query-docs) | Before doc fetches | Suggests `search_documents` if library is cached (allows fetch either way) |
88
- | `PostToolUse` (Write / Edit) | After every file write | Tracks changed files in a shadow git index |
89
- | `Stop` | After Claude responds | Commits shadow index; triggers targeted re-index of changed files only |
90
- | `PreCompact` | Before context compaction | Captures session state to notes before memory is lost |
91
- | `SessionEnd` | Session closes | Writes session note (files, tasks, commands); extracts developer memories via LLM |
92
-
93
- </details>
94
-
95
- ---
96
-
97
- ## πŸ—ΊοΈ When to Use What
98
-
99
- | Need | Use | Notes |
100
- |---|---|---|
101
- | Find implementations by concept | `search_code` | Semantic, natural language queries |
102
- | Exact string or regex match | Grep | Grep wins for exact matches |
103
- | Find file by exact name | Glob | Glob wins for name patterns |
104
- | Understand module structure | `browse_structure` | One call vs Glob + Read cascade |
105
- | Read a specific known file | `read_file` | Cheaper than built-in Read for code files |
106
- | Search cached documentation | `search_documents` | Far cheaper than re-fetching |
107
- | Recall project conventions | `search_memory` | Global across all projects and sessions |
108
-
109
- ---
110
-
111
- ## πŸ“– Skills Reference
112
-
113
- | Skill | What it does |
114
- |---|---|
115
- | `/search` | Guided semantic search with best-practice prompts |
116
- | `/index` | Index or re-index a codebase with dry-run option |
117
- | `/cache-docs` | Fetch and cache external documentation |
118
- | `/catchup` | Search session notes and reconstruct where you left off |
119
- | `/wrapup` | Extract decisions, rationale, open questions, and next actions from the conversation |
120
-
121
- ---
122
-
123
- <details>
124
- <summary><strong>πŸ”₯ Why does this exist? (The Problem)</strong></summary>
125
-
126
- Every new Claude Code session starts cold. You re-explain the architecture. You re-fetch the same docs. Claude reads the same files repeatedly, burning tokens just to get back to where you were.
127
-
128
- | Task | Without Eidetic | With Eidetic |
129
- |---|---|---|
130
- | Find where auth errors are handled | Grep cascade, read 8 files, ~10,700 tokens | `search_code("auth error handling")` ~220 tokens |
131
- | Resume after context compaction | Re-explain 20 min of context, ~2,000 tokens | `/catchup` ~200 tokens |
132
- | Look up React hooks docs | Fetch docs page, ~5,000 tokens | `search_documents("React useEffect")` ~20 tokens |
133
- | Read a 400-line file | Built-in Read with line numbers, ~900 tokens | `read_file(path)` ~740 tokens |
134
-
135
- </details>
136
-
137
- ---
138
-
139
- ## πŸ“¦ Installation
140
-
141
- ### Plugin (recommended)
142
-
143
- ```bash
144
- claude plugin install eidetics/claude-eidetic
145
- ```
146
-
147
- The plugin auto-starts the MCP server, installs skills, and configures hooks.
148
-
149
- ### npx (manual MCP config)
150
-
151
- Add to your `.mcp.json`:
152
-
153
- ```json
154
- {
155
- "mcpServers": {
156
- "claude-eidetic": {
157
- "command": "npx",
158
- "args": ["-y", "claude-eidetic"],
159
- "env": {
160
- "OPENAI_API_KEY": "sk-...",
161
- "ANTHROPIC_API_KEY": "sk-ant-..."
162
- }
163
- }
164
- }
165
- }
166
- ```
167
-
168
- `ANTHROPIC_API_KEY` is needed for the memory LLM (default provider). Omit it if using `MEMORY_LLM_PROVIDER=openai` or `ollama`.
169
-
170
- ### Global install
171
-
172
- ```bash
173
- npm install -g claude-eidetic
174
- ```
175
-
176
- ### From source
177
-
178
- ```bash
179
- git clone https://github.com/eidetics/claude-eidetic
180
- cd claude-eidetic
181
- npm install && npx tsc && npm start
182
- ```
183
-
184
- ### Requirements
185
-
186
- - Node.js >= 20.0.0
187
- - An API key (OpenAI for embeddings, Anthropic for memory extraction, or Ollama for both free)
188
- - Docker (optional): Qdrant auto-provisions via Docker if not already running
189
- - C/C++ build tools: required by tree-sitter native bindings (`node-gyp`)
190
-
191
- ---
192
-
193
- ## βš™οΈ Configuration
194
-
195
- All configuration is via environment variables. No config files.
196
-
197
- ### Using Ollama (free, local)
198
-
199
- ```bash
200
- export EMBEDDING_PROVIDER=ollama
201
- export MEMORY_LLM_PROVIDER=ollama
202
- # No API keys needed
203
- ```
204
-
205
- <details>
206
- <summary><strong>Full configuration reference</strong></summary>
207
-
208
- | Variable | Default | Description |
209
- |---|---|---|
210
- | `OPENAI_API_KEY` | _(required for openai)_ | OpenAI API key for embeddings and/or memory |
211
- | `ANTHROPIC_API_KEY` | _(required for anthropic memory)_ | Anthropic API key for memory LLM |
212
- | `EMBEDDING_PROVIDER` | `openai` | `openai`, `ollama`, or `local` |
213
- | `EMBEDDING_MODEL` | `text-embedding-3-small` (openai) / `nomic-embed-text` (ollama) | Embedding model name |
214
- | `EMBEDDING_BATCH_SIZE` | `100` | Batch size for embedding requests (1-2048) |
215
- | `INDEXING_CONCURRENCY` | `8` | Parallel file indexing workers (1-32) |
216
- | `OPENAI_BASE_URL` | _(none)_ | Custom OpenAI-compatible endpoint |
217
- | `OLLAMA_BASE_URL` | `http://localhost:11434/v1` | Ollama server URL |
218
- | `VECTORDB_PROVIDER` | `qdrant` | `qdrant` or `milvus` |
219
- | `QDRANT_URL` | `http://localhost:6333` | Qdrant server URL |
220
- | `QDRANT_API_KEY` | _(none)_ | Qdrant API key (for remote/cloud instances) |
221
- | `MILVUS_ADDRESS` | `localhost:19530` | Milvus server address |
222
- | `MILVUS_TOKEN` | _(none)_ | Milvus authentication token |
223
- | `EIDETIC_DATA_DIR` | `~/.eidetic/` | Data root for snapshots, memory DB, registry |
224
- | `CUSTOM_EXTENSIONS` | `[]` | JSON array of extra file extensions to index (e.g., `[".dart",".arb"]`) |
225
- | `CUSTOM_IGNORE_PATTERNS` | `[]` | JSON array of glob patterns to exclude |
226
- | `MEMORY_LLM_PROVIDER` | `anthropic` | `anthropic`, `openai`, or `ollama` |
227
- | `MEMORY_LLM_MODEL` | `claude-haiku-4-5-20251001` (anthropic) / `gpt-4o-mini` (openai) / `llama3.2` (ollama) | Model for memory extraction |
228
- | `MEMORY_LLM_BASE_URL` | _(none)_ | Custom base URL for memory LLM |
229
- | `MEMORY_LLM_API_KEY` | _(none)_ | API key override for memory LLM |
230
-
231
- </details>
232
-
233
- ---
234
-
235
- <details>
236
- <summary><strong>πŸ”§ Tool Reference</strong></summary>
237
-
238
- ### πŸ” Code Search
239
-
240
- | Tool | Description |
241
- |---|---|
242
- | `search_code` | Hybrid semantic search over indexed codebase. Returns compact results by default. |
243
- | `index_codebase` | Index a directory. Supports `dryRun`, `force`, `customExtensions`, `customIgnorePatterns`. |
244
- | `list_indexed` | List all indexed codebases with file/chunk counts and status. |
245
- | `get_indexing_status` | Check indexing progress for a path or project. |
246
- | `clear_index` | Remove the search index for a codebase. |
247
- | `cleanup_vectors` | Remove orphaned vectors for deleted files. No re-embedding cost. |
248
- | `browse_structure` | Condensed structural map: classes, functions, methods with signatures, grouped by file. |
249
- | `list_symbols` | Compact symbol table with name/kind/file/line. Supports name, kind, and path filters. |
250
-
251
- ### πŸ“„ File Reading
252
-
253
- | Tool | Description |
254
- |---|---|
255
- | `read_file` | Read file without line-number overhead. Cheaper than built-in Read for code files. |
256
-
257
- ### πŸ“š Documentation Cache
258
-
259
- | Tool | Description |
260
- |---|---|
261
- | `index_document` | Cache external documentation for semantic search. Supports TTL for staleness tracking. |
262
- | `search_documents` | Search cached docs. Far cheaper than re-fetching the same page. |
263
-
264
- ### 🧠 Memory
265
-
266
- | Tool | Description |
267
- |---|---|
268
- | `add_memory` | LLM-extracted facts from text. Auto-deduplicates. Seven categories. |
269
- | `search_memory` | Semantic search over stored memories. Filterable by category. |
270
- | `list_memories` | List all memories, optionally filtered by category. |
271
- | `delete_memory` | Delete a specific memory by UUID. |
272
- | `memory_history` | View change history for a memory (additions, updates, deletions). |
273
-
274
- </details>
275
-
276
- ---
277
-
278
- ## 🌐 Supported Languages
279
-
280
- **AST-aware** (functions and classes chunked intact):
281
-
282
- <p>
283
- <img src="https://img.shields.io/badge/JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=black" alt="JavaScript"/>
284
- <img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript"/>
285
- <img src="https://img.shields.io/badge/React_(JSX/TSX)-61DAFB?style=flat-square&logo=react&logoColor=black" alt="JSX/TSX"/>
286
- <img src="https://img.shields.io/badge/Python-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python"/>
287
- <img src="https://img.shields.io/badge/Go-00ADD8?style=flat-square&logo=go&logoColor=white" alt="Go"/>
288
- <img src="https://img.shields.io/badge/Java-ED8B00?style=flat-square&logo=openjdk&logoColor=white" alt="Java"/>
289
- <img src="https://img.shields.io/badge/Rust-000000?style=flat-square&logo=rust&logoColor=white" alt="Rust"/>
290
- <img src="https://img.shields.io/badge/C-A8B9CC?style=flat-square&logo=c&logoColor=black" alt="C"/>
291
- <img src="https://img.shields.io/badge/C++-00599C?style=flat-square&logo=cplusplus&logoColor=white" alt="C++"/>
292
- <img src="https://img.shields.io/badge/C%23-512BD4?style=flat-square&logo=csharp&logoColor=white" alt="C#"/>
293
- </p>
294
-
295
- **Line-based fallback** (sliding window chunking for everything else):
296
-
297
- <p>
298
- <img src="https://img.shields.io/badge/Markdown-000000?style=flat-square&logo=markdown&logoColor=white" alt="Markdown"/>
299
- <img src="https://img.shields.io/badge/YAML-CB171E?style=flat-square&logo=yaml&logoColor=white" alt="YAML"/>
300
- <img src="https://img.shields.io/badge/JSON-000000?style=flat-square&logo=json&logoColor=white" alt="JSON"/>
301
- <img src="https://img.shields.io/badge/Ruby-CC342D?style=flat-square&logo=ruby&logoColor=white" alt="Ruby"/>
302
- <img src="https://img.shields.io/badge/PHP-777BB4?style=flat-square&logo=php&logoColor=white" alt="PHP"/>
303
- <img src="https://img.shields.io/badge/Swift-F05138?style=flat-square&logo=swift&logoColor=white" alt="Swift"/>
304
- <img src="https://img.shields.io/badge/Kotlin-7F52FF?style=flat-square&logo=kotlin&logoColor=white" alt="Kotlin"/>
305
- <img src="https://img.shields.io/badge/and_more...-30363d?style=flat-square" alt="and more"/>
306
- </p>
307
-
308
- ---
309
-
310
- ## πŸ› οΈ Development
311
-
312
- ```bash
313
- npm install && npx tsc # install and build
314
- npm run dev # watch mode (tsx)
315
- npm test # unit tests (no external services needed)
316
- npm run test:integration # requires Qdrant at localhost:6333 + OPENAI_API_KEY
317
- ```
318
-
319
- **Commit format:** `type(scope): description`
320
- Types: `feat`, `fix`, `docs`, `refactor`, `perf`, `chore`, `test`
321
- Scopes: `embedding`, `vectordb`, `splitter`, `indexer`, `mcp`, `infra`, `config`
322
-
323
- ---
324
-
325
- ## πŸ™ Acknowledgements
326
-
327
- Heavily inspired by [mem0](https://github.com/mem0ai/mem0), [claude-mem](https://github.com/thedotmack/claude-mem), and [claude-context](https://github.com/zilliztech/claude-context). Documentation retrieval powered by [context7](https://github.com/upstash/context7).
328
-
329
- ---
330
-
331
- ## πŸ“„ License
332
-
333
- MIT
1
+ # claude-eidetic
2
+
3
+
4
+ [![tests](https://img.shields.io/github/actions/workflow/status/eidetics/claude-eidetic/ci.yml?style=flat-square&label=tests)](https://github.com/eidetics/claude-eidetic/actions/workflows/ci.yml)
5
+ [![npm](https://img.shields.io/npm/v/claude-eidetic)](https://www.npmjs.com/package/claude-eidetic)
6
+ [![MIT](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
7
+
8
+ Semantic code search, persistent memory, and session continuity for Claude Code. One plugin, not three.
9
+
10
+ ---
11
+
12
+ ## πŸš€ Quick Start
13
+
14
+ ```bash
15
+ claude plugin install eidetics/claude-eidetic
16
+ ```
17
+
18
+ ```bash
19
+ export OPENAI_API_KEY=sk-... # for embeddings (default)
20
+ ```
21
+
22
+ Index your codebase once, then search by meaning:
23
+
24
+ ```
25
+ index_codebase(path="/your/project")
26
+ search_code("how does authentication work")
27
+ ```
28
+
29
+ ---
30
+
31
+ ## ✨ Features
32
+
33
+ ### πŸ” Semantic Code Search
34
+
35
+ **Find code by meaning, not keywords.** Search across your entire codebase with natural language, returning the most relevant functions and classes, not a list of files to read.
36
+
37
+ ```
38
+ search_code("how does the retry logic work")
39
+ search_code("authentication middleware", extensionFilter=[".ts"])
40
+ search_code(project="backend", query="auth flow")
41
+ ```
42
+
43
+ ### πŸ—οΈ Architecture at a Glance
44
+
45
+ **Get every class, function, and method in one call.** `browse_structure` returns a condensed map of your codebase with signatures, grouped by file, replacing a Glob + Read cascade with a single tool call.
46
+
47
+ ```
48
+ browse_structure(path="/my/project", kind="class")
49
+ list_symbols(path="/my/project", nameFilter="handle")
50
+ ```
51
+
52
+ ### πŸ“š Documentation Cache
53
+
54
+ **Fetch docs once, search them forever.** Cache external documentation as searchable embeddings. Retrieve relevant passages instantly, far cheaper than re-fetching the same page each session.
55
+
56
+ ```
57
+ index_document(content=..., library="react", topic="hooks", source="https://...")
58
+ search_documents("React useCallback dependencies", library="react")
59
+ ```
60
+
61
+ ### 🧠 Persistent Memory
62
+
63
+ **Claude remembers your preferences between sessions.** `add_memory` uses an LLM to extract structured facts from conversation text (coding style, architecture decisions, debugging insights) and deduplicates them semantically. Not a static config file you forget to update.
64
+
65
+ ```
66
+ add_memory("Always use absolute imports, never relative")
67
+ search_memory("how does this team handle errors")
68
+ ```
69
+
70
+ ### πŸ”„ Session Continuity
71
+
72
+ **Every session picks up where the last one left off.** When a session ends (or context compacts mid-session), Eidetic automatically writes a structured note capturing files changed, tasks, commands, and decisions. `/catchup` at the start of a new session reconstructs exactly where you were. No user action required.
73
+
74
+ ### πŸ‘» Invisible Optimizations
75
+
76
+ Eight hook events fire automatically, nudging toward cheaper tools, redirecting file reads for 15-20% token savings, tracking changed files, and saving session state on exit.
77
+
78
+ <details>
79
+ <summary><strong>Hook event details</strong></summary>
80
+
81
+ | Hook | Trigger | What it does |
82
+ |---|---|---|
83
+ | `SessionStart` | Session opens | Validates config, injects last-session context |
84
+ | `UserPromptSubmit` | Every message | Nudges toward `search_code` over Grep/Explore for conceptual queries |
85
+ | `PreToolUse` (Read) | Before every Read | Blocks Read for text files, redirects to `read_file` for 15-20% token savings |
86
+ | `PreToolUse` (WebFetch / query-docs) | Before doc fetches | Suggests `search_documents` if library is cached (allows fetch either way) |
87
+ | `PostToolUse` (Write / Edit) | After every file write | Tracks changed files in a shadow git index |
88
+ | `Stop` | After Claude responds | Commits shadow index; triggers targeted re-index of changed files only |
89
+ | `PreCompact` | Before context compaction | Captures session state to notes before memory is lost |
90
+ | `SessionEnd` | Session closes | Writes session note (files, tasks, commands); extracts developer memories via LLM |
91
+
92
+ </details>
93
+
94
+ ---
95
+
96
+ ## πŸ—ΊοΈ When to Use What
97
+
98
+ | Need | Use | Notes |
99
+ |---|---|---|
100
+ | Find implementations by concept | `search_code` | Semantic, natural language queries |
101
+ | Exact string or regex match | Grep | Grep wins for exact matches |
102
+ | Find file by exact name | Glob | Glob wins for name patterns |
103
+ | Understand module structure | `browse_structure` | One call vs Glob + Read cascade |
104
+ | Read a specific known file | `read_file` | Cheaper than built-in Read for code files |
105
+ | Search cached documentation | `search_documents` | Far cheaper than re-fetching |
106
+ | Recall project conventions | `search_memory` | Global across all projects and sessions |
107
+
108
+ ---
109
+
110
+ ## πŸ“– Skills Reference
111
+
112
+ | Skill | What it does |
113
+ |---|---|
114
+ | `/search` | Guided semantic search with best-practice prompts |
115
+ | `/index` | Index or re-index a codebase with dry-run option |
116
+ | `/cache-docs` | Fetch and cache external documentation |
117
+ | `/catchup` | Search session notes and reconstruct where you left off |
118
+ | `/wrapup` | Extract decisions, rationale, open questions, and next actions from the conversation |
119
+
120
+ ---
121
+
122
+ <details>
123
+ <summary><strong>πŸ”₯ Why does this exist? (The Problem)</strong></summary>
124
+
125
+ Every new Claude Code session starts cold. You re-explain the architecture. You re-fetch the same docs. Claude reads the same files repeatedly, burning tokens just to get back to where you were.
126
+
127
+ | Task | Without Eidetic | With Eidetic |
128
+ |---|---|---|
129
+ | Find where auth errors are handled | Grep cascade, read 8 files, ~10,700 tokens | `search_code("auth error handling")` ~220 tokens |
130
+ | Resume after context compaction | Re-explain 20 min of context, ~2,000 tokens | `/catchup` ~200 tokens |
131
+ | Look up React hooks docs | Fetch docs page, ~5,000 tokens | `search_documents("React useEffect")` ~20 tokens |
132
+ | Read a 400-line file | Built-in Read with line numbers, ~900 tokens | `read_file(path)` ~740 tokens |
133
+
134
+ </details>
135
+
136
+ ---
137
+
138
+ ## πŸ“¦ Installation
139
+
140
+ ### Plugin (recommended)
141
+
142
+ ```bash
143
+ claude plugin install eidetics/claude-eidetic
144
+ ```
145
+
146
+ The plugin auto-starts the MCP server, installs skills, and configures hooks.
147
+
148
+ ### npx (manual MCP config)
149
+
150
+ Add to your `.mcp.json`:
151
+
152
+ ```json
153
+ {
154
+ "mcpServers": {
155
+ "claude-eidetic": {
156
+ "command": "npx",
157
+ "args": ["-y", "claude-eidetic"],
158
+ "env": {
159
+ "OPENAI_API_KEY": "sk-..."
160
+ }
161
+ }
162
+ }
163
+ }
164
+ ```
165
+
166
+ ### Global install
167
+
168
+ ```bash
169
+ npm install -g claude-eidetic
170
+ ```
171
+
172
+ ### From source
173
+
174
+ ```bash
175
+ git clone https://github.com/eidetics/claude-eidetic
176
+ cd claude-eidetic
177
+ npm install && npx tsc && npm start
178
+ ```
179
+
180
+ ### Requirements
181
+
182
+ - Node.js >= 20.0.0
183
+ - An API key (OpenAI for embeddings, or Ollama for free local embeddings)
184
+ - Docker (optional): Qdrant auto-provisions via Docker if not already running
185
+ - C/C++ build tools: required by tree-sitter native bindings (`node-gyp`)
186
+
187
+ ---
188
+
189
+ ## βš™οΈ Configuration
190
+
191
+ All configuration is via environment variables. No config files.
192
+
193
+ ### Using Ollama (free, local)
194
+
195
+ ```bash
196
+ export EMBEDDING_PROVIDER=ollama
197
+ export MEMORY_LLM_PROVIDER=ollama
198
+ # No API keys needed
199
+ ```
200
+
201
+ <details>
202
+ <summary><strong>Full configuration reference</strong></summary>
203
+
204
+ | Variable | Default | Description |
205
+ |---|---|---|
206
+ | `OPENAI_API_KEY` | _(required for openai)_ | OpenAI API key for embeddings |
207
+ | `EMBEDDING_PROVIDER` | `openai` | `openai`, `ollama`, or `local` |
208
+ | `EMBEDDING_MODEL` | `text-embedding-3-small` (openai) / `nomic-embed-text` (ollama) | Embedding model name |
209
+ | `EMBEDDING_BATCH_SIZE` | `100` | Batch size for embedding requests (1-2048) |
210
+ | `INDEXING_CONCURRENCY` | `8` | Parallel file indexing workers (1-32) |
211
+ | `OPENAI_BASE_URL` | _(none)_ | Custom OpenAI-compatible endpoint |
212
+ | `OLLAMA_BASE_URL` | `http://localhost:11434/v1` | Ollama server URL |
213
+ | `VECTORDB_PROVIDER` | `qdrant` | `qdrant` or `milvus` |
214
+ | `QDRANT_URL` | `http://localhost:6333` | Qdrant server URL |
215
+ | `QDRANT_API_KEY` | _(none)_ | Qdrant API key (for remote/cloud instances) |
216
+ | `MILVUS_ADDRESS` | `localhost:19530` | Milvus server address |
217
+ | `MILVUS_TOKEN` | _(none)_ | Milvus authentication token |
218
+ | `EIDETIC_DATA_DIR` | `~/.eidetic/` | Data root for snapshots, memory DB, registry |
219
+ | `CUSTOM_EXTENSIONS` | `[]` | JSON array of extra file extensions to index (e.g., `[".dart",".arb"]`) |
220
+ | `CUSTOM_IGNORE_PATTERNS` | `[]` | JSON array of glob patterns to exclude |
221
+
222
+ </details>
223
+
224
+ ---
225
+
226
+ <details>
227
+ <summary><strong>πŸ”§ Tool Reference</strong></summary>
228
+
229
+ ### πŸ” Code Search
230
+
231
+ | Tool | Description |
232
+ |---|---|
233
+ | `search_code` | Hybrid semantic search over indexed codebase. Returns compact results by default. |
234
+ | `index_codebase` | Index a directory. Supports `dryRun`, `force`, `customExtensions`, `customIgnorePatterns`. |
235
+ | `list_indexed` | List all indexed codebases with file/chunk counts and status. |
236
+ | `get_indexing_status` | Check indexing progress for a path or project. |
237
+ | `clear_index` | Remove the search index for a codebase. |
238
+ | `cleanup_vectors` | Remove orphaned vectors for deleted files. No re-embedding cost. |
239
+ | `browse_structure` | Condensed structural map: classes, functions, methods with signatures, grouped by file. |
240
+ | `list_symbols` | Compact symbol table with name/kind/file/line. Supports name, kind, and path filters. |
241
+
242
+ ### πŸ“„ File Reading
243
+
244
+ | Tool | Description |
245
+ |---|---|
246
+ | `read_file` | Read file without line-number overhead. Cheaper than built-in Read for code files. |
247
+
248
+ ### πŸ“š Documentation Cache
249
+
250
+ | Tool | Description |
251
+ |---|---|
252
+ | `index_document` | Cache external documentation for semantic search. Supports TTL for staleness tracking. |
253
+ | `search_documents` | Search cached docs. Far cheaper than re-fetching the same page. |
254
+
255
+ ### 🧠 Memory
256
+
257
+ | Tool | Description |
258
+ |---|---|
259
+ | `add_memory` | LLM-extracted facts from text. Auto-deduplicates. Seven categories. |
260
+ | `search_memory` | Semantic search over stored memories. Filterable by category. |
261
+ | `list_memories` | List all memories, optionally filtered by category. |
262
+ | `delete_memory` | Delete a specific memory by UUID. |
263
+ | `memory_history` | View change history for a memory (additions, updates, deletions). |
264
+
265
+ </details>
266
+
267
+ ---
268
+
269
+ ## 🌐 Supported Languages
270
+
271
+ **AST-aware** (functions and classes chunked intact):
272
+
273
+ <p>
274
+ <img src="https://img.shields.io/badge/JavaScript-F7DF1E?style=flat-square&logo=javascript&logoColor=black" alt="JavaScript"/>
275
+ <img src="https://img.shields.io/badge/TypeScript-3178C6?style=flat-square&logo=typescript&logoColor=white" alt="TypeScript"/>
276
+ <img src="https://img.shields.io/badge/React_(JSX/TSX)-61DAFB?style=flat-square&logo=react&logoColor=black" alt="JSX/TSX"/>
277
+ <img src="https://img.shields.io/badge/Python-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python"/>
278
+ <img src="https://img.shields.io/badge/Go-00ADD8?style=flat-square&logo=go&logoColor=white" alt="Go"/>
279
+ <img src="https://img.shields.io/badge/Java-ED8B00?style=flat-square&logo=openjdk&logoColor=white" alt="Java"/>
280
+ <img src="https://img.shields.io/badge/Rust-000000?style=flat-square&logo=rust&logoColor=white" alt="Rust"/>
281
+ <img src="https://img.shields.io/badge/C-A8B9CC?style=flat-square&logo=c&logoColor=black" alt="C"/>
282
+ <img src="https://img.shields.io/badge/C++-00599C?style=flat-square&logo=cplusplus&logoColor=white" alt="C++"/>
283
+ <img src="https://img.shields.io/badge/C%23-512BD4?style=flat-square&logo=csharp&logoColor=white" alt="C#"/>
284
+ </p>
285
+
286
+ **Line-based fallback** (sliding window chunking for everything else):
287
+
288
+ <p>
289
+ <img src="https://img.shields.io/badge/Markdown-000000?style=flat-square&logo=markdown&logoColor=white" alt="Markdown"/>
290
+ <img src="https://img.shields.io/badge/YAML-CB171E?style=flat-square&logo=yaml&logoColor=white" alt="YAML"/>
291
+ <img src="https://img.shields.io/badge/JSON-000000?style=flat-square&logo=json&logoColor=white" alt="JSON"/>
292
+ <img src="https://img.shields.io/badge/Ruby-CC342D?style=flat-square&logo=ruby&logoColor=white" alt="Ruby"/>
293
+ <img src="https://img.shields.io/badge/PHP-777BB4?style=flat-square&logo=php&logoColor=white" alt="PHP"/>
294
+ <img src="https://img.shields.io/badge/Swift-F05138?style=flat-square&logo=swift&logoColor=white" alt="Swift"/>
295
+ <img src="https://img.shields.io/badge/Kotlin-7F52FF?style=flat-square&logo=kotlin&logoColor=white" alt="Kotlin"/>
296
+ <img src="https://img.shields.io/badge/and_more...-30363d?style=flat-square" alt="and more"/>
297
+ </p>
298
+
299
+ ---
300
+
301
+ ## πŸ› οΈ Development
302
+
303
+ ```bash
304
+ npm install && npx tsc # install and build
305
+ npm run dev # watch mode (tsx)
306
+ npm test # unit tests (no external services needed)
307
+ npm run test:integration # requires Qdrant at localhost:6333 + OPENAI_API_KEY
308
+ ```
309
+
310
+ **Commit format:** `type(scope): description`
311
+ Types: `feat`, `fix`, `docs`, `refactor`, `perf`, `chore`, `test`
312
+ Scopes: `embedding`, `vectordb`, `splitter`, `indexer`, `mcp`, `infra`, `config`
313
+
314
+ ---
315
+
316
+ ## πŸ™ Acknowledgements
317
+
318
+ Heavily inspired by [mem0](https://github.com/mem0ai/mem0), [claude-mem](https://github.com/thedotmack/claude-mem), and [claude-context](https://github.com/zilliztech/claude-context). Documentation retrieval powered by [context7](https://github.com/upstash/context7).
319
+
320
+ ---
321
+
322
+ ## πŸ“„ License
323
+
324
+ MIT