@amg555/frameforge-mcp 2.7.3 → 2.7.7

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 (565) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/AGENTS.md +33 -0
  3. package/CHANGELOG.md +49 -0
  4. package/CLAUDE.md +17 -6
  5. package/GEMINI.md +63 -0
  6. package/README.md +216 -426
  7. package/START_HERE.md +4 -2
  8. package/package.json +5 -3
  9. package/plugins/ai-video-editor/README.md +32 -0
  10. package/plugins/ai-video-editor/SKILL.md +152 -0
  11. package/plugins/ai-video-editor/assets/fonts/fonts.css +2409 -0
  12. package/plugins/ai-video-editor/assets/fonts/ttf/anton-400.ttf +0 -0
  13. package/plugins/ai-video-editor/assets/fonts/ttf/archivo-800.ttf +0 -0
  14. package/plugins/ai-video-editor/assets/fonts/ttf/cabin-sketch-700.ttf +0 -0
  15. package/plugins/ai-video-editor/assets/fonts/ttf/dm-sans-700.ttf +0 -0
  16. package/plugins/ai-video-editor/assets/fonts/ttf/fraunces-600.ttf +0 -0
  17. package/plugins/ai-video-editor/assets/fonts/ttf/fraunces-700.ttf +0 -0
  18. package/plugins/ai-video-editor/assets/fonts/ttf/fredoka-700.ttf +0 -0
  19. package/plugins/ai-video-editor/assets/fonts/ttf/inter-700.ttf +0 -0
  20. package/plugins/ai-video-editor/assets/fonts/ttf/inter-800.ttf +0 -0
  21. package/plugins/ai-video-editor/assets/fonts/ttf/inter-tight-800.ttf +0 -0
  22. package/plugins/ai-video-editor/assets/fonts/ttf/kalam-700.ttf +0 -0
  23. package/plugins/ai-video-editor/assets/fonts/ttf/noto-sans-devanagari-700.ttf +0 -0
  24. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-400-normal.woff2 +0 -0
  25. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-500-normal.woff2 +0 -0
  26. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-600-normal.woff2 +0 -0
  27. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-700-normal.woff2 +0 -0
  28. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-800-normal.woff2 +0 -0
  29. package/plugins/ai-video-editor/engine/hidpi.js +117 -0
  30. package/plugins/ai-video-editor/engine/page.html +43 -0
  31. package/plugins/ai-video-editor/engine/player.js +145 -0
  32. package/plugins/ai-video-editor/references/example-story-warm-canvas.js +95 -0
  33. package/plugins/ai-video-editor/references/story-guide.md +112 -0
  34. package/plugins/ai-video-editor/requirements.txt +4 -0
  35. package/plugins/ai-video-editor/styles/chalk-talk/base.js +490 -0
  36. package/plugins/ai-video-editor/styles/chalk-talk/style.json +14 -0
  37. package/plugins/ai-video-editor/styles/chalk-talk/style.md +41 -0
  38. package/plugins/ai-video-editor/styles/clean-tech/base.js +447 -0
  39. package/plugins/ai-video-editor/styles/clean-tech/style.json +15 -0
  40. package/plugins/ai-video-editor/styles/clean-tech/style.md +38 -0
  41. package/plugins/ai-video-editor/styles/creator-motion-graphics/base.js +698 -0
  42. package/plugins/ai-video-editor/styles/creator-motion-graphics/style.json +16 -0
  43. package/plugins/ai-video-editor/styles/creator-motion-graphics/style.md +39 -0
  44. package/plugins/ai-video-editor/styles/data-story/base.js +432 -0
  45. package/plugins/ai-video-editor/styles/data-story/style.json +14 -0
  46. package/plugins/ai-video-editor/styles/data-story/style.md +38 -0
  47. package/plugins/ai-video-editor/styles/index.json +103 -0
  48. package/plugins/ai-video-editor/styles/pop-info/base.js +570 -0
  49. package/plugins/ai-video-editor/styles/pop-info/style.json +13 -0
  50. package/plugins/ai-video-editor/styles/pop-info/style.md +37 -0
  51. package/plugins/ai-video-editor/styles/software-walkthrough/base.js +544 -0
  52. package/plugins/ai-video-editor/styles/software-walkthrough/style.json +15 -0
  53. package/plugins/ai-video-editor/styles/software-walkthrough/style.md +38 -0
  54. package/plugins/ai-video-editor/styles/warm-canvas/base.js +610 -0
  55. package/plugins/ai-video-editor/styles/warm-canvas/style.json +14 -0
  56. package/plugins/ai-video-editor/styles/warm-canvas/style.md +37 -0
  57. package/plugins/aiinsight-shorts/CHANGELOG.md +6 -0
  58. package/plugins/aiinsight-shorts/README.md +43 -0
  59. package/plugins/aiinsight-shorts/SKILL.md +138 -0
  60. package/plugins/aiinsight-shorts/styles/deep-dive/STYLE.md +58 -0
  61. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/cues.json +140 -0
  62. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/lines.json +67 -0
  63. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/words.json +614 -0
  64. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/words.txt +102 -0
  65. package/plugins/aiinsight-shorts/styles/deep-dive/example/fonts/Inter-Black.otf +0 -0
  66. package/plugins/aiinsight-shorts/styles/deep-dive/example/fonts/Inter-ExtraBold.otf +0 -0
  67. package/plugins/aiinsight-shorts/styles/deep-dive/example/index.html +17 -0
  68. package/plugins/aiinsight-shorts/styles/deep-dive/example/script.json +27 -0
  69. package/plugins/aiinsight-shorts/styles/deep-dive/example/sheet.html +11 -0
  70. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/board.js +62 -0
  71. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/captions.js +68 -0
  72. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/engine.js +65 -0
  73. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/human.js +128 -0
  74. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/lib.js +44 -0
  75. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/look2d.js +33 -0
  76. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/sdf.js +79 -0
  77. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/sets.js +107 -0
  78. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/timing.js +23 -0
  79. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/main.js +56 -0
  80. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/sheet.js +79 -0
  81. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/shots.js +136 -0
  82. package/plugins/aiinsight-shorts/styles/deep-dive/example/tools/capture.mjs +122 -0
  83. package/plugins/aiinsight-shorts/styles/deep-dive/example/tools/mix.py +172 -0
  84. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/LICENSE-three.txt +21 -0
  85. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  86. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  87. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  88. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  89. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  90. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/Pass.js +95 -0
  91. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  92. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  93. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  94. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/BokehShader.js +145 -0
  95. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/CopyShader.js +45 -0
  96. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  97. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/OutputShader.js +85 -0
  98. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/three.module.js +6 -0
  99. package/plugins/aiinsight-shorts/styles/deep-dive/style-sheet.png +0 -0
  100. package/plugins/aiinsight-shorts/styles/inside-out/STYLE.md +97 -0
  101. package/plugins/aiinsight-shorts/styles/inside-out/example/data/cues.json +178 -0
  102. package/plugins/aiinsight-shorts/styles/inside-out/example/data/lines.json +73 -0
  103. package/plugins/aiinsight-shorts/styles/inside-out/example/data/words.json +662 -0
  104. package/plugins/aiinsight-shorts/styles/inside-out/example/fonts/Inter-Black.otf +0 -0
  105. package/plugins/aiinsight-shorts/styles/inside-out/example/index.html +17 -0
  106. package/plugins/aiinsight-shorts/styles/inside-out/example/script.json +26 -0
  107. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/captions.js +68 -0
  108. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/kit.js +345 -0
  109. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/lib.js +44 -0
  110. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/timing.js +23 -0
  111. package/plugins/aiinsight-shorts/styles/inside-out/example/src/main.js +62 -0
  112. package/plugins/aiinsight-shorts/styles/inside-out/example/src/shots.js +195 -0
  113. package/plugins/aiinsight-shorts/styles/inside-out/example/tools/capture.mjs +122 -0
  114. package/plugins/aiinsight-shorts/styles/inside-out/example/tools/mix.py +172 -0
  115. package/plugins/aiinsight-shorts/styles/inside-out/style-sheet.png +0 -0
  116. package/plugins/aiinsight-shorts/styles/night-file/STYLE.md +36 -0
  117. package/plugins/aiinsight-shorts/styles/night-file/example/data/cues.json +146 -0
  118. package/plugins/aiinsight-shorts/styles/night-file/example/data/lines.json +73 -0
  119. package/plugins/aiinsight-shorts/styles/night-file/example/data/words.json +572 -0
  120. package/plugins/aiinsight-shorts/styles/night-file/example/data/words.txt +95 -0
  121. package/plugins/aiinsight-shorts/styles/night-file/example/fonts/FreeMonoBold.ttf +0 -0
  122. package/plugins/aiinsight-shorts/styles/night-file/example/fonts/Inter-Black.otf +0 -0
  123. package/plugins/aiinsight-shorts/styles/night-file/example/index.html +18 -0
  124. package/plugins/aiinsight-shorts/styles/night-file/example/script.json +26 -0
  125. package/plugins/aiinsight-shorts/styles/night-file/example/sheet.html +13 -0
  126. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/board.js +62 -0
  127. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/captions.js +49 -0
  128. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/engine.js +65 -0
  129. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/human.js +128 -0
  130. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/kit.js +151 -0
  131. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/lib.js +44 -0
  132. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/sdf.js +79 -0
  133. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/sets3d.js +106 -0
  134. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/timing.js +23 -0
  135. package/plugins/aiinsight-shorts/styles/night-file/example/src/main.js +56 -0
  136. package/plugins/aiinsight-shorts/styles/night-file/example/src/sheet.js +86 -0
  137. package/plugins/aiinsight-shorts/styles/night-file/example/src/shots.js +130 -0
  138. package/plugins/aiinsight-shorts/styles/night-file/example/tools/capture.mjs +122 -0
  139. package/plugins/aiinsight-shorts/styles/night-file/example/tools/mix.py +172 -0
  140. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/LICENSE-three.txt +21 -0
  141. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  142. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  143. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  144. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  145. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  146. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/Pass.js +95 -0
  147. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  148. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  149. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  150. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/BokehShader.js +145 -0
  151. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/CopyShader.js +45 -0
  152. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  153. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/OutputShader.js +85 -0
  154. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/three.module.js +6 -0
  155. package/plugins/aiinsight-shorts/styles/night-file/style-sheet.png +0 -0
  156. package/plugins/aiinsight-shorts/styles/paper-atlas/STYLE.md +30 -0
  157. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/cues.json +167 -0
  158. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/lines.json +67 -0
  159. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/words.json +614 -0
  160. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/words.txt +102 -0
  161. package/plugins/aiinsight-shorts/styles/paper-atlas/example/fonts/Caladea-Bold.ttf +0 -0
  162. package/plugins/aiinsight-shorts/styles/paper-atlas/example/fonts/Inter-Black.otf +0 -0
  163. package/plugins/aiinsight-shorts/styles/paper-atlas/example/index.html +15 -0
  164. package/plugins/aiinsight-shorts/styles/paper-atlas/example/script.json +26 -0
  165. package/plugins/aiinsight-shorts/styles/paper-atlas/example/sheet.html +12 -0
  166. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/board.js +62 -0
  167. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/captions.js +47 -0
  168. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/kit.js +152 -0
  169. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/lib.js +44 -0
  170. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/timing.js +23 -0
  171. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/main.js +62 -0
  172. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/sheet.js +61 -0
  173. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/shots.js +139 -0
  174. package/plugins/aiinsight-shorts/styles/paper-atlas/example/tools/capture.mjs +122 -0
  175. package/plugins/aiinsight-shorts/styles/paper-atlas/example/tools/mix.py +172 -0
  176. package/plugins/aiinsight-shorts/styles/paper-atlas/style-sheet.png +0 -0
  177. package/plugins/aiinsight-shorts/styles/stick-story/STYLE.md +32 -0
  178. package/plugins/aiinsight-shorts/styles/stick-story/example/data/cues.json +182 -0
  179. package/plugins/aiinsight-shorts/styles/stick-story/example/data/lines.json +79 -0
  180. package/plugins/aiinsight-shorts/styles/stick-story/example/data/words.json +662 -0
  181. package/plugins/aiinsight-shorts/styles/stick-story/example/data/words.txt +110 -0
  182. package/plugins/aiinsight-shorts/styles/stick-story/example/fonts/Inter-Black.otf +0 -0
  183. package/plugins/aiinsight-shorts/styles/stick-story/example/fonts/Inter-ExtraBold.otf +0 -0
  184. package/plugins/aiinsight-shorts/styles/stick-story/example/index.html +13 -0
  185. package/plugins/aiinsight-shorts/styles/stick-story/example/script.json +27 -0
  186. package/plugins/aiinsight-shorts/styles/stick-story/example/sheet.html +10 -0
  187. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/board.js +62 -0
  188. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/captions.js +47 -0
  189. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/kit.js +166 -0
  190. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/lib.js +44 -0
  191. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/timing.js +23 -0
  192. package/plugins/aiinsight-shorts/styles/stick-story/example/src/main.js +62 -0
  193. package/plugins/aiinsight-shorts/styles/stick-story/example/src/sheet.js +64 -0
  194. package/plugins/aiinsight-shorts/styles/stick-story/example/src/shots.js +148 -0
  195. package/plugins/aiinsight-shorts/styles/stick-story/example/tools/capture.mjs +122 -0
  196. package/plugins/aiinsight-shorts/styles/stick-story/example/tools/mix.py +172 -0
  197. package/plugins/aiinsight-shorts/styles/stick-story/style-sheet.png +0 -0
  198. package/plugins/aiinsight-shorts/styles/tall-tale/STYLE.md +51 -0
  199. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/cues.json +271 -0
  200. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/lines.json +127 -0
  201. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/words.json +908 -0
  202. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/words.txt +151 -0
  203. package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Caladea-Bold.ttf +0 -0
  204. package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Inter-Black.otf +0 -0
  205. package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Inter-ExtraBold.otf +0 -0
  206. package/plugins/aiinsight-shorts/styles/tall-tale/example/index.html +19 -0
  207. package/plugins/aiinsight-shorts/styles/tall-tale/example/script.json +37 -0
  208. package/plugins/aiinsight-shorts/styles/tall-tale/example/sheet.html +13 -0
  209. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/board.js +62 -0
  210. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/captions.js +56 -0
  211. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/engine.js +65 -0
  212. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/lib.js +44 -0
  213. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/props.js +166 -0
  214. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/timing.js +23 -0
  215. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/toon.js +352 -0
  216. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/world.js +340 -0
  217. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/main.js +56 -0
  218. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/sheet.js +99 -0
  219. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/shots.js +377 -0
  220. package/plugins/aiinsight-shorts/styles/tall-tale/example/tools/capture.mjs +122 -0
  221. package/plugins/aiinsight-shorts/styles/tall-tale/example/tools/mix.py +204 -0
  222. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/LICENSE-three.txt +21 -0
  223. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  224. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  225. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  226. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  227. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  228. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/Pass.js +95 -0
  229. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  230. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  231. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  232. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/BokehShader.js +145 -0
  233. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/CopyShader.js +45 -0
  234. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  235. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/OutputShader.js +85 -0
  236. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/three.module.js +6 -0
  237. package/plugins/aiinsight-shorts/styles/tall-tale/style-sheet.png +0 -0
  238. package/plugins/faceless-shorts/README.md +34 -0
  239. package/plugins/faceless-shorts/SKILL.md +124 -0
  240. package/plugins/faceless-shorts/styles/deep-dive/STYLE.md +58 -0
  241. package/plugins/faceless-shorts/styles/deep-dive/example/data/cues.json +140 -0
  242. package/plugins/faceless-shorts/styles/deep-dive/example/data/lines.json +67 -0
  243. package/plugins/faceless-shorts/styles/deep-dive/example/data/words.json +614 -0
  244. package/plugins/faceless-shorts/styles/deep-dive/example/data/words.txt +102 -0
  245. package/plugins/faceless-shorts/styles/deep-dive/example/fonts/Inter-Black.otf +0 -0
  246. package/plugins/faceless-shorts/styles/deep-dive/example/fonts/Inter-ExtraBold.otf +0 -0
  247. package/plugins/faceless-shorts/styles/deep-dive/example/index.html +16 -0
  248. package/plugins/faceless-shorts/styles/deep-dive/example/script.json +27 -0
  249. package/plugins/faceless-shorts/styles/deep-dive/example/sheet.html +10 -0
  250. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/board.js +62 -0
  251. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/captions.js +68 -0
  252. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/engine.js +65 -0
  253. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/human.js +128 -0
  254. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/lib.js +44 -0
  255. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/look2d.js +33 -0
  256. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/sdf.js +79 -0
  257. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/sets.js +107 -0
  258. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/timing.js +23 -0
  259. package/plugins/faceless-shorts/styles/deep-dive/example/src/main.js +56 -0
  260. package/plugins/faceless-shorts/styles/deep-dive/example/src/sheet.js +79 -0
  261. package/plugins/faceless-shorts/styles/deep-dive/example/src/shots.js +136 -0
  262. package/plugins/faceless-shorts/styles/deep-dive/example/tools/capture.mjs +122 -0
  263. package/plugins/faceless-shorts/styles/deep-dive/example/tools/mix.py +172 -0
  264. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/LICENSE-three.txt +21 -0
  265. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  266. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  267. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  268. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  269. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  270. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/Pass.js +95 -0
  271. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  272. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  273. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  274. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/BokehShader.js +145 -0
  275. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/CopyShader.js +45 -0
  276. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  277. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/OutputShader.js +85 -0
  278. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/three.module.js +6 -0
  279. package/plugins/faceless-shorts/styles/deep-dive/style-sheet.png +0 -0
  280. package/plugins/faceless-shorts/styles/inside-out/STYLE.md +97 -0
  281. package/plugins/faceless-shorts/styles/inside-out/example/data/cues.json +178 -0
  282. package/plugins/faceless-shorts/styles/inside-out/example/data/lines.json +73 -0
  283. package/plugins/faceless-shorts/styles/inside-out/example/data/words.json +662 -0
  284. package/plugins/faceless-shorts/styles/inside-out/example/fonts/Inter-Black.otf +0 -0
  285. package/plugins/faceless-shorts/styles/inside-out/example/index.html +16 -0
  286. package/plugins/faceless-shorts/styles/inside-out/example/script.json +26 -0
  287. package/plugins/faceless-shorts/styles/inside-out/example/src/core/captions.js +68 -0
  288. package/plugins/faceless-shorts/styles/inside-out/example/src/core/kit.js +345 -0
  289. package/plugins/faceless-shorts/styles/inside-out/example/src/core/lib.js +44 -0
  290. package/plugins/faceless-shorts/styles/inside-out/example/src/core/timing.js +23 -0
  291. package/plugins/faceless-shorts/styles/inside-out/example/src/main.js +62 -0
  292. package/plugins/faceless-shorts/styles/inside-out/example/src/shots.js +195 -0
  293. package/plugins/faceless-shorts/styles/inside-out/example/tools/capture.mjs +122 -0
  294. package/plugins/faceless-shorts/styles/inside-out/example/tools/mix.py +172 -0
  295. package/plugins/faceless-shorts/styles/inside-out/style-sheet.png +0 -0
  296. package/plugins/faceless-shorts/styles/night-file/STYLE.md +36 -0
  297. package/plugins/faceless-shorts/styles/night-file/example/data/cues.json +146 -0
  298. package/plugins/faceless-shorts/styles/night-file/example/data/lines.json +73 -0
  299. package/plugins/faceless-shorts/styles/night-file/example/data/words.json +572 -0
  300. package/plugins/faceless-shorts/styles/night-file/example/data/words.txt +95 -0
  301. package/plugins/faceless-shorts/styles/night-file/example/fonts/FreeMonoBold.ttf +0 -0
  302. package/plugins/faceless-shorts/styles/night-file/example/fonts/Inter-Black.otf +0 -0
  303. package/plugins/faceless-shorts/styles/night-file/example/index.html +16 -0
  304. package/plugins/faceless-shorts/styles/night-file/example/script.json +26 -0
  305. package/plugins/faceless-shorts/styles/night-file/example/sheet.html +11 -0
  306. package/plugins/faceless-shorts/styles/night-file/example/src/core/board.js +62 -0
  307. package/plugins/faceless-shorts/styles/night-file/example/src/core/captions.js +49 -0
  308. package/plugins/faceless-shorts/styles/night-file/example/src/core/engine.js +65 -0
  309. package/plugins/faceless-shorts/styles/night-file/example/src/core/human.js +128 -0
  310. package/plugins/faceless-shorts/styles/night-file/example/src/core/kit.js +151 -0
  311. package/plugins/faceless-shorts/styles/night-file/example/src/core/lib.js +44 -0
  312. package/plugins/faceless-shorts/styles/night-file/example/src/core/sdf.js +79 -0
  313. package/plugins/faceless-shorts/styles/night-file/example/src/core/sets3d.js +106 -0
  314. package/plugins/faceless-shorts/styles/night-file/example/src/core/timing.js +23 -0
  315. package/plugins/faceless-shorts/styles/night-file/example/src/main.js +56 -0
  316. package/plugins/faceless-shorts/styles/night-file/example/src/sheet.js +86 -0
  317. package/plugins/faceless-shorts/styles/night-file/example/src/shots.js +130 -0
  318. package/plugins/faceless-shorts/styles/night-file/example/tools/capture.mjs +122 -0
  319. package/plugins/faceless-shorts/styles/night-file/example/tools/mix.py +172 -0
  320. package/plugins/faceless-shorts/styles/night-file/example/vendor/LICENSE-three.txt +21 -0
  321. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  322. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  323. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  324. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  325. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  326. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/Pass.js +95 -0
  327. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  328. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  329. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  330. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/BokehShader.js +145 -0
  331. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/CopyShader.js +45 -0
  332. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  333. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/OutputShader.js +85 -0
  334. package/plugins/faceless-shorts/styles/night-file/example/vendor/three.module.js +6 -0
  335. package/plugins/faceless-shorts/styles/night-file/style-sheet.png +0 -0
  336. package/plugins/faceless-shorts/styles/paper-atlas/STYLE.md +30 -0
  337. package/plugins/faceless-shorts/styles/paper-atlas/example/data/cues.json +167 -0
  338. package/plugins/faceless-shorts/styles/paper-atlas/example/data/lines.json +67 -0
  339. package/plugins/faceless-shorts/styles/paper-atlas/example/data/words.json +614 -0
  340. package/plugins/faceless-shorts/styles/paper-atlas/example/data/words.txt +102 -0
  341. package/plugins/faceless-shorts/styles/paper-atlas/example/fonts/Caladea-Bold.ttf +0 -0
  342. package/plugins/faceless-shorts/styles/paper-atlas/example/fonts/Inter-Black.otf +0 -0
  343. package/plugins/faceless-shorts/styles/paper-atlas/example/index.html +13 -0
  344. package/plugins/faceless-shorts/styles/paper-atlas/example/script.json +26 -0
  345. package/plugins/faceless-shorts/styles/paper-atlas/example/sheet.html +10 -0
  346. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/board.js +62 -0
  347. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/captions.js +47 -0
  348. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/kit.js +152 -0
  349. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/lib.js +44 -0
  350. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/timing.js +23 -0
  351. package/plugins/faceless-shorts/styles/paper-atlas/example/src/main.js +62 -0
  352. package/plugins/faceless-shorts/styles/paper-atlas/example/src/sheet.js +61 -0
  353. package/plugins/faceless-shorts/styles/paper-atlas/example/src/shots.js +139 -0
  354. package/plugins/faceless-shorts/styles/paper-atlas/example/tools/capture.mjs +122 -0
  355. package/plugins/faceless-shorts/styles/paper-atlas/example/tools/mix.py +172 -0
  356. package/plugins/faceless-shorts/styles/paper-atlas/style-sheet.png +0 -0
  357. package/plugins/faceless-shorts/styles/stick-story/STYLE.md +32 -0
  358. package/plugins/faceless-shorts/styles/stick-story/example/data/cues.json +182 -0
  359. package/plugins/faceless-shorts/styles/stick-story/example/data/lines.json +79 -0
  360. package/plugins/faceless-shorts/styles/stick-story/example/data/words.json +662 -0
  361. package/plugins/faceless-shorts/styles/stick-story/example/data/words.txt +110 -0
  362. package/plugins/faceless-shorts/styles/stick-story/example/fonts/Inter-Black.otf +0 -0
  363. package/plugins/faceless-shorts/styles/stick-story/example/fonts/Inter-ExtraBold.otf +0 -0
  364. package/plugins/faceless-shorts/styles/stick-story/example/index.html +12 -0
  365. package/plugins/faceless-shorts/styles/stick-story/example/script.json +27 -0
  366. package/plugins/faceless-shorts/styles/stick-story/example/sheet.html +9 -0
  367. package/plugins/faceless-shorts/styles/stick-story/example/src/core/board.js +62 -0
  368. package/plugins/faceless-shorts/styles/stick-story/example/src/core/captions.js +47 -0
  369. package/plugins/faceless-shorts/styles/stick-story/example/src/core/kit.js +166 -0
  370. package/plugins/faceless-shorts/styles/stick-story/example/src/core/lib.js +44 -0
  371. package/plugins/faceless-shorts/styles/stick-story/example/src/core/timing.js +23 -0
  372. package/plugins/faceless-shorts/styles/stick-story/example/src/main.js +62 -0
  373. package/plugins/faceless-shorts/styles/stick-story/example/src/sheet.js +64 -0
  374. package/plugins/faceless-shorts/styles/stick-story/example/src/shots.js +148 -0
  375. package/plugins/faceless-shorts/styles/stick-story/example/tools/capture.mjs +122 -0
  376. package/plugins/faceless-shorts/styles/stick-story/example/tools/mix.py +172 -0
  377. package/plugins/faceless-shorts/styles/stick-story/style-sheet.png +0 -0
  378. package/plugins/faceless-shorts/styles/tall-tale/STYLE.md +51 -0
  379. package/plugins/faceless-shorts/styles/tall-tale/example/data/cues.json +271 -0
  380. package/plugins/faceless-shorts/styles/tall-tale/example/data/lines.json +127 -0
  381. package/plugins/faceless-shorts/styles/tall-tale/example/data/words.json +908 -0
  382. package/plugins/faceless-shorts/styles/tall-tale/example/data/words.txt +151 -0
  383. package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Caladea-Bold.ttf +0 -0
  384. package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Inter-Black.otf +0 -0
  385. package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Inter-ExtraBold.otf +0 -0
  386. package/plugins/faceless-shorts/styles/tall-tale/example/index.html +17 -0
  387. package/plugins/faceless-shorts/styles/tall-tale/example/script.json +37 -0
  388. package/plugins/faceless-shorts/styles/tall-tale/example/sheet.html +11 -0
  389. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/board.js +62 -0
  390. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/captions.js +56 -0
  391. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/engine.js +65 -0
  392. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/lib.js +44 -0
  393. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/props.js +166 -0
  394. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/timing.js +23 -0
  395. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/toon.js +352 -0
  396. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/world.js +340 -0
  397. package/plugins/faceless-shorts/styles/tall-tale/example/src/main.js +56 -0
  398. package/plugins/faceless-shorts/styles/tall-tale/example/src/sheet.js +99 -0
  399. package/plugins/faceless-shorts/styles/tall-tale/example/src/shots.js +377 -0
  400. package/plugins/faceless-shorts/styles/tall-tale/example/tools/capture.mjs +122 -0
  401. package/plugins/faceless-shorts/styles/tall-tale/example/tools/mix.py +204 -0
  402. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/LICENSE-three.txt +21 -0
  403. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  404. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  405. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  406. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  407. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  408. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/Pass.js +95 -0
  409. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  410. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  411. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  412. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/BokehShader.js +145 -0
  413. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/CopyShader.js +45 -0
  414. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  415. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/OutputShader.js +85 -0
  416. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/three.module.js +6 -0
  417. package/plugins/faceless-shorts/styles/tall-tale/style-sheet.png +0 -0
  418. package/plugins/motion-styles/LIBRARY.md +896 -0
  419. package/plugins/motion-styles/README.md +29 -0
  420. package/plugins/motion-styles/SKILL.md +70 -0
  421. package/plugins/motion-styles/catalog.json +2253 -0
  422. package/plugins/motion-styles/prompts/bio-glow.md +149 -0
  423. package/plugins/motion-styles/prompts/blueprint.md +145 -0
  424. package/plugins/motion-styles/prompts/breaking-desk.md +147 -0
  425. package/plugins/motion-styles/prompts/callout-kit.md +147 -0
  426. package/plugins/motion-styles/prompts/chalk-talk.md +153 -0
  427. package/plugins/motion-styles/prompts/chat-story.md +143 -0
  428. package/plugins/motion-styles/prompts/clay-diorama.md +149 -0
  429. package/plugins/motion-styles/prompts/clean-tech.md +147 -0
  430. package/plugins/motion-styles/prompts/comic-panels.md +145 -0
  431. package/plugins/motion-styles/prompts/cosmic-scale.md +147 -0
  432. package/plugins/motion-styles/prompts/creator-motion.md +149 -0
  433. package/plugins/motion-styles/prompts/data-city.md +149 -0
  434. package/plugins/motion-styles/prompts/data-story.md +147 -0
  435. package/plugins/motion-styles/prompts/deep-layers.md +147 -0
  436. package/plugins/motion-styles/prompts/doc-cinema.md +145 -0
  437. package/plugins/motion-styles/prompts/evidence-board.md +145 -0
  438. package/plugins/motion-styles/prompts/exploded-view.md +149 -0
  439. package/plugins/motion-styles/prompts/glass-icons.md +147 -0
  440. package/plugins/motion-styles/prompts/glitch-pack.md +145 -0
  441. package/plugins/motion-styles/prompts/globe-arcs.md +147 -0
  442. package/plugins/motion-styles/prompts/headline-backdrop.md +145 -0
  443. package/plugins/motion-styles/prompts/iso-cutaway.md +147 -0
  444. package/plugins/motion-styles/prompts/isotype.md +145 -0
  445. package/plugins/motion-styles/prompts/karaoke-subs.md +145 -0
  446. package/plugins/motion-styles/prompts/low-poly-atlas.md +149 -0
  447. package/plugins/motion-styles/prompts/lower-thirds.md +147 -0
  448. package/plugins/motion-styles/prompts/marker-board.md +145 -0
  449. package/plugins/motion-styles/prompts/market-tape.md +145 -0
  450. package/plugins/motion-styles/prompts/math-canvas.md +145 -0
  451. package/plugins/motion-styles/prompts/myth-or-fact.md +145 -0
  452. package/plugins/motion-styles/prompts/neon-line.md +145 -0
  453. package/plugins/motion-styles/prompts/paper-craft.md +145 -0
  454. package/plugins/motion-styles/prompts/parchment-map.md +147 -0
  455. package/plugins/motion-styles/prompts/physics-toybox.md +147 -0
  456. package/plugins/motion-styles/prompts/pixel-quest.md +145 -0
  457. package/plugins/motion-styles/prompts/podcast-clip.md +147 -0
  458. package/plugins/motion-styles/prompts/pop-info.md +145 -0
  459. package/plugins/motion-styles/prompts/product-turntable.md +149 -0
  460. package/plugins/motion-styles/prompts/punch-captions.md +145 -0
  461. package/plugins/motion-styles/prompts/quiz-countdown.md +145 -0
  462. package/plugins/motion-styles/prompts/quote-cinema.md +145 -0
  463. package/plugins/motion-styles/prompts/recipe-steps.md +145 -0
  464. package/plugins/motion-styles/prompts/rubber-hose-reel.md +145 -0
  465. package/plugins/motion-styles/prompts/shadow-puppets.md +145 -0
  466. package/plugins/motion-styles/prompts/size-lineup.md +149 -0
  467. package/plugins/motion-styles/prompts/software-walkthrough.md +147 -0
  468. package/plugins/motion-styles/prompts/stack-split.md +145 -0
  469. package/plugins/motion-styles/prompts/sticker-pop.md +145 -0
  470. package/plugins/motion-styles/prompts/storybook.md +145 -0
  471. package/plugins/motion-styles/prompts/swiss-grid.md +145 -0
  472. package/plugins/motion-styles/prompts/synth-grid.md +147 -0
  473. package/plugins/motion-styles/prompts/tactics-board.md +145 -0
  474. package/plugins/motion-styles/prompts/terminal.md +145 -0
  475. package/plugins/motion-styles/prompts/tier-list.md +143 -0
  476. package/plugins/motion-styles/prompts/timeline-rail.md +145 -0
  477. package/plugins/motion-styles/prompts/top-5-countdown.md +145 -0
  478. package/plugins/motion-styles/prompts/versus-split.md +145 -0
  479. package/plugins/motion-styles/prompts/vhs-camcorder.md +145 -0
  480. package/plugins/motion-styles/prompts/visual-novel.md +145 -0
  481. package/plugins/motion-styles/prompts/warm-canvas.md +145 -0
  482. package/plugins/motion-styles/prompts/woodcut-tale.md +145 -0
  483. package/plugins/motion-styles/prompts/zine-collage.md +145 -0
  484. package/plugins/motion-styles/sources/bio-glow.html +639 -0
  485. package/plugins/motion-styles/sources/blueprint.html +617 -0
  486. package/plugins/motion-styles/sources/breaking-desk.html +585 -0
  487. package/plugins/motion-styles/sources/callout-kit.html +586 -0
  488. package/plugins/motion-styles/sources/chalk-talk.html +597 -0
  489. package/plugins/motion-styles/sources/chat-story.html +597 -0
  490. package/plugins/motion-styles/sources/clay-diorama.html +681 -0
  491. package/plugins/motion-styles/sources/clean-tech.html +554 -0
  492. package/plugins/motion-styles/sources/comic-panels.html +608 -0
  493. package/plugins/motion-styles/sources/cosmic-scale.html +628 -0
  494. package/plugins/motion-styles/sources/creator-motion.html +805 -0
  495. package/plugins/motion-styles/sources/data-city.html +613 -0
  496. package/plugins/motion-styles/sources/data-story.html +539 -0
  497. package/plugins/motion-styles/sources/deep-layers.html +624 -0
  498. package/plugins/motion-styles/sources/doc-cinema.html +590 -0
  499. package/plugins/motion-styles/sources/evidence-board.html +610 -0
  500. package/plugins/motion-styles/sources/exploded-view.html +618 -0
  501. package/plugins/motion-styles/sources/glass-icons.html +612 -0
  502. package/plugins/motion-styles/sources/glitch-pack.html +583 -0
  503. package/plugins/motion-styles/sources/globe-arcs.html +621 -0
  504. package/plugins/motion-styles/sources/headline-backdrop.html +584 -0
  505. package/plugins/motion-styles/sources/iso-cutaway.html +621 -0
  506. package/plugins/motion-styles/sources/isotype.html +588 -0
  507. package/plugins/motion-styles/sources/karaoke-subs.html +577 -0
  508. package/plugins/motion-styles/sources/low-poly-atlas.html +621 -0
  509. package/plugins/motion-styles/sources/lower-thirds.html +582 -0
  510. package/plugins/motion-styles/sources/marker-board.html +598 -0
  511. package/plugins/motion-styles/sources/market-tape.html +598 -0
  512. package/plugins/motion-styles/sources/math-canvas.html +592 -0
  513. package/plugins/motion-styles/sources/myth-or-fact.html +587 -0
  514. package/plugins/motion-styles/sources/neon-line.html +597 -0
  515. package/plugins/motion-styles/sources/paper-craft.html +612 -0
  516. package/plugins/motion-styles/sources/parchment-map.html +624 -0
  517. package/plugins/motion-styles/sources/physics-toybox.html +617 -0
  518. package/plugins/motion-styles/sources/pixel-quest.html +609 -0
  519. package/plugins/motion-styles/sources/podcast-clip.html +585 -0
  520. package/plugins/motion-styles/sources/pop-info.html +677 -0
  521. package/plugins/motion-styles/sources/product-turntable.html +611 -0
  522. package/plugins/motion-styles/sources/punch-captions.html +583 -0
  523. package/plugins/motion-styles/sources/quiz-countdown.html +593 -0
  524. package/plugins/motion-styles/sources/quote-cinema.html +581 -0
  525. package/plugins/motion-styles/sources/recipe-steps.html +599 -0
  526. package/plugins/motion-styles/sources/rubber-hose-reel.html +627 -0
  527. package/plugins/motion-styles/sources/shadow-puppets.html +609 -0
  528. package/plugins/motion-styles/sources/size-lineup.html +620 -0
  529. package/plugins/motion-styles/sources/software-walkthrough.html +651 -0
  530. package/plugins/motion-styles/sources/stack-split.html +588 -0
  531. package/plugins/motion-styles/sources/sticker-pop.html +587 -0
  532. package/plugins/motion-styles/sources/storybook.html +600 -0
  533. package/plugins/motion-styles/sources/swiss-grid.html +590 -0
  534. package/plugins/motion-styles/sources/synth-grid.html +614 -0
  535. package/plugins/motion-styles/sources/tactics-board.html +608 -0
  536. package/plugins/motion-styles/sources/terminal.html +593 -0
  537. package/plugins/motion-styles/sources/tier-list.html +600 -0
  538. package/plugins/motion-styles/sources/timeline-rail.html +598 -0
  539. package/plugins/motion-styles/sources/top-5-countdown.html +589 -0
  540. package/plugins/motion-styles/sources/versus-split.html +592 -0
  541. package/plugins/motion-styles/sources/vhs-camcorder.html +587 -0
  542. package/plugins/motion-styles/sources/visual-novel.html +623 -0
  543. package/plugins/motion-styles/sources/warm-canvas.html +742 -0
  544. package/plugins/motion-styles/sources/woodcut-tale.html +598 -0
  545. package/plugins/motion-styles/sources/zine-collage.html +594 -0
  546. package/plugins/video-pipeline/.claude-plugin/plugin.json +2 -2
  547. package/plugins/video-pipeline/skills/.upstream-skills.json +156 -143
  548. package/plugins/video-pipeline/skills/video-pipeline/references/mcp-tools.md +3 -3
  549. package/scripts/deep-validate.js +3 -2
  550. package/src/audio-mixer/mixer.js +69 -0
  551. package/src/cli/make.js +19 -0
  552. package/src/harness/lib/browser.mjs +22 -1
  553. package/src/harness/lib/capture.mjs +33 -11
  554. package/src/harness/lib/jobs.mjs +16 -1
  555. package/src/mcp-server/server.js +726 -10
  556. package/src/pipeline/providers.js +77 -17
  557. package/src/skills/sync-upstream.js +15 -3
  558. package/src/utils/media-downloader.js +7 -0
  559. package/src/utils/tool-installer.js +212 -0
  560. package/src/utils/transcribe.js +9 -1
  561. package/src/video-renderer/renderer.js +68 -38
  562. package/src/video-renderer/scene-animator.js +50 -15
  563. package/src/workflows/assets.js +49 -5
  564. package/src/workflows/render.js +2 -0
  565. package/src/workflows/script.js +14 -3
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "video-pipeline",
3
3
  "displayName": "FrameForge Video Pipeline",
