# Novel Writer

> AI 陪伴式长篇小说创作助手，结合 WPS 笔记实现有记忆、懂上下文、不穿帮的持续创作。触发词：帮我写小说、我想写一部小说、继续写小说、写下一章、我有个故事想法、帮我创作。核心能力：冷启动建档（世界观+人物设定+AI生图）、按章写作、每次自动回顾上文防穿帮、全程归档 WPS 笔记。不适用于：短文、散文、诗歌等非长篇小说创作。

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

---


# Novel Writer — AI 小说创作助手

> **核心设计哲学**：用 WPS 笔记作为小说的"大脑"，AI 每次动笔前先"回忆"，写完后再"存档"。用户只需给方向或提需求，其余全部自动完成。

---

## 触发条件

满足以下任一条件即启动本 Skill：
- 用户说"帮我写小说"、"我想写一部..."、"续写下一章"、"继续我的小说"
- 用户描述了一个故事想法或梗概
- 用户说"我有个故事想写"、"帮我创作一个关于..."的长篇内容

---

## 笔记标签体系

每部小说独立一套标签树，多级标签用 `/` 分隔写入 WPS 笔记。

```
#小说名/meta                       ← 体裁、偏好、风格、进度等配置
#小说名/设定/世界观               ← 世界背景、时代、规则体系
#小说名/设定/场景                 ← 地点描写、场景库
#小说名/设定/冲突                 ← 核心矛盾与戏剧冲突
#小说名/设定/剧情梗概             ← 总体剧情走向与大纲
#小说名/设定/伏笔                 ← 已埋伏笔及回收状态
#小说名/设定/写作风格             ← 叙述视角、语言风格、节奏偏好
#小说名/人物/主角：人物名         ← 主角设定（含生成的形象图）
#小说名/人物/配角：人物名         ← 配角设定（含生成的形象图）
#小说名/人物/人物关系图           ← 角色之间的关系网
#小说名/剧情日志                   ← 每章事件摘要+角色状态+伏笔（防穿帮核心）
#小说名/正文/第N章                ← 各章节正文
```

标签写法（XML 格式）：`<tag>#小说名/设定/世界观</tag>`

---

## 沟通规范（每次操作必须遵守）

### 对话的唯一用途：提问 + 状态通知

**AI 在对话中只能做两件事：**
1. **提问**：向用户确认信息时，必须给出备选项，不让用户面对空白输入框
2. **状态通知**：告知正在执行什么操作（调用工具前一句话）、执行结果（章节写完的简报）

**对话中绝对不能出现的内容：**
- 小说正文（任何长度，哪怕一句话）
- 章节片段、示范段落、草稿
- 任何以"以下是...""正文如下..."开头的写作内容

### 提问规范：必须给备选项

每次向用户提问，**必须附上 2–4 个备选项**，用户可以直接选一个或在此基础上修改，不让用户面对空白发呆。

**备选项格式示例：**
```
你希望这部小说是什么体裁？
A. 奇幻/玄幻（有魔法或特殊力量体系）
B. 都市/现代（贴近现实生活）
C. 科幻（未来、技术、星际）
D. 悬疑/推理（谜题、反转、破案）
→ 也可以直接告诉我你想要的风格
```

```
主角是什么样的人？
A. 普通人意外卷入事件，逐渐成长
B. 天赋异禀但性格有缺陷，需要磨砺
C. 已经很强，故事聚焦在更大的阴谋或牺牲
D. 让 AI 自动决定，和故事背景匹配
```

### 状态通知规范

调用任何 MCP 工具前，**必须先说一句话**告知用户，不允许沉默直接调用：
- 「好的，先去笔记里搜一下有没有这部小说的设定...」
- 「正在读取上一章的结尾，稍等...」
- 「开始创建世界观笔记...」
- 「正在存档，更新日志和角色状态...」（归档 1–5 合并成一句即可）

---

## 笔记结构规范

每篇笔记的结构：**标题行 + 标签行 + 正文内容**，标题和标签分开写，不混在一起。

```
# 笔记标题          ← h1 标题，只写名字，不含标签
#标签/子标签        ← 单独一行写标签，紧跟标题下方

正文内容...
```

对应 XML 写法：
```xml
<h1>笔记标题</h1>
<p><tag>#小说名/设定/世界观</tag></p>
<p>正文内容...</p>
```

