memorix 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/CHANGELOG.md +30 -1
  2. package/README.md +18 -4
  3. package/README.zh-CN.md +18 -4
  4. package/TEAM.md +86 -86
  5. package/dist/cli/index.js +15919 -14055
  6. package/dist/cli/index.js.map +1 -1
  7. package/dist/index.js +1997 -1021
  8. package/dist/index.js.map +1 -1
  9. package/dist/maintenance-runner.d.ts +1 -1
  10. package/dist/maintenance-runner.js +8481 -8005
  11. package/dist/maintenance-runner.js.map +1 -1
  12. package/dist/memcode-runtime/CHANGELOG.md +30 -1
  13. package/dist/sdk.d.ts +7 -2
  14. package/dist/sdk.js +2022 -1024
  15. package/dist/sdk.js.map +1 -1
  16. package/dist/types.d.ts +49 -1
  17. package/dist/types.js.map +1 -1
  18. package/docs/1.2.2-MEMORY-CONTROL-PLANE.md +434 -0
  19. package/docs/AGENT_OPERATOR_PLAYBOOK.md +4 -0
  20. package/docs/API_REFERENCE.md +27 -5
  21. package/docs/DESIGN_DECISIONS.md +357 -357
  22. package/docs/DEVELOPMENT.md +4 -0
  23. package/docs/README.md +1 -1
  24. package/docs/SETUP.md +7 -1
  25. package/docs/dev-log/progress.txt +91 -11
  26. package/docs/knowledge/workflows/memorix-release.md +57 -0
  27. package/package.json +1 -1
  28. package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
  29. package/src/audit/index.ts +156 -156
  30. package/src/cli/command-guide.ts +192 -0
  31. package/src/cli/commands/audit-list.ts +89 -89
  32. package/src/cli/commands/audit.ts +9 -4
  33. package/src/cli/commands/background.ts +659 -659
  34. package/src/cli/commands/cleanup.ts +5 -1
  35. package/src/cli/commands/codegraph.ts +17 -8
  36. package/src/cli/commands/context.ts +3 -2
  37. package/src/cli/commands/doctor.ts +4 -2
  38. package/src/cli/commands/explain.ts +9 -3
  39. package/src/cli/commands/formation.ts +48 -48
  40. package/src/cli/commands/git-hook-install.ts +111 -111
  41. package/src/cli/commands/handoff.ts +75 -61
  42. package/src/cli/commands/hooks-status.ts +63 -63
  43. package/src/cli/commands/identity.ts +116 -0
  44. package/src/cli/commands/ingest-commit.ts +153 -153
  45. package/src/cli/commands/ingest-image.ts +71 -69
  46. package/src/cli/commands/ingest-log.ts +180 -180
  47. package/src/cli/commands/ingest.ts +44 -44
  48. package/src/cli/commands/integrate-shared.ts +15 -15
  49. package/src/cli/commands/knowledge.ts +40 -0
  50. package/src/cli/commands/lock.ts +93 -92
  51. package/src/cli/commands/memory.ts +58 -21
  52. package/src/cli/commands/message.ts +123 -118
  53. package/src/cli/commands/operator-shared.ts +98 -3
  54. package/src/cli/commands/poll.ts +74 -64
  55. package/src/cli/commands/purge-all-memory.ts +85 -85
  56. package/src/cli/commands/purge-project-memory.ts +83 -83
  57. package/src/cli/commands/reasoning.ts +135 -121
  58. package/src/cli/commands/retention.ts +9 -4
  59. package/src/cli/commands/serve-http.ts +22 -43
  60. package/src/cli/commands/serve-shared.ts +118 -118
  61. package/src/cli/commands/session.ts +29 -3
  62. package/src/cli/commands/setup.ts +9 -3
  63. package/src/cli/commands/skills.ts +124 -119
  64. package/src/cli/commands/status.ts +4 -3
  65. package/src/cli/commands/task.ts +193 -184
  66. package/src/cli/commands/team.ts +14 -10
  67. package/src/cli/commands/transfer.ts +108 -55
  68. package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
  69. package/src/cli/identity.ts +89 -0
  70. package/src/cli/index.ts +96 -19
  71. package/src/cli/invocation.ts +115 -0
  72. package/src/cli/tui/ChatView.tsx +234 -234
  73. package/src/cli/tui/CommandBar.tsx +312 -312
  74. package/src/cli/tui/ContextRail.tsx +118 -118
  75. package/src/cli/tui/HeaderBar.tsx +72 -72
  76. package/src/cli/tui/LogoBanner.tsx +51 -51
  77. package/src/cli/tui/Sidebar.tsx +179 -179
  78. package/src/cli/tui/chat-service.ts +41 -18
  79. package/src/cli/tui/data.ts +23 -44
  80. package/src/cli/tui/index.ts +41 -41
  81. package/src/cli/tui/markdown-render.tsx +371 -371
  82. package/src/cli/tui/operator-context.ts +60 -0
  83. package/src/cli/tui/use-mouse.ts +157 -157
  84. package/src/cli/tui/useNavigation.ts +56 -56
  85. package/src/cli/tui/views/MemoryView.tsx +10 -8
  86. package/src/cli/update-checker.ts +211 -211
  87. package/src/cli/version.ts +7 -7
  88. package/src/cli/workbench.ts +1 -1
  89. package/src/codegraph/auto-context.ts +34 -17
  90. package/src/codegraph/context-pack.ts +1 -0
  91. package/src/codegraph/current-facts.ts +19 -1
  92. package/src/codegraph/project-context.ts +2 -0
  93. package/src/codegraph/task-lens.ts +49 -5
  94. package/src/compact/engine.ts +26 -10
  95. package/src/compact/index-format.ts +25 -2
  96. package/src/compact/token-budget.ts +74 -74
  97. package/src/dashboard/project-classification.ts +64 -64
  98. package/src/dashboard/server.ts +58 -52
  99. package/src/embedding/fastembed-provider.ts +142 -142
  100. package/src/embedding/transformers-provider.ts +111 -111
  101. package/src/git/extractor.ts +209 -209
  102. package/src/git/hooks-path.ts +85 -85
  103. package/src/hooks/admission.ts +117 -0
  104. package/src/hooks/handler.ts +98 -91
  105. package/src/hooks/pattern-detector.ts +173 -173
  106. package/src/hooks/significance-filter.ts +250 -250
  107. package/src/knowledge/claims.ts +51 -1
  108. package/src/knowledge/context-assembly.ts +97 -0
  109. package/src/knowledge/types.ts +1 -0
  110. package/src/knowledge/workflows.ts +34 -3
  111. package/src/knowledge/workset.ts +179 -10
  112. package/src/llm/memory-manager.ts +328 -328
  113. package/src/llm/provider.ts +885 -885
  114. package/src/llm/quality.ts +248 -248
  115. package/src/memory/admission.ts +57 -0
  116. package/src/memory/attribution-guard.ts +249 -249
  117. package/src/memory/auto-relations.ts +21 -0
  118. package/src/memory/consolidation.ts +13 -2
  119. package/src/memory/disclosure-policy.ts +140 -135
  120. package/src/memory/entity-extractor.ts +197 -197
  121. package/src/memory/export-import.ts +11 -3
  122. package/src/memory/formation/evaluate.ts +217 -217
  123. package/src/memory/formation/extract.ts +361 -361
  124. package/src/memory/formation/index.ts +417 -417
  125. package/src/memory/formation/resolve.ts +344 -344
  126. package/src/memory/formation/types.ts +315 -315
  127. package/src/memory/freshness.ts +122 -122
  128. package/src/memory/graph-context.ts +8 -2
  129. package/src/memory/graph-scope.ts +46 -0
  130. package/src/memory/graph.ts +197 -197
  131. package/src/memory/observations.ts +162 -4
  132. package/src/memory/quality-audit.ts +2 -0
  133. package/src/memory/refs.ts +94 -94
  134. package/src/memory/retention.ts +22 -2
  135. package/src/memory/secret-filter.ts +79 -79
  136. package/src/memory/session.ts +5 -2
  137. package/src/memory/visibility.ts +80 -0
  138. package/src/multimodal/image-loader.ts +143 -143
  139. package/src/orchestrate/adapters/claude-stream.ts +192 -192
  140. package/src/orchestrate/adapters/claude.ts +111 -111
  141. package/src/orchestrate/adapters/codex-stream.ts +134 -134
  142. package/src/orchestrate/adapters/codex.ts +41 -41
  143. package/src/orchestrate/adapters/gemini-stream.ts +166 -166
  144. package/src/orchestrate/adapters/gemini.ts +42 -42
  145. package/src/orchestrate/adapters/index.ts +73 -73
  146. package/src/orchestrate/adapters/opencode-stream.ts +143 -143
  147. package/src/orchestrate/adapters/opencode.ts +47 -47
  148. package/src/orchestrate/adapters/spawn-helper.ts +286 -286
  149. package/src/orchestrate/adapters/types.ts +77 -77
  150. package/src/orchestrate/capability-router.ts +284 -284
  151. package/src/orchestrate/context-compact.ts +188 -188
  152. package/src/orchestrate/cost-tracker.ts +219 -219
  153. package/src/orchestrate/error-recovery.ts +191 -191
  154. package/src/orchestrate/evidence.ts +140 -140
  155. package/src/orchestrate/ledger.ts +110 -110
  156. package/src/orchestrate/memorix-bridge.ts +378 -340
  157. package/src/orchestrate/output-budget.ts +80 -80
  158. package/src/orchestrate/permission.ts +152 -152
  159. package/src/orchestrate/pipeline-trace.ts +131 -131
  160. package/src/orchestrate/prompt-builder.ts +155 -155
  161. package/src/orchestrate/ring-buffer.ts +37 -37
  162. package/src/orchestrate/task-graph.ts +389 -389
  163. package/src/orchestrate/verify-gate.ts +33 -10
  164. package/src/orchestrate/worktree.ts +232 -232
  165. package/src/project/aliases.ts +374 -374
  166. package/src/project/detector.ts +268 -268
  167. package/src/rules/adapters/claude-code.ts +99 -99
  168. package/src/rules/adapters/codex.ts +97 -97
  169. package/src/rules/adapters/copilot.ts +124 -124
  170. package/src/rules/adapters/cursor.ts +114 -114
  171. package/src/rules/adapters/kiro.ts +126 -126
  172. package/src/rules/adapters/trae.ts +56 -56
  173. package/src/rules/adapters/windsurf.ts +83 -83
  174. package/src/rules/syncer.ts +235 -235
  175. package/src/runtime/control-plane-maintenance.ts +1 -0
  176. package/src/runtime/isolated-maintenance.ts +1 -0
  177. package/src/runtime/lifecycle.ts +18 -0
  178. package/src/runtime/maintenance-jobs.ts +1 -0
  179. package/src/runtime/maintenance-runner.ts +2 -0
  180. package/src/runtime/project-maintenance.ts +89 -0
  181. package/src/sdk.ts +334 -304
  182. package/src/search/intent-detector.ts +289 -289
  183. package/src/search/query-expansion.ts +52 -52
  184. package/src/server/formation-timeout.ts +27 -27
  185. package/src/server.ts +334 -93
  186. package/src/skills/mini-skills.ts +386 -386
  187. package/src/store/chat-store.ts +119 -119
  188. package/src/store/graph-store.ts +249 -249
  189. package/src/store/mini-skill-store.ts +349 -349
  190. package/src/store/orama-store.ts +61 -6
  191. package/src/store/persistence-json.ts +212 -212
  192. package/src/store/persistence.ts +291 -291
  193. package/src/store/project-affinity.ts +195 -195
  194. package/src/store/sqlite-db.ts +23 -1
  195. package/src/store/sqlite-store.ts +12 -2
  196. package/src/team/event-bus.ts +76 -76
  197. package/src/team/file-locks.ts +173 -173
  198. package/src/team/handoff.ts +168 -161
  199. package/src/team/messages.ts +203 -203
  200. package/src/team/poll.ts +132 -132
  201. package/src/team/tasks.ts +211 -211
  202. package/src/types.ts +51 -0
  203. package/src/wiki/generator.ts +2 -0
  204. package/src/workspace/mcp-adapters/codex.ts +191 -191
  205. package/src/workspace/mcp-adapters/copilot.ts +105 -105
  206. package/src/workspace/mcp-adapters/cursor.ts +53 -53
  207. package/src/workspace/mcp-adapters/kiro.ts +64 -64
  208. package/src/workspace/mcp-adapters/opencode.ts +123 -123
  209. package/src/workspace/mcp-adapters/trae.ts +134 -134
  210. package/src/workspace/mcp-adapters/windsurf.ts +91 -91
  211. package/src/workspace/sanitizer.ts +60 -60
  212. package/src/workspace/workflow-sync.ts +131 -131
