@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
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  const fs = require('fs');
5
+ const { loadStyleWhitelist, maskStyleText } = require('./style-whitelist.js');
5
6
  const path = require('path');
6
7
 
7
8
  const USAGE = `Usage: node check-ai-patterns.js [--check] [--json] [--fail-on=blocking|all] <file...>
@@ -30,6 +31,7 @@ Detect high-risk AI-flavor prose patterns that need human rewrite:
30
31
  - 章尾状态总结体 (文末窗口 这一夜注定/这一切都结束了/新的人生才刚刚开始/命运的齿轮)
31
32
  - 引号强调滥用 (叙述里 1-4 字短词加引号强调,密度型)
32
33
 
34
+ Book-local .deslop-whitelist literal spans are excluded from style scanning (no regex or ancestor inheritance).
33
35
  Each finding carries severity: blocking by default for generation/deslop cleanup (not-is-comparison / em-dash / voice-contrast / negation-parade / reverse-not-is / trailer-ending / trailer-summary). This is a local style/readability gate, not an AIGC detector score; functional human text can be marked for review instead of hard-edited for a detector.
34
36
  或 advisory (period-stutter / long-paragraph / micro-action-tic / stock-reaction-tic / action-list-tic / abstract-summary-tic / cliche-density-tic / metaphor-density-tic / reasoning-chain-tic / system-notice-formality-tic / overcompressed-prose-tic / low-connective-density-tic / quote-emphasis-tic / formulaic-parallelism,是提示,justified 的长推理/氛围段可保留)。
35
37
  --fail-on=blocking 只在出现 blocking finding 时退出 1;默认 --fail-on=all 有任何 finding 即退出 1。
@@ -308,7 +310,10 @@ for (const file of options.files) {
308
310
  continue;
309
311
  }
310
312
 
311
- const findings = scanDocument(input).map((finding) => ({ file, ...finding }));
313
+ let whitelist;
314
+ try { whitelist = loadStyleWhitelist(fullPath); }
315
+ catch (error) { die(`${file}: unable to read .deslop-whitelist (${error.message})`); }
316
+ const findings = scanDocument(maskStyleText(input, whitelist)).map((finding) => ({ file, ...finding }));
312
317
  allFindings.push(...findings);
313
318
  }
314
319
 
@@ -43,6 +43,17 @@ const PLACEHOLDER_PATTERNS = [
43
43
  { re: /我(无法|不能)(继续(写|创作|生成|下去)|生成(内容|文本|正文)?|创作|续写|完成(这个|本)?(章|篇|创作|请求))/, label: '元信息泄漏(生成拒绝语)', hard: false },
44
44
  ];
45
45
 
46
+ const QUOTED_SPAN_PATTERNS = [
47
+ /「[^」]*」/g,
48
+ /『[^』]*』/g,
49
+ /【[^】]*】/g,
50
+ /“[^”]*”/g,
51
+ // 单引号须成对;词内撇号(don't、O’Connor)不作为开闭引号。
52
+ /(?<![A-Za-z0-9_])‘(?:[^’]|(?<=[A-Za-z0-9_])’(?=[A-Za-z0-9_]))*(?!(?<=[A-Za-z0-9_])’[A-Za-z0-9_])’/g,
53
+ /"[^"]*"/g,
54
+ /(?<![A-Za-z0-9_])'(?:[^']|(?<=[A-Za-z0-9_])'(?=[A-Za-z0-9_]))*(?!(?<=[A-Za-z0-9_])'[A-Za-z0-9_])'/g,
55
+ ];
56
+
46
57
  // 工程词泄漏(正文元信息扫描的确定性版):弱模型把写作工程词漏进正文,破坏代入感
47
58
  // (DeepSeek-v4 这类会在对话里冒「该到下一章了」)。漏词的模型自己发现不了,靠脚本兜。
48
59
  // tier1 = 纯写作流水线术语,正文里几乎永不合法;tier2 = 章节结构/歧义词,角色在故事内
@@ -150,21 +161,23 @@ function isContent(trimmed) {
150
161
  return trimmed && !trimmed.startsWith('#') && !/^-{3,}$/.test(trimmed);
151
162
  }
152
163
 
153
- function isDialogueLike(trimmed) {
154
- return /[“”"'‘’「」『』【】]/.test(trimmed);
164
+ // 等长遮住成对引号内的内容以保留列号;未闭合引号不豁免。
165
+ function maskQuotedSpans(text) {
166
+ let masked = text;
167
+ for (const pattern of QUOTED_SPAN_PATTERNS) {
168
+ masked = masked.replace(pattern, (match) => ' '.repeat(match.length));
169
+ }
170
+ return masked;
155
171
  }
156
172
 
157
173
  // 去掉成对引号内的片段(台词/系统词/引用物件),只留引号外叙述。复读判定用:重复台词是体裁
158
174
  // 手法(豁免),但「叙述 + 引号内物件/短台词」混合行里引号外叙述的复读仍是退化,不能整行豁免。
159
175
  function stripQuoted(text) {
160
- return text
161
- .replace(/「[^」]*」/g, '')
162
- .replace(/『[^』]*』/g, '')
163
- .replace(/【[^】]*】/g, '')
164
- .replace(/“[^”]*”/g, '')
165
- .replace(/‘[^’]*’/g, '')
166
- .replace(/"[^"]*"/g, '')
167
- .replace(/'[^']*'/g, '');
176
+ let stripped = text;
177
+ for (const pattern of QUOTED_SPAN_PATTERNS) {
178
+ stripped = stripped.replace(pattern, '');
179
+ }
180
+ return stripped;
168
181
  }
169
182
 
170
183
  function visibleLength(text) {
@@ -253,18 +266,19 @@ function findPlaceholders(content) {
253
266
  const findings = [];
254
267
  for (const { trimmed, lineNo } of content) {
255
268
  if (!isContent(trimmed)) continue;
256
- const dialogue = isDialogueLike(trimmed);
269
+ const outsideQuotes = maskQuotedSpans(trimmed);
257
270
  for (const { re, label, hard } of PLACEHOLDER_PATTERNS) {
258
- if (!hard && dialogue) continue; // soft 拒绝语在对话行里可能是正常台词,豁免
259
- const m = re.exec(trimmed);
271
+ // hard 信号仍扫描整行;soft 自指/拒绝语只扫描成对引号外,且遮罩等长以保留列号。
272
+ const m = re.exec(hard ? trimmed : outsideQuotes);
260
273
  if (m) {
274
+ const index = m.index || 0;
261
275
  findings.push({
262
276
  line: lineNo,
263
- column: (m.index || 0) + 1,
277
+ column: index + 1,
264
278
  type: 'placeholder-leak',
265
279
  severity: 'blocking',
266
280
  message: `${label}:正文混入元信息/拒绝语/占位符,重写本段干净落地。`,
267
- excerpt: compact(trimmed.slice(Math.max(0, (m.index || 0) - 4), (m.index || 0) + 20)),
281
+ excerpt: compact(trimmed.slice(Math.max(0, index - 4), index + 20)),
268
282
  });
269
283
  break; // one finding per line is enough
270
284
  }
@@ -283,17 +297,22 @@ function findMetaLeak(content) {
283
297
  // 标题行(第N章 章名,无 ## 前缀时也算)属「标题行以外的正文」之外,排除
284
298
  if (/^第[一二三四五六七八九十百千万两0-9]+章/.test(trimmed)) continue;
285
299
  }
286
- const dialogue = isDialogueLike(trimmed);
287
- let m = META_TIER1_RE.exec(trimmed);
300
+ const outsideQuotes = maskQuotedSpans(trimmed);
301
+ let m = META_TIER1_RE.exec(outsideQuotes);
302
+ let quotedTier1 = false;
303
+ if (!m) {
304
+ m = META_TIER1_RE.exec(trimmed);
305
+ quotedTier1 = Boolean(m);
306
+ }
288
307
  if (m) {
289
308
  // tier1 纯工程词正文里几乎永不合法→blocking;但写手/编剧题材里角色在故事内真讨论创作,
290
- // 台词(对话行)里可能合法,降级为 advisory(仍报告,交人/LLM 判,不强制回炉)。
309
+ // 且命中实际位于成对引号内时可能合法,降级为 advisory。同一行别处出现引号不影响判定。
291
310
  findings.push({
292
311
  line: lineNo,
293
312
  column: m.index + 1,
294
313
  type: 'meta-leak',
295
- severity: dialogue ? 'advisory' : 'blocking',
296
- message: `工程词泄漏:「${m[0]}」是写作流水线术语,正文里不该出现;改成角色/场景内表达。${dialogue ? '例外:角色为作者/编剧、在故事内真实讨论创作时,台词里可能合法。' : ''}`,
314
+ severity: quotedTier1 ? 'advisory' : 'blocking',
315
+ message: `工程词泄漏:「${m[0]}」是写作流水线术语,正文里不该出现;改成角色/场景内表达。${quotedTier1 ? '例外:角色为作者/编剧、在故事内真实讨论创作时,台词里可能合法。' : ''}`,
297
316
  excerpt: compact(trimmed.slice(Math.max(0, m.index - 6), m.index + 18)),
298
317
  });
299
318
  continue; // tier1 命中即可,不再叠 tier2
@@ -2,6 +2,7 @@
2
2
  'use strict';
3
3
 
4
4
  const fs = require('fs');
5
+ const { loadStyleWhitelist, styleSpans } = require('./style-whitelist.js');
5
6
  const path = require('path');
6
7
 
7
8
  const USAGE = `Usage: node normalize-punctuation.js [--check] [--quote-mode keep|ascii|yan] <file...>
