/webnovel-review
使用审查 Agent 评估章节质量,生成报告并写回审查指标。
$ npx -y skills add lingfengqaq/webnovel-writer --skill webnovel-review --agent claude-codeHow 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-review
Context preview
The summary Claude sees to decide when to auto-load this skill.
使用审查 Agent 评估章节质量,生成报告并写回审查指标。
SKILL.md
webnovel-review.SKILL.mdname: webnovel-review
description: 使用审查 Agent 评估章节质量,生成报告并写回审查指标。
allowed-tools: Read Grep Write Edit Bash Agent AskUserQuestion
argument-hint: "[章号或范围,如 5 或 1-5]"
Quality Review Skill
目标
- 解析真实书项目根,调度统一 `reviewer` 完成结构化审查并落库。
- 主链事实以 `.story-system/reviews/chapter_{NNN}.review.json` 与 latest accepted `CHAPTER_COMMIT` 为准;`.webnovel/state.json` 仅为兼容投影。
- 有 `blocking=true` 问题时交用户裁决。
红线
- 必须通过 `Agent` 工具调用 `reviewer`,禁止主流程伪造结论或口头总结代替 subagent 输出。
- reviewer 只返回严格 JSON;主流程负责把返回值写入 `${PROJECT_ROOT}/.webnovel/tmp/review_results.json`,随后由 `review-pipeline` 覆盖为标准 review_result artifact。
- 报告与 metrics 只由 `review-pipeline --save-metrics` 产出;主流程不伪造 `overall_score`。
- 项目根不合法 / 缺 `.webnovel/state.json` / 缺待审正文 → 阻断。
执行流程
Step 1:解析项目根
export WORKSPACE_ROOT="${CLAUDE_PROJECT_DIR:-$PWD}"
export SCRIPTS_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" where)"`PROJECT_ROOT` 必须包含 `.webnovel/state.json`,否则阻断。
Step 2:目标章缺合同时刷新 runtime 合同
目标章缺 runtime 合同时,先用详细大纲的真实本章目标刷新(`CHAPTER_GOAL` 禁止 `{章纲目标}` / `第N章章纲目标` 占位文本):
GENRE="$(python -X utf8 -c "import json; 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 bothStep 3:按需加载参考
| Trigger | Reference | |---------|-----------| | always | `../../references/shared/core-constraints.md` | | always | `../../references/review-schema.md` | | 审查涉及爽点或钩子 | `../../references/shared/cool-points-guide.md` | | 审查涉及多线交织 | `../../references/shared/strand-weave-pattern.md` | | blocking issue 需用户裁决 (Step 8) | `../../references/review/blocking-override-guidelines.md` |
Step 4:加载投影状态与待审正文
cat "${PROJECT_ROOT}/.webnovel/state.json"确认当前章节号与对应正文文件;缺正文或缺兼容状态文件立即阻断。
Step 5:调用统一审查 Agent
必须通过 `Agent` 工具调用 `reviewer`。审查方法与维度细则由 reviewer 自带,本 Skill 不展开。
Use the Agent tool to run `webnovel-writer:reviewer`.
Prompt: chapter={chapter_num}; chapter_file={chapter_file}; project_root=${PROJECT_ROOT}; scripts_dir=${SCRIPTS_DIR}。严格输出 reviewer schema JSON,不评分,不口头总结。reviewer 返回后,主流程把严格 JSON 写入 `${PROJECT_ROOT}/.webnovel/tmp/review_results.json`(reviewer 不持 Write,是这份 artifact 的非写入方)。`review-pipeline` 必须把同一路径覆盖为标准 review_result artifact(含 `blocking_count`)。
调用后主流程必须记录 `SubagentRun` 汇总(仅供最终报告使用):
{
"name": "reviewer",
"user_label": "写作检查",
"status": "completed | partial | failed | skipped",
"problems": [],
"auto_handled": [],
"needs_user_action": false,
"duration_ms": 0,
"outputs": []
}reviewer 跳过、失败、输出不完整、正文为空、维度跳过、blocking issue 或耗时异常,必须写入 `problems` / `auto_handled`,不得在最终报告中静默。
Step 6:生成报告并落库
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`review-pipeline --save-metrics` 同时完成报告生成、`review_metrics.json` 输出、`review_metrics` 表写入。阻断判断以 review_results 中的 `blocking=true` 为准。
Step 7:写入兼容审查记录
python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" update-state -- --add-review "{chapter_num}-{chapter_num}" "审查报告/第{chapter_num}章审查报告.md"兼容投影 / read model,不是写后事实真源。
Step 8:处理阻断
存在任意 `blocking=true` 问题时,用 `AskUserQuestion` 让用户裁决:
- 立即修复:输出返工清单,仅在用户明确授权下做最小修改。
- 仅保存报告,稍后处理:保留报告与指标记录,结束流程。
成功标准
1. 已解析真实书项目根。 2. 已通过 `reviewer` 输出结构化问题 JSON,落盘到 `.webnovel/tmp/review_results.json`。 3. 审查报告已生成,`review_metrics` 已写入 `index.db`,`review_metrics.json` 已输出。 4. 审查记录已写入 `.webnovel/state.json` 兼容投影。 5. 存在阻断问题时,用户已明确选择处理策略。
作者友好过程提示与恢复契约
审查开始前先说明本次会经历:定位待审正文 -> 刷新缺失合同 -> 写作检查 -> 生成报告和指标 -> 处理阻断裁决。过程提示用作者语言,不直接输出原始 JSON、traceback 或长命令日志;技术详情写入 `.webnovel/logs/run_last.log`:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" run-log \
--event review-progress \
--payload-json "{\"stage\": \"review\", \"chapter\": {chapter_num}}" \
--format text过程提示每次不超过两行,只说当前动作和影响,例如“正在生成审查报告:会把阻断问题和最值得改的建议放到顶部”。少打扰确认策略:无阻断时不询问;存在 blocking issue、缺待审正文、用户要求是否立即修改时才询问。
需要用户裁决时使用有限选项,并说明影响;例如立即修复 / 仅保存报告稍后处理 / 放弃本次审查。卡住时必须说明卡点、已完成内容和恢复建议,例如“reviewer 结果已保存,metrics 落库失败;重新运行 `/webnovel-review {chapter_num}` 会从报告落库继续”。
不可恢复故障才在最终报告提示 `.webnovel/logs/run_last.log`;平时只保留日志,不打扰作者。收尾必须调用作者报告 helper:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" user-report \
--stage review \
--chapter {chapter_num} \
--format text作者友好最终报告契约
最终回复必须面向作者,不输出原始 JSON、traceback 或长命令日志。使用固定三段式,并以一句总状态开头:
总状态:已完成 / 部分完成 / 需要你处理 / 未完成。
一、产生的文件与完成情况
- ...
二、过程中遇到的问题与异常耗时
- 已自动处理:...
- 建议确认:...
- 必须处理:...
三、下一步建议
- ...
必须汇报:
- 审查报告文件。
- `.webnovel/tmp/review_results.json`。
- `.webnovel/tmp/review_metrics.json`。
- `review_metrics` 是否落库。
- 阻断问题数量。
- 用户裁决状态。
- 如果无阻断,明确可以继续写作。
状态规则:
- 有 blocking 问题且用户未选择处理策略时,最终状态为“需要你处理”。
- 只保存报告、稍后处理时,最终状态为“需要你处理”或“部分完成”。
- reviewer 跳过、失败或输出不完整时,最终状态不得写“已完成”。
异常分类:
- 已自动处理:重复生成报告、覆盖本次旧审查中间文件、成功补写 metrics。
- 建议确认:非阻断但高收益修改建议、命名或设定细节建议看一眼。
- 必须处理:blocking issue、缺待审正文、reviewer 输出不完整、metrics 落库失败。
下一步建议必须使用任务化语言 + 可复制命令,例如:
- 审查无阻断,可以继续写下一章:
/webnovel-write {next_chapter}不写 token 统计;如需排查故障,只给日志路径或建议运行 `/webnovel-doctor`。
Read more
name: webnovel-review description: 使用审查 Agent 评估章节质量,生成报告并写回审查指标。 allowed-tools: Read Grep Write Edit Bash Agent AskUserQuestion argument-hint: "[章号或范围,如 5 或 1-5]"
Quality Review Skill
目标
- 解析真实书项目根,调度统一 `reviewer` 完成结构化审查并落库。
- 主链事实以 `.story-system/reviews/chapter_{NNN}.review.json` 与 latest accepted `CHAPTER_COMMIT` 为准;`.webnovel/state.json` 仅为兼容投影。
- 有 `blocking=true` 问题时交用户裁决。
红线
- 必须通过 `Agent` 工具调用 `reviewer`,禁止主流程伪造结论或口头总结代替 subagent 输出。
- reviewer 只返回严格 JSON;主流程负责把返回值写入 `${PROJECT_ROOT}/.webnovel/tmp/review_results.json`,随后由 `review-pipeline` 覆盖为标准 review_result artifact。
- 报告与 metrics 只由 `review-pipeline --save-metrics` 产出;主流程不伪造 `overall_score`。
- 项目根不合法 / 缺 `.webnovel/state.json` / 缺待审正文 → 阻断。
执行流程
Step 1:解析项目根
export WORKSPACE_ROOT="${CLAUDE_PROJECT_DIR:-$PWD}"
export SCRIPTS_DIR="${CLAUDE_PLUGIN_ROOT}/scripts"
export PROJECT_ROOT="$(python "${SCRIPTS_DIR}/webnovel.py" --project-root "${WORKSPACE_ROOT}" where)"`PROJECT_ROOT` 必须包含 `.webnovel/state.json`,否则阻断。
Step 2:目标章缺合同时刷新 runtime 合同
目标章缺 runtime 合同时,先用详细大纲的真实本章目标刷新(`CHAPTER_GOAL` 禁止 `{章纲目标}` / `第N章章纲目标` 占位文本):
GENRE="$(python -X utf8 -c "import json; 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 bothStep 3:按需加载参考
| Trigger | Reference | |---------|-----------| | always | `../../references/shared/core-constraints.md` | | always | `../../references/review-schema.md` | | 审查涉及爽点或钩子 | `../../references/shared/cool-points-guide.md` | | 审查涉及多线交织 | `../../references/shared/strand-weave-pattern.md` | | blocking issue 需用户裁决 (Step 8) | `../../references/review/blocking-override-guidelines.md` |
Step 4:加载投影状态与待审正文
cat "${PROJECT_ROOT}/.webnovel/state.json"确认当前章节号与对应正文文件;缺正文或缺兼容状态文件立即阻断。
Step 5:调用统一审查 Agent
必须通过 `Agent` 工具调用 `reviewer`。审查方法与维度细则由 reviewer 自带,本 Skill 不展开。
Use the Agent tool to run `webnovel-writer:reviewer`.
Prompt: chapter={chapter_num}; chapter_file={chapter_file}; project_root=${PROJECT_ROOT}; scripts_dir=${SCRIPTS_DIR}。严格输出 reviewer schema JSON,不评分,不口头总结。reviewer 返回后,主流程把严格 JSON 写入 `${PROJECT_ROOT}/.webnovel/tmp/review_results.json`(reviewer 不持 Write,是这份 artifact 的非写入方)。`review-pipeline` 必须把同一路径覆盖为标准 review_result artifact(含 `blocking_count`)。
调用后主流程必须记录 `SubagentRun` 汇总(仅供最终报告使用):
{
"name": "reviewer",
"user_label": "写作检查",
"status": "completed | partial | failed | skipped",
"problems": [],
"auto_handled": [],
"needs_user_action": false,
"duration_ms": 0,
"outputs": []
}reviewer 跳过、失败、输出不完整、正文为空、维度跳过、blocking issue 或耗时异常,必须写入 `problems` / `auto_handled`,不得在最终报告中静默。
Step 6:生成报告并落库
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`review-pipeline --save-metrics` 同时完成报告生成、`review_metrics.json` 输出、`review_metrics` 表写入。阻断判断以 review_results 中的 `blocking=true` 为准。
Step 7:写入兼容审查记录
python "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" update-state -- --add-review "{chapter_num}-{chapter_num}" "审查报告/第{chapter_num}章审查报告.md"兼容投影 / read model,不是写后事实真源。
Step 8:处理阻断
存在任意 `blocking=true` 问题时,用 `AskUserQuestion` 让用户裁决:
- 立即修复:输出返工清单,仅在用户明确授权下做最小修改。
- 仅保存报告,稍后处理:保留报告与指标记录,结束流程。
成功标准
1. 已解析真实书项目根。 2. 已通过 `reviewer` 输出结构化问题 JSON,落盘到 `.webnovel/tmp/review_results.json`。 3. 审查报告已生成,`review_metrics` 已写入 `index.db`,`review_metrics.json` 已输出。 4. 审查记录已写入 `.webnovel/state.json` 兼容投影。 5. 存在阻断问题时,用户已明确选择处理策略。
作者友好过程提示与恢复契约
审查开始前先说明本次会经历:定位待审正文 -> 刷新缺失合同 -> 写作检查 -> 生成报告和指标 -> 处理阻断裁决。过程提示用作者语言,不直接输出原始 JSON、traceback 或长命令日志;技术详情写入 `.webnovel/logs/run_last.log`:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" run-log \
--event review-progress \
--payload-json "{\"stage\": \"review\", \"chapter\": {chapter_num}}" \
--format text过程提示每次不超过两行,只说当前动作和影响,例如“正在生成审查报告:会把阻断问题和最值得改的建议放到顶部”。少打扰确认策略:无阻断时不询问;存在 blocking issue、缺待审正文、用户要求是否立即修改时才询问。
需要用户裁决时使用有限选项,并说明影响;例如立即修复 / 仅保存报告稍后处理 / 放弃本次审查。卡住时必须说明卡点、已完成内容和恢复建议,例如“reviewer 结果已保存,metrics 落库失败;重新运行 `/webnovel-review {chapter_num}` 会从报告落库继续”。
不可恢复故障才在最终报告提示 `.webnovel/logs/run_last.log`;平时只保留日志,不打扰作者。收尾必须调用作者报告 helper:
python -X utf8 "${SCRIPTS_DIR}/webnovel.py" --project-root "${PROJECT_ROOT}" user-report \
--stage review \
--chapter {chapter_num} \
--format text作者友好最终报告契约
最终回复必须面向作者,不输出原始 JSON、traceback 或长命令日志。使用固定三段式,并以一句总状态开头:
总状态:已完成 / 部分完成 / 需要你处理 / 未完成。 一、产生的文件与完成情况 - ... 二、过程中遇到的问题与异常耗时 - 已自动处理:... - 建议确认:... - 必须处理:... 三、下一步建议 - ...
必须汇报:
- 审查报告文件。
- `.webnovel/tmp/review_results.json`。
- `.webnovel/tmp/review_metrics.json`。
- `review_metrics` 是否落库。
- 阻断问题数量。
- 用户裁决状态。
- 如果无阻断,明确可以继续写作。
状态规则:
- 有 blocking 问题且用户未选择处理策略时,最终状态为“需要你处理”。
- 只保存报告、稍后处理时,最终状态为“需要你处理”或“部分完成”。
- reviewer 跳过、失败或输出不完整时,最终状态不得写“已完成”。
异常分类:
- 已自动处理:重复生成报告、覆盖本次旧审查中间文件、成功补写 metrics。
- 建议确认:非阻断但高收益修改建议、命名或设定细节建议看一眼。
- 必须处理:blocking issue、缺待审正文、reviewer 输出不完整、metrics 落库失败。
下一步建议必须使用任务化语言 + 可复制命令,例如:
- 审查无阻断,可以继续写下一章:
/webnovel-write {next_chapter}不写 token 统计;如需排查故障,只给日志路径或建议运行 `/webnovel-doctor`。
一个跑在 Claude Code 上的长篇网文创作插件。从初始化设定、规划卷纲,到写章、审查、沉淀记忆、查询状态,再到一个只读的可视化面板——整条创作流程都给你串好了。 它想解决的其实就一件事:让 AI 写到几百章,依然记得住设定、接得住伏笔、守得住大纲。 一句话定位:这是一套面向长篇连载的一致性系统,不是写完就忘的一次性生成器。 下一代 v7 设计已经进入公开意见征集期,欢迎阅读 Discussions #118:v7 设计公示 并留下反馈。只看 Issue 区的用户也可以从 Issue #119:v7
Other skills on webnovel-writer.
- /webnovel-dashboard
启动只读小说管理面板,查看项目状态、实体图谱与章节内容。
Open skill - /webnovel-doctor
对网文项目做只读体检/诊断(/webnovel-doctor)——检查目录、文件、JSON、SQLite、RAG 配置、依赖与 Dashboard 构建产物是否完整。
Open skill - /webnovel-init
深度初始化网文项目。通过分阶段交互收集完整创作信息,生成可直接进入规划与写作的项目骨架与约束文件。
Open skill - /webnovel-learn
从当前会话提取成功写作模式并写入 project_memory.json
Open skill - /webnovel-plan
基于总纲生成卷纲、时间线和章纲,并把新增设定增量写回现有设定集。
Open skill - /webnovel-query
查询项目设定、角色、力量体系、势力、伏笔等信息。支持紧急度分析与金手指状态查询。
Open skill