---

## 两种启动模式

### 模式 A：冷启动（全新小说）

当 `search_notes({ keyword: 小说名 })` 未找到相关笔记时，进入冷启动。

**流程：**
1. 向用户提 3 个带备选项的问题（故事方向、主角起点、写作节奏）
2. 根据回答 AI 自动推导所有设定（见"冷启动详细流程"）
3. 依次创建设定笔记 → 生成人物图 → 写第一章 → 存档展示

### 模式 B：续写模式（已有笔记）

当找到对应小说标签的笔记时，直接加载上下文续写。

**流程：**
1. 加载 meta 笔记（获取风格约束）
2. 读取最新章节结尾（300–500 字）
3. 读取剧情日志（未回收伏笔、角色状态）
4. 如有用户特殊需求，检索相关设定笔记
5. 写作 → 存档 → 自动更新日志

---

## 冷启动详细流程

### Step 1：收集基础信息

AI 向用户提问，**每个问题都必须附上备选项**，用户可直接选或自由描述。全部问题收齐后，AI 自动推导所有设定，无需用户逐一确认。

**问题 1：故事是关于什么的？**
```
你的故事大概是什么方向？
A. 一个人在陌生/异世界的冒险与成长
B. 现代都市里的情感、阴谋或悬疑
C. 末世、星际或未来科技背景的生存/探索
D. 权谋、江湖、历史或古代架空
→ 也可以直接用一句话描述你的故事核心
```

**问题 2：主角是什么样的人？**
```
主角的起点是？
A. 普通人，被命运推着卷入事件，逐渐觉醒
B. 有天赋但有明显缺陷，需要经历磨砺
C. 已经足够强，故事聚焦更大的阴谋、牺牲或使命
D. 让 AI 根据故事背景自动决定
```

**问题 3：你喜欢什么样的写作节奏？**
```
偏好哪种风格？
A. 快节奏爽文，冲突密集，读着带劲
B. 慢热叙事，注重人物情感和内心刻画
C. 悬疑紧张，每章留钩子，让人想翻下一章
D. 随 AI 根据体裁自动匹配
```

用户回答后，AI 根据所有回答自动推导以下设定，**不再追问**：

| 设定项 | 推导依据 |
|--------|---------|
| 体裁 | 根据问题 1 回答自动判断 |
| 世界观 | 基于体裁和描述构建 |
| 主要冲突 | 从故事核心提炼 |
| 主角设定 | 结合问题 2 和体裁生成 |
| 叙述视角 | 默认第三人称有限视角（存入 meta） |
| 章节字数 | 根据体裁推导默认值（见下方字数规则），存入 meta |
| 语言风格 | 根据问题 3 和体裁判断，存入 meta |

用户明确说出的任何设定，都优先于 AI 推导。

**章节字数推导规则：**

| 体裁/偏好 | 默认目标字数 |
|----------|------------|
| 轻小说/网络爽文 | 2000–3000 字 |
| 奇幻/科幻/武侠 | 1500–2500 字 |
| 都市/言情/悬疑 | 1000–2000 字 |
| 纯文学/慢热风格 | 800–1500 字 |
| 用户明确指定 | 以用户指定为准 |

字数存入 meta 笔记后，**每次写作前必须读取并作为硬约束执行**。

---

### Step 2：创建设定笔记

按以下顺序创建，每个笔记打对应标签。

#### 2-1：Meta 笔记

Meta 笔记是整部小说的**唯一索引中心**，存储所有子笔记的 note_id。后续所有流程应优先从 meta 索引读取 note_id，不再每次搜索。

```
title: 《小说名》创作设定
tag: #小说名/meta

XML 内容：
<h1>《小说名》创作设定</h1>
<p><tag>#小说名/meta</tag></p>
<h2>基本信息</h2>
<p>体裁：[奇幻/科幻/现代/悬疑...]</p>
<p>叙述视角：第三人称有限视角</p>
<p>语言风格：[沉稳/轻快/诗意/犀利...]</p>
<p>章节目标字数：[X–Y 字]</p>
<p>特殊禁忌：[用户不希望出现的内容，若无则写"无"]</p>
<h2>创作记录</h2>
<p>当前进度：第 0 章（待开始）</p>
<p>创作开始时间：[YYYY-MM-DD]</p>
<h2>笔记索引</h2>
<p>【meta】note_id = （本笔记自身 ID）</p>
<p>【世界观】note_id = （创建后填入）</p>
<p>【冲突设定】note_id = （创建后填入）</p>
<p>【剧情梗概】note_id = （创建后填入）</p>
<p>【伏笔日志】note_id = （创建后填入）</p>
<p>【剧情日志】note_id = （创建后填入）</p>
<h3>人物</h3>
<p>【人物：角色名】note_id = （创建后填入）</p>
<h3>场景</h3>
<p>【场景：场景名】note_id = （创建后填入）</p>
<h3>正文章节</h3>
<p>【第1章】note_id = （创建后填入）</p>
```

