dsh-hyperframes 0.3.1 → 0.4.0

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 (375) hide show
  1. package/README.en.md +6 -5
  2. package/README.md +7 -6
  3. package/lib/index.d.ts +1 -1
  4. package/lib/index.js +1 -0
  5. package/package.json +63 -63
  6. package/skills/embedded-captions/SKILL.md +28 -3
  7. package/skills/embedded-captions/references/aesthetic-principles.md +2 -3
  8. package/skills/embedded-captions/references/rail.md +1 -1
  9. package/skills/embedded-captions/scripts/check-occlusion.cjs +4 -1
  10. package/skills/embedded-captions/scripts/check-overflow.cjs +1 -0
  11. package/skills/embedded-captions/scripts/check-rail-climax.cjs +5 -1
  12. package/skills/embedded-captions/scripts/fixtures/heroless/theme.json +11 -0
  13. package/skills/embedded-captions/scripts/hf-cli.cjs +33 -0
  14. package/skills/embedded-captions/scripts/make-theme.cjs +95 -57
  15. package/skills/embedded-captions/scripts/make-theme.test.mjs +131 -0
  16. package/skills/embedded-captions/scripts/matte.cjs +1 -13
  17. package/skills/embedded-captions/scripts/measure-layout.cjs +2 -1
  18. package/skills/embedded-captions/scripts/preview-frames.cjs +39 -11
  19. package/skills/embedded-captions/scripts/preview-frames.test.mjs +24 -0
  20. package/skills/embedded-captions/scripts/render-and-composite.sh +8 -52
  21. package/skills/embedded-captions/scripts/safe-zones.cjs +4 -1
  22. package/skills/embedded-captions/scripts/transcribe.cjs +5 -14
  23. package/skills/embedded-captions/scripts/transcribe.test.mjs +41 -0
  24. package/skills/faceless-explainer/SKILL.md +20 -16
  25. package/skills/faceless-explainer/references/story-design.md +1 -1
  26. package/skills/faceless-explainer/scripts/assemble-index.mjs +6 -4
  27. package/skills/faceless-explainer/scripts/assemble-index.test.mjs +57 -2
  28. package/skills/faceless-explainer/scripts/audio.mjs +2 -0
  29. package/skills/faceless-explainer/scripts/build-frame.mjs +6 -3
  30. package/skills/faceless-explainer/scripts/captions.mjs +7 -4
  31. package/skills/faceless-explainer/scripts/frame-packets.mjs +4 -4
  32. package/skills/faceless-explainer/scripts/lib/bgm-volume.mjs +4 -0
  33. package/skills/faceless-explainer/scripts/lib/captured-fonts.mjs +58 -0
  34. package/skills/{hyperframes-core → faceless-explainer}/scripts/lib/frame-packets-core.mjs +5 -23
  35. package/skills/faceless-explainer/scripts/lib/storyboard.mjs +1 -1
  36. package/skills/faceless-explainer/scripts/lib/transitions.json +3 -3
  37. package/skills/faceless-explainer/scripts/transitions.mjs +1 -0
  38. package/skills/faceless-explainer/scripts/transitions.test.mjs +2 -0
  39. package/skills/faceless-explainer/sub-agents/frame-worker.md +1 -1
  40. package/skills/figma/SKILL.md +2 -0
  41. package/skills/general-video/SKILL.md +13 -11
  42. package/skills/general-video/scripts/frame-packets.mjs +4 -4
  43. package/skills/general-video/scripts/lib/frame-packets-core.mjs +194 -0
  44. package/skills/general-video/sub-agents/frame-worker.md +1 -1
  45. package/skills/hyperframes/SKILL.md +40 -30
  46. package/skills/{hyperframes-core → hyperframes}/references/brief-contract.md +15 -15
  47. package/skills/{hyperframes-core → hyperframes}/references/brief-format.md +8 -8
  48. package/skills/hyperframes/references/capability-menu.md +2 -2
  49. package/skills/{hyperframes-core → hyperframes}/references/frame-worker-core.md +1 -1
  50. package/skills/hyperframes/references/intent-interview.md +16 -16
  51. package/skills/hyperframes/references/plugin-installation.md +43 -0
  52. package/skills/{hyperframes-core → hyperframes}/references/production-loop.md +11 -11
  53. package/skills/hyperframes/references/review-loop.md +37 -0
  54. package/skills/hyperframes/references/route-briefs.md +1 -1
  55. package/skills/hyperframes/references/routes/motion-graphics.md +1 -1
  56. package/skills/{hyperframes-core → hyperframes}/references/script-format.md +3 -3
  57. package/skills/hyperframes/references/skill-lifecycle.md +2 -0
  58. package/skills/{hyperframes-core → hyperframes}/references/storyboard-format.md +3 -34
  59. package/skills/hyperframes/scripts/lib/frame-packets-core.mjs +194 -0
  60. package/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
  61. package/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
  62. package/skills/hyperframes-animation/SKILL.md +5 -1
  63. package/skills/hyperframes-animation/adapters/gsap.md +1 -1
  64. package/skills/hyperframes-animation/adapters/lottie.md +15 -2
  65. package/skills/hyperframes-animation/adapters/three.md +14 -0
  66. package/skills/hyperframes-animation/blueprints/titlecard-reveal.md +1 -1
  67. package/skills/hyperframes-animation/references/motion-blur.md +133 -0
  68. package/skills/hyperframes-animation/rules/cursor-click-ripple.md +1 -1
  69. package/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +1 -1
  70. package/skills/hyperframes-animation/rules/hacker-flip-3d.md +1 -1
  71. package/skills/hyperframes-animation/rules/kinetic-beat-slam.md +2 -2
  72. package/skills/hyperframes-animation/rules/motion-blur-streak.md +1 -1
  73. package/skills/hyperframes-animation/rules/vertical-spring-ticker.md +1 -1
  74. package/skills/hyperframes-animation/scripts/package-loader.mjs +47 -16
  75. package/skills/hyperframes-animation/scripts/package-loader.test.mjs +52 -0
  76. package/skills/hyperframes-animation/techniques.md +1 -1
  77. package/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +3 -3
  78. package/skills/hyperframes-animation/transitions/css-push.md +4 -4
  79. package/skills/hyperframes-audio/SKILL.md +30 -22
  80. package/skills/hyperframes-audio/scripts/carve.mjs +6 -3
  81. package/skills/hyperframes-audio/scripts/carve.test.mjs +16 -1
  82. package/skills/hyperframes-cli/SKILL.md +44 -35
  83. package/skills/hyperframes-cli/references/init-and-scaffold.md +8 -6
  84. package/skills/hyperframes-cli/references/lint-validate-inspect.md +3 -3
  85. package/skills/hyperframes-cli/references/preview-render.md +35 -32
  86. package/skills/hyperframes-cli/references/upgrade-info-misc.md +50 -1
  87. package/skills/hyperframes-core/SKILL.md +30 -24
  88. package/skills/hyperframes-core/references/composition-patterns.md +3 -42
  89. package/skills/hyperframes-core/references/creator-editing-recipes.md +131 -7
  90. package/skills/hyperframes-core/references/data-attributes.md +11 -11
  91. package/skills/hyperframes-core/references/determinism-rules.md +2 -19
  92. package/skills/hyperframes-core/references/full-screen-motion.md +0 -9
  93. package/skills/hyperframes-core/references/minimal-composition.md +2 -2
  94. package/skills/hyperframes-core/references/sub-compositions.md +3 -66
  95. package/skills/hyperframes-core/references/tailwind.md +1 -20
  96. package/skills/hyperframes-core/references/tracks-and-clips.md +2 -6
  97. package/skills/hyperframes-core/references/variables-and-media.md +3 -3
  98. package/skills/hyperframes-creative/SKILL.md +2 -0
  99. package/skills/hyperframes-creative/references/house-style.md +15 -15
  100. package/skills/hyperframes-creative/references/story-spine.md +3 -1
  101. package/skills/hyperframes-creative/references/storyboard-recipe.md +57 -0
  102. package/skills/hyperframes-creative/references/typography.md +1 -1
  103. package/skills/hyperframes-creative/scripts/package-loader.mjs +47 -16
  104. package/skills/hyperframes-creative/scripts/package-loader.test.mjs +52 -0
  105. package/skills/hyperframes-keyframes/SKILL.md +4 -2
  106. package/skills/hyperframes-registry/SKILL.md +3 -1
  107. package/skills/hyperframes-registry/references/contributing.md +8 -2
  108. package/skills/hyperframes-registry/references/discovery.md +20 -34
  109. package/skills/hyperframes-studio/SKILL.md +77 -0
  110. package/skills/media-use/SKILL.md +14 -12
  111. package/skills/media-use/audio/references/captions/authoring.md +4 -0
  112. package/skills/media-use/audio/references/remove-background.md +1 -1
  113. package/skills/media-use/audio/references/tts-to-captions.md +11 -2
  114. package/skills/media-use/audio/references/tts.md +84 -6
  115. package/skills/media-use/audio/scripts/audio.mjs +15 -6
  116. package/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +113 -0
  117. package/skills/media-use/audio/scripts/lib/audio-meta.mjs +39 -0
  118. package/skills/media-use/audio/scripts/lib/audio-meta.test.mjs +136 -0
  119. package/skills/media-use/audio/scripts/lib/bgm-volume.mjs +4 -0
  120. package/skills/media-use/audio/scripts/lib/bgm.mjs +2 -6
  121. package/skills/media-use/audio/scripts/lib/gemini-auth.mjs +43 -0
  122. package/skills/media-use/audio/scripts/lib/gemini-auth.py +52 -0
  123. package/skills/media-use/audio/scripts/lib/gemini-auth.test.mjs +86 -0
  124. package/skills/media-use/audio/scripts/lib/gemini-auth_test.py +90 -0
  125. package/skills/media-use/audio/scripts/lib/gemini-tts.mjs +122 -0
  126. package/skills/media-use/audio/scripts/lib/gemini-tts.test.mjs +243 -0
  127. package/skills/media-use/audio/scripts/lib/heygen.mjs +2 -1
  128. package/skills/media-use/audio/scripts/lib/tts.mjs +15 -3
  129. package/skills/media-use/audio/scripts/wait-bgm.mjs +8 -4
  130. package/skills/media-use/audio/scripts/wait-bgm.test.mjs +65 -0
  131. package/skills/media-use/references/audio.md +3 -2
  132. package/skills/media-use/references/grading.md +7 -7
  133. package/skills/media-use/references/media-treatment-recipes.md +1 -1
  134. package/skills/media-use/references/memory.md +2 -2
  135. package/skills/media-use/references/meta.md +2 -2
  136. package/skills/media-use/references/operations.md +15 -13
  137. package/skills/media-use/references/resolve.md +22 -11
  138. package/skills/media-use/references/setup-providers.md +11 -11
  139. package/skills/media-use/scripts/audio-duck.mjs +19 -27
  140. package/skills/media-use/scripts/compatibility.test.mjs +96 -0
  141. package/skills/media-use/scripts/lib/config-lock.mjs +45 -0
  142. package/skills/media-use/scripts/lib/duck.mjs +16 -10
  143. package/skills/media-use/scripts/lib/media-fetch.mjs +85 -0
  144. package/skills/media-use/scripts/lib/media-home.mjs +20 -0
  145. package/skills/media-use/scripts/lib/npx-sync.mjs +28 -2
  146. package/skills/media-use/scripts/lib/prefs-store.mjs +2 -2
  147. package/skills/media-use/scripts/lib/recipe-store.mjs +2 -2
  148. package/skills/media-use/scripts/lib/telemetry.mjs +29 -41
  149. package/skills/media-use/scripts/lib/transcriptCutFade.mjs +21 -0
  150. package/skills/media-use/scripts/prefs.mjs +1 -1
  151. package/skills/media-use/scripts/recipe.mjs +1 -1
  152. package/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
  153. package/skills/media-use/scripts/resolve.mjs +27 -1267
  154. package/skills/media-use/scripts/transcribe.mjs +39 -25
  155. package/skills/media-use/scripts/transcribe.test.mjs +112 -0
  156. package/skills/media-use/scripts/transcript-cut.mjs +39 -8
  157. package/skills/media-use/scripts/transcript-cut.test.mjs +117 -0
  158. package/skills/motion-graphics/SKILL.md +3 -1
  159. package/skills/motion-graphics/agents/builder.md +1 -0
  160. package/skills/motion-graphics/agents/director.md +2 -1
  161. package/skills/motion-graphics/catalog-map.md +25 -13
  162. package/skills/motion-graphics/categories/charts/module.md +2 -1
  163. package/skills/motion-graphics/categories/lower-thirds/module.md +4 -0
  164. package/skills/motion-graphics/categories/news/module.md +1 -1
  165. package/skills/motion-graphics/references/motion-vocabulary.md +4 -0
  166. package/skills/music-to-video/SKILL.md +8 -6
  167. package/skills/music-to-video/references/montage.md +3 -6
  168. package/skills/music-to-video/references/motion-primitives/3d-card-flip/index.html +10 -111
  169. package/skills/music-to-video/references/motion-primitives/3d-card-flip/scene.html +119 -0
  170. package/skills/music-to-video/references/motion-primitives/bg-flow-field/index.html +11 -284
  171. package/skills/music-to-video/references/motion-primitives/bg-flow-field/scene.html +294 -0
  172. package/skills/music-to-video/references/motion-primitives/binary-decrypt/index.html +10 -76
  173. package/skills/music-to-video/references/motion-primitives/binary-decrypt/scene.html +85 -0
  174. package/skills/music-to-video/references/motion-primitives/blur-resolve/index.html +10 -52
  175. package/skills/music-to-video/references/motion-primitives/blur-resolve/scene.html +60 -0
  176. package/skills/music-to-video/references/motion-primitives/braam-punch/index.html +10 -92
  177. package/skills/music-to-video/references/motion-primitives/braam-punch/scene.html +100 -0
  178. package/skills/music-to-video/references/motion-primitives/chromatic-split/index.html +10 -103
  179. package/skills/music-to-video/references/motion-primitives/chromatic-split/scene.html +111 -0
  180. package/skills/music-to-video/references/motion-primitives/chrome-sweep/index.html +10 -60
  181. package/skills/music-to-video/references/motion-primitives/chrome-sweep/scene.html +68 -0
  182. package/skills/music-to-video/references/motion-primitives/counting-punch/index.html +10 -110
  183. package/skills/music-to-video/references/motion-primitives/counting-punch/scene.html +119 -0
  184. package/skills/music-to-video/references/motion-primitives/crash-zoom-in/index.html +10 -112
  185. package/skills/music-to-video/references/motion-primitives/crash-zoom-in/scene.html +120 -0
  186. package/skills/music-to-video/references/motion-primitives/datamosh-smear/index.html +10 -121
  187. package/skills/music-to-video/references/motion-primitives/datamosh-smear/scene.html +131 -0
  188. package/skills/music-to-video/references/motion-primitives/directional-fill/index.html +10 -90
  189. package/skills/music-to-video/references/motion-primitives/directional-fill/scene.html +103 -0
  190. package/skills/music-to-video/references/motion-primitives/dolly-zoom/index.html +10 -94
  191. package/skills/music-to-video/references/motion-primitives/dolly-zoom/scene.html +102 -0
  192. package/skills/music-to-video/references/motion-primitives/electric-arc/index.html +10 -100
  193. package/skills/music-to-video/references/motion-primitives/electric-arc/scene.html +105 -0
  194. package/skills/music-to-video/references/motion-primitives/flash-cut/index.html +10 -89
  195. package/skills/music-to-video/references/motion-primitives/flash-cut/scene.html +97 -0
  196. package/skills/music-to-video/references/motion-primitives/gooey-metaball/index.html +10 -197
  197. package/skills/music-to-video/references/motion-primitives/gooey-metaball/scene.html +206 -0
  198. package/skills/music-to-video/references/motion-primitives/hard-cut/index.html +10 -74
  199. package/skills/music-to-video/references/motion-primitives/hard-cut/scene.html +82 -0
  200. package/skills/music-to-video/references/motion-primitives/hypercut-whip/index.html +10 -36
  201. package/skills/music-to-video/references/motion-primitives/hypercut-whip/scene.html +44 -0
  202. package/skills/music-to-video/references/motion-primitives/iris-open/index.html +10 -61
  203. package/skills/music-to-video/references/motion-primitives/iris-open/scene.html +69 -0
  204. package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/index.html +10 -55
  205. package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/scene.html +64 -0
  206. package/skills/music-to-video/references/motion-primitives/liquid-morph/index.html +10 -88
  207. package/skills/music-to-video/references/motion-primitives/liquid-morph/scene.html +96 -0
  208. package/skills/music-to-video/references/motion-primitives/mask-reveal/index.html +10 -66
  209. package/skills/music-to-video/references/motion-primitives/mask-reveal/scene.html +74 -0
  210. package/skills/music-to-video/references/motion-primitives/mosaic-pack/index.html +10 -81
  211. package/skills/music-to-video/references/motion-primitives/mosaic-pack/scene.html +89 -0
  212. package/skills/music-to-video/references/motion-primitives/neon-flicker/index.html +10 -65
  213. package/skills/music-to-video/references/motion-primitives/neon-flicker/scene.html +73 -0
  214. package/skills/music-to-video/references/motion-primitives/outline-to-fill/index.html +10 -74
  215. package/skills/music-to-video/references/motion-primitives/outline-to-fill/scene.html +82 -0
  216. package/skills/music-to-video/references/motion-primitives/palette-flip/index.html +10 -89
  217. package/skills/music-to-video/references/motion-primitives/palette-flip/scene.html +97 -0
  218. package/skills/music-to-video/references/motion-primitives/particle-burst/index.html +10 -98
  219. package/skills/music-to-video/references/motion-primitives/particle-burst/scene.html +106 -0
  220. package/skills/music-to-video/references/motion-primitives/pixel-dissolve/index.html +10 -78
  221. package/skills/music-to-video/references/motion-primitives/pixel-dissolve/scene.html +86 -0
  222. package/skills/music-to-video/references/motion-primitives/radial-burst-lines/index.html +10 -117
  223. package/skills/music-to-video/references/motion-primitives/radial-burst-lines/scene.html +130 -0
  224. package/skills/music-to-video/references/motion-primitives/screen-shake/index.html +10 -70
  225. package/skills/music-to-video/references/motion-primitives/screen-shake/scene.html +78 -0
  226. package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/index.html +10 -87
  227. package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/scene.html +100 -0
  228. package/skills/music-to-video/references/motion-primitives/spotlight-sweep/index.html +10 -94
  229. package/skills/music-to-video/references/motion-primitives/spotlight-sweep/scene.html +102 -0
  230. package/skills/music-to-video/references/motion-primitives/staggered-exit/index.html +10 -74
  231. package/skills/music-to-video/references/motion-primitives/staggered-exit/scene.html +82 -0
  232. package/skills/music-to-video/references/motion-primitives/text-spectral-rays/index.html +11 -271
  233. package/skills/music-to-video/references/motion-primitives/text-spectral-rays/scene.html +280 -0
  234. package/skills/music-to-video/references/motion-primitives/text-wave-distort/index.html +10 -92
  235. package/skills/music-to-video/references/motion-primitives/text-wave-distort/scene.html +106 -0
  236. package/skills/music-to-video/references/motion-primitives/tile-mosaic/index.html +10 -101
  237. package/skills/music-to-video/references/motion-primitives/tile-mosaic/scene.html +109 -0
  238. package/skills/music-to-video/references/motion-primitives/typewriter-reveal/index.html +10 -79
  239. package/skills/music-to-video/references/motion-primitives/typewriter-reveal/scene.html +91 -0
  240. package/skills/music-to-video/references/motion-primitives/word-grid-burst/index.html +10 -83
  241. package/skills/music-to-video/references/motion-primitives/word-grid-burst/scene.html +96 -0
  242. package/skills/music-to-video/references/planning.md +2 -2
  243. package/skills/music-to-video/scripts/lib/storyboard.mjs +1 -1
  244. package/skills/music-to-video/sub-agents/frame-worker.md +2 -2
  245. package/skills/pr-to-video/SKILL.md +20 -16
  246. package/skills/pr-to-video/references/code-vocabulary.md +14 -12
  247. package/skills/pr-to-video/references/story-design.md +1 -1
  248. package/skills/pr-to-video/scripts/assemble-index.mjs +6 -4
  249. package/skills/pr-to-video/scripts/assemble-index.test.mjs +57 -2
  250. package/skills/pr-to-video/scripts/audio.mjs +2 -0
  251. package/skills/pr-to-video/scripts/build-frame.mjs +6 -3
  252. package/skills/pr-to-video/scripts/captions.mjs +7 -4
  253. package/skills/pr-to-video/scripts/captions.test.mjs +41 -0
  254. package/skills/pr-to-video/scripts/frame-packets.mjs +4 -4
  255. package/skills/pr-to-video/scripts/lib/bgm-volume.mjs +4 -0
  256. package/skills/pr-to-video/scripts/lib/captured-fonts.mjs +58 -0
  257. package/skills/pr-to-video/scripts/lib/frame-packets-core.mjs +194 -0
  258. package/skills/pr-to-video/scripts/lib/storyboard.mjs +1 -1
  259. package/skills/pr-to-video/scripts/lib/transitions.json +3 -3
  260. package/skills/pr-to-video/scripts/transitions.mjs +7 -5
  261. package/skills/pr-to-video/sub-agents/frame-worker.md +1 -1
  262. package/skills/product-launch-video/SKILL.md +20 -16
  263. package/skills/product-launch-video/references/story-design.md +1 -1
  264. package/skills/product-launch-video/scripts/assemble-index.mjs +6 -4
  265. package/skills/product-launch-video/scripts/assemble-index.test.mjs +57 -2
  266. package/skills/product-launch-video/scripts/audio.mjs +2 -0
  267. package/skills/product-launch-video/scripts/audio.test.mjs +16 -0
  268. package/skills/product-launch-video/scripts/build-frame-subsets.test.mjs +152 -0
  269. package/skills/product-launch-video/scripts/build-frame.mjs +6 -3
  270. package/skills/product-launch-video/scripts/captions.mjs +7 -4
  271. package/skills/product-launch-video/scripts/frame-packets.mjs +4 -4
  272. package/skills/product-launch-video/scripts/lib/bgm-volume.mjs +4 -0
  273. package/skills/product-launch-video/scripts/lib/captured-fonts.mjs +58 -0
  274. package/skills/product-launch-video/scripts/lib/frame-packets-core.mjs +194 -0
  275. package/skills/product-launch-video/scripts/lib/storyboard.mjs +1 -1
  276. package/skills/product-launch-video/scripts/lib/transitions.json +3 -3
  277. package/skills/product-launch-video/scripts/transitions.mjs +7 -5
  278. package/skills/product-launch-video/scripts/transitions.test.mjs +68 -0
  279. package/skills/product-launch-video/sub-agents/frame-worker.md +1 -1
  280. package/skills/remotion-to-hyperframes/SKILL.md +7 -4
  281. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json +5 -5
  282. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/compositions/title.html +31 -0
  283. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +10 -25
  284. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md +8 -8
  285. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json +9 -9
  286. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-1.html +35 -0
  287. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-2.html +35 -0
  288. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-3.html +36 -0
  289. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +28 -71
  290. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +3 -3
  291. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-1.html +52 -0
  292. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-2.html +99 -0
  293. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-3.html +55 -0
  294. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +13 -212
  295. package/skills/remotion-to-hyperframes/references/api-map.md +16 -16
  296. package/skills/remotion-to-hyperframes/references/limitations.md +7 -7
  297. package/skills/remotion-to-hyperframes/references/lottie.md +5 -7
  298. package/skills/remotion-to-hyperframes/references/media.md +3 -3
  299. package/skills/remotion-to-hyperframes/references/parameters.md +5 -0
  300. package/skills/remotion-to-hyperframes/references/sequencing.md +71 -18
  301. package/skills/slideshow/SKILL.md +4 -1
  302. package/skills/slideshow/references/standalone-harness.md +0 -3
  303. package/skills/talking-head-recut/SKILL.md +10 -1
  304. package/skills/hyperframes-core/references/review-loop.md +0 -41
  305. package/skills/media-use/scripts/lib/adopt.mjs +0 -128
  306. package/skills/media-use/scripts/lib/adopt.test.mjs +0 -95
  307. package/skills/media-use/scripts/lib/bgm-provider.mjs +0 -20
  308. package/skills/media-use/scripts/lib/brand-provider.mjs +0 -59
  309. package/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +0 -108
  310. package/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +0 -85
  311. package/skills/media-use/scripts/lib/cache.mjs +0 -150
  312. package/skills/media-use/scripts/lib/candidates.mjs +0 -91
  313. package/skills/media-use/scripts/lib/candidates.test.mjs +0 -155
  314. package/skills/media-use/scripts/lib/codex-provider.mjs +0 -161
  315. package/skills/media-use/scripts/lib/codex-provider.test.mjs +0 -34
  316. package/skills/media-use/scripts/lib/coverage.test.mjs +0 -117
  317. package/skills/media-use/scripts/lib/cube-build.mjs +0 -181
  318. package/skills/media-use/scripts/lib/cube-build.test.mjs +0 -80
  319. package/skills/media-use/scripts/lib/cube-validate.mjs +0 -198
  320. package/skills/media-use/scripts/lib/cube-validate.test.mjs +0 -125
  321. package/skills/media-use/scripts/lib/cutlist.test.mjs +0 -148
  322. package/skills/media-use/scripts/lib/duck.test.mjs +0 -118
  323. package/skills/media-use/scripts/lib/error-diffusion.test.mjs +0 -102
  324. package/skills/media-use/scripts/lib/freeze.mjs +0 -70
  325. package/skills/media-use/scripts/lib/freeze.test.mjs +0 -46
  326. package/skills/media-use/scripts/lib/grade-analyzer.mjs +0 -264
  327. package/skills/media-use/scripts/lib/grade-analyzer.test.mjs +0 -285
  328. package/skills/media-use/scripts/lib/heygen-cli.mjs +0 -191
  329. package/skills/media-use/scripts/lib/heygen-cli.test.mjs +0 -301
  330. package/skills/media-use/scripts/lib/heygen-search.mjs +0 -45
  331. package/skills/media-use/scripts/lib/heygen-search.test.mjs +0 -49
  332. package/skills/media-use/scripts/lib/heygen-video-provider.mjs +0 -127
  333. package/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +0 -344
  334. package/skills/media-use/scripts/lib/image-provider.mjs +0 -44
  335. package/skills/media-use/scripts/lib/local-models.mjs +0 -318
  336. package/skills/media-use/scripts/lib/local-models.test.mjs +0 -220
  337. package/skills/media-use/scripts/lib/local-run.mjs +0 -78
  338. package/skills/media-use/scripts/lib/local-run.test.mjs +0 -121
  339. package/skills/media-use/scripts/lib/logo-provider.mjs +0 -222
  340. package/skills/media-use/scripts/lib/logo-provider.test.mjs +0 -137
  341. package/skills/media-use/scripts/lib/ltx-video-provider.mjs +0 -94
  342. package/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +0 -316
  343. package/skills/media-use/scripts/lib/lut-preset-provider.mjs +0 -266
  344. package/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +0 -176
  345. package/skills/media-use/scripts/lib/manifest.test.mjs +0 -388
  346. package/skills/media-use/scripts/lib/match.mjs +0 -47
  347. package/skills/media-use/scripts/lib/mflux-provider.mjs +0 -128
  348. package/skills/media-use/scripts/lib/mflux-provider.test.mjs +0 -174
  349. package/skills/media-use/scripts/lib/misses.mjs +0 -49
  350. package/skills/media-use/scripts/lib/misses.test.mjs +0 -78
  351. package/skills/media-use/scripts/lib/npx-sync.test.mjs +0 -50
  352. package/skills/media-use/scripts/lib/parakeet-words.test.mjs +0 -44
  353. package/skills/media-use/scripts/lib/prefs-store.test.mjs +0 -189
  354. package/skills/media-use/scripts/lib/probe.mjs +0 -39
  355. package/skills/media-use/scripts/lib/probe.test.mjs +0 -31
  356. package/skills/media-use/scripts/lib/providers.mjs +0 -5
  357. package/skills/media-use/scripts/lib/recipe-store.test.mjs +0 -367
  358. package/skills/media-use/scripts/lib/registry.mjs +0 -218
  359. package/skills/media-use/scripts/lib/registry.test.mjs +0 -261
  360. package/skills/media-use/scripts/lib/search.mjs +0 -24
  361. package/skills/media-use/scripts/lib/search.test.mjs +0 -32
  362. package/skills/media-use/scripts/lib/sfx-provider.mjs +0 -23
  363. package/skills/media-use/scripts/lib/specs.mjs +0 -132
  364. package/skills/media-use/scripts/lib/specs.test.mjs +0 -157
  365. package/skills/media-use/scripts/lib/stats.mjs +0 -117
  366. package/skills/media-use/scripts/lib/stats.test.mjs +0 -165
  367. package/skills/media-use/scripts/lib/telemetry.test.mjs +0 -373
  368. package/skills/media-use/scripts/lib/tts-local-provider.mjs +0 -92
  369. package/skills/media-use/scripts/lib/tts-local-provider.test.mjs +0 -72
  370. package/skills/media-use/scripts/lib/usage.mjs +0 -57
  371. package/skills/media-use/scripts/lib/usage.test.mjs +0 -54
  372. package/skills/media-use/scripts/lib/voice-provider.mjs +0 -57
  373. package/skills/media-use/scripts/lib/voice-provider.test.mjs +0 -46
  374. package/skills/media-use/scripts/resolve.test.mjs +0 -1120
  375. /package/skills/{hyperframes-core → hyperframes}/references/subagent-dispatch.md +0 -0
