dsh-hyperframes 0.9.1 → 0.9.3
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/CHANGELOG.md +11 -1
- package/README.en.md +3 -1
- package/README.md +3 -1
- package/docs/USAGE.en.md +2 -2
- package/docs/USAGE.md +2 -2
- package/lib/client.js +84 -67
- package/lib/index.js +1 -1
- package/lib/media-templates.d.ts +3 -3
- package/lib/media-templates.js +1 -1
- package/package.json +4 -3
- package/plugin.json +5 -0
- package/skills/NOTICE.md +3 -0
- package/skills/UPSTREAM-LICENSE.txt +190 -0
- package/skills/UPSTREAM.json +355 -0
- package/skills/embedded-captions/SKILL.md +4 -277
- package/skills/faceless-explainer/SKILL.md +4 -231
- package/skills/figma/SKILL.md +34 -113
- package/skills/general-video/SKILL.md +4 -161
- package/skills/hyperframes/SKILL.md +52 -115
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/biennale-yellow/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/blockframe/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/blue-professional/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/bold-poster/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/broadside/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/capsule/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/cartesian/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/cobalt-grid/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/FRAME.md +2 -2
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/coral/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/creative-mode/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/daisy-days/caption-skin.html +7 -8
- package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/editorial-forest/caption-skin.html +7 -8
- package/skills/hyperframes/references/captions.md +46 -0
- package/skills/hyperframes/references/film.md +48 -0
- package/skills/hyperframes/references/format.md +158 -0
- package/skills/hyperframes/references/look.md +69 -0
- package/skills/hyperframes/references/motion.md +95 -0
- package/skills/hyperframes/references/overlays.md +39 -0
- package/skills/hyperframes/references/plugin-installation.md +3 -3
- package/skills/hyperframes/references/review.md +51 -0
- package/skills/hyperframes/references/runtimes.md +69 -0
- package/skills/hyperframes/references/skill-lifecycle.md +28 -14
- package/skills/hyperframes/references/sound.md +43 -0
- package/skills/hyperframes/references/spec.md +76 -0
- package/skills/hyperframes/references/story.md +103 -0
- package/skills/hyperframes/references/storyboard-format.md +30 -22
- package/skills/hyperframes/references/storyboard.md +36 -0
- package/skills/hyperframes/references/types/3d.md +25 -0
- package/skills/hyperframes/references/types/character.md +20 -0
- package/skills/hyperframes/references/types/data.md +19 -0
- package/skills/hyperframes/references/types/explainer.md +34 -0
- package/skills/hyperframes/references/types/launch.md +41 -0
- package/skills/hyperframes/references/types/music.md +24 -0
- package/skills/hyperframes/references/types/vertical.md +23 -0
- package/skills/{motion-graphics/categories/maps → hyperframes/scripts}/bake-basemap.mjs +71 -20
- package/skills/hyperframes/scripts/lib/main-module.mjs +13 -0
- package/skills/hyperframes/scripts/lib/main-module.test.mjs +46 -0
- package/skills/{motion-graphics/grounding → hyperframes/scripts}/locate.mjs +1 -1
- package/skills/hyperframes/scripts/plugin-cli.mjs +4 -3
- package/skills/hyperframes/scripts/plugin-cli.test.mjs +5 -1
- package/skills/hyperframes-animation/SKILL.md +4 -82
- package/skills/hyperframes-audio/SKILL.md +4 -472
- package/skills/hyperframes-cli/SKILL.md +76 -158
- package/skills/hyperframes-cli/references/beats.md +3 -7
- package/skills/hyperframes-cli/references/cloud.md +4 -4
- package/skills/hyperframes-cli/references/cloudrun.md +2 -2
- package/skills/hyperframes-cli/references/conventions.md +17 -0
- package/skills/hyperframes-cli/references/doctor-browser.md +24 -1
- package/skills/hyperframes-cli/references/feedback.md +14 -0
- package/skills/hyperframes-cli/references/init-and-scaffold.md +13 -8
- package/skills/hyperframes-cli/references/lambda.md +6 -2
- package/skills/hyperframes-cli/references/lint-validate-inspect.md +34 -11
- package/skills/hyperframes-cli/references/preview-render.md +13 -4
- package/skills/hyperframes-cli/references/upgrade-info-misc.md +8 -0
- package/skills/hyperframes-core/SKILL.md +4 -94
- package/skills/hyperframes-creative/SKILL.md +4 -67
- package/skills/hyperframes-keyframes/SKILL.md +4 -258
- package/skills/hyperframes-registry/SKILL.md +37 -128
- package/skills/hyperframes-registry/references/discovery.md +2 -2
- package/skills/hyperframes-registry/references/search.md +67 -0
- package/skills/hyperframes-studio/SKILL.md +4 -71
- package/skills/media-use/SKILL.md +50 -88
- package/skills/media-use/audio/references/bgm.md +4 -2
- package/skills/media-use/audio/references/captions/authoring.md +1 -2
- package/skills/media-use/audio/references/captions/motion.md +5 -5
- package/skills/media-use/audio/references/requirements.md +7 -7
- package/skills/media-use/audio/references/sfx.md +20 -14
- package/skills/media-use/audio/references/transcribe.md +2 -2
- package/skills/media-use/audio/references/tts.md +26 -12
- package/skills/media-use/audio/scripts/audio.mjs +25 -17
- package/skills/media-use/audio/scripts/audio.test.mjs +121 -4
- package/skills/{hyperframes-audio → media-use/audio}/scripts/carve.mjs +2 -14
- package/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +20 -2
- package/skills/media-use/audio/scripts/heygen-tts.mjs +3 -2
- package/skills/media-use/audio/scripts/heygen-tts.test.mjs +38 -0
- package/skills/media-use/audio/scripts/heygen-voice.mjs +98 -0
- package/skills/media-use/audio/scripts/heygen-voice.test.mjs +233 -0
- package/skills/media-use/audio/scripts/lib/bgm.mjs +8 -4
- package/skills/media-use/audio/scripts/lib/bgm.test.mjs +45 -1
- package/skills/media-use/audio/scripts/lib/heygen.mjs +100 -16
- package/skills/media-use/audio/scripts/lib/heygen.test.mjs +205 -16
- package/skills/media-use/audio/scripts/lib/main-module.mjs +13 -0
- package/skills/media-use/audio/scripts/lib/media-record.mjs +118 -0
- package/skills/media-use/audio/scripts/lib/media-record.test.mjs +224 -0
- package/skills/media-use/audio/scripts/lib/openverse.mjs +134 -0
- package/skills/media-use/audio/scripts/lib/python.mjs +19 -5
- package/skills/media-use/audio/scripts/lib/python.test.mjs +69 -1
- package/skills/media-use/audio/scripts/lib/sfx.mjs +141 -88
- package/skills/media-use/audio/scripts/lib/sfx.test.mjs +270 -8
- package/skills/media-use/audio/scripts/lib/tts.cleanup.test.mjs +175 -0
- package/skills/media-use/audio/scripts/lib/tts.mjs +28 -24
- package/skills/media-use/audio/scripts/lib/tts.test.mjs +74 -1
- package/skills/media-use/audio/scripts/wait-bgm.mjs +4 -0
- package/skills/media-use/audio/scripts/wait-bgm.test.mjs +44 -1
- package/skills/media-use/references/audio.md +2 -2
- package/skills/media-use/references/grading.md +5 -4
- package/skills/media-use/references/local.md +24 -0
- package/skills/media-use/references/media-treatments.md +5 -1
- package/skills/media-use/references/memory.md +10 -5
- package/skills/media-use/references/meta.md +17 -17
- package/skills/media-use/references/mixing.md +72 -0
- package/skills/media-use/references/operations.md +10 -8
- package/skills/media-use/references/resolve.md +1 -1
- package/skills/media-use/references/setup-providers.md +31 -17
- package/skills/media-use/scripts/compatibility.test.mjs +1 -56
- package/skills/media-use/scripts/lib/cutlist.mjs +9 -2
- package/skills/media-use/scripts/lib/duck.mjs +20 -3
- package/skills/media-use/scripts/lib/index-gen.mjs +2 -2
- package/skills/media-use/scripts/lib/manifest.mjs +85 -32
- package/skills/media-use/scripts/lib/prefs-store.mjs +47 -29
- package/skills/media-use/scripts/lib/recipe-store.mjs +7 -3
- package/skills/media-use/scripts/lib/telemetry.mjs +4 -1
- package/skills/media-use/scripts/lib/telemetry.test.mjs +73 -0
- package/skills/media-use/scripts/lib/words.mjs +1 -1
- package/skills/media-use/scripts/prefs.mjs +2 -3
- package/skills/media-use/scripts/recipe.mjs +1 -3
- package/skills/media-use/scripts/transcript-cut.mjs +23 -4
- package/skills/media-use/scripts/transcript-cut.test.mjs +224 -0
- package/skills/motion-graphics/SKILL.md +4 -172
- package/skills/music-to-video/SKILL.md +4 -204
- package/skills/pr-to-video/SKILL.md +4 -267
- package/skills/product-launch-video/SKILL.md +4 -258
- package/skills/remotion-to-hyperframes/SKILL.md +32 -115
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +3 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +3 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/README.md +8 -7
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +3 -3
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-1.html +6 -2
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-2.html +3 -4
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-3.html +2 -2
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +3 -0
- package/skills/remotion-to-hyperframes/references/api-map.md +41 -29
- package/skills/remotion-to-hyperframes/references/limitations.md +3 -3
- package/skills/remotion-to-hyperframes/references/lottie.md +21 -8
- package/skills/remotion-to-hyperframes/references/media.md +23 -6
- package/skills/remotion-to-hyperframes/references/timing.md +20 -8
- package/skills/remotion-to-hyperframes/scripts/tests/boxSizing.test.mjs +21 -0
- package/skills/slideshow/SKILL.md +42 -512
- package/skills/slideshow/references/standalone-harness.md +1 -1
- package/skills/talking-head-recut/SKILL.md +4 -1214
- package/skills/embedded-captions/CATALOG.md +0 -91
- package/skills/embedded-captions/assets/fonts/char-widths.json +0 -2211
- package/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +0 -242
- package/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +0 -242
- package/skills/embedded-captions/dna/README.md +0 -148
- package/skills/embedded-captions/dna/chrome.json +0 -68
- package/skills/embedded-captions/dna/cream.json +0 -69
- package/skills/embedded-captions/dna/documentary.json +0 -62
- package/skills/embedded-captions/dna/editorial.json +0 -70
- package/skills/embedded-captions/dna/glitch.json +0 -82
- package/skills/embedded-captions/dna/ink.json +0 -65
- package/skills/embedded-captions/dna/keynote.json +0 -62
- package/skills/embedded-captions/dna/loud.json +0 -75
- package/skills/embedded-captions/dna/neon.json +0 -58
- package/skills/embedded-captions/dna/velocity.json +0 -89
- package/skills/embedded-captions/modes/cinematic/README.md +0 -48
- package/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +0 -98
- package/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +0 -188
- package/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +0 -134
- package/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +0 -179
- package/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +0 -81
- package/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +0 -170
- package/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +0 -16
- package/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +0 -226
- package/skills/embedded-captions/modes/cinematic/engine.html +0 -355
- package/skills/embedded-captions/modes/standard/_anatomy.md +0 -233
- package/skills/embedded-captions/modes/standard/_motion.md +0 -192
- package/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +0 -97
- package/skills/embedded-captions/modes/standard/fonts/files/anton-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/audiowide-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/baloo-2-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/bangers-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/bodoni-moda-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/caveat-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-500-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/chakra-petch-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cinzel-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/cormorant-garamond-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/creepster-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/fredoka-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-italic.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-500-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-italic.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-600-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-800-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/inter-latin-900-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/monoton-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/orbitron-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/permanent-marker-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/press-start-2p-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-500-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/rajdhani-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/saira-stencil-one-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/shippori-mincho-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/sora-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/sora-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/space-grotesk-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/special-elite-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/teko-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/teko-latin-700-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/files/vt323-latin-400-normal.woff2 +0 -0
- package/skills/embedded-captions/modes/standard/fonts/fonts.css +0 -401
- package/skills/embedded-captions/references/aesthetic-principles.md +0 -167
- package/skills/embedded-captions/references/anti-patterns.md +0 -188
- package/skills/embedded-captions/references/bespoke-vs-presets.md +0 -178
- package/skills/embedded-captions/references/caption-grouping.md +0 -130
- package/skills/embedded-captions/references/composition-craft.md +0 -522
- package/skills/embedded-captions/references/direction-catalog.md +0 -138
- package/skills/embedded-captions/references/example-renders/champion.html +0 -371
- package/skills/embedded-captions/references/example-renders/memory-wall.html +0 -334
- package/skills/embedded-captions/references/failure-modes.md +0 -145
- package/skills/embedded-captions/references/layout-heuristics.md +0 -238
- package/skills/embedded-captions/references/motion-vocabulary.md +0 -148
- package/skills/embedded-captions/references/rail.md +0 -68
- package/skills/embedded-captions/references/reference-bar.md +0 -47
- package/skills/embedded-captions/references/scene-types.md +0 -94
- package/skills/embedded-captions/references/typographic-moves.md +0 -266
- package/skills/embedded-captions/references/typography-presets.md +0 -63
- package/skills/embedded-captions/scripts/audio-envelope.cjs +0 -95
- package/skills/embedded-captions/scripts/check-occlusion.cjs +0 -253
- package/skills/embedded-captions/scripts/check-overflow.cjs +0 -195
- package/skills/embedded-captions/scripts/check-rail-climax.cjs +0 -237
- package/skills/embedded-captions/scripts/check-timing.cjs +0 -173
- package/skills/embedded-captions/scripts/fill-timings.cjs +0 -124
- package/skills/embedded-captions/scripts/fit-fonts.cjs +0 -158
- package/skills/embedded-captions/scripts/fixtures/heroless/theme.json +0 -11
- package/skills/embedded-captions/scripts/gen-stroke-path.py +0 -57
- package/skills/embedded-captions/scripts/hf-cli.cjs +0 -33
- package/skills/embedded-captions/scripts/inject-fonts.cjs +0 -169
- package/skills/embedded-captions/scripts/lib-dna.cjs +0 -201
- package/skills/embedded-captions/scripts/make-cinematic.cjs +0 -1206
- package/skills/embedded-captions/scripts/make-composition.cjs +0 -405
- package/skills/embedded-captions/scripts/make-theme.cjs +0 -8623
- package/skills/embedded-captions/scripts/make-theme.test.mjs +0 -131
- package/skills/embedded-captions/scripts/matte.cjs +0 -268
- package/skills/embedded-captions/scripts/measure-layout.cjs +0 -294
- package/skills/embedded-captions/scripts/prepare.sh +0 -39
- package/skills/embedded-captions/scripts/preview-frames.cjs +0 -296
- package/skills/embedded-captions/scripts/preview-frames.test.mjs +0 -24
- package/skills/embedded-captions/scripts/render-and-composite.sh +0 -425
- package/skills/embedded-captions/scripts/render-theme.sh +0 -34
- package/skills/embedded-captions/scripts/safe-zones.cjs +0 -816
- package/skills/embedded-captions/scripts/transcribe.cjs +0 -323
- package/skills/embedded-captions/scripts/transcribe.test.mjs +0 -41
- package/skills/embedded-captions/themes/README.md +0 -243
- package/skills/embedded-captions/themes/anchor.json +0 -27
- package/skills/embedded-captions/themes/arcade.json +0 -51
- package/skills/embedded-captions/themes/aurora.json +0 -41
- package/skills/embedded-captions/themes/biolume.json +0 -35
- package/skills/embedded-captions/themes/brush.json +0 -74
- package/skills/embedded-captions/themes/chalkboard.json +0 -52
- package/skills/embedded-captions/themes/dossier.json +0 -56
- package/skills/embedded-captions/themes/graffiti.json +0 -62
- package/skills/embedded-captions/themes/hologram.json +0 -41
- package/skills/embedded-captions/themes/inkwater.json +0 -43
- package/skills/embedded-captions/themes/laser.json +0 -46
- package/skills/embedded-captions/themes/lastpage.json +0 -33
- package/skills/embedded-captions/themes/neonsign.json +0 -53
- package/skills/embedded-captions/themes/ordnance.json +0 -54
- package/skills/embedded-captions/themes/papercut.json +0 -37
- package/skills/embedded-captions/themes/popup.json +0 -46
- package/skills/embedded-captions/themes/ransom.json +0 -62
- package/skills/embedded-captions/themes/scoreboard.json +0 -54
- package/skills/embedded-captions/themes/spectrum.json +0 -46
- package/skills/embedded-captions/themes/stardust.json +0 -29
- package/skills/embedded-captions/themes/stomp.json +0 -43
- package/skills/embedded-captions/themes/terminal.json +0 -49
- package/skills/embedded-captions/themes/thunder.json +0 -44
- package/skills/embedded-captions/themes/transit.json +0 -44
- package/skills/embedded-captions/themes/vhs.json +0 -47
- package/skills/faceless-explainer/references/cut-catalog.md +0 -215
- package/skills/faceless-explainer/references/motion-language.md +0 -156
- package/skills/faceless-explainer/references/story-design.md +0 -255
- package/skills/faceless-explainer/references/visual-design.md +0 -146
- package/skills/faceless-explainer/scripts/assemble-index.mjs +0 -625
- package/skills/faceless-explainer/scripts/assemble-index.test.mjs +0 -127
- package/skills/faceless-explainer/scripts/audio.mjs +0 -293
- package/skills/faceless-explainer/scripts/audio.test.mjs +0 -176
- package/skills/faceless-explainer/scripts/build-frame.mjs +0 -554
- package/skills/faceless-explainer/scripts/captions.mjs +0 -524
- package/skills/faceless-explainer/scripts/captions.test.mjs +0 -219
- package/skills/faceless-explainer/scripts/frame-packets.mjs +0 -27
- package/skills/faceless-explainer/scripts/frame-packets.test.mjs +0 -66
- package/skills/faceless-explainer/scripts/lib/assets.mjs +0 -56
- package/skills/faceless-explainer/scripts/lib/bgm-volume.mjs +0 -4
- package/skills/faceless-explainer/scripts/lib/captured-fonts.mjs +0 -58
- package/skills/faceless-explainer/scripts/lib/dimensions.mjs +0 -45
- package/skills/faceless-explainer/scripts/lib/frame-packets-core.mjs +0 -194
- package/skills/faceless-explainer/scripts/lib/pad-frame-duration.mjs +0 -36
- package/skills/faceless-explainer/scripts/lib/storyboard.mjs +0 -249
- package/skills/faceless-explainer/scripts/lib/tokens.mjs +0 -211
- package/skills/faceless-explainer/scripts/lib/transition-registry.mjs +0 -38
- package/skills/faceless-explainer/scripts/lib/transitions.json +0 -71
- package/skills/faceless-explainer/scripts/transitions.mjs +0 -384
- package/skills/faceless-explainer/scripts/transitions.test.mjs +0 -70
- package/skills/faceless-explainer/sub-agents/frame-worker.md +0 -12
- package/skills/general-video/scripts/frame-packets.mjs +0 -38
- package/skills/general-video/scripts/frame-packets.test.mjs +0 -80
- package/skills/general-video/scripts/lib/frame-packets-core.mjs +0 -194
- package/skills/general-video/sub-agents/frame-worker.md +0 -34
- package/skills/hyperframes/references/brief-contract.md +0 -108
- package/skills/hyperframes/references/brief-format.md +0 -72
- package/skills/hyperframes/references/capability-menu.md +0 -47
- package/skills/hyperframes/references/frame-worker-core.md +0 -80
- package/skills/hyperframes/references/intent-interview.md +0 -71
- package/skills/hyperframes/references/pitch-round.md +0 -40
- package/skills/hyperframes/references/production-loop.md +0 -26
- package/skills/hyperframes/references/review-loop.md +0 -37
- package/skills/hyperframes/references/route-briefs.md +0 -11
- package/skills/hyperframes/references/routes/embedded-captions.md +0 -11
- package/skills/hyperframes/references/routes/faceless-explainer.md +0 -12
- package/skills/hyperframes/references/routes/general-video.md +0 -12
- package/skills/hyperframes/references/routes/motion-graphics.md +0 -11
- package/skills/hyperframes/references/routes/music-to-video.md +0 -12
- package/skills/hyperframes/references/routes/pr-to-video.md +0 -28
- package/skills/hyperframes/references/routes/product-launch-video.md +0 -13
- package/skills/hyperframes/references/routes/remotion-to-hyperframes.md +0 -9
- package/skills/hyperframes/references/routes/slideshow.md +0 -11
- package/skills/hyperframes/references/routes/talking-head-recut.md +0 -11
- package/skills/hyperframes/references/script-format.md +0 -52
- package/skills/hyperframes/references/subagent-dispatch.md +0 -35
- package/skills/hyperframes/references/workflow-catalog.md +0 -10
- package/skills/hyperframes/scripts/lib/frame-packets-core.mjs +0 -194
- package/skills/hyperframes-animation/adapters/animate-text.md +0 -64
- package/skills/hyperframes-animation/adapters/animejs.md +0 -130
- package/skills/hyperframes-animation/adapters/css-animations.md +0 -143
- package/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +0 -199
- package/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +0 -96
- package/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +0 -129
- package/skills/hyperframes-animation/adapters/gsap.md +0 -105
- package/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +0 -507
- package/skills/hyperframes-animation/adapters/lottie.md +0 -130
- package/skills/hyperframes-animation/adapters/three.md +0 -145
- package/skills/hyperframes-animation/adapters/typegpu.md +0 -182
- package/skills/hyperframes-animation/adapters/waapi.md +0 -101
- package/skills/hyperframes-animation/blueprints/agent-progress-theater.md +0 -76
- package/skills/hyperframes-animation/blueprints/camera-journey.md +0 -61
- package/skills/hyperframes-animation/blueprints/comparison-split.md +0 -27
- package/skills/hyperframes-animation/blueprints/constellation-hub.md +0 -63
- package/skills/hyperframes-animation/blueprints/cta-morph-press.md +0 -63
- package/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +0 -89
- package/skills/hyperframes-animation/blueprints/dataviz-countup.md +0 -59
- package/skills/hyperframes-animation/blueprints/device-surface-showcase.md +0 -68
- package/skills/hyperframes-animation/blueprints/fixed-anchor-cycle.md +0 -46
- package/skills/hyperframes-animation/blueprints/grid-card-assemble.md +0 -81
- package/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +0 -133
- package/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +0 -121
- package/skills/hyperframes-animation/blueprints/overwhelm-surround.md +0 -58
- package/skills/hyperframes-animation/blueprints/panel-edit-live-sync.md +0 -73
- package/skills/hyperframes-animation/blueprints/prompt-type-submit-generate.md +0 -85
- package/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +0 -37
- package/skills/hyperframes-animation/blueprints/ticker-takeover.md +0 -29
- package/skills/hyperframes-animation/blueprints/titlecard-reveal.md +0 -80
- package/skills/hyperframes-animation/blueprints/transcript-scroll-artifact-reveal.md +0 -45
- package/skills/hyperframes-animation/blueprints/typewriter-reveal.md +0 -51
- package/skills/hyperframes-animation/blueprints/video-text-pivot.md +0 -30
- package/skills/hyperframes-animation/blueprints/zoom-out-workspace-reveal.md +0 -68
- package/skills/hyperframes-animation/blueprints-index.md +0 -202
- package/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +0 -382
- package/skills/hyperframes-animation/examples/comparison-split-cards.html +0 -649
- package/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +0 -520
- package/skills/hyperframes-animation/examples/cta-morph-press.html +0 -468
- package/skills/hyperframes-animation/examples/cta-orbit-collapse.html +0 -1298
- package/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +0 -759
- package/skills/hyperframes-animation/examples/hook-counter-burst.html +0 -729
- package/skills/hyperframes-animation/examples/messaging-multi-phrase.html +0 -352
- package/skills/hyperframes-animation/examples/metric-video-text-pivot.html +0 -779
- package/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +0 -1374
- package/skills/hyperframes-animation/examples/proof-logo-chain.html +0 -861
- package/skills/hyperframes-animation/examples/takeover-ticker-displace.html +0 -347
- package/skills/hyperframes-animation/examples/workflow-approve-press.html +0 -606
- package/skills/hyperframes-animation/references/motion-blur.md +0 -133
- package/skills/hyperframes-animation/rules/3d-camera-flight.md +0 -180
- package/skills/hyperframes-animation/rules/3d-page-scroll.md +0 -135
- package/skills/hyperframes-animation/rules/3d-text-depth-layers.md +0 -128
- package/skills/hyperframes-animation/rules/ai-tracking-box.md +0 -139
- package/skills/hyperframes-animation/rules/ambient-glow-bloom.md +0 -133
- package/skills/hyperframes-animation/rules/anchored-layout-expand.md +0 -148
- package/skills/hyperframes-animation/rules/asr-keyword-glow.md +0 -128
- package/skills/hyperframes-animation/rules/avatar-cloud-network.md +0 -145
- package/skills/hyperframes-animation/rules/camera-cursor-tracking.md +0 -133
- package/skills/hyperframes-animation/rules/card-morph-anchor.md +0 -134
- package/skills/hyperframes-animation/rules/center-outward-expansion.md +0 -88
- package/skills/hyperframes-animation/rules/chart-scrub-readout.md +0 -151
- package/skills/hyperframes-animation/rules/chromatic-glitch.md +0 -150
- package/skills/hyperframes-animation/rules/context-sensitive-cursor.md +0 -140
- package/skills/hyperframes-animation/rules/control-target-sync.md +0 -131
- package/skills/hyperframes-animation/rules/coordinate-target-zoom.md +0 -138
- package/skills/hyperframes-animation/rules/counting-dynamic-scale.md +0 -115
- package/skills/hyperframes-animation/rules/css-marker-patterns.md +0 -208
- package/skills/hyperframes-animation/rules/cursor-click-ripple.md +0 -104
- package/skills/hyperframes-animation/rules/cursor-drag.md +0 -141
- package/skills/hyperframes-animation/rules/depth-of-field-blur.md +0 -112
- package/skills/hyperframes-animation/rules/depth-scatter-assemble.md +0 -139
- package/skills/hyperframes-animation/rules/discrete-text-sequence.md +0 -146
- package/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +0 -149
- package/skills/hyperframes-animation/rules/gradient-text-sweep.md +0 -136
- package/skills/hyperframes-animation/rules/gsap-effects.md +0 -196
- package/skills/hyperframes-animation/rules/hacker-flip-3d.md +0 -123
- package/skills/hyperframes-animation/rules/kinetic-beat-slam.md +0 -137
- package/skills/hyperframes-animation/rules/motion-blur-streak.md +0 -130
- package/skills/hyperframes-animation/rules/multi-cursor-choreography.md +0 -133
- package/skills/hyperframes-animation/rules/multi-phase-camera.md +0 -129
- package/skills/hyperframes-animation/rules/nudge-curve.md +0 -47
- package/skills/hyperframes-animation/rules/orbit-3d-entry.md +0 -148
- package/skills/hyperframes-animation/rules/particle-burst.md +0 -149
- package/skills/hyperframes-animation/rules/physics-press-reaction.md +0 -101
- package/skills/hyperframes-animation/rules/press-release-spring.md +0 -108
- package/skills/hyperframes-animation/rules/reactive-displacement.md +0 -92
- package/skills/hyperframes-animation/rules/scale-swap-transition.md +0 -88
- package/skills/hyperframes-animation/rules/sine-wave-loop.md +0 -85
- package/skills/hyperframes-animation/rules/split-tilt-cards.md +0 -123
- package/skills/hyperframes-animation/rules/spring-pop-entrance.md +0 -107
- package/skills/hyperframes-animation/rules/stat-bars-and-fills.md +0 -145
- package/skills/hyperframes-animation/rules/svg-icon-enrichment.md +0 -141
- package/skills/hyperframes-animation/rules/svg-path-draw.md +0 -122
- package/skills/hyperframes-animation/rules/theme-crossfade-morph.md +0 -126
- package/skills/hyperframes-animation/rules/vertical-spring-ticker.md +0 -104
- package/skills/hyperframes-animation/rules/viewport-change.md +0 -148
- package/skills/hyperframes-animation/rules/waterfall-entry.md +0 -81
- package/skills/hyperframes-animation/rules-index.md +0 -113
- package/skills/hyperframes-animation/scripts/animation-map-sampling.mjs +0 -40
- package/skills/hyperframes-animation/scripts/animation-map-sampling.test.mjs +0 -48
- package/skills/hyperframes-animation/scripts/animation-map.mjs +0 -659
- package/skills/hyperframes-animation/scripts/animation-map.test.mjs +0 -444
- package/skills/hyperframes-animation/scripts/package-loader.mjs +0 -415
- package/skills/hyperframes-animation/scripts/package-loader.test.mjs +0 -114
- package/skills/hyperframes-animation/techniques.md +0 -507
- package/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +0 -168
- package/skills/hyperframes-animation/transitions/catalog.md +0 -127
- package/skills/hyperframes-animation/transitions/css-3d.md +0 -12
- package/skills/hyperframes-animation/transitions/css-blur.md +0 -51
- package/skills/hyperframes-animation/transitions/css-cover.md +0 -43
- package/skills/hyperframes-animation/transitions/css-destruction.md +0 -95
- package/skills/hyperframes-animation/transitions/css-dissolve.md +0 -66
- package/skills/hyperframes-animation/transitions/css-distortion.md +0 -45
- package/skills/hyperframes-animation/transitions/css-grid.md +0 -10
- package/skills/hyperframes-animation/transitions/css-light.md +0 -49
- package/skills/hyperframes-animation/transitions/css-mechanical.md +0 -30
- package/skills/hyperframes-animation/transitions/css-other.md +0 -25
- package/skills/hyperframes-animation/transitions/css-push.md +0 -41
- package/skills/hyperframes-animation/transitions/css-radial.md +0 -37
- package/skills/hyperframes-animation/transitions/css-scale.md +0 -24
- package/skills/hyperframes-animation/transitions/overview.md +0 -153
- package/skills/hyperframes-audio/references/attributes.md +0 -138
- package/skills/hyperframes-audio/references/diagnosis.md +0 -276
- package/skills/hyperframes-audio/references/fx-registry.md +0 -84
- package/skills/hyperframes-audio/references/presets.md +0 -216
- package/skills/hyperframes-core/references/composition-patterns.md +0 -224
- package/skills/hyperframes-core/references/creator-editing-recipes.md +0 -491
- package/skills/hyperframes-core/references/data-attributes.md +0 -78
- package/skills/hyperframes-core/references/determinism-rules.md +0 -53
- package/skills/hyperframes-core/references/full-screen-motion.md +0 -67
- package/skills/hyperframes-core/references/minimal-composition.md +0 -69
- package/skills/hyperframes-core/references/sub-compositions.md +0 -176
- package/skills/hyperframes-core/references/tailwind.md +0 -104
- package/skills/hyperframes-core/references/tracks-and-clips.md +0 -87
- package/skills/hyperframes-core/references/variables-and-media.md +0 -107
- package/skills/hyperframes-creative/palettes/bold-energetic.md +0 -14
- package/skills/hyperframes-creative/palettes/clean-corporate.md +0 -14
- package/skills/hyperframes-creative/palettes/dark-premium.md +0 -14
- package/skills/hyperframes-creative/palettes/jewel-rich.md +0 -14
- package/skills/hyperframes-creative/palettes/monochrome.md +0 -14
- package/skills/hyperframes-creative/palettes/nature-earth.md +0 -14
- package/skills/hyperframes-creative/palettes/neon-electric.md +0 -14
- package/skills/hyperframes-creative/palettes/pastel-soft.md +0 -14
- package/skills/hyperframes-creative/palettes/warm-editorial.md +0 -14
- package/skills/hyperframes-creative/references/audio-reactive.md +0 -76
- package/skills/hyperframes-creative/references/beat-direction.md +0 -164
- package/skills/hyperframes-creative/references/composition-patterns.md +0 -199
- package/skills/hyperframes-creative/references/data-in-motion.md +0 -19
- package/skills/hyperframes-creative/references/design-adherence.md +0 -19
- package/skills/hyperframes-creative/references/design-picker.md +0 -123
- package/skills/hyperframes-creative/references/design-spec.md +0 -55
- package/skills/hyperframes-creative/references/house-style.md +0 -73
- package/skills/hyperframes-creative/references/motion-principles.md +0 -151
- package/skills/hyperframes-creative/references/narration.md +0 -92
- package/skills/hyperframes-creative/references/prompt-expansion.md +0 -68
- package/skills/hyperframes-creative/references/story-spine.md +0 -45
- package/skills/hyperframes-creative/references/storyboard-recipe.md +0 -57
- package/skills/hyperframes-creative/references/typography.md +0 -218
- package/skills/hyperframes-creative/references/video-composition.md +0 -63
- package/skills/hyperframes-creative/references/visual-styles.md +0 -457
- package/skills/hyperframes-creative/scripts/contrast-report.mjs +0 -538
- package/skills/hyperframes-creative/scripts/package-loader.mjs +0 -415
- package/skills/hyperframes-creative/scripts/package-loader.test.mjs +0 -114
- package/skills/hyperframes-creative/templates/design-picker.html +0 -1432
- package/skills/hyperframes-keyframes/agents/openai.yaml +0 -4
- package/skills/hyperframes-keyframes/references/keyframe-patterns.md +0 -108
- package/skills/motion-graphics/agents/builder.md +0 -41
- package/skills/motion-graphics/agents/director.md +0 -54
- package/skills/motion-graphics/agents/finalize.md +0 -17
- package/skills/motion-graphics/catalog-map.md +0 -52
- package/skills/motion-graphics/categories/asset-fusion/module.md +0 -37
- package/skills/motion-graphics/categories/charts/module.md +0 -22
- package/skills/motion-graphics/categories/kinetic-type/module.md +0 -19
- package/skills/motion-graphics/categories/logo-reveal/module.md +0 -17
- package/skills/motion-graphics/categories/lower-thirds/module.md +0 -20
- package/skills/motion-graphics/categories/maps/module.md +0 -61
- package/skills/motion-graphics/categories/news/module.md +0 -56
- package/skills/motion-graphics/categories/stat/module.md +0 -21
- package/skills/motion-graphics/categories/tweet/module.md +0 -16
- package/skills/motion-graphics/categories/webpage/module.md +0 -30
- package/skills/motion-graphics/grounding/PROTOCOL.md +0 -64
- package/skills/motion-graphics/phases/source/guide.md +0 -21
- package/skills/motion-graphics/references/builder-contract.md +0 -38
- package/skills/motion-graphics/references/motion-vocabulary.md +0 -47
- package/skills/motion-graphics/references/shot-plan-ir.md +0 -54
- package/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +0 -306
- package/skills/music-to-video/references/frame-skeleton.md +0 -100
- package/skills/music-to-video/references/montage.md +0 -55
- package/skills/music-to-video/references/motion-primitive-catalog.md +0 -75
- package/skills/music-to-video/references/motion-primitives/3d-card-flip/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/3d-card-flip/scene.html +0 -119
- package/skills/music-to-video/references/motion-primitives/assets/gsap.min.js +0 -11
- package/skills/music-to-video/references/motion-primitives/bg-flow-field/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/bg-flow-field/scene.html +0 -294
- package/skills/music-to-video/references/motion-primitives/binary-decrypt/index.html +0 -54
- package/skills/music-to-video/references/motion-primitives/binary-decrypt/scene.html +0 -85
- package/skills/music-to-video/references/motion-primitives/blur-resolve/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/blur-resolve/scene.html +0 -60
- package/skills/music-to-video/references/motion-primitives/braam-punch/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/braam-punch/scene.html +0 -100
- package/skills/music-to-video/references/motion-primitives/chromatic-split/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/chromatic-split/scene.html +0 -111
- package/skills/music-to-video/references/motion-primitives/chrome-sweep/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/chrome-sweep/scene.html +0 -68
- package/skills/music-to-video/references/motion-primitives/counting-punch/index.html +0 -54
- package/skills/music-to-video/references/motion-primitives/counting-punch/scene.html +0 -119
- package/skills/music-to-video/references/motion-primitives/crash-zoom-in/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/crash-zoom-in/scene.html +0 -120
- package/skills/music-to-video/references/motion-primitives/datamosh-smear/index.html +0 -55
- package/skills/music-to-video/references/motion-primitives/datamosh-smear/scene.html +0 -131
- package/skills/music-to-video/references/motion-primitives/directional-fill/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/directional-fill/scene.html +0 -103
- package/skills/music-to-video/references/motion-primitives/dolly-zoom/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/dolly-zoom/scene.html +0 -102
- package/skills/music-to-video/references/motion-primitives/electric-arc/index.html +0 -54
- package/skills/music-to-video/references/motion-primitives/electric-arc/scene.html +0 -105
- package/skills/music-to-video/references/motion-primitives/flash-cut/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/flash-cut/scene.html +0 -97
- package/skills/music-to-video/references/motion-primitives/gooey-metaball/index.html +0 -54
- package/skills/music-to-video/references/motion-primitives/gooey-metaball/scene.html +0 -206
- package/skills/music-to-video/references/motion-primitives/hard-cut/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/hard-cut/scene.html +0 -82
- package/skills/music-to-video/references/motion-primitives/hypercut-whip/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/hypercut-whip/scene.html +0 -44
- package/skills/music-to-video/references/motion-primitives/iris-open/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/iris-open/scene.html +0 -69
- package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/scene.html +0 -64
- package/skills/music-to-video/references/motion-primitives/liquid-morph/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/liquid-morph/scene.html +0 -96
- package/skills/music-to-video/references/motion-primitives/mask-reveal/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/mask-reveal/scene.html +0 -74
- package/skills/music-to-video/references/motion-primitives/mosaic-pack/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/mosaic-pack/scene.html +0 -89
- package/skills/music-to-video/references/motion-primitives/neon-flicker/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/neon-flicker/scene.html +0 -73
- package/skills/music-to-video/references/motion-primitives/outline-to-fill/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/outline-to-fill/scene.html +0 -82
- package/skills/music-to-video/references/motion-primitives/palette-flip/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/palette-flip/scene.html +0 -97
- package/skills/music-to-video/references/motion-primitives/particle-burst/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/particle-burst/scene.html +0 -106
- package/skills/music-to-video/references/motion-primitives/pixel-dissolve/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/pixel-dissolve/scene.html +0 -86
- package/skills/music-to-video/references/motion-primitives/radial-burst-lines/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/radial-burst-lines/scene.html +0 -130
- package/skills/music-to-video/references/motion-primitives/screen-shake/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/screen-shake/scene.html +0 -78
- package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/scene.html +0 -100
- package/skills/music-to-video/references/motion-primitives/spotlight-sweep/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/spotlight-sweep/scene.html +0 -102
- package/skills/music-to-video/references/motion-primitives/staggered-exit/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/staggered-exit/scene.html +0 -82
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/USAGE.md +0 -42
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/scene.html +0 -280
- package/skills/music-to-video/references/motion-primitives/text-wave-distort/index.html +0 -54
- package/skills/music-to-video/references/motion-primitives/text-wave-distort/scene.html +0 -106
- package/skills/music-to-video/references/motion-primitives/tile-mosaic/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/tile-mosaic/scene.html +0 -109
- package/skills/music-to-video/references/motion-primitives/typewriter-reveal/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/typewriter-reveal/scene.html +0 -91
- package/skills/music-to-video/references/motion-primitives/word-grid-burst/index.html +0 -53
- package/skills/music-to-video/references/motion-primitives/word-grid-burst/scene.html +0 -96
- package/skills/music-to-video/references/planning.md +0 -104
- package/skills/music-to-video/references/storyboard-format.md +0 -94
- package/skills/music-to-video/references/template-catalog.md +0 -106
- package/skills/music-to-video/references/templates/card-flyby/index.html +0 -527
- package/skills/music-to-video/references/templates/card-flyby/program.json +0 -13
- package/skills/music-to-video/references/templates/held-message-living-field/index.html +0 -485
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/asphalt-031.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bark-014.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/brick.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-075-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-101.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-102.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/bricks-104.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/carpet.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-034.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-042-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-046.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete-047-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/concrete.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/diamond-plate-009.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-080.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/fabric-083.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-001.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-004.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/grass-005.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-037.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-054.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-068.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-080.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-103.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/ground-104.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/lava.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/leather-037.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-012.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/marble-016.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-032.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-038.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-041-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-046-b.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-048-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-049-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-055-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal-061-b.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/metal.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/onyx.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/painted-plaster-017.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-138.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/paving-stones-150.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/plaster-001.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-007.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-008-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-009-c.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-012-b.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/road-013-a.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-058.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock-063.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/rock.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow-015.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/snow.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/tiles-138.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/travertine-009.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-049.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-051.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-058.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-066.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-092.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-094.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-051.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-064.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood-floor-070.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/assets/texture-mask-text/masks/wood.png +0 -0
- package/skills/music-to-video/references/templates/held-text-strobe-burst/index.html +0 -302
- package/skills/music-to-video/references/templates/intro-kinetic-cascade/index.html +0 -610
- package/skills/music-to-video/references/templates/intro-kinetic-cascade/program.json +0 -41
- package/skills/music-to-video/references/templates/logo-split-lockup-pulse/assets/fredoka-700.woff2 +0 -0
- package/skills/music-to-video/references/templates/logo-split-lockup-pulse/index.html +0 -596
- package/skills/music-to-video/references/templates/poster-tile-mosaic/index.html +0 -589
- package/skills/music-to-video/references/templates/poster-tile-mosaic/program.json +0 -25
- package/skills/music-to-video/references/templates/roll-flipbook-word-cycle/index.html +0 -267
- package/skills/music-to-video/references/templates/split-anchor-word-slot/index.html +0 -594
- package/skills/music-to-video/references/templates/split-anchor-word-slot/program.json +0 -39
- package/skills/music-to-video/references/templates/typewriter-phrase-keyword-shuffle/index.html +0 -238
- package/skills/music-to-video/scripts/analyze-beatgrid.py +0 -542
- package/skills/music-to-video/scripts/assemble-index.mjs +0 -220
- package/skills/music-to-video/scripts/lib/storyboard.mjs +0 -249
- package/skills/music-to-video/scripts/stage-assets.mjs +0 -58
- package/skills/music-to-video/scripts/validate-plan.mjs +0 -161
- package/skills/music-to-video/sub-agents/frame-worker.md +0 -49
- package/skills/pr-to-video/references/code-vocabulary.md +0 -113
- package/skills/pr-to-video/references/cut-catalog.md +0 -215
- package/skills/pr-to-video/references/motion-language.md +0 -156
- package/skills/pr-to-video/references/story-design.md +0 -230
- package/skills/pr-to-video/references/visual-design.md +0 -164
- package/skills/pr-to-video/scripts/assemble-index.mjs +0 -631
- package/skills/pr-to-video/scripts/assemble-index.test.mjs +0 -130
- package/skills/pr-to-video/scripts/audio.mjs +0 -293
- package/skills/pr-to-video/scripts/build-frame.mjs +0 -589
- package/skills/pr-to-video/scripts/captions.mjs +0 -524
- package/skills/pr-to-video/scripts/captions.test.mjs +0 -260
- package/skills/pr-to-video/scripts/fetch-people-avatars.mjs +0 -157
- package/skills/pr-to-video/scripts/fetch-pr.mjs +0 -234
- package/skills/pr-to-video/scripts/frame-contract.test.mjs +0 -209
- package/skills/pr-to-video/scripts/frame-packets.mjs +0 -62
- package/skills/pr-to-video/scripts/ingest.mjs +0 -561
- package/skills/pr-to-video/scripts/lib/assets.mjs +0 -56
- package/skills/pr-to-video/scripts/lib/bgm-volume.mjs +0 -4
- package/skills/pr-to-video/scripts/lib/captured-fonts.mjs +0 -58
- package/skills/pr-to-video/scripts/lib/dimensions.mjs +0 -45
- package/skills/pr-to-video/scripts/lib/frame-contract.mjs +0 -54
- package/skills/pr-to-video/scripts/lib/frame-packets-core.mjs +0 -194
- package/skills/pr-to-video/scripts/lib/pad-frame-duration.mjs +0 -36
- package/skills/pr-to-video/scripts/lib/storyboard.mjs +0 -249
- package/skills/pr-to-video/scripts/lib/tokens.mjs +0 -211
- package/skills/pr-to-video/scripts/lib/transition-registry.mjs +0 -38
- package/skills/pr-to-video/scripts/lib/transitions.json +0 -71
- package/skills/pr-to-video/scripts/preflight.mjs +0 -51
- package/skills/pr-to-video/scripts/project-dir.mjs +0 -92
- package/skills/pr-to-video/scripts/transitions.mjs +0 -383
- package/skills/pr-to-video/scripts/workflow-guardrails.test.mjs +0 -198
- package/skills/pr-to-video/sub-agents/frame-worker.md +0 -38
- package/skills/product-launch-video/references/cut-catalog.md +0 -220
- package/skills/product-launch-video/references/motion-language.md +0 -156
- package/skills/product-launch-video/references/story-design.md +0 -508
- package/skills/product-launch-video/references/visual-design.md +0 -126
- package/skills/product-launch-video/scripts/assemble-index.mjs +0 -773
- package/skills/product-launch-video/scripts/assemble-index.test.mjs +0 -127
- package/skills/product-launch-video/scripts/audio.mjs +0 -293
- package/skills/product-launch-video/scripts/audio.test.mjs +0 -234
- package/skills/product-launch-video/scripts/build-frame-subsets.test.mjs +0 -152
- package/skills/product-launch-video/scripts/build-frame.mjs +0 -552
- package/skills/product-launch-video/scripts/captions.mjs +0 -524
- package/skills/product-launch-video/scripts/captions.test.mjs +0 -219
- package/skills/product-launch-video/scripts/capture-skill-guardrails.test.mjs +0 -39
- package/skills/product-launch-video/scripts/frame-packets.mjs +0 -27
- package/skills/product-launch-video/scripts/frame-packets.test.mjs +0 -144
- package/skills/product-launch-video/scripts/lib/assets.mjs +0 -56
- package/skills/product-launch-video/scripts/lib/bgm-volume.mjs +0 -4
- package/skills/product-launch-video/scripts/lib/captured-fonts.mjs +0 -58
- package/skills/product-launch-video/scripts/lib/dimensions.mjs +0 -45
- package/skills/product-launch-video/scripts/lib/frame-packets-core.mjs +0 -194
- package/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +0 -36
- package/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +0 -76
- package/skills/product-launch-video/scripts/lib/storyboard.mjs +0 -249
- package/skills/product-launch-video/scripts/lib/tokens.mjs +0 -218
- package/skills/product-launch-video/scripts/lib/tokens.test.mjs +0 -57
- package/skills/product-launch-video/scripts/lib/transition-registry.mjs +0 -38
- package/skills/product-launch-video/scripts/lib/transitions.json +0 -71
- package/skills/product-launch-video/scripts/media-contract.test.mjs +0 -200
- package/skills/product-launch-video/scripts/stage-assets.mjs +0 -39
- package/skills/product-launch-video/scripts/stage-assets.test.mjs +0 -52
- package/skills/product-launch-video/scripts/transitions.mjs +0 -383
- package/skills/product-launch-video/scripts/transitions.test.mjs +0 -68
- package/skills/product-launch-video/sub-agents/frame-worker.md +0 -21
- package/skills/talking-head-recut/NOTICE.md +0 -39
- package/skills/talking-head-recut/assets/fonts/Caveat-400-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Caveat-700-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Inter-400-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Inter-700-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/LXGWWenKaiTC-400-latin.woff2 +0 -0
- package/skills/talking-head-recut/assets/fonts/Virgil.woff2 +0 -0
- package/skills/talking-head-recut/assets/vendor/gsap.min.js +0 -10
- package/skills/talking-head-recut/media-contract.test.mjs +0 -35
- package/skills/talking-head-recut/references/DESIGN_INDEX.md +0 -145
- package/skills/talking-head-recut/references/frames/clean.html +0 -92
- package/skills/talking-head-recut/references/frames/hairline.html +0 -171
- package/skills/talking-head-recut/references/frames/polaroid.html +0 -131
- package/skills/talking-head-recut/references/layouts/overlay.html +0 -164
- package/skills/talking-head-recut/references/layouts/pip.html +0 -143
- package/skills/talking-head-recut/references/layouts/split.html +0 -121
- package/skills/talking-head-recut/references/layouts/stack.html +0 -109
- package/skills/talking-head-recut/references/styles/academic.html +0 -172
- package/skills/talking-head-recut/references/styles/audit.html +0 -170
- package/skills/talking-head-recut/references/styles/editorial.html +0 -189
- package/skills/talking-head-recut/references/styles/geom.html +0 -181
- package/skills/talking-head-recut/references/styles/minimal.html +0 -130
- package/skills/talking-head-recut/references/styles/spotlight.html +0 -142
- package/skills/talking-head-recut/references/styles/swiss.html +0 -188
- package/skills/talking-head-recut/references/styles/terminal.html +0 -196
- package/skills/talking-head-recut/references/styles/whiteboard.html +0 -170
- package/skills/talking-head-recut/references/styles/xhs.html +0 -206
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/biennale-yellow/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/biennale-yellow/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/blockframe/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/blockframe/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/blue-professional/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/blue-professional/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/bold-poster/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/bold-poster/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/broadside/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/broadside/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/capsule/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/capsule/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/cartesian/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/cartesian/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/cobalt-grid/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/cobalt-grid/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/EBGaramond-400.woff2 +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/EBGaramond-700.woff2 +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/Inter-400.woff2 +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/Inter-700.woff2 +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/JetBrainsMono-400.woff2 +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/JetBrainsMono-700.woff2 +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/OFL-eb-garamond.txt +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/OFL-inter.txt +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/fonts/OFL-jetbrains-mono.txt +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/code-editorial/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/coral/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/coral/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/creative-mode/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/creative-mode/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/daisy-days/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/daisy-days/frame-showcase.html +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/editorial-forest/FRAME.md +0 -0
- /package/skills/{hyperframes-creative → hyperframes/assets}/frame-presets/editorial-forest/frame-showcase.html +0 -0
- /package/skills/{hyperframes-audio → media-use/audio}/scripts/carve.test.mjs +0 -0
- /package/skills/{hyperframes-creative → media-use/audio}/scripts/extract-audio-data.py +0 -0
|
@@ -1,383 +0,0 @@
|
|
|
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
|
-
import { padFrameInternalDuration } from "./lib/pad-frame-duration.mjs";
|
|
32
|
-
|
|
33
|
-
const flag = (argv, name, def) => {
|
|
34
|
-
const i = argv.indexOf(`--${name}`);
|
|
35
|
-
return i >= 0 && i + 1 < argv.length ? argv[i + 1] : def;
|
|
36
|
-
};
|
|
37
|
-
const NO_TRANSITION = new Set(["cut", "none", ""]);
|
|
38
|
-
const r3 = (x) => Number(x.toFixed(3));
|
|
39
|
-
|
|
40
|
-
// transition_in → { type, direction?, dur? } | null (hard cut).
|
|
41
|
-
function parseTransitionIn(raw) {
|
|
42
|
-
const s = (raw ?? "").trim();
|
|
43
|
-
if (NO_TRANSITION.has(s.toLowerCase())) return null;
|
|
44
|
-
const parts = s.split(/\s+/);
|
|
45
|
-
const spec = { type: parts[0].toLowerCase() };
|
|
46
|
-
for (const p of parts.slice(1)) {
|
|
47
|
-
const m = p.match(/^(\d+(?:\.\d+)?)s?$/);
|
|
48
|
-
if (m) spec.dur = Number(m[1]);
|
|
49
|
-
else spec.direction = p.toUpperCase();
|
|
50
|
-
}
|
|
51
|
-
return spec;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
// Mounted STORYBOARD frames present in index.html, in document order: { id, frame }.
|
|
55
|
-
function mountedFramesInOrder(manifest, html) {
|
|
56
|
-
const out = [];
|
|
57
|
-
for (const f of manifest.frames) {
|
|
58
|
-
if (!f.src) continue;
|
|
59
|
-
const id = f.src
|
|
60
|
-
.split("/")
|
|
61
|
-
.pop()
|
|
62
|
-
.replace(/\.html?$/i, "");
|
|
63
|
-
if (html.includes(`id="el-${id}"`)) out.push({ id, frame: f });
|
|
64
|
-
}
|
|
65
|
-
return out;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Frame clip wrappers parsed out of index.html (ids carry hyphens; excludes
|
|
69
|
-
// el-captions and audio by keying off the known frame-id set). The id is matched
|
|
70
|
-
// from anywhere in the tag's attribute list — never assume it is the first attribute
|
|
71
|
-
// (the index assembler emits data-hf-id before id, so an id-first regex finds nothing
|
|
72
|
-
// and inject crashes on the empty clip map).
|
|
73
|
-
function parseFrameClips(html, frameIds) {
|
|
74
|
-
const clipRe = /<div\b([^>]*)><\/div>/g;
|
|
75
|
-
const clips = new Map();
|
|
76
|
-
let m;
|
|
77
|
-
while ((m = clipRe.exec(html)) !== null) {
|
|
78
|
-
const attrs = m[1];
|
|
79
|
-
const idm = attrs.match(/\bid="el-([A-Za-z0-9_-]+)"/);
|
|
80
|
-
if (!idm || !frameIds.has(idm[1])) continue;
|
|
81
|
-
const num = (re) => {
|
|
82
|
-
const x = attrs.match(re);
|
|
83
|
-
return x ? Number(x[1]) : null;
|
|
84
|
-
};
|
|
85
|
-
clips.set(idm[1], {
|
|
86
|
-
id: idm[1],
|
|
87
|
-
block: m[0],
|
|
88
|
-
start: num(/data-start="([\d.]+)"/),
|
|
89
|
-
duration: num(/data-duration="([\d.]+)"/),
|
|
90
|
-
track: num(/data-track-index="(\d+)"/) ?? 0,
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
return clips;
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
// The host wrapper is extended across an outgoing transition, so the mounted
|
|
97
|
-
// frame must remain visually populated for the same local-time window. Extend
|
|
98
|
-
// the frame root and every non-audio timed element that reached the original
|
|
99
|
-
// storyboard boundary. This also repairs worker files whose root was already
|
|
100
|
-
// inflated while their ground/content clips still ended at the synced duration.
|
|
101
|
-
function extendFrameTail(hyperframesDir, frame, baseDuration, targetDuration, die) {
|
|
102
|
-
if (!frame?.src || targetDuration <= baseDuration) return;
|
|
103
|
-
const framePath = join(hyperframesDir, frame.src);
|
|
104
|
-
let html;
|
|
105
|
-
try {
|
|
106
|
-
html = readFileSync(framePath, "utf8");
|
|
107
|
-
} catch {
|
|
108
|
-
die(`outgoing frame file not found at ${framePath}`);
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
const compId = frame.src
|
|
112
|
-
.split("/")
|
|
113
|
-
.pop()
|
|
114
|
-
.replace(/\.html?$/i, "");
|
|
115
|
-
const EPS = 0.011;
|
|
116
|
-
let foundRoot = false;
|
|
117
|
-
let extended = 0;
|
|
118
|
-
const rewritten = html.replace(/<([A-Za-z][\w:-]*)\b([^>]*)>/g, (tag, name, attrs) => {
|
|
119
|
-
const durationMatch = attrs.match(/\bdata-duration="([\d.]+)"/);
|
|
120
|
-
const compositionMatch = attrs.match(/\bdata-composition-id="([^"]+)"/);
|
|
121
|
-
if (compositionMatch?.[1] === compId && !foundRoot) {
|
|
122
|
-
foundRoot = true;
|
|
123
|
-
return durationMatch
|
|
124
|
-
? tag.replace(/\bdata-duration="[\d.]+"/, `data-duration="${targetDuration}"`)
|
|
125
|
-
: tag.replace(/(\s*\/?>)$/, ` data-duration="${targetDuration}"$1`);
|
|
126
|
-
}
|
|
127
|
-
|
|
128
|
-
if (!durationMatch) return tag;
|
|
129
|
-
const duration = Number(durationMatch[1]);
|
|
130
|
-
if (!Number.isFinite(duration)) return tag;
|
|
131
|
-
|
|
132
|
-
if (name.toLowerCase() === "audio") return tag;
|
|
133
|
-
const startMatch = attrs.match(/\bdata-start="([\d.]+)"/);
|
|
134
|
-
if (!startMatch) return tag;
|
|
135
|
-
const start = Number(startMatch[1]);
|
|
136
|
-
const end = start + duration;
|
|
137
|
-
if (end < baseDuration - EPS || end >= targetDuration - EPS) return tag;
|
|
138
|
-
extended++;
|
|
139
|
-
return tag.replace(/\bdata-duration="[\d.]+"/, `data-duration="${r3(targetDuration - start)}"`);
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
if (!foundRoot) die(`${frame.src} has no data-composition-id="${compId}" root`);
|
|
143
|
-
writeFileSync(framePath, rewritten);
|
|
144
|
-
console.log(
|
|
145
|
-
` ${compId}: extended root + ${extended} tail clip(s) ${baseDuration}s→${targetDuration}s`,
|
|
146
|
-
);
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
// Resolve a transition_in spec to a registry record (calm default on unknown).
|
|
150
|
-
function resolveRecord(spec, byName, reg, warn) {
|
|
151
|
-
let rec = byName.get(spec.type);
|
|
152
|
-
if (!rec) {
|
|
153
|
-
rec = byName.get(reg.default_calm);
|
|
154
|
-
warn(`transition_in "${spec.type}" not in registry — using ${reg.default_calm}`);
|
|
155
|
-
}
|
|
156
|
-
return rec;
|
|
157
|
-
}
|
|
158
|
-
function resolveDur(spec, rec, reg) {
|
|
159
|
-
let dur = spec.dur ?? rec.default_duration_s ?? 0.5;
|
|
160
|
-
return Math.min(dur, reg.max_duration_s ?? 2.0);
|
|
161
|
-
}
|
|
162
|
-
|
|
163
|
-
// GSAP lines for one transition record (token substitution).
|
|
164
|
-
function buildGsap(rec, fromId, toId, dur, T, direction, canvasW, canvasH, die) {
|
|
165
|
-
const subs = {
|
|
166
|
-
__OLD__: `"#el-${fromId}"`,
|
|
167
|
-
__NEW__: `"#el-${toId}"`,
|
|
168
|
-
__T__: String(T),
|
|
169
|
-
__DUR__: String(dur),
|
|
170
|
-
};
|
|
171
|
-
let template;
|
|
172
|
-
if (rec.directions && rec.directions.length > 0) {
|
|
173
|
-
const dir = (direction || rec.default_direction || rec.directions[0]).toUpperCase();
|
|
174
|
-
const vertical = dir === "UP" || dir === "DOWN";
|
|
175
|
-
template = vertical ? rec.gsap_template_vertical : rec.gsap_template_horizontal;
|
|
176
|
-
if (!template)
|
|
177
|
-
die(`transition ${rec.name}: missing ${vertical ? "vertical" : "horizontal"} template`);
|
|
178
|
-
if (vertical) {
|
|
179
|
-
const dy = dir === "UP" ? -canvasH : canvasH;
|
|
180
|
-
subs.__DY__ = String(dy);
|
|
181
|
-
subs.__DYIN__ = String(-dy);
|
|
182
|
-
} else {
|
|
183
|
-
const dx = dir === "LEFT" ? -canvasW : canvasW;
|
|
184
|
-
subs.__DX__ = String(dx);
|
|
185
|
-
subs.__DXIN__ = String(-dx);
|
|
186
|
-
}
|
|
187
|
-
} else {
|
|
188
|
-
template = rec.gsap_template;
|
|
189
|
-
if (!template) die(`transition ${rec.name}: missing gsap_template`);
|
|
190
|
-
}
|
|
191
|
-
return template.map((line) => {
|
|
192
|
-
let out = line;
|
|
193
|
-
for (const [k, v] of Object.entries(subs)) out = out.split(k).join(v);
|
|
194
|
-
return out;
|
|
195
|
-
});
|
|
196
|
-
}
|
|
197
|
-
|
|
198
|
-
function runInject(argv) {
|
|
199
|
-
const hyperframesDir = resolve(flag(argv, "hyperframes", "."));
|
|
200
|
-
const storyboardPath = resolve(flag(argv, "storyboard", join(hyperframesDir, "STORYBOARD.md")));
|
|
201
|
-
const indexPath = join(hyperframesDir, "index.html");
|
|
202
|
-
const die = (msg) => {
|
|
203
|
-
console.error(`✗ transitions inject: ${msg}`);
|
|
204
|
-
process.exit(1);
|
|
205
|
-
};
|
|
206
|
-
|
|
207
|
-
if (!existsSync(storyboardPath)) die(`STORYBOARD.md not found at ${storyboardPath}`);
|
|
208
|
-
|
|
209
|
-
const manifest = parseStoryboard(readFileSync(storyboardPath, "utf8"));
|
|
210
|
-
const { width: CW, height: CH } = parseFormat(manifest.globals.format);
|
|
211
|
-
const reg = loadTransitionRegistry();
|
|
212
|
-
const byName = transitionsByName();
|
|
213
|
-
|
|
214
|
-
// Read directly and handle ENOENT here, rather than an existsSync precheck —
|
|
215
|
-
// the check→write pair (write-back below) is a TOCTOU race CodeQL flags.
|
|
216
|
-
let html = "";
|
|
217
|
-
try {
|
|
218
|
-
html = readFileSync(indexPath, "utf8");
|
|
219
|
-
} catch {
|
|
220
|
-
die(`index.html not found at ${indexPath} — run assemble-index.mjs first`);
|
|
221
|
-
}
|
|
222
|
-
const order = mountedFramesInOrder(manifest, html);
|
|
223
|
-
if (order.length === 0) die("no frame clips found in index.html");
|
|
224
|
-
const frameIds = new Set(order.map((x) => x.id));
|
|
225
|
-
const clips = parseFrameClips(html, frameIds);
|
|
226
|
-
|
|
227
|
-
const gsapLines = [];
|
|
228
|
-
const applied = [];
|
|
229
|
-
for (let i = 1; i < order.length; i++) {
|
|
230
|
-
const spec = parseTransitionIn(order[i].frame.transitionIn);
|
|
231
|
-
if (!spec) continue; // hard cut
|
|
232
|
-
const incoming = clips.get(order[i].id);
|
|
233
|
-
const outgoing = clips.get(order[i - 1].id);
|
|
234
|
-
const rec = resolveRecord(spec, byName, reg, (m) =>
|
|
235
|
-
console.error(` ! frame ${order[i].id}: ${m}`),
|
|
236
|
-
);
|
|
237
|
-
const dur = resolveDur(spec, rec, reg);
|
|
238
|
-
const T = r3(incoming.start); // cut = incoming start (frames tile)
|
|
239
|
-
const baseDuration = outgoing.duration;
|
|
240
|
-
outgoing.duration = r3(baseDuration + dur); // extend outgoing only
|
|
241
|
-
extendFrameTail(hyperframesDir, order[i - 1].frame, baseDuration, outgoing.duration, die);
|
|
242
|
-
padFrameInternalDuration(
|
|
243
|
-
hyperframesDir,
|
|
244
|
-
order[i - 1].frame.src,
|
|
245
|
-
outgoing.id,
|
|
246
|
-
outgoing.duration,
|
|
247
|
-
);
|
|
248
|
-
gsapLines.push(
|
|
249
|
-
...buildGsap(rec, outgoing.id, incoming.id, dur, T, spec.direction, CW, CH, die),
|
|
250
|
-
);
|
|
251
|
-
applied.push({ from: outgoing.id, to: incoming.id, type: rec.name, dur, T });
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
if (applied.length === 0) {
|
|
255
|
-
console.log(`✓ transitions inject: 0 transitions (all cuts) — index.html unchanged`);
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
// 0/1 ping-pong all frame clips in play order.
|
|
260
|
-
const ordered = [...clips.values()].sort((a, b) => a.start - b.start || a.id.localeCompare(b.id));
|
|
261
|
-
ordered.forEach((c, i) => {
|
|
262
|
-
c.track = i % 2;
|
|
263
|
-
});
|
|
264
|
-
|
|
265
|
-
// rewrite each clip block: start unchanged; duration possibly extended; track ping-ponged.
|
|
266
|
-
for (const c of clips.values()) {
|
|
267
|
-
const nb = c.block
|
|
268
|
-
.replace(/data-duration="[\d.]+"/, `data-duration="${c.duration}"`)
|
|
269
|
-
.replace(/data-track-index="\d+"/, `data-track-index="${c.track}"`);
|
|
270
|
-
html = html.replace(c.block, nb);
|
|
271
|
-
}
|
|
272
|
-
|
|
273
|
-
// stamp the GSAP after the master timeline anchor.
|
|
274
|
-
const anchor = 'window.__timelines["main"] = gsap.timeline({ paused: true });';
|
|
275
|
-
if (!html.includes(anchor)) die("master timeline anchor not found in index.html");
|
|
276
|
-
// The transition tweens alone leave window.__timelines["main"] spanning only the
|
|
277
|
-
// last transition (e.g. 24.7s), shorter than the real composition. The Studio
|
|
278
|
-
// reads main.duration() as its master duration and parses clips against it, so a
|
|
279
|
-
// short master collapses its timeline (clips dropped, duration wrong, blank stage)
|
|
280
|
-
// — the render engine is unaffected (it trusts the root data-duration attr). Stamp
|
|
281
|
-
// a full-span anchor so main.duration() == composition total. Mirrors the
|
|
282
|
-
// `tl.to({}, { duration })` anchor captions.html already uses.
|
|
283
|
-
const rootDurMatch = html.match(/data-composition-id="main"[^>]*?data-duration="([\d.]+)"/);
|
|
284
|
-
const totalDur = rootDurMatch ? Number(rootDurMatch[1]) : null;
|
|
285
|
-
const block = [
|
|
286
|
-
anchor,
|
|
287
|
-
" // ── frame transitions (injected by transitions.mjs) ──",
|
|
288
|
-
' (function () { var tl = window.__timelines["main"];',
|
|
289
|
-
...gsapLines.map((l) => " " + l),
|
|
290
|
-
...(totalDur
|
|
291
|
-
? [
|
|
292
|
-
` tl.to({}, { duration: ${totalDur} }, 0); // full-span anchor — main.duration() == composition total (Studio master duration)`,
|
|
293
|
-
]
|
|
294
|
-
: []),
|
|
295
|
-
" })();",
|
|
296
|
-
].join("\n");
|
|
297
|
-
html = html.replace(anchor, block);
|
|
298
|
-
|
|
299
|
-
writeFileSync(indexPath, html);
|
|
300
|
-
console.log(`✓ transitions inject: ${applied.length} transition(s) stamped into index.html`);
|
|
301
|
-
for (const a of applied) console.log(` ${a.from}→${a.to}: ${a.type} ${a.dur}s @ T=${a.T}s`);
|
|
302
|
-
const tracks = ordered
|
|
303
|
-
.map((c) => `${c.id}[t${c.track} ${c.start}→${r3(c.start + c.duration)}]`)
|
|
304
|
-
.join(" ");
|
|
305
|
-
console.log(` tracks: ${tracks}`);
|
|
306
|
-
}
|
|
307
|
-
|
|
308
|
-
function runVerify(argv) {
|
|
309
|
-
const hyperframesDir = resolve(flag(argv, "hyperframes", "."));
|
|
310
|
-
const storyboardPath = resolve(flag(argv, "storyboard", join(hyperframesDir, "STORYBOARD.md")));
|
|
311
|
-
const indexPath = resolve(flag(argv, "index", join(hyperframesDir, "index.html")));
|
|
312
|
-
const bail = (msg) => {
|
|
313
|
-
console.error(`✗ transitions verify: ${msg}`);
|
|
314
|
-
process.exit(1);
|
|
315
|
-
};
|
|
316
|
-
|
|
317
|
-
if (!existsSync(storyboardPath)) bail("STORYBOARD.md not found");
|
|
318
|
-
if (!existsSync(indexPath)) bail("index.html not found");
|
|
319
|
-
|
|
320
|
-
const manifest = parseStoryboard(readFileSync(storyboardPath, "utf8"));
|
|
321
|
-
const html = readFileSync(indexPath, "utf8");
|
|
322
|
-
const order = mountedFramesInOrder(manifest, html);
|
|
323
|
-
const frameIds = new Set(order.map((x) => x.id));
|
|
324
|
-
const clips = parseFrameClips(html, frameIds);
|
|
325
|
-
|
|
326
|
-
const EPS = 0.011;
|
|
327
|
-
const overlaps = (a, b) =>
|
|
328
|
-
a.start < b.start + b.duration - EPS && b.start < a.start + a.duration - EPS;
|
|
329
|
-
const fail = [];
|
|
330
|
-
|
|
331
|
-
// (4) global no same-track overlap. This is this workflow's own lane convention,
|
|
332
|
-
// not a lint rule: nothing in the framework rejects same-track overlap.
|
|
333
|
-
const all = [...clips.values()];
|
|
334
|
-
for (let i = 0; i < all.length; i++)
|
|
335
|
-
for (let j = i + 1; j < all.length; j++) {
|
|
336
|
-
const a = all[i];
|
|
337
|
-
const b = all[j];
|
|
338
|
-
if (a.track === b.track && overlaps(a, b))
|
|
339
|
-
fail.push(`same-track overlap: ${a.id}[t${a.track}] & ${b.id}[t${b.track}]`);
|
|
340
|
-
}
|
|
341
|
-
|
|
342
|
-
const bm = html.match(/frame transitions \(injected[\s\S]*?\}\)\(\);/);
|
|
343
|
-
const txBlock = bm ? bm[0] : "";
|
|
344
|
-
|
|
345
|
-
let expected = 0;
|
|
346
|
-
for (let i = 1; i < order.length; i++) {
|
|
347
|
-
const spec = parseTransitionIn(order[i].frame.transitionIn);
|
|
348
|
-
if (!spec) continue;
|
|
349
|
-
expected++;
|
|
350
|
-
const to = clips.get(order[i].id);
|
|
351
|
-
const from = clips.get(order[i - 1].id);
|
|
352
|
-
if (!to || !from) {
|
|
353
|
-
fail.push(`boundary ${order[i - 1].id}→${order[i].id}: wrapper missing`);
|
|
354
|
-
continue;
|
|
355
|
-
}
|
|
356
|
-
if (!txBlock.includes(`"#el-${from.id}"`) || !txBlock.includes(`"#el-${to.id}"`))
|
|
357
|
-
fail.push(`boundary ${from.id}→${to.id}: injected block does not reference both ids`);
|
|
358
|
-
const overlapAmt = r3(from.start + from.duration - to.start);
|
|
359
|
-
if (overlapAmt <= 0) fail.push(`boundary ${from.id}→${to.id}: no overlap (${overlapAmt}s)`);
|
|
360
|
-
if (from.track === to.track)
|
|
361
|
-
fail.push(`boundary ${from.id}→${to.id}: both on track ${from.track}`);
|
|
362
|
-
}
|
|
363
|
-
if (expected > 0 && !txBlock)
|
|
364
|
-
fail.push(`${expected} transition(s) expected but no injected block found`);
|
|
365
|
-
|
|
366
|
-
if (fail.length) {
|
|
367
|
-
console.error(`✗ transitions verify: ${fail.length} failure(s):`);
|
|
368
|
-
for (const f of fail) console.error(` - ${f}`);
|
|
369
|
-
process.exit(1);
|
|
370
|
-
}
|
|
371
|
-
console.log(
|
|
372
|
-
`✓ transitions verify: ${expected} transition(s) verified (cross-track, overlap>0, both ids referenced, no same-track overlap)`,
|
|
373
|
-
);
|
|
374
|
-
}
|
|
375
|
-
|
|
376
|
-
const sub = process.argv[2];
|
|
377
|
-
const rest = process.argv.slice(3);
|
|
378
|
-
if (sub === "inject") runInject(rest);
|
|
379
|
-
else if (sub === "verify") runVerify(rest);
|
|
380
|
-
else {
|
|
381
|
-
console.error("usage: node transitions.mjs <inject|verify> [args...]");
|
|
382
|
-
process.exit(2);
|
|
383
|
-
}
|
|
@@ -1,198 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { existsSync, mkdtempSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
3
|
-
import { homedir, tmpdir } from "node:os";
|
|
4
|
-
import { dirname, isAbsolute, join, relative, resolve } from "node:path";
|
|
5
|
-
import test from "node:test";
|
|
6
|
-
|
|
7
|
-
import { parsePrReference, resolvePrToVideoProjectDir } from "./project-dir.mjs";
|
|
8
|
-
import { buildFramePackets } from "./frame-packets.mjs";
|
|
9
|
-
import { hasCliCommand } from "./preflight.mjs";
|
|
10
|
-
|
|
11
|
-
function write(path, contents) {
|
|
12
|
-
mkdirSync(dirname(path), { recursive: true });
|
|
13
|
-
writeFileSync(path, contents);
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
test("default project directory is durable and outside the caller repository", () => {
|
|
17
|
-
const caller = mkdtempSync(join(tmpdir(), "p2v-caller-"));
|
|
18
|
-
const cache = mkdtempSync(join(tmpdir(), "p2v-cache-"));
|
|
19
|
-
const result = resolvePrToVideoProjectDir({
|
|
20
|
-
pr: "https://github.com/EveryInc/compound-engineering-plugin/pull/1092",
|
|
21
|
-
cwd: caller,
|
|
22
|
-
env: { XDG_CACHE_HOME: cache, HOME: homedir() },
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
assert.equal(
|
|
26
|
-
result,
|
|
27
|
-
join(
|
|
28
|
-
cache,
|
|
29
|
-
"hyperframes",
|
|
30
|
-
"pr-to-video",
|
|
31
|
-
"everyinc",
|
|
32
|
-
"compound-engineering-plugin",
|
|
33
|
-
"compound-engineering-plugin-pr-1092",
|
|
34
|
-
),
|
|
35
|
-
);
|
|
36
|
-
assert.ok(isAbsolute(result));
|
|
37
|
-
assert.ok(relative(caller, result).startsWith(".."));
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
test("explicit project directory is preserved exactly after absolute resolution", () => {
|
|
41
|
-
const caller = mkdtempSync(join(tmpdir(), "p2v-explicit-caller-"));
|
|
42
|
-
assert.equal(
|
|
43
|
-
resolvePrToVideoProjectDir({
|
|
44
|
-
pr: "EveryInc/compound-engineering-plugin#1092",
|
|
45
|
-
cwd: caller,
|
|
46
|
-
explicitDir: "../my-video",
|
|
47
|
-
env: {},
|
|
48
|
-
}),
|
|
49
|
-
resolve(caller, "../my-video"),
|
|
50
|
-
);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test("distinct owner and repository segments cannot collide in the durable cache", () => {
|
|
54
|
-
const cache = mkdtempSync(join(tmpdir(), "p2v-cache-collision-"));
|
|
55
|
-
const first = resolvePrToVideoProjectDir({
|
|
56
|
-
pr: "foo-bar/baz#1",
|
|
57
|
-
env: { XDG_CACHE_HOME: cache },
|
|
58
|
-
});
|
|
59
|
-
const second = resolvePrToVideoProjectDir({
|
|
60
|
-
pr: "foo/bar-baz#1",
|
|
61
|
-
env: { XDG_CACHE_HOME: cache },
|
|
62
|
-
});
|
|
63
|
-
|
|
64
|
-
assert.notEqual(first, second);
|
|
65
|
-
});
|
|
66
|
-
|
|
67
|
-
test("PR parsing sanitizes owner and repository path traversal", () => {
|
|
68
|
-
assert.deepEqual(
|
|
69
|
-
parsePrReference("https://github.com/EveryInc/compound-engineering-plugin/pull/1092"),
|
|
70
|
-
{
|
|
71
|
-
owner: "everyinc",
|
|
72
|
-
repo: "compound-engineering-plugin",
|
|
73
|
-
number: 1092,
|
|
74
|
-
},
|
|
75
|
-
);
|
|
76
|
-
assert.throws(() => parsePrReference("../../outside#1092"), /valid GitHub PR reference/i);
|
|
77
|
-
});
|
|
78
|
-
|
|
79
|
-
test("#1092 packets contain selected excerpts but never the full diff", () => {
|
|
80
|
-
const project = mkdtempSync(join(tmpdir(), "p2v-packets-"));
|
|
81
|
-
const largeDiff = `diff --git a/noise b/noise\n${"+unselected noise\n".repeat(10_000)}`;
|
|
82
|
-
write(join(project, "capture", "diff.patch"), largeDiff);
|
|
83
|
-
write(join(project, "frame.md"), "# compact frame tokens\n");
|
|
84
|
-
write(
|
|
85
|
-
join(project, "STORYBOARD.md"),
|
|
86
|
-
`---\nformat: 1920x1080\n---\n\n## Frame 1 — Diff\n\n- duration: 4s\n- src: compositions/frames/01-diff.html\n- focal: code-diff\n- blueprint: compose\n- rules: text-reveal\n\n### Source excerpt\n\n\`\`\`diff\n-oldCall()\n+newCall({ attested: true })\n\`\`\`\n\n## Frame 2 — Impact\n\n- duration: 3s\n- src: compositions/frames/02-impact.html\n- blueprint: dataviz-countup\n- rules: counting-dynamic-scale\n`,
|
|
87
|
-
);
|
|
88
|
-
|
|
89
|
-
const result = buildFramePackets({
|
|
90
|
-
projectDir: project,
|
|
91
|
-
storyboardPath: join(project, "STORYBOARD.md"),
|
|
92
|
-
outDir: join(project, ".hyperframes", "frame-packets"),
|
|
93
|
-
maxPacketBytes: 32_000,
|
|
94
|
-
});
|
|
95
|
-
|
|
96
|
-
assert.equal(result.length, 2);
|
|
97
|
-
const codePacket = readFileSync(result[0].path, "utf8");
|
|
98
|
-
assert.match(codePacket, /newCall\(\{ attested: true \}\)/);
|
|
99
|
-
assert.doesNotMatch(codePacket, /unselected noise/);
|
|
100
|
-
assert.doesNotMatch(codePacket, /code-scroll/);
|
|
101
|
-
assert.ok(Buffer.byteLength(codePacket) < 32_000);
|
|
102
|
-
assert.ok(result.every((packet) => packet.path.endsWith(".md")));
|
|
103
|
-
|
|
104
|
-
const role = readFileSync(join(project, ".hyperframes", "frame-packets", "_role.md"), "utf8");
|
|
105
|
-
assert.match(role, /# Frame worker — core contract/);
|
|
106
|
-
assert.match(role, /# Frame worker — PR-to-video delta/);
|
|
107
|
-
});
|
|
108
|
-
|
|
109
|
-
test("packet validation is atomic and leaves no partial output on overflow", () => {
|
|
110
|
-
const project = mkdtempSync(join(tmpdir(), "p2v-packets-atomic-"));
|
|
111
|
-
const outDir = join(project, ".hyperframes", "frame-packets");
|
|
112
|
-
write(join(project, "frame.md"), "# frame\n");
|
|
113
|
-
write(
|
|
114
|
-
join(project, "STORYBOARD.md"),
|
|
115
|
-
`---\nformat: 1920x1080\n---\n\n## Frame 1 — Intro\n\n- duration: 2s\n- src: compositions/frames/01-intro.html\n\n## Frame 2 — Diff\n\n- duration: 4s\n- src: compositions/frames/02-diff.html\n- focal: code-diff\n\n### Source excerpt\n\n\`\`\`diff\n${"+oversized line\n".repeat(300)}\`\`\`\n`,
|
|
116
|
-
);
|
|
117
|
-
|
|
118
|
-
assert.throws(
|
|
119
|
-
() => buildFramePackets({ projectDir: project, outDir, maxPacketBytes: 2_000 }),
|
|
120
|
-
/limit 2000/,
|
|
121
|
-
);
|
|
122
|
-
assert.equal(existsSync(outDir), false);
|
|
123
|
-
});
|
|
124
|
-
|
|
125
|
-
test("code frames without an upstream-selected excerpt fail before dispatch", () => {
|
|
126
|
-
const project = mkdtempSync(join(tmpdir(), "p2v-packets-missing-"));
|
|
127
|
-
write(join(project, "frame.md"), "# frame\n");
|
|
128
|
-
write(
|
|
129
|
-
join(project, "STORYBOARD.md"),
|
|
130
|
-
`---\nformat: 1920x1080\n---\n\n## Frame 1 — Diff\n\n- duration: 4s\n- src: compositions/frames/01-diff.html\n- focal: code-diff\n`,
|
|
131
|
-
);
|
|
132
|
-
|
|
133
|
-
assert.throws(
|
|
134
|
-
() =>
|
|
135
|
-
buildFramePackets({
|
|
136
|
-
projectDir: project,
|
|
137
|
-
storyboardPath: join(project, "STORYBOARD.md"),
|
|
138
|
-
outDir: join(project, ".hyperframes", "frame-packets"),
|
|
139
|
-
}),
|
|
140
|
-
/Source excerpt/i,
|
|
141
|
-
);
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
// The other half of this skill's frame-packets delta. The excerpt guard above is
|
|
145
|
-
// pinned; the code-vocabulary injection was not — deleting `codeVocabularySection`
|
|
146
|
-
// outright left all 455 skills tests green, so the section a code worker reads to
|
|
147
|
-
// pick its registry block could have been dropped silently.
|
|
148
|
-
test("a code frame carries the vocabulary excerpt for the block it names", () => {
|
|
149
|
-
const project = mkdtempSync(join(tmpdir(), "p2v-packets-vocab-"));
|
|
150
|
-
write(join(project, "frame.md"), "# frame\n");
|
|
151
|
-
write(
|
|
152
|
-
join(project, "STORYBOARD.md"),
|
|
153
|
-
`---\nformat: 1920x1080\n---\n\n## Frame 1 — Diff\n\n- duration: 4s\n- src: compositions/frames/01-diff.html\n- focal: code-diff\n\n### Source excerpt\n\n\`\`\`diff\n-oldCall()\n+newCall()\n\`\`\`\n`,
|
|
154
|
-
);
|
|
155
|
-
|
|
156
|
-
const [packet] = buildFramePackets({ projectDir: project });
|
|
157
|
-
const contents = readFileSync(packet.path, "utf8");
|
|
158
|
-
|
|
159
|
-
assert.match(contents, /## Code block excerpt \(code-diff\)/);
|
|
160
|
-
assert.match(contents, /`code-diff`/);
|
|
161
|
-
});
|
|
162
|
-
|
|
163
|
-
test("a code block the vocabulary does not describe still names itself for install", () => {
|
|
164
|
-
const project = mkdtempSync(join(tmpdir(), "p2v-packets-vocab-miss-"));
|
|
165
|
-
write(join(project, "frame.md"), "# frame\n");
|
|
166
|
-
write(
|
|
167
|
-
join(project, "STORYBOARD.md"),
|
|
168
|
-
`---\nformat: 1920x1080\n---\n\n## Frame 1 — Diff\n\n- duration: 4s\n- src: compositions/frames/01-diff.html\n- focal: code-not-in-the-vocabulary\n\n### Source excerpt\n\n\`\`\`diff\n-oldCall()\n+newCall()\n\`\`\`\n`,
|
|
169
|
-
);
|
|
170
|
-
|
|
171
|
-
const [packet] = buildFramePackets({ projectDir: project });
|
|
172
|
-
|
|
173
|
-
assert.match(
|
|
174
|
-
readFileSync(packet.path, "utf8"),
|
|
175
|
-
/## Code block\n\nUse registry block `code-not-in-the-vocabulary`\./,
|
|
176
|
-
);
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
test("a mechanism frame gets no code-block section at all", () => {
|
|
180
|
-
const project = mkdtempSync(join(tmpdir(), "p2v-packets-mechanism-"));
|
|
181
|
-
write(join(project, "frame.md"), "# frame\n");
|
|
182
|
-
write(
|
|
183
|
-
join(project, "STORYBOARD.md"),
|
|
184
|
-
`---\nformat: 1920x1080\n---\n\n## Frame 1 — Mechanism\n\n- duration: 4s\n- src: compositions/frames/01-mechanism.html\n- focal: the request-lifecycle flow\n`,
|
|
185
|
-
);
|
|
186
|
-
|
|
187
|
-
const [packet] = buildFramePackets({ projectDir: project });
|
|
188
|
-
|
|
189
|
-
assert.doesNotMatch(readFileSync(packet.path, "utf8"), /## Code block/);
|
|
190
|
-
});
|
|
191
|
-
|
|
192
|
-
test("CLI capability detection rejects skills newer than the available command surface", () => {
|
|
193
|
-
const stableHelp = `Project:\n lint Validate a composition\n snapshot Capture frames\n\nUnknown command check`;
|
|
194
|
-
const currentHelp = `Project:\n lint Validate a composition\n check Run the full project validation gate\n snapshot Capture frames`;
|
|
195
|
-
|
|
196
|
-
assert.equal(hasCliCommand(stableHelp, "check"), false);
|
|
197
|
-
assert.equal(hasCliCommand(currentHelp, "check"), true);
|
|
198
|
-
});
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
# Frame worker — PR-to-video delta
|
|
2
|
-
|
|
3
|
-
> The shared law is the core contract above (the packet builder prepends `../hyperframes/references/frame-worker-core.md` to this file as `_role.md`) — read the two as one role. This file carries only what's specific to a PR-to-video frame.
|
|
4
|
-
|
|
5
|
-
## Batch dispatch — you build a small packet batch
|
|
6
|
-
|
|
7
|
-
At most three workers run; your dispatch assigns **one or more** bounded packet paths under `.hyperframes/frame-packets/`. Read this role and shared `frame.md` **once**, then process the packets in order — for each, use its exact frame block, inlined blueprint / rule excerpts, and (for a code beat) the selected code-block / source excerpts. Never open the full `STORYBOARD.md`, `capture/diff.patch`, or `capture/extracted/visible-text.txt`; the orchestrator already selected the exact source excerpt and put it in each code frame's packet. After the last assigned file passes the self-check, stop.
|
|
8
|
-
|
|
9
|
-
Extra inputs beyond the core contract:
|
|
10
|
-
|
|
11
|
-
- `code-vocabulary.md` — absolute path provided in your dispatch. For a **code beat**, read it for the named `code-*` block's exact inputs (`window.__TOKENS`, `window.__BLOCK`, line indexing); your packet carries the matching excerpt.
|
|
12
|
-
- `focal:` — for a concept/mechanism beat, which **invented** element is the hero; for a **code beat**, the named **`code-*` block** (+ the hunk); for the **credits** close, the avatar row.
|
|
13
|
-
- `roles:` — each element's role: `foreground subject` / `background` full-bleed / `supporting`. Most are invented elements you design; the only real assets are the credits `assets/<login>.png` avatars.
|
|
14
|
-
|
|
15
|
-
## Mostly invented — you build the visual (except code blocks + the credits avatars)
|
|
16
|
-
|
|
17
|
-
A PR video is **mostly invented**: there are **no screenshots and no captured UI**. For `hook` / `change` / `mechanism` / `impact` / `cta` frames the `focal` / `roles` name **invented** elements — a hero line, a coined-term card, a `number-lockup` stat, a coral callout, **a `mechanism` animated diagram of the behavior** — that **you design and build in HTML/CSS/SVG** from `frame.md`. Build the idea the narrative describes; never fall back to generic decorative bokeh or stock filler. Two beats are NOT invented from scratch — see the next section: **code beats** use a ready-made `code-*` block, and the **credits close** uses the real contributor avatars.
|
|
18
|
-
|
|
19
|
-
## PR code beats, mechanism beats + the credits close
|
|
20
|
-
|
|
21
|
-
- **Code beats (`diff` / `before_after` / a new-code reveal) — use the named `code-*` block, don't hand-build code motion.** Your `## Frame N` `scene` / `focal` names which block (e.g. `code-diff`, `code-morph`, `code-typing`); the orchestrator has already installed it (pre-install step). Read the `code-vocabulary.md` excerpt in your packet for that block's exact inputs, then:
|
|
22
|
-
- Use only the packet's `### Source excerpt`. It is the real before/after hunk selected upstream. Never reopen the full diff or brief.
|
|
23
|
-
- Fill the block's `window.__TOKENS` with that real code (the baked Shiki tokens) and set `window.__BLOCK` (effect, `line`, `duration`) **so the full block completes within the frame's `data-duration`** — a long snippet at the block's default per-character cadence overruns a short frame (the code never finishes typing). `code-diff` / `code-morph` need **2 states** (before, after); the others take one. **Line indexing differs — `code-highlight` is 0-based, `code-scroll` 1-based** — don't off-by-one.
|
|
24
|
-
- Integrate the filled block as **this frame's composition** per the core sub-composition contract: its `data-composition-id` and its `window.__timelines[...]` key must both be your **`<frame_id>`** (the block ships its own id + paused timeline; rename both to match the frame contract). The block already renders an editor window (titlebar / filename) reading as code-editorial's navy **Code Surface** — set the filename + any `+N/−M` chrome from the `scene`.
|
|
25
|
-
- **The block owns the code animation; your Scene windows choreograph the surrounding Code Surface** — the navy window seating in, the file header typing on, the camera settling onto the hunk, a coral underline on the landed line. **Do not re-specify the code motion** (the block is the development beat). A code beat is usually `blueprint: compose`.
|
|
26
|
-
- **The block has no caption-safe band.** When `Captions: enabled`, inset/scale the code panel into the top ~83% so it clears the keep-out band; never let code run under the caption pill.
|
|
27
|
-
- **Mechanism beats (`mechanism`) — build an invented animated diagram of the behavior; the build _is_ the shot.** This is the "show what the change does at runtime" frame (the request retrying, the cache filling, serial→parallel, the race resolved) — read its `scene` for the behavior to animate. Unlike a code beat, **the motion is yours to author** (no block owns it):
|
|
28
|
-
- If the `scene` names a `flowchart` / `flowchart-vertical` / `data-chart` block, the orchestrator pre-installed it — fill + mount it like a code block (its `data-composition-id` and `window.__timelines[...]` key both become your `<frame_id>`). Otherwise **hand-build the diagram in SVG / HTML / GSAP** from `frame.md`'s atoms.
|
|
29
|
-
- **Code editorial register:** hairline-ink nodes / edges / lanes on the cream ground, **one coral marker** on the active / changed element, mono labels — **not** the navy code surface (that's for code), no heavy shapes / bokeh.
|
|
30
|
-
- **Choreograph the Scene windows:** the nodes / lanes draw on (Scene 1); **the flow runs** as the VO names each step (middle Scenes — the request hops, the lane splits, the front advances, the bars race) — this _is_ the teaching, so it must play across the shot, never enter-then-freeze; the resolved state + the one coral emphasis lands (final Scene). Keep it in the top ~83% (caption keep-out).
|
|
31
|
-
- **The `credits` close — the one frame with real assets.** Its `asset_candidates` names 2–6 `assets/<login>.png` avatars (downloaded upstream). Render them as `<img>` in hairline-ringed chips — an avatar row with each contributor's name + role in mono (an "approved" mark if the close calls for it), staggered in across the Scene windows. Avatars appear **only** here, never decorating a code frame.
|
|
32
|
-
|
|
33
|
-
## PR-specific self-check additions
|
|
34
|
-
|
|
35
|
-
- The composition root also carries a **positive `data-duration` matching the packet**.
|
|
36
|
-
- **Code-block cadence fits `data-duration`** — for a code beat, the `code-*` block's internal cadence is set so the full block completes within the frame's `data-duration` (a long snippet at the default per-character speed overruns — the code never finishes and the chrome beats never play; see `code-vocabulary.md`).
|
|
37
|
-
- Fonts: copy the auto-generated `@font-face` block from `frame.md`; the Code editorial preset's EB Garamond, Inter, and JetBrains Mono faces live in `assets/fonts/`. Never link Google Fonts.
|
|
38
|
-
- Visible-text exception: real code inside a `code-*` block is the content, not narration.
|