# 创建新书

> 创建新书项目结构。当用户说"创建新书"、"开新书"、"写一本新书"、"开始写书"、"新建书籍"、"新小说"、"创建小说"、"开坑"、"写个新故事"等类似指令时，必须调用此技能。此技能会在当前工作目录或用户指定目录下创建完整的大纲/番外/正文文件夹结构，询问书籍类型、长度、种类等元数据，并自动生成设定文件。

- Skill: `jackal9384/skill` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jackal9384/skill`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jackal9384/skill/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: jackal9384 (https://skillmd.com/u/jackal9384)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/jackal9384/skill

---


# 创建新书

此技能用于创建一本新书的完整项目文件夹结构，收集书籍元数据，并自动生成项目配置文件（`项目信息.json`、`写作配置.json`、`设定.md`）。这是 WT 体系的**项目初始化入口**，所有后续技能依赖此技能创建的文件结构。

## 核心定位

- **项目骨架创建者**：在当前工作目录下创建完整的中文/English 文件夹结构（大纲/番外/正文），一键生成全部配置文件
- **元数据收集器**：以最小化交互收集书名、传播范围、篇幅、种类、润色模式五项核心元数据，生成 `项目信息.json` 作为全项目权威数据源
- **双轨润色初始化**：同时初始化大纲与正文两条润色轨道——后续大纲类技能读 `大纲.polish_mode`，正文类技能读 `正文.polish_mode`
- **NSFW 偏好预埋**：在 `项目信息.json` 中预埋 NSFW 偏好字段（空值），由 NSFW 技能首次调用时填充

## 关联文件

| 文件 | 位置 | 用途 | 读写 |
|------|------|------|------|
| `项目信息.json` | `大纲/` 或 `outline/` | 项目基本信息（书名/篇幅/种类等），全项目唯一权威数据源 | 写入 |
| `写作配置.json` | `大纲/` 或 `outline/` | 润色模式持久化（大纲/正文双轨） | 写入 |
| `设定.md` | `大纲/设定/` 或 `outline/settings/` | 项目设定初始骨架（世界观/核心/其他） | 写入 |

## 执行模式：计划模式

**调用此技能后，必须首先进入计划模式（EnterPlanMode）。**

1. 使用 `EnterPlanMode` 工具进入计划模式
2. 在计划中列出：
   - 目标目录（当前工作目录还是指定路径）
   - 将从用户收集的元数据项（书名/传播范围/篇幅/种类/润色模式/语言）
   - 将创建的文件夹结构与配置文件
   - 如已有项目存在——覆盖/合并策略
3. 等待用户批准计划后，再按计划逐步执行
4. 不要在进入计划模式前直接开始创建文件夹或询问用户问题

## 触发条件

当用户表达以下意图时，立即调用此技能：

- "创建新书"、"开新书"、"新建书籍"
- "写一本新书"、"开始写书"、"开个新坑"
- "新小说"、"创建小说"、"写个新故事"
- 任何表达"开始一本新书/新小说创作"的类似表述

---

## 执行步骤

### 步骤 1：确认目标目录与润色模式

询问用户三件事（如用户已在消息中提供则跳过对应询问）：

**Q1 — 书籍名称**：
```
📖 这本书叫什么名字？
```

**Q2 — 目标路径**：
```
📁 在当前工作目录下创建「{书名}」文件夹？
  • 是 — 直接在当前位置创建
  • 否 — 请指定目标路径
```

**Q3 — 润色模式**：
```
✏️ 请选择润色模式（后续创建人物/设定/剧情时对用户输入的加工深度）：

  • 轻度 — 保留用户原话，仅书面化、规范化书写
  • 中度 — 小幅优化用户原话（改动幅度 ≤60%）
  • 重度 — 仅保留原意，完全改写、润色、扩写内容
```

**己有项目冲突处理**：

如目标路径下已存在同名文件夹：

```
⚠️ 目标目录已存在「{书名}」文件夹。

  • 覆盖 — 删除旧项目，重新创建（旧项目数据将丢失）
  • 合并 — 保留已有文件，仅补充缺失的配置文件
  • 改名 — 换一个书名或目录名
  • 取消 — 不创建，返回

