pmem-ai 0.6.3 → 0.7.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.
- package/CHANGELOG.md +44 -0
- package/README.md +56 -1
- package/dist/commands/ask.d.ts.map +1 -1
- package/dist/commands/ask.js +5 -1
- package/dist/commands/ask.js.map +1 -1
- package/dist/commands/distill.d.ts.map +1 -1
- package/dist/commands/distill.js +15 -6
- package/dist/commands/distill.js.map +1 -1
- package/dist/commands/doctor.d.ts.map +1 -1
- package/dist/commands/doctor.js +21 -8
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/graph.d.ts.map +1 -1
- package/dist/commands/graph.js +7 -2
- package/dist/commands/graph.js.map +1 -1
- package/dist/commands/init.d.ts +13 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +142 -32
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/integration.d.ts.map +1 -1
- package/dist/commands/integration.js +170 -15
- package/dist/commands/integration.js.map +1 -1
- package/dist/commands/new.d.ts.map +1 -1
- package/dist/commands/new.js +15 -14
- package/dist/commands/new.js.map +1 -1
- package/dist/commands/rebuild.d.ts.map +1 -1
- package/dist/commands/rebuild.js +82 -13
- package/dist/commands/rebuild.js.map +1 -1
- package/dist/commands/recall.d.ts.map +1 -1
- package/dist/commands/recall.js +11 -5
- package/dist/commands/recall.js.map +1 -1
- package/dist/commands/rename.d.ts.map +1 -1
- package/dist/commands/rename.js +98 -19
- package/dist/commands/rename.js.map +1 -1
- package/dist/commands/status.d.ts.map +1 -1
- package/dist/commands/status.js +31 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/verify.d.ts.map +1 -1
- package/dist/commands/verify.js +5 -3
- package/dist/commands/verify.js.map +1 -1
- package/dist/core/discover/index.d.ts.map +1 -1
- package/dist/core/discover/index.js +15 -0
- package/dist/core/discover/index.js.map +1 -1
- package/dist/core/fs.d.ts +7 -0
- package/dist/core/fs.d.ts.map +1 -1
- package/dist/core/fs.js +57 -1
- package/dist/core/fs.js.map +1 -1
- package/dist/core/manifest.d.ts +23 -1
- package/dist/core/manifest.d.ts.map +1 -1
- package/dist/core/manifest.js +72 -0
- package/dist/core/manifest.js.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +32 -1
- package/dist/types.d.ts.map +1 -1
- package/docs/handover-v0.6.4.md +285 -0
- package/docs/project-roadmap.md +129 -4
- package/docs/release-checklist-v0.7.0.md +60 -0
- package/docs/session-start-create-design-eval.md +203 -0
- package/docs/usage.md +38 -0
- package/docs/v0.6.4 pre-design.md +526 -0
- package/docs/v0.7.0 pre-design.md +405 -0
- package/package.json +6 -3
- package/skills/pmem/SKILL.md +55 -7
- package/skills/pmem/references/first-init.md +21 -0
- package/skills/pmem/references/memory-cards.md +44 -1
- package/skills/pmem/references/session-workflow.md +3 -3
- package/skills/pmem/references/universal-domains.md +66 -0
|
@@ -0,0 +1,526 @@
|
|
|
1
|
+
# v0.6.4 前置设计决策
|
|
2
|
+
|
|
3
|
+
本文档记录 pmem v0.6.4 开工前的产品与技术决策。v0.6.4 的核心定位:
|
|
4
|
+
|
|
5
|
+
> **Polish & Wrap v0.6 Track**
|
|
6
|
+
>
|
|
7
|
+
> v0.6.3 已发布到 npm。当前进入 v0.6 track 的"干净收尾"阶段。
|
|
8
|
+
>
|
|
9
|
+
> v0.6.4 不新增大型子系统,不改变 memory schema,不做通用化(v0.7.0 目标)、
|
|
10
|
+
> embedding、MCP/REST、Graph UI、telemetry 或远程服务。
|
|
11
|
+
> v0.6.4 只收尾 v0.6 期间累积的低风险 polish 任务,
|
|
12
|
+
> 让 v0.6 track 以稳定状态结束,并为 v0.7.0 通用化设计让出干净的基础。
|
|
13
|
+
>
|
|
14
|
+
> v0.6.4 要回答的唯一问题:
|
|
15
|
+
> **v0.6 track 是否在用户面足够打磨完,让 v0.7.0 通用化有干净的工作基底?**
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
|
|
19
|
+
## 一、背景:v0.6 期间累积的 polish 任务
|
|
20
|
+
|
|
21
|
+
v0.6.0/0.6.1/0.6.2/0.6.3 连续发布期间,pre-design 文档、handover 文档、pre-design 备注中累积了 8 项
|
|
22
|
+
低风险 polish 任务。这些任务的特点:
|
|
23
|
+
|
|
24
|
+
- 单任务工作量 ≤ 1 天
|
|
25
|
+
- 不引入新概念、不改 schema
|
|
26
|
+
- 不动 v0.6 已经收敛的"success criteria"
|
|
27
|
+
- 大部分来自 pre-design §三 "已知非阻塞 P2" 列表或 handover "待观察"列表
|
|
28
|
+
|
|
29
|
+
| # | 来源 | 任务 | 严重程度 |
|
|
30
|
+
|---|------|------|----------|
|
|
31
|
+
| 1 | v0.6.2 pre-design §三 / §十一 末尾 | rename `splitFrontmatter()` body `trimStart()` polish | 非阻塞 P2 |
|
|
32
|
+
| 2 | v0.6 pre-design §成功标准 5 / §九 P1 | integration 模板版本化 + verify 旧模板警告 | 低 |
|
|
33
|
+
| 3 | v0.6 pre-design §九 P2 / handover-v0.6 §九 | Codex / Cursor 深度 slash command 入口 | P2 |
|
|
34
|
+
| 4 | v0.6 pre-design §九 P2 / handover-v0.6 §九 | session start 探测 + `--create-if-missing` 评估 | P2(design 评估) |
|
|
35
|
+
| 5 | v0.6.2 pre-design §5.6 | session 状态丢失根因排查与修复 | P1 |
|
|
36
|
+
| 6 | v0.6.2 pre-design §4.1d | pmem doctor lock 状态可读性 polish | 低 |
|
|
37
|
+
| 7 | v0.6 pre-design §九 P2 | `--guided` 缺字段时的引导 polish | P2 |
|
|
38
|
+
| 8 | v0.6.2 pre-design §4.3 | rename `--dry-run` 对 frontmatter 字段的 diff 输出 | 低 |
|
|
39
|
+
|
|
40
|
+
此外,v0.6.4 自身还应该补**两条文档同步**(不增加代码但必须做):
|
|
41
|
+
|
|
42
|
+
| # | 来源 | 任务 |
|
|
43
|
+
|---|------|------|
|
|
44
|
+
| 9 | (本 pre-design 自提)| `docs/project-roadmap.md` 补 v0.6.2 / v0.6.3 已发布条目 |
|
|
45
|
+
| 10 | (本 pre-design 自提)| `docs/project-roadmap.md` 增 v0.6.4 "Polish & Wrap" 条目 |
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## 二、v0.6.4 产品目标
|
|
50
|
+
|
|
51
|
+
### 一句话目标
|
|
52
|
+
|
|
53
|
+
> **让 v0.6 track 干净收尾——8 项 polish 全部完成 + 2 项文档同步,让 v0.7.0 通用化有干净基底。**
|
|
54
|
+
|
|
55
|
+
### 用户对象
|
|
56
|
+
|
|
57
|
+
| 用户 | 收益 |
|
|
58
|
+
|------|------|
|
|
59
|
+
| 重度项目使用者 | rename 不再 `trimStart` body 空白;doctor lock 状态更可读;rename frontmatter 字段 rename 的 diff 清晰 |
|
|
60
|
+
| Code agent | integration verify 能识别 stale 模板(不被模板静默过期坑);Codex/Cursor 入口补齐;session start 探测降低"刚启动就报 No active session" 的概率 |
|
|
61
|
+
| 首次试用者 | `--guided` 缺字段时给出明确的"可补参数"列表 |
|
|
62
|
+
|
|
63
|
+
### 成功标准
|
|
64
|
+
|
|
65
|
+
1. `pmem rename` 改 body 后,body 原始空白逐字节保留(除用户显式编辑外)。
|
|
66
|
+
2. `pmem integration verify` 在模板版本与项目 manifest 不匹配时输出明确的 warning 级别 issue + 修复指引。
|
|
67
|
+
3. `pmem integration install codex` 生成 `.codex/commands/pmem-*.md` 等价的 Codex entry;`pmem integration install cursor` 生成 `.cursor/commands/pmem-*.md`。
|
|
68
|
+
4. `pmem doctor` 的 lock 检查在 active 状态下输出 age、stale 判定、明确的下一步建议。
|
|
69
|
+
5. `pmem init --guided` 在缺失 `--description` / `--stage` / `--next` 任意字段时,输出"可补哪些参数 + 等价 CLI 命令"。
|
|
70
|
+
6. `pmem rename --dry-run` 在 frontmatter 字段(如 `aliases`)命中时也输出 diff 预览。
|
|
71
|
+
7. session 状态丢失根因报告写进 `docs/handover-v0.6.4.md`(即使根因没复现),明确推迟或修复的判定。
|
|
72
|
+
8. `docs/project-roadmap.md` 补 v0.6.2 / v0.6.3 / v0.6.4 三条已发布/规划条目。
|
|
73
|
+
|
|
74
|
+
---
|
|
75
|
+
|
|
76
|
+
## 三、scope 分级
|
|
77
|
+
|
|
78
|
+
### P0 — 必须完成(v0.6 track 收尾的核心)
|
|
79
|
+
|
|
80
|
+
| 任务 | 说明 | 复杂度 |
|
|
81
|
+
|------|------|--------|
|
|
82
|
+
| 任务 5:session 状态丢失根因 | 排查 src/commands/session.ts:77-82 偶发场景;写根因报告;可能修复或明确推迟 | 中 |
|
|
83
|
+
| 任务 9 + 10:roadmap 文档同步 | 补 v0.6.2/v0.6.3/v0.6.4 三条 | 低 |
|
|
84
|
+
|
|
85
|
+
### P1 — 强烈建议(8 项 polish 中影响面较大的 3 项)
|
|
86
|
+
|
|
87
|
+
| 任务 | 说明 | 复杂度 |
|
|
88
|
+
|------|------|--------|
|
|
89
|
+
| 任务 1:rename trimStart 修复 | 记录 frontmatter end 位置,body 原始 slice | 低 |
|
|
90
|
+
| 任务 2:integration 模板版本化 | manifest.integration.template_version 与 .pmem/integrations/* 标记的 version 字段对比 | 中 |
|
|
91
|
+
| 任务 3:Codex/Cursor 深度入口 | 补 `.codex/commands/` 和 `.cursor/commands/` | 中 |
|
|
92
|
+
|
|
93
|
+
### P2 — 可延后到 v0.6.5(如存在)或放弃
|
|
94
|
+
|
|
95
|
+
| 任务 | 说明 | 复杂度 |
|
|
96
|
+
|------|------|--------|
|
|
97
|
+
| 任务 4:session start --create-if-missing | 仅做 design 评估(不实现),决策记录到 docs | 低(design only) |
|
|
98
|
+
| 任务 6:doctor lock 可读性 | active 状态加 age + stale 判定 + 下一步建议 | 低 |
|
|
99
|
+
| 任务 7:--guided 缺字段引导 | 列出"可补哪些参数" | 低 |
|
|
100
|
+
| 任务 8:rename --dry-run frontmatter diff | `aliases` / `tags` 字段 rename 的 diff 预览 | 低 |
|
|
101
|
+
|
|
102
|
+
### 明确不做(推迟到 v0.7+)
|
|
103
|
+
|
|
104
|
+
v0.6.4 不触碰以下方向,避免 scope 蔓延:
|
|
105
|
+
|
|
106
|
+
- **通用化(v0.7.0 主目标)**——`pmem new` 类型解锁、status 目录匹配去误报、`id_pattern` 占位符、`recall.foundational_types` 通用化、init 模板目录可配置等
|
|
107
|
+
- discover provider 化、discover 默认禁用
|
|
108
|
+
- init --type-preset wizard
|
|
109
|
+
- auto_update.* 字段真正接通
|
|
110
|
+
- `card_globs` 真的被 rebuild 消费
|
|
111
|
+
- 完整 dirty lifecycle(`open/resolved/superseded/ignored/archived`)
|
|
112
|
+
- `pmem dirty list/resolve/prune`
|
|
113
|
+
- embedding / semantic search
|
|
114
|
+
- MCP Server / REST API
|
|
115
|
+
- Graph UI
|
|
116
|
+
- telemetry
|
|
117
|
+
- 多项目 workspace
|
|
118
|
+
- 多语言 CLI
|
|
119
|
+
|
|
120
|
+
### 范围纪律
|
|
121
|
+
|
|
122
|
+
v0.6.4 是 v0.6 track 的最后一块。如果某项 polish 在调研中
|
|
123
|
+
发现需要更大改动("low" 变 "medium"),立即停止并移交给 v0.7.0 处理。
|
|
124
|
+
**不主动扩大 v0.6.4 scope。**
|
|
125
|
+
|
|
126
|
+
---
|
|
127
|
+
|
|
128
|
+
## 四、P0 详细设计
|
|
129
|
+
|
|
130
|
+
### 4.1 session 状态丢失根因排查
|
|
131
|
+
|
|
132
|
+
**现状:**
|
|
133
|
+
|
|
134
|
+
`src/commands/session.ts:77-82` 偶发 "No active pmem session found" 错误。
|
|
135
|
+
v0.6.2 已修复 lock 自动清理、doctor session query bug,但根因未明确闭环。
|
|
136
|
+
|
|
137
|
+
**已知候选根因:**
|
|
138
|
+
|
|
139
|
+
1. **WAL 模式写入可见性**:`session start` 写入 SQLite 后进程退出,下次 `session end` 在另一进程中读取,但 WAL 未 checkpoint 导致旧连接看不到新写入。
|
|
140
|
+
2. **数据库连接关闭时机**:`closeDatabase()` 在写入前关闭导致未提交。
|
|
141
|
+
3. **多次 start 隐式行为**:用户 `session start` 两次,第二次写入覆盖了第一次的 session_id,但 `session end` 检查的是"最近一个未 end 的 session",可能错位。
|
|
142
|
+
|
|
143
|
+
**排查策略:**
|
|
144
|
+
|
|
145
|
+
1. 复现:在 temp 目录模拟快速 start → end 周期,连续 20 次,统计失败率
|
|
146
|
+
2. 检查 `src/core/db.ts` 的 SQLite 打开方式(journal_mode = WAL?)
|
|
147
|
+
3. 若根因在 WAL:在 `session start` 写入后显式 `PRAGMA wal_checkpoint(PASSIVE)`
|
|
148
|
+
4. 若根因在连接关闭:调整 `closeDatabase()` 时机
|
|
149
|
+
5. 若根因在多次 start:增加 idempotent start(第二次 start 检测到 active session 时返回现有 session_id)
|
|
150
|
+
|
|
151
|
+
**DoD:**
|
|
152
|
+
|
|
153
|
+
- 复现脚本写到 `scripts/repro-session-loss.sh`
|
|
154
|
+
- 根因报告写到 `docs/handover-v0.6.4.md` §session 状态丢失章节
|
|
155
|
+
- 若有修复:附带 E2E 验证
|
|
156
|
+
- 若无修复:明确推迟到 v0.7+,附"v0.6.4 已确认根因为 X,修复需要改 Y,v0.6.4 范围内不引入此改动"
|
|
157
|
+
|
|
158
|
+
### 4.2 docs/project-roadmap.md 同步
|
|
159
|
+
|
|
160
|
+
**当前缺失条目:**
|
|
161
|
+
|
|
162
|
+
v0.6.2 "Real-User Friction Fixes" ✅ 已发布
|
|
163
|
+
v0.6.3 "Relationship Auto-Discovery" ✅ 已发布
|
|
164
|
+
v0.6.4 "Polish & Wrap" (本设计文档正在规划)
|
|
165
|
+
|
|
166
|
+
**修改点:**
|
|
167
|
+
|
|
168
|
+
- 在 "v0.6.1 — Actionable Update Suggestions ✅ 已发布" 之后追加 v0.6.2、v0.6.3 两条
|
|
169
|
+
- 主题、核心交付、推迟到 v0.7+ 的项各列一项
|
|
170
|
+
- 在末尾"未决事项" 增 v0.7.0 "通用化基础" 候选方向
|
|
171
|
+
- 本文档(v0.6.4 pre-design)作为 v0.6.4 条目的设计依据引用
|
|
172
|
+
|
|
173
|
+
---
|
|
174
|
+
|
|
175
|
+
## 五、P1 详细设计
|
|
176
|
+
|
|
177
|
+
### 5.1 rename trimStart 修复(任务 1)
|
|
178
|
+
|
|
179
|
+
**现状:**
|
|
180
|
+
|
|
181
|
+
`src/commands/rename.ts` 的 `splitFrontmatter()` 调用 `body.trimStart()`。
|
|
182
|
+
v0.6.2 pre-design §十一 末尾明确:
|
|
183
|
+
|
|
184
|
+
> 已知非阻塞 P2:rename.ts 的 splitFrontmatter() 对 body 做了 trimStart(),
|
|
185
|
+
> 因此"完全保留 body 原始空白"的说法不严谨。
|
|
186
|
+
> 后续 polish 可改为记录 frontmatter end 后的原始 body slice。
|
|
187
|
+
|
|
188
|
+
**修改点:**
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
// 之前
|
|
192
|
+
function splitFrontmatter(content: string): { frontmatter: string; body: string } {
|
|
193
|
+
// ... 解析 frontmatter
|
|
194
|
+
return { frontmatter, body: parsed.body.trimStart() }; // ← trimStart 多余
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 之后
|
|
198
|
+
function splitFrontmatter(content: string): { frontmatter: string; body: string } {
|
|
199
|
+
// 找到 '---' 结束行
|
|
200
|
+
const fmEnd = content.indexOf('\n---');
|
|
201
|
+
if (fmEnd === -1) return { frontmatter: '', body: content };
|
|
202
|
+
const slice = content.slice(fmEnd + 4);
|
|
203
|
+
// 跳过 '---' 后的第一个换行(如果有)
|
|
204
|
+
const bodyStart = slice.startsWith('\n') ? 1 : 0;
|
|
205
|
+
return { frontmatter: content.slice(0, fmEnd + 4), body: slice.slice(bodyStart) };
|
|
206
|
+
// 保留原始空白
|
|
207
|
+
}
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
**DoD:**
|
|
211
|
+
|
|
212
|
+
- body 原始空白逐字节保留(除 user 显式编辑外)
|
|
213
|
+
- 补单测覆盖:body 前导空格、body 前导 \n\n、body 前导空行 + 普通内容
|
|
214
|
+
- 重新跑 E2E `pmem rename` 套件,frontmatter hash 不变
|
|
215
|
+
|
|
216
|
+
### 5.2 integration 模板版本化(任务 2)
|
|
217
|
+
|
|
218
|
+
**现状:**
|
|
219
|
+
|
|
220
|
+
`src/core/manifest.ts:142-144` 的 `ManifestIntegration.template_version` 字段已定义,
|
|
221
|
+
但 `src/commands/integration.ts` 的 `verify` 子命令**未读这个字段**——只检查文件存在。
|
|
222
|
+
|
|
223
|
+
**修改点:**
|
|
224
|
+
|
|
225
|
+
**a) 集成模板安装时写入 version 标记:**
|
|
226
|
+
|
|
227
|
+
```yaml
|
|
228
|
+
# .pmem/integrations/claude-code/CLAUDE.md (顶部 frontmatter)
|
|
229
|
+
---
|
|
230
|
+
pmem_integration_version: '0.6.4'
|
|
231
|
+
last_pmem_version: '0.6.3'
|
|
232
|
+
---
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
**b) verify 时比较:**
|
|
236
|
+
|
|
237
|
+
```typescript
|
|
238
|
+
// integration verify
|
|
239
|
+
const manifestTemplateVersion = manifest.integrations.claude_code?.template_version;
|
|
240
|
+
const installedVersion = parseFrontmatter(fs.readFileSync(installedPath))?.pmem_integration_version;
|
|
241
|
+
|
|
242
|
+
if (manifestTemplateVersion && installedVersion !== manifestTemplateVersion) {
|
|
243
|
+
issues.push({
|
|
244
|
+
severity: 'warning',
|
|
245
|
+
type: 'integration_stale_template',
|
|
246
|
+
message: `Integration template for ${framework} is stale: installed v${installedVersion}, manifest expects v${manifestTemplateVersion}.`,
|
|
247
|
+
fix: `Run: pmem integration install ${framework} --force`,
|
|
248
|
+
});
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
**DoD:**
|
|
253
|
+
|
|
254
|
+
- `pmem integration install` 写入 `pmem_integration_version` 到集成文件 frontmatter
|
|
255
|
+
- `pmem integration verify` 比较版本,不匹配时输出 warning
|
|
256
|
+
- 旧项目(无 version 字段)不报错,输出 "version unknown" 提示
|
|
257
|
+
|
|
258
|
+
### 5.3 Codex / Cursor 深度入口(任务 3)
|
|
259
|
+
|
|
260
|
+
**现状:**
|
|
261
|
+
|
|
262
|
+
v0.6.0 已交付 Claude Code 的 `.claude/commands/pmem-*.md` 入口。
|
|
263
|
+
Codex / Cursor / Windsurf / Copilot 的"深度入口"未实现。
|
|
264
|
+
Codex 当前只有 `.pmem/integrations/codex/AGENTS.md`(agent instructions,非 slash command)。
|
|
265
|
+
|
|
266
|
+
**修改点:**
|
|
267
|
+
|
|
268
|
+
**a) Codex entry:**
|
|
269
|
+
|
|
270
|
+
`.pmem/integrations/codex/AGENTS.md` 已有。增加:
|
|
271
|
+
|
|
272
|
+
- `.codex/commands/pmem-recall.md`(codex command 形式)
|
|
273
|
+
- `.codex/commands/pmem-ask.md`
|
|
274
|
+
- `.codex/commands/pmem-update.md`
|
|
275
|
+
- `.codex/commands/pmem-distill.md`
|
|
276
|
+
|
|
277
|
+
或按 Codex 当前实际支持的 command 形式(pending 调研)。
|
|
278
|
+
|
|
279
|
+
**b) Cursor entry:**
|
|
280
|
+
|
|
281
|
+
- `.cursor/commands/pmem-recall.md`
|
|
282
|
+
- `.cursor/commands/pmem-ask.md`
|
|
283
|
+
- `.cursor/commands/pmem-update.md`
|
|
284
|
+
- `.cursor/commands/pmem-distill.md`
|
|
285
|
+
|
|
286
|
+
**c) `pmem integration install` 扩展:**
|
|
287
|
+
|
|
288
|
+
- `pmem integration install codex` 生成 Codex entry
|
|
289
|
+
- `pmem integration install cursor` 生成 Cursor entry
|
|
290
|
+
- `pmem integration list` 增加 `codex` / `cursor` 深度入口支持
|
|
291
|
+
|
|
292
|
+
**DoD:**
|
|
293
|
+
|
|
294
|
+
- 4 个 slash command 文件 (recall/ask/update/distill) 在 codex 和 cursor 下都生成
|
|
295
|
+
- `pmem integration verify` 检测这些 entry 存在
|
|
296
|
+
- E2E 覆盖 integration install codex / cursor
|
|
297
|
+
|
|
298
|
+
**调研节点:**
|
|
299
|
+
|
|
300
|
+
开工前需先查 Codex 和 Cursor 的实际 command 文件形式(v0.6 阶段可能已有规范)。
|
|
301
|
+
若 Codex/Cursor 实际不支持等价 slash command,改为在 AGENTS.md / .cursor/rules/pmem.mdc 中
|
|
302
|
+
明示 "调用 pmem 应当执行 `pmem recall --budget 2000`" 的等价命令。
|
|
303
|
+
|
|
304
|
+
---
|
|
305
|
+
|
|
306
|
+
## 六、P2 详细设计
|
|
307
|
+
|
|
308
|
+
### 6.1 session start --create-if-missing 评估(任务 4)
|
|
309
|
+
|
|
310
|
+
**目标:**
|
|
311
|
+
|
|
312
|
+
仅为 design 评估,不实现。
|
|
313
|
+
|
|
314
|
+
**评估输出:**
|
|
315
|
+
|
|
316
|
+
- 现有 `pmem session start` 在 `.pmem/` 不存在时行为是什么?
|
|
317
|
+
- 加 `--create-if-missing` option 的风险面:自动创建可能掩盖"用户在错目录跑 pmem"的问题
|
|
318
|
+
- 推荐决策:实现 / 推迟 / 放弃 + 理由
|
|
319
|
+
|
|
320
|
+
**DoD:**
|
|
321
|
+
|
|
322
|
+
- 评估报告写进 `docs/handover-v0.6.4.md` §session start 探测章节
|
|
323
|
+
- 决策明确:实现则附 pre-design 草稿;推迟则附 v0.7+ 评估锚点
|
|
324
|
+
|
|
325
|
+
### 6.2 doctor lock 可读性(任务 6)
|
|
326
|
+
|
|
327
|
+
**现状:**
|
|
328
|
+
|
|
329
|
+
v0.6.2 已实现 doctor lock 三种状态输出。`active` 状态只显示 "Lock held by <pid>"。
|
|
330
|
+
|
|
331
|
+
**修改点:**
|
|
332
|
+
|
|
333
|
+
```typescript
|
|
334
|
+
// 之前
|
|
335
|
+
Lock: ✗ Active lock held at .pmem/.lock (age: 2s). Another pmem process may be running.
|
|
336
|
+
|
|
337
|
+
// 之后
|
|
338
|
+
Lock: ✗ Active lock held at .pmem/.lock
|
|
339
|
+
Owner: pmem (PID: 12345)
|
|
340
|
+
Age: 2s (stale threshold: 60s)
|
|
341
|
+
→ If another pmem is not actually running, wait 60s and run: pmem verify --fix-locks
|
|
342
|
+
→ Or check process: ps -p 12345
|
|
343
|
+
```
|
|
344
|
+
|
|
345
|
+
**DoD:**
|
|
346
|
+
|
|
347
|
+
- 列出 lock age、owner pid、stale 阈值
|
|
348
|
+
- 给出明确的下一步建议
|
|
349
|
+
- E2E 覆盖三种状态
|
|
350
|
+
|
|
351
|
+
### 6.3 --guided 缺字段引导(任务 7)
|
|
352
|
+
|
|
353
|
+
**现状:**
|
|
354
|
+
|
|
355
|
+
`src/commands/init.ts` 的 `--guided` 模式在缺 `--description` / `--stage` / `--next` 时
|
|
356
|
+
使用空字符串或默认值,没有明确告知用户"还差哪些参数"。
|
|
357
|
+
|
|
358
|
+
**修改点:**
|
|
359
|
+
|
|
360
|
+
```bash
|
|
361
|
+
# 之前
|
|
362
|
+
$ pmem init my-project --guided
|
|
363
|
+
# 静默使用空 description
|
|
364
|
+
|
|
365
|
+
# 之后
|
|
366
|
+
$ pmem init my-project --guided
|
|
367
|
+
⚠ Missing --description. --guided works best with all three context flags.
|
|
368
|
+
You can re-run with: pmem init my-project --guided \
|
|
369
|
+
--description "<one-line project purpose>" \
|
|
370
|
+
--stage "<current stage>" \
|
|
371
|
+
--next "<immediate next step>"
|
|
372
|
+
Or answer via: pmem init my-project --guided --answers ./pmem-init.json
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
**DoD:**
|
|
376
|
+
|
|
377
|
+
- 三个字段任一缺失时输出可补参数提示
|
|
378
|
+
- 不阻断流程(仍能 init 成功,但提示更明显)
|
|
379
|
+
- E2E 覆盖三种缺失场景
|
|
380
|
+
|
|
381
|
+
### 6.4 rename --dry-run frontmatter diff(任务 8)
|
|
382
|
+
|
|
383
|
+
**现状:**
|
|
384
|
+
|
|
385
|
+
`pmem rename` 当前只对 body 生效。但用户重命名项目时常会改 `aliases` / `tags` /
|
|
386
|
+
`related` 字段。当前需要 `rename --write` 不动这些字段,用户得手动编辑。
|
|
387
|
+
|
|
388
|
+
**修改点:**
|
|
389
|
+
|
|
390
|
+
`--dry-run` 模式在 frontmatter 字段(`aliases`, `tags`, `related`, `depends_on`)
|
|
391
|
+
命中 `find` 模式时,输出 diff 预览:
|
|
392
|
+
|
|
393
|
+
```
|
|
394
|
+
File: .pmem/characters/zhangsan.md
|
|
395
|
+
Frontmatter: aliases
|
|
396
|
+
- "张三"
|
|
397
|
+
+ "张小三" (alias #0, replacement of "张三")
|
|
398
|
+
```
|
|
399
|
+
|
|
400
|
+
**注意:** `--write` 模式**不动** frontmatter 字段(仍只改 body)。
|
|
401
|
+
`--dry-run` 显示 frontmatter 命中是"给用户一个完整的变更预览",让用户知道
|
|
402
|
+
"如果想改这些字段,需要手动编辑"。
|
|
403
|
+
|
|
404
|
+
**DoD:**
|
|
405
|
+
|
|
406
|
+
- `--dry-run` 模式扫描 frontmatter 字段并显示 diff
|
|
407
|
+
- `--write` 模式**不**改 frontmatter(保持 v0.6.2 安全语义)
|
|
408
|
+
- E2E 覆盖:frontmatter 命中 + body 命中 + 两者都命中的 dry-run 输出
|
|
409
|
+
|
|
410
|
+
---
|
|
411
|
+
|
|
412
|
+
## 七、测试计划
|
|
413
|
+
|
|
414
|
+
### P0 测试
|
|
415
|
+
|
|
416
|
+
- session 状态丢失:复现脚本 + 根因报告
|
|
417
|
+
- roadmap 文档同步:grep 验证 v0.6.2/0.6.3/0.6.4 都出现在 roadmap
|
|
418
|
+
|
|
419
|
+
### P1 测试
|
|
420
|
+
|
|
421
|
+
| 测试项 | 类型 |
|
|
422
|
+
|--------|------|
|
|
423
|
+
| rename body 原始空白保留(前导空格、\n\n、空行) | 单元 |
|
|
424
|
+
| rename frontmatter hash 不变 | E2E(已存在,重新跑) |
|
|
425
|
+
| integration install 写入 pmem_integration_version | 单元 |
|
|
426
|
+
| integration verify 比较 template_version | 单元 |
|
|
427
|
+
| integration install codex 生成 4 个 command 文件 | E2E |
|
|
428
|
+
| integration install cursor 生成 4 个 command 文件 | E2E |
|
|
429
|
+
|
|
430
|
+
### P2 测试
|
|
431
|
+
|
|
432
|
+
- doctor lock active 状态输出 age + pid + 下一步建议
|
|
433
|
+
- init --guided 缺字段提示
|
|
434
|
+
- rename --dry-run frontmatter diff 输出
|
|
435
|
+
|
|
436
|
+
### 通用
|
|
437
|
+
|
|
438
|
+
- `npm test` 通过
|
|
439
|
+
- CI 通过(Node 18/20/22)
|
|
440
|
+
- 旧 E2E 套件不退步
|
|
441
|
+
|
|
442
|
+
---
|
|
443
|
+
|
|
444
|
+
## 八、无 schema migration
|
|
445
|
+
|
|
446
|
+
v0.6.4 不改变 manifest schema_version、不改变卡片 frontmatter 结构、不改变数据库表结构。
|
|
447
|
+
|
|
448
|
+
变更仅涉及:
|
|
449
|
+
- CLI 行为(rename body 不 trimStart、integration 写 version 字段、init --guided 提示)
|
|
450
|
+
- 模板内容(Codex / Cursor command 文件新增)
|
|
451
|
+
- 文档(roadmap 同步、handover-v0.6.4.md 新建)
|
|
452
|
+
|
|
453
|
+
所有现有 `.pmem/` 目录在 v0.6.4 下无需迁移即可正常使用。
|
|
454
|
+
对 `pmem_integration_version` 字段的引入采用**前向兼容**策略:
|
|
455
|
+
- 旧项目无此字段 → `verify` 输出 "version unknown" 提示,不报错
|
|
456
|
+
- 新安装的 integration 写入此字段
|
|
457
|
+
|
|
458
|
+
---
|
|
459
|
+
|
|
460
|
+
## 九、与 v0.7.0 的关系
|
|
461
|
+
|
|
462
|
+
v0.6.4 与 v0.7.0 的边界:
|
|
463
|
+
|
|
464
|
+
| 维度 | v0.6.4 | v0.7.0 |
|
|
465
|
+
|------|--------|--------|
|
|
466
|
+
| 主题 | Polish & Wrap v0.6 | Universal Agent Memory |
|
|
467
|
+
| 改动范围 | rename / integration / init --guided / session / doctor | 类型系统 / status / recall / manifest 通用化 |
|
|
468
|
+
| schema 变更 | 无 | 可能(card_types / type_dirs / foundational_types 新字段) |
|
|
469
|
+
| 风险面 | 低(局部 polish) | 中(manifest schema 变化) |
|
|
470
|
+
| 主线 | 收尾 v0.6 track | 启动 v0.7 track |
|
|
471
|
+
|
|
472
|
+
**v0.6.4 完成后开 v0.7.0 分支**:v0.6.4 不并发 v0.7.0 准备工作。
|
|
473
|
+
v0.7.0 详细设计另写 `docs/v0.7.0 pre-design.md`,
|
|
474
|
+
不放在本文档中(保持每个 pre-design 文档的 scope 单一)。
|
|
475
|
+
|
|
476
|
+
---
|
|
477
|
+
|
|
478
|
+
## 十、DoD
|
|
479
|
+
|
|
480
|
+
### 通用
|
|
481
|
+
|
|
482
|
+
- [ ] `npm test` 通过
|
|
483
|
+
- [ ] 旧 E2E 套件不退步
|
|
484
|
+
- [ ] CI 通过(Node 18/20/22)
|
|
485
|
+
- [ ] `CHANGELOG.md` 追加 v0.6.4 条目
|
|
486
|
+
- [ ] `docs/project-roadmap.md` 补 v0.6.2 / v0.6.3 / v0.6.4 三条
|
|
487
|
+
|
|
488
|
+
### P0
|
|
489
|
+
|
|
490
|
+
- [ ] session 状态丢失根因报告 + 复现脚本
|
|
491
|
+
- [ ] 若有修复,附 E2E 验证
|
|
492
|
+
|
|
493
|
+
### P1
|
|
494
|
+
|
|
495
|
+
- [ ] rename body 原始空白保留
|
|
496
|
+
- [ ] integration template_version 字段写入 + verify 比较
|
|
497
|
+
- [ ] Codex / Cursor 深度入口(4 个 command 文件 / 框架)
|
|
498
|
+
|
|
499
|
+
### P2
|
|
500
|
+
|
|
501
|
+
- [ ] doctor lock 可读性 polish
|
|
502
|
+
- [ ] init --guided 缺字段提示
|
|
503
|
+
- [ ] rename --dry-run frontmatter diff
|
|
504
|
+
- [ ] session start --create-if-missing design 评估
|
|
505
|
+
|
|
506
|
+
---
|
|
507
|
+
|
|
508
|
+
## 十一、审批记录
|
|
509
|
+
|
|
510
|
+
| 角色 | 决定 | 日期 |
|
|
511
|
+
|------|------|------|
|
|
512
|
+
| 提交人 | Claude Opus 4.6 | 2026-06-02 |
|
|
513
|
+
| CTO | 待审批 | 2026-06-02 |
|
|
514
|
+
|
|
515
|
+
### 调研来源
|
|
516
|
+
|
|
517
|
+
本 pre-design 的 8 项 polish 任务来源:
|
|
518
|
+
|
|
519
|
+
1. `docs/v0.6.2 pre-design.md` §三 末尾("已知非阻塞 P2")—— 任务 1
|
|
520
|
+
2. `docs/v0.6.2 pre-design.md` §4.1d + §11 末尾 —— 任务 5、6
|
|
521
|
+
3. `docs/v0.6.2 pre-design.md` §4.3 —— 任务 8
|
|
522
|
+
4. `docs/v0.6 pre-design.md` §九 P1#4 —— 任务 2
|
|
523
|
+
5. `docs/v0.6 pre-design.md` §九 P2 —— 任务 3、7
|
|
524
|
+
6. `docs/handover-v0.6.md` §九 —— 任务 3、4
|
|
525
|
+
|
|
526
|
+
并发限制:v0.6.4 完成后才开 v0.7.0 分支(按 CTO 2026-06-02 决策)。
|