@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
@@ -0,0 +1,44 @@
1
+ import React from "react";
2
+ import { AbsoluteFill, useCurrentFrame, useVideoConfig } from "remotion";
3
+ import { Frame, Header, Reward, Typed } from "./chrome";
4
+ import { COLOURS, StyleProps, TOP_U, entrance, exit, glitch, unit } from "./tokens";
5
+
6
+ const TYPE_DELAY = 0.15;
7
+
8
+ /**
9
+ * 【系统提示】: the first item types out as the status line, the rest arrive as
10
+ * rarity-coloured reward rows once it has finished.
11
+ */
12
+ export const SystemPanel: React.FC<StyleProps> = ({ text }) => {
13
+ const frame = useCurrentFrame();
14
+ const { fps, height, width } = useVideoConfig();
15
+ const u = unit(height);
16
+ const shown = entrance(frame, fps, 0, 13);
17
+ const jitter = glitch(frame);
18
+ const leaving = exit(frame, fps, text);
19
+ const [status, ...rewards] = text.items;
20
+ const rewardsFrom = TYPE_DELAY + Array.from(status.text).length * 0.035 + 0.15;
21
+ return (
22
+ <AbsoluteFill style={{ alignItems: "center", paddingTop: u * TOP_U.system, opacity: leaving * jitter.opacity }}>
23
+ <div style={{ transform: `translate(${jitter.dx}px, ${(1 - leaving) * -u * 2}px) scale(${0.9 + 0.1 * shown})` }}>
24
+ <Frame colour={COLOURS.system} width={width * 0.82}>
25
+ <Header text="【系统提示】" colour={COLOURS.system} />
26
+ <Typed
27
+ text={status.text}
28
+ delay={TYPE_DELAY}
29
+ style={{
30
+ fontSize: u * 4.4,
31
+ fontWeight: 900,
32
+ letterSpacing: u * 0.3,
33
+ textShadow: `0 0 ${u * 1.4}px ${COLOURS.system}`,
34
+ margin: `${u * 0.4}px 0 ${rewards.length ? u * 1.2 : 0}px`,
35
+ }}
36
+ />
37
+ {rewards.map((item, index) => (
38
+ <Reward key={index} name={item.text} rarity={item.rarity} delay={rewardsFrom + index * 0.28} />
39
+ ))}
40
+ </Frame>
41
+ </div>
42
+ </AbsoluteFill>
43
+ );
44
+ };
@@ -0,0 +1,100 @@
1
+ import React from "react";
2
+ import { AbsoluteFill, useCurrentFrame, useVideoConfig } from "remotion";
3
+ import { formatCountdown, parseProgress, secondsLeft, sinceTick } from "../rules.mjs";
4
+ import { Frame, Header, RewardTag, Typed } from "./chrome";
5
+ import { COLOURS, MONO, StyleProps, TOP_U, entrance, exit, glitch, unit } from "./tokens";
6
+
7
+ /**
8
+ * 【新任务】: title, the goal typed out, reward tags, an `N / M` item as the
9
+ * 进度 line with its bar, and the countdown pulsing on each second.
10
+ */
11
+ export const TaskPanel: React.FC<StyleProps> = ({ text }) => {
12
+ const frame = useCurrentFrame();
13
+ const { fps, height, width } = useVideoConfig();
14
+ const u = unit(height);
15
+ const shown = entrance(frame, fps, 0, 13);
16
+ const jitter = glitch(frame);
17
+ const leaving = exit(frame, fps, text);
18
+ const [title, goal, ...rest] = text.items;
19
+ const progressItem = rest.find((item) => parseProgress(item.text));
20
+ const progress = progressItem ? parseProgress(progressItem.text) : null;
21
+ const rewards = rest.filter((item) => item !== progressItem);
22
+ const elapsed = frame / fps;
23
+ const beat =
24
+ text.countdown === null ? 1 : 1 + 0.05 * Math.max(0, 1 - sinceTick(text.countdown, elapsed) / 0.15);
25
+ return (
26
+ <AbsoluteFill style={{ alignItems: "center", paddingTop: u * TOP_U.task, opacity: leaving * jitter.opacity }}>
27
+ <div style={{ transform: `translate(${jitter.dx}px, ${(1 - leaving) * -u * 2}px) scale(${0.9 + 0.1 * shown})` }}>
28
+ <Frame colour={COLOURS.task} width={width * 0.86}>
29
+ <Header text="【新任务】" colour={COLOURS.task} />
30
+ <div
31
+ style={{
32
+ fontSize: u * 4.2,
33
+ fontWeight: 900,
34
+ letterSpacing: u * 0.3,
35
+ color: COLOURS.taskTitle,
36
+ textShadow: `0 0 ${u * 1.2}px ${COLOURS.task}`,
37
+ margin: `${u * 0.2}px 0 ${u * 0.8}px`,
38
+ }}
39
+ >
40
+ {title.text}
41
+ </div>
42
+ {goal ? (
43
+ <Typed text={goal.text} delay={0.25} style={{ fontSize: u * 2.35, fontWeight: 700, lineHeight: 1.45 }} />
44
+ ) : null}
45
+ {rewards.length ? (
46
+ <div style={{ marginTop: u * 1.2, display: "flex", flexWrap: "wrap", gap: `${u * 0.6}px ${u}px` }}>
47
+ {rewards.map((item, index) => (
48
+ <RewardTag key={index} name={item.text} rarity={item.rarity} delay={0.5 + index * 0.12} />
49
+ ))}
50
+ </div>
51
+ ) : null}
52
+ {progress && progressItem ? (
53
+ <>
54
+ <div
55
+ style={{
56
+ marginTop: u * 1.4,
57
+ fontSize: u * 1.7,
58
+ fontWeight: 700,
59
+ color: COLOURS.muted,
60
+ display: "flex",
61
+ justifyContent: "space-between",
62
+ }}
63
+ >
64
+ <span>进度</span>
65
+ <span style={{ fontFamily: MONO, fontWeight: 800 }}>{progressItem.text}</span>
66
+ </div>
67
+ <div style={{ height: u * 0.6, background: "#ffffff1c", marginTop: u * 0.4 }}>
68
+ <div
69
+ style={{
70
+ // A sliver stays visible at zero, so the bar reads as a bar.
71
+ width: `${Math.max(1.2, progress.ratio * 100)}%`,
72
+ height: "100%",
73
+ background: COLOURS.alarm,
74
+ boxShadow: `0 0 ${u * 0.6}px ${COLOURS.alarm}`,
75
+ }}
76
+ />
77
+ </div>
78
+ </>
79
+ ) : null}
80
+ {text.countdown === null ? null : (
81
+ <div
82
+ style={{
83
+ marginTop: u * 1.3,
84
+ fontFamily: MONO,
85
+ fontWeight: 800,
86
+ fontSize: u * 4.2,
87
+ color: COLOURS.alarm,
88
+ textShadow: `0 0 ${u}px ${COLOURS.alarm}`,
89
+ transform: `scale(${beat})`,
90
+ transformOrigin: "left center",
91
+ }}
92
+ >
93
+ {formatCountdown(secondsLeft(text.countdown, elapsed))}
94
+ </div>
95
+ )}
96
+ </Frame>
97
+ </div>
98
+ </AbsoluteFill>
99
+ );
100
+ };
@@ -0,0 +1,197 @@
1
+ import React from "react";
2
+ import { interpolate, useCurrentFrame, useVideoConfig } from "remotion";
3
+ import { typedLength } from "../rules.mjs";
4
+ import { COLOURS, RARITY, SANS, entrance, rarityOf, unit } from "./tokens";
5
+ import { Rarity } from "../schema";
6
+
7
+ /** Pieces the system-style panels share: frame, header, typewriter, reward rows. */
8
+
9
+ const useU = (): number => unit(useVideoConfig().height);
10
+
11
+ const Corners: React.FC<{ colour: string }> = ({ colour }) => {
12
+ const u = useU();
13
+ const length = u * 2.2;
14
+ const weight = Math.max(3, u * 0.28);
15
+ const edge = `${weight}px solid ${colour}`;
16
+ const corner = (style: React.CSSProperties) => (
17
+ <div style={{ position: "absolute", width: length, height: length, ...style }} />
18
+ );
19
+ return (
20
+ <>
21
+ {corner({ top: -weight, left: -weight, borderTop: edge, borderLeft: edge })}
22
+ {corner({ top: -weight, right: -weight, borderTop: edge, borderRight: edge })}
23
+ {corner({ bottom: -weight, left: -weight, borderBottom: edge, borderLeft: edge })}
24
+ {corner({ bottom: -weight, right: -weight, borderBottom: edge, borderRight: edge })}
25
+ </>
26
+ );
27
+ };
28
+
29
+ /** Dark-navy glass with a glowing border, L-shaped corner brackets and moving scanlines. */
30
+ export const Frame: React.FC<{
31
+ colour: string;
32
+ width: number;
33
+ children: React.ReactNode;
34
+ style?: React.CSSProperties;
35
+ }> = ({ colour, width, children, style }) => {
36
+ const u = useU();
37
+ const frame = useCurrentFrame();
38
+ return (
39
+ <div
40
+ style={{
41
+ position: "relative",
42
+ width,
43
+ padding: `${u * 2.2}px ${u * 2.6}px`,
44
+ background: "linear-gradient(170deg, rgba(10,30,60,0.80), rgba(6,16,36,0.86))",
45
+ border: `${Math.max(2, u * 0.12)}px solid ${colour}aa`,
46
+ boxShadow: `0 0 ${u * 1.6}px ${colour}88, inset 0 0 ${u * 3}px ${colour}22`,
47
+ fontFamily: SANS,
48
+ color: COLOURS.panelInk,
49
+ ...style,
50
+ }}
51
+ >
52
+ <Corners colour={colour} />
53
+ <div
54
+ style={{
55
+ position: "absolute",
56
+ inset: 0,
57
+ pointerEvents: "none",
58
+ backgroundImage: `repeating-linear-gradient(0deg, ${colour}14 0px, ${colour}14 2px, transparent 2px, transparent 5px)`,
59
+ backgroundPositionY: `${frame * 1.5}px`,
60
+ }}
61
+ />
62
+ {children}
63
+ </div>
64
+ );
65
+ };
66
+
67
+ /** 【系统提示】-style header: a diamond, the label, and a rule fading out to the right. */
68
+ export const Header: React.FC<{ text: string; colour: string }> = ({ text, colour }) => {
69
+ const u = useU();
70
+ return (
71
+ <div
72
+ style={{
73
+ display: "flex",
74
+ alignItems: "center",
75
+ gap: u * 0.8,
76
+ fontSize: u * 1.9,
77
+ fontWeight: 700,
78
+ color: colour,
79
+ letterSpacing: u * 0.35,
80
+ marginBottom: u * 0.8,
81
+ }}
82
+ >
83
+ <span
84
+ style={{
85
+ width: u * 0.9,
86
+ height: u * 0.9,
87
+ background: colour,
88
+ transform: "rotate(45deg)",
89
+ boxShadow: `0 0 ${u}px ${colour}`,
90
+ }}
91
+ />
92
+ {text}
93
+ <span style={{ flex: 1, height: 1, background: `linear-gradient(90deg, ${colour}aa, transparent)` }} />
94
+ </div>
95
+ );
96
+ };
97
+
98
+ /** Typewriter at 35 ms a character from `delay`, with a blinking bar while it types. */
99
+ export const Typed: React.FC<{ text: string; delay?: number; style?: React.CSSProperties }> = ({
100
+ text,
101
+ delay = 0,
102
+ style,
103
+ }) => {
104
+ const frame = useCurrentFrame();
105
+ const { fps } = useVideoConfig();
106
+ const chars = Array.from(text);
107
+ const shown = typedLength(frame / fps, delay);
108
+ const typing = shown < chars.length;
109
+ return (
110
+ <div style={style}>
111
+ {chars.slice(0, shown).join("")}
112
+ <span
113
+ style={{
114
+ display: "inline-block",
115
+ width: "0.12em",
116
+ height: "0.9em",
117
+ marginLeft: "0.08em",
118
+ background: "currentColor",
119
+ opacity: typing && Math.floor(frame / 6) % 2 === 0 ? 1 : 0,
120
+ }}
121
+ />
122
+ </div>
123
+ );
124
+ };
125
+
126
+ /** A reward row: rarity chip and name in the rarity's colour, flashing as it arrives. */
127
+ export const Reward: React.FC<{ name: string; rarity: Rarity | null; delay: number }> = ({
128
+ name,
129
+ rarity,
130
+ delay,
131
+ }) => {
132
+ const u = useU();
133
+ const frame = useCurrentFrame();
134
+ const { fps } = useVideoConfig();
135
+ const arrived = entrance(frame, fps, delay, 12);
136
+ const label = rarityOf(rarity);
137
+ const colour = RARITY[label];
138
+ const flash = interpolate(frame / fps - delay, [0, 0.12, 0.4], [0, 1, 0], {
139
+ extrapolateLeft: "clamp",
140
+ extrapolateRight: "clamp",
141
+ });
142
+ return (
143
+ <div
144
+ style={{
145
+ display: "flex",
146
+ alignItems: "center",
147
+ gap: u * 1.2,
148
+ margin: `${u * 0.7}px 0`,
149
+ opacity: arrived,
150
+ transform: `translateX(${(1 - arrived) * u * 5}px)`,
151
+ }}
152
+ >
153
+ <span
154
+ style={{
155
+ fontSize: u * 1.5,
156
+ fontWeight: 700,
157
+ color: COLOURS.ink,
158
+ background: colour,
159
+ padding: `${u * 0.15}px ${u * 0.7}px`,
160
+ boxShadow: `0 0 ${u * (0.6 + flash)}px ${colour}`,
161
+ }}
162
+ >
163
+ {label}
164
+ </span>
165
+ <span style={{ fontSize: u * 2.7, fontWeight: 900, color: colour, textShadow: `0 0 ${u * (0.5 + 1.5 * flash)}px ${colour}` }}>
166
+ {name}
167
+ </span>
168
+ </div>
169
+ );
170
+ };
171
+
172
+ /** A compact reward tag for the task panel. */
173
+ export const RewardTag: React.FC<{ name: string; rarity: Rarity | null; delay: number }> = ({
174
+ name,
175
+ rarity,
176
+ delay,
177
+ }) => {
178
+ const u = useU();
179
+ const frame = useCurrentFrame();
180
+ const { fps } = useVideoConfig();
181
+ const colour = RARITY[rarityOf(rarity)];
182
+ return (
183
+ <span
184
+ style={{
185
+ fontSize: u * 1.9,
186
+ fontWeight: 700,
187
+ color: colour,
188
+ opacity: entrance(frame, fps, delay),
189
+ border: `1px solid ${colour}88`,
190
+ padding: `${u * 0.2}px ${u * 0.7}px`,
191
+ background: `${colour}14`,
192
+ }}
193
+ >
194
+ {name}
195
+ </span>
196
+ );
197
+ };
@@ -0,0 +1,62 @@
1
+ import { interpolate, spring } from "remotion";
2
+ import { CueKind, Rarity, ScreenText } from "../schema";
3
+
4
+ /**
5
+ * Shared look for subtitles and every screen-text style. Sizes are in `u`, one
6
+ * hundredth of frame height, so the same numbers hold for 720×1280 and 1080×1920.
7
+ */
8
+ export const unit = (height: number): number => height / 100;
9
+
10
+ /** Every style component takes exactly this, so one can replace another. */
11
+ export type StyleProps = { text: ScreenText };
12
+
13
+ export const SANS = '"Noto Sans SC", sans-serif';
14
+ export const MONO = '"JetBrains Mono", "Noto Sans SC", monospace';
15
+
16
+ export const COLOURS = {
17
+ system: "#3FE0FF",
18
+ task: "#FF8A5B",
19
+ taskTitle: "#FFE3D6",
20
+ alarm: "#FF5A4E",
21
+ chipLabel: "#FFB39E",
22
+ panelInk: "#EAF7FF",
23
+ muted: "#9FB7CC",
24
+ ink: "#0B1020",
25
+ cardSurface: "rgba(255,255,255,0.97)",
26
+ cardName: "#1C2230",
27
+ cardUnit: "#9AA3B2",
28
+ cardRule: "#EEF0F4",
29
+ cardValue: "#E5322D",
30
+ cardDots: ["#FF4D4F", "#1FA2FF", "#111111", "#2BB673"],
31
+ };
32
+
33
+ /** Subtitle fill by who speaks; the same values are in edit_tool.py for the ASS route. */
34
+ export const SUBTITLE: { fill: Record<CueKind, string>; keyword: string; rim: string } = {
35
+ fill: { line: "#FFFFFF", vo: "#9FE8FF", system: "#3FE0FF" },
36
+ keyword: "#FFD400",
37
+ rim: "#0B0D12",
38
+ };
39
+
40
+ /** Unmarked items read as 稀有. */
41
+ export const RARITY: Record<Rarity, string> = { 传说: "#FFC940", 史诗: "#B26BFF", 稀有: "#3FA9FF" };
42
+ export const rarityOf = (rarity: Rarity | null): Rarity => rarity ?? "稀有";
43
+
44
+ /** Where each style sits, in `u` from the top. */
45
+ export const TOP_U = { card: 16, system: 10, task: 9, corner: 5.5 };
46
+
47
+ /** 0→1 entry, `delay` seconds after the piece's first frame. A pure function of the frame. */
48
+ export const entrance = (frame: number, fps: number, delay = 0, damping = 14): number =>
49
+ spring({ frame: frame - delay * fps, fps, config: { damping, stiffness: 200, mass: 0.6 } });
50
+
51
+ /** 1→0 over the piece's last `seconds`; the caller also lifts by (1 − value). */
52
+ export const exit = (frame: number, fps: number, text: ScreenText, seconds = 0.22): number => {
53
+ const length = (text.end - text.start) * fps;
54
+ return interpolate(frame, [length - seconds * fps, length], [1, 0], {
55
+ extrapolateLeft: "clamp",
56
+ extrapolateRight: "clamp",
57
+ });
58
+ };
59
+
60
+ /** Two or three frames of glitch before a panel settles. */
61
+ export const glitch = (frame: number): { opacity: number; dx: number } =>
62
+ frame > 3 ? { opacity: 1, dx: 0 } : { opacity: frame % 2 ? 0.35 : 1, dx: frame % 2 ? 6 : -4 };
@@ -5,6 +5,7 @@
5
5
  "jsx": "react-jsx",
