claude-code-swarm 0.3.3 → 0.3.5

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 (273) hide show
  1. package/.claude-plugin/marketplace.json +1 -1
  2. package/.claude-plugin/plugin.json +22 -1
  3. package/.claude-plugin/run-agent-inbox-mcp.sh +76 -0
  4. package/.claude-plugin/run-minimem-mcp.sh +98 -0
  5. package/.claude-plugin/run-opentasks-mcp.sh +65 -0
  6. package/CLAUDE.md +200 -36
  7. package/README.md +65 -0
  8. package/e2e/helpers/cleanup.mjs +17 -3
  9. package/e2e/helpers/map-mock-server.mjs +201 -25
  10. package/e2e/helpers/sidecar.mjs +222 -0
  11. package/e2e/helpers/workspace.mjs +2 -1
  12. package/e2e/tier5-sidecar-inbox.test.mjs +900 -0
  13. package/e2e/tier6-inbox-mcp.test.mjs +173 -0
  14. package/e2e/tier6-live-agent.test.mjs +759 -0
  15. package/e2e/vitest.config.e2e.mjs +1 -1
  16. package/hooks/hooks.json +15 -8
  17. package/package.json +13 -1
  18. package/references/agent-inbox/CLAUDE.md +151 -0
  19. package/references/agent-inbox/README.md +238 -0
  20. package/references/agent-inbox/docs/CLAUDE-CODE-SWARM-PROPOSAL.md +137 -0
  21. package/references/agent-inbox/docs/DESIGN.md +1156 -0
  22. package/references/agent-inbox/hooks/inbox-hook.mjs +119 -0
  23. package/references/agent-inbox/hooks/register-hook.mjs +69 -0
  24. package/references/agent-inbox/package-lock.json +3347 -0
  25. package/references/agent-inbox/package.json +58 -0
  26. package/references/agent-inbox/rules/agent-inbox.md +78 -0
  27. package/references/agent-inbox/src/federation/address.ts +61 -0
  28. package/references/agent-inbox/src/federation/connection-manager.ts +573 -0
  29. package/references/agent-inbox/src/federation/delivery-queue.ts +222 -0
  30. package/references/agent-inbox/src/federation/index.ts +6 -0
  31. package/references/agent-inbox/src/federation/routing-engine.ts +188 -0
  32. package/references/agent-inbox/src/federation/trust.ts +71 -0
  33. package/references/agent-inbox/src/index.ts +390 -0
  34. package/references/agent-inbox/src/ipc/ipc-server.ts +207 -0
  35. package/references/agent-inbox/src/jsonrpc/mail-server.ts +382 -0
  36. package/references/agent-inbox/src/map/map-client.ts +414 -0
  37. package/references/agent-inbox/src/mcp/mcp-server.ts +272 -0
  38. package/references/agent-inbox/src/mesh/delivery-bridge.ts +110 -0
  39. package/references/agent-inbox/src/mesh/mesh-connector.ts +41 -0
  40. package/references/agent-inbox/src/mesh/mesh-transport.ts +157 -0
  41. package/references/agent-inbox/src/mesh/type-mapper.ts +239 -0
  42. package/references/agent-inbox/src/push/notifier.ts +233 -0
  43. package/references/agent-inbox/src/registry/warm-registry.ts +255 -0
  44. package/references/agent-inbox/src/router/message-router.ts +175 -0
  45. package/references/agent-inbox/src/storage/interface.ts +48 -0
  46. package/references/agent-inbox/src/storage/memory.ts +145 -0
  47. package/references/agent-inbox/src/storage/sqlite.ts +671 -0
  48. package/references/agent-inbox/src/traceability/traceability.ts +183 -0
  49. package/references/agent-inbox/src/types.ts +303 -0
  50. package/references/agent-inbox/test/federation/address.test.ts +101 -0
  51. package/references/agent-inbox/test/federation/connection-manager.test.ts +546 -0
  52. package/references/agent-inbox/test/federation/delivery-queue.test.ts +159 -0
  53. package/references/agent-inbox/test/federation/integration.test.ts +857 -0
  54. package/references/agent-inbox/test/federation/routing-engine.test.ts +117 -0
  55. package/references/agent-inbox/test/federation/sdk-integration.test.ts +744 -0
  56. package/references/agent-inbox/test/federation/trust.test.ts +89 -0
  57. package/references/agent-inbox/test/ipc-jsonrpc.test.ts +113 -0
  58. package/references/agent-inbox/test/ipc-server.test.ts +197 -0
  59. package/references/agent-inbox/test/mail-server.test.ts +285 -0
  60. package/references/agent-inbox/test/map-client.test.ts +408 -0
  61. package/references/agent-inbox/test/mesh/delivery-bridge.test.ts +178 -0
  62. package/references/agent-inbox/test/mesh/e2e-mesh.test.ts +527 -0
  63. package/references/agent-inbox/test/mesh/e2e-real-meshpeer.test.ts +629 -0
  64. package/references/agent-inbox/test/mesh/federation-mesh.test.ts +269 -0
  65. package/references/agent-inbox/test/mesh/mesh-connector.test.ts +66 -0
  66. package/references/agent-inbox/test/mesh/mesh-transport.test.ts +191 -0
  67. package/references/agent-inbox/test/mesh/meshpeer-integration.test.ts +442 -0
  68. package/references/agent-inbox/test/mesh/mock-mesh.ts +125 -0
  69. package/references/agent-inbox/test/mesh/mock-meshpeer.ts +266 -0
  70. package/references/agent-inbox/test/mesh/type-mapper.test.ts +226 -0
  71. package/references/agent-inbox/test/message-router.test.ts +184 -0
  72. package/references/agent-inbox/test/push-notifier.test.ts +139 -0
  73. package/references/agent-inbox/test/registry/warm-registry.test.ts +171 -0
  74. package/references/agent-inbox/test/sqlite-prefix.test.ts +192 -0
  75. package/references/agent-inbox/test/sqlite-storage.test.ts +243 -0
  76. package/references/agent-inbox/test/storage.test.ts +196 -0
  77. package/references/agent-inbox/test/traceability.test.ts +123 -0
  78. package/references/agent-inbox/test/wake.test.ts +330 -0
  79. package/references/agent-inbox/tsconfig.json +20 -0
  80. package/references/agent-inbox/tsup.config.ts +10 -0
  81. package/references/agent-inbox/vitest.config.ts +8 -0
  82. package/references/minimem/.claude/settings.json +7 -0
  83. package/references/minimem/.sudocode/issues.jsonl +18 -0
  84. package/references/minimem/.sudocode/specs.jsonl +1 -0
  85. package/references/minimem/CLAUDE.md +329 -0
  86. package/references/minimem/README.md +565 -0
  87. package/references/minimem/claude-plugin/.claude-plugin/plugin.json +10 -0
  88. package/references/minimem/claude-plugin/.mcp.json +7 -0
  89. package/references/minimem/claude-plugin/README.md +158 -0
  90. package/references/minimem/claude-plugin/commands/recall.md +47 -0
  91. package/references/minimem/claude-plugin/commands/remember.md +41 -0
  92. package/references/minimem/claude-plugin/hooks/__tests__/hooks.test.ts +272 -0
  93. package/references/minimem/claude-plugin/hooks/hooks.json +27 -0
  94. package/references/minimem/claude-plugin/hooks/session-end.sh +86 -0
  95. package/references/minimem/claude-plugin/hooks/session-start.sh +85 -0
  96. package/references/minimem/claude-plugin/skills/memory/SKILL.md +108 -0
  97. package/references/minimem/media/banner.png +0 -0
  98. package/references/minimem/package-lock.json +5373 -0
  99. package/references/minimem/package.json +76 -0
  100. package/references/minimem/scripts/postbuild.js +49 -0
  101. package/references/minimem/src/__tests__/edge-cases.test.ts +371 -0
  102. package/references/minimem/src/__tests__/errors.test.ts +265 -0
  103. package/references/minimem/src/__tests__/helpers.ts +199 -0
  104. package/references/minimem/src/__tests__/internal.test.ts +407 -0
  105. package/references/minimem/src/__tests__/knowledge-frontmatter.test.ts +148 -0
  106. package/references/minimem/src/__tests__/knowledge.test.ts +148 -0
  107. package/references/minimem/src/__tests__/minimem.integration.test.ts +1127 -0
  108. package/references/minimem/src/__tests__/session.test.ts +190 -0
  109. package/references/minimem/src/cli/__tests__/commands.test.ts +760 -0
  110. package/references/minimem/src/cli/__tests__/contained-layout.test.ts +286 -0
  111. package/references/minimem/src/cli/commands/__tests__/conflicts.test.ts +141 -0
  112. package/references/minimem/src/cli/commands/append.ts +76 -0
  113. package/references/minimem/src/cli/commands/config.ts +262 -0
  114. package/references/minimem/src/cli/commands/conflicts.ts +415 -0
  115. package/references/minimem/src/cli/commands/daemon.ts +169 -0
  116. package/references/minimem/src/cli/commands/index.ts +12 -0
  117. package/references/minimem/src/cli/commands/init.ts +166 -0
  118. package/references/minimem/src/cli/commands/mcp.ts +221 -0
  119. package/references/minimem/src/cli/commands/push-pull.ts +213 -0
  120. package/references/minimem/src/cli/commands/search.ts +223 -0
  121. package/references/minimem/src/cli/commands/status.ts +84 -0
  122. package/references/minimem/src/cli/commands/store.ts +189 -0
  123. package/references/minimem/src/cli/commands/sync-init.ts +290 -0
  124. package/references/minimem/src/cli/commands/sync.ts +70 -0
  125. package/references/minimem/src/cli/commands/upsert.ts +197 -0
  126. package/references/minimem/src/cli/config.ts +611 -0
  127. package/references/minimem/src/cli/index.ts +299 -0
  128. package/references/minimem/src/cli/shared.ts +189 -0
  129. package/references/minimem/src/cli/sync/__tests__/central.test.ts +152 -0
  130. package/references/minimem/src/cli/sync/__tests__/conflicts.test.ts +209 -0
  131. package/references/minimem/src/cli/sync/__tests__/daemon.test.ts +118 -0
  132. package/references/minimem/src/cli/sync/__tests__/detection.test.ts +207 -0
  133. package/references/minimem/src/cli/sync/__tests__/integration.test.ts +476 -0
  134. package/references/minimem/src/cli/sync/__tests__/registry.test.ts +363 -0
  135. package/references/minimem/src/cli/sync/__tests__/state.test.ts +255 -0
  136. package/references/minimem/src/cli/sync/__tests__/validation.test.ts +193 -0
  137. package/references/minimem/src/cli/sync/__tests__/watcher.test.ts +178 -0
  138. package/references/minimem/src/cli/sync/central.ts +292 -0
  139. package/references/minimem/src/cli/sync/conflicts.ts +205 -0
  140. package/references/minimem/src/cli/sync/daemon.ts +407 -0
  141. package/references/minimem/src/cli/sync/detection.ts +138 -0
  142. package/references/minimem/src/cli/sync/index.ts +107 -0
  143. package/references/minimem/src/cli/sync/operations.ts +373 -0
  144. package/references/minimem/src/cli/sync/registry.ts +279 -0
  145. package/references/minimem/src/cli/sync/state.ts +358 -0
  146. package/references/minimem/src/cli/sync/validation.ts +206 -0
  147. package/references/minimem/src/cli/sync/watcher.ts +237 -0
  148. package/references/minimem/src/cli/version.ts +34 -0
  149. package/references/minimem/src/core/index.ts +9 -0
  150. package/references/minimem/src/core/indexer.ts +628 -0
  151. package/references/minimem/src/core/searcher.ts +221 -0
  152. package/references/minimem/src/db/schema.ts +183 -0
  153. package/references/minimem/src/db/sqlite-vec.ts +24 -0
  154. package/references/minimem/src/embeddings/__tests__/embeddings.test.ts +431 -0
  155. package/references/minimem/src/embeddings/batch-gemini.ts +392 -0
  156. package/references/minimem/src/embeddings/batch-openai.ts +409 -0
  157. package/references/minimem/src/embeddings/embeddings.ts +434 -0
  158. package/references/minimem/src/index.ts +132 -0
  159. package/references/minimem/src/internal.ts +299 -0
  160. package/references/minimem/src/minimem.ts +1291 -0
  161. package/references/minimem/src/search/__tests__/hybrid.test.ts +247 -0
  162. package/references/minimem/src/search/graph.ts +234 -0
  163. package/references/minimem/src/search/hybrid.ts +151 -0
  164. package/references/minimem/src/search/search.ts +256 -0
  165. package/references/minimem/src/server/__tests__/mcp.test.ts +347 -0
  166. package/references/minimem/src/server/__tests__/tools.test.ts +364 -0
  167. package/references/minimem/src/server/mcp.ts +326 -0
  168. package/references/minimem/src/server/tools.ts +720 -0
  169. package/references/minimem/src/session.ts +460 -0
  170. package/references/minimem/src/store/__tests__/manifest.test.ts +177 -0
  171. package/references/minimem/src/store/__tests__/materialize.test.ts +52 -0
  172. package/references/minimem/src/store/__tests__/store-graph.test.ts +228 -0
  173. package/references/minimem/src/store/index.ts +27 -0
  174. package/references/minimem/src/store/manifest.ts +203 -0
  175. package/references/minimem/src/store/materialize.ts +185 -0
  176. package/references/minimem/src/store/store-graph.ts +252 -0
  177. package/references/minimem/tsconfig.json +19 -0
  178. package/references/minimem/tsup.config.ts +26 -0
  179. package/references/minimem/vitest.config.ts +29 -0
  180. package/references/openteams/src/cli/generate.ts +23 -1
  181. package/references/openteams/src/generators/agent-prompt-generator.test.ts +94 -0
  182. package/references/openteams/src/generators/agent-prompt-generator.ts +42 -13
  183. package/references/openteams/src/generators/package-generator.ts +9 -1
  184. package/references/openteams/src/generators/skill-generator.test.ts +28 -0
  185. package/references/openteams/src/generators/skill-generator.ts +10 -4
  186. package/references/skill-tree/.claude/settings.json +6 -0
  187. package/references/skill-tree/.sudocode/issues.jsonl +19 -0
  188. package/references/skill-tree/.sudocode/specs.jsonl +3 -0
  189. package/references/skill-tree/CLAUDE.md +132 -0
  190. package/references/skill-tree/README.md +396 -0
  191. package/references/skill-tree/docs/GAPS_v1.md +221 -0
  192. package/references/skill-tree/docs/INTEGRATION_PLAN.md +467 -0
  193. package/references/skill-tree/docs/TODOS.md +91 -0
  194. package/references/skill-tree/docs/anthropic_skill_guide.md +1364 -0
  195. package/references/skill-tree/docs/design/federated-skill-trees.md +524 -0
  196. package/references/skill-tree/docs/design/multi-agent-sync.md +759 -0
  197. package/references/skill-tree/docs/scraper/BRAINSTORM.md +583 -0
  198. package/references/skill-tree/docs/scraper/POC_PLAN.md +420 -0
  199. package/references/skill-tree/docs/scraper/README.md +170 -0
  200. package/references/skill-tree/examples/basic-usage.ts +157 -0
  201. package/references/skill-tree/package-lock.json +1852 -0
  202. package/references/skill-tree/package.json +66 -0
  203. package/references/skill-tree/plan.md +78 -0
  204. package/references/skill-tree/scraper/README.md +123 -0
  205. package/references/skill-tree/scraper/docs/DESIGN.md +683 -0
  206. package/references/skill-tree/scraper/docs/PLAN.md +336 -0
  207. package/references/skill-tree/scraper/drizzle.config.ts +10 -0
  208. package/references/skill-tree/scraper/package-lock.json +6329 -0
  209. package/references/skill-tree/scraper/package.json +68 -0
  210. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-description.md +7 -0
  211. package/references/skill-tree/scraper/test/fixtures/invalid-skill/missing-name.md +7 -0
  212. package/references/skill-tree/scraper/test/fixtures/minimal-skill/SKILL.md +27 -0
  213. package/references/skill-tree/scraper/test/fixtures/skill-json/SKILL.json +21 -0
  214. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/SKILL.md +54 -0
  215. package/references/skill-tree/scraper/test/fixtures/skill-with-meta/_meta.json +24 -0
  216. package/references/skill-tree/scraper/test/fixtures/valid-skill/SKILL.md +93 -0
  217. package/references/skill-tree/scraper/test/fixtures/valid-skill/_meta.json +22 -0
  218. package/references/skill-tree/scraper/tsup.config.ts +14 -0
  219. package/references/skill-tree/scraper/vitest.config.ts +17 -0
  220. package/references/skill-tree/scripts/convert-to-vitest.ts +166 -0
  221. package/references/skill-tree/skills/skill-writer/SKILL.md +339 -0
  222. package/references/skill-tree/skills/skill-writer/references/examples.md +326 -0
  223. package/references/skill-tree/skills/skill-writer/references/patterns.md +210 -0
  224. package/references/skill-tree/skills/skill-writer/references/quality-checklist.md +123 -0
  225. package/references/skill-tree/test/run-all.ts +106 -0
  226. package/references/skill-tree/test/utils.ts +128 -0
  227. package/references/skill-tree/vitest.config.ts +16 -0
  228. package/references/swarmkit/src/commands/init/phases/configure.ts +0 -22
  229. package/references/swarmkit/src/commands/init/phases/global-setup.ts +5 -3
  230. package/references/swarmkit/src/commands/init/wizard.ts +2 -2
  231. package/references/swarmkit/src/packages/setup.test.ts +53 -7
  232. package/references/swarmkit/src/packages/setup.ts +37 -1
  233. package/scripts/bootstrap.mjs +26 -1
  234. package/scripts/generate-agents.mjs +5 -1
  235. package/scripts/map-hook.mjs +97 -64
  236. package/scripts/map-sidecar.mjs +179 -25
  237. package/scripts/team-loader.mjs +12 -41
  238. package/skills/swarm/SKILL.md +89 -25
  239. package/src/__tests__/agent-generator.test.mjs +6 -13
  240. package/src/__tests__/bootstrap.test.mjs +124 -1
  241. package/src/__tests__/config.test.mjs +200 -27
  242. package/src/__tests__/e2e-live-map.test.mjs +536 -0
  243. package/src/__tests__/e2e-mesh-sidecar.test.mjs +570 -0
  244. package/src/__tests__/e2e-native-task-hooks.test.mjs +376 -0
  245. package/src/__tests__/e2e-sidecar-bridge.test.mjs +477 -0
  246. package/src/__tests__/helpers.mjs +13 -0
  247. package/src/__tests__/inbox.test.mjs +22 -89
  248. package/src/__tests__/index.test.mjs +35 -9
  249. package/src/__tests__/integration.test.mjs +513 -0
  250. package/src/__tests__/map-events.test.mjs +514 -150
  251. package/src/__tests__/mesh-connection.test.mjs +308 -0
  252. package/src/__tests__/opentasks-client.test.mjs +517 -0
  253. package/src/__tests__/paths.test.mjs +185 -41
  254. package/src/__tests__/sidecar-client.test.mjs +35 -0
  255. package/src/__tests__/sidecar-server.test.mjs +124 -0
  256. package/src/__tests__/skilltree-client.test.mjs +80 -0
  257. package/src/agent-generator.mjs +104 -33
  258. package/src/bootstrap.mjs +150 -10
  259. package/src/config.mjs +81 -17
  260. package/src/context-output.mjs +58 -8
  261. package/src/inbox.mjs +9 -54
  262. package/src/index.mjs +39 -8
  263. package/src/map-connection.mjs +4 -3
  264. package/src/map-events.mjs +350 -80
  265. package/src/mesh-connection.mjs +148 -0
  266. package/src/opentasks-client.mjs +269 -0
  267. package/src/paths.mjs +182 -27
  268. package/src/sessionlog.mjs +14 -9
  269. package/src/sidecar-client.mjs +81 -27
  270. package/src/sidecar-server.mjs +175 -16
  271. package/src/skilltree-client.mjs +173 -0
  272. package/src/template.mjs +68 -4
  273. package/vitest.config.mjs +1 -0