⚠ 覆盖操作不可逆，确定要继续吗？
```

| 用户选择 | 处理 |
|---------|------|
| 覆盖 | 删除旧目录 → 新建全部结构 |
| 合并 | 扫描已有文件 → 跳过已存在的文件/文件夹 → 补建缺失项 |
| 改名 | 重新询问书名或路径 |
| 取消 | 退出技能 |

**合并模式细节**：
- `项目信息.json` 已存在 → 读取现有数据，仅询问缺失项
- `写作配置.json` 已存在 → 保留原配置
- `设定.md` 已存在 → 保留原文件
- 文件夹结构已存在 → 跳过对应创建步骤

---

### 步骤 2：收集书籍元数据

逐项向用户询问以下书籍元数据。每次只问一项，不一次性列出全部。

**第一项 — 传播范围**：
```
📡 这本书的传播范围？

  • 传播向 — 公开发布，面向广泛读者
  • 个人向 — 自娱自乐，仅个人/小圈子阅读
```

**第二项 — 篇幅长度**：
```
📏 预期篇幅长度？

  • 随笔 — ＜5万字
  • 短篇 — ≤20万字
  • 短篇（连载） — ≤35万字
  • 中篇 — ≤60万字
  • 长篇 — ＞60万字
```

**第三项 — 书籍种类**：
```
📚 书籍种类/类型？
（自由填写，如：玄幻、科幻、言情、悬疑、历史、同人、轻小说 等）
```

- 如用户不确定，提供常见类型列表供参考，由用户自由输入或自定
- 如果用户在指令中已附带部分元数据，直接提取使用，跳过对应询问
- NSFW 相关词汇（如"成人"、"色情"、"H文"等）出现在种类中时 → 记录，在步骤 5 将 `content_rating` 设为 `NSFW`

**元数据提取正反例**：

| 用户输入 | ✕ 错误提取 | ✓ 正确提取 |
|---------|-----------|-----------|
| "写个玄幻短篇" | 种类=玄幻，篇幅跳过询问 | 种类=玄幻，篇幅=短篇，跳过篇幅询问 |
| "开个30万字左右的科幻坑" | 种类=科幻，篇幅跳过 | 种类=科幻，篇幅=短篇（连载），跳过篇幅询问 |
| "写本小说" | — | 所有项均需询问——无任何可提取信息 |

---

### 步骤 2.5：标签收集（四维）

元数据收集完成后，按 WT 标签体系（枚举见 `data/tags-spec.json`）收集作品标签，写入 `项目信息.json` → `tags`：

```
🏷️ 作品标签（用于剧情规划参考，可随时通过设定编辑调整）

① 主分类？（必选 1 个，tags-spec.main 枚举——如"东方仙侠""悬疑脑洞"）
② 主题？（至多 2 个，tags-spec.theme 枚举——如"搞笑轻松""第四天灾"）
③ 角色？（至多 2 个，tags-spec.role 枚举——如"单女主""扮猪吃虎"）
④ 情节？（至多 2 个，tags-spec.plot 枚举——如"系统""升级流"）
（均可跳过，跳过后由 LLM 根据书名/种类/世界观推断或留空）
```

- 用户指令中已含标签信息（如"写个带系统的无敌文"）→ 直接提取命中枚举，跳过对应询问
- 主分类跳过且无法推断 → 提示用户至少选 1 个（tags 是剧情规划参考的重要输入）
- 标签写入 `tags` 字段，落盘经成品输出校验（`type: "json"`, `expected_schema: "项目信息"`）
- **用途**：Plot 辅助/自动模式按 tags 综合判断笼统叙事类型（`data/plot-scenario-presets.json`）作为阶段目标与剧情走向参考

---

### 步骤 3：确认路径语言

询问用户文件夹命名语言：

```
🌐 文件夹命名语言？

  • 中文（默认）— 大纲 / 番外 / 正文
  • English — outline / extras / body
