@cloud411716/fancy-webnovel 1.0.46 → 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.
Files changed (134) hide show
  1. package/client.js +183 -0
  2. package/cordis.patch.yml +0 -14
  3. package/index.js +21 -37
  4. package/lib/chinese-num.js +111 -0
  5. package/lib/deployed-state.js +141 -0
  6. package/lib/error-codes.js +104 -0
  7. package/lib/infra.js +569 -0
  8. package/lib/llm-wiki.js +109 -0
  9. package/lib/safe-rm.js +94 -0
  10. package/lib/scraper-utils.js +165 -0
  11. package/package.json +37 -5
  12. package/plugins/fancy-analyze/command-input.js +65 -0
  13. package/plugins/fancy-analyze/index.js +973 -0
  14. package/plugins/fancy-analyze/schema-analyze.md +379 -0
  15. package/plugins/fancy-analyze/schema-write.md +178 -0
  16. package/plugins/fancy-analyze/scripts/split_source.js +292 -0
  17. package/plugins/fancy-analyze/summary-progress.js +431 -0
  18. package/plugins/fancy-analyze/templates.js +881 -0
  19. package/plugins/fancy-bootstrap/index.js +168 -0
  20. package/plugins/fancy-bootstrap/scripts/init.js +143 -0
  21. package/plugins/fancy-bootstrap/scripts/path-utils.js +21 -0
  22. package/plugins/fancy-bootstrap/templates.js +54 -0
  23. package/plugins/fancy-import/import-core.js +1118 -0
  24. package/plugins/fancy-import/import-driver.js +581 -0
  25. package/plugins/fancy-import/index.js +730 -0
  26. package/plugins/fancy-import/prompts/01-import-prompt.md +106 -0
  27. package/plugins/fancy-import/templates.js +49 -0
  28. package/plugins/fancy-scan/index.js +319 -0
  29. package/plugins/fancy-scan/scripts/run-scan.js +520 -0
  30. package/plugins/fancy-scan/scripts/scrapers/fanqie-rank-scraper.js +794 -0
  31. package/plugins/fancy-scan/scripts/scrapers/jjwxc-rank-scraper.js +339 -0
  32. package/plugins/fancy-scan/scripts/scrapers/qimao-rank-scraper.js +611 -0
  33. package/plugins/fancy-scan/templates.js +295 -0
  34. package/plugins/fancy-story-builder/deploy-manifest.js +239 -0
  35. package/plugins/fancy-story-builder/deslop-driver.js +821 -0
  36. package/plugins/fancy-story-builder/flesh-output.js +155 -0
  37. package/plugins/fancy-story-builder/index.js +3152 -0
  38. package/plugins/fancy-story-builder/prompts/01-skeleton-prompt.md +553 -0
  39. package/plugins/fancy-story-builder/prompts/02-flesh-prompt.md +540 -0
  40. package/plugins/fancy-story-builder/prompts/03-rhythm-prompt.md +504 -0
  41. package/plugins/fancy-story-builder/prompts/04-writing-prompt.md +188 -0
  42. package/plugins/fancy-story-builder/prompts/05-deslop-prompt.md +96 -0
  43. package/plugins/fancy-story-builder/purpose-template.md +107 -0
  44. package/plugins/fancy-story-builder/references/formulas-rhythm.json +302 -0
  45. package/plugins/fancy-story-builder/references/formulas-skeleton.json +229 -0
  46. package/plugins/fancy-story-builder/references/glossary.md +585 -0
  47. package/plugins/fancy-story-builder/references/index.md +490 -0
  48. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/00-index.md +174 -0
  49. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/01-scene.md +150 -0
  50. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/02-chapter-workflow.md +99 -0
  51. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/03-opening-chapter.md +104 -0
  52. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/04-dialogue-mastery.md +274 -0
  53. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/05-genre-formulas.md +432 -0
  54. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/06-tone-ensemble.md +259 -0
  55. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/07-ledger-audit.md +222 -0
  56. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/08-diagnosis-revision.md +205 -0
  57. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/09-reading-power.md +135 -0
  58. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/10-deslop.md +129 -0
  59. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/00-index.md +98 -0
  60. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/01-upgrade-rhythm.md +300 -0
  61. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/02-arc-rhythm.md +168 -0
  62. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/03-highpoint-hooks.md +189 -0
  63. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/04-satisfaction.md +226 -0
  64. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/05-foreshadow-density.md +195 -0
  65. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/06-chapter-outline.md +226 -0
  66. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/07-audit.md +163 -0
  67. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/00-index.md +100 -0
  68. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/01-character.md +239 -0
  69. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/02-worldbuilding.md +245 -0
  70. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/03-relations.md +181 -0
  71. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/04-emotion-methods.md +286 -0
  72. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/05-audit.md +177 -0
  73. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/00-index.md +91 -0
  74. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/01-positioning.md +208 -0
  75. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/02-packaging.md +135 -0
  76. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/03-entities.md +305 -0
  77. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/04-conflict.md +328 -0
  78. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/05-quota.md +187 -0
  79. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/06-audit.md +142 -0
  80. package/plugins/fancy-story-builder/rhythm-output.js +140 -0
  81. package/plugins/fancy-story-builder/schema-setting.md +324 -0
  82. package/plugins/fancy-story-builder/scripts/ai-patterns.js +619 -0
  83. package/plugins/fancy-story-builder/scripts/check-guide-compliance.js +289 -0
  84. package/plugins/fancy-story-builder/scripts/content-quality.js +413 -0
  85. package/plugins/fancy-story-builder/scripts/deslop-validate.js +143 -0
  86. package/plugins/fancy-story-builder/scripts/error-classes.js +112 -0
  87. package/plugins/fancy-story-builder/scripts/flesh-validate.js +1189 -0
  88. package/plugins/fancy-story-builder/scripts/formula-engine.js +112 -0
  89. package/plugins/fancy-story-builder/scripts/graph-utils.js +1385 -0
  90. package/plugins/fancy-story-builder/scripts/label-coverage.js +171 -0
  91. package/plugins/fancy-story-builder/scripts/prompt-drift-check.js +441 -0
  92. package/plugins/fancy-story-builder/scripts/reading-power.js +298 -0
  93. package/plugins/fancy-story-builder/scripts/rhythm-validate.js +1216 -0
  94. package/plugins/fancy-story-builder/scripts/semantic-lint.js +377 -0
  95. package/plugins/fancy-story-builder/scripts/skeleton-quota.js +145 -0
  96. package/plugins/fancy-story-builder/scripts/skeleton-validate.js +1832 -0
  97. package/plugins/fancy-story-builder/scripts/stage-batches.js +1371 -0
  98. package/plugins/fancy-story-builder/scripts/stage-contract.js +417 -0
  99. package/plugins/fancy-story-builder/scripts/upstream-query.js +198 -0
  100. package/plugins/fancy-story-builder/scripts/writing-rules.js +167 -0
  101. package/plugins/fancy-story-builder/scripts/writing-validate.js +682 -0
  102. package/plugins/fancy-story-builder/skeleton-output.js +199 -0
  103. package/plugins/fancy-story-builder/stage-driver.js +1049 -0
  104. 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
  105. 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
  106. 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
  107. 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
  108. 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
  109. 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
  110. 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
  111. 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
  112. 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
  113. 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
  114. 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
  115. 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
  116. 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
  117. 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
  118. 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
  119. 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
  120. package/plugins/fancy-story-builder/templates.js +1248 -0
  121. package/plugins/fancy-story-builder/wiki-references.js +204 -0
  122. package/plugins/fancy-story-builder/writing-driver.js +1061 -0
  123. package/plugins/fancy-topic/index.js +704 -0
  124. package/plugins/fancy-topic/scripts/select-topic.js +274 -0
  125. package/plugins/fancy-topic/templates.js +373 -0
  126. package/commands/bootstrap/index.js +0 -164
  127. package/commands/bootstrap/init-project.js +0 -121
  128. package/commands/scan/index.js +0 -283
  129. package/commands/scan/platforms/fanqie.js +0 -146
  130. package/commands/scan/platforms/jinjiang.js +0 -143
  131. package/commands/scan/platforms/qidian.js +0 -102
  132. package/commands/scan/platforms/qimao.js +0 -127
  133. package/commands/scan/scraper.js +0 -195
  134. package/infra.js +0 -160