@@ -6,7 +6,7 @@ Creative direction for compositions when no design spec (`frame.md` or `design.m
6
6
 
7
7
  1. **Interpret the prompt.** Generate real content. A recipe lists real ingredients. A HUD has real readouts.
8
8
  2. **Pick a palette.** Light or dark? Declare bg, fg, accent before writing code.
9
- 3. **Pick typefaces.** Run the font discovery script in [references/typography.md](references/typography.md) — or pick a font you already know that fits the theme. The script broadens your options; it's not the only source.
9
+ 3. **Pick typefaces.** Run the font discovery script in [typography.md](typography.md) — or pick a font you already know that fits the theme. The script broadens your options; it's not the only source.
10
10
 
11
11
  ## Lazy Defaults to Question
12
12
 
@@ -18,7 +18,7 @@ These patterns are AI design tells — the first thing every LLM reaches for. If
18
18
  - Pure `#000` or `#fff` (tint toward your accent hue instead)
19
19
  - Identical card grids (same-size cards repeated)
20
20
  - Everything centered with equal weight (lead the eye somewhere)
21
- - Banned fonts (see [references/typography.md](references/typography.md) for full list)
21
+ - Banned fonts (see [typography.md](typography.md) for full list)
22
22
 
23
23
  If the content genuinely calls for one of these — centered layout for a solemn closing, cards for a real product UI mockup, a banned font because it's the perfect thematic match — use it. The goal is intentionality, not avoidance.
24
24
 
@@ -48,26 +48,26 @@ All decoratives should have slow ambient GSAP animation — breathing, drift, pu
48
48
 
49
49
  ## Motion
50
50
 
51
- See [references/motion-principles.md](references/motion-principles.md) for full rules. Quick: 0.3–0.6s, vary eases, combine transforms on entrances, overlap entries.
51
+ See [motion-principles.md](motion-principles.md) for full rules. Quick: 0.3–0.6s, vary eases, combine transforms on entrances, overlap entries.
52
52
 
53
53
  ## Typography
54
54
 
55
- See [references/typography.md](references/typography.md) for full rules. Quick: 700-900 headlines / 300-400 body, serif + sans (not two sans), 60px+ headlines / 20px+ body.
55
+ See [typography.md](typography.md) for full rules. Quick: 700-900 headlines / 300-400 body, serif + sans (not two sans), 60px+ headlines / 20px+ body.
56
56
 
57
57
  ## Palettes
58
58
 
59
59
  Declare one background, one foreground, one accent before writing HTML.
60
60
 
61
- | Category | Use for | File |
62
- | ----------------- | --------------------------------------------- | ---------------------------------------------------------- |
63
- | Bold / Energetic | Product launches, social media, announcements | [palettes/bold-energetic.md](palettes/bold-energetic.md) |
64
- | Warm / Editorial | Storytelling, documentaries, case studies | [palettes/warm-editorial.md](palettes/warm-editorial.md) |
65
- | Dark / Premium | Tech, finance, luxury, cinematic | [palettes/dark-premium.md](palettes/dark-premium.md) |
66
- | Clean / Corporate | Explainers, tutorials, presentations | [palettes/clean-corporate.md](palettes/clean-corporate.md) |
67
- | Nature / Earth | Sustainability, outdoor, organic | [palettes/nature-earth.md](palettes/nature-earth.md) |
68
- | Neon / Electric | Gaming, tech, nightlife | [palettes/neon-electric.md](palettes/neon-electric.md) |
69
- | Pastel / Soft | Fashion, beauty, lifestyle, wellness | [palettes/pastel-soft.md](palettes/pastel-soft.md) |
70
- | Jewel / Rich | Luxury, events, sophisticated | [palettes/jewel-rich.md](palettes/jewel-rich.md) |
71
- | Monochrome | Dramatic, typography-focused | [palettes/monochrome.md](palettes/monochrome.md) |
61
+ | Category | Use for | File |
62
+ | ----------------- | --------------------------------------------- | ------------------------------------------------------------- |
63
+ | Bold / Energetic | Product launches, social media, announcements | [palettes/bold-energetic.md](../palettes/bold-energetic.md) |
64
+ | Warm / Editorial | Storytelling, documentaries, case studies | [palettes/warm-editorial.md](../palettes/warm-editorial.md) |
65
+ | Dark / Premium | Tech, finance, luxury, cinematic | [palettes/dark-premium.md](../palettes/dark-premium.md) |
66
+ | Clean / Corporate | Explainers, tutorials, presentations | [palettes/clean-corporate.md](../palettes/clean-corporate.md) |
67
+ | Nature / Earth | Sustainability, outdoor, organic | [palettes/nature-earth.md](../palettes/nature-earth.md) |
68
+ | Neon / Electric | Gaming, tech, nightlife | [palettes/neon-electric.md](../palettes/neon-electric.md) |
69
+ | Pastel / Soft | Fashion, beauty, lifestyle, wellness | [palettes/pastel-soft.md](../palettes/pastel-soft.md) |
70
+ | Jewel / Rich | Luxury, events, sophisticated | [palettes/jewel-rich.md](../palettes/jewel-rich.md) |
71
+ | Monochrome | Dramatic, typography-focused | [palettes/monochrome.md](../palettes/monochrome.md) |
72
72
 
73
73
  Or derive from OKLCH — pick a hue, build bg/fg/accent at different lightnesses, tint everything toward that hue.
@@ -21,7 +21,7 @@ Structure is value-first; the **voice** stays whatever the workflow prescribes (
21
21
 
22
22
  ## 3. The storyboard is a proposal, not a listing
23
23
 
24
- When Step 3 presents the plan (a checkpoint gate — `hyperframes-core/references/brief-contract.md` § 1):
24
+ When Step 3 presents the plan (a checkpoint gate — `hyperframes/references/brief-contract.md` § 1):
25
25
 
26
26
  - Open by echoing the strategy line: **"This video tells [audience] that [message]."**
27
27
  - Present the frames as a markdown table, one row per frame:
@@ -34,6 +34,8 @@ When Step 3 presents the plan (a checkpoint gate — `hyperframes-core/reference
34
34
 
35
35
  - Recommendations keep their receipts (brief-contract § 3): the archetype choice, the beat count, and any beat the user might question each state their basis.
36
36
 
37
+ How to write the storyboard itself, and the `storyboard.html` page it is reviewed on, is `storyboard-recipe.md`.
38
+
37
39
  The proposal shape — echo line → frame table → style / duration footer → "approve or adjust" — is the cheapest place to iterate: a frame change here costs 30 seconds; the same change after build costs minutes.
38
40
 
39
41
  ## 4. Visuals point back to the source
@@ -0,0 +1,57 @@
1
+ # Storyboard recipe — plan a video like the launch films
2
+
3
+ Applies wherever a run plans on a storyboard (`storyboard: yes` in `brief-contract.md`). This file owns **how to make the storyboard**: what goes in it, and the one HTML page the user reviews. `review-loop.md` owns when the user is asked; `storyboard-format.md` owns the `STORYBOARD.md` file the scripts parse; `story-spine.md` owns the order of the story. The method is distilled from the shipped launch films' storyboards (a header, a named spine, a beat list, a contact sheet, a review round) and how their handoffs describe them, plus a few rules (the held frame, the slideshow/screensaver bans, the caption keep-out) that show up consistently in the wider storyboard corpus even where a given launch film omits them. Nothing here is a Studio feature: the agent writes the storyboard, the user reads it in chat and in a browser.
4
+
5
+ ## 1. Open with the decisions, before any beat
6
+
7
+ Message, audience, arc and format go in the `STORYBOARD.md` frontmatter (`storyboard-format.md`); the rest go in sections above the first `## Frame` heading. Frame packets take everything after a frame heading to the next one, so a section placed after the last frame leaks into that frame's packet. Repeat the first three in the chat proposal:
8
+
9
+ - **Message**: one sentence, written as a claim, not a topic ("Close isn't final", not "About the inspector").
10
+ - **Audience and arc**: who watches, and the arc named in one line (pain → turn → proof → logo, or the workflow's own archetype).
11
+ - **Format**: aspect, target length, voiceover yes/no, music yes/no. Caption keep-out (content in the top ~83% when captions run).
12
+ - **The spine**: the one device that threads every beat, named now, not discovered while building (a persistent window, a silent button that finally has sound, one background that leads every transition).
13
+ - **Brand, from a capture**: palette by role with hex, three type roles (display, sans, mono) with sizes, radii and easings, each token noting where it came from. Take them from the real site or product, never from memory; `frame.md` holds them.
14
+ - **Bans**: a short per-video "do not" list (no glow, no side-by-side explainer layouts, no fake product UI, no static endcard). Name two motion failures to avoid: the slideshow (every beat a fresh card) and the screensaver (motion that says nothing).
15
+ - **Held frame**: allocate one beat on purpose where nothing moves and the line lands.
16
+
17
+ ## 2. The beat list
18
+
19
+ One beat per idea, one focus per beat. Give each beat a short semantic name that will also be its composition filename.
20
+
21
+ | Field | Rule |
22
+ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------- |
23
+ | Heading | `NN — Name (start–end, ~dur)`, absolute times. Sum the durations and state the total; check it against the target length by arithmetic. |
24
+ | Beat length | 1.5–3.5 s. A beat that must be read gets ~3 s; a beat that only hands off gets 1.5–2 s; a line of 5–7 words gets 2–2.5 s. |
25
+ | On screen | What is visible, in concrete terms (the object, its count, its position), with every on-screen word verbatim in quotes. |
26
+ | Voiceover | Verbatim, or `onscreen` for silent films. Reveals land on the word or beat cue that names them. |
27
+ | Hero prop | The object that persists, and the beat where it returns (callback). A callback beat states which earlier beat it answers. |
28
+ | Motion | Named moves with easing and duration, from a small vocabulary. First visible motion within 0.2 s of the beat starting. |
29
+ | Seam out | The named transition into the next beat and its direction. One direction rule for the whole film (leftward is the default). |
30
+ | Audio cue | Sound effect or music cue with its time, when the film has sound. |
31
+ | Constraint | At least one explicit "no …" per beat that could go generic. |
32
+ | Why | The beat's job in the story, traced to the message. A beat whose why cannot be traced is cut. |
33
+
34
+ Real product proof is real: a captured screen, the real command output, or a labelled placeholder beat that holds the slot. Never draw a vendor's UI in DOM. Where the film depicts something real, add a truthfulness line saying what is real.
35
+
36
+ Craft devices that make a storyboard specific are taught with examples in `docs/prompting/storyboards.mdx` (breather, callback, two-color discipline) and `docs/prompting/motion.mdx` (hero prop, accumulation); use them by name.
37
+
38
+ ## 3. `storyboard.html`: the page the user reviews
39
+
40
+ Write one self-contained HTML file in the project root, `storyboard.html`, from `STORYBOARD.md`. Tell the user the path and to open it in a browser. It is the review surface, and it must be beautiful enough to judge the film from.
41
+
42
+ - **Header**: title with a version (`v1`), one-line dek, and a tag with resolution, length and beat count.
43
+ - **Grid**: three columns of 16:9 cells (`aspect-ratio: 16 / 9`, `container-type: inline-size`, sizes in `cqw` so the sheet matches the build), chronological, grouped under an act bar when there are acts.
44
+ - **Each cell** carries `id="frame-NN"` (the build reads its layout from there) and shows the beat's key moment drawn with the real words in the real fonts and brand colors, plain shapes for panels, charts and media, one accent on the focal. Then a label row (`NN · NAME` left, `id · start–end` right), a note that says what moves first and which way the seam goes (bold lead-in, one or two sentences), and a small chip naming the seam.
45
+ - **Two closing cells**: a seam map (every seam on one strip) and a tokens cell (palette, type roles, bans).
46
+ - **No motion, no scripts, no external assets.** Fonts are local `@font-face` or a system stack; images are inlined or relative. It must open from `file://`.
47
+
48
+ A sketch is a few dozen lines of HTML per cell; the whole sheet lands in minutes. Sketch fidelity is the point: a reviewer reacts to placement, hierarchy and copy, which is why the build later dresses the layout and never redraws it.
49
+
50
+ ## 4. The review round
51
+
52
+ 1. Present the chat proposal (`story-spine.md` § 3), then the sheet.
53
+ 2. Record the user's notes verbatim under `## Changes from v1` and unresolved questions under `## Still open` (above the first frame), then bump the version and revise **only the beats named**.
54
+ 3. Repeat until the user says the layout is locked, then list what is locked under `## Locked` (above the first frame, same reason as § 1). Build only after the lock.
55
+ 4. When the build lands, the compositions are the truth: regenerate the timing table from `index.html` (and the transcript when there is voiceover) and update `STORYBOARD.md` and `storyboard.html` to match, because every launch film drifted from its storyboard. State the final length.
56
+
57
+ Do not render until asked.
@@ -60,7 +60,7 @@ You know these rules but you violate them. Stop.
60
60
  - **Don't pair two sans-serifs.** You do this constantly — one for headlines, one for body. Cross the boundary: serif + sans, or sans + mono.
61
61
  - **One expressive font per scene.** You pick two interesting fonts trying to make it "better." One performs, one recedes.
62
62
  - **Weight contrast must be extreme.** You default to 400 vs 700. Video needs 300 vs 900. The difference must be visible in motion at a glance.
63
- - **Video sizes, not web sizes.** Full-screen viewing (YouTube / website embed): body 20px minimum, headlines 60px+, data labels 16px. **In-feed viewing** (destination = X / LinkedIn / Instagram feed — `hyperframes-core/references/brief-contract.md` § 2): the video plays small inside a scrolling feed, so scale up — body ≥32px, headlines ≥90px, data labels ≥24px (first-pass values; calibrate against real renders). You will try to use 14px. Don't.
63
+ - **Video sizes, not web sizes.** Full-screen viewing (YouTube / website embed): body 20px minimum, headlines 60px+, data labels 16px. **In-feed viewing** (destination = X / LinkedIn / Instagram feed — `hyperframes/references/brief-contract.md` § 2): the video plays small inside a scrolling feed, so scale up — body ≥32px, headlines ≥90px, data labels ≥24px (first-pass values; calibrate against real renders). You will try to use 14px. Don't.
64
64
 
65
65
  ## What You Don't Do Without Being Told
66
66
 
@@ -12,7 +12,7 @@ import { spawnSync } from "node:child_process";
12
12
  import { existsSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
13
13
  import { createRequire } from "node:module";
14
14
  import { tmpdir } from "node:os";
15
- import { basename, delimiter, dirname, join, parse, resolve } from "node:path";
15
+ import { basename, delimiter, dirname, join, parse, resolve, win32 as win32Path } from "node:path";
16
16
  import { createInterface } from "node:readline/promises";
17
17
  import { fileURLToPath, pathToFileURL } from "node:url";
18
18
 
@@ -339,23 +339,54 @@ function ancestors(start) {
339
339
  return dirs;
340
340
  }
341
341
 
342
+ export function resolveNpmSpawnCommand(
343
+ args,
344
+ platform = process.platform,
345
+ env = process.env,
346
+ nodeExecPath = process.execPath,
347
+ pathExists = existsSync,
348
+ ) {
349
+ if (platform !== "win32") {
350
+ return { cmd: "npm", args, opts: { stdio: "inherit" } };
351
+ }
352
+
353
+ const bundledNpmCli = win32Path.join(
354
+ win32Path.dirname(nodeExecPath),
355
+ "node_modules",
356
+ "npm",
357
+ "bin",
358
+ "npm-cli.js",
359
+ );
360
+ const npmCli = [env.npm_execpath, bundledNpmCli].find(
361
+ (candidate) => candidate && pathExists(candidate),
362
+ );
363
+ if (!npmCli) return null;
364
+ return {
365
+ cmd: env.npm_node_execpath || nodeExecPath,
366
+ args: [npmCli, ...args],
367
+ opts: { stdio: "inherit", windowsHide: true },
368
+ };
369
+ }
370
+
342
371
  function bootstrapWithNpmInstall(packageNames) {
343
372
  const installRoot = mkdtempSync(join(tmpdir(), "hyperframes-skill-deps-"));
344
- const installResult = spawnSync(
345
- process.platform === "win32" ? "npm.cmd" : "npm",
346
- [
347
- "install",
348
- "--silent",
349
- "--no-audit",
350
- "--no-fund",
351
- "--ignore-scripts",
352
- "--no-save",
353
- "--prefix",
354
- installRoot,
355
- ...packageNames,
356
- ],
357
- { stdio: "inherit" },
358
- );
373
+ const npmArgs = [
374
+ "install",
375
+ "--silent",
376
+ "--no-audit",
377
+ "--no-fund",
378
+ "--ignore-scripts",
379
+ "--no-save",
380
+ "--prefix",
381
+ installRoot,
382
+ ...packageNames,
383
+ ];
384
+ const npmCommand = resolveNpmSpawnCommand(npmArgs);
385
+ if (!npmCommand) {
386
+ rmSync(installRoot, { recursive: true, force: true });
387
+ throw new Error("Could not locate npm-cli.js for dependency bootstrap on Windows.");
388
+ }
389
+ const installResult = spawnSync(npmCommand.cmd, npmCommand.args, npmCommand.opts);
359
390
 
360
391
  if (installResult.error) throw installResult.error;
361
392
  if (installResult.status !== 0) {
@@ -5,10 +5,62 @@ import { copyFileSync, mkdtempSync, rmSync, writeFileSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { tmpdir } from "node:os";
7
7
  import { fileURLToPath } from "node:url";
8
+ import { resolveNpmSpawnCommand } from "./package-loader.mjs";
8
9
 
9
10
  const HERE = dirname(fileURLToPath(import.meta.url));
10
11
  const ENV = "HYPERFRAMES_SKILL_PKG_VERSION";
11
12
 
13
+ test("resolveNpmSpawnCommand routes Windows npm through node and npm-cli.js", () => {
14
+ const npmCli = "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js";
15
+ const node = "C:\\Program Files\\nodejs\\node.exe";
16
+ const resolved = resolveNpmSpawnCommand(
17
+ ["install", "@hyperframes/producer@0.7.55", "value & calc"],
18
+ "win32",
19
+ { npm_execpath: npmCli, npm_node_execpath: node },
20
+ node,
21
+ (path) => path === npmCli,
22
+ );
23
+
24
+ assert.deepEqual(resolved, {
25
+ cmd: node,
26
+ args: [npmCli, "install", "@hyperframes/producer@0.7.55", "value & calc"],
27
+ opts: { stdio: "inherit", windowsHide: true },
28
+ });
29
+ assert.equal(resolved.opts.shell, undefined);
30
+ });
31
+
32
+ test("resolveNpmSpawnCommand finds npm-cli.js beside node for direct Windows runs", () => {
33
+ const node = "C:\\Program Files\\nodejs\\node.exe";
34
+ const npmCli = "C:\\Program Files\\nodejs\\node_modules\\npm\\bin\\npm-cli.js";
35
+ const resolved = resolveNpmSpawnCommand(
36
+ ["install", "@hyperframes/producer@0.7.55"],
37
+ "win32",
38
+ {},
39
+ node,
40
+ (path) => path === npmCli,
41
+ );
42
+
43
+ assert.equal(resolved?.cmd, node);
44
+ assert.deepEqual(resolved?.args, [npmCli, "install", "@hyperframes/producer@0.7.55"]);
45
+ });
46
+
47
+ test(
48
+ "resolveNpmSpawnCommand launches the installed npm CLI on Windows",
49
+ { skip: process.platform !== "win32" },
50
+ () => {
51
+ const resolved = resolveNpmSpawnCommand(["--version"]);
52
+ assert.ok(resolved);
53
+
54
+ const result = spawnSync(resolved.cmd, resolved.args, {
55
+ encoding: "utf8",
56
+ windowsHide: true,
57
+ });
58
+
59
+ assert.equal(result.status, 0, result.stderr);
60
+ assert.match(result.stdout.trim(), /^\d+\./);
61
+ },
62
+ );
63
+
12
64
  // (a) env override wins — no ancestor lookup, exact version echoed back.
13
65
  test("hyperframesPackageSpec: env override wins", async () => {
14
66
  const prev = process.env[ENV];
@@ -9,6 +9,8 @@ description: >
9
9
  general video planning.
10
10
  ---
11
11
 
12
+ **Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
13
+
12
14
  # HyperFrames Keyframes
13
15
 
14
16
  Keyframes are a pose contract: visible states, continuous subject identity, seek-safe runtime, verified pixels.
@@ -34,8 +36,8 @@ fades use `/hyperframes-audio`.
34
36
  | Crop and mask reframe | Interpolate `clip-path` or a mask on an inner visual wrapper to crop/reframe without changing source time. Polygon keyframes can form a polygon/mask transition. |
35
37
  | Directional wipe cut or iris/reveal cut | Animate a mask/clip boundary across overlapping visual clips; `/hyperframes-animation` owns the handoff choreography. |
36
38
  | Split-screen handoff | Keep both visual clips placed by core, then keyframe their inner crop/mask wrappers and divider geometry. |
37
- | Constant source retime | `/hyperframes-core` owns normalized `data-playback-rate` (`0.1..5`) for render-safe picture and pitch-preserved sound. It is constant for the whole media element. |
38
- | Source speed ramps | Not supported: there is no time-varying playback-rate envelope. Preprocess a derived media asset, then place it through core. |
39
+ | Constant source retime | `/hyperframes-core` owns normalized `data-playback-rate` (`0.1..10`) for render-safe picture and pitch-preserved sound. It is constant for the whole media element. |
40
+ | Source speed ramps | A `rate` lane in `data-automation` on the `<video>`/`<audio>` (`t` in clip seconds, `v` 0.1..10, log interpolation); it wins over the constant rate. |
39
41
  | Freeze / hold | A visual pose, final source frame, or finished sub-composition can hold. Arbitrary mid-source freeze is not supported; preprocess a still/derived segment, place it as its own clip, then resume with another source range. |
40
42
 
41
43
  When editing picture and sound together, load `/hyperframes-core`, this skill for
@@ -1,8 +1,10 @@
1
1
  ---
2
2
  name: hyperframes-registry
3
- description: Install, discover, and wire registry blocks and components into HyperFrames compositions. Use when running hyperframes add or hyperframes catalog, installing one item or every block matching a tag, wiring an installed item into index.html, or working with hyperframes.json. Covers discovery, install locations, block sub-composition wiring, component snippet merging, and authoring a new block or component to contribute upstream (idea → scaffold → validate → PR).
3
+ description: Search, install, and wire registry blocks and components into HyperFrames compositions. Use BEFORE hand-building any named visual — whenever a brief, a user, or a storyboard names a look, effect, treatment, or transition such as CRT scanlines, glitch, chromatic aberration, film grain, a shimmer sweep, a chart, a code or terminal window, a map, or a confetti burst — because roughly 400 hosted items already cover many of them and the search ranks all of them with nothing installed, no project, and no account. Also use when running hyperframes add or hyperframes catalog, installing one item or every block matching a tag, wiring an installed item into index.html, or working with hyperframes.json. Covers discovery, install locations, block sub-composition wiring, component snippet merging, and authoring a new block or component to contribute upstream (idea → scaffold → validate → PR).
4
4
  ---
5
5
 
6
+ **Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
7
+
6
8
  # HyperFrames Registry
7
9
 
8
10
  The registry provides reusable blocks and components installable via `hyperframes add <name>`.
@@ -89,6 +89,12 @@ Apply the correct template based on type. See [templates.md](templates.md) for c
89
89
 
90
90
  #### All types
91
91
 
92
+ - **Load files the block ships through `__hyperframes.assetUrl("assets/...")`** whenever a script
93
+ builds the path (textures, fonts, JSON, models). Attributes like `src` and `href` are rebased
94
+ when the block is mounted; strings in a script are not, so a bare `"assets/..."` 404s once the
95
+ block lives under `compositions/<name>/`. A separate `.js` file gets the URLs from the block's
96
+ inline script. A block whose assets install to the project's own `assets/` (target
97
+ `compositions/<name>.html`) keeps plain project-root paths; `assetUrl` would look beside the file.
92
98
  - **Placeholder content is monochrome** — read
93
99
  [placeholder-material.md](placeholder-material.md) before choosing a single colour. Stand-in
94
100
  screens, images, cards, avatars, logos and chart series use four alpha steps of the
@@ -118,9 +124,9 @@ hyperframes snapshot --at "1.0,3.0,5.0,7.0"
118
124
  npx hyperframes publish
119
125
  ```
120
126
 
121
- **Catalog preview image** — The catalog card uses a PNG at `docs/images/catalog/{kind}/{name}.png` (where `{kind}` is `blocks` or `components`). Generate it from a snapshot, then:
127
+ **Catalog preview image** — For the default PNG preview, save your snapshot at `docs/images/catalog/{kind}/{name}.png` in the repository checkout (`{kind}` is `blocks` or `components`). After upload, the catalog serves it from `https://static.heygen.ai/hyperframes-oss/docs/images/catalog/{kind}/{name}.png`. If `registry-item.json` declares `preview`, the card uses its `poster` URL; a `preview` without `poster` has no image fallback.
122
128
 
123
- - **HeyGen internal contributors:** run `scripts/upload-docs-images.sh` (requires AWS profile `engineering-767398024897`)
129
+ - **HeyGen internal contributors:** run `scripts/upload-docs-images.sh` from the repository root (requires AWS profile `engineering-767398024897`)
124
130
  - **External contributors:** attach the preview MP4 to your PR description. A maintainer will generate and upload the catalog image before merging.
125
131
 
126
132
  ### Step 6: Ship
@@ -1,5 +1,7 @@
1
1
  # Registry discovery
2
2
 
3
+ <!-- registry-items: allow=data-composition-id,data-start,data-track-index -->
4
+
3
5
  ## Use the catalog command first
4
6
 
5
7
  ```bash
@@ -54,7 +56,7 @@ Where `<type-dir>` is `examples`, `blocks`, or `components`.
54
56
 
55
57
  ### Blocks
56
58
 
57
- For an always-current list run `npx hyperframes catalog --type block`. The tables below group the 97 blocks by category. **Block name ≠ shader name**: shader-transition blocks (e.g. `domain-warp-dissolve`) wrap a HyperShader runtime whose internal name omits the `-dissolve`/`-warp` suffix — see the showcase HTML installed alongside the block for the canonical name.
59
+ For an always-current list run `npx hyperframes catalog --type block`. **The search is the source of truth; the tables below are a hand-maintained sample and under-cover by design** — they group 97 of the registry's 180 blocks by category, so a block missing from them is not evidence the registry lacks it. Only an empty `npx hyperframes catalog --query "<what you want>" --json` is that evidence. Do not grow these tables toward the full set; search instead. **Block name ≠ shader name**: shader-transition blocks (e.g. `domain-warp-dissolve`) wrap a HyperShader runtime whose internal name omits the `-dissolve`/`-warp` suffix — see the showcase HTML installed alongside the block for the canonical name.
58
60
 
59
61
  #### Shader transitions (14)
60
62
 
@@ -101,15 +103,13 @@ Showcase compositions grouping multiple CSS / GSAP transition styles by family.
101
103
 
102
104
  WebGPU + html-in-canvas frosted-glass surfaces. **Require Brave / Chrome canary** with WebGPU enabled — set `PRODUCER_HEADLESS_SHELL_PATH` to point at the browser; engine auto-passes `--enable-unsafe-webgpu`. See `/hyperframes-animation` → `adapters/typegpu.md`.
103
105
 
104
- | Name | Description |
105
- | ----------------------------- | --------------------------------------------------------------------------------------- |
106
- | `ios26-liquid-glass` | 3D iPhone (GLTF) + iOS 26 home screen, glass app icons, shader wallpaper, notifications |
107
- | `macos-tahoe-liquid-glass` | 3D MacBook (GLTF) + macOS Tahoe-style desktop, glass menu bar, Finder, dock |
108
- | `liquid-glass-widgets` | Frosted stat cards, showcase panel, pill chips over aurora shader |
109
- | `liquid-glass-notification` | Frosted notification cards floating over aurora shader |
110
- | `liquid-glass-context-menu` | Frosted context-menu panel drifting over aurora shader |
111
- | `liquid-glass-media-controls` | Frosted media-control panels spreading over aurora shader |
112
- | `vfx-liquid-glass` | Bare VFX composition shell for liquid-glass effects |
106
+ | Name | Description |
107
+ | --------------------------- | --------------------------------------------------------------------------------------- |
108
+ | `ios26-liquid-glass` | 3D iPhone (GLTF) + iOS 26 home screen, glass app icons, shader wallpaper, notifications |
109
+ | `macos-tahoe-liquid-glass` | 3D MacBook (GLTF) + macOS Tahoe-style desktop, glass menu bar, Finder, dock |
110
+ | `liquid-glass-widgets` | Frosted stat cards, showcase panel, pill chips over aurora shader |
111
+ | `liquid-glass-notification` | Frosted notification cards floating over aurora shader |
112
+ | `vfx-liquid-glass` | Bare VFX composition shell for liquid-glass effects |
113
113
 
114
114
  #### VFX (6)
115
115
 
@@ -177,24 +177,11 @@ Platform-recognizable UI overlays. Stamp on top of a beat or use as a beat close
177
177
 
178
178
  A code/terminal window that **types a code or shell session per-character**. Theme = visual chrome only; structure, wiring, and install are identical across all 24 — pick one by name, wire it like any block (`data-composition-id` + `data-start` + `data-track-index`, see `wiring-blocks.md`). Two chrome families:
179
179
 
180
- **VS Code workbench (12)** — full editor chrome (activity bar, sidebar, tabs, integrated terminal, status bar). Theme variants: `code-snippet-dark-2026`, `code-snippet-dark-modern`, `code-snippet-dark-plus`, `code-snippet-light-2026`, `code-snippet-light-modern`, `code-snippet-light-plus`, `code-snippet-high-contrast`, `code-snippet-high-contrast-light`, `code-snippet-monokai`, `code-snippet-solarized-light`, `code-snippet-visual-studio-dark`, `code-snippet-visual-studio-light`.
181
-
182
180
  **Apple Terminal (12)** — macOS Terminal.app window typing a shell session. Profile = window colors:
183
181
 
184
- | Name | Look |
185
- | -------------------------------------------- | ---------------------------------------- |
186
- | `code-snippet-apple-terminal-basic` | White bg, black text |
187
- | `code-snippet-apple-terminal-clear-dark` | Semi-transparent dark bg |
188
- | `code-snippet-apple-terminal-clear-light` | Semi-transparent light bg |
189
- | `code-snippet-apple-terminal-grass` | Black bg, green text |
190
- | `code-snippet-apple-terminal-homebrew` | Black bg, bright green text, lime cursor |
191
- | `code-snippet-apple-terminal-man-page` | Pale yellow bg, black text |
192
- | `code-snippet-apple-terminal-novel` | Warm parchment bg, dark brown text |
193
- | `code-snippet-apple-terminal-ocean` | Deep blue bg, white text |
194
- | `code-snippet-apple-terminal-pro` | Black bg, grey text, lime cursor |
195
- | `code-snippet-apple-terminal-red-sands` | Deep red bg, sandy text |
196
- | `code-snippet-apple-terminal-silver-aerogel` | Dark grey bg, white text |
197
- | `code-snippet-apple-terminal-solid-colors` | Deep purple bg, white text |
182
+ | Name | Look |
183
+ | --------------------------------- | -------------------------------- |
184
+ | `code-snippet-apple-terminal-pro` | Black bg, grey text, lime cursor |
198
185
 
199
186
  #### Code Animations (9)
200
187
 
@@ -202,14 +189,13 @@ The richer, motion-first counterpart to the static `code-snippet-*` window theme
202
189
 
203
190
  **DOM / text reveal (6):**
204
191
 
205
- | Name | Description |
206
- | --------------------- | -------------------------------------------------------------------------------------------------------------------------- |
207
- | `code-typing` | Token-streamed typing reveal, caret tracks the frontier (no CSS animation) — live-coding on screen |
208
- | `code-diff` | An edit shown as a colored diff: removed lines collapse red, added expand green — before/after at line level |
209
- | `code-morph` | One snippet transforms into another, tokens glide between positions (Shiki Magic Move) — a refactor / one state to another |
210
- | `code-highlight` | A highlight band sweeps a target line while surrounding context dims — spotlight one line |
211
- | `code-scroll` | Camera scrolls a long file to center + spotlight a target line — walk through a real module |
212
- | `code-snippet-flight` | Discrete snippets fly in from the side and assemble into a stacked program (block-level FLIP) |
192
+ | Name | Description |
193
+ | ---------------- | -------------------------------------------------------------------------------------------------------------------------- |
194
+ | `code-typing` | Token-streamed typing reveal, caret tracks the frontier (no CSS animation) — live-coding on screen |
195
+ | `code-diff` | An edit shown as a colored diff: removed lines collapse red, added expand green — before/after at line level |
196
+ | `code-morph` | One snippet transforms into another, tokens glide between positions (Shiki Magic Move) — a refactor / one state to another |
197
+ | `code-highlight` | A highlight band sweeps a target line while surrounding context dims — spotlight one line |
198
+ | `code-scroll` | Camera scrolls a long file to center + spotlight a target line — walk through a real module |
213
199
 
214
200
  **GPU / WebGL hero reveals (3):** heavier, for a title-card / hero code moment.
215
201
 
@@ -0,0 +1,77 @@
1
+ ---
2
+ name: hyperframes-studio
3
+ description: >
4
+ Use when building or editing a HyperFrames project that people open in
5
+ Studio: how the timeline should be laid out so it reads well (one caption
6
+ track, one element kind per track, every scene a sub-composition) and where
7
+ captions and key content may sit (safe zones). Don't use for how to perform an
8
+ individual edit (split, trim, retime, volume, copy, swap): that is
9
+ `creator-editing-recipes.md` in `/hyperframes-core`.
10
+ ---
11
+
12
+ **Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
13
+
14
+ # HyperFrames Studio conventions
15
+
16
+ Studio draws one timeline row per top-level element. A project that follows the
17
+ rules below opens as a short, readable timeline; one that does not opens as a wall
18
+ of unlabeled rows the user cannot edit. These are conventions for what to build.
19
+ For how to change a clip, follow `/hyperframes-core` `references/creator-editing-recipes.md`
20
+ and never invent a different form of the same edit.
21
+
22
+ ## 1. Every scene is a sub-composition
23
+
24
+ The root composition holds only timed hosts, media and audio. Any scene with nested
25
+ structure (a div containing children, a title with a subtitle, a chart) is its own
26
+ file loaded with `data-composition-src`, wiring in
27
+ `references/sub-compositions.md`.
28
+
29
+ Nested markup left inside the root does not become a row of its own. It hides inside
30
+ one opaque row that cannot be trimmed or moved part by part.
31
+
32
+ Author as if a structure lint rejects any violation.
33
+
34
+ ## 2. One caption track
35
+
36
+ - All captions live on one track: a single sub-composition host (one `data-track-index`)
37
+ marked `data-track-kind="captions"` that carries every caption group in order.
38
+ - Never one row per caption group, and never captions mixed onto a track with
39
+ another kind.
40
+ - Word-timing rules are unchanged: see `/embedded-captions` and the `caption_*` lint rules.
41
+
42
+ ## 3. One element kind per track
43
+
44
+ Group by kind so each row is one thing the user can select, mute or drag as a set.
45
+
46
+ | Kind | `data-track-kind` |
47
+ | --------------------------------------- | ---------------------- |
48
+ | Base video / A-roll | `video` (from the tag) |
49
+ | Scenes, overlays, graphics | `graphics` |
50
+ | Captions | `captions` |
51
+ | Audio (voiceover, music, sound effects) | `audio` (from the tag) |
52
+
53
+ Put `data-track-kind` on sub-composition hosts. Video and audio kinds come from the tag, so
54
+ `<video>` and `<audio>` need no attribute. Give each kind its own `data-track-index`; the number
55
+ is display only; it never changes what renders on top. Use CSS for
56
+ layering.
57
+
58
+ ## 4. Safe zones
59
+
60
+ Any ruler or safe-box overlay lives in the preview pane, never inside the composition, so
61
+ do not add guide elements to the HTML.
62
+ Both framings (wide and vertical) use the same two safe boxes, Premiere's defaults. The preview
63
+ toggle draws them with a tick at the midpoint of every edge. Source:
64
+ `ACTION_SAFE_PERCENT` and `TITLE_SAFE_PERCENT` in `packages/studio/src/utils/previewSafeMargins.ts`.
65
+
66
+ | Box | Share of the frame | Inset on every edge |
67
+ | ----------- | ------------------ | ------------------- |
68
+ | Action-safe | 90% | 5% |
69
+ | Title-safe | 80% | 10% |
70
+
71
+ - Safe margins: everything visible stays inside the action-safe box (90%), and captions and key content stay inside the title-safe box (80%).
72
+ - Two-up and 50/50 layouts keep each half's content inside the title-safe box.
73
+
74
+ ## Checking your work
75
+
76
+ Run `hyperframes lint` and fix every finding. Then open the project in Studio and
77
+ check that the timeline shows a base row, one row per scene host, one caption row and the audio rows.
@@ -3,30 +3,32 @@ name: media-use
3
3
  description: Agent Media OS, the single skill for every media need in a HyperFrames project. Resolve BGM, SFX, image, icon, brand logo, voice, color grade, or LUT into a frozen local file or paste-ready block + ledger record (one verb, `resolve`); generate via TTS / music / image models when the catalog misses; produce voiceover, transcription, captions, and background removal through one shared audio engine; operate on media (cut / reframe / transform); and reuse assets across projects. Also use for vague feedback that real footage looks dark, flat, boring, should feel retro/camcorder/print/ASCII, needs privacy, or needs a media reveal.
4
4
  ---
5
5
 
6
+ **Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
7
+
6
8
  # media-use
7
9
 
8
10
  The media OS for HyperFrames: resolve · generate · operate · remember — every media type, one skill, zero context noise.
9
11
 
10
- First run: install and sign in to the `heygen` CLI (the free-usage path), then verify with `node <SKILL_DIR>/scripts/resolve.mjs --doctor`. Setup and providers: `references/setup-providers.md`.
12
+ First run: install and sign in to the `heygen` CLI (the free-usage path), then verify with `npx hyperframes media-use resolve --doctor`. Setup and providers: `references/setup-providers.md`.
11
13
 
12
14
  ## Resolve — the one verb
13
15
 
14
16
  ```bash
15
- node <SKILL_DIR>/scripts/resolve.mjs --type <type> --intent "<description>" --project <dir>
17
+ npx hyperframes media-use resolve --type <type> --intent "<description>" --project <dir>
16
18
  ```
17
19
 
18
20
  Returns one line: `resolved <id> → <path> (<type>, <metadata>)`. All search noise stays on disk.
19
21
 
20
- | Type | One-line intent |
21
- | ------- | ----------------------------------------------------------------------------------- |
22
- | `bgm` | background music (HeyGen catalog, 10k+ tracks) |
23
- | `sfx` | sound effects (bundled 19-file library + catalog) |
24
- | `image` | photos, backgrounds (HeyGen asset search, 75k+ vectors) |
25
- | `icon` | icons, symbols (transparent) |
26
- | `logo` | official brand marks (svgl → simple-icons → GitHub avatar → favicon; never redrawn) |
27
- | `voice` | TTS voiceover (HeyGen free-usage path; optional local Kokoro) |
28
- | `grade` | measured correction candidate; broad polish/stylization follows Media Treatments |
29
- | `lut` | user-provided or explicitly chosen reusable validated `.cube` file |
22
+ | Type | One-line intent |
23
+ | ------- | -------------------------------------------------------------------------------- |
24
+ | `bgm` | background music (HeyGen catalog, 10k+ tracks) |
25
+ | `sfx` | sound effects (bundled 19-file library + catalog) |
26
+ | `image` | photos, backgrounds (HeyGen asset search, 75k+ vectors) |
27
+ | `icon` | icons, symbols (transparent) |
28
+ | `logo` | official brand marks (theSVG → GitHub avatar → favicon; never redrawn) |
29
+ | `voice` | TTS voiceover (HeyGen free-usage path; optional local Kokoro) |
30
+ | `grade` | measured correction candidate; broad polish/stylization follows Media Treatments |
31
+ | `lut` | user-provided or explicitly chosen reusable validated `.cube` file |
30
32
 
31
33
  Before resolving fresh, list reusable candidates with `--candidates` and judge fit yourself — reuse rules, all flags, ingest (`--from`), and adopt are in `references/resolve.md`.
32
34
 
@@ -1,5 +1,9 @@
1
1
  # Captions
2
2
 
3
+ <!-- registry-items: allow=max-width,data-composition-src,hyperframes-registry,blend-mode,caption-style,font-family -->
4
+
5
+ **The live search is the source of truth for what the registry has.** The table(s) below are a hand-maintained sample and under-cover by design: run `npx hyperframes catalog --query "<what you want>" --json` — it needs nothing installed — before concluding the registry lacks something. Item names here are checked against `registry/registry.json` by `bun run lint:skills`.
6
+
3
7
  Before authoring: confirm the transcript came from the right Whisper model. CLI default `small.en` silently translates non-English audio — see [`../transcribe.md`](../transcribe.md) → "Language Rule" and [`transcript-handling.md`](transcript-handling.md) for the mandatory quality check.
4
8
 
5
9
  Analyze spoken content to determine caption style. If user specifies a style, use that. Otherwise, detect tone from the transcript.
@@ -1,6 +1,6 @@
1
1
  # Background Removal
2
2
 
3
- Make a transparent overlay (typical: a talking head over an arbitrary scene). Uses `u2net_human_seg` (MIT).
3
+ Make a transparent overlay (typical: a talking head over an arbitrary scene). Uses `u2net_human_seg` (Apache-2.0).
4
4
 
5
5
  ```bash
6
6
  npx hyperframes remove-background subject.mp4 -o transparent.webm # default: VP9 + alpha
@@ -14,9 +14,14 @@ node skills/media-use/audio/scripts/heygen-tts.mjs \
14
14
 
15
15
  `narration.words.json` is already in the `[{ id, text, start, end }]` shape the captions pipeline consumes — no separate transcribe pass.
16
16
 
17
- ## Path B — ElevenLabs / Kokoro (TTS → Whisper)
17
+ ## Path B — Gemini / ElevenLabs / Kokoro (TTS → transcription)
18
18
 
19
- These providers don't return word data. Generate the audio, then transcribe:
19
+ These adapters supply audio without word data. The shared audio engine runs
20
+ transcription automatically when timings are absent. For Gemini, use the
21
+ request in [Text to speech](tts.md#gemini-narration), then consume
22
+ `audio_meta.json` → `voices[].words`.
23
+
24
+ For a standalone local Kokoro generation, generate the audio, then transcribe:
20
25
 
21
26
  ```bash
22
27
  npx hyperframes tts script.txt --voice af_heart --output narration.wav
@@ -24,3 +29,7 @@ npx hyperframes transcribe narration.wav --model small.en # voice af_heart is
24
29
  ```
25
30
 
26
31
  Whisper extracts precise word boundaries from the generated audio, so caption timing matches delivery without hand-tuning. Match `--model` to the voice's language (use `small.en` for `a`/`b` prefixes, `small --language <code>` otherwise). Then consume `transcript.json` via the caption references in `captions/`.
32
+
33
+ For Gemini, verify that transcription preserved the script, especially names,
34
+ numbers, and delivery pauses. If `words` is empty, resolve the transcription
35
+ failure before captioning. Generate and align again after changing the read.