@cloud411716/fancy-webnovel 1.0.46 → 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.
Files changed (271) hide show
  1. package/client.js +369 -0
  2. package/cordis.patch.yml +4 -13
  3. package/docs/douyin-plugin.md +118 -0
  4. package/docs/material-library/README.md +404 -0
  5. package/docs/material-library/import.js +437 -0
  6. package/docs/material-library/prompt.md +370 -0
  7. package/docs/material-library/queries.surql +94 -0
  8. package/docs/material-library/sample.jsonl +14 -0
  9. package/docs/material-library/schema.surql +46 -0
  10. package/docs/mcp-profile.example.yml +24 -0
  11. package/docs/story-graph-design.md +602 -0
  12. package/docs/story-graph-validation.md +81 -0
  13. package/docs/workspace-mcp.md +284 -0
  14. package/index.js +26 -38
  15. package/lib/atomic-write.js +109 -0
  16. package/lib/chapter-order.js +100 -0
  17. package/lib/chinese-num.js +111 -0
  18. package/lib/confirmation.js +80 -0
  19. package/lib/db-init.js +123 -0
  20. package/lib/deployed-state.js +141 -0
  21. package/lib/direction-labels.js +265 -0
  22. package/lib/error-codes.js +104 -0
  23. package/lib/infra.js +594 -0
  24. package/lib/llm-wiki.js +109 -0
  25. package/lib/material-db.js +149 -0
  26. package/lib/path-guard.js +150 -0
  27. package/lib/projects.js +400 -0
  28. package/lib/scraper-utils.js +305 -0
  29. package/lib/surreal-server.js +338 -0
  30. package/lib/topic-decision.js +860 -0
  31. package/lib/topic-fields.js +251 -0
  32. package/lib/topic-schema.js +225 -0
  33. package/lib/workspace.js +501 -0
  34. package/package.json +62 -5
  35. package/plugins/fancy-analyze/analyze-definitions.md +519 -0
  36. package/plugins/fancy-analyze/command-input.js +65 -0
  37. package/plugins/fancy-analyze/index.js +2024 -0
  38. package/plugins/fancy-analyze/ingest-coverage.js +107 -0
  39. package/plugins/fancy-analyze/schema-analyze.md +627 -0
  40. package/plugins/fancy-analyze/schema-write.md +178 -0
  41. package/plugins/fancy-analyze/scripts/append-summary-chapter.js +612 -0
  42. package/plugins/fancy-analyze/scripts/split_source.js +292 -0
  43. package/plugins/fancy-analyze/summary-progress.js +495 -0
  44. package/plugins/fancy-analyze/templates.js +1179 -0
  45. package/plugins/fancy-bootstrap/index.js +313 -0
  46. package/plugins/fancy-bootstrap/scripts/init.js +177 -0
  47. package/plugins/fancy-bootstrap/scripts/path-utils.js +21 -0
  48. package/plugins/fancy-bootstrap/templates.js +71 -0
  49. package/plugins/fancy-db/index.js +172 -0
  50. package/plugins/fancy-douyin/deploy.js +134 -0
  51. package/plugins/fancy-douyin/index.js +551 -0
  52. package/plugins/fancy-douyin/prompts/01-analysis-prompt.md +84 -0
  53. package/plugins/fancy-douyin/scripts/crawl-note.cjs +194 -0
  54. package/plugins/fancy-douyin/scripts/lib.cjs +197 -0
  55. package/plugins/fancy-douyin/scripts/scan-account.cjs +128 -0
  56. package/plugins/fancy-douyin/scripts/start-chrome.cjs +203 -0
  57. package/plugins/fancy-douyin/state.js +197 -0
  58. package/plugins/fancy-douyin/templates.js +127 -0
  59. package/plugins/fancy-export/exporter.js +805 -0
  60. package/plugins/fancy-export/index.js +63 -0
  61. package/plugins/fancy-import/import-core.js +1118 -0
  62. package/plugins/fancy-import/import-driver.js +604 -0
  63. package/plugins/fancy-import/index.js +738 -0
  64. package/plugins/fancy-import/prompts/01-import-prompt.md +131 -0
  65. package/plugins/fancy-import/templates.js +58 -0
  66. package/plugins/fancy-material/exporter.js +153 -0
  67. package/plugins/fancy-material/genres.js +256 -0
  68. package/plugins/fancy-material/index.js +835 -0
  69. package/plugins/fancy-material/inventory.js +143 -0
  70. package/plugins/fancy-material/kinds.js +313 -0
  71. package/plugins/fancy-material/queue.js +55 -0
  72. package/plugins/fancy-material/scripts/query.js +254 -0
  73. package/plugins/fancy-material/templates.js +258 -0
  74. package/plugins/fancy-material/tool-deploy.js +138 -0
  75. package/plugins/fancy-material/validate.js +149 -0
  76. package/plugins/fancy-project/index.js +133 -0
  77. package/plugins/fancy-scan/existing-block.js +100 -0
  78. package/plugins/fancy-scan/index.js +708 -0
  79. package/plugins/fancy-scan/prompts/01-analysis-prompt.md +302 -0
  80. package/plugins/fancy-scan/scripts/append-block.js +725 -0
  81. package/plugins/fancy-scan/scripts/report-validate.js +824 -0
  82. package/plugins/fancy-scan/scripts/run-scan.js +667 -0
  83. package/plugins/fancy-scan/scripts/scrapers/fanqie-rank-scraper.js +923 -0
  84. package/plugins/fancy-scan/scripts/scrapers/jjwxc-rank-scraper.js +469 -0
  85. package/plugins/fancy-scan/scripts/scrapers/qimao-rank-scraper.js +629 -0
  86. package/plugins/fancy-scan/templates/blocks.js +155 -0
  87. package/plugins/fancy-scan/templates/platforms.js +372 -0
  88. package/plugins/fancy-scan/templates/report-schema.js +90 -0
  89. package/plugins/fancy-scan/templates.js +694 -0
  90. package/plugins/fancy-scan/tool-deploy.js +335 -0
  91. package/plugins/fancy-scan/wait-turn.js +46 -0
  92. package/plugins/fancy-story-builder/db/README.md +106 -0
  93. package/plugins/fancy-story-builder/db/client.js +228 -0
  94. package/plugins/fancy-story-builder/db/commands.js +145 -0
  95. package/plugins/fancy-story-builder/db/ids.js +39 -0
  96. package/plugins/fancy-story-builder/db/import.js +798 -0
  97. package/plugins/fancy-story-builder/db/project.js +299 -0
  98. package/plugins/fancy-story-builder/db/query.js +361 -0
  99. package/plugins/fancy-story-builder/db/schema.js +417 -0
  100. package/plugins/fancy-story-builder/db/stage-sync.js +238 -0
  101. package/plugins/fancy-story-builder/deploy-manifest.js +239 -0
  102. package/plugins/fancy-story-builder/deslop-driver.js +821 -0
  103. package/plugins/fancy-story-builder/flesh-output.js +168 -0
  104. package/plugins/fancy-story-builder/index.js +6861 -0
  105. package/plugins/fancy-story-builder/patch-driver.js +390 -0
  106. package/plugins/fancy-story-builder/prompts/01-skeleton-prompt.md +563 -0
  107. package/plugins/fancy-story-builder/prompts/02-flesh-prompt.md +602 -0
  108. package/plugins/fancy-story-builder/prompts/03-rhythm-prompt.md +539 -0
  109. package/plugins/fancy-story-builder/prompts/04-writing-prompt.md +225 -0
  110. package/plugins/fancy-story-builder/prompts/05-deslop-prompt.md +96 -0
  111. package/plugins/fancy-story-builder/purpose-template.md +83 -0
  112. package/plugins/fancy-story-builder/references/formulas-rhythm.json +302 -0
  113. package/plugins/fancy-story-builder/references/formulas-skeleton.json +402 -0
  114. package/plugins/fancy-story-builder/references/genre-profiles.json +3514 -0
  115. package/plugins/fancy-story-builder/references/glossary.md +594 -0
  116. package/plugins/fancy-story-builder/references/index.md +581 -0
  117. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/00-index.md +174 -0
  118. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/01-scene.md +150 -0
  119. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/02-chapter-workflow.md +99 -0
  120. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/03-opening-chapter.md +104 -0
  121. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/04-dialogue-mastery.md +274 -0
  122. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/05-genre-formulas.md +432 -0
  123. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/06-tone-ensemble.md +259 -0
  124. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/07-ledger-audit.md +222 -0
  125. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/08-diagnosis-revision.md +205 -0
  126. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/09-reading-power.md +135 -0
  127. package/plugins/fancy-story-builder/references//345/206/231/344/275/234/346/214/207/345/257/274/10-deslop.md +129 -0
  128. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/00-index.md +98 -0
  129. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/01-upgrade-rhythm.md +300 -0
  130. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/02-arc-rhythm.md +168 -0
  131. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/03-highpoint-hooks.md +189 -0
  132. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/04-satisfaction.md +226 -0
  133. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/05-foreshadow-density.md +195 -0
  134. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/06-chapter-outline.md +226 -0
  135. package/plugins/fancy-story-builder/references//350/212/202/345/245/217/346/214/207/345/257/274/07-audit.md +181 -0
  136. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/00-index.md +100 -0
  137. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/01-character.md +243 -0
  138. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/02-worldbuilding.md +245 -0
  139. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/03-relations.md +185 -0
  140. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/04-emotion-methods.md +286 -0
  141. package/plugins/fancy-story-builder/references//350/241/200/350/202/211/346/214/207/345/257/274/05-audit.md +187 -0
  142. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/00-index.md +91 -0
  143. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/01-positioning.md +209 -0
  144. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/02-packaging.md +135 -0
  145. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/03-entities.md +305 -0
  146. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/04-conflict.md +328 -0
  147. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/05-quota.md +187 -0
  148. package/plugins/fancy-story-builder/references//351/252/250/346/236/266/346/214/207/345/257/274/06-audit.md +160 -0
  149. package/plugins/fancy-story-builder/rhythm-output.js +140 -0
  150. package/plugins/fancy-story-builder/schema-setting.json +1100 -0
  151. package/plugins/fancy-story-builder/schema-setting.md +232 -0
  152. package/plugins/fancy-story-builder/scripts/ai-patterns.js +619 -0
  153. package/plugins/fancy-story-builder/scripts/brief-validate.js +164 -0
  154. package/plugins/fancy-story-builder/scripts/check-guide-compliance.js +289 -0
  155. package/plugins/fancy-story-builder/scripts/content-quality.js +416 -0
  156. package/plugins/fancy-story-builder/scripts/deslop-validate.js +143 -0
  157. package/plugins/fancy-story-builder/scripts/error-classes.js +112 -0
  158. package/plugins/fancy-story-builder/scripts/flesh-validate.js +1312 -0
  159. package/plugins/fancy-story-builder/scripts/formula-engine.js +112 -0
  160. package/plugins/fancy-story-builder/scripts/graph-utils.js +1484 -0
  161. package/plugins/fancy-story-builder/scripts/label-coverage.js +171 -0
  162. package/plugins/fancy-story-builder/scripts/prompt-drift-check.js +441 -0
  163. package/plugins/fancy-story-builder/scripts/reading-power.js +298 -0
  164. package/plugins/fancy-story-builder/scripts/reference-log.js +110 -0
  165. package/plugins/fancy-story-builder/scripts/rhythm-validate.js +1312 -0
  166. package/plugins/fancy-story-builder/scripts/schema-pages.js +2668 -0
  167. package/plugins/fancy-story-builder/scripts/semantic-lint.js +381 -0
  168. package/plugins/fancy-story-builder/scripts/skeleton-quota.js +145 -0
  169. package/plugins/fancy-story-builder/scripts/skeleton-validate.js +1973 -0
  170. package/plugins/fancy-story-builder/scripts/stage-batches.js +1405 -0
  171. package/plugins/fancy-story-builder/scripts/stage-contract.js +429 -0
  172. package/plugins/fancy-story-builder/scripts/story-artifacts.js +933 -0
  173. package/plugins/fancy-story-builder/scripts/upstream-query.js +198 -0
  174. package/plugins/fancy-story-builder/scripts/v2/baseline.js +112 -0
  175. package/plugins/fancy-story-builder/scripts/v2/cast.js +517 -0
  176. package/plugins/fancy-story-builder/scripts/v2/context.js +434 -0
  177. package/plugins/fancy-story-builder/scripts/v2/contracts.js +493 -0
  178. package/plugins/fancy-story-builder/scripts/v2/core.js +419 -0
  179. package/plugins/fancy-story-builder/scripts/v2/engine.js +1068 -0
  180. package/plugins/fancy-story-builder/scripts/v2/export-markdown.js +794 -0
  181. package/plugins/fancy-story-builder/scripts/v2/genre.js +195 -0
  182. package/plugins/fancy-story-builder/scripts/v2/knowledge.js +321 -0
  183. package/plugins/fancy-story-builder/scripts/v2/macro.js +409 -0
  184. package/plugins/fancy-story-builder/scripts/v2/manifest.js +538 -0
  185. package/plugins/fancy-story-builder/scripts/v2/migrate.js +137 -0
  186. package/plugins/fancy-story-builder/scripts/v2/prompts.js +1335 -0
  187. package/plugins/fancy-story-builder/scripts/v2/rhythm.js +618 -0
  188. package/plugins/fancy-story-builder/scripts/v2/scale.js +843 -0
  189. package/plugins/fancy-story-builder/scripts/v2/snapshot.js +121 -0
  190. package/plugins/fancy-story-builder/scripts/v2/stages.js +273 -0
  191. package/plugins/fancy-story-builder/scripts/v2/writing.js +216 -0
  192. package/plugins/fancy-story-builder/scripts/writing-rules.js +167 -0
  193. package/plugins/fancy-story-builder/scripts/writing-validate.js +682 -0
  194. package/plugins/fancy-story-builder/skeleton-output.js +199 -0
  195. package/plugins/fancy-story-builder/stage-driver.js +1049 -0
  196. package/plugins/fancy-story-builder/storydb/README.md +271 -0
  197. package/plugins/fancy-story-builder/storydb/cli.js +458 -0
  198. package/plugins/fancy-story-builder/storydb/client.js +351 -0
  199. package/plugins/fancy-story-builder/storydb/compile.js +452 -0
  200. package/plugins/fancy-story-builder/storydb/context.js +288 -0
  201. package/plugins/fancy-story-builder/storydb/definitions.js +699 -0
  202. package/plugins/fancy-story-builder/storydb/driver.js +106 -0
  203. package/plugins/fancy-story-builder/storydb/dsh-tools.js +313 -0
  204. package/plugins/fancy-story-builder/storydb/export.js +175 -0
  205. package/plugins/fancy-story-builder/storydb/ids.js +31 -0
  206. package/plugins/fancy-story-builder/storydb/impact.js +170 -0
  207. package/plugins/fancy-story-builder/storydb/import.js +559 -0
  208. package/plugins/fancy-story-builder/storydb/mcp.js +99 -0
  209. package/plugins/fancy-story-builder/storydb/prompts.js +952 -0
  210. package/plugins/fancy-story-builder/storydb/stage-command.js +379 -0
  211. package/plugins/fancy-story-builder/storydb/stage.js +426 -0
  212. package/plugins/fancy-story-builder/storydb/store.js +891 -0
  213. package/plugins/fancy-story-builder/storydb/tools.js +592 -0
  214. package/plugins/fancy-story-builder/storydb/validation.js +183 -0
  215. package/plugins/fancy-story-builder/templates/v2/10-scale/scale-template.json +144 -0
  216. package/plugins/fancy-story-builder/templates/v2/20-macro/emotion-template.json +15 -0
  217. package/plugins/fancy-story-builder/templates/v2/20-macro/endings-template.json +16 -0
  218. package/plugins/fancy-story-builder/templates/v2/20-macro/lines-template.json +28 -0
  219. package/plugins/fancy-story-builder/templates/v2/20-macro/roles-template.json +10 -0
  220. package/plugins/fancy-story-builder/templates/v2/20-macro/story-template.json +19 -0
  221. package/plugins/fancy-story-builder/templates/v2/20-macro/volumes-template.json +24 -0
  222. package/plugins/fancy-story-builder/templates/v2/20-macro/world-template.json +24 -0
  223. package/plugins/fancy-story-builder/templates/v2/30-cast/characters-template.json +49 -0
  224. package/plugins/fancy-story-builder/templates/v2/30-cast/climaxes-template.json +14 -0
  225. package/plugins/fancy-story-builder/templates/v2/30-cast/conflicts-template.json +30 -0
  226. package/plugins/fancy-story-builder/templates/v2/30-cast/factions-template.json +18 -0
  227. package/plugins/fancy-story-builder/templates/v2/30-cast/foreshadows-template.json +29 -0
  228. package/plugins/fancy-story-builder/templates/v2/30-cast/information-template.json +29 -0
  229. package/plugins/fancy-story-builder/templates/v2/30-cast/items-template.json +13 -0
  230. package/plugins/fancy-story-builder/templates/v2/30-cast/locations-template.json +12 -0
  231. package/plugins/fancy-story-builder/templates/v2/30-cast/payoffs-template.json +16 -0
  232. package/plugins/fancy-story-builder/templates/v2/30-cast/relations-template.json +44 -0
  233. package/plugins/fancy-story-builder/templates/v2/40-rhythm/chapter-map-template.json +81 -0
  234. package/plugins/fancy-story-builder/templates/v2/40-rhythm/outline-template.json +162 -0
  235. package/plugins/fancy-story-builder/templates/v2/50-writing/ledger-template.json +46 -0
  236. package/plugins/fancy-story-builder/templates/v2/60-deslop/report-template.json +10 -0
  237. 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 +427 -0
  238. 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
  239. 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
  240. 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
  241. 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 +168 -0
  242. 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 +184 -0
  243. 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
  244. 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 +131 -0
  245. 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 +85 -0
  246. 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 +103 -0
  247. 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 +68 -0
  248. 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 +142 -0
  249. 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 +292 -0
  250. 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 +266 -0
  251. 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 +336 -0
  252. 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
  253. 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 +308 -0
  254. package/plugins/fancy-story-builder/templates.js +1446 -0
  255. package/plugins/fancy-story-builder/wiki-references.js +540 -0
  256. package/plugins/fancy-story-builder/writing-driver.js +1388 -0
  257. package/plugins/fancy-topic/index.js +1057 -0
  258. package/plugins/fancy-topic/prompts/01-exploration-prompt.md +115 -0
  259. package/plugins/fancy-topic/scripts/save-suggestion.js +219 -0
  260. package/plugins/fancy-topic/scripts/select-topic.js +317 -0
  261. package/plugins/fancy-topic/templates.js +476 -0
  262. package/plugins/fancy-topic/tool-deploy.js +200 -0
  263. package/commands/bootstrap/index.js +0 -164
  264. package/commands/bootstrap/init-project.js +0 -121
  265. package/commands/scan/index.js +0 -283
  266. package/commands/scan/platforms/fanqie.js +0 -146
  267. package/commands/scan/platforms/jinjiang.js +0 -143
  268. package/commands/scan/platforms/qidian.js +0 -102
  269. package/commands/scan/platforms/qimao.js +0 -127
  270. package/commands/scan/scraper.js +0 -195
  271. package/infra.js +0 -160
