Novel — 小说创作工作流
和 AI 一起写小说。一次设定世界观/角色/写作风格 → 主线拆纲+卷纲展开 → 逐章写作循环(章纲→提示词→提示词验收→正文→正文验收→评审→归档→下一章)
范围 Scope
做什么
- 引导作者完成从设定到归档的完整写作流程
- 检测当前项目进度并自动路由到对应子技能
- 创建和维护项目文件结构(settings/、volumes/、chapters/、prompts/、archives/)
- 管理章生命周期(outline → draft → archived)
- 追踪角色状态和历史
- 管理伏笔/钩子的生命周期
- 检测 AI 味(疲劳词、句式违规)
- 旧版 2.x 项目的自动迁移
不做什么
- ❌ 不生成 git 操作(提交、推送、创建分支)
- ❌ 不执行非小说领域的代码(不建网站、不写 API、不做数据分析)
- ❌ 不修改项目目录外的文件
- ❌ 不安装新包或修改系统配置
- ❌ 不恢复已删除的文件
- ❌ 不处理版本冲突(假设工作目录干净)
边界条件
- 如果
story.md不存在但story.yaml存在 → 分发到迁移子技能(非正常流程) - 如果
init.py不可用 → 手动创建目录结构 + 复制模板(等幂操作) - 如果底层模型能力不足(如 DeepSeek TUI 显示质量问题)→ Phase 1-3 提示作者检查模型配置
- 如果检测到未提交的 git 变更 → 提示作者先提交/stash,不自动操作
- 如果
.agent/status.md与文件系统状态不一致 → 以文件系统为准重新检测,更新 status.md - 如果是全新项目(无任何文件)→ 分发到 novel-setup
项目目录结构
Agent 在用户当前目录下创建/编辑以下文件:
{project-name}/
├── story.md # ★ 必有:项目索引(元信息/引用路径/主线拆纲)
├── settings/
│ ├── world-setting.md # 世界观(core: geography/politics/rules, extended: ...)
│ ├── writing-style.md # 写作风格
│ ├── genre-setting.md # 题材设定(satisfaction_types / pacing_rules / anti_cliches)
│ └── character-setting/
│ └── <id>.md # ★ 每角色一个文件(状态历史 + 情绪弧线 追加写入)
├── volumes/
│ └── volume-{N}.md # 卷纲(chapters_summary 占位章纲)
├── chapters/
│ └── vol-{N}-ch-{M}.md # ★ 章纲唯一存放处(memo + emotional_design + status)
├── prompts/
│ └── vol-{N}-ch-{M}-prompt.md # ★ 章提示词(自动生成,可覆盖)
└── archives/
├── vol-{N}-ch-{M}-{slug}.draft.md # 草稿(写作中)
└── vol-{N}-ch-{M}-{slug}.md # ★ 定稿(归档后去掉 -draft)
关键文件与不变约束:
chapters/vol-{N}-ch-{M}.md#status— ★ 进度标记。outline → draft → archived驱动 Step 1 判断该做什么。归档时更新。settings/character-setting/<id>.md→ 状态历史 — ★ 角色状态的唯一记录。归档时追加,状态历史条目数必须等于该角色已归档章节数。archives/vol-{N}-ch-{M}-{slug}.md— ★ 正文唯一存放处。文件名有-draft= 未归档,没有 = 已归档。volume-{N}.md#chapters_summary— 卷纲占位章纲,逐章讨论时详情写入 chapter.md。
约定:
chapters/只放章纲 md,不放正文prompts/只放提示词 md,纯生成产物——可覆盖,不手动维护archives/正文唯一存放处settings/character-setting/每角色独立 md,追加写入不覆盖volumes/卷纲 md,chapters_summary 只写占位章纲(逐章讨论时补充写入 chapter.md)
硬性自检协议(贯穿整个 Skill)
下面每个产出完成后,必须先自检 → 修复 → 再汇报/推进:
| 产出 | 时效 | 自检清单出处 |
|---|---|---|
| 世界观 | 基础一次性,后续可追加 | references/world-setup-style.md |
| 写作风格 + 题材设定 | 一次性(基本不改) | references/writing-style.md + references/genre-style.md |
| 角色设定 | 基础一次性,后续可追加 | references/character-setting-style.md |
| 主线拆纲(story.md 故事主线 + 分卷规划) | 一次性(Phase 2 入口处) | references/story-arc-style.md |
| 卷纲(volume-N.md) | 每卷一次 | references/volume-setting-style.md |
| 章纲(chapter.md) | 每章一次 | references/chapter-setting-style.md |
| 提示词(prompt.md) | 每章一次 | references/prompt-setting-style.md |
| 正文(archives/ 草稿) | 每章一次 | references/chapter-quality-checklist.md(正文验收,主流程独立执行) |
自检方式(推荐用独立助手完成):
- 独立检查助手(推荐) — 开一个专门的检查助手,告诉它"产出文件路径 + 对应清单 + 关键信息",逐项核查后报告结论(哪几条 pass / 哪几条 fail + 证据 + 修改建议)
- 辅助助手 — 没有独立助手条件时,用辅助助手走同样流程
- 自己检查(兜底) — 上面两种都不行时,自己严格逐项核查——不允许目测一遍就放行
铁律: 拿到结论后先按不合格项把产出改完,再向用户汇报"做完了" + 自检结论 + 改了什么。直接拿原始结论汇报但不修复 = 违规。
各阶段文件读取指南
每个子步骤按"写什么文件 → 读什么参考 → 可选的参考阅读"来准备。读完一份,再看下一份。
| 子步骤 | 写什么文件 | 必读的参考 | 参考阅读 |
|---|---|---|---|
| 1.1 新建项目 | 项目骨架 + story.md | scripts/init.py(创建骨架) | — |
| 1.2 题材选择+风格 | settings/genre-setting.md<br>settings/writing-style.md(预填) | references/genre-style.md(选题指南+验收) | references/genre-example/ 对应类型(配置参考) |
| 1.3 世界观 | settings/world-setting.md | references/world-setup-style.md(引导讨论+自检) | — |
| 1.4 角色 | settings/character-setting/<id>.md | 已有角色文件(追加时不覆盖)<br>references/character-setting-style.md(认知6层+自检) | — |
| 2.0 主线拆纲 | story.md#story_arc(主线+分卷) | references/story-arc-style.md(从结局倒推法) | settings/world-setting.md core(冲突空间参考)<br>角色文件(按需看动机) |
| 2.1 卷纲 | volumes/volume-{N}.md(章节列表) | references/volume-setting-style.md(指南+自检) | — |
| 3.1 章纲 | chapters/vol-{N}-ch-{M}.md | volumes/volume-{N}.md#chapters_summary(卷纲给的本章方向)<br>references/chapter-setting-style.md(指南+自检) | — |
| 3.2 提示词 | prompts/vol-{N}-ch-{M}-prompt.md | references/prompt-setting-style.md(提示词指南+模板) | — |
| 3.2a 提示词验收(主流程独立执行) | prompts/vol-{N}-ch-{M}-prompt.md(检查对象) | references/prompt-setting-style.md Section 三(验收标准) | — |
| 3.3 正文生成 | archives/vol-{N}-ch-{M}-*.draft.md | prompts/vol-{N}-ch-{M}-prompt.md(单一入口) | skills/write/SKILL.md(SOP) |
| 3.3a 正文验收(主流程独立执行) | archives/vol-{N}-ch-{M}-*.draft.md(检查对象) | references/chapter-quality-checklist.md(验收标准) | — |
| 3.4 深度评审(可选) | 诊断报告(内存) | skills/review/SKILL.md | — |
| 3.5 归档 | archives/vol-{N}-ch-{M}-*.md(去 draft)<br>chapters/vol-{N}-ch-{M}.md(status→archived)<br>角色状态追加 + status.md 更新 | 各角色文件(追加状态历史+情绪弧线) | 最近 3 章 chapters/(回顾最近章节) |
条件分支指引(当 X 发生时读 Y)
正常流程走上面那张表。以下异常或边界场景需要额外读取:
| 场景 | 读取目标 | 目的 |
|---|---|---|
| 章节状态不连续(archived 跳至 outline) | 前 3 章 chapters/ 章纲 + archives/ 正文 | 确认是否遗漏归档,判断是否需要补写 |
| 角色情绪弧线断层或状态异常 | 该角色完整状态历史(settings/character-setting/<id>.md#state_history) | 定位断层原因,恢复一致性 |
| 本卷完成时规划下一卷 | 下一卷 volume.md + story.md#story_arc | 确认下一卷方向和主线位置 |
| 新会话恢复(/new 后) | .agent/status.md + 最新 volume.md + 角色文件 | 重建上下文,确定当前进度 |
| 正文验收失败 | chapter.md(章纲设定)+ prompt.md(提示词意图) | 判断是执行偏差还是设定偏差 |
| 提示词验收不通过 | chapter.md emotional_design + memo | 判断提示词是否偏离章纲意图 |
| 作者说"看看进度" | .agent/status.md + chapters/ 所有章状态 | 汇总今进度汇报 |
| 深度评审发现角色行为不一致 | 该角色所有已归档章的状态历史 + 情绪弧线 | 定位行为断层的起始点 |
错误恢复
本技能执行过程中如果某一步失败:
- 自动重试(最多 3 次) — 每次换一种方式重试。例如 subagent 超时 → 减少并发数重试;文件写入冲突 → 换文件名重试
- 重试耗尽 → 降级 — 跳过失败步骤,继续后续步骤,在最终汇报中标记失败项
- 关键步骤失败(骨架创建、状态文件写入)→ 立即上报作者,描述失败现象 + 已尝试的方法 + 建议的手动修复方案
常见失败场景与恢复策略
| 失败场景 | 恢复策略 |
|---|---|
init.py 不可用或报错 | 手动创建目录结构 + 复制模板文件(scripts/templates/ 下各 .template → 对应路径去 .template) |
| subagent 超时(正文写作) | 主 Agent 直接写,降级不退费 |
| 文件被占用/锁定 | 等 5 秒重试,最多 3 次。仍失败 → 报作者手动关闭 |
| 网络错误(WebSearch) | 重试 1 次。仍失败 → 跳过,标记"网络不可用" |
| 检测到未提交的 git 变更 | 提示作者先提交或 stash,不自动操作 |
| 章节状态不连续(archived 后接 outline 间隔) | 报作者"第 N 章未归档,是否跳过?" |
工具契约
| 工具 | 允许 | 禁止 |
|---|---|---|
| Bash | 执行 init.py 创建骨架;文件列表扫描(ls);版本检测(grep);状态文件写入 | 安装新包;修改系统配置;git 提交/推送/分支操作 |
| Read | 读 story.md、.agent/status.md;读子 skill SKILL.md;读 references/ 指南文件 | 读项目文件(settings/、chapters/、volumes/、archives/ 等)——应由子 skill 代为读写 |
| Write/Edit | 写 .agent/status.md;写入检测后的状态结果 | 写项目文件(settings/、chapters/、volumes/、prompts/、archives/ 等)——应由子 skill 执行 |
| Agent | 启动子 skill(setup/outline/chapter/prompt/write/review/archive/migrate) | 跳过 dispatch 直接操作项目文件;给 subagent 传递主 Agent 未读取的文件路径 |
| WebSearch | 作者明确要求导入/分析参考作品时查风格 | 自行判断需要搜索而不经作者确认 |
分发原则: 主 Agent 只负责状态检测 + dispatch。实际的项目文件操作(读设定、写章纲、生成提示词、写正文等)全部通过对应子 skill 执行。
主 Agent 禁止行为
主 Agent 在执行本技能时,禁止以下行为:
- 禁止自行判断"不需要 dispatch" — 检测到状态后必须按信号表分发到对应子 skill,不可跳过
- 禁止直接读写项目文件(status.md 除外) — 项目文件(settings/、chapters/、volumes/、archives/ 等)的读写必须通过子 skill 执行,不可主 Agent 直接操作
违反处理: 违反以上任意一条 → 立即上报作者,描述违反内容,不自行修复后再报告。
生命周期 Lifecycle
Start(开始时)
- 读
.agent/status.md(如果存在)→ 确认当前进度和migrated标志 - 读
story.md→ 判断走哪个分支(迁移 / 正常流程 / 新项目) - 如是新项目 → 读
skills/setup/SKILL.md开始初始化
End(结束时)
每个子技能执行完毕后,主 Agent 必须:
- 写回状态 — 用 Write 把最新检测结果写入
.agent/status.md - 角色状态追加 — 如刚完成归档,必须用 Edit 在对应角色文件追加状态历史
- 汇报路由 — 告诉用户"回到主流程,当前状态:X,下一步:Y"
跨会话恢复
用户说"继续写小说"或触发技能时:
- 读
.agent/status.md→ 获取 current_phase / current_volume / current_chapter - 读对应 chapter.md + volume.md → 恢复上下文
- 从 Step 1 信号表继续路由
工作机制:状态驱动循环
主 SKILL.md 和子 skill 之间没有显式"调用"。整个系统是一个状态驱动循环:
Step 1(检测状态)→ 匹配路由 → Read 子 skill → 子 skill 改状态 → 回到 Step 1(重新检测)
通信方式: 不传递消息或参数。主 skill 写 chapter.md#status + .agent/status.md,子 skill 读这些文件来知道"当前在做什么阶段"。
- 主 skill Step 1 检测
chapters/下的状态 → 匹配到对应子 skill - 主 skill Step 2.3 读子 skill 的 SKILL.md,Agent 直接执行里面的步骤
- 子 skill 修改
chapter.md#status和产出文件,末尾写"回到主流程" - Agent 读"回到主流程"后,重新从 Step 1 开始,检