@oh-story/dsh 0.1.9 → 0.1.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (529) hide show
  1. package/README.md +14 -14
  2. package/lib/client.js +209 -73
  3. package/lib/client.js.map +3 -3
  4. package/lib/drama/manifest.json +248 -168
  5. package/lib/drama/skills/short-drama/SKILL.md +16 -4
  6. package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +3 -0
  7. package/lib/drama/skills/short-drama/references/creator-documents.md +3 -0
  8. package/lib/drama/skills/short-drama/references/knowhow-index.md +15 -0
  9. package/lib/drama/skills/short-drama/scripts/creator_markdown_check.py +14 -0
  10. package/lib/drama/skills/short-drama/scripts/project_tool.py +131 -0
  11. package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
  12. package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
  13. package/lib/drama/skills/short-drama-assets/references/character-and-look.md +10 -0
  14. package/lib/drama/skills/short-drama-assets/references/continuity-lock.md +6 -9
  15. package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
  16. package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
  17. package/lib/drama/skills/short-drama-assets/references/voice-direction.md +28 -0
  18. package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
  19. package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
  20. package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
  21. package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
  22. package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
  23. package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
  24. package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +1 -1
  25. package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
  26. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
  27. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/207/215/347/224/237/347/251/277/350/266/212.md +51 -0
  28. package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
  29. package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
  30. package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
  31. package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
  32. package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
  33. package/lib/drama/skills/short-drama-edit/SKILL.md +65 -44
  34. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
  35. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
  36. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
  37. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
  38. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
  39. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
  40. package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
  41. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
  42. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
  43. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
  44. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
  45. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
  46. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
  47. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
  48. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
  49. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
  50. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +6 -4
  51. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +26 -67
  52. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +31 -56
  53. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +42 -78
  54. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +44 -92
  55. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +14 -16
  56. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1272 -125
  57. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +113 -9
  58. package/lib/drama/skills/short-drama-image-prompts/SKILL.md +2 -0
  59. package/lib/drama/skills/short-drama-image-prompts/references/common-recipe.md +11 -0
  60. package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
  61. package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
  62. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
  63. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
  64. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
  65. package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
  66. package/lib/drama/skills/short-drama-produce/SKILL.md +5 -1
  67. package/lib/drama/skills/short-drama-produce/references/adapter-contract.md +14 -20
  68. package/lib/drama/skills/short-drama-produce/references/providers/minimax-h3-video.md +8 -26
  69. package/lib/drama/skills/short-drama-produce/references/providers/minimax-speech.md +41 -0
  70. package/lib/drama/skills/short-drama-produce/scripts/provider_adapters.py +142 -1
  71. package/lib/drama/skills/short-drama-review/SKILL.md +4 -5
  72. package/lib/drama/skills/short-drama-review/references/production-quality-gates.md +6 -19
  73. package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
  74. package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
  75. package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
  76. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +24 -35
  77. package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
  78. package/lib/drama/skills/short-drama-storyboard/SKILL.md +23 -11
  79. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
  80. package/lib/drama/skills/short-drama-storyboard/references/lighting-craft.md +39 -0
  81. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
  82. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +139 -34
  83. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +5 -3
  84. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +15 -12
  85. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +29 -0
  86. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
  87. package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
  88. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +52 -39
  89. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +24 -21
  90. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +9 -23
  91. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +14 -26
  92. package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
  93. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.0.md +2 -3
  94. package/lib/drama/skills/short-drama-video-prompts/references/seedance-2.5.md +34 -9
  95. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +3 -2
  96. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
  97. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
  98. package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
  99. package/lib/drama/skills/short-drama-write/SKILL.md +10 -7
  100. package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
  101. package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
  102. package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
  103. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
  104. package/lib/index.js +346 -98
  105. package/lib/index.js.map +4 -4
  106. package/lib/novel-to-game/README.md +299 -59
  107. package/lib/novel-to-game/README_ZH.md +299 -56
  108. package/lib/novel-to-game/VERSION +1 -1
  109. package/lib/novel-to-game/examples/jin-ping-mei/build/BUILD_BRIEF.md +3 -1
  110. package/lib/novel-to-game/examples/jin-ping-mei/build/app/RUN.md +11 -3
  111. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/new-guofeng.css +397 -8
  112. package/lib/novel-to-game/examples/jin-ping-mei/build/app/css/style.css +0 -31
  113. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/data.js +71 -73
  114. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/engine.js +78 -89
  115. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/main.js +37 -14
  116. package/lib/novel-to-game/examples/jin-ping-mei/build/app/js/text.js +5 -5
  117. package/lib/novel-to-game/examples/jin-ping-mei/build/app/package.json +2 -1
  118. package/lib/novel-to-game/examples/jin-ping-mei/qa/README.md +11 -16
  119. package/lib/novel-to-game/examples/jin-ping-mei/qa/verification.json +11 -11
  120. package/lib/novel-to-game/examples/jin-ping-mei/qa/verify_playable_model.mjs +23 -0
  121. package/lib/novel-to-game/manifest.json +77 -87
  122. package/lib/novel-to-game/skills/game-art-direction/SKILL.md +7 -12
  123. package/lib/novel-to-game/skills/game-art-direction/references/art-direction-method.md +27 -106
  124. package/lib/novel-to-game/skills/game-build/SKILL.md +13 -14
  125. package/lib/novel-to-game/skills/game-build/references/blender-asset-workflow.md +24 -0
  126. package/lib/novel-to-game/skills/game-build/references/build-brief-contract.md +45 -82
  127. package/lib/novel-to-game/skills/game-build/references/generative-media-pipeline.md +14 -45
  128. package/lib/novel-to-game/skills/game-build/references/playable-model-contract.md +30 -65
  129. package/lib/novel-to-game/skills/game-build/references/tts-production-contract.md +13 -27
  130. package/lib/novel-to-game/skills/game-concept/SKILL.md +13 -15
  131. package/lib/novel-to-game/skills/game-concept/references/concept-method.md +28 -75
  132. package/lib/novel-to-game/skills/game-qa/SKILL.md +6 -7
  133. package/lib/novel-to-game/skills/game-qa/references/test-design-method.md +9 -5
  134. package/lib/novel-to-game/skills/game-world-design/SKILL.md +12 -16
  135. package/lib/novel-to-game/skills/game-world-design/references/narrative-design-method.md +23 -72
  136. package/lib/novel-to-game/skills/game-world-design/references/numeric-design-method.md +14 -48
  137. package/lib/novel-to-game/skills/game-world-design/references/world-design-method.md +36 -103
  138. package/lib/novel-to-game/skills/novel-game-analyze/SKILL.md +4 -10
  139. package/lib/novel-to-game/skills/novel-game-analyze/references/gameability-protocol.md +4 -4
  140. package/lib/novel-to-game/skills/novel-to-game/SKILL.md +9 -21
  141. package/lib/novel-to-game/skills/novel-to-game/references/intake-method.md +5 -4
  142. package/lib/novel-to-game/skills/novel-to-game/references/pipeline-contract.md +5 -8
  143. package/lib/oh-story/manifest.json +607 -327
  144. package/lib/oh-story/roles/chapter-extractor.md +177 -237
  145. package/lib/oh-story/roles/character-designer.md +1 -2
  146. package/lib/oh-story/roles/consistency-checker.md +15 -13
  147. package/lib/oh-story/roles/narrative-writer.md +36 -38
  148. package/lib/oh-story/roles/story-architect.md +9 -61
  149. package/lib/oh-story/roles/story-explorer.md +20 -125
  150. package/lib/oh-story/roles/story-researcher.md +0 -1
  151. package/lib/oh-story/skills/story/SKILL.md +15 -9
  152. package/lib/oh-story/skills/story/VERSION +1 -1
  153. package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
  154. package/lib/oh-story/skills/story/references/author-memory.md +46 -94
  155. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +934 -170
  156. package/lib/oh-story/skills/story-cover/SKILL.md +10 -1
  157. package/lib/oh-story/skills/story-deslop/SKILL.md +59 -73
  158. package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
  159. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +12 -11
  160. package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
  161. package/lib/oh-story/skills/story-deslop/references/author-memory.md +46 -94
  162. package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
  163. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +22 -5
  164. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
  165. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +934 -170
  166. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
  167. package/lib/oh-story/skills/story-import/SKILL.md +64 -584
  168. package/lib/oh-story/skills/story-import/references/character-state-reverse.md +1 -1
  169. package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
  170. package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
  171. package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
  172. package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
  173. package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
  174. package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
  175. package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
  176. package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
  177. package/lib/oh-story/skills/story-import/references/state-tracking.md +4 -69
  178. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +98 -92
  179. package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
  180. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
  181. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +15 -11
  182. package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
  183. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +132 -27
  184. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +478 -15
  185. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +182 -23
  186. package/lib/oh-story/skills/story-long-analyze/SKILL.md +81 -270
  187. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +252 -0
  188. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +3 -3
  189. package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
  190. package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
  191. package/lib/oh-story/skills/story-long-analyze/references/inspiration-library.md +105 -0
  192. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +138 -64
  193. package/lib/oh-story/skills/story-long-analyze/references/semantic-acceptance-fixtures.md +84 -0
  194. package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
  195. package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
  196. package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
  197. package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
  198. package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
  199. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +55 -128
  200. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +6 -6
  201. package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
  202. package/lib/oh-story/skills/story-long-analyze/scripts/build_chapter_index.py +466 -0
  203. package/lib/oh-story/skills/story-long-analyze/scripts/inspect_existing_assets.py +702 -0
  204. package/lib/oh-story/skills/story-long-analyze/scripts/inspiration_index.py +864 -0
  205. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +1145 -0
  206. package/lib/oh-story/skills/story-long-analyze/scripts/render_relation_chart.py +425 -0
  207. package/lib/oh-story/skills/story-long-scan/SKILL.md +45 -194
  208. package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
  209. package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
  210. package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
  211. package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
  212. package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
  213. package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
  214. package/lib/oh-story/skills/story-long-write/SKILL.md +49 -81
  215. package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
  216. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +12 -11
  217. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +24 -202
  218. package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
  219. package/lib/oh-story/skills/story-long-write/references/author-memory.md +46 -94
  220. package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
  221. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +7 -11
  222. package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
  223. package/lib/oh-story/skills/story-long-write/references/cross-book-recall.md +26 -0
  224. package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
  225. package/lib/oh-story/skills/story-long-write/references/dialogue-mastery.md +4 -0
  226. package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
  227. package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
  228. package/lib/oh-story/skills/story-long-write/references/emotional-methods.md +2 -2
  229. package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
  230. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +7 -15
  231. package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
  232. package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
  233. package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
  234. package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
  235. package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
  236. package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
  237. package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
  238. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
  239. package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
  240. package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
  241. package/lib/oh-story/skills/story-long-write/references/project-files.md +19 -13
  242. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +13 -5
  243. package/lib/oh-story/skills/story-long-write/references/reference-index.md +5 -6
  244. package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
  245. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
  246. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  247. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
  248. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
  249. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +15 -11
  250. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +81 -121
  251. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +41 -139
  252. package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
  253. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +57 -67
  254. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -253
  255. package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
  256. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +6 -4
  257. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +19 -65
  258. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +934 -170
  259. package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
  260. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +226 -25
  261. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
  262. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +132 -27
  263. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
  264. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +7 -4
  265. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +304 -46
  266. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +478 -15
  267. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +182 -23
  268. package/lib/oh-story/skills/story-review/SKILL.md +31 -302
  269. package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
  270. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +12 -11
  271. package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
  272. package/lib/oh-story/skills/story-review/references/author-memory.md +46 -94
  273. package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
  274. package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
  275. package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
  276. package/lib/oh-story/skills/story-review/references/dialogue-mastery.md +4 -0
  277. package/lib/oh-story/skills/story-review/references/review-quality.md +6 -11
  278. package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
  279. package/lib/oh-story/skills/story-review/references/solo.md +52 -0
  280. package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
  281. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
  282. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +15 -11
  283. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +934 -170
  284. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
  285. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +478 -15
  286. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +182 -23
  287. package/lib/oh-story/skills/story-setup/SKILL.md +71 -452
  288. package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
  289. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +12 -11
  290. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
  291. package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
  292. package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
  293. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +22 -5
  294. package/lib/oh-story/skills/story-setup/references/agent-references/dialogue-mastery.md +4 -0
  295. package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
  296. package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
  297. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
  298. package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
  299. package/lib/oh-story/skills/story-setup/references/agent-references/long-emotional-methods.md +2 -2
  300. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
  301. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
  302. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
  303. package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
  304. package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
  305. package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
  306. package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
  307. package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
  308. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
  309. package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
  310. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
  311. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  312. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
  313. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +19 -65
  314. package/lib/oh-story/skills/story-setup/references/diagnostics.md +4 -4
  315. package/lib/oh-story/skills/story-short-analyze/SKILL.md +56 -110
  316. package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
  317. package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
  318. package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
  319. package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
  320. package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
  321. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
  322. package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
  323. package/lib/oh-story/skills/story-short-analyze/references/stage4-6-reversal-summary.md +611 -0
  324. package/lib/oh-story/skills/story-short-scan/SKILL.md +35 -65
  325. package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
  326. package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
  327. package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
  328. package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
  329. package/lib/oh-story/skills/story-short-write/SKILL.md +23 -175
  330. package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
  331. package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
  332. package/lib/oh-story/skills/story-short-write/references/author-memory.md +46 -94
  333. package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
  334. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
  335. package/lib/oh-story/skills/story-short-write/references/dialogue-mastery.md +4 -0
  336. package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
  337. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
  338. package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
  339. package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -47
  340. package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
  341. package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
  342. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
  343. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
  344. package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
  345. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
  346. package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
  347. package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
  348. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +21 -13
  349. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +116 -0
  350. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +99 -0
  351. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
  352. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +934 -170
  353. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
  354. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
  355. package/lib/types/client/drama-production-view.d.ts.map +1 -1
  356. package/lib/types/client/file-activity.d.ts +19 -1
  357. package/lib/types/client/file-activity.d.ts.map +1 -1
  358. package/lib/types/client/index.d.ts.map +1 -1
  359. package/lib/types/client/production-prompts.d.ts +7 -0
  360. package/lib/types/client/production-prompts.d.ts.map +1 -1
  361. package/lib/types/client/production-runtime.d.ts +16 -0
  362. package/lib/types/client/production-runtime.d.ts.map +1 -1
  363. package/lib/types/client/video-studio.d.ts.map +1 -1
  364. package/lib/types/drama-adapters.d.ts +5 -3
  365. package/lib/types/drama-adapters.d.ts.map +1 -1
  366. package/lib/types/native-hooks.d.ts +53 -1
  367. package/lib/types/native-hooks.d.ts.map +1 -1
  368. package/lib/types/role-identity.d.ts +17 -0
  369. package/lib/types/role-identity.d.ts.map +1 -0
  370. package/lib/types/role-tool.d.ts.map +1 -1
  371. package/lib/types/skill-provider.d.ts.map +1 -1
  372. package/lib/types/video-project.d.ts.map +1 -1
  373. package/lib/types/workspace-route.d.ts.map +1 -1
  374. package/lib/video-recap/CHANGELOG.md +60 -1
  375. package/lib/video-recap/README.en.md +348 -137
  376. package/lib/video-recap/README.md +340 -136
  377. package/lib/video-recap/manifest.json +406 -251
  378. package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
  379. package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
  380. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
  381. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
  382. package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
  383. package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
  384. package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
  385. package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
  386. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
  387. package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
  388. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
  389. package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
  390. package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
  391. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
  392. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
  393. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
  394. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
  395. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
  396. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
  397. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
  398. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
  399. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
  400. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
  401. package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
  402. package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
  403. package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
  404. package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
  405. package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
  406. package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
  407. package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
  408. package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
  409. package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
  410. package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
  411. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
  412. package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
  413. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
  414. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
  415. package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
  416. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
  417. package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
  418. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
  419. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
  420. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
  421. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
  422. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
  423. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
  424. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
  425. package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
  426. package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
  427. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
  428. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
  429. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
  430. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
  431. package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
  432. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
  433. package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
  434. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
  435. package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
  436. package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
  437. package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
  438. package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
  439. package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
  440. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
  441. package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
  442. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
  443. package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
  444. package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
  445. package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
  446. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
  447. package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
  448. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
  449. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
  450. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
  451. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
  452. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
  453. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
  454. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
  455. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
  456. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
  457. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
  458. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
  459. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
  460. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
  461. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
  462. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
  463. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
  464. package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
  465. package/lib/video-recap/skills/video-script/SKILL.md +16 -13
  466. package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
  467. package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
  468. package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
  469. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
  470. package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
  471. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
  472. package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
  473. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
  474. package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
  475. package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
  476. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
  477. package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
  478. package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
  479. package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
  480. package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
  481. package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
  482. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
  483. package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
  484. package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
  485. package/lib/video-recap/skills/{video-script/scripts/agent_brief.py → video-understanding/scripts/briefing/builder.py} +38 -35
  486. package/lib/video-recap/skills/video-understanding/scripts/{brief_context.py → briefing/context.py} +4 -35
  487. package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
  488. package/lib/video-recap/skills/{video-script/scripts/brief_timeline.py → video-understanding/scripts/briefing/timeline.py} +5 -6
  489. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
  490. package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
  491. package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
  492. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
  493. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
  494. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
  495. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
  496. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
  497. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
  498. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
  499. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
  500. package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
  501. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
  502. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
  503. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
  504. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
  505. package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
  506. package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
  507. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
  508. package/package.json +45 -45
  509. package/lib/novel-to-game/skills/game-world-design/references/dialogue-design-method.md +0 -58
  510. package/lib/novel-to-game/skills/game-world-design/references/game-writing-craft.md +0 -53
  511. package/lib/novel-to-game/skills/novel-to-game/references/intake-benchmark-reference.md +0 -38
  512. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -530
  513. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -559
  514. package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
  515. package/lib/oh-story/skills/story-long-write/references/state-tracking.md +0 -108
  516. package/lib/oh-story/skills/story-short-analyze/references/material-decomposition.md +0 -678
  517. package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
  518. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
  519. package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
  520. package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
  521. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
  522. package/lib/video-recap/skills/video-script/scripts/brief_context.py +0 -348
  523. package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
  524. package/lib/video-recap/skills/video-understanding/scripts/agent_brief.py +0 -399
  525. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
  526. package/lib/video-recap/skills/video-understanding/scripts/brief_timeline.py +0 -327
  527. /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
  528. /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
  529. /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
