@oh-story/dsh 0.1.8 → 0.1.10

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 (360) hide show
  1. package/README.md +14 -14
  2. package/lib/client.js +237 -84
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +183 -77
  5. package/lib/drama/skills/short-drama/SKILL.md +5 -1
  6. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +140 -9
  7. package/lib/drama/skills/short-drama/scripts/project_tool.py +11 -0
  8. package/lib/drama/skills/short-drama-assets/references/character-and-look.md +28 -0
  9. package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +8 -2
  10. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +28 -0
  11. package/lib/drama/skills/short-drama-edit/SKILL.md +146 -0
  12. package/lib/drama/skills/short-drama-edit/agents/openai.yaml +4 -0
  13. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +60 -0
  14. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +15 -0
  15. package/lib/drama/skills/short-drama-edit/assets/remotion/remotion.config.ts +6 -0
  16. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +26 -0
  17. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +88 -0
  18. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +46 -0
  19. package/lib/drama/skills/short-drama-edit/assets/remotion/src/index.ts +4 -0
  20. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +32 -0
  21. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +13 -0
  22. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +43 -0
  23. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +38 -0
  24. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +29 -0
  25. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +54 -0
  26. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +60 -0
  27. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +51 -0
  28. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1156 -0
  29. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +520 -0
  30. package/lib/drama/skills/short-drama-image-prompts/SKILL.md +2 -0
  31. package/lib/drama/skills/short-drama-image-prompts/assets/image-prompts.md +5 -0
  32. package/lib/drama/skills/short-drama-image-prompts/assets/lookdev-prompts.md +3 -0
  33. package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +11 -0
  34. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +2 -2
  35. package/lib/drama/skills/short-drama-novel-analyze/references/chapter-extraction.md +4 -1
  36. package/lib/drama/skills/short-drama-produce/SKILL.md +29 -4
  37. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +22 -0
  38. package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +13 -12
  39. package/lib/drama/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
  40. package/lib/drama/skills/short-drama-produce/references/providers/seedance.md +7 -0
  41. package/lib/drama/skills/short-drama-produce/scripts/fixture_adapter.py +18 -1
  42. package/lib/drama/skills/short-drama-produce/scripts/production_tool.py +181 -2
  43. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +199 -3
  44. package/lib/drama/skills/short-drama-review/SKILL.md +2 -0
  45. package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +7 -0
  46. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +10 -0
  47. package/lib/drama/skills/short-drama-storyboard/SKILL.md +12 -1
  48. package/lib/drama/skills/short-drama-storyboard/assets/keyframe-prompts.md +4 -0
  49. package/lib/drama/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
  50. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +78 -2
  51. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +2 -0
  52. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +12 -5
  53. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +17 -0
  54. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +76 -7
  55. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +5 -2
  56. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +21 -0
  57. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +6 -17
  58. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +12 -3
  59. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +61 -5
  60. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +3 -3
  61. package/lib/drama/skills/short-drama-write/SKILL.md +11 -2
  62. package/lib/drama/skills/short-drama-write/references/screenplay-format.md +6 -0
  63. package/lib/drama/skills/short-drama-write/references/stage-contract.md +1 -0
  64. package/lib/index.js +290 -90
  65. package/lib/index.js.map +4 -4
  66. package/lib/novel-to-game/README.md +299 -59
  67. package/lib/novel-to-game/README_ZH.md +299 -56
  68. package/lib/novel-to-game/VERSION +1 -1
  69. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +3 -1
  70. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +11 -3
  71. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +397 -8
  72. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +0 -31
  73. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +71 -73
  74. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +78 -89
  75. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +37 -14
  76. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +5 -5
  77. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -1
  78. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +11 -16
  79. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +11 -11
  80. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +23 -0
  81. package/lib/novel-to-game/manifest.json +77 -87
  82. package/lib/novel-to-game/skills/game-art-direction/SKILL.md +9 -35
  83. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +27 -106
  84. package/lib/novel-to-game/skills/game-build/SKILL.md +17 -35
  85. package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +24 -0
  86. package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +45 -82
  87. package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +14 -45
  88. package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +30 -65
  89. package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +13 -27
  90. package/lib/novel-to-game/skills/game-concept/SKILL.md +16 -34
  91. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +28 -75
  92. package/lib/novel-to-game/skills/game-qa/SKILL.md +9 -20
  93. package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +10 -6
  94. package/lib/novel-to-game/skills/game-world-design/SKILL.md +19 -32
  95. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +23 -72
  96. package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +14 -48
  97. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +36 -103
  98. package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +9 -18
  99. package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +4 -4
  100. package/lib/novel-to-game/skills/novel-to-game/SKILL.md +10 -27
  101. package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +5 -6
  102. package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +6 -11
  103. package/lib/oh-story/manifest.json +419 -254
  104. package/lib/oh-story/roles/chapter-extractor.md +177 -237
  105. package/lib/oh-story/roles/character-designer.md +1 -1
  106. package/lib/oh-story/roles/consistency-checker.md +4 -4
  107. package/lib/oh-story/roles/narrative-writer.md +56 -243
  108. package/lib/oh-story/roles/story-architect.md +6 -6
  109. package/lib/oh-story/roles/story-explorer.md +11 -11
  110. package/lib/oh-story/skills/story/SKILL.md +13 -7
  111. package/lib/oh-story/skills/story/VERSION +1 -1
  112. package/lib/oh-story/skills/story/references/author-memory.md +61 -29
  113. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +934 -170
  114. package/lib/oh-story/skills/story-cover/SKILL.md +10 -1
  115. package/lib/oh-story/skills/story-deslop/SKILL.md +54 -229
  116. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +29 -56
  117. package/lib/oh-story/skills/story-deslop/references/author-memory.md +61 -29
  118. package/lib/oh-story/skills/story-deslop/references/banned-words.md +3 -1
  119. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +154 -0
  120. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +27 -0
  121. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +934 -170
  122. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +6 -1
  123. package/lib/oh-story/skills/story-deslop/scripts/check-degeneration.js +39 -20
  124. package/lib/oh-story/skills/story-deslop/scripts/normalize-punctuation.js +10 -5
  125. package/lib/oh-story/skills/story-deslop/scripts/style-whitelist.js +39 -0
  126. package/lib/oh-story/skills/story-import/SKILL.md +78 -82
  127. package/lib/oh-story/skills/story-import/references/character-state-reverse.md +1 -1
  128. package/lib/oh-story/skills/story-import/references/format-and-structure.md +2 -2
  129. package/lib/oh-story/skills/story-import/references/state-tracking.md +4 -69
  130. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +10 -8
  131. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +31 -0
  132. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +9 -34
  133. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +197 -15
  134. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +210 -2
  135. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +3 -0
  136. package/lib/oh-story/skills/story-long-analyze/SKILL.md +91 -258
  137. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +245 -0
  138. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +2 -2
  139. package/lib/oh-story/skills/story-long-analyze/references/inspiration-library.md +105 -0
  140. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +113 -105
  141. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +169 -125
  142. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +172 -64
  143. package/lib/oh-story/skills/story-long-analyze/references/semantic-acceptance-fixtures.md +84 -0
  144. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +42 -132
  145. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +5 -5
  146. package/lib/oh-story/skills/story-long-analyze/scripts/build_chapter_index.py +466 -0
  147. package/lib/oh-story/skills/story-long-analyze/scripts/inspect_existing_assets.py +702 -0
  148. package/lib/oh-story/skills/story-long-analyze/scripts/inspiration_index.py +864 -0
  149. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +1106 -0
  150. package/lib/oh-story/skills/story-long-analyze/scripts/render_relation_chart.py +425 -0
  151. package/lib/oh-story/skills/story-long-scan/SKILL.md +4 -1
  152. package/lib/oh-story/skills/story-long-write/SKILL.md +52 -216
  153. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +29 -56
  154. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +72 -12
  155. package/lib/oh-story/skills/story-long-write/references/author-memory.md +61 -29
  156. package/lib/oh-story/skills/story-long-write/references/banned-words.md +3 -1
  157. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +20 -0
  158. package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +26 -0
  159. package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +10 -4
  160. package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +2 -2
  161. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +6 -15
  162. package/lib/oh-story/skills/story-long-write/references/long-format.md +2 -0
  163. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +2 -0
  164. package/lib/oh-story/skills/story-long-write/references/project-files.md +110 -0
  165. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +12 -4
  166. package/lib/oh-story/skills/story-long-write/references/reference-index.md +86 -0
  167. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -1
  168. package/lib/oh-story/skills/story-long-write/references/style-craft.md +9 -29
  169. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  170. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +27 -0
  171. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +31 -0
  172. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +9 -34
  173. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +88 -118
  174. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +55 -119
  175. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +15 -11
  176. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +73 -54
  177. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +22 -0
  178. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +63 -4
  179. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +934 -170
  180. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +531 -0
  181. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +6 -1
  182. package/lib/oh-story/skills/story-long-write/scripts/check-degeneration.js +39 -20
  183. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +197 -15
  184. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +90 -23
  185. package/lib/oh-story/skills/story-long-write/scripts/normalize-punctuation.js +10 -5
  186. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +285 -0
  187. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +58 -0
  188. package/lib/oh-story/skills/story-long-write/scripts/style-whitelist.js +39 -0
  189. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +210 -2
  190. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +3 -0
  191. package/lib/oh-story/skills/story-review/SKILL.md +80 -87
  192. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +29 -56
  193. package/lib/oh-story/skills/story-review/references/author-memory.md +61 -29
  194. package/lib/oh-story/skills/story-review/references/banned-words.md +3 -1
  195. package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +10 -4
  196. package/lib/oh-story/skills/story-review/references/review-quality.md +6 -12
  197. package/lib/oh-story/skills/story-review/references/style-resolution.md +27 -0
  198. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +31 -0
  199. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +9 -34
  200. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +934 -170
  201. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +6 -1
  202. package/lib/oh-story/skills/story-review/scripts/check-degeneration.js +39 -20
  203. package/lib/oh-story/skills/story-review/scripts/normalize-punctuation.js +10 -5
  204. package/lib/oh-story/skills/story-review/scripts/style-whitelist.js +39 -0
  205. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +210 -2
  206. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +3 -0
  207. package/lib/oh-story/skills/story-setup/SKILL.md +58 -43
  208. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +29 -56
  209. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +3 -1
  210. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +154 -0
  211. package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +10 -4
  212. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +2 -2
  213. package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +2 -2
  214. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +1 -1
  215. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +1 -1
  216. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -1
  217. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  218. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +27 -0
  219. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +63 -4
  220. package/lib/oh-story/skills/story-setup/references/diagnostics.md +38 -0
  221. package/lib/oh-story/skills/story-short-analyze/SKILL.md +22 -3
  222. package/lib/oh-story/skills/story-short-analyze/references/analysis-writing-techniques.md +1 -1
  223. package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +5 -1
  224. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +2 -2
  225. package/lib/oh-story/skills/story-short-scan/SKILL.md +5 -1
  226. package/lib/oh-story/skills/story-short-write/SKILL.md +15 -324
  227. package/lib/oh-story/skills/story-short-write/references/author-memory.md +61 -29
  228. package/lib/oh-story/skills/story-short-write/references/banned-words.md +3 -1
  229. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +60 -0
  230. package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +10 -4
  231. package/lib/oh-story/skills/story-short-write/references/genre-styles//344/270/226/346/203/205/346/211/223/350/204/270.md +2 -2
  232. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/217/214/347/224/267/344/270/273.md +1 -1
  233. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/244/215/344/273/207/346/211/223/350/204/270.md +3 -3
  234. package/lib/oh-story/skills/story-short-write/references/genre-styles//345/256/205/346/226/227/345/256/253/346/226/227.md +3 -3
  235. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/200/273/350/243/201/350/261/252/351/227/250.md +3 -3
  236. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/202/254/347/226/221.md +5 -5
  237. package/lib/oh-story/skills/story-short-write/references/genre-styles//346/260/221/344/277/227/346/200/252/350/260/210.md +4 -4
  238. package/lib/oh-story/skills/story-short-write/references/genre-styles//347/224/234/345/256/240.md +5 -5
  239. package/lib/oh-story/skills/story-short-write/references/genre-styles//350/277/275/345/246/273/347/201/253/350/221/254/345/234/272.md +3 -3
  240. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +1 -1
  241. package/lib/oh-story/skills/story-short-write/references/genre-writing-techniques.md +1 -1
  242. package/lib/oh-story/skills/story-short-write/references/reference-index.md +55 -0
  243. package/lib/oh-story/skills/story-short-write/references/short-craft.md +12 -14
  244. package/lib/oh-story/skills/story-short-write/references/short-deslop.md +10 -10
  245. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -1
  246. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -2
  247. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +27 -0
  248. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +78 -0
  249. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +126 -0
  250. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +32 -0
  251. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +5 -5
  252. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +934 -170
  253. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +6 -1
  254. package/lib/oh-story/skills/story-short-write/scripts/check-degeneration.js +39 -20
  255. package/lib/oh-story/skills/story-short-write/scripts/check-delivery-contract.js +34 -5
  256. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +90 -23
  257. package/lib/oh-story/skills/story-short-write/scripts/normalize-punctuation.js +10 -5
  258. package/lib/oh-story/skills/story-short-write/scripts/style-whitelist.js +39 -0
  259. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  260. package/lib/types/client/file-activity.d.ts +19 -1
  261. package/lib/types/client/file-activity.d.ts.map +1 -1
  262. package/lib/types/client/index.d.ts.map +1 -1
  263. package/lib/types/client/production-prompts.d.ts +7 -0
  264. package/lib/types/client/production-prompts.d.ts.map +1 -1
  265. package/lib/types/client/production-runtime.d.ts +33 -0
  266. package/lib/types/client/production-runtime.d.ts.map +1 -1
  267. package/lib/types/drama-adapters.d.ts +5 -3
  268. package/lib/types/drama-adapters.d.ts.map +1 -1
  269. package/lib/types/native-hooks.d.ts +52 -0
  270. package/lib/types/native-hooks.d.ts.map +1 -1
  271. package/lib/types/role-identity.d.ts +17 -0
  272. package/lib/types/role-identity.d.ts.map +1 -0
  273. package/lib/types/role-tool.d.ts.map +1 -1
  274. package/lib/types/skill-provider.d.ts.map +1 -1
  275. package/lib/video-recap/CHANGELOG.md +31 -1
  276. package/lib/video-recap/manifest.json +162 -162
  277. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +4 -9
  278. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +47 -60
  279. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +77 -115
  280. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +41 -40
  281. package/lib/video-recap/skills/video-assemble/scripts/audio_automation.py +22 -32
  282. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +102 -192
  283. package/lib/video-recap/skills/video-assemble/scripts/jianying_builders.py +14 -35
  284. package/lib/video-recap/skills/video-assemble/scripts/jianying_model.py +14 -12
  285. package/lib/video-recap/skills/video-assemble/scripts/jianying_optional.py +8 -9
  286. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +3 -14
  287. package/lib/video-recap/skills/video-assemble/scripts/jianying_timeline_contract.py +23 -12
  288. package/lib/video-recap/skills/video-assemble/scripts/jianying_tracks.py +1 -4
  289. package/lib/video-recap/skills/video-assemble/scripts/jianying_writer.py +24 -25
  290. package/lib/video-recap/skills/video-assemble/scripts/lib.py +31 -85
  291. package/lib/video-recap/skills/video-assemble/scripts/media.py +100 -144
  292. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +101 -195
  293. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +10 -21
  294. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +90 -169
  295. package/lib/video-recap/skills/video-assemble/scripts/subtitle_core.py +69 -122
  296. package/lib/video-recap/skills/video-assemble/scripts/subtitle_render.py +10 -17
  297. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +33 -48
  298. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +14 -20
  299. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +135 -213
  300. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +49 -57
  301. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +38 -74
  302. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +46 -95
  303. package/lib/video-recap/skills/video-cut/scripts/lib.py +23 -25
  304. package/lib/video-recap/skills/video-cut/scripts/media_geometry.py +70 -173
  305. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +28 -53
  306. package/lib/video-recap/skills/video-cut/scripts/sentence_boundaries.py +162 -322
  307. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +6 -7
  308. package/lib/video-recap/skills/video-recap/scripts/doctor.py +104 -124
  309. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +255 -412
  310. package/lib/video-recap/skills/video-recap/scripts/lib.py +30 -52
  311. package/lib/video-recap/skills/video-recap/scripts/materials.py +97 -120
  312. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_client.py +7 -12
  313. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_evidence.py +46 -97
  314. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_observations.py +18 -36
  315. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_payload.py +29 -47
  316. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_report.py +43 -76
  317. package/lib/video-recap/skills/video-recap/scripts/mimo_qc_runner.py +2 -1
  318. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +2 -1
  319. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +2 -2
  320. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +129 -145
  321. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +27 -20
  322. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +20 -31
  323. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +31 -106
  324. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +43 -113
  325. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +196 -377
  326. package/lib/video-recap/skills/video-script/scripts/agent_brief.py +1 -1
  327. package/lib/video-recap/skills/video-script/scripts/agent_text.py +63 -172
  328. package/lib/video-recap/skills/video-script/scripts/brief_context.py +80 -135
  329. package/lib/video-recap/skills/video-script/scripts/brief_inputs.py +125 -167
  330. package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +93 -208
  331. package/lib/video-recap/skills/video-script/scripts/deslop_qc.py +20 -46
  332. package/lib/video-recap/skills/video-script/scripts/lib.py +30 -26
  333. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +145 -140
  334. package/lib/video-recap/skills/video-script/scripts/review_response.py +12 -42
  335. package/lib/video-recap/skills/video-script/scripts/review_runner.py +0 -6
  336. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +39 -100
  337. package/lib/video-recap/skills/video-script/scripts/timeline_fusion.py +33 -124
  338. package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +1 -1
  339. package/lib/video-recap/skills/video-understanding/scripts/agent_text.py +63 -172
  340. package/lib/video-recap/skills/video-understanding/scripts/asr.py +1 -2
  341. package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +80 -135
  342. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +125 -167
  343. package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +93 -208
  344. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +1 -1
  345. package/lib/video-recap/skills/video-understanding/scripts/deslop_qc.py +20 -46
  346. package/lib/video-recap/skills/video-understanding/scripts/lib.py +31 -26
  347. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +145 -140
  348. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +39 -100
  349. package/lib/video-recap/skills/video-understanding/scripts/timeline_fusion.py +33 -124
  350. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +1 -4
  351. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +7 -13
  352. package/lib/video-recap/skills/video-voiceover/scripts/fish_audio.py +12 -30
  353. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +98 -131
  354. package/lib/video-recap/skills/video-voiceover/scripts/tts_audio.py +17 -28
  355. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +151 -240
  356. package/package.json +45 -45
  357. package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +0 -59
  358. package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +0 -53
  359. package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -42
  360. package/lib/oh-story/skills/story-long-write/references/state-tracking.md +0 -108
