pmem-ai 0.5.0

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 (99) hide show
  1. package/CHANGELOG.md +57 -0
  2. package/LICENSE +21 -0
  3. package/README.md +349 -0
  4. package/dist/commands/ask.d.ts +3 -0
  5. package/dist/commands/ask.d.ts.map +1 -0
  6. package/dist/commands/ask.js +303 -0
  7. package/dist/commands/ask.js.map +1 -0
  8. package/dist/commands/distill.d.ts +6 -0
  9. package/dist/commands/distill.d.ts.map +1 -0
  10. package/dist/commands/distill.js +425 -0
  11. package/dist/commands/distill.js.map +1 -0
  12. package/dist/commands/graph.d.ts +6 -0
  13. package/dist/commands/graph.d.ts.map +1 -0
  14. package/dist/commands/graph.js +216 -0
  15. package/dist/commands/graph.js.map +1 -0
  16. package/dist/commands/init.d.ts +5 -0
  17. package/dist/commands/init.d.ts.map +1 -0
  18. package/dist/commands/init.js +566 -0
  19. package/dist/commands/init.js.map +1 -0
  20. package/dist/commands/integration.d.ts +2 -0
  21. package/dist/commands/integration.d.ts.map +1 -0
  22. package/dist/commands/integration.js +216 -0
  23. package/dist/commands/integration.js.map +1 -0
  24. package/dist/commands/migrate.d.ts +6 -0
  25. package/dist/commands/migrate.d.ts.map +1 -0
  26. package/dist/commands/migrate.js +379 -0
  27. package/dist/commands/migrate.js.map +1 -0
  28. package/dist/commands/rebuild.d.ts +8 -0
  29. package/dist/commands/rebuild.d.ts.map +1 -0
  30. package/dist/commands/rebuild.js +299 -0
  31. package/dist/commands/rebuild.js.map +1 -0
  32. package/dist/commands/recall.d.ts +3 -0
  33. package/dist/commands/recall.d.ts.map +1 -0
  34. package/dist/commands/recall.js +140 -0
  35. package/dist/commands/recall.js.map +1 -0
  36. package/dist/commands/session.d.ts +3 -0
  37. package/dist/commands/session.d.ts.map +1 -0
  38. package/dist/commands/session.js +147 -0
  39. package/dist/commands/session.js.map +1 -0
  40. package/dist/commands/status.d.ts +5 -0
  41. package/dist/commands/status.d.ts.map +1 -0
  42. package/dist/commands/status.js +275 -0
  43. package/dist/commands/status.js.map +1 -0
  44. package/dist/commands/update.d.ts +14 -0
  45. package/dist/commands/update.d.ts.map +1 -0
  46. package/dist/commands/update.js +536 -0
  47. package/dist/commands/update.js.map +1 -0
  48. package/dist/commands/verify.d.ts +4 -0
  49. package/dist/commands/verify.d.ts.map +1 -0
  50. package/dist/commands/verify.js +296 -0
  51. package/dist/commands/verify.js.map +1 -0
  52. package/dist/core/db.d.ts +47 -0
  53. package/dist/core/db.d.ts.map +1 -0
  54. package/dist/core/db.js +326 -0
  55. package/dist/core/db.js.map +1 -0
  56. package/dist/core/format.d.ts +3 -0
  57. package/dist/core/format.d.ts.map +1 -0
  58. package/dist/core/format.js +221 -0
  59. package/dist/core/format.js.map +1 -0
  60. package/dist/core/fs.d.ts +16 -0
  61. package/dist/core/fs.d.ts.map +1 -0
  62. package/dist/core/fs.js +175 -0
  63. package/dist/core/fs.js.map +1 -0
  64. package/dist/core/git.d.ts +6 -0
  65. package/dist/core/git.d.ts.map +1 -0
  66. package/dist/core/git.js +20 -0
  67. package/dist/core/git.js.map +1 -0
  68. package/dist/core/hash.d.ts +10 -0
  69. package/dist/core/hash.d.ts.map +1 -0
  70. package/dist/core/hash.js +25 -0
  71. package/dist/core/hash.js.map +1 -0
  72. package/dist/core/manifest.d.ts +6 -0
  73. package/dist/core/manifest.d.ts.map +1 -0
  74. package/dist/core/manifest.js +207 -0
  75. package/dist/core/manifest.js.map +1 -0
  76. package/dist/core/yaml.d.ts +11 -0
  77. package/dist/core/yaml.d.ts.map +1 -0
  78. package/dist/core/yaml.js +94 -0
  79. package/dist/core/yaml.js.map +1 -0
  80. package/dist/index.d.ts +3 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +167 -0
  83. package/dist/index.js.map +1 -0
  84. package/dist/types.d.ts +351 -0
  85. package/dist/types.d.ts.map +1 -0
  86. package/dist/types.js +4 -0
  87. package/dist/types.js.map +1 -0
  88. package/docs/Voorlopige projekidee.md +695 -0
  89. package/docs/handover-v0.3.md +355 -0
  90. package/docs/handover-v0.4.md +367 -0
  91. package/docs/prd.md +318 -0
  92. package/docs/project-roadmap.md +279 -0
  93. package/docs/release-checklist-v0.5.md +109 -0
  94. package/docs/v0.2 pre-design.md +182 -0
  95. package/docs/v0.2 pre-roadmap.md +270 -0
  96. package/docs/v0.3 pre-design.md +686 -0
  97. package/docs/v0.4 pre-design.md +417 -0
  98. package/docs/v0.5 pre-design.md +481 -0
  99. package/package.json +67 -0