```

- 用户未指定时默认中文
- 用户在一次指令中已明确指定语言时，直接使用，跳过此询问

---

### 步骤 4：创建文件夹结构

根据用户选择的语言，在目标目录下创建文件夹结构。

**中文（默认）**：
```
{书名}/
├── 大纲/
│   ├── 设定/
│   ├── 人物/
│   └── 剧情/
├── 番外/
└── 正文/
```

**English**：
```
{书名}/
├── outline/
│   ├── settings/
│   ├── characters/
│   └── plot/
├── extras/
└── body/
```

**创建规则**：
- 逐层创建，先父后子
- 创建后 `ls` 验证每层目录存在
- 如某层创建失败 → 提示用户检查文件权限，中止后续写入

---

### 步骤 5：生成项目配置文件

文件夹创建完成后，在 `大纲/`（或 `outline/`）目录下生成三个文件。

**写入顺序**：`项目信息.json` → `写作配置.json` → `设定.md`

---

#### 5A. 生成 `项目信息.json`

按模板库 `templates/project-info.schema.json`（注册 id：`project-info`，见 `templates/index.json`）定义的字段结构组装生成。**字段定义唯一来源是 schema 文件**——本技能不自行维护字段结构。生成时按 schema 的 required 字段逐个取值，未配置字段按 default 预埋。

**字段概览**（详细定义/枚举/约束以 schema 文件为准）：

| JSON key | 对应元数据 | 取值 | 空值策略 |
|----------|----------|------|---------|
| `book_name` | 书名 | 用户输入 | 不可为空 |
| `distribution` | 传播范围 | `传播向` / `个人向` | 不可为空 |
| `content_rating` | 内容分级 | 默认 `一般向`，用户提及 NSFW 时设为 `NSFW` | 不可为空 |
| `length` | 篇幅长度 | `随笔` / `短篇` / `短篇（连载）` / `中篇` / `长篇` | 不可为空 |
| `genre` | 书籍种类 | 用户自由输入 | 不可为空 |
| `created_date` | 创建日期 | ISO 日期格式 | 自动填充 |
| `last_updated` | 最后更新 | ISO 日期格式 | 自动填充 |
| `volumes.enabled` | 是否启用分卷 | `true` / `false` | 默认 `false`，由剧情编辑技能在分卷时写入 |
| `volumes.multi_file` | 分卷是否使用多文件存储 | `true` / `false` | 默认 `false`，用户可选；`true` 时每卷独立 `.md` 文件 |
| `volumes.count` | 分卷总数 | 整数 | 默认 `0`，分卷确认后更新 |
| `volumes.list` | 各卷详细信息数组 | 对象数组 | 默认 `[]`，每卷含 `number`/`name`/`chapter_range`/`word_count`/`polish_mode` |
| `nsfw_output_level` | NSFW输出词级别 | `限制级` / `解限级` | 默认空字符串——无 NSFW 内容时不填，由 NSFW 技能首次调用时写入 |
| `nsfw_character_tone` | NSFW角色语气 | `保守` / `中性` / `放荡` | 默认空，由 NSFW 技能首次调用时写入 |
| `nsfw_tier_range.global` | 全书色色值域 | 如 `"N3-N4"` | 默认空，由 NSFW 技能首次调用时写入 |
| `nsfw_tier_range.chapters` | 章节区域覆盖 | 如 `{"1-10": "N1-N2"}` | 默认 `{}`，由用户后续配置 |

**volumes.list 数组项结构**（定义见 schema 的 `volumes.list.items`）：

| 字段 | 说明 | 取值 |
|------|------|------|
| `number` | 卷序号 | 整数，从 1 开始 |
| `name` | 卷名 | 用户自定义 |
| `chapter_range` | 章节范围 | 如 `"1-30"` |
| `word_count` | 预计字数 | 如 `"约10万字"` |
| `polish_mode` | 该卷润色模式 | `"继承全局"` / `"轻度"` / `"中度"` / `"重度"` |

**NSFW 字段预埋逻辑**：
- `nsfw_output_level`、`nsfw_character_tone`、`nsfw_tier_range` 预埋为**空值**——表示"未配置"
- 这些字段由 NSFW 技能或提示词增强技能在后续流程中填充
- 预埋空值的目的：确保 JSON 结构完整，后续技能可直接按 key 读取/写入，无需判断 key 是否存在

该 JSON 是项目基本信息的**唯一权威来源**——后续所有技能读取书名/分级等信息时均从此读取，禁止各自维护副本。

---

#### 5B. 生成 `写作配置.json`

按模板库 `templates/writing-config.schema.json`（注册 id：`writing-config`，见 `templates/index.json`）定义的字段结构组装生成——**字段定义唯一来源是 schema 文件**。生成时 `大纲`/`正文` 两轨按步骤 1 用户选择填充 polish_mode，`分卷` 默认空对象 `{}`。

**结构说明**：

| 轨道 | 适用场景 | 初始值来源 | 后续可变 |
|------|---------|----------|---------|
| `大纲` | 人物创建、剧情编辑、设定编辑等大纲类文本（全局默认） | 步骤 1 用户选择 | 随时通过设定编辑调整 |
| `正文` | 基础写作辅助、NSFW 写作等正文类文本（全局默认） | 初始与大纲相同 | 正文书写前 Core 会再次询问用户是否沿用 |
| `分卷` | 分卷润色覆盖项，key 为卷号（如 `"1"`），值为 `{"polish_mode": "...", "mode_description": "...", "last_updated": "..."}` | 默认空对象 `{}`，由剧情编辑在分卷时按需填充 | 每卷可独立调整，未配置卷继承 `大纲` 全局配置 |

**分卷润色覆盖逻辑**：
- `分卷` 对象中不存在某卷号 → 该卷使用 `大纲.polish_mode`（全局默认）
- `分卷` 对象中存在某卷号 → 该卷使用覆盖值，不读全局
- 卷的写作配置在剧情编辑分卷阶段询问用户，可随时通过设定编辑调整

**分卷配置示例**（结构定义见 schema 的 `分卷` 属性）：
```json
{
  "大纲": { "polish_mode": "中度", "mode_description": "...", "last_updated": "2026-06-14" },
  "正文": { "polish_mode": "中度", "mode_description": "...", "last_updated": "2026-06-14" },
  "分卷": {
    "1": { "polish_mode": "中度", "mode_description": "小幅优化用户原话", "last_updated": "2026-06-14" },
    "2": { "polish_mode": "重度", "mode_description": "仅保留原意，完全改写", "last_updated": "2026-06-14" }
  }
}
```

**mode_description 映射**：

| polish_mode | mode_description |
|-------------|-----------------|
| `轻度` | 保留用户原话，仅书面化、规范化书写 |
| `中度` | 小幅优化用户原话（改动幅度 ≤60%） |
| `重度` | 仅保留原意，完全改写、润色、扩写内容 |

该 JSON 是润色模式的**唯一权威来源**——所有后续技能按轨道读取对应模式。

---

#### 5C. 生成 `设定.md`

在 `大纲/设定/`（或 `outline/settings/`）目录下生成：

```markdown
# {书名} — 作品设定