@@ -1,329 +1,162 @@
1
1
  ---
2
2
  name: story-long-analyze
3
3
  version: 1.0.0
4
- description: "长篇网文拆文。深度拆解爆款长篇小说的黄金三章、人设架构、爽点设计、节奏控制。单一深度拆解管道:跑完黄金三章(Stage 1)后产出快速预览报告并询问是否继续全量拆解,确认后从 Stage 2 续跑逐章摘要、聚合分析、设定关系、汇总报告,全程产物落盘 拆文库/{书名}/。触发方式:/story-long-analyze、/长篇拆文、「帮我拆这本书」「拆这本书」「分析黄金三章」「深度拆解」「完整拆解」「系统拆解」或提供小说文本文件路径——全部进入同一管道。"
4
+ description: "长篇网文拆文。保留黄金三章、逐章摘要、剧情、情绪、节奏、角色、设定和文风接口,以连续章节块完成因果、双时间线、关系与三维节奏分析;兼容旧成果直接使用、按需增强和断点续跑。含可选三层灵感库管道(灵感库、跨书灵感聚合、更新灵感库)。触发方式:/story-long-analyze、/长篇拆文、「帮我拆这本书」「拆这本书」「分析黄金三章」「深度拆解」「完整拆解」或提供小说文本文件路径。"
5
5
  metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudecode"}}
