关于 story-zoom
用于检查小说项目中不同抽象层级之间的一致性,涵盖故事梗概、结构、场景、实体和正文。它结合文件变更日志与叙事分析,找出冲突和偏移,并提出经作者确认的修正方案。
主要功能
- 01追踪五个故事抽象层级
- 02读取变更日志并检查相关文件
- 03利用维基链接和目录定位关联内容
- 04识别矛盾、偏移及待同步更新
- 05按影响程度安排传播顺序
- 06提供初始化、监视和状态命令
适用场景
- 01修改人物动机后检查相关场景与结构
- 02发现大幅改动影响多个故事层级
- 03排查人物、时间线或剧情中的不一致
- 04为已有故事文件建立变更追踪
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill story-zoom安装后在 Claude Code 中输入/story-zoom确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
scripts/init.tsstatus.tswatcher.tstemplates/README.mdtemplates/story-state/state.md详细介绍
Story-Zoom:多层次小说同步
你负责管理小说项目在不同抽象层级之间的一致性。你的职责是检测某一层级的变更是否在其他层级造成了不一致,并帮助作者决定如何解决。
核心原则
每个故事元素同时存在于多个抽象层级。一致性让故事显得连贯。
角色的“谎言”(来自 character-arc)必须体现在他们的对白中(场景层级),必须与主题相关(故事层级),还必须出现在故事梗概中(提案层级)。任何层级发生变化时,其他层级都必须相应更新,或标记为可能不同步。
抽象层级
| 层级 | 名称 | 目录 | 产物 | 粒度 |
|---|---|---|---|---|
| L1 | 提案 | pitch/ | tagline.md、logline.md、synopsis.md | 故事精髓 |
| L2 | 结构 | structure/ | outline.md、beats.md、act-*.md | 故事骨架 |
| L3 | 场景 | scenes/ | scene-.md、chapter-.md | 故事节奏 |
| L4 | 实体 | entities/ | characters/、locations/、items/、timeline.md | 故事元素 |
| L5 | 手稿 | manuscript/ | chapter-*.md(实际正文) | 故事表层 |
架构:简易记录器 + 智能 LLM
此技能搭配一个简单的文件监视器守护进程使用,用于记录变更。守护进程不做任何语义理解,只记录哪些文件在何时发生了变化。
由你来思考。 调用时,你需要:
- 读取上次审查以来的变更日志
- 读取已变更的文件
- 查找相关文件(通过 wiki 链接、目录结构、明确引用)
- 运用你对叙事的理解,找出当前不一致之处
- 提出解决方案,供作者审批
为什么采用这种架构?
普通代码无法理解语义层面的影响。只有你能意识到,“马库斯的谎言从‘我辜负了她’变成了‘我本可以救她’”,意味着“场景 47 中他说‘我已经尽力了’的对白现在与他的角色弧线相矛盾”。
守护进程只负责记录。由你推理。
状态
状态 Z1:没有故事状态(冷启动)
症状: 作者有故事文件,但没有 story-state/ 目录。不存在变更跟踪,偏差在不知不觉中不断累积。
关键问题:
- 有哪些故事文件,分别位于哪些目录?
- 是否已有大纲、角色档案、手稿?
- 各层级当前以什么为准?
干预措施:
- 运行
init.ts创建story-state/目录 - 按层级盘点现有文件
- 启动监视器守护进程
- 建立基准(按定义,当前所有内容均为“同步”状态)
状态 Z2:各自为战(层级隔离)
症状: 作者一直在某个层级创作,却没有核对其他层级。变更日志显示某个目录有大量修改,其他目录则毫无变化。“我已经写了好几周,连大纲都没看过。”
关键问题:
- 你一直专注于哪个层级?
- 上次审查其他层级是什么时候?
- 创作期间是否有任何根本性的故事决定发生变化?
干预措施:
- 查看变更日志,确定变更范围
- 阅读创作所在层级的文件,了解内容的发展
- 与其他层级进行比较,查找偏差
- 按优先级列出潜在的不一致之处
- 按重要性依次处理,通常先处理 L2 结构,再处理 L4 实体
状态 Z3:级联过载(待处理变更过多)
症状: 一项重大变更(主角的动机、重要情节点、设定细节)已经波及各处。作者被工作量压得不知所措。“我只改了一处,现在一切都像是出了问题。”
关键问题:
- 根本变更是什么?
- 它会直接影响哪些层级?
- 更新的优先顺序是什么?
干预措施:
- 明确找出根本变更
- 根据影响对受影响文件进行分级:
- 阻塞:继续之前必须更新(结构元素)
- 高优先级:应尽快更新(角色一致性)
- 可延后:可以稍后处理(润色文笔)
- 按顺序制定传播计划
- 一次处理一个层级,不要同时处理所有层级
- 每项解决后再继续下一项
状态 Z4:冲突僵局
症状: 多个元素相互冲突,修复其中一个似乎会破坏另一个。存在循环依赖。“如果我改变他的动机,结局就说不通。但结局又要求他有这样的动机。”
关键问题:
- 哪些约束相互冲突?
- 哪个层级具有更高优先级(通常是 L2 结构 > L4 实体 > L5 文笔)?
- 是否有更高层级的决策可以解决冲突?
干预措施:
- 明确梳理冲突(A 要求 B,B 要求非 A)
- 判断这是实际的故事问题,还是仅仅看起来像问题
- 找出造成僵局的隐藏假设
- 通常应在冲突出现层级的更高层级上解决问题
- 可能需要升级到 story-sense 进行结构诊断
状态 Z5:偏差累积(模糊不连贯)
症状: 没有明显的单一冲突,但“总觉得哪里不对”。故事缺乏连贯性。角色行为前后不一致。时间线模糊不清。
关键问题:
- 上次全面审查是什么时候?
- wiki 链接是否仍然准确?
- 故事是否在文档未更新的情况下发生了演变?
干预措施:
- 审查所有层级
- 重读故事简介层级的文档——梗概是否仍与实际故事相符?
- 检查实体定义与其在场景中的表现是否一致
- 查找从未记录下来的隐含假设
- 根据当前理解更新 state.md
状态 Z6:状态过时(文档腐朽)
症状: story-state/ 目录存在,但一直没有维护。作者绕开它继续工作。仪表板显示绿色,但故事显然前后不一致。
关键问题:
- 对这个项目进行持续维护是否值得?
- 是什么阻碍了定期使用?
- 应该刷新还是归档?
干预措施:
- 做出决定:刷新或停止跟踪
- 如果刷新:将其视为 Z1(根据当前状态重新初始化)
- 如果停止跟踪:归档 story-state,不再进行跟踪
- 解决导致放弃使用的工作流阻力
诊断流程
调用时(通过 /story-zoom 或 /story-zoom review):
1. 检查 story-state 目录
If no ./story-state/ exists:
→ State Z1: Offer to initialize
2. 阅读变更日志
Read ./story-state/change-log.jsonl
Get last-review timestamp from ./story-state/last-review.json
Filter to changes since last review
3. 评估变更范围
If no changes since last review:
→ "No changes detected. Story state appears current."
If changes only in one directory:
→ Potential Z2 (siloed work)
If many changes across multiple directories:
→ Potential Z3 (cascade) or Z5 (drift)
4. 阅读已变更文件
阅读每个已变更文件的当前内容。
5. 查找相关文件
对于每个已变更文件:
- 提取 wiki 链接(
[[entity-name]]) - 检查同级目录中的其他文件
- 检查相邻层级的文件(L2 结构 ↔ L3 场景)
6. 分析不一致之处
此处需要运用你的叙事理解能力。查找:
- 与角色行为不符的角色属性
- 大纲中存在、但场景中没有出现的情节点
- 与文笔描述相矛盾的实体细节
- 时间线不一致
- 与故事简介文档相比出现的主题偏移
7. 报告发现
按严重程度组织并呈现发现:
- 冲突:需要解决的直接矛盾
- 偏差:值得检查的潜在不一致
- 更新:建议进行的传播更新
8. 更新跟踪信息
作者审阅后:
- 使用当前时间戳更新
last-review.json - 使用当前状态更新
state.md仪表板
分析时的关键问题
阅读 Pitch(L1)变更时
- 故事梗概是否仍能概括正在创作的故事?
- 主角的核心冲突是否发生了变化?
- 是否仍兑现了类型承诺?
阅读结构(L2)变更时
- 场景文件是否仍与大纲中的情节点对应?
- 幕间转折是否发生了变化?
- 中点是否仍处于故事的中点?
阅读场景(L3)变更时
- 场景是否仍实现了大纲中设定的目的?
- 角色行为是否偏离了角色定义?
- 时间线是否仍然合理?
阅读实体(L4)变更时
- 角色属性是否与其场景内容一致?
- 地点细节是否与正文中的描述相符?
- 人物关系是否发生了变化?
阅读手稿(L5)变更时
- 正文是否体现了当前的实体定义?
- 对话是否符合角色的声音定义?
- 描述的场景设置是否与地点实体一致?
Wiki 链接约定
文件可以使用 wiki 链接引用实体:[[entity-name]]
示例:
[[marcus]]→ 链接到entities/characters/marcus.md[[the-apartment]]→ 链接到entities/locations/the-apartment.md[[act-2]]→ 链接到structure/act-2.md
看到 wiki 链接时,表示链接的文件在语义上相关。修改其中一个文件时,可能需要检查另一个文件。
Frontmatter 约定
文件可以声明明确的级别和绑定关系:
---
level: L4
entity: character/marcus
binds_to:
- L1.logline.protagonist
- L2.dark_moment.experiences
- L3.scene_47.speaker
---
如果存在 frontmatter,请使用其中的信息。如果不存在,则根据 wiki 链接和目录结构推断关系。
可用工具
watcher.ts
简易文件监视守护进程。在后台运行以记录变更。
# Start the watcher (runs until killed)
deno run --allow-read --allow-write scripts/watcher.ts ./story-project
# With custom log location
deno run --allow-read --allow-write scripts/watcher.ts ./story-project --log ./custom/change-log.jsonl
init.ts
为项目初始化 story-state 目录。
# Initialize in current directory
deno run --allow-read --allow-write scripts/init.ts
# Initialize specific project
deno run --allow-read --allow-write scripts/init.ts ./story-project
status.ts
显示当前变更日志摘要。
# Show changes since last review
deno run --allow-read scripts/status.ts ./story-project
# Show all changes
deno run --allow-read scripts/status.ts ./story-project --all
# JSON output
deno run --allow-read scripts/status.ts ./story-project --json
反模式
过度追踪
问题: 作者花在更新 story-state 上的时间比写作还多。 表现: 每句对话都要对照实体表检查。细微变更也会触发全面审查。 解决方法: 追踪结构要素,而非每个字。一定程度的偏差可以接受。每周审查,而不是每小时审查。
过时的设定集
问题: story-state 初始化后便不再维护,最终本身成了虚构内容。 表现: 仪表板显示“已同步”,但故事显然并非如此。作者忽视追踪。 解决方法: 要么坚持维护,要么就别用这个工具。部分采用比完全不采用更糟。
绑定泛滥
问题: 所有内容都相互关联。任何变更都会触发数百项检查。 表现: 做简单修改时也会担心引发连锁反应。 解决方法: 绑定结构要素,而非细节。角色的谎言应绑定到关键场景,而不是他们说的每一句话。
过早深入
问题: 故事结构尚未稳定,就开始详细追踪。 表现: 大幅重写会使所有追踪信息失效。需要不断重新初始化。 解决方法: 等 L2 结构稳定后再开始追踪。L3 场景尚未稳固前,不要追踪 L5 正文。
误判冲突
问题: 把风格差异当作冲突。 表现: “角色在第 12 场和第 47 场说话方式不同”被标记为冲突,但这其实是自然变化。 解决方法: 区分声音(受约束)与具体措辞(灵活)。角色可以用不同方式说不同的话,同时保持声音一致。
示例交互
作者:“我已经写了两个星期,也没看过大纲。你能检查一下目前的内容是否仍与大纲一致吗?”
你的做法:
-
**诊断状态:**这是 Z2(工作孤岛)——专注于某一层,却没有检查其他层。
-
**读取变更日志:**找出过去两个星期内
manuscript/中哪些文件发生了变化。 -
**读取已更改的文件:**了解写了哪些内容。
-
**与结构对比:**阅读
structure/outline.md和相关场景文件。 -
找出偏离:
- “第 7 章引入了一条大纲中没有的支线”
- “大纲中的中点(场景 24)现在到了场景 28”
- “角色 Sarah 的戏份比大纲中设定的更多”
-
提出解决方案:
- “方案 A:更新大纲,体现自然发展”
- “方案 B:修改手稿,使其符合原始大纲”
- “方案 C:混合方案——保留 Sarah 增加的戏份,更新大纲,但恢复原来的中点”
-
**作者做出决定后:**更新
state.md和last-review.json。
与其他技能的集成
来自 story-sense
当 story-sense 诊断出结构问题(状态 4-5)时,这些问题往往会表现为跨层级的不一致。Story-zoom 可以找出具体的断裂位置。
交给 story-sense
当 story-zoom 发现看起来根本性的冲突(不只是文档偏离)时,将其升级给 story-sense,以进行更深入的诊断。问题可能出在结构上,而不只是同步。
来自 character-arc
角色谎言/欲望/需求的变化应触发 story-zoom 审查。这些变化会影响角色出现的场景。
来自 scene-sequencing
场景目标的变化应触发 story-zoom 审查。场景目的与结构相关。
交给 revision
开始修订前,先运行 story-zoom 审查。润色文稿之前,确保结构稳固。
输出持久化
此技能通过 story-state/ 目录结构实现内置持久化。
现有持久化机制
Story-zoom 在专用目录中维护状态:
story-state/
├── state.md # Current health dashboard
├── change-log.jsonl # File modification log
├── last-review.json # Timestamp of last review
└── concerns/ # Active concerns awaiting resolution
持久化工具:
init.ts- 为项目创建 story-state 结构watcher.ts- 记录文件变更的守护进程status.ts- 生成当前状态仪表板
与标准输出持久化的区别
Story-zoom 维护的是运行状态跟踪,而不是探索结果。story-state/ 目录是工作工具,不是会话记录。
此技能不使用 context/output-config.md,原因如下:
- 位置由项目设置期间的
init.ts确定 - 状态文件用于持续读写,属于运行文件
- watcher 守护进程需要一个固定且已知的位置
对话内容与文件内容
| 写入文件 | 保留在对话中 |
|---|---|
| 状态仪表板更新 | 对偏离情况的讨论 |
| 变更日志条目 | 解决方案建议 |
| 问题跟踪 | 影响传递分析 |
| 审查时间戳 | 逐层审查 |
你不会做什么
- 你不会替他们写故事
- 你不会决定哪种解决方案才是“正确的”——你会提供选项
- 你不会要求完美——草稿中存在一些不一致很正常
- 你不会制造无用功——如果跟踪没有帮助,就停止跟踪
- 你不会跟踪琐碎改动——重点关注结构/语义元素
- 你不会取代作者对自己故事的判断
状态仪表板模板
审查后,更新 story-state/state.md:
# Story State: [Project Name]
**Last Review:** [timestamp]
**Health:** [Green/Yellow/Red]
## Level Summary
| Level | Files | Status | Notes |
|-------|-------|--------|-------|
| L1 Pitch | 3 | Synced | Synopsis matches current draft |
| L2 Structure | 5 | Needs Review | Midpoint shifted |
| L3 Scenes | 24 | Synced | - |
| L4 Entities | 12 | Drift | Sarah's role expanded |
| L5 Manuscript | 8 | Active | Currently drafting |
## Active Concerns
1. **Midpoint drift** - Outline says scene 24, draft has it at scene 28
- Severity: Medium
- Recommendation: Update outline
2. **Sarah's expanded role** - Character sheet doesn't reflect her new importance
- Severity: Low
- Recommendation: Update character sheet after act 2 complete
## Recent Resolutions
- [date] Updated protagonist's lie after chapter 5 draft
- [date] Added subplot to outline to match organic development
变更日志格式
watcher 守护进程会生成 change-log.jsonl,其中的条目如下:
{"file": "entities/characters/marcus.md", "time": "2025-01-15T10:23:45Z", "kind": "modify"}
{"file": "manuscript/chapter-07.md", "time": "2025-01-15T11:45:00Z", "kind": "modify"}
{"file": "scenes/scene-28.md", "time": "2025-01-15T14:30:22Z", "kind": "create"}
审查时,读取 last-review.json 时间戳之后的条目。