# 创建人物

> 创建新人物角色。当用户说"我们开始创建一个新人物"、"创建新人物"、"创建人物"、"新建角色"、"添加角色"、"写个人物"等类似指令时，必须调用此技能。此技能会依照已设定的项目语言（默认为中文），以交互方式按模板填充人物设定，所有人物按类别存入三类独立角色文件（主要角色.md / 次要角色.md / 龙套角色.md），分卷多文件项目按卷子目录存放。

- Skill: `jackal9384/skill-8` (Agent Skill)
- Install (CLI): `npx skillmds@latest add jackal9384/skill-8`
- Raw SKILL.md: https://api.skillmd.com/api/skills/jackal9384/skill-8/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-8

---


# 创建人物

此技能用于在已创建的新书项目中，按模板创建一个人物角色，并将所有人物统一存储在一个 Markdown 存档文件中，按人物类别分区管理。

## 核心定位

- **三类三分文件管理**：所有出场人物按类别拆分为三个独立文件——`主要角色.md` / `次要角色.md` / `龙套角色.md`；每个文件仅存对应类别的人物，不再混合存储
- **分卷多目录**：分卷多文件项目（`volumes.enabled=true` 且 `volumes.multi_file=true`），角色文件按 `大纲/人物/卷{N}/` 子目录存放（如 `大纲/人物/卷1/主要角色.md`）；不分卷或单文件模式统一存放于 `大纲/人物/`
- **类别分流**：主要/次要角色走完整交互式模板（五轮问询），龙套角色走快速通道（一句话描述 → 润色 → 一行写入）
- **双向关系同步**：新人物写入后，自动扫描其人物基本关系，在老角色的关系区块中追加反向关系——跨文件的关系同步覆盖所有三类文件
- **跨卷人物引用**：多文件模式下创建新卷人物时，若该角色已在旧卷中存在条目，自动引用旧数据并询问用户需变更的内容——避免重复录入
- **NSFW 分级**：NSFW 字段（XP/三维/性特征/人物X能力）默认不纳入例行问询。但当 `项目信息.json` 中 `content_rating` 为 `NSFW` 时，NSFW 字段自动升为**必填**，纳入正常交互流程，不再等待用户主动提及

## 关联文件

| 文件 | 位置 | 用途 | 读写 |
|------|------|------|------|
| `主要角色.md` | `大纲/人物/`（不分卷）或 `大纲/人物/卷{N}/`（分卷多文件） | 主要角色数据存储 | 读写 |
| `次要角色.md` | 同上 | 次要角色数据存储 | 读写 |
| `龙套角色.md` | 同上 | 龙套角色数据存储（简化格式） | 读写 |
| `项目信息.json` | `大纲/` 或 `outline/` | 内容分级（`content_rating`）、NSFW 输出词偏好、**分卷信息（volumes.*）** | 只读 |
| `写作配置.json` | `大纲/` 或 `outline/` | 润色模式（读 `大纲.polish_mode` + `分卷` 覆盖项，分卷时按角色出场卷取对应卷写作配置） | 只读 |
| `character-interaction.json` | `data/` | 交互引导数据（各轮询问模板 + 正反例，按需读取） | 只读 |

## 执行模式：计划模式

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

1. 使用 `EnterPlanMode` 工具进入计划模式
2. 在计划中列出：
   - 目标项目确认（定位 `项目信息.json`、`写作配置.json` 和角色文件）
   - 读取 `写作配置.json` 确定加工强度（使用 `大纲.polish_mode`）
   - 将询问的字段列表（基础信息 → 外貌 → 性格 → 简介 → 可选；龙套走快速通道）
	   - NSFW 字段是否启用：读取 `项目信息.json` 的 `content_rating` → 若为 `NSFW` 则 NSFW 字段自动启用并纳入必填；否则仅在用户主动提及时启用
   - 输出文件路径和写入方式（新建或追加）
3. 等待用户批准计划后，再按计划逐步询问并执行
4. 不要在进入计划模式前直接开始询问用户信息或写入文件

## 触发条件

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

- "我们开始创建一个新人物"、"创建新人物"、"创建人物"
- "新建角色"、"添加角色"、"写个人物"
- "加一个角色"、"设定一个角色"
- 任何表达"创建/新增一个小说/故事人物角色"的类似表述

## 前提条件

此技能依赖 `创建新书` 技能已执行完成：