6
6
  "module": "ESNext",
7
7
  "moduleResolution": "bundler",
8
+ "allowJs": true,
8
9
  "strict": true,
9
10
  "skipLibCheck": true,
10
11
  "noEmit": true
@@ -22,9 +22,11 @@
22
22
  - 入点:0.90
23
23
  - 出点:3.40
24
24
  - 时长:2.50
25
- - 取舍:入点=弹窗动画已经展开过半,起势的静止两帧删掉;出点=弹窗完全展开且文字可读的最后一帧,之后画面开始整体提亮
26
- - 声音:保留原声,与上一段做 0.15 秒交叉淡入(两段底噪水平差 4 dB)
25
+ - 取舍:入点=弹窗动画已经展开过半,起势的静止两帧删掉;出点=弹窗完全展开、面板区仍是留白的最后一帧,之后画面开始整体提亮
26
+ - 声音:保留原声;回听确认与上一段衔接
27
27
  - 字幕:无
28
+ - 画面文字:0.40-2.50 系统面板 认证通过|创作者认证(史诗)|全站创作者榜 第 1 位(传说)
29
+ - 音效:0.40-1.00 制作成果/音效/提示音.wav(增益:-10)
28
30
 
29
31
  ## CUT-EP001-003 · 他念出那句话
30
32
 
