@oh-story/dsh 0.1.10 → 0.1.11

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 (444) hide show
  1. package/README.md +7 -7
  2. package/lib/client.js +7 -3
  3. package/lib/client.js.map +2 -2
  4. package/lib/drama/manifest.json +212 -142
  5. package/lib/drama/skills/short-drama/SKILL.md +14 -2
  6. package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +3 -0
  7. package/lib/drama/skills/short-drama/references/creator-documents.md +3 -0
  8. package/lib/drama/skills/short-drama/references/knowhow-index.md +15 -0
  9. package/lib/drama/skills/short-drama/scripts/project_tool.py +131 -0
  10. package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
  11. package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
  12. package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
  13. package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
  14. package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
  15. package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
  16. package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
  17. package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
  18. package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
  19. package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
  20. package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +1 -1
  21. package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
  22. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
  23. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/207/215/347/224/237/347/251/277/350/266/212.md +51 -0
  24. package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
  25. package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
  26. package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
  27. package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
  28. package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
  29. package/lib/drama/skills/short-drama-edit/SKILL.md +43 -20
  30. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
  31. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
  32. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
  33. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
  34. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
  35. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
  36. package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
  37. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
  38. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
  39. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
  40. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
  41. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
  42. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
  43. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
  44. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
  45. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
  46. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +4 -2
  47. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +3 -1
  48. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +6 -2
  49. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +12 -6
  50. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +13 -8
  51. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +2 -0
  52. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1153 -121
  53. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +49 -9
  54. package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
  55. package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
  56. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
  57. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
  58. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
  59. package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
  60. package/lib/drama/skills/short-drama-review/SKILL.md +2 -2
  61. package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
  62. package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
  63. package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
  64. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +15 -0
  65. package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
  66. package/lib/drama/skills/short-drama-storyboard/SKILL.md +13 -5
  67. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
  68. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
  69. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +82 -14
  70. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +4 -2
  71. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +5 -3
  72. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +12 -0
  73. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
  74. package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
  75. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +40 -1
  76. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +20 -14
  77. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +1 -1
  78. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +8 -7
  79. package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
  80. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
  81. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
  82. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
  83. package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
  84. package/lib/drama/skills/short-drama-write/SKILL.md +8 -3
  85. package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
  86. package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
  87. package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
  88. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
  89. package/lib/index.js +71 -21
  90. package/lib/index.js.map +3 -3
  91. package/lib/oh-story/manifest.json +545 -310
  92. package/lib/oh-story/roles/chapter-extractor.md +11 -11
  93. package/lib/oh-story/roles/character-designer.md +1 -2
  94. package/lib/oh-story/roles/consistency-checker.md +11 -9
  95. package/lib/oh-story/roles/narrative-writer.md +24 -25
  96. package/lib/oh-story/roles/story-architect.md +9 -61
  97. package/lib/oh-story/roles/story-explorer.md +20 -125
  98. package/lib/oh-story/roles/story-researcher.md +0 -1
  99. package/lib/oh-story/skills/story/SKILL.md +6 -6
  100. package/lib/oh-story/skills/story/VERSION +1 -1
  101. package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
  102. package/lib/oh-story/skills/story/references/author-memory.md +40 -118
  103. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +3 -3
  104. package/lib/oh-story/skills/story-deslop/SKILL.md +24 -25
  105. package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
  106. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +1 -1
  107. package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
  108. package/lib/oh-story/skills/story-deslop/references/author-memory.md +40 -118
  109. package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
  110. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +21 -4
  111. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
  112. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +3 -3
  113. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
  114. package/lib/oh-story/skills/story-import/SKILL.md +63 -579
  115. package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
  116. package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
  117. package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
  118. package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
  119. package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
  120. package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
  121. package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
  122. package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
  123. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +95 -91
  124. package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
  125. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
  126. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +11 -9
  127. package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
  128. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +101 -14
  129. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +278 -23
  130. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +179 -23
  131. package/lib/oh-story/skills/story-long-analyze/SKILL.md +28 -50
  132. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +12 -5
  133. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +1 -1
  134. package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
  135. package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
  136. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +21 -55
  137. package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
  138. package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
  139. package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
  140. package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
  141. package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
  142. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +17 -0
  143. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +1 -1
  144. package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
  145. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +47 -8
  146. package/lib/oh-story/skills/story-long-scan/SKILL.md +41 -193
  147. package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
  148. package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
  149. package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
  150. package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
  151. package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
  152. package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
  153. package/lib/oh-story/skills/story-long-write/SKILL.md +32 -73
  154. package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
  155. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +1 -1
  156. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +18 -201
  157. package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
  158. package/lib/oh-story/skills/story-long-write/references/author-memory.md +40 -118
  159. package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
  160. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +6 -10
  161. package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
  162. package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
  163. package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
  164. package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
  165. package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
  166. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +3 -2
  167. package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
  168. package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
  169. package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
  170. package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
  171. package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
  172. package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
  173. package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
  174. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
  175. package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
  176. package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
  177. package/lib/oh-story/skills/story-long-write/references/project-files.md +10 -6
  178. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +1 -1
  179. package/lib/oh-story/skills/story-long-write/references/reference-index.md +4 -4
  180. package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
  181. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
  182. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  183. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
  184. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
  185. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +11 -9
  186. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +33 -44
  187. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +18 -51
  188. package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
  189. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +53 -67
  190. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -251
  191. package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
  192. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +5 -3
  193. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +18 -56
  194. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +3 -3
  195. package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
  196. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +96 -16
  197. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
  198. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +101 -14
  199. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
  200. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +2 -1
  201. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +250 -50
  202. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +278 -23
  203. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +179 -23
  204. package/lib/oh-story/skills/story-review/SKILL.md +19 -273
  205. package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
  206. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +1 -1
  207. package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
  208. package/lib/oh-story/skills/story-review/references/author-memory.md +40 -118
  209. package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
  210. package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
  211. package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
  212. package/lib/oh-story/skills/story-review/references/review-quality.md +2 -1
  213. package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
  214. package/lib/oh-story/skills/story-review/references/solo.md +52 -0
  215. package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
  216. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
  217. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +11 -9
  218. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +3 -3
  219. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
  220. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +278 -23
  221. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +179 -23
  222. package/lib/oh-story/skills/story-setup/SKILL.md +69 -458
  223. package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
  224. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +1 -1
  225. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
  226. package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
  227. package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
  228. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +21 -4
  229. package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
  230. package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
  231. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
  232. package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
  233. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
  234. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
  235. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
  236. package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
  237. package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
  238. package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
  239. package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
  240. package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
  241. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
  242. package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
  243. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
  244. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  245. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
  246. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +18 -56
  247. package/lib/oh-story/skills/story-setup/references/diagnostics.md +3 -3
  248. package/lib/oh-story/skills/story-short-analyze/SKILL.md +37 -110
  249. package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
  250. package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
  251. package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
  252. package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
  253. package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
  254. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
  255. package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
  256. package/lib/oh-story/skills/story-short-analyze/references/{material-decomposition.md → stage4-6-reversal-summary.md} +303 -374
  257. package/lib/oh-story/skills/story-short-scan/SKILL.md +30 -64
  258. package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
  259. package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
  260. package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
  261. package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
  262. package/lib/oh-story/skills/story-short-write/SKILL.md +23 -34
  263. package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
  264. package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
  265. package/lib/oh-story/skills/story-short-write/references/author-memory.md +40 -118
  266. package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
  267. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
  268. package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
  269. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
  270. package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
  271. package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -49
  272. package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
  273. package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
  274. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
  275. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
  276. package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
  277. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
  278. package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
  279. package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
  280. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +19 -12
  281. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +22 -32
  282. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +84 -17
  283. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
  284. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +3 -3
  285. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
  286. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
  287. package/lib/types/client/video-studio.d.ts.map +1 -1
  288. package/lib/types/native-hooks.d.ts +2 -2
  289. package/lib/types/native-hooks.d.ts.map +1 -1
  290. package/lib/types/role-tool.d.ts.map +1 -1
  291. package/lib/types/skill-provider.d.ts.map +1 -1
  292. package/lib/types/video-project.d.ts.map +1 -1
  293. package/lib/types/workspace-route.d.ts.map +1 -1
  294. package/lib/video-recap/CHANGELOG.md +60 -1
  295. package/lib/video-recap/README.en.md +348 -137
  296. package/lib/video-recap/README.md +340 -136
  297. package/lib/video-recap/manifest.json +406 -251
  298. package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
  299. package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
  300. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
  301. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
  302. package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
  303. package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
  304. package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
  305. package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
  306. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
  307. package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
  308. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
  309. package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
  310. package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
  311. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
  312. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
  313. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
  314. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
  315. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
  316. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
  317. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
  318. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
  319. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
  320. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
  321. package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
  322. package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
  323. package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
  324. package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
  325. package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
  326. package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
  327. package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
  328. package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
  329. package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
  330. package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
  331. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
  332. package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
  333. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
  334. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
  335. package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
  336. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
  337. package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
  338. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
  339. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
  340. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
  341. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
  342. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
  343. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
  344. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
  345. package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
  346. package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
  347. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
  348. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
  349. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
  350. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
  351. package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
  352. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
  353. package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
  354. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
  355. package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
  356. package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
  357. package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
  358. package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
  359. package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
  360. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
  361. package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
  362. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
  363. package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
  364. package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
  365. package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
  366. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
  367. package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
  368. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
  369. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
  370. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
  371. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
  372. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
  373. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
  374. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
  375. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
  376. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
  377. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
  378. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
  379. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
  380. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
  381. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
  382. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
  383. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
  384. package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
  385. package/lib/video-recap/skills/video-script/SKILL.md +16 -13
  386. package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
  387. package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
  388. package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
  389. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
  390. package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
  391. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
  392. package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
  393. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
  394. package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
  395. package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
  396. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
  397. package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
  398. package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
  399. package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
  400. package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
  401. package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
  402. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
  403. package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
  404. package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
  405. package/lib/video-recap/skills/video-understanding/scripts/{agent_brief.py → briefing/builder.py} +38 -35
  406. package/lib/video-recap/skills/{video-script/scripts/brief_context.py → video-understanding/scripts/briefing/context.py} +4 -35
  407. package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
  408. package/lib/video-recap/skills/video-understanding/scripts/{brief_timeline.py → briefing/timeline.py} +5 -6
  409. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
  410. package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
  411. package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
  412. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
  413. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
  414. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
  415. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
  416. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
  417. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
  418. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
  419. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
  420. package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
  421. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
  422. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
  423. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
  424. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
  425. package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
  426. package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
  427. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
  428. package/package.json +1 -1
  429. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -538
  430. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -603
  431. package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
  432. package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
  433. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
  434. package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
  435. package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
  436. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
  437. package/lib/video-recap/skills/video-script/scripts/agent_brief.py +0 -399
  438. package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +0 -327
  439. package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
  440. package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +0 -348
  441. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
  442. /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
  443. /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
  444. /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
