dsh-hyperframes 0.9.1 → 0.9.2
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 +7 -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 +60 -58
- 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
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Mixing in HyperFrames
|
|
2
|
+
|
|
3
|
+
Preview and render run the same Web Audio graph, so what plays while scrubbing is what renders. Everything lives in attributes on the `<audio>` or `<video>` element.
|
|
4
|
+
|
|
5
|
+
## Level and fades
|
|
6
|
+
|
|
7
|
+
| Attribute | Meaning |
|
|
8
|
+
| ------------------------------- | ----------------------------------------------------------------------------------------- |
|
|
9
|
+
| `data-volume` | Track gain, 1 = 0 dB |
|
|
10
|
+
| `data-fade-in`, `data-fade-out` | Edge fades in seconds |
|
|
11
|
+
| `data-playback-rate` | Constant speed, 0.1–10, pitch preserved; give a video and its paired audio the same value |
|
|
12
|
+
|
|
13
|
+
A crossfade is two clips on different tracks that overlap, each with a fade.
|
|
14
|
+
|
|
15
|
+
## `data-automation`: envelopes
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<audio
|
|
19
|
+
id="music"
|
|
20
|
+
data-automation='{"version":1,"lanes":[{"target":"volume","points":[{"t":0,"v":1},{"t":2.5,"v":0.35}]}]}'
|
|
21
|
+
…
|
|
22
|
+
></audio>
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
- `target` is `volume`, `rate` (a speed ramp, 0.1–10, overrides `data-playback-rate`) or `fx.<nodeId>.<param>`.
|
|
26
|
+
- `t` is seconds from the start of the clip, not of the composition. `v` is in the parameter's unit: 0..1 for volume, dB for a gain, Hz for a frequency.
|
|
27
|
+
- A `volume` lane multiplies `data-volume` in preview and render, so write the level in one of them: `data-volume="0.5"` under a lane at `0.5` plays at `0.25`.
|
|
28
|
+
- A lane holds its first value back to the clip's start and its last value to its end, so a bed that starts before the voice needs an explicit full-level point at `t: 0`.
|
|
29
|
+
- `curve` (-1..1) bends the segment leaving a point. 512 points per lane at most.
|
|
30
|
+
- Don't also tween `volume` with GSAP on a track that has a volume lane or a `data-volume`; lint flags both.
|
|
31
|
+
|
|
32
|
+
## `data-fx-chain`: effects
|
|
33
|
+
|
|
34
|
+
```json
|
|
35
|
+
{
|
|
36
|
+
"version": 1,
|
|
37
|
+
"nodes": [
|
|
38
|
+
{ "type": "highpass", "id": "n1", "label": "Remove rumble", "params": { "frequency": 80 } },
|
|
39
|
+
{
|
|
40
|
+
"type": "peaking",
|
|
41
|
+
"id": "n2",
|
|
42
|
+
"label": "Clarity",
|
|
43
|
+
"params": { "frequency": 3000, "gain": 2.5, "q": 1 }
|
|
44
|
+
},
|
|
45
|
+
{ "type": "limiter", "id": "n3", "params": { "limit": -1 } }
|
|
46
|
+
]
|
|
47
|
+
}
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
- Write the attribute double-quoted with the JSON's quotes as `"`.
|
|
51
|
+
- Order is signal order. `id` is what automation targets (`fx.n2.gain`); give every node one, and a `label` when it does a named job. `enabled: false` bypasses a node.
|
|
52
|
+
- Effects: `gain`, `highpass`, `lowpass`, `peaking`, `lowshelf`, `highshelf`, `compressor`, `limiter`, `gate`, `saturate`, `delay`, `reverb`, `chorus`, `phaser`, `bitcrush`.
|
|
53
|
+
- `compressor`, `limiter`, `gate` and `bitcrush` can't be automated; a lane on them does nothing. Automate a `gain` before them instead.
|
|
54
|
+
- Never set `fromCarve` by hand.
|
|
55
|
+
- `reverb` and `delay` make the rendered track longer than its source; that is expected.
|
|
56
|
+
|
|
57
|
+
| It sounds like | Reach for |
|
|
58
|
+
| --------------------------- | ------------------------------------------- |
|
|
59
|
+
| Hum, rumble, handling noise | `highpass` at 80 Hz |
|
|
60
|
+
| Boomy, too close | `peaking` 200 Hz, −4 dB |
|
|
61
|
+
| Muffled | `peaking` 250 Hz, −3 dB |
|
|
62
|
+
| Words hard to make out | `peaking` 3 kHz, +2.5 dB, or duck the music |
|
|
63
|
+
| Harsh | `peaking` 3.2 kHz, −3 dB |
|
|
64
|
+
| Peaks clipping | `limiter` last in the chain |
|
|
65
|
+
|
|
66
|
+
## Music under a voice
|
|
67
|
+
|
|
68
|
+
Duck the bed with a `volume` lane on the music: full level before the voice, down to about 0.3–0.4 while anyone speaks (word timings from `npx hyperframes transcribe` or the voiceover give the times), back up after. Then carve the bed, which dips only the bands the voice uses: `node <SKILL_DIR>/audio/scripts/carve.mjs --comp index.html` (needs `ffmpeg` and `@hyperframes/core` in the project; `--dry-run` to see the plan). It is the same analysis as Studio's carve panel. It reads only double-quoted attributes (JSON quotes as `"`), so write the bed's chain and lanes that way or it overwrites them. Never put a carve on a voice track.
|
|
69
|
+
|
|
70
|
+
## Group buses
|
|
71
|
+
|
|
72
|
+
Give clips the same `data-audio-group="<id>"` to treat them as one group. An `<hf-audio-group id="<id>"></hf-audio-group>` element with that id (closed like that: `/>` does not close it) makes the group a submix bus with one `data-fx-chain`, one volume and one automation clock for every member. Keep one role per group: `voiceover`, `music`, `sfx`.
|
|
@@ -16,7 +16,7 @@ ffmpeg -i in.mp4 -ss 00:00:12 -to 00:00:20 -c copy out.mp4 # 0:12–0:20, no r
|
|
|
16
16
|
```
|
|
17
17
|
|
|
18
18
|
In-composition trimming usually needs **no new file**: a clip plays a sub-window
|
|
19
|
-
via `data-media-start` + `data-duration` (see hyperframes
|
|
19
|
+
via `data-media-start` + `data-duration` (see `/hyperframes` → `references/format.md`). Only cut a
|
|
20
20
|
physical file when exporting/assembling outside the composition.
|
|
21
21
|
|
|
22
22
|
## Reframe / crop: change aspect ratio
|
|
@@ -121,7 +121,9 @@ VERIFIED on 24GB: accurate, ~3s (cached) for 8s audio. Parakeet covers 25
|
|
|
121
121
|
European languages, English included. For other languages, or when parakeet-mlx is not
|
|
122
122
|
installed, transcribe.mjs falls back to `hyperframes transcribe`, which uses the
|
|
123
123
|
CLI's Parakeet when `models install parakeet` has run and whisper.cpp (99
|
|
124
|
-
languages) otherwise. `--engine parakeet|whisper` forces one
|
|
124
|
+
languages) otherwise. `--engine parakeet|whisper` forces one, except that a
|
|
125
|
+
`--language` other than English runs whisper whenever it is installed, since
|
|
126
|
+
Parakeet detects the language itself. (Cohere
|
|
125
127
|
Transcribe tops the leaderboard on paper but its mlx-audio quants produced
|
|
126
128
|
garbage and ran 40-70x slower on a Mac in testing, so it is not wired in.)
|
|
127
129
|
|
|
@@ -210,9 +212,9 @@ ffmpeg -i mix.wav \
|
|
|
210
212
|
GENERATES. Two paths, best-for-the-machine picked automatically:
|
|
211
213
|
|
|
212
214
|
1. **Local (default, free, private): mflux** (FLUX-on-MLX). `resolve` spec-checks
|
|
213
|
-
AVAILABLE RAM and runs the best FLUX-class model that fits,
|
|
214
|
-
|
|
215
|
-
The RAM ladder
|
|
215
|
+
AVAILABLE RAM and runs the best FLUX-class model that fits, using the
|
|
216
|
+
CLI-bundled `imagegen` ladder (its modules are not shipped in the standalone
|
|
217
|
+
skill). The RAM ladder:
|
|
216
218
|
|
|
217
219
|
| Tier | Model | Needs (available RAM) | Notes |
|
|
218
220
|
| ------ | -------------------- | --------------------- | ----------------------------------- |
|
|
@@ -245,7 +247,7 @@ clip), so treat the fallback as "HeyGen wasn't reachable," not "upgrade the
|
|
|
245
247
|
quality":
|
|
246
248
|
|
|
247
249
|
- **HeyGen avatar video (default, free for new API users):**
|
|
248
|
-
|
|
250
|
+
The CLI-bundled provider shells the
|
|
249
251
|
`heygen` CLI — never the raw API — auto-picking a public avatar and a
|
|
250
252
|
starfish voice (override with `--avatar-id`/`--voice-id`, threaded through
|
|
251
253
|
as `ctx.avatarId`/`ctx.voiceId`). If the CLI reports `not_authenticated`,
|
|
@@ -253,13 +255,13 @@ quality":
|
|
|
253
255
|
new API users — sign in) to stderr and falls through to LTX instead of
|
|
254
256
|
hard-failing.
|
|
255
257
|
- **Local fallback: LTX 2.3 on MLX** via `dgrauet/ltx-2-mlx`, the `videogen`
|
|
256
|
-
ladder in
|
|
258
|
+
ladder bundled in the HyperFrames CLI. Generative clips
|
|
257
259
|
(t2v), spec-gated to RAM. Verified on 24GB: 512x320 x 33f with audio.
|
|
258
260
|
|
|
259
261
|
Every generating `heygen` call from media-use — TTS, avatar video, and
|
|
260
262
|
catalog search — sends the allowlisted `X-HeyGen-Client-Source: media-use`
|
|
261
263
|
header (persistent flag, works on every subcommand) via the shared
|
|
262
|
-
`HEYGEN_CLIENT_SOURCE_ARGV` constant
|
|
264
|
+
CLI-internal `HEYGEN_CLIENT_SOURCE_ARGV` constant, so usage
|
|
263
265
|
tags correctly in billing/resource meta and shows up in the API dashboards.
|
|
264
266
|
Read-only discovery (`avatar list`, `voice list`) doesn't need it.
|
|
265
267
|
|
|
@@ -11,7 +11,7 @@ Returns one line: `resolved <id> → <path> (<type>, <metadata>)`
|
|
|
11
11
|
| Type | What it finds | Provider / cascade |
|
|
12
12
|
| ------- | -------------------------------- | ------------------------------------------------------------ |
|
|
13
13
|
| `bgm` | Background music | HeyGen audio catalog (10k+ tracks) |
|
|
14
|
-
| `sfx` | Sound effects |
|
|
14
|
+
| `sfx` | Sound effects | Openverse (CC0 / CC BY), then the bundled 21-file library |
|
|
15
15
|
| `image` | Photos, backgrounds | HeyGen asset search (75k+ vectors) |
|
|
16
16
|
| `icon` | Icons, symbols | HeyGen asset search (type=icon) |
|
|
17
17
|
| `logo` | Official brand marks | theSVG → GitHub org avatar → domain favicon |
|
|
@@ -9,25 +9,40 @@ heygen update # free usage needs the OAuth-capable CLI (v0.3.0+)
|
|
|
9
9
|
heygen auth login --oauth # OAuth = free subscription credits; --api-key bills API credits
|
|
10
10
|
```
|
|
11
11
|
|
|
12
|
-
This unlocks the FREE path for bgm/
|
|
12
|
+
This unlocks the FREE path for bgm/image/icon catalog search, TTS (voice), and avatar videos. Sign in with `--oauth` — the free allowance rides on the OAuth session (an API key bills API credits instead). **media-use requires heygen >= v0.3.0 uniformly** (the OAuth free-usage path needs it), so `--doctor` nudges older CLIs to update even for API-key-only use. Before resolving anything, verify setup with:
|
|
13
13
|
|
|
14
14
|
```bash
|
|
15
15
|
npx hyperframes media-use resolve --doctor
|
|
16
16
|
```
|
|
17
17
|
|
|
18
|
+
## Host HeyGen access (no CLI sign-in)
|
|
19
|
+
|
|
20
|
+
A host app can give media-use HeyGen access of its own by setting
|
|
21
|
+
`HEYGEN_API_BASE` (its gateway), `HEYGEN_API_KEY` (the token that gateway
|
|
22
|
+
accepts) and, for a loopback gateway, `HEYGEN_ALLOW_HTTP=1`. The gateway adds
|
|
23
|
+
the host's key, so it never enters the agent's environment, and every
|
|
24
|
+
call is charged to that key's API credits. The `heygen` CLI honours the same
|
|
25
|
+
variables, so `resolve` (bgm/sfx/image/icon/voice/avatar-video) and the audio
|
|
26
|
+
engine's TTS all go through the host. With host access, skip CLI install and
|
|
27
|
+
sign-in, prefer the host's own HeyGen tools where it has them, never fall back
|
|
28
|
+
to a local or third-party generator on your own, and relay a refused call's
|
|
29
|
+
message (for example "add a key in Settings > Account") as written.
|
|
30
|
+
|
|
18
31
|
## Providers
|
|
19
32
|
|
|
20
33
|
media-use holds no keys; every external tool owns its auth. Generation is
|
|
21
34
|
centered on the HeyGen CLI free-usage path. Install and authenticate `heygen`
|
|
22
|
-
before resolving bgm/sfx/image/icon/voice/avatar-video
|
|
35
|
+
before resolving bgm/sfx/image/icon/voice/avatar-video; music and sound effects from
|
|
36
|
+
a host app's own tools need none of it. Local tools are opt-in
|
|
23
37
|
alternatives where they exist: mflux for image, Kokoro for voice, Parakeet for
|
|
24
38
|
transcription, and LTX for local video generation. `resolve` spec-checks
|
|
25
|
-
AVAILABLE RAM for those local ladders
|
|
26
|
-
|
|
39
|
+
AVAILABLE RAM for those local ladders inside the CLI (the image tiers are listed
|
|
40
|
+
in `references/operations.md`).
|
|
27
41
|
|
|
28
42
|
| Type | Provider / path |
|
|
29
43
|
| --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
30
|
-
| bgm
|
|
44
|
+
| bgm | heygen catalog free-usage path; a host app's own music tools come first |
|
|
45
|
+
| sfx | Openverse (CC0 / CC BY, no account), bundled library offline; a host app's own sound tools come first |
|
|
31
46
|
| image | heygen search free-usage path; optional local mflux; codex `image_gen` upsell |
|
|
32
47
|
| voice | heygen tts free-usage path; optional local **Kokoro** (free, on-device) |
|
|
33
48
|
| icon | heygen asset search free-usage path |
|
|
@@ -53,25 +68,24 @@ HeyGen-only types, that means no fresh resolve.
|
|
|
53
68
|
## CLI tools used (what to run, and how to enable each)
|
|
54
69
|
|
|
55
70
|
`resolve` auto-cascades; each provider shells one CLI. HeyGen is the
|
|
56
|
-
free-usage path for bgm/
|
|
71
|
+
free-usage path for bgm/image/icon catalog search, TTS (voice), and avatar
|
|
57
72
|
video, so those capabilities need `heygen` installed and authenticated. Local
|
|
58
73
|
tools are OPT-IN alternatives where they exist; install one to unlock its free,
|
|
59
74
|
private, on-device path instead of or ahead of HeyGen for that type. Only
|
|
60
75
|
`ffmpeg`/`ffprobe` are strictly required for the tool to run at all.
|
|
61
76
|
|
|
62
|
-
| Tool | Serves
|
|
63
|
-
| ------------------ |
|
|
64
|
-
| `ffmpeg`/`ffprobe` | adopt probing, smart-grade signalstats, cut, duck bake, loudnorm
|
|
65
|
-
| `heygen` | catalog (bgm/
|
|
66
|
-
| `mflux-generate` | local image gen (FLUX), best-for-RAM
|
|
67
|
-
| `codex` | image gen upsell (ChatGPT sub)
|
|
68
|
-
| `parakeet-mlx` | local transcription (default ASR, best) on Apple Silicon
|
|
69
|
-
| `ltx-2-mlx` | local video gen
|
|
70
|
-
| `npx hyperframes` | Kokoro TTS (voice), Parakeet or whisper.cpp (transcribe), remove-background
|
|
77
|
+
| Tool | Serves | Install |
|
|
78
|
+
| ------------------ | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
79
|
+
| `ffmpeg`/`ffprobe` | adopt probing, smart-grade signalstats, cut, duck bake, loudnorm | system package (`brew install ffmpeg`) |
|
|
80
|
+
| `heygen` | catalog (bgm/image/icon) + TTS (voice) + avatar video — the free-usage path | install through [verified HeyGen release instructions](https://developers.heygen.com/cli), then `heygen auth login --oauth` (needs >= v0.3.0) |
|
|
81
|
+
| `mflux-generate` | local image gen (FLUX), best-for-RAM | `uv venv ~/.venvs/mflux && VIRTUAL_ENV=~/.venvs/mflux uv pip install mflux==0.9.6` |
|
|
82
|
+
| `codex` | image gen upsell (ChatGPT sub) | Codex CLI, logged in via ChatGPT (owns its own auth) |
|
|
83
|
+
| `parakeet-mlx` | local transcription (default ASR, best) on Apple Silicon | `uv venv ~/.venvs/parakeet && VIRTUAL_ENV=~/.venvs/parakeet uv pip install parakeet-mlx` |
|
|
84
|
+
| `ltx-2-mlx` | local video gen | `git clone https://github.com/dgrauet/ltx-2-mlx && cd ltx-2-mlx && uv sync --all-extras` |
|
|
85
|
+
| `npx hyperframes` | Kokoro TTS (voice), Parakeet or whisper.cpp (transcribe), remove-background | via the hyperframes CLI; Parakeet on macOS, Windows and glibc 2.32+ Linux: `npx hyperframes models install parakeet`; whisper.cpp is built on first use (Homebrew on macOS, else git+cmake) |
|
|
71
86
|
|
|
72
87
|
The RAM-graded local-model shortlist + exact per-tier install/invoke lives in
|
|
73
|
-
|
|
74
|
-
to see which model fits this machine). Without a tool on PATH, its provider
|
|
88
|
+
the CLI's bundled media-use engine, not in the standalone skill. Without a tool on PATH, its provider
|
|
75
89
|
prints a one-line diagnostic to stderr and resolve falls through where another
|
|
76
90
|
provider exists (e.g. no `mflux` -> codex image upsell; no `parakeet-mlx` -> whisper.cpp).
|
|
77
91
|
|
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { cpSync, mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
1
|
+
import { cpSync, mkdtempSync, rmSync } from "node:fs";
|
|
3
2
|
import { tmpdir } from "node:os";
|
|
4
3
|
import { join } from "node:path";
|
|
5
4
|
import { execFileSync } from "node:child_process";
|
|
6
5
|
import test from "node:test";
|
|
7
|
-
import { pathToFileURL } from "node:url";
|
|
8
6
|
|
|
9
7
|
process.env.HYPERFRAMES_MEDIA_HOME = mkdtempSync(join(tmpdir(), "media-use-compat-home-"));
|
|
10
8
|
|
|
@@ -41,56 +39,3 @@ test("published audio helpers import without the CLI package tree", () => {
|
|
|
41
39
|
rmSync(root, { recursive: true, force: true });
|
|
42
40
|
}
|
|
43
41
|
});
|
|
44
|
-
|
|
45
|
-
for (const name of ["faceless-explainer", "pr-to-video", "product-launch-video"]) {
|
|
46
|
-
test(name + " assembles from its installed directory alone", () => {
|
|
47
|
-
const root = mkdtempSync(join(tmpdir(), "installed-workflow-"));
|
|
48
|
-
try {
|
|
49
|
-
const skill = join(root, name);
|
|
50
|
-
cpSync(new URL("../../" + name, import.meta.url), skill, { recursive: true });
|
|
51
|
-
const project = join(root, "project");
|
|
52
|
-
mkdirSync(join(project, "compositions/frames"), { recursive: true });
|
|
53
|
-
writeFileSync(
|
|
54
|
-
join(project, "STORYBOARD.md"),
|
|
55
|
-
"---\nformat: 1920x1080\nmessage: Test\n---\n\n## Frame 1\n- duration: 3s\n- src: compositions/frames/01-a.html\n",
|
|
56
|
-
);
|
|
57
|
-
writeFileSync(
|
|
58
|
-
join(project, "compositions/frames/01-a.html"),
|
|
59
|
-
'<template><div data-composition-id="01-a" data-duration="3" data-width="1920" data-height="1080"><section class="clip" data-start="0" data-duration="3"></section></div></template>',
|
|
60
|
-
);
|
|
61
|
-
run(join(skill, "scripts"), "assemble-index.mjs", [
|
|
62
|
-
"--hyperframes",
|
|
63
|
-
project,
|
|
64
|
-
"--storyboard",
|
|
65
|
-
join(project, "STORYBOARD.md"),
|
|
66
|
-
]);
|
|
67
|
-
assert.match(readFileSync(join(project, "index.html"), "utf8"), /01-a/);
|
|
68
|
-
importPacketBuilder(join(skill, "scripts/frame-packets.mjs"));
|
|
69
|
-
} finally {
|
|
70
|
-
rmSync(root, { recursive: true, force: true });
|
|
71
|
-
}
|
|
72
|
-
});
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
test("general-video packet builder starts from its installed directory alone", () => {
|
|
76
|
-
const root = mkdtempSync(join(tmpdir(), "installed-packets-"));
|
|
77
|
-
try {
|
|
78
|
-
cpSync(new URL("../../general-video", import.meta.url), root, { recursive: true });
|
|
79
|
-
importPacketBuilder(join(root, "scripts/frame-packets.mjs"));
|
|
80
|
-
} finally {
|
|
81
|
-
rmSync(root, { recursive: true, force: true });
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
function importPacketBuilder(path) {
|
|
86
|
-
execFileSync(
|
|
87
|
-
process.execPath,
|
|
88
|
-
[
|
|
89
|
-
"--input-type=module",
|
|
90
|
-
"-e",
|
|
91
|
-
'const m = await import(process.argv[1]); if (typeof m.buildFramePackets !== "function") throw new Error("missing builder");',
|
|
92
|
-
pathToFileURL(path).href,
|
|
93
|
-
],
|
|
94
|
-
{ stdio: "pipe" },
|
|
95
|
-
);
|
|
96
|
-
}
|
|
@@ -148,7 +148,7 @@ function clampRanges(ranges, duration) {
|
|
|
148
148
|
|
|
149
149
|
function mergeRanges(ranges) {
|
|
150
150
|
const sorted = ranges
|
|
151
|
-
.map((range) => ({ start:
|
|
151
|
+
.map((range) => ({ start: round6(range.start), end: round6(range.end) }))
|
|
152
152
|
.sort((a, b) => a.start - b.start || a.end - b.end);
|
|
153
153
|
const merged = [];
|
|
154
154
|
for (const range of sorted) {
|
|
@@ -173,12 +173,19 @@ function invertRanges(removals, duration) {
|
|
|
173
173
|
return kept;
|
|
174
174
|
}
|
|
175
175
|
|
|
176
|
+
// Range bounds are rounded only to shed float noise, never to the millisecond:
|
|
177
|
+
// these values become ffmpeg's -ss/-to, where a millisecond is wide enough to
|
|
178
|
+
// step a boundary onto the next frame at 29.97/30/60 fps.
|
|
176
179
|
function finalizeKept(ranges) {
|
|
177
180
|
return mergeRanges(ranges)
|
|
178
|
-
.map((range) => ({ start:
|
|
181
|
+
.map((range) => ({ start: round6(range.start), end: round6(range.end) }))
|
|
179
182
|
.filter((range) => round3(range.end - range.start) >= MIN_SEGMENT_SECONDS);
|
|
180
183
|
}
|
|
181
184
|
|
|
185
|
+
function round6(n) {
|
|
186
|
+
return Math.round(Number(n) * 1e6) / 1e6;
|
|
187
|
+
}
|
|
188
|
+
|
|
182
189
|
function round3(n) {
|
|
183
190
|
return Math.round(Number(n) * 1000) / 1000;
|
|
184
191
|
}
|
|
@@ -5,7 +5,7 @@ export function speechSpans(meta, { mergeGap = 0.6, offsets, sequential = false,
|
|
|
5
5
|
const merge = Number(mergeGap);
|
|
6
6
|
const lists = wordListsFromMediaMeta(meta);
|
|
7
7
|
const voices = Array.isArray(meta?.voices) ? meta.voices : [];
|
|
8
|
-
if (lists.length > 1 && !offsets && !sequential) {
|
|
8
|
+
if (lists.filter((words) => words.length > 0).length > 1 && !offsets && !sequential) {
|
|
9
9
|
throw new Error(
|
|
10
10
|
"audio_meta has multiple voice lines with file-relative times; pass --sequential or --offsets so spans land at composition time",
|
|
11
11
|
);
|
|
@@ -16,6 +16,7 @@ export function speechSpans(meta, { mergeGap = 0.6, offsets, sequential = false,
|
|
|
16
16
|
const voice = voices[i];
|
|
17
17
|
let offset = 0;
|
|
18
18
|
if (offsets) {
|
|
19
|
+
if (lists[i].length === 0) continue;
|
|
19
20
|
const id = voice?.id ?? String(i);
|
|
20
21
|
if (!(id in offsets)) throw new Error(`--offsets is missing voice "${id}"`);
|
|
21
22
|
offset = Number(offsets[id]) || 0;
|
|
@@ -62,11 +63,27 @@ export function duckLane(keyframes, { clipStart = 0, baseVolume = 1 } = {}) {
|
|
|
62
63
|
if (t > points.at(-1).t) points.push({ t: round3(t), v });
|
|
63
64
|
};
|
|
64
65
|
for (const kf of keyframes) {
|
|
65
|
-
const t = Math.max(0, kf.time
|
|
66
|
+
const t = Math.max(0, kf.time);
|
|
66
67
|
push(t, points.at(-1).v);
|
|
67
68
|
push(t + kf.duration, kf.volume);
|
|
68
69
|
}
|
|
69
|
-
|
|
70
|
+
|
|
71
|
+
const next = points.findIndex((point) => point.t > start);
|
|
72
|
+
const before = points[next - 1] ?? points.at(-1);
|
|
73
|
+
const after = points[next];
|
|
74
|
+
const initial =
|
|
75
|
+
next === 0
|
|
76
|
+
? points[0].v
|
|
77
|
+
: after
|
|
78
|
+
? before.v + ((after.v - before.v) * (start - before.t)) / (after.t - before.t)
|
|
79
|
+
: before.v;
|
|
80
|
+
const localPoints = [
|
|
81
|
+
{ t: 0, v: initial },
|
|
82
|
+
...points
|
|
83
|
+
.filter((point) => point.t > start)
|
|
84
|
+
.map((point) => ({ t: round3(point.t - start), v: point.v })),
|
|
85
|
+
];
|
|
86
|
+
return { version: 1, lanes: [{ target: "volume", points: localPoints }] };
|
|
70
87
|
}
|
|
71
88
|
|
|
72
89
|
function mergeIntervals(intervals, mergeGap) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { writeFileSync, mkdirSync } from "node:fs";
|
|
2
2
|
import { dirname } from "node:path";
|
|
3
|
-
import {
|
|
3
|
+
import { currentRecords, indexPath } from "./manifest.mjs";
|
|
4
4
|
|
|
5
5
|
function pad(str, len) {
|
|
6
6
|
return String(str ?? "").padEnd(len);
|
|
@@ -54,7 +54,7 @@ export function generateIndexContent(records) {
|
|
|
54
54
|
}
|
|
55
55
|
|
|
56
56
|
export function regenerateIndex(projectDir) {
|
|
57
|
-
const records =
|
|
57
|
+
const records = currentRecords(projectDir);
|
|
58
58
|
const content = generateIndexContent(records);
|
|
59
59
|
const p = indexPath(projectDir);
|
|
60
60
|
mkdirSync(dirname(p), { recursive: true });
|
|
@@ -10,7 +10,8 @@ import {
|
|
|
10
10
|
rmSync,
|
|
11
11
|
statSync,
|
|
12
12
|
} from "node:fs";
|
|
13
|
-
import {
|
|
13
|
+
import { randomBytes } from "node:crypto";
|
|
14
|
+
import { basename, join } from "node:path";
|
|
14
15
|
|
|
15
16
|
const MANIFEST_FILE = "manifest.jsonl";
|
|
16
17
|
const INDEX_FILE = "index.md";
|
|
@@ -79,6 +80,45 @@ export function appendRecord(projectDir, record) {
|
|
|
79
80
|
appendFileSync(p, line);
|
|
80
81
|
}
|
|
81
82
|
|
|
83
|
+
/** Sources that mean the agent made or fetched the file; any other file is the person's own. */
|
|
84
|
+
export const AGENT_SOURCES = ["generated", "search", "bundled"];
|
|
85
|
+
|
|
86
|
+
/** The record a path has now: the manifest only appends, so the last one for a path wins. */
|
|
87
|
+
export function latestRecordFor(projectDir, path) {
|
|
88
|
+
return readManifest(projectDir).findLast((record) => record.path === path);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/** Records with every older record for the same path dropped, since the last one for a path is its record. */
|
|
92
|
+
export function currentRecords(projectDir) {
|
|
93
|
+
const records = readManifest(projectDir);
|
|
94
|
+
const last = new Map(records.map((record, index) => [record.path, index]));
|
|
95
|
+
return records.filter((record, index) => !record.path || last.get(record.path) === index);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/** Records a file already in the project where it is, unless its current record already says the same thing. */
|
|
99
|
+
export function recordInPlace(
|
|
100
|
+
projectDir,
|
|
101
|
+
{ type, path, source, description, duration, provenance },
|
|
102
|
+
) {
|
|
103
|
+
const fields = {
|
|
104
|
+
type,
|
|
105
|
+
path,
|
|
106
|
+
source,
|
|
107
|
+
description: description || basename(path),
|
|
108
|
+
...(duration != null && { duration: Math.round(duration * 10) / 10 }),
|
|
109
|
+
};
|
|
110
|
+
return withMediaLock(projectDir, () => {
|
|
111
|
+
const latest = latestRecordFor(projectDir, path);
|
|
112
|
+
const same = ["source", "description", "duration"].every(
|
|
113
|
+
(key) => latest?.[key] === fields[key],
|
|
114
|
+
);
|
|
115
|
+
if (latest && same) return latest;
|
|
116
|
+
const record = { id: nextFreeId(projectDir, type), ...fields, provenance };
|
|
117
|
+
appendRecord(projectDir, record);
|
|
118
|
+
return record;
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
|
|
82
122
|
// Match prompts forgivingly. Agents rarely re-emit a byte-identical intent, so
|
|
83
123
|
// keying cache lookups on exact equality meant "Calm piano" and "calm piano"
|
|
84
124
|
// re-searched and re-downloaded. Normalize (trim, lowercase, collapse internal
|
|
@@ -93,7 +133,7 @@ export function normalizePrompt(prompt) {
|
|
|
93
133
|
export function findByPrompt(projectDir, prompt, type) {
|
|
94
134
|
const key = normalizePrompt(prompt);
|
|
95
135
|
if (!key) return null;
|
|
96
|
-
const records =
|
|
136
|
+
const records = currentRecords(projectDir);
|
|
97
137
|
return (
|
|
98
138
|
records.find(
|
|
99
139
|
(r) => normalizePrompt(r.provenance?.prompt) === key && (type == null || r.type === type),
|
|
@@ -103,7 +143,7 @@ export function findByPrompt(projectDir, prompt, type) {
|
|
|
103
143
|
|
|
104
144
|
export function findByEntity(projectDir, entity) {
|
|
105
145
|
const lower = entity.toLowerCase();
|
|
106
|
-
const records =
|
|
146
|
+
const records = currentRecords(projectDir);
|
|
107
147
|
return records.find((r) => r.entity && r.entity.toLowerCase() === lower) || null;
|
|
108
148
|
}
|
|
109
149
|
|
|
@@ -162,56 +202,69 @@ function withLock(dir, fn) {
|
|
|
162
202
|
}
|
|
163
203
|
}
|
|
164
204
|
|
|
165
|
-
|
|
205
|
+
/** Runs `fn` holding the project's `.media/.lock`, so concurrent resolves take turns on what it guards. */
|
|
206
|
+
export function withMediaLock(projectDir, fn) {
|
|
207
|
+
mkdirSync(mediaDir(projectDir), { recursive: true });
|
|
208
|
+
return withLock(mediaDir(projectDir), fn);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// Atomically allocate the next free id for `type` AND reserve it on disk, so a
|
|
166
212
|
// slow download/copy between allocation and appendRecord can't let a concurrent
|
|
167
213
|
// caller grab the same id (the MU-23 clobber). Under the lock we take the max id
|
|
168
214
|
// across BOTH the manifest and any already-reserved files in the type dir, then
|
|
169
|
-
// O_EXCL-create an empty
|
|
170
|
-
//
|
|
215
|
+
// O_EXCL-create an empty marker under core's atomic temp name, which Studio's
|
|
216
|
+
// project history skips. Returns { id, localPath, markerPath }.
|
|
171
217
|
export function allocateId(projectDir, type, ext) {
|
|
172
|
-
mkdirSync(
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
return withLock(mediaDir(projectDir), () => {
|
|
176
|
-
const re = new RegExp(`^${type}_(\\d+)`);
|
|
177
|
-
let max = 0;
|
|
178
|
-
for (const r of readManifest(projectDir)) {
|
|
179
|
-
if (r.type !== type) continue;
|
|
180
|
-
const m = r.id?.match(re);
|
|
181
|
-
if (m) max = Math.max(max, parseInt(m[1], 10));
|
|
182
|
-
}
|
|
183
|
-
for (const f of readdirSync(typeDir)) {
|
|
184
|
-
const m = f.match(re);
|
|
185
|
-
if (m) max = Math.max(max, parseInt(m[1], 10)); // skip ids reserved but not yet appended
|
|
186
|
-
}
|
|
187
|
-
const id = `${type}_${String(max + 1).padStart(3, "0")}`;
|
|
218
|
+
mkdirSync(typeDirPath(projectDir, type), { recursive: true });
|
|
219
|
+
return withMediaLock(projectDir, () => {
|
|
220
|
+
const id = nextFreeId(projectDir, type);
|
|
188
221
|
const localPath = `.media/${typeSubdir(type)}/${id}${ext}`;
|
|
189
|
-
|
|
190
|
-
|
|
222
|
+
// Same shape as core atomicTempPath: an empty file at the final name would be committed.
|
|
223
|
+
const markerPath = `${join(projectDir, localPath)}.hf${randomBytes(3).toString("hex")}.tmp`;
|
|
224
|
+
writeFileSync(markerPath, "", { flag: "wx" }); // durable reservation
|
|
225
|
+
return { id, localPath, markerPath };
|
|
191
226
|
});
|
|
192
227
|
}
|
|
193
228
|
|
|
229
|
+
// Call under the lock: counts recorded ids and ids reserved by a file not yet recorded.
|
|
230
|
+
function nextFreeId(projectDir, type) {
|
|
231
|
+
const re = new RegExp(`^${type}_(\\d+)`);
|
|
232
|
+
let max = 0;
|
|
233
|
+
for (const r of readManifest(projectDir)) {
|
|
234
|
+
if (r.type !== type) continue;
|
|
235
|
+
const m = r.id?.match(re);
|
|
236
|
+
if (m) max = Math.max(max, parseInt(m[1], 10));
|
|
237
|
+
}
|
|
238
|
+
const typeDir = typeDirPath(projectDir, type);
|
|
239
|
+
for (const f of existsSync(typeDir) ? readdirSync(typeDir) : []) {
|
|
240
|
+
const m = f.match(re);
|
|
241
|
+
if (m) max = Math.max(max, parseInt(m[1], 10));
|
|
242
|
+
}
|
|
243
|
+
return `${type}_${String(max + 1).padStart(3, "0")}`;
|
|
244
|
+
}
|
|
245
|
+
|
|
194
246
|
function reservedFile(projectDir, type, ext) {
|
|
195
247
|
const allocation = allocateId(projectDir, type, ext);
|
|
196
248
|
return { ...allocation, fullPath: join(projectDir, allocation.localPath) };
|
|
197
249
|
}
|
|
198
250
|
|
|
199
|
-
function
|
|
200
|
-
rmSync(reservation.fullPath, { force: true });
|
|
251
|
+
function releaseReservation(reservation, committed) {
|
|
252
|
+
if (!committed) rmSync(reservation.fullPath, { force: true });
|
|
253
|
+
rmSync(reservation.markerPath, { force: true });
|
|
201
254
|
}
|
|
202
255
|
|
|
203
256
|
// A reservation is committed only when populate returns a non-null value.
|
|
204
257
|
// Throwing/rejecting or returning null means no usable asset was produced, so
|
|
205
|
-
// the
|
|
206
|
-
// prevents
|
|
258
|
+
// the reservation and any partial asset are released. Keeping this transaction
|
|
259
|
+
// beside allocateId prevents provider/cache/LUT paths from forgetting the rollback.
|
|
207
260
|
export function withReservedFileSync(projectDir, type, ext, populate) {
|
|
208
261
|
const reservation = reservedFile(projectDir, type, ext);
|
|
209
262
|
try {
|
|
210
263
|
const result = populate(reservation);
|
|
211
|
-
|
|
264
|
+
releaseReservation(reservation, result != null);
|
|
212
265
|
return result;
|
|
213
266
|
} catch (error) {
|
|
214
|
-
|
|
267
|
+
releaseReservation(reservation, false);
|
|
215
268
|
throw error;
|
|
216
269
|
}
|
|
217
270
|
}
|
|
@@ -220,10 +273,10 @@ export async function withReservedFile(projectDir, type, ext, populate) {
|
|
|
220
273
|
const reservation = reservedFile(projectDir, type, ext);
|
|
221
274
|
try {
|
|
222
275
|
const result = await populate(reservation);
|
|
223
|
-
|
|
276
|
+
releaseReservation(reservation, result != null);
|
|
224
277
|
return result;
|
|
225
278
|
} catch (error) {
|
|
226
|
-
|
|
279
|
+
releaseReservation(reservation, false);
|
|
227
280
|
throw error;
|
|
228
281
|
}
|
|
229
282
|
}
|