6
6
  ---
7
7
  # story-long-analyze:长篇网文拆文
8
8
 
9
9
  你是网络小说结构分析师。
10
10
 
11
- **核心信念:看懂别人的爆款,才能写出自己的爆款。**
11
+ **核心原则:机械边界只解析一次;原文按连续章节块读取一次;同次读取产生逐章事实和跨章观察;聚合阶段复用落盘结果,不重新阅读全文。**
12
12
 
13
- ---
14
-
15
- > Agent 兼容性:只检查当前运行时的 canonical 目录:Claude `.claude/agents/{agent}.md`、OpenCode `.opencode/agents/{agent}.md`、Codex `.codex/agents/{agent}.toml`、Antigravity `.agents/agents/agent-name/agent.md`(`agent-name` 为目标 agent 名),不得因其他端文件存在而误判。Codex 使用同名 `agent_type`;Antigravity 使用 `invoke_subagent` + `TypeName`。对应运行时未暴露 custom-agent registry / `invoke_subagent` 或返回未知 agent 时,必须降级 solo/direct。检测到 `.zcode/` 时同样直接 solo/direct,因为 ZCode 3.3.4 不执行项目 custom agents;报告 `Fallback: project custom agents unavailable -> solo`。Claude/OpenCode 兼容面保留 `subagent_type`。
13
+ > Agent 兼容性:只检查当前运行时 canonical 目录。运行时不支持项目 agent 或找不到文件时降级 solo/direct,并报告 `Fallback: project custom agents unavailable -> solo`。ZCode 3.3.4 不提供项目 custom agents,直接按此规则降级,不扫描其他 CLI 的 agent 目录。
16
14
  >
17
- > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 29` 不一致时(标记缺失、字段缺失/非整数、小于或大于 29)**照常按文件存在性检查并 spawn**,同时报告 `Notice: agents bundle 版本不匹配(项目 {N},本版 29)` 并提示重新运行 `/story-setup` 后新开会话;大于 29 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct,报告 `Fallback: ... -> solo`。
18
-
19
- ## 拆解边界声明(主线程同样适用)
20
-
21
- 你亲手做的**黄金三章深度拆解(Stage 1)、Stage 2 串行降级逐章处理、以及 Stage 3-6 的聚合/设定/报告/文风合成**,与 chapter-extractor 子代理遵循同一逻辑:拆的是用户**合法持有、拥有使用权**的虚构作品(已出版/连载或自有),性质是**只读的转化性文学批评**(编辑/评论/写作教学视角,不复制、不传播、不指导现实行为)。通俗题材里的家暴、出轨、复仇、暴力、情爱张力、黑暗伦理是常规虚构叙事元素,须照常做结构化提取,**不得以「敏感」「不适」为由拒绝整章或整本**——主线程拒绝会让整条自动化流水线停摆;个别片段无法处理则跳过、照常续完其余。
22
-
23
- ---
24
-
25
- ## Phase 1:确认拆解对象 + 进入管道
26
-
27
- 问用户:**「你要拆哪本书?(书名+平台)有原文文件路径吗?」**
28
-
29
- 如果没有明确目标,按题材或用户想写的类型推荐 2-3 本对标作品。
30
-
31
- ### 统一入口
32
-
33
- 确认拆解对象后直接进入拆解管道(Phase 2)。**没有快速/深度分叉**——只有一条深度拆解管道,跑到 Stage 1(黄金三章)后自动停靠产出快速预览报告。
34
-
35
- **无文本路径时**:如果用户没有提供原文文件路径、也没有在对话中贴出原文,引导用户提供原文——「请提供这本书的原文文件路径,或直接把原文贴给我,我从黄金三章开始拆。」拿到原文后进入管道。
36
-
37
- ---
38
-
39
- ## Phase 2:深度拆解管道
40
-
41
- ### 输出目录
42
-
43
- 默认输出到 `拆文库/{书名}/`(项目根目录下)。用户指定了其他路径时按用户指定路径输出。
15
+ > Spawn 版本提示(不阻断 spawn):先读取项目根 `.story-deployed` 的 `agents_version`。与本版 `agents_version: 32` 不一致时(标记缺失、字段缺失/非整数、小于或大于 32)照常按文件存在性检查并 spawn,同时报告 `Notice: agents bundle 版本不匹配(项目 {N},本版 32)` 并提示重新运行 `/story-setup` 后新开会话;大于 32 时额外提示先更新 oh-story-claudecode,不要用本地旧版 setup 降级覆盖。只有 agent 文件缺失、或运行时不暴露 custom agent 时才降级 solo/direct。
44
16
 
45
- ### 已有分析利用
17
+ ## 分析边界
46
18
 
47
- **深度拆解开始前,检查是否已有部分拆解结果**:
19
+ 1. 只根据可读原文和已有资料下结论;缺失写“未知”或“文本未明确”。
20
+ 2. 硬事实附章节、`source_locator` 或 5–15 字定位词;推断标证据强度。
21
+ 3. 区分客观发生顺序、文本披露顺序、读者所知和角色所知。
22
+ 4. 分开分析事件推进、读者情绪和篇幅安排,分数不能代替解释。
23
+ 5. 只迁移抽象机制,不复刻专有设定、角色组合、关键事件链、标志性场面或原句。
24
+ 6. 不为填字段虚构事实,不把结果倒推成人物早有计划。
48
25
 
49
- 1. 检查 `拆文库/{书名}/` 目录下是否存在已有的拆文文件
50
- 2. 如果存在 _progress.md,读取断点信息,从断点恢复(已有恢复机制)
51
- 3. 如果存在 角色/*.md 或 设定/*.md,读取已有的角色和设定数据
52
- 4. 将已有数据作为交叉验证基线:
53
- - 新提取的角色信息与已有角色数据对比,检查一致性
54
- - 新发现的设定细节与已有设定合并,标注信息来源(新提取 vs 已有)
55
- - 如有冲突(如同角色已有文件中名字不同),在输出中标注冲突让用户裁定
56
- 5. 避免重复提取已有信息
26
+ ## 对作者说话
57
27
 
58
- ### 原文备份(管道前置步骤)
28
+ 作者读到的一切——停下来提问、进度、拆完汇报、出错说明,以及 `快速预览.md`、`拆文报告.md`、人物关系图——按 [references/author-facing.md](references/author-facing.md) 写:大白话讲书、讲章、讲读者和作者能怎么用;不出现脚本名、命令、字段名、状态值、批次编号、内部文件名、质量指标名和证据分级字母;编号只和名称一起出现;需要作者拿主意时给一个问题、推荐选项和默认值;工程细节默认不写,确需时只在末尾留一行技术备注。脚本输出带 `author_message` 时转述它,不贴 JSON 或错误码。
59
29
 
60
- **拆解开始前,必须先备份原文**:
30
+ ## Phase 1:确认对象并检查目录
61
31
 
62
- 1. 检查 `拆文库/{书名}/原文/` 目录是否已存在
63
- 2. 如果不存在,从用户提供的源路径复制原文文件到 `拆文库/{书名}/原文/`
64
- 3. 如果用户未提供源文件路径(直接在对话中贴文本),将原始文本保存到 `拆文库/{书名}/原文/原文.md`
65
- 4. 备份完成后验证:
66
- - 源文件路径模式:确认 `原文/` 目录下的文件数量和大小与源文件一致
67
- - 对话贴文本模式:确认 `原文.md` 文件非空(>0 bytes)
32
+ 没有书名或原文时询问书名、平台和原文路径;已有完整成果直接使用时不强制索要原文。已有目录先运行只读检查器:
68
33
 
69
- ### 输出目录结构
70
-
71
- ```
72
- 拆文库/{书名}/
73
- ├── 原文/
74
- │ └── 原文.txt # 扩展名随源文件;对话直接贴入的文本存为 原文.md
75
- ├── 概要.md
76
- ├── 章节/
77
- │ ├── 第1章_深度拆解.md
78
- │ ├── 第2章_深度拆解.md
79
- │ ├── 第3章_深度拆解.md
80
- │ ├── 第1章_摘要.md
81
- │ └── ...
82
- ├── 快速预览.md
83
- ├── 角色/
84
- │ ├── {角色名}.md
85
- │ └── 角色关系.md
86
- ├── 剧情/
87
- │ ├── {剧情标题}.md
88
- │ ├── README.md # 剧情目录索引:节奏/情绪模块/故事线的权威范围
89
- │ ├── 故事线.md
90
- │ ├── 节奏.md # 关键信息推进 / 爽点循环 / 情绪触动点 / 爆发节奏
91
- │ ├── 情绪模块.md # 读者需求 / 情绪引擎 / 可复现模块卡
92
- │ └── 散落情节.md
93
- ├── 设定/
94
- │ ├── 世界观/
95
- │ │ ├── 背景设定.md # 核心规则 + 特殊设定(无法独立的内容合并)
96
- │ │ ├── 力量体系.md
97
- │ │ ├── 地理.md
98
- │ │ └── 金手指.md
99
- │ └── 势力/
100
- │ └── {势力名}.md # 内容 >= 200 字时独立;不足合并到 世界观/背景设定.md
101
- ├── 拆文报告.md
102
- ├── 文风.md # Stage 6 文风:句长/标点/对话潜台词/情绪交替 + 原文锚点范例片段
103
- └── _progress.md
34
+ ```text
35
+ "{PYTHON}" "{story-long-analyze skill 根}/scripts/inspect_existing_assets.py" --root "拆文库/{书名}" --compact
104
36
  ```