@@ -1,358 +1,358 @@
1
- # Memorix 设计决策记录
2
-
3
- > 最后更新: 2026-03-09 (v1.0.0)
4
- > 记录所有重要的架构和设计决策及其背后的理由
5
-
6
- ---
7
-
8
- ## 决策编号规则
9
- - `ADR-XXX`: Architecture Decision Record (架构决策)
10
- - 按时间顺序编号
11
-
12
- ---
13
-
14
- ## ADR-001: 采用 MCP Protocol 而非自定义协议
15
-
16
- **状态**: 已采纳
17
-
18
- **背景**: 需要让 Memorix 与多种 AI Agent (Cursor, Windsurf, Claude Code 等) 通信。
19
-
20
- **决策**: 使用 MCP (Model Context Protocol) 作为通信协议。
21
-
22
- **理由**:
23
- - MCP 是 Anthropic 制定的开放标准,被多数 AI IDE 支持
24
- - stdio 传输模式简单可靠,无需 HTTP 服务器
25
- - 已有 `@modelcontextprotocol/sdk` 官方 SDK
26
- - 兼容 MCP Official Memory Server 的工具命名
27
-
28
- **影响**:
29
- - 日志必须输出到 `stderr` (stdout 被 MCP 协议占用)
30
- - 工具必须返回 `{ content: [{ type: 'text', text: ... }] }` 格式
31
- - 不能主动推送消息给 Agent,只能响应工具调用
32
-
33
- ---
34
-
35
- ## ADR-002: 双存储模型 (Knowledge Graph + Observations)
36
-
37
- **状态**: 已采纳
38
-
39
- **背景**: MCP Official Memory Server 只有知识图谱,表达能力有限。
40
-
41
- **决策**: 采用双存储:
42
- - Knowledge Graph (MCP 兼容): Entity + Relation
43
- - Structured Observations (claude-mem 启发): 带类型、事实、概念的丰富记录
44
-
45
- **理由**:
46
- - Knowledge Graph 适合存储实体关系 (who/what)
47
- - Observations 适合存储事件和上下文 (when/why/how)
48
- - 两者通过 `entityName` 关联
49
- - 保持与 MCP Official Memory Server 工具 API 100% 兼容
50
-
51
- **权衡**:
52
- - 增加了存储复杂度
53
- - 需要两套持久化机制 (JSONL vs JSON)
54
- - observation 的 entity 引用可能与图谱不同步
55
-
56
- ---
57
-
58
- ## ADR-003: 3层渐进式披露
59
-
60
- **状态**: 已采纳
61
-
62
- **背景**: AI Agent 的上下文窗口有限,全量返回记忆会浪费 token。
63
-
64
- **决策**: 采用 claude-mem 的 3层渐进式披露:
65
- - L1 Search: 紧凑索引 (~50-100 tokens/条)
66
- - L2 Timeline: 时间线上下文
67
- - L3 Detail: 完整详情 (~500-1000 tokens/条)
68
-
69
- **理由**:
70
- - claude-mem 验证了此模式的有效性 (27K stars, ~10x token 节省)
71
- - Agent 可以先浏览索引,再按需获取详情
72
- - Token 预算管理让 Agent 控制成本
73
-
74
- **影响**:
75
- - 需要 3 个 MCP 工具而非 1 个搜索工具
76
- - Agent 需要学习使用 Progressive Disclosure 工作流
77
- - 在工具描述中嵌入了 Progressive Disclosure 使用提示
78
-
79
- ---
80
-
81
- ## ADR-004: Orama 作为搜索引擎
82
-
83
- **状态**: 已采纳
84
-
85
- **背景**: 需要全文搜索和向量搜索能力。
86
-
87
- **考虑的方案**:
88
- | 方案 | 优点 | 缺点 |
89
- |------|------|------|
90
- | SQLite FTS5 | 成熟, 持久化 | 无向量搜索, 需要 native addon |
91
- | Orama | 纯 JS, 支持向量, 轻量 | 内存中, 重启需重建 |
92
- | Meilisearch | 功能丰富 | 需要额外进程 |
93
- | pgvector | 强大的向量搜索 | 太重, 需要 PostgreSQL |
94
-
95
- **决策**: 采用 Orama。
96
-
97
- **理由**:
98
- - 纯 JavaScript, 零 native 依赖
99
- - 内置 BM25 全文搜索
100
- - 支持向量搜索 (可选)
101
- - 可嵌入到进程中, 无需额外服务
102
- - 通过 npx 安装时无编译步骤
103
-
104
- **权衡**:
105
- - 内存中运行 — 重启需要重建索引 (`reindexObservations`)
106
- - 大量数据时内存占用可能较高
107
- - Orama 的某些 where 过滤行为不太直观
108
-
109
- ---
110
-
111
- ## ADR-005: 全局共享数据目录
112
-
113
- **状态**: 已采纳
114
-
115
- **背景**: 需要让不同 Agent 共享同一个项目的记忆数据。
116
-
117
- **决策**: 数据存储在 `~/.memorix/data/<projectId>/`。
118
-
119
- **理由**:
120
- - 所有 Agent 都可以访问同一个目录
121
- - projectId 基于 Git remote URL, 保证同一项目的唯一性
122
- - 不污染项目目录
123
- - 不需要用户额外配置
124
-
125
- **权衡**:
126
- - 多个 Agent 同时写入可能冲突 (无文件锁)
127
- - 非 Git 项目的 projectId 可能不稳定 (基于目录名)
128
- - 用户数据不跟随 Git (需要手动备份)
129
-
130
- ---
131
-
132
- ## ADR-006: 可选 Embedding (优雅降级)
133
-
134
- **状态**: 已采纳
135
-
136
- **背景**: 向量搜索显著提升搜索质量,但 fastembed 有 ~30MB 模型下载。
137
-
138
- **决策**: Embedding 作为可选功能,不安装时自动降级为纯全文搜索。
139
-
140
- **理由**:
141
- - 降低入门门槛 — npx 即用
142
- - 全文搜索 (BM25) 对于大多数场景已足够好
143
- - 需要向量搜索的高级用户可以安装 fastembed
144
- - 避免首次启动时的长时间模型下载
145
-
146
- **实现**:
147
- - `getEmbeddingProvider()` 尝试动态 import
148
- - Schema 根据 provider 是否存在动态调整
149
- - 搜索自动选择 fulltext 或 hybrid 模式
150
-
151
- ---
152
-
153
- ## ADR-007: Hooks 系统实现隐式记忆
154
-
155
- **状态**: 已采纳
156
-
157
- **背景**: 依赖 Agent 主动调用 `memorix_store` 不可靠 — Agent 可能忘记存储重要信息。
158
-
159
- **决策**: 实现 Hooks 系统,自动从 Agent 的操作中抓取值得记忆的信息。
160
-
161
- **架构**: `stdin JSON → Normalizer → Pattern Detector → Handler → Store`
162
-
163
- **理由**:
164
- - 不依赖 Agent 的记忆意识
165
- - 通过模式检测过滤噪音,只记录有价值的信息
166
- - 30秒冷却期防止信息过载
167
- - 多 Agent 格式统一化确保跨平台兼容
168
-
169
- **权衡**:
170
- - 增加了实现复杂度
171
- - 模式检测可能有误报/漏报
172
- - 不同 Agent 的 Hook 接入方式差异大
173
- - 需要维护每个 Agent 的格式适配
174
-
175
- ---
176
-
177
- ## ADR-008: 指数衰减的记忆保留
178
-
179
- **状态**: 已采纳
180
-
181
- **背景**: 随着时间推移,记忆会越来越多,需要管理过期记忆。
182
-
183
- **决策**: 采用指数衰减 + 免疫机制。
184
-
185
- **公式**: `score = base × e^(-age/retention) × accessBoost`
186
-
187
- **理由**:
188
- - 指数衰减符合人类记忆的遗忘曲线
189
- - 高重要性和高访问频率的记忆自然保留
190
- - 免疫机制保护关键知识不被遗忘
191
- - 三区域分类 (Active/Stale/Archive) 提供清晰的生命周期
192
-
193
- **当前限制**:
194
- - 只有报告功能,没有实际的自动归档/删除
195
- - `high` 重要性默认免疫 — 这意味着 gotcha/decision/trade-off 永远存在
196
- - 未来需要添加 `memorix_compact` 工具来实际归档
197
-
198
- ---
199
-
200
- ## ADR-009: JSONL 格式存储知识图谱
201
-
202
- **状态**: 已采纳
203
-
204
- **背景**: MCP Official Memory Server 使用单文件 JSON 存储整个图谱。
205
-
206
- **决策**: 使用 JSONL (JSON Lines) 格式分开存储 entities 和 relations。
207
-
208
- **理由**:
209
- - 每行一个记录,便于追加写入
210
- - 与 MCP Official Memory Server 的数据模型兼容
211
- - 便于外部工具处理 (grep, jq)
212
- - 文件损坏时只影响单行而非整个文件
213
-
214
- **权衡**:
215
- - 读取需要逐行解析
216
- - 不支持原子更新(需要全文重写)
217
- - 与 MCP Official Server 的单文件 JSON 格式不完全相同
218
-
219
- ---
220
-
221
- ## ADR-010: 实体自动抽取 (MAGMA 启发)
222
-
223
- **状态**: 已采纳
224
-
225
- **背景**: 用户提供的概念和文件列表通常不完整。
226
-
227
- **决策**: 使用正则表达式从 observation 内容中自动抽取实体。
228
-
229
- **理由**:
230
- - 灵感来自 MemCP 的 RegexEntityExtractor (MAGMA 论文)
231
- - 零额外依赖 — 纯正则匹配
232
- - 自动丰富的概念和文件列表提升搜索召回率
233
- - 因果语言检测帮助推断关系类型
234
-
235
- **权衡**:
236
- - 正则表达式的准确率有限 (可能误匹配)
237
- - 不支持中文标识符
238
- - 无法理解语义关系 — 只做词汇级别匹配
239
- - 未来可以考虑用 LLM 替代正则做更智能的抽取
240
-
241
- ---
242
-
243
- ## ADR-011: 跨 Agent 工作空间同步
244
-
245
- **状态**: 已采纳
246
-
247
- **背景**: 用户经常在多个 AI IDE 之间切换,每次都要重新配置 MCP servers、规则等。
248
-
249
- **决策**: 实现一键式工作空间迁移 — MCP configs + Rules + Workflows + Skills。
250
-
251
- **理由**:
252
- - 这是 Memorix 独有的差异化功能
253
- - 减少用户在 Agent 之间切换的摩擦
254
- - 集中管理避免配置不一致
255
- - 支持选择性同步 (`items` 参数)
256
-
257
- **实现要点**:
258
- - 每个 Agent 一个 MCP 配置适配器 (parse ↔ generate)
259
- - 每个 Agent 一个规则格式适配器
260
- - Workflow 格式转换
261
- - Skills 目录复制
262
- - Apply 操作带备份和回滚
263
-
264
- ---
265
-
266
- ## ADR-012: CLI 使用 Citty 框架
267
-
268
- **状态**: 已采纳
269
-
270
- **背景**: 需要一个轻量级 CLI 框架来定义命令。
271
-
272
- **考虑的方案**: Commander, Yargs, Citty, CAC
273
-
274
- **决策**: 使用 Citty (UnJS 生态)。
275
-
276
- **理由**:
277
- - 轻量级, 无额外依赖
278
- - TypeScript 原生支持
279
- - 与 UnJS 生态其他工具 (如 Nitro, Nuxt) 一致
280
- - 支持子命令定义
281
- - 自动生成 help 信息
282
-
283
- ---
284
-
285
- ## ADR-013: 工具合并 (41 → 22 默认)
286
-
287
- **状态**: 已采纳 (v1.0.0)
288
-
289
- **背景**: 工具数量膨胀到 41 个,超出多数 IDE 的工具槽位限制。
290
-
291
- **决策**:
292
- - Team 工具: 13 个合并为 4 个 (使用 `action` 参数模式)
293
- - KG 工具: 9 个改为可选 (通过 `~/.memorix/settings.json` 启用)
294
- - Export+Import: 2 个合并为 1 个 `memorix_transfer`
295
-
296
- **理由**:
297
- - 多数用户不需要知识图谱工具,默认隐藏减少器噪
298
- - `action` 参数模式是 MCP 工具的最佳实践(减少工具数量,保留功能)
299
- - 22 个默认工具在所有 IDE 工具槽位限制内
300
-
301
- ---
302
-
303
- ## ADR-014: 团队协作 (team-state.json)
304
-
305
- **状态**: 已采纳 (v1.0.0)
306
-
307
- **背景**: 多个 Agent 在同一工作区并行工作时,缺乏协调机制。
308
-
309
- **决策**: 基于文件的团队状态共享,包含 4 个工具:注册/文件锁/任务板/消息。
310
-
311
- **理由**:
312
- - 文件锁防止多 Agent 同时编辑同一文件
313
- - 任务板让 Agent 之间分工协作
1
+ # Memorix 设计决策记录
2
+
3
+ > 最后更新: 2026-03-09 (v1.0.0)
4
+ > 记录所有重要的架构和设计决策及其背后的理由
5
+
6
+ ---
7
+
8
+ ## 决策编号规则
9
+ - `ADR-XXX`: Architecture Decision Record (架构决策)
10
+ - 按时间顺序编号
11
+
12
+ ---
13
+
14
+ ## ADR-001: 采用 MCP Protocol 而非自定义协议
15
+
16
+ **状态**: 已采纳
17
+
18
+ **背景**: 需要让 Memorix 与多种 AI Agent (Cursor, Windsurf, Claude Code 等) 通信。
19
+
20
+ **决策**: 使用 MCP (Model Context Protocol) 作为通信协议。
21
+
22
+ **理由**:
23
+ - MCP 是 Anthropic 制定的开放标准,被多数 AI IDE 支持
24
+ - stdio 传输模式简单可靠,无需 HTTP 服务器
25
+ - 已有 `@modelcontextprotocol/sdk` 官方 SDK
26
+ - 兼容 MCP Official Memory Server 的工具命名
27
+
28
+ **影响**:
29
+ - 日志必须输出到 `stderr` (stdout 被 MCP 协议占用)
30
+ - 工具必须返回 `{ content: [{ type: 'text', text: ... }] }` 格式
31
+ - 不能主动推送消息给 Agent,只能响应工具调用
32
+
33
+ ---
34
+
35
+ ## ADR-002: 双存储模型 (Knowledge Graph + Observations)
36
+
37
+ **状态**: 已采纳
38
+
39
+ **背景**: MCP Official Memory Server 只有知识图谱,表达能力有限。
40
+
41
+ **决策**: 采用双存储:
42
+ - Knowledge Graph (MCP 兼容): Entity + Relation
43
+ - Structured Observations (claude-mem 启发): 带类型、事实、概念的丰富记录
44
+
45
+ **理由**:
46
+ - Knowledge Graph 适合存储实体关系 (who/what)
47
+ - Observations 适合存储事件和上下文 (when/why/how)
48
+ - 两者通过 `entityName` 关联
49
+ - 保持与 MCP Official Memory Server 工具 API 100% 兼容
50
+
51
+ **权衡**:
52
+ - 增加了存储复杂度
53
+ - 需要两套持久化机制 (JSONL vs JSON)
54
+ - observation 的 entity 引用可能与图谱不同步
55
+
56
+ ---
57
+
58
+ ## ADR-003: 3层渐进式披露
59
+
60
+ **状态**: 已采纳
61
+
62
+ **背景**: AI Agent 的上下文窗口有限,全量返回记忆会浪费 token。
63
+
64
+ **决策**: 采用 claude-mem 的 3层渐进式披露:
65
+ - L1 Search: 紧凑索引 (~50-100 tokens/条)
66
+ - L2 Timeline: 时间线上下文
67
+ - L3 Detail: 完整详情 (~500-1000 tokens/条)
68
+
69
+ **理由**:
70
+ - claude-mem 验证了此模式的有效性 (27K stars, ~10x token 节省)
71
+ - Agent 可以先浏览索引,再按需获取详情
72
+ - Token 预算管理让 Agent 控制成本
73
+
74
+ **影响**:
75
+ - 需要 3 个 MCP 工具而非 1 个搜索工具
76
+ - Agent 需要学习使用 Progressive Disclosure 工作流
77
+ - 在工具描述中嵌入了 Progressive Disclosure 使用提示
78
+
79
+ ---
80
+
81
+ ## ADR-004: Orama 作为搜索引擎
82
+
83
+ **状态**: 已采纳
84
+
85
+ **背景**: 需要全文搜索和向量搜索能力。
86
+
87
+ **考虑的方案**:
88
+ | 方案 | 优点 | 缺点 |
89
+ |------|------|------|
90
+ | SQLite FTS5 | 成熟, 持久化 | 无向量搜索, 需要 native addon |
91
+ | Orama | 纯 JS, 支持向量, 轻量 | 内存中, 重启需重建 |
92
+ | Meilisearch | 功能丰富 | 需要额外进程 |
93
+ | pgvector | 强大的向量搜索 | 太重, 需要 PostgreSQL |
94
+
95
+ **决策**: 采用 Orama。
96
+
97
+ **理由**:
98
+ - 纯 JavaScript, 零 native 依赖
99
+ - 内置 BM25 全文搜索
100
+ - 支持向量搜索 (可选)
101
+ - 可嵌入到进程中, 无需额外服务
102
+ - 通过 npx 安装时无编译步骤
103
+
104
+ **权衡**:
105
+ - 内存中运行 — 重启需要重建索引 (`reindexObservations`)
106
+ - 大量数据时内存占用可能较高
107
+ - Orama 的某些 where 过滤行为不太直观
108
+
109
+ ---
110
+
111
+ ## ADR-005: 全局共享数据目录
112
+
113
+ **状态**: 已采纳
114
+
115
+ **背景**: 需要让不同 Agent 共享同一个项目的记忆数据。
116
+
117
+ **决策**: 数据存储在 `~/.memorix/data/<projectId>/`。
118
+
119
+ **理由**:
120
+ - 所有 Agent 都可以访问同一个目录
121
+ - projectId 基于 Git remote URL, 保证同一项目的唯一性
122
+ - 不污染项目目录
123
+ - 不需要用户额外配置
124
+
125
+ **权衡**:
126
+ - 多个 Agent 同时写入可能冲突 (无文件锁)
127
+ - 非 Git 项目的 projectId 可能不稳定 (基于目录名)
128
+ - 用户数据不跟随 Git (需要手动备份)
129
+
130
+ ---
131
+
132
+ ## ADR-006: 可选 Embedding (优雅降级)
133
+
134
+ **状态**: 已采纳
135
+
136
+ **背景**: 向量搜索显著提升搜索质量,但 fastembed 有 ~30MB 模型下载。
137
+
138
+ **决策**: Embedding 作为可选功能,不安装时自动降级为纯全文搜索。
139
+
140
+ **理由**:
141
+ - 降低入门门槛 — npx 即用
142
+ - 全文搜索 (BM25) 对于大多数场景已足够好
143
+ - 需要向量搜索的高级用户可以安装 fastembed
144
+ - 避免首次启动时的长时间模型下载
145
+
146
+ **实现**:
147
+ - `getEmbeddingProvider()` 尝试动态 import
148
+ - Schema 根据 provider 是否存在动态调整
149
+ - 搜索自动选择 fulltext 或 hybrid 模式
150
+
151
+ ---
152
+
153
+ ## ADR-007: Hooks 系统实现隐式记忆
154
+
155
+ **状态**: 已采纳
156
+
157
+ **背景**: 依赖 Agent 主动调用 `memorix_store` 不可靠 — Agent 可能忘记存储重要信息。
158
+
159
+ **决策**: 实现 Hooks 系统,自动从 Agent 的操作中抓取值得记忆的信息。
160
+
161
+ **架构**: `stdin JSON → Normalizer → Pattern Detector → Handler → Store`
162
+
163
+ **理由**:
164
+ - 不依赖 Agent 的记忆意识
165
+ - 通过模式检测过滤噪音,只记录有价值的信息
166
+ - 30秒冷却期防止信息过载
167
+ - 多 Agent 格式统一化确保跨平台兼容
168
+
169
+ **权衡**:
170
+ - 增加了实现复杂度
171
+ - 模式检测可能有误报/漏报
172
+ - 不同 Agent 的 Hook 接入方式差异大
173
+ - 需要维护每个 Agent 的格式适配
174
+
175
+ ---
176
+
177
+ ## ADR-008: 指数衰减的记忆保留
178
+
179
+ **状态**: 已采纳
180
+
181
+ **背景**: 随着时间推移,记忆会越来越多,需要管理过期记忆。
182
+
183
+ **决策**: 采用指数衰减 + 免疫机制。
184
+
185
+ **公式**: `score = base × e^(-age/retention) × accessBoost`
186
+
187
+ **理由**:
188
+ - 指数衰减符合人类记忆的遗忘曲线
189
+ - 高重要性和高访问频率的记忆自然保留
190
+ - 免疫机制保护关键知识不被遗忘
191
+ - 三区域分类 (Active/Stale/Archive) 提供清晰的生命周期
192
+
193
+ **当前限制**:
194
+ - 只有报告功能,没有实际的自动归档/删除
195
+ - `high` 重要性默认免疫 — 这意味着 gotcha/decision/trade-off 永远存在
196
+ - 未来需要添加 `memorix_compact` 工具来实际归档
197
+
198
+ ---
199
+
200
+ ## ADR-009: JSONL 格式存储知识图谱
201
+
202
+ **状态**: 已采纳
203
+
204
+ **背景**: MCP Official Memory Server 使用单文件 JSON 存储整个图谱。
205
+
206
+ **决策**: 使用 JSONL (JSON Lines) 格式分开存储 entities 和 relations。
207
+
208
+ **理由**:
209
+ - 每行一个记录,便于追加写入
210
+ - 与 MCP Official Memory Server 的数据模型兼容
211
+ - 便于外部工具处理 (grep, jq)
212
+ - 文件损坏时只影响单行而非整个文件
213
+
214
+ **权衡**:
215
+ - 读取需要逐行解析
216
+ - 不支持原子更新(需要全文重写)
217
+ - 与 MCP Official Server 的单文件 JSON 格式不完全相同
218
+
219
+ ---
220
+
221
+ ## ADR-010: 实体自动抽取 (MAGMA 启发)
222
+
223
+ **状态**: 已采纳
224
+
225
+ **背景**: 用户提供的概念和文件列表通常不完整。
226
+
227
+ **决策**: 使用正则表达式从 observation 内容中自动抽取实体。
228
+
229
+ **理由**:
230
+ - 灵感来自 MemCP 的 RegexEntityExtractor (MAGMA 论文)
231
+ - 零额外依赖 — 纯正则匹配
232
+ - 自动丰富的概念和文件列表提升搜索召回率
233
+ - 因果语言检测帮助推断关系类型
234
+
235
+ **权衡**:
236
+ - 正则表达式的准确率有限 (可能误匹配)
237
+ - 不支持中文标识符
238
+ - 无法理解语义关系 — 只做词汇级别匹配
239
+ - 未来可以考虑用 LLM 替代正则做更智能的抽取
240
+
241
+ ---
242
+
243
+ ## ADR-011: 跨 Agent 工作空间同步
244
+
245
+ **状态**: 已采纳
246
+
247
+ **背景**: 用户经常在多个 AI IDE 之间切换,每次都要重新配置 MCP servers、规则等。
248
+
249
+ **决策**: 实现一键式工作空间迁移 — MCP configs + Rules + Workflows + Skills。
250
+
251
+ **理由**:
252
+ - 这是 Memorix 独有的差异化功能
253
+ - 减少用户在 Agent 之间切换的摩擦
254
+ - 集中管理避免配置不一致
255
+ - 支持选择性同步 (`items` 参数)
256
+
257
+ **实现要点**:
258
+ - 每个 Agent 一个 MCP 配置适配器 (parse ↔ generate)
259
+ - 每个 Agent 一个规则格式适配器
260
+ - Workflow 格式转换
261
+ - Skills 目录复制
262
+ - Apply 操作带备份和回滚
263
+
264
+ ---
265
+
266
+ ## ADR-012: CLI 使用 Citty 框架
267
+
268
+ **状态**: 已采纳
269
+
270
+ **背景**: 需要一个轻量级 CLI 框架来定义命令。
271
+
272
+ **考虑的方案**: Commander, Yargs, Citty, CAC
273
+
274
+ **决策**: 使用 Citty (UnJS 生态)。
275
+
276
+ **理由**:
277
+ - 轻量级, 无额外依赖
278
+ - TypeScript 原生支持
279
+ - 与 UnJS 生态其他工具 (如 Nitro, Nuxt) 一致
280
+ - 支持子命令定义
281
+ - 自动生成 help 信息
282
+
283
+ ---
284
+
285
+ ## ADR-013: 工具合并 (41 → 22 默认)
286
+
287
+ **状态**: 已采纳 (v1.0.0)
288
+
289
+ **背景**: 工具数量膨胀到 41 个,超出多数 IDE 的工具槽位限制。
290
+
291
+ **决策**:
292
+ - Team 工具: 13 个合并为 4 个 (使用 `action` 参数模式)
293
+ - KG 工具: 9 个改为可选 (通过 `~/.memorix/settings.json` 启用)
294
+ - Export+Import: 2 个合并为 1 个 `memorix_transfer`
295
+
296
+ **理由**:
297
+ - 多数用户不需要知识图谱工具,默认隐藏减少器噪
298
+ - `action` 参数模式是 MCP 工具的最佳实践(减少工具数量,保留功能)
299
+ - 22 个默认工具在所有 IDE 工具槽位限制内
300
+
301
+ ---
302
+
303
+ ## ADR-014: 团队协作 (team-state.json)
304
+
305
+ **状态**: 已采纳 (v1.0.0)
306
+
307
+ **背景**: 多个 Agent 在同一工作区并行工作时,缺乏协调机制。
308
+
309
+ **决策**: 基于文件的团队状态共享,包含 4 个工具:注册/文件锁/任务板/消息。
310
+
311
+ **理由**:
312
+ - 文件锁防止多 Agent 同时编辑同一文件
313
+ - 任务板让 Agent 之间分工协作
314
314
  - 消息、任务与轮询共同提供显式的异步协作,而不是假设跨 IDE 实时通信
