@oh-story/dsh 0.1.10 → 0.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (444) hide show
  1. package/README.md +11 -11
  2. package/lib/client.js +7 -3
  3. package/lib/client.js.map +2 -2
  4. package/lib/drama/manifest.json +212 -142
  5. package/lib/drama/skills/short-drama/SKILL.md +14 -2
  6. package/lib/drama/skills/short-drama/assets/project-template/short-drama.json +3 -0
  7. package/lib/drama/skills/short-drama/references/creator-documents.md +3 -0
  8. package/lib/drama/skills/short-drama/references/knowhow-index.md +15 -0
  9. package/lib/drama/skills/short-drama/scripts/project_tool.py +131 -0
  10. package/lib/drama/skills/short-drama-assets/SKILL.md +2 -1
  11. package/lib/drama/skills/short-drama-assets/references/asset-review-checklist.md +2 -0
  12. package/lib/drama/skills/short-drama-assets/references/era-anchors.md +37 -0
  13. package/lib/drama/skills/short-drama-assets/references/stage-contract.md +2 -0
  14. package/lib/drama/skills/short-drama-develop/SKILL.md +10 -4
  15. package/lib/drama/skills/short-drama-develop/assets/adaptation-map.example.jsonl +1 -1
  16. package/lib/drama/skills/short-drama-develop/assets/creative-brief.md +8 -0
  17. package/lib/drama/skills/short-drama-develop/references/adaptation-craft.md +80 -13
  18. package/lib/drama/skills/short-drama-develop/references/episode-design.md +95 -12
  19. package/lib/drama/skills/short-drama-develop/references/genre-and-hook-playbook.md +9 -5
  20. package/lib/drama/skills/short-drama-develop/references/genre-cards//345/244/215/344/273/207/346/211/223/350/204/270.md +1 -1
  21. package/lib/drama/skills/short-drama-develop/references/genre-cards//347/263/273/347/273/237/346/265/201.md +51 -0
  22. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/200/206/350/242/255.md +51 -0
  23. package/lib/drama/skills/short-drama-develop/references/genre-cards//351/207/215/347/224/237/347/251/277/350/266/212.md +51 -0
  24. package/lib/drama/skills/short-drama-develop/references/genre-cards.md +10 -7
  25. package/lib/drama/skills/short-drama-develop/references/premise-devices.md +15 -9
  26. package/lib/drama/skills/short-drama-develop/references/serial-character-and-memory.md +3 -2
  27. package/lib/drama/skills/short-drama-develop/references/stage-contract.md +14 -7
  28. package/lib/drama/skills/short-drama-develop/references/story-craft.md +7 -3
  29. package/lib/drama/skills/short-drama-edit/SKILL.md +43 -20
  30. package/lib/drama/skills/short-drama-edit/assets/remotion/README.md +49 -13
  31. package/lib/drama/skills/short-drama-edit/assets/remotion/package.json +4 -2
  32. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Overlay.tsx +31 -0
  33. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Root.tsx +5 -5
  34. package/lib/drama/skills/short-drama-edit/assets/remotion/src/Subtitles.tsx +68 -69
  35. package/lib/drama/skills/short-drama-edit/assets/remotion/src/font.ts +39 -29
  36. package/lib/drama/skills/short-drama-edit/assets/remotion/src/rules.mjs +188 -0
  37. package/lib/drama/skills/short-drama-edit/assets/remotion/src/schema.ts +26 -13
  38. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/Card.tsx +72 -0
  39. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/CornerChip.tsx +39 -0
  40. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/ScreenText.tsx +36 -0
  41. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/SystemPanel.tsx +44 -0
  42. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/TaskPanel.tsx +100 -0
  43. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/chrome.tsx +197 -0
  44. package/lib/drama/skills/short-drama-edit/assets/remotion/src/screen/tokens.ts +62 -0
  45. package/lib/drama/skills/short-drama-edit/assets/remotion/tsconfig.json +1 -0
  46. package/lib/drama/skills/short-drama-edit/assets//345/211/252/350/276/221/345/215/225.md +4 -2
  47. package/lib/drama/skills/short-drama-edit/references/cut-craft.md +3 -1
  48. package/lib/drama/skills/short-drama-edit/references/delivery-verify.md +6 -2
  49. package/lib/drama/skills/short-drama-edit/references/generated-footage.md +12 -6
  50. package/lib/drama/skills/short-drama-edit/references/sound-and-subtitles.md +13 -8
  51. package/lib/drama/skills/short-drama-edit/references/stage-contract.md +2 -0
  52. package/lib/drama/skills/short-drama-edit/scripts/edit_tool.py +1153 -121
  53. package/lib/drama/skills/short-drama-edit/scripts/selftest.py +49 -9
  54. package/lib/drama/skills/short-drama-novel-analyze/SKILL.md +3 -3
  55. package/lib/drama/skills/short-drama-novel-analyze/assets/episode-candidate.example.jsonl +2 -2
  56. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-triage.md +8 -4
  57. package/lib/drama/skills/short-drama-novel-analyze/references/adaptation-value.md +10 -3
  58. package/lib/drama/skills/short-drama-novel-analyze/references/aggregation-and-entities.md +25 -1
  59. package/lib/drama/skills/short-drama-novel-analyze/references/stage-contract.md +1 -0
  60. package/lib/drama/skills/short-drama-review/SKILL.md +2 -2
  61. package/lib/drama/skills/short-drama-review/references/review-method.md +6 -1
  62. package/lib/drama/skills/short-drama-review/references/rubric-assets-prompts.md +11 -0
  63. package/lib/drama/skills/short-drama-review/references/rubric-story-script.md +77 -3
  64. package/lib/drama/skills/short-drama-review/references/rubric-visual-motion.md +15 -0
  65. package/lib/drama/skills/short-drama-review/references/stage-contract.md +3 -0
  66. package/lib/drama/skills/short-drama-storyboard/SKILL.md +13 -5
  67. package/lib/drama/skills/short-drama-storyboard/references/blocking-playbooks.md +1 -1
  68. package/lib/drama/skills/short-drama-storyboard/references/production-shot-grammar.md +2 -2
  69. package/lib/drama/skills/short-drama-storyboard/references/shot-craft.md +82 -14
  70. package/lib/drama/skills/short-drama-storyboard/references/stage-contract.md +4 -2
  71. package/lib/drama/skills/short-drama-video-prompts/SKILL.md +5 -3
  72. package/lib/drama/skills/short-drama-video-prompts/references/camera-audio-continuity.md +12 -0
  73. package/lib/drama/skills/short-drama-video-prompts/references/delivery-profile.md +4 -5
  74. package/lib/drama/skills/short-drama-video-prompts/references/generability.md +4 -2
  75. package/lib/drama/skills/short-drama-video-prompts/references/minimax-h3.md +40 -1
  76. package/lib/drama/skills/short-drama-video-prompts/references/motion-recipe.md +20 -14
  77. package/lib/drama/skills/short-drama-video-prompts/references/performance-action-timing.md +1 -1
  78. package/lib/drama/skills/short-drama-video-prompts/references/production-prompt-grammar.md +8 -7
  79. package/lib/drama/skills/short-drama-video-prompts/references/review-and-fixtures.md +1 -1
  80. package/lib/drama/skills/short-drama-video-prompts/references/stage-contract.md +1 -0
  81. package/lib/drama/skills/short-drama-video-prompts/references/target-model-profile.md +8 -1
  82. package/lib/drama/skills/short-drama-video-prompts/references/wan-3.0.md +103 -0
  83. package/lib/drama/skills/short-drama-video-prompts/scripts/motion_timing_check.py +8 -7
  84. package/lib/drama/skills/short-drama-write/SKILL.md +8 -3
  85. package/lib/drama/skills/short-drama-write/references/dialogue-craft.md +1 -1
  86. package/lib/drama/skills/short-drama-write/references/script-craft.md +56 -3
  87. package/lib/drama/skills/short-drama-write/references/stage-contract.md +4 -0
  88. package/lib/drama/skills/short-drama-write/scripts/duration_estimate.py +48 -2
  89. package/lib/index.js +71 -21
  90. package/lib/index.js.map +3 -3
  91. package/lib/oh-story/manifest.json +545 -310
  92. package/lib/oh-story/roles/chapter-extractor.md +11 -11
  93. package/lib/oh-story/roles/character-designer.md +1 -2
  94. package/lib/oh-story/roles/consistency-checker.md +11 -9
  95. package/lib/oh-story/roles/narrative-writer.md +24 -25
  96. package/lib/oh-story/roles/story-architect.md +9 -61
  97. package/lib/oh-story/roles/story-explorer.md +20 -125
  98. package/lib/oh-story/roles/story-researcher.md +0 -1
  99. package/lib/oh-story/skills/story/SKILL.md +6 -6
  100. package/lib/oh-story/skills/story/VERSION +1 -1
  101. package/lib/oh-story/skills/story/references/author-memory-maintenance.md +75 -0
  102. package/lib/oh-story/skills/story/references/author-memory.md +40 -118
  103. package/lib/oh-story/skills/story/scripts/author_memory_commit.py +3 -3
  104. package/lib/oh-story/skills/story-deslop/SKILL.md +24 -25
  105. package/lib/oh-story/skills/story-deslop/references/agent-calls.md +5 -0
  106. package/lib/oh-story/skills/story-deslop/references/anti-ai-writing.md +1 -1
  107. package/lib/oh-story/skills/story-deslop/references/author-memory-maintenance.md +75 -0
  108. package/lib/oh-story/skills/story-deslop/references/author-memory.md +40 -118
  109. package/lib/oh-story/skills/story-deslop/references/banned-words.md +2 -2
  110. package/lib/oh-story/skills/story-deslop/references/deslop-gates.md +21 -4
  111. package/lib/oh-story/skills/story-deslop/references/style-resolution.md +4 -4
  112. package/lib/oh-story/skills/story-deslop/scripts/author_memory_commit.py +3 -3
  113. package/lib/oh-story/skills/story-deslop/scripts/check-ai-patterns.js +155 -8
  114. package/lib/oh-story/skills/story-import/SKILL.md +63 -579
  115. package/lib/oh-story/skills/story-import/references/deep-analysis.md +47 -0
  116. package/lib/oh-story/skills/story-import/references/format-and-structure.md +1 -1
  117. package/lib/oh-story/skills/story-import/references/import-report.md +64 -0
  118. package/lib/oh-story/skills/story-import/references/import-special-cases.md +34 -0
  119. package/lib/oh-story/skills/story-import/references/import-tracking.md +95 -0
  120. package/lib/oh-story/skills/story-import/references/length-routing.md +1 -1
  121. package/lib/oh-story/skills/story-import/references/outline-reverse-rules.md +79 -0
  122. package/lib/oh-story/skills/story-import/references/outline-reverse.md +24 -0
  123. package/lib/oh-story/skills/story-import/references/structure-mapping-long.md +95 -91
  124. package/lib/oh-story/skills/story-import/references/structure-mapping-short.md +24 -12
  125. package/lib/oh-story/skills/story-import/references/tracking-initialization.md +1 -1
  126. package/lib/oh-story/skills/story-import/references/tracking-transaction.md +11 -9
  127. package/lib/oh-story/skills/story-import/scripts/build_outline_brief.py +332 -0
  128. package/lib/oh-story/skills/story-import/scripts/check-outline-contract.js +101 -14
  129. package/lib/oh-story/skills/story-import/scripts/tracking_commit.py +278 -23
  130. package/lib/oh-story/skills/story-import/scripts/wordcount_core.py +179 -23
  131. package/lib/oh-story/skills/story-long-analyze/SKILL.md +28 -50
  132. package/lib/oh-story/skills/story-long-analyze/references/author-facing.md +12 -5
  133. package/lib/oh-story/skills/story-long-analyze/references/deconstruction-notes.md +1 -1
  134. package/lib/oh-story/skills/story-long-analyze/references/final-checks.md +19 -0
  135. package/lib/oh-story/skills/story-long-analyze/references/index-rebuild.md +11 -0
  136. package/lib/oh-story/skills/story-long-analyze/references/pipeline-ops.md +21 -55
  137. package/lib/oh-story/skills/story-long-analyze/references/stage1-golden-chapters.md +128 -0
  138. package/lib/oh-story/skills/story-long-analyze/references/stage2-extraction.md +229 -0
  139. package/lib/oh-story/skills/story-long-analyze/references/stage3-plot-rhythm.md +480 -0
  140. package/lib/oh-story/skills/story-long-analyze/references/stage4-characters-settings.md +195 -0
  141. package/lib/oh-story/skills/story-long-analyze/references/stage5-report.md +33 -0
  142. package/lib/oh-story/skills/story-long-analyze/references/style-profile-generator.md +17 -0
  143. package/lib/oh-story/skills/story-long-analyze/references/style-profile-protocol.md +1 -1
  144. package/lib/oh-story/skills/story-long-analyze/references/synthesis-inputs.md +39 -0
  145. package/lib/oh-story/skills/story-long-analyze/scripts/manage_analysis_run.py +47 -8
  146. package/lib/oh-story/skills/story-long-scan/SKILL.md +41 -193
  147. package/lib/oh-story/skills/story-long-scan/references/platform-ciweimao.md +19 -0
  148. package/lib/oh-story/skills/story-long-scan/references/platform-fanqie.md +45 -0
  149. package/lib/oh-story/skills/story-long-scan/references/platform-jjwxc.md +28 -0
  150. package/lib/oh-story/skills/story-long-scan/references/platform-qidian.md +35 -0
  151. package/lib/oh-story/skills/story-long-scan/references/platform-qimao.md +27 -0
  152. package/lib/oh-story/skills/story-long-scan/references/topic-decision.md +6 -2
  153. package/lib/oh-story/skills/story-long-write/SKILL.md +32 -73
  154. package/lib/oh-story/skills/story-long-write/references/agent-calls.md +47 -0
  155. package/lib/oh-story/skills/story-long-write/references/anti-ai-writing.md +1 -1
  156. package/lib/oh-story/skills/story-long-write/references/artifact-protocols.md +18 -201
  157. package/lib/oh-story/skills/story-long-write/references/author-memory-maintenance.md +75 -0
  158. package/lib/oh-story/skills/story-long-write/references/author-memory.md +40 -118
  159. package/lib/oh-story/skills/story-long-write/references/banned-words.md +2 -2
  160. package/lib/oh-story/skills/story-long-write/references/benchmark-recall.md +6 -10
  161. package/lib/oh-story/skills/story-long-write/references/character-relations.md +49 -1
  162. package/lib/oh-story/skills/story-long-write/references/deslop-gates.md +171 -0
  163. package/lib/oh-story/skills/story-long-write/references/emotion-on-page.md +116 -0
  164. package/lib/oh-story/skills/story-long-write/references/emotional-arc-design.md +1 -114
  165. package/lib/oh-story/skills/story-long-write/references/genre-prose-cards.md +1 -1
  166. package/lib/oh-story/skills/story-long-write/references/long-chapter-quality.md +3 -2
  167. package/lib/oh-story/skills/story-long-write/references/long-format.md +0 -8
  168. package/lib/oh-story/skills/story-long-write/references/long-genre-catalog.md +1 -1
  169. package/lib/oh-story/skills/story-long-write/references/long-genre-mechanics.md +3 -3
  170. package/lib/oh-story/skills/story-long-write/references/opening-design.md +2 -2
  171. package/lib/oh-story/skills/story-long-write/references/outline-conflict.md +4 -4
  172. package/lib/oh-story/skills/story-long-write/references/outline-methods.md +7 -7
  173. package/lib/oh-story/skills/story-long-write/references/outline-rhythm.md +3 -3
  174. package/lib/oh-story/skills/story-long-write/references/outline-structure-theory.md +14 -69
  175. package/lib/oh-story/skills/story-long-write/references/plot-frameworks.md +1 -1
  176. package/lib/oh-story/skills/story-long-write/references/plot-special-topics.md +2 -2
  177. package/lib/oh-story/skills/story-long-write/references/project-files.md +10 -6
  178. package/lib/oh-story/skills/story-long-write/references/reader-contract-and-progression.md +1 -1
  179. package/lib/oh-story/skills/story-long-write/references/reference-index.md +4 -4
  180. package/lib/oh-story/skills/story-long-write/references/stop-and-fix.md +9 -0
  181. package/lib/oh-story/skills/story-long-write/references/style-combat-face.md +1 -58
  182. package/lib/oh-story/skills/story-long-write/references/style-genre-modules.md +1 -1
  183. package/lib/oh-story/skills/story-long-write/references/style-resolution.md +4 -4
  184. package/lib/oh-story/skills/story-long-write/references/tracking-initialization.md +1 -1
  185. package/lib/oh-story/skills/story-long-write/references/tracking-transaction.md +11 -9
  186. package/lib/oh-story/skills/story-long-write/references/workflow-chapter.md +33 -44
  187. package/lib/oh-story/skills/story-long-write/references/workflow-daily.md +18 -51
  188. package/lib/oh-story/skills/story-long-write/references/workflow-outline.md +157 -0
  189. package/lib/oh-story/skills/story-long-write/references/workflow-revision.md +53 -67
  190. package/lib/oh-story/skills/story-long-write/references/workflow-setup.md +112 -251
  191. package/lib/oh-story/skills/story-long-write/references/workflow-volume.md +142 -0
  192. package/lib/oh-story/skills/story-long-write/references/writer-prompt-fallback.md +5 -3
  193. package/lib/oh-story/skills/story-long-write/references/writing-craft.md +18 -56
  194. package/lib/oh-story/skills/story-long-write/scripts/author_memory_commit.py +3 -3
  195. package/lib/oh-story/skills/story-long-write/scripts/build_architect_brief.py +260 -0
  196. package/lib/oh-story/skills/story-long-write/scripts/build_writer_prompt.py +96 -16
  197. package/lib/oh-story/skills/story-long-write/scripts/check-ai-patterns.js +155 -8
  198. package/lib/oh-story/skills/story-long-write/scripts/check-outline-contract.js +101 -14
  199. package/lib/oh-story/skills/story-long-write/scripts/check-outline-copy.js +7 -2
  200. package/lib/oh-story/skills/story-long-write/scripts/outline_view.py +2 -1
  201. package/lib/oh-story/skills/story-long-write/scripts/storyctl.py +250 -50
  202. package/lib/oh-story/skills/story-long-write/scripts/tracking_commit.py +278 -23
  203. package/lib/oh-story/skills/story-long-write/scripts/wordcount_core.py +179 -23
  204. package/lib/oh-story/skills/story-review/SKILL.md +19 -273
  205. package/lib/oh-story/skills/story-review/references/agent-prompts.md +184 -0
  206. package/lib/oh-story/skills/story-review/references/anti-ai-writing.md +1 -1
  207. package/lib/oh-story/skills/story-review/references/author-memory-maintenance.md +75 -0
  208. package/lib/oh-story/skills/story-review/references/author-memory.md +40 -118
  209. package/lib/oh-story/skills/story-review/references/banned-words.md +2 -2
  210. package/lib/oh-story/skills/story-review/references/batch-review.md +19 -0
  211. package/lib/oh-story/skills/story-review/references/character-relations.md +49 -1
  212. package/lib/oh-story/skills/story-review/references/review-quality.md +2 -1
  213. package/lib/oh-story/skills/story-review/references/review-tracking.md +10 -0
  214. package/lib/oh-story/skills/story-review/references/solo.md +52 -0
  215. package/lib/oh-story/skills/story-review/references/style-resolution.md +4 -4
  216. package/lib/oh-story/skills/story-review/references/tracking-initialization.md +1 -1
  217. package/lib/oh-story/skills/story-review/references/tracking-transaction.md +11 -9
  218. package/lib/oh-story/skills/story-review/scripts/author_memory_commit.py +3 -3
  219. package/lib/oh-story/skills/story-review/scripts/check-ai-patterns.js +155 -8
  220. package/lib/oh-story/skills/story-review/scripts/tracking_commit.py +278 -23
  221. package/lib/oh-story/skills/story-review/scripts/wordcount_core.py +179 -23
  222. package/lib/oh-story/skills/story-setup/SKILL.md +69 -458
  223. package/lib/oh-story/skills/story-setup/references/agent-references/agent-quality.md +4 -4
  224. package/lib/oh-story/skills/story-setup/references/agent-references/anti-ai-writing.md +1 -1
  225. package/lib/oh-story/skills/story-setup/references/agent-references/banned-words.md +2 -2
  226. package/lib/oh-story/skills/story-setup/references/agent-references/benchmark-style-load.md +107 -0
  227. package/lib/oh-story/skills/story-setup/references/agent-references/character-relations.md +49 -1
  228. package/lib/oh-story/skills/story-setup/references/agent-references/deslop-gates.md +21 -4
  229. package/lib/oh-story/skills/story-setup/references/agent-references/emotion-on-page.md +116 -0
  230. package/lib/oh-story/skills/story-setup/references/agent-references/emotional-arc-design.md +1 -114
  231. package/lib/oh-story/skills/story-setup/references/agent-references/format-and-structure.md +1 -1
  232. package/lib/oh-story/skills/story-setup/references/agent-references/genre-prose-cards.md +1 -1
  233. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-catalog.md +1 -1
  234. package/lib/oh-story/skills/story-setup/references/agent-references/long-genre-mechanics.md +3 -3
  235. package/lib/oh-story/skills/story-setup/references/agent-references/long-quality.md +7 -5
  236. package/lib/oh-story/skills/story-setup/references/agent-references/opening-design.md +2 -2
  237. package/lib/oh-story/skills/story-setup/references/agent-references/outline-conflict.md +4 -4
  238. package/lib/oh-story/skills/story-setup/references/agent-references/outline-methods.md +7 -7
  239. package/lib/oh-story/skills/story-setup/references/agent-references/outline-rhythm.md +3 -3
  240. package/lib/oh-story/skills/story-setup/references/agent-references/short-emotional-methods.md +1 -1
  241. package/lib/oh-story/skills/story-setup/references/agent-references/short-genre-formulas.md +0 -15
  242. package/lib/oh-story/skills/story-setup/references/agent-references/short-reversal.md +1 -1
  243. package/lib/oh-story/skills/story-setup/references/agent-references/style-combat-face.md +1 -58
  244. package/lib/oh-story/skills/story-setup/references/agent-references/style-genre-modules.md +1 -1
  245. package/lib/oh-story/skills/story-setup/references/agent-references/style-resolution.md +4 -4
  246. package/lib/oh-story/skills/story-setup/references/agent-references/writing-craft.md +18 -56
  247. package/lib/oh-story/skills/story-setup/references/diagnostics.md +3 -3
  248. package/lib/oh-story/skills/story-short-analyze/SKILL.md +37 -110
  249. package/lib/oh-story/skills/story-short-analyze/references/analysis-character-relations.md +1 -1
  250. package/lib/oh-story/skills/story-short-analyze/references/analysis-method.md +42 -0
  251. package/lib/oh-story/skills/story-short-analyze/references/optional-modules.md +97 -0
  252. package/lib/oh-story/skills/story-short-analyze/references/output-contract.md +9 -47
  253. package/lib/oh-story/skills/story-short-analyze/references/quality-checklist.md +80 -0
  254. package/lib/oh-story/skills/story-short-analyze/references/source-story-quality.md +4 -4
  255. package/lib/oh-story/skills/story-short-analyze/references/stage2-3-structure-emotion.md +308 -0
  256. package/lib/oh-story/skills/story-short-analyze/references/{material-decomposition.md → stage4-6-reversal-summary.md} +303 -374
  257. package/lib/oh-story/skills/story-short-scan/SKILL.md +30 -64
  258. package/lib/oh-story/skills/story-short-scan/references/manual-rank-input.md +36 -0
  259. package/lib/oh-story/skills/story-short-scan/references/platform-dianzhong.md +24 -0
  260. package/lib/oh-story/skills/story-short-scan/references/platform-heiyan.md +21 -0
  261. package/lib/oh-story/skills/story-short-scan/references/topic-match.md +38 -0
  262. package/lib/oh-story/skills/story-short-write/SKILL.md +23 -34
  263. package/lib/oh-story/skills/story-short-write/references/agent-calls.md +13 -0
  264. package/lib/oh-story/skills/story-short-write/references/author-memory-maintenance.md +75 -0
  265. package/lib/oh-story/skills/story-short-write/references/author-memory.md +40 -118
  266. package/lib/oh-story/skills/story-short-write/references/banned-words.md +2 -2
  267. package/lib/oh-story/skills/story-short-write/references/benchmark-recall.md +1 -21
  268. package/lib/oh-story/skills/story-short-write/references/emotional-methods.md +1 -1
  269. package/lib/oh-story/skills/story-short-write/references/genre-writing-formulas.md +0 -15
  270. package/lib/oh-story/skills/story-short-write/references/output-contract.md +9 -47
  271. package/lib/oh-story/skills/story-short-write/references/reference-index.md +17 -49
  272. package/lib/oh-story/skills/story-short-write/references/scene-craft.md +40 -0
  273. package/lib/oh-story/skills/story-short-write/references/short-craft.md +7 -43
  274. package/lib/oh-story/skills/story-short-write/references/short-format.md +3 -3
  275. package/lib/oh-story/skills/story-short-write/references/short-prose-quality.md +2 -1
  276. package/lib/oh-story/skills/story-short-write/references/short-reversal.md +1 -1
  277. package/lib/oh-story/skills/story-short-write/references/style-resolution.md +4 -4
  278. package/lib/oh-story/skills/story-short-write/references/submission-craft.md +1 -1
  279. package/lib/oh-story/skills/story-short-write/references/villain-and-reveal.md +5 -10
  280. package/lib/oh-story/skills/story-short-write/references/workflow-design.md +19 -12
  281. package/lib/oh-story/skills/story-short-write/references/workflow-draft.md +22 -32
  282. package/lib/oh-story/skills/story-short-write/references/workflow-revision.md +84 -17
  283. package/lib/oh-story/skills/story-short-write/references/writing-workflow.md +7 -119
  284. package/lib/oh-story/skills/story-short-write/scripts/author_memory_commit.py +3 -3
  285. package/lib/oh-story/skills/story-short-write/scripts/check-ai-patterns.js +155 -8
  286. package/lib/oh-story/skills/story-short-write/scripts/check-outline-copy.js +7 -2
  287. package/lib/types/client/video-studio.d.ts.map +1 -1
  288. package/lib/types/native-hooks.d.ts +2 -2
  289. package/lib/types/native-hooks.d.ts.map +1 -1
  290. package/lib/types/role-tool.d.ts.map +1 -1
  291. package/lib/types/skill-provider.d.ts.map +1 -1
  292. package/lib/types/video-project.d.ts.map +1 -1
  293. package/lib/types/workspace-route.d.ts.map +1 -1
  294. package/lib/video-recap/CHANGELOG.md +60 -1
  295. package/lib/video-recap/README.en.md +348 -137
  296. package/lib/video-recap/README.md +340 -136
  297. package/lib/video-recap/manifest.json +406 -251
  298. package/lib/video-recap/skills/video-assemble/SKILL.md +30 -15
  299. package/lib/video-recap/skills/video-assemble/references/audio-modes.md +63 -0
  300. package/lib/video-recap/skills/video-assemble/references/explicit-audio-mix.md +75 -0
  301. package/lib/video-recap/skills/video-assemble/references/foreground-compose.md +118 -0
  302. package/lib/video-recap/skills/video-assemble/references/narration-adoption.md +103 -0
  303. package/lib/video-recap/skills/video-assemble/references/packaging.md +45 -0
  304. package/lib/video-recap/skills/video-assemble/references/pair-media.md +74 -0
  305. package/lib/video-recap/skills/video-assemble/references/source-score.md +147 -0
  306. package/lib/video-recap/skills/video-assemble/references/subtitle-track.md +202 -0
  307. package/lib/video-recap/skills/video-assemble/scripts/adoption/__init__.py +1 -0
  308. package/lib/video-recap/skills/video-assemble/scripts/adoption/audio_mix_binding.py +279 -0
  309. package/lib/video-recap/skills/video-assemble/scripts/adoption/frozen_audio.py +187 -0
  310. package/lib/video-recap/skills/video-assemble/scripts/adoption/narration_binding.py +323 -0
  311. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_inputs.py +109 -0
  312. package/lib/video-recap/skills/video-assemble/scripts/adoption/strict_publish.py +130 -0
  313. package/lib/video-recap/skills/video-assemble/scripts/artifacts.py +10 -46
  314. package/lib/video-recap/skills/video-assemble/scripts/assemble.py +378 -119
  315. package/lib/video-recap/skills/video-assemble/scripts/assemble_constants.py +29 -12
  316. package/lib/video-recap/skills/video-assemble/scripts/assembly_contract.py +95 -44
  317. package/lib/video-recap/skills/video-assemble/scripts/assembly_settings.py +75 -32
  318. package/lib/video-recap/skills/video-assemble/scripts/audio_mix.py +11 -11
  319. package/lib/video-recap/skills/video-assemble/scripts/compose_foreground.py +293 -0
  320. package/lib/video-recap/skills/video-assemble/scripts/export_jianying.py +71 -78
  321. package/lib/video-recap/skills/video-assemble/scripts/jianying/__init__.py +1 -0
  322. package/lib/video-recap/skills/video-assemble/scripts/{jianying_builders.py → jianying/builders.py} +39 -67
  323. package/lib/video-recap/skills/video-assemble/scripts/{jianying_model.py → jianying/model.py} +3 -11
  324. package/lib/video-recap/skills/video-assemble/scripts/{jianying_optional.py → jianying/optional.py} +1 -1
  325. package/lib/video-recap/skills/video-assemble/scripts/jianying/schema.py +53 -0
  326. package/lib/video-recap/skills/video-assemble/scripts/{jianying_templates.py → jianying/templates.py} +1 -1
  327. package/lib/video-recap/skills/video-assemble/scripts/{jianying_timeline_contract.py → jianying/timeline_contract.py} +34 -13
  328. package/lib/video-recap/skills/video-assemble/scripts/{jianying_writer.py → jianying/writer.py} +7 -17
  329. package/lib/video-recap/skills/video-assemble/scripts/lib.py +37 -4
  330. package/lib/video-recap/skills/video-assemble/scripts/media.py +12 -21
  331. package/lib/video-recap/skills/video-assemble/scripts/narration_audio.py +64 -34
  332. package/lib/video-recap/skills/video-assemble/scripts/packaging.py +122 -0
  333. package/lib/video-recap/skills/video-assemble/scripts/pair_media.py +216 -0
  334. package/lib/video-recap/skills/video-assemble/scripts/render_preflight.py +1 -3
  335. package/lib/video-recap/skills/video-assemble/scripts/source_score.py +469 -0
  336. package/lib/video-recap/skills/video-assemble/scripts/source_subtitles.py +25 -9
  337. package/lib/video-recap/skills/video-assemble/scripts/subtitles/__init__.py +1 -0
  338. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_core.py → subtitles/core.py} +13 -6
  339. package/lib/video-recap/skills/video-assemble/scripts/{subtitle_render.py → subtitles/render.py} +5 -4
  340. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track.py +324 -0
  341. package/lib/video-recap/skills/video-assemble/scripts/subtitles/track_binding.py +200 -0
  342. package/lib/video-recap/skills/video-assemble/scripts/timeline.py +30 -46
  343. package/lib/video-recap/skills/video-assemble/scripts/timeline_emit.py +91 -7
  344. package/lib/video-recap/skills/video-assemble/scripts/visual_render.py +22 -8
  345. package/lib/video-recap/skills/video-cut/SKILL.md +34 -16
  346. package/lib/video-recap/skills/video-cut/references/shot-review.md +50 -0
  347. package/lib/video-recap/skills/video-cut/scripts/cut.py +2 -28
  348. package/lib/video-recap/skills/video-cut/scripts/cut_cli.py +58 -62
  349. package/lib/video-recap/skills/video-cut/scripts/cut_contract.py +21 -106
  350. package/lib/video-recap/skills/video-cut/scripts/cut_render.py +14 -9
  351. package/lib/video-recap/skills/video-cut/scripts/lib.py +39 -0
  352. package/lib/video-recap/skills/video-cut/scripts/narration_mapping.py +2 -155
  353. package/lib/video-recap/skills/video-cut/scripts/narrative_selection.py +244 -0
  354. package/lib/video-recap/skills/video-cut/scripts/shot_review.py +357 -0
  355. package/lib/video-recap/skills/video-recap/SKILL.md +86 -42
  356. package/lib/video-recap/skills/video-recap/references/audio-routing.md +126 -0
  357. package/lib/video-recap/skills/video-recap/references/config-playbook.md +12 -8
  358. package/lib/video-recap/skills/video-recap/references/data-schema.md +44 -33
  359. package/lib/video-recap/skills/video-recap/references/resource-library.md +151 -0
  360. package/lib/video-recap/skills/video-recap/references/shift-left-qc-schema.md +1 -1
  361. package/lib/video-recap/skills/video-recap/scripts/doctor.py +123 -30
  362. package/lib/video-recap/skills/video-recap/scripts/final_qc.py +22 -75
  363. package/lib/video-recap/skills/video-recap/scripts/lib.py +3 -3
  364. package/lib/video-recap/skills/video-recap/scripts/library.py +509 -0
  365. package/lib/video-recap/skills/video-recap/scripts/materials.py +63 -91
  366. package/lib/video-recap/skills/video-recap/scripts/mimo_qc.py +8 -70
  367. package/lib/video-recap/skills/video-recap/scripts/project_binding.py +286 -0
  368. package/lib/video-recap/skills/video-recap/scripts/qc/__init__.py +1 -0
  369. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_client.py → qc/mimo_client.py} +1 -1
  370. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_evidence.py → qc/mimo_evidence.py} +33 -66
  371. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_observations.py → qc/mimo_observations.py} +3 -11
  372. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_payload.py → qc/mimo_payload.py} +4 -7
  373. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_report.py → qc/mimo_report.py} +17 -28
  374. package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_runner.py → qc/mimo_runner.py} +2 -2
  375. package/lib/video-recap/skills/video-recap/scripts/qc_contract.py +0 -19
  376. package/lib/video-recap/skills/video-recap/scripts/recap_cli.py +119 -50
  377. package/lib/video-recap/skills/video-recap/scripts/recap_inspect.py +32 -114
  378. package/lib/video-recap/skills/video-recap/scripts/recap_review.py +9 -23
  379. package/lib/video-recap/skills/video-recap/scripts/recap_runner.py +387 -334
  380. package/lib/video-recap/skills/video-recap/scripts/recap_runtime.py +23 -23
  381. package/lib/video-recap/skills/video-recap/scripts/recap_source.py +278 -0
  382. package/lib/video-recap/skills/video-recap/scripts/recap_stage_qc.py +25 -12
  383. package/lib/video-recap/skills/video-recap/scripts/recap_timeline.py +59 -52
  384. package/lib/video-recap/skills/video-recap/scripts/resource_lock.py +162 -0
  385. package/lib/video-recap/skills/video-script/SKILL.md +16 -13
  386. package/lib/video-recap/skills/video-script/references/creative-editing-playbook.md +9 -5
  387. package/lib/video-recap/skills/video-script/references/promotional-copy.md +68 -0
  388. package/lib/video-recap/skills/video-script/references/research-guide.md +1 -1
  389. package/lib/video-recap/skills/video-script/scripts/evidence_bundle.py +24 -76
  390. package/lib/video-recap/skills/video-script/scripts/lib.py +10 -87
  391. package/lib/video-recap/skills/video-script/scripts/narration_lint.py +63 -39
  392. package/lib/video-recap/skills/video-script/scripts/review.py +0 -2
  393. package/lib/video-recap/skills/video-script/scripts/review_grounding.py +35 -59
  394. package/lib/video-recap/skills/video-script/scripts/review_response.py +66 -128
  395. package/lib/video-recap/skills/video-script/scripts/review_runner.py +12 -20
  396. package/lib/video-recap/skills/video-script/scripts/speech_ownership.py +4 -4
  397. package/lib/video-recap/skills/video-script/scripts/validate.py +53 -42
  398. package/lib/video-recap/skills/video-understanding/SKILL.md +6 -4
  399. package/lib/video-recap/skills/video-understanding/references/data-schema.md +50 -156
  400. package/lib/video-recap/skills/video-understanding/references/research-guide.md +4 -4
  401. package/lib/video-recap/skills/video-understanding/scripts/asr.py +85 -65
  402. package/lib/video-recap/skills/video-understanding/scripts/asr_timing_evidence.py +270 -0
  403. package/lib/video-recap/skills/video-understanding/scripts/brief.py +2 -5
  404. package/lib/video-recap/skills/video-understanding/scripts/briefing/__init__.py +1 -0
  405. package/lib/video-recap/skills/video-understanding/scripts/{agent_brief.py → briefing/builder.py} +38 -35
  406. package/lib/video-recap/skills/{video-script/scripts/brief_context.py → video-understanding/scripts/briefing/context.py} +4 -35
  407. package/lib/video-recap/skills/{video-script/scripts/brief_inputs.py → video-understanding/scripts/briefing/inputs.py} +9 -31
  408. package/lib/video-recap/skills/video-understanding/scripts/{brief_timeline.py → briefing/timeline.py} +5 -6
  409. package/lib/video-recap/skills/video-understanding/scripts/consolidate.py +65 -116
  410. package/lib/video-recap/skills/video-understanding/scripts/detect.py +31 -40
  411. package/lib/video-recap/skills/video-understanding/scripts/lib.py +30 -86
  412. package/lib/video-recap/skills/video-understanding/scripts/narration_lint.py +63 -39
  413. package/lib/video-recap/skills/video-understanding/scripts/speech_ownership.py +4 -4
  414. package/lib/video-recap/skills/video-understanding/scripts/storyboard.py +17 -79
  415. package/lib/video-recap/skills/video-understanding/scripts/understanding_brief.py +14 -40
  416. package/lib/video-recap/skills/video-understanding/scripts/understanding_cache.py +64 -46
  417. package/lib/video-recap/skills/video-understanding/scripts/understanding_runner.py +31 -11
  418. package/lib/video-recap/skills/video-understanding/scripts/understanding_storyboard.py +19 -14
  419. package/lib/video-recap/skills/video-understanding/scripts/vlm.py +80 -108
  420. package/lib/video-recap/skills/video-voiceover/SKILL.md +29 -19
  421. package/lib/video-recap/skills/video-voiceover/references/index-tts.md +31 -0
  422. package/lib/video-recap/skills/video-voiceover/scripts/approved_text_policy.py +123 -0
  423. package/lib/video-recap/skills/video-voiceover/scripts/dub.py +51 -59
  424. package/lib/video-recap/skills/video-voiceover/scripts/lib.py +8 -44
  425. package/lib/video-recap/skills/video-voiceover/scripts/providers/__init__.py +1 -0
  426. package/lib/video-recap/skills/video-voiceover/scripts/providers/index_tts.py +184 -0
  427. package/lib/video-recap/skills/video-voiceover/scripts/voiceover.py +212 -134
  428. package/package.json +41 -41
  429. package/lib/oh-story/skills/story-long-analyze/references/material-decomposition.md +0 -538
  430. package/lib/oh-story/skills/story-long-analyze/references/output-templates.md +0 -603
  431. package/lib/oh-story/skills/story-long-scan/references/scan-output-format.md +0 -207
  432. package/lib/oh-story/skills/story-short-analyze/references/output-templates.md +0 -561
  433. package/lib/video-recap/skills/video-assemble/scripts/jianying_schema.py +0 -98
  434. package/lib/video-recap/skills/video-recap/references/creative-editing-playbook.md +0 -225
  435. package/lib/video-recap/skills/video-recap/references/research-guide.md +0 -74
  436. package/lib/video-recap/skills/video-recap/references/timeline-and-jianying.md +0 -250
  437. package/lib/video-recap/skills/video-script/scripts/agent_brief.py +0 -399
  438. package/lib/video-recap/skills/video-script/scripts/brief_timeline.py +0 -327
  439. package/lib/video-recap/skills/video-script/scripts/narration.py +0 -12
  440. package/lib/video-recap/skills/video-understanding/scripts/brief_context.py +0 -348
  441. package/lib/video-recap/skills/video-understanding/scripts/brief_inputs.py +0 -290
  442. /package/lib/video-recap/skills/video-assemble/scripts/{jianying_tracks.py → jianying/tracks.py} +0 -0
  443. /package/lib/video-recap/skills/video-recap/scripts/{mimo_qc_contract.py → qc/mimo_contract.py} +0 -0
  444. /package/lib/video-recap/skills/video-voiceover/scripts/{fish_audio.py → providers/fish_audio.py} +0 -0
