memory-forge 0.1.8 → 0.1.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/TECHNICAL.md +526 -0
- package/TUTORIAL.md +353 -0
- package/package.json +3 -1
package/TECHNICAL.md
ADDED
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
# MemoryForge 技术文档
|
|
2
|
+
|
|
3
|
+
> 版本 0.1.8 | 8 MCP 工具 + 5 自动引擎 | Free 本地 + Pro Shelby 云
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
1. [系统架构](#系统架构)
|
|
8
|
+
2. [数据模型](#数据模型)
|
|
9
|
+
3. [MCP 工具 API 参考](#mcp-工具-api-参考)
|
|
10
|
+
4. [自动引擎](#自动引擎)
|
|
11
|
+
5. [Hook 系统](#hook-系统)
|
|
12
|
+
6. [存储层](#存储层)
|
|
13
|
+
7. [嵌入引擎](#嵌入引擎)
|
|
14
|
+
8. [安全模型](#安全模型)
|
|
15
|
+
9. [Pro 层 (Shelby 云)](#pro-层-shelby-云)
|
|
16
|
+
10. [错误处理与降级](#错误处理与降级)
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 系统架构
|
|
21
|
+
|
|
22
|
+
```
|
|
23
|
+
┌─────────────────────────────────────┐
|
|
24
|
+
│ AI Agent (Claude Code / Cursor) │ MCP stdio 协议
|
|
25
|
+
├─────────────────────────────────────┤
|
|
26
|
+
│ CLI 路由 (index.ts) │
|
|
27
|
+
│ setup / pro / hook / MCP Server │
|
|
28
|
+
├─────────────────────────────────────┤
|
|
29
|
+
│ 8 MCP Tools │
|
|
30
|
+
│ store / search / recall / list │
|
|
31
|
+
│ forget / context / export / share │
|
|
32
|
+
├──────────────┬──────────────────────┤
|
|
33
|
+
│ Free 层 │ Pro 层 │
|
|
34
|
+
│ memoryStore │ ShelbyNodeClient │
|
|
35
|
+
│ local .md │ upload/download/list │
|
|
36
|
+
├──────────────┴──────────────────────┤
|
|
37
|
+
│ 5 Auto Engines │
|
|
38
|
+
│ name → merge → priority → decay │
|
|
39
|
+
│ → contextSummary │
|
|
40
|
+
├─────────────────────────────────────┤
|
|
41
|
+
│ Embedding Engine │
|
|
42
|
+
│ Transformers.js / MiniLM-L6-v2 │
|
|
43
|
+
│ 384-dim vectors, cosine similarity │
|
|
44
|
+
│ fallback: keyword matching │
|
|
45
|
+
└─────────────────────────────────────┘
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### 源文件结构
|
|
49
|
+
|
|
50
|
+
```
|
|
51
|
+
agentvault/src/
|
|
52
|
+
├── index.ts # 入口: CLI 路由 + MCP Server
|
|
53
|
+
├── store.ts # MemoryStore: 内存索引 + 搜索
|
|
54
|
+
├── embedding.ts # Transformers.js 延迟加载引擎
|
|
55
|
+
├── setup.ts # 一键安装流程
|
|
56
|
+
├── pro.ts # Pro 激活 + 同步
|
|
57
|
+
├── auto/index.ts # 5 自动引擎
|
|
58
|
+
├── storage/
|
|
59
|
+
│ ├── local.ts # Markdown 文件读写
|
|
60
|
+
│ └── shelby.ts # Shelby 云 API 封装
|
|
61
|
+
├── hooks/install.ts # Claude Code hooks 配置
|
|
62
|
+
└── migrate/import.ts # 规则导入 + 去重
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## 数据模型
|
|
68
|
+
|
|
69
|
+
### Memory 接口
|
|
70
|
+
|
|
71
|
+
```typescript
|
|
72
|
+
interface Memory {
|
|
73
|
+
id: string; // UUID v4
|
|
74
|
+
name: string; // 人类可读名称 (autoName 生成, 最长40字符)
|
|
75
|
+
content: string; // 原始内容
|
|
76
|
+
category: string; // 分类: user-preference | project-context | decision-log | code-pattern
|
|
77
|
+
tags: string[]; // 标签列表
|
|
78
|
+
priority: number; // 1-10, autoPriority 动态调整
|
|
79
|
+
vector: number[]; // 384-dim 嵌入向量
|
|
80
|
+
created_at: string; // ISO-8601 创建时间
|
|
81
|
+
access_count: number; // 访问次数 (touch)
|
|
82
|
+
last_accessed: string | null; // 最后访问时间
|
|
83
|
+
}
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### 本地存储格式
|
|
87
|
+
|
|
88
|
+
文件路径: `~/.memory-forge/memories/{id}.md`
|
|
89
|
+
|
|
90
|
+
```markdown
|
|
91
|
+
# Memory Name
|
|
92
|
+
> category: user-preference
|
|
93
|
+
> tags: coding-style, javascript
|
|
94
|
+
> priority: 8
|
|
95
|
+
> created: 2026-06-26T10:00:00.000Z
|
|
96
|
+
> access_count: 5
|
|
97
|
+
> last_accessed: 2026-06-26T12:00:00.000Z
|
|
98
|
+
|
|
99
|
+
User prefers camelCase naming, single quotes, and 2-space indent.
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### MemoryStore 索引
|
|
103
|
+
|
|
104
|
+
- `Map<string, Memory>` 主存储
|
|
105
|
+
- `Map<string, Float32Array>` 向量缓存
|
|
106
|
+
- LRU 淘汰: 5000 条上限, 超出淘汰最低访问量×优先级
|
|
107
|
+
- 去重: Jaccard 相似度 > 0.8 自动合并
|
|
108
|
+
|
|
109
|
+
---
|
|
110
|
+
|
|
111
|
+
## MCP 工具 API 参考
|
|
112
|
+
|
|
113
|
+
所有工具通过 MCP stdio 协议调用。Agent 自动获得,无需手动调用。
|
|
114
|
+
|
|
115
|
+
### memory_store
|
|
116
|
+
|
|
117
|
+
存储一条记忆。自动向量化、命名、去重合并。
|
|
118
|
+
|
|
119
|
+
```typescript
|
|
120
|
+
// Input
|
|
121
|
+
{
|
|
122
|
+
content: string; // required, min 1 char
|
|
123
|
+
category?: string; // "general" | "user-preference" | "project-context" | "decision-log" | "code-pattern"
|
|
124
|
+
tags?: string[]; // default: []
|
|
125
|
+
priority?: number; // 1-10, default: 5
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Output (success)
|
|
129
|
+
{
|
|
130
|
+
success: true;
|
|
131
|
+
merged?: boolean; // true if merged with existing memory (>80% overlap)
|
|
132
|
+
memory_id: string;
|
|
133
|
+
name: string;
|
|
134
|
+
preview: string; // first 200 chars
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
**内部流程:**
|
|
139
|
+
1. `embed(content)` → 384-dim vector (失败则 vector=[])
|
|
140
|
+
2. `autoName(content)` → 从内容提取名称
|
|
141
|
+
3. `autoMerge(store, memory)` → 检查已有记忆, >0.8 Jaccard 则合并
|
|
142
|
+
4. `saveMemory(memory)` → 写本地 Markdown
|
|
143
|
+
5. `store.add(memory)` → 更新 LRU 缓存
|
|
144
|
+
6. Pro: `uploadMemory(memory)` → Shelby 云 (async, fire-and-forget)
|
|
145
|
+
|
|
146
|
+
### memory_search
|
|
147
|
+
|
|
148
|
+
语义检索记忆。向量优先, 失败自动降级关键词。
|
|
149
|
+
|
|
150
|
+
```typescript
|
|
151
|
+
// Input
|
|
152
|
+
{
|
|
153
|
+
query: string; // required, 自然语言
|
|
154
|
+
limit?: number; // 1-20, default: 5
|
|
155
|
+
min_similarity?: number; // 0-1, default: 0.6
|
|
156
|
+
category?: string; // filter by category
|
|
157
|
+
tags?: string[]; // filter by tags (OR match)
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// Output
|
|
161
|
+
{
|
|
162
|
+
query: string;
|
|
163
|
+
count: number;
|
|
164
|
+
results: [{
|
|
165
|
+
memory_id: string;
|
|
166
|
+
name: string;
|
|
167
|
+
similarity: number; // cosine similarity (0 if keyword fallback)
|
|
168
|
+
content: string;
|
|
169
|
+
_method: "vector" | "keyword";
|
|
170
|
+
}];
|
|
171
|
+
hint: string | null; // "No relevant memories found." if empty
|
|
172
|
+
}
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**评分公式 (向量模式):**
|
|
176
|
+
```
|
|
177
|
+
score = cosineSimilarity(queryVec, memoryVec)
|
|
178
|
+
× (priority / 5)
|
|
179
|
+
× (1 + min(access_count, 10) × 0.05)
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
**评分公式 (关键词模式):**
|
|
183
|
+
```
|
|
184
|
+
score = (contentHits × 2 + nameHits × 3) + priority
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
### memory_recall
|
|
188
|
+
|
|
189
|
+
按 ID 精确获取一条记忆。
|
|
190
|
+
|
|
191
|
+
```typescript
|
|
192
|
+
// Input
|
|
193
|
+
{ memory_id: string }
|
|
194
|
+
|
|
195
|
+
// Output (success)
|
|
196
|
+
{
|
|
197
|
+
memory_id, name, content, category, tags,
|
|
198
|
+
priority, created_at, access_count
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// Output (not found)
|
|
202
|
+
{ error: "Not found", memory_id }
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
### memory_list
|
|
206
|
+
|
|
207
|
+
列出记忆目录,支持分页和过滤。
|
|
208
|
+
|
|
209
|
+
```typescript
|
|
210
|
+
// Input
|
|
211
|
+
{
|
|
212
|
+
category?: string; // filter
|
|
213
|
+
tags?: string[]; // filter (OR match)
|
|
214
|
+
limit?: number; // 1-100, default: 20
|
|
215
|
+
offset?: number; // default: 0
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
// Output
|
|
219
|
+
{
|
|
220
|
+
total: number; // 总记忆数
|
|
221
|
+
count: number; // 当前页数量
|
|
222
|
+
memories: [{
|
|
223
|
+
memory_id, name, category,
|
|
224
|
+
tags, priority,
|
|
225
|
+
preview: string; // first 100 chars
|
|
226
|
+
}];
|
|
227
|
+
}
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### memory_forget
|
|
231
|
+
|
|
232
|
+
删除一条记忆(本地文件 + 内存缓存)。
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// Input
|
|
236
|
+
{ memory_id: string }
|
|
237
|
+
|
|
238
|
+
// Output
|
|
239
|
+
{
|
|
240
|
+
success: boolean;
|
|
241
|
+
memory_id: string;
|
|
242
|
+
action: "deleted" | "not_found";
|
|
243
|
+
}
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### memory_context
|
|
247
|
+
|
|
248
|
+
加载当前会话上下文,返回最近访问的高优先级记忆摘要。
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// Input
|
|
252
|
+
{ limit?: number; // 1-20, default: 5 }
|
|
253
|
+
|
|
254
|
+
// Output
|
|
255
|
+
{
|
|
256
|
+
context_loaded: true;
|
|
257
|
+
memory_count: number;
|
|
258
|
+
context: string; // 格式: "- [name] preview..."
|
|
259
|
+
}
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**排序:** `access_count` DESC, 同分则 `priority` DESC。
|
|
263
|
+
|
|
264
|
+
### memory_export
|
|
265
|
+
|
|
266
|
+
导出记忆为 JSON 或 Markdown。
|
|
267
|
+
|
|
268
|
+
```typescript
|
|
269
|
+
// Input
|
|
270
|
+
{
|
|
271
|
+
memory_ids?: string[]; // 不指定则导出全部
|
|
272
|
+
format?: "json" | "markdown"; // default: "json"
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
// Output (JSON)
|
|
276
|
+
{
|
|
277
|
+
exported_at: string;
|
|
278
|
+
version: "memory-forge-1.0";
|
|
279
|
+
count: number;
|
|
280
|
+
memories: [{ id, name, content, category, tags, priority, created_at }];
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
// Output (Markdown)
|
|
284
|
+
# Memory Name
|
|
285
|
+
> category: x | tags: a, b | priority: 7
|
|
286
|
+
...
|
|
287
|
+
---
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
### memory_share
|
|
291
|
+
|
|
292
|
+
打包单条记忆供队友导入。
|
|
293
|
+
|
|
294
|
+
```typescript
|
|
295
|
+
// Input
|
|
296
|
+
{
|
|
297
|
+
memory_id: string;
|
|
298
|
+
recipient?: string;
|
|
299
|
+
note?: string;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
// Output
|
|
303
|
+
{
|
|
304
|
+
type: "memory-forge-share";
|
|
305
|
+
version: "1.0";
|
|
306
|
+
shared_at: string;
|
|
307
|
+
recipient: string | null;
|
|
308
|
+
note: string | null;
|
|
309
|
+
memory: { name, content, category, tags };
|
|
310
|
+
import_instruction: "Use memory_store with this content to import.";
|
|
311
|
+
}
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
---
|
|
315
|
+
|
|
316
|
+
## 自动引擎
|
|
317
|
+
|
|
318
|
+
所有引擎位于 `src/auto/index.ts`。
|
|
319
|
+
|
|
320
|
+
### autoName
|
|
321
|
+
|
|
322
|
+
从内容提取人类可读名称。
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
算法:
|
|
326
|
+
1. 移除代码块 (```...```)
|
|
327
|
+
2. 取前 40 字符
|
|
328
|
+
3. 换行替换为空格
|
|
329
|
+
4. 空内容 → "memory"
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
### autoMerge
|
|
333
|
+
|
|
334
|
+
检测并合并重复记忆。
|
|
335
|
+
|
|
336
|
+
```
|
|
337
|
+
算法:
|
|
338
|
+
1. Jaccard 相似度: |setA ∩ setB| / min(|setA|, |setB|)
|
|
339
|
+
2. 单词长度 ≥ 3
|
|
340
|
+
3. 阈值: > 0.8 → 合并
|
|
341
|
+
4. 合并后重新计算向量
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
### autoPriority
|
|
345
|
+
|
|
346
|
+
基于 Ebbinghaus 遗忘曲线计算优先级 (1-10)。
|
|
347
|
+
|
|
348
|
+
```
|
|
349
|
+
公式:
|
|
350
|
+
freqWeight = min(access_count, 50) / 50
|
|
351
|
+
recencyWeight = 1 - (daysSinceLastAccess / 90) // clamp 0-1
|
|
352
|
+
ageWeight = 1 - min(ageDays, 365) / 365
|
|
353
|
+
|
|
354
|
+
priority = 1 + 9 × (freqWeight × 0.4 + recencyWeight × 0.4 + ageWeight × 0.2)
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
### autoDecay
|
|
358
|
+
|
|
359
|
+
Ebbinghaus 遗忘曲线判定记忆是否归档。
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
| 天数 | 衰减值 | 含义 |
|
|
363
|
+
|------|--------|------|
|
|
364
|
+
| ≤1 | 1.0 | 活跃 |
|
|
365
|
+
| ≤7 | 0.8 | 近期 |
|
|
366
|
+
| ≤30 | 0.5 | 衰减中 |
|
|
367
|
+
| ≤90 | 0.2 | 弱记忆 |
|
|
368
|
+
| >90 | 0 | 归档 (删除) |
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
### generateContextSummary
|
|
372
|
+
|
|
373
|
+
生成 Agent 上下文摘要。
|
|
374
|
+
|
|
375
|
+
```
|
|
376
|
+
算法:
|
|
377
|
+
1. 取全部记忆, 按 access_count DESC, priority DESC 排序
|
|
378
|
+
2. 截取 top-N
|
|
379
|
+
3. 每条截断 150 字符
|
|
380
|
+
4. 格式: "- [name] content..."
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
---
|
|
384
|
+
|
|
385
|
+
## Hook 系统
|
|
386
|
+
|
|
387
|
+
配置位置: `~/.claude/settings.json`
|
|
388
|
+
|
|
389
|
+
```json
|
|
390
|
+
{
|
|
391
|
+
"hooks": {
|
|
392
|
+
"SessionStart": [{
|
|
393
|
+
"hooks": [{"type": "command", "command": "memory-forge hook session-start"}]
|
|
394
|
+
}],
|
|
395
|
+
"Stop": [{
|
|
396
|
+
"hooks": [{"type": "command", "command": "memory-forge hook stop"}]
|
|
397
|
+
}],
|
|
398
|
+
"PreCompact": [{
|
|
399
|
+
"hooks": [{"type": "command", "command": "memory-forge hook pre-compact"}]
|
|
400
|
+
}]
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### 生命周期
|
|
406
|
+
|
|
407
|
+
```
|
|
408
|
+
SessionStart → 加载 top-5 记忆 → 注入 Agent 上下文 (stdout)
|
|
409
|
+
↓
|
|
410
|
+
Agent 工作 → 调 memory_store / memory_search / ...
|
|
411
|
+
↓
|
|
412
|
+
PreCompact → 加载 top-8 记忆 + 注入存储指令 → Agent 自动保存
|
|
413
|
+
↓
|
|
414
|
+
Stop → autoPriority 重算 + autoDecay 检查 + 归档过期记忆
|
|
415
|
+
↓
|
|
416
|
+
(下次) SessionStart → 记忆已保留 ✅
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
### 关键设计决策
|
|
420
|
+
|
|
421
|
+
**为什么 PreCompact 而非 Stop 做 auto-capture?**
|
|
422
|
+
Stop hook 只在正常退出时触发。`kill` / 关终端窗口 / 崩溃 → Stop 不跑。PreCompact 在上下文快满时一定触发,此时进程还活着,Agent 能执行存储指令。
|
|
423
|
+
|
|
424
|
+
---
|
|
425
|
+
|
|
426
|
+
## 存储层
|
|
427
|
+
|
|
428
|
+
### Free 层 (本地 Markdown)
|
|
429
|
+
|
|
430
|
+
- 路径: `~/.memory-forge/memories/{id}.md`
|
|
431
|
+
- 格式: 类 YAML frontmatter + Markdown body
|
|
432
|
+
- 编码: UTF-8
|
|
433
|
+
- 权限: 用户文件系统控制
|
|
434
|
+
- 网络: 零
|
|
435
|
+
|
|
436
|
+
### Pro 层 (Shelby 云)
|
|
437
|
+
|
|
438
|
+
- SDK: `@shelby-protocol/sdk` ^0.3.1 (optionalDep)
|
|
439
|
+
- 网络: Shelbynet 测试网
|
|
440
|
+
- 认证: API Key + Ed25519 链上账户
|
|
441
|
+
- Blob 格式: `memories/{id}.json` (JSON)
|
|
442
|
+
- 过期: 365 天
|
|
443
|
+
- 数据流: 双向同步 (session 启动时 ↓↑, memory_store 时 ↑)
|
|
444
|
+
|
|
445
|
+
**Pro 数据流:**
|
|
446
|
+
```
|
|
447
|
+
SessionStart:
|
|
448
|
+
syncAll():
|
|
449
|
+
↓ listBlobs() → 获取远程记忆列表
|
|
450
|
+
↓ downloadMemory() → 下载本地不存在的 (30s timeout)
|
|
451
|
+
↑ uploadMemory() → 上传本地有而远程无的
|
|
452
|
+
→ 双向同步完成
|
|
453
|
+
|
|
454
|
+
memory_store:
|
|
455
|
+
saveMemory() → 本地
|
|
456
|
+
uploadMemory() → Shelby (fire-and-forget, 失败不阻塞)
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
---
|
|
460
|
+
|
|
461
|
+
## 嵌入引擎
|
|
462
|
+
|
|
463
|
+
### 技术栈
|
|
464
|
+
|
|
465
|
+
- 库: `@huggingface/transformers` ^3.0.0
|
|
466
|
+
- 模型: Xenova/all-MiniLM-L6-v2
|
|
467
|
+
- 大小: ~23MB (首次下载, 后续缓存)
|
|
468
|
+
- 维度: 384
|
|
469
|
+
- 池化: mean pooling + L2 normalize
|
|
470
|
+
|
|
471
|
+
### 降级策略
|
|
472
|
+
|
|
473
|
+
```
|
|
474
|
+
加载模型
|
|
475
|
+
→ 成功: cos similarity search
|
|
476
|
+
→ 失败: keyword matching (Jaccard)
|
|
477
|
+
+ 5 分钟自动重试
|
|
478
|
+
+ sleep(300s) 防止请求风暴
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
### 性能
|
|
482
|
+
|
|
483
|
+
- 首次加载: 3-10s (取决于网络, 23MB 下载)
|
|
484
|
+
- 后续推理: < 100ms
|
|
485
|
+
- 降级关键词: < 10ms
|
|
486
|
+
- 模型缓存: Transformers.js 内置缓存
|
|
487
|
+
|
|
488
|
+
---
|
|
489
|
+
|
|
490
|
+
## 安全模型
|
|
491
|
+
|
|
492
|
+
### Free 层
|
|
493
|
+
|
|
494
|
+
- 全部数据在 `~/.memory-forge/` 目录
|
|
495
|
+
- 零持续网络请求
|
|
496
|
+
- 唯一网络: 首次模型下载 (HuggingFace CDN, 23MB)
|
|
497
|
+
- 模型下载失败 → 关键词降级, 零功能损失
|
|
498
|
+
|
|
499
|
+
### Pro 层
|
|
500
|
+
|
|
501
|
+
- API Key: 环境变量 `SHELBY_API_KEY` 注入, 不落盘
|
|
502
|
+
- 私钥: `~/.memory-forge/pro.json`, Ed25519 格式
|
|
503
|
+
- 传输: HTTPS (Shelbynet API)
|
|
504
|
+
- 链上: 每条记忆 → Aptos blob upload transaction
|
|
505
|
+
- 删除: tombstone blob (标记删除, 链上不可篡改)
|
|
506
|
+
|
|
507
|
+
### 记忆权限
|
|
508
|
+
|
|
509
|
+
- 文件系统权限 = 记忆权限 (Free)
|
|
510
|
+
- 链上账户签名 = 记忆权限 (Pro)
|
|
511
|
+
- 无内置认证/授权层 (Agent 已通过 Claude Code 认证)
|
|
512
|
+
|
|
513
|
+
---
|
|
514
|
+
|
|
515
|
+
## 错误处理与降级
|
|
516
|
+
|
|
517
|
+
| 场景 | 行为 | 影响 |
|
|
518
|
+
|------|------|------|
|
|
519
|
+
| 嵌入模型下载失败 | 关键词搜索, 5min 重试 | 搜索精度下降, 功能可用 |
|
|
520
|
+
| 嵌入模型推理失败 | 返回 null, 关键词降级 | 单次查询降级 |
|
|
521
|
+
| Shelby 上传失败 | console.error, 不阻塞 | Pro 同步不同步, 本地完好 |
|
|
522
|
+
| Shelby 下载超时 | 30s timeout, 返回 null | 该条不同步, 其他正常 |
|
|
523
|
+
| Shelby 链上 gas 不足 | 上传失败 + 错误消息 | Pro 不可用, Free 完好 |
|
|
524
|
+
| parseMemoryFile 损坏 | 跳过该文件, 返回 null | 损坏文件被忽略 |
|
|
525
|
+
| 磁盘写失败 | 静默失败 | 记忆丢失 (极罕见) |
|
|
526
|
+
| LRU 满 5000 | 淘汰最低 access_count × priority | 旧记忆清出内存, 磁盘保留 |
|
package/TUTORIAL.md
ADDED
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
# MemoryForge 使用教程
|
|
2
|
+
|
|
3
|
+
> 一条命令。零配置。AI Agent 从此拥有持久记忆。
|
|
4
|
+
|
|
5
|
+
## 目录
|
|
6
|
+
|
|
7
|
+
1. [快速开始](#快速开始)
|
|
8
|
+
2. [工作原理](#工作原理)
|
|
9
|
+
3. [日常使用](#日常使用)
|
|
10
|
+
4. [Pro 版 (云同步)](#pro-版-云同步)
|
|
11
|
+
5. [管理记忆](#管理记忆)
|
|
12
|
+
6. [最佳实践](#最佳实践)
|
|
13
|
+
7. [排错指南](#排错指南)
|
|
14
|
+
8. [卸载](#卸载)
|
|
15
|
+
|
|
16
|
+
---
|
|
17
|
+
|
|
18
|
+
## 快速开始
|
|
19
|
+
|
|
20
|
+
### 安装
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npx memory-forge setup
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
一步完成:
|
|
27
|
+
- 安装 Claude Code hooks (SessionStart / Stop / PreCompact)
|
|
28
|
+
- 自动导入已有规则 (CLAUDE.md / .cursor/rules / .gitconfig)
|
|
29
|
+
- 预加载嵌入模型 (23MB, 首次, 后续离线)
|
|
30
|
+
- 全局安装 `memory-forge` 命令
|
|
31
|
+
|
|
32
|
+
**支持平台:** Claude Code (全平台), Cursor (通过 MCP), Windsurf, VS Code。
|
|
33
|
+
|
|
34
|
+
### 验证安装
|
|
35
|
+
|
|
36
|
+
重启 Claude Code,你会看到:
|
|
37
|
+
|
|
38
|
+
```
|
|
39
|
+
- [Git User Info] Git user email: xxx
|
|
40
|
+
- [Claude Code Rules] For independent parallel tasks...
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
这表示 SessionStart hook 已生效,Agent 加载了你的记忆。
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## 工作原理
|
|
48
|
+
|
|
49
|
+
### 自动化记忆生命周期
|
|
50
|
+
|
|
51
|
+
```
|
|
52
|
+
你打开 Claude Code
|
|
53
|
+
→ Agent 自动加载你的偏好和项目上下文
|
|
54
|
+
|
|
55
|
+
你工作...
|
|
56
|
+
→ Agent 自动记住你的编码风格、技术决策、项目偏好
|
|
57
|
+
|
|
58
|
+
上下文快满时 (PreCompact)
|
|
59
|
+
→ Agent 自动保存关键信息到记忆库
|
|
60
|
+
→ 即使你强制关终端,记忆也不会丢失
|
|
61
|
+
|
|
62
|
+
你关闭 Claude Code (Stop)
|
|
63
|
+
→ 自动更新记忆优先级 (常用记忆提高权重)
|
|
64
|
+
→ 自动归档 90 天未用的旧记忆
|
|
65
|
+
|
|
66
|
+
下次打开
|
|
67
|
+
→ Agent 又什么都记得 ✅
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 你什么都不用做
|
|
71
|
+
|
|
72
|
+
Agent 自动:
|
|
73
|
+
- **存储**: 你提到偏好、决策、教训 → Agent 调 `memory_store`
|
|
74
|
+
- **搜索**: 需要回忆之前的事 → Agent 调 `memory_search`
|
|
75
|
+
- **维护**: 优先级调整、过期清理 → 自动
|
|
76
|
+
|
|
77
|
+
---
|
|
78
|
+
|
|
79
|
+
## 日常使用
|
|
80
|
+
|
|
81
|
+
### 基本交互
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
你: "我偏好 camelCase 命名,单引号,2 空格缩进"
|
|
85
|
+
|
|
86
|
+
Agent 自动调 memory_store → 记忆保存 ✅
|
|
87
|
+
下次写代码,Agent 自动遵循你的偏好。
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
你: "之前那个 token 刷新 bug 怎么修的?"
|
|
92
|
+
|
|
93
|
+
Agent 调 memory_search → 找到相关记忆
|
|
94
|
+
"6 月 15 日,你在 auth.ts 修了 token 过期判断从 < 改为 <="
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
你: "帮我重构认证模块"
|
|
99
|
+
|
|
100
|
+
Agent 调 memory_context → 加载上下文
|
|
101
|
+
"好的。根据之前的记录,项目用 React 19 + JWT + refresh token 模式。从 auth.ts 开始?"
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 主动使用
|
|
105
|
+
|
|
106
|
+
你也可以明确让 Agent 操作记忆:
|
|
107
|
+
|
|
108
|
+
```
|
|
109
|
+
"存储一条记忆: 生产数据库用 PostgreSQL 16,连接串在 .env.production"
|
|
110
|
+
"搜索关于部署流程的记忆"
|
|
111
|
+
"列出我所有的记忆"
|
|
112
|
+
"导出全部记忆为 Markdown"
|
|
113
|
+
"删除 ID 为 xxx 的旧记忆"
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Pro 版 (云同步)
|
|
119
|
+
|
|
120
|
+
### 什么情况需要 Pro
|
|
121
|
+
|
|
122
|
+
- 你有多台电脑,想在设备间共享记忆
|
|
123
|
+
- 你担心硬盘故障丢失记忆
|
|
124
|
+
- 你想和队友共享项目记忆
|
|
125
|
+
|
|
126
|
+
### 开通 Pro
|
|
127
|
+
|
|
128
|
+
```bash
|
|
129
|
+
# 1. 获取 API Key
|
|
130
|
+
# 访问 https://docs.shelby.xyz/sdks/typescript/acquire-api-keys
|
|
131
|
+
|
|
132
|
+
# 2. 激活 Pro
|
|
133
|
+
SHELBY_API_KEY="your-api-key" memory-forge pro
|
|
134
|
+
|
|
135
|
+
# 3. 第一次需要充值 APT + ShelbyUSD (测试网水龙头)
|
|
136
|
+
# 地址会打印在屏幕上,去 faucet 领取:
|
|
137
|
+
# APT: https://docs.shelby.xyz/apis/faucet/aptos
|
|
138
|
+
# ShelbyUSD: https://docs.shelby.xyz/apis/faucet/shelbyusd
|
|
139
|
+
|
|
140
|
+
# 4. 领取后重新运行同步
|
|
141
|
+
SHELBY_API_KEY="your-api-key" memory-forge pro
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
### 多设备同步
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
设备 A: 激活 Pro → 工作 → 记忆自动上传
|
|
148
|
+
设备 B: 设置 SHELBY_API_KEY 环境变量 → 安装 → 记忆自动下载
|
|
149
|
+
→ Agent 在设备 B 上也能记住一切 ✅
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### 环境变量
|
|
153
|
+
|
|
154
|
+
建议写入 shell 配置文件:
|
|
155
|
+
|
|
156
|
+
```bash
|
|
157
|
+
# ~/.bashrc 或 ~/.zshrc
|
|
158
|
+
export SHELBY_API_KEY="your-api-key"
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
这样每次 Agent 启动自动启用 Pro 同步,无需手动运行命令。
|
|
162
|
+
|
|
163
|
+
---
|
|
164
|
+
|
|
165
|
+
## 管理记忆
|
|
166
|
+
|
|
167
|
+
### 查看记忆
|
|
168
|
+
|
|
169
|
+
```bash
|
|
170
|
+
# 查看记忆文件
|
|
171
|
+
ls ~/.memory-forge/memories/
|
|
172
|
+
|
|
173
|
+
# 读某条记忆
|
|
174
|
+
cat ~/.memory-forge/memories/{id}.md
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
记忆文件是人类可读的 Markdown,可以直接编辑。
|
|
178
|
+
|
|
179
|
+
### 导出
|
|
180
|
+
|
|
181
|
+
```
|
|
182
|
+
# Agent 方式
|
|
183
|
+
"导出全部记忆为 JSON"
|
|
184
|
+
"导出关于认证的记忆为 Markdown"
|
|
185
|
+
|
|
186
|
+
# 命令行方式
|
|
187
|
+
# JSON 导出在 Agent 调用 memory_export 后获取
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### 备份
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# 本地备份 (Free 层)
|
|
194
|
+
cp -r ~/.memory-forge/memories/ ~/backup/
|
|
195
|
+
|
|
196
|
+
# Pro 层自动备份到 Shelby 云
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
### 清理
|
|
200
|
+
|
|
201
|
+
```bash
|
|
202
|
+
# 删除全部本地记忆
|
|
203
|
+
rm -rf ~/.memory-forge/memories/*.md
|
|
204
|
+
|
|
205
|
+
# 删除单条
|
|
206
|
+
rm ~/.memory-forge/memories/{id}.md
|
|
207
|
+
|
|
208
|
+
# Pro 账户重置
|
|
209
|
+
rm ~/.memory-forge/pro.json
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
---
|
|
213
|
+
|
|
214
|
+
## 最佳实践
|
|
215
|
+
|
|
216
|
+
### 什么值得记
|
|
217
|
+
|
|
218
|
+
| 值得记 | 不值得记 |
|
|
219
|
+
|--------|---------|
|
|
220
|
+
| 编码风格偏好 | 单次 debug 过程 |
|
|
221
|
+
| 项目架构决策 | 临时实验代码 |
|
|
222
|
+
| 团队约定 | 过时的配置 |
|
|
223
|
+
| 常用命令和流程 | 纯事实性知识 |
|
|
224
|
+
| 踩过的坑和解决方案 | 一次性任务 |
|
|
225
|
+
|
|
226
|
+
### 记忆质量
|
|
227
|
+
|
|
228
|
+
```
|
|
229
|
+
✅ 好: "项目用 PostgreSQL 16 + Prisma ORM,连接池上限 20"
|
|
230
|
+
❌ 差: "数据库是 pg"
|
|
231
|
+
|
|
232
|
+
✅ 好: "用户偏好 camelCase,单引号,2 空格,React 19 + TypeScript strict"
|
|
233
|
+
❌ 差: "用 camelCase"
|
|
234
|
+
|
|
235
|
+
✅ 好: "6/26 决定用 Redis 缓存 token,因为 DB 查询太慢 (>500ms)"
|
|
236
|
+
❌ 差: "用了 Redis"
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### 定期维护
|
|
240
|
+
|
|
241
|
+
每月做一次记忆清理:
|
|
242
|
+
|
|
243
|
+
```
|
|
244
|
+
"查看我所有记忆,标记哪些过时了或不再需要"
|
|
245
|
+
"删除 3 个月前关于旧项目的记忆"
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
---
|
|
249
|
+
|
|
250
|
+
## 排错指南
|
|
251
|
+
|
|
252
|
+
### Hook 不生效
|
|
253
|
+
|
|
254
|
+
**症状:** 打开 Claude Code 看不到记忆加载。
|
|
255
|
+
|
|
256
|
+
**解决:**
|
|
257
|
+
```bash
|
|
258
|
+
# 1. 检查 hook 配置
|
|
259
|
+
memory-forge hook session-start
|
|
260
|
+
|
|
261
|
+
# 2. 重新安装 hooks
|
|
262
|
+
memory-forge setup
|
|
263
|
+
|
|
264
|
+
# 3. 确认 settings.json
|
|
265
|
+
cat ~/.claude/settings.json | grep memory-forge
|
|
266
|
+
|
|
267
|
+
# 4. 重启 Claude Code
|
|
268
|
+
```
|
|
269
|
+
|
|
270
|
+
### Stop hook 报错
|
|
271
|
+
|
|
272
|
+
**症状:** 关闭时显示 "Stop hook error"。
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
# 确认全局安装
|
|
276
|
+
npm ls -g memory-forge
|
|
277
|
+
|
|
278
|
+
# 如果不是最新版
|
|
279
|
+
npm i -g memory-forge@latest
|
|
280
|
+
|
|
281
|
+
# 检查 hook 命令格式
|
|
282
|
+
# settings.json 中应该是 "memory-forge hook stop",不是 "npx memory-forge hook stop"
|
|
283
|
+
```
|
|
284
|
+
|
|
285
|
+
### 记忆搜索不准确
|
|
286
|
+
|
|
287
|
+
**症状:** memory_search 返回无关结果。
|
|
288
|
+
|
|
289
|
+
```bash
|
|
290
|
+
# 检查嵌入模型是否下载成功
|
|
291
|
+
# 如果看到 "[MemoryForge] Falling back to keyword matching"
|
|
292
|
+
# → 模型下载失败,使用关键词模式
|
|
293
|
+
|
|
294
|
+
# 解决: 等待 5 分钟自动重试,或手动触发重试
|
|
295
|
+
# 模型大小 23MB,确保网络正常
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
### Pro 同步失败
|
|
299
|
+
|
|
300
|
+
**症状:** "Shelby upload failed: INSUFFICIENT_BALANCE_FOR_TRANSACTION_FEE"
|
|
301
|
+
|
|
302
|
+
```bash
|
|
303
|
+
# 检查账户余额
|
|
304
|
+
# 去 faucet 领取 APT + ShelbyUSD
|
|
305
|
+
# 然后重新运行 pro 命令
|
|
306
|
+
|
|
307
|
+
SHELBY_API_KEY="your-key" memory-forge pro
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
### 重复记忆
|
|
311
|
+
|
|
312
|
+
**症状:** memory_list 显示重复的相似记忆。
|
|
313
|
+
|
|
314
|
+
```bash
|
|
315
|
+
# 0.1.6+ 已根因修复。如果仍有:
|
|
316
|
+
# 1. 升级到最新版
|
|
317
|
+
npm i -g memory-forge@latest
|
|
318
|
+
memory-forge setup
|
|
319
|
+
|
|
320
|
+
# 2. 手动清理
|
|
321
|
+
# 删除 ~/.memory-forge/memories/ 中的重复 .md 文件
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
### 完全重置
|
|
325
|
+
|
|
326
|
+
```bash
|
|
327
|
+
# 1. 删记忆
|
|
328
|
+
rm -rf ~/.memory-forge/memories/*.md
|
|
329
|
+
|
|
330
|
+
# 2. 删 Pro 账户 (可选)
|
|
331
|
+
rm -f ~/.memory-forge/pro.json
|
|
332
|
+
|
|
333
|
+
# 3. 清除 hooks
|
|
334
|
+
# 编辑 ~/.claude/settings.json, 删除含 "memory-forge" 的条目
|
|
335
|
+
|
|
336
|
+
# 4. 重装
|
|
337
|
+
memory-forge setup
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
---
|
|
341
|
+
|
|
342
|
+
## 卸载
|
|
343
|
+
|
|
344
|
+
```bash
|
|
345
|
+
# 删除所有本地数据
|
|
346
|
+
rm -rf ~/.memory-forge/
|
|
347
|
+
|
|
348
|
+
# 编辑 ~/.claude/settings.json
|
|
349
|
+
# 删除 hooks 中包含 "memory-forge" 的所有条目
|
|
350
|
+
|
|
351
|
+
# 卸载全局命令
|
|
352
|
+
npm uninstall -g memory-forge
|
|
353
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "memory-forge",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.9",
|
|
4
4
|
"description": "Forge persistent memories for your AI agent. 8 MCP tools + 5 auto-engines. Powered by Shelby decentralized cloud.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
@@ -33,6 +33,8 @@
|
|
|
33
33
|
"files": [
|
|
34
34
|
"dist/",
|
|
35
35
|
"README.md",
|
|
36
|
+
"TECHNICAL.md",
|
|
37
|
+
"TUTORIAL.md",
|
|
36
38
|
"LICENSE"
|
|
37
39
|
],
|
|
38
40
|
"scripts": {
|