@@ -33,8 +35,8 @@
33
35
  - 出点:7.00
34
36
  - 时长:5.00
35
37
  - 取舍:入点=按发声区间前推 0.3 秒余量,开头 1.5 秒的凝视与上一段蓄势重复,整段去掉;出点=句尾收音之后 0.4 秒,人物姿态尚未回弹
36
- - 声音:保留原声;音乐在 4.20 秒进入,台词发声区间内压低 9 dB,句尾停顿处恢复
37
- - 字幕:这条路我自己走
38
+ - 声音:保留原声
39
+ - 字幕:这条路我自己走(重点:自己走)
38
40
 
39
41
  ---
40
42
 
@@ -1,81 +1,40 @@
1
1
  # 入出点与镜序
2
2
 
3
- 可用带划完之后,剪辑要回答两个问题:**这一段从哪一帧进、到哪一帧出**,以及**这些段落按
4
- 什么顺序连起来**。两个问题都在带内解决;带外的帧不参与讨论。
3
+ ## 入出点
5
4
 
6
- ## 入点
5
+ 在素材可用区间内,按信息、表演与节奏选入出点。
6
+ 动作镜可以从动作已经开始的位置进入;反应、等待、揭示前停顿可以保留静止。
7
+ 出点要让观众读到本镜的结果,并避开后续漂移或无意重复。
7
8
 
