@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,320 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// transitions.mjs — inter-frame transition injector + verifier for the video workflow.
|
|
3
|
+
//
|
|
4
|
+
// inject — read STORYBOARD frame order + each frame's transition_in, overlap
|
|
5
|
+
// the frame clip wrappers in index.html, and stamp the GSAP template.
|
|
6
|
+
// verify — deterministic gate over the injector's output.
|
|
7
|
+
//
|
|
8
|
+
// transition_in (written by story-design on the INCOMING frame) names a registry
|
|
9
|
+
// type directly: crossfade | blur-crossfade | push-slide | zoom-through | squeeze,
|
|
10
|
+
// optionally "<type> <DIR>" / "<type> <N>s" (e.g. "push-slide LEFT", "crossfade
|
|
11
|
+
// 0.4s"). `cut` / `none` / empty ⇒ hard cut (no overlap, no stamp).
|
|
12
|
+
//
|
|
13
|
+
// Mechanics — EXTEND-OUTGOING-ONLY (keeps voice/SFX/captions synced; their timing
|
|
14
|
+
// is keyed to the original frame start). At boundary i→i+1 (type = the incoming
|
|
15
|
+
// frame's transition_in): extend ONLY the outgoing wrapper's data-duration by
|
|
16
|
+
// `dur` so it holds its final frame across the window; do NOT move any data-start;
|
|
17
|
+
// the incoming — already present from the cut on a higher track — fades/pushes in
|
|
18
|
+
// over it. Then 0/1-ping-pong ALL frame clips' data-track-index (adjacent
|
|
19
|
+
// overlapping wrappers never share a track — lint timeline_track_too_dense) and
|
|
20
|
+
// stamp the token-substituted GSAP template into __timelines["main"] at T =
|
|
21
|
+
// incoming start. captions(2)/voice(10)/bgm(11)/sfx(20+) are never touched.
|
|
22
|
+
//
|
|
23
|
+
// node transitions.mjs inject --storyboard ./STORYBOARD.md --hyperframes .
|
|
24
|
+
// node transitions.mjs verify --storyboard ./STORYBOARD.md --index ./index.html
|
|
25
|
+
|
|
26
|
+
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
27
|
+
import { join, resolve } from "node:path";
|
|
28
|
+
import { parseStoryboard } from "./lib/storyboard.mjs";
|
|
29
|
+
import { parseFormat } from "./lib/dimensions.mjs";
|
|
30
|
+
import { loadTransitionRegistry, transitionsByName } from "./lib/transition-registry.mjs";
|
|
31
|
+
|
|
32
|
+
const flag = (argv, name, def) => {
|
|
33
|
+
const i = argv.indexOf(`--${name}`);
|
|
34
|
+
return i >= 0 && i + 1 < argv.length ? argv[i + 1] : def;
|
|
35
|
+
};
|
|
36
|
+
const NO_TRANSITION = new Set(["cut", "none", ""]);
|
|
37
|
+
const r3 = (x) => Number(x.toFixed(3));
|
|
38
|
+
|
|
39
|
+
// transition_in → { type, direction?, dur? } | null (hard cut).
|
|
40
|
+
function parseTransitionIn(raw) {
|
|
41
|
+
const s = (raw ?? "").trim();
|
|
42
|
+
if (NO_TRANSITION.has(s.toLowerCase())) return null;
|
|
43
|
+
const parts = s.split(/\s+/);
|
|
44
|
+
const spec = { type: parts[0].toLowerCase() };
|
|
45
|
+
for (const p of parts.slice(1)) {
|
|
46
|
+
const m = p.match(/^(\d+(?:\.\d+)?)s?$/);
|
|
47
|
+
if (m) spec.dur = Number(m[1]);
|
|
48
|
+
else spec.direction = p.toUpperCase();
|
|
49
|
+
}
|
|
50
|
+
return spec;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// Mounted STORYBOARD frames present in index.html, in document order: { id, frame }.
|
|
54
|
+
function mountedFramesInOrder(manifest, html) {
|
|
55
|
+
const out = [];
|
|
56
|
+
for (const f of manifest.frames) {
|
|
57
|
+
if (!f.src) continue;
|
|
58
|
+
const id = f.src
|
|
59
|
+
.split("/")
|
|
60
|
+
.pop()
|
|
61
|
+
.replace(/\.html?$/i, "");
|
|
62
|
+
if (html.includes(`id="el-${id}"`)) out.push({ id, frame: f });
|
|
63
|
+
}
|
|
64
|
+
return out;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Frame clip wrappers parsed out of index.html (ids carry hyphens; excludes
|
|
68
|
+
// el-captions and audio by keying off the known frame-id set). The id is matched
|
|
69
|
+
// from anywhere in the tag's attribute list — never assume it is the first attribute
|
|
70
|
+
// (the index assembler emits data-hf-id before id, so an id-first regex finds nothing
|
|
71
|
+
// and inject crashes on the empty clip map).
|
|
72
|
+
function parseFrameClips(html, frameIds) {
|
|
73
|
+
const clipRe = /<div\b([^>]*)><\/div>/g;
|
|
74
|
+
const clips = new Map();
|
|
75
|
+
let m;
|
|
76
|
+
while ((m = clipRe.exec(html)) !== null) {
|
|
77
|
+
const attrs = m[1];
|
|
78
|
+
const idm = attrs.match(/\bid="el-([A-Za-z0-9_-]+)"/);
|
|
79
|
+
if (!idm || !frameIds.has(idm[1])) continue;
|
|
80
|
+
const num = (re) => {
|
|
81
|
+
const x = attrs.match(re);
|
|
82
|
+
return x ? Number(x[1]) : null;
|
|
83
|
+
};
|
|
84
|
+
clips.set(idm[1], {
|
|
85
|
+
id: idm[1],
|
|
86
|
+
block: m[0],
|
|
87
|
+
start: num(/data-start="([\d.]+)"/),
|
|
88
|
+
duration: num(/data-duration="([\d.]+)"/),
|
|
89
|
+
track: num(/data-track-index="(\d+)"/) ?? 0,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
return clips;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// Resolve a transition_in spec to a registry record (calm default on unknown).
|
|
96
|
+
function resolveRecord(spec, byName, reg, warn) {
|
|
97
|
+
let rec = byName.get(spec.type);
|
|
98
|
+
if (!rec) {
|
|
99
|
+
rec = byName.get(reg.default_calm);
|
|
100
|
+
warn(`transition_in "${spec.type}" not in registry — using ${reg.default_calm}`);
|
|
101
|
+
}
|
|
102
|
+
return rec;
|
|
103
|
+
}
|
|
104
|
+
function resolveDur(spec, rec, reg) {
|
|
105
|
+
let dur = spec.dur ?? rec.default_duration_s ?? 0.5;
|
|
106
|
+
return Math.min(dur, reg.max_duration_s ?? 2.0);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
// GSAP lines for one transition record (token substitution).
|
|
110
|
+
function buildGsap(rec, fromId, toId, dur, T, direction, canvasW, canvasH, die) {
|
|
111
|
+
const subs = {
|
|
112
|
+
__OLD__: `"#el-${fromId}"`,
|
|
113
|
+
__NEW__: `"#el-${toId}"`,
|
|
114
|
+
__T__: String(T),
|
|
115
|
+
__DUR__: String(dur),
|
|
116
|
+
};
|
|
117
|
+
let template;
|
|
118
|
+
if (rec.directions && rec.directions.length > 0) {
|
|
119
|
+
const dir = (direction || rec.default_direction || rec.directions[0]).toUpperCase();
|
|
120
|
+
const vertical = dir === "UP" || dir === "DOWN";
|
|
121
|
+
template = vertical ? rec.gsap_template_vertical : rec.gsap_template_horizontal;
|
|
122
|
+
if (!template)
|
|
123
|
+
die(`transition ${rec.name}: missing ${vertical ? "vertical" : "horizontal"} template`);
|
|
124
|
+
if (vertical) {
|
|
125
|
+
const dy = dir === "UP" ? -canvasH : canvasH;
|
|
126
|
+
subs.__DY__ = String(dy);
|
|
127
|
+
subs.__DYIN__ = String(-dy);
|
|
128
|
+
} else {
|
|
129
|
+
const dx = dir === "LEFT" ? -canvasW : canvasW;
|
|
130
|
+
subs.__DX__ = String(dx);
|
|
131
|
+
subs.__DXIN__ = String(-dx);
|
|
132
|
+
}
|
|
133
|
+
} else {
|
|
134
|
+
template = rec.gsap_template;
|
|
135
|
+
if (!template) die(`transition ${rec.name}: missing gsap_template`);
|
|
136
|
+
}
|
|
137
|
+
return template.map((line) => {
|
|
138
|
+
let out = line;
|
|
139
|
+
for (const [k, v] of Object.entries(subs)) out = out.split(k).join(v);
|
|
140
|
+
return out;
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
function runInject(argv) {
|
|
145
|
+
const hyperframesDir = resolve(flag(argv, "hyperframes", "."));
|
|
146
|
+
const storyboardPath = resolve(flag(argv, "storyboard", join(hyperframesDir, "STORYBOARD.md")));
|
|
147
|
+
const indexPath = join(hyperframesDir, "index.html");
|
|
148
|
+
const die = (msg) => {
|
|
149
|
+
console.error(`✗ transitions inject: ${msg}`);
|
|
150
|
+
process.exit(1);
|
|
151
|
+
};
|
|
152
|
+
|
|
153
|
+
if (!existsSync(storyboardPath)) die(`STORYBOARD.md not found at ${storyboardPath}`);
|
|
154
|
+
|
|
155
|
+
const manifest = parseStoryboard(readFileSync(storyboardPath, "utf8"));
|
|
156
|
+
const { width: CW, height: CH } = parseFormat(manifest.globals.format);
|
|
157
|
+
const reg = loadTransitionRegistry();
|
|
158
|
+
const byName = transitionsByName();
|
|
159
|
+
|
|
160
|
+
// Read directly and handle ENOENT here, rather than an existsSync precheck —
|
|
161
|
+
// the check→write pair (write-back below) is a TOCTOU race CodeQL flags.
|
|
162
|
+
let html = "";
|
|
163
|
+
try {
|
|
164
|
+
html = readFileSync(indexPath, "utf8");
|
|
165
|
+
} catch {
|
|
166
|
+
die(`index.html not found at ${indexPath} — run assemble-index.mjs first`);
|
|
167
|
+
}
|
|
168
|
+
const order = mountedFramesInOrder(manifest, html);
|
|
169
|
+
if (order.length === 0) die("no frame clips found in index.html");
|
|
170
|
+
const frameIds = new Set(order.map((x) => x.id));
|
|
171
|
+
const clips = parseFrameClips(html, frameIds);
|
|
172
|
+
|
|
173
|
+
const gsapLines = [];
|
|
174
|
+
const applied = [];
|
|
175
|
+
for (let i = 1; i < order.length; i++) {
|
|
176
|
+
const spec = parseTransitionIn(order[i].frame.transitionIn);
|
|
177
|
+
if (!spec) continue; // hard cut
|
|
178
|
+
const incoming = clips.get(order[i].id);
|
|
179
|
+
const outgoing = clips.get(order[i - 1].id);
|
|
180
|
+
const rec = resolveRecord(spec, byName, reg, (m) =>
|
|
181
|
+
console.error(` ! frame ${order[i].id}: ${m}`),
|
|
182
|
+
);
|
|
183
|
+
const dur = resolveDur(spec, rec, reg);
|
|
184
|
+
const T = r3(incoming.start); // cut = incoming start (frames tile)
|
|
185
|
+
outgoing.duration = r3(outgoing.duration + dur); // extend outgoing only
|
|
186
|
+
gsapLines.push(
|
|
187
|
+
...buildGsap(rec, outgoing.id, incoming.id, dur, T, spec.direction, CW, CH, die),
|
|
188
|
+
);
|
|
189
|
+
applied.push({ from: outgoing.id, to: incoming.id, type: rec.name, dur, T });
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (applied.length === 0) {
|
|
193
|
+
console.log(`✓ transitions inject: 0 transitions (all cuts) — index.html unchanged`);
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// 0/1 ping-pong all frame clips in play order.
|
|
198
|
+
const ordered = [...clips.values()].sort((a, b) => a.start - b.start || a.id.localeCompare(b.id));
|
|
199
|
+
ordered.forEach((c, i) => {
|
|
200
|
+
c.track = i % 2;
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
// rewrite each clip block: start unchanged; duration possibly extended; track ping-ponged.
|
|
204
|
+
for (const c of clips.values()) {
|
|
205
|
+
const nb = c.block
|
|
206
|
+
.replace(/data-duration="[\d.]+"/, `data-duration="${c.duration}"`)
|
|
207
|
+
.replace(/data-track-index="\d+"/, `data-track-index="${c.track}"`);
|
|
208
|
+
html = html.replace(c.block, nb);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// stamp the GSAP after the master timeline anchor.
|
|
212
|
+
const anchor = 'window.__timelines["main"] = gsap.timeline({ paused: true });';
|
|
213
|
+
if (!html.includes(anchor)) die("master timeline anchor not found in index.html");
|
|
214
|
+
// The transition tweens alone leave window.__timelines["main"] spanning only the
|
|
215
|
+
// last transition (e.g. 24.7s), shorter than the real composition. The Studio
|
|
216
|
+
// reads main.duration() as its master duration and parses clips against it, so a
|
|
217
|
+
// short master collapses its timeline (clips dropped, duration wrong, blank stage)
|
|
218
|
+
// — the render engine is unaffected (it trusts the root data-duration attr). Stamp
|
|
219
|
+
// a full-span anchor so main.duration() == composition total. Mirrors the
|
|
220
|
+
// `tl.to({}, { duration })` anchor captions.html already uses.
|
|
221
|
+
const rootDurMatch = html.match(/data-composition-id="main"[^>]*?data-duration="([\d.]+)"/);
|
|
222
|
+
const totalDur = rootDurMatch ? Number(rootDurMatch[1]) : null;
|
|
223
|
+
const block = [
|
|
224
|
+
anchor,
|
|
225
|
+
" // ── frame transitions (injected by transitions.mjs) ──",
|
|
226
|
+
' (function () { var tl = window.__timelines["main"];',
|
|
227
|
+
...gsapLines.map((l) => " " + l),
|
|
228
|
+
...(totalDur
|
|
229
|
+
? [
|
|
230
|
+
` tl.to({}, { duration: ${totalDur} }, 0); // full-span anchor — main.duration() == composition total (Studio master duration)`,
|
|
231
|
+
]
|
|
232
|
+
: []),
|
|
233
|
+
" })();",
|
|
234
|
+
].join("\n");
|
|
235
|
+
html = html.replace(anchor, block);
|
|
236
|
+
|
|
237
|
+
writeFileSync(indexPath, html);
|
|
238
|
+
console.log(`✓ transitions inject: ${applied.length} transition(s) stamped into index.html`);
|
|
239
|
+
for (const a of applied) console.log(` ${a.from}→${a.to}: ${a.type} ${a.dur}s @ T=${a.T}s`);
|
|
240
|
+
const tracks = ordered
|
|
241
|
+
.map((c) => `${c.id}[t${c.track} ${c.start}→${r3(c.start + c.duration)}]`)
|
|
242
|
+
.join(" ");
|
|
243
|
+
console.log(` tracks: ${tracks}`);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function runVerify(argv) {
|
|
247
|
+
const hyperframesDir = resolve(flag(argv, "hyperframes", "."));
|
|
248
|
+
const storyboardPath = resolve(flag(argv, "storyboard", join(hyperframesDir, "STORYBOARD.md")));
|
|
249
|
+
const indexPath = resolve(flag(argv, "index", join(hyperframesDir, "index.html")));
|
|
250
|
+
const bail = (msg) => {
|
|
251
|
+
console.error(`✗ transitions verify: ${msg}`);
|
|
252
|
+
process.exit(1);
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
if (!existsSync(storyboardPath)) bail("STORYBOARD.md not found");
|
|
256
|
+
if (!existsSync(indexPath)) bail("index.html not found");
|
|
257
|
+
|
|
258
|
+
const manifest = parseStoryboard(readFileSync(storyboardPath, "utf8"));
|
|
259
|
+
const html = readFileSync(indexPath, "utf8");
|
|
260
|
+
const order = mountedFramesInOrder(manifest, html);
|
|
261
|
+
const frameIds = new Set(order.map((x) => x.id));
|
|
262
|
+
const clips = parseFrameClips(html, frameIds);
|
|
263
|
+
|
|
264
|
+
const EPS = 0.011;
|
|
265
|
+
const overlaps = (a, b) =>
|
|
266
|
+
a.start < b.start + b.duration - EPS && b.start < a.start + a.duration - EPS;
|
|
267
|
+
const fail = [];
|
|
268
|
+
|
|
269
|
+
// (4) global no same-track overlap (the lint invariant).
|
|
270
|
+
const all = [...clips.values()];
|
|
271
|
+
for (let i = 0; i < all.length; i++)
|
|
272
|
+
for (let j = i + 1; j < all.length; j++) {
|
|
273
|
+
const a = all[i];
|
|
274
|
+
const b = all[j];
|
|
275
|
+
if (a.track === b.track && overlaps(a, b))
|
|
276
|
+
fail.push(`same-track overlap: ${a.id}[t${a.track}] & ${b.id}[t${b.track}]`);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
const bm = html.match(/frame transitions \(injected[\s\S]*?\}\)\(\);/);
|
|
280
|
+
const txBlock = bm ? bm[0] : "";
|
|
281
|
+
|
|
282
|
+
let expected = 0;
|
|
283
|
+
for (let i = 1; i < order.length; i++) {
|
|
284
|
+
const spec = parseTransitionIn(order[i].frame.transitionIn);
|
|
285
|
+
if (!spec) continue;
|
|
286
|
+
expected++;
|
|
287
|
+
const to = clips.get(order[i].id);
|
|
288
|
+
const from = clips.get(order[i - 1].id);
|
|
289
|
+
if (!to || !from) {
|
|
290
|
+
fail.push(`boundary ${order[i - 1].id}→${order[i].id}: wrapper missing`);
|
|
291
|
+
continue;
|
|
292
|
+
}
|
|
293
|
+
if (!txBlock.includes(`"#el-${from.id}"`) || !txBlock.includes(`"#el-${to.id}"`))
|
|
294
|
+
fail.push(`boundary ${from.id}→${to.id}: injected block does not reference both ids`);
|
|
295
|
+
const overlapAmt = r3(from.start + from.duration - to.start);
|
|
296
|
+
if (overlapAmt <= 0) fail.push(`boundary ${from.id}→${to.id}: no overlap (${overlapAmt}s)`);
|
|
297
|
+
if (from.track === to.track)
|
|
298
|
+
fail.push(`boundary ${from.id}→${to.id}: both on track ${from.track}`);
|
|
299
|
+
}
|
|
300
|
+
if (expected > 0 && !txBlock)
|
|
301
|
+
fail.push(`${expected} transition(s) expected but no injected block found`);
|
|
302
|
+
|
|
303
|
+
if (fail.length) {
|
|
304
|
+
console.error(`✗ transitions verify: ${fail.length} failure(s):`);
|
|
305
|
+
for (const f of fail) console.error(` - ${f}`);
|
|
306
|
+
process.exit(1);
|
|
307
|
+
}
|
|
308
|
+
console.log(
|
|
309
|
+
`✓ transitions verify: ${expected} transition(s) verified (cross-track, overlap>0, both ids referenced, no same-track overlap)`,
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
const sub = process.argv[2];
|
|
314
|
+
const rest = process.argv.slice(3);
|
|
315
|
+
if (sub === "inject") runInject(rest);
|
|
316
|
+
else if (sub === "verify") runVerify(rest);
|
|
317
|
+
else {
|
|
318
|
+
console.error("usage: node transitions.mjs <inject|verify> [args...]");
|
|
319
|
+
process.exit(2);
|
|
320
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
# Frame worker — faceless-explainer per-frame composition author
|
|
2
|
+
|
|
3
|
+
> You build **one** frame's composition HTML and nothing else. You run N-up, one frame each — siblings build the others. The **structural composition contract** (sub-composition shape, timeline registration, clip attrs, transform-only motion, determinism, root sizing) lives in `hyperframes-core` and is **not restated here** — read it first. This file carries only what's specific to a faceless-explainer frame. Tempted to add a generic GSAP / timeline rule here? Wrong home — it belongs in `hyperframes-core`.
|
|
4
|
+
|
|
5
|
+
**INPUT** — your dispatch context provides:
|
|
6
|
+
|
|
7
|
+
- `PROJECT_DIR` — the project root; all paths are relative to it.
|
|
8
|
+
- `frame_id` — e.g. `03-compounds`. Use it **verbatim** as the composition id, the `window.__timelines` key, and the file name (`compositions/frames/03-compounds.html`) — that path **is** the frame's `src` in `STORYBOARD.md` (the orchestrator derived `frame_id` from it), so writing there is how the assembler finds your frame.
|
|
9
|
+
- Your **`## Frame N` block** in `STORYBOARD.md` (read it; never write to that file — see below):
|
|
10
|
+
- `scene` — a one-line contact-sheet caption. **Design intent, never visible DOM text.**
|
|
11
|
+
- `voiceover` — the narration line. **Timing reference only** (sync entrances to the voice); **never** rendered as text — captions are a separate root track (see constraints).
|
|
12
|
+
- `duration` — your render length in seconds. **Fixed upstream; never change it or tween to fill a different length.**
|
|
13
|
+
- `transition_in` — informational. The injector stamps it at the root; **you do not author transitions.**
|
|
14
|
+
- the **time-coded shot sequence** — your build spec. A sequence of Scene lines (`Scene 1 (0.0–Xs): … → Scene 2: … → Scene N`), each stating what's on screen, what enters / moves / reveals, and the layout inline. Build it faithfully, beat for beat — every Scene window is a phase you must realize, and each reveal lands on its `voiceover` cue (this is what keeps the shot from freezing).
|
|
15
|
+
- `blueprint:` — an id (or the literal `compose`). The id points to `../hyperframes-animation/blueprints/<id>.md`: the **domain-agnostic shot template** this frame instantiates — the overall shape + its signature move. Read it for the shape; `compose` means there's no template, sequence the shot from the Scene lines directly.
|
|
16
|
+
- `focal:` — which **invented** element is the hero.
|
|
17
|
+
- `roles:` — each invented element's role: `foreground subject` / `background` full-bleed / `supporting`. Because the explainer is **faceless, these are elements you design** (a hero word, a diagram node, a chart series, a coined-term card), not captured assets. The **only** real media is a user-supplied image, when present: `public/<basename> — description` (a **`[video]`** tag marks a `.mp4` clip the user provided).
|
|
18
|
+
- `sfx:` — the orchestrator's; you mount no audio.
|
|
19
|
+
- `frame.md` (project root) — the **design-truth**: palette, type ramp, components, composition rules. The LOOK. Pull every visual token from here.
|
|
20
|
+
- `RULES_DIR` — absolute path to this skill's local `../hyperframes-animation/rules/`. The **named motion verbs in the Scene lines** (and the moves the blueprint cites) resolve to rule recipes here: `RULES_DIR/<id>.md` is the mechanics for a motion. (A few rules link an optional runnable demo in the shared `../hyperframes-animation/examples/<id>.html` — open it only when a recipe is unclear.)
|
|
21
|
+
- `../references/cut-catalog.md` — the **cut catalog** (zoom-through / inverse / cut-the-curve / waterfall). When a Scene seam is a within-scene swap, a scene-to-scene cut, or a text-to-text line change, build it INSIDE your composition per this catalog (Z-scale + blur + opacity, or per-word x-staggers). You never author the between-frame transition — story's `transition_in` + the injector own that.
|
|
22
|
+
- Canvas `<width>×<height>` and `Captions: <enabled | disabled>` (+ the keep-out cutoff when enabled).
|
|
23
|
+
|
|
24
|
+
**Retry** — if your context carries lint / validate feedback from a prior pass, read it first and re-author so none of those findings recur; treat each as a hard constraint.
|
|
25
|
+
|
|
26
|
+
**OUTPUT** — `compositions/frames/<frame_id>.html`, one self-contained sub-composition. Writing it (past the self-check below) is your **terminal action** — you do not edit `STORYBOARD.md`, mint audio, assemble the index, run the CLI, or report back. The orchestrator picks up the file and marks the frame's `status`.
|
|
27
|
+
|
|
28
|
+
## You do NOT decide
|
|
29
|
+
|
|
30
|
+
These belong to other steps — touching them collides with a sibling or breaks an upstream contract:
|
|
31
|
+
|
|
32
|
+
- **What is SAID** — narration is locked in `SCRIPT.md` / the `voiceover` line. You only show; you never write or restate narration text.
|
|
33
|
+
- **Duration** — fixed from real voice timing. Build your entrance to land within it; don't stretch or trim it.
|
|
34
|
+
- **Transitions between frames** — the injector stamps them onto the root timeline. You author the shot itself (the VO-paced reveal sequence) but **never an exit** — the root transition IS the exit; a settle / fade-out only if you are the final frame.
|
|
35
|
+
- **Audio** (narration / BGM / SFX) — assembled at the root by the orchestrator. **No `<audio>` element in your composition.**
|
|
36
|
+
- **Design tokens** — palette / fonts / components come from `frame.md`. Don't invent them, and **never lift a word, label, or wordmark out of `frame.md` as your copy** — it is a style spec, not the video's content. On-screen text comes from your frame's `scene` / narrative.
|
|
37
|
+
- **Which motions exist** — named upstream in your block (the shot sequence's motion verbs + `blueprint:`). Implement them; don't invent new ones. You design the **invented visuals** the Scene lines describe (typography / abstract graphics / diagrams / data-viz), but you have **no asset-fetch tool** — never fabricate an image URL or reference a file that isn't the user-supplied `public/<basename>`.
|
|
38
|
+
- **The shared `STORYBOARD.md`** — read your block, never write it. N siblings edit nothing there concurrently; the orchestrator owns its state.
|
|
39
|
+
|
|
40
|
+
## Frame constraints
|
|
41
|
+
|
|
42
|
+
Generic seek-safety + structure live in `hyperframes-core` (read it; not restated). These are the **faceless-explainer deltas**, each load-bearing:
|
|
43
|
+
|
|
44
|
+
- **Caption keep-out — all content in the top ~83%.** A karaoke caption pill owns the bottom ~17% of the canvas. Keep every element (headline, diagram, coined-term card, stats) above `y ≈ 0.83 × height` — compute the pixel cutoff from your canvas (e.g. `≤ 900` on a 1080-tall frame, `≤ 1600` on a 1920-tall portrait). Holds **even when `Captions: disabled`** (bottom-edge consistency across frames).
|
|
45
|
+
- **Fill the content area — especially portrait.** Compose the whole top-83% region; don't float one small cluster mid-frame. Anchor the hero high (~0.2–0.35 × height), flow supporting elements down with rhythm, scale hero type toward full-bleed. (Landscape's region is short, so vertical centering near 0.42 × height is fine.)
|
|
46
|
+
- **Visible text is short motion-graphics copy** — a hero word / coined term / stat / one-word emphasis (`"COMPOUNDING"`, `"2×"`), never a sentence from the narration. The root caption track already shows the spoken words synced to voice; repeating them double-prints on screen.
|
|
47
|
+
- **Build the whole shot — reveal across the full `duration`, never front-load.** Dumping the whole canvas in the first ~25% then holding it is exactly what reads as a PowerPoint slide. Instead reveal each piece — a line, a layer, a node, a stat — **as the `voiceover` reaches it** (on a silent frame, on the beat), sequencing reveals across the shot and especially the back ~50%, with the macro camera move running underneath. **Only EXITS are banned** — a non-final frame unmounts mid-frame, so an exit tween truncates and reads as a glitch (the root transition IS the exit); mid-shot reveals are free and seek-safe. The lone exception is a note marked as a deliberate hold / stillness frame: there, an entrance + a quiet settle is right (a held read beats bad motion).
|
|
48
|
+
- **Implement the shot sequence faithfully — every Scene is a timeline phase.** The Scene lines ARE the build: map each Scene onto a phase of the one timeline, each piece revealing as the `voiceover` reaches it. For each **named motion** in a Scene, open its rule recipe under `RULES_DIR/<id>.md` and reproduce its mechanics — **never name-guess** (a guess loses the signature move). The **`blueprint:` template** (`../hyperframes-animation/blueprints/<id>.md`) gives the overall shape; read it and keep its **signature move** recognizable, then instantiate it with this frame's invented content / timing. `compose` → no template; sequence the shot straight from the Scene lines. Whichever, never front-load the whole sequence at `t=0` — pace the reveals to the voiceover.
|
|
49
|
+
- **Design each element by its `roles`** (the `focal` is the hero): a `foreground subject` is the thing the eye lands on — respect the 83% keep-out, lay text around it, not over it; a `background` is full-bleed and dimmed ~30–50% so foreground content stays legible; `supporting` elements (labels, secondary shapes, ambient layers) stay quiet. These are **invented** — you build them in SVG / CSS / type, not from a file. **If the user supplied a real image** named in `roles:`/`focal:`, place it: a `[video]` candidate (`.mp4`) renders as a **muted** `<video class="clip">` (`data-start` / `data-duration` / `data-track-index` per the core clip contract), a **direct child of the frame root** — never nested in another timed element, or the renderer freezes it; an untagged image → `<img>`.
|
|
50
|
+
|
|
51
|
+
## Workflow
|
|
52
|
+
|
|
53
|
+
1. **Read** — `hyperframes-core`'s composition contract (the structural law), then `frame.md` (the look) and your `## Frame N` block (the shot sequence + `blueprint:` / `focal:` / `roles:`). **Then read the blueprint template** `../hyperframes-animation/blueprints/<id>.md` (skip if `compose`) for the shot's shape and signature move, and **open the rule recipe `RULES_DIR/<id>.md` for every named motion** in the Scene lines (plus the shared `../hyperframes-animation/examples/<id>.html` when the recipe is unclear): you reproduce these mechanics, not improvise them. Internalize the self-check codes below before you write — most lethal is **template transport**: every `<style>` + `<script>` (including the gsap load) must live INSIDE `<template>`, because the runtime only clones template contents and `lint` / `validate` / `inspect` can miss the resulting blank sub-composition.
|
|
54
|
+
2. **Design** — turn the time-coded shot sequence into a timeline using `frame.md`'s components and type ramp: each Scene window becomes a phase revealed on its `voiceover` cue, each named motion built from the recipe you just read, the blueprint's signature move kept recognizable. Invent the visual elements the Scene lines describe (the diagram, the hero word, the metaphor), and find a visual idea that reinforces the beat, not a literal restyle of the words.
|
|
55
|
+
3. **Author** — write the full sub-composition to `compositions/frames/<frame_id>.html` (rewrite to iterate; last write wins). `<template>`-wrapped root carrying `data-composition-id="<frame_id>"` and styled via `#root` (not a class on that element — see the self-check below), exactly one `gsap.timeline({ paused: true })` registered at `window.__timelines["<frame_id>"]`, built synchronously — per the core contract.
|
|
56
|
+
4. **Self-check, then finish** — re-read your file against the checklist below and fix in place. Writing the file is your terminal action; you do **not** run the CLI.
|
|
57
|
+
|
|
58
|
+
## Self-check before finishing (you do NOT run the CLI)
|
|
59
|
+
|
|
60
|
+
You **can't** meaningfully run `hyperframes lint` / `validate` / `inspect` here: they operate on the **assembled project** (the `index.html` graph / bundle), and your frame isn't wired in yet — so they report on _other_ files, not yours (a false green). The **orchestrator** runs them at **Step 6, after assembly** (the correct unit), and **re-dispatches you with the finding** if your frame fails (see **Retry** above). So get it right on write: re-read your file against this checklist before finishing — the codes in parens are `hyperframes lint`'s and what the orchestrator may cite back (the rules behind them live in `hyperframes-core`):
|
|
61
|
+
|
|
62
|
+
- `missing_template_wrapper` / `missing_composition_id` — root is `<template>`-wrapped and carries `data-composition-id="<frame_id>"`.
|
|
63
|
+
- **Template transport** — every `<style>` and `<script>` block, including the GSAP load, lives inside `<template>`.
|
|
64
|
+
- `subcomposition_root_styled_by_class` — **style the frame root via `#root`, never a class on the `data-composition-id` element**: at render a class on the root gets scoped to a descendant selector that can't match it, so the **whole scene renders unstyled** (Studio preview still looks right — trust this rule, not the preview). Descendants use plain selectors.
|
|
65
|
+
- **Full-bleed background on a `class="clip"` layer, never `#root`** — author a frame's full-bleed ground (color field / gradient / grid) as a dedicated full-duration `class="clip"` background element on the lowest content track, **not** as a `background` on the `#root` / `data-composition-id` element. At assembly the frame root is clip-gated to its scene window, so a background painted on the root is not a dependable full-frame ground — dark content can end up over the host `body` (black) and render invisible. The video's base ground is painted separately by the assembler from `frame.md`'s `canvas` color onto the index `#root`; your full-bleed clip rides on top of it.
|
|
66
|
+
- `clip_missing_data_attrs` — every `class="clip"` element has `data-start` / `data-duration` / `data-track-index`.
|
|
67
|
+
- `timeline_not_paused` / `timeline_not_registered` — one paused timeline, registered at `window.__timelines["<frame_id>"]`.
|
|
68
|
+
- `css_transition_used` + repeat / yoyo / non-deterministic logic — none present (the renderer seeks frame-by-frame).
|
|
69
|
+
- `gsap_css_transform_conflict` — never put a CSS `transform` (e.g. `translateY(-50%)` centering) on an element you then GSAP-animate a transform prop on (`x` / `y` / `scale` / `rotation`): GSAP overwrites the whole `transform` and silently drops the CSS centering (the element jumps). Center with `margin` / `inset` (or `top`/`left` + offset), fold the offset into the tween via `xPercent` / `yPercent`, or use `fromTo` (the rule exempts it).
|
|
70
|
+
- **Hero visibility** — the main subject is visible by `t <= 0.5s`; entrance tweens use `fromTo` instead of CSS-hidden starting states.
|
|
71
|
+
- `exit_animation_on_non_final_scene` — no exit tween unless you are the final frame.
|
|
72
|
+
- **No front-loading (not a slide)** — the shot's pieces reveal on their `voiceover` cues across the duration, not all fired at `t=0`; a non-still frame keeps content arriving rather than holding a full canvas from ~25%.
|
|
73
|
+
- **Shot-sequence fidelity** — every Scene in the time-coded sequence is realized as a phase, the blueprint's signature move (unless `compose`) is present and recognizable, and the shot reveals to the voiceover (never front-loaded at `t=0`).
|
|
74
|
+
- `font_family_without_font_face` — every font you name has a matching `@font-face` (or `@import`) **inside this file**. **Only use fonts that ship as files** with the project: the families declared in `frame.md` (their `.woff2` live in `assets/fonts/` or `capture/assets/fonts/` — point the `@font-face` `src` at the real file you find there). **Never name a font that has no file**, including system CJK / Japanese / Devanagari families (`Hiragino Sans`, `Yu Gothic`, `Noto Sans CJK`, `Noto Sans Devanagari`, …): the render machine is a clean headless Chrome with none of them installed, so the text silently falls back to a generic font and the typography is wrong in the MP4. For non-Latin or multilingual visible text, either use a shipped font that covers the script, or romanize / transliterate it (e.g. `日本語` → `Japanese`); if neither is possible it is out of scope for this frame — do not invent a font name.
|
|
75
|
+
- **Keep-out + no-narration-text** (eyeball, no code) — nothing sits below the 83% cutoff; no narration sentence is rendered as visible text.
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
GNU AFFERO GENERAL PUBLIC LICENSE
|
|
2
|
+
Version 3, 19 November 2007
|
|
3
|
+
|
|
4
|
+
Copyright (C) 2024 Nevo David
|
|
5
|
+
|
|
6
|
+
This program is free software: you can redistribute it and/or modify
|
|
7
|
+
it under the terms of the GNU Affero General Public License as published
|
|
8
|
+
by the Free Software Foundation, either version 3 of the License, or
|
|
9
|
+
(at your option) any later version.
|
|
10
|
+
|
|
11
|
+
This program is distributed in the hope that it will be useful,
|
|
12
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
13
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
14
|
+
GNU Affero General Public License for more details.
|
|
15
|
+
|
|
16
|
+
You should have received a copy of the GNU Affero General Public License
|
|
17
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# FlockPoster Customer Skill
|
|
2
|
+
|
|
3
|
+
This repository contains a customer-safe `SKILL.md` for using FlockPoster through the public CLI and public API.
|
|
4
|
+
|
|
5
|
+
It is intentionally limited to supported customer workflows:
|
|
6
|
+
- install `flockposter-cli`
|
|
7
|
+
- configure `FLOCKPOSTER_API_KEY`
|
|
8
|
+
- discover integrations and provider settings
|
|
9
|
+
- upload media
|
|
10
|
+
- create draft or scheduled posts
|
|
11
|
+
- handle platform-specific cases for X, TikTok, Instagram, and YouTube
|
|
12
|
+
- fetch analytics
|
|
13
|
+
- recover missing release IDs
|
|
14
|
+
|
|
15
|
+
## Install the CLI
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
npm install -g flockposter-cli
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Verify installation:
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
flockposter --help
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
## Configure access
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
export FLOCKPOSTER_API_KEY=your_api_key_here
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Optional for self-hosted instances:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
export FLOCKPOSTER_API_URL=https://your-host.example.com/api
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Quick start
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
flockposter integrations:list
|
|
43
|
+
|
|
44
|
+
flockposter posts:create \
|
|
45
|
+
-c "Hello from FlockPoster" \
|
|
46
|
+
-s "2026-05-18T15:00:00Z" \
|
|
47
|
+
-i "your-integration-id"
|
|
48
|
+
|
|
49
|
+
flockposter posts:list
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## Provider examples
|
|
53
|
+
|
|
54
|
+
The agent-facing skill includes exact examples and guardrails for:
|
|
55
|
+
- X posts, reply controls, communities, and threads
|
|
56
|
+
- TikTok direct posting and upload-without-posting flows
|
|
57
|
+
- Instagram posts, Reels, Stories, and Trial Reels
|
|
58
|
+
- YouTube uploads and Shorts
|
|
59
|
+
|
|
60
|
+
Ready-to-use examples are included inline in `SKILL.md` so the landing page `SKILL.md` clipboard button is self-contained.
|
|
61
|
+
|
|
62
|
+
## Files
|
|
63
|
+
|
|
64
|
+
- `SKILL.md` contains the agent-facing workflow and guardrails.
|
|
65
|
+
- `README.md` contains the human-facing quick start.
|
|
66
|
+
- `examples/` contains the same customer-safe CLI and public API payload examples as standalone files.
|
|
67
|
+
|
|
68
|
+
## Public links
|
|
69
|
+
|
|
70
|
+
- App: `https://app.flockposter.com`
|
|
71
|
+
- Docs: `https://docs.flockposter.com`
|
|
72
|
+
- npm: `https://www.npmjs.com/package/flockposter-cli`
|