Work / Narrative Tooling
Narrative Revision IDE 叙事修订 IDE:给文案策划的剧情修订工作台
把剧情文本当成需要版本管理的母本:问题、计划、批准、局部补丁、自动检查和意图对比,AI 只能提议,改不坏设定和伏笔。
- Role
- 个人项目
- Year
- 2026
- Team
- 个人项目
- Tech
- TypeScript · React · CodeMirror 6 · Tauri 2 · Git · Claude Code skill
- Status
- 开发中
介绍视频,约 6 分半,中文界面,带中文字幕,无声。一次完整的修订流程:从选中一段文字开始,到提出问题、批准计划、应用补丁、检查、查看意图对比、撤销,最后由 Claude Code 会话在终端里提问题。演示用的是工具内置的示例项目。
概览
文案改剧情,难的往往不是写出新句子,而是改完之后前面立住的东西还在不在:设定有没有被改掉,伏笔还能不能成立,这句台词原本承担的作用还在不在。Narrative Revision IDE 把剧情文本当成需要做版本管理的“母本”:每一次修改都从一个问题出发,经过计划、批准、局部补丁,再自动检查,并说明这次改动碰到了什么。
它不是续写工具。AI 只能分析、提议、写局部补丁;批准、应用、覆盖、撤销都只能由作者来做。
文案工作里的问题,在工具里对应什么
| 文案工作里常见的情况 | 工具里的做法 |
|---|---|
| 世界观和角色设定散在各个文档里,改剧情时很少有人逐条对照 | 设定(Canon)/ 角色 / 场景 编辑器;创建问题时自动关联相关的设定和锁 |
| 有些名字、台词、伏笔不能动 | 锁:字面锁在应用时直接拦截;语义锁和功能锁在修改后由 AI 做对比复查 |
| 评审意见变成实际修改的过程中,原意容易走样 | 问题单锚定到具体段落,讨论、计划项逐条批准 / 拒绝 / 暂缓,补丁只能落在已批准的计划项上 |
| 改完不知道影响了哪里 | 修订检查和意图对比:改了什么、为什么改、碰到哪些设定、线索和锁,回归测试改前改后各是什么结果 |
| 需要能回退 | 基于 Git 的修订历史:撤销某个补丁,或把章节恢复到任意版本(恢复前先保存当前状态) |
| 文风要统一 | 文风规则:禁用词、出现次数的警告阈值、正则,可以扫描全稿 |
| 线索要在对的时候被读者注意到 | 主张与证据:标出读者应该在哪一段开始相信什么;补丁碰到证据段落时会在意图对比里标出来 |

一次修订的完整流程
1. 从一段文字开始。 在正文里选中有问题的句子,创建修订问题。问题会记下所在文件、段落 ID、内容哈希和上下文,所以前面的文字改了,它也能重新找到原来的位置。

2. 讨论和计划。 可以让 AI 编辑分析这个问题,也可以自己写。计划拆成若干条,每一条都要作者单独批准、拒绝或暂缓。被拒绝和暂缓的条目不会生成补丁。

3. 局部补丁。 补丁只能修改已批准计划项对应的段落,并且一次只替换一处文字。每个补丁都写明原文、建议、差异、理由、预期效果、可能的影响,以及对约束的预检查。“提议”“批准”“应用”是三个独立的步骤。

4. 应用和检查。 应用前会核对原文哈希,如果原文已经被改过,就安全地重新定位,或者标记为冲突而不写入文件。写入后自动运行修订检查:文件完整性、三种锁、设定引用、文风规则、回归测试和场景功能,每项给出 通过 / 警告 / 失败。
5. 意图对比。 不只是文字差异,还会说明哪些约束保持了、哪些被破坏或需要复核,碰到了哪些设定、证据和场景,文风有什么变化,回归测试改前改后的结果,以及风险等级。

6. 历史和撤销。 每次应用都会生成一条“修订 N”的 Git 记录。撤销补丁后原文逐字恢复,撤销本身也会经过一次检查。

和 AI 的分工
- AI 能做的:分析问题、提计划、写局部补丁,在修改后做语义和功能层面的复查。
- AI 不能做的:批准、应用、覆盖锁、撤销,也不能整篇重写。
- 发给 AI 的内容:只有选中的文字、所在段落、前后各两段,以及相关的锁、设定、场景和禁用词。问题面板会显示这次上下文的大致长度。
- AI 可以关掉:问题单、手写计划、手写补丁、锁、检查和历史都照常工作。没有 AI 时,语义锁和功能锁会显示“未经机器验证”的警告,而不是假装通过。
在 Claude Code skill 模式下,一句“用修订 IDE 打开这本小说”就会在本机启动一个只监听 127.0.0.1、带一次性令牌、限定在一个文件夹里的服务,并在浏览器里打开界面。Claude Code 会话通过一个只能提议的命令行工具 nri 担任编辑:它可以开问题、参与讨论、提计划和补丁,但没有批准、应用、撤销的命令。页面会实时显示它提交的内容。

工程
- 字节级保存:编辑器用 CodeMirror 6 直接编辑 Markdown 源码,保存后文件逐字节不变;写入是原子操作;外部修改会被检测出来,不会被悄悄覆盖。
- 领域逻辑全部在 TypeScript 里:段落稳定 ID、锚点重定位、补丁边界和哈希、锁、修订检查、依赖图和意图对比都可以直接在 Node 里做单元测试。Rust 只做很薄的一层:原子写入,以及 Git 命令白名单(拒绝破坏性命令)。
- AI 输出必须符合结构:用 Zod 定义结构,解析失败会重试修复,并有超时和 JSON 模式的兜底。支持 Claude(通过本机 Claude Code,不需要 API key)、OpenAI 兼容接口和确定性的 Mock。
- 测试:69 个单元测试(领域逻辑、文件、临时 Git 仓库、AI 的异常输入和超时);4 个 Playwright 端到端测试,在真实文件和真实 Git 上跑完整流程,其中包括真实的 Claude 调用;3 个 Rust 测试;以及对桌面版 exe 的冒烟测试。
- 独立审查:发现了 8 个问题,比如应用补丁时保存被覆盖、CRLF 换行导致偏移、删除型补丁无法撤销、恢复版本后补丁状态错误。全部已修复,并补上了回归测试。
局限与下一步
- 一个补丁只能替换一个段落里的一处文字。多段改写需要拆成几个补丁,这是有意的设计。
- 语义锁、功能锁和场景功能检查需要 AI;不接 AI 时,这几项只显示警告。
- 还不能在界面里调整章节顺序或删除章节。
- 计划中的功能:证据图(段落 → 证据 → 主张)、按不同读者类型模拟阅读并记录信念变化、线索功能识别(线索、红鲱鱼、人物塑造、氛围),以及在批准补丁前预览影响范围。