@synth-coder/memhub 0.2.3 → 0.2.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 (118) hide show
  1. package/.github/workflows/ci.yml +48 -12
  2. package/.github/workflows/release.yml +70 -0
  3. package/AGENTS.md +71 -73
  4. package/README.md +284 -195
  5. package/README.zh-CN.md +90 -30
  6. package/dist/src/cli/agents/claude-code.d.ts +5 -0
  7. package/dist/src/cli/agents/claude-code.d.ts.map +1 -0
  8. package/dist/src/cli/agents/claude-code.js +14 -0
  9. package/dist/src/cli/agents/claude-code.js.map +1 -0
  10. package/dist/src/cli/agents/cline.d.ts +5 -0
  11. package/dist/src/cli/agents/cline.d.ts.map +1 -0
  12. package/dist/src/cli/agents/cline.js +14 -0
  13. package/dist/src/cli/agents/cline.js.map +1 -0
  14. package/dist/src/cli/agents/cursor.d.ts +5 -0
  15. package/dist/src/cli/agents/cursor.d.ts.map +1 -0
  16. package/dist/src/cli/agents/cursor.js +14 -0
  17. package/dist/src/cli/agents/cursor.js.map +1 -0
  18. package/dist/src/cli/agents/factory-droid.d.ts +5 -0
  19. package/dist/src/cli/agents/factory-droid.d.ts.map +1 -0
  20. package/dist/src/cli/agents/factory-droid.js +14 -0
  21. package/dist/src/cli/agents/factory-droid.js.map +1 -0
  22. package/dist/src/cli/agents/gemini-cli.d.ts +5 -0
  23. package/dist/src/cli/agents/gemini-cli.d.ts.map +1 -0
  24. package/dist/src/cli/agents/gemini-cli.js +14 -0
  25. package/dist/src/cli/agents/gemini-cli.js.map +1 -0
  26. package/dist/src/cli/agents/index.d.ts +13 -0
  27. package/dist/src/cli/agents/index.d.ts.map +1 -0
  28. package/dist/src/cli/agents/index.js +27 -0
  29. package/dist/src/cli/agents/index.js.map +1 -0
  30. package/dist/src/cli/agents/windsurf.d.ts +5 -0
  31. package/dist/src/cli/agents/windsurf.d.ts.map +1 -0
  32. package/dist/src/cli/agents/windsurf.js +14 -0
  33. package/dist/src/cli/agents/windsurf.js.map +1 -0
  34. package/dist/src/cli/index.d.ts +8 -0
  35. package/dist/src/cli/index.d.ts.map +1 -0
  36. package/dist/src/cli/index.js +168 -0
  37. package/dist/src/cli/index.js.map +1 -0
  38. package/dist/src/cli/init.d.ts +34 -0
  39. package/dist/src/cli/init.d.ts.map +1 -0
  40. package/dist/src/cli/init.js +140 -0
  41. package/dist/src/cli/init.js.map +1 -0
  42. package/dist/src/cli/instructions.d.ts +29 -0
  43. package/dist/src/cli/instructions.d.ts.map +1 -0
  44. package/dist/src/cli/instructions.js +141 -0
  45. package/dist/src/cli/instructions.js.map +1 -0
  46. package/dist/src/cli/types.d.ts +22 -0
  47. package/dist/src/cli/types.d.ts.map +1 -0
  48. package/dist/src/cli/types.js +75 -0
  49. package/dist/src/cli/types.js.map +1 -0
  50. package/dist/src/contracts/mcp.js +34 -34
  51. package/dist/src/contracts/schemas.js.map +1 -1
  52. package/dist/src/server/mcp-server.d.ts.map +1 -1
  53. package/dist/src/server/mcp-server.js +7 -14
  54. package/dist/src/server/mcp-server.js.map +1 -1
  55. package/dist/src/services/embedding-service.d.ts.map +1 -1
  56. package/dist/src/services/embedding-service.js +1 -1
  57. package/dist/src/services/embedding-service.js.map +1 -1
  58. package/dist/src/services/memory-service.d.ts.map +1 -1
  59. package/dist/src/services/memory-service.js.map +1 -1
  60. package/dist/src/storage/markdown-storage.d.ts.map +1 -1
  61. package/dist/src/storage/markdown-storage.js +1 -1
  62. package/dist/src/storage/markdown-storage.js.map +1 -1
  63. package/dist/src/storage/vector-index.d.ts.map +1 -1
  64. package/dist/src/storage/vector-index.js +4 -5
  65. package/dist/src/storage/vector-index.js.map +1 -1
  66. package/docs/README.md +21 -0
  67. package/docs/mcp-tools.md +136 -0
  68. package/docs/user-guide.md +184 -0
  69. package/package.json +61 -59
  70. package/src/cli/agents/claude-code.ts +14 -0
  71. package/src/cli/agents/cline.ts +14 -0
  72. package/src/cli/agents/codex.ts +14 -0
  73. package/src/cli/agents/cursor.ts +14 -0
  74. package/src/cli/agents/factory-droid.ts +14 -0
  75. package/src/cli/agents/gemini-cli.ts +14 -0
  76. package/src/cli/agents/index.ts +36 -0
  77. package/src/cli/agents/windsurf.ts +14 -0
  78. package/src/cli/index.ts +192 -0
  79. package/src/cli/init.ts +218 -0
  80. package/src/cli/instructions.ts +156 -0
  81. package/src/cli/types.ts +112 -0
  82. package/src/contracts/index.ts +12 -12
  83. package/src/contracts/mcp.ts +223 -223
  84. package/src/contracts/schemas.ts +307 -307
  85. package/src/contracts/types.ts +410 -410
  86. package/src/index.ts +8 -8
  87. package/src/server/index.ts +5 -5
  88. package/src/server/mcp-server.ts +169 -186
  89. package/src/services/embedding-service.ts +114 -114
  90. package/src/services/index.ts +5 -5
  91. package/src/services/memory-service.ts +656 -663
  92. package/src/storage/frontmatter-parser.ts +243 -243
  93. package/src/storage/index.ts +6 -6
  94. package/src/storage/markdown-storage.ts +228 -236
  95. package/src/storage/vector-index.ts +159 -160
  96. package/src/utils/index.ts +5 -5
  97. package/src/utils/slugify.ts +63 -63
  98. package/test/cli/init.test.ts +402 -0
  99. package/test/contracts/schemas.test.ts +313 -313
  100. package/test/contracts/types.test.ts +21 -21
  101. package/test/frontmatter-parser-more.test.ts +94 -94
  102. package/test/server/mcp-server.test.ts +211 -210
  103. package/test/services/memory-service-edge.test.ts +248 -248
  104. package/test/services/memory-service.test.ts +291 -279
  105. package/test/storage/frontmatter-parser.test.ts +223 -223
  106. package/test/storage/markdown-storage.test.ts +226 -217
  107. package/test/storage/storage-edge.test.ts +238 -238
  108. package/test/storage/vector-index.test.ts +149 -153
  109. package/test/utils/slugify-edge.test.ts +94 -94
  110. package/test/utils/slugify.test.ts +72 -68
  111. package/docs/architecture-diagrams.md +0 -368
  112. package/docs/architecture.md +0 -381
  113. package/docs/contracts.md +0 -190
  114. package/docs/prompt-template.md +0 -33
  115. package/docs/proposals/mcp-typescript-sdk-refactor.md +0 -568
  116. package/docs/proposals/proposal-close-gates.md +0 -58
  117. package/docs/tool-calling-policy.md +0 -101
  118. package/docs/vector-search.md +0 -306
