执行方式:inline(M1-M6 先例),三期每期一 commit,期末验证绿才进下期。上下文顺序:prd → design → research/v6-data-inventory.md → 本清单;Phase 2 起步走 trellis-before-dev。
v7/src/export/index.js:exportChapters(ctx, {mode, chapterNum?, range?}) 纯函数层(design §2:单章无标题行、合并文件「第N章 标题」分隔、边界人话报错)v7/src/commands/export.js 薄壳(scope: book)+ bin --help 补行v7/test/export/index.test.js + v7/test/commands/export.test.js:
第NNNN章-标题.txt、正文体无标题行工作区/导出/(gitignore 生效 = git status 干净断言)验证:node --test v7/test/export/ v7/test/commands/export.test.js(列文件跑)
提交:feat(v7): M7 P1——干净导出(单章/范围/全书)
v7/src/migrate/read-v6.js:双形态探测 + state.json 键名/别名归一(Q13-3/4/5/6)+ index.db 只读容错读(逐表 try,Q13-10)+ 正文三命名归一(Q13-1)+ summaries/大纲/设定集/两记忆文件读取;空损坏 state.json 降级(Q13-9)v7/src/migrate/transform.js:design §3.2 映射表逐行实现(front matter 组装用防呆序列化器;伏笔状态/强度映射;名册/时间线表生成;待校对三文件;genre 小码表)+ 报告数据结构v7/test/fixtures/v6-inline/(全量内联形态:三种正文命名混用、chapter_meta 双键格式、伏笔别名 status、project 键名)+ v7/test/fixtures/v6-sqlite/(精简 state + 测试内现场建 index.db,DDL 摘 research Q3:entities/aliases/state_changes/relationships/chapter_reading_power)——坑:根 .gitignore .webnovel/ 会吞 fixture,已加否定规则(目录先重包含)v7/test/migrate/read-v6.test.js + transform.test.js:两形态读出的 V6Facts 等价;映射表每行至少一断言(AC2/AC3 的纯函数半);缺表/缺文件/损坏 state 容错各一例验证:node --test v7/test/migrate/(列文件)
提交:feat(v7): M7 P2——v6 双形态归一读取与映射纯函数
v7/src/migrate/index.js:临时目录物化 → git init + 初始 commit → 缓存重建 → 同盘 rename → books.jsonl 登记 → 迁移报告落工作区(design §3.3/§3.4);启动清扫 .migrate-tmp- 残留v7/src/commands/migrate.js(scope: workdir,--dir 可选)+ bin --help;SKILL.md 例外流程加 export/migrate 两行 + 壳重渲染 + drift 绿v7/docs/migration-guide.md 迁移指引(卸载市场版 → npx init → migrate → 校对清单;命令名/参数与实现一致,AC7)v7/test/migrate/e2e.test.js:
next 判定进正常流程 → 删缓存重建一致node --test(Windows 本机)429 绿 + AC1-AC7 复核、prd.md 打勾(AC6 CI 部分待 push)5ba85a5/8615d91/e14545a/557bd42),CI 双平台绿(run 28736268905 六 job);prd.md AC6 已回填 run 号提交:feat(v7): M7 P3——migrate 物化/命令/指引 + docs(v7): M7 spec 回填
.migrate-tmp- 前缀,migrate 启动时清扫同前缀残留(幂等)