8
- 入点取**动作已经在进行中**的那一帧,不取动作准备开始的那一帧。
9
-
10
- 观众补得上开头,补不上结尾。一个人伸手去拿东西,从「手已经在移动」进,观众自动知道他要拿;
11
- 从「手还放在桌上」进,前面那半秒只是在等。生成素材的起势帧几乎总是这半秒。
12
-
13
- 具体判断:从候选入点往后放,如果前 0.3 秒删掉之后这一段的信息没有减少,就删掉。反复这样问,
14
- 直到再删就丢信息为止。
15
-
16
- 例外是**需要一个静止起点的镜头**:反应镜、揭示前的停顿、有意的空拍。这些镜头的静止不是起势帧,
17
- 它本身就是内容。区别在于静止之后是否发生了它承诺的那件事——反应镜的静止之后有反应,
18
- 起势帧之后只是动作终于开始了。
19
-
20
- ## 出点
21
-
22
- 出点取**信息完成之后、缺陷开始之前**。这两个条件经常冲突,冲突时以缺陷为准:把一段拖进
23
- 漂移区,损失的不只是这一段,还有它后面那一刀的可信度。
24
-
25
- 信息完成的判断:这一镜要让观众知道的那件事,最后一次可见是哪一帧。之后的帧要么在重复,
26
- 要么在等下一件事。
27
-
28
- 有台词时出点由声音决定,不由画面决定。见下一节。
29
-
30
- ## 台词优先
31
-
32
- 有台词的段落,边界顺序是:
33
-
34
- 1. 先测这句话的实际发声区间(从第一个音到最后一个音收尾)。
35
- 2. 入点不晚于发声起点,出点不早于发声收尾——两端各留出一点余量,让句尾不被切得发干。
36
- 3. 在这个约束内,才轮到画面上的入出点判断。
37
-
38
- 切在字中间是结构缺陷。半个字听起来像技术故障,观众不会理解成风格。转写工具只用来**定位**
39
- 这句话在时间轴上的位置;字幕文字仍然逐字取自剧本原文。
40
-
41
- 一句台词跨越两段素材时,它属于其中一段——不要在句中换镜。确实需要在这句话上换镜时,
42
- 回上游把它拆成两句,或者接受这一镜承担完整的一句。
9
+ 对白先确定实际发声区间,保留完整的字音与需要的停顿。生成的对白镜常晚开口、句后拖尾:
10
+ 入点落在开口前约 0.25 秒,出点落在台词结束后留约 0.4 秒反应,整段不短于约 1.2 秒;
11
+ 只按属于本句台词的发声定位,不被杂音拖长。
12
+ 画面切换可以发生在一句台词中间,前提是音轨连续、说话人和叙事关系清楚。
13
+ 不要为了换画面把原台词改成两句。内置 render 只做同步切段;分离画面和声音的剪法
14
+ 需要先用外部剪辑工具完成,记录所用素材、声音区间和处理方式。
43
15
 
