with one click
webnovel-write
产出可发布章节。单章撰写,三模式:默认/--fast/--minimal。批量模式请用 webnovel-batch。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Menu
产出可发布章节。单章撰写,三模式:默认/--fast/--minimal。批量模式请用 webnovel-batch。
Install with Codex or Claude Copy this prompt, paste it into Codex, Claude, or another assistant, and let it review the skill page and install it for you.
Based on SOC occupation classification
AI-powered writing toolkit — Web novel, Short story, Technical blog, Publishing automation / AI 驱动写作工具包 — 网文、短篇、技术博文、发布自动化
纯 AI 生图制作网文封面 & 技术博客封面。网文:600×800 竖版存入 作品信息/。技术博客:800×600 横版存入 博文/{系列}/cover.png。
Publish novel chapters from local Markdown files to the Fanqie Novel writer backend via browser automation. Supports single/batch/scheduled publish with login state persistence.
短篇写作工艺约束层。禁用词 + 过渡词管理。写/审时加载项目级工艺约束.md。
拆解盐选短篇参考文,提取钩子设计、悬念铺设、节奏控制、收束手法等写作模式。触发词:拆这篇、拆解、分析这个短篇、做拆解、帮我把这篇拆了、提取模式
中短篇初始化。定选题→出设定文件→机械门禁→盲审→零问题交付。
| name | webnovel-write |
| description | 产出可发布章节。单章撰写,三模式:默认/--fast/--minimal。批量模式请用 webnovel-batch。 |
| allowed-tools | Read Write Edit Grep Bash Agent AskUserQuestion |
| argument-hint | [章号] [--fast|--minimal] |
产出可发布章节到 正文/第{NNNN}章-{title}.md。默认 2500-3500 字,用户/大纲另有要求时从之。
前置加载:写章/审查前必须先 skill("webnovel-craft") 加载工艺约束。webnovel-craft 定义跨书通用强标准(句长、句式、感官、情绪、五维度),本书 设定集/行文约束集.md 只追加本书特殊约束。
| 模式 | 流程 |
|---|---|
| 默认 | Step 1→2→3→4→5→6 |
--fast | Step 1→2→3(轻量)→4→5→6 |
--minimal | Step 1→2→3(写 no-review artifact)→4(仅排版)→5→6 |
批量模式(多章自动推进至卷末)请使用 /webnovel-batch N。--stream 已迁移至 webnovel-batch。
--fast / --minimal:同步执行。主对话直跑全链路,单章完成即返回。webnovel-batch skill--stream 批量架构已独立为 webnovel-batch 技能,此处不再维护。功能:主对话启动串行循环,逐章派发独立撰写 agent + 持久审查 agent,后台运行、断点续跑。命令:/webnovel-batch N。
Agent 工具调用指定 subagent;不得用主流程口头代替 subagent 输出用户要求 > 状态机硬门槛 > 项目约束(总纲/设定/记忆)> skill 流程 > reference 建议
python -X utf8 "${SCRIPTS_DIR}/reference_search.py" --skill write --table {表名} --query "{关键词}" --genre {题材}
触发条件:新角色→命名规则,战斗→场景写法,多角色对话→写作技法,情感描写→写作技法,高频桥段→场景写法。
export WORKSPACE_ROOT="${CLAUDE_PROJECT_DIR:-${OPENCODE_PROJECT_DIR:-$PWD}}"
export CLAUDE_PLUGIN_ROOT="${CLAUDE_PLUGIN_ROOT:-${OPENCODE_PLUGIN_ROOT:-}}"
export SCRIPTS_DIR="${CLAUDE_PLUGIN_ROOT:?}/scripts"
export SKILL_ROOT="${CLAUDE_PLUGIN_ROOT:?}/skills/webnovel-write"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" preflight
export PROJECT_ROOT="$(python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" where)"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" placeholder-scan --format text
genre 从 .webnovel/state.json 的初始化配置快照读取,用于刷新合同树;写前主链真源仍是 .story-system/ 合同。调用 story-system 前必须先从详细大纲解析真实本章目标,禁止传 {章纲目标}、第N章章纲目标 等占位 query。
GENRE="$(python -X utf8 -c "import json,sys; s=json.load(open('${PROJECT_ROOT}/.webnovel/state.json',encoding='utf-8')); pi=s.get('project_info',{}); print(pi.get('genre') or s.get('project',{}).get('genre',''))")"
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" \
story-system "${CHAPTER_GOAL}" --genre "${GENRE}" --chapter {chapter_num} --persist --emit-runtime-contracts --format both
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" \
write-gate --chapter {chapter_num} --stage prewrite --format json
必备文件:MASTER_SETTING.json(调性/禁忌)、volume_{NNN}.json(卷级节奏)、chapter_{NNN}.review.json(必须节点/禁区)。缺失则阻断。
chapter_{NNN}.json 必须优先检查顶层 chapter_directive。chapter_focus 只能来自 chapter_directive.goal 或真实 query,不得从 dynamic_context 的参考摘要继承。
写作任务书排序必须固定为:
chapter_directive.goal/time_anchor/chapter_span/countdown/chapter_end_open_questionmust_cover_nodesforbidden_zones,违反即不通过dynamic_context,仅作风格参考,不能覆盖章纲约束必须使用 Agent 工具调用 context-agent,不得由主流程自行整理任务书。
Use the Agent tool to run webnovel-writer:context-agent.
Task:
产物:一份写作任务书,能独立支撑 Step 2 起草。
调用后主流程必须记录 SubagentRun 汇总(仅供最终报告使用):
{
"name": "context-agent",
"user_label": "整理写作依据",
"status": "completed | partial | failed | skipped",
"problems": [],
"auto_handled": [],
"needs_user_action": false,
"duration_ms": 0,
"outputs": []
}
上下文不足、legacy fallback、伏笔数据缺失、任务书不完整或耗时异常,必须写入 problems / auto_handled,不得在最终报告中静默。
只根据任务书起草。不加载 core-constraints/anti-ai-guide(已内化到任务书)。只输出纯正文,无占位符。有结构化节点时围绕 CBN→CPNs→CEN 展开。中文思维写作。
审查分两阶段:先跑量化扫描脚本(机械),再跑 reviewer agent(定性)。
阶段一:量化扫描
python -X utf8 "${SKILL_ROOT}/../webnovel-craft/scripts/prose_scanner.py" "${CHAPTER_FILE}"
输出 JSON 到 stdout。脚本只做量化,不存盘。blocking_count > 0 的项必须在阶段二前定点修复。
阶段二:reviewer agent 定性审查
必须使用 Agent 工具调用 reviewer,不得由主流程伪造审查 JSON。
Use the Agent tool to run webnovel-writer:reviewer.
Task:
设定集/行文约束集.md 第七节逐项定性判断):
reviewer 只返回 JSON;主流程负责用 Write 把返回的 JSON 写入 ${PROJECT_ROOT}/.webnovel/tmp/review_results.json(reviewer 不持 Write,是这份 artifact 的非写入方)。随后必须运行 review-pipeline;review-pipeline 会把同一路径覆盖为标准 review_result artifact(含 blocking_count),供 precommit gate 与后续提交命令使用。
调用后主流程必须记录 SubagentRun 汇总(仅供最终报告使用):
{
"name": "reviewer",
"user_label": "写作检查",
"status": "completed | partial | failed | skipped",
"problems": [],
"auto_handled": [],
"needs_user_action": false,
"duration_ms": 0,
"outputs": []
}
reviewer 跳过、失败、输出不完整、--minimal 写 no-review artifact、blocking issue、维度跳过或耗时异常,必须写入 problems / auto_handled,不得在最终报告中静默。
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" review-pipeline \
--chapter {chapter_num} \
--review-results "${PROJECT_ROOT}/.webnovel/tmp/review_results.json" \
--metrics-out "${PROJECT_ROOT}/.webnovel/tmp/review_metrics.json" \
--report-file "审查报告/第{chapter_num}章审查报告.md" \
--save-metrics
审查只跑一轮,reviewer 只调用一次。blocking=true 的问题在不改剧情、不破设定的前提下定点修复后直接进 Step 4,不重新调用 reviewer;确实无法修复的 blocking 问题用 AskUserQuestion 让用户裁决。非 blocking issue 交给 Step 4 处理。--fast 只检查 setting/timeline/continuity。
审查报告(AI产出)是唯一的持久化 artifact。脚本只出数据不存盘。
审查报告/第{chapter_num}章审查报告.md审查报告/第{chapter_num}章审查报告_二审.md审查报告/第{chapter_num}章审查报告_三审.md# 首轮
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" review-pipeline \
--chapter {chapter_num} \
--review-results "${PROJECT_ROOT}/.webnovel/tmp/review_results.json" \
--metrics-out "${PROJECT_ROOT}/.webnovel/tmp/review_metrics.json" \
--report-file "审查报告/第{chapter_num}章审查报告.md" \
--save-metrics
# 二审(修复后)
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" review-pipeline \
--chapter {chapter_num} \
--review-results "${PROJECT_ROOT}/.webnovel/tmp/review_results.json" \
--metrics-out "${PROJECT_ROOT}/.webnovel/tmp/review_metrics.json" \
--report-file "审查报告/第{chapter_num}章审查报告_二审.md" \
--save-metrics
--minimal 不调用 reviewer 与 review-pipeline,但必须覆盖写入本章新的 no-review review_results.json(禁止复用旧 artifact),使 Step 5 提交链有有效 --review-result(成功标准“审查已落库”对 --minimal 的豁免仍成立):
python -X utf8 -c "import json,os; from pathlib import Path; root=Path(os.environ['PROJECT_ROOT']); ch=int('{chapter_num}'); p=root/'.webnovel'/'tmp'/'review_results.json'; p.parent.mkdir(parents=True,exist_ok=True); p.write_text(json.dumps({'chapter':ch,'issues':[],'issues_count':0,'blocking_count':0,'has_blocking':False,'summary':'minimal mode: reviewer skipped by user-selected --minimal flow','review_skipped':True,'review_mode':'minimal'},ensure_ascii=False,indent=2),encoding='utf-8')"
references/polish-guide.md 区段读:先 Grep 匹配 ^#{1,3} 定位锚点行号,再 Read 的 offset/limit 取段——主路径取 ## 2. 执行顺序(必须按序);Anti-AI 终检单独区段取 ## 2A. Anti-AI 检测细则 与 ## Phase 1 增补:Anti-AI 规范(7层,原版)(词库段),不全文读。references/writing/typesetting.md、references/style-adapter.md 短文件,全文读。
Step 2 起草前可选择性加载 references/chapter-structure-guide.md(章节结构、致命错误、写作检查清单),帮助达到章节结构标准。
顺序:修复非 blocking issue → 风格适配 → 排版 → Anti-AI 终检。
只改表达不改事实。anti_ai_force_check=fail 时不进 Step 5。--minimal 仅排版。
必须使用 Agent 工具调用 data-agent,产出 fulfillment_result / disambiguation_result / extraction_result 三份 JSON,并复用 Step 3 的 review_results。
Use the Agent tool to run webnovel-writer:data-agent.
Task:
artifact 字段 schema 由 data-agent 自身定义、runtime validator 校验;主流程只检查文件存在与 schema,不重写、不补写、不口头替代。
调用后主流程必须记录 SubagentRun 汇总(仅供最终报告使用):
{
"name": "data-agent",
"user_label": "保存本章故事事实",
"status": "completed | partial | failed | skipped",
"problems": [],
"auto_handled": [],
"needs_user_action": false,
"duration_ms": 0,
"outputs": []
}
三份 artifact 写入状态、schema 不合格、pending 消歧、长时间无进展或输出不完整,必须写入 problems;自动重跑或降级处理必须写入 auto_handled。
先跑 precommit gate:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" \
write-gate --chapter {chapter_num} --stage precommit --format json
precommit 通过后,运行提交前只读 git diff 变更面校验(写入所有权 sanity check,只读、不 stage、不提交):
if git -C "${PROJECT_ROOT}" rev-parse --is-inside-work-tree >/dev/null 2>&1; then
git -C "${PROJECT_ROOT}" diff --name-status -- .
git -C "${PROJECT_ROOT}" diff --check -- .
fi
变更面不得出现插件目录、其他书项目、其他章节正文或不属于本章流程的手写状态文件;git diff 只覆盖 git 可见文件,SQLite / .webnovel/ 内部语义由 5.3 postcommit 与 runtime 只读查询验证。若项目根不是 git worktree,记录“跳过 git diff 校验”,不得因此跳过 precommit gate。本步只读,禁止在此执行 git add/git commit。
校验通过后运行 chapter-commit:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" chapter-commit \
--chapter {chapter_num} \
--review-result "${PROJECT_ROOT}/.webnovel/tmp/review_results.json" \
--fulfillment-result "${PROJECT_ROOT}/.webnovel/tmp/fulfillment_result.json" \
--disambiguation-result "${PROJECT_ROOT}/.webnovel/tmp/disambiguation_result.json" \
--extraction-result "${PROJECT_ROOT}/.webnovel/tmp/extraction_result.json"
自动判定:blocking_count>0 或 missed_nodes 非空 或 pending 非空 → rejected,否则 accepted。
projection_status 五项(state/index/summary/memory/vector)全部 done 或 skipped。
chapter_status 由 projection writer 自动推进:accepted→committed,rejected→rejected。
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" \
write-gate --chapter {chapter_num} --stage postcommit --format json
commit 未生成→重跑 5.2。projection 失败→只补跑 projection,不回退 Step 1-4。
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" \
projections retry --chapter {chapter_num} --format json
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" backup \
--chapter {chapter_num} \
--chapter-title "{title}"
备份必须以解析后的 PROJECT_ROOT 为准,禁止从工作区父目录执行裸全量 Git add,避免把书项目仓库作为父仓库的嵌入仓库/submodule 加入。
开始写章前先用作者语言说明本次目标、主要阶段和是否需要守在旁边,不承诺固定耗时。过程提示只说当前在做什么和会产生什么,不直接输出原始 JSON、traceback 或长命令日志;技术详情写入 .webnovel/logs/run_last.log:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" run-log \
--event write-start \
--payload-json "{\"chapter\": {chapter_num}, \"mode\": \"{mode}\"}" \
--format text
写章过程节点(最多 6 个):
重复执行同一章时,先读取可信断点:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" run-ledger write-resume \
--chapter {chapter_num} \
--mode "{mode}" \
--format json
run-ledger write-resume 只给续跑建议,不自动覆盖文件。它会根据正文、审查结果、data artifacts、commit、projection 和备份状态判断从哪里继续。正文被手动改过、章纲更新晚于正文、本章已 accepted 又重跑时,必须停下用有限选项询问:沿用当前正文 / 重新起草 / 只查看状态;不得覆盖作者手改。
每个关键步骤完成后记录 run-ledger record-write-step,至少记录 step、status、输入/输出文件路径、problems、auto_handled 和 duration_ms,供下一次续跑和最终报告使用。
少打扰确认策略:默认继续推进;只有创作方向、事实一致性、文件覆盖风险或 blocking issue 无法定点处理时才问。需要用户裁决时给 2-3 个有限选项,并说明每个选项影响。
卡住时必须说明卡点、已完成内容和恢复建议:例如“正文和审查报告已保留,保存本章故事事实失败;重新运行 /webnovel-write {chapter_num} 会从 data-agent 继续”。不可恢复故障才在最终报告提示 .webnovel/logs/run_last.log;平时只保留日志,不打扰作者。
收尾必须调用作者报告 helper,优先以 helper 输出组织最终回复:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" user-report \
--stage write \
--chapter {chapter_num} \
--format text
--minimal 除外)--minimal 除外)write-gate 的 prewrite / precommit / postcommit 均通过审查缺失→重跑 Step 3。摘要/状态/记忆缺失→重跑 Step 5。润色失真→回 Step 4 修复后重跑 Step 5。
最终回复必须面向作者,不输出原始 JSON、traceback 或长命令日志。使用固定三段式,并以一句总状态开头:
总状态:已完成 / 部分完成 / 需要你处理 / 未完成。
一、产生的文件与完成情况
- ...
二、过程中遇到的问题与异常耗时
- 已自动处理:...
- 建议确认:...
- 必须处理:...
三、下一步建议
- ...
必须汇报:
.webnovel/tmp/review_results.json。.webnovel/tmp/fulfillment_result.json。.webnovel/tmp/disambiguation_result.json。.webnovel/tmp/extraction_result.json。.story-system/commits/chapter_{NNN}.commit.json。状态规则:
chapter-commit rejected、任一 write-gate failed、projection failed 时,最终状态不得写“已完成”。--fast 和 --minimal 的跳过项必须说明;--minimal 跳过审查时归入“已自动处理”或“建议确认”,不得假装已完成完整审查。异常分类:
下一步建议必须使用任务化语言 + 可复制命令,例如:
- 接下来可以写下一章:
/webnovel-write {next_chapter}
不写 token 统计;如需排查故障,只给日志路径或建议运行 /webnovel-doctor。