@@ -0,0 +1,142 @@
1
+ # workflow-volume.md:出卷纲(全书分段与卷纲)
2
+
3
+ 作者要看全书怎么分段、这一卷怎么走时读本文件。同时读 [artifact-protocols.md](artifact-protocols.md)(大纲与卷纲模板)、`references/emotional-methods.md`「长篇单元情绪引擎」一节(排纲自查第 1 项)、`references/reader-contract-and-progression.md`(第 4 项);有主对标时按下文「对标节奏迁移」读主对标的 `剧情/节奏.md`。设定从 `设定/` 读,不回翻对话。只交付卷纲时不读细纲文件。没有子代理时先把分卷与第一卷走向作为提案给作者,确认后落盘;主线事件整体放进提案,价格、数值这类刻度留空写「到该章问作者」;交付汇报最后一句建议新开对话说「出第1-10章细纲」,技术备注在它后面。
4
+
5
+ #### 全书体量与阶段总览(卷纲前置)
6
+
7
+ 卷级大纲前先写全书体量与阶段边界,作为后续卷纲、细纲、日更补纲的共同约束。比例只作默认参考,必须按题材、目标字数和对标节奏调整,不能机械套模板。
8
+
9
+ ```
10
+ ## 全书体量与阶段总览
11
+
12
+ - 全书总章节数:{X} 章
13
+ - 目标字数:{X} 万字
14
+ - 全书情绪曲线:{压抑/期待 → 加压/反转 → 爽感/震撼 → 余韵/圆满;标注关键阶段}
15
+
16
+ ### 阶段划分
17
+ 1. 开篇期(第 {A}-{B} 章,参考 10%-15%):核心任务 {立人设/立世界/埋主线钩子};情绪基调 {压抑/期待/惊奇};阶段结束时读者应建立 {对主角的认同 + 对主线冲突的期待}
18
+ 2. 发展期(第 {A}-{B} 章,参考 50%-60%):核心任务 {矛盾展开/支线并行/资源与关系升级};情绪基调 {期待/紧张/间歇爽感};阶段结束时读者应建立 {对核心反派或终局矛盾的迫切期待}
19
+ 3. 高潮期(第 {A}-{B} 章,参考 20%-25%):核心任务 {核心冲突爆发/多线收束/连续爽点};情绪基调 {爽感/震撼/反转};阶段结束时核心矛盾应 {基本解决或进入最终对决}
20
+ 4. 收尾期(第 {A}-{B} 章,参考 5%-10%):核心任务 {伏笔回收/关系落定/结局余韵};情绪基调 {释然/感动/圆满};阶段结束时主线伏笔应 {回收完毕,结局落定}
21
+
22
+ ### 各阶段节奏公式
23
+ - 开篇期:核心任务 / 情绪基调 / 爽点密度 / 伏笔策略 / 冲突层级 / 阶段钩子 / 禁止提前释放
24
+ - 发展期:核心任务 / 情绪基调 / 爽点密度 / 伏笔策略 / 冲突层级 / 阶段钩子 / 禁止提前释放
25
+ - 高潮期:核心任务 / 情绪基调 / 爽点密度 / 伏笔策略 / 冲突层级 / 阶段钩子 / 禁止提前释放
26
+ - 收尾期:核心任务 / 情绪基调 / 爽点密度 / 伏笔策略 / 冲突层级 / 阶段钩子 / 必须回收清单
27
+
28
+ ### 关键节点与钩子链
29
+ - 关键转折点:第 {X/Y/Z} 章,各自承担 {事件功能 + 情绪效果}
30
+ - 小/中/大高潮:小高潮第 {X/Y/Z} 章;中高潮第 {X/Y} 章;大高潮第 {X} 章
31
+ - 阶段钩子链:开篇期结尾指向发展期;发展期结尾指向高潮期;高潮期结尾指向收尾期
32
+ ```
33
+
34
+ #### 卷级大纲(全书结构)
35
+
36
+ ```
37
+ ## 卷级大纲
38
+
39
+ ### 第一卷:{卷名}(约 {X} 万字,{Y} 章)
40
+ - 功能:{铺垫/起步/第一个大爽点}
41
+ - 所属阶段:{开篇期/发展期/高潮期/收尾期;可跨阶段时写清分界章}
42
+ - 卷契约:{本卷承诺的读者快感、主角高光、主要期待债}
43
+ - 终局储备:{本卷主推线1条 + 战果若干(一战多得允许);本卷解锁哪个终局里程碑、禁碰哪些未解锁底牌,参 `设定/题材定位.md`「终局底牌与升级台阶」小节 与 reader-contract-and-progression.md}
44
+ - 剧情单元:{1–3 万字剧情单元卡写在卷纲内,不另建单独文件;字段模板见 `references/artifact-protocols.md`,契约/推进规则见 `references/reader-contract-and-progression.md`}
45
+ - 阶段边界:本卷可释放 {信息/关系/能力};本卷禁止提前释放 {后期核心真相/终局底牌}
46
+ - 核心事件:{一句话}
47
+ - 起始状态 → 结束状态:{主角从 {A} 变成 {B}}
48
+
49
+ ### 第二卷:{卷名}
50
+ ...
51
+
52
+ ### 最终卷:{卷名}
53
+ - 功能:{高潮 + 收尾}
54
+ - 核心事件:{一句话}
55
+ ```
56
+
57
+ > **多对标书时**(对标登记 ≥2 本):读 `references/cross-book-recall.md`,副对标 `章节/*_摘要.md` + `剧情/*.md` 召回卷级节奏
58
+
59
+ > **对标节奏回流(有主对标书时,卷纲定稿前做一次)**:读主对标 `对标/{书}/剧情/节奏.md`;资料缺失时设置 `missing_primary_contract` 并停止,不得以摘要、故事线或报告代替。文件存在时,按本文件「对标节奏迁移」将 1/4·中点·3/4 换素材排入卷纲「对标结构坐标」,选中单元写入「对标剧情参照」(也可填「自创:{理由}」),并过排纲自查。未登记主对标但有同题材候选时先回 workflow-setup Phase 1;确无对标则按八节点自排(开篇 5-10%、发展 30-40%、转折一、转折二、高潮 10-15%、矛盾结果 10-15%、转折三、结局 10-15%,各节点规则见 outline-methods.md「八节点故事结构」)。有 `灵感库/` 时可另按「适用阶段=卷纲」召回 Top 8 active CBA 辅助结构选型,零命中不阻塞。
60
+
61
+ **排纲自查**(每卷、每批细纲设计前答一遍;逐章不重答):
62
+ 1. **情绪引擎**:本卷交付什么情绪、靠什么剧情模式可靠交付、核心冲突是什么?先按 `references/emotional-methods.md`「长篇单元情绪引擎」设计正向发动机,再做两个删除检验——删掉题材核心的对象/关系/问题,或删掉主角,情绪兑现还基本成立吗?成立就说明引擎没立住,先修。
63
+ 2. **节奏与定位**:哪段加速哪段减速;章节定位有高低、不是全程高压,低压加过场合计不超约 15%;有对标书时 1/4、中点、3/4 各锚一个关键情节(中途追加单元按单元内的 1/4·中点·3/4,不改已锁定的卷尺度坐标表;见本文件「章节定位与张弛」「对标节奏迁移」)。
64
+ 3. **伏笔与阶段边界**:本卷新埋哪些伏笔、上一卷待收的怎么处理;本卷在全书哪个阶段,可释放什么、必须压住什么(压住的写进细纲「本章禁止提前释放」)。
65
+ 4. **契约四问**:按 `references/reader-contract-and-progression.md` 逐剧情单元过一遍,把 契约安全 / 需补强 / 契约破坏 写进单元卡「契约风险」;契约破坏 先修纲,需补强 补交换、铺垫或成本;两种都在规划汇报里告诉作者。不要求主角亲自完成每个动作。
66
+ 5. **供给**:进入细纲层时按 workflow-outline.md 批次步骤 3 做供给自查。
67
+
68
+ 只交付大纲/卷纲时,完成排纲自查 1–4 和下面列的纲文件后停止,不进入细纲。
69
+
70
+ 按本次交付范围创建以下 artifact(模板见 [artifact-protocols.md](artifact-protocols.md)):
71
+ - **大纲/大纲.md**:全书卷级鸟瞰(卷名+字数+章数+核心事件+状态变化,一段式汇总)
72
+ - **大纲/卷纲_第X卷.md**:每卷的故事线(L 编号)+剧情单元+情绪弧线(含章节定位)+人物弧线+伏笔+反转+对标结构坐标+**刻度台阶/打脸债/压力线轮转**三表(按需填写,不适用时省略或写「无」;参考本文件「章节定位与张弛」「对标节奏迁移」,情绪弧线选型拿不准时读 `references/emotional-arc-design.md`「六种弧线速查」,本卷规划了反转时读 `references/long-reversal.md`「反转类型」,都只读那一节;三表模板见 artifact-protocols.md)
73
+ - **追踪不在规划阶段初始化**:开书、大纲、细纲、补纲都不建 `追踪/`;首次进入正文时由 workflow-chapter 处理缺 state(无正文初始化第 0 章,事务 JSON 放书目录 `.story/work/`)。核心角色动态快照在首次正文事务中创建。
74
+
75
+ **卷纲锁定的定义**:某卷一旦已有正文章节,该卷已写区间对应的既有剧情单元卡与对标结构坐标即视为锁定——未经用户确认不改既有内容,但允许在卷尾**追加**新剧情单元卡(只增不改)。追加同样只发生在用户明确要求补纲/扩纲时;日更/写正文流程不自动追加剧情单元卡。workflow-daily 各处「锁定卷纲绝不自动修改」均按此定义执行。
76
+
77
+ **规划交付后向作者汇报**(开书、大纲、卷纲、细纲、补纲、改细纲都用;按 SKILL.md「面向作者的汇报」):排纲自查、建纲批末复核是内部核对,只把结论翻成故事话;「先问作者」的缺口和两个设定互相冲突都作为「要你定的事」问。
78
+
79
+ <!-- author-report -->
80
+ ```md
81
+ {做了什么,如「第二卷卷纲定好了」「补好了第22-26章细纲」「按你说的改了第23章细纲」}:
82
+ - {故事层要点,一行一件:这卷/这几章主要发生什么,主角得到或失去什么,停在哪个悬念上}
83
+ - {改细纲时:原来是什么,现在改成什么,会不会牵动别的章}
84
+ {某段剧情主角的功劳被别人拿走、或提前用掉了后面的底牌时一句话说清,如「第三段剧情里功劳落到了师父身上,我先把纲改成沈栀自己拿主意」;没有就删掉此行}
85
+ {前面吊起的期待还没兑现时说清哪章兑现;没有就删掉此行}
86
+ {要你定的事:一句问题+白话选项+推荐,如「沈栀的金手指每天能用几次?1. 一次(推荐,后面好加码)2. 不限次」;没有就删掉此行}
87
+ 下一步:{如「要接着写第22章正文吗?」「要继续出第27-31章细纲吗?」}
88
+ ```
89
+
90
+ #### Agent 调用:story-architect
91
+
92
+ 已部署时,卷纲在 story-architect 的新上下文里出,调用见 [agent-calls.md](agent-calls.md);主会话拿到后跑 `outline_view.py --check --strict {卷纲路径}`(往旧卷纲追加单元时去掉 `--strict`),并按排纲自查 1–4 的结论汇报。
93
+
94
+ ---
95
+
96
+ ## 节奏锚与对标迁移
97
+
98
+ ### 关键点法(统一各尺度的节奏锚)
99
+
100
+ 任意尺度(全书 / 卷 / 剧情单元 / 支线 / 章)都有五个关键点:开场、1/4、中点、3/4、结尾。其中 1/4、中点、3/4 是放关键情节的位置。关键情节三类:
101
+
102
+ | 类型 | 含义 |
103
+ |------|------|
104
+ | 情节逆转 | 发展在读者意料内,但主角的解决方式让人直呼精彩(装逼打脸、英雄救美) |
105
+ | 情节转折 | 意料之外(身份反转、敌变友、局势骤变) |
106
+ | 激励情节 | 全书或一卷第一个、与核心主线直接相关的命运改变时刻 |
107
+
108
+ 不是每个尺度都把三处填满,但一卷至少在 1/4、中点、3/4 各安排一个关键情节,避免全程一个力度。
109
+
110
+ ### 对标节奏迁移(卷纲定稿前做一次,无对标书可跳过)
111
+
112
+ 1. **选段(以剧情单元为单位)**:在主对标里圈出本卷要对标的剧情单元序列——选段单位就是拆文产出的剧情单元(`剧情/{剧情标题}.md`)。检索顺序:先读主对标 `剧情/README.md`「剧情单元清单」(有清单则一书一文件,按「类型 / 桥段标签」直接命中同类);无清单则在 `剧情/*.md` 里按「类型」行(第一键,必填枚举)+「桥段标签 / 套路框架位置」行(第二键)圈同类;仍无命中回退按章节范围圈段,全程不阻塞。多对标时按 `cross-book-recall.md` 大纲预算从副对标补同类条目。读取必备权威文件 `剧情/节奏.md`(爆发密度 / 爽点循环);缺失时先修复或重跑拆文 Stage 3,不从摘要猜测节奏。本卷对标几个剧情单元 ≈ 本卷字数 ÷ 1.5-3 万。
113
+ 2. **标关键点**:看对标这几个剧情单元在 1/4、中点、3/4 各放了什么关键情节,判为逆转 / 转折 / 激励。摘要里「类型=转折点」的情节点 + 基调突变(如温馨→压抑)就是关键点的确定性锚,不靠凭感觉;剧情单元的「结构分布」(铺垫/发展/高潮/收尾期)与「情节点索引」同为确定性锚。
114
+ 3. **换素材**:保留对标的情绪链和功能位,把对象、场景、事件全换成自己的,禁止照搬具体桥段。功能位清单取必备权威文件 `剧情/情绪模块.md` 的可替换项;缺失时先修复,不生成替代清单。
115
+ 4. **修正硬伤**:换素材前比对 `拆文报告.md`「不建议模仿」。对标若在某个关键点是弱处理(慢热留白、主角长期旁观等已知硬伤),迁移时要在该位置补一个缺的关键情节、或把后面的关键情节前置,而不是把弱处理一起抄过来——关键点该有的力度不能因为对标偷懒就跟着偷懒。
116
+ 5. **排章 + 落卷纲**:把换好(并修正)的关键情节落到本卷相同相对位置——这里的 1/4·中点·3/4 是**卷尺度**(1/4≈总章×0.25、中点×0.5、3/4×0.75);卷里有几个剧情单元时,每个剧情单元内部另有自己的铺垫→逆转→收尾,别和卷尺度的关键点混为一谈。关键点之间用普通推进章过渡,每个关键点之后按需插一章呼吸 / 关系章;写进卷纲「对标结构坐标」与情绪弧线的章节定位列,细纲承接时每章标章节定位。同时把选中的剧情单元以 {书名}《剧情标题》写入剧情单元卡「对标剧情参照」。
117
+
118
+ 近精细远模糊:只精排当前卷,后续卷做粗坐标即可,不必一上来规划全书。
119
+
120
+ 一个最小例子(demo《让你管账号,你高燃混剪炸全网》):对标结构的 1/4 是“小人物拿出粗糙作品,无人看好”,中点是“作品爆火,体制内外同时关注”,3/4 是“专业力量进场替代,反而证明主角不可复制”。换到江晨这条军宣线后,1/4 落成他用手机拍《诸君,且听龙吟》、画质粗糙却先把军魂拍出来;中点落成视频引爆全网和参军热潮;3/4 落成专业团队高清重拍,却被周薄森当场指出“缺了灵魂”,张耀祖最终拍板继续用手机原版。保留的是“轻视→市场验证→权威替代失败→价值坐实”的情绪链,素材、场景和角色关系都来自本书。
121
+
122
+ ## 章节定位与张弛(破「每章像短篇」)
123
+
124
+ 一卷里章的压力本就该有高有低。这里的压力级指**爆发 / 冲突烈度**(复用悬念刻度 1 微 / 2 小 / 3 中 / 4 大 / 5 极),不是情感烈度——关系回收 / 泪目这类章可以压力低(爆发小)但情感强度顶满,情感烈度由卷纲情绪弧线的「情绪基调 + 强度」承载。章节定位由「这一章在它所属剧情单元里的位置」自然落出,不是另贴一套独立标签:剧情单元首章多为铺垫 / 共情,中段承载逆转,收尾爆发收束;黄金开篇、高潮结算 + 温情这类章可复合标注(如「高压 + 关系」)或留空。
125
+
126
+ | 章节定位 | 功能 | 压力级 | 卷内占比(均衡/长书基线,非硬配额) | 钩子要求 |
127
+ |------|------|--------|--------------------------|----------|
128
+ | 高压章 | 打脸 / 掉马 / 反转 / 高潮;关键点的关键情节落点 | 4-5 | 约 15-20% | 章尾强钩子;承载逆转 / 转折 |
129
+ | 普通推进章 | 主线推进、冲突升级、剧情单元中段 | 2-3 | 约 40-50% | 章尾中钩子;至少一个小爽点或期待递进 |
130
+ | 修炼试错章 | 实力 / 资源积累、能力铺垫、失败试错 | 2 | 约 5-10% | 进度钩子(差一点 / 即将突破),可无反转 |
131
+ | 关系回收章 | 感情线兑现、关系转折、身边人日常 | 2-3 | 约 5-10% | 情感钩子;拉扯仍带主线相关 |
132
+ | 低压生活章 | 高潮后喘息、关系升温、张弛调节 | 1-2 | 不超过约 10% | 允许弱钩子或仅情绪钩子;不强求反转 / 爽点 |
133
+ | 信息整理章 | 转场、设定交代、时间缝合 | 1 | 不超过约 5%,能并章就并章、少独立成章 | 允许无显性爽点;信息用「表演」承载;结尾给下一段目标 |
134
+
135
+ 两条底线:
136
+
137
+ - **期待不断、爆发分布**。低压章可以没有爽点和反转,但每章都要给读者一个往下看的理由(微好奇、阶段目标、暧昧期待)。掉的是爆发烈度,不是往前的拉力——番茄追读尤其吃这条。
138
+ - **禁情绪母题扎堆**。比「每章像短篇」更隐蔽的疲劳源,是连续多章同一情绪母题高位运行(如连五章家国 / 泪目)——章节定位分得再开也救不了。排卷纲情绪弧线时逐行看相邻 3-4 章的情绪基调,同母题别连超 2-3 章;靠换情绪、换钩子方式、多线穿插来差异化,不是靠砍钩子。
139
+
140
+ 题材分级(上面占比是均衡 / 长书基线,按题材分档):番茄短平快 / 男频事业线,高压可到 30% 以上、呼吸章压到 5% 上下都正常,别拿基线去「补呼吸、砍高压」反而掉追读;女频 / 世情 / 追妻,人设关系容量大、关系 / 低压章可更多,但仍走情绪折线、不必每章三折。低压 / 关系章定位是看点(主角身边人的日常本身是订阅点),不是填充。
141
+
142
+ 与字数目标的衔接:章节定位决定情节点功能与展开取舍,但不把每个情节点换算成固定字数,也不靠增点凑目标。写后由程序按双层长度带验收:明显欠长先判断已批准义务是否未实现,容量不足或不明确就协商自然长度、补纲或目标,绝不自动补写;明显超长可做一次不新增语义、逐项保留批准情节点与章尾钩子的净删型压缩,复检仍带外就停止,不进入循环删改。
@@ -7,16 +7,18 @@
7
7
  - 这行是**指令**不是材料栏目。**交付摘要没有读取清单 = 这行没传,重 spawn。**