@@ -9,6 +10,7 @@ const USAGE = `Usage: node normalize-punctuation.js [--check] [--quote-mode keep
9
10
  Normalize正文 punctuation deterministically:
10
11
  - replace ellipses, em dashes, and double hyphens with Chinese punctuation
11
12
  - remove markdown divider lines (---) from正文
13
+ - preserve pause punctuation covered by book-local .deslop-whitelist literals
12
14
  - keep quote style by default; convert quotes only when explicitly requested
13
15
  `;
14
16
 
@@ -61,7 +63,10 @@ for (const file of options.files) {
61
63
  continue;
62
64
  }
63
65
 
64
- const result = normalizeDocument(input, options.quoteMode);
66
+ let whitelist;
67
+ try { whitelist = loadStyleWhitelist(fullPath); }
68
+ catch (error) { die(`${file}: unable to read .deslop-whitelist (${error.message})`); }
69
+ const result = normalizeDocument(input, options.quoteMode, whitelist);
65
70
  totalFindings += result.findings.length;
66
71
 
67
72
  if (options.check) {
@@ -94,7 +99,7 @@ function die(message) {
94
99
  process.exit(2);
95
100
  }
96
101
 
97
- function normalizeDocument(input, quoteMode) {
102
+ function normalizeDocument(input, quoteMode, whitelist) {
98
103
  const { lines, endings } = splitLinesKeepingEndings(input);
99
104
 
100
105
  const findings = [];
@@ -159,7 +164,7 @@ function normalizeDocument(input, quoteMode) {
159
164
  }
160
165
 
161
166
  const commentOpenBefore = commentOpen;
162
- const punctuationResult = normalizePausePunctuation(line, lineNo, commentOpen);
167
+ const punctuationResult = normalizePausePunctuation(line, lineNo, commentOpen, whitelist);
163
168
  findings.push(...punctuationResult.findings);
164
169
  line = punctuationResult.line;
165
170
  commentOpen = punctuationResult.commentOpen;
@@ -237,7 +242,7 @@ function isClosingFence(line, fence) {
237
242
  // 一遍归一化留不干净,再跑一遍还会改已定稿的正文;所以反复归一化到不动点。
238
243
  // 每遍至少把一个 `…/./—/-` 换成非停顿字符,字符数严格递减,必然收敛。
239
244
  // findings 只留第一遍:同一处不重复计数,column 也仍然是原行的偏移。
240
- function normalizePausePunctuation(line, lineNo, commentOpen) {
245
+ function normalizePausePunctuation(line, lineNo, commentOpen, whitelist) {
241
246
  let current = line;
242
247
  let findings = null;
243
248
  let commentOpenAfter = commentOpen;
@@ -245,7 +250,7 @@ function normalizePausePunctuation(line, lineNo, commentOpen) {
245
250
  for (;;) {
246
251
  const comments = htmlCommentSpans(current, commentOpen);
247
252
  commentOpenAfter = comments.open;
248
- const pass = normalizePausePunctuationPass(current, lineNo, comments.spans);
253
+ const pass = normalizePausePunctuationPass(current, lineNo, comments.spans.concat(styleSpans(current, whitelist)));
249
254
  if (findings === null) findings = pass.findings;
250
255
  if (pass.line === current) break;
251
256
  current = pass.line;
@@ -0,0 +1,39 @@
1
+ 'use strict';
2
+
3
+ const fs = require('fs');
4
+ const path = require('path');
5
+
6
+ // Book-local only: never inherit an unrelated workspace or another book's choices.
7
+ function loadStyleWhitelist(file) {
8
+ const parent = path.dirname(path.resolve(file));
9
+ const book = path.basename(parent) === '正文' ? path.dirname(parent) : parent;
10
+ try {
11
+ return fs.readFileSync(path.join(book, '.deslop-whitelist'), 'utf8')
12
+ .split(/\r?\n/).map(line => line.trim())
13
+ .filter(line => line && !line.startsWith('#'))
14
+ .sort((a, b) => b.length - a.length);
15
+ } catch (error) {
16
+ if (error.code === 'ENOENT') return [];
17
+ throw error;
18
+ }
19
+ }
20
+
21
+ function styleSpans(text, whitelist) {
22
+ const spans = [];
23
+ for (const literal of whitelist) {
24
+ for (let at = text.indexOf(literal); at !== -1; at = text.indexOf(literal, at + 1)) {
25
+ spans.push([at, at + literal.length]);
26
+ }
27
+ }
28
+ return spans;
29
+ }
30
+
31
+ function maskStyleText(text, whitelist) {
32
+ const chars = text.split('');
33
+ for (const [start, end] of styleSpans(text, whitelist)) {
34
+ chars.fill('?', start, end);
35
+ }
36
+ return chars.join('');
37
+ }
38
+
39
+ module.exports = { loadStyleWhitelist, styleSpans, maskStyleText };
@@ -12,9 +12,9 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
12
12
 
13
13
  ---
14
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`。
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 用 `subagent_type`;OpenCode 用 `subagent` 工具的 `agent` 参数。
16
16
  >
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`。
17
+ > 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,报告 `Fallback: ... -> solo`。
18
18
 
19
19
  ## 核心原则
20
20
 
@@ -31,7 +31,7 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
31
31
 
32
32
  ### 原则 2:复用不重复
33
33
 
34
- 深度分析阶段调用现成的拆解管道,不重新发明:长篇运行 `/story-long-analyze` 的完整拆解管道,短篇运行 `/story-short-analyze` 的拆解管道。拆解方法论与输出模板由对应 analyze skill 自带,story-import 不执行拆解方法论、不维护这些文件。
34
+ 深度分析复用现成管道:长篇由 `/story-long-analyze` 识别旧成果、增强或续跑,短篇运行 `/story-short-analyze`。方法与模板由 analyze skill 自带,story-import 不另维护。
35
35
 
36
36
  ---
37
37
 
@@ -54,7 +54,7 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
54
54
 
55
55
  1. 数清最后一个完整章号 `N`(`正文/第NNN章_*.md` 的最大值)。
56
56
  2. 从旧 `追踪/` 现有文件(角色状态、伏笔、时间线等,文件名按项目实际情况)和最近 3-5 章正文,重建当前状态:核心角色快照、未回收伏笔、已揭示时间线事件、长期约束、下一章承诺。角色快照的反推方法见 [references/character-state-reverse.md](references/character-state-reverse.md)。
57
- 3. 按 [references/tracking-transaction.md](references/tracking-transaction.md) 的初始化事务格式构造 JSON,`last_chapter` 写 `N`(第 1..N 章不伪造逐章记录),执行 `tracking_commit.py init`。
57
+ 3. 完整读取 [references/tracking-initialization.md](references/tracking-initialization.md),按其初始化事务格式构造 JSON,`last_chapter` 写 `N`(第 1..N 章不伪造逐章记录),执行 `tracking_commit.py init`。
58
58
  4. `init` 会把旧追踪结构按原样整体移入 `追踪/_旧追踪存档/` 再建当前协议——旧内容不删除、不参与解析,留给作者查阅。
59
59
  5. 跑 `tracking_commit.py check` 确认通过,再回 `/story-long-write 日更` 续写。
60
60
 
@@ -102,19 +102,17 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
102
102
  在进入 Phase 2 之前,先检测项目是否已部署 story-setup 基础设施:
103
103
 
104
104
  - 先读取 `.story-deployed` 并执行顶部 Spawn 版本门禁;旧版 `chapter-extractor` 文件即使仍在磁盘上也不可复用。
105
- - 只有 `agents_version: 28` 通过后,才在当前运行时的 canonical 目录检查 Phase 2 `chapter-extractor`:Claude/OpenCode/Antigravity 为同名 Markdown,Codex 为同名 TOML。
105
+ - 只有 `agents_version: 32` 通过后,才在当前运行时的 canonical 目录检查 Phase 2 `chapter-extractor`:Claude/OpenCode/Antigravity 为同名 Markdown,Codex 为同名 TOML。
106
106
  - 如果 `.story-deployed` 的 `target_cli` 包含 `zcode`,项目 agents 缺失是 ZCode 3.3.4 的预期状态:不要提示重复部署,直接以串行 solo/direct 进入分析并报告 fallback。
107
107
 
108
- **部署标记缺失、版本无效/过期,或当前端的 agent 不可用,且不是已部署 ZCode 项目时**,提示用户:
108
+ **部署标记缺失、版本无效/过期,或当前端的 agent 不可用,且不是已部署 ZCode 项目时**,这样问用户:
109
109
 
110
- > 「检测到当前项目尚未部署写作基础设施。建议先运行 `/story-setup` 再回来导入,否则深度分析阶段无法使用并行 chapter-extractor agent。」
111
-
112
- 给用户两个选择:
110
+ > 「这个项目还没装好写作环境。装好后由专门的分析助手逐段拆书,主对话不会被整本书塞满;不装也能导,只是全部在主对话里做,慢一些,结果一样完整。你想:1. 先装环境(推荐):运行 `/story-setup`,装完再说"导入" 2. 直接导入,慢一点也行」
113
111
 
114
112
  1. **先去 setup**:暂停导入,运行 `/story-setup`,部署完成后重新触发 `/story-import`;
115
- 2. **继续导入**:接受 Phase 2 降级为串行处理(长篇逐章摘要不并行,速度较慢,但产物完整)。
113
+ 2. **继续导入**:Phase 2 降级为主线程串行处理(长篇逐章摘要由主线程自己写,速度较慢,但产物完整)。
116
114
 
117
- 用户选择记入上下文,Phase 2 据此决定是否走并行模式。
115
+ 用户选择记入上下文,Phase 2 据此决定是否派 chapter-extractor。有子代理时,导入属自动续跑,按 story-long-analyze 的「有限并行」档派发(每轮 3 批);用户明确要求时改用串行或不限批次顺序。
118
116
 
119
117
  ### Step 6:原文备份
120
118
 
@@ -124,26 +122,32 @@ metadata: {"openclaw":{"source":"https://github.com/zenstory-ai/oh-story-claudec
124
122
 
125
123
  ## Phase 2:深度分析
126
124
 
127
- 按 Phase 1 判定的篇幅类型,调用对应 analyze skill 的**完整拆解管道**;不要做「复用方法论」式的半流程,要驱动整条管道跑完,拿到全套结构化产物。
125
+ 按 Phase 1 判定的篇幅类型进入对应 analyze skill。先检查已有拆文资产;可验证的旧成果直接复用,只有缺失范围或本次导入确实依赖的新分析才进入对应 Stage。全新项目再驱动完整管道。
128
126
 
129
127
  | 篇幅 | 调用的拆解管道 | 产物目录 |
130
128
  |------|--------------|---------|
131
- | 长篇 | story-long-analyze 的完整管道(Stage 0-6) | `拆文库/{导入书名}/` |
129
+ | 长篇 | story-long-analyze 的统一管道(旧成果直用 / 按需增强 / 全新或部分续跑) | `拆文库/{导入书名}/` |
132
130
  | 短篇 | story-short-analyze 的拆解管道(Stage 2-6) | `拆文库/{导入书名}/` |
133
131
 
134
132
  ### 调用契约
135
133
 
136
- #### 长篇:自动续跑过 Stage 1 停靠点
134
+ #### 长篇:先兼容识别,再决定是否续跑
135
+
136
+ 先运行 story-long-analyze Phase 1 的只读检查器(`inspect_existing_assets.py`),登记实际文件和覆盖范围;检查建议不能覆盖下列语义规则:
137
137
 
138
- story-long-analyze 在 Stage 0+1(黄金三章)后会**自动停靠**并用 AskUserQuestion 询问是否继续全量拆解(对应 story-long-analyze 的「Stage 1 停靠点」)。但导入场景需要 Stage 2-6 的全套产物(逐章摘要 / 聚合分析 / `剧情/节奏.md` / `剧情/情绪模块.md` / 设定关系 / 汇总报告 / 文风),缺一不可——否则 Phase 3 迁移会拿到半成品。
138
+ 新生成或按当前契约续跑的长篇进度保持 `schema_version: 2`;旧成果直接使用不以缺少该字段为失败。
139
139
 
140
- **当前拆文契约**:`_progress.md` 必须是 `schema_version: 2`,且 `剧情/节奏.md` 与 `剧情/情绪模块.md` 是导入必备权威产物。任一缺失都先修复或重跑对应 Stage,不得用摘要文件拼出看似完整的导入工程。
140
+ - **旧成果已完成且足以重建写作工程**:直接进入 Phase 3-L。旧 `_progress.md` 版本、缺少 `chapter_index.csv`,或缺少本次新增字段,都不能单独成为重拆理由。
141
+ - **旧成果可以导入,但缺少当前写作/对标功能需要的 `剧情/节奏.md`、`剧情/情绪模块.md` 等资料**:先用现有逐章、剧情、关系、报告和文风做 Stage 3+ 按需增强,不回读原文。不得重跑已完成章节,也不得用空壳文件让门禁通过。
142
+ - **只完成一部分或新旧产物混存**:验证并保留已完成部分,从首个缺失的连续章节块续跑,最后统一聚合。进度记录与实际文件冲突时,以可验证文件为准并记录冲突。
143
+ - **全新导入**:运行 Stage 0-6 完整管道。
141
144
 
142
- 因此调用 story-long-analyze 时**必须在一开始就以「完整拆解、一次跑完、不要停下询问」模式驱动管道**,命中其「跳过询问」路径(用户开头明确说「完整拆解 / 一次跑完 / 系统拆解 / 别问」时不停靠),让管道自动从 Stage 2 续跑到 Stage 6。
145
+ 导入需要自动完成本次判定出的必需范围,不把 Stage 1 停靠询问甩给用户。全新导入命中「完整拆解、一次跑完」路径;旧成果增强或部分续跑只执行缺失 Stage/章节块。原有用途当前不消费新增分析时,缺少新增字段只记录能力限制,不阻断导入。
143
146
 
144
- - 措辞示例:启动深度分析时声明「以『完整拆解、一次跑完、不要停下询问』模式拆解本书,确保 Stage 2-6 全部产出」。
145
- - **兜底**:若运行环境实际仍停在 Stage 1 询问处,story-import 自动选择「继续全量拆解」,**绝不把停靠询问甩给用户**。
146
- - 环境检测(Phase 1)发现未部署 chapter-extractor agent 且用户选择「继续导入」时,Stage 2 逐章摘要降级为串行处理,产物仍完整,仅速度变慢。
147
+ - 措辞示例(全新):启动深度分析时声明「以『完整拆解、一次跑完、不要停下询问』模式拆解本书,确保 Stage 2-6 全部产出」。
148
+ - 措辞示例(旧成果):声明「先复用并校验现有成果,只补当前导入缺失的章节或分析,不覆盖用户原成果」。
149
+ - **兜底**:若全新导入实际仍停在 Stage 1,story-import 自动选择继续;若旧成果任务停靠,则按已登记的缺失范围继续,不能扩大成全书重跑。
150
+ - 环境检测(Phase 1)发现未部署 chapter-extractor agent 且用户选择「继续导入」时,Stage 2 由主线程按相同连续章节块契约串行处理,不能退回每章一次独立调用;产物仍完整,仅速度变慢。
147
151
 
148
152
  #### 短篇:单一全量管道
149
153
 
@@ -190,6 +194,8 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
190
194
  │ ├── 世界观/ # 背景设定.md / 力量体系.md / 地理.md / 金手指.md(子目录形态)
191
195
  │ └── 势力/ # {势力名}.md(每势力一文件)
192
196
  ├── 拆文报告.md
197
+ ├── chapter_index.csv # 机械章界、原文定位、源 hash 与解析器版本
198
+ ├── 人物关系图/ # 人物关系图.md(Mermaid 中文图);有中文字体时另有 PNG
193
199
  ├── 文风.md # Stage 6 文风:写作技法视图 + 原文范例锚点
194
200
  └── _progress.md
195
201
  ```
@@ -214,12 +220,12 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
214
220
 
215
221
  | 阶段 | 名称 | 输入 | 输出 | 完成标志 |
216
222
  |------|------|------|------|----------|
217
- | 0 | 概要提取 | 原始文本 | 概要.md + 章节索引 | 章节结构识别完成 |
223
+ | 0 | 概要与机械索引 | 原始文本 | 概要.md + `chapter_index.csv` | 章节结构、定位、源 hash 与解析器版本记录完成 |
218
224
  | 1 | 黄金三章 | 前 3 章原文 | 第1章_深度拆解.md / 第2章_深度拆解.md / 第3章_深度拆解.md → **停靠产出快速预览.md**(导入场景自动续跑,不停下询问) | 3 章拆解完成 |
219
- | 2 | 逐章摘要 | 分块章节文本 | 章节摘要.md(含情节点+角色+**关键信息与扩写技法**)。每章10-40情节点(密度150-200字/个,按字数动态调节)。角色过滤(龙套不提取、别名归类)。**并行 chapter-extractor agent 模式**(未部署 agent 时降级串行)。**计数验证:摘要数 == 章节数**。 | 所有章节处理完成 |
220
- | 3 | 聚合分析 | 全部章节摘要 | `剧情/*.md` + `剧情/README.md` + `剧情/故事线.md` + **`剧情/节奏.md` + `剧情/情绪模块.md`**。**故事框架识别**(前置)。**两步法剧情聚合**(先从摘要识别剧情大纲,再按大纲分配情节点)。**关键信息推进索引**、**情绪触动点与爆发节奏**、**读者需求 / 情绪引擎 / 可复现模块**。**角色合并**(跨章节去重+别名归一)。**角色分级**(主角/反派/核心配角/功能角色)。**散落情节兜底**(6步,含覆盖率验证)。**质量检查**(置信度>=0.85/覆盖率85%-95%/重叠率<=35%)。 | 质量检查通过 |
221
- | 4 | 设定+关系 | 阶段 3 合并后角色数据+情节点 | 设定/*.md + 角色/*.md。**两阶段角色模型**。**别名解析**(置信度≥0.85自动合并)。 | 设定和关系提取完成 |
222
- | 5 | 汇总报告 | 全部输出 | 拆文报告.md(含「读者需求 / 情绪引擎」「关键信息与扩写技法总览」「节奏与情绪触动点」「可复现模块」,并指向 `剧情/节奏.md` / `剧情/情绪模块.md`) | 报告生成完成 |
225
+ | 2 | 连续章节块提取 | 待处理连续原文、旧成果与跨块状态 | 同次产出 `章节/第N章_摘要.md`(含情节点序列)和 `_analysis_cache/批次-*.md`;每批最多 3 章,长章缩到 1-2 章;每章 10-20 个情节点,长章最多 30 | 可用正文覆盖完整,摘要数与可用章节数一致 |
226
+ | 3 | 聚合分析 | 批次观察、必要逐章事实与可复用旧资料 | `剧情/*.md` + `剧情/README.md` + `剧情/故事线.md` + **`剧情/节奏.md` + `剧情/情绪模块.md`**。在现有资料中补强因果链、客观事件/多次披露、信息差、事件/情绪/篇幅三维节奏及机制成立条件 | 质量检查通过 |
227
+ | 4 | 设定+关系 | 批次观察、阶段 3 归一实体与必要逐章事实 | 设定/*.md + 角色/*.md + 人物关系图。关系记录方向、触发、双方得失、阶段状态和证据 | 设定和关系提取完成 |
228
+ | 5 | 汇总报告 | 全部权威底层结果 | `拆文报告.md`:一份可独立阅读的人类主报告,嵌入可用人物关系图,不重新阅读全文 | 报告生成完成 |
223
229
  | 6 | 文风 | 拆文报告.md + 章节/第1-3章_深度拆解.md + 章节/*_摘要.md + 原文/原文.txt | 文风.md(本书历史写法分析) | 文风落盘 `拆文库/{导入书名}/文风.md`,保留为导入分析,不复制到本书 `对标/` |
224
230
 
225
231
  ### 短篇拆文管道
@@ -228,14 +234,14 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
228
234
 
229
235
  短篇为单一全量管道(Stage 2-6 严格串行),产物落盘 `拆文库/{导入书名}/`:Stage 2 结构+情节节点 → Stage 3 情感线+爆点 → Stage 4 反转+写作手法 → Stage 5 人物+开头结尾 → Stage 6 综合评估,最终汇总为 `拆文报告.md`、`情节节点.md`、`写作手法.md`,另有 `_meta.json` 记管道元数据与结构计数。
230
236
 
231
- 长篇分块沿用 story-long-analyze:Stage 2 用 chapter-extractor agent 并行,其余阶段按该 skill「分块策略」的章数阈值执行,story-import 不另定一套。
237
+ 长篇组块、旧成果复用和恢复全部沿用 story-long-analyze。Stage 2 每个连续章节批次只调用一次 chapter-extractor,同次生成逐章事实与跨章观察;story-import 不另定一套。
232
238
 
233
239
  ### 恢复机制
234
240
 
235
241
  - 中断时通过进度文件追踪进度
236
242
  - 新会话读取进度文件定位断点
237
- - 从断点所在块的起始章节恢复
238
- - 长篇进度文件格式沿用 story-long-analyze 拆解管道的进度段落约定,包含当前阶段、最后处理章节、已完成阶段列表、更新时间
243
+ - 先验证断点批次已经落盘的逐章文件和跨章缓存;完整则补记进度,缺失或损坏才从该批次起章恢复
244
+ - 长篇进度文件沿用 story-long-analyze 的 `_progress.md` 受管区:批次表、阶段表和 `最终状态`
239
245
 
240
246
  ### 质量检查
241
247
 
@@ -310,7 +316,7 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
310
316
 
311
317
  #### Step 5:同步世界观设定
312
318
 
313
- 当前拆文契约已按主题输出 `拆文库/{导入书名}/设定/世界观/*.md` 与 `设定/势力/*.md`。导入时原样同步到项目;`世界观/` 必须包含 `背景设定.md`。`力量体系.md` 小于 200 字并已并入 `背景设定.md` 时可省略;否则缺失当前必需产物时停止并提示重跑 story-long-analyze Stage 4。不再现场拆分扁平文件。
319
+ 当前拆文契约按主题输出 `拆文库/{导入书名}/设定/世界观/*.md` 与 `设定/势力/*.md`,导入时原样同步;`世界观/` 必须有 `背景设定.md`,短小力量体系可并入。当前产物缺失时停止并提示修复 Stage 4;检查器确认的旧成果则从已有扁平设定转换到当前项目路径,标注来源,不回写或覆盖拆文库。
314
320
 
315
321
  #### Step 6:大纲生成
316
322
 
@@ -401,7 +407,7 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
401
407
  > 项目 `追踪/` 里已有不属于当前协议的早期文件时不必手工清理:`init` 会先把它们按原样整体移入 `追踪/_旧追踪存档/`,再在原地建当前协议。旧内容保留供作者查阅,不参与解析,当前状态完全由本次导入输入决定;校验失败的 `init` 不移动任何文件。
402
408
 
403
409
  ```text
404
- {PYTHON} {story-import skill 根}/scripts/tracking_commit.py init --project {项目根} --input {初始化事务.json}
410
+ {PYTHON} {story-import skill 根}/scripts/tracking_commit.py init --project {项目根} --input {项目根}/.story/work/init.json
405
411
  {PYTHON} {story-import skill 根}/scripts/tracking_commit.py check --project {项目根}
406
412
  ```
407
413
 
@@ -437,8 +443,8 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
437
443
 
438
444
  **缺失处理**:
439
445
 
440
- - 已选外部对标缺 `剧情/节奏.md` 或 `剧情/情绪模块.md` → 不登记、不生成半套对标视图;报告 `module_or_rhythm_required_missing` 并提示对 `{对标书名}` 重跑 `/story-long-analyze` Stage 3+。本书核心工程迁移不因此回滚。
441
- - 其它结构化子目录缺失 → 按既有导入缺失项提示,不阻塞项目创建
446
+ - 已选外部对标缺 `剧情/节奏.md` 或 `剧情/情绪模块.md` → 导入报告里告诉作者「《{对标书名}》的拆文缺节奏和情绪资料,这本对标暂时用不上;重新拆一次(`/story-long-analyze`)补齐后再接入」,并停止该对标召回;不得用摘要或报告生成空壳。本书核心工程迁移不回滚。两份老权威产物都存在时正常同步,缺少本次新增内嵌字段不阻断。
447
+ - 其它结构化子目录缺失 → 在导入完成报告里用白话提示,不阻塞项目创建
442
448
 
443
449
  #### Step 10:文风同步
444
450
 
@@ -497,66 +503,56 @@ story-short-analyze 的拆解管道(Stage 2-6)本身**无 Stage 1 停靠点*
497
503
 
498
504
  ### Step 1:质量检查
499
505
 
500
- 按篇幅对照对应的质量检查清单:
506
+ 按篇幅对照对应的质量检查清单。这是你自己的自检,不念给作者:全部通过就不提;没通过先修,修不了才用故事话告诉作者影响和办法。
501
507
 
502
508
  - **长篇**:完整导入质量清单见 [references/structure-mapping-long.md](references/structure-mapping-long.md) 末尾(含正文文件数对照、核心角色独立快照、作者/读者时间线隔离、`tracking_commit.py check` 通过、卷划分已经用户确认等)。
503
509
  - **短篇**:质量清单见 [references/structure-mapping-short.md](references/structure-mapping-short.md) 末尾的质量检查清单(含 `正文.md` 单文件存在且格式合规、`设定.md` 含核心框架+本书续写基线、未误建长篇专属目录等)。
504
510
 
505
- ### Step 2:缺失项提示
511
+ ### Step 2:导入完成报告
506
512
 
507
- 输出导入结果摘要和待补充项,按篇幅分支。
513
+ 报告写给作者:导进来了什么、哪几处请他核对、要他拍板的事、下一步怎么说。字段名、脚本名、校验结果、字数口径、伏笔/事件编号不进报告;编号只能跟着故事描述出现(如「玉佩的来历(F003)」)。核对项要落到具体人和事,一次最多 5 条。
508
514
 
509
- **长篇导入完成报告**:
515
+ **长篇**:
510
516
 
511
- ```
512
- === 导入完成报告(长篇)===
513
- 书名:{导入书名}
514
- 源文件:{X} 章,{Y} 万字
515
- 项目目录:{路径}
516
-
517
- ## 已生成文件
518
- - 正文:{N} 章
519
- - 角色文件:{M} 个
520
- - 大纲:大纲.md + {V} 个卷纲 + {N} 个细纲
521
- - 追踪:唯一结构化 state + 核心角色独立派生快照 + 伏笔当前视图 + 时间线双视图 + 空逐章记录目录 + 固定 7 栏上下文
522
- - 设定:{世界观文件数} 个
523
- - 外部对标:{未绑定 / 已从 `拆文库/{对标书名}/` 同步到 `对标/{对标书名}/` / 绑定失败及修复动作}
524
-
525
- ## 待补充项
526
- - [ ] 细纲中的章首/章尾钩子需要补充
527
- - [ ] 题材定位的核心梗三分法需要确认
528
- - [ ] 伏笔追踪中的伏笔已复核
529
- - [ ] `追踪/时间线/读者已知.md` 未泄露 `作者真相.md` 中尚未揭示的事实
530
- - [ ] 卷划分已确认(原文无明确卷界时)
531
- - [ ] `拆文库/{导入书名}/` 未被复制到项目 `对标/`,本书未登记为自身对标
532
- - [ ] 若绑定外部对标,`设定/题材定位.md` 的 `主对标书` 与 `对标书列表` 只包含独立 `{对标书名}`,且同步来源与目录名一致
533
-
534
- ## 下一步操作
535
- - 运行 `/story-review lean` 审查导入结果
536
- - 运行 `/story-long-write` + "日更" 开始续写
537
- ```
517
+ <!-- author-report -->
518
+ ```md
519
+ === 《{导入书名}》导入完成 ===
520
+ 导进来了:第 1–{N} 章,约 {Y} 万字{;第 {N+1} 章只写了一半,按你的决定{接着残章写 | 先补完}}。项目在 `{项目目录}`。
521
+
522
+ 我整理出了:
523
+ - 人物:{M} 个角色档案,主要人物写到第 {N} 章时的处境已记下(如「{角色}:{一句话现状}」)
524
+ - 大纲:全书大纲、{V} 卷卷纲、每章细纲
525
+ - 还没收的线:{K} 条(如「{伏笔的故事描述}」)
526
+ - 时间线:真相和读者目前知道的分开记,续写时不会提前泄底
527
+ - 设定:{设定文件数} 份世界观资料
528
+ - 对标书:{没有绑定 | 已接入《{对标书名}》 | 没接上:原因和补救}
529
+
530
+ 请你核对:
531
+ 1. {最拿不准的一处,写成具体问题,如「第 5 章的黑衣人和第 2 章的车夫是同一人吗?」}
532
+ 2. {如「还没收的线里有没有漏的?我列的是:……」}
538
533
 
539
- **短篇导入完成报告**:
534
+ 需要你决定:{仅在有待定事项时写,如「原文没分卷,我按剧情分成 3 卷(1–40 / 41–95 / 96–{N} 章),这样分可以吗?」}
540
535
 
536
+ 下一步:说「日更」就从第 {N+1} 章接着写;想先检查导入质量,说「审一下」。
541
537
  ```
542
- === 导入完成报告(短篇)===
543
- 标题:{短篇标题}
544
- 源文件:{Y} 字
545
- 项目目录:{路径}
546
-
547
- ## 已生成文件
548
- - 正文.md(单文件,{Y} 字)
549
- - 设定.md(核心框架 + 本书续写基线)
550
- - 小节大纲.md({N} 个小节)
551
- - 外部对标:{未绑定 / `对标/{对标书名}/` 已同步 / 绑定失败及修复动作}
552
-
553
- ## 待补充项
554
- - [ ] 所有 [待补充] 标记的文件已复核
555
- - [ ] 小节大纲的章首/章尾钩子需要补充
556
- - [ ] 核心反转的铺垫线索已确认
557
-
558
- ## 下一步操作
559
- - 运行 `/story-short-write` Phase 3 开始续写
538
+
539
+ **短篇**:
540
+
541
+ <!-- author-report -->
542
+ ```md
543
+ === 《{短篇标题}》导入完成 ===
544
+ 导进来了:全文约 {Y} 字,分成 {N} 个小节。项目在 `{项目目录}`。
545
+
546
+ 我整理出了:
547
+ - 设定:核心框架和续写要守住的人物、情绪基调
548
+ - 小节大纲:{N} 节,每节讲了什么
549
+ - 对标书:{没有绑定 | 已接入《{对标书名}》 | 没接上:原因和补救}
550
+
551
+ 请你核对:
552
+ 1. {标了 [待补充] 的地方,写成问题,如「女主最后原谅他了吗?原文没写明」}
553
+ 2. {核心反转前埋的线索我找到的是:……,有没有漏的?}
554
+
555
+ 下一步:{没写完:运行 `/story-short-write` 说「接着写」,从第 {N+1} 节往下写 | 已完本:想改稿说「审一下」}。
560
556
  ```
561
557
 
562
558
  ### Step 3:项目激活
@@ -10,7 +10,7 @@
10
10
  |---|---|
11
11
  | `拆文库/{书名}/角色/{角色名}.md` | 身份、能力、目标、成长弧线、出场记录 |
12
12
  | `拆文库/{书名}/角色/角色关系.md` | 截至最后完整章的关键关系 |
13
- | `拆文库/{书名}/章节/第N章_摘要.md` | 最后位置、最新状态、已知信息与未结事项 |
13
+ | `拆文库/{书名}/章节/第N章_摘要.md` | 从 `涉及` 锁定相关章,从 `状态变化`、`信息变化`、`局面结果` 和 `章尾钩子` 提取最后位置、最新状态、已知信息与未结事项;旧摘要缺字段时回退其关键事件与情节点 |
14
14
  | `拆文库/{书名}/剧情/*.md` | 阵营/身份转折、阶段目标和长期冲突 |
15
15
  | 初始化事务中的伏笔与时间线候选 | 核对角色未结事项及其可知范围 |
16
16
 
@@ -108,7 +108,7 @@
108
108
 
109
109
  执行规则:
110
110
  - 写对话时先看角色关系和权力位置:强势角色常短句收束,试探角色多问号和半句,崩溃角色才允许少量感叹/省略。
111
- - 写叙述时用句长、逗号停顿和单句成段制造节奏;不要把破折号当节奏工具,对话里也不要用。
111
+ - 写叙述时用句长、逗号停顿和单句成段制造节奏;默认不用破折号硬造节奏;本书文风明确授权的功能性用法保留。
112
112
  - 精修时检查两类问题:**通篇句号化**(语气全被压平)与**随机标点堆砌**(问号/感叹号不承载情绪功能,或用省略号/破折号硬造停顿)。
113
113
  - 引号风格按项目/平台约定;知乎盐言的 `「」` 是合法对话格式,`quote-mode keep` 时不得擅自改掉。
114
114
 
@@ -163,6 +163,6 @@
163
163
  3. **避免对话标签机械化**:高频或公式化的「他说」「她道」「他笑了笑说」用动作/上下文替代;普通“说”可保留
164
164
  4. **禁止缩进**:不使用 `  `(全角空格)或半角空格缩进
165
165
  5. **禁止正文段落 Markdown 渲染**:除统一的小节/章节标记(如 `###1.`)外,正文段落中不使用加粗 `**`、斜体 `*`、标题 `#`、分隔线 `---` 等 Markdown 语法
166
- 6. **正文不使用破折号**:正文(含叙述、对话、心理描写)不使用破折号 `——`/`—` 或双连字符 `--`,改用句号、逗号、换行、动作 beat 或短句断开;不再设置“对话例外”
166
+ 6. **默认停顿写法**:正文默认用句号、逗号、换行、动作 beat 或短句承担停顿;本书明确选择的功能性破折号/省略号按调用方文风裁决与书级白名单保留。标点偏好不属于不可覆盖的文件结构协议。
167
167
  7. **禁止通篇句号化或随机标点堆砌**:标点必须跟语气/人物声线/情绪功能匹配;该质问时用问号,该爆发时少量感叹;犹豫、吞咽、未说完用动作或句长变化表达,不用 `……` / `——` 硬造停顿,也不得无功能地乱撒 `?`/`!`
168
168
  8. **禁止正文混入章节元信息**:章节号只允许出现在标题/小节标记/文件名/追踪记录中。正文叙述、对话、心理描写里不得出现 `第[一二三四五六七八九十百千万两0-9]+章|上一章|上章|前一章|本章|这一章|前文|后文|伏笔|细纲|读者` 这类写作工程词;要改成角色能感知的事件锚点或相对时间,例如把“比第一章那三秒开火更疼”改成“比那三秒开火更疼”。例外:角色在故事世界内真实阅读/讨论“第X章”文本,或真实身为作者/读者并谈论读者身份时,可保留相应词。