105
37
 
106
- > **权威产物**:`剧情/README.md` 说明剧情目录内各文件权威范围;`剧情/节奏.md` 是节奏/关键信息推进/情绪触动点的权威索引;`剧情/情绪模块.md` 是读者需求、情绪引擎、套路框架和可复现模块卡的权威索引。`拆文报告.md` 与 `剧情/故事线.md` 只做摘要投影;若摘要与这两个文件冲突,下游写作以 `剧情/节奏.md` / `剧情/情绪模块.md` 为准。
107
-
108
- ### 管道主体:Stage 0-6
109
-
110
- 这是 story-long-analyze 唯一的执行管道。Stage 0-1 跑完后**自动停靠**产出快速预览报告(见下「Stage 1 停靠点」),用户确认后从 Stage 2 续跑。
111
-
112
- **预期耗时提示**:开始前根据章节数给用户一个粗估:<50 章通常 30-60 分钟;50-200 章通常 1-3 小时;>200 章可能需要多轮会话。Stage 2 可并行提取,但 Stage 3-6 仍依赖前序产物,需按阶段推进。
113
-
114
-
115
- | 阶段 | 名称 | 输入 | 输出 | 完成标志 |
116
- |------|------|------|------|----------|
117
- | 0 | 概要提取 | 原始文本 | 概要.md(**首版 200 字 thin first-pass** + 章节索引;full plot-aware 500-1000 字版在 Stage 5 落盘覆盖)+ **Stage 0 章节边界子步骤将边界表写入 `_progress.md`**(详见下方说明) | 章节结构识别完成 + 章节边界落盘 |
118
- | 1 | 黄金三章 | 前3章原文 | 第1章_深度拆解.md / 第2章_深度拆解.md / 第3章_深度拆解.md(每章一个文件)。非人形反派(灵气复苏/末世/国运等抽象对抗型)出现在前三章时,在本阶段一并按抽象对抗型路由分析(核心对抗面/紧迫感来源/升级机制/叙事替代)。 | 3章拆解完成 → **停靠产出快速预览.md** |
119
- | 2 | 逐章摘要 | 分块章节文本 | 章节摘要.md(含情节点+角色+**关键信息与扩写技法**+**逐章写法公式**)。逐章写法公式必须提取情绪流向、节奏配比、结构公式、核心技巧、章尾卡点与伏笔。角色过滤(龙套不提取、别名归类)。每章10-40情节点(密度150-200字/个,按字数动态调节;公式低于10时仍按硬下限10拆足关键步骤)。**并行模式:每章 spawn chapter-extractor agent**。**计数验证:摘要数 == 章节数,不等则标记失败章节**。 | 所有章节处理完成 |
120
- | 3 | 聚合分析 | 全部章节摘要 | 剧情/*.md + README.md(含权威分工表与**剧情单元清单**索引)+ 故事线.md + **节奏.md + 情绪模块.md**。**故事框架识别**(前置,决定聚合策略)。**两步法剧情聚合**(先从摘要识别剧情大纲,再按大纲分配情节点)。**关键信息推进索引**(按章节/剧情单元追踪信息如何被扩写)。**情绪触动点与爆发节奏**(爽点/虐点/期待点的铺垫→释放→余波)。**全书情绪节奏总览**(情绪折线、爽点频率、小/中/大高潮位置、冲突升级路径、跨章伏笔地图、小/中/大循环单元)。**读者需求 / 情绪引擎 / 爽文套路框架**(沉淀为可复现模块卡)。**角色合并**(跨章节去重+别名归一)。**角色分级**(主角/反派/核心配角/功能角色)。**散落情节兜底**(6步,含覆盖率验证)。**桥段标签**(每个剧情模块按 deconstruction-notes.md 桥段词表打标,best-effort,无匹配留空)。**质量检查**(阈值详见 material-decomposition.md 质量阈值体系)。 | 质量检查通过 |
121
- | 4 | 设定+关系(4a/4b/4c) | **4a**:Stage 2 情节点+章节摘要(不依赖 Stage 3,与 3 并行);**4b/4c**:Stage 3 合并后角色数据+情节点 | 设定/*.md + 角色/*.md。**4a 设定**(世界观/金手指/势力,从 Stage 2 mention 数据归纳)。**4b 角色完整档案**(两阶段模型:Stage 2 轻量提及 → Stage 4b 完整档案;别名解析置信度≥0.85自动合并)。**4c 角色关系提取**(从情节点提取,不从原文;含演变追踪+最终状态合并+隐含推断)。非人形反派在 4a 做完整抽象对抗型分析。 | 4a/4b/4c 全部完成 |
122
- | 5 | 汇总报告 | 全部输出 | 拆文报告.md(含「读者需求 / 情绪引擎」「关键信息与扩写技法总览」「全书情绪节奏总览」「节奏与情绪触动点」「循环单元」「跨章伏笔地图」「冲突升级路径」「可复现模块」摘要,并指向 `剧情/节奏.md` / `剧情/情绪模块.md`;含「写法技巧」清单,覆盖一笔两用/延迟揭示/视角欺骗/对比锚点/行为循环/身体反应替代心理描写/**跨章回扣**——物品/意象在不同章节承担不同功能)+ **概要.md 全书 500-1000 字版**(plot-aware,覆盖 Stage 0 的 200 字 thin first-pass) | 报告 + 全书概要生成完成 |
123
- | 6 | 文风 | 拆文报告.md + 章节/第1-3章_深度拆解.md + 章节/*_摘要.md + 原文/原文.txt | 文风.md(整书级写作技法视图:句长/标点/对话潜台词/情绪交替周期 + 4-6 段原文锚点范例片段 + 分层模仿建议,硬上限 ~4000 字。详见 [style-profile-protocol.md](references/style-profile-protocol.md) + [style-profile-generator.md](references/style-profile-generator.md)) | 文风落盘 `拆文库/{书名}/文风.md` |
124
-
125
- ### Stage 0 章节边界子步骤
126
-
127
- Stage 0 完成概要 + 章节索引之后、转入 Stage 1 之前,**必须**额外产出一份「章节边界」表写入 `_progress.md`。这是后续 Stage 1(黄金三章原文切片)/ Stage 2(每章传给 chapter-extractor agent)/ Stage 6(文风采样)共用的**唯一切片来源**——避免每个阶段各跑一次 regex 切片,结果可能不一致。
38
+ 路径错误必须停止。完整旧项目返回 `direct_use` 后直接使用,不建索引、不读原文。只有用户明确要求增强才读取旧成果。已有摘要一律不覆盖:要重拆某章就删掉它的 `章节/第N章_摘要.md` 和覆盖它的 `_analysis_cache/批次-*.md`(只删摘要会从缓存原样补回),整本重拆就换一个新目录。`schema_version` 只报告,不作为新旧门禁,也不得在复用时改写。
128
39
 
129
- 操作:
130
- - 用 `style-profile-generator.md` Step 4 的章节正则(含 千/两,覆盖 1000+ 章)grep 出全部章节行号
131
- - **先剔掉目录块**:不少原文开头带一段目录,目录里的 `第N章` 同样顶行,会和正文章节行重复命中,不处理就会切出两个「第一章」。判据是行距——目录块内相邻命中只隔一两行,正文章节之间隔着整章篇幅。算相邻命中的行号差,把文件开头那段「行距持续远小于全体中位数」的连续命中整块丢弃
132
- - **剔完仍有重复章号时不要自行取其一**:多卷书每卷从「第一章」重起是合法结构。这种情况在标题列保留卷号消歧(如 `卷二 第一章`),章号列按全书连续序号重编
133
- - 按 `| 章号 | 标题 | 起始行 | 字数 |` 四列写入 `_progress.md` 的「章节边界」section(见 [pipeline-ops.md](references/pipeline-ops.md) 模板)
134
- - 落表前校验章号连续、无重复、无跳号;不满足就停下报告,不要带着错表进 Stage 1——Stage 1/2/6 都以这张表为唯一切片真值,错一次会一路错到底
135
- - `_progress.md` 顶部 `schema_version: 2` 同时落盘
40
+ ## Phase 2:唯一管道与三种情况
136
41
 
137
- **恢复前置条件**:续跑只接受 `schema_version: 2` 且包含「章节边界」表的 `_progress.md`。缺失或结构不完整时停止续跑,提示从 Stage 0 章节边界子步骤重建进度文件,避免不同阶段使用不同切片真值。
42
+ | 情况 | 行为 |
43
+ |---|---|
44
+ | 部分完成 | 已完成章只读旧拆文;黄金三章可补缺失摘要;仅缺摘要的章进入原文块 |
45
+ | 已完整拆完 | 默认直接使用;增强只写 `_analysis_cache/` 和 `_progress.md` 状态 |
46
+ | 全新小说 | 建索引、完成黄金三章,再把其余正文放入不重叠连续章块 |
138
47
 
139
- ### Stage 1 停靠点
48
+ 检查器只扫描上游 `章节/*_摘要.md` 与黄金三章,逐章报告缺口。新旧投影混存要报告来源,但不要求重拆。
140
49
 
141
- Stage 0+1 完成后,管道**自动停靠**,产出快速预览报告并询问用户是否继续全量拆解:
50
+ ### 固定交付接口
142
51
 
143
- 1. **生成停靠交付物**:写 `拆文库/{书名}/快速预览.md`(模板见 [output-templates.md](references/output-templates.md) 的「快速预览报告」)。此时 `概要.md`、`章节/第1章_深度拆解.md`、`章节/第2章_深度拆解.md`、`章节/第3章_深度拆解.md`、`原文/` 均已落盘。
144
- 2. **写停靠状态**:`_progress.md` 的「最终状态」字段写 `paused_after_stage1`,「断点」段记录「下一操作:Stage 2 逐章摘要」。
145
- 3. **询问用户**(用 AskUserQuestion 风格的明确二选一):
146
- > 「黄金三章已拆完,快速预览报告见 `快速预览.md`。是否继续全量拆解(Stage 2-6:逐章摘要 / 聚合分析(含 `剧情/节奏.md`、`剧情/情绪模块.md`)/ 设定关系 / 汇总报告 / 文风)?预计耗时 {基于章节数粗估}。」
147
- - 选「继续全量拆解」→ 读 `_progress.md`,从 **Stage 2** 续跑,**不重跑 Stage 0/1**。
148
- - 选「就到这里」→ 管道结束,`_progress.md` 状态保持 `paused_after_stage1`,告知用户「之后可随时 `/story-long-analyze` 同一本书,会自动从 Stage 2 续跑」。
149
- 4. **跳过询问的情形**:用户在一开始就明确说「完整拆解 / 一次跑完 / 系统拆解 / 别问」时,仍生成 `快速预览.md`(保留早期判断快照),但**不停下询问**,直接从 Stage 2 续跑到 Stage 6。
52
+ - `拆文报告.md`、`概要.md`、`快速预览.md`;
53
+ - `章节/第1-3章_深度拆解.md`、`章节/第N章_摘要.md`;
54
+ - `剧情/故事线.md`、剧情单元、`节奏.md`、`情绪模块.md`、`散落情节.md`;
55
+ - `角色/`、`设定/`、`人物关系图/`、`文风.md`;
56
+ - `chapter_index.csv`、`_progress.md`、`_analysis_cache/`。
150
57
 
151
- ### Stage 5 后:选题决策回填(可选)
58
+ `拆文报告.md` 是阅读入口。剧情单元管因果事实,`剧情/节奏.md` 管信息推进与三维节奏,`剧情/情绪模块.md` 管读者需求和复现机制,`角色/角色关系.md` 管关系事实,`文风.md` 管表达层。
152
59
 
153
- `拆文报告.md` 出来后(Stage 5 跑完)执行——和 Stage 6 无关,Stage 6 失败也不影响这步。
60
+ ### Stage 0–6
154
61
 
155
- 先定位 `选题决策.md`:项目根有就用它。项目根没有 → 从项目根及其上一级目录起、向下最多 3 层按文件名搜(跳过隐藏目录),按 mtime 由新到旧取最新 3 份。回填是写文件,项目根之外的文件写之前必须先确认:搜到 1 份 → 报出路径问「把本书的拆解支撑回填进这份吗?」;搜到多份 → 用 AskUserQuestion 列候选(路径 + `扫榜日期` + 「都不回填」)。用户不选 → 记「未回填」跳过,不动任何文件。
62
+ | 阶段 | 输入 | 主要输出 | 完成判断 |
63
+ |---|---|---|---|
64
+ | 0 机械索引 | 原文 | `chapter_index.csv`、`概要.md` 初稿(Stage 5 覆盖) | 章界、逐章 hash 和全源 hash 有效 |
65
+ | 1 黄金三章 | 前三章原文 | 深度拆解、快速预览、可选 `_style-sample.txt` | 老接口完整;同次阅读保存可用样本 |
66
+ | 2 连续块提取 | 只读计划列出的旧成果或原文块 | 批次缓存;缺失逐章摘要投影 | 缓存完整、摘要存在、状态范围 hash 有效 |
67
+ | 3 剧情与机制 | 批次缓存和可信旧成果 | 剧情单元、故事线、节奏、情绪模块 | 文件存在、阶段状态完成 |
68
+ | 4 角色与设定 | 批次涉及人物、状态变化、关系观察 | 角色、设定、关系图 | 文件存在、阶段状态完成 |
69
+ | 5 主报告 | 权威底层结果 | 拆文报告、完整概要 | 文件存在、阶段状态完成 |
70
+ | 6 文风 | 既有资料、样本或索引定点原文 | `文风.md` | 文件存在、阶段状态完成 |
156
71
 
157
- **仅当**定位到 `选题决策.md`(项目根那份直接用;项目根之外的那份须经上面的确认)时:按本书题材,在它的推荐选题里找**题材关键词对得上**的那个——
158
- - 正好对上一个 → 把该选题的"能爆的原因"从 `待拆文验证` 改成带出处的支撑:「本书拆解支撑:{`拆文报告.md` 的 读者需求/情绪引擎 + `剧情/情绪模块.md` 的可复现模块 Top + `剧情/节奏.md` 的爽点/触动点节奏摘要}(`拆文库/{书名}/拆文报告.md`、`剧情/情绪模块.md`、`剧情/节奏.md`)」。注意还只是假设(只拆了一本,不算坐实)。
159
- - 对上多个 / 拿不准 → 问用户「《{书名}》对应选题决策里的哪个方向?」
160
- - 一个都对不上 → 记录「无匹配选题,未回填」,不改文件。
161
- - `选题决策.md` 缺少当前契约必需的「能爆的原因」字段 → 报告 `invalid_topic_decision_contract`,提示重跑 `story-long-scan` Phase 5 生成当前文件;不猜测、不静默回填,拆文主流程仍可完成。
162
- - 重复拆文不覆盖:只回填还标着 `待拆文验证` 的;已经填过的不动。
72
+ 用户未要求一次跑完时,Stage 1 后按 author-facing.md「开头三章拆完、停下来问」询问是否继续,并一并请作者选 Stage 2 派发方式(串行 / 有限并行 / 不限批次顺序,见 pipeline-ops「执行与提交一个批次」);作者没选、要求一次跑完、多本书一起拆或由导入自动续跑时都按有限并行(每轮 3 批),后三种情况不停下询问;续跑不重复 Stage 0/1。Stage 3–5 不重读原文。Stage 6 可按索引定点读取 4–6 段原文锚点,但不重扫全书。
163
73
 
164
- 工作区里搜不到 `选题决策.md` → 直接跳过,不影响拆文。
74
+ ## Stage 0:机械章节索引
165
75
 
166
- ### Stage 6 文风
76
+ 全新和部分完成运行:
167
77
 
168
- `文风.md` 只负责表达层风格;情绪/节奏意图仍以 `剧情/情绪模块.md` 与 `剧情/节奏.md` 为权威。
169
- 原文缺失或章节分隔符识别不出 → 在 `文风.md` 的「生成记录」写明 `文风可用:否:{原因}`。Stage 6 失败不阻断管道。
170
-
171
- ### Stage 3-4 并行执行
172
-
173
- **并行执行图**:
78
+ ```text
79
+ "{PYTHON}" "{story-long-analyze skill 根}/scripts/build_chapter_index.py" --source "{拆文目录}/原文/原文.txt" --output "{拆文目录}/chapter_index.csv" --locator-path "原文/原文.txt"
174
80
  ```
175
- Stage 3(剧情聚合 + 角色合并) ──┐
176
- ├── 4a 与 Stage 3 可并行
177
- Stage 4a(设定:世界观/金手指/势力) ──┘
178
- │
179
- ▼(Stage 3 + 4a 都完成后)
180
- Stage 4b(角色完整档案)— 串行,依赖 Stage 3 合并后的角色实体
181
- │
182
- ▼
183
- Stage 4c(角色关系提取)— 串行,依赖 4b 角色实体存在
184
- ```
185
-
186
- 4a 数据源是 Stage 2 摘要故可与 3 并行;4b/4c 依赖 Stage 3 角色合并故串行。
187
-
188
- ### 部分失败容忍
189
-
190
- 单章/单阶段失败不阻断管道。失败记录到 `_progress.md` 的「失败记录」表(`| 类型 | 章节/阶段 | 错误信息 | 重试状态 |`)。最终状态可为 `completed_with_errors`(在拆文报告中注明失败详情)。
191
-
192
- > 与 material-decomposition.md 的对应关系:Stage 0 含 Material 阶段1(章节解析);Stage 1、5 为新增;Stage 2 = Material 阶段2;Stage 3 = Material 阶段3;Stage 4 合并 Material 阶段4+5。
193
-
194
- 详细模板见 [output-templates.md](references/output-templates.md),方法论见 [material-decomposition.md](references/material-decomposition.md)。
195
-
196
- ---
197
-
198
- ## 质量检查概要
199
-
200
- Stage 3-4 完成前需通过质量检查(置信度、覆盖率、重叠率)。阈值、计算方式与自检清单的唯一权威定义见 [material-decomposition.md 质量阈值体系](references/material-decomposition.md)。
201
-
202
- **Stage 3-5 还须过「事实可溯源」自检**:设定/角色/报告里的硬事实(等级/数值/距离/属性/势力数/出场章/谁说的话)必须能 grep 回原文,原文没给的写「原文未明确」、禁推断填空。这是拆文事实错误的最大来源(强模型也会漂移,因为合成阶段离原文两跳、靠合理性填空)。详见 [material-decomposition.md 合成阶段事实保真](references/material-decomposition.md)。
203
81
 
204
- ---
205
-
206
- ## Stage 2 并行 Agent 策略
207
-
208
- Stage 2 使用 chapter-extractor agent 并行处理每章,替代原来的串行分块。
209
-
210
- ### 调用方式
82
+ 完整旧成果直接使用或纯增强时不建索引。索引只含机械事实:
211
83
 
212
- 每条章节 prompt **必须以「材料声明」前缀开头**(即下方 prompt 字符串首段)——给子代理正确语境,避免它把通俗题材的正常戏剧化剧情误判为有害内容而拒绝拆解。前缀是固定文本,逐字带上,不要改写或省略。
213
-
214
- ```python
215
- Agent(
216
- subagent_type: "chapter-extractor",
217
- prompt: "[材料声明] 以下为用户合法持有的虚构小说,任务是只读的转化性文学分析(编辑/评论视角)。暴力/复仇/家暴/情爱/黑暗伦理是该题材常规虚构元素,照常提取,不得以敏感拒绝整章或整本;个别片段无法处理则跳过、照常续完其余。\n\n章节编号:第{N}章\n章节标题:{标题}\n章节字数:{字数}\n\n章节原文:\n{原文文本}\n\n[情节点格式要求] 模板里的 {} 是占位标记,不要输出花括号本身:写「类型信息揭示」,不写「类型:信息揭示」或「类型{信息揭示}」。主题标签只填一个值,不要用 / 、 ,或空格并列多个。空字段统一写「无」,不要用「—」,涉及段不可省略。每个情节点后紧跟自己的那一行「主题标签X | 基调:Y」,不要把标签行堆到文件末尾。正确样例:\nP7 **龙血针检测**:类型信息揭示 | 许七安用龙血针验出对方身份,当场揭穿 | 涉及许七安,郑兴怀 | 地点府衙后堂 | 物品龙血针 | 时间入夜\n主题标签悬念 | 基调:紧张\n\n[输出前自检] 交付前逐条核对:① 文本里没有 { 或 };② ^P 行数 == 主题标签行数 == 基调:行数;③ 每个主题标签只有一个值;④ 每个 P 行都含类型、白描、涉及三段。任何一条不符,先改再输出。"
218
- )
84
+ ```csv
85
+ chapter,source_chapter,volume,title,start_line,end_line,char_count,source_locator,status,chapter_sha256,source_sha256,parser_version
219
86
  ```
220
87
 
221
- > 上面的 `[情节点格式要求]` / `[输出前自检]` 两段由主线程在 spawn 时拼进 prompt,**不依赖项目里已部署的 agent 文件版本**——老项目不重新跑 `/story-setup` 也能拿到这份格式约束。sonnet 升级重试沿用同一段。
222
-
223
- ### 批量策略
88
+ 只按 LF 计物理行。支持楔子、序章、第0章、任意正文起始章、番外、后记、中文大数、英文章号、多卷重置和卷章组合。目录与正文标题重复时先剔掉目录块;落表前校验章号连续、无重复和边界有效,其中特殊章独立编号,正文允许从任意首章开始。原文变化先拒绝;确认后用 `--rebuild`,章号口径沿用已有索引(上次并入过楔子就照样并入);重建后前面的章号对不上时不写索引并返回 `author_message`。追加章节不使前面逐章 hash 失效,只有新章进入待处理;改动已拆章节的原文只会让该批缓存重读,已有摘要不刷新(要刷新就删掉对应摘要和批次缓存再续跑)。旧成果(旧摘要,或旧版 `_progress.md` 下的黄金三章)的章号与新索引对不上时,脚本在写索引前停下并返回 `author_message`:有旧版「章节边界」表就逐章核对标题与起始行,没有表而原文不从第一章开始也停。把说明和选项转告作者(默认推荐①):① 按旧章号继续——加 `--fold-prologue` 重建,楔子/序章/第0章并进第一章,旧成果原样复用、楔子不单独拆;② 楔子单独成章——把除 `原文/` 外所有按旧章号写的产物(`章节/`、`剧情/`、`角色/`、`设定/`、`人物关系图/`、`快速预览.md`、`概要.md`、`拆文报告.md`、`文风.md`、`_analysis_cache/批次-*.md` 和 `_progress.md`)挪进 `_analysis_cache/legacy/旧章号/`(不删除),再从 Stage 0 重拆;③ 换新目录整本重拆。索引已建过时先删 `chapter_index.csv`(只是机械章节表)再按所选方式重建。
224
89
 
225
- - 每次 spawn 5-8 个 agent(避免并发限制)
226
- - 等待当前批次全部完成后,再 spawn 下一批
227
- - 每批完成后更新 `_progress.md` 记录已处理章节
90
+ ## Stage 2:计划、提取、提交
228
91
 
229
- ### Agent 输出收集
92
+ ### 只读计划
230
93
 
231
- - 每个 agent 返回 markdown 格式的提取结果
232
- - 主线程将 agent 输出写入 `章节/第{N}章_摘要.md`
233
- - 收集所有 agent 的出场人物表,供 Stage 3 合并使用
94
+ ```text
95
+ "{PYTHON}" "{story-long-analyze skill 根}/scripts/manage_analysis_run.py" plan --root "{拆文目录}" --intent continue
96
+ ```
234
97
 
235
- ### 失败处理 + 质量升级重试
98
+ 用户明确增强改为 `--intent enhance`。逐批派发加 `--next 1` 只取下一批,确认进度用 `--next 0`。计划不落盘,批次 ID 固定为 `RAW-{起章}-{止章}` 或 `REUSE-{起章}-{止章}`。计划与提交都拒绝超过 3 章或 25,000 字符的非单章原文块;同一章不能出现在两个原文块。计划原文读取数为 0 时不得派发原文任务。
236
99
 
237
- **两类失败**:
238
- 1. **执行失败**(agent crash / 超时 / 空输出)→ 同模型(haiku)重试 1 次
239
- 2. **质量失败**(输出落盘后跑 chapter-extractor.md「质量检查」12 条自检,任一不达标——典型:情节点 < 10、P 行缺白描、概要写成条目罗列或整段「因为…所以…」串联、类型/基调/主题标签超出枚举、`基调:` 漏全角冒号、角色名为昵称/通用称呼)→ **升级到 sonnet 重试 1 次**
100
+ ### 两种互斥输入
240
101
 
241
- **可机械校验的硬检查**(主线程落盘后直接 grep,命中即判质量失败,不依赖 agent 自报):
242
- - 情节点数 `N = grep -cE '^P[0-9]+ '`;`grep -c '基调:'` 必须 == N(少于 N = 有情节点漏 `基调:` 或漏全角冒号 → 下游 Stage 6 文风采样按全角 `基调:` grep,会静默漏章)
243
- - 白描段有内容:`grep -cE '^P[0-9]+ [^|]+\|[^|]*[^|[:space:]][^|]*\|[^|]*涉及'` 必须 == N(`涉及` 段前要有两个 `|`,即 类型段与白描段各占一段,且白描段不能只有空白;少于 N = 有情节点缺白描,或字段顺序/分隔符不对。白描是情节点的主要证据,引用改为精选后由它承担事实回查)
244
- - `grep -hoE '基调:[^ |]+'` 去重后 ⊆ {紧张, 轻松, 悲伤, 热血, 爽, 甜, 温馨, 恐怖, 压抑, 其他}
245
- - `grep -hoE '主题标签[:]?[^ |]+'` 去重(去 `主题标签`/冒号前缀后)⊆ {爱情, 亲情, 友情, 权力, 金钱, 成长, 复仇, 悬念, 搞笑, 热血, 日常, 其他}(出现 `主题标签:` 带冒号、或值为基调词均判失败)
102
+ - `raw-original`:只按索引读取计划范围,一次产生紧凑逐章事实和跨章观察;
103
+ - `existing-results`:只读 `source_files` 列出的摘要或黄金三章,不得打开原文。完整旧项目增强只产批次观察;本批含摘要缺口时必须为每章生成紧凑章块。
246
104
 
247
- > **硬检查就是上面 4 条,没有更多。** 格式漂移主要靠 spawn prompt 与 agent 模板里的格式约束**事前预防**,不靠事后再加校验:花括号残留、标签行位置、空字段占位这类变体只影响可读性,下游没有消费方(Stage 6 文风只 grep `基调:`),为它们新增校验只会让本可用的章节触发重跑。**因此已经落盘的 `章节/*_摘要.md` 不会因为本次格式说明而变成「不合格」,无需重新生成**;老摘要里的 `类型{行动}`、`物品—` 等写法照旧可用,Stage 3-6 读取行为不变。
105
+ `chapter-extractor` 输出字段为:概要、因果、关键行动、局面结果、涉及人物、信息变化、状态变化、三维节奏、章尾钩子、证据,以及情节点列表(原文块每章 10–20 个、长章最多 30 个,格式见 output-templates)。不得另做章节卡表。派发只给 `source_locator`、字数、输出文件路径和上一批缓存路径:子代理自己读原文、把完整结果写进 `_analysis_cache/输入-{批次ID}.md`,只回一行回执;主会话不转贴原文、不读这份输入,直接提交(细则见 pipeline-ops「执行与提交一个批次」)。
248
106
 
249
- **升级重试调用方式**(主线程在校验失败后执行):
107
+ 提交:
250
108
 
251
- ```python
252
- Agent(
253
- subagent_type: "chapter-extractor",
254
- model: "sonnet", # 显式覆盖 frontmatter 的 haiku
255
- prompt: "章节编号:第{N}章\n...(同首次 prompt,含开头的「材料声明」前缀,可追加:'上次校验失败原因:{自检失败项}')"
256
- )
109
+ ```text
110
+ "{PYTHON}" "{story-long-analyze skill 根}/scripts/manage_analysis_run.py" commit --root "{拆文目录}" --input "{拆文目录}/_analysis_cache/输入-RAW-4-6.md" --batch-id "RAW-4-6" --range-sha256 "{plan 输出值}" --source-file "{plan 来源}"
257
111
  ```
258
112
 
259
- **最终落盘规则**:
260
- - haiku 首次通过 → 写入 `章节/第{N}章_摘要.md`,`_progress.md` 标记 `success`
261
- - haiku 失败 + 同模型 retry 通过 → 同上,备注 `retry_same_model`
262
- - 质量失败 + sonnet retry 通过 → 同上,备注 `retry_sonnet`
263
- - sonnet retry 仍失败 → 章节标记 `⚠️ 跳过`,失败原因写入 `_progress.md` 「失败记录」表,拆文报告中注明
264
- - 单章失败不阻断管道;批次全部 spawn 完成后才决定是否进入 Stage 3
113
+ 提交脚本先完整校验(原文块每章情节点不足 10 或超过 30 即整批拒收),再按“缓存 → 缺失摘要 → `_progress.md`”写入。摘要投影逐个情节点固定主题、基调和类型枚举,映射不上时主题/基调写“其他”;保留“关键事件”“情节点”“涉及”“基调”等旧消费者字段。任何已有摘要均不覆盖,结果里的 `kept_existing_summary_chapters` 列出被保留的章。
265
114
 
266
- ### Agent 不可用降级
115
+ ### 拆分与恢复
267
116
 
268
- 以下任一情况,Stage 2 自动退回串行模式,由主线程逐章处理(质量不受影响,只是改为串行、速度略慢)。**两条路径的要求是同一份**:串行时概要写法、情节点白描、原文引用精选规则和输出自检都按 [output-templates.md](references/output-templates.md)「Stage 2 章节摘要+情节点」执行;上面的机械硬检查串行同样要跑。串行没有 sonnet 升级重试这条路——硬检查命中时由主线程按失败项重写本章摘要 1 次,仍不过按 `⚠️ 跳过` 记入 `_progress.md` 「失败记录」表。
117
+ ```text
118
+ "{PYTHON}" "{story-long-analyze skill 根}/scripts/manage_analysis_run.py" split --root "{拆文目录}" --batch-id "RAW-4-6"
119
+ "{PYTHON}" "{story-long-analyze skill 根}/scripts/manage_analysis_run.py" repair-progress --root "{拆文目录}"
120
+ ```
269
121
 
270
- - **agent 未部署**:当前运行时的 canonical agent 目录未找到 `chapter-extractor.md` 或 Codex 同名 TOML。项目 agent 通常不随写作仓库预置,应重新运行 `/story-setup` 完成当前适配器部署,不跨 Skill 读取模板源。
271
- - **环境不支持 spawn 子代理**:本 skill 正运行在某个子代理上下文中,无法再起下一层 agent。
122
+ 拆分将父块记为 `superseded` 并持久化两个相邻子块,重规划不会合回。计划不再有批次、全部摘要落盘后运行 `manage_analysis_run.py mark-stage --stage stage2`;Stage 1 的黄金三章与快速预览落盘后同样标 `--stage stage1`。恢复只信任带结束标记且范围 hash 有效的完整缓存,只补缺失摘要,最后更新进度;不覆盖用户文件。
272
123
 
273
- ### Stage 2 收尾:合并章节摘要(_章节摘要汇总.md)
124
+ ## Stage 3:剧情、双时间线与三维节奏
274
125
 
275
- Stage 2 所有 `章节/*_摘要.md` 落盘后、进入 Stage 3 前,主线程把它们按章号顺序**无损拼接**成 `拆文库/{书名}/_章节摘要汇总.md`(只拼接、不压缩、不改写):
126
+ Stage 3–5 用 `manage_analysis_run.py digest` 取料:先读全书跨章观察,逐章字段与情节点简表按章节窗口取,不整份读批次缓存(用法见 pipeline-ops「Stage 3–6」)。
276
127
 
277
- ```bash
278
- ls 章节/*_摘要.md | sed -E 's/.*第([0-9]+)章.*/\1 &/' | sort -n | cut -d' ' -f2- | while read -r f; do cat "$f"; echo; done > _章节摘要汇总.md
279
- ```
128
+ 剧情点按“起始目标与阻碍 → 改变局面的选择/行动/外部事件 → 局面变化与得失 → 后续影响”合并。事件发生与信息披露分开;同一事实的异常、线索、解释、确认属于一条披露路径。全局只保留约 8–15 个主线或关键转折节点。
280
129
 
281
- **无损检查**(拼接后校验,任一不过即删除 `_章节摘要汇总.md`、回退逐文件扫描,行为不变):
282
- - `grep -cE '^P[0-9]+ ' _章节摘要汇总.md` == 各摘要 `^P` 行数之和
283
- - `grep -cE '^\*\*概要\*\*' _章节摘要汇总.md` == 摘要文件数(`**概要**` 每章一行,chapter-extractor 并行输出与串行摘要模板都有;不用 `## 第N章` 头——串行摘要模板没有章节头,会误判)
130
+ 三维节奏分别说明:事件推进 1–5 及状态变化,读者情绪类型/强度 1–5 及触发,篇幅展开度 1–3 及展开/压缩/省略/反复的作用。情绪机制写完整卡,至少覆盖最强三个,值得复现的不设数量上限;其余保留索引。完整卡以 `读者想看什么`、`情绪链`、`戏剧单元`、`可替换项`、`不可照搬` 五个字段齐全为准,字段名按 `references/output-templates.md` 的 EM 卡表原样使用;缺任一项即无法登记灵感库。铺垫、成立条件、关键触发物、复现步骤、失效情形等按需增列。索引节标题用字面量 `## 其他机制索引`。
284
131
 