- 当前工作目录下应已存在 `大纲/人物/`（或 `outline/characters/`）目录
- 如未检测到该目录 → 提示用户先使用"创建新书"建立项目
- 如检测到多个项目目录 → 询问用户选择目标项目

## 语言规则

继承 `创建新书` 技能中设定的路径语言：

- 中文默认：文件名为 `主要角色.md` / `次要角色.md` / `龙套角色.md`，内容以中文输出
- English：文件名为 `main-characters.md` / `supporting-characters.md` / `extras.md`，内容以英文输出
- 如无法确定，默认使用中文

---

## 存档文件结构

角色数据按类别拆分三文件，每个文件独立管理。文件顶部结构（首次创建时写入）：

**主要角色.md**：
```
# {书名} — 主要角色

> 创建日期：{日期}
> 最后更新：{日期}
{分卷多文件时：> 所属：{书名} / 第{N}卷 / 共{N}卷}

---

（主要角色条目追加于此）
```

**次要角色.md**：
```
# {书名} — 次要角色

> 创建日期：{日期}
> 最后更新：{日期}
{分卷多文件时：> 所属：{书名} / 第{N}卷 / 共{N}卷}

---

（次要角色条目追加于此）
```

**龙套角色.md**：
```
# {书名} — 龙套角色

> 创建日期：{日期}
> 最后更新：{日期}
{分卷多文件时：> 所属：{书名} / 第{N}卷 / 共{N}卷}

---

（龙套角色条目追加于此）
```

### 分卷多目录存储规则

**分卷多文件模式**（`volumes.enabled=true` + `volumes.multi_file=true`）：
- 角色文件按卷存放：`大纲/人物/卷1/主要角色.md`、`大纲/人物/卷1/次要角色.md`、`大纲/人物/卷1/龙套角色.md`
- 每卷角色文件独立，仅收录该卷出场的角色
- 跨卷出场角色：在各卷中均有条目（通过跨卷引用机制同步基础数据）

**不分卷或单文件模式**（`volumes.enabled=false` 或 `volumes.multi_file=false`）：
- 角色文件统一存放：`大纲/人物/主要角色.md`、`大纲/人物/次要角色.md`、`大纲/人物/龙套角色.md`
- 所有卷的角色共存在同一套文件中（通过 `出场卷` 字段区分）

**用户指定"只要一个"**：如用户在分卷时明确说"角色只要一个文件"，则无论 `volumes.multi_file` 如何，角色均使用不分卷路径（`大纲/人物/` 下的三文件）。

### 卷目录自动创建

首次写入某卷角色时，若 `大纲/人物/卷{N}/` 目录不存在 → 自动创建。创建后验证目录存在再写入文件。

### 单个人物条目模板（主要/次要角色）

> **字段定义唯一来源**：模板库 `templates/character.schema.json`（注册 id：`character`，见 `templates/index.json`）。下方模板为渲染示例——字段/必填/条件启用/渲染格式均以 schema 为准，本技能不自行维护字段定义。新增字段（如本版的「隐藏设定」）只需改 schema 一处。

```
### {人物名称}
- **性别**：{男/女/无}
- **年龄/出生日期**：{XXXX年XX月XX日 / XX岁}
- **身高**：{___cm}　**体重**：{___kg}　**身形特点**：{描述}
- **出场卷**：（可选，分卷项目自动出现）{第{N}卷 / "第1—3卷" / "全卷"}
  - **XP**：（{NSFW作品：必填 / 非NSFW：可选}，NSFW）{_}
  - **三维**：（{NSFW作品：必填 / 非NSFW：可选}，NSFW）{XX_XX_XX}
  - **性特征**：（{NSFW作品：必填 / 非NSFW：可选}，NSFW）{_}
- **人物性格**：
  {性格描述}
  - **人物语气**：{自动生成，基于人物性格}
      - 说话风格：{简洁有力/啰嗦随性/文雅含蓄/直白奔放……}
      - 用词偏好：{口语化/书面化/粗犷/文绉绉……}
      - 情绪表达：{外放/内敛/冷静/激烈……}
      - 句式特征：{短句/长句/碎片化/工整……}
      - 口头禅：{可选，角色的口头禅或高频句尾}
      {仅NSFW作品：}
      - nsfw_tone：{保守/中性/放荡}
- **人物简介**：
  {简介描述}
- **人物基本关系**：（可选）
  - {A与B：关系...}
- **人物能力**：（可选，1~10）
  - 战斗：{格斗、射击}
  - 建造：{制作、建造、艺术加工}
  - 烹饪：{烹饪}
  - 农艺：{驯兽、种植植物}
  - 医疗：{医疗}
  - 社交：{社交}
  - 智识：{领导、计策}
  - 魔力：{元素操控、召唤术、结界术、炼金/炼丹、法术知识、魔力储量}
  - 魅力：{1~10}　{外貌描述，如：倾国倾城/中上之姿/相貌平平/其貌不扬}
  - **人物X能力**：（{NSFW作品：可选 / 非NSFW：可选}，NSFW，1~10）
  - 耐力：{X事件下的耐力，是否容易高潮}
  - 耐受：{在高潮后的生理状态}
  - 攻击力：{攻方选项，是否容易把人弄高潮}
  - 性欲望：{性欲强度，是否容易发情}
- **隐藏设定**：（可选）{仅角色本人或知情圈知晓的信息——身世/秘密/动机。非空时自动预登记为伏笔（见「伏笔预登记」）}

---
```

