# Novel Script

给 AI 短剧写剧本：把 novel-outline 的分集梗概落成结构化的场次 + 节拍流（动作节拍与台词行交替）， 台词逐句带说话人与语气，时长逐集按语速确定性折算。产出...

- 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-script -g -a claude-code -y`
Codex: `npx skills add eternityspring/shuohao-skills --skill novel-script -g -a codex -y`
Cursor: `npx skills add eternityspring/shuohao-skills --skill novel-script -g -a cursor -y`
Gemini CLI: `npx skills add eternityspring/shuohao-skills --skill novel-script -g -a gemini-cli -y`

## Description

给 AI 短剧写剧本：把 novel-outline 的分集梗概落成结构化的场次 + 节拍流（动作节拍与台词行交替）， 台词逐句带说话人与语气，时长逐集按语速确定性折算。产出 script.json + Markdown + 单页评审报告 （时长仪表 / 分集剧本 / 场次总表 / 按角色聚合的台词本，含导出 JSON）。 剧本管戏，分镜管拍, , 本 skill 不分镜头、无镜号、不写生成提示词，那些是下一层分镜 skill 的活。 10 道质量门全部由脚本确定性检查（每集时长 ±15%、单句 ≤35 字、说话人合法、钩子悬念落纸、 钩子具象前 3 拍内兑现（hookBeat 认领冷开场）、每场至少一个动作节拍、爽点认领、 角色/场景/光照/道具对账上游……）。 有 outline.json 就用 seed 预填每集骨架；给 --art 连光照状态一起对账。 零依赖、零 API key，用当前会话额度。 Use when asked to 写剧本、出剧本、台词、场次、写戏、screenwriting for AI short drama。

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

## novel-script

给 AI 短剧写**剧本**。**前提刻在骨子里：剧本管戏，分镜管拍**, , 「爽不爽」和「怎么拍」是两种迭代节奏，台词要反复推翻重写，绑上镜头分解每改一句都得重排镜头。所以这层只有集、场次、节拍流，没有镜号；镜头、首帧提示词、生成批次都是下一层分镜 skill 的活。

但有一条底线：**台词必须是结构化数据，不能写成散文**。每句台词是独立条目（说话人 + 台词 + 语气），动作是独立节拍, , 这是全部确定性检查的地基：

| 交付 | 解决什么 |
| --- | --- |
| 逐集时长预算 | 一集三分钟就是三分钟：台词按语速折算、动作按节拍估时，写超写欠当场拦下，不流到生成环节才发现 |
| 节拍流（动作 ⇄ 台词） | 台词直接对接 TTS 逐句生成；动作节拍就是画面要发生的事。混成散文两头都喂不进管线 |
| 每场至少一个动作节拍 | 纯对白的场是广播剧, , AI 生成时没有画面可写 |
| 开场钩子 + 结尾悬念 | 短剧的生死线，每集都要落在纸面；**钩子不是标签是第一拍**, , `hookBeat` 认领具象位置，必须落在全集前 3 拍内（冷开场） |
| 爽点认领 | 大纲说这一集有大爆点，剧本必须有戏认领它, , 防止改着改着把爆点改丢 |
| 上游对账 | 场景/光照/道具对 art.json、角色对 outline.json，写了美术没登记的光照状态当场报 |

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

**边界（不做的事）**：不分镜头、无镜号、不写画面生成提示词、不出图、不配乐, , 分镜层的活一件不碰。不改大纲结构（砍线合人是 `novel-outline` 的活）；不做角色和场景设定（`novel-characters` / `novel-art` 的活）。

---

### Step 0, 定输入与范围

**outline.json 是剧本的直接上游**（分集梗概、爽点落点、单集时长都在里面），标准流程从它开始。没有的话先问用户是否跑 `novel-outline`；用户坚持直接写，就问清集数与单集分钟数，手建骨架，对账门会明说跳过。

**一次写几集**：默认一批 ≤ 3 集。剧本是全管线改得最凶的一层，小批量出、快拍板、再往下写。用户明确要全剧也分批产出，每批过一次校验。

顺手带上（都可选，给了才对账/显示名字）：

- `--outline`：角色引用对账 + 爽点认领检查 + 报告里 C01 显示成人名
- `--art`：场景/光照状态/道具对账 + 报告里 S01 显示成场景名

### Step 1, seed 骨架

```bash
node {baseDir}/scripts/novel-script.mjs seed <outline.json> --eps 1-3 > <workdir>/script.json
```

确定性搬运：目标秒数（单集分钟 × 60）、钩子、悬念、该集爽点认领、候选场景与人物（进 `seedNote`）。**这些事实不要让模型重新想一遍。** scenes 留空，那才是写戏的活。

### Step 2, 逐集写戏

每集一份任务，能并发就并发。每份任务拿到：

- `{baseDir}/references/script-pass.md` 和 `{baseDir}/references/schema.md`（读它们，照着做）
- 该集的 seed 骨架 + 大纲里这一集的梗概/爽点/人群方案
- 该集用到的场景卡（art.json 里的锚点、光照状态）与角色信息（性情、说话方式, , 有 cast.json 更好）
- **前一集的结尾悬念**（这一集的开场要接得上）

核心要求都在 script-pass.md 里，最重的四条：**动作节拍只写常见动作**（挑担上船、搭手卸担这种 AI 见过千万次的；伸篙一挡、睫毛颤这种精巧动作生成必崩）；**时长预算先于一切**（三分钟一集约 50 个节拍，写完自己跑一遍 validate 看秒数）；台词口语、单句一口气、**谁的话像谁**（有 cast.json 就吃角色的性情与说话方式）；**每集第 1 拍冷开场给钩子的具象**（`hookBeat` 认领，门查位置），结尾一拍必须是悬念。

写完把 `seedNote` 删掉。

### Step 3, 校验 ⛔ 不能跳

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