8
8
  - 第二行起传本章必需材料:
9
9
  - 项目目录、章节、细纲文件(**只给路径,不给全文**)、上一章结尾切片(按整行回退约 400 字,**不给路径**)、输出路径与标题行字面量(使用当前平台的原生路径分隔符,章名从细纲 `### 第 N 章:章名` 解析,标题行形态照既有章)。
10
- - 写前准备输出:本章意图、本节速记、情绪目标、涉及角色、参考技法、必读设定(**直接写出那几句,不给路径**)。
10
+ - 写前准备输出:本章意图、作者本轮要求、本节速记、目标情绪、涉及角色、本章技法(类别)、必读设定(**直接写出那几句,不给路径**)。
11
11
  - 主对标/拆文路径、主/副对标召回摘要。
12
12
  - `selected_emotion_module`、`rhythm_reference` 及来源路径。
13
13
  - `genre_prose_card`(题材正文提示卡摘要,只含本章相关条目)。
14
14
  - 文风全文路径、按 `style-resolution.md` 形成的 `style_resolution`、原文锚点;同一裁决原样交后续去味与审稿。
15
+ - `设定/题材定位.md`「作者已定」原样摘入(约 600 字内,超了注明去原文读完)。
15
16
  - `author_preferences`:作者记忆 `query` 结果中匹配本章的 `prose_style` / `story_design` 项;无则不传,禁止把完整画像或待确认项塞进 prompt;作为低优先级倾向自然吸收,不逐条展示或最大化命中,不牺牲连贯、节奏和字数。