### 龙套角色简化模板

```
**{人物名称}**：{简介，大致年龄，社会身份/地位，身形特点，性格，简单关系等}
```

**龙套书写规则**：
- 每条龙套一行，条目之间以空行分隔
- 不使用 `---` 分隔线（与主要/次要角色区分）
- 无子标题（不设 `### {人物名称}`），直接以粗体名称开头
- 单行描述控制在 60 字以内——保持龙套区的轻量感

**龙套示例**：
> **张三**：李四的发小，约25岁，镇上铁匠铺学徒，膀大腰圆，憨厚老实，与李四是酒友。
>
> **王婆**：村口卖菜的老妇人，六十出头，驼背但眼神精亮，爱嚼舌根但心肠不坏，常给主角塞菜。

### 模板字段说明

| 字段 | 说明 | 必填 | 适用类别 |
|------|------|------|---------|
| 人物类别 | 主要角色 / 次要角色 / 龙套角色 | 是 | 全部 |
| 人物名称 | 角色的姓名或代号 | 是 | 全部 |
| 出场卷 | 角色出场的卷号/范围（分卷项目自动询问） | 否（分卷项目自动出现） | 全部 |
| 性别 | 男 / 女 / 无（非人类角色） | 是 | 主要/次要 |
| 年龄/出生日期 | 具体日期或大致年龄 | 是 | 主要/次要 |
| 身高/体重/身形特点 | 体型描述 | 是 | 主要/次要 |
| XP | 角色性癖/XP标签 | 是（NSFW作品）/ 否（非NSFW） | 主要/次要 |
| 三维 | 胸围_腰围_臀围 | 是（NSFW作品）/ 否（非NSFW） | 主要/次要 |
| 性特征 | 性相关特征描述 | 是（NSFW作品）/ 否（非NSFW） | 主要/次要 |
| 人物性格 | 性格特征、行为习惯、动机 | 是 | 主要/次要 |
| 人物语气 | 说话风格、用词偏好、情绪表达方式、句式、口头禅、nsfw_tone（NSFW） | 是 | 主要/次要 |
| 人物简介 | 角色背景、经历概述 | 是 | 主要/次要 |
| 人物基本关系 | 与其他角色的关系 | 否 | 主要/次要 |
| 人物能力 | 各项能力数值（1~10） | 否 | 主要/次要 |
| 人物X能力 | X相关能力（1~10） | 是（NSFW作品）/ 否（非NSFW） | 主要/次要 |
| 隐藏设定 | 身世/秘密/动机——仅角色本人或知情圈知晓 | 否 | 主要/次要 |
| 龙套简化格式 | 单行描述 | 是 | 龙套 |

---

## 执行步骤

### 步骤 1：确认输出目录与存档文件

**1.1 定位目标目录**

```
大纲/人物/  →  outline/characters/  →  用户手动指定
```

- 如存在多个项目目录 → 列出供用户选择
- 如不存在 → 提示先运行"创建新书"

**1.2 读取上下文与分卷判断**

- `Read` 读取 `大纲/写作配置.json` → 获取 `大纲.polish_mode` + `分卷` 覆盖项
- `Read` 读取 `大纲/项目信息.json` → 获取 `content_rating`、`nsfw_output_level`、**`volumes`**；`nsfw_character_tone` 仅在 `nsfw_output_level` 为 `限制级` 时读取
- 润色模式影响后续所有交互中对用户输入的加工程度
- NSFW 数据用于人物涉及 NSFW 字段时的词汇选择
- **分卷感知**：根据 `volumes.enabled` + `volumes.multi_file` 判断文件存储路径