> **索引维护规则：**
> - 每创建一个新笔记，**立即**将其 note_id 回写到 meta 索引对应条目
> - 使用索引中的 note_id 访问笔记时，若返回 `BLOCK_NOT_FOUND` 或 `NOTE_NOT_FOUND`，则用 `search_notes` 重新定位，找到后**立即更新 meta 索引**
> - 索引是唯一真相来源，错误的 ID 不能留着，必须修正

#### 2-2：世界观笔记

```
title: 《小说名》世界观设定
tag: #小说名/设定/世界观

XML 内容包含：
<h1>《小说名》世界观设定</h1>
<p><tag>#小说名/设定/世界观</tag></p>
- 世界背景（时代/地理/社会结构）
- 核心规则（魔法体系/科技水平/社会规范）
- 特殊设定（独有元素）
- 禁忌与约束（这个世界做不到的事）
```

#### 2-3：人物笔记（每个主要角色一篇）

```
title: 人物设定 — 角色名
tag: #小说名/人物/主角：角色名

XML 内容包含：
<h1>人物设定 — 角色名</h1>
<p><tag>#小说名/人物/主角：角色名</tag></p>
- 外貌描述（详细，用于生图）：发色与发型、体型与身材比例、面部特征、着装偏好与典型服饰、标志性配件
- 性格特征（3-5 个核心词）
- 口头禅/说话风格
- 背景故事
- 与其他角色的关系
- 人物动机（想要什么/害怕什么）
- 当前状态：[初始状态，随剧情更新]
```

**人物形象变迁规则：**
- 当角色外貌发生显著变化（如受伤留疤、换装、成长蜕变、被诅咒改变容貌等），**不修改原始外貌描述**，在笔记末尾追加变迁历史：

```xml
<h2>形象变迁历史</h2>
<h3>第X章之后</h3>
<p>变迁类型：[受伤/换装/成长/魔化/其他...]</p>
<p>触发事件：[导致外貌变化的具体事件]</p>
<p>变迁描述：[详细说明外貌变成了什么样，哪些改变，哪些保留]</p>
<p>【变迁后形象图描述】[此图展示变迁后的外貌，角度/重点描述]</p>
[图片，生图失败时写 <p>（变迁形象图待补）</p>]
```

> 后续所有涉及该角色的生图 prompt，都必须使用**最新形象描述**（含最新变迁）而非初始描述。

创建完人物笔记后，**立即生成人物形象图**：

> ⚠️ **生成任何角色图片前，必须先完整阅读该角色笔记**，提取并记录以下人设细节，生图 prompt 必须包含所有这些细节以保证跨章一致性：
> - 发色与发型（如：银白色长直发、黑色短发、棕色卷发）
> - 体型与身材比例（如：修长高挑、娇小纤细、壮实宽肩）
> - 面部特征（如：眼睛颜色形状、肤色、标志性特征）
> - 着装偏好与典型服饰（如：总穿深色风衣、偏爱白色宽袖长袍）
> - 标志性配件（如：左耳银环、颈间红绳）
>
> 这些细节**非常非常重要**，后续所有涉及该角色的图片都必须严格遵循，不得出现与人设不符的外貌。