4
- "version": "2.7.3",
4
+ "version": "2.7.7",
5
5
  "description": "End-to-end AI video production. IDE writes scenes → FrameForge renders. Or: scaffold a Playwright+ffmpeg code-driven animation. Or: auto-research and script the video.",
6
6
  "skills": [
7
7
  {
8
8
  "name": "video-pipeline",
9
9
  "path": "skills/video-pipeline/SKILL.md",
10
10
  "displayName": "Video Pipeline",
11
- "description": "28 MCP tools: create_video_from_script, edit_video, plan_video_edit, preview_scene, verify_scene_quality, scaffold_animation_project, render_animation, validate_storyboard, mix_audio_pro, transcribe_media, ingest_url, sync_upstream_skills, check_upstream_updates, and more."
11
+ "description": "34 MCP tools: create_video_from_script, edit_video, plan_video_edit, preview_scene, verify_scene_quality, scaffold_animation_project, render_animation, validate_storyboard, mix_audio_pro, transcribe_media, ingest_url, sync_upstream_skills, check_upstream_updates, list_motion_styles, get_motion_style_prompt, and more."
12
12
  },
13
13
  {
14
14
  "name": "html-renderer",
@@ -1,143 +1,156 @@
1
- {
2
- "lastSync": "2026-11-11T19:56:18.351Z",
3
- "repos": {
4
- "hyperframes": {
5
- "repo": "heygen-com/hyperframes",
6
- "category": "compositor",
7
- "desc": "Agent-native HTML/GSAP declarative video compositor",
8
- "capabilities": [
9
- "scaffold_animation_project",
10
- "render_animation"
11
- ],
12
- "userImpact": "New compositor patterns or GSAP animation primitives available for HTML-rendered video",
13
- "sha": "a243169",
14
- "lastChecked": "2026-11-11T19:56:16.487Z",
15
- "status": "synced"
16
- },
17
- "opuscar": {
18
- "repo": "lemomo-ai/lemo-opuscar",
19
- "category": "styles",
20
- "desc": "Frontier cinematic and viral film styles catalog (12 styles)",
21
- "capabilities": [
22
- "plan_video_edit",
23
- "edit_video",
24
- "render_from_scenes"
25
- ],
26
- "userImpact": "New color grades or film styles available in plan_video_edit style parameter",
27
- "sha": "9eb7739",
28
- "lastChecked": "2026-11-11T19:56:16.692Z",
29
- "status": "synced"
30
- },
31
- "onetake": {
32
- "repo": "feitangyuan/onetake",
33
- "category": "camera",
34
- "desc": "Continuous single-shot camera choreography (zero-cut spline)",
35
- "capabilities": [
36
- "generate_scene_code",
37
- "scaffold_animation_project"
38
- ],
39
- "userImpact": "New onetake camera transition patterns available for code-driven animation",
40
- "sha": "abb6d17",
41
- "lastChecked": "2026-11-11T19:56:16.855Z",
42
- "status": "synced"
43
- },
44
- "collage-broll": {
45
- "repo": "pyang5166/gbro-collage-broll",
46
- "category": "broll",
47
- "desc": "Editorial paper collage, halftone textures, 2.5D tilt",
48
- "capabilities": [
49
- "generate_scene_code",
50
- "create_video_from_script"
51
- ],
52
- "userImpact": "New editorial collage / halftone visual templates available",
53
- "sha": "a1a4ee2",
54
- "lastChecked": "2026-11-11T19:56:17.057Z",
55
- "status": "synced"
56
- },
57
- "remotion-skills": {
58
- "repo": "remotion-dev/skills",
59
- "category": "motion",
60
- "desc": "First-party Remotion composition skills (spring physics)",
61
- "capabilities": [
62
- "scaffold_animation_project",
63
- "render_animation"
64
- ],
65
- "userImpact": "New Remotion motion patterns or spring physics presets available",
66
- "sha": "7e541aa",
67
- "lastChecked": "2026-11-11T19:56:17.403Z",
68
- "status": "synced"
69
- },
70
- "earshot": {
71
- "repo": "Leonxlnx/earshot",
72
- "category": "audio",
73
- "desc": "Procedural CPU SFX synthesis and timeline sync (13-type library)",
74
- "capabilities": [
75
- "mix_audio_pro",
76
- "create_video_from_script"
77
- ],
78
- "userImpact": "New procedural SFX cue types or audio sync patterns available in mix_audio_pro",
79
- "sha": "4ac3d2a",
80
- "lastChecked": "2026-11-11T19:56:17.839Z",
81
- "status": "synced"
82
- },
83
- "claude-anim-base": {
84
- "repo": "JohnHeibel/ClaudeAnimationBase",
85
- "category": "animation",
86
- "desc": "12fps hand-drawn cel boil, character emotions (Opus 5.5 patterns)",
87
- "capabilities": [
88
- "generate_scene_code",
89
- "scaffold_animation_project"
90
- ],
91
- "userImpact": "New ClaudeAnimationBase patterns for 12fps organic boil or character emotion scenes",
92
- "sha": "0ac8bf2",
93
- "lastChecked": "2026-11-11T19:56:18.012Z",
94
- "status": "synced"
95
- },
96
- "claude-remotion": {
97
- "repo": "haidrrrry/claude-remotion-skill",
98
- "category": "motion",
99
- "desc": "10 hard motion craft rules, review loop, Opus 5.5 closed-loop QA",
100
- "capabilities": [
101
- "scaffold_animation_project",
102
- "render_animation",
103
- "verify_scene_quality"
104
- ],
105
- "userImpact": "Updated motion craft rules or QA patterns for the Opus 5.5 closed-loop correction pipeline",
106
- "sha": "1dcbe5e",
107
- "lastChecked": "2026-11-11T19:56:18.180Z",
108
- "status": "synced"
109
- },
110
- "ffmpeg-skill": {
111
- "repo": "kajisho5/ffmpeg-skill",
112
- "category": "ffmpeg",
113
- "desc": "42 typed-argparse FFmpeg tools, machine-readable contract, visual linter",
114
- "capabilities": [
115
- "edit_video",
116
- "plan_video_edit",
117
- "mix_audio_pro"
118
- ],
119
- "userImpact": "New FFmpeg filter patterns or video editing operations available",
120
- "sha": "532cbe3",
121
- "lastChecked": "2026-11-11T19:56:18.351Z",
122
- "status": "synced"
123
- }
124
- },
125
- "version": "2.7.3",
126
- "updatedCount": 2,
127
- "pendingUpdates": [
128
- {
129
- "id": "hyperframes",
130
- "repo": "heygen-com/hyperframes",
131
- "sha": "a243169",
132
- "category": "compositor",
133
- "userImpact": "New compositor patterns or GSAP animation primitives available for HTML-rendered video"
134
- },
135
- {
136
- "id": "remotion-skills",
137
- "repo": "remotion-dev/skills",
138
- "sha": "7e541aa",
139
- "category": "motion",
140
- "userImpact": "New Remotion motion patterns or spring physics presets available"
141
- }
142
- ]
143
- }
1
+ {
2
+ "lastSync": "2026-11-12T12:18:03.970Z",
3
+ "repos": {
4
+ "hyperframes": {
5
+ "repo": "heygen-com/hyperframes",
6
+ "category": "compositor",
7
+ "desc": "Agent-native HTML/GSAP declarative video compositor",
8
+ "capabilities": [
9
+ "scaffold_animation_project",
10
+ "render_animation"
11
+ ],
12
+ "userImpact": "New compositor patterns or GSAP animation primitives available for HTML-rendered video",
13
+ "sha": "a243169",
14
+ "lastChecked": "2026-11-12T12:18:02.184Z",
15
+ "status": "synced"
16
+ },
17
+ "opuscar": {
18
+ "repo": "lemomo-ai/lemo-opuscar",
19
+ "category": "styles",
20
+ "desc": "Frontier cinematic and viral film styles catalog (12 styles)",
21
+ "capabilities": [
22
+ "plan_video_edit",
23
+ "edit_video",
24
+ "render_from_scenes"
25
+ ],
26
+ "userImpact": "New color grades or film styles available in plan_video_edit style parameter",
27
+ "sha": "9eb7739",
28
+ "lastChecked": "2026-11-12T12:18:02.371Z",
29
+ "status": "synced"
30
+ },
31
+ "onetake": {
32
+ "repo": "feitangyuan/onetake",
33
+ "category": "camera",
34
+ "desc": "Continuous single-shot camera choreography (zero-cut spline)",
35
+ "capabilities": [
36
+ "generate_scene_code",
37
+ "scaffold_animation_project"
38
+ ],
39
+ "userImpact": "New onetake camera transition patterns available for code-driven animation",
40
+ "sha": "abb6d17",
41
+ "lastChecked": "2026-11-12T12:18:02.565Z",
42
+ "status": "synced"
43
+ },
44
+ "collage-broll": {
45
+ "repo": "pyang5166/gbro-collage-broll",
46
+ "category": "broll",
47
+ "desc": "Editorial paper collage, halftone textures, 2.5D tilt",
48
+ "capabilities": [
49
+ "generate_scene_code",
50
+ "create_video_from_script"
51
+ ],
52
+ "userImpact": "New editorial collage / halftone visual templates available",
53
+ "sha": "a1a4ee2",
54
+ "lastChecked": "2026-11-12T12:18:02.762Z",
55
+ "status": "synced"
56
+ },
57
+ "remotion-skills": {
58
+ "repo": "remotion-dev/skills",
59
+ "category": "motion",
60
+ "desc": "First-party Remotion composition skills (spring physics)",
61
+ "capabilities": [
62
+ "scaffold_animation_project",
63
+ "render_animation"
64
+ ],
65
+ "userImpact": "New Remotion motion patterns or spring physics presets available",
66
+ "sha": "7e541aa",
67
+ "lastChecked": "2026-11-12T12:18:03.021Z",
68
+ "status": "synced"
69
+ },
70
+ "earshot": {
71
+ "repo": "Leonxlnx/earshot",
72
+ "category": "audio",
73
+ "desc": "Procedural CPU SFX synthesis and timeline sync (13-type library)",
74
+ "capabilities": [
75
+ "mix_audio_pro",
76
+ "create_video_from_script"
77
+ ],
78
+ "userImpact": "New procedural SFX cue types or audio sync patterns available in mix_audio_pro",
79
+ "sha": "4ac3d2a",
80
+ "lastChecked": "2026-11-12T12:18:03.205Z",
81
+ "status": "synced"
82
+ },
83
+ "claude-anim-base": {
84
+ "repo": "JohnHeibel/ClaudeAnimationBase",
85
+ "category": "animation",
86
+ "desc": "12fps hand-drawn cel boil, character emotions (Opus 5.5 patterns)",
87
+ "capabilities": [
88
+ "generate_scene_code",
89
+ "scaffold_animation_project"
90
+ ],
91
+ "userImpact": "New ClaudeAnimationBase patterns for 12fps organic boil or character emotion scenes",
92
+ "sha": "0ac8bf2",
93
+ "lastChecked": "2026-11-12T12:18:03.388Z",
94
+ "status": "synced"
95
+ },
96
+ "claude-remotion": {
97
+ "repo": "haidrrrry/claude-remotion-skill",
98
+ "category": "motion",
99
+ "desc": "10 hard motion craft rules, review loop, Opus 5.5 closed-loop QA",
100
+ "capabilities": [
101
+ "scaffold_animation_project",
102
+ "render_animation",
103
+ "verify_scene_quality"
104
+ ],
105
+ "userImpact": "Updated motion craft rules or QA patterns for the Opus 5.5 closed-loop correction pipeline",
106
+ "sha": "1dcbe5e",
107
+ "lastChecked": "2026-11-12T12:18:03.571Z",
108
+ "status": "synced"
109
+ },
110
+ "ffmpeg-skill": {
111
+ "repo": "kajisho5/ffmpeg-skill",
112
+ "category": "ffmpeg",
113
+ "desc": "42 typed-argparse FFmpeg tools, machine-readable contract, visual linter",
114
+ "capabilities": [
115
+ "edit_video",
116
+ "plan_video_edit",
117
+ "mix_audio_pro"
118
+ ],
119
+ "userImpact": "New FFmpeg filter patterns or video editing operations available",
120
+ "sha": "532cbe3",
121
+ "lastChecked": "2026-11-12T12:18:03.766Z",
122
+ "status": "synced"
123
+ },
124
+ "aiinsight-shorts": {
125
+ "repo": "frameforge/aiinsight-shorts",
126
+ "category": "shorts",
127
+ "desc": "6-style faceless-shorts skill (Deep Dive 3D, Night File 3D, Inside Out, Stick Story, Paper Atlas, Tall Tale 3D) — canvas+three.js, Kokoro TTS, Whisper word-sync, ffmpeg MP4. By Motion Graphics / AI Insight Spot.",
128
+ "capabilities": [
129
+ "create_short",
130
+ "list_short_styles"
131
+ ],
132
+ "userImpact": "New faceless-shorts styles, kit components, or rendering techniques available from aiinsight-shorts upstream",
133
+ "sha": "v2.5.0",
134
+ "lastChecked": "2026-11-12T12:18:03.970Z",
135
+ "status": "synced"
136
+ }
137
+ },
138
+ "version": "2.7.7",
139
+ "updatedCount": 0,
140
+ "pendingUpdates": [
141
+ {
142
+ "id": "hyperframes",
143
+ "repo": "heygen-com/hyperframes",
144
+ "sha": "a243169",
145
+ "category": "compositor",
146
+ "userImpact": "New compositor patterns or GSAP animation primitives available for HTML-rendered video"
147
+ },
148
+ {
149
+ "id": "remotion-skills",
150
+ "repo": "remotion-dev/skills",
151
+ "sha": "7e541aa",
152
+ "category": "motion",
153
+ "userImpact": "New Remotion motion patterns or spring physics presets available"
154
+ }
155
+ ]
156
+ }
@@ -403,9 +403,9 @@ No network requests — reads the local manifest only. Returns:
403
403
  ```json
404
404
  {
405
405
  "lastSync": "2026-11-11T20:00:00Z",
406
- "manifestVersion": "2.7.3",
407
- "totalRepos": 9,
408
- "syncedCount": 9,
406
+ "manifestVersion": "2.7.7",
407
+ "totalRepos": 11,
408
+ "syncedCount": 11,
409
409
  "repos": [
410
410
  {
411
411
  "id": "hyperframes",
@@ -20,7 +20,7 @@ check('batch handling', code.includes('Array.isArray(body)'));
20
20
  check('ping handler', code.includes("method === 'ping'"));
21
21
  check('notifications/init', code.includes("notifications/initialized"));
22
22
  check('body size limit', code.includes('MAX_BODY_BYTES'));
23
- check('SERVER_INFO version 2.7.3', code.includes("version: '2.7.3'"));
23
+ check('SERVER_INFO version 2.7.7', code.includes("version: '2.7.7'"));
24
24
  check('18 tools defined (incl get_job_status)', code.includes('get_job_status'));
25
25
  check('export_to_editor tool defined', code.includes('export_to_editor'));
26
26
  check('edit_video tool defined', code.includes('edit_video'));
@@ -30,6 +30,7 @@ check('verify_scene_quality tool defined', code.includes('verify_scene_quality')
30
30
  check('plan_video_edit tool defined', code.includes('plan_video_edit'));
31
31
  check('sync_upstream_skills tool defined', code.includes('sync_upstream_skills'));
32
32
  check('media-downloader exists', fs.existsSync('./src/utils/media-downloader.js'));
33
+ check('tool-installer exists', fs.existsSync('./src/utils/tool-installer.js'));
33
34
  check('transcribe engine exists', fs.existsSync('./src/utils/transcribe.js'));
34
35
  check('sync-upstream script exists', fs.existsSync('./src/skills/sync-upstream.js'));
35
36
  check('video-editor exists', fs.existsSync('./src/video-editor/editor.js'));
@@ -367,7 +368,7 @@ check('cf-worker has checkRateLimit', cfWorker.includes('checkRateLimit'));
367
368
  check('cf-worker hashes token (SHA-256)', cfWorker.includes('SHA-256'));
368
369
  check('cf-worker uses RATE_LIMITS KV', cfWorker.includes('env.RATE_LIMITS'));
369
370
  check('cf-worker returns 429 on limit', cfWorker.includes('429'));
370
- check('cf-worker version 2.7.3', cfWorker.includes("'2.7.3'"));
371
+ check('cf-worker version 2.7.7', cfWorker.includes("'2.7.7'"));
371
372
  check('wrangler.toml has kv_namespaces',fs.readFileSync('./cloudflare-mcp/wrangler.toml','utf8').includes('kv_namespaces'));
372
373
 
373
374
  // ── plugins/skills present ────────────────────────────────────────────────
@@ -699,6 +699,75 @@ class AudioMixer {
699
699
  } catch { return []; }
700
700
  }
701
701
 
702
+ /**
703
+ * Mix SFX cues into a voice audio track (no music).
704
+ * Used for per-scene SFX injection before video encode.
705
+ * @param {string} voicePath — input voice/narration .m4a
706
+ * @param {Array} sfxCues — [{ name, time, volume }]
707
+ * @param {string} outputPath — output .m4a
708
+ */
709
+ mixSfxIntoAudio(voicePath, sfxCues, outputPath) {
710
+ if (!Array.isArray(sfxCues) || sfxCues.length === 0) {
711
+ // Nothing to mix — just copy
712
+ const r = spawnSync('ffmpeg', ['-nostdin', '-y', '-i', voicePath, '-c', 'copy', outputPath],
713
+ { timeout: 30000, encoding: 'utf8' });
714
+ if (r.status !== 0) throw new Error(`SFX passthrough copy failed: ${(r.stderr || '').slice(-200)}`);
715
+ return outputPath;
716
+ }
717
+
718
+ const tmpDir = path.join(os.tmpdir(), `ff_sfx_${Date.now()}`);
719
+ fs.mkdirSync(tmpDir, { recursive: true });
720
+ try {
721
+ const durProbe = spawnSync('ffprobe', [
722
+ '-v', 'error', '-show_entries', 'format=duration',
723
+ '-of', 'default=nk=1:nw=1', voicePath,
724
+ ], { encoding: 'utf8', timeout: 10000 });
725
+ const totalDur = parseFloat((durProbe.stdout || '0').trim()) || 30;
726
+
727
+ const sfxPaths = sfxCues.map(cue => this._synthesizeSfxCue({
728
+ sfxName: (cue.name || cue.sfxName || 'pop').toLowerCase().replace(/-/g, '_'),
729
+ cueTime: Number(cue.time || cue.t || 0),
730
+ cueVol: Number(cue.volume || cue.vol || 1.0),
731
+ totalDuration: totalDur,
732
+ tmpDir,
733
+ }));
734
+
735
+ // Merge all SFX into one track then amix with voice
736
+ let sfxTrackPath;
737
+ if (sfxPaths.length === 1) {
738
+ sfxTrackPath = sfxPaths[0];
739
+ } else {
740
+ sfxTrackPath = path.join(tmpDir, 'sfx_combined.m4a');
741
+ const sfxInputs = sfxPaths.flatMap(p => ['-i', p]);
742
+ const sfxFilter = sfxPaths.map((_, i) => `[${i}:a]`).join('') +
743
+ `amix=inputs=${sfxPaths.length}:duration=longest:normalize=0[sfxout]`;
744
+ const cr = spawnSync('ffmpeg', [
745
+ '-nostdin', '-y', ...sfxInputs,
746
+ '-filter_complex', sfxFilter, '-map', '[sfxout]',
747
+ '-c:a', 'aac', '-b:a', '128k', '-ar', '48000', '-ac', '2',
748
+ sfxTrackPath,
749
+ ], { encoding: 'utf8', timeout: 120000 });
750
+ if (cr.status !== 0) throw new Error(`SFX combine failed: ${(cr.stderr || '').slice(-200)}`);
751
+ }
752
+
753
+ // Mix voice + SFX
754
+ const mixR = spawnSync('ffmpeg', [
755
+ '-nostdin', '-y',
756
+ '-i', voicePath,
757
+ '-i', sfxTrackPath,
758
+ '-filter_complex', '[0:a][1:a]amix=inputs=2:duration=first:normalize=0[out]',
759
+ '-map', '[out]',
760
+ '-c:a', 'aac', '-b:a', '192k', '-ar', '48000', '-ac', '2',
761
+ '-t', String(totalDur),
762
+ outputPath,
763
+ ], { timeout: 120000, encoding: 'utf8' });
764
+ if (mixR.status !== 0) throw new Error(`Voice+SFX mix failed: ${(mixR.stderr || '').slice(-200)}`);
765
+ return outputPath;
766
+ } finally {
767
+ try { fs.rmSync(tmpDir, { recursive: true, force: true }); } catch (_) {}
768
+ }
769
+ }
770
+
702
771
  // ── Backward-compatible alias for older callers ──────────────────────────
703
772
  mixWithDuckingLegacy({ voicePath, musicPath = null, outputPath }) {
704
773
  return this.mixWithDucking({ voicePath, musicPath, outputPath });
package/src/cli/make.js CHANGED
@@ -184,6 +184,13 @@ if (subCmd === 'setup') {
184
184
  return;
185
185
  }
186
186
 
187
+ // 7. Dispatch to auto-installer
188
+ if (subCmd === 'install' || subCmd === 'install-tools') {
189
+ const { autoInstallAll } = require('../utils/tool-installer');
190
+ autoInstallAll();
191
+ process.exit(0);
192
+ }
193
+
187
194
  function parseArgs(argv) {
188
195
  const args = {
189
196
  mode: 'full-auto',
@@ -194,6 +201,7 @@ function parseArgs(argv) {
194
201
  captions: false, subtitles: false,
195
202
  scenesFile: '', scriptFile: '', mediaDir: '',
196
203
  shorts: true, dryRun: false,
204
+ sceneCount: null, targetDuration: null,
197
205
  noResearch: false, noScript: false, noImages: false, noTts: false, noPublish: false,
198
206
  outDir: './output', env: '.env',
199
207
  };
@@ -206,6 +214,8 @@ function parseArgs(argv) {
206
214
  case '--script-file': args.scriptFile = argv[++i] || ''; break;
207
215
  case '--media-dir': args.mediaDir = argv[++i] || ''; break;
208
216
  case '--language': args.language = (argv[++i] || 'en').toLowerCase(); break;
217
+ case '--scenes': args.sceneCount = parseInt(argv[++i], 10); break;
218
+ case '--duration': args.targetDuration = parseFloat(argv[++i]); break;
209
219
  case '--orientation': args.orientation = (argv[++i] || 'landscape').toLowerCase(); break;
210
220
  case '--portrait': args.orientation = 'portrait'; break;
211
221
  case '--captions':
@@ -225,6 +235,11 @@ function parseArgs(argv) {
225
235
  case '--dry-run': args.dryRun = true; break;
226
236
  case '--out-dir': args.outDir = argv[++i] || args.outDir; break;
227
237
  case '--env': args.env = argv[++i] || args.env; break;
238
+ case '--install-tools': {
239
+ const { autoInstallAll } = require('../utils/tool-installer');
240
+ autoInstallAll();
241
+ break;
242
+ }
228
243
  case '--help': case '-h': printHelp(); process.exit(0); break;
229
244
  }
230
245
  }
@@ -432,6 +447,10 @@ async function runSingleVideo(args, topic, outDir, workflows) {
432
447
  claims: researchResult.claims,
433
448
  topic,
434
449
  style: args.style,
450
+ language: args.language,
451
+ sceneCount: args.sceneCount,
452
+ targetDuration: args.targetDuration,
453
+ format: args.orientation === 'portrait' ? 'Shorts' : 'YouTube video',
435
454
  });
436
455
  scenes = scriptResult.scenes;
437
456
  title = scriptResult.title || topic;
@@ -110,7 +110,28 @@ export async function launchHarnessBrowser(opts = {}) {
110
110
  launchOpts.executablePath = execPath;
111
111
  }
112
112
 
113
- const browser = await chromium.launch(launchOpts);
113
+ let browser;
114
+ try {
115
+ browser = await chromium.launch(launchOpts);
116
+ } catch (launchErr) {
117
+ if ((launchErr.message || '').includes('playwright install') || (launchErr.message || '').includes('Executable')) {
118
+ try {
119
+ const { createRequire } = await import('module');
120
+ const req = createRequire(import.meta.url);
121
+ const { ensurePlaywrightChromium } = req('../../utils/tool-installer');
122
+ if (ensurePlaywrightChromium()) {
123
+ browser = await chromium.launch(launchOpts);
124
+ } else {
125
+ throw launchErr;
126
+ }
127
+ } catch (_) {
128
+ throw launchErr;
129
+ }
130
+ } else {
131
+ throw launchErr;
132
+ }
133
+ }
134
+
114
135
  return { browser, executablePath: execPath || 'bundled-chromium' };
115
136
  }
116
137
 
@@ -141,10 +141,10 @@ export const VIRTUAL_CLOCK_INJECTION = `
141
141
  }
142
142
  } catch (_) {}