16
17
  - 本章禁止提前释放信息与各点「放」;细纲写了阶段位置、结构公式时一并传。
17
18
  - 字数目标、`visible_chars_v1` 口径、格式硬约束;默认两组交付并由主会话测一次 checkpoint;用户明确要求一次成文时才写全章。字数目标按整章分量刻度使用,疏密自行分配,不填写逐情节点配额。
18
- - **agent 定义里已有的不重述**,只留一行指针:细纲优先边界=铁律 1、正文形状=铁律 2、新增物三级=铁律 3、阅读体验字段(本章标价/闭环状态/信息差触发点/镜头准入档位/情节点分辨率列/执行边界「放」半边)=铁律 4、交付三附件(情节点落点/新增申报表含末行「本章没写成的」/参考文件读取清单)=被调用协议。申报表与「没写成的」行的去向见步骤 12 与 workflow-setup「排纲自查与细纲」步骤 3。
19
+ - **agent 定义里已有的不重述**,只留一行指针:细纲优先边界=铁律 1、正文形状=铁律 2、新增物三级=铁律 3、阅读体验字段(本章标价/闭环状态/信息差触发点/镜头准入/情节点分辨率列/执行边界「放」半边)=铁律 4、交付三附件(情节点落点/新增申报表含末行「本章没写成的」/参考文件读取清单)=被调用协议。申报表与「没写成的」行的去向见 workflow-chapter 步骤 12 与「新增物处置(主会话)」。
20
+ - 写手未部署、主会话自己写时,这些指针没有出处:新增物按 SKILL.md「新增物三级」分级,写了要报的逐条列申报表(类型/名目/落在哪/后续义务;无写 `0`),末附「本章没写成的」(细纲没给/先问作者),先问作者的不写。
19
21
 
20
22
  ## 检查分工
21
23
 
22
- 手动组装同样传入:写手负责编排、内容覆盖与格式自检;父流程质量阶段负责语义去味和最终文件扫描。写手不提前重复整轮去味或相同检查链,情节点落点、新增申报与原定交付保留。
24
+ 手动组装同样传入:写手负责编排、内容覆盖与格式自检;主会话质量阶段负责语义去味和最终文件扫描。写手不提前重复整轮去味或相同检查链,情节点落点、新增申报与原定交付保留。
@@ -1,17 +1,6 @@
1
1
  # 写作技法:可执行指令集
2
2
 