**1.3 确定目标文件路径**

根据分卷状态和人物类别确定写入目标：

| 分卷状态 | 人物类别 | 目标文件 |
|---------|---------|---------|
| 不分卷 / 单文件 | 主要角色 | `大纲/人物/主要角色.md` |
| 不分卷 / 单文件 | 次要角色 | `大纲/人物/次要角色.md` |
| 不分卷 / 单文件 | 龙套角色 | `大纲/人物/龙套角色.md` |
| 分卷多文件 | 主要角色（第N卷） | `大纲/人物/卷{N}/主要角色.md` |
| 分卷多文件 | 次要角色（第N卷） | `大纲/人物/卷{N}/次要角色.md` |
| 分卷多文件 | 龙套角色（第N卷） | `大纲/人物/卷{N}/龙套角色.md` |

**1.4 检查目标文件**

| 文件状态 | 处理 |
|---------|------|
| 已存在 | `Read` 读取现有文件 → 准备追加 |
| 不存在 | 按存档文件结构写入顶部框架（书名标题 + 日期 + 卷信息如适用） |
| 卷目录不存在 | 自动创建 `大纲/人物/卷{N}/` 后再创建文件 |

---

#### 步骤 1.5：跨卷人物引用（分卷多文件模式专属）

**仅当** `volumes.enabled=true` 且 `volumes.multi_file=true` 且当前卷号 > 1 时执行。

在用户输入人物名称后，自动搜索旧卷中是否存在同名角色：

1. 扫描 `大纲/人物/卷1/`、`大纲/人物/卷2/` ... `大纲/人物/卷{N-1}/` 下所有三类角色文件
2. 查找同名 `### {人物名称}` 或 `**{人物名称}**` 条目

**找到同名角色时**：

```
🔗 在卷{M}「{卷名}」中发现已存在的「{人物名称}」（{主要/次要/龙套}角色）。

旧卷数据摘要：
  • 性别：{性别}  • 年龄：{年龄}
  • 性格：{一句话概括}
  • 简介：{一句话概括}
  • 关系：{关键关系简述}
  {如有能力} • 能力：{关键能力数值}

是否需要基于旧数据进行变更？
  • 直接引用 — 完整复制旧卷数据（仅更新出场卷标记）
  • 部分变更 — 告诉我哪些字段需要修改（如"性格变了，现在更成熟了"、"能力提升了"）
  • 重新创建 — 当作全新角色从头填写（不引用旧数据）
```

**处理规则**：

| 用户选择 | 处理 |
|---------|------|
| 直接引用 | 复制旧条目全部字段 → 更新 `出场卷` 为当前卷号 → 写入当前卷对应文件；不询问任何字段 |
| 部分变更 | 复制旧条目为底稿 → 按用户指示修改指定字段 → 其余字段保持不变 → 更新 `出场卷` → 写入 |
| 重新创建 | 忽略旧数据 → 进入正常的步骤 2 交互式填充流程 |

**未找到同名角色**：无提示，直接进入正常创建流程。

**跨卷关系继承**：
- 直接引用/部分变更时，旧条目中的 `人物基本关系` 自动带入
- 关系涉及的对方角色如果也在当前卷出场 → 在当前卷的关系同步中处理
- 关系涉及的对方角色如果不在当前卷 → 保留关系记录但标注 `（参见卷{M}）`

### 步骤 2：交互式填充模板

逐项向用户询问模板中的必填字段。按以下顺序进行，每次只问 1~2 个相关字段。

**润色模式影响**（从 `写作配置.json` 读取 `大纲.polish_mode`）：

| 模式 | 对人物字段的加工策略 |
|------|-------------------|
| `轻度` | 直接记录用户原话，转为书面格式——保留用户的用词习惯 |
| `中度` | 在用户原话基础上小幅优化表达（≤60% 改动）——如将口语化描述转为书面化 |
| `重度` | 仅保留原意，对内容进行改写润色和适当扩写——如将一句话描述扩展为一段文字 |

---

**第一轮 — 基础信息：**（询问模板见 `data/character-interaction.json` → `rounds.r1_basic.prompt`）

**此轮后的分支判断**：