@@ -1,140 +1,301 @@
1
- # video-recap-skills
1
+ <p align="center">
2
+ <img src="https://zenstory.ai/brand/zenstory-ai-mark.svg" alt="" width="76" height="76">
3
+ </p>
4
+
5
+ <h1 align="center">Video Recap Skills</h1>
6
+
7
+ <p align="center">
8
+ <b>把一段或几段视频做成中文解说成片:六个技能装进你正在用的编程 Agent,本地只要 ffmpeg,远程只要一个小米 MiMo key,成片还能一键导成剪映草稿接着改。</b>
9
+ </p>
10
+
11
+ <p align="center">
12
+ <a href="https://zenstory.ai/zh/video-recap"><b>项目主页</b></a>
13
+ &nbsp;·&nbsp;
14
+ <a href="#安装"><b>安装</b></a>
15
+ &nbsp;·&nbsp;
16
+ <a href="#看看它的输出"><b>看看它的输出</b></a>
17
+ &nbsp;·&nbsp;
18
+ <a href="README.en.md"><b>English</b></a>
19
+ </p>
20
+
21
+ <p align="center">
22
+ <a href="https://github.com/zenstory-ai/video-recap-skills/stargazers"><img alt="Stars" src="https://img.shields.io/github/stars/zenstory-ai/video-recap-skills?style=flat-square&color=22D3EE&logo=github&logoColor=white&label=Stars"></a>
23
+ <a href="https://github.com/zenstory-ai/video-recap-skills/releases/latest"><img alt="Release" src="https://img.shields.io/github/v/release/zenstory-ai/video-recap-skills?style=flat-square&color=081431&label=Release"></a>
24
+ <img alt="Skills 6" src="https://img.shields.io/badge/Skills-6-081431?style=flat-square">
25
+ <a href="https://www.python.org/"><img alt="Python 3.10%2B" src="https://img.shields.io/badge/Python-3.10%2B-3776AB?style=flat-square&logo=python&logoColor=white"></a>
26
+ <a href="https://github.com/zenstory-ai/video-recap-skills/actions/workflows/skill-validate.yml"><img alt="CI" src="https://img.shields.io/github/actions/workflow/status/zenstory-ai/video-recap-skills/skill-validate.yml?style=flat-square&label=CI"></a>
27
+ <a href="https://platform.xiaomimimo.com"><img alt="AI Xiaomi%20MiMo" src="https://img.shields.io/badge/AI-Xiaomi%20MiMo-34A853?style=flat-square"></a>
28
+ <a href="./LICENSE"><img alt="License MIT" src="https://img.shields.io/badge/License-MIT-1F6FEB?style=flat-square"></a>
29
+ </p>
30
+
31
+ <p align="center">
32
+ <a href="https://github.com/zenstory-ai/video-recap-skills/issues"><img alt="GitHub Issues" src="https://img.shields.io/badge/GitHub%20Issues-181717?style=for-the-badge&logo=github&logoColor=white"></a>
33
+ </p>
34
+
35
+ <video src="https://github.com/user-attachments/assets/f3c2df0c-6869-4f5b-8f4c-cce70b58b667" controls muted playsinline width="100%"></video>
36
+
37
+ 上面这条 59 秒横屏解说《这一秒过火》,是从四集短剧里选段、剪辑、写稿、配音、混音、包装并经多轮看片修改后的最终交付;
38
+ 它的全部创作产物(故事计划、声音分工、旁白、时间线、QC 报告、看片修改记录、Remotion 包装源码)都在
39
+ [examples/guohuo-60s/](examples/guohuo-60s/),下文的节选全部来自这些文件。
2
40
 