143
143
 
144
- if (window.renderAt) {
145
- await window.renderAt(t);
146
- } else if (window.seek) {
144
+ if (window.seek) {
147
145
  await window.seek(t);
146
+ } else if (window.renderAt) {
147
+ await window.renderAt(t);
148
148
  }
149
149
  while (_timerQueue.length > 0 && _timerQueue[0].runAt <= _now) {
150
150
  const item = _timerQueue.shift();
@@ -154,11 +154,14 @@ export const VIRTUAL_CLOCK_INJECTION = `
154
154
  await document.fonts.ready;
155
155
  }
156
156
 
157
+ // Wait for any delayRender handles — max 3s to avoid pipeline stalls
157
158
  if (_delayHandles.size > 0) {
158
159
  const startW = _realDateNow();
159
- while (_delayHandles.size > 0 && _realDateNow() - startW < 10000) {
160
+ while (_delayHandles.size > 0 && _realDateNow() - startW < 3000) {
160
161
  await new Promise(r => _realSetTimeout(r, 10));
161
162
  }
163
+ // Force-clear stale handles so we never block indefinitely
164
+ _delayHandles.clear();
162
165
  }
163
166
  };
164
167
  })();
@@ -194,22 +197,41 @@ export async function openPageWithVirtualClock(browserOrOpts, htmlPathArg, optsA
194
197
  return page;
195
198
  }
196
199
 
197
- export async function captureFrame(page, t, { type = 'image/png', quality = 0.94 } = {}) {
200
+ export async function captureFrame(page, t, { type = 'image/png', quality = 0.94, timeoutMs = 15000 } = {}) {
201
+ // page.evaluate with an explicit timeout so a hung seek() never stalls the whole pipeline
198
202
  const dataUrl = await page.evaluate(async ({ time, mime, q }) => {
199
203
  await window.__seek(time);
200
204
  if (window.renderAt) {
201
- return await window.renderAt(time, mime, q);
205
+ const res = await window.renderAt(time, mime, q);
206
+ if (typeof res === 'string' && res.includes(',')) return res;
207
+ }
208
+ const canvas = document.getElementById('stage') || document.querySelector('canvas');
209
+ if (canvas && typeof canvas.toDataURL === 'function') {
210
+ try {
211
+ return canvas.toDataURL(mime, q);
212
+ } catch (_) {}
202
213
  }
203
214
  return null;
204
- }, { time: t, mime: type, q: quality });
215
+ }, { time: t, mime: type, q: quality }, { timeout: timeoutMs });
205
216
 
206
217
  if (typeof dataUrl === 'string' && dataUrl.includes(',')) {
207
218
  return Buffer.from(dataUrl.slice(dataUrl.indexOf(',') + 1), 'base64');
208
219
  }
209
220
 
210
221
  const screenshotType = type === 'image/jpeg' ? 'jpeg' : 'png';
211
- return page.screenshot({
212
- type: screenshotType,
213
- quality: screenshotType === 'jpeg' ? Math.round(quality * 100) : undefined,
214
- });
222
+ let lastErr;
223
+ for (let attempt = 0; attempt < 3; attempt++) {
224
+ try {
225
+ return await page.screenshot({
226
+ type: screenshotType,
227
+ quality: screenshotType === 'jpeg' ? Math.round(quality * 100) : undefined,
228
+ });
229
+ } catch (err) {
230
+ lastErr = err;
231
+ if (attempt < 2) {
232
+ await new Promise(r => setTimeout(r, 60 * (attempt + 1)));
233
+ }
234
+ }
235
+ }
236
+ throw lastErr;
215
237
  }
@@ -92,6 +92,9 @@ export async function renderFrameJobs({
92
92
 
93
93
  await Promise.all(
94
94
  pages.map(async (page) => {
95
+ // Per-frame timeout: 20s is generous for a single seek+capture at 1920×1080
96
+ const FRAME_TIMEOUT_MS = 20000;
97
+
95
98
  while (true) {
96
99
  let frameIdx;
97
100
  if (nextIdx < todo.length) {
@@ -105,7 +108,19 @@ export async function renderFrameJobs({
105
108
  const targetFile = path.join(framesDir, filename);
106
109
  const tmpFile = `${targetFile}.tmp`;
107
110
 
108
- const buf = await captureFrame(page, t, { type: mimeType, quality });
111
+ let buf = null;
112
+ for (let attempt = 0; attempt < 3; attempt++) {
113
+ try {
114
+ buf = await captureFrame(page, t, { type: mimeType, quality, timeoutMs: FRAME_TIMEOUT_MS });
115
+ if (buf && buf.length > 500) break;
116
+ } catch (err) {
117
+ if (attempt === 2) throw err;
118
+ await new Promise(r => setTimeout(r, 80 * (attempt + 1)));
119
+ }
120
+ }
121
+ if (!buf || buf.length <= 500) {
122
+ throw new Error(`Frame ${frameIdx} captured corrupted or empty image (${buf ? buf.length : 0} bytes)`);
123
+ }
109
124
 
110
125
  // Atomic write: write to temp file then rename
111
126
  fs.writeFileSync(tmpFile, buf);