| 用户选择 | 后续流程 |
|---------|---------|
| 主要角色 | 先进入分卷赋值（如项目已分卷）→ 继续第二轮~第五轮完整流程 |
| 次要角色 | 先进入分卷赋值（如项目已分卷）→ 继续第二轮~第五轮完整流程 |
| 龙套角色 | 先进入分卷赋值（如项目已分卷）→ 再跳至龙套快速通道 |

---

**分卷赋值（条件触发）**：

**仅当** `项目信息.json` 中 `volumes.enabled = true` 时执行。

第一轮完成后，询问出场卷（模板见 `rounds.volume_assignment.prompt`）：

根据用户选择写入 `出场卷` 字段：
- 单选 → `第{N}卷`
- 多选 → `"第1—3卷"` 或 `"第1、3卷"`
- 全卷 → `全卷`
- 跳过 → 留空

**润色模式取用**：
- 如角色仅出现在单一卷，且该卷在 `写作配置.json` → `分卷` 中有独立配置 → 使用该卷润色模式
- 如角色跨多卷或全卷 → 使用全局 `大纲.polish_mode`
- 如无分卷信息 → 使用全局 `大纲.polish_mode`

---

**第二轮 — 外貌信息：**

（询问模板见 `rounds.r2_appearance.prompt`；身形特点正反例 3 组见 `examples.body_shape`）

**年龄写入规则**：
- 用户提供确切日期 → 写入 `XXXX年XX月XX日`
- 用户提供大致年龄 → 写入 `约XX岁`
- 两者都提供 → 写入 `XXXX年XX月XX日（XX岁）`

---

**第三轮 — 内在设定：**

（询问模板见 `rounds.r3_personality.prompt`；性格正反例 2 组见 `examples.personality`）

---

n**第三轮附 — 人物语气（基于性格自动生成）：**

人物语气由 AI 根据用户填写的性格描述自动生成，用户确认或修改后生效。**不作为独立轮次询问用户**——用户填写完性格后，AI 直接给出语气建议。

（语气建议模板见 `rounds.r3_voice.prompt`）

- 语气数据同时写入两个位置：① 角色 MD 条目中的「人物语气」字段 ② `写作配置.json` 的 `角色语气.{角色名}` 段
- 修改时直接调整对应维度即可，其他维度保持不变
- 跳过时两个位置均不写入，写作时按无语气配置处理

**第四轮 — 背景故事：**

（询问模板见 `rounds.r4_background.prompt`；简介正反例见 `examples.background`）

---

**第六轮 — NSFW 身体设定（仅 NSFW 作品）：**

**仅当** `content_rating` 为 `NSFW` 时执行此轮。非 NSFW 作品跳过，直接进入第五轮。

（询问模板见 `rounds.r6_nsfw_body.prompt`）

- NSFW 作品下此轮为必填——不跳过，至少填写一项
- 如用户确实不想填写某项 → 说"跳过XP/跳过三维"可留空对应字段
- 填写后按 NSFW 词汇选择协调规则择词（见 NSFW 内容规则），不经过 Write-Router/Core
- NSFW 字段直接写入人物条目中 `身形特点` 之后、`人物性格` 之前

---

**第五轮 — 可选内容：**

（询问模板见 `rounds.r5_optional.prompt`）

- 如用户跳过全部可选内容 → 直接进入步骤 3
- 如填写了人物基本关系 → 在步骤 3.5 中触发双向关系同步
- NSFW 作品时人物X能力为可选——用户跳过则留空

---

#### 龙套快速通道

当用户在第一轮选择「龙套角色」后，跳过第二轮~第五轮，使用此简化流程。

**L1 — 确认名称**（如第一轮已获取则跳过；模板见 `rounds.quick_l1.prompt`）：

**L2 — 一句话描述**（模板见 `rounds.quick_l2.prompt`）：

**L3 — Write-Router 轻量模式加工**：
用户输入后，将描述传入 Write-Router（轻量模式 `mode: "creation_phase"`），由 Write-Router 调度 Core 按大纲文本规范加工（规范 1.5/1.6/5）。润色模式取用优先级：出场卷独立配置 → 全局 `大纲.polish_mode`。详见步骤 2.8。

**L4 — 拼接简化格式**：
将润色后的描述拼接为龙套简化格式：
```
**{人物名称}**（出场：{第N卷/全卷}）：{润色后描述}
```

如项目未分卷，省略 `（出场：...）` 部分。