285
- Stage 3 / 4a / 4c / 散落情节兜底改为**只读一次 `_章节摘要汇总.md`** 并在上下文中复用,替代每阶段 `glob 章节/*_摘要.md` 重扫(同一份语料的 4-5 次冷读降为 1 次)。
132
+ `剧情/情绪模块.md` 与 `剧情/节奏.md` 都落盘后,用 `manage_analysis_run.py mark-stage --stage stage3 --output "剧情/节奏.md"` 标记。命令会同时检查两份必需产物;阶段没有 receipt 或依赖 hash。
286
133
 
287
- **仅当语料能放进上下文时才生成汇总文件**:>500 章、或合并后 `_章节摘要汇总.md` 过大放不进上下文时**跳过本步骤**,改走 [material-decomposition.md](references/material-decomposition.md)「处理批次 → A. 子代理并行模式」:按 10-20 章/批 spawn 子代理,子代理在自己上下文里读该批摘要、只回传 ≤8K tokens 的降维聚合,主线程仅合并聚合结果(必要时分层两两合并)。**主线程不逐章读原始摘要**——跳过汇总文件不等于回到逐文件扫描,那对大书同样放不下。`_章节摘要汇总.md` 不替代 `章节/*_摘要.md`——单章文件仍是落盘真源,Stage 6 文风采样、人工复核照用单章文件。管道结束(Stage 6 后)删除 `_章节摘要汇总.md`——它是派生临时文件,不随 `拆文库/` 交付(`拆文库/` 会被 story-import 保留为写作工程)。
134
+ ## Stage 4:角色、设定与关系
288
135
 