44
16
  ## 镜序与相邻关系
45
17
 
46
- 镜序默认跟随分镜。改变它是本阶段的权限,但要说明理由。
47
-
48
- 相邻两段检查三件事,不能三件同时相同:
49
-
50
- - **景别**(近 / 中 / 远)
51
- - **机位**(相对被摄主体的方位)
52
- - **运动方向**(推 / 拉 / 摇的方向,或静止)
53
-
54
- 三者全同的两段接在一起会被看成同一个镜头出了问题,而不是两个镜头。改法优先级:删掉其中一段
55
- (通常它们本来就在重复信息),其次调整镜序把别的段落插进来,最后才是回上游重新设计镜头。
56
-
57
- ## 重复信息
58
-
59
- 两段承担同一条信息时,删一段,不要两段各留一半。
60
-
61
- 各留一半是最容易做出的选择,因为它看起来两边都保住了。实际结果是两个都不完整的段落连在一起,
62
- 观众第二次看到同一件事、而且两次都没看清。选出更好的那一段,整段留下;另一段整段去掉。
18
+ 默认沿用分镜镜序。调整时检查动作因果、视线、空间关系、信息揭示和声音衔接。
19
+ 相近景别与机位之间的切换容易暴露跳动,可比较改变角度、插入反应或有意跳切的效果。
20
+ 是否保留由观众需要看到的信息决定,不把景别、机位和运动方向的组合设为禁令。
63
21
 