3
- > 6 个写作技法的 agent 可执行指令。写作全程参考。
4
-
5
- ---
6
-
7
- **本文件职责**(其他内容去哪看):
8
- - 本文件只管「贯穿道具的三次出现编排规则」,不管「羁绊铺设」(羁绊功能见 emotional-methods.md)
9
- - 对话相关(含权力博弈的规则/模式/示例/操作指令)一律见 dialogue-mastery.md,本文件不重复
10
- - 本文件只管「开头事件密度指令」,不管「开头设计」(开头设计见 opening-design.md)
11
- - genre-prose-cards.md 提供题材声线与长线约束;本文件的「贯穿道具系统」提供跨章可执行设计模板
12
- - 本文件第 8 节「场景写法(三维度揉进)」是 Phase 3 的写作方法,`long-format.md` 负责长篇章节的段落、对话与工程元信息规范
13
- - 本文件「贯穿道具系统」只规定物件的三次出现编排时机和意义翻转规则;物件的初始情感含义设计(选什么物件、承载什么羁绊)由 emotional-methods.md 负责(信物型物件与羁绊铺设功能重叠,但视角不同)
14
- - 本文件第 10 节「在场者的账」只管**谁能上镜、他的动机要不要露出来、分量由谁标价**;具体的对话怎么写(长度、权力反转、句式)仍见 dialogue-mastery.md,本文件不重复
3
+ > 写作全程参考。对话怎么写见 dialogue-mastery.md,开篇设计见 opening-design.md,章节格式按长篇 long-format.md 或短篇 format-and-structure.md。
15
4
 
16
5
  ---
17
6
 
@@ -80,10 +69,7 @@
80
69
  第3次出现:第{N}节 | {场景} | 含义:{结尾意义}