289
- Stage 3-5 分块见 [material-decomposition.md](references/material-decomposition.md)(唯一权威)。
136
+ 从 Stage 2 的 `涉及人物`、状态变化和批次关系观察归一实体,再结合 Stage 3 剧情单元生成角色档案与设定。关系记录动作方向、触发、双方得失、表面/真实状态、阶段变化和证据;“甲保护乙”与“乙依赖甲”分别记录。
290
137
 
291
- ---
138
+ 关系图只从 `角色/角色关系.md` 生成:`"{PYTHON}" "{story-long-analyze skill 根}/scripts/render_relation_chart.py" --root "{拆文目录}" --png`。主产物是 `人物关系图/人物关系图.md`(Mermaid + 文字清单,任何 Markdown 查看器都显示中文);PNG 只在找到能显示图中全部文字的字体时生成(表情等符号不画进图片)。字体不够就不出图,不得自行改画拼音或首字母版,把脚本的 `author_message` 转告作者。
292
139
 
293
- ## 恢复机制
140
+ 至少一份角色档案和一份设定文件落盘后运行 `manage_analysis_run.py mark-stage --stage stage4`;缺任一类文件时不得标完成。
294
141
 
295
- 启动时检查 _progress.md;`paused_after_stage1` → 直接从 Stage 2 续跑。
296
- 操作步骤见 [pipeline-ops.md](references/pipeline-ops.md)。
142
+ ## Stage 5:主报告
297
143
 