**L5 — 龙套关系提取**：
从简化描述中智能提取关系（如"李四的发小"→ 关联李四；"常给主角塞菜"→ 关联主角），在步骤 3.5 中触发双向关系同步。

---

### 步骤 2.8：Write-Router 调度 Core 写作规范加工（写入前必经步骤）

**一切供人阅读的人物描述文本，写入文件前必须经过 Write-Router（轻量模式）→ Core（基础写作辅助）加工。**

在步骤 2 收集完用户输入并完成初步润色后、步骤 3 写入文件前，将以下文本字段逐一传入 Write-Router（轻量模式）：

**加工范围**（主要/次要角色）：

| 字段 | content_type | field_name |
|------|-------------|-----------|
| 身形特点 | 大纲文本 | `身形特点` |
| 人物性格 | 大纲文本 | `人物性格` |
| 人物简介 | 大纲文本 | `人物简介` |
| 人物语气 | 大纲文本 | `人物语气` |

**加工范围**（龙套角色）：

| 字段 | content_type | field_name |
|------|-------------|-----------|
| 简化描述 | 大纲文本 | `龙套角色描述` |

**执行方式**：

1. 读取 `写作配置.json` → 取 `大纲.polish_mode`（或分卷覆盖项）
2. 逐字段组装数据包传入 Write-Router（轻量模式）：
   ```
   {
     "mode": "creation_phase",
     "text": "{字段文本内容}",
     "context": {
       "source_skill": "创建人物",
       "content_type": "大纲文本",
       "field_name": "{字段名}"
     },
     "polish_mode": "{有效润色模式}",
     "polish_config": { "{写作配置 JSON}" }
   }
   ```
3. Write-Router 通过轻量模式调度 Core 加工后返回 `{ "processed_text": "{加工后文本}", "changes_summary": "{调整摘要}" }`
4. 使用返回的 `processed_text` 替代原文本，继续步骤 3 写入流程

**NSFW 字段（XP/三维/性特征）**：如用户填写了 NSFW 字段，额外调度 NSFW 专项做词汇选择（见 NSFW 内容规则），不经过 Write-Router/Core。

**硬约束**：不经 Write-Router → Core 加工直接将人物描述文本写入文件 = 流程违规。

---

根据用户填写的信息，按人物类别将条目追加到对应类别文件。

**3.1 首次创建（目标文件不存在）**

1. 写入文件顶部框架（书名标题 + 日期 + 卷信息如适用）
2. 写入第一条人物条目

**3.2 追加写入（目标文件已存在）**

1. `Read` 读取对应类别文件（如 `大纲/人物/主要角色.md`）
2. 在文件末尾追加新人物条目
3. 更新文件顶部的 `> 最后更新：{日期}`

**3.3 追加规则**：

| 人物类别 | 目标文件 | 追加方式 | 分隔规则 |
|---------|---------|---------|---------|
| 主要角色 | `主要角色.md` | 完整模板（`### {名称}` ... `---`） | 条目间以 `---` 分隔 |
| 次要角色 | `次要角色.md` | 完整模板（同上） | 条目间以 `---` 分隔 |
| 龙套角色 | `龙套角色.md` | 简化格式（`**{名称}**：{描述}`） | 条目间以空行分隔，不用 `---` |

**3.4 同名人物冲突**：

同一人物名称如已存在于**当前卷的对应类别文件**中：
```
⚠️「{人物名称}」已存在于当前卷的「{人物类别}」文件中。

  • 更新 — 覆盖已有条目（旧数据将丢失）
  • 新建 — 换一个名称重新创建
  • 跳过 — 不做修改
```

**跨卷同名人物**已在步骤 1.5 中处理（跨卷人物引用），此处的冲突检测仅限当前卷文件。

---

### 步骤 3.5：双向更新人物关系（跨文件搜索）

新人物写入后，如果填写了**人物基本关系**（或龙套的简化描述中隐含关系），必须对所有关联的老角色执行双向更新。

**解析关系来源**：

| 来源 | 解析方式 |
|------|---------|
| 主要/次要角色的「人物基本关系」 | 从 `{角色A}与{角色B}：{关系描述}` 格式解析 |
| 龙套角色的简化描述 | 智能提取——"李四的发小"→ 关联李四；"张三的妻子"→ 关联张三；"常给主角塞菜"→ 关联主角 |