@@ -0,0 +1,519 @@
1
+ # 网文创作分析术语定义(权威)
2
+
3
+ > 本文件是 `schema.md` 的配套定义文件,和 `schema.md` 一起使用。
4
+ >
5
+ > **执行任何章节分析前,必须先按本文件确认术语含义。**
6
+ > 不要用通用文学理论、学术论文或其它题材的定义替代这里的定义。
7
+ >
8
+ > 定义中的类型和例子是**判定框架,不是题材清单**;都市/玄幻/悬疑/言情/无限流/历史/科幻/体育/职场等题材的等价现象都算,按源文实际内容判断,不要硬套词表。
9
+ >
10
+ > 判定顺序:
11
+ > 1. 先判断“本章有没有这个现象”;
12
+ > 2. 再判断它属于哪个术语;
13
+ > 3. 最后才写分析。
14
+ >
15
+ > 如果拿不准,宁可写“无”,不要硬套术语。硬套会让后续骨架/血肉/节奏阶段学到错误模式。
16
+
17
+ ---
18
+
19
+ ## 一、按章写作技法
20
+
21
+ ### 1. 叙事视角
22
+
23
+ **是什么**:这一章通过谁的眼睛、谁的信息边界、谁的语气来讲故事。
24
+
25
+ **判定标准**:
26
+ - 限知视角:读者只知道视角人物知道的事;
27
+ - 全知视角:叙述者知道多个人的心理和未发生的事;
28
+ - 多视角:同一章内切换不同人物的认知;
29
+ - 叙述距离:叙述者是贴近人物内心,还是站在远处旁观;
30
+ - 叙述语气:冷静、戏谑、压迫、抒情、说书人等。
31
+
32
+ **常见误判**:
33
+ - 把“第一人称/第三人称”当成唯一判定,忽略信息边界;
34
+ - 把作者旁白当成视角人物的认知。
35
+
36
+ **网文例子**:
37
+ > 方平不知道“武科”是什么,读者也不知道。信息只从方平的疑问和同学的对话里释放——这是限知视角,不是全知旁白。
38
+
39
+ ---
40
+
41
+ ### 2. 章节结构
42
+
43
+ **是什么**:这一章内部的事件排列方式,以及章节作为一个完整单元如何起、承、转、合。
44
+
45
+ **判定标准**:
46
+ - 章节是否有明确的“开场状态 → 触发事件 → 升级/阻碍 → 转折 → 收束”;
47
+ - 是否存在多线并行、倒叙、插叙、环形结构;
48
+ - 章节的高潮点/信息点在什么位置;
49
+ - 章节结尾是否把读者推向下一章。
50
+
51
+ **常见误判**:
52
+ - 把“章节分了几个自然段”当成章节结构;
53
+ - 把整本书的卷结构当成单章结构。
54
+
55
+ **网文例子**:
56
+ > 开头方平确认重生 → 同学提到武科 → 方平听不懂 → 张浩带来八品之战消息 → 方平发现“剧本不对”。这是“确认异常—扩大信息—认知崩塌”的单章结构。
57
+
58
+ ---
59
+
60
+ ### 3. 节奏韵律
61
+
62
+ **是什么**:一章内信息、情绪、动作、对话的松紧快慢变化。
63
+
64
+ **判定标准**:
65
+ - 长句/短句、快场景/慢场景的交替;
66
+ - 信息释放密度:是一直解释,还是边行动边释放;
67
+ - 情绪曲线:压制—释放、轻松—紧张、期待—满足;
68
+ - 是否有“呼吸位”(日常、玩笑、停顿)避免持续高压。
69
+
70
+ **常见误判**:
71
+ - 把“字数多少”当成节奏;
72
+ - 把“事件多”当成节奏快——事件多但全是说明,读者仍会觉得拖。
73
+
74
+ **网文例子**:
75
+ > 前半段课堂闲聊轻快,张浩一句“马宗师突破八品”后信息密度骤增,结尾用短句收束。这是“轻—重—紧”的节奏,不是单纯事件多。
76
+
77
+ ---
78
+
79
+ ### 4. 对话技巧
80
+
81
+ **是什么**:对话承担人物塑造、信息释放、关系变化、冲突推进、潜台词和节奏控制的方式。
82
+
83
+ **判定标准**:
84
+ - 每句对话是否在推进信息/关系/冲突,而不是复述已知;
85
+ - 是否有潜台词:人物说的和想的/要的不一致;
86
+ - 是否有声音差异:不同角色说话方式、称呼、口头禅、句长不同;
87
+ - 是否有对话中的权力关系:谁打断谁、谁回避谁、谁在试探谁;
88
+ - 对话是否与动作、沉默、环境配合。
89
+
90
+ **常见误判**:
91
+ - 只要有人说话就标“有”;
92
+ - 把大段解释性旁白当成对话技巧;
93
+ - 忽略“沉默”“答非所问”“称呼变化”也是对话。
94
+
95
+ **网文例子**:
96
+ > 陈凡说“方平,直呼宗师之名,这是最大的不尊重!”——这句话同时在纠正规则、暴露陈凡对武道礼制的熟悉、建立两人关系里的“懂行/不懂行”落差。
97
+
98
+ ---
99
+
100
+ ### 5. 描写技法
101
+
102
+ **是什么**:用感官、动作、环境、心理、细节来让读者“看见/感到”人物和世界。
103
+
104
+ **判定标准**:
105
+ - 是否调动至少一种感官(视/听/触/嗅/味/体感);
106
+ - 是否用动作/细节代替抽象判断;
107
+ - 环境描写是否参与人物情绪或剧情,而不是纯装饰;
108
+ - 心理描写是否具体到念头、身体反应、选择;
109
+ - 是否有“选择性细节”:只写对本章有用的东西。
110
+
111
+ **常见误判**:
112
+ - 形容词多就标“有”;
113
+ - 把“作者总结人物性格”当成描写;
114
+ - 环境描写与剧情完全无关也标“有”。
115
+
116
+ **网文例子**:
117
+ > “方平满脸懵”是心理/表情描写;“手里只剩十五元”是动作性细节,同时推进资源困境。两者都比“方平很穷”有效。
118
+
119
+ ---
120
+
121
+ ### 6. 情节机制
122
+
123
+ **是什么**:推动故事运转的因果装置或规则,例如重生、系统、金手指、任务、比赛、考试、复仇、身份错位、信息差、倒计时。
124
+
125
+ **判定标准**:
126
+ - 这个机制是否在制造选择、代价、限制和后果;
127
+ - 它是否让主角必须行动,而不是只提供设定说明;
128
+ - 它是否与本章冲突/目标发生关系;
129
+ - 它是否有边界:不能无限解决问题。
130
+
131
+ **常见误判**:
132
+ - 把“发生了什么事”当成情节机制;
133
+ - 把“系统面板”本身当成机制,而不看它如何改变选择;
134
+ - 机制只出现一次、没有后果,也标“有”。
135
+
136
+ **网文例子**:
137
+ > 重生不是“知道未来”这么简单:方平的旧记忆与当前武道世界不匹配,迫使他重新收集信息。这是“信息差 + 认知错位”机制在推动行动。
138
+
139
+ ---
140
+
141
+ ### 7. 开头钩子
142
+
143
+ **是什么**:章节开头用来抓住读者的异常、问题、威胁、欲望、反差或强情绪。
144
+
145
+ **判定标准**:
146
+ - 前 1-3 段是否提出一个读者想知道答案的问题;
147
+ - 是否有异常/反差/危险/欲望/秘密;
148
+ - 是否让读者产生“接下来会怎样”的期待;
149
+ - 是否与本章核心事件有关,而不是无关噱头。
150
+
151
+ **常见误判**:
152
+ - 开头有动作就标“有”,但动作没有悬念;
153
+ - 开头只是环境描写,没有信息差/威胁/欲望;
154
+ - 把“标题”当成开头钩子。
155
+
156
+ **网文例子**:
157
+ > “2008 年,4 月 5 日。”——日期本身不钩人,但紧接着“方平确认自己重生”制造了“他为什么回到过去、他要怎么活”的问题,这才是钩子。
158
+
159
+ ---
160
+
161
+ ### 8. 结尾收束
162
+
163
+ **是什么**:章节结尾如何收住本章、制造下一章期待,或完成情绪/信息/关系的落点。
164
+
165
+ **判定标准**:
166
+ - 类型:悬念式、反转式、决定式、情绪落点、信息揭示、日常呼吸;
167
+ - 是否改变读者对前文的解释;
168
+ - 是否把压力/问题推到下一章;
169
+ - 是否与本章开头形成呼应或反差。
170
+
171
+ **常见误判**:
172
+ - 只要最后一句短就标“有”;
173
+ - 结尾只是总结本章,没有新信息/新压力;
174
+ - 把“下一章标题”当成结尾收束。
175
+
176
+ **网文例子**:
177
+ > “这剧本,好像有些不对劲啊!”——用人物判断点明异常,不解释原因,把“哪里不对”留给下一章。
178
+
179
+ ---
180
+
181
+ ### 9. 句式变化
182
+
183
+ **是什么**:句子长度、结构、语气、重复、排比、短促/舒缓的交替。
184
+
185
+ **判定标准**:
186
+ - 是否有长句解释与短句冲击的交替;
187
+ - 是否用重复、排比、反问、倒装制造节奏;
188
+ - 句式是否服务情绪/信息密度;
189
+ - 是否避免全章同一句式。
190
+
191
+ **常见误判**:
192
+ - 把“用了比喻”当成句式变化;
193
+ - 只统计句子长短,不看句式功能;
194
+ - 全章都是短句也标“有”——那可能是单调,不是变化。
195
+
196
+ **网文例子**:
197
+ > 解释性长句写武科制度,紧接着“什么情况?”“啥情况?”两个短句写方平的震惊。长短交替制造认知落差。
198
+
199
+ ---
200
+
201
+ ### 10. 段落布局
202
+
203
+ **是什么**:段落的长短、顺序、聚焦对象、留白和视觉节奏。
204
+
205
+ **判定标准**:
206
+ - 长段/短段是否按信息密度和情绪需要排列;
207
+ - 每段是否只有一个焦点;
208
+ - 是否用独立短段强调关键句;
209
+ - 对话、动作、心理、环境是否分段清晰;
210
+ - 是否有“视觉留白”让读者停顿。
211
+
212
+ **常见误判**:
213
+ - 把“分段多”当成布局好;
214
+ - 一段里塞多个焦点也标“有”;
215
+ - 只看排版,不看段落之间的逻辑推进。
216
+
217
+ **网文例子**:
218
+ > 课堂群像用较长段落铺陈,张浩爆料后切成短段和独立句,最后用一句“剧本不对”单独收束。段落长度跟着信息压力变化。
219
+
220
+ ---
221
+
222
+ ### 11. 场景转换
223
+
224
+ **是什么**:叙事从一个场景切到另一个场景,包括地点、时间、人物焦点、社会情境或视角的变化。
225
+
226
+ **判定标准**:
227
+ - 地点变化:教室 → 网吧、家中 → 学校;
228
+ - 时间变化:当天 → 次日、回忆 → 现在;
229
+ - 焦点变化:方平 → 张浩/全班;
230
+ - 情境变化:课堂 → 武斗现场、日常 → 考试;
231
+ - 转换方式:硬切、过渡句、动作带转、对话带转、蒙太奇。
232
+
233
+ **常见误判**:
234
+ - 只要换段就标“有”;
235
+ - 同一场景内换说话人不是场景转换;
236
+ - 纯心理联想没有时空/焦点变化,不一定算场景转换。
237
+
238
+ **网文例子**:
239
+ > 方平在教室听同学聊武科,随后“去蓝天网吧查资料”——地点和行动目标都变了,这是场景转换。仅从方平的思考切到陈凡的台词,不算。
240
+
241
+ ---
242
+
243
+ ### 12. 情绪渲染
244
+
245
+ **是什么**:通过感官、动作、心理、环境、对话、节奏把读者带进某种情绪。
246
+
247
+ **判定标准**:
248
+ - 是否写出情绪的身体反应/行为后果;
249
+ - 是否用环境/细节映射情绪;
250
+ - 是否通过压制—释放、期待—落空制造情绪波动;
251
+ - 是否让读者能感到,而不是只被告知“他很愤怒”。
252
+
253
+ **常见误判**:
254
+ - 出现“愤怒/悲伤/震惊”等词就标“有”;
255
+ - 情绪没有前因后果,直接抒情;
256
+ - 用旁白总结情绪,没有场景支撑。
257
+
258
+ **网文例子**:
259
+ > 全班兴奋崇拜,方平却“满脸懵”“整个人都傻了”。用群体情绪反衬主角的孤立和不安,比直接写“方平很困惑”更有渲染力。
260
+
261
+ ---
262
+
263
+ ### 13. 张力构建
264
+
265
+ **是什么**:读者感到“有事情悬着、必须看下去”的压力,来自未解决的冲突、风险、秘密、倒计时、期待或道德困境。
266
+
267
+ **判定标准**:
268
+ - 是否有明确的未解问题/风险/代价;
269
+ - 读者是否知道“如果失败会怎样”;
270
+ - 是否有多方目标冲突或信息差;
271
+ - 是否在章节内持续加压,而不是一次性解释完。
272
+
273
+ **常见误判**:
274
+ - 把“冲突很激烈”当成张力——冲突是双方对立,张力是读者对结果的期待;
275
+ - 只有危险,没有代价/不确定性,也不构成张力;
276
+ - 把所有信息都解释完,张力消失。
277
+
278
+ **网文例子**:
279
+ > 方平只剩十五元,报名截止只剩两天,陈凡最多借十元——目标、资源、时间三重压力同时存在,读者会想知道他怎么凑钱。
280
+
281
+ ---
282
+
283
+ ### 14. 章节功能设计
284
+
285
+ **是什么**:这一章在整本书/本卷/本单元里承担什么功能。
286
+
287
+ **判定标准**:
288
+ - 功能类型:开局、升级、打脸、揭示、转折、压制、呼吸、过渡、收束、埋伏笔、回收伏笔;
289
+ - 本章结束后,主线/支线/人物关系/读者认知发生了什么不可逆变化;
290
+ - 本章是否在为下一章/下一卷蓄力;
291
+ - 如果删掉本章,故事会不会缺一块。
292
+
293
+ **常见误判**:
294
+ - 把“本章发生了很多事”当成功能;
295
+ - 一章承担所有功能,等于没有重点;
296
+ - 只写“过渡章”而不说明过渡了什么。
297
+
298
+ **网文例子**:
299
+ > 第 1 章的功能不是“介绍世界观”,而是“用认知错位制造悬念,并让主角确立考武科目标”。这是可被后续章节继承的功能。
300
+
301
+ ---
302
+
303
+ ## 二、跨章节实体设计
304
+
305
+ ### 1. 人物关系设计
306
+
307
+ **是什么**:两个或多个人物之间稳定的互动模式,以及这种模式如何建立、变化、破裂、修复。
308
+
309
+ **判定标准**:
310
+ - 关系类型:亲属、同学、同桌、师徒、盟友、上下级、敌对、竞争、暗恋、利用;
311
+ - 关系的不对称性:谁掌握资源/信息/权力,谁依赖谁;
312
+ - 关系的交换:情感、利益、保护、背叛;
313
+ - 关系的变化节点:第一次信任、第一次欺骗、第一次决裂;
314
+ - 关系对行动的约束:因为这段关系,角色不能做什么/必须做什么。
315
+
316
+ **常见误判**:
317
+ - 两个人同框就标“有关系”——没有稳定互动模式不算;
318
+ - 把“关系称谓”(哥哥/老师/老板)当成关系设计;
319
+ - 只写“他们是朋友”,不写朋友关系带来的义务和代价。
320
+
321
+ **网文例子**:
322
+ > 方平与陈凡不只是“同桌”:陈凡提供武道规则解释和现实提醒,方平提供跨世界视角;两人资源都很紧,但陈凡愿意借出仅有的十元。关系里有信息交换、情谊和资源落差。
323
+
324
+ ---
325
+
326
+ ### 2. 势力结构
327
+
328
+ **是什么**:一个组织/集团/门派/家族/国家/班级等实体的层级、成员、资源、目标、规则和外部关系。
329
+
330
+ **判定标准**:
331
+ - 层级:谁在上、谁在下、谁掌握决策权;
332
+ - 成员:核心成员、边缘成员、卧底、叛徒;
333
+ - 资源:钱、武力、信息、人脉、合法性;
334
+ - 目标:这个势力要什么,怕什么;
335
+ - 规则:入会、晋升、惩罚、交易规则;
336
+ - 外部关系:盟友、敌人、中立、依附。
337
+
338
+ **常见误判**:
339
+ - 只有名字没有结构,不算势力设计;
340
+ - 把“一个强者”当成势力——没有组织/资源/目标就不算;
341
+ - 势力只在背景里被提到,没有行动和后果,也不算有效设计。
342
+
343
+ **网文例子**:
344
+ > 企鹅集团不是“一个大公司”四个字:它有跨省法人资格、武道强者、商业资源、与谷歌亚太区的竞争关系。这些结构决定了它如何压迫/拉拢主角。
345
+
346
+ ---
347
+
348
+ ### 3. 世界观设计
349
+
350
+ **是什么**:这个世界的规则、力量体系、社会制度、资源逻辑、代价和限制。
351
+
352
+ **判定标准**:
353
+ - 规则:什么能做、什么不能做;
354
+ - 力量体系:等级、晋升、克制、代价;
355
+ - 资源:钱/气血/功法/名额如何获得和消耗;
356
+ - 社会制度:法律、教育、阶层、职业;
357
+ - 代价与限制:使用力量/资源要付出什么;
358
+ - 例外:规则在什么情况下被打破。
359
+
360
+ **常见误判**:
361
+ - 只有名词(武科、宗师、八品)没有规则,不算世界观设计;
362
+ - 规则只用于解释,不参与选择和冲突;
363
+ - 规则可以随意打破,没有代价,等于没有规则。
364
+
365
+ **网文例子**:
366
+ > “武科”不是一句“有武道考试”:它有报名费、年龄上限、政审、体检、文化课线、区域录取差异、动态录取标准。这些规则共同制造了主角的资源困境。
367
+
368
+ ---
369
+
370
+ ### 4. 冲突设计
371
+
372
+ **是什么**:两个或多个目标/利益/价值观之间的持续对立,以及它如何升级、转折、解决和留下后果。
373
+
374
+ **判定标准**:
375
+ - 双方要什么,为什么不能同时满足;
376
+ - 赌注:失败会失去什么;
377
+ - 升级:从口角 → 资源争夺 → 人身危险 → 关系破裂;
378
+ - 压力来源:时间、资源、对手、规则、道德;
379
+ - 解决方式:胜负、妥协、逃避、第三方介入;
380
+ - 余波:冲突结束后,关系/资源/认知发生了什么变化。
381
+
382
+ **常见误判**:
383
+ - 一次争吵就标“核心冲突”——没有持续对立和赌注不算;
384
+ - 把“困难”当成冲突——困难没有对手/阻力,不一定构成冲突;
385
+ - 冲突解决后没有任何后果,等于没有真正发生。
386
+
387
+ **网文例子**:
388
+ > “方平要考武科”与“家里没钱、报名截止、陈凡只能借十元”构成资源冲突;它不是一场吵架,而是持续多章的目标—资源对立。
389
+
390
+ ---
391
+
392
+ ### 5. 主线支线结构
393
+
394
+ **是什么**:贯穿全书/多卷的核心目标线,以及围绕它展开的支线,和两者的交织方式。
395
+
396
+ **判定标准**:
397
+ - 主线:主角最核心、最长线的目标/问题;
398
+ - 支线:阶段性目标、关系线、势力线、身世线、副本线;
399
+ - 交织:支线如何服务/阻碍/改变主线;
400
+ - 节奏:主线推进与支线切换的比例;
401
+ - 收束:支线是否回收,还是变成新主线。
402
+
403
+ **常见误判**:
404
+ - 把“事件列表”当成主线;
405
+ - 支线很多但没有一条服务主线;
406
+ - 主线目标中途换掉,却没有解释。
407
+
408
+ **网文例子**:
409
+ > 主线是“方平考武科、改变阶层处境”;支线包括“重生身份疑云”“特殊钞票能力”“与陈凡/家人的关系”。支线不是平行小说,它们不断给主线提供资源/阻力/信息。
410
+
411
+ ---
412
+
413
+ ### 6. 分卷节奏
414
+
415
+ **是什么**:全书按卷/幕/单元切分后,每一卷的目标、升级曲线、高潮位置、呼吸位和卷末钩子。
416
+
417
+ **判定标准**:
418
+ - 每卷是否有独立目标和小高潮;
419
+ - 卷内是否有升级/压制/释放的节奏;
420
+ - 卷末是否留下更大的问题或新舞台;
421
+ - 卷与卷之间是否有明确的实力/关系/地图/目标升级;
422
+ - 是否有呼吸卷/过渡卷,避免连续高压。
423
+
424
+ **常见误判**:
425
+ - 只按字数切卷,没有节奏功能;
426
+ - 每卷都是同一套“打脸—升级—换地图”,没有变化;
427
+ - 卷末高潮与下一卷开篇没有因果连接。
428
+
429
+ **网文例子**:
430
+ > 第一卷“阳城备考”以武科报名/体检为小高潮,卷末把舞台推向“南江武大/更大势力”;第二卷再升级资源和对手。这是分卷节奏,不是简单分章。
431
+
432
+ ---
433
+
434
+ ### 7. 伏笔布局
435
+
436
+ **是什么**:作者故意埋下、暂时不解释、让读者产生疑问,并在后续推进/回收的信息或物件。
437
+
438
+ **判定标准**:
439
+ - 埋设:读者能察觉到“这里有问题/不寻常”,但暂时得不到解释;
440
+ - 类型:
441
+ - 一个当前读者不懂的术语/名词;
442
+ - 两个人之间未澄清的关系/称呼;
443
+ - 一件暂时没被派上用场的物品;
444
+ - 角色一句当前读者不理解的话;
445
+ - 一个异常能力/规则/身体反应;
446
+ - 一个看似无关的细节/新闻/传闻;
447
+ - 推进:后续章节再次提到、部分解释、改变含义;
448
+ - 回收:最终解释/兑现/反转,让前面的细节获得新意义;
449
+ - 公平性:回收时读者能回溯到埋设点,而不是作者临时编。
450
+
451
+ **常见误判**:
452
+ - 所有“没解释的东西”都标伏笔——没有后续推进/回收意图的,不是伏笔;
453
+ - 把“作者忘了解释”当成伏笔;
454
+ - 伏笔埋得太隐蔽,读者完全没看见;
455
+ - 伏笔回收时没有改变读者理解,只是补一句说明。
456
+
457
+ **网文例子**:
458
+ > “方平直呼马宗师之名,陈凡严肃纠正”——这里既埋了“武道礼制”规则,也埋了“方平为什么不懂”的身份疑云。后续“重生/记忆错位”回收了这条线。
459
+
460
+ ---
461
+
462
+ ### 8. 角色弧光设计
463
+
464
+ **是什么**:一个角色在多章中,目标、认知、信念、立场、关系或行为模式发生的连续变化;也包括“不变型/稳定型”角色在压力下坚持同一内核的过程。
465
+
466
+ **谁必须有页面**:
467
+ - 本章有名字或稳定称呼、且有台词/行动/关系/目标/状态的角色;
468
+ - 主角、反派、配角、家人、导师、对手、同学都算;
469
+ - 即使本章没有明显变化,也要建/更新页面,在 `### 第X章` 写“本章保持什么状态/为什么没有变化”;
470
+ - 只有没有名字、没有稳定称呼的一次性背景群众可以跳过。
471
+
472
+ **判定标准**:
473
+ - 起始状态:角色一开始相信什么、要什么、怕什么;
474
+ - 触发事件:什么事件让他开始动摇/改变;
475
+ - 变化过程:不是一次顿悟,而是多次选择、代价、反复;
476
+ - 变化维度:目标、认知、道德、关系、身份、能力;
477
+ - 不变型:外部压力很大,但角色仍坚持同一内核,也要写清“为什么不变/不变的代价”;
478
+ - 代价:改变失去了什么;
479
+ - 阶段状态:每一章结束时,他处在弧光的哪个位置;
480
+ - 终点/当前状态:截至最新一章,他和最初有什么不同。
481
+
482
+ **常见误判**:
483
+ - 把“角色设定了性格”当成弧光——没有变化过程不算;
484
+ - 把“能力升级”当成弧光——能力变强不等于认知/立场变化;
485
+ - 只有一次情绪波动,没有持续影响,不算弧光;
486
+ - 角色每章都变,没有稳定内核,也不可信。
487
+
488
+ **网文例子**:
489
+ > 方平从“谨慎旁观、先求证”到“主动报名、承担风险”,中间经过资源困境、家庭责任、知识短板、信息不足的反复检验。这是弧光,不是单纯“变强”。
490
+
491
+ ---
492
+
493
+ ## 三、判定边界速查
494
+
495
+ | 容易混淆 | 区分 |
496
+ |----------|------|
497
+ | 冲突 vs 张力 | 冲突是双方目标/利益对立;张力是读者对未解决结果的期待 |
498
+ | 冲突 vs 困难 | 困难是阻力;冲突有对手/对立目标/赌注 |
499
+ | 伏笔 vs 未解释 | 伏笔有后续推进/回收意图;未解释可能只是作者漏写 |
500
+ | 场景转换 vs 换段 | 场景转换必须有时空/焦点/情境变化;换段不一定 |
501
+ | 对话技巧 vs 说话 | 对话要推进信息/关系/冲突/人物,才有技巧 |
502
+ | 描写技法 vs 形容词 | 描写要调动感官/动作/细节/心理,不是堆形容词 |
503
+ | 角色弧光 vs 能力升级 | 弧光是认知/目标/立场/关系变化;能力升级只是手段 |
504
+ | 世界观设计 vs 名词 | 世界观要有规则、代价、限制、例外,不只是名词 |
505
+ | 势力结构 vs 强者 | 势力要有层级、成员、资源、目标、规则 |
506
+ | 主线 vs 事件 | 主线是贯穿多章的核心目标/问题;事件是单章发生的事 |
507
+
508
+ ---
509
+
510
+ ## 四、分析时的硬要求
511
+
512
+ 1. **先定义,后判断**:不确定某现象属于哪个术语时,回到本文件对照,不要自创定义。
513
+ 2. **有证据才写“有”**:每个“有”都要能指向本章的具体段落/对话/动作。
514
+ 3. **没有证据写“无”**:不要为了填满表格硬套。
515
+ 4. **区分“本章现象”和“跨章节实体”**:
516
+ - 本章的写法 → 按章技法;
517
+ - 跨章累积的人/势力/规则/冲突/伏笔/弧光 → 实体页。
518
+ 5. **跨章节实体只追加本章变化**:已有实体页只加 `### 第X章`,不要重写历史。
519
+ 6. **抽象规则不写原书专名**:可复用设计规则用“势力A/角色B/事件C”等占位符。
@@ -0,0 +1,65 @@
1
+ /**
2
+ * fancy-analyze/command-input.js —— 命令输入的归一化与子命令识别。
3
+ *
4
+ * ## 为什么需要它
5
+ *
6
+ * 用户在输入框里粘进来的内容常带零宽字符:U+200B(零宽空格)最常见,
7
+ * 还有 U+200C/U+200D(零宽连接符)、U+2060(单词连接符)、U+FEFF(BOM)、
8
+ * U+00A0(不换行空格)。
9
+ *
10
+ * 这些字符 `trim()` 不会去掉(它们不是空白字符),所以精确比较必然落空。
11
+ * 实测用户输入过 `summary-status␣summary`(中间粘了 U+200B),
12
+ * 旧代码 `lowerInput === 'summary-status'` 判不出来,
13
+ * 于是这条命令**掉进了"普通模式"(按书名拆书)** ——
14
+ * 而拆书会调 llm_wiki 的 `sources/ingest` 接口,那条路**有破坏性**。
15
+ *
16
+ * 子命令判断失败时默认掉进一个有破坏性的分支,是很糟的默认行为。
17
+ * 所以这里做两件事:
18
+ * 1. 剥掉不可见字符;
19
+ * 2. 用**前缀匹配**认子命令 —— 用户手滑多打了几个字,意图明显是那个
20
+ * 子命令,不该被当成书名去拆书。真正认不出来的仍然按书名处理
21
+ * (那才是默认用法)。
22
+ */
23
+
24
+ /** 零宽空格 / 零宽连接符 / 单词连接符 / BOM / 不换行空格。 */
25
+ const INVISIBLE_CHARS = /[\u200B-\u200D\u2060\u00A0\uFEFF]/g;
26
+
27
+ /**
28
+ * 剥掉命令输入里的不可见字符,并去首尾空白。
29
+ *
30
+ * @param {string} input - 原始输入
31
+ * @returns {string} 归一化后的输入
32
+ */
33
+ export function normalizeCommandInput(input) {
34
+ if (typeof input !== 'string') return '';
35
+ return input.replace(INVISIBLE_CHARS, '').trim();
36
+ }
37
+
38
+ /**
39
+ * 可识别的子命令。顺序有意义:前缀匹配时长的排前面,
40
+ * 否则 `summary` 会先于 `summary-status` 命中。
41
+ */
42
+ const SUBCOMMANDS = ['summary-status', 'summary', 'resummary', 'status', 'fix'];
43
+
44
+ /**
45
+ * 认子命令:归一化后按前缀匹配。
46
+ *
47
+ * @param {string} normalized - 已归一化的命令输入(小写)
48
+ * @returns {string|null} 子命令名;不是子命令时返回 null
49
+ */
50
+ export function matchSubcommand(normalized) {
51
+ if (typeof normalized !== 'string' || normalized.length === 0) return null;
52
+ // 空格当连字符:`summary status` 与 `summary-status` 是同一个命令
53
+ const flat = normalized.replace(/\s+/g, '-');
54
+ for (const name of SUBCOMMANDS) {
55
+ if (flat === name) return name;
56
+ }
57
+ // 前缀匹配是**刻意设计**(手滑多打的字也认):
58
+ // "summary-statussummary" 要能认出是 summary-status。
59
+ // 2026-10-27 复核后确认:这是有意的容错,不改
60
+ // (收紧成"必须带分隔符"会把这份容错一起收掉)。
61
+ for (const name of SUBCOMMANDS) {
62
+ if (flat.startsWith(name)) return name;
63
+ }
64
+ return null;
65
+ }