64
- ## 时长
22
+ 重复信息没有新增作用时可删;如果第二次增加反应、对照或重新解释,可以保留。
23
+ 拆取两段素材也可以,但要确认动作、台词和情绪仍连贯。
65
24
 
66
- **省下来的时间不要补到别处。**
25
+ ## 切点与转场
67
26
 
68
- 缩短一段之后,成片比目标时长短了,这时候很自然会想把这两秒加到别的段落上去。不要这样做。
69
- 其它段落的出点是按它们各自的信息和缺陷定的,加长它们只会把它们也推进重复区或漂移区。
70
- 成片短于目标时长是一个结果,不是一个需要填平的缺口。
27
+ 动接动、声音桥和切到不同主体都可帮助衔接,按本场叙事选择。
28
+ 若相邻镜头有生成漂移,先判断能否通过取舍或接镜校正解决;叠化等转场不能替代缺失的内容。
71
29
 
72
- 目标时长的作用是在**开始剪之前**约束镜头数量和信息密度。剪完之后它就只是一个用来对照的数字,
73
- 差多少写进报告,由创作者决定要不要回上游加内容。
30
+ 剧本的 `[转场]` 可能交代时空变化,也可能明确指定声音或画面效果,先读具体要求。
31
+ 可通过新镜头中的环境信息、声音桥、黑场或其他已接受效果实现。
32
+ 内置 render 只做硬切;需要声音桥或画面转场时使用外部工具,并记录处理参数。
74
33
 