**搜索范围**（分卷多文件模式）：
- 优先搜索**当前卷**的三类角色文件（`大纲/人物/卷{N}/主要角色.md`、`次要角色.md`、`龙套角色.md`）
- 若当前卷未找到 → 搜索**旧卷**的对应文件（`大纲/人物/卷1/`、`卷2/`...）
- 不分卷/单文件模式 → 仅搜索 `大纲/人物/` 下的三个文件

**更新老角色**：

1. 在搜索范围内找到被关联的角色条目
2. 在该角色的「人物基本关系」区块追加反向关系
3. 如老角色原本没有「人物基本关系」字段 → 在人物能力之后新增该字段
4. 如老角色已有关系 → 将新关系追加到列表末尾（不覆盖已有关系）
5. 如老角色位于旧卷文件 → 同步更新该旧卷文件中的条目

**示例**：
```
创建「张三」（新角色，卷2），关系：张三与李四：师徒关系

→ 写入张三条目后，查找李四
→ 李四在卷1的「次要角色.md」中找到
→ 在卷1「次要角色.md」李四条目的「人物基本关系」中追加：
  - 李四与张三：师徒关系（卷2）
```

**双向更新输出**：
```
🔄 已同步更新以下角色的关系：
  • 李四（次要角色，卷1）→ 新增关系：与张三：师徒关系
```

**边界情况**：
- 关联的角色不在任何存档中 → 仅在新角色中保留关系记录，不做反向写入（等该角色创建后再补）
- 关系描述中角色名包含别名 → 尝试模糊匹配，匹配不到时提示用户确认
- 旧卷角色更新时 → 更新 `最后更新` 日期

---

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

**隐藏设定伏笔预登记**：若本次创建的角色填写了「隐藏设定」字段（非空），在写入角色文件后、输出结果前，调度「长篇专项」执行**人物伏笔预登记**：以当前章节（无则 `第1章`）为放置章，将隐藏设定摘要按 `{第N章}_{≤50字摘要}_{待回收}` 格式写入 `项目信息.json` 的 `foreshadowing` 数组，来源标记为人物文件。该联动由 `templates/character.schema.json` 的 `fields[].integration` 定义，调度细节见长篇专项「人物伏笔预登记」。

**主要/次要角色输出模板**：

```
✅ 人物「{人物名称}」已写入角色文件！

📄 存档文件：{项目路径}/大纲/人物/{卷子目录如适用}{主要角色/次要角色/龙套角色}.md
📂 所属类别：{人物类别}  {分卷时：📚 出场：第{N}卷}

📋 角色概要：
  • 类别：{人物类别}  • 性别：{性别}
  • 出场：{第N卷 / 全卷 / 未设定}
  • 性格：{一句话概括}
  • 简介：{一句话概括}

🔄 已同步更新 {M} 个关联角色的关系
👥 当前存档共 {N} 个角色
{如有隐藏设定：🔖 已登记隐藏设定为伏笔 — {第N章}_{≤50字摘要}_{待回收}}

📝 接下来你可以：
  • 继续创建更多人物 — 说"创建人物"
  • 查看角色文件 — 说"查看人物"
  • 创建剧情大纲 — 说"创建剧情"
  • 建立世界观设定 — 说"编辑设定"
```

**龙套角色输出模板**：

```
✅ 龙套角色「{人物名称}」已写入角色文件！

📄 存档文件：{项目路径}/大纲/人物/{卷子目录如适用}龙套角色.md
📂 所属类别：龙套角色  {分卷时：📚 出场：第{N}卷}
📋 条目：**{人物名称}**：{简化描述}

🔄 已同步更新 {M} 个关联角色的关系
👥 当前存档共 {N} 个角色
```

---

## NSFW 内容规则

NSFW 字段（XP、三维、性特征、人物X能力）写入对应类别角色文件，不独立存储。

### 触发方式 — 作品分类决定

- **NSFW 作品**（`content_rating` = `NSFW`）：NSFW 字段（XP/三维/性特征/人物X能力）自动启用，纳入正常交互流程；第六轮（NSFW 身体设定）为必填轮次，人物X能力在第五轮中为可选
- **非 NSFW 作品**（`content_rating` ≠ `NSFW` 或未设置）：NSFW 字段**不询问**——模板中仅标记为可选项存在
- 用户在创建人物时主动提及 NSFW 内容（如"加个XP"、"补充X能力"），无论作品分类，均在对应字段写入
- 用户也可创建人物后追加 NSFW 资料——直接在该角色的类别文件中补充

