novelws 5.1.0 → 5.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +52 -0
- package/README.md +54 -3
- package/dist/cli.js +3 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/dashboard.d.ts +3 -0
- package/dist/commands/dashboard.d.ts.map +1 -0
- package/dist/commands/dashboard.js +42 -0
- package/dist/commands/dashboard.js.map +1 -0
- package/dist/commands/init.d.ts.map +1 -1
- package/dist/commands/init.js +18 -4
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/upgrade.d.ts.map +1 -1
- package/dist/commands/upgrade.js +23 -0
- package/dist/commands/upgrade.js.map +1 -1
- package/dist/core/config.d.ts +4 -1
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/config.js +5 -2
- package/dist/core/config.js.map +1 -1
- package/dist/server/datasource/db.d.ts +38 -0
- package/dist/server/datasource/db.d.ts.map +1 -0
- package/dist/server/datasource/db.js +323 -0
- package/dist/server/datasource/db.js.map +1 -0
- package/dist/server/datasource/fs.d.ts +30 -0
- package/dist/server/datasource/fs.d.ts.map +1 -0
- package/dist/server/datasource/fs.js +308 -0
- package/dist/server/datasource/fs.js.map +1 -0
- package/dist/server/datasource/index.d.ts +11 -0
- package/dist/server/datasource/index.d.ts.map +1 -0
- package/dist/server/datasource/index.js +33 -0
- package/dist/server/datasource/index.js.map +1 -0
- package/dist/server/index.d.ts +12 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +69 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/routes/characters.d.ts +4 -0
- package/dist/server/routes/characters.d.ts.map +1 -0
- package/dist/server/routes/characters.js +27 -0
- package/dist/server/routes/characters.js.map +1 -0
- package/dist/server/routes/plots.d.ts +4 -0
- package/dist/server/routes/plots.d.ts.map +1 -0
- package/dist/server/routes/plots.js +36 -0
- package/dist/server/routes/plots.js.map +1 -0
- package/dist/server/routes/protagonist.d.ts +4 -0
- package/dist/server/routes/protagonist.d.ts.map +1 -0
- package/dist/server/routes/protagonist.js +46 -0
- package/dist/server/routes/protagonist.js.map +1 -0
- package/dist/server/routes/relationships.d.ts +4 -0
- package/dist/server/routes/relationships.d.ts.map +1 -0
- package/dist/server/routes/relationships.js +27 -0
- package/dist/server/routes/relationships.js.map +1 -0
- package/dist/server/routes/stats.d.ts +4 -0
- package/dist/server/routes/stats.d.ts.map +1 -0
- package/dist/server/routes/stats.js +21 -0
- package/dist/server/routes/stats.js.map +1 -0
- package/dist/server/routes/stories.d.ts +4 -0
- package/dist/server/routes/stories.d.ts.map +1 -0
- package/dist/server/routes/stories.js +80 -0
- package/dist/server/routes/stories.js.map +1 -0
- package/dist/server/routes/timeline.d.ts +4 -0
- package/dist/server/routes/timeline.d.ts.map +1 -0
- package/dist/server/routes/timeline.js +17 -0
- package/dist/server/routes/timeline.js.map +1 -0
- package/dist/server/types.d.ts +199 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +2 -0
- package/dist/server/types.js.map +1 -0
- package/dist/utils/diagnostics.d.ts +2 -2
- package/dist/utils/diagnostics.d.ts.map +1 -1
- package/dist/utils/diagnostics.js +46 -59
- package/dist/utils/diagnostics.js.map +1 -1
- package/package.json +13 -3
- package/templates/commands/analyze.md +20 -8
- package/templates/commands/expand.md +46 -20
- package/templates/commands/plan.md +3 -2
- package/templates/commands/specify.md +6 -2
- package/templates/commands/write.md +77 -24
- package/templates/dot-claude/CLAUDE.md +48 -8
- package/templates/resources/anti-ai.md +92 -13
- package/templates/resources/constitution.md +83 -140
- package/templates/resources/style-reference.md +30 -6
- package/templates/scripts/db_context.py +609 -0
- package/templates/scripts/db_init_protagonist.py +343 -0
- package/templates/scripts/db_sync.py +611 -0
- package/templates/scripts/db_volume_switch.py +278 -0
- package/templates/scripts/phase_a_init_db.py +428 -0
- package/templates/scripts/requirements.txt +1 -0
- package/templates/tracking/character-state.json +1 -3
- package/templates/tracking/plot-tracker.json +1 -5
- package/templates/tracking/relationships.json +1 -3
- package/templates/tracking/timeline.json +1 -3
- package/templates/volume-outline.md +31 -0
- package/templates/volume-summary.md +20 -0
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: 质量检查:对比概要与正文,检测一致性和AI味
|
|
3
3
|
argument-hint: [章节号] [--range start-end]
|
|
4
4
|
recommended-model: claude-sonnet-4-5-20250929
|
|
5
|
-
allowed-tools: Read(//stories/**), Read(//
|
|
5
|
+
allowed-tools: Read(//stories/**), Read(//resources/anti-ai.md), Bash(ls:*), Bash(python:scripts/*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
用户输入:$ARGUMENTS
|
|
@@ -16,11 +16,23 @@ allowed-tools: Read(//stories/**), Read(//tracking/**), Bash(ls:*)
|
|
|
16
16
|
- 章节号:分析单章
|
|
17
17
|
- `--range start-end`:批量分析章节范围(如 `--range 1-20`)
|
|
18
18
|
|
|
19
|
+
## 卷定位
|
|
20
|
+
|
|
21
|
+
根据章节号和 `stories/<story>/creative-plan.md` 确定目标章节所属卷(如 `vol-001`)。
|
|
22
|
+
|
|
19
23
|
## 资源加载
|
|
20
24
|
|
|
21
|
-
- 目标章节正文:`stories/<story>/content/chapter-
|
|
22
|
-
- 对应概要:`stories/<story>/content/chapter-
|
|
23
|
-
-
|
|
25
|
+
- 目标章节正文:`stories/<story>/volumes/vol-XXX/content/chapter-YYY.md`
|
|
26
|
+
- 对应概要:`stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`
|
|
27
|
+
- 卷级 tracking:`stories/<story>/volumes/vol-XXX/tracking/character-state.json`、`stories/<story>/volumes/vol-XXX/tracking/plot-tracker.json`
|
|
28
|
+
|
|
29
|
+
**DB 增强模式**:如果 `resources/config.json` 中 `database.enabled = true`,可用 DB 上下文替代 tracking 文件读取:
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
python scripts/db_context.py --chapter <全局章节号> --mode analyze
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
输出包含本章伏笔检查清单、角色状态基准、时间线连续性和一致性警告。输出还包含主角能力基准(技能习得时间线 + 道具持有状态),用于检测正文中是否使用了尚未习得的技能或不持有的道具。
|
|
24
36
|
|
|
25
37
|
## 检查项(5项)
|
|
26
38
|
|
|
@@ -58,11 +70,11 @@ allowed-tools: Read(//stories/**), Read(//tracking/**), Bash(ls:*)
|
|
|
58
70
|
评分:✅ / ⚠️ / ❌
|
|
59
71
|
|
|
60
72
|
### 5. AI味检测
|
|
61
|
-
|
|
62
|
-
- AI
|
|
63
|
-
-
|
|
73
|
+
读取 `resources/anti-ai.md` 的禁用词表,对照正文检查:
|
|
74
|
+
- AI高频词使用(对照禁用词汇清单逐项检查)
|
|
75
|
+
- 句式重复度(连续相同结构、段落开头重复)
|
|
64
76
|
- 空洞描写比例
|
|
65
|
-
-
|
|
77
|
+
- 段落结构单一性(是否全部 3-4 句等长段落)
|
|
66
78
|
|
|
67
79
|
评分:✅ 自然 / ⚠️ 轻微AI味 / ❌ 明显AI味
|
|
68
80
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
description: 将章节概要扩写为 3000-5000 字正文
|
|
3
3
|
argument-hint: [章节号] [--batch N]
|
|
4
4
|
recommended-model: claude-opus-4-6
|
|
5
|
-
allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracking/**), Write(//tracking/**), Read(//resources/style-reference.md), Read(//resources/anti-ai.md), Read(//resources/constitution.md), Bash(ls:*)
|
|
5
|
+
allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//stories/**/tracking/**), Write(//stories/**/tracking/**), Read(//resources/style-reference.md), Read(//resources/anti-ai.md), Read(//resources/constitution.md), Bash(ls:*), Bash(python:scripts/*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
用户输入:$ARGUMENTS
|
|
@@ -25,45 +25,63 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
25
25
|
- 章节号:从 $ARGUMENTS 提取
|
|
26
26
|
- `--batch N`:批量扩写 N 章(最大 10),从指定章节号开始
|
|
27
27
|
|
|
28
|
+
## 卷定位
|
|
29
|
+
|
|
30
|
+
根据章节号和 `stories/<story>/creative-plan.md` 中每卷的章节范围,确定目标章节所属的卷目录(如 `vol-001`)。
|
|
31
|
+
|
|
32
|
+
路径规则:
|
|
33
|
+
- 概要:`stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`
|
|
34
|
+
- 正文:`stories/<story>/volumes/vol-XXX/content/chapter-YYY.md`
|
|
35
|
+
- Tracking:`stories/<story>/volumes/vol-XXX/tracking/`
|
|
36
|
+
|
|
28
37
|
## 资源加载(3 层结构,从文件系统重新加载)
|
|
29
38
|
|
|
30
39
|
所有资源必须从文件系统读取,不复用对话中的缓存。总上下文控制在 3500 字以内。
|
|
31
40
|
|
|
41
|
+
**DB 增强模式**:如果 `resources/config.json` 中 `database.enabled = true`,可用 DB 上下文替代第 3 层的 tracking 文件读取:
|
|
42
|
+
|
|
43
|
+
```
|
|
44
|
+
python scripts/db_context.py --chapter <全局章节号> --mode expand
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
输出包含本章伏笔、活跃角色状态、角色关系、前序衔接,直接替代手动读取 tracking JSON。输出还包含主角当前修为、可用技能和道具清单,确保扩写中主角能力使用不超出已有设定。第 1、2 层仍从文件系统加载。
|
|
48
|
+
|
|
32
49
|
### 第 1 层 — 全局视角
|
|
33
50
|
|
|
34
51
|
1. **specification.md 摘要**:读取 `stories/<story>/specification.md`,提取 100 字核心摘要(类型 + 主角 + 核心冲突)
|
|
35
52
|
2. **当前卷大纲**:读取 `stories/<story>/creative-plan.md`,只提取当前章节所属卷的段落
|
|
53
|
+
3. **volume-summary.md**:读取 `stories/<story>/volumes/vol-XXX/volume-summary.md`(跨卷上下文,500-1000 字)
|
|
36
54
|
|
|
37
55
|
### 第 2 层 — 章节核心
|
|
38
56
|
|
|
39
|
-
|
|
40
|
-
|
|
57
|
+
4. **当前章概要**:读取 `stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`(200-500字)
|
|
58
|
+
5. **前一章正文末尾**:读取前一章 `chapter-YYY.md` 的最后 500-800 字(衔接用)。如果前一章在上一卷,从上一卷的 content/ 读取。如果前一章尚未扩写,读取前一章概要代替
|
|
41
59
|
|
|
42
60
|
### 第 3 层 — 细节支撑
|
|
43
61
|
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
62
|
+
6. **本章出场角色状态**:从概要中提取出场角色列表,然后从 `volumes/vol-XXX/tracking/character-state.json` 只提取这些角色的条目。如果角色在本卷 tracking 中不存在,从 volume-summary.md 的活跃角色状态中查找
|
|
63
|
+
7. **本章活跃伏笔**:从 `volumes/vol-XXX/tracking/plot-tracker.json` 提取 status=planted 或 status=hinted 的伏笔。补充 volume-summary.md 中的活跃伏笔
|
|
64
|
+
8. **本章相关角色关系**:从 `volumes/vol-XXX/tracking/relationships.json` 提取本章出场角色之间的关系条目(最多 5 条)。补充 volume-summary.md 中的关键关系
|
|
65
|
+
9. **风格参考**:读取 `resources/style-reference.md`
|
|
66
|
+
10. **反AI规范**:读取 `resources/anti-ai.md`
|
|
49
67
|
|
|
50
68
|
**上下文预算**:
|
|
51
69
|
|
|
52
70
|
| 层级 | 预估字数 |
|
|
53
71
|
|------|---------|
|
|
54
|
-
| 第 1 层 全局 |
|
|
72
|
+
| 第 1 层 全局 | 700-1400 字(含 volume-summary) |
|
|
55
73
|
| 第 2 层 章节 | 700-1300 字 |
|
|
56
74
|
| 第 3 层 细节 | 800-1500 字 |
|
|
57
|
-
| **总计** | **
|
|
75
|
+
| **总计** | **2200-4200 字** |
|
|
58
76
|
|
|
59
|
-
|
|
77
|
+
每层加载完后检查上下文预算,超出则截断。volume-summary.md 超长时只保留活跃角色状态和活跃伏笔部分。
|
|
60
78
|
|
|
61
79
|
## 执行步骤
|
|
62
80
|
|
|
63
81
|
### 1. 前置检查
|
|
64
82
|
|
|
65
83
|
- 确认目标章节的 synopsis.md 存在,否则提示先运行 /write
|
|
66
|
-
- 确认目标章节的正文 chapter-
|
|
84
|
+
- 确认目标章节的正文 chapter-YYY.md 不存在(避免覆盖),如已存在则询问是否覆盖
|
|
67
85
|
|
|
68
86
|
### 2. 加载上下文
|
|
69
87
|
|
|
@@ -75,29 +93,37 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
75
93
|
|
|
76
94
|
- **忠实于概要**:核心事件、出场角色、情感走向必须与概要一致
|
|
77
95
|
- **全局一致性**:正文必须与 specification.md 的类型定位和 creative-plan.md 的卷级设计保持一致
|
|
78
|
-
- **角色关系驱动**:对话和互动必须体现 relationships.json 中的关系动态
|
|
96
|
+
- **角色关系驱动**:对话和互动必须体现 tracking/relationships.json 中的关系动态
|
|
79
97
|
- **文学表达**:专注于场景描写、对话、心理活动、动作细节
|
|
80
98
|
- **风格一致**:遵循 style-reference.md 的风格设定
|
|
81
99
|
- **反AI规范**:遵循 anti-ai.md 的写作规范
|
|
82
100
|
- **衔接自然**:与前一章末尾自然衔接
|
|
83
101
|
- **伏笔落地**:概要中标记的伏笔必须在正文中体现
|
|
84
102
|
|
|
85
|
-
写入 `stories/<story>/content/chapter-
|
|
103
|
+
写入 `stories/<story>/volumes/vol-XXX/content/chapter-YYY.md`。
|
|
86
104
|
|
|
87
|
-
### 4.
|
|
105
|
+
### 4. 补充卷级 tracking 细节
|
|
88
106
|
|
|
89
107
|
扩写完成后,检查正文中是否产生了概要中没有的新细节:
|
|
90
|
-
- 对话中透露的新信息 → 更新 character-state 或 relationships
|
|
108
|
+
- 对话中透露的新信息 → 更新 `volumes/vol-XXX/tracking/` 中的 character-state 或 relationships
|
|
91
109
|
- 新的场景细节 → 如有重要设定变化,更新相关 tracking
|
|
92
110
|
|
|
93
|
-
### 5.
|
|
111
|
+
### 5. DB 同步(可选)
|
|
112
|
+
|
|
113
|
+
如果 `resources/config.json` 中 `database.enabled = true`,在 tracking 更新完成后运行:
|
|
114
|
+
|
|
115
|
+
```
|
|
116
|
+
python scripts/db_sync.py --vol <当前卷号>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
### 6. 批量模式
|
|
94
120
|
|
|
95
121
|
如果指定了 `--batch N`,重复步骤 2-4 共 N 次。每章完成后输出进度和字数。
|
|
96
122
|
|
|
97
|
-
|
|
123
|
+
**批量模式资源隔离**:每章都必须重新从文件系统加载所有资源。批量模式中每章视为独立的扩写任务。如果批量过程中跨卷,需要切换到下一卷的 tracking 和 content 目录。
|
|
98
124
|
|
|
99
|
-
###
|
|
125
|
+
### 7. 后续建议
|
|
100
126
|
|
|
101
|
-
单章完成:「第X章扩写完成(XXXX
|
|
127
|
+
单章完成:「第X章扩写完成(XXXX字,vol-XXX)。继续 /expand [X+1] 或使用 /analyze X 检查质量。」
|
|
102
128
|
|
|
103
129
|
批量完成:「第X-Y章扩写完成(共Z章,平均XXXX字/章)。使用 /analyze --range X-Y 批量检查质量。」
|
|
@@ -48,7 +48,8 @@ allowed-tools: Read(//stories/**/specification.md), Read(//stories/**/creative-p
|
|
|
48
48
|
- 主线概要:
|
|
49
49
|
|
|
50
50
|
## 第一卷:[卷名]
|
|
51
|
-
-
|
|
51
|
+
- 卷目录:vol-001
|
|
52
|
+
- 章节范围:第1-XX章(chapter-001 到 chapter-XXX)
|
|
52
53
|
- 核心主题:
|
|
53
54
|
- 核心冲突:
|
|
54
55
|
- 转折点:
|
|
@@ -67,4 +68,4 @@ allowed-tools: Read(//stories/**/specification.md), Read(//stories/**/creative-p
|
|
|
67
68
|
|
|
68
69
|
### 4. 后续建议
|
|
69
70
|
|
|
70
|
-
输出:「卷级大纲生成完成。下一步请使用 /write 1
|
|
71
|
+
输出:「卷级大纲生成完成。下一步请使用 /write 1 开始逐章生成剧情概要(系统会自动创建 volumes/vol-001/ 目录结构)。可用 /write --batch 20 批量生成。」
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
description: 定义故事规格,明确要创造什么样的作品
|
|
3
3
|
argument-hint: [故事描述]
|
|
4
|
-
allowed-tools: Read(//stories/**/specification.md), Write(//stories/**/specification.md), Read(//resources/constitution.md), Write(//resources/style-reference.md), Bash(ls:*), Bash(mkdir:*)
|
|
4
|
+
allowed-tools: Read(//stories/**/specification.md), Write(//stories/**/specification.md), Read(//resources/constitution.md), Read(//resources/anti-ai.md), Write(//resources/style-reference.md), Bash(ls:*), Bash(mkdir:*)
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
用户输入:$ARGUMENTS
|
|
@@ -70,7 +70,11 @@ allowed-tools: Read(//stories/**/specification.md), Write(//stories/**/specifica
|
|
|
70
70
|
|
|
71
71
|
### 4. 生成风格参考
|
|
72
72
|
|
|
73
|
-
如果 `resources/style-reference.md` 仍是模板默认内容(含 `[第一人称/第三人称有限/第三人称全知]
|
|
73
|
+
如果 `resources/style-reference.md` 仍是模板默认内容(含 `[第一人称/第三人称有限/第三人称全知]`),根据用户的风格偏好自动填充:
|
|
74
|
+
|
|
75
|
+
- 在「故事类型」字段填入步骤 2 中确定的类型
|
|
76
|
+
- 参考模板中的 HTML 注释提示,为每个维度选择符合该类型的默认值(用户未明确指定时)
|
|
77
|
+
- 读取 `resources/anti-ai.md` 的「类型特有禁用词」段落,将对应类型的禁用词追加到「风格禁忌」字段
|
|
74
78
|
|
|
75
79
|
### 5. 后续建议
|
|
76
80
|
|
|
@@ -1,43 +1,86 @@
|
|
|
1
1
|
---
|
|
2
|
-
description: 逐章生成剧情概要(200-500
|
|
2
|
+
description: 逐章生成剧情概要(200-500字),严格控制字数,同步更新 tracking
|
|
3
3
|
argument-hint: [章节号] [--batch N]
|
|
4
4
|
recommended-model: claude-opus-4-6
|
|
5
|
-
allowed-tools: Read(//stories/**), Write(//stories
|
|
5
|
+
allowed-tools: Read(//stories/**), Write(//stories/**), Bash(ls:*), Bash(mkdir:*), Bash(python:scripts/*)
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
用户输入:$ARGUMENTS
|
|
9
9
|
|
|
10
10
|
## 目标
|
|
11
11
|
|
|
12
|
-
为指定章节生成 200-500
|
|
12
|
+
为指定章节生成 200-500 字的纯剧情概要(严格控制字数),同步生成 tracking 骨架数据。
|
|
13
13
|
|
|
14
14
|
## 参数解析
|
|
15
15
|
|
|
16
16
|
- 章节号:从 $ARGUMENTS 提取,如 `1`、`42`
|
|
17
17
|
- `--batch N`:批量生成 N 章概要(最大 20),从指定章节号开始
|
|
18
18
|
|
|
19
|
-
##
|
|
19
|
+
## 卷定位
|
|
20
20
|
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
根据章节号和 `stories/<story>/creative-plan.md` 中每卷的章节范围,确定目标章节所属的卷目录(如 `vol-001`)。
|
|
22
|
+
|
|
23
|
+
路径规则:
|
|
24
|
+
- 概要:`stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`
|
|
25
|
+
- Tracking:`stories/<story>/volumes/vol-XXX/tracking/`
|
|
26
|
+
|
|
27
|
+
### 首次写入某卷时的初始化
|
|
28
|
+
|
|
29
|
+
如果 `volumes/vol-XXX/` 目录不存在,自动创建:
|
|
30
|
+
|
|
31
|
+
1. 创建 `volumes/vol-XXX/content/` 和 `volumes/vol-XXX/tracking/`
|
|
32
|
+
2. 初始化 4 个空 tracking 文件(同 templates/tracking/ 的初始内容)
|
|
33
|
+
3. 如果是第一卷(vol-001),生成初始 volume-summary.md(空状态,从 specification.md 提取基本信息)
|
|
34
|
+
4. 如果不是第一卷,执行「卷切换」流程(见下方)
|
|
35
|
+
|
|
36
|
+
### 卷切换流程
|
|
37
|
+
|
|
38
|
+
当目标章节属于新卷时(上一卷已完成):
|
|
39
|
+
|
|
40
|
+
**路径 A — DB 模式**(`resources/config.json` 中 `database.enabled = true`):
|
|
41
|
+
|
|
42
|
+
运行 `python scripts/db_volume_switch.py --vol <新卷号>` 自动生成 volume-summary.md。输出还包含主角当前修炼进度、技能清单和道具状态,用于概要中主角能力描写的一致性。
|
|
43
|
+
|
|
44
|
+
**路径 B — 文件模式**(默认):
|
|
45
|
+
|
|
46
|
+
1. 读取上一卷 `volumes/vol-NNN/tracking/` 的 4 个 JSON 文件
|
|
47
|
+
2. 读取上一卷最后一章 synopsis 的章末钩子
|
|
48
|
+
3. 读取 `creative-plan.md` 中下一卷的大纲段落
|
|
49
|
+
4. 生成新卷的 `volume-summary.md`:
|
|
50
|
+
- 故事进度:已完成的章节范围
|
|
51
|
+
- 活跃角色状态:从 character-state.json 提取最近 2 卷出场过的角色
|
|
52
|
+
- 活跃伏笔:从 plot-tracker.json 提取 status=planted/hinted 的条目
|
|
53
|
+
- 关键关系:从 relationships.json 提取活跃角色间的关系
|
|
54
|
+
- 待续悬念:上一卷末章的章末钩子
|
|
55
|
+
5. volume-summary.md 控制在 500-2000 字(严格控制字数)
|
|
56
|
+
|
|
57
|
+
## 资源加载(卷级)
|
|
58
|
+
|
|
59
|
+
1. **specification.md 摘要**:读取 `stories/<story>/specification.md`,提取 100 字核心摘要(类型 + 主角 + 核心冲突)
|
|
60
|
+
2. **当前卷大纲**:读取 `stories/<story>/creative-plan.md`,只提取当前卷的段落
|
|
61
|
+
3. **volume-summary.md**:读取 `stories/<story>/volumes/vol-XXX/volume-summary.md`(跨卷上下文)
|
|
62
|
+
4. **本卷前序概要标题列表**:扫描 `stories/<story>/volumes/vol-XXX/content/chapter-*-synopsis.md`,只读取每个文件的第一行标题
|
|
63
|
+
5. **前一章概要全文**:读取前一章的 synopsis.md(200-500 字)。如果前一章在上一卷,从上一卷的 content/ 读取
|
|
25
64
|
|
|
26
65
|
**不加载**:resources 目录任何文件、tracking 文件(写入时直接追加)
|
|
27
66
|
|
|
28
67
|
## 执行步骤
|
|
29
68
|
|
|
30
|
-
### 1.
|
|
69
|
+
### 1. 确定故事目录、章节号和所属卷
|
|
70
|
+
|
|
71
|
+
从 $ARGUMENTS 和 `stories/` 目录确定当前故事,从 creative-plan.md 确定章节所属卷。
|
|
72
|
+
|
|
73
|
+
### 2. 确保卷目录存在
|
|
31
74
|
|
|
32
|
-
|
|
75
|
+
如果卷目录不存在,执行初始化或卷切换流程。
|
|
33
76
|
|
|
34
|
-
###
|
|
77
|
+
### 3. 加载上下文
|
|
35
78
|
|
|
36
79
|
按上述「资源加载」规则加载最小上下文。
|
|
37
80
|
|
|
38
|
-
###
|
|
81
|
+
### 4. 生成概要
|
|
39
82
|
|
|
40
|
-
为当前章节生成 200-500
|
|
83
|
+
为当前章节生成 200-500 字纯剧情概要(严格控制字数),包含:
|
|
41
84
|
|
|
42
85
|
- **本章标题**:简短的章节标题
|
|
43
86
|
- **核心事件**:本章发生的主要事件(1-3个)
|
|
@@ -45,35 +88,45 @@ allowed-tools: Read(//stories/**), Write(//stories/**/content/**), Read(//tracki
|
|
|
45
88
|
- **情感走向**:本章的情感基调和变化
|
|
46
89
|
- **章末钩子**:本章结尾的悬念或引子
|
|
47
90
|
|
|
48
|
-
写入 `stories/<story>/content/chapter-
|
|
91
|
+
写入 `stories/<story>/volumes/vol-XXX/content/chapter-YYY-synopsis.md`(YYY 为三位数补零)。
|
|
49
92
|
|
|
50
|
-
###
|
|
93
|
+
### 5. 更新卷级 tracking
|
|
51
94
|
|
|
52
|
-
根据概要内容,更新
|
|
95
|
+
根据概要内容,更新 `stories/<story>/volumes/vol-XXX/tracking/` 下的 4 个文件:
|
|
53
96
|
|
|
54
|
-
**
|
|
97
|
+
**character-state.json**:
|
|
55
98
|
- 新出场角色:添加条目(role, status, location, state, lastAppearance)
|
|
56
99
|
- 已有角色:更新 status、location、state、lastAppearance
|
|
57
100
|
|
|
58
|
-
**
|
|
101
|
+
**relationships.json**:
|
|
59
102
|
- 新关系:添加条目(from, to, type, note, lastUpdate)
|
|
60
103
|
- 关系变化:更新 note 和 lastUpdate
|
|
61
104
|
|
|
62
|
-
**
|
|
105
|
+
**plot-tracker.json**:
|
|
63
106
|
- 更新 currentChapter
|
|
64
107
|
- 新情节线:添加到 plotlines(name, status, description, keyChapters)
|
|
65
108
|
- 伏笔埋设:添加到 foreshadowing(id, content, plantedAt, status=planted)
|
|
66
109
|
- 伏笔回收:更新 resolveAt 和 status=resolved
|
|
67
110
|
|
|
68
|
-
**
|
|
111
|
+
**timeline.json**:
|
|
69
112
|
- 添加本章事件到 events(chapter, time, event)
|
|
70
113
|
|
|
71
|
-
###
|
|
114
|
+
### 6. DB 同步(可选)
|
|
115
|
+
|
|
116
|
+
如果 `resources/config.json` 中 `database.enabled = true`,在 tracking 更新完成后运行:
|
|
117
|
+
|
|
118
|
+
```
|
|
119
|
+
python scripts/db_sync.py --vol <当前卷号>
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
将本卷 tracking 数据同步到 PostgreSQL。
|
|
123
|
+
|
|
124
|
+
### 7. 批量模式
|
|
72
125
|
|
|
73
|
-
如果指定了 `--batch N`,重复步骤
|
|
126
|
+
如果指定了 `--batch N`,重复步骤 3-5 共 N 次。如果批量过程中跨卷,自动触发卷切换。
|
|
74
127
|
|
|
75
|
-
###
|
|
128
|
+
### 8. 后续建议
|
|
76
129
|
|
|
77
|
-
单章完成:「第X
|
|
130
|
+
单章完成:「第X章概要已生成(vol-XXX)。继续 /write [X+1] 或 /write --batch 20 批量生成。」
|
|
78
131
|
|
|
79
132
|
批量完成:「第X-Y章概要已生成(共Z章)。继续 /write [Y+1] --batch 20 或开始 /expand [章节号] 扩写。」
|
|
@@ -35,17 +35,57 @@
|
|
|
35
35
|
| resources/style-reference.md | 风格参考 | /expand |
|
|
36
36
|
| resources/anti-ai.md | 反AI规范 | /expand |
|
|
37
37
|
|
|
38
|
-
##
|
|
38
|
+
## 卷级结构
|
|
39
39
|
|
|
40
|
-
|
|
40
|
+
每个故事按卷分片存储:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
stories/<story>/
|
|
44
|
+
├── specification.md
|
|
45
|
+
├── creative-plan.md
|
|
46
|
+
└── volumes/
|
|
47
|
+
└── vol-XXX/
|
|
48
|
+
├── volume-summary.md # 跨卷状态快照
|
|
49
|
+
├── tracking/ # 卷级 tracking
|
|
50
|
+
│ ├── character-state.json
|
|
51
|
+
│ ├── plot-tracker.json
|
|
52
|
+
│ ├── relationships.json
|
|
53
|
+
│ └── timeline.json
|
|
54
|
+
└── content/ # 卷级内容
|
|
55
|
+
├── chapter-YYY-synopsis.md
|
|
56
|
+
└── chapter-YYY.md
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
- volume-summary.md 在卷切换时自动生成,是当前卷的入口条件
|
|
60
|
+
- /write 完成后自动更新卷级 tracking 骨架
|
|
61
|
+
- /expand 完成后补充卷级 tracking 细节
|
|
62
|
+
|
|
63
|
+
## DB 增强(可选)
|
|
64
|
+
|
|
65
|
+
项目支持 PostgreSQL 双轨并行模式:DB 可用时增强上下文精度,不可用时回退到纯文件系统流程。
|
|
66
|
+
|
|
67
|
+
### 配置
|
|
68
|
+
|
|
69
|
+
编辑 `resources/config.json` 中的 `database` 字段:
|
|
70
|
+
- `enabled: true` 启用 DB 模式
|
|
71
|
+
- 配置 host、port、dbname、user、password
|
|
72
|
+
- schema 默认为 `novelws`
|
|
73
|
+
|
|
74
|
+
### scripts/ 目录
|
|
75
|
+
|
|
76
|
+
| 脚本 | 用途 |
|
|
41
77
|
|------|------|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
78
|
+
| `phase_a_init_db.py` | 初始化数据库(建表 + 视图) |
|
|
79
|
+
| `db_sync.py` | 文件系统 tracking → DB 同步(幂等) |
|
|
80
|
+
| `db_context.py` | 从 DB 生成精确上下文(write/expand/analyze 模式) |
|
|
81
|
+
| `db_volume_switch.py` | 从 DB 生成 volume-summary.md(卷切换) |
|
|
82
|
+
|
|
83
|
+
### 双轨机制
|
|
46
84
|
|
|
47
|
-
- /write
|
|
48
|
-
-
|
|
85
|
+
- /write、/expand、/analyze 命令会检测 `database.enabled`
|
|
86
|
+
- DB 可用时:用 `db_context.py` 生成精确上下文,完成后用 `db_sync.py` 同步
|
|
87
|
+
- DB 不可用或脚本执行失败时:自动回退到纯文件系统流程,不影响正常创作
|
|
88
|
+
- 文件系统 tracking 始终是主数据源,DB 是增强层
|
|
49
89
|
|
|
50
90
|
## 会话级资源复用
|
|
51
91
|
|
|
@@ -1,16 +1,95 @@
|
|
|
1
1
|
# 反AI写作规范
|
|
2
2
|
|
|
3
3
|
## 核心原则
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
4
|
+
自然表达,像真人写的。以下规则按从微观到宏观三层组织。
|
|
5
|
+
|
|
6
|
+
<!-- === /expand 加载区 开始 === -->
|
|
7
|
+
|
|
8
|
+
## 第一层 — 词汇级
|
|
9
|
+
|
|
10
|
+
### 禁用词汇(出现即替换)
|
|
11
|
+
|
|
12
|
+
**情绪/动作类**:不禁、缓缓、深邃、淡淡、微微、轻轻、默默、静静、悄然、赫然、骤然、竟然、居然、蓦然、倏然、怔怔
|
|
13
|
+
|
|
14
|
+
**转折/连接类**:然而、殊不知、与此同时、值得一提的是、不得不说、毋庸置疑、不言而喻
|
|
15
|
+
|
|
16
|
+
**描写类**:如同XX一般、宛如、仿佛(同一段内超过1次)、映入眼帘、一抹(微笑/苦涩/无奈)、勾勒出、弥漫着、充斥着、笼罩着
|
|
17
|
+
|
|
18
|
+
**心理类**:心中涌起、脑海中浮现、不由得想起、心头一紧、心中暗道
|
|
19
|
+
|
|
20
|
+
### 替代策略
|
|
21
|
+
- 不用副词修饰情绪动词,改用具体动作
|
|
22
|
+
- ❌ 她默默地流下了眼泪
|
|
23
|
+
- ✅ 她偏过头,用袖口蹭了一下眼角
|
|
24
|
+
- 不用"如同/宛如"做比喻,改用直接隐喻或省略
|
|
25
|
+
- ❌ 疼痛如同潮水一般涌来
|
|
26
|
+
- ✅ 疼痛从断骨处一波一波地涌上来
|
|
27
|
+
|
|
28
|
+
## 第二层 — 句段级
|
|
29
|
+
|
|
30
|
+
### 句式变化
|
|
31
|
+
- 禁止连续 3 个句子使用相同结构(如连续主谓宾、连续"他...他...他...")
|
|
32
|
+
- 禁止连续 2 个段落以相同方式开头(如都以角色名开头、都以环境描写开头)
|
|
33
|
+
- 长句后跟短句形成节奏对比
|
|
34
|
+
|
|
35
|
+
### 段落反模式
|
|
36
|
+
- ❌ 每段恰好 3-4 句,长度均匀 — AI 的典型"整齐段落"
|
|
37
|
+
- ✅ 段落长短交替:有 1 句成段的冲击段,有 5-7 句的铺陈段
|
|
38
|
+
- ❌ 段末总是情感总结句("他心中涌起一股XX")
|
|
39
|
+
- ✅ 段末留在动作或对话上,让读者自行感受
|
|
40
|
+
|
|
41
|
+
## 第三层 — 叙述级
|
|
42
|
+
|
|
43
|
+
### 场景展开反模式
|
|
44
|
+
- ❌ 固定公式:环境描写 → 人物出场 → 对话 → 心理活动 → 结尾总结
|
|
45
|
+
- ✅ 可以从对话切入、从动作切入、从一个细节切入
|
|
46
|
+
- ❌ 每个场景都有完整的开场环境描写
|
|
47
|
+
- ✅ 只在环境变化或环境与情绪相关时才描写环境
|
|
48
|
+
|
|
49
|
+
### 对话反模式
|
|
50
|
+
- ❌ 每句对话都有信息量,每句都推进剧情
|
|
51
|
+
- ✅ 允许闲聊、打岔、答非所问、说到一半被打断
|
|
52
|
+
- ❌ 对话后必跟心理描写解释角色真实想法
|
|
53
|
+
- ✅ 让读者从对话本身和动作推断角色想法
|
|
54
|
+
- ❌ 所有角色都说完整的句子,语法正确
|
|
55
|
+
- ✅ 口语化:省略、重复、语气词、不完整句
|
|
56
|
+
|
|
57
|
+
### 情绪表达反模式
|
|
58
|
+
- ❌ 直接命名情绪(他感到愤怒/悲伤/喜悦)
|
|
59
|
+
- ✅ 通过生理反应和无意识动作表现
|
|
60
|
+
- ❌ 用大段内心独白解释角色心理
|
|
61
|
+
- ✅ 内心活动碎片化,穿插在动作和对话之间
|
|
62
|
+
|
|
63
|
+
### 正面示例 — 完整段落演示
|
|
64
|
+
|
|
65
|
+
**场景展开(从细节切入)**:
|
|
66
|
+
> 茶杯磕在桌沿上,发出一声脆响。李远的手指还保持着端杯的姿势,但杯子已经不在了。碎瓷片在地上转了两圈才停下来。
|
|
67
|
+
> "你说什么?"他的声音很平,像是在问今天吃什么。
|
|
68
|
+
|
|
69
|
+
**对话(含打断和答非所问)**:
|
|
70
|
+
> "我觉得这件事——"
|
|
71
|
+
> "你上次也这么觉得。"周婷把筷子往碗上一搁,"结果呢?"
|
|
72
|
+
> 他张了张嘴,最后说:"菜凉了。"
|
|
73
|
+
|
|
74
|
+
<!-- === /expand 加载区 结束 === -->
|
|
75
|
+
|
|
76
|
+
<!-- === /specify 参考区(类型特有禁用词,由 /specify 注入到 style-reference.md 的风格禁忌字段) === -->
|
|
77
|
+
|
|
78
|
+
## 类型特有禁用词
|
|
79
|
+
|
|
80
|
+
> 以下按故事类型分组。/specify 生成 style-reference.md 时,根据 specification.md 的故事类型,
|
|
81
|
+
> 将对应类型的禁用词追加到 style-reference.md 的「风格禁忌」字段中。
|
|
82
|
+
|
|
83
|
+
### 玄幻
|
|
84
|
+
气势如虹、不可一世、实力深不可测、天赋异禀、气运之子、震惊四座、全场哗然、一股强大的气息、修为突破、丹田中的灵力
|
|
85
|
+
|
|
86
|
+
### 都市
|
|
87
|
+
商业帝国、权势滔天、豪门恩怨、身价百亿、谈笑风生、运筹帷幄、一个电话搞定、社会底层逆袭、人脉通天
|
|
88
|
+
|
|
89
|
+
### 言情
|
|
90
|
+
心如鹿撞、脸颊绯红、薄唇微启、眸光深邃、低沉磁性的嗓音、修长的手指、禁欲系、宠溺地笑了笑、霸道地将她揽入怀中
|
|
91
|
+
|
|
92
|
+
### 悬疑
|
|
93
|
+
细思极恐、不寒而栗、一个大胆的想法、真相浮出水面、拨开迷雾、抽丝剥茧、一切都说得通了、背后的真相
|
|
94
|
+
|
|
95
|
+
<!-- === /specify 参考区 结束 === -->
|