@@ -0,0 +1,367 @@
1
+ # pmem v0.4 交接文档
2
+
3
+ ## 一、项目概况
4
+
5
+ **pmem**(Project Memory for Agents)是一个面向 AI coding agent 的图结构项目记忆 CLI 运行时。它让 Agent 以极少 token 恢复项目上下文、查找相关记忆、溯源决策,并通过感知代码变更自动建议记忆更新。
6
+
7
+ - **仓库:** [github.com/KkSss999/pmem](https://github.com/KkSss999/pmem)(Private)
8
+ - **当前版本:** v0.4.0(main 分支)
9
+ - **技术栈:** TypeScript (strict, CommonJS, ES2022) + Commander + js-yaml + better-sqlite3
10
+ - **运行时:** Node.js ≥18
11
+ - **测试框架:** Node.js 原生 `node:test`(88 测试,~760ms)
12
+ - **测试隔离区:** `temp/`(gitignored)
13
+
14
+ ### 一句话状态
15
+
16
+ > v0.1 + v0.2 + v0.3 + v0.4 全部完成。15 个命令、零 TypeScript 错误、88 测试全通过。Agent workflow 闭环已打通:代码变更感知 → dirty 标记 → 建议生成 → 确认写入 → 蒸馏 → 验证。
17
+
18
+ ---
19
+
20
+ ## 二、版本演进概览
21
+
22
+ | 版本 | 主题 | 关键交付 |
23
+ |------|------|---------|
24
+ | v0.1 | 核心闭环 | 10 命令,Markdown 主数据 + JSON indexes |
25
+ | v0.2 | 工程底座 | +migrate, +distill, atomicWrite, file lock, card_policy |
26
+ | v0.3 | SQLite Runtime | 7 P0 表, content-hash 增量 rebuild, FTS5, 四格式输出 |
27
+ | v0.4 | **Agent Workflow Automation** | status, mark-dirty --auto, update --suggest, 退出码协议, integration templates |
28
+
29
+ ---
30
+
31
+ ## 三、v0.4 完成清单
32
+
33
+ ### P0 — 8/8
34
+
35
+ | # | 功能 | 文件 | 说明 |
36
+ |---|------|------|------|
37
+ | 1 | `pmem status` | [src/commands/status.ts](src/commands/status.ts) **新建** | git status + paths 表反查,三级匹配(exact/directory/graph_neighbor),`--format compact/json`,退出码 0/1/2 |
38
+ | 2 | `mark-dirty --auto` | [src/commands/update.ts](src/commands/update.ts) | git status → paths 反查 → 自动 insertDirtyFlag |
39
+ | 3 | `update --suggest` | [src/commands/update.ts](src/commands/update.ts) | dirty_flags + state 时效 → 结构化建议,`--format json` 输出 |
40
+ | 4 | `update --apply-suggestion` | [src/commands/update.ts](src/commands/update.ts) | 自动执行建议(update_card/create_trace/update_state) |
41
+ | 5 | `distill --suggest` | [src/commands/distill.ts](src/commands/distill.ts) | SQLite edges 推断分组,退出码 0/1 |
42
+ | 6 | `distill --apply-suggestion` | [src/commands/distill.ts](src/commands/distill.ts) | 非交互式应用蒸馏到指定 card |
43
+ | 7 | session start/end | [src/commands/session.ts](src/commands/session.ts) | 已在 v0.3 P1 完成,v0.4 增强 update_log 汇总 |
44
+ | 8 | CLI hooks-friendly output | update/distill/verify/status | 统一退出码(0=正常, 1=建议/警告, 2=错误),所有 suggest 命令 `--format json` |
45
+ | 9 | Integration templates | `.pmem/integrations/` + [src/commands/init.ts](src/commands/init.ts) | Claude Code / Cursor / Codex 模板,嵌入 v0.4 workflow 指令 |
46
+ | 10 | verify stale memory | [src/commands/verify.ts](src/commands/verify.ts) | paths 表 source_files 的 mtime 对比 card updated_at |
47
+
48
+ ### P1 — 3/3
49
+
50
+ | # | 功能 | 文件 |
51
+ |---|------|------|
52
+ | 1 | status 三级匹配 | [src/commands/status.ts](src/commands/status.ts) — exact → directory → graph_neighbor |
53
+ | 2 | session update_log 汇总 | [src/commands/session.ts](src/commands/session.ts) — end 时聚合 actions + affected_cards + unresolved dirty_flags |
54
+ | 3 | AGENTS.md 模板优化 | [src/commands/init.ts](src/commands/init.ts) — 内联模板已更新,写入 v0.4 完整内容 |
55
+
56
+ ### v0.4 排除项(明确不做)
57
+
58
+ | 排除 | 原因 |
59
+ |------|------|
60
+ | embedding 真接入 | 仅保留 Provider Interface + manifest 配置 |
61
+ | pmem serve (MCP/REST) | 完全搁置 |
62
+ | Graph UI | v0.5+ |
63
+ | 多用户远程服务 | v0.5+ |
64
+
65
+ ---
66
+
67
+ ## 四、代码库地图
68
+
69
+ ```
70
+ pmem/
71
+ ├── CLAUDE.md # Agent 入口指令
72
+ ├── package.json # v0.4.0,依赖:commander, js-yaml, better-sqlite3
73
+ ├── tsconfig.json # strict, ES2022, CommonJS
74
+ ├── .gitignore # node_modules, dist, temp, .pmem, .DS_Store, .claude
75
+ ├── temp/ # gitignored 测试隔离区
76
+
77
+ ├── docs/ # 设计文档(按顺序读)
78
+ │ ├── Voorlopige projekidee.md # 长期架构总纲
79
+ │ ├── prd.md # 产品需求文档
80
+ │ ├── project-roadmap.md # v0.1 → v0.5 路线图
81
+ │ ├── v0.2 pre-design.md # v0.2 前置设计
82
+ │ ├── v0.2 pre-roadmap.md # v0.2 路线图
83
+ │ ├── v0.3 pre-design.md # ⭐ v0.3 圣经 — 14 章技术决策
84
+ │ ├── v0.4 pre-design.md # ⭐ v0.4 圣经 — Agent Workflow Automation
85
+ │ ├── handover-v0.3.md # v0.3 交接文档
86
+ │ └── handover-v0.4.md # 本文档
87
+
88
+ ├── src/
89
+ │ ├── index.ts # CLI 入口(Commander),15 命令,版本 0.4.0
90
+ │ ├── types.ts # 全部 TS 类型,Manifest = ManifestV02 | ManifestV03
91
+ │ │
92
+ │ ├── core/ # 共享基础设施
93
+ │ │ ├── fs.ts # 文件工具:atomicWrite, acquireLock, readFile, listFiles...
94
+ │ │ ├── manifest.ts # Manifest 加载/保存(js-yaml),getDefaultManifest()→ManifestV03
95
+ │ │ ├── db.ts # ⭐ SQLite 核心:schema 创建(10 表)、CRUD、dirty/session/update_log
96
+ │ │ ├── hash.ts # SHA-256 内容 hash(file/frontmatter/body)
97
+ │ │ ├── yaml.ts # 共享 YAML frontmatter 解析器
98
+ │ │ ├── format.ts # CLI 输出格式化(compact/json/paths/pack)
99
+ │ │ ├── *.test.ts # 4 个测试文件(88 用例)
100
+ │ │
101
+ │ └── commands/ # 15 个命令文件
102
+ │ ├── init.ts # pmem init [--guided] — 已更新 v0.4 integration 模板
103
+ │ ├── rebuild.ts # pmem rebuild --changed/--full/--card — SQLite 写入
104
+ │ ├── recall.ts # pmem recall --budget N --format compact/json/paths/pack
105
+ │ ├── ask.ts # pmem ask <query> — 6 步召回(exact→alias→tag→graph→FTS→rerank)
106
+ │ ├── graph.ts # pmem related --depth N --type X / pmem trace
107
+ │ ├── verify.ts # pmem verify --fix — hash 对比 + orphan + stale + exit codes
108
+ │ ├── update.ts # ⭐ pmem update --suggest/--apply-suggestion/--confirm
109
+ │ │ # pmem mark-dirty --auto
110
+ │ ├── migrate.ts # pmem migrate --to 0.3 --dry-run
111
+ │ ├── distill.ts # ⭐ pmem distill --suggest/--apply-suggestion/--confirm
112
+ │ ├── session.ts # pmem session start/end(+ update_log 汇总)
113
+ │ ├── status.ts # ⭐ pmem status — git status + paths 三级匹配
114
+ │ └── integration.ts # pmem integration list/install/verify
115
+ └── dist/ # tsc 编译输出(gitignored)
116
+ ```
117
+
118
+ ---
119
+
120
+ ## 五、关键技术决策
121
+
122
+ ### 1. 架构原则
123
+
124
+ ```
125
+ Markdown cards (.pmem/**/*.md) ← 唯一主数据
126
+ SQLite (.pmem/pmem.db) ← 索引、缓存、运行时状态
127
+ JSON indexes (.pmem/indexes/) ← legacy 保留
128
+ ```
129
+
130
+ - **永远不**在 SQLite 中创建"数据库独有"的卡片
131
+ - **永远不**删除旧 JSON indexes
132
+ - **永远不**直接修改 SQLite(修改必须通过 Markdown → rebuild)
133
+
134
+ ### 2. Content Hash 增量
135
+
136
+ 三 hash 体系:
137
+ - `file_hash` — 整个 .md 文件(变化 = 重解析全部)
138
+ - `frontmatter_hash` — YAML 部分(变化 = 更新元数据+关系)
139
+ - `body_hash` — 正文部分(变化 = 更新 FTS/summary/token_count)
140
+
141
+ `--changed` 模式下对比 hash,全部匹配则跳过。
142
+
143
+ ### 3. 退出码协议
144
+
145
+ | 命令 | 0 | 1 | 2 |
146
+ |------|---|---|---|
147
+ | `pmem status` | 有变更 | 无变更 | 错误 |
148
+ | `pmem update --suggest` | 无建议 | 有建议 | 错误 |
149
+ | `pmem distill --suggest` | 无需蒸馏 | 建议蒸馏 | 错误 |
150
+ | `pmem verify` | 通过 | 有 warning | 有 error |
151
+
152
+ ### 4. Status 三级匹配
153
+
154
+ ```
155
+ Pass 1: exact — changed file path LIKE paths.path
156
+ Pass 2: directory — changed file directory LIKE paths.path
157
+ Pass 3: graph_neighbor — edges 表 1-hop 扩展
158
+ ```
159
+
160
+ 优先级:exact > directory > graph_neighbor(高优先级覆盖低优先级)。
161
+
162
+ ### 5. update --suggest 建议引擎
163
+
164
+ 基于三个数据源生成建议:
165
+ 1. `getUnresolvedDirtyFlags(db)` — 未解决的脏标记
166
+ 2. `state.md` mtime — 超过 24h = stale
167
+ 3. `next.md` 内容长度 — < 50 chars = minimal
168
+
169
+ 建议类型:`update_card`, `create_trace`, `update_state`, `update_next`。
170
+
171
+ ### 6. Manifest 类型系统
172
+
173
+ ```typescript
174
+ type ManifestSchemaVersion = '0.2' | '0.3';
175
+ type Manifest = ManifestV02 | ManifestV03; // discriminated union on pmem.schema_version
176
+
177
+ interface ManifestBase { /* 共享字段 */ }
178
+ interface ManifestV02 extends ManifestBase { pmem: { schema_version: '0.2' }; indexes: ManifestIndexes; }
179
+ interface ManifestV03 extends ManifestBase { pmem: { schema_version: '0.3' }; runtime; rebuild; cli; embedding; serve; }
180
+ ```
181
+
182
+ 严禁 `as any` 绕过类型检查。迁移函数返回 `ManifestV03`。
183
+
184
+ ---
185
+
186
+ ## 六、命令行完整参考(15 命令)
187
+
188
+ ```bash
189
+ # 初始化
190
+ pmem init [project-name] [--guided]
191
+
192
+ # 内存查询
193
+ pmem recall [--budget N] [--format compact|json|paths|pack]
194
+ pmem ask <query> [--format compact|json|paths|pack]
195
+ pmem related <id> [--depth N] [--type depends_on|related_to|...]
196
+ pmem trace <id>
197
+
198
+ # 变更感知(v0.4 新增)
199
+ pmem status [--since <timestamp>] [--format compact|json]
200
+
201
+ # 工作流(v0.4 增强)
202
+ pmem mark-dirty [-r <reason>] [--auto]
203
+ pmem update [--auto|--suggest|--apply-suggestion <id>|--confirm|--force] [-s <summary>] [-n <next>] [--format compact|json]
204
+
205
+ # 蒸馏(v0.4 增强)
206
+ pmem distill [--suggest|--apply-suggestion <id>|--confirm|--suggest-splits]
207
+
208
+ # 维护
209
+ pmem rebuild [--changed|--full|--card <id>]
210
+ pmem verify [--fix]
211
+ pmem migrate --to 0.3 [--dry-run] [--backup]
212
+
213
+ # 会话(v0.3 P1 完成,v0.4 增强汇总)
214
+ pmem session start [-a <agent-name>]
215
+ pmem session end [-s <summary>]
216
+
217
+ # 框架集成
218
+ pmem integration list|install <framework>|verify
219
+ ```
220
+
221
+ ---
222
+
223
+ ## 七、测试基础设施
224
+
225
+ ```
226
+ npm test # node --require ts-node/register --test src/core/*.test.ts
227
+ ```
228
+
229
+ | 文件 | 用例数 | 覆盖 |
230
+ |------|--------|------|
231
+ | [src/core/yaml.test.ts](src/core/yaml.test.ts) | 21 | parseYamlValue/parseSimpleYaml/parseFrontmatter |
232
+ | [src/core/manifest.test.ts](src/core/manifest.test.ts) | 21 | getDefaultManifest/getDefaultManifestV03 全字段 |
233
+ | [src/core/db.test.ts](src/core/db.test.ts) | 22 | 10 表 schema + CRUD + dirty/session/update_log |
234
+ | [src/core/hash.test.ts](src/core/hash.test.ts) | 16 | computeHash/computeCardHashes/tokenCount/sectionCount |
235
+ | **合计** | **88** | **0 失败** |
236
+
237
+ ### E2E 测试流程
238
+
239
+ ```bash
240
+ cd temp && rm -rf v04-test && mkdir v04-test && cd v04-test
241
+
242
+ # 初始化 + 创建卡片
243
+ npx ts-node ../../src/index.ts init v04-test
244
+ mkdir -p .pmem/modules .pmem/decisions .pmem/traces
245
+ # ... 写入测试卡片(含 YAML frontmatter)...
246
+
247
+ # 核心链路
248
+ npx ts-node ../../src/index.ts rebuild
249
+ npx ts-node ../../src/index.ts recall --format compact --budget 2000
250
+ npx ts-node ../../src/index.ts ask "关键词" --format json
251
+ npx ts-node ../../src/index.ts related <card_id> --depth 2
252
+ npx ts-node ../../src/index.ts trace <card_id>
253
+
254
+ # Workflow 闭环
255
+ npx ts-node ../../src/index.ts session start -a "test"
256
+ npx ts-node ../../src/index.ts status --format json
257
+ npx ts-node ../../src/index.ts mark-dirty -r "test" --auto
258
+ npx ts-node ../../src/index.ts update --suggest --format json
259
+ npx ts-node ../../src/index.ts update --confirm -s "summary" -n "next"
260
+ npx ts-node ../../src/index.ts distill --suggest
261
+ npx ts-node ../../src/index.ts session end -s "test complete"
262
+ npx ts-node ../../src/index.ts verify
263
+ ```
264
+
265
+ ---
266
+
267
+ ## 八、v0.5 路线图(接班人方向)
268
+
269
+ ### v0.5 目标:上线可用 Beta
270
+
271
+ v0.4 完成了 Agent workflow 闭环。v0.5 应聚焦"真实可用性":
272
+
273
+ **建议优先级:**
274
+
275
+ | 优先级 | 方向 | 说明 |
276
+ |--------|------|------|
277
+ | P0 | 实战打磨 | 在真实项目中使用 pmem,收集 ask/recall 不准、status 误报、建议噪音等案例 |
278
+ | P0 | 性能优化 | 大项目(100+ cards)的 rebuild 和 ask 性能 |
279
+ | P0 | 错误处理 | 完善 corner case 处理(DB 损坏、并发的 pmem 实例、空项目) |
280
+ | P1 | embedding ? | 基于收集的召回不准案例判断是否接入 embedding,以及 provider 选型 |
281
+ | P1 | `pmem serve` ? | 如果 Agent 不能运行 shell 的需求明确,再考虑 |
282
+ | P2 | npm 发布 | `npm publish` 为可全局安装的 CLI |
283
+
284
+ ### v0.4 明确推迟到 v0.5+ 的
285
+
286
+ - embedding 真接入(API 或 local)
287
+ - pmem serve(MCP/REST/daemon)
288
+ - Graph UI
289
+ - 多用户远程服务
290
+ - npm 包发布
291
+
292
+ ### 开工建议
293
+
294
+ 1. 先读 `docs/v0.4 pre-design.md` — 了解 v0.4 设计意图
295
+ 2. 在真实项目中使用 pmem — 积累 1-2 周的使用反馈
296
+ 3. 基于反馈写 `docs/v0.5 pre-design.md`
297
+ 4. 不急于堆功能,先打磨可用性
298
+
299
+ ---
300
+
301
+ ## 九、常见陷阱
302
+
303
+ ### 1. Markdown 是唯一主数据
304
+ SQLite 中 `is_deleted` / `is_candidate` 只是标记。所有卡片必须对应 .md 文件。不要创建"数据库独有"的卡片。
305
+
306
+ ### 2. 不要修改 SQLite 直接
307
+ 修改记忆流程:编辑 .md 文件 → `pmem rebuild --changed`。不要写代码直接 UPDATE SQLite。
308
+
309
+ ### 3. Hash 不是 timestamp
310
+ 增量 rebuild 用 content hash(SHA-256),不用 mtime。git checkout 会改变 mtime 但不改变内容。
311
+
312
+ ### 4. FTS5 可能不可用
313
+ `hasFTS5(db)` 检查后降级到 `LIKE` 查询。不要假设 FTS5 一定存在。
314
+
315
+ ### 5. Manifest 是 discriminated union
316
+ `Manifest = ManifestV02 | ManifestV03`。访问版本特有字段前必须 narrow:`if (manifest.pmem.schema_version === '0.3')`。
317
+
318
+ ### 6. 退出码不要吞掉
319
+ `pmem update --suggest` 和 `pmem distill --suggest` 的退出码是 Agent 决策依据。`process.exit(1)` = 有建议待处理,不是错误。
320
+
321
+ ### 7. status 依赖 git
322
+ `pmem status` 优先用 `git status --porcelain`。非 git 项目自动降级到 mtime。测试时注意:temp/ 子目录不是 git repo,会 fallback 到 mtime。
323
+
324
+ ### 8. DB 不存在时 graceful fallback
325
+ 所有需要 SQLite 的命令必须检查 `.pmem/pmem.db` 是否存在。不存在时打印提示(不要 crash),降级到文件操作。
326
+
327
+ ### 9. 事务边界
328
+ 先 atomicWrite Markdown → 再 SQLite transaction。不要反过来。Markdown 写入无法回滚,SQLite 可以。
329
+
330
+ ### 10. 不要引入 as any
331
+ manifest 类型系统已建立 discriminated union。新增 manifest 版本时扩展 union,不要绕过。
332
+
333
+ ---
334
+
335
+ ## 十、依赖清单
336
+
337
+ ```json
338
+ {
339
+ "dependencies": {
340
+ "better-sqlite3": "^12.10.0",
341
+ "commander": "^14.0.3",
342
+ "js-yaml": "^4.1.1"
343
+ },
344
+ "devDependencies": {
345
+ "@types/better-sqlite3": "^7.6.13",
346
+ "@types/js-yaml": "^4.0.9",
347
+ "@types/node": "^25.9.1",
348
+ "ts-node": "^10.9.2",
349
+ "typescript": "^6.0.3"
350
+ }
351
+ }
352
+ ```
353
+
354
+ ---
355
+
356
+ ## 十一、接班人阅读顺序
357
+
358
+ 1. **CLAUDE.md** — 5 分钟了解项目
359
+ 2. **docs/v0.3 pre-design.md** — v0.3 SQLite 架构决策(14 章)
360
+ 3. **docs/v0.4 pre-design.md** — v0.4 workflow 决策(12 章)
361
+ 4. **docs/handover-v0.4.md** — 本文档
362
+ 5. **src/types.ts** — 类型系统(特别注意 Manifest discriminated union)
363
+ 6. **src/core/db.ts** — SQLite schema 和 CRUD 辅助函数
364
+ 7. **src/commands/update.ts** — v0.4 最复杂的命令(suggest 引擎)
365
+ 8. **src/commands/status.ts** — v0.4 新增命令(三级匹配)
366
+
367
+ 然后在 `temp/` 中跑一次完整 E2E 测试,建立肌肉记忆。
package/docs/prd.md ADDED
@@ -0,0 +1,318 @@
1
+ # pmem — Product Requirements Document
2
+
3
+ ## 一、产品概述
4
+
5
+ ### 1.1 产品名称
6
+
7
+ **pmem**(Project Memory for Agents)
8
+
9
+ 备选:GraphMemo / PGM / Agent Project Memory
10
+
11
+ ### 1.2 一句话描述
12
+
13
+ 面向 AI 编码 Agent 的低 token、可溯源、图结构项目记忆协议与 CLI 运行时。
14
+
15
+ ### 1.3 产品定位
16
+
17
+ pmem 不是知识库,不是文档系统,不是代码扫描器。它是一个**项目记忆运行时**:
18
+
19
+ ```
20
+ 传统:Agent → 读代码/文档 → 自己总结 → 高 token、不稳定
21
+ pmem:Agent → 读 .pmem/index.md → 按需查图谱 → 回写记忆 → 低 token、可溯源
22
+ ```
23
+
24
+ ### 1.4 核心价值主张
25
+
26
+ 让任何 AI coding agent 进入项目时,以最少 token 获得三件事:
27
+ 1. **我在哪个项目里?**(项目名、阶段、当前关注点)
28
+ 2. **当前项目状态是什么?**(模块状态、活跃任务、最近决策)
29
+ 3. **下一步最应该做什么?为什么?证据在哪?**(next step + 溯源链)
30
+
31
+ ---
32
+
33
+ ## 二、目标用户
34
+
35
+ ### 2.1 主要用户
36
+
37
+ | 用户 | 场景 | 核心需求 |
38
+ |------|------|---------|
39
+ | AI Coding Agent(Claude Code、Cursor、Codex 等) | 进入项目开始工作 | 快速恢复上下文,找到相关记忆,知道下一步做什么 |
40
+ | 个人开发者 | 自己用 AI 辅助开发 | 让 Agent 记住项目演进过程,避免反复解释 |
41
+ | 小型开发团队 | 多人 + 多 Agent 协作 | 共享项目记忆,决策可溯源 |
42
+
43
+ ### 2.2 用户痛点
44
+
45
+ | 痛点 | pmem 解法 |
46
+ |------|----------|
47
+ | Agent 每次都要重新理解项目 → token 浪费 | `pmem recall --budget 2000` |
48
+ | Agent 容易推翻之前决策 | `decisions/` + `pmem trace` |
49
+ | Agent 不知道下一步做什么 | `pmem next` |
50
+ | 项目长期演进后记忆丢失 | `.pmem/traces/` + `pmem distill` |
51
+ | 不同 Agent 框架接入方式不统一 | `integrations/` + `AGENTS.md` |
52
+ | 记忆过时无人发现 | `pmem verify` + freshness detection |
53
+
54
+ ---
55
+
56
+ ## 三、核心协议
57
+
58
+ ### 3.1 记忆存储层级
59
+
60
+ ```
61
+ Hot Memory(每次必读):
62
+ .pmem/index.md + state.md + next.md
63
+ ~1000–2000 tokens
64
+
65
+ Warm Memory(按需读取):
66
+ .pmem/modules/ + decisions/ + tasks/
67
+ 按任务类型召回
68
+
69
+ Cold Memory(溯源用):
70
+ .pmem/traces/ + summaries/
71
+ 不默认读取
72
+ ```
73
+
74
+ ### 3.2 数据模型
75
+
76
+ **节点类型:** project | module | feature | task | decision | risk | assumption | constraint | trace
77
+
78
+ **边类型:** depends_on | blocks | implements | constrains | decided_by | derived_from | related_to | supersedes | conflicts_with | next_step_of
79
+
80
+ **核心原则:** Markdown 记忆卡片是单一真相来源,JSON/SQLite 索引是派生缓存。
81
+
82
+ ### 3.3 记忆卡片格式
83
+
84
+ 每张卡片 = YAML frontmatter(机器可读 metadata)+ Markdown 正文(人类和 Agent 可读)
85
+
86
+ ```md
87
+ ---
88
+ id: module.backtest_sandbox
89
+ type: module
90
+ schema_version: "0.2"
91
+ status: designing
92
+ tags: [backtest, agent]
93
+ aliases: [回测沙盒]
94
+ depends_on: [module.market_data]
95
+ related: [decision.agent_tool_boundary]
96
+ updated: 2026-05-20
97
+ ---
98
+
99
+ # Backtest Sandbox
100
+
101
+ ## One-liner
102
+ ...
103
+ ```
104
+
105
+ ---
106
+
107
+ ## 四、功能需求
108
+
109
+ ### 4.1 v0.1 — 核心闭环 ✅
110
+
111
+ | 需求 | 优先级 | 状态 |
112
+ |------|--------|------|
113
+ | 项目初始化(`pmem init`) | P0 | ✅ |
114
+ | 图索引构建(`pmem rebuild`) | P0 | ✅ |
115
+ | 项目回忆(`pmem recall --budget N`) | P0 | ✅ |
116
+ | 图引导召回(`pmem ask`) | P0 | ✅ |
117
+ | 图谱查询(`pmem related`) | P0 | ✅ |
118
+ | 溯源追踪(`pmem trace`) | P0 | ✅ |
119
+ | 一致性检查(`pmem verify`) | P0 | ✅ |
120
+ | 记忆更新(`pmem update` 四级) | P0 | ✅ |
121
+ | 脏标记(`pmem mark-dirty`) | P0 | ✅ |
122
+ | 框架适配(`pmem integration`) | P1 | ✅ |
123
+
124
+ ### 4.2 v0.2 — 文件模式可信
125
+
126
+ | 需求 | 优先级 | 说明 |
127
+ |------|--------|------|
128
+ | 交互式冷启动(`pmem init --guided`) | P0 | 问 3 个必填字段,生成可用初始记忆 |
129
+ | 保守项目扫描 + candidates | P0 | 扫描不自动确认,候选进入 `candidates/` |
130
+ | `memory_incomplete` 降级模式 | P0 | 空 pmem 时明确告知 Agent 记忆不完整 |
131
+ | schema 版本管理 | P0 | manifest + 每张卡片带 `schema_version` |
132
+ | 迁移命令(`pmem migrate`) | P0 | dry-run + 执行 + 自动备份 |
133
+ | 版本兼容检查(`pmem verify` 增强) | P0 | CLI vs 项目 schema 版本对比 |
134
+ | atomic write | P0 | .tmp → fsync → rename,防止半写损坏 |
135
+ | 简单 file lock | P0 | `.pmem/.lock`,超时 3s,默认 abort |
136
+ | `memory_status` 追踪 | P1 | completeness + initialized_mode 字段 |
137
+ | card_policy 校验 | P1 | ID 命名规范 + 大小阈值 + verify 警告 |
138
+ | trace → card 蒸馏(`pmem distill` 初版) | P1 | 建议模式,需确认,不自动写 |
139
+ | 卡片拆分建议(`pmem distill --suggest-splits`) | P1 | 检测过大卡片,建议拆分 |
140
+ | 声明式初始化(`pmem init --from`) | P2 | 可延后 |
141
+ | section-level merge(`pmem update --merge`) | P2 | 可延后 |
142
+ | 完整乐观锁 + card_hashes.json | 不做 | 留给 v0.3 SQLite |
143
+
144
+ ### 4.3 v0.3 — SQLite 运行时
145
+
146
+ | 需求 | 优先级 | 说明 |
147
+ |------|--------|------|
148
+ | SQLite 数据库(`.pmem/pmem.db`) | P0 | 存 cards、edges、aliases、tags、tasks、traces、sessions、dirty_flags、update_log |
149
+ | SQL-backed recall / ask / related | P0 | 替代 JSON 遍历 |
150
+ | transaction-based update | P0 | 原子写入卡片 + 索引 |
151
+ | 乐观锁(SQLite 层) | P0 | 替代 card_hashes.json |
152
+ | incremental rebuild | P1 | 只重建变更部分 |
153
+ | `pmem serve` 原型 | P1 | HTTP API |
154
+ | semantic search / embeddings | P2 | 可选 |
155
+
156
+ ### 4.4 v0.4 — Agent 集成 & 自动化
157
+
158
+ | 需求 | 优先级 | 说明 |
159
+ |------|--------|------|
160
+ | Claude Code hooks 模板 | P0 | PostToolUse / Stop hooks |
161
+ | Cursor rules 完整版 | P0 | `.cursor/rules/pmem.mdc` |
162
+ | Codex / OpenClaw 适配 | P1 | AGENTS.md / skill 模板 |
163
+ | `pmem update --auto --mode=suggest` 增强 | P0 | 智能变更检测 |
164
+ | session tracking | P1 | Agent 会话起止 + 操作摘要 |
165
+ | distill 工作流优化 | P1 | 定期自动建议蒸馏 |
166
+ | stale memory detection | P1 | 基于 source_files 变更 |
167
+
168
+ ### 4.5 v0.5 — 可上线 Beta
169
+
170
+ | 需求 | 优先级 | 说明 |
171
+ |------|--------|------|
172
+ | `npm install -g pmem` 一键安装 | P0 | |
173
+ | SQLite 默认开启 | P0 | 新项目默认 SQLite,文件模式兼容 |
174
+ | 完整体验的 `pmem init --guided` | P0 | 引导 → 首个项目跑通 |
175
+ | 完整使用文档 | P0 | 使用指南 + CLI 参考 + 集成教程 |
176
+ | demo 项目 | P0 | 开箱即用示例 |
177
+ | `pmem backup` / `pmem restore` | P1 | |
178
+ | 可选遥测 | P2 | opt-in |
179
+
180
+ ---
181
+
182
+ ## 五、技术架构
183
+
184
+ ### 5.1 技术栈
185
+
186
+ | 层次 | v0.1–v0.2 | v0.3+ |
187
+ |------|-----------|-------|
188
+ | 语言 | TypeScript (strict) | TypeScript (strict) |
189
+ | CLI 框架 | Commander | Commander |
190
+ | 主数据存储 | Markdown + YAML frontmatter(文件系统) | 同左 |
191
+ | 索引存储 | JSON files | SQLite |
192
+ | 运行环境 | Node.js ≥18 | Node.js ≥18 |
193
+
194
+ ### 5.2 项目记忆目录结构
195
+
196
+ ```
197
+ .pmem/
198
+ manifest.yml # 配置中心
199
+ index.md / state.md / next.md # Hot Memory
200
+ modules/ / features/ / decisions/ / tasks/ / traces/ / risks/ # 记忆卡片
201
+ candidates/ # 冷启动扫描候选(v0.2+)
202
+ indexes/ # 派生索引(v0.2 JSON → v0.3 SQLite)
203
+ skills/ # Agent 操作手册
204
+ integrations/ # 框架适配模板
205
+ backups/ / migrations/ # 迁移基础设施(v0.2+)
206
+ pmem.db # SQLite 数据库(v0.3+)
207
+ ```
208
+
209
+ ### 5.3 CLI 命令全集
210
+
211
+ ```
212
+ pmem init [--guided] [--from <file>]
213
+ pmem recall [--budget <tokens>]
214
+ pmem next
215
+ pmem ask <query>
216
+ pmem related <id>
217
+ pmem trace <id>
218
+ pmem update [--auto|--confirm|--force]
219
+ pmem mark-dirty [--reason <reason>]
220
+ pmem rebuild
221
+ pmem verify [--fix] [--report]
222
+ pmem distill [--suggest-splits]
223
+ pmem migrate [--dry-run] [--to <version>] [--backup]
224
+ pmem integration [list|install|verify] [<framework>]
225
+ pmem lock status
226
+ pmem backup
227
+ pmem restore
228
+ pmem serve # v0.3+
229
+ ```
230
+
231
+ ---
232
+
233
+ ## 六、关键设计原则
234
+
235
+ 1. **Markdown 是主数据,索引是缓存。** 索引随时可重建。
236
+ 2. **召回必须可解释。** `pmem ask` 输出必须标注匹配路径(exact / alias / graph / fallback)。
237
+ 3. **更新分级,不无脑写。** mark-dirty → auto → confirm → force。
238
+ 4. **版本可迁移。** schema_version 从 v0.2 开始强制执行。
239
+ 5. **文件不写坏。** atomic write 从 v0.2 开始强制执行。
240
+ 6. **AGENTS.md 是入口,skills/ 是流程,integrations/ 是适配器。**
241
+ 7. **模块粒度以概念/责任边界为主,代码目录为辅。**
242
+
243
+ ---
244
+
245
+ ## 七、成功指标
246
+
247
+ ### v0.2 完成标准
248
+
249
+ - [ ] `pmem init --guided` 能在 3 个问答内让 Agent 获得可用的初始上下文
250
+ - [ ] v0.1 项目能通过 `pmem migrate --to 0.2` 完成迁移
251
+ - [ ] `pmem verify` 能检测 schema_version 不匹配和 card_policy 违规
252
+ - [ ] 并发写入时不会损坏文件(lock abort + atomic write)
253
+ - [ ] distill 能正确建议将 trace 蒸馏到已有 card
254
+
255
+ ### v0.5 完成标准
256
+
257
+ - [ ] 新用户能在 2 分钟内完成 `npm install -g pmem` + `pmem init --guided`
258
+ - [ ] 已有 v0.1/v0.2 项目能平滑迁移至 v0.5
259
+ - [ ] Claude Code / Cursor 用户能通过 integration 模板一键接入
260
+ - [ ] Agent 首次进入项目时 token 消耗 ≤ 2000(recall --budget 2000)
261
+ - [ ] `pmem ask` 召回命中率 ≥ 70%(在 50+ 张卡片的项目中)
262
+
263
+ ---
264
+
265
+ ## 八、竞争与差异化
266
+
267
+ | 方案 | 问题 |
268
+ |------|------|
269
+ | 让 Agent 读 README / docs | token 大、不稳定 |
270
+ | 让 Agent 读代码 | 无上下文,容易误解 |
271
+ | 通用知识库 | 不是为 Agent 设计的,token 不可控 |
272
+ | Cursor Rules / CLAUDE.md | 只有静态指令,无图记忆、无溯源、不更新 |
273
+ | **pmem** | **图记忆 + token 预算 + 溯源 + 可更新 + 跨 Agent** |
274
+
275
+ 核心差异:pmem 不是"更好的文档",而是"Agent 的项目记忆运行时"。
276
+
277
+ ---
278
+
279
+ ## 九、风险与缓解
280
+
281
+ | 风险 | 影响 | 缓解措施 |
282
+ |------|------|---------|
283
+ | 记忆过时 | Agent 基于旧事实做错决策 | freshness TTL + source_files 变更检测 + verify |
284
+ | 记忆噪音 | traces 过多,淹没信号 | trace 写入门槛 + distill 压缩 |
285
+ | 维护成本高 | 用户不更新记忆卡 | guided init + distill 建议 + mark-dirty 提醒 |
286
+ | Agent 不主动用 pmem | 工具被闲置 | AGENTS.md + hooks + integration 模板降低接入成本 |
287
+ | 跨版本迁移出错 | 用户项目记忆损坏 | dry-run + 自动备份 + 官方迁移规则内置 |
288
+ | SQLite 锁定用户 | 无法再编辑 .md 文件 | Markdown 永久保留为 canonical 主数据 |
289
+
290
+ ---
291
+
292
+ ## 十、未决事项
293
+
294
+ 以下问题待后续版本讨论和决策:
295
+
296
+ ### 技术
297
+
298
+ - [ ] v0.3 SQLite schema 详细设计(表结构、索引策略、迁移脚本)
299
+ - [ ] `pmem serve` 选择 MCP Server 还是 REST API,还是两者都做?
300
+ - [ ] embeddings 选型(本地模型 vs API?哪种最适合代码项目语义?)
301
+ - [ ] graph 分片策略——按模块?按类型?混合?
302
+ - [ ] incremental rebuild 的实现策略
303
+
304
+ ### 产品
305
+
306
+ - [ ] 多项目 / monorepo / workspace 支持方案
307
+ - [ ] 记忆共享与多人协作机制
308
+ - [ ] 记忆权限模型(谁能读/写哪些卡片)
309
+ - [ ] npm 包发布策略(何时第一次 publish?scope?)
310
+ - [ ] 是否需要 VS Code / JetBrains 插件?
311
+ - [ ] telemetry 的范围、隐私策略、opt-in 机制
312
+
313
+ ### 业务
314
+
315
+ - [ ] 开源协议(MIT?Apache 2.0?)
316
+ - [ ] 社区治理模型
317
+ - [ ] 文档站点与教程
318
+ - [ ] 是否需要一个"pmem registry"让团队共享记忆模板?