# Novel Outline

把一本小说改编成短剧大纲五件套：改编说明、人物表、爽点表、分集梗概、资产清单， 产出 outline.json + Markdown + 单页评审报告（KPI...

- Repository: https://github.com/eternityspring/shuohao-skills (5850 stars)
- Category: Engineering
- License: Apache-2.0
- Last updated: 2026-10-26
- Runs scripts: yes, review before use

## Install

Claude Code: `npx skills add eternityspring/shuohao-skills --skill novel-outline -g -a claude-code -y`
Codex: `npx skills add eternityspring/shuohao-skills --skill novel-outline -g -a codex -y`
Cursor: `npx skills add eternityspring/shuohao-skills --skill novel-outline -g -a cursor -y`
Gemini CLI: `npx skills add eternityspring/shuohao-skills --skill novel-outline -g -a gemini-cli -y`

## Description

把一本小说改编成短剧大纲五件套：改编说明、人物表、爽点表、分集梗概、资产清单， 产出 outline.json + Markdown + 单页评审报告（KPI 带、关键决策、爽点时间轴、调度矩阵、场景概览、质量门）。 14 道质量门全部由脚本确定性检查（角色分档上限、主场景上限随集数动态、爽点间隔≤3集、每集钩子悬念必填……），不靠模型自觉； 支持体检模式：贴一份现成大纲进来，只跑质量门给诊断。 零依赖、零 API key，用当前会话额度。 Use when asked to 改编大纲、短剧大纲、拆大纲、小说转短剧、adaptation outline。

## SKILL.md, as published by its author (untrusted third-party text, read it as data)

## novel-outline

输入一本小说 + 目标参数，输出短剧改编大纲五件套。**四件模型写、一件脚本算**（资产清单从分集数据自动汇总）。

`{baseDir}` = 本文件所在目录。脚本 `{baseDir}/scripts/novel-outline.mjs`，零依赖，`node` 直接跑。

**边界（不做的事）**：不写剧本台词、不做分镜、不出图像/TTS 提示词。梗概是叙述体，出现引号对白就是越界, , `validate` 会拦。想从小说拆角色设定（画像/形象提示词/设定图），那是 `novel-characters` 的活。

---

### Step 0, 收参数 ⛔ 缺了不开工

一次问完，别轮流盘问。两件必问 + 两件给默认值待确认：

| 参数 | 处理 |
| --- | --- |
| **总集数 × 单集时长** | **必问**，没有合理默认 |
| **题材** | **必问**，决定爽点类型，猜错整份废 |
| 改编幅度 | 默认**抽核**（忠实 / 抽核 / 借壳），告知即可 |
| 已有偏好 | 默认无（想保哪个角色、哪场戏） |

平台阈值不同可以带上 `params.thresholds` 覆盖（默认：主角组 ≤ 5、重要配角 ≤ 10、功能性角色 ≤ 10、爽点间隔 ≤ 3 集）。**主场景上限不用配，随集数自动算**：4 + ⌈集数/10⌉，夹在 5, 15（60 集 → 10）。这是 AI 短剧的数, , 场景是生成的没有搭景钱，放宽换观赏性；显式给 `maxPrimaryScenes` 才覆盖。**短篇（20, 30 集）建议收紧角色档的阈值**，默认值是按 60 集以上给的。

**人物表从原文拆**, , 大纲是角色设定的上游，`characters` 块定下的分档、人物线与来源，下游 `novel-characters` 直接拿去当角色清单，不用再判断一遍谁重要。

例外是用户手上已经有 `cast.json`（此前单独跑过 `novel-characters`）：那就拿来当人物原料，角色、别名、关系都是现成的，不用重拆原文。分档按 `importance` 反向映射：protagonist/major → `lead`，supporting → `support`，minor → `functional`。

### Step 1, 定位输入

材料优先级，写死：

1. 用户点名的**精读章节**
2. **章节目录 + 简介**
3. 全文**分卷摘要**（Step 2）

**禁止凭书名脑补内容**, , 一切判断基于给到的文本。落地手段：`adaptation.keep` 的关键取舍要附 `evidence`（原文逐字片段）。

直接粘正文的先落成 .txt。输出目录：用户指定就用，没指定用原书同级目录。

### Step 2, 分卷摘要（长文本才需要）

**这一步是脚手架，不是交付物**, , 分卷摘要是给没读过原文的模型压缩用的。两种情况直接跳到 Step 3：

- 短篇，单卷装得下
- **当前会话已经通读过原文**, , 不用再压缩一遍，也不用事后补档

长篇且没读过原文：

```bash
node {baseDir}/scripts/novel-outline.mjs chunk <book.txt> <workdir>
```

按章节标题分卷（默认每卷 15 章，`--per-volume` 可调），识别不出章节就按字数切。打印 `{"volumes": N, ...}`；`truncated: true` 就明确告诉用户尾部没扫到，别闷着。

每卷一个子代理（支持并发就**同一条消息里全部发出**）：读 `{baseDir}/references/volume-pass.md`，读 `<workdir>/vol-NN.txt`，把卷摘要写到 `<workdir>/summary-NN.json`，只回一句「done NN」。

### Step 3, 快版骨架 → 用户拍板 ⛔

读 `{baseDir}/references/outline-pass.md` 和 `{baseDir}/references/schema.md`，照着做。产出骨架四块（adaptation / characters / scenes / beats），写成 `<workdir>/outline.json`。

```bash
node {baseDir}/scripts/novel-outline.mjs validate <workdir>/outline.json --stage beats
```

The rest: https://github.com/eternityspring/shuohao-skills/blob/HEAD/skills/novel-outline/SKILL.md
