@cloud411716/fancy-webnovel 1.0.45 → 2.2.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/client.js +183 -0
- package/cordis.patch.yml +0 -14
- package/index.js +21 -37
- package/lib/chinese-num.js +111 -0
- package/lib/deployed-state.js +141 -0
- package/lib/error-codes.js +104 -0
- package/lib/infra.js +569 -0
- package/lib/llm-wiki.js +109 -0
- package/lib/safe-rm.js +94 -0
- package/lib/scraper-utils.js +165 -0
- package/package.json +37 -5
- package/plugins/fancy-analyze/command-input.js +65 -0
- package/plugins/fancy-analyze/index.js +973 -0
- package/plugins/fancy-analyze/schema-analyze.md +379 -0
- package/plugins/fancy-analyze/schema-write.md +178 -0
- package/plugins/fancy-analyze/scripts/split_source.js +292 -0
- package/plugins/fancy-analyze/summary-progress.js +431 -0
- package/plugins/fancy-analyze/templates.js +881 -0
- package/plugins/fancy-bootstrap/index.js +168 -0
- package/plugins/fancy-bootstrap/scripts/init.js +143 -0
- package/plugins/fancy-bootstrap/scripts/path-utils.js +21 -0
- package/plugins/fancy-bootstrap/templates.js +54 -0
- package/plugins/fancy-import/import-core.js +1118 -0
- package/plugins/fancy-import/import-driver.js +581 -0
- package/plugins/fancy-import/index.js +730 -0
- package/plugins/fancy-import/prompts/01-import-prompt.md +106 -0
- package/plugins/fancy-import/templates.js +49 -0
- package/plugins/fancy-scan/index.js +319 -0
- package/plugins/fancy-scan/scripts/run-scan.js +520 -0
- package/plugins/fancy-scan/scripts/scrapers/fanqie-rank-scraper.js +794 -0
- package/plugins/fancy-scan/scripts/scrapers/jjwxc-rank-scraper.js +339 -0
- package/plugins/fancy-scan/scripts/scrapers/qimao-rank-scraper.js +611 -0
- package/plugins/fancy-scan/templates.js +295 -0
- package/plugins/fancy-story-builder/deploy-manifest.js +239 -0
- package/plugins/fancy-story-builder/deslop-driver.js +821 -0
- package/plugins/fancy-story-builder/flesh-output.js +155 -0
- package/plugins/fancy-story-builder/index.js +3152 -0
- package/plugins/fancy-story-builder/prompts/01-skeleton-prompt.md +553 -0
- package/plugins/fancy-story-builder/prompts/02-flesh-prompt.md +540 -0
- package/plugins/fancy-story-builder/prompts/03-rhythm-prompt.md +504 -0
- package/plugins/fancy-story-builder/prompts/04-writing-prompt.md +188 -0
- package/plugins/fancy-story-builder/prompts/05-deslop-prompt.md +96 -0
- package/plugins/fancy-story-builder/purpose-template.md +107 -0
- package/plugins/fancy-story-builder/references/formulas-rhythm.json +302 -0
- package/plugins/fancy-story-builder/references/formulas-skeleton.json +229 -0
- package/plugins/fancy-story-builder/references/glossary.md +585 -0
- package/plugins/fancy-story-builder/references/index.md +490 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/00-index.md +174 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/01-scene.md +150 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/02-chapter-workflow.md +99 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/03-opening-chapter.md +104 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/04-dialogue-mastery.md +274 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/05-genre-formulas.md +432 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/06-tone-ensemble.md +259 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/07-ledger-audit.md +222 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/08-diagnosis-revision.md +205 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/09-reading-power.md +135 -0
- package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/10-deslop.md +129 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/00-index.md +98 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/01-upgrade-rhythm.md +300 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/02-arc-rhythm.md +168 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/03-highpoint-hooks.md +189 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/04-satisfaction.md +226 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/05-foreshadow-density.md +195 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/06-chapter-outline.md +226 -0
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/07-audit.md +163 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/00-index.md +100 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/01-character.md +239 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/02-worldbuilding.md +245 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/03-relations.md +181 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/04-emotion-methods.md +286 -0
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/05-audit.md +177 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/00-index.md +91 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/01-positioning.md +208 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/02-packaging.md +135 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/03-entities.md +305 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/04-conflict.md +328 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/05-quota.md +187 -0
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/06-audit.md +142 -0
- package/plugins/fancy-story-builder/rhythm-output.js +140 -0
- package/plugins/fancy-story-builder/schema-setting.md +324 -0
- package/plugins/fancy-story-builder/scripts/ai-patterns.js +619 -0
- package/plugins/fancy-story-builder/scripts/check-guide-compliance.js +289 -0
- package/plugins/fancy-story-builder/scripts/content-quality.js +413 -0
- package/plugins/fancy-story-builder/scripts/deslop-validate.js +143 -0
- package/plugins/fancy-story-builder/scripts/error-classes.js +112 -0
- package/plugins/fancy-story-builder/scripts/flesh-validate.js +1189 -0
- package/plugins/fancy-story-builder/scripts/formula-engine.js +112 -0
- package/plugins/fancy-story-builder/scripts/graph-utils.js +1385 -0
- package/plugins/fancy-story-builder/scripts/label-coverage.js +171 -0
- package/plugins/fancy-story-builder/scripts/prompt-drift-check.js +441 -0
- package/plugins/fancy-story-builder/scripts/reading-power.js +298 -0
- package/plugins/fancy-story-builder/scripts/rhythm-validate.js +1216 -0
- package/plugins/fancy-story-builder/scripts/semantic-lint.js +377 -0
- package/plugins/fancy-story-builder/scripts/skeleton-quota.js +145 -0
- package/plugins/fancy-story-builder/scripts/skeleton-validate.js +1832 -0
- package/plugins/fancy-story-builder/scripts/stage-batches.js +1371 -0
- package/plugins/fancy-story-builder/scripts/stage-contract.js +417 -0
- package/plugins/fancy-story-builder/scripts/upstream-query.js +198 -0
- package/plugins/fancy-story-builder/scripts/writing-rules.js +167 -0
- package/plugins/fancy-story-builder/scripts/writing-validate.js +682 -0
- package/plugins/fancy-story-builder/skeleton-output.js +199 -0
- package/plugins/fancy-story-builder/stage-driver.js +1049 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//346/227/266/345/272/217/346/230/240/345/260/204/346/250/241/346/235/277.json +204 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//347/253/240/350/212/202/347/273/206/347/272/262/346/250/241/346/235/277.json +34 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//347/253/240/350/212/202/350/247/204/345/210/222/346/250/241/346/235/277.json +24 -0
- package/plugins/fancy-story-builder/templates//350/212/202/345/245/217//350/212/202/345/245/217/345/217/202/346/225/260/346/250/241/346/235/277.json +27 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//344/270/226/347/225/214/350/247/202/350/247/204/345/210/231/346/250/241/346/235/277.json +66 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/205/263/351/224/256/351/201/223/345/205/267/346/250/241/346/235/277.json +76 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/206/262/347/252/201/346/250/241/346/235/277.json +72 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/211/247/346/203/205/346/250/241/346/235/277.json +37 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/212/277/345/212/233/346/250/241/346/235/277.json +53 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/234/260/347/202/271/346/250/241/346/235/277.json +40 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//347/273/223/345/261/200/346/250/241/346/235/277.json +79 -0
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//350/247/222/350/211/262/346/250/241/346/235/277.json +132 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/205/263/347/263/273/346/250/241/346/235/277.json +133 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/256/236/344/275/223/346/250/241/346/235/277.json +160 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//345/261/202/347/272/247/346/250/241/346/235/277.json +65 -0
- package/plugins/fancy-story-builder/templates//351/252/250/346/236/266//346/241/206/346/236/266/346/250/241/346/235/277.json +134 -0
- package/plugins/fancy-story-builder/templates.js +1248 -0
- package/plugins/fancy-story-builder/wiki-references.js +204 -0
- package/plugins/fancy-story-builder/writing-driver.js +1061 -0
- package/plugins/fancy-topic/index.js +704 -0
- package/plugins/fancy-topic/scripts/select-topic.js +274 -0
- package/plugins/fancy-topic/templates.js +373 -0
- package/commands/bootstrap/index.js +0 -160
- package/commands/bootstrap/init-project.js +0 -121
- package/commands/scan/index.js +0 -275
- package/commands/scan/platforms/fanqie.js +0 -146
- package/commands/scan/platforms/jinjiang.js +0 -143
- package/commands/scan/platforms/qidian.js +0 -102
- package/commands/scan/platforms/qimao.js +0 -127
- package/commands/scan/scraper.js +0 -195
- package/infra.js +0 -160
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* rhythm-output.js —— 节奏阶段的产出盘点
|
|
3
|
+
*
|
|
4
|
+
* 与 flesh-output.js 同构,但对象是节奏阶段的 4 个产物文件。
|
|
5
|
+
*
|
|
6
|
+
* 节奏阶段和血肉阶段的差别在于产出形态:
|
|
7
|
+
* 血肉 —— 8 个文件,每个文件内部是"大对象"数组
|
|
8
|
+
* 节奏 —— 4 个文件,其中 3 个是"按章/按实体切"的数组,
|
|
9
|
+
* 1 个(节奏参数.json)是纯对象
|
|
10
|
+
*
|
|
11
|
+
* 盘点要回答两个问题(插件据此决定能不能报"完成"):
|
|
12
|
+
* 1. 4 个产物文件是不是都落地了?
|
|
13
|
+
* 2. 全量校验(--all)过没过?
|
|
14
|
+
*
|
|
15
|
+
* 节奏阶段尤其需要第 2 条:节奏的绝大多数校验是跨文件口径
|
|
16
|
+
* (主线节点数 = 参数、支线章数之和 = 参数、结局章 ⊆ 主线节点),
|
|
17
|
+
* 单文件校验过不代表阶段过 —— rhythm-validate.js 自己在单文件通过时
|
|
18
|
+
* 也会附一条 warning:"跨文件一致性检查在 --all 模式下进行"。
|
|
19
|
+
*/
|
|
20
|
+
import fs from 'node:fs';
|
|
21
|
+
import path from 'node:path';
|
|
22
|
+
|
|
23
|
+
// 节奏阶段的 4 个产出文件
|
|
24
|
+
// (顺序 = 生成依赖顺序:章节规划 → 节奏参数 → 时序映射 → 章节细纲,
|
|
25
|
+
// 见 prompts/03-rhythm-prompt.md 的「本阶段产出清单」一节)
|
|
26
|
+
export const RHYTHM_OUTPUT_FILES = [
|
|
27
|
+
'章节规划.json',
|
|
28
|
+
'节奏参数.json',
|
|
29
|
+
'时序映射.json',
|
|
30
|
+
'章节细纲.json'
|
|
31
|
+
];
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 盘点节奏阶段的产出。
|
|
35
|
+
*
|
|
36
|
+
* @param {string} stageDir 节奏阶段目录
|
|
37
|
+
* @returns {Object} { present, missing, complete }
|
|
38
|
+
*/
|
|
39
|
+
export function inspectRhythmOutput(stageDir) {
|
|
40
|
+
const present = [];
|
|
41
|
+
const missing = [];
|
|
42
|
+
for (const f of RHYTHM_OUTPUT_FILES) {
|
|
43
|
+
const p = path.join(stageDir, f);
|
|
44
|
+
let ok = false;
|
|
45
|
+
try {
|
|
46
|
+
ok = fs.existsSync(p) && fs.statSync(p).size > 0;
|
|
47
|
+
} catch {
|
|
48
|
+
ok = false;
|
|
49
|
+
}
|
|
50
|
+
if (ok) present.push(f);
|
|
51
|
+
else missing.push(f);
|
|
52
|
+
}
|
|
53
|
+
return { present, missing, complete: missing.length === 0 };
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* 读节奏阶段的 .stage-status.json,看全量校验的状态。
|
|
58
|
+
*
|
|
59
|
+
* @returns {Object} { allCheck, rounds, files, error }
|
|
60
|
+
* allCheck: 'PASSED' | 'FAILED' | 'STALE' | 'PENDING' | null
|
|
61
|
+
*/
|
|
62
|
+
export function readRhythmStageStatus(stageDir) {
|
|
63
|
+
const p = path.join(stageDir, '.stage-status.json');
|
|
64
|
+
if (!fs.existsSync(p)) {
|
|
65
|
+
return { allCheck: null, rounds: 0, files: {}, error: '.stage-status.json 不存在(节奏阶段还没跑过校验)' };
|
|
66
|
+
}
|
|
67
|
+
let s;
|
|
68
|
+
try {
|
|
69
|
+
s = JSON.parse(fs.readFileSync(p, 'utf-8'));
|
|
70
|
+
} catch (e) {
|
|
71
|
+
return { allCheck: null, rounds: 0, files: {}, error: '.stage-status.json 解析失败:' + e.message };
|
|
72
|
+
}
|
|
73
|
+
if (!s || typeof s !== 'object') {
|
|
74
|
+
return { allCheck: null, rounds: 0, files: {}, error: '.stage-status.json 内容不是对象' };
|
|
75
|
+
}
|
|
76
|
+
const all = s.all_check && typeof s.all_check === 'object' ? s.all_check : {};
|
|
77
|
+
return {
|
|
78
|
+
allCheck: all.status || null,
|
|
79
|
+
rounds: all.rounds || 0,
|
|
80
|
+
files: (s.files && typeof s.files === 'object') ? s.files : {},
|
|
81
|
+
error: null
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* 生成节奏阶段收尾的结论说明(人类可读、可执行)。
|
|
87
|
+
*
|
|
88
|
+
* 与 flesh-output.js 的 buildFleshCompletionNote 同构,但重点不同:
|
|
89
|
+
* 节奏阶段的失败几乎都是**跨文件口径**的问题,
|
|
90
|
+
* 所以要明确告诉用户"单文件过了但全量没过"意味着什么。
|
|
91
|
+
*/
|
|
92
|
+
export function buildRhythmCompletionNote(inspect, status) {
|
|
93
|
+
const lines = [];
|
|
94
|
+
const allCheck = status.allCheck;
|
|
95
|
+
const missing = inspect.missing;
|
|
96
|
+
|
|
97
|
+
if (inspect.complete && allCheck === 'PASSED') {
|
|
98
|
+
lines.push('节奏阶段产出检查:4 个 JSON 齐全,全量校验(--all)已通过。');
|
|
99
|
+
lines.push('');
|
|
100
|
+
lines.push('产出文件:');
|
|
101
|
+
for (const f of inspect.present) lines.push('- 设定/raw/sources/节奏/' + f);
|
|
102
|
+
return lines.join('\n');
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
lines.push('节奏阶段产出检查:**未通过**,当前状态如下。');
|
|
106
|
+
lines.push('');
|
|
107
|
+
|
|
108
|
+
if (!inspect.complete) {
|
|
109
|
+
lines.push('- 缺失文件(' + missing.length + '/' + RHYTHM_OUTPUT_FILES.length + '):' + missing.join('、'));
|
|
110
|
+
lines.push(' 常见原因:节奏阶段是逐批派活的,任一段没跑完,下游那一段就不会开工');
|
|
111
|
+
lines.push(' (章节规划 / 节奏参数 → 时序映射 → 章节细纲,段间有依赖门禁)。');
|
|
112
|
+
} else {
|
|
113
|
+
lines.push('- 4 个 JSON 都已产出。');
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
lines.push('');
|
|
117
|
+
if (allCheck === 'PASSED') {
|
|
118
|
+
lines.push('- 全量校验:PASSED(但文件集合与校验记录不一致,需要人工核对)。');
|
|
119
|
+
} else if (allCheck === 'FAILED') {
|
|
120
|
+
lines.push('- 全量校验:FAILED(跨文件一致性没通过:主线节点数 / 支线章数 / 结局覆盖 / 钩子下限这些口径都在 --all 里查)。');
|
|
121
|
+
} else if (allCheck === 'STALE') {
|
|
122
|
+
lines.push('- 全量校验:**STALE**(单文件校验把已通过的全量结论作废了,必须重新跑一次 --all)。');
|
|
123
|
+
} else if (allCheck === 'PENDING') {
|
|
124
|
+
lines.push('- 全量校验:**PENDING**(从未跑过 --all,跨文件一致性、配额一致性、引用完整性全都没验过)。');
|
|
125
|
+
} else {
|
|
126
|
+
lines.push('- 全量校验:**未运行**(' + (status.error || '状态不可读') + ')。');
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
lines.push('');
|
|
130
|
+
lines.push('下一步:');
|
|
131
|
+
if (!inspect.complete) {
|
|
132
|
+
lines.push('1. 重新运行节奏阶段,补齐缺失文件:' + missing.join('、'));
|
|
133
|
+
lines.push('2. 4 个文件齐了之后,必须再跑一次全量校验(--all),确认 all_check.status = PASSED。');
|
|
134
|
+
} else {
|
|
135
|
+
lines.push('1. 跑一次全量校验(--all),把 errors 逐条改掉;');
|
|
136
|
+
lines.push('2. 直到 all_check.status = PASSED 再进入写作阶段。');
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
return lines.join('\n');
|
|
140
|
+
}
|
|
@@ -0,0 +1,324 @@
|
|
|
1
|
+
# 节奏阶段设定分析规范
|
|
2
|
+
|
|
3
|
+
## 核心目标
|
|
4
|
+
|
|
5
|
+
分析 `raw/sources/节奏/` 目录下的节奏阶段文件,提炼结构化内容到 `wiki/` 目录。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ⚠️ 类型系统(type)约束
|
|
10
|
+
|
|
11
|
+
**本 schema 定义的类型系统是【封闭的】。LLM 禁止创建新的 type 或新的目录。**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## Wiki 目录结构
|
|
16
|
+
|
|
17
|
+
| type | directory | description |
|
|
18
|
+
|------|-----------|-------------|
|
|
19
|
+
| 时间线 | wiki/时间线/ | 全书主线时间线、卷任务、时间线 |
|
|
20
|
+
| 冲突演变 | wiki/冲突演变/ | 核心冲突演变阶段 |
|
|
21
|
+
| 伏笔布局 | wiki/伏笔布局/ | 伏笔宏观布局 |
|
|
22
|
+
| 分卷 | wiki/分卷/ | 分卷表 |
|
|
23
|
+
| 情绪弧线 | wiki/情绪弧线/ | 情绪弧线类型 |
|
|
24
|
+
| 高潮点 | wiki/高潮点/ | 小高潮、中高潮、大高潮分布 |
|
|
25
|
+
| 爽点 | wiki/爽点/ | 小爽点,大爽点设计 |
|
|
26
|
+
| 主线推进 | wiki/主线推进/ | 主线推进节点 |
|
|
27
|
+
| 角色弧光 | wiki/角色弧光/ | 角色弧光节点 |
|
|
28
|
+
| 信息释放 | wiki/信息释放/ | 信息释放节奏 |
|
|
29
|
+
| 章节钩子 | wiki/章节钩子/ | 章节钩子设计 |
|
|
30
|
+
| 伏笔 | wiki/伏笔/ | 伏笔表条目 |
|
|
31
|
+
| 章节细纲 | wiki/细纲/ | 章节细纲 |
|
|
32
|
+
| 支线交织 | wiki/支线交织/ | 支线交织点与主线关系 |
|
|
33
|
+
| 场景 | wiki/场景/ | 场景分解 |
|
|
34
|
+
| 来源 | wiki/来源/ | 源文件摘要 |
|
|
35
|
+
|
|
36
|
+
---
|
|
37
|
+
|
|
38
|
+
## 文件名规则
|
|
39
|
+
|
|
40
|
+
| type | 文件名格式 | 示例 |
|
|
41
|
+
|------|-----------|------|
|
|
42
|
+
| 时间线 | 时间线-{名称}.md | 时间线-全书主线.md |
|
|
43
|
+
| 冲突演变 | 冲突演变-{阶段}.md | 冲突演变-第一阶段.md |
|
|
44
|
+
| 伏笔布局 | 伏笔布局.md | 伏笔布局.md |
|
|
45
|
+
| 分卷 | 分卷-{卷号}.md | 分卷-第一卷.md |
|
|
46
|
+
| 情绪弧线 | 情绪弧线-{卷号}.md | 情绪弧线-第一卷.md |
|
|
47
|
+
| 高潮点 | 高潮点-{卷号}.md | 高潮点-第一卷.md |
|
|
48
|
+
| 爽点 | 爽点-{章节号}.md | 爽点-第5章.md |
|
|
49
|
+
| 主线推进 | 主线推进-{卷号}.md | 主线推进-第一卷.md |
|
|
50
|
+
| 角色弧光 | 角色弧光-{角色名}.md | 角色弧光-主角.md |
|
|
51
|
+
| 信息释放 | 信息释放-{卷号}.md | 信息释放-第一卷.md |
|
|
52
|
+
| 章节钩子 | 章节钩子-{章节号}.md | 章节钩子-第5章.md |
|
|
53
|
+
| 伏笔 | 伏笔-{ID}.md | 伏笔-S001.md |
|
|
54
|
+
| 章节细纲 | 细纲-{NNN}.md | 细纲-005.md |
|
|
55
|
+
| 支线交织 | 支线交织-{交织点}.md | 支线交织-交织点1.md |
|
|
56
|
+
| 场景 | 场景-{章节号}-{场景序号}.md | 场景-第1章-场景1.md |
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## ⚠️ 语言强制要求
|
|
61
|
+
|
|
62
|
+
**所有输出内容必须是中文,包括:**
|
|
63
|
+
|
|
64
|
+
1. **文件名**:使用中文,如 `时间线-全书主线.md`
|
|
65
|
+
2. **title**:使用中文,如 `全书主线时间线`
|
|
66
|
+
3. **正文内容**:所有文字描述必须使用中文
|
|
67
|
+
4. **表格内容**:所有表格中的文字必须使用中文
|
|
68
|
+
5. **type 值**:所有 type 的值必须是中文,如 `时间线`、`冲突演变`
|
|
69
|
+
|
|
70
|
+
**禁止输出英文内容。唯一例外:代码块、JSON、YAML 格式中的英文键名(如 `type:`、`title:`)。**
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## ⚠️ 绝对禁止的行为
|
|
75
|
+
|
|
76
|
+
1. **禁止创建新的 type** - 只能使用本 schema 定义的 type
|
|
77
|
+
2. **禁止创建新的目录** - 只能使用本 schema 定义的目录
|
|
78
|
+
3. **禁止生成"无"的页面** - 来源表格中标记为"无"的 type 不需要生成
|
|
79
|
+
4. **禁止跳过闭环检查** - 必须检查所有"有"的页面是否存在
|
|
80
|
+
5. **缺失必须补充** - 如果"有"的页面缺失,必须生成 review 并补充
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## 各文件 heading 到 type 的映射
|
|
85
|
+
|
|
86
|
+
### 1. 主线大纲.md
|
|
87
|
+
|
|
88
|
+
| heading | 提取的 type | 说明 |
|
|
89
|
+
|---------|-------------|------|
|
|
90
|
+
| 全书主线时间线 | 时间线 | 表格:阶段、章节范围、核心任务、关键情节点 |
|
|
91
|
+
| 核心冲突演变 | 冲突演变 | 列表:第一阶段/第二阶段/...:章节范围、冲突描述 |
|
|
92
|
+
| 卷核心任务 | 时间线 | 表格:卷号、卷名、核心任务、期望情感弧 |
|
|
93
|
+
| 伏笔宏观布局 | 伏笔布局 | 表格:伏笔ID、类型、内容摘要、预期回收阶段 |
|
|
94
|
+
| 主线推进节点 | 主线推进 | 列表:章节范围、推进内容 |
|
|
95
|
+
| 章节钩子分布 | 章节钩子 | 表格:章节号、钩子类型、钩子内容 |
|
|
96
|
+
| 情绪节奏概览 | 情绪弧线 | 概览内容 |
|
|
97
|
+
| 爽点密度规划 | 爽点 | 表格:章节范围、爽点类型、爽点描述 |
|
|
98
|
+
| 高潮设计 | 高潮点 | 表格:高潮类型、章节位置、情绪峰值 |
|
|
99
|
+
| 角色弧光节点分布 | 角色弧光 | 表格:角色名、弧光节点章节、弧光描述 |
|
|
100
|
+
| 支线交织点与主线关系 | 支线交织 | 表格:交织点、涉及章节、与主线关系 |
|
|
101
|
+
|
|
102
|
+
### 2. 分卷表.md
|
|
103
|
+
|
|
104
|
+
| heading | 提取的 type | 说明 |
|
|
105
|
+
|---------|-------------|------|
|
|
106
|
+
| 整体结构 | 分卷 | 结构概述 |
|
|
107
|
+
| 分卷详情 | 分卷 | 详细分卷信息 |
|
|
108
|
+
| 卷内节奏起伏 | 分卷 | 节奏起伏描述 |
|
|
109
|
+
| 卷内伏笔布局 | 分卷 | 伏笔布局描述 |
|
|
110
|
+
| 卷末收束要素 | 分卷 | 卷末收束要素描述 |
|
|
111
|
+
| 章节阶段分配 | 分卷 | 表格:阶段、章节范围、核心任务 |
|
|
112
|
+
|
|
113
|
+
### 3. 情绪节奏.md
|
|
114
|
+
|
|
115
|
+
| heading | 提取的 type | 说明 |
|
|
116
|
+
|---------|-------------|------|
|
|
117
|
+
| 整体情绪弧线 | 情绪弧线 | 弧线类型(V形/倒V形/W形/递进/延迟满足) |
|
|
118
|
+
| 各卷情绪分布 | 情绪弧线 | 表格:卷号、开局/中段/高潮/收束情绪 |
|
|
119
|
+
| 高潮点分布 | 高潮点 | 表格:小高潮/中高潮/大高潮的章节位置、情绪峰值 |
|
|
120
|
+
|
|
121
|
+
### 4. 伏笔表.md
|
|
122
|
+
|
|
123
|
+
| heading | 提取的 type | 说明 |
|
|
124
|
+
|---------|-------------|------|
|
|
125
|
+
| 伏笔列表 | 伏笔 | 表格:ID、类型、内容摘要、埋设章节、推进章节、回收章节、状态 |
|
|
126
|
+
| 伏笔状态 | 伏笔 | 状态说明:埋设 → 推进中 → 已回收/已失效/已放弃 |
|
|
127
|
+
| 伏笔排布原则 | 伏笔 | 排布原则描述 |
|
|
128
|
+
| 伏笔与章节对照 | 伏笔 | 伏笔与章节对照表 |
|
|
129
|
+
|
|
130
|
+
### 5. `细纲_*.md`(每个文件对应一个章节)
|
|
131
|
+
|
|
132
|
+
| heading | 提取的 type | 说明 |
|
|
133
|
+
|---------|-------------|------|
|
|
134
|
+
| 基本信息 | 章节细纲 | 表格:章号、标题、字数目标、视角 |
|
|
135
|
+
| 章节定位 | 章节细纲 | 主线进度、副线进度 |
|
|
136
|
+
| 章节时间线 | 章节细纲 | 起点/终点时间 |
|
|
137
|
+
| 必覆盖节点 | 章节细纲 | 节点列表(≥3个) |
|
|
138
|
+
| 爽点设计 | 爽点 | 类型(打脸/收获/身份/情感/智力/探索/团战)、设计内容 |
|
|
139
|
+
| 伏笔动作 | 伏笔 | 埋设/推进/回收的伏笔ID |
|
|
140
|
+
| 章首钩子内容 | 章节钩子 | 章首钩子具体内容 |
|
|
141
|
+
| 章末钩子内容 | 章节钩子 | 章末钩子具体内容 |
|
|
142
|
+
| 本章禁区 | 章节细纲 | 绝对不能出现的内容 |
|
|
143
|
+
| 场景分解 | 场景 | 场景列表 |
|
|
144
|
+
| 与前序/后续章节关系 | 章节细纲 | 章节关系描述 |
|
|
145
|
+
|
|
146
|
+
---
|
|
147
|
+
|
|
148
|
+
## 来源要求(必须执行)
|
|
149
|
+
|
|
150
|
+
**每个 wiki 页面必须包含"来源"章节,作为第一个内容块。**
|
|
151
|
+
|
|
152
|
+
来源格式示例:
|
|
153
|
+
|
|
154
|
+
```markdown
|
|
155
|
+
## 来源
|
|
156
|
+
|
|
157
|
+
| 字段 | 值 |
|
|
158
|
+
|------|---|
|
|
159
|
+
| 来源文件 | raw/sources/节奏/主线大纲.md |
|
|
160
|
+
| 来源类型 | 主线大纲 |
|
|
161
|
+
| 生成时间 | YYYY-MM-DD HH:mm:ss |
|
|
162
|
+
|
|
163
|
+
### 本页包含的 type
|
|
164
|
+
|
|
165
|
+
| type | 是否生成 | 说明 |
|
|
166
|
+
|------|---------|------|
|
|
167
|
+
| 时间线 | 有 | 全书主线时间线 |
|
|
168
|
+
| 冲突演变 | 有 | 核心冲突演变 |
|
|
169
|
+
| 卷任务 | 有 | 卷核心任务 |
|
|
170
|
+
| 伏笔布局 | 有 | 伏笔宏观布局 |
|
|
171
|
+
| 分卷 | 无 | 不在本文件中 |
|
|
172
|
+
| ... | ... | ... |
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
**重要:**
|
|
176
|
+
- "有"的页面**必须生成**
|
|
177
|
+
- "无"的页面**不需要生成**
|
|
178
|
+
- 闭环检查时,如果在"### 本页包含的 type"表格中"是否生成"列为"有"的页面缺失,**必须补充**
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## 闭环检查要求(必须执行)
|
|
183
|
+
|
|
184
|
+
### 1. 检查"### 本页包含的 type"表格中"是否生成"列为"有"的页面是否都已生成
|
|
185
|
+
|
|
186
|
+
对于每个标记为"有"的 type,必须检查:
|
|
187
|
+
- wiki 中是否存在对应的页面
|
|
188
|
+
- 如果缺失,**必须立即补充页面**才能 ingest 下一个文件
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
## Frontmatter 格式示例
|
|
194
|
+
|
|
195
|
+
### 时间线/冲突演变/伏笔布局 类型
|
|
196
|
+
|
|
197
|
+
```yaml
|
|
198
|
+
---
|
|
199
|
+
type: 时间线
|
|
200
|
+
title: 全书主线时间线
|
|
201
|
+
sources: [raw/sources/节奏/主线大纲.md]
|
|
202
|
+
related:
|
|
203
|
+
- type: 冲突演变
|
|
204
|
+
title: 核心冲突演变
|
|
205
|
+
- type: 伏笔布局
|
|
206
|
+
title: 伏笔宏观布局
|
|
207
|
+
---
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### 分卷 类型
|
|
211
|
+
|
|
212
|
+
```yaml
|
|
213
|
+
---
|
|
214
|
+
type: 分卷
|
|
215
|
+
title: 第一卷
|
|
216
|
+
sources: [raw/sources/节奏/分卷表.md]
|
|
217
|
+
卷号: 1
|
|
218
|
+
卷名: 青云之路
|
|
219
|
+
章节范围: 第1-100章
|
|
220
|
+
---
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### 情绪弧线 类型
|
|
224
|
+
|
|
225
|
+
```yaml
|
|
226
|
+
---
|
|
227
|
+
type: 情绪弧线
|
|
228
|
+
title: V形弧线
|
|
229
|
+
sources: [raw/sources/节奏/情绪节奏.md]
|
|
230
|
+
弧线类型: V形
|
|
231
|
+
适用场景: 重生复仇、破镜重圆、亲情催泪
|
|
232
|
+
---
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### 高潮点 类型
|
|
236
|
+
|
|
237
|
+
```yaml
|
|
238
|
+
---
|
|
239
|
+
type: 高潮点
|
|
240
|
+
title: 小高潮分布
|
|
241
|
+
sources: [raw/sources/节奏/情绪节奏.md]
|
|
242
|
+
高潮类型: 小高潮
|
|
243
|
+
---
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
### 爽点 类型
|
|
247
|
+
|
|
248
|
+
```yaml
|
|
249
|
+
---
|
|
250
|
+
type: 爽点
|
|
251
|
+
title: 第5章爽点
|
|
252
|
+
sources: [raw/sources/节奏/细纲_005.md]
|
|
253
|
+
爽点类型: 打脸
|
|
254
|
+
所属章节: 第5章
|
|
255
|
+
---
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### 章节钩子 类型
|
|
259
|
+
|
|
260
|
+
```yaml
|
|
261
|
+
---
|
|
262
|
+
type: 章节钩子
|
|
263
|
+
title: 第5章钩子
|
|
264
|
+
sources: [raw/sources/节奏/细纲_005.md]
|
|
265
|
+
章首类型: 悬念对话引子
|
|
266
|
+
章尾类型: 突然揭示
|
|
267
|
+
所属章节: 第5章
|
|
268
|
+
---
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### 伏笔 类型
|
|
272
|
+
|
|
273
|
+
```yaml
|
|
274
|
+
---
|
|
275
|
+
type: 伏笔
|
|
276
|
+
title: S001
|
|
277
|
+
sources: [raw/sources/节奏/伏笔表.md]
|
|
278
|
+
伏笔ID: S001
|
|
279
|
+
伏笔类型: 物件型
|
|
280
|
+
埋设章节: 第1章
|
|
281
|
+
回收章节: 第30章
|
|
282
|
+
状态: 已回收
|
|
283
|
+
---
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### 章节细纲 类型
|
|
287
|
+
|
|
288
|
+
```yaml
|
|
289
|
+
---
|
|
290
|
+
type: 章节细纲
|
|
291
|
+
title: 第5章
|
|
292
|
+
sources: [raw/sources/节奏/细纲_005.md]
|
|
293
|
+
章号: 5
|
|
294
|
+
字数目标: 3000
|
|
295
|
+
视角: 第三人称
|
|
296
|
+
---
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### 支线交织 类型
|
|
300
|
+
|
|
301
|
+
```yaml
|
|
302
|
+
---
|
|
303
|
+
type: 支线交织
|
|
304
|
+
title: 交织点1
|
|
305
|
+
sources: [raw/sources/节奏/主线大纲.md]
|
|
306
|
+
交织点: 交织点1
|
|
307
|
+
涉及章节: 第5-8章
|
|
308
|
+
与主线关系: 支线推动主线发展
|
|
309
|
+
---
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
### 场景 类型
|
|
313
|
+
|
|
314
|
+
```yaml
|
|
315
|
+
---
|
|
316
|
+
type: 场景
|
|
317
|
+
title: 第1章-场景1
|
|
318
|
+
sources: [raw/sources/节奏/细纲_001.md]
|
|
319
|
+
所属章节: 第1章
|
|
320
|
+
场景序号: 1
|
|
321
|
+
场景名称: 百乐门后台
|
|
322
|
+
场景类型: 引入
|
|
323
|
+
---
|
|
324
|
+
```
|