@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.
- package/.claude-plugin/marketplace.json +3 -3
- package/AGENTS.md +33 -0
- package/CHANGELOG.md +49 -0
- package/CLAUDE.md +17 -6
- package/GEMINI.md +63 -0
- package/README.md +216 -426
- package/START_HERE.md +4 -2
- package/package.json +5 -3
- package/plugins/ai-video-editor/README.md +32 -0
- package/plugins/ai-video-editor/SKILL.md +152 -0
- package/plugins/ai-video-editor/assets/fonts/fonts.css +2409 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/anton-400.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/archivo-800.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/cabin-sketch-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/dm-sans-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/fraunces-600.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/fraunces-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/fredoka-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/inter-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/inter-800.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/inter-tight-800.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/kalam-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/ttf/noto-sans-devanagari-700.ttf +0 -0
- package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-400-normal.woff2 +0 -0
- package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-500-normal.woff2 +0 -0
- package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-600-normal.woff2 +0 -0
- package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-700-normal.woff2 +0 -0
- package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-800-normal.woff2 +0 -0
- package/plugins/ai-video-editor/engine/hidpi.js +117 -0
- package/plugins/ai-video-editor/engine/page.html +43 -0
- package/plugins/ai-video-editor/engine/player.js +145 -0
- package/plugins/ai-video-editor/references/example-story-warm-canvas.js +95 -0
- package/plugins/ai-video-editor/references/story-guide.md +112 -0
- package/plugins/ai-video-editor/requirements.txt +4 -0
- package/plugins/ai-video-editor/styles/chalk-talk/base.js +490 -0
- package/plugins/ai-video-editor/styles/chalk-talk/style.json +14 -0
- package/plugins/ai-video-editor/styles/chalk-talk/style.md +41 -0
- package/plugins/ai-video-editor/styles/clean-tech/base.js +447 -0
- package/plugins/ai-video-editor/styles/clean-tech/style.json +15 -0
- package/plugins/ai-video-editor/styles/clean-tech/style.md +38 -0
- package/plugins/ai-video-editor/styles/creator-motion-graphics/base.js +698 -0
- package/plugins/ai-video-editor/styles/creator-motion-graphics/style.json +16 -0
- package/plugins/ai-video-editor/styles/creator-motion-graphics/style.md +39 -0
- package/plugins/ai-video-editor/styles/data-story/base.js +432 -0
- package/plugins/ai-video-editor/styles/data-story/style.json +14 -0
- package/plugins/ai-video-editor/styles/data-story/style.md +38 -0
- package/plugins/ai-video-editor/styles/index.json +103 -0
- package/plugins/ai-video-editor/styles/pop-info/base.js +570 -0
- package/plugins/ai-video-editor/styles/pop-info/style.json +13 -0
- package/plugins/ai-video-editor/styles/pop-info/style.md +37 -0
- package/plugins/ai-video-editor/styles/software-walkthrough/base.js +544 -0
- package/plugins/ai-video-editor/styles/software-walkthrough/style.json +15 -0
- package/plugins/ai-video-editor/styles/software-walkthrough/style.md +38 -0
- package/plugins/ai-video-editor/styles/warm-canvas/base.js +610 -0
- package/plugins/ai-video-editor/styles/warm-canvas/style.json +14 -0
- package/plugins/ai-video-editor/styles/warm-canvas/style.md +37 -0
- package/plugins/aiinsight-shorts/CHANGELOG.md +6 -0
- package/plugins/aiinsight-shorts/README.md +43 -0
- package/plugins/aiinsight-shorts/SKILL.md +138 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/STYLE.md +58 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/data/cues.json +140 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/data/lines.json +67 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/data/words.json +614 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/data/words.txt +102 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/fonts/Inter-Black.otf +0 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/fonts/Inter-ExtraBold.otf +0 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/index.html +17 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/script.json +27 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/sheet.html +11 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/board.js +62 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/captions.js +68 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/engine.js +65 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/human.js +128 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/lib.js +44 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/look2d.js +33 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/sdf.js +79 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/sets.js +107 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/timing.js +23 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/main.js +56 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/sheet.js +79 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/src/shots.js +136 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/tools/capture.mjs +122 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/tools/mix.py +172 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/LICENSE-three.txt +21 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/environments/RoomEnvironment.js +144 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/BokehPass.js +141 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/MaskPass.js +104 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/OutputPass.js +97 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/Pass.js +95 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/RenderPass.js +99 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/BokehShader.js +145 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/CopyShader.js +45 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/OutputShader.js +85 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/three.module.js +6 -0
- package/plugins/aiinsight-shorts/styles/deep-dive/style-sheet.png +0 -0
- package/plugins/aiinsight-shorts/styles/inside-out/STYLE.md +97 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/data/cues.json +178 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/data/lines.json +73 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/data/words.json +662 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/fonts/Inter-Black.otf +0 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/index.html +17 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/script.json +26 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/captions.js +68 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/kit.js +345 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/lib.js +44 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/timing.js +23 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/src/main.js +62 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/src/shots.js +195 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/tools/capture.mjs +122 -0
- package/plugins/aiinsight-shorts/styles/inside-out/example/tools/mix.py +172 -0
- package/plugins/aiinsight-shorts/styles/inside-out/style-sheet.png +0 -0
- package/plugins/aiinsight-shorts/styles/night-file/STYLE.md +36 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/data/cues.json +146 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/data/lines.json +73 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/data/words.json +572 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/data/words.txt +95 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/fonts/FreeMonoBold.ttf +0 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/fonts/Inter-Black.otf +0 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/index.html +18 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/script.json +26 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/sheet.html +13 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/board.js +62 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/captions.js +49 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/engine.js +65 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/human.js +128 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/kit.js +151 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/lib.js +44 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/sdf.js +79 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/sets3d.js +106 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/core/timing.js +23 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/main.js +56 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/sheet.js +86 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/src/shots.js +130 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/tools/capture.mjs +122 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/tools/mix.py +172 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/LICENSE-three.txt +21 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/environments/RoomEnvironment.js +144 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/BokehPass.js +141 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/MaskPass.js +104 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/OutputPass.js +97 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/Pass.js +95 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/RenderPass.js +99 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/BokehShader.js +145 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/CopyShader.js +45 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/OutputShader.js +85 -0
- package/plugins/aiinsight-shorts/styles/night-file/example/vendor/three.module.js +6 -0
- package/plugins/aiinsight-shorts/styles/night-file/style-sheet.png +0 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/STYLE.md +30 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/cues.json +167 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/lines.json +67 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/words.json +614 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/words.txt +102 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/fonts/Caladea-Bold.ttf +0 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/fonts/Inter-Black.otf +0 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/index.html +15 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/script.json +26 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/sheet.html +12 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/board.js +62 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/captions.js +47 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/kit.js +152 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/lib.js +44 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/timing.js +23 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/main.js +62 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/sheet.js +61 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/shots.js +139 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/tools/capture.mjs +122 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/example/tools/mix.py +172 -0
- package/plugins/aiinsight-shorts/styles/paper-atlas/style-sheet.png +0 -0
- package/plugins/aiinsight-shorts/styles/stick-story/STYLE.md +32 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/data/cues.json +182 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/data/lines.json +79 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/data/words.json +662 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/data/words.txt +110 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/fonts/Inter-Black.otf +0 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/fonts/Inter-ExtraBold.otf +0 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/index.html +13 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/script.json +27 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/sheet.html +10 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/board.js +62 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/captions.js +47 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/kit.js +166 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/lib.js +44 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/timing.js +23 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/main.js +62 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/sheet.js +64 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/src/shots.js +148 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/tools/capture.mjs +122 -0
- package/plugins/aiinsight-shorts/styles/stick-story/example/tools/mix.py +172 -0
- package/plugins/aiinsight-shorts/styles/stick-story/style-sheet.png +0 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/STYLE.md +51 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/data/cues.json +271 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/data/lines.json +127 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/data/words.json +908 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/data/words.txt +151 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Caladea-Bold.ttf +0 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Inter-Black.otf +0 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Inter-ExtraBold.otf +0 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/index.html +19 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/script.json +37 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/sheet.html +13 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/board.js +62 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/captions.js +56 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/engine.js +65 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/lib.js +44 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/props.js +166 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/timing.js +23 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/toon.js +352 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/world.js +340 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/main.js +56 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/sheet.js +99 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/src/shots.js +377 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/tools/capture.mjs +122 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/tools/mix.py +204 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/LICENSE-three.txt +21 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/environments/RoomEnvironment.js +144 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/BokehPass.js +141 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/MaskPass.js +104 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/OutputPass.js +97 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/Pass.js +95 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/RenderPass.js +99 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/BokehShader.js +145 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/CopyShader.js +45 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/OutputShader.js +85 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/three.module.js +6 -0
- package/plugins/aiinsight-shorts/styles/tall-tale/style-sheet.png +0 -0
- package/plugins/faceless-shorts/README.md +34 -0
- package/plugins/faceless-shorts/SKILL.md +124 -0
- package/plugins/faceless-shorts/styles/deep-dive/STYLE.md +58 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/data/cues.json +140 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/data/lines.json +67 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/data/words.json +614 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/data/words.txt +102 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/fonts/Inter-Black.otf +0 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/fonts/Inter-ExtraBold.otf +0 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/index.html +16 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/script.json +27 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/sheet.html +10 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/board.js +62 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/captions.js +68 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/engine.js +65 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/human.js +128 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/lib.js +44 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/look2d.js +33 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/sdf.js +79 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/sets.js +107 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/core/timing.js +23 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/main.js +56 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/sheet.js +79 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/src/shots.js +136 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/tools/capture.mjs +122 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/tools/mix.py +172 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/LICENSE-three.txt +21 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/environments/RoomEnvironment.js +144 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/BokehPass.js +141 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/MaskPass.js +104 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/OutputPass.js +97 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/Pass.js +95 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/RenderPass.js +99 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/BokehShader.js +145 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/CopyShader.js +45 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/OutputShader.js +85 -0
- package/plugins/faceless-shorts/styles/deep-dive/example/vendor/three.module.js +6 -0
- package/plugins/faceless-shorts/styles/deep-dive/style-sheet.png +0 -0
- package/plugins/faceless-shorts/styles/inside-out/STYLE.md +97 -0
- package/plugins/faceless-shorts/styles/inside-out/example/data/cues.json +178 -0
- package/plugins/faceless-shorts/styles/inside-out/example/data/lines.json +73 -0
- package/plugins/faceless-shorts/styles/inside-out/example/data/words.json +662 -0
- package/plugins/faceless-shorts/styles/inside-out/example/fonts/Inter-Black.otf +0 -0
- package/plugins/faceless-shorts/styles/inside-out/example/index.html +16 -0
- package/plugins/faceless-shorts/styles/inside-out/example/script.json +26 -0
- package/plugins/faceless-shorts/styles/inside-out/example/src/core/captions.js +68 -0
- package/plugins/faceless-shorts/styles/inside-out/example/src/core/kit.js +345 -0
- package/plugins/faceless-shorts/styles/inside-out/example/src/core/lib.js +44 -0
- package/plugins/faceless-shorts/styles/inside-out/example/src/core/timing.js +23 -0
- package/plugins/faceless-shorts/styles/inside-out/example/src/main.js +62 -0
- package/plugins/faceless-shorts/styles/inside-out/example/src/shots.js +195 -0
- package/plugins/faceless-shorts/styles/inside-out/example/tools/capture.mjs +122 -0
- package/plugins/faceless-shorts/styles/inside-out/example/tools/mix.py +172 -0
- package/plugins/faceless-shorts/styles/inside-out/style-sheet.png +0 -0
- package/plugins/faceless-shorts/styles/night-file/STYLE.md +36 -0
- package/plugins/faceless-shorts/styles/night-file/example/data/cues.json +146 -0
- package/plugins/faceless-shorts/styles/night-file/example/data/lines.json +73 -0
- package/plugins/faceless-shorts/styles/night-file/example/data/words.json +572 -0
- package/plugins/faceless-shorts/styles/night-file/example/data/words.txt +95 -0
- package/plugins/faceless-shorts/styles/night-file/example/fonts/FreeMonoBold.ttf +0 -0
- package/plugins/faceless-shorts/styles/night-file/example/fonts/Inter-Black.otf +0 -0
- package/plugins/faceless-shorts/styles/night-file/example/index.html +16 -0
- package/plugins/faceless-shorts/styles/night-file/example/script.json +26 -0
- package/plugins/faceless-shorts/styles/night-file/example/sheet.html +11 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/board.js +62 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/captions.js +49 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/engine.js +65 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/human.js +128 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/kit.js +151 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/lib.js +44 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/sdf.js +79 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/sets3d.js +106 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/core/timing.js +23 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/main.js +56 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/sheet.js +86 -0
- package/plugins/faceless-shorts/styles/night-file/example/src/shots.js +130 -0
- package/plugins/faceless-shorts/styles/night-file/example/tools/capture.mjs +122 -0
- package/plugins/faceless-shorts/styles/night-file/example/tools/mix.py +172 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/LICENSE-three.txt +21 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/environments/RoomEnvironment.js +144 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/BokehPass.js +141 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/MaskPass.js +104 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/OutputPass.js +97 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/Pass.js +95 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/RenderPass.js +99 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/BokehShader.js +145 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/CopyShader.js +45 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/OutputShader.js +85 -0
- package/plugins/faceless-shorts/styles/night-file/example/vendor/three.module.js +6 -0
- package/plugins/faceless-shorts/styles/night-file/style-sheet.png +0 -0
- package/plugins/faceless-shorts/styles/paper-atlas/STYLE.md +30 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/data/cues.json +167 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/data/lines.json +67 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/data/words.json +614 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/data/words.txt +102 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/fonts/Caladea-Bold.ttf +0 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/fonts/Inter-Black.otf +0 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/index.html +13 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/script.json +26 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/sheet.html +10 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/board.js +62 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/captions.js +47 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/kit.js +152 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/lib.js +44 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/timing.js +23 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/main.js +62 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/sheet.js +61 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/src/shots.js +139 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/tools/capture.mjs +122 -0
- package/plugins/faceless-shorts/styles/paper-atlas/example/tools/mix.py +172 -0
- package/plugins/faceless-shorts/styles/paper-atlas/style-sheet.png +0 -0
- package/plugins/faceless-shorts/styles/stick-story/STYLE.md +32 -0
- package/plugins/faceless-shorts/styles/stick-story/example/data/cues.json +182 -0
- package/plugins/faceless-shorts/styles/stick-story/example/data/lines.json +79 -0
- package/plugins/faceless-shorts/styles/stick-story/example/data/words.json +662 -0
- package/plugins/faceless-shorts/styles/stick-story/example/data/words.txt +110 -0
- package/plugins/faceless-shorts/styles/stick-story/example/fonts/Inter-Black.otf +0 -0
- package/plugins/faceless-shorts/styles/stick-story/example/fonts/Inter-ExtraBold.otf +0 -0
- package/plugins/faceless-shorts/styles/stick-story/example/index.html +12 -0
- package/plugins/faceless-shorts/styles/stick-story/example/script.json +27 -0
- package/plugins/faceless-shorts/styles/stick-story/example/sheet.html +9 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/core/board.js +62 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/core/captions.js +47 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/core/kit.js +166 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/core/lib.js +44 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/core/timing.js +23 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/main.js +62 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/sheet.js +64 -0
- package/plugins/faceless-shorts/styles/stick-story/example/src/shots.js +148 -0
- package/plugins/faceless-shorts/styles/stick-story/example/tools/capture.mjs +122 -0
- package/plugins/faceless-shorts/styles/stick-story/example/tools/mix.py +172 -0
- package/plugins/faceless-shorts/styles/stick-story/style-sheet.png +0 -0
- package/plugins/faceless-shorts/styles/tall-tale/STYLE.md +51 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/data/cues.json +271 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/data/lines.json +127 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/data/words.json +908 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/data/words.txt +151 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Caladea-Bold.ttf +0 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Inter-Black.otf +0 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Inter-ExtraBold.otf +0 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/index.html +17 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/script.json +37 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/sheet.html +11 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/board.js +62 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/captions.js +56 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/engine.js +65 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/lib.js +44 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/props.js +166 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/timing.js +23 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/toon.js +352 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/core/world.js +340 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/main.js +56 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/sheet.js +99 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/src/shots.js +377 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/tools/capture.mjs +122 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/tools/mix.py +204 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/LICENSE-three.txt +21 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/environments/RoomEnvironment.js +144 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/BokehPass.js +141 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/MaskPass.js +104 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/OutputPass.js +97 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/Pass.js +95 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/RenderPass.js +99 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/BokehShader.js +145 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/CopyShader.js +45 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/OutputShader.js +85 -0
- package/plugins/faceless-shorts/styles/tall-tale/example/vendor/three.module.js +6 -0
- package/plugins/faceless-shorts/styles/tall-tale/style-sheet.png +0 -0
- package/plugins/motion-styles/LIBRARY.md +896 -0
- package/plugins/motion-styles/README.md +29 -0
- package/plugins/motion-styles/SKILL.md +70 -0
- package/plugins/motion-styles/catalog.json +2253 -0
- package/plugins/motion-styles/prompts/bio-glow.md +149 -0
- package/plugins/motion-styles/prompts/blueprint.md +145 -0
- package/plugins/motion-styles/prompts/breaking-desk.md +147 -0
- package/plugins/motion-styles/prompts/callout-kit.md +147 -0
- package/plugins/motion-styles/prompts/chalk-talk.md +153 -0
- package/plugins/motion-styles/prompts/chat-story.md +143 -0
- package/plugins/motion-styles/prompts/clay-diorama.md +149 -0
- package/plugins/motion-styles/prompts/clean-tech.md +147 -0
- package/plugins/motion-styles/prompts/comic-panels.md +145 -0
- package/plugins/motion-styles/prompts/cosmic-scale.md +147 -0
- package/plugins/motion-styles/prompts/creator-motion.md +149 -0
- package/plugins/motion-styles/prompts/data-city.md +149 -0
- package/plugins/motion-styles/prompts/data-story.md +147 -0
- package/plugins/motion-styles/prompts/deep-layers.md +147 -0
- package/plugins/motion-styles/prompts/doc-cinema.md +145 -0
- package/plugins/motion-styles/prompts/evidence-board.md +145 -0
- package/plugins/motion-styles/prompts/exploded-view.md +149 -0
- package/plugins/motion-styles/prompts/glass-icons.md +147 -0
- package/plugins/motion-styles/prompts/glitch-pack.md +145 -0
- package/plugins/motion-styles/prompts/globe-arcs.md +147 -0
- package/plugins/motion-styles/prompts/headline-backdrop.md +145 -0
- package/plugins/motion-styles/prompts/iso-cutaway.md +147 -0
- package/plugins/motion-styles/prompts/isotype.md +145 -0
- package/plugins/motion-styles/prompts/karaoke-subs.md +145 -0
- package/plugins/motion-styles/prompts/low-poly-atlas.md +149 -0
- package/plugins/motion-styles/prompts/lower-thirds.md +147 -0
- package/plugins/motion-styles/prompts/marker-board.md +145 -0
- package/plugins/motion-styles/prompts/market-tape.md +145 -0
- package/plugins/motion-styles/prompts/math-canvas.md +145 -0
- package/plugins/motion-styles/prompts/myth-or-fact.md +145 -0
- package/plugins/motion-styles/prompts/neon-line.md +145 -0
- package/plugins/motion-styles/prompts/paper-craft.md +145 -0
- package/plugins/motion-styles/prompts/parchment-map.md +147 -0
- package/plugins/motion-styles/prompts/physics-toybox.md +147 -0
- package/plugins/motion-styles/prompts/pixel-quest.md +145 -0
- package/plugins/motion-styles/prompts/podcast-clip.md +147 -0
- package/plugins/motion-styles/prompts/pop-info.md +145 -0
- package/plugins/motion-styles/prompts/product-turntable.md +149 -0
- package/plugins/motion-styles/prompts/punch-captions.md +145 -0
- package/plugins/motion-styles/prompts/quiz-countdown.md +145 -0
- package/plugins/motion-styles/prompts/quote-cinema.md +145 -0
- package/plugins/motion-styles/prompts/recipe-steps.md +145 -0
- package/plugins/motion-styles/prompts/rubber-hose-reel.md +145 -0
- package/plugins/motion-styles/prompts/shadow-puppets.md +145 -0
- package/plugins/motion-styles/prompts/size-lineup.md +149 -0
- package/plugins/motion-styles/prompts/software-walkthrough.md +147 -0
- package/plugins/motion-styles/prompts/stack-split.md +145 -0
- package/plugins/motion-styles/prompts/sticker-pop.md +145 -0
- package/plugins/motion-styles/prompts/storybook.md +145 -0
- package/plugins/motion-styles/prompts/swiss-grid.md +145 -0
- package/plugins/motion-styles/prompts/synth-grid.md +147 -0
- package/plugins/motion-styles/prompts/tactics-board.md +145 -0
- package/plugins/motion-styles/prompts/terminal.md +145 -0
- package/plugins/motion-styles/prompts/tier-list.md +143 -0
- package/plugins/motion-styles/prompts/timeline-rail.md +145 -0
- package/plugins/motion-styles/prompts/top-5-countdown.md +145 -0
- package/plugins/motion-styles/prompts/versus-split.md +145 -0
- package/plugins/motion-styles/prompts/vhs-camcorder.md +145 -0
- package/plugins/motion-styles/prompts/visual-novel.md +145 -0
- package/plugins/motion-styles/prompts/warm-canvas.md +145 -0
- package/plugins/motion-styles/prompts/woodcut-tale.md +145 -0
- package/plugins/motion-styles/prompts/zine-collage.md +145 -0
- package/plugins/motion-styles/sources/bio-glow.html +639 -0
- package/plugins/motion-styles/sources/blueprint.html +617 -0
- package/plugins/motion-styles/sources/breaking-desk.html +585 -0
- package/plugins/motion-styles/sources/callout-kit.html +586 -0
- package/plugins/motion-styles/sources/chalk-talk.html +597 -0
- package/plugins/motion-styles/sources/chat-story.html +597 -0
- package/plugins/motion-styles/sources/clay-diorama.html +681 -0
- package/plugins/motion-styles/sources/clean-tech.html +554 -0
- package/plugins/motion-styles/sources/comic-panels.html +608 -0
- package/plugins/motion-styles/sources/cosmic-scale.html +628 -0
- package/plugins/motion-styles/sources/creator-motion.html +805 -0
- package/plugins/motion-styles/sources/data-city.html +613 -0
- package/plugins/motion-styles/sources/data-story.html +539 -0
- package/plugins/motion-styles/sources/deep-layers.html +624 -0
- package/plugins/motion-styles/sources/doc-cinema.html +590 -0
- package/plugins/motion-styles/sources/evidence-board.html +610 -0
- package/plugins/motion-styles/sources/exploded-view.html +618 -0
- package/plugins/motion-styles/sources/glass-icons.html +612 -0
- package/plugins/motion-styles/sources/glitch-pack.html +583 -0
- package/plugins/motion-styles/sources/globe-arcs.html +621 -0
- package/plugins/motion-styles/sources/headline-backdrop.html +584 -0
- package/plugins/motion-styles/sources/iso-cutaway.html +621 -0
- package/plugins/motion-styles/sources/isotype.html +588 -0
- package/plugins/motion-styles/sources/karaoke-subs.html +577 -0
- package/plugins/motion-styles/sources/low-poly-atlas.html +621 -0
- package/plugins/motion-styles/sources/lower-thirds.html +582 -0
- package/plugins/motion-styles/sources/marker-board.html +598 -0
- package/plugins/motion-styles/sources/market-tape.html +598 -0
- package/plugins/motion-styles/sources/math-canvas.html +592 -0
- package/plugins/motion-styles/sources/myth-or-fact.html +587 -0
- package/plugins/motion-styles/sources/neon-line.html +597 -0
- package/plugins/motion-styles/sources/paper-craft.html +612 -0
- package/plugins/motion-styles/sources/parchment-map.html +624 -0
- package/plugins/motion-styles/sources/physics-toybox.html +617 -0
- package/plugins/motion-styles/sources/pixel-quest.html +609 -0
- package/plugins/motion-styles/sources/podcast-clip.html +585 -0
- package/plugins/motion-styles/sources/pop-info.html +677 -0
- package/plugins/motion-styles/sources/product-turntable.html +611 -0
- package/plugins/motion-styles/sources/punch-captions.html +583 -0
- package/plugins/motion-styles/sources/quiz-countdown.html +593 -0
- package/plugins/motion-styles/sources/quote-cinema.html +581 -0
- package/plugins/motion-styles/sources/recipe-steps.html +599 -0
- package/plugins/motion-styles/sources/rubber-hose-reel.html +627 -0
- package/plugins/motion-styles/sources/shadow-puppets.html +609 -0
- package/plugins/motion-styles/sources/size-lineup.html +620 -0
- package/plugins/motion-styles/sources/software-walkthrough.html +651 -0
- package/plugins/motion-styles/sources/stack-split.html +588 -0
- package/plugins/motion-styles/sources/sticker-pop.html +587 -0
- package/plugins/motion-styles/sources/storybook.html +600 -0
- package/plugins/motion-styles/sources/swiss-grid.html +590 -0
- package/plugins/motion-styles/sources/synth-grid.html +614 -0
- package/plugins/motion-styles/sources/tactics-board.html +608 -0
- package/plugins/motion-styles/sources/terminal.html +593 -0
- package/plugins/motion-styles/sources/tier-list.html +600 -0
- package/plugins/motion-styles/sources/timeline-rail.html +598 -0
- package/plugins/motion-styles/sources/top-5-countdown.html +589 -0
- package/plugins/motion-styles/sources/versus-split.html +592 -0
- package/plugins/motion-styles/sources/vhs-camcorder.html +587 -0
- package/plugins/motion-styles/sources/visual-novel.html +623 -0
- package/plugins/motion-styles/sources/warm-canvas.html +742 -0
- package/plugins/motion-styles/sources/woodcut-tale.html +598 -0
- package/plugins/motion-styles/sources/zine-collage.html +594 -0
- package/plugins/video-pipeline/.claude-plugin/plugin.json +2 -2
- package/plugins/video-pipeline/skills/.upstream-skills.json +156 -143
- package/plugins/video-pipeline/skills/video-pipeline/references/mcp-tools.md +3 -3
- package/scripts/deep-validate.js +3 -2
- package/src/audio-mixer/mixer.js +69 -0
- package/src/cli/make.js +19 -0
- package/src/harness/lib/browser.mjs +22 -1
- package/src/harness/lib/capture.mjs +33 -11
- package/src/harness/lib/jobs.mjs +16 -1
- package/src/mcp-server/server.js +726 -10
- package/src/pipeline/providers.js +77 -17
- package/src/skills/sync-upstream.js +15 -3
- package/src/utils/media-downloader.js +7 -0
- package/src/utils/tool-installer.js +212 -0
- package/src/utils/transcribe.js +9 -1
- package/src/video-renderer/renderer.js +68 -38
- package/src/video-renderer/scene-animator.js +50 -15
- package/src/workflows/assets.js +49 -5
- package/src/workflows/render.js +2 -0
- 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.
|
|
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": "
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
122
|
-
"status": "synced"
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
"
|
|
133
|
-
"
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
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.
|
|
407
|
-
"totalRepos":
|
|
408
|
-
"syncedCount":
|
|
406
|
+
"manifestVersion": "2.7.7",
|
|
407
|
+
"totalRepos": 11,
|
|
408
|
+
"syncedCount": 11,
|
|
409
409
|
"repos": [
|
|
410
410
|
{
|
|
411
411
|
"id": "hyperframes",
|
package/scripts/deep-validate.js
CHANGED
|
@@ -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.
|
|
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.
|
|
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 ────────────────────────────────────────────────
|
package/src/audio-mixer/mixer.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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 <
|
|
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
|
-
|
|
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
|
-
|
|
212
|
-
|
|
213
|
-
|
|
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
|
}
|
package/src/harness/lib/jobs.mjs
CHANGED
|
@@ -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
|
-
|
|
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);
|