> 创建日期：{YYYY年MM月DD日}

## 基本信息

- **书名**：{书名}
- **传播范围**：{传播向 / 个人向}
- **内容分级**：{一般向 / NSFW}
- **篇幅长度**：{长度}
- **书籍种类**：{种类}

---

## 简介

### 对外简介

（待填写）

### 个人描述

（待填写）

---

### 核心设定 [必选]

**人物**：（待填写）

**世界**：（待填写）

**故事走向**：（待填写）

---

### 世界观 [必选]

（待填写）

---

### 次要设定 [可选]

（暂不填写）
```

**填充规则**：
- 基本信息从已收集的元数据直接填充——不留空
- 其他板块标注 `（待填写）` 或 `（暂不填写）`——供设定编辑技能后续填充
- 日期使用当天日期

---

### 步骤 5.5：NSFW 项目偏好配置（条件触发）

**仅当** `content_rating` 被设为 `NSFW` 时执行此步骤。

```
🔞 检测到本书为 NSFW 向作品。推荐配置 NSFW 写作偏好（可大幅提升后续输出准确性）：

① 本书的整体色色值域在什么挡位之间？（如 N3-N4）
   N1 — 点到为止    N2 — 情色剧情并重    N3 — 情色为主
   N4 — 纯情色驱动  N5 — 纯情色不间断
   也可指定章节区域（如：第1-10章 N1-N2，第11-30章 N3-N4）

② 本书倾向什么级别的 NSFW 输出词？
   A. 输出词级别：限制级（优雅代称）→ 解限级（刺激升级，内含直白词汇）
   B. 角色语气：保守（文雅含蓄）→ 中性（自然直白）→ 放荡（粗俗刺激）

（均可跳过，跳过后由 LLM 后续自行判断；随时可说 /nsfw-config 重新配置）
```

- 如用户提供了数据 → 写入 `项目信息.json` 的对应 NSFW 字段 + 更新 `last_updated`
- 如用户跳过 → NSFW 字段保持空值，NSFW 技能首次调用时会再次询问
- 此步骤不阻塞项目创建——无论用户是否配置，文件夹和配置文件均已完成

---

### 步骤 5.6：写作偏好库开关（条件询问）

**每次创建新书时（步骤 5B 生成 `写作配置.json` 后）执行。** 询问用户是否启用写作偏好库——个人风格优化功能：

```
📝 写作偏好库（个人风格优化）是否启用？