```
/ Step 0：阅读人物笔记，提取人设细节（必做，不可跳过）
read_note({ note_id: 人物笔记 })
→ 提取：发色、发型、体型、面部特征、着装偏好、标志性配件
→ 将这些细节全部写入 prompt

/ Step A：生成图片（4:3 尺寸，最大 2048x1536）
/ 注意：每 10 分钟最多生成 10 张图，生图失败时不要重试阻塞流程
/ 失败处理：先跳过，继续后续步骤；角色笔记里已有文字描述，后续回来发现没图再补
generate_image({
  prompt: "[角色名]，[发色发型]，[体型描述]，[面部特征]，[典型着装]，[标志性配件]，[体裁]插画风格，精细人物肖像，[主要色调]。限 500 字符以内",
  width: 2048,
  height: 1536
})
→ 成功：{ image_url: "https:/...", task_id: "..." }
→ 失败：跳过插图，在笔记对应位置写 <p>（形象图待补）</p>，继续后续流程

/ Step B：插入人物笔记末尾（生图成功时执行）
/ 先获取笔记末尾的 block_id
get_note_outline({ note_id: 人物笔记 })
→ 找到最后一个 block_id（last_block）

insert_image({
  note_id: 人物笔记,
  anchor_id: last_block,
  position: "after",
  src: image_url,
  alt: "角色名 初始形象图"
})
```

> 注意：每 10 分钟最多生成 10 张图。生图失败（含频率限制）时，**先用文字描述占位，继续其他流程，不要卡住**。后续回到该角色/场景笔记时，发现只有"（待补）"占位符，再补生即可。

#### 2-3b：场景设定笔记（剧情中出现的每个场景必须单独建档）

> ⚠️ **每个新场景必须独立创建设定笔记**，不可合并。场景设定必须包含：

```
title: 场景设定 — 场景名（如：陵风城·东市集）
tag: #小说名/设定/场景/场景名

XML 内容包含：
<h1>场景设定 — 场景名</h1>
<p><tag>#小说名/设定/场景/场景名</tag></p>
<h2>场景概述</h2>
<p>[场景类型：室内/室外/地下/空中等]</p>
<p>[所属区域/城市/世界位置]</p>
<p>[首次出现：第X章]</p>
<h2>环境细节（必须详尽，不可省略）</h2>
<p>地面：[材质、颜色、状态，如：青石板路，缝隙间长满苔藓，夜晚湿滑]</p>
<p>建筑/结构：[样式、材料、破损或完好程度、高度层次]</p>
<p>光线：[光源类型、颜色、照射角度、氛围感，如：吊挂的昏黄油灯，从窗缝透入的月光]</p>
<p>气味：[...]</p>
<p>声音：[...]</p>
<p>温度/气候：[...]</p>
<p>常驻元素：[固定摆设、标志性物件，如：门口总挂着半截破布帘、角落有一口锈迹斑斑的铁锅]</p>
<h2>配图</h2>
```

**场景配图规范：**
- 每个场景必须生成 **2–3 张不同角度的图**（如正面全景、内部视角、特写细节）
- **每张图上方必须有文字描述这张图的拍摄角度和画面重点**，格式如下：

```xml
<p>【正面全景】从街道正面望向入口，左侧是歪斜的木牌，右侧堆着货箱，光线从右上方斜入，整体色调昏黄。</p>
[图片]
<p>【内部视角】站在柜台后方向门口看，地面潮湿反光，远处是嘈杂的市集人影。</p>
[图片]
<p>【特写细节】柜台左角的铁锅，锈迹斑斑，锅沿磕了一块缺口，旁边搭着一块灰布。</p>
[图片]
```

生成场景图时，prompt 需包含：场景名称、所有环境细节、光线色调、体裁风格。

**场景变更规则：**
- 当场景在剧情中被**改变或破坏**（如房间被搜查翻乱、城门被攻破、密室被发现），**不修改原始描述**，而是在笔记末尾追加变更历史：

```xml
<h2>场景变更历史</h2>
<h3>第X章之后</h3>
<p>变更类型：[破坏/改造/废弃/占领...]</p>
<p>变更描述：[详细说明场景变成了什么样，哪些细节改变了，哪些保留了]</p>
<p>触发事件：[导致变更的具体事件]</p>
[变更后配图：每张图上方同样要有角度描述文字；生图失败时写 <p>（变更状态图待补）</p>]
```

生成场景/人物配图的通用规范：

> **默认图片尺寸：4:3，最大 2048×1536**
> **速率限制：每 10 分钟最多 10 张**
> **失败处理：生图失败（含频率超限）时，先在对应位置写 `<p>（图待补）</p>` 占位，继续后续流程，不阻塞创作。后续回到该笔记发现占位符时再补生即可，因为文字描述已经记录了所有细节。**