298
- ---
144
+ 报告按 author-facing.md「拆文报告.md」写:拆到哪、核心发现、读者在追什么、故事怎么推进、人物与关系、读者与角色的信息差、节奏、核心机制、可借鉴套路、不建议模仿、文风一句话、还不确定的地方。生成新报告前运行 `manage_analysis_run.py mark-stage --stage stage5 --prepare`,把旧报告完整保存到 `_analysis_cache/legacy/拆文报告.md`;新报告落盘后再运行 `manage_analysis_run.py mark-stage --stage stage5`,命令在 `拆文报告.md` 不存在或为空时拒绝完成。报告只综合底层结果,不再次阅读全文。
299
145
 
300
- ## 流程衔接
146
+ 如项目存在 `选题决策.md`,只回填仍标记“待拆文验证”且题材匹配的项。文件存在但缺少当前契约必需的“能爆的原因”等字段时返回 `invalid_topic_decision_contract`,提示重跑 `story-long-scan` Phase 5;文件不存在不影响拆文。
301
147
 
302
- **流水线:** 长篇
303
- **位置:** 拆文(长篇流水线第 2 步,在 story-long-scan 之后、story-long-write 之前)
148
+ ## Stage 6:文风与单独重建
304
149
 
305
- | 时机 | 跳转到 | 命令 |
306
- |---|---|---|
307
- | 准备开写 | story-long-write | `/story-long-write` |
308
- | 需要市场数据 | story-long-scan | `/story-long-scan` |
309
- | 更适合短篇 | story-short-scan → story-short-analyze | `/story-short-scan` |
150
+ 加载 [references/style-profile-generator.md](references/style-profile-generator.md)。优先使用已有 `文风.md` 和有效 `_style-sample.txt`;样本不足时允许依据索引选择 4–6 章、定点读取原文行段。只缺文风时直接运行 Stage 6,不重跑 Stage 1–5。没有有效样本、索引或原文时明确失败,不生成锚点全空的可用档案。
310
151
 
