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,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 前置设计决策
|