```
/ Step 1：根据场景细节描述，按顺序生成多角度图
/ 每张图生成前先写好描述文字（insert into 笔记），再生成图片插入
/ 生图失败时：写 <p>（图待补）</p> 占位，继续下一步

/ 角度 1（正面全景）
edit_block({ op: "insert", content: "<p>【正面全景】[角度描述]</p>" })
generate_image({ prompt: "[场景名]，[所有环境细节]，正面全景，[光线色调]，[体裁]插画风格，写实背景艺术", width: 2048, height: 1536 })
→ 成功：insert_image(...)
→ 失败：edit_block({ content: "<p>（正面全景图待补）</p>" })，继续

/ 角度 2（内部视角）
edit_block({ op: "insert", content: "<p>【内部视角】[角度描述]</p>" })
generate_image({ prompt: "[场景名]，[所有环境细节]，内部视角，[光线色调]，[体裁]插画风格", width: 2048, height: 1536 })
→ 成功：insert_image(...)
→ 失败：edit_block({ content: "<p>（内部视角图待补）</p>" })，继续

/ 角度 3（特写细节，可选）
edit_block({ op: "insert", content: "<p>【特写细节】[角度描述]</p>" })
generate_image({ prompt: "[标志性物件名称]，[细节描述]，特写，[体裁]插画风格", width: 2048, height: 1536 })
→ 成功：insert_image(...)
→ 失败：edit_block({ content: "<p>（特写图待补）</p>" })，继续
```

#### 2-4：剧情梗概笔记

```
title: 《小说名》剧情梗概
tag: #小说名/设定/剧情梗概

XML 内容包含：
<h1>《小说名》剧情梗概</h1>
<p><tag>#小说名/设定/剧情梗概</tag></p>
- 故事起点
- 主线走向（3-5 个关键转折点）
- 预计结局（可以模糊）
- 核心主题
```

#### 2-5：伏笔日志笔记（初始为空）

```
title: 《小说名》伏笔日志
tag: #小说名/设定/伏笔

初始内容：
<h1>《小说名》伏笔日志</h1>
<p><tag>#小说名/设定/伏笔</tag></p>
<p>（尚未埋入伏笔）</p>

后续每章追加格式（全局唯一编号 F-1、F-2…）：
<p>[F-1] 伏笔内容描述 → 埋入：第1章 / 状态：未回收</p>
<p>[F-2] 伏笔内容描述 → 埋入：第2章 / 已回收：第5章</p>
```

#### 2-6：剧情日志笔记（初始为空）

```
title: 《小说名》剧情日志
tag: #小说名/剧情日志

初始内容：
<h1>《小说名》剧情日志</h1>
<p><tag>#小说名/剧情日志</tag></p>
<p>（尚未开始写作）</p>

每章追加格式：
<h2>第X章《章节标题》</h2>
<p>主要事件：...</p>
<p>在场角色：...</p>
<p>埋入伏笔：...（若有，否则写"无"）</p>
<p>角色状态变化：...（若有，否则写"无"）</p>
<p>结尾句：[该章最后一句话]</p>
```

---

## 写作前上下文检查（每次必做）

正式写作前，AI **必须**完成以下 5 步：

### 检查 0：读 Meta，获取写作约束和笔记索引

```
/ 第一次启动时通过标签搜索找到 meta 笔记（此后通过索引直接访问）
search_notes({ tags: ["#小说名/meta"], limit: 1 })
→ note_id_meta

/ 读取整个 meta 笔记（包含基本信息 + 笔记索引）
read_note({ note_id: note_id_meta })
→ 从"基本信息"提取：章节目标字数、叙述视角、语言风格
→ 从"笔记索引"提取：世界观、剧情日志、伏笔日志、各角色、各场景、各章节的 note_id
→ 将这些 note_id 缓存在本次上下文中，后续步骤直接使用，无需再搜索
```

> **索引容错规则：** 使用索引中的 note_id 访问时，若返回错误，立即用 `search_notes` 重新定位，找到后调用 `edit_block` 更新 meta 索引中对应条目，再继续流程。

**将目标字数作为硬约束**：写作时严格控制在目标字数 ±20% 以内。

### 检查 1：读上一章结尾