315
- - `team-state.json` 简单可靠,无需额外服务
316
-
317
- **生产加固**:
318
- - Inbox 上限 200 条,自动淡化旧消息
319
- - 文件锁 10min TTL 自动释放
320
- - Agent 离开时自动释放所有锁 + 清空 Inbox
321
- - 孤儿任务自动救援
322
-
323
- ---
324
-
325
- ## ADR-015: 启动自动清理
326
-
327
- **状态**: 已采纳 (v1.0.0)
328
-
329
- **背景**: 用户往往忘记手动运行 `memorix_retention` 和 `memorix_consolidate`。
330
-
331
- **决策**: 在 `deferredInit` 中自动执行:
332
- 1. `archiveExpired()` — 归档过期记忆
333
- 2. 有 LLM: `deduplicateMemory()` — 语义去重
334
- 3. 无 LLM: `executeConsolidation()` — Jaccard 相似度合并
335
-
336
- **理由**:
337
- - 零人工维护,用户无需知道记忆管理细节
338
- - 配置了 LLM 的用户想要更高质量,每次仅消耗几百 token
339
- - 在 MCP 握手后的后台任务中执行,不影响主流程
340
-
341
- ---
342
-
343
- ## ADR-016: LLM 增强模式 (可选)
344
-
345
- **状态**: 已采纳 (v0.11.0)
346
-
347
- **背景**: 纯启发式去重质量有限,LLM 可以提供更智能的记忆管理。
348
-
349
- **决策**: 可选 LLM 集成,提供三项能力:
350
- - **叙述压缩**: 存储前压缩冗余内容 (~27% token 节省)
351
- - **搜索重排序**: 按语义相关性重新排序 (60% 查询改善)
352
- - **写入时去重**: 写入时检测重复和冲突
353
-
354
- **理由**:
355
- - 所有 LLM 功能均为可选,不配置时默认用启发式引擎
356
- - 智能过滤确保 LLM 仅在有意义时被调用
357
- - 支持 OpenAI/Anthropic/OpenRouter 及任何兼容接口
358
- - 配置优先级: 环境变量 > `~/.memorix/config.json` > 自动检测
315
+ - `team-state.json` 简单可靠,无需额外服务
316
+
317
+ **生产加固**:
318
+ - Inbox 上限 200 条,自动淡化旧消息
319
+ - 文件锁 10min TTL 自动释放
320
+ - Agent 离开时自动释放所有锁 + 清空 Inbox
321
+ - 孤儿任务自动救援
322
+
323
+ ---
324
+
325
+ ## ADR-015: 启动自动清理
326
+
327
+ **状态**: 已采纳 (v1.0.0)
328
+
329
+ **背景**: 用户往往忘记手动运行 `memorix_retention` 和 `memorix_consolidate`。
330
+
331
+ **决策**: 在 `deferredInit` 中自动执行:
332
+ 1. `archiveExpired()` — 归档过期记忆
333
+ 2. 有 LLM: `deduplicateMemory()` — 语义去重
334
+ 3. 无 LLM: `executeConsolidation()` — Jaccard 相似度合并
335
+
336
+ **理由**:
337
+ - 零人工维护,用户无需知道记忆管理细节
338
+ - 配置了 LLM 的用户想要更高质量,每次仅消耗几百 token
339
+ - 在 MCP 握手后的后台任务中执行,不影响主流程
340
+
341
+ ---
342
+
343
+ ## ADR-016: LLM 增强模式 (可选)
344
+
345
+ **状态**: 已采纳 (v0.11.0)
346
+
347
+ **背景**: 纯启发式去重质量有限,LLM 可以提供更智能的记忆管理。
348
+
349
+ **决策**: 可选 LLM 集成,提供三项能力:
350
+ - **叙述压缩**: 存储前压缩冗余内容 (~27% token 节省)
351
+ - **搜索重排序**: 按语义相关性重新排序 (60% 查询改善)
352
+ - **写入时去重**: 写入时检测重复和冲突
353
+
354
+ **理由**:
355
+ - 所有 LLM 功能均为可选,不配置时默认用启发式引擎
356
+ - 智能过滤确保 LLM 仅在有意义时被调用
357
+ - 支持 OpenAI/Anthropic/OpenRouter 及任何兼容接口
358
+ - 配置优先级: 环境变量 > `~/.memorix/config.json` > 自动检测