@@ -1,561 +0,0 @@
1
- # 短篇拆文输出模板
2
-
3
- > 拆文输出时加载。先看决策路由选 Stage,再按模板填写。方法论细节见 material-decomposition.md。
4
- >
5
- > **输出契约 SSOT**:Stage→文件映射、`_meta.json` 字段(含 `structure_counts`)、
6
- > 下游消费规范、验收检查均在 [output-contract.md](output-contract.md) 中权威定义。
7
- > 本文件填的模板内容最终落到 `拆文报告.md` 等 markdown 文件,对应去向见每个 Stage
8
- > 末尾的 HTML 注释标注。质量检查必填字段段末加注 `[BLOCK]` / `[WARN]`:BLOCK
9
- > 不通过 → 「BLOCK 项扫描」阻断;WARN 不通过 → 写入「待补」清单不阻断。
10
-
11
- ## 决策路由
12
-
13
- | 你在执行哪个 Stage | 加载哪个模板 | 必填字段 |
14
- |---------------|-------------|---------|
15
- | Phase 1 确认对象 | 无模板(用户交互,见 SKILL.md) | 用户已提供文本+拆解方向 |
16
- | Stage 2 结构+情节节点 | Stage 2 全篇结构 + Stage 2B 情节节点 | 故事核 + 至少 4 段结构 + 节点覆盖全文 |
17
- | Stage 3 情感线+爆点 | Stage 3 情感曲线 + 爆点分析 | 至少 5 节点 + 爆点 6 维度 |
18
- | Stage 4 反转+写作手法 | Stage 4 反转分析 + 写作手法 | 前置反转检查 + 铺垫线索 ≥2 + 手法 ≥5 项 |
19
- | Stage 5 人物+开头结尾 | Stage 5 人物 + 开头/结尾 | 所有有名人物 + 前 3 句引用 + 结尾类型 |
20
- | Stage 6 评估报告 | Stage 6 综合评估 | 五维评分 + 爆点性 + 共鸣 ≥3 层 + 可借鉴结构 ≥3 条 |
21
- | 同类对比(可选) | 同类对比 | 差异化亮点 |
22
- | 平台适配(可选) | 平台适配评估 | 三平台适配度 |
23
- | 详细节奏(可选) | 详细节奏分析 | 节奏指标 + 异常检测 |
24
-
25
- ## 目录
26
-
27
- 1. [Stage 2 全篇结构](#stage-2-全篇结构)
28
- 2. [Stage 2B 情节节点提取](#stage-2b-情节节点提取)
29
- 3. [Stage 3 情感线+爆点](#stage-3-情感线爆点)
30
- 4. [Stage 4 反转+写作手法](#stage-4-反转写作手法)
31
- 5. [Stage 5 人物+开头结尾](#stage-5-人物开头结尾)
32
- 6. [Stage 6 综合评估](#stage-6-综合评估)
33
- 7. [详细节奏分析](#详细节奏分析)
34
- 8. [短篇结构速查库](#短篇结构速查库)
35
- 9. [质量检查必填字段](#质量检查必填字段)
36
-
37
- ---
38
-
39
- ## Stage 2 全篇结构
40
-
41
- <!-- output to: 拆文报告.md(故事核 + 故事梗概 + 结构划分 + 叙事时间线 各段) -->
42
-
43
- 字数{X}字 | 节数{N} | 平台{平台} | 类型{题材/情绪类型} | 结局{HE/BE/开放式} | POV{第一/第三人称}
44
-
45
- ### 故事核
46
-
47
- **设定**:{故事前提/触发条件,如"重生三次被母弟杀害"}
48
- **主题**:{核心矛盾/价值观冲突,如"极端重男轻女"}
49
- **核心行动**:{主角做了什么,如"放任母弟自毁"}
50
- **一句话**:{合并,如"重生三次被母弟杀害的女孩,第四世放任她们自毁"}
51
-
52
- ### 故事梗概
53
-
54
- {200-500字概括全文}
55
-
56
- ### 结构划分(4-6段,必须含开端/发展/高潮/结局)
57
-
58
- | 段落 | 字数范围 | 占比 | 功能 | 对应节 |
59
- |------|----------|------|------|--------|
60
- | 开端 | {X}-{Y} | {Z%} | {功能} | {节号} |
61
- | 发展 | {X}-{Y} | {Z%} | {功能} | {节号} |
62
- | {转折/过渡(可选)} | {X}-{Y} | {Z%} | {功能} | {节号} |
63
- | 高潮 | {X}-{Y} | {Z%} | {功能} | {节号} |
64
- | 结局 | {X}-{Y} | {Z%} | {功能} | {节号} |
65
-
66
- ### 叙事时间线
67
-
68
- | 特征 | 描述 |
69
- |------|------|
70
- | 时间线类型 | {线性/插叙/倒叙/双线交叉} |
71
- | 时间跨度 | {故事内时间跨度} |
72
- | 关键时间跳跃 | {如有,标注位置和跨度} |
73
- | 时间操控目的 | {制造信息差/压缩无聊/制造对比} |
74
-
75
- ---
76
-
77
- ## Stage 2B 情节节点提取
78
-
79
- <!-- output to: 情节节点.md(独立成文)+ 拆文报告.md(情节节点清单段镜像) -->
80
-
81
- > 提取方法论与节点边界详见 material-decomposition.md「情节节点提取规则」(唯一权威)。
82
-
83
- ### 节点模板
84
-
85
- ```markdown
86
- N{序号} **{事件概括}**:类型{情绪/信息/冲突/转折/对话/氛围} | 情绪{类型}{强度-9~+9} | 涉及{全名} | 手法{如有时}
87
-
88
- 原文引用(≤300字)
89
- ```
90
-
91
- ### 输出示例
92
-
93
- ```markdown
94
- ## 情节节点清单
95
-
96
- N1 **偷听到对话**:类型{信息} | 情绪{震惊}{-7} | 涉及{沈暮月} | 手法{信息差}
97
-
98
- > "霍总还不打算让沈暮月母子进门吗?"
99
- > "没必要,私生子而已。"
100
- > 我正准备推门而入,听到这话,手停在了半空。
101
-
102
- N2 **自我认知**:类型{转折} | 情绪{心酸}{-5} | 涉及{沈暮月}
103
-
104
- > 我是沈家的私生女,生了个儿子,也是私生子。
105
- > 霍庭煜对我没有爱。
106
- > 我默然抽回了手。
107
- ```
108
-
109
- ### 质量自检
110
-
111
- - [ ] 节点数量在密度指引范围内
112
- - [ ] 每个节点有客观白描(无叙事框架词、无主观评价)
113
- - [ ] 每个节点有情绪标记(类型 + 强度值)
114
- - [ ] 节点严格按时序排列
115
- - [ ] 原文引用 ≤300 字且连续
116
-
117
- ---
118
-
119
- ## Stage 3 情感线+爆点
120
-
121
- <!-- output to: 拆文报告.md(情感曲线 + 爆点分析 + 期待感分析 各段) -->
122
-
123
- ### A. 情感曲线
124
-
125
- 至少 5 个节点,取点落在情绪立场、期待或压力实际变化处,含字数位置,每个节点标注钩子类型:
126
-
127
- | 位置 | 字数 | 节点序号 | 情绪 | 强度与方向 | 触发事件 | 钩子类型 |
128
- |------|------|----------|------|------------|----------|----------|
129
- | 开头 | {X} | N{N} | {好奇/心酸/震惊} | {虐-9~爽+9} | {事件} | {悬念/冲突/反差/代入/信息差/无} |
130
- | 低谷 | {X} | N{N} | {心疼/绝望/愤怒} | {虐-9~爽+9} | {事件} | {钩子类型} |
131
- | 反转点 | {X} | N{N} | {震惊/心疼} | {虐-9~爽+9} | {事件} | {钩子类型} |
132
- | 高潮 | {X} | N{N} | {情绪} | {虐-9~爽+9} | {事件} | {钩子类型} |
133
- | 结尾 | {X} | N{N} | {满足/意难平/治愈} | {虐-9~爽+9} | {事件} | {钩子类型} |
134
-
135
- 钩子类型速查:悬念(想知道后续)、冲突(矛盾激化)、反差(认知颠覆)、代入(感同身受)、信息差(读者知道角色不知道)
136
-
137
- 曲线特征:起始{...} | 走向{上行/下行/波浪/V形/倒V/阶梯/断崖/压缩弹簧} | 极值{最高%X 最低%Y} | 方向差{从X到Y} | 翻转次数{N}
138
-
139
- ### B. 爆点分析
140
-
141
- | 维度 | 分析 |
142
- |------|------|
143
- | 铺垫 | {什么让读者开始在意},前{X}字完成 |
144
- | 积累 | {什么在积累情绪势能},积累{X}字 |
145
- | 延迟 | {延迟释放机制:信息差/误解/悬念} |
146
- | 爆发点 | {哪个瞬间释放全部情绪},精确到句子:"{引用}" |
147
- | 余波 | {释放后的余震:角色反应} |
148
- | 印象 | {情绪释放后留下什么,读者记住什么} |
149
-
150
- **叠加爆点**(如适用):表层爆点{X}→深层爆点{Y}→叠加效果{1+1>2在哪}
151
-
152
- **多爆点串联**(如适用):爆点①{事件+位置} | 爆点②{事件+位置} | 爆点③{事件+位置} → 串联方式{递进/并列}
153
-
154
- ### C. 期待感分析
155
-
156
- 逐节追踪读者的期待状态:
157
-
158
- | 节 | 制造的期待 | 满足/升级/悬置 | 剩余期待 |
159
- |----|-----------|---------------|---------|
160
- | 1 | {期待A} | {制造} | {A} |
161
- | 2 | {期待B} | {升级A} | {A+, B} |
162
- | ... | | | |
163
-
164
- 期待规则:不超过两节不制造新期待,不超过一节不推进核心期待。
165
-
166
- ---
167
-
168
- ## Stage 4 反转+写作手法
169
-
170
- <!-- output to: 拆文报告.md(反转分析段) + 写作手法.md(独立成文:POV/对话/时间/信息/其他/意象) -->
171
-
172
- ### A. 反转分析
173
-
174
- #### 前置反转检查
175
-
176
- > 是否有在故事时间线之前就已存在的谎言/误判?
177
-
178
- | 前置反转 | 谁被骗/被蒙蔽 | 何时揭穿 | 揭穿方式 | 对主反转的作用 |
179
- |----------|--------------|----------|----------|--------------|
180
- | {如:三年前的"灌醉"事件实为做局} | {霍庭煜} | {第9章} | {沈暮月当面驳斥} | {铺垫:证明判断基于错误前提} |
181
-
182
- 若不存在前置反转,注明"无"。
183
-
184
- #### 报应设计(无反转/报应型故事适用)
185
-
186
- > 当故事无传统反转时,跳过反转机制拆解,改为分析报应设计。
187
-
188
- | 阶段 | 反派的恶行 | 报应结果 | 爽感来源 |
189
- |------|-----------|----------|----------|
190
- | {如:虐待妻女} | {具体行为} | {对应惩罚} | {以彼之道还施彼身/自食恶果} |
191
-
192
- 报应链效果:{递进/一一对应/连锁反应}
193
-
194
- #### 反转链(多反转故事适用)
195
-
196
- > 如故事包含多个连续反转(舆论反转文、套娃反转文),按顺序列出:
197
-
198
- | 序号 | 反转类型 | 触发事件 | 读者认知变化 | 与前层因果关系 |
199
- |------|----------|----------|-------------|---------------|
200
- | 1 | {类型} | {事件} | {从A认知变为B认知} | — |
201
- | 2 | {类型} | {事件} | {从B认知变为C认知} | {反转1如何解释/加深反转2} |
202
-
203
- 反转链效果:{递进/叠加/出其不意}
204
- 因果链强度:{强/中/弱——删除任一层反转,其他是否仍成立?}
205
-
206
- **伏笔式反转**:如有开头语句在真相揭示后含义完全改变,标注:
207
- - 回看语句原文 + 位置
208
- - 初读理解 vs 回看理解
209
- - 触发认知升级的事件
210
-
211
- 单一反转的故事跳过此表,直接用下方主/副反转分析。
212
-
213
- #### 主/副反转分析(单反转故事适用)
214
-
215
- **反转类型**:{视角反转/身份反转/动机反转/时间线反转/信息反转/认知反转}
216
-
217
- > **认知反转**:读者对某个角色/关系的整体理解被颠覆(如"母亲其实一直爱她")。不同于信息反转(单条信息),认知反转改变的是读者对整个角色/关系的感情色彩。
218
-
219
- **反转机制**:
220
- - 铺垫线索:{文本埋了哪些线索,含位置}
221
- - 误导方向:{文本把读者往哪个方向引}
222
- - 真相揭示:{反转怎么揭开的}
223
- - 合理性:{反转是否经得起回看}
224
-
225
- **时机**:全文{X}%位置 | 铺垫:释放 = {X:1}
226
-
227
- **效果**:惊喜度{1-5} | 合理性{1-5} | 情绪冲击{1-5}
228
-
229
- ### B. 写作手法
230
-
231
- > 方法论详见 material-decomposition.md「写作手法分析」。
232
-
233
- #### POV 策略
234
-
235
- | 维度 | 分析 |
236
- |------|------|
237
- | POV 类型 | {第一/第三人称/全知/其他} |
238
- | 选择效果 | {亲密感/信息控制/距离感} |
239
- | 信息操控 | {不可靠叙述者/选择性回忆/隐瞒} |
240
- | POV 切换 | {如有:切换位置、切换方式、效果评价。如无:填"无"} |
241
- | POV 代价 | {丧失了什么视角/信息} |
242
-
243
- #### 对话手法
244
-
245
- > 对话占比只描述该文本。判断须引用具体场景功能,并与同题材、同平台对标样本比较;不套通用范围。
246
-
247
- | 指标 | 数值 | 评价 |
248
- |------|------|------|
249
- | 对话占比 | {X%} | {该文本倾向/相对对标偏高/相对对标偏低,并说明场景功能} |
250
- | 潜台词率 | {X%} | {结合告知/求救/试探/回避等具体场景说明效果,不以越高越好} |
251
- | 对话模式 | {审判式/压制式/信息差式/推拉式/称呼变化} | {具体说明} |
252
-
253
- #### 时间操控
254
-
255
- | 手法 | 位置 | 效果 |
256
- |------|------|------|
257
- | {时间跳跃/场景压缩/倒叙/闪回/实时展开} | {节N} | {具体效果} |
258
-
259
- #### 信息控制
260
-
261
- | 时刻 | 读者知道的 | 主角知道的 | 对手知道的 | 信息差 |
262
- |------|-----------|-----------|-----------|--------|
263
- | 开头 | | | | |
264
- | 中段 | | | | |
265
- | 结尾 | | | | |
266
-
267
- #### 其他手法
268
-
269
- | 手法 | 位置 | 效果 | 可复用度 |
270
- |------|------|------|----------|
271
- | {感官锚定/句式节奏/对比设计/意象物件/留白/首尾呼应} | {节N} | {具体效果} | {高/中/低} |
272
-
273
- #### 意象/物件追踪
274
-
275
- | 物件/意象 | 出现位置 | 每次承载的含义 | 演变轨迹 |
276
- |-----------|---------|---------------|---------|
277
- | {物件名} | {节1, 节5, 节9} | {含义变化} | {从A到B} |
278
-
279
- 如无重复物件/意象,注明"无明显意象重复"。
280
-
281
- **主题意象群**:如多个物件都指向同一主题,标注共同主题、各物件的角度、整体效果。
282
-
283
- **手法总计**:{N} 项 | 核心手法{Top3} | 创新手法{如有}
284
-
285
- ---
286
-
287
- ## Stage 5 人物+开头结尾
288
-
289
- <!-- output to: 拆文报告.md(人物分析 + 开头分析 + 结尾分析 + 首尾呼应 + 钩子回收检查 各段) -->
290
-
291
- ### A. 人物分析
292
-
293
- > 方法论详见 material-decomposition.md「人物提取规则」。
294
-
295
- **人物总览**:有名人物{N}人
296
-
297
- | 人物 | 叙事角色 | 行动角色 | 功能标签 | 内在矛盾 | 弧线 | 关键台词 |
298
- |------|----------|----------|----------|----------|------|----------|
299
- | {主角名} | {主人公/重要配角} | {主动型/被动型/转变型} | {情绪承载者/...} | {核心心理冲突} | {始→转→终} | "{最具代表性的台词}" |
300
- | {配角名} | {重要配角/功能人物} | {主动型/被动型} | {压迫源/...} | {矛盾} | {弧线/扁平} | "{台词}" |
301
-
302
- > 若识别到双主人公结构,人物总览表中两人均标注为"主人公",并在表下方注明各自主驱动的章节范围。
303
-
304
- **人物功能评估**:
305
-
306
- | 人物 | 出场效率 | 功能密度 | 可删除性 | 对话贡献 |
307
- |------|----------|----------|----------|----------|
308
- | {名} | {高/中/低} | {承担N项功能} | {不可删/可删} | {每句都推动/部分推动} |
309
-
310
- **人物关系**:
311
-
312
- | 关系对 | 关系本质 | 演变轨迹 | 对情感线的贡献 |
313
- |--------|----------|----------|---------------|
314
- | A ↔ B | {如:单向依附→对等拒绝} | {节N:状态A → 节M:状态B} | {制造了什么情绪} |
315
-
316
- ### B. 开头分析
317
-
318
- **前 3 句**:{原文引用}
319
-
320
- | 维度 | 分析 |
321
- |------|------|
322
- | 钩子类型 | {悬念/冲突/反差/代入/信息差} |
323
- | 前50字 | {有无冲突/异常?有/无} |
324
- | 前100字 | {读者是否知道核心矛盾?是/否} |
325
- | 信息密度 | {高/中/低} |
326
- | 代入感 | {强/中/弱} |
327
- | 声音辨识度 | {强/中/弱} |
328
- | 开头情绪强度 | {1-10,绝对强度量表,非情感曲线的-9~+9} |
329
-
330
- ### C. 结尾分析
331
-
332
- **最后一段**:{原文引用或概括}
333
-
334
- | 维度 | 分析 |
335
- |------|------|
336
- | 结尾类型 | {HE满足/BE遗憾/开放式/反转余韵/留白} |
337
- | 情绪落点 | {读者离开时在想什么} |
338
- | 余韵设计 | {有/无,具体描述} |
339
- | 传播欲 | {读者是否会推荐,为什么} |
340
- | 收束完整性 | {所有钩子是否回收,未回收的列出} |
341
- | 价值观传达 | {这篇故事最终想说什么?} |
342
- | 结尾情绪强度 | {1-10,绝对强度量表(非情感曲线的-9~+9)。参考标准:虐≥8/爽≥7/治愈≥6/通透满足≥5/震惊反转≥7/BE意难平≥8} |
343
-
344
- ### D. 首尾呼应分析
345
-
346
- | 呼应元素 | 开头位置 | 结尾位置 | 呼应方式 | 效果 |
347
- |----------|----------|----------|----------|------|
348
- | {元素} | {如:第1节"私生子而已"} | {如:结尾终身未娶} | {对比/反转/升级} | {形成闭环/制造遗憾} |
349
-
350
- **重读发现**:如有开头语句在真相揭示后含义完全改变,列出:语句原文 + 位置 + 初读理解 vs 知道真相后的理解。
351
-
352
- ### E. 钩子回收检查
353
-
354
- | 钩子 | 埋设位置 | 类型 | 回收位置 | 回收方式 | 状态 |
355
- |------|----------|------|----------|----------|------|
356
- | {描述} | {节N} | {悬念/冲突/信息差} | {节M} | {如何回收} | {已回收/留白/遗漏} |
357
-
358
- ---
359
-
360
- ## Stage 6 综合评估
361
-
362
- <!-- output to: 拆文报告.md(综合段:五维评分 + 爆点性 + 话题性 + 共鸣 + 核心手法 + 可复用结构 + 同类型写作动作 + 节奏速报)+ _meta.json.structure_counts(数值计入元数据,详见下方「_meta.json.structure_counts 产出模板」) -->
363
-
364
- **一句话评价**:{成功核心原因——具体指出成功机制,避免泛泛赞美}
365
-
366
- ### 五维评分
367
-
368
- | 维度 | 评分 | 说明 |
369
- |------|------|------|
370
- | 开头吸引力 | 1-5 | {具体说明:钩子类型+效果+改进空间} |
371
- | 情感拉扯力 | 1-5 | {具体说明:曲线形态+极值+翻转} |
372
- | 反转设计 | 1-5 | {具体说明:反转类型+铺垫质量+合理性} |
373
- | 节奏控制 | 1-5 | {具体说明:密度分布+异常检测+节奏匹配} |
374
- | 结尾余韵 | 1-5 | {具体说明:结尾类型+落点+传播欲} |
375
-
376
- ### 爆点性
377
-
378
- {核心爆点是什么?铺垫是否充分?释放是否到位?传播性如何?}
379
-
380
- ### 话题性
381
-
382
- {读者会讨论什么?争议点?代入式自省?"如果是我会怎样"的讨论空间?}
383
-
384
- ### 共鸣分析
385
-
386
- | 共鸣层次 | 强度 | 触发点 |
387
- |----------|------|--------|
388
- | 情感共鸣 | {强/中/弱/无} | {具体触发点} |
389
- | 价值观共鸣 | {强/中/弱/无} | {具体触发点} |
390
- | 经历共鸣 | {强/中/弱/无} | {具体触发点} |
391
- | 社会现象共鸣 | {强/中/弱/无} | {具体触发点} |
392
- | 文化共鸣 | {强/中/弱/无} | {具体触发点} |
393
- | 普世价值共鸣 | {强/中/弱/无} | {具体触发点} |
394
- | 哲学思考共鸣 | {强/中/弱/无} | {具体触发点} |
395
- | 情感深度共鸣 | {强/中/弱/无} | {具体触发点} |
396
- | 人物深度共鸣 | {强/中/弱/无} | {具体触发点} |
397
-
398
- ### 核心手法
399
-
400
- 反转类型{...} | 情感曲线形态{...} | 关键钩子{...} | 核心手法Top3{...}
401
-
402
- ### 可复用结构
403
-
404
- 1. **{手法名}**:{用法} — 适用场景:{什么类型的短篇}
405
- 2. **{手法名}**:{用法} — 适用场景:{...}
406
- 3. **{手法名}**:{用法} — 适用场景:{...}
407
-
408
- ### 同类型写作动作
409
-
410
- {具体行动——可直接进入下一份 artifact 的操作,避免只写"多练习"}
411
-
412
- ### 节奏速报
413
-
414
- | 指标 | 数值 | 判断 |
415
- |------|------|------|
416
- | 事件密度 | {X个/千字} | {文本分布与真实状态变化} |
417
- | 对话密度 | {Y%} | {文本倾向、对白功能与无对白推进方式} |
418
- | 冲突密度 | {Z%} | {直接冲突与其他压力来源的关系} |
419
-
420
- ### _meta.json.structure_counts 产出模板
421
-
422
- > Stage 6 完成时,把这一节的结构计数写入 `_meta.json.structure_counts`,作为「structure_counts 数值校验」
423
- > 数值检查的依据。分析叙事正文写到 `拆文报告.md` 的对应段,不要重复在 JSON 里再讲一遍。
424
- > 字段定义与阈值见 [output-contract.md](output-contract.md)。
425
-
426
- ```jsonc
427
- "structure_counts": {
428
- "beats": 5, // 来自 Stage 2 结构段数(开端/发展/高潮/结局,≥4)
429
- "hooks": 4, // 来自 Stage 3 钩子数(≥3)
430
- "setup_clues": 3, // 来自 Stage 4 反转铺垫数(≥3;无反转题材填 0 并跳过该阈值)
431
- "character_archetypes": 3, // 来自 Stage 5 有反差人物数(≥2)
432
- "reusable_structures": 3, // 来自 Stage 6 可复用条数(≥3)
433
- "reversal_type": "视角反转" // 枚举: 视角/身份/动机/时间线/信息/认知/无反转
434
- }
435
- ```
436
-
437
- ---
438
-
439
- ## 可选模块:同类对比
440
-
441
- > 方法论详见 material-decomposition.md「可选模块:同类对比」。
442
-
443
- | 维度 | 本文 | 对标作品A | 对标作品B |
444
- |------|------|----------|----------|
445
- | 情感曲线形态 | {如:压缩弹簧} | {如:V形} | {如:波浪} |
446
- | 核心手法 | {如:假死+信息差} | {如:时间线反转} | {如:套娃反转} |
447
- | 开头钩子强度 | {1-5} | {1-5} | {1-5} |
448
- | 反转惊喜度 | {1-5} | {1-5} | {1-5} |
449
- | 结尾余韵 | {1-5} | {1-5} | {1-5} |
450
-
451
- **差异化亮点**:{本文与同类作品的关键差异,是优势还是劣势}
452
-
453
- ---
454
-
455
- ## 可选模块:平台适配评估
456
-
457
- > 方法论详见 material-decomposition.md「可选模块:平台适配评估」。
458
-
459
- | 平台 | 适配度 | 原因 | 调整动作 |
460
- |------|--------|------|----------|
461
- | 知乎盐言 | {高/中/低} | {原因} | {如有} |
462
- | 番茄短篇 | {高/中/低} | {原因} | {如有} |
463
- | 七猫短篇 | {高/中/低} | {原因} | {如有} |
464
-
465
- ---
466
-
467
- ## 详细节奏分析
468
-
469
- > 可选模块。方法论详见 material-decomposition.md「节奏分析」。
470
-
471
- ### 节奏指标
472
-
473
- > 各维度数值只作文本描述。判断须回到具体节点、状态变化和后果,并在存在对标时与同题材、同平台样本比较。
474
-
475
- | 维度 | 数值 | 判断 |
476
- |------|------|------|
477
- | 事件密度 | {N}个/千字 | {文本分布与真实状态变化} |
478
- | 对话密度 | {X%} | {文本倾向、对白功能与无对白推进方式} |
479
- | 冲突密度 | {X%} | {直接冲突与任务/证据/空间/关系压力的关系} |
480
- | 信息密度 | {X%} | {读者模型变化与消化效果} |
481
-
482
- ### 逐节节奏分布
483
-
484
- | 节 | 字数 | 事件密度 | 对话占比 | 冲突占比 | 节奏判断 |
485
- |----|------|----------|----------|----------|----------|
486
- | 1 | {N} | {X/千字} | {Y%} | {Z%} | {快/中/慢/过渡} |
487
-
488
- ### 节奏异常
489
-
490
- | 异常类型 | 位置 | 说明 |
491
- |----------|------|------|
492
- | {节奏塌陷/压力过载/信息洪峰/对白失效/对白挤压场景/反转过载} | {节N} | {具体说明} |
493
-
494
- 如无异常,注明"节奏无明显异常"。
495
-
496
- ---
497
-
498
- ## 短篇结构速查库
499
-
500
- > 完整版见 material-decomposition.md「结构类型速查」(含匹配分析要点)。
501
-
502
- ---
503
-
504
- ## 质量检查必填字段
505
-
506
- Stage 完成前逐项检查,缺一即不完整。**节点密度、对话占比等只作结构化描述;质量判断须引用具体场景功能、状态变化和同题材对标,不设通用数值阈值。**
507
-
508
- **标注约定**:
509
-
510
- - `[BLOCK]`:量化或必备产物,缺失 → 「BLOCK 项扫描」阻断,不写 `_meta.json.stages_completed[6]`,提示用户回到对应 Stage 补足。
511
- - `[WARN]`:质性或辅助项,缺失 → 写入 `拆文报告.md` 末尾「待补」清单,**不阻断**进入下一阶段。
512
-
513
- **Stage 2(结构+情节节点)**:
514
- - [ ] 故事核已提取(一句话核心梗) `[BLOCK]`
515
- - [ ] 结构划分 4-6 段(必须含开端/发展/高潮/结局),每段有字数范围、占比和功能 `[BLOCK]`
516
- - [ ] 结局类型已标注 `[WARN]`
517
- - [ ] POV 已识别 `[WARN]`
518
- - [ ] 叙事时间线已标注 `[WARN]`
519
- - [ ] 情节节点覆盖全文真实变化,没有为凑数量重复记录同一事件(见 material-decomposition.md「情节节点提取规则」) `[BLOCK]`
520
- - [ ] 每个节点有情绪标记(类型 + 强度值) `[BLOCK]`
521
-
522
- **Stage 3(情感线+爆点)**:
523
- - [ ] 至少 5 个情感节点,覆盖每一处情绪立场、期待或压力变化,每个有字数位置、强度值和方向(虐-9~爽+9) `[BLOCK]`
524
- - [ ] 每个节点标注了钩子类型(含"无") `[WARN]`
525
- - [ ] 曲线特征 5 项齐全(起始/走向/极值/方向差/翻转次数) `[BLOCK]`
526
- - [ ] 爆点分析 6 维度齐全(铺垫/积累/延迟/爆发点/余波/印象) `[BLOCK]`
527
- - [ ] 期待感表已完成 `[WARN]`
528
-
529
- **Stage 4(反转+写作手法)**:
530
- - [ ] 前置反转检查已执行(存在/不存在) `[WARN]`
531
- - [ ] 反转类型已识别 `[BLOCK]`
532
- - [ ] 铺垫线索至少 2 条,含原文位置 `[BLOCK]`
533
- - [ ] 误导方向已说明 `[WARN]`
534
- - [ ] 写作手法分析 ≥5 项维度 `[BLOCK]`
535
- - [ ] POV 策略已分析(选择效果+代价+切换) `[WARN]`
536
- - [ ] 对话指标已量化(占比+潜台词率) `[WARN]`
537
-
538
- **Stage 5(人物+开头结尾)**:
539
- - [ ] 所有有名人物已提取,有二维分类(叙事角色:主人公/重要配角/功能人物 + 行动角色:主动型/被动型/转变型) `[BLOCK]`
540
- - [ ] 人物功能评估已完成 `[BLOCK]`
541
- - [ ] 人物关系已标注演变轨迹 `[WARN]`
542
- - [ ] 前 3 句话原文引用 `[BLOCK]`
543
- - [ ] 前50字/前100字检查已完成 `[WARN]`
544
- - [ ] 开头情绪强度已标注(1-10) `[WARN]`
545
- - [ ] 结尾类型和情绪落点已说明 `[WARN]`
546
- - [ ] 钩子回收检查已完成 `[WARN]`
547
- - [ ] 首尾呼应分析已完成 `[WARN]`
548
- - [ ] 所有钩子已标注回收状态(已回收/留白/遗漏) `[WARN]`
549
-
550
- **Stage 6(综合评估)**:
551
- - [ ] 一句话评价是具体机制(非泛泛赞美) `[WARN]`
552
- - [ ] 五维评分每项有具体说明(非泛泛而谈) `[BLOCK]`
553
- - [ ] 爆点性已分析 `[BLOCK]`
554
- - [ ] 话题性已分析 `[BLOCK]`
555
- - [ ] 共鸣分析至少 3 层 `[BLOCK]`
556
- - [ ] 至少 3 条可复用结构,每条含适用场景 `[BLOCK]`
557
- - [ ] 同类型写作动作是具体行动 `[WARN]`
558
- - [ ] `_meta.json.structure_counts` 已写入且各字段达「structure_counts 数值校验」阈值(详见 [output-contract.md](output-contract.md) 同名表) `[BLOCK]`
559
-
560
- **验收接入**:以上 `[BLOCK]` 项与 [output-contract.md](output-contract.md) 「字段最小计数」表共同构成「BLOCK 项扫描」的检查清单。SKILL.md「验收」段在 Stage 6 内容写完后、`stages_completed[6]` append 前调用本节。
561
- - [ ] 节奏速报已包含
@@ -1,98 +0,0 @@
1
- """Schema constants, skeleton factories, and material registry for JianYing export.
2
-
3
- This module is intentionally data-oriented: it owns draft version metadata, the
4
- full `materials` parallel-array shape, and the implemented material dispatch.
5
- """
6
-
7
- from jianying_templates import template
8
-
9
- # The full 剪映 materials object: ~45 parallel arrays. Only arrays backed by a
10
- # production builder are populated; retaining the full shape preserves compatibility.
11
- MATERIAL_KEYS = ["ai_translates", "audio_balances", "audio_effects", "audio_fades", "audio_track_indexes", "audios", "beats", "canvases", "chromas", "color_curves", "digital_humans", "drafts", "effects", "flowers", "green_screens", "handwrites", "hsl", "images", "log_color_wheels", "loudnesses", "manual_deformations", "masks", "common_mask", "material_animations", "material_colors", "multi_language_refs", "placeholders", "plugin_effects", "primary_color_wheels", "realtime_denoises", "shapes", "smart_crops", "smart_relights", "sound_channel_mappings", "speeds", "stickers", "tail_leaders", "text_templates", "texts", "time_marks", "transitions", "video_effects", "video_trackings", "videos", "vocal_beautifys", "vocal_separations"]
12
-
13
-
14
- def us(seconds):
15
- """Seconds (float) -> integer microseconds. The single seconds->µs boundary."""
16
- return int(round(float(seconds) * 1_000_000))
17
-
18
-
19
- def full_materials(filled):
20
- """Return a complete JianYing `materials` object with all known arrays."""
21
- out = {k: [] for k in MATERIAL_KEYS}
22
- out.update(filled)
23
- return out
24
-
25
-
26
- def scrub_platform_identity(project):
27
- """Remove hardware fingerprints carried by the pinned upstream templates."""
28
- for platform_key in ("last_modified_platform", "platform"):
29
- for identity_key in ("device_id", "hard_disk_id", "mac_address"):
30
- project[platform_key][identity_key] = ""
31
- return project
32
-
33
-
34
- def draft_content_skeleton(draft_id, width, height, fps, total_us, materials, tracks):
35
- """Build the root `draft_content.json` / `draft_info.json` skeleton."""
36
- content = template("project")
37
- scrub_platform_identity(content)
38
- content["canvas_config"] = {"width": width, "height": height, "ratio": "original"}
39
- content["duration"] = int(total_us)
40
- content["fps"] = float(fps)
41
- content["id"] = draft_id
42
- content["materials"] = full_materials(materials)
43
- content["tracks"] = tracks
44
- return content
45
-
46
-
47
- def meta_info(draft_id, total_us):
48
- """Build the companion `draft_meta_info.json` skeleton."""
49
- meta = template("meta")
50
- meta["draft_id"] = draft_id
51
- meta["draft_timeline_materials_size_"] = 0
52
- meta["tm_duration"] = int(total_us)
53
- return meta
54
-
55
-
56
- def material_category_registry():
57
- """Material category support table inspired by duo-video's MaterialTypeEnum.
58
-
59
- Keyframes, bundling, and path rewrite are exporter behavior, not material
60
- categories, so they intentionally do not appear here.
61
- """
62
- return {
63
- "video": {"status": "supported", "materials_key": "videos", "track_type": "video"},
64
- "audio": {"status": "supported", "materials_key": "audios", "track_type": "audio"},
65
- "text": {"status": "supported", "materials_key": "texts", "track_type": "text"},
66
- "subtitle": {"status": "supported", "materials_key": "texts", "track_type": "text"},
67
- "speed": {"status": "supported_auxiliary", "materials_key": "speeds", "track_type": None},
68
- # JianYing represents photos in materials.videos with material.type=photo.
69
- "image": {"status": "supported", "materials_key": "videos", "track_type": "video"},
70
- "sticker": {"status": "supported_offline_payload", "materials_key": "stickers", "track_type": "sticker"},
71
- "sound": {"status": "supported_offline_payload", "materials_key": "audios", "track_type": "audio"},
72
- "text_template": {"status": "supported_offline_payload", "materials_key": "text_templates", "track_type": "text"},
73
- "lut": {"status": "supported_offline_payload", "materials_key": "effects", "track_type": "video"},
74
- "transition": {"status": "supported_offline_payload", "materials_key": "transitions", "track_type": "video"},
75
- "video_effect": {"status": "supported_offline_payload", "materials_key": "video_effects", "track_type": "effect"},
76
- "face_effect": {"status": "supported_offline_payload", "materials_key": "video_effects", "track_type": "effect"},
77
- "mask": {"status": "supported_offline_payload", "materials_key": "masks", "track_type": "video"},
78
- "chroma": {"status": "supported_offline_payload", "materials_key": "chromas", "track_type": "video"},
79
- "green_screen": {"status": "supported", "materials_key": "drafts", "track_type": "video"},
80
- "compound": {"status": "supported", "materials_key": "drafts", "track_type": "video"},
81
- # duo-video style is authoring input rather than a direct material array.
82
- "style": {"status": "supported", "materials_key": None, "track_type": None},
83
- }
84
-
85
-
86
- def validate_material_category(category):
87
- """Return deterministic support metadata for a public or future material kind."""
88
- normalized = category.strip().lower()
89
- registry = material_category_registry()
90
- info = dict(registry.get(normalized, {"status": "unsupported", "materials_key": None, "track_type": None}))
91
- info["category"] = normalized
92
- info["supported"] = info["status"] in {
93
- "supported", "supported_auxiliary", "supported_offline_payload",
94
- }
95
- if not info["supported"]:
96
- status = "保留但暂未实现" if info["status"] == "reserved" else "未知"
97
- info["note"] = f"暂不支持的 JianYing material category: {normalized}({status}),已跳过以避免生成无效草稿"
98
- return info