@@ -0,0 +1,329 @@
1
+ # CLAUDE.md
2
+
3
+ This file provides context for AI agents working on the minimem codebase.
4
+
5
+ ## Project Overview
6
+
7
+ **minimem** is a file-based memory system with vector search for AI agents. It lets users store memories as Markdown files and search them semantically using embeddings.
8
+
9
+ **Key value props:**
10
+ - Plain Markdown files (git-friendly, human-readable)
11
+ - Semantic search via embeddings (OpenAI, Gemini, or local)
12
+ - Hybrid search combining vectors + full-text (BM25)
13
+ - MCP server for Claude Desktop/Cursor integration
14
+ - CLI for command-line usage
15
+
16
+ ## Architecture
17
+
18
+ ```
19
+ src/
20
+ ├── minimem.ts # Main Minimem class - core logic
21
+ ├── internal.ts # Utilities: chunking, hashing, file listing
22
+ ├── index.ts # Public exports
23
+ ├── cli/ # CLI implementation
24
+ │ ├── index.ts # Entry point, command registration
25
+ │ ├── config.ts # Config loading, directory resolution
26
+ │ └── commands/ # Individual command implementations
27
+ ├── db/ # Database layer
28
+ │ ├── schema.ts # SQLite schema creation (v4)
29
+ │ └── sqlite-vec.ts # Vector extension loading
30
+ ├── embeddings/ # Embedding providers
31
+ │ ├── embeddings.ts # Provider factory and interfaces
32
+ │ ├── batch-openai.ts # OpenAI batch embedding
33
+ │ └── batch-gemini.ts # Gemini batch embedding
34
+ ├── search/ # Search implementation
35
+ │ ├── hybrid.ts # Hybrid vector+FTS search, BM25
36
+ │ ├── search.ts # Knowledge-filtered search helpers
37
+ │ └── graph.ts # Knowledge graph traversal (BFS)
38
+ └── server/ # MCP server
39
+ ├── mcp.ts # MCP protocol implementation
40
+ └── tools.ts # Tool definitions for LLM integration
41
+ ```
42
+
43
+ ## Key Files
44
+
45
+ | File | Purpose |
46
+ |------|---------|
47
+ | `src/minimem.ts` | Core class with search, sync, append, knowledge methods |
48
+ | `src/internal.ts` | `chunkMarkdown()`, `hashText()`, `listMemoryFiles()` |
49
+ | `src/session.ts` | Frontmatter parsing/serialization (incl. knowledge fields) |
50
+ | `src/cli/commands/search.ts` | Multi-directory search implementation |
51
+ | `src/cli/commands/init.ts` | Init command: scaffolds dir, materializes stores, runs initial sync |
52
+ | `src/cli/commands/store.ts` | Store commands: add, remove, link, unlink (materializes on add) |
53
+ | `src/store/manifest.ts` | Store manifest: registration, linking, resolution |
54
+ | `src/store/materialize.ts` | Store materialization: local symlink or remote git clone |
55
+ | `src/embeddings/embeddings.ts` | `createEmbeddingProvider()` factory |
56
+ | `src/search/hybrid.ts` | `mergeHybridResults()`, BM25 scoring |
57
+ | `src/search/search.ts` | `buildKnowledgeFilterSql()` for metadata filtering |
58
+ | `src/search/graph.ts` | `getLinksFrom()`, `getLinksTo()`, `getNeighbors()`, `getPathBetween()` |
59
+ | `src/server/mcp.ts` | MCP server for Claude Desktop integration |
60
+ | `src/server/tools.ts` | MCP tool definitions (memory + knowledge) |
61
+
62
+ ## Development Commands
63
+
64
+ ```bash
65
+ npm run build # Build library and CLI
66
+ npm run dev # Watch mode
67
+ npm run test # Unit tests (vitest)
68
+ npm run test:cli # CLI command tests
69
+ npm run test:integration # E2E integration tests
70
+ npm run test:all # All tests
71
+ ```
72
+
73
+ ## Testing
74
+
75
+ Tests are in `__tests__/` directories alongside source:
76
+
77
+ - `src/__tests__/minimem.integration.test.ts` - Full E2E with mock embeddings
78
+ - `src/__tests__/knowledge.test.ts` - Knowledge frontmatter parsing + graph traversal
79
+ - `src/cli/__tests__/commands.test.ts` - CLI command tests
80
+ - `src/embeddings/__tests__/` - Embedding provider tests
81
+ - `src/search/__tests__/` - Hybrid search tests
82
+ - `src/server/__tests__/` - MCP server + knowledge tool tests
83
+
84
+ **Mock embeddings:** Tests use deterministic embeddings based on keyword presence (no API calls needed). See `createDeterministicEmbedding()` in test files.
85
+
86
+ ## Build System
87
+
88
+ - **tsup** for bundling (ESM only, Node 22+)
89
+ - Library: `dist/index.js` with types
90
+ - CLI: `dist/cli/index.js` (bundled with shebang)
91
+ - **postbuild** script fixes `node:sqlite` import (esbuild strips `node:` prefix)
92
+
93
+ ## Important Patterns
94
+
95
+ ### Memory Path Validation
96
+ Only `MEMORY.md` and `memory/*.md` files are indexed. The `validateMemoryPath()` method enforces this.
97
+
98
+ ### Embedding Cache
99
+ Embeddings are cached by content hash in SQLite. Same content = same embedding, even across files.
100
+
101
+ ### Hybrid Search
102
+ Default weights: 70% vector similarity, 30% BM25 text search. Configurable via `hybrid.vectorWeight` and `hybrid.textWeight`.
103
+
104
+ ### Multi-Directory Search
105
+ The search command can query multiple directories:
106
+ ```bash
107
+ minimem search "query" --dir ~/a --dir ~/b --global
108
+ ```
109
+ Results are merged and sorted by score.
110
+
111
+ ### Init Lifecycle
112
+ `minimem init` does three things in order:
113
+ 1. **Scaffold** — creates `MEMORY.md`, `config.json`, `.gitignore`, `memory/` dir
114
+ 2. **Materialize linked stores** — if this directory is registered in the store manifest with links, materializes them (clones remotes into `~/.cache/minimem/stores/`)
115
+ 3. **Initial sync** — creates the SQLite DB and indexes existing memory files (non-fatal if no API key is set)
116
+
117
+ ### Store Materialization
118
+ Stores are materialized eagerly in two places:
119
+ - **`init`** — materializes all linked stores after scaffolding
120
+ - **`store:add`** — materializes the store immediately after registration (clones remote if local path doesn't exist)
121
+
122
+ Materialization strategies:
123
+ - **Local** — store path exists on disk → use directly
124
+ - **Remote** — clone/fetch git remote into `~/.cache/minimem/stores/<name>/`
125
+
126
+ ## Common Tasks
127
+
128
+ ### Adding a new CLI command
129
+
130
+ 1. Create `src/cli/commands/newcmd.ts`:
131
+ ```typescript
132
+ export type NewCmdOptions = { dir?: string; global?: boolean; };
133
+
134
+ export async function newcmd(options: NewCmdOptions): Promise<void> {
135
+ const memoryDir = resolveMemoryDir({ dir: options.dir, global: options.global });
136
+ // ... implementation
137
+ }
138
+ ```
139
+
140
+ 2. Export from `src/cli/commands/index.ts`
141
+
142
+ 3. Register in `src/cli/index.ts`:
143
+ ```typescript
144
+ program
145
+ .command("newcmd")
146
+ .description("Description")
147
+ .option("-d, --dir <path>", "Memory directory")
148
+ .action(newcmd);
149
+ ```
150
+
151
+ 4. Add tests in `src/cli/__tests__/commands.test.ts`
152
+
153
+ ### Adding a new embedding provider
154
+
155
+ 1. Add provider type to `EmbeddingProviderOptions` in `src/embeddings/embeddings.ts`
156
+ 2. Implement in `createEmbeddingProvider()` switch statement
157
+ 3. Add batch function in `src/embeddings/batch-{provider}.ts` if needed
158
+ 4. Update `auto` provider detection logic
159
+
160
+ ### Modifying the database schema
161
+
162
+ 1. Update `createSchema()` in `src/db/schema.ts` (currently at SCHEMA_VERSION 4)
163
+ 2. Consider migration strategy (currently: recreate on schema change)
164
+ 3. Update relevant queries in `src/minimem.ts`
165
+ 4. If adding knowledge-related columns, update `indexKnowledgeMetadata()` in `src/minimem.ts`
166
+
167
+ ## Gotchas
168
+
169
+ 1. **node:sqlite is experimental** - Requires Node 22+, shows warning on every run
170
+ 2. **sqlite-vec may not load** - Falls back to FTS-only search if extension fails
171
+ 3. **CLI bundle strips node: prefix** - postbuild script fixes this
172
+ 4. **Commander.js is CJS** - Must be external in CLI bundle, not inlined
173
+
174
+ ## Environment Variables
175
+
176
+ | Variable | Purpose |
177
+ |----------|---------|
178
+ | `OPENAI_API_KEY` | OpenAI embeddings |
179
+ | `GOOGLE_API_KEY` | Gemini embeddings |
180
+ | `GEMINI_API_KEY` | Alternative Gemini key |
181
+ | `MEMORY_DIR` | Default memory directory |
182
+
183
+ ## File Structure Convention
184
+
185
+ ```
186
+ project/
187
+ ├── MEMORY.md # Main memory (required for init)
188
+ ├── memory/ # Additional memories
189
+ │ ├── YYYY-MM-DD.md # Daily logs (from append)
190
+ │ └── *.md # Topic files
191
+ └── .minimem/
192
+ ├── config.json # User config
193
+ ├── index.db # SQLite with vectors
194
+ └── .gitignore # Ignores index.db
195
+ ```
196
+
197
+ ## MCP Integration
198
+
199
+ The MCP server exposes 5 tools over stdio, compatible with Claude Desktop and Cursor:
200
+
201
+ | Tool | Purpose |
202
+ |------|---------|
203
+ | `memory_search` | General semantic search across all memory files |
204
+ | `memory_get_details` | Retrieve full content of a specific memory file |
205
+ | `knowledge_search` | Search knowledge notes with domain/entity/confidence/type filters |
206
+ | `knowledge_graph` | Traverse knowledge graph relationships from a note |
207
+ | `knowledge_path` | Find shortest path between two knowledge notes via graph links |
208
+
209
+ The 3 `knowledge_*` tools are additive — they only return results when knowledge-formatted notes (with the frontmatter convention below) are present. Without knowledge notes, they return empty results.
210
+
211
+ Config location for Claude Desktop:
212
+ - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
213
+ - Windows: `%APPDATA%\Claude\claude_desktop_config.json`
214
+
215
+ ## Claude Code Plugin
216
+
217
+ The `claude-plugin/` directory contains a ready-to-use Claude Code plugin:
218
+
219
+ ```
220
+ claude-plugin/
221
+ ├── .claude-plugin/
222
+ │ └── plugin.json # Plugin manifest
223
+ ├── .mcp.json # MCP server definition (uses npx minimem mcp)
224
+ ├── skills/
225
+ │ └── memory/
226
+ │ └── SKILL.md # Auto-invoked memory skill
227
+ └── commands/
228
+ ├── remember.md # /minimem:remember command
229
+ └── recall.md # /minimem:recall command
230
+ ```
231
+
232
+ ### Testing the Plugin
233
+
234
+ ```bash
235
+ claude --plugin-dir ./claude-plugin
236
+ ```
237
+
238
+ ### Plugin Commands
239
+
240
+ - `/minimem:remember <text>` - Store information in memory
241
+ - `/minimem:recall <query>` - Search for stored memories
242
+
243
+ ## Knowledge Frontmatter Convention
244
+
245
+ minimem can index structured knowledge notes produced by external systems (e.g., cognitive-core). This is a **file-format convention only** — minimem does not import or depend on any external package.
246
+
247
+ When a memory file's YAML frontmatter contains knowledge-specific fields, minimem parses them and populates metadata columns in the `chunks` table and edges in the `knowledge_links` table.
248
+
249
+ ### Supported fields
250
+
251
+ All fields are optional. If absent, the file is treated as a regular memory note.
252
+
253
+ ```yaml
254
+ ---
255
+ id: k-abc123 # Unique knowledge node ID
256
+ type: observation # observation | entity | domain-summary
257
+ domain: [database, devops] # Domain tags
258
+ entities: [prisma, postgres] # Referenced entities
259
+ confidence: 0.85 # Confidence score (0.0–1.0)
260
+ source: # Provenance metadata
261
+ origin: extracted # extracted | agent-authored
262
+ trajectories: [t-001, t-002] # Source trajectory IDs
263
+ agentId: agent-v1 # Authoring agent
264
+ links: # Graph edges to other knowledge nodes
265
+ - target: k-other
266
+ relation: related-to # related-to | depends-on | supports | etc.
267
+ layer: semantic # semantic | temporal | causal | entity
268
+ - target: k-dep
269
+ relation: depends-on
270
+ created: 2025-01-15T10:00:00Z
271
+ updated: 2025-01-15T12:00:00Z
272
+ supersedes: k-old # ID of note this replaces
273
+ tags: [migration, patterns]
274
+ ---
275
+ # Note Title
276
+
277
+ Body content in Markdown.
278
+ ```
279
+
280
+ ### How it works
281
+
282
+ 1. **Indexing** (`indexFile()`): When a file is indexed, frontmatter is parsed via `parseFrontmatter()`. If `type` is present, the chunk row gets `knowledge_type`, `knowledge_id`, `domains` (JSON), `entities` (JSON), and `confidence` populated. If `links` is present, rows are upserted into `knowledge_links`.
283
+
284
+ 2. **Filtered search** (`knowledgeSearch()`): Accepts `domain`, `entities`, `minConfidence`, and `knowledgeType` filters. Uses `json_each()` SQL for array column matching. Falls back to regular search when no filters are provided.
285
+
286
+ 3. **Graph traversal** (`src/search/graph.ts`): Operates on the `knowledge_links` table. Supports outgoing/incoming edge queries, BFS neighbor discovery (configurable depth), and shortest-path finding.
287
+
288
+ 4. **Re-indexing**: When a file changes, old `knowledge_links` for that file are deleted before new ones are inserted, keeping the graph consistent.
289
+
290
+ ### Independence guarantee
291
+
292
+ - minimem defines its own types (`KnowledgeSource`, `KnowledgeLink`, `MemoryFrontmatter`) locally in `src/session.ts`
293
+ - Zero imports from cognitive-core or any external knowledge system
294
+ - All knowledge columns are nullable — regular memory files index without them
295
+ - The `knowledge_links` table only gets rows when frontmatter contains `links`
296
+ - All knowledge MCP tools (`knowledge_search`, `knowledge_graph`, `knowledge_path`) are additive alongside existing tools
297
+
298
+ ### Database schema (v4)
299
+
300
+ Knowledge-related additions to the schema:
301
+
302
+ ```sql
303
+ -- Added columns on chunks table (all nullable)
304
+ knowledge_type TEXT -- 'observation', 'entity', 'domain-summary'
305
+ knowledge_id TEXT -- Note ID from frontmatter
306
+ domains TEXT -- JSON array of domain strings
307
+ entities TEXT -- JSON array of entity strings
308
+ confidence REAL -- 0.0–1.0
309
+
310
+ -- New table for graph edges
311
+ CREATE TABLE knowledge_links (
312
+ from_id TEXT NOT NULL,
313
+ to_id TEXT NOT NULL,
314
+ relation TEXT NOT NULL,
315
+ layer TEXT, -- semantic, temporal, causal, entity
316
+ weight REAL DEFAULT 0.5,
317
+ source_path TEXT,
318
+ created_at INTEGER DEFAULT (unixepoch()),
319
+ PRIMARY KEY (from_id, to_id, relation)
320
+ );
321
+ ```
322
+
323
+ ## Code Style
324
+
325
+ - TypeScript with strict mode
326
+ - ESM modules (no CommonJS)
327
+ - Async/await for all I/O
328
+ - Types exported alongside implementations
329
+ - Tests use Node.js native test runner (not vitest) for integration tests