```
/ 从 meta 索引取最新章节 note_id（检查 0 已缓存）
/ 若索引里有多章，取编号最大的那条

read_note({ note_id: 最新章节note_id })
→ 或用 read_blocks 读末尾约 300-500 字：
get_note_outline({ note_id: 最新章节note_id })
→ 找到后几个 block_id
read_blocks({ note_id: 最新章节note_id, block_id: 倒数第二个block, after: 5 })
→ 读取结尾内容
```

记录：最后的情绪基调、主角所在位置、时间点。

### 检查 2：扫描剧情日志

```
/ 从 meta 索引取剧情日志 note_id（检查 0 已缓存）
read_note({ note_id: 剧情日志note_id })
→ 读取全文
```

关注：未回收的伏笔（本章适合回收吗？）、近期章节走向、有无角色消失太久。

### 检查 3：读本章相关角色状态

```
/ 从 meta 索引取将要出场角色的 note_id（检查 0 已缓存）
search_note_content({ note_id: 角色note_id, query: "当前状态" })
→ 定位"当前状态"block_id
read_blocks({ note_id: 角色note_id, block_id: 当前状态block })
→ 确认角色状态（含最新形象变迁）
```

### 检查 4：处理用户特殊需求（若有）

当用户提出"这章要出现 XX"、"处理某件事"等要求：

```
/ 语义检索相关设定
search_notes({ keyword: "用户提到的关键词", tags: ["#小说名"] })
→ 确认相关设定细节

/ 检查剧情日志有无相关铺垫
search_note_content({ note_id: 剧情日志, query: "关键词" })
→ 确认前文有无伏笔
```

### 检查 5：确认本章涉及的场景

对本章将要出现的每个场景：

```
/ 检索场景设定笔记
search_notes({ keyword: "场景名", tags: ["#小说名/设定/场景"] })
```

- **已有场景**：读取场景笔记，确认当前状态（是否有变更历史），写作时严格遵循
- **新场景首次登场**：在写作之前必须先创建场景设定笔记（含细节描述 + 多角度配图），再开始写正文

---

## 正式写作

> ### ⛔ 绝对禁止：在对话中输出小说正文
>
> **AI 不允许在对话消息里写任何小说正文，无论任何情况，无一例外。**
>
> - 禁止在对话中写正文、片段、示范、草稿，哪怕只有一句话
> - 禁止以"以下是本章内容"、"正文如下"等任何形式在消息里输出正文
> - **唯一合法的写作方式**：调用 `create_note` + `batch_edit` 将正文写入 WPS 笔记
> - 写完后对话中只允许出现：章节标题、字数、一句话剧情摘要、"笔记已保存"
> - 用户若要阅读，引导其打开笔记，AI 不在对话里展示内容
>
> 违反以上任一条，即为执行错误，必须立刻停止并重新通过工具写入。

根据 Meta 笔记中的风格约束进行写作。

**写作 6 原则：**
1. **字数约束**：严格控制在 Meta 笔记中"章节目标字数"的 ±20% 以内（硬约束，不可忽略）
2. **不穿帮**：所有细节（地名、角色能力、人际关系）必须与设定笔记一致
3. **风格一致**：严格遵循 Meta 笔记中的叙述视角、语言风格描述
4. **节奏控制**：每章有起伏，不要全程平铺
5. **结尾钩子**：每章结尾留悬念或情绪钩子
6. **多样性**：不同章节可变换焦点、张弛节奏，避免雷同

**写作执行流程：**
1. 在内部生成完整章节正文（绝不输出到对话）
2. 立即调用 `create_note` + `batch_edit` 写入 WPS 笔记（见"归档 1"）
3. 写入成功后，在对话中只告知用户：章节标题、字数、一句话剧情摘要、笔记已保存
4. 随后自动完成归档 2–5（日志、角色状态、伏笔、进度）

---

## 写作后归档（每次必做，全自动）

章节正文写完后立即执行，**无需用户参与**。

### 归档 1：创建正文笔记（写作时同步执行）

```
create_note({ title: "第X章 章节名" })
→ { fileId: new_note_id }

get_note_outline({ note_id: new_note_id })
→ { blocks: [{ id: "p_empty", type: "paragraph" }] }

batch_edit({ note_id: new_note_id, operations: [
  { op: "replace", block_id: "p_empty",   content: "<h1>第X章 章节名</h1><p><tag>#小说名/正文/第X章</tag></p><p>正文第一段...</p><p>正文第二段...</p>..." }
]})

/ 写入成功后，立即将新章节 note_id 回写到 meta 索引
search_note_content({ note_id: meta笔记, query: "笔记索引" })
→ 定位索引区块末尾 block_id（正文章节部分）
edit_block({ note_id: meta笔记, op: "insert",
  anchor_id: 章节索引末尾block,
  position: "after",
  content: "<p>【第X章】note_id = new_note_id</p>"
})
```

