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,565 @@
1
+ <div align="center">
2
+ <picture>
3
+ <img alt="minimem banner" src="https://raw.githubusercontent.com/alexngai/minimem/main/media/banner.png">
4
+ </picture>
5
+ </div>
6
+
7
+ # minimem
8
+
9
+ A lightweight, file-based memory system with vector search for AI agents.
10
+
11
+ Turn your filesystem into a searchable knowledge base. Write memories in Markdown, search them semantically.
12
+
13
+ ## Features
14
+
15
+ - **File-based storage** - Memories are plain Markdown files you can edit, version with git, and sync anywhere
16
+ - **Semantic search** - Find relevant memories using natural language queries powered by embeddings
17
+ - **Hybrid search** - Combines vector similarity with full-text search (BM25) for better results
18
+ - **Multiple embedding providers** - OpenAI, Google Gemini, or local models via llama.cpp
19
+ - **MCP server** - Integrate with Claude Desktop, Cursor, and other MCP-compatible tools
20
+ - **CLI tool** - Initialize, search, sync, and manage memories from the command line
21
+ - **Multi-directory search** - Search across multiple memory banks in a single query
22
+
23
+ ## Installation
24
+
25
+ ```bash
26
+ npm install minimem
27
+ ```
28
+
29
+ Or install globally for CLI usage:
30
+
31
+ ```bash
32
+ npm install -g minimem
33
+ ```
34
+
35
+ Requires Node.js 22+ (uses experimental `node:sqlite`).
36
+
37
+ ## Quick Start
38
+
39
+ ### CLI Usage
40
+
41
+ ```bash
42
+ # Set your embedding API key
43
+ export OPENAI_API_KEY=your-key
44
+ # or: export GOOGLE_API_KEY=your-key
45
+
46
+ # Initialize a memory directory (creates files, DB, and indexes in one step)
47
+ minimem init ~/memories
48
+
49
+ # Add some memories
50
+ minimem append "Decided to use PostgreSQL for the main database" --dir ~/memories
51
+
52
+ # Search your memories
53
+ minimem search "database decisions" --dir ~/memories
54
+
55
+ # Create or update a memory file
56
+ minimem upsert "memory/architecture.md" "# Architecture Notes..." --dir ~/memories
57
+ ```
58
+
59
+ ### Library Usage
60
+
61
+ ```typescript
62
+ import { Minimem } from 'minimem';
63
+
64
+ // Create a Minimem instance
65
+ const mem = await Minimem.create({
66
+ memoryDir: './memories',
67
+ embedding: {
68
+ provider: 'openai',
69
+ openai: { apiKey: process.env.OPENAI_API_KEY }
70
+ }
71
+ });
72
+
73
+ // Search memories
74
+ const results = await mem.search('database architecture');
75
+ for (const result of results) {
76
+ console.log(`[${result.score}] ${result.path}:${result.startLine}`);
77
+ console.log(result.snippet);
78
+ }
79
+
80
+ // Append to today's log
81
+ await mem.appendToday('Reviewed the API design document');
82
+
83
+ // Clean up
84
+ mem.close();
85
+ ```
86
+
87
+ ## CLI Commands
88
+
89
+ | Command | Description |
90
+ |---------|-------------|
91
+ | `minimem init [dir]` | Initialize a memory directory (creates files, DB, and indexes) |
92
+ | `minimem search <query>` | Semantic search through memories |
93
+ | `minimem sync` | Force re-index memory files |
94
+ | `minimem status` | Show index stats and provider info |
95
+ | `minimem append <text>` | Append to today's daily log |
96
+ | `minimem upsert <file> [content]` | Create or update a memory file |
97
+ | `minimem mcp` | Run as MCP server (stdio) |
98
+ | `minimem store:add <name> <path>` | Register a store in the global manifest |
99
+ | `minimem store:list` | List all registered stores and their links |
100
+ | `minimem store:link <store> <target>` | Link a store to another for cross-store search |
101
+
102
+ ### Common Options
103
+
104
+ - `-d, --dir <path>` - Memory directory (default: current directory)
105
+ - `-g, --global` - Use `~/.minimem` as the memory directory
106
+ - `-p, --provider <name>` - Embedding provider: `openai`, `gemini`, `local`, or `auto`
107
+
108
+ ### Search Options
109
+
110
+ ```bash
111
+ # Search with options
112
+ minimem search "project decisions" \
113
+ --dir ~/memories \
114
+ --max 5 \
115
+ --min-score 0.5 \
116
+ --json
117
+
118
+ # Search multiple directories
119
+ minimem search "api design" \
120
+ --dir ~/work-memories \
121
+ --dir ~/personal-notes \
122
+ --global
123
+ ```
124
+
125
+ ### Upsert Examples
126
+
127
+ ```bash
128
+ # Create/update with inline content
129
+ minimem upsert "notes.md" "# My Notes" --dir ~/memories
130
+
131
+ # Pipe content from stdin
132
+ cat document.md | minimem upsert "imported.md" --stdin --dir ~/memories
133
+
134
+ # Use heredoc for multi-line content
135
+ minimem upsert "memory/decisions.md" --stdin --dir ~/memories << 'EOF'
136
+ # Architecture Decisions
137
+
138
+ ## Database
139
+ We chose PostgreSQL for its reliability and JSON support.
140
+
141
+ ## API
142
+ REST with OpenAPI documentation.
143
+ EOF
144
+ ```
145
+
146
+ ## Memory Directory Structure
147
+
148
+ ```
149
+ my-memories/
150
+ ├── MEMORY.md # Main memory file (indexed)
151
+ ├── memory/ # Additional memory files
152
+ │ ├── 2024-01-15.md # Daily logs
153
+ │ ├── 2024-01-16.md
154
+ │ └── projects.md # Topic-specific notes
155
+ └── .minimem/ # Internal data (gitignored)
156
+ ├── config.json # Configuration
157
+ └── index.db # SQLite database with vectors
158
+ ```
159
+
160
+ ## Configuration
161
+
162
+ Configuration is stored in `.minimem/config.json`:
163
+
164
+ ```json
165
+ {
166
+ "embedding": {
167
+ "provider": "auto",
168
+ "model": "text-embedding-3-small"
169
+ },
170
+ "hybrid": {
171
+ "enabled": true,
172
+ "vectorWeight": 0.7,
173
+ "textWeight": 0.3
174
+ },
175
+ "query": {
176
+ "maxResults": 10,
177
+ "minScore": 0.3
178
+ }
179
+ }
180
+ ```
181
+
182
+ ### Environment Variables
183
+
184
+ | Variable | Description |
185
+ |----------|-------------|
186
+ | `OPENAI_API_KEY` | OpenAI API key for embeddings |
187
+ | `GOOGLE_API_KEY` | Google/Gemini API key for embeddings |
188
+ | `GEMINI_API_KEY` | Alternative Gemini API key |
189
+ | `MEMORY_DIR` | Default memory directory |
190
+
191
+ ### Embedding Providers
192
+
193
+ **OpenAI** (recommended for quality):
194
+ ```bash
195
+ export OPENAI_API_KEY=sk-...
196
+ minimem search "query" --provider openai
197
+ ```
198
+
199
+ **Gemini** (good free tier):
200
+ ```bash
201
+ export GOOGLE_API_KEY=...
202
+ minimem search "query" --provider gemini
203
+ ```
204
+
205
+ **Local** (no API needed, requires setup):
206
+ ```bash
207
+ minimem search "query" --provider local
208
+ ```
209
+
210
+ **Auto** (default): Tries OpenAI → Gemini → Local based on available API keys.
211
+
212
+ ## MCP Server Integration
213
+
214
+ minimem can run as an [MCP server](https://modelcontextprotocol.io/) for integration with Claude Desktop, Cursor, and other tools.
215
+
216
+ ### Claude Desktop
217
+
218
+ Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json`):
219
+
220
+ ```json
221
+ {
222
+ "mcpServers": {
223
+ "minimem": {
224
+ "command": "minimem",
225
+ "args": ["mcp", "--global"],
226
+ "env": {
227
+ "OPENAI_API_KEY": "your-key"
228
+ }
229
+ }
230
+ }
231
+ }
232
+ ```
233
+
234
+ ### Multiple Memory Directories
235
+
236
+ The MCP server supports searching across multiple memory directories:
237
+
238
+ ```json
239
+ {
240
+ "mcpServers": {
241
+ "minimem": {
242
+ "command": "minimem",
243
+ "args": ["mcp", "--dir", "/path/to/work", "--dir", "/path/to/personal", "--global"],
244
+ "env": {
245
+ "OPENAI_API_KEY": "your-key"
246
+ }
247
+ }
248
+ }
249
+ }
250
+ ```
251
+
252
+ When multiple directories are configured:
253
+ - The `memory_search` tool searches all directories by default
254
+ - Results are merged and ranked by score
255
+ - Each result shows which directory it came from
256
+ - Use the optional `directories` parameter to filter to specific directories
257
+
258
+ ### Cursor
259
+
260
+ Add to Cursor's MCP settings:
261
+
262
+ ```json
263
+ {
264
+ "mcpServers": {
265
+ "minimem": {
266
+ "command": "minimem",
267
+ "args": ["mcp", "--dir", "/path/to/memories"],
268
+ "env": {
269
+ "OPENAI_API_KEY": "your-key"
270
+ }
271
+ }
272
+ }
273
+ }
274
+ ```
275
+
276
+ ### Available MCP Tool
277
+
278
+ The MCP server exposes a `memory_search` tool:
279
+
280
+ ```typescript
281
+ {
282
+ name: "memory_search",
283
+ description: "Search through memory files using semantic search",
284
+ inputSchema: {
285
+ type: "object",
286
+ properties: {
287
+ query: { type: "string", description: "Search query" },
288
+ maxResults: { type: "number", description: "Max results (default: 10)" },
289
+ minScore: { type: "number", description: "Min score 0-1 (default: 0.3)" },
290
+ directories: {
291
+ type: "array",
292
+ items: { type: "string" },
293
+ description: "Filter to specific directories (searches all if omitted)"
294
+ }
295
+ },
296
+ required: ["query"]
297
+ }
298
+ }
299
+ ```
300
+
301
+ ## Library API
302
+
303
+ ### Creating an Instance
304
+
305
+ ```typescript
306
+ import { Minimem, type MinimemConfig } from 'minimem';
307
+
308
+ const config: MinimemConfig = {
309
+ memoryDir: './memories',
310
+ embedding: {
311
+ provider: 'openai',
312
+ openai: {
313
+ apiKey: process.env.OPENAI_API_KEY,
314
+ model: 'text-embedding-3-small' // or text-embedding-3-large
315
+ }
316
+ },
317
+ hybrid: {
318
+ enabled: true,
319
+ vectorWeight: 0.7,
320
+ textWeight: 0.3
321
+ },
322
+ watch: true, // Auto-sync on file changes
323
+ debug: console.log // Optional debug logging
324
+ };
325
+
326
+ const mem = await Minimem.create(config);
327
+ ```
328
+
329
+ ### Search
330
+
331
+ ```typescript
332
+ const results = await mem.search('database architecture', {
333
+ maxResults: 10,
334
+ minScore: 0.3
335
+ });
336
+
337
+ // Results include:
338
+ // - path: relative file path
339
+ // - snippet: matching text chunk
340
+ // - score: relevance score (0-1)
341
+ // - startLine, endLine: line numbers
342
+ // - heading: section heading if available
343
+ ```
344
+
345
+ ### File Operations
346
+
347
+ ```typescript
348
+ // Append to today's daily log (memory/YYYY-MM-DD.md)
349
+ await mem.appendToday('Meeting notes: discussed API design');
350
+
351
+ // Append to specific file
352
+ await mem.appendFile('memory/project.md', 'New decision made');
353
+
354
+ // List all memory files
355
+ const files = await mem.listFiles();
356
+
357
+ // Get status
358
+ const status = await mem.status();
359
+ console.log(`Files: ${status.fileCount}, Chunks: ${status.chunkCount}`);
360
+ ```
361
+
362
+ ### Sync Control
363
+
364
+ ```typescript
365
+ // Manual sync (usually automatic)
366
+ await mem.sync();
367
+
368
+ // Force full re-index
369
+ await mem.sync({ force: true });
370
+ ```
371
+
372
+ ### Custom Embedding Providers
373
+
374
+ ```typescript
375
+ import { createEmbeddingProvider } from 'minimem';
376
+
377
+ // Create provider with custom settings
378
+ const provider = createEmbeddingProvider({
379
+ provider: 'openai',
380
+ openai: {
381
+ apiKey: process.env.OPENAI_API_KEY,
382
+ model: 'text-embedding-3-large',
383
+ dimensions: 1536
384
+ }
385
+ });
386
+
387
+ // Or use Gemini
388
+ const geminiProvider = createEmbeddingProvider({
389
+ provider: 'gemini',
390
+ gemini: {
391
+ apiKey: process.env.GOOGLE_API_KEY,
392
+ model: 'text-embedding-004'
393
+ }
394
+ });
395
+ ```
396
+
397
+ ## How It Works
398
+
399
+ ### Architecture Overview
400
+
401
+ ```
402
+ ┌─────────────────────────────────────────────────────────────┐
403
+ │ minimem │
404
+ ├─────────────────────────────────────────────────────────────┤
405
+ │ Memory Files (.md) │
406
+ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
407
+ │ │MEMORY.md│ │daily.md │ │notes.md │ ← Plain Markdown │
408
+ │ └────┬────┘ └────┬────┘ └────┬────┘ │
409
+ │ │ │ │ │
410
+ │ └───────────┴───────────┘ │
411
+ │ │ │
412
+ │ ▼ │
413
+ │ ┌─────────────────────────────────────┐ │
414
+ │ │ Chunking │ │
415
+ │ │ Split by headings/paragraphs │ │
416
+ │ │ ~500 chars per chunk │ │
417
+ │ └──────────────────┬──────────────────┘ │
418
+ │ │ │
419
+ │ ▼ │
420
+ │ ┌─────────────────────────────────────┐ │
421
+ │ │ Embedding Provider │ │
422
+ │ │ OpenAI / Gemini / Local │ │
423
+ │ │ text → [0.1, -0.3, 0.8, ...] │ │
424
+ │ └──────────────────┬──────────────────┘ │
425
+ │ │ │
426
+ │ ▼ │
427
+ │ ┌─────────────────────────────────────┐ │
428
+ │ │ SQLite Database │ │
429
+ │ │ ┌─────────┐ ┌─────────────────┐ │ │
430
+ │ │ │ FTS5 │ │ sqlite-vec │ │ │
431
+ │ │ │ (text) │ │ (vectors) │ │ │
432
+ │ │ └─────────┘ └─────────────────┘ │ │
433
+ │ └──────────────────┬──────────────────┘ │
434
+ │ │ │
435
+ │ ▼ │
436
+ │ ┌─────────────────────────────────────┐ │
437
+ │ │ Hybrid Search │ │
438
+ │ │ Vector similarity + BM25 ranking │ │
439
+ │ │ Weighted merge of results │ │
440
+ │ └─────────────────────────────────────┘ │
441
+ └─────────────────────────────────────────────────────────────┘
442
+ ```
443
+
444
+ ### Indexing Process
445
+
446
+ 1. **File Discovery**: Scans for `MEMORY.md` and `memory/*.md` files
447
+ 2. **Chunking**: Splits content by Markdown headings and paragraphs (~500 chars each)
448
+ 3. **Hashing**: Each chunk gets a content hash to detect changes
449
+ 4. **Embedding**: New/changed chunks are sent to the embedding provider
450
+ 5. **Storage**: Chunks and vectors stored in SQLite with sqlite-vec extension
451
+ 6. **Caching**: Embeddings cached by content hash to avoid re-computation
452
+
453
+ ### Search Process
454
+
455
+ 1. **Query Embedding**: Convert search query to vector using same embedding model
456
+ 2. **Vector Search**: Find similar chunks using cosine similarity (sqlite-vec)
457
+ 3. **Text Search**: Find matching chunks using FTS5 full-text search (BM25)
458
+ 4. **Hybrid Merge**: Combine results with configurable weights (default 70% vector, 30% text)
459
+ 5. **Ranking**: Sort by combined score, apply min-score filter
460
+
461
+ ### Why Hybrid Search?
462
+
463
+ Pure vector search excels at semantic similarity but can miss exact matches. Pure text search finds exact terms but misses synonyms. Hybrid search combines both:
464
+
465
+ - **Vector (70%)**: Finds conceptually related content ("database" matches "PostgreSQL")
466
+ - **Text (30%)**: Boosts exact keyword matches ("PostgreSQL" query ranks PostgreSQL mentions higher)
467
+
468
+ ### Storage Format
469
+
470
+ SQLite database with three main tables:
471
+
472
+ ```sql
473
+ -- File metadata and modification tracking
474
+ CREATE TABLE memory_files (
475
+ path TEXT PRIMARY KEY,
476
+ mtime INTEGER,
477
+ hash TEXT
478
+ );
479
+
480
+ -- Content chunks with embeddings
481
+ CREATE TABLE memory_chunks (
482
+ id INTEGER PRIMARY KEY,
483
+ path TEXT,
484
+ content TEXT,
485
+ hash TEXT,
486
+ start_line INTEGER,
487
+ end_line INTEGER,
488
+ heading TEXT,
489
+ embedding BLOB -- F32 vector
490
+ );
491
+
492
+ -- Full-text search index
493
+ CREATE VIRTUAL TABLE memory_fts USING fts5(content, path);
494
+
495
+ -- Vector similarity index (when sqlite-vec available)
496
+ CREATE VIRTUAL TABLE memory_vec USING vec0(embedding float[128]);
497
+ ```
498
+
499
+ ### Embedding Cache
500
+
501
+ Embeddings are cached by content hash in a separate table:
502
+
503
+ ```sql
504
+ CREATE TABLE embedding_cache (
505
+ hash TEXT PRIMARY KEY,
506
+ embedding BLOB,
507
+ model TEXT,
508
+ created_at INTEGER
509
+ );
510
+ ```
511
+
512
+ This means:
513
+ - Identical text always produces the same embedding (deterministic)
514
+ - Moving/copying chunks doesn't require re-embedding
515
+ - Switching files with same content is instant
516
+
517
+ ## Claude Code Plugin
518
+
519
+ A ready-to-use Claude Code plugin is included in the `claude-plugin/` directory.
520
+
521
+ ### Quick Install
522
+
523
+ ```bash
524
+ # Install minimem globally
525
+ npm install -g minimem
526
+
527
+ # Initialize global memory
528
+ minimem init --global
529
+
530
+ # Test the plugin
531
+ claude --plugin-dir /path/to/minimem/claude-plugin
532
+ ```
533
+
534
+ ### Plugin Features
535
+
536
+ - **MCP Server**: `memory_search` tool for semantic search
537
+ - **Memory Skill**: Auto-invoked for storing/recalling context
538
+ - **Commands**:
539
+ - `/minimem:remember <text>` - Store information
540
+ - `/minimem:recall <query>` - Search memories
541
+
542
+ See `claude-plugin/README.md` for detailed documentation.
543
+
544
+ ## Development
545
+
546
+ ```bash
547
+ # Install dependencies
548
+ npm install
549
+
550
+ # Build
551
+ npm run build
552
+
553
+ # Run tests
554
+ npm run test:all # All tests
555
+ npm run test:unit # Unit tests (vitest)
556
+ npm run test:cli # CLI command tests
557
+ npm run test:integration # E2E integration tests
558
+
559
+ # Development mode
560
+ npm run dev
561
+ ```
562
+
563
+ ## License
564
+
565
+ MIT
@@ -0,0 +1,10 @@
1
+ {
2
+ "name": "minimem",
3
+ "description": "Lightweight file-based memory system with semantic search for AI agents. Store and recall context across sessions.",
4
+ "version": "0.0.3",
5
+ "author": {
6
+ "name": "Alex Ngai"
7
+ },
8
+ "repository": "https://github.com/alexngai/minimem",
9
+ "keywords": ["memory", "agent", "filesystem", "search", "context", "rag", "embeddings"]
10
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "minimem": {
3
+ "command": "npx",
4
+ "args": ["minimem", "mcp", "--dir", ".", "--global"],
5
+ "env": {}
6
+ }
7
+ }