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 只能分析、提议、写局部补丁;批准、应用、覆盖、撤销都只能由作者来做。

3 种约束锁:字面(逐字保护)、语义(关键信息不能丢)、功能(这段的作用不能变)
9 步一次修订的闭环:问题 → 讨论 → 计划 → 批准 → 补丁 → 应用 → 检查 → 意图对比 → 历史
±2 段每次发给 AI 的上下文:选中的段落加前后各两段和相关设定,从不发整篇
69 + 4个单元测试和端到端测试,端到端测试包括真实的 Claude 调用
状态。个人项目,核心流程已经可以使用,有桌面应用(Tauri)和 Claude Code skill(浏览器)两种运行方式,界面默认中文,可以切换英文。工具最初按小说修订来设计,正文按章节存成 Markdown,剧情、任务文本和对白也可以照这个方式管理;它目前没有和任何游戏引擎或配表工具对接。代码暂未公开。

文案工作里的问题,在工具里对应什么

文案工作里常见的情况 工具里的做法
世界观和角色设定散在各个文档里,改剧情时很少有人逐条对照 设定(Canon)/ 角色 / 场景 编辑器;创建问题时自动关联相关的设定和锁
有些名字、台词、伏笔不能动 锁:字面锁在应用时直接拦截;语义锁和功能锁在修改后由 AI 做对比复查
评审意见变成实际修改的过程中,原意容易走样 问题单锚定到具体段落,讨论、计划项逐条批准 / 拒绝 / 暂缓,补丁只能落在已批准的计划项上
改完不知道影响了哪里 修订检查和意图对比:改了什么、为什么改、碰到哪些设定、线索和锁,回归测试改前改后各是什么结果
需要能回退 基于 Git 的修订历史:撤销某个补丁,或把章节恢复到任意版本(恢复前先保存当前状态)
文风要统一 文风规则:禁用词、出现次数的警告阈值、正则,可以扫描全稿
线索要在对的时候被读者注意到 主张与证据:标出读者应该在哪一段开始相信什么;补丁碰到证据段落时会在意图对比里标出来

左栏:锁、文风规则和回归测试。字面锁保护“玛恩纳大叔”“厨房纸”这类不能改的词,功能锁写的是“这段的主要作用:人物化宁宁”

一次修订的完整流程

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

问题单:问题、目标、涉及的锁和设定,以及被锚定的原文

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

计划项:两条已批准,一条被拒绝(删除关键证据句太激进)

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

补丁:“钥匙确实在那里”改成“钥匙在那里”,附理由、预期效果和可能影响

4. 应用和检查。 应用前会核对原文哈希,如果原文已经被改过,就安全地重新定位,或者标记为冲突而不写入文件。写入后自动运行修订检查:文件完整性、三种锁、设定引用、文风规则、回归测试和场景功能,每项给出 通过 / 警告 / 失败。

5. 意图对比。 不只是文字差异,还会说明哪些约束保持了、哪些被破坏或需要复核,碰到了哪些设定、证据和场景,文风有什么变化,回归测试改前改后的结果,以及风险等级。

意图对比:保留了什么、改变了什么,五条锁全部保持,涉及的设定和场景,回归测试改前改后都是 4 项通过

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

修订历史:撤销 PATCH-0001 之后,检查结果是 12 项通过、1 项警告、0 项失败

和 AI 的分工

  • AI 能做的:分析问题、提计划、写局部补丁,在修改后做语义和功能层面的复查。
  • AI 不能做的:批准、应用、覆盖锁、撤销,也不能整篇重写。
  • 发给 AI 的内容:只有选中的文字、所在段落、前后各两段,以及相关的锁、设定、场景和禁用词。问题面板会显示这次上下文的大致长度。
  • AI 可以关掉:问题单、手写计划、手写补丁、锁、检查和历史都照常工作。没有 AI 时,语义锁和功能锁会显示“未经机器验证”的警告,而不是假装通过。

在 Claude Code skill 模式下,一句“用修订 IDE 打开这本小说”就会在本机启动一个只监听 127.0.0.1、带一次性令牌、限定在一个文件夹里的服务,并在浏览器里打开界面。Claude Code 会话通过一个只能提议的命令行工具 nri 担任编辑:它可以开问题、参与讨论、提计划和补丁,但没有批准、应用、撤销的命令。页面会实时显示它提交的内容。

终端里的 Claude Code 会话为第二章开了一个问题、加了讨论和一条计划,页面上随即出现,等作者决定

工程

  • 字节级保存:编辑器用 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 时,这几项只显示警告。
  • 还不能在界面里调整章节顺序或删除章节。
  • 计划中的功能:证据图(段落 → 证据 → 主张)、按不同读者类型模拟阅读并记录信念变化、线索功能识别(线索、红鲱鱼、人物塑造、氛围),以及在批准补丁前预览影响范围。