启用后：AI 按你的个人写作习惯做方向优化（用词/句式/标点/称呼术语/
内容避讳/节奏），并在你手动修改 AI 产出时询问是否将修改点记入偏好库。
注意：启用会增加少量 Token 消耗（每次写作多读取一份偏好文件）。
可随时通过「设定编辑」关闭。
```

- 用户启用 → 写入 `写作配置.json` → `user_style_enabled: true`，创建 `大纲/写作偏好.json` 骨架（`{ "schema_version": "1.0", "entries": [] }`，结构见 `templates/user-style.schema.json`），落盘经成品输出校验（`type: "json"`, `expected_schema: "写作偏好"`）；并告知添加偏好方式：① 直接说"帮我记一下，我不用XX" ② 人工介入修改 AI 产出时会被询问是否入库
- 用户不启用/不确定 → 保持 `user_style_enabled: false`（默认），不创建偏好文件——全程不读取、不询问（零成本）
- 此步骤不阻塞项目创建——无论是否启用，项目结构均已完成

---

### 步骤 6：输出结果并推荐下一步

创建完成后，向用户展示完整的项目结构和设定摘要：

```
✅ 新书项目「{书名}」已创建完成！

📁 项目结构：
  {书名}/
  ├── 大纲/
  │   ├── 设定/
  │   │   └── 设定.md           ← 作品设定文件（初始骨架）
  │   ├── 人物/                  ← 角色设定（主要角色.md / 次要角色.md / 龙套角色.md；分卷多文件按卷{N}/子目录）
  │   └── 剧情/                  ← 主线剧情、章节大纲（分卷多文件时：剧情大纲-卷{N}.md）
  ├── 番外/                      ← 番外篇、外传
  └── 正文/                      ← 正式章节内容（分卷多文件时按卷{N}/子目录存放）

📋 项目设定摘要：
  • 书名：{书名}
  • 传播：{传播范围}  • 篇幅：{长度}  • 种类：{种类}
  • 分级：{一般向 / NSFW}  • 润色：{大纲模式/正文模式}
  {如为 NSFW 且已配置} • NSFW 色色值域：{global_range}
  {如启用写作偏好库} • 写作偏好库：已启用

📝 建议下一步 — 完善大纲内容：
  • 人物设定 — 说"创建人物"
  • 剧情大纲 — 说"创建剧情"
  • 世界观设定 — 说"编辑设定"

请告诉我你的选择！
```

---

### 步骤 7：根据用户选择调度后续技能

根据用户的回答，调度对应子技能：

| 用户选择 | 调度技能 | 路径 |
|---------|---------|------|
| 人物设定 | 创建人物 | `outline/Characters/SKILL.md` |
| 剧情大纲 | 剧情编辑 | `outline/Plot/SKILL.md` |
| 世界观设定 | 设定编辑 | `outline/Settings/SKILL.md` |
| 全部 | 按人物 → 设定 → 剧情的顺序逐一调度 |

调度方式：读取对应技能的 SKILL.md 并按其指令执行。

---

## 注意事项

- **元数据每次只问一项**：保持交互节奏轻快，不问完上一项不跳到下一项
- **已提供的信息不重复问**：用户在消息中已提供的书名/篇幅/种类等，直接提取使用
- **默认值可接受不确定性**：用户在某项元数据上不确定时，允许选默认值——后续可随时通过"编辑设定"修改
- **NSFW 不例行询问**：内容分级默认 `一般向`，不主动询问是否需要 NSFW。仅在用户明确提及成人/色情内容时才切换——避免给非 NSFW 用户造成不适
- **覆盖操作需二次确认**：同名目录存在时，覆盖选项明确标注风险后再次确认
- **JSON 格式严格合法**：`项目信息.json` 和 `写作配置.json` 组装完成后，调度 `成品输出校验`（`type: "json"`, `expected_schema` 对应类型）→ 由校验技能执行 JSON 语法/模式校验后统一落盘。禁止自行 Write——不经校验直接写入 = 流程违规
- **设定.md 落盘校验**：`设定.md` 生成后，调度 `成品输出校验`（`type: "structured_md"`, `md_category: "设定"`, `file_path`）→ 校验字段完整性和结构后落盘。同受"不经校验不得落盘"约束
- **路径语言一致性**：项目创建后，路径语言在整个项目中保持一致——不可混合使用中文和 English 路径
- **不擅自删改已有文件**：合并模式下仅补充缺失文件，不修改已存在的任何文件内容