3
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
4
- ![Claude Code Plugin](https://img.shields.io/badge/Claude%20Code-Plugin-purple)
5
- ![Powered by Xiaomi MiMo](https://img.shields.io/badge/AI-Xiaomi%20MiMo-green)
6
- ![Fish Audio TTS](https://img.shields.io/badge/TTS-Fish%20Audio-blue)
41
+ ## 这是什么
7
42
 
8
- 中文 · [English](README.en.md)
43
+ 六个技能装进 Claude Code、Codex CLI、OpenCode 或 OpenClaw,你用自然语言给出视频路径和想要的成片,Agent 负责理解画面与对白、
44
+ 决定故事与视听方案、剪辑、写稿、配音、混音和字幕。支持 `.mp4 / .mov / .mkv / .webm`。
9
45
 
10
- **在 Claude Code、Codex CLI、OpenCode 或 OpenClaw 里,用一句自然语言把视频变成中文解说成片。** 本地只需要 Python、`ffmpeg` 和一个小米 MiMo API Key,其中 TTS 也可切换到 Fish Audio。不用 GPU,不用下载模型,macOS / Linux / Windows 均可运行。
46
+ - **一个 key,本地只要 ffmpeg。** ASR、VLM、TTS 都走[小米 MiMo](https://platform.xiaomimimo.com),本地只用 Python 标准库和 `ffmpeg`,不需要 GPU,不需要 `pip install`,也不下载模型。配音可以换成 Fish Audio,只替换配音这一段。
47
+ - **先做创作决定,再分配声音。** Agent 先比较剪辑假设,把观众承诺、POV、戏剧问题和"发生了什么变化"的 beat 写进 `recap_story_plan.json`,再给每一拍指定画面任务和声音归属:旁白只在有明确任务时整块配音,强对白、动作声或沉默可以完整主导一拍。
48
+ - **先剪后配,时间轴天然对齐。** 剪辑模式先把长视频剪成成片,再对着成片写解说;一次可以传多个视频,按 `source_id` 选段剪成一条主线;每个视频的分析沉淀成文件系统素材库,下次直接复用。
49
+ - **成片之外还能继续改。** 多轨时间线 `timeline.json` 可一键导出剪映草稿,原片、解说、BGM、字幕、图片叠层都可编辑;自带一份准确字幕文件就会被当作原声字幕的首选来源。
50
+ - **每一步都留下可核对的记录。** 旁白 lint、组装 QC、交付 QC 和看片修改日志都是机器可读文件;可选的 MiMo 成片顾问只给建议,缺 key、限流或超时都不会阻断出片。
11
51
 
12
- ## 演示
52
+ ## 安装
13
53
 
14
- <video src="https://github.com/user-attachments/assets/f3c2df0c-6869-4f5b-8f4c-cce70b58b667" width="640" controls></video>
54
+ 前提:Python 3.10 或更新版本,`PATH` 上有带 libass 的 `ffmpeg`(默认烧录字幕),以及一个[小米 MiMo](https://platform.xiaomimimo.com) API Key。
15
55
 
16
- [查看《这一秒过火》60 秒解说的完整 Skill 工程、Remotion 包装源码](examples/guohuo-60s/)
56
+ ```bash
57
+ brew install ffmpeg # macOS;Debian/Ubuntu 用 apt,Windows 用 choco / scoop / winget
58
+ export MIMO_API_KEY=your-mimo-key # Windows PowerShell:$env:MIMO_API_KEY="your-mimo-key"
59
+ export MIMO_TOKEN_PLAN_CLUSTER=cn # 仅 tp-* Token Plan key 需要:cn | sgp | ams
60
+ ```
17
61
 
18
- 该案例展示核心 cut、音画锁定、包装探索、看片反馈、二次剪辑,也包含多集选段、原声/旁白分工、Fish Audio 配音与 TTS 对齐字幕,以及通过恢复源镜头连续性修复不自然接点。
62
+ MiMo 不需要订阅,`sk-*` key 按量付费;本项目实测一条完整视频约 1.3 元,费用随视频时长和调用量变化。
19
63
 
20
- 成片之外,还能一键导出**剪映草稿**手动精修,原片、解说、BGM、字幕:
64
+ 在 Claude Code 里执行:
21
65
 
22
- <img alt="导出的剪映草稿:原片、解说、BGM、字幕" src="docs/jianying-export.png" width="100%">
66
+ ```text
67
+ /plugin marketplace add zenstory-ai/video-recap-skills
68
+ /plugin install video-recap-skills@video-recap
69
+ ```
23
70
 
24
- ## 这是什么
71
+ 也可以直接说一句话(支持导入 GitHub 仓库的 Agent 都适用):
25
72
 
26
- ```mermaid
27
- flowchart LR
28
- video(["视频"]) --> understand["① 理解<br/>场景 · ASR · VLM"]
29
- research["背景调研 · 可选"] -.-> understand
30
- understand --> script["② 导演 · 剪辑 · 写稿<br/>Agent"] --> voiceover["③ 配音<br/>MiMo / Fish Audio"] --> assemble["④ 组装<br/>混音 · 字幕"] --> output(["Recap"])
31
- understand -. 剪辑模式 · 先剪后配 .-> cut["剪辑<br/>先剪成片"] -.-> script
32
- classDef io fill:#4f86c6,stroke:#3a6298,color:#fff;
33
- classDef stage fill:#eef6ff,stroke:#4f86c6,color:#1f2937;
34
- classDef opt fill:#f3f4f6,stroke:#9ca3af,color:#475569;
35
- class video,output io;
36
- class understand,script,voiceover,assemble stage;
37
- class research,cut opt;
73
+ ```text
74
+ 安装这个插件:https://github.com/zenstory-ai/video-recap-skills
38
75
  ```
39
76
 
40
- ## 为什么用它
77
+ <details>
78
+ <summary><strong>Codex CLI、OpenCode、OpenClaw</strong></summary>
41
79
 
42
- - **一个 key 跑全程。** ASR、VLM、TTS 均走[小米 MiMo](https://platform.xiaomimimo.com);本地运行时只有 Python 标准库和 `ffmpeg`。
43
- - **TTS 可切 Fish Audio。** `--tts-provider fish-audio` 即可使用 Fish Audio;当前 `s2.1-pro-free` 免费模型适合开发、试用和非 SLA 场景,也保留 MiMo 默认路径。
44
- - **该查资料时先查。** 片名/剧情明确或 brief 提示素材偏薄时,把人物关系、剧情背景存进 `background_research.json`,VLM 才更容易认出谁是谁。
45
- - **先做创作决定,再分配声音。** Agent 先比较剪辑假设,锁定 POV、主线、具体画面与原声锚点;旁白有明确任务时才整块配音,强对白、动作声或沉默可以完整主导一个 beat。
46
- - **先剪后配,画面对齐。** 剪辑模式先把长视频剪成成片,再对着成片写解说,时间轴天然对齐。
47
- - **多视频也能剪,分析可复用。** 一次传多个视频,按 `source_id` 选段剪成一个成片;每个视频的分析沉淀为文件系统素材库,下次可复用。
48
- - **能接着在剪映里改。** 可选导出 schema-driven 的多轨剪映草稿,原片、解说、BGM、字幕和本地图片叠层都可编辑;视频/音频/图片默认打包进 `Resources/local` 并建立素材索引,clone 或搬目录后仍可用。ffmpeg 仍是最终成片的判定标准。
49
- - **可选 MiMo 成片顾问。** 需要时可让 MiMo 在合成前或成片后给出语义/审美建议;缺 key、限流、超时或模型输出异常都只提示,不会阻断。
80
+ **Codex CLI**
50
81
 
51
- ## 安装
52
-
53
- ### 1. 通用前置
82
+ ```bash
83
+ codex plugin marketplace add zenstory-ai/video-recap-skills
84
+ codex plugin add video-recap-skills@video-recap
85
+ ```
54
86
 
55
- - Python 3.10+
56
- - `PATH` 上可用的 `ffmpeg`;默认烧录字幕,因此需要带 libass / `subtitles` 滤镜
57
- - 一个[小米 MiMo](https://platform.xiaomimimo.com) API Key,驱动 ASR、VLM 和 TTS
87
+ **OpenCode**:按[官方 Agent Skills 文档](https://opencode.ai/docs/skills/),项目级技能放在 `.opencode/skills/<name>/SKILL.md`。克隆仓库后从仓库目录启动:
58
88
 
59
89
  ```bash
60
- brew install ffmpeg # macOS
61
- sudo apt install ffmpeg # Debian / Ubuntu
62
- choco install ffmpeg # Windows,也可用 scoop / winget
90
+ git clone https://github.com/zenstory-ai/video-recap-skills.git
91
+ cd video-recap-skills
92
+ mkdir -p .opencode
93
+ ln -s ../skills .opencode/skills # Windows 把 skills\* 复制到 .opencode\skills\
94
+ opencode debug skill # 应列出全部 6 个技能
95
+ ```
63
96
 
64
- export MIMO_API_KEY=your-mimo-key # macOS / Linux
65
- export MIMO_TOKEN_PLAN_CLUSTER=cn # tp-* key 可选:cn | sgp | ams
97
+ **OpenClaw**:克隆后导入 Claude 插件包:
98
+
99
+ ```bash
100
+ openclaw plugins install ./video-recap-skills
101
+ openclaw skills list
66
102
  ```
67
103
 
68
- Windows PowerShell 使用 `$env:MIMO_API_KEY="your-mimo-key"`。MiMo 不一定要开通订阅:`sk-*` key 可直接按量付费,按本项目一次完整视频实测,一条视频仅消耗约 1.3 元(实际费用会随视频时长和调用量变化),默认连接 `https://api.xiaomimimo.com/v1`。
104
+ 同一份技能只注册到一个发现目录,否则会重名或重复触发。
105
+
106
+ </details>
69
107
 
70
- 如需使用 Fish Audio 免费 TTS:
108
+ <details>
109
+ <summary><strong>可选:用 Fish Audio 配音</strong></summary>
71
110
 
72
111
  ```bash
73
112
  export TTS_PROVIDER=fish-audio
74
113
  export FISH_API_KEY=your-fish-key
75
- export FISH_TTS_REFERENCE_ID=your-voice-model-id # 可选;内置了“娱乐扒妹”解说音色
114
+ export FISH_TTS_REFERENCE_ID=your-voice-model-id # 可选;默认内置"娱乐扒妹"解说音色
76
115
  ```
77
116
 
78
- 当前默认使用 `s2.1-pro-free` 和“娱乐扒妹”音色(reference ID:`5653cea4ac83480aaf2bf45406556185`);设置 `FISH_TTS_REFERENCE_ID` 可覆盖默认音色。[Fish Audio 官方现行说明](https://fish.audio/blog/s2-1-pro-free-api/?articleLocale=en)为免费开放至 **2026-08-31**。
79
-
80
- ### 2. 选择 Agent 宿主
117
+ 默认模型 `s2.1-pro-free`,默认音色"娱乐扒妹"(reference ID `5653cea4ac83480aaf2bf45406556185`),计费以 Fish Audio 官方为准。ASR 和 VLM 仍走 MiMo;本地参考音频克隆(`--voice-ref`)只在 MiMo 路径可用。
81
118
 
82
- #### Claude Code
119
+ </details>
83
120
 
84
- 在 Claude Code 内执行:
121
+ 装好后让 Agent 自检一次:
85
122
 
86
123
  ```text
87
- /plugin marketplace add zenstory-ai/video-recap-skills
88
- /plugin install video-recap-skills@video-recap
124
+ 检查 video-recap 的运行环境,告诉我 Python、ffmpeg/libass 和 MiMo 配置是否就绪。
89
125
  ```
90
126
 
91
- 也可以直接说:
127
+ > 变更见 [CHANGELOG.md](CHANGELOG.md) 与 [Releases](https://github.com/zenstory-ai/video-recap-skills/releases)。仓库已从 `worldwonderer/video-recap-skills` 迁到 `zenstory-ai/video-recap-skills`,按旧地址安装的用户请重新指向新仓库。
92
128
 
93
- ```text
94
- 安装这个插件:https://github.com/zenstory-ai/video-recap-skills
95
- ```
129
+ ## 看看它的输出
96
130
 
97
- #### Codex CLI
131
+ 下面每一段都摘自 [examples/guohuo-60s/](examples/guohuo-60s/) 里的真实文件,省略处用"…"标出。案例的输入是《这一秒过火》第 2、3、6、21 集,仓库只收录结构化产物,不含原剧音视频。
98
132
 
99
- ```bash
100
- codex plugin marketplace add zenstory-ai/video-recap-skills
101
- codex plugin add video-recap-skills@video-recap
133
+ ### 故事计划先写清"观众承诺",再写每一拍的变化
134
+
135
+ Agent 在剪任何一刀之前先写 [`recap_story_plan.json`](examples/guohuo-60s/recap_story_plan.json)。导演意图是四个问题的答案:承诺什么、跟谁的视角、观众带着什么问题看、什么信息留到最后:
136
+
137
+ ```json
138
+ "director_intent": {
139
+ "viewer_promise": "60秒看懂死而复生的白月光为什么让男主一秒破防,并用三个名场面把关系推到婚服送嫁。",
140
+ "pov": "跟随慕容清峄的认知与反应,让观众和他一起从震惊、发疯走到确认她仍会护他。",
141
+ "dramatic_question": "她既然装作陌生人,为什么眼神、亲吻和保护都在暴露旧情?",
142
+ "emotional_start": "荒诞吃瓜式震惊",
143
+ "emotional_end": "抓马又上头的未完待续",
144
+ "ending_aftertaste": "明明相爱却要嫁给哥哥的强悬念",
145
+ "withhold_reveal": "前8秒先揭示准大嫂身份;中段以洗手台和护夫逐步证明旧情;最后才亮婚服。"
146
+ },
102
147
  ```
103
148
 
104
- #### OpenCode
149
+ 每个 beat 记的不是场景摘要,而是"发生了什么变化"、观众带着哪个问题进来、带着哪个问题出去,以及必须保住的具体时刻和证据来源(10 拍节选 1 拍):
150
+
151
+ ```json
152
+ {
153
+ "beat_id": "b03",
154
+ "source_id": "episode-03",
155
+ "source_start": 1292.0,
156
+ "source_end": 1305.5,
157
+ "function": "escalation",
158
+ "event": "男主堵住女主说出日日夜夜想她与挫骨扬灰",
159
+ "change": "power: 女主回避→男主逼问",
160
+ "audience_question_in": "男主会忍吗",
161
+ "audience_question_out": "狠话里全是想念",
162
+ "character_focus": "慕容清峄",
163
+ "must_keep_moment": "完整原声“我日日夜夜地想你…挫骨扬灰”",
164
+ "evidence": ["asr", "vlm", "hard_subtitle"]
165
+ },
166
+ ```
105
167
 
106
- [OpenCode 官方 Agent Skills 文档](https://opencode.ai/docs/skills/)规定项目级技能放在 `.opencode/skills/<name>/SKILL.md`。克隆仓库后,从仓库目录启动 OpenCode:
168
+ 这一拍在 [`clip_plan.json`](examples/guohuo-60s/clip_plan.json) 里变成一条带理由的选段,剪辑模式据此先剪出成片,再写旁白。
169
+
170
+ ### 旁白让位给原声:谁主导这一拍是写在文件里的
171
+
172
+ [`visual_audio_board.json`](examples/guohuo-60s/visual_audio_board.json) 给每一拍指定 `audio_owner`。上面那一拍由原声主导,旁白任务是 `none`,播放速度锁定 1.0(10 拍节选 1 拍):
173
+
174
+ ```json
175
+ {
176
+ "beat_id": "b03",
177
+ "source_id": "episode-03",
178
+ "source_start": 1292.0,
179
+ "source_end": 1305.24,
180
+ "output_start": 9.206666,
181
+ "output_end": 22.446666,
182
+ "picture_job": "performance",
183
+ "preferred_moment": "完整原声“我日日夜夜地想你…挫骨扬灰”",
184
+ "entry_reason": "尽量晚进到信息/动作将发生前",
185
+ "exit_reason": "台词、动作或反应完整落地后立即离开",
186
+ "audio_owner": "original_dialogue",
187
+ "original_audio_anchor": "完整原声“我日日夜夜地想你…挫骨扬灰”",
188
+ "narration_job": "none",
189
+ "handoff": "旁白先补关系,原声/动作发生时完全让位;下一拍承接人物反应。",
190
+ "playback_speed": 1.0
191
+ },
192
+ ```
107
193
 
108
- ```bash
109
- git clone https://github.com/zenstory-ai/video-recap-skills.git
110
- cd video-recap-skills
111
- mkdir -p .opencode
112
- ln -s ../skills .opencode/skills # macOS / Linux
113
- opencode debug skill
194
+ 于是 [`narration.json`](examples/guohuo-60s/narration.json) 全片只有 7 个旁白块,第二块在 10.2 秒停下,第三块到 23.047 秒才进来,中间 13 秒完整留给那句原声:
195
+
196
+ ```json
197
+ {
198
+ "start": 5.773,
199
+ "end": 10.2,
200
+ "narration": "她改名方牧兰,嘴上装作不认识,一个眼神就把三年前的旧情全招了。",
201
+ "pause_after_ms": 80,
202
+ "overlaps_speech": true,
203
+ "emotion": "调侃"
204
+ },
205
+ {
206
+ "start": 23.047,
207
+ "end": 26.5,
208
+ "narration": "天呐,狠话还没落地,下一秒两个人直接亲上了。",
209
+ "pause_after_ms": 50,
210
+ "overlaps_speech": true,
211
+ "emotion": "吃瓜、上头"
212
+ },
114
213
  ```
115
214
 
116
- Windows 可把 `skills\*` 复制到 `.opencode\skills\`。本 PR 已在 OpenCode `1.14.32` 上实际验证:`opencode debug skill` 能发现全部 6 个技能。日常端到端制作使用 `video-recap`;只做策划或写稿时可调用 `video-script`;其余四个技能负责工具阶段。
215
+ 三段被保护的原声由 Agent 校对后写进 [`original_subtitles.json`](examples/guohuo-60s/original_subtitles.json),在留白处烧成「」字幕:
117
216
 
118
- #### OpenClaw
217
+ ```json
218
+ [
219
+ { "start": 4.133, "end": 5.053, "text": "大嫂。" },
220
+ { "start": 11.127, "end": 21.027, "text": "我好想你,日日夜夜地想你,想把你抽筋扒皮,挫骨扬灰。" },
221
+ { "start": 35.673, "end": 37.473, "text": "有我在,你别怕。" }
222
+ ]
223
+ ```
119
224
 
120
- 克隆仓库后导入 Claude 插件包,并检查技能列表:
225
+ 组装时 [`timeline.json`](examples/guohuo-60s/timeline.json) 的原声轨在每个旁白块处自动压低、块后恢复;这份时间线就是剪映草稿导出的来源。
226
+
227
+ ### 看片之后怎么改,改了什么、冻结了什么,都有账
228
+
229
+ 案例经历了四轮修改,每轮在 [`revision-log.json`](examples/guohuo-60s/revision-log.json) 里写成三项:改什么、冻结什么、怎么验证。最后一轮只解冻画面:
230
+
231
+ ```json
232
+ {
233
+ "baseline": "final_picture_conform",
234
+ "scope": "picture_conform",
235
+ "change_set": [
236
+ "remove the visible tail-frame pause near 42.08 seconds",
237
+ "restore continuous source movement around 46.24 seconds"
238
+ ],
239
+ "frozen_set": [
240
+ "story and narration",
241
+ "all audio",
242
+ "caption timing and typography",
243
+ "title and accent graphics"
244
+ ],
245
+ "verification": [
246
+ "normal-speed full watch",
247
+ "join playback around both change points",
248
+ "freeze detection as supporting evidence",
249
+ "audio stream-copy verification",
250
+ "full decode"
251
+ ]
252
+ }
253
+ ```
121
254
 
122
- ```bash
123
- openclaw plugins install ./video-recap-skills
124
- openclaw skills list
255
+ [`edit-map.json`](examples/guohuo-60s/edit-map.json) 记下 46 秒那处跳接是怎么修的:不是加溶解或闪白遮掩,而是把原片被删掉的 2001–2004 秒那段同一运动补回来:
256
+
257
+ ```json
258
+ {
259
+ "name": "wedding_corridor_continuous_motion",
260
+ "beat_ids": ["b07", "b08"],
261
+ "output_frames": [1052, 1288],
262
+ "output_seconds": [42.08, 51.52],
263
+ "asset_id": "episode-21",
264
+ "source_seconds": [1996.0, 2010.32],
265
+ "speed": 1.516949153,
266
+ "repair": "Restored the omitted 2001-2004 source interval instead of hiding the jump with a transition."
267
+ },
125
268
  ```
126
269
 
127
- 不要把同一份技能同时注册到多个发现目录,否则可能出现重名或重复触发。
270
+ 交付前的机械检查写在 [`assembly_qc.json`](examples/guohuo-60s/assembly_qc.json)(响度、字幕溢出、发布门禁)和 [`delivery-qc.json`](examples/guohuo-60s/delivery-qc.json):
128
271
 
129
- 安装完成后,可以让 Agent 自检环境:
272
+ ```json
273
+ "checks": {
274
+ "full_decode": true,
275
+ "audio_stream_matches_master": true,
276
+ "vmaf_mean": 93.844938,
277
+ "ssim_all": 0.989302,
278
+ "psnr_average_db": 45.415972
279
+ }
280
+ ```
130
281
 
131
- ```text
132
- 检查 video-recap 的运行环境,告诉我 Python、ffmpeg/libass 和 MiMo 配置是否就绪。
282
+ 旁白里每一句话的事实依据则在 [`content-qc.md`](examples/guohuo-60s/content-qc.md) 逐条对照素材证据和公开资料,并把口语化表达的解释边界写明(9 行节选 1 行):
283
+
284
+ ```markdown
285
+ | “这一下伪装露馅,男主全懂了” | 挡击动作和“有我在”原声连续证明她仍在意男主 | [爱奇艺官方角色片花](https://www.iqiyi.com/v_r8e40v8g54.html)确认二人重逢后身份错位、爱恨拉扯 | **解释成立,但需限定语义**:“全懂”指看懂她仍在意他,不指此刻才第一次认出她是任素素 |
133
286
  ```
134
287
 
135
- ## 怎么用
288
+ ### 接着在剪映里改
289
+
290
+ 加一句"导出剪映草稿",`timeline.json` 就会写成可编辑的多轨草稿:原片、逐段解说、BGM、字幕和图片叠层各占一轨,素材默认打包进 `Resources/local`,草稿搬到别的机器仍能打开。`ffmpeg` 渲染的 `recap_<名>.mp4` 是最终成片,草稿是给你继续改的。
291
+
292
+ <img alt="导出的剪映草稿:原片、解说、BGM、字幕" src="docs/jianying-export.jpg" width="100%">
136
293
 
137
- 直接给出视频路径、期望成片和必要背景。用户不需要手动运行仓库里的 Python 脚本。
294
+ 导出内容与边界见[剪映草稿导出与成本](docs/capcut-jianying-draft-export.md)。
295
+
296
+ ## 安装后的第一条请求
297
+
298
+ 复制、改一改就能用。直接给视频路径、期望成片和必要背景,不需要手动运行仓库里的 Python 脚本。
138
299
 
139
300
  **完整视频解说:**
140
301
 
@@ -142,114 +303,157 @@ openclaw skills list
142
303
  给 /path/to/video.mp4 做一个中文解说成片。这是《庆余年》第一集,主角是范闲,字幕烧进画面。
143
304
  ```
144
305
 
145
- **长视频剪成短解说:**
306
+ **长视频或多集剪成一条短解说:**
146
307
 
147
308
  ```text
148
- 把 /path/to/long.mp4 剪成十分钟左右的解说短片,保留关键原声和人物反应。
309
+ 用 /path/to/ep1.mp4 和 /path/to/ep2.mp4 做一个十分钟解说,围绕同一条主线剪辑,保留关键原声和人物反应,不要分成两个小总结。
149
310
  ```
150
311
 
151
- **多视频合成一个故事:**
312
+ **先只做文本交接,不配音不渲染**(把〈占位内容〉换成自己的信息):
152
313
 
153
- ```text
154
- 用 /path/to/ep1.mp4 和 /path/to/ep2.mp4 做一个十分钟解说,围绕同一条主线剪辑,不要分成两个小总结。
314
+ > 我有权使用〈本地视频〉,并提供了对应的已核对画面与对白记录。先只给这段素材的声音分工建议:哪句对白、哪个动作声或停顿应完整保留,哪里确需旁白,依据是哪条记录。缺证据就列待核对项,不补人物动机或没出现的事件。交付分拍说明和必要的旁白草案,不调用配音或渲染。
315
+
316
+ Agent 会自动完成理解、故事与视听规划、剪辑、写稿、配音和合成。剪辑模式内部会先确定保留片段、生成剪后成片,再按输出时间轴写旁白;这些暂停和续跑也由 Agent 处理。
317
+
318
+ ## 流程与六个技能
319
+
320
+ ```mermaid
321
+ flowchart LR
322
+ video(["视频"]) --> understand["① 理解<br/>场景 · ASR · VLM"]
323
+ research["背景调研 · 可选"] -.-> understand
324
+ understand --> script["② 导演 · 剪辑 · 写稿<br/>Agent"] --> voiceover["③ 配音<br/>MiMo / Fish Audio"] --> assemble["④ 组装<br/>混音 · 字幕"] --> output(["Recap"])
325
+ understand -. 剪辑模式 · 先剪后配 .-> cut["剪辑<br/>先剪成片"] -.-> script
326
+ classDef io fill:#4f86c6,stroke:#3a6298,color:#fff;
327
+ classDef stage fill:#eef6ff,stroke:#4f86c6,color:#1f2937;
328
+ classDef opt fill:#f3f4f6,stroke:#9ca3af,color:#475569;
329
+ class video,output io;
330
+ class understand,script,voiceover,assemble stage;
331
+ class research,cut opt;
155
332
  ```
156
333
 
157
- Agent 会自动完成理解、故事与视听规划、剪辑、写稿、配音和合成。剪辑模式内部会先确定保留片段,生成剪后成片后再按输出时间轴写旁白;这些暂停和续跑也由 Agent 处理。
334
+ 六个技能通过 `work_dir` 里的 JSON / MP4 产物衔接:
335
+
336
+ | 技能 | 职责 | 输入 → 输出 |
337
+ |---|---|---|
338
+ | [`video-recap`](skills/video-recap/) | 编排器与环境自检;日常端到端制作用它 | `视频` → `recap_<名>.mp4` |
339
+ | [`video-understanding`](skills/video-understanding/) | 场景检测 · 抽帧 · ASR(`mimo-v2.5-asr`)· VLM(`mimo-v2.5`)· 时间轴融合 · 生成创作 brief | `视频` → `scenes / asr_result / vlm_analysis / silence_periods / timeline_fusion / agent_narration_brief.md` |
340
+ | [`video-script`](skills/video-script/) | 导演 / 故事 / 画面 / 声音方案,解说写作,建议型评审与 lint;只做策划或写稿时单独调用 | `brief + 索引` → `recap_story_plan.json + visual_audio_board.json + [clip_plan.json] + narration.json` |
341
+ | [`video-cut`](skills/video-cut/) | 片段计划 → 拼剪成片;剪辑模式先剪后配,解说按成片时间轴写 | `clip_plan.json + 视频` → `edited_source.mp4` |
342
+ | [`video-voiceover`](skills/video-voiceover/) | 合成解说音频(MiMo `mimo-v2.5-tts` / Fish Audio `s2.1-pro-free`) | `narration.json` → `tts_segments/ + tts_meta.json` |
343
+ | [`video-assemble`](skills/video-assemble/) | 混音 · 压低原声 · 渲染字幕 · 多轨时间线 · 可选导出剪映 | `视频 + tts_meta` → `recap_<名>.mp4 + subtitles.srt/.ass + timeline.json` |
344
+
345
+ 成片固定输出为 `recap_<名>.mp4`,同时产出 `subtitles.srt/.ass`;全部中间产物在 `work_dir/`,字段契约见[数据结构](skills/video-recap/references/data-schema.md)。
158
346
 
159
- ## 常用进阶需求
347
+ ## 进阶请求
160
348
 
161
- **复用已经分析过的素材:**
349
+ **复用已分析过的素材:**
162
350
 
163
351
  ```text
164
352
  分析 /path/to/ep1.mp4,并把可复用的理解产物保存到 /path/to/.video-materials;后续制作时优先复用这个素材库。
165
353
  ```
166
354
 
167
- 素材库只保存 JSON / Markdown 和索引,不复制原始媒体、不建数据库、不做 embedding。需要检索时,Agent 直接在文件系统中查找。
355
+ 素材库只保存 JSON / Markdown 和索引,不复制原始媒体、不建数据库、不做 embedding;Agent 直接在文件系统里 `grep`。
168
356
 
169
- **增加建议型质量复核并导出剪映草稿:**
357
+ **合成前后各做一次 MiMo 质量复核,并导出剪映草稿:**
170
358
 
171
359
  ```text
172
360
  给 /path/to/video.mp4 做解说,合成前和成片后都做 MiMo 质量复核,并导出可继续编辑的剪映草稿。
173
361
  ```
174
362
 
175
- MiMo 复核始终是 advisory:每个阶段最多一次请求,失败开放,不会自动修改或阻断成片。
363
+ MiMo 复核每个阶段最多一次请求,只给建议,失败也不阻断出片。
176
364
 
177
- **让新字幕贴合原片硬字幕位置:**
365
+ **让解说字幕贴合原片硬字幕的位置:**
178
366
 
179
367
  ```text
180
368
  先检测 /path/to/video.mp4 的原片字幕区域并让我确认预览,再把解说字幕贴到同一区域生成成片。
181
369
  ```
182
370
 
183
- 检测结果会保存在 `.subtitle_measure/` 下供确认;当前要求方形像素视频和底部对齐字幕。该能力适配自 [ops120/video-recap-skills-plus](https://github.com/ops120/video-recap-skills-plus)。
371
+ 检测预览保存在 `.subtitle_measure/`;当前要求方形像素视频和底部对齐字幕。
184
372
 
185
- **克隆有授权的参考音色:**
373
+ **用有授权的参考音色配音:**
186
374
 
187
375
  ```text
188
376
  用 /path/to/voice-ref.wav 的音色给 /path/to/video.mp4 做解说;我已获得音色所有者授权。
189
377
  ```
190
378
 
191
- 参考音频会发送给 MiMo 用于合成,其内容指纹参与缓存校验。仅在获得音色所有者授权时使用。
379
+ 参考音频会发送给 MiMo 用于合成,只在获得音色所有者授权时使用。
192
380
 
193
- **改用当前免费的 Fish Audio 配音:**
381
+ **英语视频译成中文并保留原说话人的声音:**
194
382
 
195
383
  ```text
196
- 用 Fish Audio 给 /path/to/video.mp4 做中文解说;使用默认的“娱乐扒妹”音色。
384
+ 把 /path/to/english.mp4 翻译成中文配音,保留原说话人的声音。
197
385
  ```
198
386
 
199
- Agent 会向编排器传入 `--tts-provider fish-audio`;需要 `FISH_API_KEY`,默认使用“娱乐扒妹”音色,也可通过 `FISH_TTS_REFERENCE_ID` 覆盖。本地 `--voice-ref` 克隆仍只属于 MiMo 路径。
387
+ 这是替换原始台词而不是叠加解说;当前支持单说话人整轨替换,不分离背景音乐。
200
388
 
201
- **英语视频译成中文并保留原音色:**
389
+ **同一个系列复用字幕样式、音色、BGM 与包框:**
202
390
 
203
391
  ```text
204
- 把 /path/to/english.mp4 翻译成中文配音,保留原说话人的声音。
392
+ 把 /path/to/library 当作资源库:登记这首 BGM、这个字体和这张包框图,按竖屏 1080x1920 做一版字幕样式模板让我确认采用;
393
+ 之后这个系列都用 /path/to/series/recap_project.json 绑定它们来出片。
205
394
  ```
206
395
 
207
- 这会替换原始台词,而不是在原声上叠加解说。当前版本支持单说话人整轨替换,暂不分离背景音乐。
396
+ 资源、模板和样片是你自己目录里的 JSON 记录,授权与"已采用"状态只由你确认;绑定与显式设置冲突、模板画布与成片不符时,会在配音之前停下。
397
+ 每条成片旁边的 `resource_lock.json` 记下这次实际用了哪些资源、授权是否清楚。格式见 [资源库、模板与样片](skills/video-recap/references/resource-library.md)。
208
398
 
209
- ## 架构
399
+ **在浏览器里看项目、运行和资源库(只读):**
210
400
 
211
- | Skill | 职责 | 输入 → 输出(`work_dir` 契约) |
212
- |---|---|---|
213
- | **video-understanding** | 场景检测 · 抽帧 · ASR(`mimo-v2.5-asr`)· VLM(`mimo-v2.5`)· 时间轴融合 · 生成 brief | `视频` → `scenes / asr_result / vlm_analysis / silence_periods / timeline_fusion / agent_narration_brief.md` |
214
- | **video-script** | 导演/故事/画面/声音方案 + 解说写作 + 建议型评审 + lint/校验 | `brief + 索引` → `recap_story_plan.json + visual_audio_board.json + [clip_plan.json] + narration.json` |
215
- | **video-cut** | 片段计划 → 拼剪成片(剪辑模式先剪后配,解说按成片时间轴写,无需重映射) | `clip_plan.json + 视频` → `edited_source.mp4` |
216
- | **video-voiceover** | 合成解说音频(MiMo `mimo-v2.5-tts` / Fish Audio `s2.1-pro-free`) | `narration.json` → `tts_segments/ + tts_meta.json` |
217
- | **video-assemble** | 混音 · 压低原声 · 渲染字幕 · 多轨时间线(可选导出剪映) | `视频 + tts_meta` → `recap_<名>.mp4 + subtitles.srt/.ass + timeline.json` |
218
- | **video-recap** | 编排器与环境诊断 | `视频` → `recap_<名>.mp4` |
401
+ ```text
402
+ 在本机打开剪辑台,看看 /path/to/projects 下面的运行进度、成片和资源库。
403
+ ```
404
+
405
+ 剪辑台只读、只监听本机地址;需要改动的地方给你一句可以复制回对话的话,不会从页面上发起任何生产。
406
+
407
+ <img alt="剪辑台成片视图:播放器与画面、旁白、背景音乐、字幕四轨时间线" src="docs/dashboard-film.png" width="100%">
219
408
 
220
- ## 输出
409
+ <img alt="剪辑台模板视图:包装图层与字幕样式的画布示意、带来源标记的参数表" src="docs/dashboard-templates.png" width="100%">
221
410
 
222
- - `recap_<名>.mp4`:成片(固定输出名,每次运行原地覆盖);字幕默认烧录,同时产出 `subtitles.srt` 与 `subtitles.ass`
223
- - `work_dir/narration.json`:解说脚本(`narration_lint.json` 时间诊断、`narration_review.md` 评审意见)
224
- - `work_dir/recap_story_plan.json` · `visual_audio_board.json`:Agent 的故事、画面与声音决定;供续写和建议型评审使用,不是渲染硬门禁
225
- - `work_dir/agent_narration_brief.md`:给 Agent 的时间和场景 brief
226
- - `work_dir/vlm_analysis.json` · `asr_result.json` · `silence_periods.json` · `timeline_fusion.json`:理解产物
227
- - `work_dir/clip_plan.json` · `edited_source.mp4` · `recap_phase.json`:剪辑模式产物(解说在成片时间轴上写,`recap_phase.json` 记录剪/配进度供断点续跑)
228
- - `work_dir/multi_source_manifest.json` · `work_dir/sources/<source_id>/`:多视频 cut 的来源清单与每个源视频的理解产物
229
- - `<material-library-dir>/materials/<material_id>/material.json|material.md` · `materials_index.jsonl`:可选素材库,方便 `grep -R` 查找/复用已分析素材
230
- - `work_dir/timeline.json` · `work_dir/assembly_manifest.json` · `tts_segments/` · `tts_meta.json`:多轨时间线、渲染记录与 TTS 音频
231
- - `work_dir/mimo_qc.json`:可选的组装前/成片后 MiMo 建议(多阶段聚合、永不阻断)
411
+ **自带原声字幕,让留白处的「」字幕更准:** 把 `user_subtitles.json`(`[{"start": 秒, "end": 秒, "text": "台词"}]`,按成片时间轴;包一层 `{"timeline": "source", "lines": [...]}` 则按原片时间轴自动映射)或 `user_subtitles.srt` / `.ass`(按原片时间轴)放进 `work_dir`。优先级:你的字幕文件 › Agent 校对的 `original_subtitles.json` › ASR 兜底。
232
412
 
233
- ## 自带原声字幕(可选,更准)
413
+ ## 常见问题
234
414
 
235
- 解说块之间的原声留白会把【原声台词】烧成字幕(用 `「」` 和解说区分开)。默认这份字幕由 Agent 校对、ASR 兜底——但 ASR 时间偏粗,偶尔会和原声对不上。想要更准,直接放一份字幕文件到 `work_dir`,它会作为**首选来源**:
415
+ ### 视频本来没有旁白、甚至没有对白,能给它加上新旁白吗?
236
416
 
237
- - `work_dir/user_subtitles.json`:`[{"start": 秒, "end": 秒, "text": "台词"}]`,按**成片**时间轴直接使用;或包一层 `{"timeline": "source", "lines": [...]}` 用**原片**时间轴,系统按剪辑计划自动映射到成片。
238
- - `work_dir/user_subtitles.srt` / `.ass`:默认按**原片**时间轴解析并映射到成片。
417
+ 可以。理解阶段靠 VLM 看画面,不要求原视频有旁白;素材连对白也没有时,让 Agent 跳过 ASR(`--skip-asr`),按画面生成解说。这是 [issue #79](https://github.com/zenstory-ai/video-recap-skills/issues/79) 问过的问题。
239
418
 
240
- 优先级:**你的字幕文件 › Agent 校对的 `original_subtitles.json` › ASR 兜底**。来源准确时按句精确落到对应留白,不再用粗略的估时。
419
+ ### 长视频跑到一半报 429 或中断了,要从头再来吗?
241
420
 
242
- ## 参考文档
421
+ 不用。VLM 场景分析可断点续传,限流会自愈;写好 `narration.json` 后重复同一条命令即可继续,剪辑模式的剪 / 配进度记录在 `recap_phase.json`,续跑只会接同一个源视频、同一组参数的工作目录。
243
422
 
244
- - 各 skill 的契约:每个 `skills/<skill>/SKILL.md`(写作规则在 video-script 的 SKILL.md 里)
245
- - [数据结构](skills/video-recap/references/data-schema.md) · [配置手册](skills/video-recap/references/config-playbook.md) · [多轨时间线 / 剪映导出](skills/video-recap/references/timeline-and-jianying.md)
246
- - [背景调研指南](skills/video-recap/references/research-guide.md) · [VLM prompt 模板](skills/video-understanding/references/prompt-templates.md)
423
+ ### VLM 认不出谁是谁,解说里全是"黑衣男子"?
424
+
425
+ 片名或剧情明确时,先让 Agent 做背景调研写进 `background_research.json`,人物名和关系会折入 VLM 上下文;见[背景调研指南](skills/video-understanding/references/research-guide.md)。
426
+
427
+ ## 延伸阅读
428
+
429
+ - [视频到解说完整流程](https://zenstory.ai/zh/video-recap/video-to-narration) — 先确认画面、对白与已提供背景,不把猜测写成片中事实
430
+ - [原声与旁白分工](https://zenstory.ai/zh/video-recap/original-audio-and-narration) — 先定每拍声音任务,再写解说词
431
+ - [剪映 / CapCut 草稿导出](https://zenstory.ai/zh/video-recap/capcut-draft) — 用真实 `timeline.json` 独立导出
432
+ - [剪映草稿导出与成本](docs/capcut-jianying-draft-export.md) — 仓库内文档:草稿里有什么、自建与 SaaS 的账单差别
433
+ - [仓库架构](docs/architecture.md) — 仓库内文档:技能分工、功能子包、编排路径与复制模块清单
434
+ - [能力边界与验收原则](docs/production-boundaries.md) — 仓库内文档:哪些交付规则进通用库、哪些属于单个项目;三类验收不能互相冒充
435
+ - [《这一秒过火》案例复现 runbook](examples/guohuo-60s/skill-runbook.md) · [从内容锁定到最终版的决策链](examples/guohuo-60s/iteration-notes.md)
436
+ - 各技能契约:每个 `skills/<skill>/SKILL.md`;[数据结构](skills/video-recap/references/data-schema.md) · [配置手册](skills/video-recap/references/config-playbook.md) · [多轨时间线 / 剪映导出](docs/timeline-and-jianying.md) · [创作剪辑手册](skills/video-script/references/creative-editing-playbook.md)
247
437
 
248
438
  ## 致谢
249
439
 
250
- - [linux.do](https://linux.do)
251
- - 剪映草稿协议参考 [pyJianYingDraft](https://github.com/GuanYixuan/pyJianYingDraft)、[capcut-mate](https://github.com/Hommy-master/capcut-mate) 和 [duo-video](https://github.com/duoec/duo-video)。
440
+ - [LINUX DO - The New Ideal Community](https://linux.do) — 社区支持
441
+ - 剪映草稿协议参考 [pyJianYingDraft](https://github.com/GuanYixuan/pyJianYingDraft)、[capcut-mate](https://github.com/Hommy-master/capcut-mate) 和 [duo-video](https://github.com/duoec/duo-video)
442
+ - 字幕带检测适配自 [ops120/video-recap-skills-plus](https://github.com/ops120/video-recap-skills-plus)
252
443
 
253
444
  ## 许可
254
445
 
255
446
  MIT,见 [LICENSE](LICENSE)。
447
+
448
+ ## ZenStory AI 项目
449
+
450
+ 本项目由 [ZenStory AI](https://zenstory.ai/zh) 维护——一组开源、面向 agent 的故事创作、改编与生产工具(GitHub 组织:[zenstory-ai](https://github.com/zenstory-ai))。同组织项目:
451
+
452
+ | 项目 | 用途 |
453
+ | --- | --- |
454
+ | [oh-story-claudecode](https://github.com/zenstory-ai/oh-story-claudecode) | 网文写作 skill 包:扫榜、拆文、写作、去AI味、封面图 |
455
+ | [drama-skills](https://github.com/zenstory-ai/drama-skills) | AI 短剧 / 漫剧创作 skill 合集:剧本、资产、分镜、图片/视频提示词、独立审查 |
456
+ | [novel-to-game](https://github.com/zenstory-ai/novel-to-game) | 面向原著改编、指定运行环境构建与运行证据 QA 的 agent skills |
457
+ | [video-recap-skills](https://github.com/zenstory-ai/video-recap-skills) | 将支持的视频文件制作成中文解说,可选导出可编辑的剪映/CapCut 草稿(本仓库) |
458
+ | [oh-story-dsh](https://github.com/zenstory-ai/oh-story-dsh) | DeepSeek Harness 社区插件,提供小说、短剧、游戏和视频解说工作台 |
459
+ | [zenstory](https://github.com/zenstory-ai/zenstory) | 对话即创作的 AI 小说写作工作台([app.zenstory.ai](https://app.zenstory.ai)) |