75
- ## 什么时候停
34
+ ## 时长与完成
76
35
 
77
- 再剪一版能不能更好,几乎总是「能」。判断该不该继续的标准不是「还有没有可改的地方」,
78
- 而是**下一刀要动的是不是观众能看见的东西**。
36
+ 删短某段后,只有其他段落确实需要更多表演或阅读时间才延长,不机械补齐总秒数。
37
+ 目标时长若是创作参考,报告实际时长与差异;若是用户明确的交付限制,则继续调整或指出
38
+ 缺少哪些素材才能满足,不能把它自行降为参考值。
79
39
 
80
- 在成片里看不见的地方反复重出和微调,是本阶段最容易发生的浪费:一段素材最终只用了两秒,
81
- 却为它被丢掉的那四秒重出了三次。动手之前先确认,要修的这一帧到底在不在成片里。
40
+ 下一轮修改应针对成片里可见或可听的问题,优先修复影响理解、连续性和交付要求的部分。
@@ -1,58 +1,33 @@
1
1
  # 交付与验收
2
2
 
3
- 本阶段的验收只回答**可测的事实**。「这条片子好不好看」不在这里回答,也不能用这里的任何一项
4
- 数字去暗示它。
5
-
6
- ## 可测项
7
-
8
- 渲染完成后逐项测量并回报数字,不回报「通过」:
9
-
10
- | 项 | 怎么测 | 判据 |
11
- |---|---|---|
12
- | 成片时长 | 探测输出文件 | 等于各段时长之和;不等说明拼接或转码出了问题 |
13
- | 每一刀的位置 | 按剪辑单区间反查 | 与文档一致 |
14
- | 台词完整性 | 在成片上转写,逐句对剧本原文 | 每一句留下来的台词都能找到 |
15
- | 边界帧 | 抽剪辑点前后各一帧 | 没有黑场帧、白场帧或半渲染帧 |
16
- | 响度 | 测整片响度 | 落在交付规格声明的目标上 |
17
- | 字幕对齐 | 抽有字幕的段落的帧 | 字幕在发声区间内出现,位置没有压住画内文字 |
18
- | 画幅与帧率 | 探测输出文件 | 等于交付规格声明的值 |
19
-
20
- 任何一项测不了(缺工具、缺原文、素材不可读)就如实写「未测」和原因。**不要用相邻的、
21
- 测得到的那一项去替它作证**——渲染成功不能证明台词还在,时长对上不能证明没有黑场帧。
22
-
23
- 最容易漏的是字幕那一行:`verify` 返回一整屏数字,看起来已经查完了,但它测不了字幕长
24
- 什么样。本套件就这样发过一版字号被放大两倍的成片——改完样式只跑了 `verify`,没抽帧看。
25
- **改动只要影响画面,就必须抽帧看,不管数字多好看。**
26
-
27
- ## 报告什么
28
-
29
- 交付时给出四样东西:
30
-
31
- 1. **成片文件路径**,以及每段切好的中间文件路径。
32
- 2. **上表逐项的实测数字**,包括未测项和原因。
33
- 3. **目标时长与实际时长的差**,以及为什么是这个差。
34
- 4. **仍然存在的取舍选项**——还可以再剪的地方、可以回上游重出的地方,各自的代价。
35
- 列出来交给创作者选,不替他决定要不要再来一版。
36
-
37
- 不要报告的:任何形式的质量结论、「已经可以发布了」、把技术成功写成创作成功。
38
-
39
- ## 交回上游的东西
40
-
41
- 剪辑是第一次同时看到成片和意图的位置,所以它必然会积累一批只有在这里才看得见的发现。
42
- 这些发现不属于剪辑单,但属于本轮报告:
43
-
44
- - **某一镜的可用带远短于声明时长** → 视频提示词阶段的时长与动作负载不匹配。
45
- - **两镜信息重复** → 分镜阶段的切镜理由不成立。
46
- - **某句台词在成片上说不清** → 剧本层面的语速/字数问题,或声音生成的容量问题。
47
- - **成片整体缺少某种信息**(人物不立、地点没交代、转折没落地)→ 上游结构问题,
48
- 不是剪辑能补的。
49
-
50
- 逐条点名,写清是在哪一段、哪个时间点观察到的,交给对应 owner。不在剪辑阶段自行修改上游文档。
51
-
52
- ## 可继续精修的工程
53
-
54
- 成片是一次交付,不是终点。创作者通常还要在自己的剪辑软件里继续改。因此除了成片,
55
- 把切好的中间文件和剪辑单一起交出去——有了这两样,任何人都能在别的工具里复现这一版,
56
- 并从这一版继续。
57
-
58
- 只交一个成片文件,等于要求下一个人从头再剪一遍。
3
+ 检查实际交付文件,并区分实测结果、人工判断和未测项。
4
+
5
+ | 项 | 怎么核对 |
6
+ |---|---|
7
+ | 时长与切点 | 对照实际渲染区间、帧边界和用户时长要求 |
8
+ | 内容覆盖 | 对照分镜和视频提示词,必要内容有承载,未采用镜头有原因 |
9
+ | 台词 | 在成片上回听,必要时转写辅助,逐句对照剧本 |
10
+ | 边界帧 | 查看剪辑点前后,检查意外黑白帧、画面断裂和漂移;逐帧查看 `verify` 列出的疑似坏帧 |
11
+ | 声音 | 回听接缝、对白清晰度与已声明静默;测量整片响度 |
12
+ | 字幕 | 检查逐字内容、发声时间、字号、折行和画内文字避让 |
13
+ | 画内文字 | 按剧本与视觉设定的文字政策检查载体、可读性和指定文字 |
14
+ | 画幅与帧率 | 探测输出文件,对照交付规格 |
15
+ | 接镜色彩 | 在同场景、同光态下比较可比区域,确认校正没有过冲;先看 `verify` 点名的切点 |
16
+
17
+ `verify` 只提供部分技术测量,不能替代回听与画面检查。
18
+ 分段色彩观测按当前剪辑单读取中间分段,报告平均亮度和蓝减红像素值;它不代表成片局部区域的
19
+ 接镜残差,也不要求各场景接近同一均值。改动剪辑单后先重新渲染,再测量并查看实际切点。
20
+ 发现有意黑场、静默或光态变化时按创作意图判断,不因数值异常直接判错。
21
+
22
+ `verify` 还逐帧读成片:「切点亮度变化」是每个切点前后两帧的平均亮度差(0–255),超过 20 的
23
+ 列进「请逐帧查看」;「疑似坏帧」是与前后两帧都明显不同、而前后两帧彼此相近的单帧,常见于解码
24
+ 错位,画面文字入场的一两帧故障效果也会被列出并标明。两项都只指出该看哪里,不阻断交付。
25
+
26
+ ## 交付
27
+
28
+ 给出成片、剪辑单、可继续编辑的中间文件,以及外部混音或字幕工程(如使用)。
29
+ 说明是否满足用户要求、仍有哪些内容缺口和取舍;测不了的必要项目写明原因。
30
+
31
+ 需要补素材、改台词或改分镜时,指出对应镜头与发生时间并交给负责阶段。
32
+ 渲染成功只证明工具完成执行,成片的内容判断需要观看和回听;正式审查由
33
+ `$short-drama-review` 或创作者进行。