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.
- package/CHANGELOG.md +57 -0
- package/LICENSE +21 -0
- package/README.md +349 -0
- package/dist/commands/ask.d.ts +3 -0
- package/dist/commands/ask.d.ts.map +1 -0
- package/dist/commands/ask.js +303 -0
- package/dist/commands/ask.js.map +1 -0
- package/dist/commands/distill.d.ts +6 -0
- package/dist/commands/distill.d.ts.map +1 -0
- package/dist/commands/distill.js +425 -0
- package/dist/commands/distill.js.map +1 -0
- package/dist/commands/graph.d.ts +6 -0
- package/dist/commands/graph.d.ts.map +1 -0
- package/dist/commands/graph.js +216 -0
- package/dist/commands/graph.js.map +1 -0
- package/dist/commands/init.d.ts +5 -0
- package/dist/commands/init.d.ts.map +1 -0
- package/dist/commands/init.js +566 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/integration.d.ts +2 -0
- package/dist/commands/integration.d.ts.map +1 -0
- package/dist/commands/integration.js +216 -0
- package/dist/commands/integration.js.map +1 -0
- package/dist/commands/migrate.d.ts +6 -0
- package/dist/commands/migrate.d.ts.map +1 -0
- package/dist/commands/migrate.js +379 -0
- package/dist/commands/migrate.js.map +1 -0
- package/dist/commands/rebuild.d.ts +8 -0
- package/dist/commands/rebuild.d.ts.map +1 -0
- package/dist/commands/rebuild.js +299 -0
- package/dist/commands/rebuild.js.map +1 -0
- package/dist/commands/recall.d.ts +3 -0
- package/dist/commands/recall.d.ts.map +1 -0
- package/dist/commands/recall.js +140 -0
- package/dist/commands/recall.js.map +1 -0
- package/dist/commands/session.d.ts +3 -0
- package/dist/commands/session.d.ts.map +1 -0
- package/dist/commands/session.js +147 -0
- package/dist/commands/session.js.map +1 -0
- package/dist/commands/status.d.ts +5 -0
- package/dist/commands/status.d.ts.map +1 -0
- package/dist/commands/status.js +275 -0
- package/dist/commands/status.js.map +1 -0
- package/dist/commands/update.d.ts +14 -0
- package/dist/commands/update.d.ts.map +1 -0
- package/dist/commands/update.js +536 -0
- package/dist/commands/update.js.map +1 -0
- package/dist/commands/verify.d.ts +4 -0
- package/dist/commands/verify.d.ts.map +1 -0
- package/dist/commands/verify.js +296 -0
- package/dist/commands/verify.js.map +1 -0
- package/dist/core/db.d.ts +47 -0
- package/dist/core/db.d.ts.map +1 -0
- package/dist/core/db.js +326 -0
- package/dist/core/db.js.map +1 -0
- package/dist/core/format.d.ts +3 -0
- package/dist/core/format.d.ts.map +1 -0
- package/dist/core/format.js +221 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/fs.d.ts +16 -0
- package/dist/core/fs.d.ts.map +1 -0
- package/dist/core/fs.js +175 -0
- package/dist/core/fs.js.map +1 -0
- package/dist/core/git.d.ts +6 -0
- package/dist/core/git.d.ts.map +1 -0
- package/dist/core/git.js +20 -0
- package/dist/core/git.js.map +1 -0
- package/dist/core/hash.d.ts +10 -0
- package/dist/core/hash.d.ts.map +1 -0
- package/dist/core/hash.js +25 -0
- package/dist/core/hash.js.map +1 -0
- package/dist/core/manifest.d.ts +6 -0
- package/dist/core/manifest.d.ts.map +1 -0
- package/dist/core/manifest.js +207 -0
- package/dist/core/manifest.js.map +1 -0
- package/dist/core/yaml.d.ts +11 -0
- package/dist/core/yaml.d.ts.map +1 -0
- package/dist/core/yaml.js +94 -0
- package/dist/core/yaml.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +167 -0
- package/dist/index.js.map +1 -0
- package/dist/types.d.ts +351 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +4 -0
- package/dist/types.js.map +1 -0
- package/docs/Voorlopige projekidee.md +695 -0
- package/docs/handover-v0.3.md +355 -0
- package/docs/handover-v0.4.md +367 -0
- package/docs/prd.md +318 -0
- package/docs/project-roadmap.md +279 -0
- package/docs/release-checklist-v0.5.md +109 -0
- package/docs/v0.2 pre-design.md +182 -0
- package/docs/v0.2 pre-roadmap.md +270 -0
- package/docs/v0.3 pre-design.md +686 -0
- package/docs/v0.4 pre-design.md +417 -0
- package/docs/v0.5 pre-design.md +481 -0
- package/package.json +67 -0
|
@@ -0,0 +1,279 @@
|
|
|
1
|
+
# pmem Project Roadmap
|
|
2
|
+
|
|
3
|
+
## 产品定位
|
|
4
|
+
|
|
5
|
+
> **面向 AI Agent 的图结构项目记忆运行时。**
|
|
6
|
+
>
|
|
7
|
+
> 一个 CLI 工具 + 文件协议 + 图索引系统,让任意 AI coding agent 以极少 token 恢复项目上下文、查找相关记忆、溯源决策依据、规划下一步、回写记忆。
|
|
8
|
+
|
|
9
|
+
简称:`pmem`(Project Memory for Agents)
|
|
10
|
+
CLI:`pmem`
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## 各版本主题
|
|
15
|
+
|
|
16
|
+
| 版本 | 主题 | 一句话 |
|
|
17
|
+
|------|------|--------|
|
|
18
|
+
| v0.1 | 能用 | 10 个命令跑通核心闭环(init → recall → ask → update → verify) |
|
|
19
|
+
| v0.2 | 文件模式可信 | 防损坏——冷启动不空、并发不丢、卡片不乱、版本可迁 |
|
|
20
|
+
| v0.3 | SQLite 运行时 | 强一致——查询/索引/状态迁入 SQLite,Markdown 仍为主数据 |
|
|
21
|
+
| v0.4 | Agent 集成 & 自动化 | 多框架适配、session 追踪、distill 工作流优化 |
|
|
22
|
+
| v0.5 | 可上线 Beta | 安装体验、文档、稳定 CLI、SQLite 默认开启、demo 项目 |
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## v0.1 — 能用 ✅ 已完成
|
|
27
|
+
|
|
28
|
+
**目标:** 跑通核心闭环,证明"文件模式 + 图索引 + CLI"可行。
|
|
29
|
+
|
|
30
|
+
**已实现:**
|
|
31
|
+
|
|
32
|
+
| 命令 | 功能 |
|
|
33
|
+
|------|------|
|
|
34
|
+
| `pmem init` | 生成 .pmem/ 骨架 + manifest.yml + AGENTS.md |
|
|
35
|
+
| `pmem rebuild` | .md frontmatter → indexes/graph.json |
|
|
36
|
+
| `pmem recall --budget N` | 三层 token 预算输出 |
|
|
37
|
+
| `pmem ask <query>` | 精确匹配 → 图邻居 → BM25 兜底 |
|
|
38
|
+
| `pmem related <id>` | 图邻居查询 |
|
|
39
|
+
| `pmem trace <id>` | 溯源 + 卡片内容 |
|
|
40
|
+
| `pmem verify --fix` | index 一致性检查 |
|
|
41
|
+
| `pmem update` | 四级更新(mark-dirty / auto / confirm / force) |
|
|
42
|
+
| `pmem mark-dirty` | 脏状态标记 |
|
|
43
|
+
| `pmem integration` | list / install / verify |
|
|
44
|
+
|
|
45
|
+
**技术栈:** TypeScript + Commander + 文件系统 + frontmatter + JSON graph
|
|
46
|
+
|
|
47
|
+
**已知限制:**
|
|
48
|
+
- 无并发保护
|
|
49
|
+
- init 只生成空骨架
|
|
50
|
+
- 无卡片粒度约束
|
|
51
|
+
- 无版本迁移能力
|
|
52
|
+
- YAML 解析器为最小实现
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## v0.2 — 文件模式可信(防损坏)
|
|
57
|
+
|
|
58
|
+
**主题:** 让 pmem 在纯文件模式下变得**可初始化、可维护、可迁移**,为 v0.3 SQLite 做铺垫。
|
|
59
|
+
|
|
60
|
+
**不做:** 复杂乐观锁、hash-based merge、card_hashes.json、锁队列。这些留给 v0.3 SQLite。
|
|
61
|
+
|
|
62
|
+
### P0 — 必须完成
|
|
63
|
+
|
|
64
|
+
| 功能 | 说明 |
|
|
65
|
+
|------|------|
|
|
66
|
+
| `pmem init --guided` | 交互式冷启动,问 3 个必填(项目描述、阶段、下一步) |
|
|
67
|
+
| `pmem init` 增强 | 保守扫描 → `candidates/` → 标记 `memory_incomplete` |
|
|
68
|
+
| `pmem migrate --dry-run` | 预览迁移变更 |
|
|
69
|
+
| `pmem migrate --to 0.2` | 执行迁移(带自动备份到 `backups/`) |
|
|
70
|
+
| `pmem rebuild` 增强 | 支持 v0.2 manifest 新字段 |
|
|
71
|
+
| `pmem verify` 增强 | 检查 schema_version、card_policy 违规 |
|
|
72
|
+
| `pmem mark-dirty` 增强 | 更新 `memory_status.dirty` |
|
|
73
|
+
| atomic write | 所有写入:.tmp → fsync → rename |
|
|
74
|
+
| 简单 file lock | `.pmem/.lock`,超时 3s,默认 abort |
|
|
75
|
+
| manifest schema_version | `pmem.schema_version: "0.2"`,每张卡片也带 |
|
|
76
|
+
|
|
77
|
+
### P1 — 强烈建议
|
|
78
|
+
|
|
79
|
+
| 功能 | 说明 |
|
|
80
|
+
|------|------|
|
|
81
|
+
| `pmem distill` 初版 | trace → card 蒸馏建议(需确认,不自动写) |
|
|
82
|
+
| `pmem distill --suggest-splits` | 建议拆分过大卡片 |
|
|
83
|
+
| card_policy 校验 | ID 命名规范 + 大小阈值 + verify 警告 |
|
|
84
|
+
| memory_status | `completeness` 和 `initialized_mode` 追踪 |
|
|
85
|
+
| integration 模板更新 | Claude Code / Cursor / Codex 适配 |
|
|
86
|
+
|
|
87
|
+
### P2 — 可延后到 v0.3
|
|
88
|
+
|
|
89
|
+
| 功能 | 说明 |
|
|
90
|
+
|------|------|
|
|
91
|
+
| 完整乐观锁 / card_hashes.json | 由 SQLite transaction 替代 |
|
|
92
|
+
| `update --merge` | section-level merge |
|
|
93
|
+
| `pmem init --from <file>` | 声明式初始化 |
|
|
94
|
+
| graph 分片存储 | JSON → 多文件索引 |
|
|
95
|
+
| `pmem split --interactive` | 交互式拆分卡片 |
|
|
96
|
+
|
|
97
|
+
### v0.2 并发策略
|
|
98
|
+
|
|
99
|
+
```yml
|
|
100
|
+
concurrency:
|
|
101
|
+
mode: file-basic
|
|
102
|
+
atomic_write: true
|
|
103
|
+
lock:
|
|
104
|
+
enabled: true
|
|
105
|
+
path: ".pmem/.lock"
|
|
106
|
+
timeout: "3s"
|
|
107
|
+
stale_after: "60s"
|
|
108
|
+
on_timeout: "abort"
|
|
109
|
+
optimistic_lock:
|
|
110
|
+
enabled: false
|
|
111
|
+
note: "Deferred to SQLite runtime in v0.3"
|
|
112
|
+
```
|
|
113
|
+
|
|
114
|
+
v0.2 并发目标:**文件不写坏、索引可重建、冲突时 abort 不覆盖。**
|
|
115
|
+
|
|
116
|
+
### v0.2 新增目录
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
.pmem/
|
|
120
|
+
+ candidates/ # 冷启动扫描候选项
|
|
121
|
+
+ risks/ # 风险卡片
|
|
122
|
+
+ backups/ # 迁移前自动备份
|
|
123
|
+
+ migrations/ # 项目自定义迁移(预留)
|
|
124
|
+
+ indexes/card_hashes.json # P2(留给 v0.3)
|
|
125
|
+
+ skills/distill.md # 蒸馏操作手册
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
---
|
|
129
|
+
|
|
130
|
+
## v0.3 — SQLite 运行时(强一致)
|
|
131
|
+
|
|
132
|
+
**主题:** 将查询、索引、状态管理迁入 SQLite。Markdown cards 继续作为 canonical 主数据。
|
|
133
|
+
|
|
134
|
+
### 核心切换
|
|
135
|
+
|
|
136
|
+
```
|
|
137
|
+
v0.2: 文件系统 → JSON indexes → CLI 查询
|
|
138
|
+
v0.3: 文件系统 → SQLite indexes → SQL 查询 → CLI
|
|
139
|
+
↑
|
|
140
|
+
Markdown cards 仍是主数据
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### SQLite 存储内容
|
|
144
|
+
|
|
145
|
+
```txt
|
|
146
|
+
.pmem/pmem.db:
|
|
147
|
+
cards # 卡片元数据(id, type, title, status, file_path, hash)
|
|
148
|
+
edges # 图边
|
|
149
|
+
aliases # 别名索引
|
|
150
|
+
tags # 标签索引
|
|
151
|
+
tasks # 任务状态
|
|
152
|
+
traces # trace 元数据
|
|
153
|
+
sessions # agent session 记录
|
|
154
|
+
dirty_flags # 脏状态
|
|
155
|
+
update_log # 更新日志
|
|
156
|
+
migrations_log # 迁移历史
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### v0.3 关键能力
|
|
160
|
+
|
|
161
|
+
| 功能 | 说明 |
|
|
162
|
+
|------|------|
|
|
163
|
+
| SQLite-backed recall | 替代 JSON 遍历 |
|
|
164
|
+
| SQLite-backed ask | JOIN 查询替代内存匹配 |
|
|
165
|
+
| SQLite-backed related | 图邻居 SQL 查询 |
|
|
166
|
+
| transaction-based update | 原子写入卡片 + 索引 |
|
|
167
|
+
| 乐观锁 | 在 SQLite 层实现 version check |
|
|
168
|
+
| incremental rebuild | 只重建变更部分 |
|
|
169
|
+
| card_hashes.json → db | 完整并发语义 |
|
|
170
|
+
| `pmem serve` | HTTP API / MCP Server 原型 |
|
|
171
|
+
|
|
172
|
+
### v0.3 不做的
|
|
173
|
+
|
|
174
|
+
- 不把 Markdown 全文存入数据库(保持 Git 友好)
|
|
175
|
+
- 不做 AI embedding / semantic search
|
|
176
|
+
- 不做自动 memory quality scoring
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## v0.4 — Agent 集成 & 自动化
|
|
181
|
+
|
|
182
|
+
**主题:** 让不同 Agent 框架真正能稳定接入 pmem,自动化记忆维护流程。
|
|
183
|
+
|
|
184
|
+
| 功能 | 说明 |
|
|
185
|
+
|------|------|
|
|
186
|
+
| Claude Code hooks | PostToolUse / Stop hooks 模板 |
|
|
187
|
+
| Cursor rules | `.cursor/rules/pmem.mdc` 完整版 |
|
|
188
|
+
| Codex / OpenClaw | AGENTS.md / skill 模板 |
|
|
189
|
+
| `pmem update --auto --mode=suggest` | 智能检测 → 生成更新建议 |
|
|
190
|
+
| session tracking | 记录 Agent 会话起止、操作摘要 |
|
|
191
|
+
| distill 工作流优化 | 定期自动建议蒸馏 |
|
|
192
|
+
| stale memory detection | 基于 `source_files` 变更的过时检测 |
|
|
193
|
+
| integration verify 增强 | 检查各框架 hooks 是否正确安装 |
|
|
194
|
+
|
|
195
|
+
---
|
|
196
|
+
|
|
197
|
+
## v0.5 — 可上线 Beta
|
|
198
|
+
|
|
199
|
+
**主题:** 面向真实用户(开发者 + AI Agent)稳定可用。
|
|
200
|
+
|
|
201
|
+
| 功能 | 说明 |
|
|
202
|
+
|------|------|
|
|
203
|
+
| CLI 安装体验 | `npm install -g pmem` 一键安装 |
|
|
204
|
+
| `pmem init --guided` 完整体验 | 引导式初始化 → 首个 project 跑通 |
|
|
205
|
+
| SQLite 默认开启 | v0.5 起新项目默认 SQLite |
|
|
206
|
+
| 文件模式兼容 | 已有 v0.1/v0.2 项目仍可用文件模式 |
|
|
207
|
+
| 完整文档 | 使用指南、CLI 参考、集成教程 |
|
|
208
|
+
| demo 项目 | 开箱即用的示例项目 |
|
|
209
|
+
| 回滚 / 备份 | `pmem backup` / `pmem restore` |
|
|
210
|
+
| 基础遥测(可选) | `pmem telemetry` opt-in |
|
|
211
|
+
| 记忆健康仪表板 | `pmem verify --report` |
|
|
212
|
+
|
|
213
|
+
---
|
|
214
|
+
|
|
215
|
+
## 版本间迁移路径
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
v0.1 → v0.2:
|
|
219
|
+
pmem migrate --to 0.2
|
|
220
|
+
变更:manifest 加 schema_version + memory_status + card_policy
|
|
221
|
+
卡片 frontmatter 加 schema_version
|
|
222
|
+
|
|
223
|
+
v0.2 → v0.3:
|
|
224
|
+
pmem migrate --to 0.3
|
|
225
|
+
变更:JSON indexes → SQLite db
|
|
226
|
+
manifest indexes.mode: sqlite
|
|
227
|
+
保留 .md 卡片不变
|
|
228
|
+
|
|
229
|
+
v0.3 → v0.4:
|
|
230
|
+
pmem migrate --to 0.4
|
|
231
|
+
变更:新增 sessions table
|
|
232
|
+
新增 update_log table
|
|
233
|
+
manifest integrations 扩展
|
|
234
|
+
|
|
235
|
+
v0.4 → v0.5:
|
|
236
|
+
pmem migrate --to 0.5
|
|
237
|
+
变更:SQLite 成为默认
|
|
238
|
+
文件模式标记为 legacy
|
|
239
|
+
遥测配置项
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
每次迁移自动备份到 `.pmem/backups/YYYY-MM-DD-before-vX.Y/`。
|
|
243
|
+
|
|
244
|
+
---
|
|
245
|
+
|
|
246
|
+
## 总览
|
|
247
|
+
|
|
248
|
+
```
|
|
249
|
+
v0.1 ───→ v0.2 ───→ v0.3 ───→ v0.4 ───→ v0.5
|
|
250
|
+
能用 防损坏 强一致 自动化 可上线
|
|
251
|
+
10 cmd 14 cmd 16 cmd 18 cmd 20+ cmd
|
|
252
|
+
文件模式 文件模式 +SQLite +集成 +体验
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
---
|
|
256
|
+
|
|
257
|
+
## 当前状态
|
|
258
|
+
|
|
259
|
+
- **v0.1:** ✅ 完成(10 个命令实现并测试)
|
|
260
|
+
- **v0.2:** 🔜 设计完成,待开工
|
|
261
|
+
- 设计决策:`docs/v0.2 pre-design.md`
|
|
262
|
+
- 架构规划:`docs/v0.2 pre-roadmap.md`
|
|
263
|
+
- **v0.3–v0.5:** 📋 方向确定,详细设计待 v0.2 完成后细化
|
|
264
|
+
|
|
265
|
+
---
|
|
266
|
+
|
|
267
|
+
## 未决事项
|
|
268
|
+
|
|
269
|
+
以下问题留待后续版本讨论:
|
|
270
|
+
|
|
271
|
+
- v0.3 SQLite schema 详细设计
|
|
272
|
+
- MCP Server vs HTTP API 的选择
|
|
273
|
+
- 多项目 / workspace 支持
|
|
274
|
+
- 记忆共享与协作机制
|
|
275
|
+
- 记忆权限模型
|
|
276
|
+
- 多语言 CLI 支持
|
|
277
|
+
- telemetry 的范围和隐私策略
|
|
278
|
+
- npm 包发布与版本策略
|
|
279
|
+
- 是否支持嵌入到 VS Code / JetBrains 插件
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# pmem v0.5 Release Checklist
|
|
2
|
+
|
|
3
|
+
Use this checklist before tagging or publishing v0.5.0.
|
|
4
|
+
|
|
5
|
+
## Scope Check
|
|
6
|
+
|
|
7
|
+
- [ ] v0.5 remains Productization Beta only.
|
|
8
|
+
- [ ] No embedding implementation was added.
|
|
9
|
+
- [ ] No `pmem serve`, MCP, REST, Graph UI, telemetry, or remote service work was added.
|
|
10
|
+
- [ ] README, package readiness, E2E, agent docs, and release artifacts are complete.
|
|
11
|
+
|
|
12
|
+
## Version Check
|
|
13
|
+
|
|
14
|
+
- [ ] `package.json` version is `0.5.0`.
|
|
15
|
+
- [ ] `package-lock.json` root version is `0.5.0`.
|
|
16
|
+
- [ ] `src/index.ts` Commander version is `0.5.0`.
|
|
17
|
+
- [ ] `CHANGELOG.md` has a `0.5.0` section.
|
|
18
|
+
|
|
19
|
+
## Documentation Check
|
|
20
|
+
|
|
21
|
+
- [ ] `README.md` explains why pmem exists.
|
|
22
|
+
- [ ] `README.md` has install instructions.
|
|
23
|
+
- [ ] `README.md` has a 5-minute quick start.
|
|
24
|
+
- [ ] `README.md` documents exit code semantics.
|
|
25
|
+
- [ ] `README.md` documents troubleshooting for missing `.pmem`, missing DB, no ask matches, non-git projects, FTS5 fallback, and dirty flags.
|
|
26
|
+
- [ ] `AGENTS.md` and `CLAUDE.md` match v0.5 scope.
|
|
27
|
+
- [ ] `pmem init` generated integration templates match v0.5 workflow.
|
|
28
|
+
|
|
29
|
+
## Test Check
|
|
30
|
+
|
|
31
|
+
Run:
|
|
32
|
+
|
|
33
|
+
```bash
|
|
34
|
+
npm test
|
|
35
|
+
npm run build
|
|
36
|
+
npm run test:e2e:install
|
|
37
|
+
npm run test:e2e:workflow
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Expected:
|
|
41
|
+
|
|
42
|
+
- [ ] Unit tests pass.
|
|
43
|
+
- [ ] TypeScript build passes.
|
|
44
|
+
- [ ] Install smoke E2E passes.
|
|
45
|
+
- [ ] Real workflow E2E passes.
|
|
46
|
+
|
|
47
|
+
## Package Check
|
|
48
|
+
|
|
49
|
+
Run:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
npm pack --dry-run
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Expected:
|
|
56
|
+
|
|
57
|
+
- [ ] Package name is `pmem`.
|
|
58
|
+
- [ ] Package version is `0.5.0`.
|
|
59
|
+
- [ ] Tarball includes `dist/`.
|
|
60
|
+
- [ ] Tarball includes `README.md`.
|
|
61
|
+
- [ ] Tarball includes `LICENSE`.
|
|
62
|
+
- [ ] Tarball includes top-level `docs/*.md`.
|
|
63
|
+
- [ ] Tarball excludes `src/`.
|
|
64
|
+
- [ ] Tarball excludes `temp/`.
|
|
65
|
+
- [ ] Tarball excludes `.pmem/`.
|
|
66
|
+
- [ ] Tarball excludes `node_modules/`.
|
|
67
|
+
- [ ] Tarball excludes compiled test files.
|
|
68
|
+
|
|
69
|
+
## Install Smoke
|
|
70
|
+
|
|
71
|
+
Run:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
npm run build
|
|
75
|
+
TARBALL="$(npm pack --silent)"
|
|
76
|
+
TMP_PREFIX="$(mktemp -d)"
|
|
77
|
+
npm install -g --prefix "$TMP_PREFIX" "./$TARBALL"
|
|
78
|
+
"$TMP_PREFIX/bin/pmem" --version
|
|
79
|
+
"$TMP_PREFIX/bin/pmem" --help
|
|
80
|
+
rm -f "$TARBALL"
|
|
81
|
+
rm -rf "$TMP_PREFIX"
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
Expected:
|
|
85
|
+
|
|
86
|
+
- [ ] `pmem --version` prints `0.5.0`.
|
|
87
|
+
- [ ] `pmem --help` lists the v0.5 public commands.
|
|
88
|
+
|
|
89
|
+
## Publish Decision
|
|
90
|
+
|
|
91
|
+
- [ ] Confirm whether v0.5.0 is Internal Beta only or Public Beta.
|
|
92
|
+
- [ ] Confirm npm account and publish permission.
|
|
93
|
+
- [ ] Confirm the `pmem` package name is available or accessible.
|
|
94
|
+
- [ ] Confirm repository visibility and issue tracker policy.
|
|
95
|
+
|
|
96
|
+
## Final Commands
|
|
97
|
+
|
|
98
|
+
Only if publishing:
|
|
99
|
+
|
|
100
|
+
```bash
|
|
101
|
+
npm publish --dry-run
|
|
102
|
+
npm publish
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
After publishing:
|
|
106
|
+
|
|
107
|
+
- [ ] Create git tag `v0.5.0`.
|
|
108
|
+
- [ ] Push branch and tag.
|
|
109
|
+
- [ ] Create GitHub release notes from `CHANGELOG.md`.
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
# v0.2 前置设计决策
|
|
2
|
+
|
|
3
|
+
本文档记录 v0.2 开工前必须解决的 4 个设计问题及其最终决策。v0.2 的总原则:
|
|
4
|
+
|
|
5
|
+
> **v0.2 不追求"更智能",而是补齐"可冷启动、可并发、可治理、可迁移"的工程底座。**
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 1. 冷启动:`pmem init` 在已有项目上应该做什么?
|
|
10
|
+
|
|
11
|
+
### 决策
|
|
12
|
+
|
|
13
|
+
`pmem init` 不允许纯空初始化。提供三种模式:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
pmem init # 最小可用初始化,生成低置信度记忆,标记 memory_incomplete
|
|
17
|
+
pmem init --guided # 推荐模式,交互式引导(问 3 个必填字段)
|
|
18
|
+
pmem init --from <file> # 声明式,适合团队/模板/自动化
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
### 核心规则
|
|
22
|
+
|
|
23
|
+
- **默认 init**:扫描项目 → 生成候选(`candidates/`,非稳定卡)→ 标记 `memory_incomplete` → Agent 看到后知道不要假装理解项目
|
|
24
|
+
- **guided init**:问 3 个必填(项目描述、当前阶段、下一步),可选再问 2 个(关键模块、已确定决策)
|
|
25
|
+
- **扫描算法**:保守扫描(package.json、目录结构),不激进、不自动确认为稳定记忆
|
|
26
|
+
- **降级策略**:用户跳过引导时,`pmem recall` 明确提示 `memory incomplete`,不建议自动深扫描代码
|
|
27
|
+
|
|
28
|
+
### 路径选择
|
|
29
|
+
|
|
30
|
+
- 普通用户 → `pmem init --guided`(交互式,门槛低)
|
|
31
|
+
- 高级用户/团队 → `pmem init --from pmem.init.yml`(声明式,可版本化)
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
|
|
35
|
+
## 2. 多 Agent / 多会话并发写入
|
|
36
|
+
|
|
37
|
+
### 决策
|
|
38
|
+
|
|
39
|
+
v0.2 必须引入五层并发保护。SQLite 留到 v0.3。
|
|
40
|
+
|
|
41
|
+
### 必须实现(P0)
|
|
42
|
+
|
|
43
|
+
| 机制 | 说明 |
|
|
44
|
+
|------|------|
|
|
45
|
+
| file lock | `.pmem/.lock`,超时 5s,默认 abort |
|
|
46
|
+
| optimistic lock | 每张卡片 `version` + `content_hash`,写入时对比 |
|
|
47
|
+
| atomic write | 写 `.tmp` → fsync → rename,防止半写损坏 |
|
|
48
|
+
| conflict detection | `card_hashes.json` 记录写入前快照,检测读后写冲突 |
|
|
49
|
+
| abort by default | 冲突时不自动 merge,生成冲突报告 |
|
|
50
|
+
|
|
51
|
+
### 冲突行为
|
|
52
|
+
|
|
53
|
+
- 锁超时 → abort(不排队,旧上下文延迟写入更危险)
|
|
54
|
+
- 乐观锁冲突 → abort + 报告("Card changed since session started")
|
|
55
|
+
- section-level merge → v0.2 可选,只对安全场景(不同 section 无冲突时)
|
|
56
|
+
|
|
57
|
+
### 配置
|
|
58
|
+
|
|
59
|
+
```yml
|
|
60
|
+
concurrency:
|
|
61
|
+
lock: file
|
|
62
|
+
lock_path: ".pmem/.lock"
|
|
63
|
+
timeout: "5s"
|
|
64
|
+
stale_after: "60s"
|
|
65
|
+
on_timeout: "abort"
|
|
66
|
+
optimistic_lock: true
|
|
67
|
+
atomic_write: true
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## 3. 卡片粒度的判断标准
|
|
73
|
+
|
|
74
|
+
### 决策
|
|
75
|
+
|
|
76
|
+
v0.2 必须定义 `card_policy`,建立三套标准:类型标准、粒度标准、命名标准。
|
|
77
|
+
|
|
78
|
+
### 类型判断树
|
|
79
|
+
|
|
80
|
+
```txt
|
|
81
|
+
变化改变了"为什么做" → decision card
|
|
82
|
+
变化描述稳定组成部分 → module card
|
|
83
|
+
变化描述用户可见能力 → feature card
|
|
84
|
+
变化是待办/进行/完成 → task card
|
|
85
|
+
变化只是一次工作过程 → trace card
|
|
86
|
+
变化是长期风险 → risk card
|
|
87
|
+
同模块状态推进 → 更新已有 module card
|
|
88
|
+
同任务进度推进 → 更新已有 task card
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### 大小阈值
|
|
92
|
+
|
|
93
|
+
| 卡片类型 | max_tokens | max_sections |
|
|
94
|
+
|----------|-----------|-------------|
|
|
95
|
+
| module | 1200 | 8 |
|
|
96
|
+
| feature | 1000 | 8 |
|
|
97
|
+
| decision | 800 | 6 |
|
|
98
|
+
| task | 600 | 6 |
|
|
99
|
+
| trace | 1000 | - |
|
|
100
|
+
|
|
101
|
+
`warn_when_related_count_gt: 12`,超过时 `pmem verify` 警告。
|
|
102
|
+
|
|
103
|
+
### module 粒度原则
|
|
104
|
+
|
|
105
|
+
> **以概念/责任边界为主,代码路径为辅。** 不等于代码目录一一对应。
|
|
106
|
+
|
|
107
|
+
冷启动扫描生成的候选用 `status: candidate`,需用户确认后才成为稳定卡。
|
|
108
|
+
|
|
109
|
+
### ID 命名强制规范
|
|
110
|
+
|
|
111
|
+
```txt
|
|
112
|
+
project.<name>
|
|
113
|
+
module.<name>
|
|
114
|
+
feature.<name>
|
|
115
|
+
task.<name>
|
|
116
|
+
decision.<yyyy-mm-dd>.<slug>
|
|
117
|
+
trace.<yyyy-mm-dd>.<slug>
|
|
118
|
+
risk.<name>
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
规则:小写、英文 slug、点号分层、中文放 `title` / `aliases`。
|
|
122
|
+
|
|
123
|
+
### distill 与拆分
|
|
124
|
+
|
|
125
|
+
- `pmem distill` 建议目标 card("这条 trace 应蒸馏到 module.X")
|
|
126
|
+
- `pmem distill --suggest-splits` 建议拆分过大卡片
|
|
127
|
+
- v0.2 只建议,不自动拆分
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## 4. 记忆格式自身的版本迁移
|
|
132
|
+
|
|
133
|
+
### 决策
|
|
134
|
+
|
|
135
|
+
v0.2 必须引入三层版本标识和 migrate 机制。
|
|
136
|
+
|
|
137
|
+
### 版本字段设计
|
|
138
|
+
|
|
139
|
+
区分三个概念:
|
|
140
|
+
|
|
141
|
+
```yml
|
|
142
|
+
pmem:
|
|
143
|
+
cli_version_created: "0.1.0" # 工具版本
|
|
144
|
+
cli_version_last_used: "0.2.0"
|
|
145
|
+
schema_version: "0.2" # frontmatter/manifest/index 格式版本
|
|
146
|
+
protocol_version: "0.2" # 语义协议版本
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
每张卡片也带 `schema_version: "0.2"`。
|
|
150
|
+
|
|
151
|
+
### 迁移命令
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
pmem migrate --to 0.2 --dry-run # 预览变更,不改任何文件
|
|
155
|
+
pmem migrate --to 0.2 # 执行迁移
|
|
156
|
+
pmem migrate --backup # 迁移前自动备份
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### 迁移规则
|
|
160
|
+
|
|
161
|
+
- 官方迁移规则内置于 CLI(0.1→0.2、0.2→0.3 等)
|
|
162
|
+
- 项目自定义迁移可放 `.pmem/migrations/`(v0.2 先不做)
|
|
163
|
+
- manifest 记录 `migrations.applied` 历史
|
|
164
|
+
- 不支持降级迁移(语义不可逆),改用自动备份回退
|
|
165
|
+
|
|
166
|
+
### verify 中的版本检查
|
|
167
|
+
|
|
168
|
+
- 项目 schema ≤ CLI 支持 → OK 或建议升级
|
|
169
|
+
- 项目 schema > CLI 支持 → 报错,要求升级 CLI
|
|
170
|
+
- init 时必须写入 `schema_version`
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## v0.2 设计的核心主题
|
|
175
|
+
|
|
176
|
+
v0.1 是"能用"。v0.2 是"可信地长期使用":
|
|
177
|
+
|
|
178
|
+
- 冷启动不空
|
|
179
|
+
- 并发不丢
|
|
180
|
+
- 卡片不乱
|
|
181
|
+
- 版本可迁
|
|
182
|
+
- 记忆可持续
|