@mevdragon/vidfarm-devcli 0.13.0 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/embedded-captions/CATALOG.md +93 -0
- package/.agents/skills/embedded-captions/SKILL.md +286 -0
- package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
- package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
- package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/.agents/skills/embedded-captions/dna/README.md +148 -0
- package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
- package/.agents/skills/embedded-captions/dna/cream.json +69 -0
- package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
- package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
- package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
- package/.agents/skills/embedded-captions/dna/ink.json +65 -0
- package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
- package/.agents/skills/embedded-captions/dna/loud.json +75 -0
- package/.agents/skills/embedded-captions/dna/neon.json +58 -0
- package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
- package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
- package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
- package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/.agents/skills/embedded-captions/references/rail.md +68 -0
- package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
- package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
- package/.agents/skills/embedded-captions/references/test-set.md +66 -0
- package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
- package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
- package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
- package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
- package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
- package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
- package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
- package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
- package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
- package/.agents/skills/embedded-captions/themes/README.md +244 -0
- package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
- package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
- package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
- package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
- package/.agents/skills/embedded-captions/themes/brush.json +74 -0
- package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
- package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
- package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
- package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
- package/.agents/skills/embedded-captions/themes/laser.json +46 -0
- package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
- package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
- package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
- package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
- package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
- package/.agents/skills/embedded-captions/themes/popup.json +46 -0
- package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
- package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
- package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
- package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
- package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
- package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
- package/.agents/skills/embedded-captions/themes/transit.json +44 -0
- package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
- package/.agents/skills/faceless-explainer/SKILL.md +209 -0
- package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
- package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
- package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
- package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
- package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
- package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
- package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
- package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/flockposter/LICENSE +17 -0
- package/.agents/skills/flockposter/README.md +72 -0
- package/.agents/skills/flockposter/SKILL.md +562 -0
- package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
- package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
- package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
- package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
- package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
- package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
- package/.agents/skills/general-video/SKILL.md +143 -0
- package/.agents/skills/hyperframes/SKILL.md +160 -0
- package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
- package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
- package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
- package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
- package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
- package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
- package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
- package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
- package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
- package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
- package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
- package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
- package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
- package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
- package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
- package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
- package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
- package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
- package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
- package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
- package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
- package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
- package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
- package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
- package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
- package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
- package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
- package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
- package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
- package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
- package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
- package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
- package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
- package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
- package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
- package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
- package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
- package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
- package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
- package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
- package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
- package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
- package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
- package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-animation/techniques.md +507 -0
- package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
- package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
- package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
- package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
- package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
- package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
- package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
- package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
- package/.agents/skills/hyperframes-core/SKILL.md +78 -0
- package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
- package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
- package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
- package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
- package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
- package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
- package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
- package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
- package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
- package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
- package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
- package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
- package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
- package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
- package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
- package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
- package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
- package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
- package/.agents/skills/motion-graphics/SKILL.md +172 -0
- package/.agents/skills/motion-graphics/agents/builder.md +40 -0
- package/.agents/skills/motion-graphics/agents/director.md +53 -0
- package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
- package/.agents/skills/motion-graphics/catalog-map.md +40 -0
- package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
- package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
- package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
- package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
- package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
- package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
- package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/.agents/skills/product-launch-video/SKILL.md +208 -0
- package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
- package/.agents/skills/product-launch-video/references/story-design.md +373 -0
- package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
- package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
- package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
- package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
- package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
- package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/slideshow/SKILL.md +550 -0
- package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
- package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
- package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
- package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/.agents/skills/vidfarm-media/SKILL.md +85 -0
- package/.agents/skills/vidfarm-media/references/tts.md +54 -0
- package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
- package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
- package/.agents/skills/website-to-video/SKILL.md +145 -0
- package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
- package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
- package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
- package/.agents/skills/website-to-video/references/capabilities.md +713 -0
- package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
- package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
- package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
- package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
- package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
- package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
- package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
- package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
- package/SKILL.director.md +60 -4
- package/SKILL.platform.md +7 -2
- package/demo/dist/app.css +1 -1
- package/demo/dist/app.js +485 -86
- package/dist/src/account-pages-legacy.js +9 -14
- package/dist/src/app.js +659 -159
- package/dist/src/cli.js +618 -17
- package/dist/src/composition-runtime.js +286 -6
- package/dist/src/devcli/composition-edit.js +176 -8
- package/dist/src/devcli/doctor.js +192 -0
- package/dist/src/devcli/hyperframes-cli.js +118 -0
- package/dist/src/devcli/skills.js +476 -0
- package/dist/src/devcli/stills.js +249 -0
- package/dist/src/devcli/transitions.js +205 -0
- package/dist/src/editor-chat.js +260 -4
- package/dist/src/frontend/template-editor-chat.js +6 -5
- package/dist/src/homepage.js +2 -48
- package/dist/src/hyperframes/composition.js +188 -7
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/hyperframes.js +127 -28
- package/dist/src/services/serverless-records.js +7 -0
- package/dist/src/template-editor-shell.js +87 -48
- package/package.json +2 -1
- package/public/assets/page-runtime-client-app.js +31 -31
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
// `vidfarm stills` — render PNG still frames of the CURRENT composition
|
|
2
|
+
// in-process, without a full MP4 render. This is the coding agent's visual
|
|
3
|
+
// self-verification loop: edit composition.html, render 3-8 stills, look at
|
|
4
|
+
// them, iterate.
|
|
5
|
+
//
|
|
6
|
+
// Implementation mirrors HyperframesService.renderStill (src/services/
|
|
7
|
+
// hyperframes.ts): stage the composition as a HyperFrames project dir, drive
|
|
8
|
+
// @hyperframes/producer's createRenderJob/executeRenderJob with the
|
|
9
|
+
// "png-sequence" format, then pick the captured frames nearest each requested
|
|
10
|
+
// timestamp. Deliberately NOT importing HyperframesService — that class drags
|
|
11
|
+
// in config.ts (which mkdirs at import) and the whole cloud-render surface;
|
|
12
|
+
// this is a lean local-file implementation.
|
|
13
|
+
//
|
|
14
|
+
// Cost control: png-sequence captures EVERY frame on the fps grid, so we
|
|
15
|
+
// (a) cap the staged composition's duration at the last requested timestamp
|
|
16
|
+
// and (b) render on a coarse integer fps grid (4fps → 0.25s accuracy, dropped
|
|
17
|
+
// to 2/1fps for long timelines) instead of the composition's native 30fps.
|
|
18
|
+
// Requested timestamps are snapped to that grid; the actually-captured time
|
|
19
|
+
// is reported next to each written PNG.
|
|
20
|
+
import { copyFileSync, cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
21
|
+
import os from "node:os";
|
|
22
|
+
import path from "node:path";
|
|
23
|
+
import { parseHTML } from "linkedom";
|
|
24
|
+
import { inspectComposition } from "./composition-edit.js";
|
|
25
|
+
const MAX_DEFAULT_STILLS = 8;
|
|
26
|
+
const MAX_GRID_FRAMES = 600;
|
|
27
|
+
// The in-process producer shells out to ffmpeg/ffprobe resolved from
|
|
28
|
+
// HYPERFRAMES_FFMPEG_PATH / HYPERFRAMES_FFPROBE_PATH (then PATH). Point it at
|
|
29
|
+
// the bundled static binaries, same as src/services/hyperframes.ts does.
|
|
30
|
+
async function ensureProducerFfmpegEnv() {
|
|
31
|
+
if (!process.env.HYPERFRAMES_FFMPEG_PATH?.trim()) {
|
|
32
|
+
try {
|
|
33
|
+
const mod = (await import("ffmpeg-static"));
|
|
34
|
+
const resolved = typeof mod === "string" ? mod : mod.default;
|
|
35
|
+
if (typeof resolved === "string" && resolved && existsSync(resolved)) {
|
|
36
|
+
process.env.HYPERFRAMES_FFMPEG_PATH = resolved;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch { /* PATH fallback */ }
|
|
40
|
+
}
|
|
41
|
+
if (!process.env.HYPERFRAMES_FFPROBE_PATH?.trim()) {
|
|
42
|
+
try {
|
|
43
|
+
const mod = (await import("ffprobe-static"));
|
|
44
|
+
const resolved = (mod.path ?? mod.default?.path);
|
|
45
|
+
if (typeof resolved === "string" && resolved && existsSync(resolved)) {
|
|
46
|
+
process.env.HYPERFRAMES_FFPROBE_PATH = resolved;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
catch { /* PATH fallback */ }
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Default timestamps when --at is omitted: the midpoint of each distinct
|
|
54
|
+
* scene clip on the LOWEST video track (capped at 8), else 0 / mid / end of
|
|
55
|
+
* the composition.
|
|
56
|
+
*/
|
|
57
|
+
export function defaultStillTimestamps(layers, durationSeconds) {
|
|
58
|
+
const isSceneClip = (layer) => layer.duration > 0 && (layer.is_timeline_proxy ||
|
|
59
|
+
layer.kind === "video" ||
|
|
60
|
+
layer.kind === "scene" ||
|
|
61
|
+
(layer.src !== null && /\.(mp4|mov|webm|m4v|mkv)(\?|#|$)/i.test(layer.src)) ||
|
|
62
|
+
// Canvas-filling clips of any kind read as scenes (image scenes,
|
|
63
|
+
// solid/title cards) — overlays/captions are never full-canvas.
|
|
64
|
+
layer.is_full_canvas);
|
|
65
|
+
const scenes = layers.filter(isSceneClip);
|
|
66
|
+
if (scenes.length > 0) {
|
|
67
|
+
const lowestTrack = Math.min(...scenes.map((layer) => layer.track));
|
|
68
|
+
const seen = new Set();
|
|
69
|
+
const midpoints = [];
|
|
70
|
+
for (const layer of scenes.filter((l) => l.track === lowestTrack).sort((a, b) => a.start - b.start)) {
|
|
71
|
+
const key = layer.key || `${layer.start}-${layer.duration}`;
|
|
72
|
+
if (seen.has(key))
|
|
73
|
+
continue;
|
|
74
|
+
seen.add(key);
|
|
75
|
+
midpoints.push(layer.start + layer.duration / 2);
|
|
76
|
+
if (midpoints.length >= MAX_DEFAULT_STILLS)
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
if (midpoints.length > 0)
|
|
80
|
+
return midpoints;
|
|
81
|
+
}
|
|
82
|
+
if (durationSeconds <= 0)
|
|
83
|
+
return [0];
|
|
84
|
+
return [...new Set([0, durationSeconds / 2, Math.max(0, durationSeconds - 0.5)])];
|
|
85
|
+
}
|
|
86
|
+
// Pick the coarsest integer fps grid that keeps capture cheap while staying
|
|
87
|
+
// within 0.25s of any requested timestamp where possible.
|
|
88
|
+
function pickGridFps(maxTimestamp) {
|
|
89
|
+
for (const fps of [4, 2, 1]) {
|
|
90
|
+
if ((maxTimestamp + 1) * fps <= MAX_GRID_FRAMES)
|
|
91
|
+
return fps;
|
|
92
|
+
}
|
|
93
|
+
return 1;
|
|
94
|
+
}
|
|
95
|
+
// Cap the staged copy's root data-duration so the producer never captures
|
|
96
|
+
// frames past the last requested still.
|
|
97
|
+
function capCompositionDuration(html, capSeconds) {
|
|
98
|
+
const { document } = parseHTML(html);
|
|
99
|
+
const root = document.querySelector("[data-composition-id]");
|
|
100
|
+
if (!root)
|
|
101
|
+
throw new Error("Composition root ([data-composition-id]) not found in composition.html.");
|
|
102
|
+
const existing = Number.parseFloat(root.getAttribute("data-duration") ?? "");
|
|
103
|
+
const capped = Number.isFinite(existing) && existing > 0 ? Math.min(existing, capSeconds) : capSeconds;
|
|
104
|
+
root.setAttribute("data-duration", String(Number(capped.toFixed(3))));
|
|
105
|
+
return `<!doctype html>\n${document.documentElement.outerHTML}`;
|
|
106
|
+
}
|
|
107
|
+
// Same guard as renderLocal: libx264-adjacent tooling (and the runtime's
|
|
108
|
+
// canvas sizing) prefers even data-width/data-height.
|
|
109
|
+
function forceEvenDimensions(html) {
|
|
110
|
+
return html.replace(/\bdata-(width|height)=(["'])(\d+)\2/gi, (match, dim, quote, value) => {
|
|
111
|
+
const n = Number.parseInt(value, 10);
|
|
112
|
+
if (!Number.isFinite(n) || n % 2 === 0)
|
|
113
|
+
return match;
|
|
114
|
+
return `data-${dim}=${quote}${n - 1}${quote}`;
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Stage the composition as a HyperFrames project dir: the (duration-capped)
|
|
119
|
+
* composition.html becomes index.html, and every sibling file/dir is copied in
|
|
120
|
+
* so relative asset references keep resolving. Mirrors stageProject in
|
|
121
|
+
* src/services/hyperframes.ts, but against a local composition dir.
|
|
122
|
+
*/
|
|
123
|
+
function stageCompositionProject(htmlPath, stagedHtml) {
|
|
124
|
+
const sourceDir = path.dirname(htmlPath);
|
|
125
|
+
const projectDir = mkdtempSync(path.join(os.tmpdir(), "vidfarm-stills-"));
|
|
126
|
+
writeFileSync(path.join(projectDir, "index.html"), stagedHtml, "utf8");
|
|
127
|
+
for (const entry of readdirSync(sourceDir)) {
|
|
128
|
+
if (entry === path.basename(htmlPath) || entry === "index.html" || entry === "stills")
|
|
129
|
+
continue;
|
|
130
|
+
const from = path.join(sourceDir, entry);
|
|
131
|
+
try {
|
|
132
|
+
const info = statSync(from);
|
|
133
|
+
if (info.isDirectory()) {
|
|
134
|
+
cpSync(from, path.join(projectDir, entry), { recursive: true, force: true });
|
|
135
|
+
}
|
|
136
|
+
else if (info.isFile()) {
|
|
137
|
+
copyFileSync(from, path.join(projectDir, entry));
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
// best-effort: a missing/unreadable sibling never blocks the stills
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return projectDir;
|
|
145
|
+
}
|
|
146
|
+
export async function renderCompositionStills(input) {
|
|
147
|
+
const html = readFileSync(input.htmlPath, "utf8");
|
|
148
|
+
if (!html.includes("data-composition-id=")) {
|
|
149
|
+
throw new Error(`stills requires composition HTML with data-composition-id (${input.htmlPath}).`);
|
|
150
|
+
}
|
|
151
|
+
const info = inspectComposition(html);
|
|
152
|
+
const durationSeconds = info.duration_seconds > 0 ? info.duration_seconds : 1;
|
|
153
|
+
const requested = (input.at && input.at.length > 0
|
|
154
|
+
? input.at
|
|
155
|
+
: defaultStillTimestamps(info.layers, durationSeconds))
|
|
156
|
+
.map((t) => Math.min(Math.max(0, t), Math.max(0, durationSeconds - 0.01)))
|
|
157
|
+
.sort((a, b) => a - b);
|
|
158
|
+
if (requested.length === 0)
|
|
159
|
+
throw new Error("stills: no timestamps to render.");
|
|
160
|
+
const gridFps = pickGridFps(requested[requested.length - 1]);
|
|
161
|
+
const capSeconds = Math.min(durationSeconds, requested[requested.length - 1] + 2 / gridFps);
|
|
162
|
+
await ensureProducerFfmpegEnv();
|
|
163
|
+
const stagedHtml = forceEvenDimensions(capCompositionDuration(html, capSeconds));
|
|
164
|
+
const projectDir = stageCompositionProject(input.htmlPath, stagedHtml);
|
|
165
|
+
const framesDir = mkdtempSync(path.join(os.tmpdir(), "vidfarm-stills-frames-"));
|
|
166
|
+
const outDir = path.resolve(input.outDir ?? path.join(path.dirname(input.htmlPath), "stills"));
|
|
167
|
+
mkdirSync(outDir, { recursive: true });
|
|
168
|
+
// Declarative vidfarm compositions carry no scripts (cloud saves strip
|
|
169
|
+
// them), so they can never satisfy the engine's window.__timelines
|
|
170
|
+
// sub-composition poll — which otherwise stalls capture-session init for the
|
|
171
|
+
// full 45s playerReadyTimeout before proceeding anyway. When the html has no
|
|
172
|
+
// timeline registration at all, cap that wait via the engine's env knob.
|
|
173
|
+
// Compositions that DO register GSAP timelines keep the default.
|
|
174
|
+
const priorReadyTimeout = process.env.PRODUCER_PLAYER_READY_TIMEOUT_MS;
|
|
175
|
+
if (!priorReadyTimeout?.trim() && !stagedHtml.includes("__timelines")) {
|
|
176
|
+
process.env.PRODUCER_PLAYER_READY_TIMEOUT_MS = "10000";
|
|
177
|
+
}
|
|
178
|
+
try {
|
|
179
|
+
// Same producer entry points renderStill uses; "png-sequence" writes the
|
|
180
|
+
// frames dir as frame_000001.png … at 1/gridFps intervals.
|
|
181
|
+
const { createRenderJob, executeRenderJob } = await import("@hyperframes/producer");
|
|
182
|
+
// Quiet mode (--json) swaps in a no-op logger so stdout stays parseable —
|
|
183
|
+
// the producer's default logger writes progress lines to stdout.
|
|
184
|
+
const silentLogger = { error() { }, warn() { }, info() { }, debug() { } };
|
|
185
|
+
const job = createRenderJob({
|
|
186
|
+
fps: gridFps,
|
|
187
|
+
quality: "high",
|
|
188
|
+
format: "png-sequence",
|
|
189
|
+
...(input.quiet ? { logger: silentLogger } : {})
|
|
190
|
+
});
|
|
191
|
+
let lastStatus = null;
|
|
192
|
+
const executeRender = () => executeRenderJob(job, projectDir, framesDir, (progressJob) => {
|
|
193
|
+
if (!input.quiet && progressJob.status !== lastStatus) {
|
|
194
|
+
lastStatus = progressJob.status;
|
|
195
|
+
console.log(`\x1b[2m ${progressJob.status}\x1b[0m`);
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// The engine also logs init/browser lines via console.log directly (they
|
|
199
|
+
// bypass the producer logger); in quiet mode reroute console stdout to
|
|
200
|
+
// stderr for the duration of the render so stdout stays pure JSON.
|
|
201
|
+
const originalConsole = { log: console.log, info: console.info, debug: console.debug };
|
|
202
|
+
if (input.quiet) {
|
|
203
|
+
const toStderr = (...args) => {
|
|
204
|
+
process.stderr.write(`${args.map((value) => (typeof value === "string" ? value : JSON.stringify(value))).join(" ")}\n`);
|
|
205
|
+
};
|
|
206
|
+
console.log = toStderr;
|
|
207
|
+
console.info = toStderr;
|
|
208
|
+
console.debug = toStderr;
|
|
209
|
+
}
|
|
210
|
+
try {
|
|
211
|
+
await executeRender();
|
|
212
|
+
}
|
|
213
|
+
finally {
|
|
214
|
+
console.log = originalConsole.log;
|
|
215
|
+
console.info = originalConsole.info;
|
|
216
|
+
console.debug = originalConsole.debug;
|
|
217
|
+
}
|
|
218
|
+
const frameFiles = readdirSync(framesDir)
|
|
219
|
+
.filter((name) => name.toLowerCase().endsWith(".png"))
|
|
220
|
+
.sort();
|
|
221
|
+
if (frameFiles.length === 0) {
|
|
222
|
+
throw new Error("stills render produced no frames — check the composition with `vidfarm lint` first.");
|
|
223
|
+
}
|
|
224
|
+
const stills = [];
|
|
225
|
+
for (const t of requested) {
|
|
226
|
+
const frameIndex = Math.min(frameFiles.length - 1, Math.max(0, Math.round(t * gridFps)));
|
|
227
|
+
const capturedSec = Number((frameIndex / gridFps).toFixed(3));
|
|
228
|
+
const stillName = `still-${capturedSec.toFixed(2).padStart(6, "0")}s.png`;
|
|
229
|
+
const dest = path.join(outDir, stillName);
|
|
230
|
+
copyFileSync(path.join(framesDir, frameFiles[frameIndex]), dest);
|
|
231
|
+
stills.push({ requested_sec: Number(t.toFixed(3)), captured_sec: capturedSec, path: dest });
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
ok: true,
|
|
235
|
+
composition: input.htmlPath,
|
|
236
|
+
out_dir: outDir,
|
|
237
|
+
grid_fps: gridFps,
|
|
238
|
+
duration_seconds: durationSeconds,
|
|
239
|
+
stills
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
if (!priorReadyTimeout?.trim())
|
|
244
|
+
delete process.env.PRODUCER_PLAYER_READY_TIMEOUT_MS;
|
|
245
|
+
rmSync(framesDir, { recursive: true, force: true });
|
|
246
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
//# sourceMappingURL=stills.js.map
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
// devcli `vidfarm transitions …` — first-class scene transitions for a
|
|
2
|
+
// composition.html on disk. Pure local DOM edit (linkedom), no cloud, no
|
|
3
|
+
// wallet; a running `vidfarm serve` live-morphs the change into open editor
|
|
4
|
+
// tabs and `publish` pushes it like any browser edit. Same semantics as the
|
|
5
|
+
// editor's timeline chips and the AI's set_transitions action: junction
|
|
6
|
+
// transitions live as data-transition on the INCOMING clip (the stored
|
|
7
|
+
// timeline stays butt-cut — the runtime/publish normalizer grants the
|
|
8
|
+
// overlap), exit transitions as data-transition-out on the departing clip.
|
|
9
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
10
|
+
import { existsSync, statSync } from "node:fs";
|
|
11
|
+
import path from "node:path";
|
|
12
|
+
import { parseArgs } from "node:util";
|
|
13
|
+
import { applyTransitionsAcross, clearAllTransitions, readTransitions, setLayerTransitions } from "./composition-edit.js";
|
|
14
|
+
import { TRANSITION_OUT_PRESETS, TRANSITION_PRESETS } from "../hyperframes/composition.js";
|
|
15
|
+
export const TRANSITIONS_HELP = `vidfarm transitions — scene transitions between clips (local file write)
|
|
16
|
+
|
|
17
|
+
transitions apply <dir|composition.html> Apply across the whole timeline in one pass
|
|
18
|
+
--preset <p> Junction preset applied at EVERY cut (every scene clip
|
|
19
|
+
except each track's first). "none" clears junctions.
|
|
20
|
+
--duration <sec> Transition length 0.1-2.5 (default 0.5)
|
|
21
|
+
--intro <p> Entrance for the very FIRST clip (e.g. fade-black opens from black)
|
|
22
|
+
--outro <p> Exit for the very LAST clip (e.g. fade-black ends on black)
|
|
23
|
+
--outro-duration <sec> Outro length (defaults to --duration)
|
|
24
|
+
--json
|
|
25
|
+
|
|
26
|
+
transitions set <dir|composition.html> --layer <key> Configure one clip
|
|
27
|
+
--in <p> Entrance preset ("none" clears)
|
|
28
|
+
--in-duration <sec>
|
|
29
|
+
--out <p> Exit preset ("none" clears)
|
|
30
|
+
--out-duration <sec>
|
|
31
|
+
--json
|
|
32
|
+
|
|
33
|
+
transitions list <dir|composition.html> [--json] Show transitions on every scene clip
|
|
34
|
+
transitions clear <dir|composition.html> Remove all transitions
|
|
35
|
+
|
|
36
|
+
Entrance presets: ${TRANSITION_PRESETS.join(" | ")}
|
|
37
|
+
Exit presets: ${TRANSITION_OUT_PRESETS.join(" | ")}
|
|
38
|
+
|
|
39
|
+
The incoming clip owns the junction transition; the previous butt-cut clip is held on
|
|
40
|
+
screen beneath it automatically in preview, serve live-morph, local render, and cloud
|
|
41
|
+
render — never retime clips to "make room". Exit transitions play over the clip's last
|
|
42
|
+
seconds via an inline delay, re-derived automatically after retimes.
|
|
43
|
+
`;
|
|
44
|
+
export async function runTransitionsCommand(argv) {
|
|
45
|
+
const sub = argv[0];
|
|
46
|
+
const rest = argv.slice(1);
|
|
47
|
+
switch (sub) {
|
|
48
|
+
case "apply":
|
|
49
|
+
return runApply(rest);
|
|
50
|
+
case "set":
|
|
51
|
+
return runSet(rest);
|
|
52
|
+
case "list":
|
|
53
|
+
return runList(rest);
|
|
54
|
+
case "clear":
|
|
55
|
+
return runClear(rest);
|
|
56
|
+
case undefined:
|
|
57
|
+
case "help":
|
|
58
|
+
case "--help":
|
|
59
|
+
case "-h":
|
|
60
|
+
console.log(TRANSITIONS_HELP);
|
|
61
|
+
return;
|
|
62
|
+
default:
|
|
63
|
+
console.error(`Unknown transitions subcommand: ${sub}\n`);
|
|
64
|
+
console.log(TRANSITIONS_HELP);
|
|
65
|
+
process.exitCode = 1;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Same dir-or-file resolution as `vidfarm place` / `vidfarm captions`.
|
|
69
|
+
function resolveCompositionHtml(target) {
|
|
70
|
+
if (!target)
|
|
71
|
+
throw new Error("Provide the composition dir or composition.html path.");
|
|
72
|
+
const abs = path.resolve(process.cwd(), target);
|
|
73
|
+
if (existsSync(abs) && statSync(abs).isDirectory()) {
|
|
74
|
+
const inside = path.join(abs, "composition.html");
|
|
75
|
+
if (!existsSync(inside))
|
|
76
|
+
throw new Error(`No composition.html inside ${abs}. Run \`vidfarm pull <forkId> --dir ${target}\` first.`);
|
|
77
|
+
return inside;
|
|
78
|
+
}
|
|
79
|
+
if (!existsSync(abs))
|
|
80
|
+
throw new Error(`No such composition file or dir: ${abs}.`);
|
|
81
|
+
return abs;
|
|
82
|
+
}
|
|
83
|
+
function num(values, key) {
|
|
84
|
+
const raw = values[key];
|
|
85
|
+
if (typeof raw !== "string" || !raw.trim())
|
|
86
|
+
return undefined;
|
|
87
|
+
const parsed = Number(raw);
|
|
88
|
+
if (!Number.isFinite(parsed))
|
|
89
|
+
throw new Error(`--${key} must be a number.`);
|
|
90
|
+
return parsed;
|
|
91
|
+
}
|
|
92
|
+
function runApply(argv) {
|
|
93
|
+
const { values, positionals } = parseArgs({
|
|
94
|
+
args: argv,
|
|
95
|
+
allowPositionals: true,
|
|
96
|
+
options: {
|
|
97
|
+
preset: { type: "string" },
|
|
98
|
+
duration: { type: "string" },
|
|
99
|
+
intro: { type: "string" },
|
|
100
|
+
outro: { type: "string" },
|
|
101
|
+
"outro-duration": { type: "string" },
|
|
102
|
+
json: { type: "boolean" }
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
const file = resolveCompositionHtml(positionals[0]);
|
|
106
|
+
const html = readFileSync(file, "utf8");
|
|
107
|
+
const result = applyTransitionsAcross(html, {
|
|
108
|
+
junction: typeof values.preset === "string" ? values.preset : undefined,
|
|
109
|
+
duration: num(values, "duration"),
|
|
110
|
+
intro: typeof values.intro === "string" ? values.intro : undefined,
|
|
111
|
+
outro: typeof values.outro === "string" ? values.outro : undefined,
|
|
112
|
+
outroDuration: num(values, "outro-duration")
|
|
113
|
+
});
|
|
114
|
+
writeFileSync(file, result.html, "utf8");
|
|
115
|
+
if (values.json) {
|
|
116
|
+
console.log(JSON.stringify({ file, junctions: result.junctions, intro: result.intro, outro: result.outro }, null, 2));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const parts = [];
|
|
120
|
+
if (typeof values.preset === "string") {
|
|
121
|
+
parts.push(values.preset === "none" ? `cleared junction transitions on ${result.junctions} clips` : `${values.preset} at ${result.junctions} junctions`);
|
|
122
|
+
}
|
|
123
|
+
if (typeof values.intro === "string")
|
|
124
|
+
parts.push(values.intro === "none" ? "intro cleared" : `intro ${values.intro}`);
|
|
125
|
+
if (typeof values.outro === "string")
|
|
126
|
+
parts.push(values.outro === "none" ? "outro cleared" : `outro ${values.outro}`);
|
|
127
|
+
console.log(`Set scene transitions: ${parts.join(", ")}.`);
|
|
128
|
+
console.log(`Wrote ${file}`);
|
|
129
|
+
}
|
|
130
|
+
function runSet(argv) {
|
|
131
|
+
const { values, positionals } = parseArgs({
|
|
132
|
+
args: argv,
|
|
133
|
+
allowPositionals: true,
|
|
134
|
+
options: {
|
|
135
|
+
layer: { type: "string" },
|
|
136
|
+
in: { type: "string" },
|
|
137
|
+
"in-duration": { type: "string" },
|
|
138
|
+
out: { type: "string" },
|
|
139
|
+
"out-duration": { type: "string" },
|
|
140
|
+
json: { type: "boolean" }
|
|
141
|
+
}
|
|
142
|
+
});
|
|
143
|
+
const file = resolveCompositionHtml(positionals[0]);
|
|
144
|
+
if (typeof values.layer !== "string" || !values.layer.trim()) {
|
|
145
|
+
throw new Error("transitions set requires --layer <layerKey|slug>.");
|
|
146
|
+
}
|
|
147
|
+
const html = readFileSync(file, "utf8");
|
|
148
|
+
const result = setLayerTransitions(html, values.layer, {
|
|
149
|
+
transition: typeof values.in === "string" ? values.in : undefined,
|
|
150
|
+
transitionDuration: num(values, "in-duration"),
|
|
151
|
+
transitionOut: typeof values.out === "string" ? values.out : undefined,
|
|
152
|
+
transitionOutDuration: num(values, "out-duration")
|
|
153
|
+
});
|
|
154
|
+
writeFileSync(file, result.html, "utf8");
|
|
155
|
+
if (values.json) {
|
|
156
|
+
console.log(JSON.stringify({ file, layerKey: result.layerKey, in: values.in ?? null, out: values.out ?? null }, null, 2));
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
const parts = [];
|
|
160
|
+
if (typeof values.in === "string")
|
|
161
|
+
parts.push(`in=${values.in}`);
|
|
162
|
+
if (typeof values.out === "string")
|
|
163
|
+
parts.push(`out=${values.out}`);
|
|
164
|
+
console.log(`Updated transitions on ${result.layerKey} (${parts.join(" ")}).`);
|
|
165
|
+
console.log(`Wrote ${file}`);
|
|
166
|
+
}
|
|
167
|
+
function runList(argv) {
|
|
168
|
+
const { values, positionals } = parseArgs({
|
|
169
|
+
args: argv,
|
|
170
|
+
allowPositionals: true,
|
|
171
|
+
options: { json: { type: "boolean" } }
|
|
172
|
+
});
|
|
173
|
+
const file = resolveCompositionHtml(positionals[0]);
|
|
174
|
+
const entries = readTransitions(readFileSync(file, "utf8"));
|
|
175
|
+
if (values.json) {
|
|
176
|
+
console.log(JSON.stringify(entries, null, 2));
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
if (!entries.length) {
|
|
180
|
+
console.log("No scene clips found.");
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
for (const entry of entries) {
|
|
184
|
+
const inLabel = entry.transition ? `${entry.transition} (${entry.transition_duration ?? 0.5}s)` : "-";
|
|
185
|
+
const outLabel = entry.transition_out ? `${entry.transition_out} (${entry.transition_out_duration ?? 0.5}s)` : "-";
|
|
186
|
+
console.log(`${entry.start.toFixed(2).padStart(8)}s L${entry.track} ${entry.layerKey.padEnd(28)} in: ${inLabel.padEnd(22)} out: ${outLabel} ${entry.label ?? ""}`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
function runClear(argv) {
|
|
190
|
+
const { values, positionals } = parseArgs({
|
|
191
|
+
args: argv,
|
|
192
|
+
allowPositionals: true,
|
|
193
|
+
options: { json: { type: "boolean" } }
|
|
194
|
+
});
|
|
195
|
+
const file = resolveCompositionHtml(positionals[0]);
|
|
196
|
+
const result = clearAllTransitions(readFileSync(file, "utf8"));
|
|
197
|
+
writeFileSync(file, result.html, "utf8");
|
|
198
|
+
if (values.json) {
|
|
199
|
+
console.log(JSON.stringify({ file, cleared: result.cleared }, null, 2));
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
console.log(`Cleared transitions on ${result.cleared} clips.`);
|
|
203
|
+
console.log(`Wrote ${file}`);
|
|
204
|
+
}
|
|
205
|
+
//# sourceMappingURL=transitions.js.map
|