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,355 @@
1
+ # pmem v0.3 交接文档
2
+
3
+ ## 一、项目概况
4
+
5
+ **pmem**(Project Memory for Agents)是一个面向 AI coding agent 的图结构项目记忆 CLI 运行时。它让 Agent 以极少 token 恢复项目上下文、查找相关记忆、溯源决策、回写记忆。
6
+
7
+ - **仓库位置:** `/Users/kerye/Codings/pmem`
8
+ - **技术栈:** TypeScript (strict, CommonJS, ES2022) + Commander + js-yaml
9
+ - **运行时:** Node.js ≥18
10
+ - **测试目录:** `temp/`(gitignored)
11
+
12
+ ---
13
+
14
+ ## 二、已完成工作(v0.1 + v0.2)
15
+
16
+ ### v0.1 — 核心闭环(10 命令)
17
+
18
+ 文件模式下的完整记忆工作流:init → recall → ask → related → trace → update → verify → rebuild。
19
+
20
+ ### v0.2 — 工程底座(12 命令,+2 新增)
21
+
22
+ 在 v0.1 基础上补齐:冷启动、迁移、并发保护、卡片治理、蒸馏。
23
+
24
+ | 命令 | 职责 | v0.2 变化 |
25
+ |------|------|----------|
26
+ | `pmem init` | 初始化 .pmem/ | +`--guided` 交互模式、项目扫描、`candidates/`、`memory_incomplete` |
27
+ | `pmem rebuild` | .md → indexes/graph.json | +atomicWrite(writeJson) |
28
+ | `pmem recall` | 输出项目最小上下文 | 无变化 |
29
+ | `pmem ask` | 图引导召回 | 无变化 |
30
+ | `pmem related` | 图谱邻居查询 | 无变化 |
31
+ | `pmem trace` | 溯源追踪 | 无变化 |
32
+ | `pmem verify` | 一致性检查 | +schema_version 兼容检查、card_policy 违规检测(ID 命名/大小/关系数)、dirty 检测 |
33
+ | `pmem update` | 记忆更新(四级) | +atomicWrite、file lock、manifest.memory_status 管理 |
34
+ | `pmem mark-dirty` | 脏标记 | +atomicWrite、manifest.memory_status |
35
+ | `pmem integration` | 框架适配 | +distill 提及 |
36
+ | `pmem migrate` | **新增** — schema 版本迁移 | `--dry-run`、`--to`、`--backup`、0.1→0.2 迁移路径 |
37
+ | `pmem distill` | **新增** — trace→card 蒸馏 | `--confirm`、`--suggest-splits` |
38
+
39
+ ### 关键技术决策(v0.2)
40
+
41
+ - **并发策略降级**:不做完整乐观锁(留给 v0.3 SQLite),只做 atomicWrite + 简单 file lock(mkdir-based)
42
+ - **YAML 库**:手写解析器替换为 js-yaml
43
+ - **manifest 版本化**:`pmem.schema_version: "0.2"` 写入 manifest + 每张卡片
44
+ - **迁移保障**:自动备份 + dry-run + migration 历史记录
45
+
46
+ ---
47
+
48
+ ## 三、代码库地图
49
+
50
+ ```
51
+ pmem/
52
+ ├── CLAUDE.md # Agent 使用说明(你可能需要先读这个)
53
+ ├── package.json # 依赖:commander, js-yaml;dev:typescript, ts-node, @types/*
54
+ ├── tsconfig.json # strict mode, ES2022, CommonJS
55
+ ├── temp/ # gitignored 测试目录
56
+
57
+ ├── docs/ # 设计文档(按顺序读)
58
+ │ ├── Voorlopige projekidee.md # 长期架构总纲(最初的项目构想)
59
+ │ ├── prd.md # 产品需求文档(用户、场景、成功指标)
60
+ │ ├── project-roadmap.md # v0.1→v0.5 全版本路线图
61
+ │ ├── v0.2 pre-design.md # v0.2 前置设计决策(冷启动/并发/粒度/迁移)
62
+ │ ├── v0.2 pre-roadmap.md # v0.2 实现路线图(P0/P1/P2)
63
+ │ ├── v0.3 pre-design.md # ⭐ v0.3 开工前必读 — 最终技术决策
64
+ │ └── handover-v0.3.md # 本文档
65
+
66
+ ├── src/
67
+ │ ├── index.ts # CLI 入口(Commander),13 个命令注册
68
+ │ ├── types.ts # 全部 TS 类型(CardFrontmatter, Manifest, v0.2 新增类型等)
69
+ │ ├── core/
70
+ │ │ ├── fs.ts # 文件工具:atomicWrite, acquireLock, releaseLock, readJson, writeJson 等
71
+ │ │ └── manifest.ts # Manifest 加载/保存(js-yaml),getDefaultManifest()
72
+ │ └── commands/
73
+ │ ├── init.ts # pmem init [--guided]
74
+ │ ├── rebuild.ts # pmem rebuild
75
+ │ ├── recall.ts # pmem recall --budget N
76
+ │ ├── verify.ts # pmem verify --fix
77
+ │ ├── ask.ts # pmem ask <query>
78
+ │ ├── graph.ts # pmem related / pmem trace
79
+ │ ├── update.ts # pmem update / pmem mark-dirty
80
+ │ ├── integration.ts # pmem integration list/install/verify
81
+ │ ├── migrate.ts # pmem migrate --dry-run/--to/--backup
82
+ │ └── distill.ts # pmem distill --confirm/--suggest-splits
83
+ └── dist/ # tsc 编译输出
84
+ ```
85
+
86
+ ---
87
+
88
+ ## 四、v0.3 目标
89
+
90
+ > **SQLite-backed CLI Runtime** — 将查询、索引、状态管理迁入 SQLite,但 Markdown cards 保持为唯一主数据。
91
+
92
+ 核心公式:
93
+ ```
94
+ pmem v0.3 =
95
+ Markdown canonical memory cards
96
+ + SQLite-backed graph/index/runtime
97
+ + content-hash incremental rebuild
98
+ + Agent-first CLI output contract (--format compact/json/paths/pack)
99
+ + skills-based usage protocol
100
+ ```
101
+
102
+ ### 不做的事情
103
+
104
+ - 不做 MCP Server(只留 experimental 接口)
105
+ - 不做 REST API
106
+ - 不做 embedding 真接入(只设计 provider interface)
107
+ - Markdown 不搬家到数据库
108
+ - 不删除旧 JSON indexes
109
+
110
+ ---
111
+
112
+ ## 五、v0.3 开工指南
113
+
114
+ ### 步骤 1:阅读关键文档(30 分钟)
115
+
116
+ 按顺序读:
117
+ 1. `CLAUDE.md` — 了解项目命令和架构
118
+ 2. `docs/v0.3 pre-design.md` — **全部 14 章**,这是 v0.3 的正式技术决策文档
119
+ 3. `docs/project-roadmap.md` 中 v0.3 部分
120
+ 4. `src/types.ts` — 了解现有类型系统(v0.3 需要新增大量类型)
121
+
122
+ ### 步骤 2:安装 SQLite 依赖
123
+
124
+ ```bash
125
+ npm install better-sqlite3
126
+ npm install --save-dev @types/better-sqlite3
127
+ ```
128
+
129
+ `better-sqlite3` 是 Node.js 生态最成熟的同步 SQLite 库,适合 CLI 工具。
130
+
131
+ ### 步骤 3:按 P0 顺序逐项实现
132
+
133
+ **Phase 1:类型与基础设施**
134
+
135
+ 1. 在 `src/types.ts` 中新增 v0.3 类型:
136
+ - `RuntimeConfig`(mode, db_path, markdown_source)
137
+ - `RebuildConfig`(strategy, hash 配置)
138
+ - `CliConfig`(default_format, supported_formats, default_budget)
139
+ - `EmbeddingConfig`(enabled, provider, model, dimension, store, index)
140
+ - `ServeConfig`(enabled, mode, experimental)
141
+ - 更新 `Manifest` 接口以包含 v0.3 新字段
142
+
143
+ 2. 创建 `src/core/db.ts` — SQLite 数据库管理:
144
+ - `openDatabase(pmemPath: string): Database` — 打开/创建 `.pmem/pmem.db`
145
+ - `createSchema(db: Database): void` — 创建 P0 7 张表
146
+ - `getSchemaVersion(db: Database): string | null`
147
+
148
+ **Phase 2:Rebuild 切换到 SQLite**
149
+
150
+ 3. 重写 `src/commands/rebuild.ts`:
151
+ - 从 Markdown cards 解析 frontmatter
152
+ - 写入 SQLite cards / edges / aliases / tags / paths 表
153
+ - 计算 file_hash / frontmatter_hash / body_hash
154
+ - 支持 `--changed`(增量)和 `--full`(全量)
155
+ - `--changed` 逻辑:对比 hash,相同跳过,不同更新
156
+ - 旧 JSON index 仍写入(legacy 兼容),但主输出是 SQLite
157
+
158
+ **Phase 3:查询命令切换到 SQLite**
159
+
160
+ 4. 重写 `src/commands/recall.ts`:
161
+ - 从 SQLite cards 表读取项目信息
162
+ - 读取 state.md / next.md
163
+ - 查询 dirty_flags 和 update_log
164
+ - 支持 `--format compact/json/paths/pack`
165
+
166
+ 5. 重写 `src/commands/ask.ts`:
167
+ - 召回链路:exact match(aliases/tags)→ graph expansion(edges)→ FTS keyword → rerank
168
+ - FTS5 全文检索(如果可用)
169
+ - 支持 `--format compact/json/paths/pack`
170
+ - 输出必须标注 match_type(可解释召回)
171
+
172
+ 6. 重写 `src/commands/graph.ts`(related / trace):
173
+ - related:从 edges 表查询图邻居
174
+ - 支持 `--depth 2`(多跳查询)和 `--type depends_on`(边类型过滤)
175
+ - trace:从 cards + edges 表组装溯源链
176
+
177
+ **Phase 4:Verify 切换到 SQLite**
178
+
179
+ 7. 重写 `src/commands/verify.ts`:
180
+ - 对比 SQLite 中的 hash 与 Markdown 文件的当前 hash
181
+ - 检查 edges 是否有孤儿引用
182
+ - 检查 card_policy 违规
183
+ - `--fix` 行为:运行 `pmem rebuild --changed`
184
+
185
+ **Phase 5:Migration(0.2 → 0.3)**
186
+
187
+ 8. 创建/重写 `src/commands/migrate.ts` 的 0.2→0.3 路径:
188
+ - `--dry-run`:预览 schema 创建、数据导入、manifest 变更
189
+ - 正式执行:备份 → 创建 SQLite → 从 Markdown rebuild → 更新 manifest → verify
190
+ - 保留旧 JSON indexes(legacy 标记)
191
+
192
+ **Phase 6:CLI 输出协议**
193
+
194
+ 9. 在查询命令中实现 `--format`:
195
+ - `compact`:低 token 纯文本(Agent 直接阅读)
196
+ - `json`:结构化 JSON(Agent 程序化处理)
197
+ - `paths`:仅文件路径(极低 token)
198
+ - `pack`:受 `--budget` 控制的上下文包
199
+
200
+ **Phase 7:接线与测试**
201
+
202
+ 10. 更新 `src/index.ts`:注册新选项(`--format`、`--depth`),更新版本为 `0.3.0`
203
+ 11. 更新 `src/core/manifest.ts`:`getDefaultManifest()` 生成 v0.3 manifest 模板
204
+ 12. 在 `temp/` 中进行完整 E2E 测试
205
+
206
+ ### 步骤 4:E2E 测试流程
207
+
208
+ 每次 Phase 完成后,在 `temp/` 中跑这个测试流程:
209
+
210
+ ```bash
211
+ cd temp && rm -rf test-v03 && mkdir test-v03 && cd test-v03
212
+
213
+ # 1. 初始化(从 v0.2 manifest 开始,模拟已有项目)
214
+ npx ts-node ../../src/index.ts init test-v03
215
+
216
+ # 2. 添加示例卡片
217
+ mkdir -p .pmem/modules .pmem/decisions .pmem/tasks .pmem/traces
218
+ # ... 写入测试卡片 ...
219
+
220
+ # 3. 重建索引
221
+ npx ts-node ../../src/index.ts rebuild
222
+
223
+ # 4. 迁移到 v0.3
224
+ npx ts-node ../../src/index.ts migrate --to 0.3 --dry-run
225
+ npx ts-node ../../src/index.ts migrate --to 0.3
226
+
227
+ # 5. 验证
228
+ npx ts-node ../../src/index.ts verify
229
+
230
+ # 6. 查询
231
+ npx ts-node ../../src/index.ts recall --budget 2000 --format compact
232
+ npx ts-node ../../src/index.ts ask "回测沙盒" --format json
233
+ npx ts-node ../../src/index.ts related module.backtest_sandbox --depth 2
234
+ npx ts-node ../../src/index.ts trace module.backtest_sandbox
235
+
236
+ # 7. 更新流程
237
+ npx ts-node ../../src/index.ts mark-dirty --reason "test"
238
+ npx ts-node ../../src/index.ts update --confirm --summary "Test update"
239
+
240
+ # 8. 蒸馏
241
+ npx ts-node ../../src/index.ts distill
242
+ npx ts-node ../../src/index.ts distill --suggest-splits
243
+ ```
244
+
245
+ ### 步骤 5:关键验收标准
246
+
247
+ v0.3 完成的标准:
248
+
249
+ - [ ] `better-sqlite3` 安装成功,`npx tsc --noEmit` 零错误
250
+ - [ ] `pmem rebuild` 将卡片数据写入 SQLite cards/edges/aliases/tags/paths 表
251
+ - [ ] `pmem rebuild --changed` 只更新有变化的卡片(hash 对比)
252
+ - [ ] `pmem recall --format compact` 输出低 token 纯文本
253
+ - [ ] `pmem recall --format json` 输出有效 JSON
254
+ - [ ] `pmem ask "<query>"` 召回链路包含 exact → graph → FTS 阶段
255
+ - [ ] `pmem ask` 输出标注 match_type(可解释召回)
256
+ - [ ] `pmem related <id> --depth 2` 多跳查询正确
257
+ - [ ] `pmem verify` 检测到 SQLite 与 Markdown 不一致
258
+ - [ ] `pmem verify --fix` 自动 rebuild 并修复
259
+ - [ ] `pmem migrate --to 0.3 --dry-run` 预览迁移计划
260
+ - [ ] `pmem migrate --to 0.3` 执行迁移(自动备份 + 不删除 JSON indexes)
261
+ - [ ] 并发写入时 file lock + SQLite transaction 正常工作
262
+ - [ ] 所有 v0.1/v0.2 命令仍可工作(无回归)
263
+ - [ ] `temp/` 中完整 E2E 测试通过
264
+
265
+ ---
266
+
267
+ ## 六、常见陷阱与注意事项
268
+
269
+ ### 1. Markdown 永远是主数据
270
+
271
+ 不要在 SQLite 中创建"只存在于数据库"的卡片。所有卡片必须对应 `.pmem/` 下的一个 `.md` 文件。`is_deleted` 和 `is_candidate` 字段只是标记,不代表可以跳过 Markdown。
272
+
273
+ ### 2. 不要删除 JSON indexes
274
+
275
+ v0.2 用户的项目中有 `indexes/graph.json`。迁移后保留它们,在 manifest 中标记 `legacy_json.retained: true`。不要删除。
276
+
277
+ ### 3. Hash 对比,不是 timestamp
278
+
279
+ 增量 rebuild 判断卡片是否变化时,用 content hash(SHA-256),不用文件 mtime。mtime 在 git checkout 等操作下不可靠。
280
+
281
+ ### 4. FTS5 可能不可用
282
+
283
+ 某些 Node.js / SQLite 发行版不包含 FTS5。在代码中检查 FTS5 是否可用,降级到 LIKE 查询。
284
+
285
+ ```typescript
286
+ function hasFTS5(db: Database): boolean {
287
+ const row = db.prepare("SELECT 1 FROM sqlite_master WHERE name='card_fts'").get();
288
+ // Try to create, catch error if unsupported
289
+ }
290
+ ```
291
+
292
+ ### 5. 事务边界
293
+
294
+ 写入操作必须在事务中:BEGIN → 写 cards/edges/aliases → COMMIT。如果中途失败,ROLLBACK。但 Markdown 文件写入不在事务内(文件系统不可回滚)。策略:先写 Markdown(atomicWrite),成功后再 SQLite transaction。如果 SQLite 失败,Markdown 已写入但 SQLite 标记 stale——下次 rebuild 会自动修复。
295
+
296
+ ### 6. 锁的顺序
297
+
298
+ 先拿 file lock,再开 SQLite transaction。释放时相反:先 COMMIT transaction,再 release lock。不要反过来。
299
+
300
+ ### 7. 保持向后兼容
301
+
302
+ v0.3 的 `getDefaultManifest()` 生成的 manifest 必须能让 v0.2 命令(如 rebuild、verify)识别核心字段。新增的 `runtime`、`cli`、`embedding`、`serve` 字段对 v0.2 命令应该是可选的、被忽略的。
303
+
304
+ ---
305
+
306
+ ## 七、需要创建的新文件
307
+
308
+ | 文件 | 说明 |
309
+ |------|------|
310
+ | `src/core/db.ts` | SQLite 连接管理、schema 创建、hash 查询 |
311
+ | `src/core/hash.ts` | 内容 hash 计算(file_hash, frontmatter_hash, body_hash) |
312
+ | (可能)`src/core/format.ts` | CLI 输出格式化(compact/json/paths/pack) |
313
+
314
+ ## 八、需要重写的现有文件
315
+
316
+ | 文件 | 重写程度 | 说明 |
317
+ |------|---------|------|
318
+ | `src/types.ts` | 追加 | 新增 v0.3 类型,更新 Manifest |
319
+ | `src/core/manifest.ts` | 更新 | getDefaultManifest() 生成 v0.3 模板 |
320
+ | `src/commands/rebuild.ts` | 重写 | SQLite 写入 + 增量 hash 对比 |
321
+ | `src/commands/recall.ts` | 重写 | SQLite 查询 + --format |
322
+ | `src/commands/ask.ts` | 重写 | SQLite + FTS + --format |
323
+ | `src/commands/graph.ts` | 更新 | SQL edges + --depth + --type |
324
+ | `src/commands/verify.ts` | 重写 | SQLite ↔ Markdown hash 对比 |
325
+ | `src/commands/migrate.ts` | 追加 | 0.2→0.3 迁移路径 |
326
+ | `src/index.ts` | 更新 | 注册新选项、版本 0.3.0 |
327
+
328
+ ---
329
+
330
+ ## 九、依赖与环境
331
+
332
+ ```json
333
+ {
334
+ "dependencies": {
335
+ "commander": "^14.0.3",
336
+ "js-yaml": "^4.1.1",
337
+ "better-sqlite3": "待安装"
338
+ },
339
+ "devDependencies": {
340
+ "@types/better-sqlite3": "待安装",
341
+ "@types/js-yaml": "^4.0.9",
342
+ "@types/node": "^25.9.1",
343
+ "ts-node": "^10.9.2",
344
+ "typescript": "^6.0.3"
345
+ }
346
+ }
347
+ ```
348
+
349
+ ---
350
+
351
+ ## 十、v0.3 完成后应更新的文档
352
+
353
+ - `CLAUDE.md` — 源文件树、实现状态表
354
+ - `docs/project-roadmap.md` — v0.3 状态标记为完成
355
+ - 新建 `docs/v0.4 pre-design.md` — v0.4 前置设计决策