@cloud411716/fancy-webnovel 2.2.0 → 3.0.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 +201 -15
- package/cordis.patch.yml +5 -0
- package/docs/douyin-plugin.md +118 -0
- package/docs/material-library/README.md +404 -0
- package/docs/material-library/import.js +437 -0
- package/docs/material-library/prompt.md +370 -0
- package/docs/material-library/queries.surql +94 -0
- package/docs/material-library/sample.jsonl +14 -0
- package/docs/material-library/schema.surql +46 -0
- package/docs/mcp-profile.example.yml +24 -0
- package/docs/story-graph-design.md +602 -0
- package/docs/story-graph-validation.md +81 -0
- package/docs/workspace-mcp.md +284 -0
- package/index.js +11 -7
- package/lib/atomic-write.js +109 -0
- package/lib/chapter-order.js +100 -0
- package/lib/confirmation.js +80 -0
- package/lib/db-init.js +123 -0
- package/lib/deployed-state.js +11 -11
- package/lib/direction-labels.js +265 -0
- package/lib/error-codes.js +31 -31
- package/lib/infra.js +29 -4
- package/lib/material-db.js +149 -0
- package/lib/path-guard.js +150 -0
- package/lib/projects.js +400 -0
- package/lib/scraper-utils.js +140 -0
- package/lib/surreal-server.js +338 -0
- package/lib/topic-decision.js +860 -0
- package/lib/topic-fields.js +251 -0
- package/lib/topic-schema.js +225 -0
- package/lib/workspace.js +501 -0
- package/package.json +29 -4
- package/plugins/fancy-analyze/analyze-definitions.md +519 -0
- package/plugins/fancy-analyze/index.js +1128 -77
- package/plugins/fancy-analyze/ingest-coverage.js +107 -0
- package/plugins/fancy-analyze/schema-analyze.md +355 -107
- package/plugins/fancy-analyze/scripts/append-summary-chapter.js +612 -0
- package/plugins/fancy-analyze/summary-progress.js +71 -7
- package/plugins/fancy-analyze/templates.js +437 -139
- package/plugins/fancy-bootstrap/index.js +276 -131
- package/plugins/fancy-bootstrap/scripts/init.js +59 -25
- package/plugins/fancy-bootstrap/templates.js +35 -18
- package/plugins/fancy-db/index.js +172 -0
- package/plugins/fancy-douyin/deploy.js +134 -0
- package/plugins/fancy-douyin/index.js +551 -0
- package/plugins/fancy-douyin/prompts/01-analysis-prompt.md +84 -0
- package/plugins/fancy-douyin/scripts/crawl-note.cjs +194 -0
- package/plugins/fancy-douyin/scripts/lib.cjs +197 -0
- package/plugins/fancy-douyin/scripts/scan-account.cjs +128 -0
- package/plugins/fancy-douyin/scripts/start-chrome.cjs +203 -0
- package/plugins/fancy-douyin/state.js +197 -0
- package/plugins/fancy-douyin/templates.js +127 -0
- package/plugins/fancy-export/exporter.js +805 -0
- package/plugins/fancy-export/index.js +63 -0
- package/plugins/fancy-import/import-driver.js +29 -6
- package/plugins/fancy-import/index.js +13 -5
- package/plugins/fancy-import/prompts/01-import-prompt.md +39 -14
- package/plugins/fancy-import/templates.js +17 -8
- package/plugins/fancy-material/exporter.js +153 -0
- package/plugins/fancy-material/genres.js +256 -0
- package/plugins/fancy-material/index.js +835 -0
- package/plugins/fancy-material/inventory.js +143 -0
- package/plugins/fancy-material/kinds.js +313 -0
- package/plugins/fancy-material/queue.js +55 -0
- package/plugins/fancy-material/scripts/query.js +254 -0
- package/plugins/fancy-material/templates.js +258 -0
- package/plugins/fancy-material/tool-deploy.js +138 -0
- package/plugins/fancy-material/validate.js +149 -0
- package/plugins/fancy-project/index.js +133 -0
- package/plugins/fancy-scan/existing-block.js +100 -0
- package/plugins/fancy-scan/index.js +410 -21
- package/plugins/fancy-scan/prompts/01-analysis-prompt.md +302 -0
- package/plugins/fancy-scan/scripts/append-block.js +725 -0
- package/plugins/fancy-scan/scripts/report-validate.js +824 -0
- package/plugins/fancy-scan/scripts/run-scan.js +169 -22
- package/plugins/fancy-scan/scripts/scrapers/fanqie-rank-scraper.js +145 -16
- package/plugins/fancy-scan/scripts/scrapers/jjwxc-rank-scraper.js +179 -49
- package/plugins/fancy-scan/scripts/scrapers/qimao-rank-scraper.js +38 -20
- package/plugins/fancy-scan/templates/blocks.js +155 -0
- package/plugins/fancy-scan/templates/platforms.js +372 -0
- package/plugins/fancy-scan/templates/report-schema.js +90 -0
- package/plugins/fancy-scan/templates.js +545 -146
- package/plugins/fancy-scan/tool-deploy.js +335 -0
- package/plugins/fancy-scan/wait-turn.js +46 -0
- package/plugins/fancy-story-builder/db/README.md +106 -0
- package/plugins/fancy-story-builder/db/client.js +228 -0
- package/plugins/fancy-story-builder/db/commands.js +145 -0
- package/plugins/fancy-story-builder/db/ids.js +39 -0
- package/plugins/fancy-story-builder/db/import.js +798 -0
- package/plugins/fancy-story-builder/db/project.js +299 -0
- package/plugins/fancy-story-builder/db/query.js +361 -0
- package/plugins/fancy-story-builder/db/schema.js +417 -0
- package/plugins/fancy-story-builder/db/stage-sync.js +238 -0
- package/plugins/fancy-story-builder/flesh-output.js +19 -6
- package/plugins/fancy-story-builder/index.js +4105 -396
- package/plugins/fancy-story-builder/patch-driver.js +390 -0
- package/plugins/fancy-story-builder/prompts/01-skeleton-prompt.md +29 -19
- package/plugins/fancy-story-builder/prompts/02-flesh-prompt.md +72 -10
- package/plugins/fancy-story-builder/prompts/03-rhythm-prompt.md +40 -5
- package/plugins/fancy-story-builder/prompts/04-writing-prompt.md +37 -0
- package/plugins/fancy-story-builder/purpose-template.md +42 -66
- package/plugins/fancy-story-builder/references/formulas-skeleton.json +229 -56
- package/plugins/fancy-story-builder/references/genre-profiles.json +3514 -0
- package/plugins/fancy-story-builder/references/glossary.md +15 -6
- package/plugins/fancy-story-builder/references/index.md +97 -6
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/00-index.md +1 -1
- package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/07-audit.md +25 -7
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/01-character.md +5 -1
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/03-relations.md +6 -2
- package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/05-audit.md +15 -5
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/00-index.md +1 -1
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/01-positioning.md +2 -1
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/03-entities.md +1 -1
- package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/06-audit.md +19 -1
- package/plugins/fancy-story-builder/schema-setting.json +1100 -0
- package/plugins/fancy-story-builder/schema-setting.md +201 -293
- package/plugins/fancy-story-builder/scripts/brief-validate.js +164 -0
- package/plugins/fancy-story-builder/scripts/content-quality.js +4 -1
- package/plugins/fancy-story-builder/scripts/flesh-validate.js +135 -12
- package/plugins/fancy-story-builder/scripts/graph-utils.js +146 -47
- package/plugins/fancy-story-builder/scripts/reference-log.js +110 -0
- package/plugins/fancy-story-builder/scripts/rhythm-validate.js +100 -4
- package/plugins/fancy-story-builder/scripts/schema-pages.js +2668 -0
- package/plugins/fancy-story-builder/scripts/semantic-lint.js +5 -1
- package/plugins/fancy-story-builder/scripts/skeleton-validate.js +158 -17
- package/plugins/fancy-story-builder/scripts/stage-batches.js +36 -2
- package/plugins/fancy-story-builder/scripts/stage-contract.js +12 -0
- package/plugins/fancy-story-builder/scripts/story-artifacts.js +933 -0
- package/plugins/fancy-story-builder/scripts/upstream-query.js +1 -1
- package/plugins/fancy-story-builder/scripts/v2/baseline.js +112 -0
- package/plugins/fancy-story-builder/scripts/v2/cast.js +517 -0
- package/plugins/fancy-story-builder/scripts/v2/context.js +434 -0
- package/plugins/fancy-story-builder/scripts/v2/contracts.js +493 -0
- package/plugins/fancy-story-builder/scripts/v2/core.js +419 -0
- package/plugins/fancy-story-builder/scripts/v2/engine.js +1068 -0
- package/plugins/fancy-story-builder/scripts/v2/export-markdown.js +794 -0
- package/plugins/fancy-story-builder/scripts/v2/genre.js +195 -0
- package/plugins/fancy-story-builder/scripts/v2/knowledge.js +321 -0
- package/plugins/fancy-story-builder/scripts/v2/macro.js +409 -0
- package/plugins/fancy-story-builder/scripts/v2/manifest.js +538 -0
- package/plugins/fancy-story-builder/scripts/v2/migrate.js +137 -0
- package/plugins/fancy-story-builder/scripts/v2/prompts.js +1335 -0
- package/plugins/fancy-story-builder/scripts/v2/rhythm.js +618 -0
- package/plugins/fancy-story-builder/scripts/v2/scale.js +843 -0
- package/plugins/fancy-story-builder/scripts/v2/snapshot.js +121 -0
- package/plugins/fancy-story-builder/scripts/v2/stages.js +273 -0
- package/plugins/fancy-story-builder/scripts/v2/writing.js +216 -0
- package/plugins/fancy-story-builder/storydb/README.md +271 -0
- package/plugins/fancy-story-builder/storydb/cli.js +458 -0
- package/plugins/fancy-story-builder/storydb/client.js +351 -0
- package/plugins/fancy-story-builder/storydb/compile.js +452 -0
- package/plugins/fancy-story-builder/storydb/context.js +288 -0
- package/plugins/fancy-story-builder/storydb/definitions.js +699 -0
- package/plugins/fancy-story-builder/storydb/driver.js +106 -0
- package/plugins/fancy-story-builder/storydb/dsh-tools.js +313 -0
- package/plugins/fancy-story-builder/storydb/export.js +175 -0
- package/plugins/fancy-story-builder/storydb/ids.js +31 -0
- package/plugins/fancy-story-builder/storydb/impact.js +170 -0
- package/plugins/fancy-story-builder/storydb/import.js +559 -0
- package/plugins/fancy-story-builder/storydb/mcp.js +99 -0
- package/plugins/fancy-story-builder/storydb/prompts.js +952 -0
- package/plugins/fancy-story-builder/storydb/stage-command.js +379 -0
- package/plugins/fancy-story-builder/storydb/stage.js +426 -0
- package/plugins/fancy-story-builder/storydb/store.js +891 -0
- package/plugins/fancy-story-builder/storydb/tools.js +592 -0
- package/plugins/fancy-story-builder/storydb/validation.js +183 -0
- package/plugins/fancy-story-builder/templates/v2/10-scale/scale-template.json +144 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/emotion-template.json +15 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/endings-template.json +16 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/lines-template.json +28 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/roles-template.json +10 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/story-template.json +19 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/volumes-template.json +24 -0
- package/plugins/fancy-story-builder/templates/v2/20-macro/world-template.json +24 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/characters-template.json +49 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/climaxes-template.json +14 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/conflicts-template.json +30 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/factions-template.json +18 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/foreshadows-template.json +29 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/information-template.json +29 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/items-template.json +13 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/locations-template.json +12 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/payoffs-template.json +16 -0
- package/plugins/fancy-story-builder/templates/v2/30-cast/relations-template.json +44 -0
- package/plugins/fancy-story-builder/templates/v2/40-rhythm/chapter-map-template.json +81 -0
- package/plugins/fancy-story-builder/templates/v2/40-rhythm/outline-template.json +162 -0
- package/plugins/fancy-story-builder/templates/v2/50-writing/ledger-template.json +46 -0
- package/plugins/fancy-story-builder/templates/v2/60-deslop/report-template.json +10 -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 +267 -44
- 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 +121 -19
- 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 +129 -21
- package/plugins/fancy-story-builder/templates//350/241/200/350/202/211//345/205/266/344/273/226/345/256/236/344/275/223/346/250/241/346/235/277.json +62 -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 +76 -17
- 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 +56 -8
- 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 +63 -13
- 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 +34 -6
- 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 +81 -18
- 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 +202 -42
- 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 +160 -27
- 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 +217 -41
- 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 +215 -41
- package/plugins/fancy-story-builder/templates.js +272 -74
- package/plugins/fancy-story-builder/wiki-references.js +429 -93
- package/plugins/fancy-story-builder/writing-driver.js +336 -9
- package/plugins/fancy-topic/index.js +414 -61
- package/plugins/fancy-topic/prompts/01-exploration-prompt.md +115 -0
- package/plugins/fancy-topic/scripts/save-suggestion.js +219 -0
- package/plugins/fancy-topic/scripts/select-topic.js +106 -63
- package/plugins/fancy-topic/templates.js +225 -122
- package/plugins/fancy-topic/tool-deploy.js +200 -0
- package/lib/safe-rm.js +0 -94
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* v2/contracts.js —— 2.0 阶段契约(唯一文本源)
|
|
3
|
+
*
|
|
4
|
+
* 同一份文本用于:
|
|
5
|
+
* - 生成阶段目录 README.md(项目内自包含)
|
|
6
|
+
* - 生成 LLM 提示词(只指向项目内文件)
|
|
7
|
+
* - bundle.json 的 checks 说明
|
|
8
|
+
*
|
|
9
|
+
* 禁止在这里写插件源码路径、node_modules、脚本文件名。
|
|
10
|
+
*/
|
|
11
|
+
export const STAGE_CONTRACT = {
|
|
12
|
+
'00-baseline': {
|
|
13
|
+
title: '输入基线',
|
|
14
|
+
purpose: '固化选题、参考与公式版本。后续阶段只读,不再重新解释选题。',
|
|
15
|
+
readOrder: ['input.json', 'references.json', 'formulas.json'],
|
|
16
|
+
outputs: ['input.json', 'references.json', 'formulas.json'],
|
|
17
|
+
sections: [
|
|
18
|
+
{
|
|
19
|
+
id: 'input',
|
|
20
|
+
title: 'input.json',
|
|
21
|
+
body: [
|
|
22
|
+
'必填:book_name、genre、positioning、target_chapters、target_words、core_conflict、reader_value、golden_finger、core_setting。',
|
|
23
|
+
'可选:hard_constraints(数组)、anti_tropes(数组)、one_line_pitch、selling_points。',
|
|
24
|
+
'target_chapters 与 target_words 必须是正整数;后续所有数量从它们推导。',
|
|
25
|
+
'这里只放输入,不写人物名、势力名、章节内容。',
|
|
26
|
+
],
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'references',
|
|
30
|
+
title: 'references.json',
|
|
31
|
+
body: [
|
|
32
|
+
'记录对标作品、参考资料、来源文件与哈希。',
|
|
33
|
+
'没有参考时写空数组,不要省略文件。',
|
|
34
|
+
],
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
id: 'formulas',
|
|
38
|
+
title: 'formulas.json',
|
|
39
|
+
body: [
|
|
40
|
+
'数量公式定义与版本,不是计算结果。',
|
|
41
|
+
'计算结果只看 10-scale/scale.json。',
|
|
42
|
+
],
|
|
43
|
+
},
|
|
44
|
+
],
|
|
45
|
+
checks: ['输入字段齐全', '目标章/字为正整数', '不包含人物、势力、剧情内容'],
|
|
46
|
+
forbidden: ['人物姓名', '势力名称', '章节剧情', '未经确认的固定数量'],
|
|
47
|
+
},
|
|
48
|
+
'10-scale': {
|
|
49
|
+
title: '数量',
|
|
50
|
+
purpose: '只回答“多少”:章、卷、幕、配额、节奏预算。不写人物、势力、地点、剧情。',
|
|
51
|
+
readOrder: ['_context/baseline.json', 'scale.json'],
|
|
52
|
+
outputs: ['scale.json', 'scale.md', '_context/baseline.json'],
|
|
53
|
+
sections: [
|
|
54
|
+
{
|
|
55
|
+
id: 'capacity',
|
|
56
|
+
title: 'capacity',
|
|
57
|
+
body: [
|
|
58
|
+
'target_chapters:来自 baseline.input.target_chapters。',
|
|
59
|
+
'target_words:来自 baseline.input.target_words。',
|
|
60
|
+
'avg_words_per_chapter = round(target_words / target_chapters)。',
|
|
61
|
+
'base_words_per_chapter:节奏公式的字数基准,默认 2000。',
|
|
62
|
+
'chapter_scale = base_words_per_chapter / avg_words_per_chapter。',
|
|
63
|
+
],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'structure',
|
|
67
|
+
title: 'structure',
|
|
68
|
+
body: [
|
|
69
|
+
'volume_count 等于 volumes 数组长度。',
|
|
70
|
+
'每卷 chapters 之和必须等于 target_chapters;chapter_start/chapter_end 连续覆盖 1..T。',
|
|
71
|
+
'每卷至少 1 幕;每卷 acts 的 chapters 之和必须等于本卷 chapters。',
|
|
72
|
+
'structure.acts 是全部卷幕的扁平表,act_id 唯一,volume_id 必须存在。',
|
|
73
|
+
'ratio 之和必须等于 1。',
|
|
74
|
+
],
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
id: 'quotas',
|
|
78
|
+
title: 'quotas',
|
|
79
|
+
body: [
|
|
80
|
+
'人物:protagonist、core_supporting、volume_supporting、core_antagonist、volume_antagonist。',
|
|
81
|
+
'实体:factions、faction_relations、locations、items{core,branch,symbolic}、conflicts{core,phase,branch}。',
|
|
82
|
+
'节奏素材:foreshadows{small,medium,large}、climaxes{small,medium,large}、pleasures{small,medium,large}。',
|
|
83
|
+
'结构:endings、world_rules{core,information,social}、main_lines、branches、information_gaps。',
|
|
84
|
+
'关系:relations{character,faction,membership}。',
|
|
85
|
+
'所有配额必须是非负整数;下游会按这个数量严格核对。',
|
|
86
|
+
],
|
|
87
|
+
},
|
|
88
|
+
{
|
|
89
|
+
id: 'distribution',
|
|
90
|
+
title: 'distribution',
|
|
91
|
+
body: [
|
|
92
|
+
'按卷拆分:每卷 chapters、卷级配角、卷级反派、阶段冲突、伏笔、高潮、爽点。',
|
|
93
|
+
'distribution 里的 chapters 必须等于对应卷的 chapters;所有卷都要有分布。',
|
|
94
|
+
],
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
id: 'rhythm-budget',
|
|
98
|
+
title: 'rhythm_budget',
|
|
99
|
+
body: [
|
|
100
|
+
'钩子、揭示、反转、情绪峰值的最低值与目标值。',
|
|
101
|
+
'golden_three 记录黄金三章的特殊要求。',
|
|
102
|
+
],
|
|
103
|
+
},
|
|
104
|
+
{
|
|
105
|
+
id: 'formulas',
|
|
106
|
+
title: 'formulas / derivations',
|
|
107
|
+
body: [
|
|
108
|
+
'每条公式都要有 value、range_low、range_high、formula。',
|
|
109
|
+
'range_low / range_high 是基础公式区间乘以题材 profile 倍率后的结果。',
|
|
110
|
+
'value 必须在调整后区间内;确实需要偏离时,在该公式条目写非空 deviation_reason。',
|
|
111
|
+
'LLM 只需写 `derivation_reasons` 说明偏离推荐值的原因;完整 formulas / derivations 由插件补齐。',
|
|
112
|
+
'formula_version 记录公式版本,genre_profile 记录选中的题材 profile。',
|
|
113
|
+
],
|
|
114
|
+
},
|
|
115
|
+
{
|
|
116
|
+
id: 'forbidden',
|
|
117
|
+
title: '禁止事项',
|
|
118
|
+
body: [
|
|
119
|
+
'禁止出现人物姓名、势力名称、地点名称、道具名称、剧情句、章节标题。',
|
|
120
|
+
'本阶段不生成任何 wiki 页面;数字不是页面。',
|
|
121
|
+
],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
checks: [
|
|
125
|
+
'各卷章数之和 = target_chapters',
|
|
126
|
+
'各卷幕章数之和 = 本卷章数',
|
|
127
|
+
'ratio 之和 = 1',
|
|
128
|
+
'所有配额是非负整数',
|
|
129
|
+
'每条公式值在合法区间内或有 deviation_reason',
|
|
130
|
+
'没有人物/势力/地点/剧情内容',
|
|
131
|
+
],
|
|
132
|
+
forbidden: ['人物姓名', '势力名称', '地点名称', '道具名称', '剧情句', '章节标题'],
|
|
133
|
+
},
|
|
134
|
+
'20-macro': {
|
|
135
|
+
title: '宏观',
|
|
136
|
+
purpose: '先定世界、故事、卷纲、幕纲、主支线、结局、情绪曲线和角色功能位。',
|
|
137
|
+
readOrder: ['_context/baseline.json', '_context/scale.json', 'world.json', 'story.json', 'volumes.json', 'lines.json', 'endings.json', 'emotion.json', 'roles.json'],
|
|
138
|
+
outputs: ['world.json', 'story.json', 'volumes.json', 'lines.json', 'endings.json', 'emotion.json', 'roles.json'],
|
|
139
|
+
sections: [
|
|
140
|
+
{
|
|
141
|
+
id: 'world',
|
|
142
|
+
title: 'world.json',
|
|
143
|
+
body: [
|
|
144
|
+
'premise、theme、tone 必填。',
|
|
145
|
+
'world_rules 每条要有 id、name、content、scope、cost、impact、category。',
|
|
146
|
+
'category 只能是:核心 / 信息 / 社会。三类数量必须等于 scale.quotas.world_rules。',
|
|
147
|
+
'规则要能直接约束人物行为,不能只是氛围形容词。',
|
|
148
|
+
],
|
|
149
|
+
},
|
|
150
|
+
{
|
|
151
|
+
id: 'story',
|
|
152
|
+
title: 'story.json',
|
|
153
|
+
body: [
|
|
154
|
+
'core_question:全书要回答的一个问题。',
|
|
155
|
+
'core_conflict:谁与谁为了什么对抗。',
|
|
156
|
+
'structure.acts 必须覆盖 scale 的每一幕,每幕写 goal、turn、end_state。',
|
|
157
|
+
'structure.climax / resolution 写全书高潮与收束方向。',
|
|
158
|
+
],
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
id: 'volumes',
|
|
162
|
+
title: 'volumes.json',
|
|
163
|
+
body: [
|
|
164
|
+
'卷数量、卷 ID、章节区间必须与 scale 完全一致。',
|
|
165
|
+
'每卷写 title、goal、core_conflict、emotional_arc、ending_hook。',
|
|
166
|
+
'每卷 acts 数量、act_id、章节区间必须与 scale 完全一致;每幕写 goal、climax。',
|
|
167
|
+
],
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: 'lines',
|
|
171
|
+
title: 'lines.json',
|
|
172
|
+
body: [
|
|
173
|
+
'main_line:唯一主线,id 形如 M001;nodes 至少覆盖每一卷,节点写 id、volume、act、goal、turn。',
|
|
174
|
+
'branches:数量等于 scale.quotas.branches;每条写 id、name、goal、start、turning、resolution、interweaves。',
|
|
175
|
+
'start/turning/resolution 使用 V001/A001 形式;interweaves 必须引用已有主线节点。',
|
|
176
|
+
],
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
id: 'endings',
|
|
180
|
+
title: 'endings.json',
|
|
181
|
+
body: [
|
|
182
|
+
'结局数量等于 scale.quotas.endings。',
|
|
183
|
+
'必须恰好 1 个 level=全书级 的结局。',
|
|
184
|
+
'每个结局写 id、level、type、direction、required_foreshadow_recovery。',
|
|
185
|
+
'required_foreshadow_recovery 用 FS001 形式;此时伏笔实体还没生成,只做格式校验。',
|
|
186
|
+
],
|
|
187
|
+
},
|
|
188
|
+
{
|
|
189
|
+
id: 'emotion',
|
|
190
|
+
title: 'emotion.json',
|
|
191
|
+
body: [
|
|
192
|
+
'volumes 数组必须覆盖每一卷。',
|
|
193
|
+
'每卷写 volume_id、arc(情绪走向)、peaks(峰值位置/强度)。',
|
|
194
|
+
],
|
|
195
|
+
},
|
|
196
|
+
{
|
|
197
|
+
id: 'roles',
|
|
198
|
+
title: 'roles.json',
|
|
199
|
+
body: [
|
|
200
|
+
'宏观阶段只写角色功能位,不写姓名。',
|
|
201
|
+
'role_id 形如 ROLE-PROTAGONIST;function 用:主角 / 核心配角 / 卷级配角 / 核心反派 / 卷级反派。',
|
|
202
|
+
'每个功能位写 role_id、function、arc_question、macro_goal。',
|
|
203
|
+
'功能位数量必须与 scale.quotas.characters 五类配额一一对应;30-cast 会严格核对这些槽位是否被填满。',
|
|
204
|
+
],
|
|
205
|
+
},
|
|
206
|
+
{
|
|
207
|
+
id: 'forbidden',
|
|
208
|
+
title: '禁止事项',
|
|
209
|
+
body: [
|
|
210
|
+
'不写具体人物姓名、势力名称、地点名称、道具名称。',
|
|
211
|
+
'不写章节细纲;章节落点留给 40-rhythm。',
|
|
212
|
+
'不引用尚未生成的实体 ID(伏笔回收要求除外,只允许 FSxxx 格式)。',
|
|
213
|
+
],
|
|
214
|
+
},
|
|
215
|
+
],
|
|
216
|
+
checks: [
|
|
217
|
+
'卷/幕数量与 scale 一致,章节区间连续',
|
|
218
|
+
'主线节点覆盖所有卷',
|
|
219
|
+
'支线数量 = scale.quotas.branches',
|
|
220
|
+
'结局数量 = scale.quotas.endings,且恰好 1 个全书级',
|
|
221
|
+
'角色功能位与人物配额一一对应',
|
|
222
|
+
'世界规则三类数量与配额一致',
|
|
223
|
+
'没有具体人名、势力名、地点名',
|
|
224
|
+
],
|
|
225
|
+
forbidden: ['具体人物姓名', '势力名称', '地点名称', '道具名称', '章节细纲'],
|
|
226
|
+
},
|
|
227
|
+
'30-cast': {
|
|
228
|
+
title: '实体',
|
|
229
|
+
purpose: '把宏观功能位落成具体人物,并设计势力、地点、道具、冲突、伏笔、高潮、爽点、关系、信息差。',
|
|
230
|
+
readOrder: ['_context/baseline.json', '_context/scale.json', '_context/macro.json', 'characters.json', 'factions.json', 'locations.json', 'items.json', 'conflicts.json', 'foreshadows.json', 'climaxes.json', 'payoffs.json', 'relations.json', 'information.json'],
|
|
231
|
+
outputs: ['characters.json', 'factions.json', 'locations.json', 'items.json', 'conflicts.json', 'foreshadows.json', 'climaxes.json', 'payoffs.json', 'relations.json', 'information.json'],
|
|
232
|
+
sections: [
|
|
233
|
+
{
|
|
234
|
+
id: 'characters',
|
|
235
|
+
title: 'characters.json',
|
|
236
|
+
body: [
|
|
237
|
+
'每个人物写 id、role_slot、name、type、faction、description、goal、flaw、golden_finger、information_state、arc、voice、traits、exit。',
|
|
238
|
+
'type 只能是:主角 / 贯穿级核心配角 / 卷级重要配角 / 贯穿级核心反派 / 卷级反派;数量严格等于 scale.quotas.characters。',
|
|
239
|
+
'role_slot 必须填宏观 roles.json 的功能位;每个功能位恰好被 1 个角色占用。',
|
|
240
|
+
'goal 至少有 short_term / medium_term / long_term;arc.stages 至少 1 个;voice 必须有 catchphrase 与 rhythm。',
|
|
241
|
+
],
|
|
242
|
+
},
|
|
243
|
+
{
|
|
244
|
+
id: 'factions',
|
|
245
|
+
title: 'factions.json',
|
|
246
|
+
body: ['每个势力写 id、name、type、description、goal、resources、territory。数量等于 scale.quotas.factions。'],
|
|
247
|
+
},
|
|
248
|
+
{
|
|
249
|
+
id: 'locations',
|
|
250
|
+
title: 'locations.json',
|
|
251
|
+
body: ['每个地点写 id、name、type、description、narrative_function。数量等于 scale.quotas.locations。'],
|
|
252
|
+
},
|
|
253
|
+
{
|
|
254
|
+
id: 'items',
|
|
255
|
+
title: 'items.json',
|
|
256
|
+
body: ['每个道具写 id、name、category、description、function。category 只能是 core / branch / symbolic,数量分别等于 scale.quotas.items。'],
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
id: 'conflicts',
|
|
260
|
+
title: 'conflicts.json',
|
|
261
|
+
body: [
|
|
262
|
+
'每个冲突写 id、name、type、description、core_goal、stakes、escalation_path、resolution_plan、participants。',
|
|
263
|
+
'type 只能是 core / phase / branch,数量分别等于 scale.quotas.conflicts。',
|
|
264
|
+
'escalation_path 至少 2 个节点,每个节点写 node_type、description。',
|
|
265
|
+
'participants 只能引用已存在的人物/势力/地点。',
|
|
266
|
+
],
|
|
267
|
+
},
|
|
268
|
+
{
|
|
269
|
+
id: 'foreshadows',
|
|
270
|
+
title: 'foreshadows.json',
|
|
271
|
+
body: ['每个伏笔写 id、name、type、setup、clues、payoff_target、recovery_requirement。type 只能是 小/中/大,数量严格等于配额。可选 `scope`:book / volume / arc / chapter,用于区分全书级、卷级、章级回收窗口。'],
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
id: 'climaxes',
|
|
275
|
+
title: 'climaxes.json',
|
|
276
|
+
body: ['每个高潮写 id、name、type、description、payoff、participants。type 只能是 小/中/大,数量严格等于配额。'],
|
|
277
|
+
},
|
|
278
|
+
{
|
|
279
|
+
id: 'payoffs',
|
|
280
|
+
title: 'payoffs.json',
|
|
281
|
+
body: [
|
|
282
|
+
'每个爽点写 id、name、type、scale、setup、payoff、emotional_effect、required_setup。',
|
|
283
|
+
'scale 只能是 small / medium / large,数量严格等于 scale.quotas.pleasures。',
|
|
284
|
+
'required_setup 只能引用伏笔/冲突/高潮/其它爽点,或冲突升级节点 X001-escalation-1。',
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
id: 'relations',
|
|
289
|
+
title: 'relations.json',
|
|
290
|
+
body: [
|
|
291
|
+
'character_relations:写 id、from、to、kind、initial_state、changes。两端必须是人物;不能指向自己。changes 可以为空(关系保持静态);写了变化节点才校验 stage/trigger/description。',
|
|
292
|
+
'faction_relations:写 id、from、to、kind、initial_state、changes。两端必须是势力。changes 可以为空;写了变化节点才校验。',
|
|
293
|
+
'memberships:写 id、character、faction、position、kind。',
|
|
294
|
+
'三个数组的长度分别等于 scale.quotas.relations。',
|
|
295
|
+
'**关系类型 kind 是自由文本,不设枚举**:可以写“互相利用”“表面师徒、实际监视”“旧友但立场对立”等。',
|
|
296
|
+
'结构校验只检查两端存在、不能自指;变化节点如果写了才校验字段完整。关系是否前后矛盾、是否符合人物目标与冲突,交给 llm_wiki 的语义检查。',
|
|
297
|
+
'每条人物关系、势力关系、成员关系都会各自生成一个独立 wiki 页面,页面里带“语义验证点”,供 llm_wiki 逐条做语义校验。',
|
|
298
|
+
],
|
|
299
|
+
},
|
|
300
|
+
{
|
|
301
|
+
id: 'information',
|
|
302
|
+
title: 'information.json',
|
|
303
|
+
body: [
|
|
304
|
+
'每个信息差写 id、conflict、info_name、who_knows、who_does_not_know、initial_knowledge、resolution_method、writing_ban。',
|
|
305
|
+
'initial_knowledge 写开篇时每个相关人物知道什么:character、state(unknown/partial/full/false)、knowledge、how(none/witnessed/told/inferred/document/rumor/experience/other)、source_character、scene、evidence。',
|
|
306
|
+
'conflict 必须是已存在的冲突;who_knows / who_does_not_know / initial_knowledge 只能引用已存在人物。',
|
|
307
|
+
'数量等于 scale.quotas.information_gaps。',
|
|
308
|
+
],
|
|
309
|
+
},
|
|
310
|
+
{
|
|
311
|
+
id: 'forbidden',
|
|
312
|
+
title: '禁止事项',
|
|
313
|
+
body: [
|
|
314
|
+
'禁止出现 chapter、chapter_id、ch 等章节字段;章节落点只能在 40-rhythm 分配。',
|
|
315
|
+
'禁止引用不存在的实体 ID。',
|
|
316
|
+
'禁止物理删除宏观功能位;角色合并用 status=deprecated + merged_into。',
|
|
317
|
+
],
|
|
318
|
+
},
|
|
319
|
+
],
|
|
320
|
+
checks: [
|
|
321
|
+
'五类人物数量与配额一致',
|
|
322
|
+
'每个宏观 role_slot 恰好被 1 个角色填充',
|
|
323
|
+
'势力/地点/道具/冲突/伏笔/高潮/爽点数量与配额一致',
|
|
324
|
+
'关系数量与配额一致,两端存在;kind 不设枚举,只做结构校验',
|
|
325
|
+
'每条关系生成独立 wiki 页面,交由语义检查判断是否自洽',
|
|
326
|
+
'信息差数量与配额一致,冲突和人物存在',
|
|
327
|
+
'initial_knowledge 引用存在人物,状态和获知方式合法',
|
|
328
|
+
'没有章节字段',
|
|
329
|
+
],
|
|
330
|
+
forbidden: ['章节号', '不存在的实体 ID', '删除宏观功能位'],
|
|
331
|
+
},
|
|
332
|
+
'40-rhythm': {
|
|
333
|
+
title: '节奏与细纲',
|
|
334
|
+
purpose: '把宏观和实体落到每一章:谁、何时、何地、为什么、怎么写;再为每章生成可独立写作的细纲。',
|
|
335
|
+
readOrder: ['_context/baseline.json', '_context/scale.json', '_context/macro.json', '_context/cast.json', 'chapter_map.json', 'outlines/<chapter_id>.json'],
|
|
336
|
+
outputs: ['chapter_map.json', 'outlines/<chapter_id>.json', 'index.json'],
|
|
337
|
+
sections: [
|
|
338
|
+
{
|
|
339
|
+
id: 'chapter-map',
|
|
340
|
+
title: 'chapter_map.json',
|
|
341
|
+
body: [
|
|
342
|
+
'chapters 必须覆盖 1..T,每章有稳定 chapter_id 和可调整 display_no。',
|
|
343
|
+
'每章写 title、volume、act、pov、cast、locations、time、why、how、foreshadow_actions、payoff_actions、information_gaps、knowledge_events、emotion、hook、word_target。',
|
|
344
|
+
'knowledge_events 记录本章角色知识变化:subject_type(information/foreshadow)、subject_id、character、change(learns/partially_learns/confirms/corrects/forgets/misinforms)、coverage(unknown/partial/full/false)、knowledge(具体知道什么)、how(witnessed/told/inferred/document/rumor/experience/other)、source_character、scene、evidence。',
|
|
345
|
+
'ending_actions 可选;每个 endings.json 里的结局节点至少要在对应卷末或全书末的章节落一次。',
|
|
346
|
+
'why 里写 main_line_nodes、branch_nodes、conflict、theme、stakes。',
|
|
347
|
+
'how 里写 function_main、function_aux、turn、ending_hook。',
|
|
348
|
+
'display_no 必须连续;volume/act 必须与 scale 的章节区间一致。',
|
|
349
|
+
],
|
|
350
|
+
},
|
|
351
|
+
{
|
|
352
|
+
id: 'outline',
|
|
353
|
+
title: 'outlines/<chapter_id>.json',
|
|
354
|
+
body: [
|
|
355
|
+
'一章一个文件,文件名使用 chapter_id。',
|
|
356
|
+
'chapter 里写 chapter_id、number、title、volume、act、word_target、pov、time、locations、cast、why、how、continuity、coverage、knowledge_events。',
|
|
357
|
+
'pov 写 id、name、entry_state、exit_state;cast 写每个人的 id、name、role_in_chapter、entry、exit、knowledge。',
|
|
358
|
+
'knowledge_events 与章节地图同结构;cast[].knowledge 写本章结束时该角色知道什么(subject_type、subject_id、state、coverage、knowledge、how、scene、evidence),必须和章节地图的知识时间线一致。',
|
|
359
|
+
'how.scenes 至少 1 个;每个场景必须有 goal、obstacle、turn、outcome。',
|
|
360
|
+
'must_write / must_not_write 必须非空;ending 必须写 type、text、hook。',
|
|
361
|
+
'coverage 必须覆盖本章的主线节点、支线、冲突、伏笔、爽点、信息差。',
|
|
362
|
+
'continuity 必须说明与上一章/下一章的衔接(首章 from_prev 可为 null,末章 to_next 可为 null)。',
|
|
363
|
+
],
|
|
364
|
+
},
|
|
365
|
+
{
|
|
366
|
+
id: 'coverage',
|
|
367
|
+
title: '覆盖矩阵',
|
|
368
|
+
body: [
|
|
369
|
+
'所有主线节点、支线、冲突、伏笔、爽点、信息差都必须至少有一个章节落点。',
|
|
370
|
+
'伏笔必须先埋后收;爽点必须先铺垫后兑现。',
|
|
371
|
+
'每章至少 1 个钩子;黄金三章建议强钩子。',
|
|
372
|
+
],
|
|
373
|
+
},
|
|
374
|
+
{
|
|
375
|
+
id: 'foreshadow-order',
|
|
376
|
+
title: '伏笔顺序',
|
|
377
|
+
body: ['foreshadow_actions.action 用 埋设/回收/推进/强化;同一伏笔第一次回收不能早于第一次埋设。'],
|
|
378
|
+
},
|
|
379
|
+
{
|
|
380
|
+
id: 'forbidden',
|
|
381
|
+
title: '禁止事项',
|
|
382
|
+
body: [
|
|
383
|
+
'禁止细纲缺失或只写一句话。',
|
|
384
|
+
'禁止引用不存在的实体、冲突、伏笔、爽点、信息差。',
|
|
385
|
+
'禁止让本章出场人物/地点与章节地图不一致。',
|
|
386
|
+
'禁止把全书角色都塞进单章 cast。',
|
|
387
|
+
],
|
|
388
|
+
},
|
|
389
|
+
],
|
|
390
|
+
checks: [
|
|
391
|
+
'章节地图覆盖全部章节',
|
|
392
|
+
'卷/幕/章节区间与 scale 一致',
|
|
393
|
+
'主线/支线/冲突/伏笔/爽点/信息差都有落点',
|
|
394
|
+
'伏笔先埋后收',
|
|
395
|
+
'每章有 5W、硬约束、钩子',
|
|
396
|
+
'每章细纲自包含,cast/locations/coverage 与地图一致',
|
|
397
|
+
'角色知识事件按章节回放不矛盾:已经知道后不能重新写成不知道',
|
|
398
|
+
],
|
|
399
|
+
forbidden: ['缺章', '缺细纲', '伏笔先收后埋', '细纲引用不存在的实体'],
|
|
400
|
+
},
|
|
401
|
+
'50-writing': {
|
|
402
|
+
title: '正文',
|
|
403
|
+
purpose: '只按单章细纲写正文,不重新设计剧情。',
|
|
404
|
+
readOrder: ['_context/scale.json', '_context/macro.json', '_context/cast.json', 'outlines/<chapter_id>.json', 'ledger.json'],
|
|
405
|
+
outputs: ['chapters/第001章.md', 'ledger.json'],
|
|
406
|
+
sections: [
|
|
407
|
+
{
|
|
408
|
+
id: 'writing',
|
|
409
|
+
title: '正文规则',
|
|
410
|
+
body: [
|
|
411
|
+
'每章第一行写 # 第N章 标题,N 与 display_no 一致。',
|
|
412
|
+
'必须覆盖细纲 must_write;绝对不能违反 must_not_write。',
|
|
413
|
+
'结尾必须按细纲 ending.type / text / hook 收束。',
|
|
414
|
+
'不要改上游设定;细纲缺信息时返回 OUTLINE_INCOMPLETE,不要自己发明。',
|
|
415
|
+
],
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
id: 'ledger',
|
|
419
|
+
title: 'ledger.json',
|
|
420
|
+
body: [
|
|
421
|
+
'每章登记 ch、chapter_id、title、pov、time、locations、cast、knowledge_changes、foreshadow_status、information_status、ending_hook、word_count。',
|
|
422
|
+
'knowledge_changes 写结构化知识变化:subject_type、subject_id、character、from、to、coverage、knowledge、how、source_character、scene、evidence;重写时替换同章旧条目。',
|
|
423
|
+
'重写某章时替换同章旧条目,不要留两条。',
|
|
424
|
+
],
|
|
425
|
+
},
|
|
426
|
+
{
|
|
427
|
+
id: 'forbidden',
|
|
428
|
+
title: '禁止事项',
|
|
429
|
+
body: ['禁止改人物名/势力名/伏笔落点', '禁止跳过细纲硬约束', '禁止自动改上游 JSON'],
|
|
430
|
+
},
|
|
431
|
+
],
|
|
432
|
+
checks: ['章文件齐全', '标题与 display_no 一致', '正文非空且达到字数下限', 'ledger 有对应条目', 'ledger 知识变化与章节地图一致', 'must_write 覆盖、must_not_write 未违反'],
|
|
433
|
+
forbidden: ['改上游设定', '跳过细纲', '自动改上游 JSON'],
|
|
434
|
+
},
|
|
435
|
+
'60-deslop': {
|
|
436
|
+
title: '去味',
|
|
437
|
+
purpose: '只改文风,不改结构、情节、信息差和章尾钩子。',
|
|
438
|
+
readOrder: ['_context/../50-writing/ledger.json', 'chapters/第001章.md'],
|
|
439
|
+
outputs: ['reports/', 'revisions/'],
|
|
440
|
+
sections: [
|
|
441
|
+
{
|
|
442
|
+
id: 'deslop',
|
|
443
|
+
title: '去味规则',
|
|
444
|
+
body: ['不得修改 must_write / must_not_write。', '不得改变核心情节走向、关键事件、伏笔、信息差状态、章尾钩子。', '改动比例超过 35% 自动回滚。'],
|
|
445
|
+
},
|
|
446
|
+
],
|
|
447
|
+
checks: ['结构与硬约束不变', '改动比例在阈值内', 'AI 腔检测下降'],
|
|
448
|
+
forbidden: ['改剧情', '改人物设定', '改章尾钩子'],
|
|
449
|
+
},
|
|
450
|
+
};
|
|
451
|
+
|
|
452
|
+
export function contractFor(stageId) {
|
|
453
|
+
return STAGE_CONTRACT[stageId] || null;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
export function renderContractMarkdown(stageId) {
|
|
457
|
+
const c = contractFor(stageId);
|
|
458
|
+
if (!c) return '';
|
|
459
|
+
const lines = [];
|
|
460
|
+
lines.push('# ' + stageId + ':' + c.title);
|
|
461
|
+
lines.push('');
|
|
462
|
+
lines.push('> 本文件由插件生成,是这个阶段目录的自包含契约。');
|
|
463
|
+
lines.push('');
|
|
464
|
+
lines.push('## 目标');
|
|
465
|
+
lines.push('');
|
|
466
|
+
lines.push(c.purpose);
|
|
467
|
+
lines.push('');
|
|
468
|
+
lines.push('## 阅读顺序');
|
|
469
|
+
lines.push('');
|
|
470
|
+
for (const f of c.readOrder) lines.push('- `' + f + '`');
|
|
471
|
+
lines.push('');
|
|
472
|
+
for (const section of c.sections) {
|
|
473
|
+
lines.push('## ' + section.title);
|
|
474
|
+
lines.push('');
|
|
475
|
+
for (const para of section.body) lines.push(para);
|
|
476
|
+
lines.push('');
|
|
477
|
+
}
|
|
478
|
+
lines.push('## 阶段校验');
|
|
479
|
+
lines.push('');
|
|
480
|
+
for (const check of c.checks) lines.push('- ' + check);
|
|
481
|
+
lines.push('');
|
|
482
|
+
lines.push('## 禁止事项');
|
|
483
|
+
lines.push('');
|
|
484
|
+
for (const item of c.forbidden) lines.push('- ' + item);
|
|
485
|
+
lines.push('');
|
|
486
|
+
lines.push('## 自包含');
|
|
487
|
+
lines.push('');
|
|
488
|
+
lines.push('本目录的 `_context/` 是上游只读快照。把整个目录交给另一个模型时,它不需要访问项目其它目录,也不需要读取插件源码。');
|
|
489
|
+
lines.push('');
|
|
490
|
+
lines.push('错误提示只指向本目录的 README、`_context/` 和阶段 JSON;如果提示里出现插件源码路径,请直接报告为工具错误。');
|
|
491
|
+
lines.push('');
|
|
492
|
+
return lines.join('\n');
|
|
493
|
+
}
|