### 归档 2：追加剧情日志（必做）

每章写完后**必须**追加到剧情日志，字段不可省略。

```
get_note_outline({ note_id: 剧情日志 })
→ 获取 last_block_id

edit_block({ note_id: 剧情日志, op: "insert",
  anchor_id: last_block_id, position: "after",
  content: "
    <h2>第X章《章节标题》</h2>
    <p>主要事件：[本章核心剧情一两句]</p>
    <p>在场角色：[角色名, 角色名, ...]</p>
    <p>角色状态变化：[无 / 角色名：[变化描述]]</p>
    <p>结尾句：[本章最后一句原文]</p>
    <h3>本章伏笔清单</h3>
    <p>【新埋】[伏笔编号 F-X] [伏笔描述] → 状态：未回收</p>
    <p>【新埋】[伏笔编号 F-X] [伏笔描述] → 状态：未回收</p>
    <p>（本章无新埋伏笔则写：本章无新伏笔）</p>
    <p>【回收】[伏笔编号 F-X] [伏笔描述] → 已回收（本章）</p>
    <p>（本章无回收则省略此行）</p>
    <p>累计未回收伏笔：[F-1、F-3、F-5...] 共 N 条</p>
  "
})
```

> **伏笔编号规则**：全局唯一，按埋入顺序编号，格式 `F-1`、`F-2`……跨章一致，方便追踪。

### 归档 3：更新角色当前状态

对本章中状态发生变化的角色：

```
/ 定位角色笔记中的"当前状态"字段
search_note_content({ note_id: 角色笔记, query: "当前状态" })
→ 定位 block_id

/ 替换状态描述
edit_block({ note_id: 角色笔记, op: "replace",
  block_id: 状态block_id,
  content: "<p>当前状态：[新状态描述]</p>"
})
```

### 归档 4：同步伏笔日志（必做，每章都要执行）

无论本章有无新伏笔，都必须执行此步骤，保证伏笔日志与剧情日志中的清单一致。

**情况 A：本章埋入新伏笔**

```
get_note_outline({ note_id: 伏笔日志 }) → 获取 last_block_id

edit_block({ note_id: 伏笔日志, op: "insert",
  anchor_id: last_block_id, position: "after",
  content: "<p>[F-X] [伏笔描述] → 埋入：第X章 / 状态：未回收</p>"
})
```

**情况 B：本章回收了已有伏笔**

```
search_note_content({ note_id: 伏笔日志, query: "F-X" }) → 定位 block_id

edit_block({ note_id: 伏笔日志, op: "replace",
  block_id: 伏笔block_id,
  content: "<p>[F-X] [伏笔描述] → 埋入：第X章 / 已回收：第Y章</p>"
})
```

**情况 C：本章无伏笔变动（也必须执行）**

```
/ 读取伏笔日志，核对"累计未回收"数量与剧情日志最新条目一致
search_note_content({ note_id: 伏笔日志, query: "未回收" })
→ 若数量与剧情日志对得上，归档完成；若对不上，逐条比对补齐
```

### 归档 5：更新 Meta 进度

```
search_note_content({ note_id: meta笔记, query: "当前进度" })
→ 定位 block_id

edit_block({ note_id: meta笔记, op: "replace",
  block_id: 进度block_id,
  content: "<p>当前进度：第 X 章</p>"
})
```

---

## 防穿帮速查表

| 穿帮类型 | 触发场景 | 防护措施 |
|---------|---------|---------|
| 角色状态矛盾 | 第三章受伤，第四章却行动如常 | 写前读角色"当前状态"字段 |
| 能力越界 | 角色突然会了设定里没有的技能 | 写前读世界观/角色设定笔记 |
| 人际关系错误 | 已决裂的人突然像老朋友 | 读人物关系图笔记 |
| 地理矛盾 | 三天路程突然一天到 | 场景笔记标注地理距离 |
| 场景细节矛盾 | 同一地点描述前后不一致 | 写前读场景设定笔记，照实执行细节 |
| 场景状态错误 | 已破坏的房间又恢复原样 | 查看场景变更历史，使用最新状态 |
| 角色外貌不一致 | 同一角色发色或着装前后矛盾 | 生图/写作前必须先读人物笔记人设细节 |
| 伏笔遗忘 | 第二章埋的东西从未回收 | 每次写前扫描剧情日志 |
| 时间线混乱 | 事件先后顺序不清楚 | 剧情日志按章节顺序记录 |