### NSFW 词汇选择协调

当用户填写 NSFW 字段时：

1. `Read` 读取 `大纲/项目信息.json` 中的 `nsfw_output_level` 和 `nsfw_character_tone`（限制级和解限级均有效；大众级不使用）
2. 若已配置 → 读取 `data/nsfw-vocabulary.json`（技能根目录数据目录，注册见 `data/data-registry.json`）的词汇表权威数据源，根据 `nsfw_output_level` + `nsfw_character_tone` 选择对应档位和语气列的用词（限制级和解限级均为三列语气分档）

| nsfw_output_level | 用词风格 | 示例 |
|------------------|---------|------|
| `限制级` | 优雅代称，三列语气分档 | 保守:酥胸/玉茎/花径 · 中性:胸部/肉棒/小穴 · 放荡:奶子/大肉棒/骚穴 |
| `解限级` | 刺激升级，三列语气分档，含直白词汇 | 保守:双峰/阳具/蜜穴 · 中性:奶子/肉棒/小穴 · 放荡:大奶/鸡巴/骚逼 |
| 空（未配置） | 中性/自然用词 | 胸部、阴茎、阴道 |

3. 若未配置 → 以中性用词写入，同时提示：
```
💡 提示：项目尚未配置 NSFW 输出词偏好。配置后所有 NSFW 字段的用词风格将保持一致。
   是否需要配置？（可说 /nsfw-config 随时配置）
```

### 写入位置

- NSFW 字段直接写入人物条目中，NSFW 作品标注「（必填，NSFW）」，非 NSFW 作品标注「（可选，NSFW）」
- XP、三维、性特征 → 写在身形特点之后、人物性格之前
- 人物X能力 → 写在人物能力之后

---

## 注意事项

- **已提供的信息不重复问**：用户在消息中已附带部分信息（如"创建一个叫张三的主角"），直接提取使用，跳过对应询问
- **可选字段允许跳过**：标记为"（可选）"的字段（人物基本关系、人物能力），用户明确说"跳过"时直接进入下一步
- **Write-Router → Core 加工为写入前必经步骤**：人物性格/简介/身形特点/龙套描述等供人阅读的文本，写入前必须经过 Write-Router（轻量模式）调度 Core 按大纲文本规范加工——不经此链路直接写入 = 流程违规
- **NSFW 分级显示**：非 NSFW 作品（`content_rating` ≠ `NSFW`）不询问 NSFW 字段——避免不适。NSFW 作品（`content_rating` = `NSFW`）则 NSFW 字段自动升为必填，纳入正常流程
- **人物能力数值范围 1~10**：如用户不确定可留空
- **追加写入不破坏已有内容**：仅在对应分区末尾追加，不修改已有人物条目
- **写入必经成品校验**：角色文件组装完成后，调度 `成品输出校验`（`type: "structured_md"`, `md_category: "角色"`, `file_path`）→ 由校验技能执行字段完整性/双向关系校验后统一落盘。禁止自行 Write
- **同名人物更新需用户确认**：同一名称已存在时，明确告知覆盖风险后等待用户选择
- **龙套角色特殊规则**：
  - 使用简化模板（单行格式），不询问外貌/性格/能力等详细字段
  - 龙套描述按大纲档位润色后写入
  - 龙套条目之间以空行分隔，不使用 `---` 分隔线
  - 龙套不询问 NSFW 字段
- **人物关系延迟同步**：新角色引用了尚未创建的角色时，关系仅在新角色侧写入——待该角色创建后再补反向关系
- **分卷感知**：项目启用分卷后，创建人物时自动询问出场卷；人物条目中写入 `出场卷` 字段；润色模式按出场卷取对应配置
- **分卷多文件角色目录**：分卷多文件模式下，角色按 `大纲/人物/卷{N}/` 子目录存放三类文件，每卷角色独立管理
- **出场卷可留空**：用户选择"暂不确定"时出场卷字段写入空值，后续可通过编辑人物补充
- **跨卷人物引用**：分卷多文件模式下新建人物时自动搜索旧卷同名角色，支持直接引用/部分变更/重新创建
- **三类文件独立存储**：`主要角色.md` / `次要角色.md` / `龙套角色.md` 各自独立，不混合存储
- **始终以 Markdown 格式保存**：中文文件名 `主要角色.md` / `次要角色.md` / `龙套角色.md`；English `main-characters.md` / `supporting-characters.md` / `extras.md`

