@mevdragon/vidfarm-devcli 0.14.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 +37 -0
- package/SKILL.platform.md +6 -1
- package/demo/dist/app.js +295 -11
- package/dist/src/app.js +317 -133
- package/dist/src/cli.js +529 -12
- package/dist/src/composition-runtime.js +262 -3
- 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/editor-chat.js +255 -0
- package/dist/src/hyperframes/composition.js +5 -5
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/hyperframes.js +67 -13
- package/package.json +2 -1
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// Static composition validation shared by the /editor chat copilot
|
|
2
|
+
// (replace_composition_html preflight, both the in-process and Lambda copies),
|
|
3
|
+
// the devcli (`vidfarm lint`), and publish preflights. Mirrors the checks the
|
|
4
|
+
// HyperFrames CLI's `lint` runs against raw projects, adapted to vidfarm's
|
|
5
|
+
// composition vocabulary (data-vf-* proxies, transition holds, caption spans).
|
|
6
|
+
import { parseHTML } from "linkedom";
|
|
7
|
+
import { CAPTION_ANIMATIONS, KEN_BURNS_PRESETS, TRANSITION_OUT_PRESETS, TRANSITION_PRESETS } from "../hyperframes/composition.js";
|
|
8
|
+
const OVERLAP_EPSILON = 0.011;
|
|
9
|
+
function parseNumberAttr(value) {
|
|
10
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const parsed = Number(value);
|
|
14
|
+
return Number.isFinite(parsed) ? parsed : null;
|
|
15
|
+
}
|
|
16
|
+
function layerKeyFor(element) {
|
|
17
|
+
return (element.getAttribute("data-hf-id") ||
|
|
18
|
+
element.getAttribute("id") ||
|
|
19
|
+
element.getAttribute("data-hf-slug") ||
|
|
20
|
+
`<${element.tagName.toLowerCase()}>`);
|
|
21
|
+
}
|
|
22
|
+
export function lintCompositionHtml(html) {
|
|
23
|
+
const issues = [];
|
|
24
|
+
const push = (level, code, message, layer) => {
|
|
25
|
+
issues.push({ level, code, message, ...(layer ? { layer } : {}) });
|
|
26
|
+
};
|
|
27
|
+
const trimmed = typeof html === "string" ? html.trim() : "";
|
|
28
|
+
if (!trimmed) {
|
|
29
|
+
push("error", "empty_document", "Composition HTML is empty.");
|
|
30
|
+
return finalize(issues);
|
|
31
|
+
}
|
|
32
|
+
let document;
|
|
33
|
+
try {
|
|
34
|
+
({ document } = parseHTML(trimmed));
|
|
35
|
+
}
|
|
36
|
+
catch (error) {
|
|
37
|
+
push("error", "unparseable_document", `Composition HTML could not be parsed: ${error instanceof Error ? error.message : String(error)}`);
|
|
38
|
+
return finalize(issues);
|
|
39
|
+
}
|
|
40
|
+
const root = document.querySelector("[data-composition-id]");
|
|
41
|
+
if (!root) {
|
|
42
|
+
push("error", "missing_composition_root", "No element carries data-composition-id — the composition root is required.");
|
|
43
|
+
return finalize(issues);
|
|
44
|
+
}
|
|
45
|
+
const width = parseNumberAttr(root.getAttribute("data-width"));
|
|
46
|
+
const height = parseNumberAttr(root.getAttribute("data-height"));
|
|
47
|
+
if (width === null || height === null) {
|
|
48
|
+
push("warning", "missing_canvas_size", "Composition root should declare numeric data-width and data-height (px).");
|
|
49
|
+
}
|
|
50
|
+
else if (width <= 0 || height <= 0) {
|
|
51
|
+
push("error", "invalid_canvas", `Composition root data-width/data-height must be positive (got ${width}x${height}).`);
|
|
52
|
+
}
|
|
53
|
+
const fpsRaw = root.getAttribute("data-fps");
|
|
54
|
+
if (fpsRaw !== null && (parseNumberAttr(fpsRaw) === null || parseNumberAttr(fpsRaw) <= 0)) {
|
|
55
|
+
push("warning", "invalid_fps", `Composition root data-fps is not a positive number (got "${fpsRaw}").`);
|
|
56
|
+
}
|
|
57
|
+
const clips = Array.from(document.querySelectorAll("[data-start]")).filter((el) => el !== root);
|
|
58
|
+
const rootDuration = parseNumberAttr(root.getAttribute("data-duration"));
|
|
59
|
+
if (rootDuration === null) {
|
|
60
|
+
if (clips.length === 0) {
|
|
61
|
+
push("error", "missing_root_duration", "Composition root has no data-duration and no timed clips to infer one from.");
|
|
62
|
+
}
|
|
63
|
+
else {
|
|
64
|
+
push("warning", "missing_root_duration", "Composition root has no data-duration; the runtime will infer it from the latest clip end. Declare it explicitly for deterministic renders.");
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else if (rootDuration <= 0) {
|
|
68
|
+
push("error", "invalid_root_duration", `Composition root data-duration must be positive (got ${rootDuration}).`);
|
|
69
|
+
}
|
|
70
|
+
if (clips.length === 0) {
|
|
71
|
+
push("warning", "no_clips", "Composition has no timed clips ([data-start] elements).");
|
|
72
|
+
}
|
|
73
|
+
const timings = [];
|
|
74
|
+
const seenKeys = new Map();
|
|
75
|
+
for (const clip of clips) {
|
|
76
|
+
const key = layerKeyFor(clip);
|
|
77
|
+
const tag = clip.tagName.toLowerCase();
|
|
78
|
+
const isMedia = tag === "video" || tag === "audio";
|
|
79
|
+
const isProxy = clip.hasAttribute("data-vf-timeline-proxy");
|
|
80
|
+
const explicitKey = clip.getAttribute("data-hf-id") || clip.getAttribute("id");
|
|
81
|
+
if (explicitKey) {
|
|
82
|
+
seenKeys.set(explicitKey, (seenKeys.get(explicitKey) ?? 0) + 1);
|
|
83
|
+
}
|
|
84
|
+
const start = parseNumberAttr(clip.getAttribute("data-start"));
|
|
85
|
+
if (start === null || start < 0) {
|
|
86
|
+
push("error", "invalid_clip_timing", `Clip has a non-numeric or negative data-start ("${clip.getAttribute("data-start")}").`, key);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
const duration = parseNumberAttr(clip.getAttribute("data-duration"));
|
|
90
|
+
if (duration === null) {
|
|
91
|
+
if (isMedia) {
|
|
92
|
+
push("warning", "media_missing_duration", "Media clip has no data-duration; it will fall back to the source's intrinsic length. Declare it for predictable trims.", key);
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
push("error", "missing_clip_duration", "Non-media clip requires a positive data-duration.", key);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
else if (duration <= 0) {
|
|
99
|
+
push("error", "invalid_clip_duration", `Clip data-duration must be positive (got ${duration}).`, key);
|
|
100
|
+
}
|
|
101
|
+
const trackRaw = clip.getAttribute("data-track-index");
|
|
102
|
+
const track = parseNumberAttr(trackRaw);
|
|
103
|
+
if (trackRaw === null || track === null || !Number.isInteger(track) || track < 0) {
|
|
104
|
+
push("warning", "missing_track_index", `Clip should declare an integer data-track-index >= 0 (got "${trackRaw ?? "<absent>"}").`, key);
|
|
105
|
+
}
|
|
106
|
+
// Nested clips fight parent visibility toggling and are unregistered in
|
|
107
|
+
// the upstream HyperFrames runtime (clips must be direct children).
|
|
108
|
+
let ancestor = clip.parentElement;
|
|
109
|
+
while (ancestor && ancestor !== root) {
|
|
110
|
+
if (ancestor.hasAttribute("data-start")) {
|
|
111
|
+
push("warning", "nested_clip", "Clip is nested inside another timed clip; move clips to the composition root.", key);
|
|
112
|
+
break;
|
|
113
|
+
}
|
|
114
|
+
ancestor = ancestor.parentElement;
|
|
115
|
+
}
|
|
116
|
+
if (isMedia && clip.parentElement && clip.parentElement !== root) {
|
|
117
|
+
push("warning", "nested_media", "video/audio elements should be direct children of the composition root — nested media renders blank/black under the HyperFrames runtime.", key);
|
|
118
|
+
}
|
|
119
|
+
if ((tag === "video" || tag === "img" || tag === "audio") && !isProxy) {
|
|
120
|
+
const src = clip.getAttribute("src") || clip.getAttribute("data-src");
|
|
121
|
+
const hasSourceChild = Boolean(clip.querySelector("source[src]"));
|
|
122
|
+
if (!src && !hasSourceChild) {
|
|
123
|
+
push("error", "media_missing_src", `<${tag}> clip has no src / data-src.`, key);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
const kenBurns = clip.getAttribute("data-kenburns") ?? clip.querySelector("img[data-kenburns]")?.getAttribute("data-kenburns");
|
|
127
|
+
if (kenBurns && kenBurns !== "none" && !KEN_BURNS_PRESETS.includes(kenBurns)) {
|
|
128
|
+
push("error", "unknown_ken_burns", `Unknown data-kenburns preset "${kenBurns}".`, key);
|
|
129
|
+
}
|
|
130
|
+
const transition = clip.getAttribute("data-transition");
|
|
131
|
+
if (transition && transition !== "none" && !TRANSITION_PRESETS.includes(transition)) {
|
|
132
|
+
push("error", "unknown_transition", `Unknown data-transition preset "${transition}".`, key);
|
|
133
|
+
}
|
|
134
|
+
const transitionOut = clip.getAttribute("data-transition-out");
|
|
135
|
+
if (transitionOut && transitionOut !== "none" && !TRANSITION_OUT_PRESETS.includes(transitionOut)) {
|
|
136
|
+
push("error", "unknown_transition_out", `Unknown data-transition-out preset "${transitionOut}".`, key);
|
|
137
|
+
}
|
|
138
|
+
const captionAnimation = clip.getAttribute("data-caption-animation");
|
|
139
|
+
if (captionAnimation && captionAnimation !== "none" && !CAPTION_ANIMATIONS.includes(captionAnimation)) {
|
|
140
|
+
push("error", "unknown_caption_animation", `Unknown data-caption-animation preset "${captionAnimation}".`, key);
|
|
141
|
+
}
|
|
142
|
+
const effectiveDuration = duration !== null && duration > 0 ? duration : 0;
|
|
143
|
+
timings.push({
|
|
144
|
+
element: clip,
|
|
145
|
+
key,
|
|
146
|
+
start,
|
|
147
|
+
end: start + effectiveDuration,
|
|
148
|
+
track: track !== null && Number.isInteger(track) && track >= 0 ? track : null,
|
|
149
|
+
hasTransitionHold: clip.hasAttribute("data-transition-hold")
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
for (const [key, count] of seenKeys) {
|
|
153
|
+
if (count > 1) {
|
|
154
|
+
push("warning", "duplicate_layer_id", `Layer id "${key}" appears ${count} times; layer keys must be unique for editor/chat targeting.`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
// Same-track temporal overlap. Materialized transition holds
|
|
158
|
+
// (data-transition-hold) legitimately overlap their successor.
|
|
159
|
+
const byTrack = new Map();
|
|
160
|
+
for (const timing of timings) {
|
|
161
|
+
if (timing.track === null || timing.end <= timing.start) {
|
|
162
|
+
continue;
|
|
163
|
+
}
|
|
164
|
+
const bucket = byTrack.get(timing.track) ?? [];
|
|
165
|
+
bucket.push(timing);
|
|
166
|
+
byTrack.set(timing.track, bucket);
|
|
167
|
+
}
|
|
168
|
+
for (const [track, bucket] of byTrack) {
|
|
169
|
+
bucket.sort((a, b) => a.start - b.start || a.end - b.end);
|
|
170
|
+
for (let i = 1; i < bucket.length; i += 1) {
|
|
171
|
+
const prev = bucket[i - 1];
|
|
172
|
+
const current = bucket[i];
|
|
173
|
+
if (current.start < prev.end - OVERLAP_EPSILON && !prev.hasTransitionHold && !current.hasTransitionHold) {
|
|
174
|
+
push("error", "track_overlap", `Clips "${prev.key}" and "${current.key}" overlap on track ${track} (${prev.start}-${prev.end}s vs ${current.start}s start). Same-track clips must not overlap.`, current.key);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
const scripts = document.querySelectorAll("script");
|
|
179
|
+
if (scripts.length > 0) {
|
|
180
|
+
push("warning", "scripts_stripped_on_save", `Composition contains ${scripts.length} <script> tag(s). Scripts survive local serve/disk renders, but every cloud/web editor save strips them (stored-XSS defense) — script-driven animation will be lost there. Prefer the declarative preset vocabulary (data-kenburns, data-transition, data-caption-animation) for compositions that round-trip through the web editor.`);
|
|
181
|
+
}
|
|
182
|
+
return finalize(issues);
|
|
183
|
+
}
|
|
184
|
+
function finalize(issues) {
|
|
185
|
+
const errors = issues.filter((issue) => issue.level === "error");
|
|
186
|
+
const warnings = issues.filter((issue) => issue.level === "warning");
|
|
187
|
+
return { ok: errors.length === 0, errors, warnings };
|
|
188
|
+
}
|
|
189
|
+
export function formatCompositionLintIssues(result) {
|
|
190
|
+
const lines = [];
|
|
191
|
+
for (const issue of result.errors) {
|
|
192
|
+
lines.push(`error ${issue.code}${issue.layer ? ` [${issue.layer}]` : ""}: ${issue.message}`);
|
|
193
|
+
}
|
|
194
|
+
for (const issue of result.warnings) {
|
|
195
|
+
lines.push(`warn ${issue.code}${issue.layer ? ` [${issue.layer}]` : ""}: ${issue.message}`);
|
|
196
|
+
}
|
|
197
|
+
return lines.join("\n");
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=composition-lint.js.map
|
|
@@ -65,6 +65,13 @@ function shouldRenderLocally() {
|
|
|
65
65
|
(config.HYPERFRAMES_RENDER_BUCKET_NAME || config.HYPERFRAMES_LAMBDA_BUCKET_NAME));
|
|
66
66
|
return !hasCloudStack;
|
|
67
67
|
}
|
|
68
|
+
// The bundled producer/aws-lambda libraries embed upstream-vendor doc links in
|
|
69
|
+
// some error messages (font resolution, large-variables). Those URLs surface in
|
|
70
|
+
// job logs and the export modal, so rewrite them to vidfarm's docs before the
|
|
71
|
+
// message leaves the render layer.
|
|
72
|
+
function scrubVendorDocLinks(text) {
|
|
73
|
+
return text.replace(/https?:\/\/[a-z0-9.-]*heygen\.com[^\s"')\]]*/gi, "https://vidfarm.cc/skill/vidfarm-director");
|
|
74
|
+
}
|
|
68
75
|
export class HyperframesService {
|
|
69
76
|
async render(input) {
|
|
70
77
|
const compositionHtml = normalizePublishHtml(input.compositionHtml || (input.composition ? buildHyperframeCompositionHtml(input.composition) : ""));
|
|
@@ -205,7 +212,7 @@ export class HyperframesService {
|
|
|
205
212
|
duration_ms: Date.now() - startedAtMs,
|
|
206
213
|
errors: Array.isArray(progress.errors) ? progress.errors.slice(0, 3) : progress.errors
|
|
207
214
|
}, "error");
|
|
208
|
-
throw new Error(`HyperFrames render ${handle.renderId} failed: ${JSON.stringify(progress.errors)}`);
|
|
215
|
+
throw new Error(`HyperFrames render ${handle.renderId} failed: ${scrubVendorDocLinks(JSON.stringify(progress.errors))}`);
|
|
209
216
|
}
|
|
210
217
|
if (Date.now() - startedAtMs > timeoutMs) {
|
|
211
218
|
devLog("hyperframes.render.timeout", {
|
|
@@ -263,16 +270,21 @@ export class HyperframesService {
|
|
|
263
270
|
format: input.format || "mp4"
|
|
264
271
|
});
|
|
265
272
|
let lastStatus = null;
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
273
|
+
try {
|
|
274
|
+
await executeRenderJob(job, projectDir, outputLocation, (progressJob, message) => {
|
|
275
|
+
if (progressJob.status !== lastStatus) {
|
|
276
|
+
devLog("hyperframes.render_local.progress", {
|
|
277
|
+
render_id: renderId,
|
|
278
|
+
status: progressJob.status,
|
|
279
|
+
message
|
|
280
|
+
});
|
|
281
|
+
lastStatus = progressJob.status;
|
|
282
|
+
}
|
|
283
|
+
});
|
|
284
|
+
}
|
|
285
|
+
catch (error) {
|
|
286
|
+
throw new Error(scrubVendorDocLinks(error instanceof Error ? error.message : String(error)), { cause: error });
|
|
287
|
+
}
|
|
276
288
|
// Single-segment encoded key — matches the `/storage/:key` route which
|
|
277
289
|
// decodeURIComponent's one param (slashes ride through as %2F).
|
|
278
290
|
const outputUrl = `${config.PUBLIC_BASE_URL}/storage/${encodeURIComponent(outputKey)}`;
|
|
@@ -338,7 +350,12 @@ export class HyperframesService {
|
|
|
338
350
|
// png-sequence writes outputPath as a DIRECTORY of frame_000001.png … files.
|
|
339
351
|
const job = createRenderJob({ fps: 30, quality: "high", format: "png-sequence" });
|
|
340
352
|
try {
|
|
341
|
-
|
|
353
|
+
try {
|
|
354
|
+
await executeRenderJob(job, projectDir, framesDir);
|
|
355
|
+
}
|
|
356
|
+
catch (error) {
|
|
357
|
+
throw new Error(scrubVendorDocLinks(error instanceof Error ? error.message : String(error)), { cause: error });
|
|
358
|
+
}
|
|
342
359
|
const frameFiles = (await readdir(framesDir))
|
|
343
360
|
.filter((name) => name.toLowerCase().endsWith(".png"))
|
|
344
361
|
.sort();
|
|
@@ -2510,6 +2527,31 @@ export function normalizePublishHtml(html) {
|
|
|
2510
2527
|
continue;
|
|
2511
2528
|
html.style.zIndex = String(trackIndex);
|
|
2512
2529
|
}
|
|
2530
|
+
// HyperFrames contract: visible timed elements (div/img) carry class="clip" —
|
|
2531
|
+
// the upstream runtime keeps clip-less timed elements visible for the whole
|
|
2532
|
+
// composition. video/audio deliberately stay bare (framework-managed), so the
|
|
2533
|
+
// class is STRIPPED there (the editor's add-layer paths set it universally).
|
|
2534
|
+
// Only promote layers with a valid timing window: a clip-less element with a
|
|
2535
|
+
// missing/invalid data-duration historically stayed visible full-length, and
|
|
2536
|
+
// promoting it would silently hide it on re-renders of older compositions.
|
|
2537
|
+
for (const el of Array.from(document.querySelectorAll("[data-start]"))) {
|
|
2538
|
+
if (el.hasAttribute("data-composition-id"))
|
|
2539
|
+
continue;
|
|
2540
|
+
const tag = el.tagName.toLowerCase();
|
|
2541
|
+
if (tag === "video" || tag === "audio") {
|
|
2542
|
+
el.classList.remove("clip");
|
|
2543
|
+
if (!el.getAttribute("class"))
|
|
2544
|
+
el.removeAttribute("class");
|
|
2545
|
+
continue;
|
|
2546
|
+
}
|
|
2547
|
+
const start = Number.parseFloat(el.getAttribute("data-start") || "");
|
|
2548
|
+
const clipDuration = Number.parseFloat(el.getAttribute("data-duration") || "");
|
|
2549
|
+
if (!Number.isFinite(start) || start < 0 || !Number.isFinite(clipDuration) || clipDuration <= 0)
|
|
2550
|
+
continue;
|
|
2551
|
+
if (!el.classList.contains("clip")) {
|
|
2552
|
+
el.classList.add("clip");
|
|
2553
|
+
}
|
|
2554
|
+
}
|
|
2513
2555
|
// Ken Burns motion must span exactly the clip: timeline edits touch
|
|
2514
2556
|
// data-duration only, so re-derive the inline --vf-kb-dur (which drives
|
|
2515
2557
|
// animation-duration) from data-duration on every [data-kenburns] layer.
|
|
@@ -2643,7 +2685,7 @@ function extractCompositionMetadata(html, input) {
|
|
|
2643
2685
|
const compositionId = safeIdentifier(input.compositionId || htmlAttribute(html, "data-composition-id") || input.composition?.compositionId || "composition");
|
|
2644
2686
|
const width = positiveInteger(input.width || htmlAttribute(html, "data-width") || input.composition?.width, 720);
|
|
2645
2687
|
const height = positiveInteger(input.height || htmlAttribute(html, "data-height") || input.composition?.height, 1280);
|
|
2646
|
-
const fps = positiveInteger(input.fps || 30, 30);
|
|
2688
|
+
const fps = positiveInteger(input.fps || rootTagAttribute(html, "data-fps") || 30, 30);
|
|
2647
2689
|
const duration = Number.parseFloat(htmlAttribute(html, "data-duration") || String(input.composition?.duration || ""));
|
|
2648
2690
|
return {
|
|
2649
2691
|
compositionId,
|
|
@@ -2673,6 +2715,18 @@ function forceEvenCompositionDimensions(html) {
|
|
|
2673
2715
|
return `data-${dim}=${quote}${n - 1}${quote}`;
|
|
2674
2716
|
});
|
|
2675
2717
|
}
|
|
2718
|
+
// Reads an attribute from the SAME opening tag that carries
|
|
2719
|
+
// data-composition-id (the composition root). htmlAttribute matches the first
|
|
2720
|
+
// occurrence anywhere in the document, which nested sub-compositions or
|
|
2721
|
+
// embedded snippets could hijack — fps must come from the root only.
|
|
2722
|
+
function rootTagAttribute(html, name) {
|
|
2723
|
+
const rootTag = html.match(/<[a-zA-Z][^>]*\bdata-composition-id\s*=[^>]*>/);
|
|
2724
|
+
if (!rootTag) {
|
|
2725
|
+
return "";
|
|
2726
|
+
}
|
|
2727
|
+
const value = rootTag[0].match(new RegExp(`\\b${name}\\s*=\\s*["']([^"']*)["']`, "i"));
|
|
2728
|
+
return value ? value[1] : "";
|
|
2729
|
+
}
|
|
2676
2730
|
function htmlAttribute(html, name) {
|
|
2677
2731
|
const escaped = name.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
2678
2732
|
const match = html.match(new RegExp(`${escaped}=(["'])(.*?)\\1`, "i"));
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mevdragon/vidfarm-devcli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.15.0",
|
|
4
4
|
"description": "Local bridge for the Vidfarm Trackpad Editor. `vidfarm serve <template_id>` boots the FULL editor on localhost (disk-backed records/storage, free in-process render); edit composition.html on disk (Claude Code, Codex, etc.) and the browser live-morphs it.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
"demo/dist/**",
|
|
14
14
|
"public/assets/**",
|
|
15
15
|
"src/assets/**",
|
|
16
|
+
".agents/skills/**",
|
|
16
17
|
"README.md",
|
|
17
18
|
"SKILL.director.md",
|
|
18
19
|
"SKILL.platform.md",
|