---

## 特殊情况处理

### 用户想改变已有设定

处理流程：
1. `search_notes({ keyword: 角色名/设定名, tags: ["#小说名"] })` 找出所有相关笔记
2. 评估影响范围，告知用户（一句话说明）
3. 确认后，批量更新相关笔记
4. 在剧情日志中标注"设定变更点：第X章起，XX设定改为YY"

### 用户想插入新角色

处理流程：
1. 询问："这个角色有什么特点？"（如用户没想法，AI 直接生成）
2. 创建人物笔记 → 生成形象图
3. 在人物关系图笔记中追加与已有角色的关系
4. 检查前文是否适合补充伏笔铺垫

### 用户想跳章节写

处理流程：
1. 在剧情日志中为跳过的章节预留标记：`<p>[待写] 第X章 占位</p>`
2. 在 Meta 笔记"当前进度"后追加"跳写记录：第X章已写，第Y章待补"
3. 正常写指定章节并存档

---

## 完整工具调用参考

### 续写序列（快速参考）

```
Step 1：加载 meta 笔记（索引 + 风格约束）
/ 首次使用标签搜索定位 meta，后续直接用已知 note_id
search_notes({ tags: ["#小说名/meta"], limit: 1 }) → note_id_meta
read_note({ note_id: note_id_meta })
→ 从"基本信息"取：目标字数、叙述视角、语言风格
→ 从"笔记索引"取：剧情日志、伏笔日志、各角色、各场景、最新章节的 note_id
→ 将所有 note_id 缓存在本次上下文

Step 2：读最新章节结尾（用索引中的 note_id 直接访问）
get_note_outline({ note_id: 最新章节note_id })
read_blocks({ note_id: 最新章节note_id, block_id: 倒数block, after: 5 })

Step 3：扫描剧情日志（直接用索引 note_id）
read_note({ note_id: 剧情日志note_id })

Step 4：[如有用户需求] 检索设定
/ 先从 meta 索引查找对应笔记的 note_id
/ 索引中没有时再用 search_notes，找到后更新索引

Step 5：写作

Step 6：存档（见"写作后归档"章节，含回写 note_id 到索引）
```

---

## Troubleshooting

### 找不到已有小说笔记

```
/ 先从 meta 索引直接读取 note_id（检查 0 已加载）
/ 若 meta 索引中的 note_id 访问失败，执行以下修复流程：
search_notes({ keyword: "小说名" })
list_notes({ sort: "update_time", direction: "desc", limit: 20 })
/ 找到正确 note_id 后，立即更新 meta 索引中对应条目
```

### 生图失败（GENERATE_IMAGE_FAILED 或 RATE_LIMITED）

- **不要重试阻塞流程**：生图失败时，在对应位置写 `<p>（图待补）</p>` 占位，继续后续步骤
- 因为文字描述已经完整记录了所有细节，后续回到该笔记时发现占位符再补生即可
- 速率限制说明：每 10 分钟最多生成 10 张图，超出时同样按失败处理，占位继续

### BLOCK_NOT_FOUND 错误

编辑操作后 block_id 会变化，需刷新：
```
get_note_outline({ note_id })
→ 获取最新 block_id 后重试
```

### 剧情日志太长导致读取缓慢

当日志超过 medium（>20K 字）时，改用精准搜索：
```
search_note_content({ note_id: 剧情日志, query: "未回收" })
→ 只读未回收的伏笔条目
```

---

## 与其他 Skill 的配合

| 场景 | 配合 Skill |
|------|-----------|
| 写完后发公众号 | wechat-publisher |
| 生成小红书图片 | xiaohongshu-article-layout |
| 回顾笔记找灵感 | ie-recall-memory / ie-engine |
| 整理标签 | tag-organize |
| 美化设定笔记排版 | wpsnote-beautifier |