81
70
  ```
82
71
 
83
- ### 物件类型速查
84
-
85
- | 类型 | 特征 | 代表 |
86
- |------|------|------|
72
+ ------|------|------|
87
73
  | 信物型 | 承载关系的象征物 | 金锁(姐夫捎路)、木头小马(皇弟) |
88
74
  | 工具型 | 日常使用的功能性物件 | 打分本(准儿媳)、账本(迟来二十年) |
89
75
  | 痕迹型 | 残留的身体/环境痕迹 | 手腕旧疤、墙上身高刻度 |
@@ -210,7 +196,7 @@
210
196
  | 关键子事件读得懂吗? | 现场、因果或角色下一步缺了必要信息 | 只补真正缺失的维度;不为凑齐三项补感官或身体动作(见第8节) |
211
197
  | 对话只有 1-2 轮? | 缺少对话交锋 | 加一轮权力博弈对话(见第3节) |
212
198
  | 情绪信息落地了吗? | 只贴标签,或又用无功能微动作重复解释 | 优先落到选择、台词、物件和后果;必要时直写,身体细节须有功能(见第1节) |
213
- | 仍偏短且关键 beat 写薄? | 冲突、选择、代价或关系变化没有演到位 | 回到细纲内已有事件补交锋与后果;没有内容就补纲,不拿感官/回忆注水 |
199
+ | 仍偏短且关键情节点写薄? | 冲突、选择、代价或关系变化没有演到位 | 回到细纲内已有事件补交锋与后果;没有内容就补纲,不拿感官/回忆注水 |
214
200
 
215
201
  ### 子事件不够时怎么扩
216
202
 
@@ -265,8 +251,8 @@ IF 主事件是一连串动作 → 加「递进」:动作引发的连锁反应
265
251
  - 同一约束如果在「核心事件 / 内容概括 / 情节安排 / 情节点」里重复出现,生成前只合并成**一个语义点**;重复字段不是强调,更不是四次复述额度。正文不得沿用提纲里反复出现的同一措辞逐项交代。
266
252
  - 五段式(起因/发展/转折/高潮/结尾)是给细纲作者的功能拆解,不是正文的五个自然段;正文不必逐段顺叙,也不必一段对一格。
267
253
  - "谁做了什么"的概括句、"A→B→C"箭头链、"收束到什么状态"是规划口径,不要原样搬进叙述。
268
- - 同一场戏里的几个点可以合并、互相打断,不必排成逐点清单;因果依赖或刻意的节拍分隔才串行。只改顺序不会让正文变好看(交错与否的对照实验测不出差别),密点展开、疏点带过更要紧(见「疏密分配」)。
269
- - 章尾落在最后一个具体的动作、画面、台词或悬念上;细纲「结尾设定/收束状态」是规划口径,不要在正文里写成"就这样……""他终于明白……"式的状态总结句(结尾去升华见 anti-ai-writing.md)。
254
+ - 同一场戏里的几个点可以合并、互相打断,不必排成逐点清单;因果依赖或刻意的停顿分隔才串行。只改顺序不会让正文变好看(交错与否的对照实验测不出差别),密点展开、疏点带过更要紧(见「疏密分配」)。
255
+ - 章尾落在最后一个具体的动作、画面、台词或悬念上;细纲「结尾设定」是规划口径,不要在正文里写成"就这样……""他终于明白……"式的状态总结句(结尾去升华见 anti-ai-writing.md)。
270
256
 
271
257
  ### 视角姿态:深度限知(贴地沉浸)
272
258
 
@@ -323,23 +309,6 @@ IF 主事件是一连串动作 → 加「递进」:动作引发的连锁反应
323
309
 
324
310
  → 这里的身体反应改变了落笔结果,承担信息;不是为了证明人物紧张而另加微动作
325
311
 
326
- ### 自检方法
327
-
328
- **写法抽查(质检侧用)**
329
-
330
- 只许指出正文里**已有**的那一处,没有就答「无」,**不许为了让某一问有答案回头补内容**;只报告实际删改与保留理由,写手不另交验收说明。详写的关键场景里,遮住一处发生、感知或反应后读者什么也没损失,就删掉它;套式反应按第 1 节「套式反应删除测试」逐处过。
331
-
332
- | # | 自问 | 不合格的样子 | 见 |
333
- |---|---|---|---|
334
- | 1 | 本章最大的那次状态变化,读者看见了几个中间态? | 只给了"起点"和"终点";或同一状态换十种说法说十遍 | 本节「从细纲到正文」 |
335
- | 2 | 有没有一组同类并列项被平均分配了笔墨? | 三样物件、四拨人马各给同样的分辨率 | 本节「疏密分配」 |
336
- | 3 | 本章的设定/能力/威胁,是被说出来的,还是被谁付了代价试出来的? | 旁白直接给出结论,读者没有自己发现的机会 | 第 1 节 |
337
- | 4 | "厉害/难得/要命"这些判断,是谁给出的?他有什么立场? | 叙述者自己下的判断;结论由旁白先说出来、在场的人只负责吃惊;或标价人就在场却没标价 | 第 10 节「标价人」 |
338
- | 5 | 每个给了镜头的人,此刻在为自己争取什么? | 遮住名字认不出是谁说的;所有人同向配合主角;用手部/喉部微动作代替立场;或把他的算计写成一段旁白独白 | 第 10 节「镜头准入」 |
339
- | 6 | 该说出口的话,是写出来了还是被概括了? | "他吼了一声""他说了句什么""三言两语解释了缘由";本该来回几轮的交锋压成一次说完 | 第 3 节 |
340
- | 7 | 本章最重的那一句,是不是最短的那一段? | 最重的一拍写成了全章最长的段落 | 本节「画面分段」 |
341
- | 8 | 判为"密"的段落里,有没有量词加概括? | "一连七八下""半晌""众人纷纷"出现在密处 | 本节「疏密分配」 |
342
-
343
312
  ### 画面分段(防止一段到底)
344
313
 
345
314
  三维度揉进不是把一个子事件塞进一个长段。揉进解决"同一瞬间被拆成发生/感知/反应三段"的问题;断段解决"手机阅读时一段过密"的问题。
@@ -357,7 +326,7 @@ IF 主事件是一连串动作 → 加「递进」:动作引发的连锁反应
357
326
  判定规则:
358
327
 
359
328
  - 一段只承载一个镜头拍点/一个动作单元,或一条尚未结束的连续推理、氛围、情绪链。
360
- - 常规叙事段可短,但句子内部不碎——叙述句不要一个动作一句号、句句断开(叙述默认逗号长句,详见 anti-ai-writing.md 规则 3);细密描写、推理判断、氛围压迫、情绪沉淀可以稍长,前提是仍在讲同一件事。
329
+ - 常规叙事段可短,但句子内部不碎——叙述句不要一个动作一句号、句句断开,也不要用逗号罗列动作——用虚词把前后接成一口气(见本节「句子怎么连」);细密描写、推理判断、氛围压迫、情绪沉淀可以稍长,前提是仍在讲同一件事。
361
330
  - 长度只是诊断,不是强制阈值:读起来拥挤、包含多个动作/信息/视线切换时才拆;完整戏剧单元未结束时不要为凑短而硬拆。
362
331
  - 常规正文保持短段、稍长段、对话、动作段交替;高压冲突、打脸、反转段可以更碎更短。
363
332
  - 不要连续多段同长度,也不要把一个完整推理链切成机械碎片。
@@ -386,36 +355,29 @@ IF 主事件是一连串动作 → 加「递进」:动作引发的连锁反应
386
355
 
387
356
  ### 疏密分配(详略不均)
388
357
 
389
- 不要每个 beat 一样长、一样细——平均用力是 AI 腔的根源,也是读起来"哪都写得满、哪都不出彩"的原因。按情节权重分配笔墨:
358
+ 不要每个情节点一样长、一样细——平均用力是 AI 腔的根源,也是读起来"哪都写得满、哪都不出彩"的原因。按情节权重分配笔墨:
390
359
 
391
- | beat 类型 | 笔墨 | 写法 |
360
+ | 情节点类型 | 笔墨 | 写法 |
392
361
  |---|---|---|
393
362
  | 爽点/打脸/反转/情绪高潮 | 密(详写) | 感知、动作、对话交锋铺满,慢镜头逐拍展开 |
394
363
  | 过场/赶路/信息交代/时间跳转 | 疏(略写) | 1-2 句带过,甚至一句概括,不展开三维度 |
395
364
  | 铺垫/日常/关系升温 | 中 | 挑一两个有代入感的细节写实,其余略 |
396
365
 
397
- 原则:一章里详写的 beat 集中在情绪节点,过场坚决压缩。读者记住的是密处的画面,疏处只是把他们快速送到下一个爽点。密度有起伏,节奏才有呼吸。
366
+ 原则:一章里详写的情节点集中在情绪节点,过场坚决压缩。读者记住的是密处的画面,疏处只是把他们快速送到下一个爽点。密度有起伏,节奏才有呼吸。
398
367
 
399
368
  **同类并列项要递减,不要平均。** 三样物件、四拨人马、五次出手——第一个写足,第二个减半,后面的一句带过或只给一个区别点。**递减不是省略**:被压缩的那几个仍要各有一个不重复的记号,否则是漏写。
400
369
 
401
370
  **判为"密"的地方禁止量词加概括。** "一连七八下""斗了半晌""众人纷纷点头""交手数十回合"(把过程折叠成一个数字,是疏处的手法)。密处只有一种写法:挑出其中**具体的几下**,逐拍写。
402
371
 
403
- ### 子事件连接
372
+ ### 句子怎么连
404
373
 
405
- 子事件之间按真实关系连接:因果推进、对话接招、新信息、空间移动或角色下一步都可以;不规定必须插入身体动作,也不规定连接句长度。
374
+ 子事件之间按真实关系连接(因果、接招、新信息、空间移动、角色下一步),不为过渡另补身体动作。句子内部同样要连,不要罗列:
406
375
 
407
- - ❌ 为了过渡另补“我把账本搁在膝盖上,手心出了一层薄汗。”
408
- - ✅ “最后一笔支出没有收据,下一页却夹着他的签名。”(新信息直接推动下一拍)
409
-
410
- ### 感知素材库
411
-
412
- | 场景类型 | 可用的感知细节 |
413
- |---|---|
414
- | 阅读/翻看 | 字迹深浅、纸张触感、墨水洇开、页角卷曲 |
415
- | 对话场景 | 对方表情变化、语气停顿、空气里的沉默 |
416
- | 回忆场景 | 画面中的某个细节突然清晰(气味/声音/触感) |
417
- | 室内场景 | 光线变化、物品的位置、温度 |
418
- | 移动场景 | 脚步声、地面的触感、风的方向 |
376
+ - **动作串分主次、带虚词**:一句里超过三个动作,用「就、才、又、便、却、倒、还、再、先……才」接出先后和因果,别写成逗号清单。❌「坛子挪到墙角,床板拿袖子擦了一遍,铺盖摊开。」✅「她先把坛子挪到墙角,拿袖子把床板擦了一遍,这才把铺盖摊开。」
377
+ - **少写没做的事**:「没A,也没B」「不A,也不B」一章至多一两处,写人物做了什么。❌「他没说让她住,也没说不让。」✅「他掀着帘子站了一会儿,一句话不说,进里间去了。」
378
+ - **对话带口气**:人物说话按身份、年纪、地方带「吧、呢、啊、嘛、哎」和口头的停顿,全章对话不能一个语气词都没有。
379
+ - **碎句留给重拍**:单独成行的短句只给章尾、反转、情绪峰值;盘算、过渡写成连贯的一句。
380
+ - **比喻用中文现成的说法**,不造「嗓门比香味还亮」这类跨感官新搭配。
419
381
 
420
382
  ### 三维度的边界
421
383
 
@@ -430,7 +392,7 @@ IF 主事件是一连串动作 → 加「递进」:动作引发的连锁反应
430
392
 
431
393
  ### 规则
432
394
 
433
- 标点承担语气、权力关系和情绪节拍,不能当装饰。写正文时先判断“这句话在场景里做什么”,再决定用句号、逗号、问号、感叹号、冒号或换行/动作 beat;不再用省略号和破折号制造停顿。
395
+ 标点承担语气、权力关系和情绪起落,不能当装饰。写正文时先判断“这句话在场景里做什么”,再决定用句号、逗号、问号、感叹号、冒号或换行/动作;不再用省略号和破折号制造停顿。
434
396
 
435
397
  ### 标点谱系
436
398
 
@@ -445,7 +407,7 @@ IF 主事件是一连串动作 → 加「递进」:动作引发的连锁反应
445
407
 
446
408
  ### 执行步骤
447
409
 
448
- 1. 读本场景目标情绪和角色声线,给每个关键对话 beat 标一类语气(压迫/试探/爆发/迟疑/被打断)。
410
+ 1. 读本场景目标情绪和角色声线,给每个关键对话回合标一类语气(压迫/试探/爆发/迟疑/被打断)。
449
411
  2. 精修时扫一遍句尾:如果一整段只剩句号,检查是否把质问、迟疑、爆点压平;如果满屏 `?`/`!`,删到只保留有功能的位置。
450
412
  3. 正文(含对话)里的 `……`、`——`、`—`、`--` 都改成句号、逗号、短句、换行或动作断句。知乎盐言 `「」` 只是引号风格,不影响问号、感叹号的合法使用。
451
413
 
@@ -41,7 +41,7 @@ LEGACY_ASSERTION_MAX_BYTES = 768 # 存量条目的读取上限;强化老条
41
41
  # 是它在 prompt 里的注意力预算,不该放大。防「作者以为载入了、实际被静默
42
42
  # 截断挤掉」靠三层:①新建条目的断言限 ASSERTION_MAX_BYTES,从源头短(强化
43
43
  # 已有条目不受限,否则存量长断言再也无法被确认,只会派生重复条目);②写入
44
- # 端按下列任务组合(与 references/author-memory.md 的映射表同包跟版)估算
44
+ # 端按下列任务组合(与 references/author-memory-maintenance.md 的映射表同包跟版)估算
45
45
  # 最坏查询情形——全局条目+各 scope 维度上最重的单一切片(一次查询只带一
46
46
  # 个 book/genre/workflow,不同书的条目不会同现;切片按 casefold 归并,与
47
47
  # same_scope_value 同一口径,轻重按 compact 字节+列表分隔符算,与真实载荷
@@ -150,7 +150,7 @@ def is_item_id(value: object) -> bool:
150
150
  isinstance(value, str)
151
151
  and len(value) >= 3
152
152
  and value[:2] in ID_PREFIXES
153
- and value[2:].isdigit()
153
+ and value[2:].isdecimal()
154
154
  and int(value[2:]) >= 1
155
155
  )
156
156
 
@@ -1414,7 +1414,7 @@ def command_query(
1414
1414
  prepare_workspace(workspace, book_root)
1415
1415
  require(
1416
1416
  bool(kinds),
1417
- "query 必须显式传 --kind(按 references/author-memory.md 的任务映射表选类型),不再默认返回全部类型",
1417
+ "query 必须显式传 --kind(按调用方 skill 写好的 query 命令选类型,映射表见 references/author-memory-maintenance.md),不再默认返回全部类型",
1418
1418
  )
1419
1419
  project_state = load_state(project_store(workspace))
1420
1420
  book_state = load_state(book_store(workspace, book_root, book)) if book_root is not None else None
@@ -0,0 +1,260 @@
1
+ #!/usr/bin/env python3
2
+ """build_architect_brief.py — 把「出卷纲」「出一批细纲」这一时刻要用的流程与模板拼成任务包。
3
+
4
+ 用法:
5
+ python build_architect_brief.py --project <书目录> --task world
6
+ python build_architect_brief.py --project <书目录> --task volume [--volume N]
7
+ python build_architect_brief.py --project <书目录> --task outline --chapters A-B
8
+ python build_architect_brief.py --project <临时目录> --task <任务> --rules-only # 仓库预算守卫计量用
9
+
10
+ 开书与规划按作者确认点分时刻(见 references/workflow-setup.md)。卷纲与每批细纲最重,
11
+ 有子代理时交给 story-architect 在新上下文里做:主会话只跑本脚本、把任务包路径交给它,
12
+ 自己不读包里的内容。任务包写在书内 `.story/work/排纲/`,是这次任务的输入数据,不是 reference。
13
+
14
+ 包里只有该时刻需要的东西,三种任务都附 SKILL.md 的「新增物三级」判据(包外读不到 SKILL.md):
15
+ - world:workflow-setup.md 的 Phase 2 与设定模板、character-basics.md、long-genre-mechanics.md 的
16
+ 「核心梗三层递进设计」、character-relations.md 的「人物关系类型」、reader-contract-and-progression.md。
17
+ - volume:workflow-volume.md(卷纲流程、排纲自查、节奏锚与对标迁移)、artifact-protocols.md
18
+ (大纲与卷纲模板)、emotional-methods.md 的「长篇单元情绪引擎」(排纲自查第 1 项)、
19
+ reader-contract-and-progression.md(第 4 项契约四问)。
20
+ - outline:workflow-outline.md(批次步骤、细纲模板与验收、补纲、设定补全、排纲底稿模板)、
21
+ character-basics.md 的主角卡与配角卡模板;首章在范围内时加 opening-design.md。
22
+ 流程里点名、但只在某些书才用得上的参考(多对标时的跨书召回、女频手册、弧线与反转速查、灵感库)
23
+ 不进包,列在包末「按条件可读」,给出绝对路径与小节,条件满足才读。
24
+ 本书的方向、设定与作者口头定下的事都在 `设定/`,不进包,由执行者按包里的流程定点读。
25
+ `--rules-only` 只拼规则部分(不取本书卷纲),供仓库的预算守卫计量每次调用的加载量。
26
+
27
+ stdout 输出一行 JSON:任务包路径、字数(去空白)、包含的资料。
28
+ Exit: 0 = 已写出;2 = 参数或资料缺失(含卷纲单元只覆盖了请求章节的一部分)。
29
+ """
30
+
31
+ from __future__ import annotations
32
+
33
+ import argparse
34
+ import json
35
+ import re
36
+ import sys
37
+ from pathlib import Path
38
+
39
+ sys.path.insert(0, str(Path(__file__).resolve().parent))
40
+ from outline_view import parse as parse_volume, slice_arc, strip_retired, unit_chapter_range # noqa: E402
41
+
42
+ SKILL_ROOT = Path(__file__).resolve().parent.parent
43
+ REFERENCES = SKILL_ROOT / "references"
44
+ WORK_DIR = (".story", "work", "排纲")
45
+ # 包外按条件可读:(文件, 小节或 None=整份, 条件)。条件由执行者读 `设定/` 判断。
46
+ CROSS_BOOK = ("cross-book-recall.md", None, "`设定/题材定位.md`「对标登记」里有 2 本及以上对标书")
47
+ INSPIRATION = ("cross-book-recall.md", "公共灵感标签召回", "工作区有 `灵感库/`(零命中不阻塞)")
48
+ CONDITIONAL = {
49
+ "world": [("female-audience-writing.md", None, "本书是女频"), CROSS_BOOK, INSPIRATION],
50
+ "volume": [CROSS_BOOK, ("emotional-arc-design.md", "六种弧线速查", "情绪弧线选型拿不准"),
51
+ ("long-reversal.md", "反转类型", "本卷规划了反转"), INSPIRATION],
52
+ "outline": [CROSS_BOOK, INSPIRATION],
53
+ }
54
+
55
+
56
+ def read_reference(name: str) -> str:
57
+ path = REFERENCES / name
58
+ if not path.is_file():
59
+ raise SystemExit(f"ERROR: 缺少 reference:{path}")
60
+ return path.read_text(encoding="utf-8").lstrip("")
61
+
62
+
63
+ def section(text: str, start: str, end: str | None = None) -> str:
64
+ """取 start 标题行到 end 标题行之前(end 省略则到文末);找不到 start 就报错,不静默给空。"""
65
+ match = re.search(rf"^#+\s*{re.escape(start)}.*$", text, re.M)
66
+ if match is None:
67
+ raise SystemExit(f"ERROR: reference 里找不到小节「{start}」")
68
+ stop = re.search(rf"^#+\s*{re.escape(end)}.*$", text[match.end():], re.M) if end else None
69
+ return text[match.start(): match.end() + stop.start() if stop else len(text)].rstrip()
70
+
71
+
72
+ def new_addition_tiers() -> str:
73
+ """SKILL.md 的「新增物三级」判据:排纲、定设定都要按它分级,而任务包外的 SKILL.md 读不到。"""
74
+ text = (SKILL_ROOT / "SKILL.md").read_text(encoding="utf-8")
75
+ match = re.search(r"^> \*\*新增物三级\*\*.*?(?=^(?!>))", text, re.M | re.S)
76
+ if match is None:
77
+ raise SystemExit("ERROR: SKILL.md 里找不到「新增物三级」")
78
+ return "\n".join(line[2:] if line.startswith("> ") else line.lstrip(">") for line in match.group(0).rstrip().splitlines())
79
+
80
+
81
+ def conditional_reads(task: str) -> str:
82
+ lines = ["下面几份在包外,只在条件满足时读,只读点名的那一节(没点名读整份);条件不满足不读:"]
83
+ for name, part, when in CONDITIONAL[task]:
84
+ where = f"「{part}」一节" if part else "整份"
85
+ lines.append(f"- {when}:读 `{REFERENCES / name}` {where}")
86
+ return "\n".join(lines)
87
+
88
+
89
+ def emit(text: str, stream) -> None:
90
+ """统一按 UTF-8 写出:Windows 控制台默认 GBK/ASCII 时直接 print 中文会崩。"""
91
+ stream.buffer.write((text + "\n").encode("utf-8"))
92
+ stream.flush()
93
+
94
+
95
+ def render(sections, chosen, span, preamble) -> str:
96
+ """与 outline_view.emit 同一取法(剔除已退役条目、情绪弧线按单元截段),只是返回文本。"""
97
+ out = ["\n".join(strip_retired(preamble, False)).rstrip()] if preamble else []
98
+ for sec in sections:
99
+ if sec not in chosen:
100
+ continue
101
+ body = slice_arc(sec, span) if ("情绪弧线" in sec.title or "排班" in sec.title) else sec.lines
102
+ out.append("\n".join(strip_retired(body, False)).rstrip())
103
+ return "\n\n".join(out) + "\n"
104
+
105
+
106
+ def unit_closures(project: Path, first: int, last: int) -> list[tuple[str, str]]:
107
+ """story-architect 没有执行命令的权限:由脚本先把覆盖本批章节的剧情单元闭包取出来放进包里。
108
+
109
+ 取法同 `outline_view.py --unit U --stage outline`;一卷里有几个单元时,卷契约与卷级常任只随第一个单元给一次。"""
110
+ found: list[tuple[str, str]] = []
111
+ covered: set[int] = set()
112
+ undeclared: list[str] = []
113
+ for volume in sorted((project / "大纲").glob("卷纲_第*卷.md")):
114
+ lines, sections = parse_volume(volume.read_text(encoding="utf-8"))
115
+ # 单元卡有标题、没写作用域行时取段器认不出它——点名缺哪一行,而不是笼统说找不到单元。
116
+ undeclared += [f"{volume.name}「{s.title.strip()}」" for s in sections
117
+ if s.scope is None and s.unit and "剧情单元" in s.title]
118
+ if any(s.scope and (s.kind is None or (s.kind != "卷级常任" and s.unit is None)) for s in sections):
119
+ raise SystemExit(f"ERROR: {volume.name} 作用域声明无效,先跑 outline_view.py --check 修正")
120
+ active = [s for s in sections if s.status != "已退役"]
121
+ shared = [s for s in active if s.kind == "卷级常任" or s.scope is None]
122
+ units = sorted({s.unit for s in active if s.unit and s.kind == "单元级"})
123
+ given = False
124
+ for unit in units:
125
+ span = unit_chapter_range(active, unit)
126
+ if not (span and span[0] <= last and span[1] >= first):
127
+ continue
128
+ covered.update(range(span[0], span[1] + 1))
129
+ live = [s for s in active if s.unit == unit and s.kind in ("单元级", "批次底稿")]
130
+ if given:
131
+ text = "(卷契约与卷级常任同上一段,不重复。)\n\n" + render(sections, set(live), span, None)
132
+ else:
133
+ text = render(sections, set(shared + live), span, lines[:sections[0].start] if sections else None)
134
+ given = True
135
+ found.append((f"{volume.name} · 单元 {unit}(第{span[0]}-{span[1]}章)", text))
136
+ missing = [n for n in range(first, last + 1) if n not in covered]
137
+ if missing:
138
+ hint = (f";这些单元卡缺「> 作用域:单元级 {{单元ID}}」声明行:{'、'.join(undeclared)}"
139
+ if undeclared else "(单元卡要写「> 作用域:单元级 {单元ID}」和「章节范围:第A-B章」)")
140
+ where = "找不到覆盖" if not found else "剧情单元只覆盖了一部分,缺覆盖"
141
+ raise SystemExit(f"ERROR: 卷纲里{where}第{compress(missing)}章的剧情单元{hint},先补卷纲"
142
+ "(`outline_view.py --check --strict` 列出全部问题)")
143
+ return found
144
+
145
+
146
+ def compress(numbers: list[int]) -> str:
147
+ """[4, 5, 6, 9] → 4-6、9"""
148
+ spans, start = [], numbers[0]
149
+ for prev, cur in zip(numbers, numbers[1:] + [None]):
150
+ if cur != prev + 1:
151
+ spans.append(f"{start}-{prev}" if start != prev else f"{start}")
152
+ start = cur
153
+ return "、".join(spans)
154
+
155
+
156
+ def weight(text: str) -> int:
157
+ return len(re.sub(r"\s", "", text))
158
+
159
+
160
+ def build(task: str, volume: int | None, chapters: tuple[int, int] | None,
161
+ project: Path | None = None, rules_only: bool = False) -> tuple[str, list[str]]:
162
+ outside = "写作技法只读本包,外加包末「按条件可读」里条件满足的那几节。"
163
+ if task == "world":
164
+ head = ("# 任务包:出核心设定提案\n\n"
165
+ "按下面 Phase 2 的流程,把核心设定写成文件:`设定/题材定位.md`(在定方向时已写的部分上补全,不删作者已定的内容)、"
166
+ "`设定/关系.md`、主角与关键角色的 `设定/角色/{名}.md`、影响全书的 `设定/世界观/{主题}.md`。"
167
+ "作者在定方向时说过的话都在 `设定/题材定位.md`,先读它;拿不准的写成二选一的候选留给作者定,不替作者拍板,"
168
+ "物价、收入、力量档位这类全书刻度按下附「新增物三级」属先问作者,只给候选。"
169
+ f"不出卷纲、不写正文。{outside}交付后只回:写了哪些文件、主角与核心冲突各一句、"
170
+ "要作者定的事(没有写「无」)。")
171
+ setup = read_reference("workflow-setup.md")
172
+ parts = [("workflow-setup.md(Phase 2 与设定模板)",
173
+ section(setup, "Phase 2:核心设定", "Agent 调用:story-architect + character-designer") + "\n\n"
174
+ + section(setup, "定设定时建的文件模板")),
175
+ ("character-basics.md", read_reference("character-basics.md")),
176
+ ("long-genre-mechanics.md(核心梗三层递进设计)",
177
+ section(read_reference("long-genre-mechanics.md"), "核心梗三层递进设计", "微创新与差异化设计")),
178
+ ("character-relations.md(人物关系类型)",
179
+ section(read_reference("character-relations.md"), "人物关系类型", "感情流人设核心法")),
180
+ ("reader-contract-and-progression.md", read_reference("reader-contract-and-progression.md"))]
181
+ elif task == "volume":
182
+ label = f"第{volume}卷" if volume else "本卷"
183
+ head = (f"# 任务包:出{label}卷纲\n\n"
184
+ f"只交付全书体量与阶段总览(`大纲/大纲.md`,已有就只补本卷相关部分)和 `大纲/卷纲_第{volume or 'X'}卷.md`,"
185
+ "不出细纲、不写正文、不建 `追踪/`。本书方向、设定、对标登记与作者已定的事读 `设定/`(先读 "
186
+ f"`设定/题材定位.md`)。{outside}交付后只回:写了哪些文件、排纲自查 1–4 "
187
+ "的结论各一句、要作者定的事(没有写「无」)。")
188
+ parts = [("workflow-volume.md", read_reference("workflow-volume.md")),
189
+ ("artifact-protocols.md", read_reference("artifact-protocols.md")),
190
+ ("emotional-methods.md(长篇单元情绪引擎)",
191
+ section(read_reference("emotional-methods.md"), "长篇单元情绪引擎", "决策路由")),
192
+ ("reader-contract-and-progression.md", read_reference("reader-contract-and-progression.md"))]
193
+ else:
194
+ first, last = chapters
195
+ head = (f"# 任务包:出第{first}-{last}章细纲\n\n"
196
+ f"只交付 `大纲/细纲_第{first:03d}章` 到第{last:03d}章,以及排纲底稿与必要的设定补全,不写正文、"
197
+ "不建 `追踪/`。本批涉及的卷纲单元段附在包末(已按单元取好),卷纲本身不整读;设定从 `设定/` 定点读;"
198
+ f"{outside}交付后只回:写了哪些文件、"
199
+ "每章一句核心事件、要作者定的事(没有写「无」)。")
200
+ basics = read_reference("character-basics.md")
201
+ parts = [("workflow-outline.md", read_reference("workflow-outline.md")),
202
+ ("character-basics.md(主角卡、配角卡)", section(basics, "第1节:主角卡", "第3节"))]
203
+ if first <= 3:
204
+ parts.append(("opening-design.md", read_reference("opening-design.md")))
205
+ if not rules_only:
206
+ parts += [(f"卷纲取段:{name}", text) for name, text in unit_closures(project, first, last)]
207
+ parts.append(("SKILL.md(新增物三级)", new_addition_tiers()))
208
+ parts.append(("按条件可读(包外)", conditional_reads(task)))
209
+ body = [head + ("\n\n包里流程写到的脚本命令(取段、`--check`、`check-outline-contract.js`)由主会话在你交付后跑,"
210
+ "你不执行命令;需要的取段结果已放进包里。")]
211
+ for name, text in parts:
212
+ body.append(f"\n---\n\n<!-- 资料:{name} -->\n\n{text.strip()}\n")
213
+ return "\n".join(body), [name for name, _ in parts]
214
+
215
+
216
+ def parse_range(value: str) -> tuple[int, int]:
217
+ match = re.fullmatch(r"\s*(\d+)\s*(?:-\s*(\d+))?\s*", value or "")
218
+ if not match:
219
+ raise SystemExit("ERROR: --chapters 写成 A-B,如 1-10")
220
+ first = int(match.group(1))
221
+ last = int(match.group(2) or first)
222
+ if first < 1 or last < first:
223
+ raise SystemExit("ERROR: --chapters 范围无效")
224
+ return first, last
225
+
226
+
227
+ def main(argv=None) -> int:
228
+ parser = argparse.ArgumentParser(description="拼出 story-architect 出卷纲/细纲的任务包")
229
+ parser.add_argument("--project", required=True, type=Path, help="书目录")
230
+ parser.add_argument("--task", required=True, choices=("world", "volume", "outline"))
231
+ parser.add_argument("--volume", type=int, help="卷号(volume 任务)")
232
+ parser.add_argument("--chapters", help="章节范围 A-B(outline 任务)")
233
+ parser.add_argument("--rules-only", action="store_true", help="只拼规则部分、不取本书卷纲(预算守卫计量用)")
234
+ args = parser.parse_args(argv)
235
+ try:
236
+ if not args.project.is_dir():
237
+ raise SystemExit(f"ERROR: 书目录不存在:{args.project}")
238
+ chapters = parse_range(args.chapters) if args.task == "outline" else None
239
+ if args.task == "outline" and chapters[1] - chapters[0] >= 10:
240
+ raise SystemExit("ERROR: 一批细纲最多 10 章,拆成两批")
241
+ text, included = build(args.task, args.volume, chapters, args.project, args.rules_only)
242
+ except SystemExit as exc:
243
+ emit(str(exc), sys.stderr)
244
+ return 2
245
+ out_dir = args.project.joinpath(*WORK_DIR)
246
+ out_dir.mkdir(parents=True, exist_ok=True)
247
+ if args.task == "world":
248
+ name = "核心设定.md"
249
+ elif args.task == "volume":
250
+ name = f"卷纲_第{args.volume}卷.md" if args.volume else "卷纲.md"
251
+ else:
252
+ name = f"细纲_第{chapters[0]:03d}-{chapters[1]:03d}章.md"
253
+ out = out_dir / name
254
+ out.write_text(text, encoding="utf-8")
255
+ emit(json.dumps({"brief": str(out), "chars": weight(text), "includes": included}, ensure_ascii=False), sys.stdout)
256
+ return 0
257
+
258
+
259
+ if __name__ == "__main__":
260
+ sys.exit(main())