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,417 @@
1
+ # v0.4 前置设计决策
2
+
3
+ 本文档记录 pmem v0.4 开工前的最终技术决策。v0.4 的核心定位:
4
+
5
+ > **Agent Workflow Automation**
6
+ >
7
+ > 不是语义搜索增强,不是 MCP Server,不是 REST 服务。
8
+ > 而是:代码变更感知 → dirty 标记 → update suggest → distill suggest → Agent 确认写入 → rebuild → verify 的完整闭环。
9
+ >
10
+ > v0.4 要回答的唯一问题:**pmem 能否进入 Agent 真实开发工作流,低成本、低噪音、可控地运行?**
11
+
12
+ ---
13
+
14
+ ## 一、v0.4 不做的事情(范围排除)
15
+
16
+ 以下方向已明确排除,不做任何实现、不做 experimental、不做接口预留:
17
+
18
+ | 排除项 | 原因 |
19
+ |--------|------|
20
+ | API embedding | 引入 API key + 网络依赖 + 成本 + 隐私顾虑 |
21
+ | local embedding (transformers.js) | 包体积 + 跨平台 + 中文模型选择未验证 |
22
+ | pmem serve (MCP/REST/daemon) | 分散主线,CLI 已是更优 Agent 入口 |
23
+ | Graph UI | UI 层独立问题,不阻塞 workflow 验证 |
24
+ | 多用户远程服务 | 远超 v0.4 范围 |
25
+
26
+ v0.4 对 embedding 的处理:保留 Provider Interface + manifest 配置 + SQLite schema 预留,但不接入任何模型。
27
+ v0.4 对 serve 的处理:完全搁置,代码中不做任何 serve 相关实现。
28
+
29
+ ---
30
+
31
+ ## 二、v0.4 目标闭环
32
+
33
+ ```
34
+ Agent 开始任务
35
+
36
+ pmem recall / ask 获取上下文
37
+
38
+ Agent 修改代码
39
+
40
+ pmem 感知 changed files
41
+
42
+ pmem mark-dirty --auto
43
+
44
+ pmem update --suggest 生成记忆更新建议
45
+
46
+ Agent / 人确认后写入 Markdown cards
47
+
48
+ pmem rebuild --changed 更新 SQLite
49
+
50
+ pmem verify 检查一致性
51
+ ```
52
+
53
+ 这条链路是 v0.4 的"核心回路"。v0.4 做完,pmem 就从"查询工具"变成了"工作流运行时"。
54
+
55
+ ---
56
+
57
+ ## 三、优先级表
58
+
59
+ ### P0 — 必须完成
60
+
61
+ | # | 功能 | 说明 |
62
+ |---|------|------|
63
+ | 1 | changed files detection | 感知项目文件的增删改(基于 git status + file mtime) |
64
+ | 2 | dirty_flags workflow | mark-dirty --auto 自动标记 + 关联 cards |
65
+ | 3 | pmem update --suggest | 基于 dirty flags + changed files 生成记忆更新建议 |
66
+ | 4 | pmem distill --suggest | 基于未蒸馏 traces 数量 + 时效性建议蒸馏时机 |
67
+ | 5 | pmem session start/end | 会话追踪(v0.3 P1 已完成,v0.4 加强 update_log 汇总) |
68
+ | 6 | CLI hooks-friendly output | 所有 suggest 命令支持 `--format json` 供 Agent 程序化消费 |
69
+ | 7 | Integration templates | Claude Code / Cursor / Codex 的 AGENTS.md / rules / CLAUDE.md 模板 |
70
+ | 8 | verify stale memory 增强 | 基于 changed files 检测可能过期的 cards,提示更新 |
71
+
72
+ ### P1 — 应该完成
73
+
74
+ | # | 功能 | 说明 |
75
+ |---|------|------|
76
+ | 1 | pmem update --apply-suggestion | 非交互式接受建议并写入 |
77
+ | 2 | pmem distill --apply-suggestion | 非交互式接受蒸馏建议并执行 |
78
+ | 3 | changed files → related cards 推断 | 通过 paths 表 + edges 表反查受影响的 cards |
79
+ | 4 | session update_log 汇总 | session end 时汇总本次会话的所有 update_log |
80
+ | 5 | AGENTS.md / CLAUDE.md 模板优化 | 嵌入 hooks 使用示例,降低 Agent 接入门槛 |
81
+
82
+ ### P2 — 推迟到 v0.5+
83
+
84
+ | 功能 | 目标版本 |
85
+ |------|---------|
86
+ | embedding 真接入 (API/local) | v0.5+ |
87
+ | pmem serve (MCP/REST) | v0.5+ |
88
+ | Graph UI | v0.5+ |
89
+ | 多用户远程服务 | v0.5+ |
90
+ | 自动 commit message 生成 | v0.5+ |
91
+
92
+ ---
93
+
94
+ ## 四、Changed Files Detection 设计
95
+
96
+ ### 数据来源
97
+
98
+ 优先级:`git status --porcelain` > `file mtime comparison`
99
+
100
+ ```bash
101
+ git status --porcelain 2>/dev/null || find . -newer .pmem/.last-check -type f
102
+ ```
103
+
104
+ ### 输出格式
105
+
106
+ ```json
107
+ {
108
+ "checked_at": "2026-05-20T10:00:00Z",
109
+ "source": "git",
110
+ "changes": [
111
+ { "path": "src/core/db.ts", "status": "M", "related_cards": ["module.sqlite_runtime"] },
112
+ { "path": "src/commands/rebuild.ts", "status": "M", "related_cards": ["module.sqlite_runtime"] },
113
+ { "path": "tests/db.test.ts", "status": "A", "related_cards": [] }
114
+ ],
115
+ "affected_cards": ["module.sqlite_runtime"],
116
+ "suggested_actions": [
117
+ "mark-dirty --reason 'src/core/db.ts modified'",
118
+ "update --suggest"
119
+ ]
120
+ }
121
+ ```
122
+
123
+ ### 关联推断规则
124
+
125
+ 1. 通过 `paths` 表精确匹配:`SELECT card_id FROM paths WHERE path LIKE '%<changed_file>%'`
126
+ 2. 通过目录前缀模糊匹配:`src/core/` 变更 → 查找所有 paths 中包含 `src/core/` 的 cards
127
+ 3. 通过 edges 表扩展:找到关联 cards 的直接邻居
128
+
129
+ ---
130
+
131
+ ## 五、`pmem update --suggest` 设计
132
+
133
+ ### 触发条件
134
+
135
+ 1. 存在 unresolved dirty_flags
136
+ 2. state.md / next.md 内容过时
137
+ 3. 检测到 changed files 关联到已有 cards
138
+ 4. 上次 update 距今超过 24 小时
139
+
140
+ ### 输出格式 (`--format compact`)
141
+
142
+ ```
143
+ Memory Update Suggestions:
144
+
145
+ Dirty Flags (2 unresolved):
146
+ [project] code_changed (2026-05-20T09:00:00Z)
147
+ [module.url_store] schema_changed (2026-05-20T09:30:00Z)
148
+
149
+ Changed Files (3):
150
+ M src/store.ts → related: module.url_store
151
+ M src/shortcode.ts → related: module.shortcode_generator
152
+ A tests/store.test.ts → related: (none)
153
+
154
+ Suggested Actions:
155
+ 1. Update module.url_store — src/store.ts changed
156
+ 2. Update module.shortcode_generator — src/shortcode.ts changed
157
+ 3. Create trace for recent changes
158
+ 4. Update state.md
159
+
160
+ Run `pmem update --apply-suggestion <id>` to accept, or `pmem update --confirm` to write manually.
161
+ ```
162
+
163
+ ### 输出格式 (`--format json`)
164
+
165
+ ```json
166
+ {
167
+ "dirty_flags": [
168
+ { "scope": "project", "target": ".pmem", "reason": "code_changed", "created_at": "..." }
169
+ ],
170
+ "changed_files": [
171
+ { "path": "src/store.ts", "status": "M", "related_cards": ["module.url_store"] }
172
+ ],
173
+ "suggestions": [
174
+ {
175
+ "id": "suggest-1",
176
+ "action": "update_card",
177
+ "target": "module.url_store",
178
+ "reason": "src/store.ts changed — this file is registered as a source_file of module.url_store",
179
+ "priority": "high",
180
+ "auto_applicable": false
181
+ },
182
+ {
183
+ "id": "suggest-2",
184
+ "action": "create_trace",
185
+ "target": null,
186
+ "reason": "3 files changed without a corresponding trace",
187
+ "priority": "medium",
188
+ "auto_applicable": true
189
+ }
190
+ ]
191
+ }
192
+ ```
193
+
194
+ ### `--apply-suggestion <id>` 行为
195
+
196
+ | suggestion.action | 自动行为 |
197
+ |-------------------|---------|
198
+ | `update_card` | 标记该 card 的 `last_verified_at` 为过期,提示 Agent 手动更新 |
199
+ | `create_trace` | 自动创建 trace 文件(格式同 `pmem update --confirm`) |
200
+ | `update_state` | 提示 Agent 手动编辑 state.md |
201
+ | `mark_dirty_resolved` | 将该 dirty flag 的 `resolved_at` 设为当前时间 |
202
+
203
+ ---
204
+
205
+ ## 六、`pmem distill --suggest` 设计
206
+
207
+ ### 触发条件
208
+
209
+ 1. traces/ 目录中未蒸馏 traces 数量 ≥ `manifest.distill.max_undistilled_traces` (默认 20)
210
+ 2. 距上次蒸馏超过 `manifest.distill.cadence` (默认 weekly)
211
+
212
+ ### 输出格式
213
+
214
+ ```
215
+ Distill Suggestions:
216
+
217
+ Undistilled traces: 15 (threshold: 20)
218
+ Last distilled: 2026-05-13 (7 days ago)
219
+ Cadence: weekly
220
+
221
+ Traces by target:
222
+ module.url_store: 5 traces → suggested merge
223
+ module.shortcode_generator: 3 traces → below threshold
224
+ decision.storage_backend: 2 traces → below threshold
225
+ (ungrouped): 5 traces → create new decision or trace card
226
+
227
+ Suggested Actions:
228
+ 1. Distill 5 traces into module.url_store
229
+ 2. Review 5 ungrouped traces — may indicate a new module or decision
230
+
231
+ Run `pmem distill --apply-suggestion <id>` to apply, or `pmem distill --confirm` to review interactively.
232
+ ```
233
+
234
+ ### 与 v0.3 的差异
235
+
236
+ v0.3 的 distill 是纯文件扫描 + Markdown 追加。v0.4 的 distill 应该:
237
+ 1. 从 SQLite edges 表推断 traces → cards 的分组关系
238
+ 2. 按 target card 聚合,超过阈值的才建议蒸馏
239
+ 3. 未被分组的 traces 建议创建新 card
240
+
241
+ ---
242
+
243
+ ## 七、CLI Hooks-Friendly Output 设计
244
+
245
+ ### 设计原则
246
+
247
+ 所有 suggest/info 类命令输出必须满足:
248
+ - 无交互式提示(不依赖 stdin)
249
+ - `--format json` 输出可被 `jq` / `JSON.parse` 直接消费
250
+ - `--format compact` 输出可被 Agent 直接阅读
251
+ - 退出码明确:0 = 无建议, 1 = 有建议待处理, 2 = 错误
252
+
253
+ ### 退出码约定
254
+
255
+ | 命令 | 退出码 0 | 退出码 1 | 退出码 2 |
256
+ |------|---------|---------|---------|
257
+ | `pmem update --suggest` | 无建议 | 有建议待处理 | 错误 |
258
+ | `pmem distill --suggest` | 无需蒸馏 | 建议蒸馏 | 错误 |
259
+ | `pmem verify` | 全部通过 | 有 warning | 有 error |
260
+
261
+ 这个退出码约定让 Agent 可以这样使用:
262
+
263
+ ```bash
264
+ if pmem update --suggest --format json > /tmp/suggestions.json; then
265
+ echo "Memory is up to date."
266
+ else
267
+ # Parse suggestions and decide which to apply
268
+ cat /tmp/suggestions.json | jq '.suggestions'
269
+ fi
270
+ ```
271
+
272
+ ---
273
+
274
+ ## 八、Integration Templates 设计
275
+
276
+ ### 目标
277
+
278
+ 降低 Claude Code / Cursor / Codex 接入 pmem 的门槛。每个模板应包含:
279
+ 1. 启动指令(session start + recall)
280
+ 2. 工作循环(修改代码 → mark-dirty → update)
281
+ 3. 结束指令(update --confirm + session end + verify)
282
+
283
+ ### Claude Code 模板 (`.pmem/integrations/claude-code/CLAUDE.md`)
284
+
285
+ ```markdown
286
+ # pmem integration for Claude Code
287
+
288
+ ## Session Start
289
+ Run at the beginning of each coding session:
290
+ ```bash
291
+ pmem session start -a "Claude"
292
+ pmem recall --format compact --budget 2000
293
+ ```
294
+
295
+ ## During Work
296
+ After modifying code:
297
+ ```bash
298
+ pmem mark-dirty -r "Modified <file> — <brief reason>"
299
+ ```
300
+
301
+ Before committing changes:
302
+ ```bash
303
+ pmem update --suggest --format json
304
+ ```
305
+
306
+ ## Session End
307
+ Before ending the session:
308
+ ```bash
309
+ pmem update --confirm -s "<summary of changes>" -n "<next step>"
310
+ pmem session end -s "<task summary>"
311
+ pmem verify
312
+ ```
313
+
314
+ ## Hooks (optional)
315
+ Add to `.claude/settings.json`:
316
+ ```json
317
+ {
318
+ "hooks": {
319
+ "PostToolUse": [
320
+ {
321
+ "matcher": "Edit|Write",
322
+ "command": "pmem mark-dirty -r \"File modified by Claude\""
323
+ }
324
+ ]
325
+ }
326
+ }
327
+ ```
328
+ ```
329
+
330
+ ### Cursor 模板 (`.pmem/integrations/cursor/rules.example.md`)
331
+
332
+ 类似结构,适配 Cursor 的 Rules 语法。
333
+
334
+ ### Codex 模板 (`.pmem/integrations/codex/AGENTS.md`)
335
+
336
+ 类似结构,适配 Codex 的 AGENTS.md 约定。
337
+
338
+ ---
339
+
340
+ ## 九、技术债清理(v0.4 功能开发前完成)
341
+
342
+ ### 债 1:重复内联 YAML 解析器
343
+
344
+ **问题:** `rebuild.ts` 和 `migrate.ts` 各有一份 ~100 行的内联 YAML 解析器。
345
+
346
+ **方案:** 抽取到 `src/core/yaml.ts`:
347
+
348
+ ```typescript
349
+ export function parseSimpleYaml(yaml: string): Record<string, unknown>;
350
+ export function parseYamlValue(val: string): string | boolean | number | string[];
351
+ export function parseFrontmatter(content: string): { data: Record<string, unknown>; body: string } | null;
352
+ export function stringifyFrontmatter(data: Record<string, unknown>, body: string): string;
353
+ ```
354
+
355
+ `rebuild.ts`、`migrate.ts`、`distill.ts` 统一使用 `src/core/yaml.ts`。
356
+
357
+ ### 债 2:manifest `as any` 类型绕过
358
+
359
+ **问题:** `migrate.ts` 中 `saveManifest(pmemPath, newManifest as any)` 绕过了类型检查。
360
+
361
+ **方案:**
362
+ 1. 将 `Manifest` 改为 discriminated union:`type Manifest = ManifestV02 | ManifestV03`
363
+ 2. `saveManifest` 接受 `Manifest`(union type),运行时根据 `pmem.schema_version` 校验
364
+ 3. `migrate02to03` 返回 `ManifestV03`,不再需要 `as any`
365
+
366
+ ---
367
+
368
+ ## 十、开工顺序
369
+
370
+ ```
371
+ Step 0: 冻结 v0.4 pre-design(本文档)
372
+
373
+ Step 1a: 抽取 YAML 解析器到 src/core/yaml.ts
374
+
375
+ Step 1b: 移除 manifest as any,typed migration
376
+
377
+ Step 2: 补测试(yaml / manifest / rebuild-migrate 一致性)
378
+
379
+ Step 3: P0 功能开发(按优先级表 1→8 顺序)
380
+
381
+ Step 4: P1 功能开发
382
+
383
+ Step 5: E2E 实战验证
384
+ ```
385
+
386
+ ---
387
+
388
+ ## 十一、v0.4 最终决策表
389
+
390
+ | 问题 | 最终决策 |
391
+ |------|---------|
392
+ | v0.4 主线 | Agent workflow 自动化 |
393
+ | embedding | v0.4 不入,仅保留 Provider Interface + manifest 配置 |
394
+ | API embedding | 暂缓 |
395
+ | local embedding | 暂缓 |
396
+ | pmem serve (MCP/REST) | 完全搁置,不做 experimental |
397
+ | YAML 解析器 | 抽取到 src/core/yaml.ts |
398
+ | manifest as any | 移除,改 discriminated union |
399
+ | 开工顺序 | 先清技术债,再做 workflow P0 |
400
+ | v0.5 目标 | 上线可用 Beta |
401
+
402
+ ---
403
+
404
+ ## 十二、v0.4 一句话定义
405
+
406
+ > **pmem v0.4 是一个能感知代码变更、自动建议记忆更新、通过退出码和 JSON 输出与 Agent 协作的项目记忆工作流运行时。**
407
+
408
+ 更工程化:
409
+
410
+ ```
411
+ pmem v0.4 =
412
+ v0.3 SQLite runtime
413
+ + changed files detection
414
+ + dirty → suggest → apply 闭环
415
+ + CLI hooks-friendly output contract
416
+ + integration templates (Claude Code / Cursor / Codex)
417
+ ```