--- name: webnovel-write description: Writes webnovel chapters (default 2000-2500 words). Use when the user asks to write a chapter or runs /webnovel-write. Runs context, drafting, review, polish, and data extraction. allowed-tools: Read Write Edit Grep Bash Task --- # Chapter Writing (Structured Workflow v2) ## 目标 - 以稳定流程产出可发布章节:`正文/第{NNNN}章.md`。 - 默认章节字数目标:2000-2500(用户或大纲明确覆盖时从其约定)。 - 保证审查、润色、数据回写完整闭环,避免“写完即丢上下文”。 - 输出直接可被后续章节消费的结构化数据:`review_metrics`、`summaries`、`chapter_meta`。 ## 执行原则 1. 先校验输入完整性,再进入写作流程;缺关键输入时立即阻断。 2. 审查与数据回写是硬步骤,`--fast`/`--minimal` 只允许降级可选环节。 3. 参考资料严格按步骤按需加载,不一次性灌入全部文档。 4. Step 2B 与 Step 4 职责分离:2B 只做风格转译,4 只做问题修复与质控。 5. 任一步失败优先做最小回滚,不重跑全流程。 ## 模式定义 - `/webnovel-write`:Step 1 → 2A → 2B → 3 → 4 → 5 → 6 - `/webnovel-write --fast`:Step 1 → 2A → 3 → 4 → 5 → 6(跳过 2B) - `/webnovel-write --minimal`:Step 1 → 2A → 3(仅3个基础审查)→ 4 → 5 → 6 最小产物(所有模式): - `正文/第{NNNN}章.md` - `index.db.review_metrics` 新纪录(含 `overall_score`) - `.webnovel/summaries/ch{NNNN}.md` - `.webnovel/state.json` 的进度与 `chapter_meta` 更新 ## 引用加载等级(strict, lazy) - L0:未进入对应步骤前,不加载任何参考文件。 - L1:每步仅加载该步“必读”文件。 - L2:仅在触发条件满足时加载“条件必读/可选”文件。 路径约定: - `references/...` 相对当前 skill 目录。 - `../../references/...` 指向全局共享参考。 ## References(逐文件引用清单) ### 根目录 - `references/step-3-review-gate.md` - 用途:Step 3 审查调用模板、汇总格式、落库 JSON 规范。 - 触发:Step 3 必读。 - `references/step-5-debt-switch.md` - 用途:Step 5 债务利息开关规则(默认关闭)。 - 触发:Step 5 必读。 - `../../references/shared/core-constraints.md` - 用途:Step 2A 写作硬约束(大纲即法律 / 设定即物理 / 发明需识别)。 - 触发:Step 2A 必读。 - `references/polish-guide.md` - 用途:Step 4 问题修复、Anti-AI 与 No-Poison 规则。 - 触发:Step 4 必读。 - `references/writing/typesetting.md` - 用途:Step 4 移动端阅读排版与发布前速查。 - 触发:Step 4 必读。 - `references/style-adapter.md` - 用途:Step 2B 风格转译规则,不改剧情事实。 - 触发:Step 2B 执行时必读(`--fast`/`--minimal` 跳过)。 - `references/style-variants.md` - 用途:Step 1(内置 Contract)开头/钩子/节奏变体与重复风险控制。 - 触发:Step 1 当需要做差异化设计时加载。 - `../../references/reading-power-taxonomy.md` - 用途:Step 1(内置 Contract)钩子、爽点、微兑现 taxonomy。 - 触发:Step 1 当需要追读力设计时加载。 - `../../references/genre-profiles.md` - 用途:Step 1(内置 Contract)按题材配置节奏阈值与钩子偏好。 - 触发:Step 1 当 `state.project.genre` 已知时加载。 - `references/writing/genre-hook-payoff-library.md` - 用途:电竞/直播文/克苏鲁的钩子与微兑现快速库。 - 触发:Step 1 题材命中 `esports/livestream/cosmic-horror` 时必读。 ### writing(问题定向加读) - `references/writing/combat-scenes.md` - 触发:战斗章或审查命中“战斗可读性/镜头混乱”。 - `references/writing/dialogue-writing.md` - 触发:审查命中 OOC、对话说明书化、对白辨识差。 - `references/writing/emotion-psychology.md` - 触发:情绪转折生硬、动机断层、共情弱。 - `references/writing/scene-description.md` - 触发:场景空泛、空间方位不清、切场突兀。 - `references/writing/desire-description.md` - 触发:主角目标弱、欲望驱动力不足。 ## 工具策略(按需) - `Read/Grep`:读取 `state.json`、大纲、章节正文与参考文件。 - `Bash`:运行 `extract_chapter_context.py`、`index_manager`、`workflow_manager`。 - `Task`:调用 `context-agent`、审查 subagent、`data-agent` 并行执行。 ## 交互流程 ### Step 0:预检与上下文最小加载 必须做: - 解析真实书项目根(book project_root):必须包含 `.webnovel/state.json`。 - 校验核心输入:`大纲/总纲.md`、`.claude/scripts/extract_chapter_context.py` 存在。 - 规范化变量: - `WORKSPACE_ROOT`:Claude Code 打开的工作区根目录(可能是书项目的父目录,例如 `D:\wk\xiaoshuo`) - `PROJECT_ROOT`:真实书项目根目录(必须包含 `.webnovel/state.json`,例如 `D:\wk\xiaoshuo\凡人资本论`) - `SKILL_ROOT`:skill 所在目录(即本 SKILL.md 所在的 `.claude/skills/webnovel-write`) - `SCRIPTS_DIR`:脚本目录(按存在性自动探测:工作区内 `.claude/scripts` → 用户目录 `~/.claude/scripts` → `${CLAUDE_PLUGIN_ROOT}/scripts`) - `chapter_num`:当前章号(整数) - `chapter_padded`:四位章号(如 `0007`) 环境设置(bash 命令执行前): ```bash # WORKSPACE_ROOT:Claude Code 的工作区根(通常等于 $CLAUDE_PROJECT_DIR) export WORKSPACE_ROOT="${CLAUDE_PROJECT_DIR:-$PWD}" if [ -d "${WORKSPACE_ROOT}/.claude/skills/webnovel-write" ]; then export SKILL_ROOT="${WORKSPACE_ROOT}/.claude/skills/webnovel-write" elif [ -d "${WORKSPACE_ROOT}/../.claude/skills/webnovel-write" ]; then export SKILL_ROOT="${WORKSPACE_ROOT}/../.claude/skills/webnovel-write" elif [ -d "${HOME}/.claude/skills/webnovel-write" ]; then export SKILL_ROOT="${HOME}/.claude/skills/webnovel-write" elif [ -n "${CLAUDE_PLUGIN_ROOT}" ] && [ -d "${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write" ]; then export SKILL_ROOT="${CLAUDE_PLUGIN_ROOT}/skills/webnovel-write" else echo "ERROR: 未找到 webnovel-write skill 目录" >&2 exit 1 fi if [ -d "${WORKSPACE_ROOT}/.claude/scripts" ]; then export SCRIPTS_DIR="${WORKSPACE_ROOT}/.claude/scripts" elif [ -d "${WORKSPACE_ROOT}/../.claude/scripts" ]; then export SCRIPTS_DIR="${WORKSPACE_ROOT}/../.claude/scripts" elif [ -d "${HOME}/.claude/scripts" ]; then export SCRIPTS_DIR="${HOME}/.claude/scripts" elif [ -n "${CLAUDE_PLUGIN_ROOT}" ] && [ -d "${CLAUDE_PLUGIN_ROOT}/scripts" ]; then export SCRIPTS_DIR="${CLAUDE_PLUGIN_ROOT}/scripts" else echo "ERROR: 未找到 scripts 目录" >&2 exit 1 fi # 解析真实书项目根(后续所有 Read/Write 路径都必须以 $PROJECT_ROOT 为前缀,避免写到工作区根目录) export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" where)" ``` 输出: - “已就绪输入”与“缺失输入”清单;缺失则阻断并提示先补齐。 ### Step 0.5:工作流断点记录(best-effort,不阻断) ```bash # 开始整条任务 python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" workflow start-task --command webnovel-write --chapter {chapter_num} || true # 进入某一步(示例:Step 1) python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" workflow start-step --step-id "Step 1" --step-name "Context Agent" || true # Step 1 完成后记录(每个 Step 结束都要调用) python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" workflow complete-step --step-id "Step 1" --artifacts '{"ok":true}' || true # 全部 Step 结束后,再结束整条任务 python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" workflow complete-task --artifacts '{"ok":true}' || true ``` 要求: - `--step-id` 仅允许:`Step 1` / `Step 2A` / `Step 2B` / `Step 3` / `Step 4` / `Step 5` / `Step 6`。 - 任何记录失败只记警告,不阻断写作。 - 每个 Step 执行结束后,同样需要 `complete-step`(失败不阻断)。 ### Step 1:Context Agent(内置 Contract v2,生成直写执行包) 使用 Task 调用 `context-agent`,参数: - `chapter` - `project_root` - `storage_path=.webnovel/` - `state_file=.webnovel/state.json` 硬要求: - 若 `state` 或大纲不可用,立即阻断并返回缺失项。 - 输出必须同时包含: - 7 板块任务书(目标/冲突/承接/角色/场景约束/伏笔/追读力); - Contract v2 全字段(目标/阻力/代价/本章变化/未闭合问题/开头类型/情绪节奏/信息密度/过渡章判定/追读力设计); - Step 2A 可直接消费的“写作执行包”(章节节拍、不可变事实清单、禁止事项、终检清单)。 - 合同与任务书出现冲突时,以“大纲与设定约束更严格者”为准。 输出: - 单一“创作执行包”(任务书 + Contract v2 + 直写提示词),供 Step 2A 直接消费,不再拆分独立 Step 1.5。 ### Step 2A:正文起草 执行前必须加载: ```bash cat "${SKILL_ROOT}/../../references/shared/core-constraints.md" ``` 硬要求: - 只输出纯正文到 `正文/第{chapter_padded}章.md`。 - 默认按 2000-2500 字执行;若大纲为关键战斗章/高潮章/卷末章或用户明确指定,则按大纲/用户优先。 - 禁止占位符正文(如 `[TODO]`、`[待补充]`)。 - 保留承接关系:若上章有明确钩子,本章必须回应(可部分兑现)。 输出: - 章节草稿(可进入 Step 2B 或 Step 3)。 ### Step 2B:风格适配(`--fast` / `--minimal` 跳过) 执行前加载: ```bash cat "${SKILL_ROOT}/references/style-adapter.md" ``` 硬要求: - 只做表达层转译,不改剧情事实、事件顺序、角色行为结果、设定规则。 - 对“模板腔、说明腔、机械腔”做定向改写,为 Step 4 留出问题修复空间。 输出: - 风格化正文(覆盖原章节文件)。 ### Step 3:审查(auto 路由,必须由 Task 子代理执行) 执行前加载: ```bash cat "${SKILL_ROOT}/references/step-3-review-gate.md" ``` 调用约束: - 必须用 `Task` 调用审查 subagent,禁止主流程伪造审查结论。 - 可并行发起审查,统一汇总 `issues/severity/overall_score`。 - 默认使用 `auto` 路由:根据“本章执行合同 + 正文信号 + 大纲标签”动态选择审查器。 核心审查器(始终执行): - `consistency-checker` - `continuity-checker` - `ooc-checker` 条件审查器(`auto` 命中时执行): - `reader-pull-checker` - `high-point-checker` - `pacing-checker` 模式说明: - 标准/`--fast`:核心 3 个 + auto 命中的条件审查器 - `--minimal`:只跑核心 3 个(忽略条件审查器) 审查指标落库(必做): ```bash # 统一入口 webnovel.py:无需 cd / PYTHONPATH,且自动注入 --project-root python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" index save-review-metrics --data '@review_metrics.json' ``` 硬要求: - `--minimal` 也必须产出 `overall_score`。 - 未落库 `review_metrics` 不得进入 Step 5。 ### Step 4:润色(问题修复优先) 执行前必须加载: ```bash cat "${SKILL_ROOT}/references/polish-guide.md" cat "${SKILL_ROOT}/references/writing/typesetting.md" ``` 执行顺序: 1. 修复 `critical`(必须) 2. 修复 `high`(不能修复则记录 deviation) 3. 处理 `medium/low`(按收益择优) 4. 执行 Anti-AI 与 No-Poison 全文终检(必须输出 `anti_ai_force_check: pass/fail`) 输出: - 润色后正文(覆盖章节文件) - 变更摘要(至少含:修复项、保留项、deviation、`anti_ai_force_check`) ### Step 5:Data Agent(状态与索引回写) 使用 Task 调用 `data-agent`,参数: - `chapter` - `chapter_file="正文/第{chapter_padded}章.md"` - `review_score=Step 3 overall_score` - `project_root` - `storage_path=.webnovel/` - `state_file=.webnovel/state.json` 执行后检查(最小白名单): - `.webnovel/state.json` - `.webnovel/index.db` - `.webnovel/summaries/ch{chapter_padded}.md` - `.webnovel/observability/data_agent_timing.jsonl`(观测日志) 性能要求: - 读取 timing 日志最近一条; - 当 `TOTAL > 30000ms` 时,输出最慢 2-3 个环节与原因说明。 债务利息: - 默认关闭,仅在用户明确要求或开启追踪时执行(见 `step-5-debt-switch.md`)。 ### Step 6:Git 备份(可失败但需说明) ```bash git add . git commit -m "Ch{chapter_num}: {title}" ``` 规则: - 若 commit 失败,必须给出失败原因与未提交文件范围。 ## 充分性闸门(必须通过) 未满足以下条件前,不得结束流程: 1. 章节正文文件存在且非空:`正文/第{chapter_padded}章.md` 2. Step 3 已产出 `overall_score` 且 `review_metrics` 成功落库 3. Step 4 已处理全部 `critical`,`high` 未修项有 deviation 记录 4. Step 4 的 `anti_ai_force_check=pass`(基于全文检查;fail 时不得进入 Step 5) 5. Step 5 已回写 `state.json`、`index.db`、`summaries/ch{chapter_padded}.md` 6. 若开启性能观测,已读取最新 timing 记录并输出结论 ## 验证与交付 执行检查: ```bash test -f "${PROJECT_ROOT}/.webnovel/state.json" test -f "${PROJECT_ROOT}/正文/第${chapter_padded}章.md" test -f "${PROJECT_ROOT}/.webnovel/summaries/ch${chapter_padded}.md" python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" index get-recent-review-metrics --limit 1 tail -n 1 "${PROJECT_ROOT}/.webnovel/observability/data_agent_timing.jsonl" || true ``` 成功标准: - 章节文件、摘要文件、状态文件齐全且内容可读。 - 审查分数可追溯,`overall_score` 与 Step 5 输入一致。 - 润色后未破坏大纲与设定约束。 ## 失败处理(最小回滚) 触发条件: - 章节文件缺失或空文件; - 审查结果未落库; - Data Agent 关键产物缺失; - 润色引入设定冲突。 恢复流程: 1. 仅重跑失败步骤,不回滚已通过步骤。 2. 常见最小修复: - 审查缺失:只重跑 Step 3 并落库; - 润色失真:恢复 Step 2A 输出并重做 Step 4; - 摘要/状态缺失:只重跑 Step 5; 3. 重新执行“验证与交付”全部检查,通过后结束。