311
- ---
152
+ ## 三层灵感库管道(可选后置)
312
153
 
313
- ## 参考资料
154
+ 用户提出「灵感库 / 提炼灵感 / 跨书灵感聚合 / 更新灵感库」时加载 [references/inspiration-library.md](references/inspiration-library.md)。复用 Stage 3 的 EM 机制卡:`inspiration_index.py register-atoms` 机械登记原子灵感索引(无 IA 文件),再按该文档做单书合并与带受控标签的跨书聚合;卡内只用 `书名/EM-xxx` 裸 ID,禁路径引用。缺情绪模块的书先走上方按需增强,不在灵感层代拆。单书拆文不自动入库。
314
155
 
315
- | 文件 | 何时加载 |
316
- |------|----------|
317
- | [references/output-templates.md](references/output-templates.md) | 管道全程:各 Stage 输出模板 + 快速预览报告模板 + `剧情/节奏.md` / `剧情/情绪模块.md` 模板 + 通用速查表 |
318
- | [references/material-decomposition.md](references/material-decomposition.md) | Stage 2-5:素材拆解方法论 + 质量阈值 + 分块策略;Stage 6 另见文风资料 |
319
- | [references/pipeline-ops.md](references/pipeline-ops.md) | 管道运维:_progress.md 模板、错误处理、恢复机制操作步骤 |
320
- | [references/deconstruction-notes.md](references/deconstruction-notes.md) | 拆书方法+影视拆解+抽象拆解法+题材实战 |
321
- | [references/style-profile-protocol.md](references/style-profile-protocol.md) | Stage 6:文风模板 + 可信度/可用性说明 |
322
- | [references/style-profile-generator.md](references/style-profile-generator.md) | Stage 6:文风生成 SOP(6 步,含中文数字章节识别 + 全角冒号基调 grep) |
156
+ ## 状态、旧项目与最终回归
323
157
 
324
- ---
158
+ 运行状态只有 `_progress.md` 受管区;既有 `schema_version: 2` 原值保留;`chapter_index.csv` 是机械索引;缓存是恢复证据。有阶段记录后,受管区的 `最终状态` 由脚本按 Stage 3–6 的阶段状态写出(都完成为 `completed`,否则 `pending`);旧项目沿用自己原有的 `最终状态` 行,全部完成时由脚本改为 `completed`,不写第二行,会话 hooks 靠它判断拆文是否完成,不要手改。不得创建运行计划、checkpoint、逐批 JSON receipt 或 Stage receipt。
325
159
 
326
- ## 语言
160
+ 全部完成后按 author-facing.md「全部拆完」向作者汇报。最终必须回归:黄金三章、逐章摘要、情绪模块、节奏、角色、设定、文风、导入、对标和写作仍可用;旧完整项目直接使用;部分项目只补精确缺章;混存项目报告来源但不重拆;增强/恢复不改旧产物与原 schema。
327
161
 
328
- - 跟随用户的语言回复,用户用什么语言就用什么语言回复
329
- - 中文回复遵循《中文文案排版指北》
162
+ 详细命令和恢复顺序见 [references/pipeline-ops.md](references/pipeline-ops.md)。输出模板见 [references/output-templates.md](references/output-templates.md),素材聚合方法见 [references/material-decomposition.md](references/material-decomposition.md)。联合验收用 [references/semantic-acceptance-fixtures.md](references/semantic-acceptance-fixtures.md) 的六项 0–2 分表,真实模型结果至少 10/12 且无硬失败才算语义通过。