@@ -1,101 +0,0 @@
1
- # Tool Calling Policy (情境驱动)
2
-
3
- > 目标:让记忆调用像人类一样自然——回忆由情境触发,记忆在无意识中形成。
4
-
5
- ## 一、核心理念:从"时序驱动"到"情境驱动"
6
-
7
- 人类的记忆规律:
8
- - **回忆是触发的** — 不是按计划"现在是回忆时间",而是看到相关线索才想起
9
- - **记忆是无意识的** — 重要的经历自然留下痕迹,不需要刻意"现在要记住"
10
-
11
- 因此,MemHub 的工具调用不应是"首轮必调 load,末轮必调 update"的机械流程,而是根据情境自然触发。
12
-
13
- ---
14
-
15
- ## 二、触发式调用原则
16
-
17
- ### `memory_load` 触发条件
18
-
19
- 当出现以下情境时,调用 memory_load:
20
-
21
- - 用户提到过往经历("之前"、"记得吗"、"像上次那样")
22
- - 遇到似曾相识的任务场景
23
- - 需要参考用户偏好做决策
24
- - 当前信息可能与过往冲突(用户纠正了你的假设)
25
- - 不确定用户的既有偏好或约束
26
-
27
- **不触发的情况**:
28
- - 简单明确的操作("读取文件X"、"列出目录Y")
29
- - 一次性任务,无需参考历史
30
- - 当前上下文已足够
31
-
32
- ### `memory_update` 触发条件
33
-
34
- 当出现以下情境时,调用 memory_update:
35
-
36
- - 发现用户偏好("我更喜欢..."、"不要用...")
37
- - 做出了有理由的技术决策
38
- - 纠正了一个误解或错误假设
39
- - 用户显式要求记住("下次记住...")
40
- - 项目上下文发生重要变化(技术栈、约束、团队规范)
41
-
42
- **不触发的情况**:
43
- - 简单的读写操作
44
- - 临时性、一次性的信息
45
- - 信息在短期内不会被复用
46
-
47
- ---
48
-
49
- ## 三、工具参考
50
-
51
- ### `memory_load`
52
-
53
- 按情境加载相关记忆,用于辅助当前任务。
54
-
55
- **参数**:
56
- - `query` — 搜索关键词或问题
57
- - `tags` — 按标签过滤
58
- - `category` — 按类别过滤
59
- - `limit` — 返回数量限制
60
-
61
- **返回**:
62
- - `items[]` — 匹配的记忆条目
63
-
64
- ### `memory_update`
65
-
66
- 记录值得保留的信息,为未来对话提供上下文。
67
-
68
- **参数**:
69
- - `content` — 要记录的内容(必需)
70
- - `title` — 简短标题
71
- - `entryType` — 类型:`preference`(偏好)、`decision`(决策)、`context`(上下文)、`fact`(事实)
72
- - `tags` — 标签数组
73
- - `category` — 分类
74
- - `importance` — 重要程度 1-5
75
-
76
- **返回**:
77
- - `id` — 记录 ID
78
- - `created` — 是否新建
79
-
80
- ---
81
-
82
- ## 四、存储规范
83
-
84
- 目录结构支持并发写入:
85
-
86
- ```text
87
- memories/
88
- YYYY-MM-DD/
89
- <session_uuid>/
90
- 2026-03-03T16-41-23.123Z-<slug>.md
91
- ```
92
-
93
- 每条记录保留 YAML 元数据 + Markdown 正文。
94
-
95
- ---
96
-
97
- ## 五、设计原则
98
-
99
- - **情境触发,而非时序强制** — 像人类记忆一样自然
100
- - **有价值才记录** — 避免噪音,保留真正可复用的信息
101
- - **偏好和决策优先** — 这些是最值得跨会话保留的内容
@@ -1,306 +0,0 @@
1
- # 向量语义搜索
2
-
3
- MemHub 集成了基于向量的语义搜索功能,使用本地 ONNX 模型实现智能记忆检索。
4
-
5
- ## 概述
6
-
7
- ### 为什么需要向量搜索?
8
-
9
- 传统的关键词匹配存在以下限制:
10
-
11
- - 无法理解语义相似性("架构" vs "设计")
12
- - 无法处理同义词("偏好" vs "喜好")
13
- - 无法进行模糊匹配("React 组件" vs "Component")
14
-
15
- 向量语义搜索通过将文本转换为高维向量,计算语义相似度,提供更智能的检索体验。
16
-
17
- ### 技术实现
18
-
19
- - **Embedding 模型**: Xenova/all-MiniLM-L6-v2
20
- - **向量维度**: 384
21
- - **距离度量**: Cosine distance
22
- - **向量数据库**: LanceDB
23
- - **模型缓存**: `~/.cache/huggingface/`
24
-
25
- ## 架构设计
26
-
27
- ### 1. 分层架构
28
-
29
- ```
30
- ┌─────────────────────────────────────┐
31
- │ Memory Service (业务层) │
32
- │ - memoryLoad(query, tags, ...) │
33
- └──────────────┬──────────────────────┘
34
-
35
- ┌───────┴────────┐
36
- │ │
37
- ┌──────▼─────┐ ┌────▼────────┐
38
- │ Embedding │ │ Vector │
39
- │ Service │ │ Index │
40
- │ (ONNX) │ │ (LanceDB) │
41
- └────────────┘ └─────────────┘
42
- ```
43
-
44
- ### 2. 数据流
45
-
46
- ```mermaid
47
- sequenceDiagram
48
- participant User
49
- participant MemoryService
50
- participant EmbeddingService
51
- participant VectorIndex
52
- participant MarkdownStorage
53
-
54
- User->>MemoryService: memory_load(query="架构设计")
55
- MemoryService->>EmbeddingService: embed("架构设计")
56
- EmbeddingService-->>MemoryService: [0.1, 0.2, ..., 0.384]
57
- MemoryService->>VectorIndex: search(vector, limit=20)
58
- VectorIndex-->>MemoryService: [{id, _distance}, ...]
59
- MemoryService->>MarkdownStorage: read([id1, id2, ...])
60
- MarkdownStorage-->>MemoryService: [Memory, ...]
61
- MemoryService-->>User: MemoryLoadOutput
62
- ```
63
-
64
- ## 使用方式
65
-
66
- ### 1. 基本用法
67
-
68
- ```typescript
69
- // 语义搜索
70
- const result = await memoryService.memoryLoad({
71
- query: "如何实现用户认证",
72
- limit: 10
73
- });
74
-
75
- // 返回语义最相关的记忆
76
- console.log(result.items);
77
- ```
78
-
79
- ### 2. 混合搜索
80
-
81
- ```typescript
82
- // 语义搜索 + 元数据过滤
83
- const result = await memoryService.memoryLoad({
84
- query: "数据库优化",
85
- tags: ["performance", "backend"],
86
- category: "engineering",
87
- limit: 10
88
- });
89
- ```
90
-
91
- ### 3. 会话隔离
92
-
93
- ```typescript
94
- // 限定在特定会话中搜索
95
- const result = await memoryService.memoryLoad({
96
- query: "项目进度",
97
- sessionId: "550e8400-e29b-41d4-a716-446655440000",
98
- scope: "stm"
99
- });
100
- ```
101
-
102
- ## 配置选项
103
-
104
- ### 环境变量
105
-
106
- ```bash
107
- # 启用/禁用向量搜索(默认: true)
108
- MEMHUB_VECTOR_SEARCH=true
109
-
110
- # 存储路径(默认: ./memories)
111
- MEMHUB_STORAGE_PATH=/path/to/memories
112
- ```
113
-
114
- ### 禁用向量搜索
115
-
116
- 在测试环境或资源受限场景下,可以禁用向量搜索:
117
-
118
- ```bash
119
- MEMHUB_VECTOR_SEARCH=false
120
- ```
121
-
122
- 禁用后:
123
- - `memory_load` 降级为纯元数据过滤
124
- - `memory_update` 不更新向量索引
125
- - 降低内存和磁盘占用
126
-
127
- ## Embedding 服务
128
-
129
- ### 模型特性
130
-
131
- - **名称**: Xenova/all-MiniLM-L6-v2
132
- - **大小**: ~23MB
133
- - **语言**: 英文为主,支持多语言
134
- - **性能**: 快速推理,适合实时搜索
135
-
136
- ### 单例模式
137
-
138
- ```typescript
139
- class EmbeddingService {
140
- private static instance: EmbeddingService | null = null;
141
-
142
- static getInstance(): EmbeddingService {
143
- if (!this.instance) {
144
- this.instance = new EmbeddingService();
145
- }
146
- return this.instance;
147
- }
148
-
149
- async embed(text: string): Promise<number[]> {
150
- // 返回 384 维归一化向量
151
- }
152
- }
153
- ```
154
-
155
- ### 懒加载
156
-
157
- 模型在首次使用时加载:
158
-
159
- ```typescript
160
- // 构造函数不加载模型
161
- const service = EmbeddingService.getInstance();
162
-
163
- // 首次调用 embed() 时加载模型
164
- const vector = await service.embed("some text");
165
-
166
- // 后续调用复用已加载的模型
167
- const vector2 = await service.embed("another text");
168
- ```
169
-
170
- ## Vector Index
171
-
172
- ### LanceDB 特性
173
-
174
- - **嵌入式**: 无需独立服务,直接访问文件系统
175
- - **高性能**: 基于 Apache Arrow 列式存储
176
- - **ACID**: 支持事务和并发控制
177
- - **可重建**: 可随时从 Markdown 重建索引
178
-
179
- ### 索引结构
180
-
181
- ```sql
182
- CREATE TABLE memories (
183
- id TEXT PRIMARY KEY,
184
- vector FLOAT[384],
185
- title TEXT,
186
- category TEXT,
187
- tags TEXT, -- JSON string
188
- importance INT,
189
- createdAt TEXT,
190
- updatedAt TEXT
191
- );
192
- ```
193
-
194
- ### 搜索算法
195
-
196
- 1. **向量搜索**: 使用 COSINE 距离
197
- 2. **Top-K**: 返回距离最小的 K 个结果
198
- 3. **过滤**: 可结合 SQL WHERE 子句
199
-
200
- ```typescript
201
- // 搜索示例
202
- const results = await table
203
- .vectorSearch(queryVector)
204
- .where("category = 'engineering'")
205
- .limit(10)
206
- .toArray();
207
- ```
208
-
209
- ## 重建索引
210
-
211
- 如果向量索引损坏或需要重建:
212
-
213
- ```typescript
214
- // 1. 删除现有索引
215
- rm -rf memories/.lancedb
216
-
217
- // 2. 重新启动服务,索引会在下次写入时自动重建
218
- // 或手动触发重建(TODO: 添加 CLI 命令)
219
- ```
220
-
221
- ## 性能优化
222
-
223
- ### 1. 模型缓存
224
-
225
- 模型下载后缓存在 `~/.cache/huggingface/`,避免重复下载。
226
-
227
- ### 2. 向量缓存
228
-
229
- LanceDB 自动缓存热门向量,提升搜索速度。
230
-
231
- ### 3. 批量处理
232
-
233
- 对于大量记忆条目,建议批量更新:
234
-
235
- ```typescript
236
- // TODO: 添加批量更新接口
237
- await memoryService.batchUpdate(memories);
238
- ```
239
-
240
- ### 4. 异步更新
241
-
242
- 向量索引更新在后台异步执行,不阻塞主流程:
243
-
244
- ```typescript
245
- // Markdown 写入完成立即返回
246
- // 向量索引在后台更新
247
- await memoryService.memoryUpdate(input);
248
- ```
249
-
250
- ## 错误处理
251
-
252
- ### 降级策略
253
-
254
- ```typescript
255
- try {
256
- // 尝试向量搜索
257
- const results = await vectorIndex.search(vector, limit);
258
- } catch (error) {
259
- // 降级为文本搜索
260
- console.warn('Vector search failed, falling back to text search');
261
- const results = await markdownStorage.search(query, limit);
262
- }
263
- ```
264
-
265
- ### 日志记录
266
-
267
- ```typescript
268
- // 成功
269
- console.log('Vector search completed', { query, results: results.length });
270
-
271
- // 失败
272
- console.error('Vector search failed', { error: error.message });
273
- ```
274
-
275
- ## 限制与注意事项
276
-
277
- ### 1. 语言支持
278
-
279
- 当前模型主要针对英文优化,中文效果可能不如英文。
280
-
281
- ### 2. 模型大小
282
-
283
- 模型约 23MB,首次使用时需要下载。
284
-
285
- ### 3. 内存占用
286
-
287
- ONNX Runtime 需要额外内存(约 100-200MB)。
288
-
289
- ### 4. 向量维度
290
-
291
- 固定 384 维,无法更改。
292
-
293
- ## 未来规划
294
-
295
- - [ ] 支持多语言模型(中文优化)
296
- - [ ] 添加模型管理 CLI 命令
297
- - [ ] 支持自定义 embedding 模型
298
- - [ ] 添加索引健康检查
299
- - [ ] 支持向量维度配置
300
- - [ ] 优化大批量索引构建
301
-
302
- ## 参考资料
303
-
304
- - [LanceDB 文档](https://lancedb.github.io/lancedb/)
305
- - [Xenova Transformers](https://github.com/xenova/transformers.js)
306
- - [all-MiniLM-L6-v2 模型](https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2)