Skip to content
Writing
Skill

/webnovel-write

产出可发布章节,完整执行上下文→起草→审查→润色→提交→备份。

From plugin
webnovel-writer
6.4k8 skills4 agents
Install
$ npx -y skills add lingfengqaq/webnovel-writer --skill webnovel-write --agent claude-code

How it fires

How this skill gets triggered: by you, by Claude, or both.

  • Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
  • You can call itInvoke it directly when you want it.
  • Slash command/webnovel-write

Context preview

The summary Claude sees to decide when to auto-load this skill.

产出可发布章节,完整执行上下文→起草→审查→润色→提交→备份。

SKILL.md

webnovel-write.SKILL.md
name: webnovel-write
description: 产出可发布章节,完整执行上下文→起草→审查→润色→提交→备份。
allowed-tools: Read Write Edit Grep Bash Agent AskUserQuestion
argument-hint: "[章号] [--fast|--minimal]"

写章流程

目标

产出可发布章节到 `正文/第{NNNN}章-{title}.md`。默认 2000-2500 字,用户/大纲另有要求时从之。

模式

| 模式 | 流程 | |------|------| | 默认 | 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 |

硬规则

  • 禁止并步、跳步、伪造审查
  • 必须使用 `Agent` 工具调用指定 subagent;不得用主流程口头代替 subagent 输出
  • 审查只跑一轮;blocking issue 定点修复或经用户裁决后才进 Step 4/5
  • 失败只补跑失败步骤,不回退
  • 参考资料按步骤按需加载

优先级

用户要求 > 状态机硬门槛 > 项目约束(总纲/设定/记忆)> skill 流程 > reference 建议

CSV 检索(Step 2 按需)

python -X utf8 "${SCRIPTS_DIR}/reference_search.py" --skill write --table {表名} --query "{关键词}" --genre {题材}

触发条件:新角色→命名规则,战斗→场景写法,多角色对话→写作技法,情感描写→写作技法,高频桥段→场景写法。

执行流程

准备:预检

export WORKSPACE_ROOT="${CLAUDE_PROJECT_DIR:-$PWD}"
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` 的参考摘要继承。

写作任务书排序必须固定为: 1. 本章硬性约束:`chapter_directive.goal/time_anchor/chapter_span/countdown/chapter_end_open_question` 2. CBN/CPNs/CEN 与 `must_cover_nodes` 3. 本章禁区:`forbidden_zones`,违反即不通过 4. 风格指引:reasoning、主角卡 OOC 警戒、anti_patterns 5. 场景写法补充:`dynamic_context`,仅作风格参考,不能覆盖章纲约束

Step 1:context-agent 生成写作任务书

必须使用 `Agent` 工具调用 `context-agent`,不得由主流程自行整理任务书。

Use the Agent tool to run `webnovel-writer:context-agent`.

Task:

  • chapter={chapter_num}
  • project_root=${PROJECT_ROOT}
  • scripts_dir=${SCRIPTS_DIR}
  • storage_path=${PROJECT_ROOT}/.webnovel
  • state_file=${PROJECT_ROOT}/.webnovel/state.json(projection/read-model,仅兼容读取)
  • 先 research,再按 本章硬性约束 → CBN/CPNs/CEN → 本章禁区 → 风格指引 → dynamic_context 补充参考 的顺序输出五段写作任务书。
  • 上下文不足时返回 blocker。

产物:一份写作任务书,能独立支撑 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`,不得在最终报告中静默。

Step 2:起草正文

只根据任务书起草。不加载 core-constraints/anti-ai-guide(已内化到任务书)。只输出纯正文,无占位符。有结构化节点时围绕 CBN→CPNs→CEN 展开。中文思维写作。

Step 3:审查

必须使用 `Agent` 工具调用 `reviewer`,不得由主流程伪造审查 JSON。

Use the Agent tool to run `webnovel-writer:reviewer`.

Task:

  • chapter={chapter_num}
  • chapter_file=${CHAPTER_FILE}
  • project_root=${PROJECT_ROOT}
  • scripts_dir=${SCRIPTS_DIR}
  • 只返回严格的 reviewer schema JSON,不写任何文件。
  • 不评分、不口头总结。

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。

`--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')"

Step 4:润色

`references/polish-guide.md` 区段读:先 `Grep` 匹配 `^#{1,3} ` 定位锚点行号,再 `Read` 的 offset/limit 取段——主路径取 `## 2. 执行顺序(必须按序)`;Anti-AI 终检单独区段取 `## 2A. Anti-AI 检测细则` 与 `## Phase 1 增补:Anti-AI 规范(7层,原版)`(词库段),不全文读。`references/writing/typese

Read more
Ships withwebnovel-writer

一个跑在 Claude Code 上的长篇网文创作插件。从初始化设定、规划卷纲,到写章、审查、沉淀记忆、查询状态,再到一个只读的可视化面板——整条创作流程都给你串好了。 它想解决的其实就一件事:让 AI 写到几百章,依然记得住设定、接得住伏笔、守得住大纲。 一句话定位:这是一套面向长篇连载的一致性系统,不是写完就忘的一次性生成器。 下一代 v7 设计已经进入公开意见征集期,欢迎阅读 Discussions #118:v7 设计公示 并留下反馈。只看 Issue 区的用户也可以从 Issue #119:v7

Get the whole plugin