@@ -0,0 +1,167 @@
1
+ /**
2
+ * writing-rules.js —— 写作原则与充分性闸门
3
+ *
4
+ * 同样来自旧版 skill(fancy-write/references/writing-principles.md),
5
+ * 原先是纯 markdown 规范,模型"读了要记住"、脚本"没法查"。
6
+ * 这里落成两种东西:
7
+ * 1. WRITING_PRINCIPLES —— 9 条原则,写进提示词供模型起草时套用;
8
+ * 2. COMMIT_GATES —— 7 项闸门,写进提示词 + 校验器,做 commit 前的硬检查。
9
+ *
10
+ * 闸门与校验器的对应关系(哪些是脚本能判的、哪些要靠别的校验器):
11
+ * 闸门 1 正文存在且够长 → writing-validate.js 的 WORD_COUNT / EMPTY_CHAPTER
12
+ * 闸门 2 上下文卡已生成 → 驱动内部状态,不落盘
13
+ * 闸门 3 blocking 校验通过 → deslop 检测器(ai-patterns.js)
14
+ * 闸门 4 AI 模式 0 blocking → deslop 检测器(ai-patterns.js)
15
+ * 闸门 5 钩子符合 7/13 种 → writing-validate.js 的 HOOK_TYPE_INVALID
16
+ * 闸门 6 死人不再出场 → writing-validate.js 的 DEAD_CHARACTER_APPEARS
17
+ * 闸门 7 章节号连续 → 驱动内部状态
18
+ *
19
+ * 写清楚每条闸门归谁管,是为了避免"提示词说要过闸门,但没人查"。
20
+ */
21
+
22
+ /**
23
+ * 9 条写作核心原则。起草时强制应用。
24
+ * 字段与旧 skill 的原文一一对应,不做删改(只把 markdown 列表拆成结构化数据)。
25
+ */
26
+ export const WRITING_PRINCIPLES = [
27
+ {
28
+ id: 'scene_construction',
29
+ name: '场景构造法',
30
+ summary: '每个场景必须回答五个问题,缺一个就不是场景。',
31
+ // 不在这里重复定义五要素 —— 它的家是 references/写作指导/01-scene.md §2。
32
+ // 这里只做指针,避免同一份定义出现两处然后各自漂移
33
+ // (旧 skill 就是这么坏的:同一件事三份副本、互相不一致)。
34
+ ref: 'references/写作指导/01-scene.md §2 场景五要素',
35
+ elements: [
36
+ { id: 'place', name: '地点', desc: '在哪?有什么环境细节?' },
37
+ { id: 'cast', name: '人物', desc: '谁在场?各自想要什么?' },
38
+ { id: 'objective', name: '目标', desc: '本场景中,视角人物想要什么?' },
39
+ { id: 'resistance', name: '阻碍', desc: '什么阻止他?' },
40
+ { id: 'turn', name: '转折', desc: '场景结束时,处境/关系/认知发生了什么变化?' }
41
+ ]
42
+ },
43
+ {
44
+ id: 'character_choice_4d',
45
+ name: '人物选择 4 维',
46
+ summary: '角色做选择必须基于这四维,而不是"作者想让剧情走到哪"。',
47
+ elements: [
48
+ { id: 'wants', name: 'wants', desc: '欲望' },
49
+ { id: 'knows', name: 'knows', desc: '信息边界(角色此刻知道什么)' },
50
+ { id: 'fears', name: 'fears', desc: '恐惧' },
51
+ { id: 'can_afford', name: 'can_afford', desc: '代价承受力' }
52
+ ]
53
+ },
54
+ {
55
+ id: 'reveal_by_action',
56
+ name: '背景/设定通过动作揭示',
57
+ summary: '设定靠动作、证据、对话、感官细节露出来,不能用叙述替代场景。',
58
+ elements: [
59
+ { id: 'action', name: '动作', desc: '角色做了什么' },
60
+ { id: 'evidence', name: '证据', desc: '看到了什么实物' },
61
+ { id: 'dialogue', name: '对话', desc: '说了什么' },
62
+ { id: 'sensory', name: '感官细节', desc: '闻到什么、摸到什么' }
63
+ ]
64
+ },
65
+ {
66
+ id: 'every_paragraph_changes',
67
+ name: '每段必有变化',
68
+ summary: '每段至少改变一个维度,否则删掉。',
69
+ dimensions: ['conflict', 'evidence', 'emotion', 'relationship', 'knowledge', 'position', 'consequence']
70
+ },
71
+ {
72
+ id: 'controlled_release',
73
+ name: '信息释放受控',
74
+ summary: '回答一部分活跃疑问,深化其他疑问;不靠隐藏 POV 已知的事实造反转。',
75
+ rules: [
76
+ '回答部分活跃的读者疑问',
77
+ '用具体证据深化其他疑问',
78
+ '不要隐藏 POV 已知的事实来制造反转'
79
+ ]
80
+ },
81
+ {
82
+ id: 'keep_author_voice',
83
+ name: '保留用户声音',
84
+ summary: "强制应用作者意图的硬门禁和反套路,不能替作者改文风。"
85
+ },
86
+ {
87
+ id: 'non_mechanical_cliffhanger',
88
+ name: '章末非机械 cliffhanger',
89
+ summary: '章末要有实质变化或新的压力,不是套公式。',
90
+ rules: ['material change(实质变化)', 'fresh pressure(新的压力)', '不是机械公式']
91
+ },
92
+ {
93
+ id: 'no_plagiarism',
94
+ name: '不抄袭源材料',
95
+ summary: '参考资料只作技法参考,禁止复制段落/名字/组合。'
96
+ },
97
+ {
98
+ id: 'minimal_layer_repair',
99
+ name: '最小层修复',
100
+ summary: '重写从最小层开始,不整章替换。',
101
+ rules: ['改一段不改一章', '能删就不重写', '不整章替换']
102
+ }
103
+ ];
104
+
105
+ /**
106
+ * 7 项充分性闸门 —— commit 一章前必须全过。
107
+ * checker 指明这条闸门归谁判(避免"提示词说要过,但没人查")。
108
+ */
109
+ export const COMMIT_GATES = [
110
+ {
111
+ id: 'body_exists',
112
+ name: '正文文件存在且够长',
113
+ checker: 'writing-validate.js',
114
+ detail: '正文存在、非空,字数达到本章目标(±20%)。'
115
+ },
116
+ {
117
+ id: 'context_card_ready',
118
+ name: '上下文卡已生成',
119
+ checker: '驱动内部',
120
+ detail: '本轮的细纲、前章尾、台账快照已经注入提示词。'
121
+ },
122
+ {
123
+ id: 'blocking_passed',
124
+ name: 'blocking 级校验已通过',
125
+ checker: 'deslop 检测器',
126
+ detail: 'ai-patterns.js 判出的 blocking 类目命中数为 0。'
127
+ },
128
+ {
129
+ id: 'ai_pattern_clean',
130
+ name: 'AI 模式扫描 0 blocking',
131
+ checker: 'deslop 检测器',
132
+ detail: '同上;advisory 类目只提示不阻断。'
133
+ },
134
+ {
135
+ id: 'hook_types_valid',
136
+ name: '章首/章尾钩子符合 7/13 种',
137
+ checker: 'writing-validate.js',
138
+ detail: 'hook_head_type ∈ 7 式章首引子;hook_tail_type ∈ 13 式章末钩子;且不得连续 3 章同一种。'
139
+ },
140
+ {
141
+ id: 'no_dead_character',
142
+ name: '死人不再出场',
143
+ checker: 'writing-validate.js',
144
+ detail: '已死亡角色再次出场,必须有 revival_event 说明。'
145
+ },
146
+ {
147
+ id: 'chapter_sequence',
148
+ name: '章节号连续',
149
+ checker: '驱动内部',
150
+ detail: '写第 N 章前,第 N-1 章必须已经 commit。'
151
+ }
152
+ ];
153
+
154
+ /**
155
+ * 查某条闸门归谁管(给提示词/报告用)。
156
+ * @returns {object|null}
157
+ */
158
+ export function gateById(id) {
159
+ return COMMIT_GATES.find((g) => g.id === id) || null;
160
+ }
161
+
162
+ /**
163
+ * 列出全部闸门 id(给提示词生成与守卫用例用)。
164
+ */
165
+ export function commitGateIds() {
166
+ return COMMIT_GATES.map((g) => g.id);
167
+ }