hyperframes 0.8.184 → 0.8.185
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/dist/{add-5ZTD3MUZ.js → add-ODTNPRGG.js} +14 -14
- package/dist/{agentPromptGenerator-VIIPZCJ3.js → agentPromptGenerator-KYO5MKTW.js} +1 -1
- package/dist/{animatedGifPrep-AGASIWVA.js → animatedGifPrep-PEP5GWOJ.js} +9 -9
- package/dist/api.js +17 -17
- package/dist/{asset-LSTEMPIB.js → asset-EZG42XPA.js} +2 -2
- package/dist/{assetCataloger-BKBMNL3A.js → assetCataloger-OHAJFCA7.js} +9 -9
- package/dist/{audio-KGK44XE4.js → audio-65R4T74I.js} +16 -15
- package/dist/{auth-MJWKYK77.js → auth-VP2SIZFN.js} +1 -1
- package/dist/{autoUpdate-2GGDKYR2.js → autoUpdate-RVSUX4SS.js} +2 -2
- package/dist/{backgroundChecks-7GRX5VQY.js → backgroundChecks-LEHK74NS.js} +3 -3
- package/dist/backgroundChecksWorker.js +3 -3
- package/dist/{batchRender-BCV2LELR.js → batchRender-3X6CL7PK.js} +5 -5
- package/dist/{beats-7BCFRBAL.js → beats-66VPQLSC.js} +6 -6
- package/dist/{benchmark-2R6CN5MQ.js → benchmark-PBJVTOJP.js} +10 -10
- package/dist/{browser-6AFGOI7G.js → browser-TPL5MWGC.js} +3 -3
- package/dist/{bundleWithLocalizedFonts-2EGPA5ZO.js → bundleWithLocalizedFonts-67MLTHKM.js} +2 -2
- package/dist/{capture-HOIAW6MO.js → capture-F3GNMRZM.js} +13 -13
- package/dist/{capture-HA2UHLIU.js → capture-YYRE7EV3.js} +2 -2
- package/dist/{captureCompositionFrame-4236FVWJ.js → captureCompositionFrame-PXV2ISHD.js} +13 -13
- package/dist/{catalog-A6CZAWW4.js → catalog-6SDD3OHF.js} +14 -14
- package/dist/{catch-up-TNA4DJOA.js → catch-up-CWIVA5VG.js} +4 -4
- package/dist/{check-5E5U2EQZ.js → check-YQ6REK2S.js} +34 -34
- package/dist/{checkBrowser-FNINXBMZ.js → checkBrowser-5XZCBRXM.js} +31 -31
- package/dist/{chunk-2ULXZ4PG.js → chunk-2TAS5O4P.js} +56 -11
- package/dist/{chunk-3TXNNBI2.js → chunk-37CNYTQQ.js} +2 -2
- package/dist/chunk-3NPOFC43.js +3805 -0
- package/dist/{chunk-EEP5Y5IE.js → chunk-46HEFGXJ.js} +1 -1
- package/dist/{chunk-2XA7KXQO.js → chunk-4CTNDBE3.js} +2 -2
- package/dist/{chunk-MFAETWIF.js → chunk-55YELV7B.js} +1 -1
- package/dist/{chunk-LRGYPXHF.js → chunk-5GUKZRQN.js} +1 -1
- package/dist/{chunk-SAX7HQ5E.js → chunk-6ASIXMFP.js} +1 -1
- package/dist/{chunk-SN7KI5JA.js → chunk-6GPR3G3C.js} +2 -2
- package/dist/{chunk-E32ZQ2WO.js → chunk-6RIZY7OP.js} +1 -1
- package/dist/{chunk-5CS4T6C6.js → chunk-7L37AB57.js} +1 -1
- package/dist/{chunk-BCHSTE7U.js → chunk-7PS6RVWD.js} +1 -1
- package/dist/{chunk-X3CG5YQA.js → chunk-7RAY4WZP.js} +3 -3
- package/dist/{chunk-YWHCXIMD.js → chunk-A6QCO474.js} +5 -5
- package/dist/{chunk-YMS5FOMC.js → chunk-B2A56S5C.js} +1 -1
- package/dist/{chunk-IWTNTUPQ.js → chunk-BH7TTIPN.js} +11 -13
- package/dist/{chunk-DWUGKEHR.js → chunk-BRAPBUPQ.js} +1 -1
- package/dist/{chunk-R2BFTECP.js → chunk-CX3USX23.js} +3 -3
- package/dist/{chunk-JB6ARMQS.js → chunk-D42NU3DZ.js} +1 -1
- package/dist/{chunk-GDEV42FA.js → chunk-EMAWIZ54.js} +481 -36
- package/dist/{chunk-UNNXFKVG.js → chunk-EMSDWBG3.js} +2 -2
- package/dist/{chunk-CXABAXB3.js → chunk-ESBMUZXZ.js} +1 -1
- package/dist/{chunk-EM7C7H7S.js → chunk-F3OPUWQX.js} +7 -7
- package/dist/{chunk-YOZPQCSR.js → chunk-FX6RUJUY.js} +3 -3
- package/dist/{chunk-PSKEKWVU.js → chunk-G2UANIDX.js} +1 -1
- package/dist/{chunk-UKOTVJFV.js → chunk-H5SM5PJI.js} +1 -1
- package/dist/{chunk-YWNJTZGN.js → chunk-H6UY725W.js} +2 -2
- package/dist/{chunk-PFYWVUHA.js → chunk-HDIRZGK4.js} +1 -1
- package/dist/{chunk-HR23IKLZ.js → chunk-HHSJJFVM.js} +2 -2
- package/dist/{chunk-LLC4CS6I.js → chunk-HXUTX5GR.js} +3 -3
- package/dist/{chunk-RGXVEYHI.js → chunk-I3IH5MV5.js} +6 -10
- package/dist/{chunk-Q33P4EAC.js → chunk-I45HL3VP.js} +3 -3
- package/dist/{chunk-TYXH3EKP.js → chunk-I5JRXMCV.js} +16 -1
- package/dist/{chunk-4N4P3ZWL.js → chunk-I7QMXZSB.js} +2 -2
- package/dist/{chunk-ICJEAFPD.js → chunk-IDFNKFPL.js} +7 -7
- package/dist/{chunk-VNVQGDPC.js → chunk-IDGLGXPA.js} +1 -1
- package/dist/{chunk-2PVE4WS2.js → chunk-IPDKZ5IN.js} +33 -6
- package/dist/{chunk-ABZYYUUH.js → chunk-ISTRDGIX.js} +1 -1
- package/dist/{chunk-3MDJIWOV.js → chunk-IVEFOUZI.js} +46 -30
- package/dist/{chunk-4KKKBEP3.js → chunk-J5XEZ24I.js} +3 -3
- package/dist/{chunk-7HJALUIO.js → chunk-K2ZKXTVL.js} +1 -1
- package/dist/{chunk-TE427YID.js → chunk-K73RJB23.js} +2 -2
- package/dist/{chunk-3QVMJ7GX.js → chunk-KQ4JEJLF.js} +9 -9
- package/dist/{chunk-J3QM7AHP.js → chunk-KROXPHXX.js} +9 -3
- package/dist/{chunk-OLZENUPI.js → chunk-LLFQA7XF.js} +1 -1
- package/dist/chunk-LLMSX6V6.js +17 -0
- package/dist/{chunk-WTFUDNW2.js → chunk-LYKSTRAY.js} +3 -3
- package/dist/{chunk-VDM3FEDP.js → chunk-OAG47RE6.js} +1 -1
- package/dist/{chunk-FGJEUV4S.js → chunk-PHMBMOXF.js} +1 -1
- package/dist/{chunk-7MB2ZAQF.js → chunk-PMMQRJDE.js} +1 -1
- package/dist/{chunk-ADDHW2FS.js → chunk-Q447CX26.js} +82 -12
- package/dist/{chunk-YALM6XN4.js → chunk-Q47FAYYK.js} +3 -3
- package/dist/{chunk-ZOCHDXDG.js → chunk-RTBSA3EA.js} +1 -1
- package/dist/{chunk-UJKUB2LH.js → chunk-RUEGYANA.js} +11 -11
- package/dist/{chunk-OYLO6TYK.js → chunk-RUOG4VB7.js} +1 -1
- package/dist/{chunk-ZRHO6YMM.js → chunk-SKYPMHQC.js} +4 -4
- package/dist/{chunk-ES426XRJ.js → chunk-SQVRXHOW.js} +3 -3
- package/dist/{chunk-QL2PNIXC.js → chunk-TAX2ZJAP.js} +24 -16
- package/dist/{chunk-KN46TGHV.js → chunk-TOI35GN2.js} +1 -1
- package/dist/{chunk-74JMKLVU.js → chunk-UPR3MU6Z.js} +1 -1
- package/dist/{chunk-JIUTXKWA.js → chunk-WQLKDL35.js} +2 -1
- package/dist/{chunk-WHPN2TIT.js → chunk-X6L6MD5B.js} +5 -5
- package/dist/{chunk-7NRI7HYX.js → chunk-XWC7CNPY.js} +1 -1
- package/dist/{clean-HGASSMWI.js → clean-7J6ZCCGV.js} +18 -18
- package/dist/cli.js +53 -53
- package/dist/{cloud-JPDVNXHN.js → cloud-7IJCJCDD.js} +4 -4
- package/dist/{cloudrun-AMMGSDRP.js → cloudrun-UNZRIIDB.js} +7 -7
- package/dist/commands/contrast-audit.browser.js +1 -2
- package/dist/commands/layout-audit.browser.js +196 -0
- package/dist/{compare-LHHVHUN3.js → compare-Q7VW5JZT.js} +28 -28
- package/dist/{compiler-Q3N6QXMT.js → compiler-KPHYGFXL.js} +6 -6
- package/dist/{component-D72J32Q7.js → component-UUBREJKN.js} +3 -3
- package/dist/{compositions-UQRJ5ROG.js → compositions-T4FTKIDP.js} +13 -13
- package/dist/{delete-P42VIDDA.js → delete-WZQF2IIA.js} +2 -2
- package/dist/{deploy-WZTH57O4.js → deploy-JU7A3XNC.js} +1 -1
- package/dist/{deterministicFonts-VQ5UBMXY.js → deterministicFonts-EGAAE7QL.js} +3 -3
- package/dist/{dist-SENYPQGW.js → dist-LM7AVHOU.js} +3 -3
- package/dist/{dist-DYS24AMA.js → dist-ULGTPSU4.js} +8 -4
- package/dist/docs/data-attributes.md +1 -1
- package/dist/{doctor-KEJIG2SK.js → doctor-VSNGRKXJ.js} +13 -13
- package/dist/{events-CYKSNR7N.js → events-CRW2DYUT.js} +3 -3
- package/dist/{events-UZXFQPMT.js → events-E63YBUL2.js} +3 -3
- package/dist/{feedback-LXNQF7CA.js → feedback-OSZWVR6N.js} +8 -8
- package/dist/{ffmpeg-BYHON577.js → ffmpeg-JLH3Z7G7.js} +9 -9
- package/dist/{figma-EIQ35PS6.js → figma-2BQNNR53.js} +3 -3
- package/dist/fontLocalizeCli.js +12 -12
- package/dist/{get-CC2YL7QO.js → get-P2XI53QW.js} +2 -2
- package/dist/{gpuPolicy-VFSACUQV.js → gpuPolicy-NTKQJY75.js} +9 -9
- package/dist/{grade-compare-TUQL7IV2.js → grade-compare-OYASIHIB.js} +29 -29
- package/dist/{gsapParserAcorn-7NCK2LVT.js → gsapParserAcorn-SKODXC2N.js} +2 -2
- package/dist/{help-ROROO5K6.js → help-HK6K2N4G.js} +1 -1
- package/dist/{history-PNELYLXX.js → history-JMTYKLXW.js} +6 -6
- package/dist/hyperframe.manifest.json +1 -1
- package/dist/hyperframe.runtime.iife.js +63 -63
- package/dist/hyperframes-player.global.js +1 -1
- package/dist/{info-4FZTH6AS.js → info-AW7CIVRE.js} +9 -9
- package/dist/{init-I43GHHVP.js → init-6KIDG4LB.js} +30 -30
- package/dist/{inspect-IT4TYIZ3.js → inspect-B7BLYMRZ.js} +29 -29
- package/dist/{installer-CWOJVK5K.js → installer-ZP2LQZUQ.js} +7 -7
- package/dist/{keyframes-3FBOGVD4.js → keyframes-EQ36A5JE.js} +7 -7
- package/dist/{lambda-H3V32I7M.js → lambda-E6VURLIS.js} +9 -9
- package/dist/{layout-BZ5LYJ5C.js → layout-XYC64QQQ.js} +29 -29
- package/dist/{lint-ZTNSGP2S.js → lint-V5DJYWBX.js} +9 -9
- package/dist/{lintProject-C2ONSH2U.js → lintProject-JATQKR64.js} +3 -3
- package/dist/{list-XM4GWJYY.js → list-RUGVRTVD.js} +2 -2
- package/dist/{login-H6HYKMWX.js → login-ZTKGKXGS.js} +4 -4
- package/dist/{manager-TWVDSJXO.js → manager-JUP7PM6N.js} +10 -10
- package/dist/{media-treatment-N7MY5NXB.js → media-treatment-VIUPK4OR.js} +15 -15
- package/dist/{models-WEMIMYBD.js → models-LJS2HBOZ.js} +13 -13
- package/dist/{motionShot-RHICTVPU.js → motionShot-3UAXZ7SN.js} +16 -16
- package/dist/{normalize-audio-ZFUZCJE3.js → normalize-audio-SBYI4YIH.js} +4 -4
- package/dist/{open-IBJ4FL3G.js → open-S27TUD3A.js} +14 -14
- package/dist/{parakeetRunner-XXO4WSLR.js → parakeetRunner-ETLMLJ4L.js} +14 -14
- package/dist/{pipeline-6ML3LUVK.js → pipeline-I2M22M24.js} +10 -10
- package/dist/{play-RV4NAVF5.js → play-COJU6VJK.js} +21 -21
- package/dist/{preflight-R3DEFMLA.js → preflight-FZ24NCHH.js} +10 -10
- package/dist/{present-5TBJGE6B.js → present-YAHKLC5D.js} +17 -17
- package/dist/{preview-FLKZ5CXJ.js → preview-KQOEU5YE.js} +20 -20
- package/dist/{producer-7XYSPVKH.js → producer-DTNNG4T6.js} +1 -1
- package/dist/{projectConfig-TBU2VWZX.js → projectConfig-4A76VYUP.js} +9 -9
- package/dist/{publication-CWWUJYJ5.js → publication-SQPMC2W3.js} +4 -4
- package/dist/{publish-FSNE4FEB.js → publish-QUEJBGGT.js} +11 -11
- package/dist/{remove-background-MDFWRWCT.js → remove-background-FP2ETAQH.js} +11 -11
- package/dist/{render-F4JQ553X.js → render-BIFIL4U6.js} +31 -31
- package/dist/{render-DBGQZAZT.js → render-GQFXJWLV.js} +17 -29
- package/dist/{render-LWZKXCLY.js → render-P664SMC7.js} +5 -5
- package/dist/{render-batch-PU7NMLIJ.js → render-batch-ZCPMYH6Z.js} +5 -5
- package/dist/renderSetupWorker.js +3 -3
- package/dist/{resolver-RUBGFXPC.js → resolver-BUC2GFZQ.js} +6 -6
- package/dist/{sherpa-X2TBNO6P.js → sherpa-HFT6XEP6.js} +13 -13
- package/dist/skills/hyperframes/SKILL.md +52 -174
- package/dist/skills/hyperframes/assets/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/dist/skills/hyperframes/assets/frame-presets/biennale-yellow/caption-skin.html +220 -0
- package/dist/skills/hyperframes/assets/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/dist/skills/hyperframes/assets/frame-presets/blockframe/FRAME.md +275 -0
- package/dist/skills/hyperframes/assets/frame-presets/blockframe/caption-skin.html +223 -0
- package/dist/skills/hyperframes/assets/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/dist/skills/hyperframes/assets/frame-presets/blue-professional/FRAME.md +307 -0
- package/dist/skills/hyperframes/assets/frame-presets/blue-professional/caption-skin.html +222 -0
- package/dist/skills/hyperframes/assets/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/dist/skills/hyperframes/assets/frame-presets/bold-poster/FRAME.md +275 -0
- package/dist/skills/hyperframes/assets/frame-presets/bold-poster/caption-skin.html +229 -0
- package/dist/skills/hyperframes/assets/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/dist/skills/hyperframes/assets/frame-presets/broadside/FRAME.md +284 -0
- package/dist/skills/hyperframes/assets/frame-presets/broadside/caption-skin.html +224 -0
- package/dist/skills/hyperframes/assets/frame-presets/broadside/frame-showcase.html +1166 -0
- package/dist/skills/hyperframes/assets/frame-presets/capsule/FRAME.md +284 -0
- package/dist/skills/hyperframes/assets/frame-presets/capsule/caption-skin.html +223 -0
- package/dist/skills/hyperframes/assets/frame-presets/capsule/frame-showcase.html +1465 -0
- package/dist/skills/hyperframes/assets/frame-presets/cartesian/FRAME.md +278 -0
- package/dist/skills/hyperframes/assets/frame-presets/cartesian/caption-skin.html +221 -0
- package/dist/skills/hyperframes/assets/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/dist/skills/hyperframes/assets/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/dist/skills/hyperframes/assets/frame-presets/cobalt-grid/caption-skin.html +237 -0
- package/dist/skills/hyperframes/assets/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/FRAME.md +277 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/caption-skin.html +223 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/EBGaramond-400.woff2 +0 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/EBGaramond-700.woff2 +0 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/Inter-400.woff2 +0 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/Inter-700.woff2 +0 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/JetBrainsMono-400.woff2 +0 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/JetBrainsMono-700.woff2 +0 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/OFL-eb-garamond.txt +93 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/OFL-inter.txt +93 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/fonts/OFL-jetbrains-mono.txt +93 -0
- package/dist/skills/hyperframes/assets/frame-presets/code-editorial/frame-showcase.html +1438 -0
- package/dist/skills/hyperframes/assets/frame-presets/coral/FRAME.md +314 -0
- package/dist/skills/hyperframes/assets/frame-presets/coral/caption-skin.html +225 -0
- package/dist/skills/hyperframes/assets/frame-presets/coral/frame-showcase.html +1268 -0
- package/dist/skills/hyperframes/assets/frame-presets/creative-mode/FRAME.md +333 -0
- package/dist/skills/hyperframes/assets/frame-presets/creative-mode/caption-skin.html +226 -0
- package/dist/skills/hyperframes/assets/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/dist/skills/hyperframes/assets/frame-presets/daisy-days/FRAME.md +274 -0
- package/dist/skills/hyperframes/assets/frame-presets/daisy-days/caption-skin.html +229 -0
- package/dist/skills/hyperframes/assets/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/dist/skills/hyperframes/assets/frame-presets/editorial-forest/FRAME.md +265 -0
- package/dist/skills/hyperframes/assets/frame-presets/editorial-forest/caption-skin.html +222 -0
- package/dist/skills/hyperframes/assets/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/dist/skills/hyperframes/references/captions.md +46 -0
- package/dist/skills/hyperframes/references/film.md +47 -0
- package/dist/skills/hyperframes/references/format.md +157 -0
- package/dist/skills/hyperframes/references/look.md +69 -0
- package/dist/skills/hyperframes/references/motion.md +94 -0
- package/dist/skills/hyperframes/references/overlays.md +39 -0
- package/dist/skills/hyperframes/references/plugin-installation.md +3 -3
- package/dist/skills/hyperframes/references/review.md +51 -0
- package/dist/skills/hyperframes/references/runtimes.md +43 -0
- package/dist/skills/hyperframes/references/skill-lifecycle.md +21 -13
- package/dist/skills/hyperframes/references/sound.md +43 -0
- package/dist/skills/hyperframes/references/spec.md +76 -0
- package/dist/skills/hyperframes/references/story.md +103 -0
- package/dist/skills/hyperframes/references/storyboard-format.md +30 -22
- package/dist/skills/hyperframes/references/storyboard.md +36 -0
- package/dist/skills/hyperframes/references/types/3d.md +25 -0
- package/dist/skills/hyperframes/references/types/character.md +20 -0
- package/dist/skills/hyperframes/references/types/data.md +19 -0
- package/dist/skills/hyperframes/references/types/explainer.md +34 -0
- package/dist/skills/hyperframes/references/types/launch.md +31 -0
- package/dist/skills/hyperframes/references/types/music.md +24 -0
- package/dist/skills/hyperframes/references/types/vertical.md +23 -0
- package/dist/skills/hyperframes/scripts/bake-basemap.mjs +324 -0
- package/dist/skills/hyperframes/scripts/lib/main-module.test.mjs +1 -6
- package/dist/skills/hyperframes/scripts/locate.mjs +228 -0
- package/dist/skills/hyperframes-cli/SKILL.md +76 -179
- package/dist/skills/hyperframes-cli/references/beats.md +1 -1
- package/dist/skills/hyperframes-cli/references/cloud.md +2 -2
- package/dist/skills/hyperframes-cli/references/cloudrun.md +1 -1
- package/dist/skills/hyperframes-cli/references/conventions.md +17 -0
- package/dist/skills/hyperframes-cli/references/feedback.md +14 -0
- package/dist/skills/hyperframes-cli/references/init-and-scaffold.md +11 -7
- package/dist/skills/hyperframes-cli/references/lambda.md +1 -1
- package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +19 -8
- package/dist/skills/hyperframes-cli/references/preview-render.md +8 -2
- package/dist/skills/hyperframes-cli/references/upgrade-info-misc.md +8 -0
- package/dist/skills/media-use/SKILL.md +47 -91
- package/dist/skills/media-use/audio/references/bgm.md +1 -1
- package/dist/skills/media-use/audio/references/captions/authoring.md +1 -2
- package/dist/skills/media-use/audio/references/captions/motion.md +5 -5
- package/dist/skills/media-use/audio/references/tts.md +0 -3
- package/dist/skills/media-use/audio/scripts/audio.mjs +5 -6
- package/dist/skills/media-use/audio/scripts/carve.mjs +560 -0
- package/dist/skills/media-use/audio/scripts/carve.test.mjs +254 -0
- package/dist/skills/media-use/audio/scripts/extract-audio-data.py +199 -0
- package/dist/skills/media-use/references/local.md +24 -0
- package/dist/skills/media-use/references/memory.md +4 -4
- package/dist/skills/media-use/references/mixing.md +71 -0
- package/dist/skills/media-use/references/operations.md +1 -1
- package/dist/skills/media-use/scripts/compatibility.test.mjs +1 -56
- package/dist/skills/media-use/scripts/lib/prefs-store.mjs +1 -1
- package/dist/skills/media-use/scripts/lib/recipe-store.mjs +1 -1
- package/dist/skills/media-use/scripts/prefs.mjs +2 -3
- package/dist/skills/media-use/scripts/recipe.mjs +1 -3
- package/dist/{skills-WHKMWO2D.js → skills-3WEVO3NU.js} +20 -13
- package/dist/{skillsUpdateCheck-XQGZGJJG.js → skillsUpdateCheck-BFPWFOK5.js} +3 -3
- package/dist/{snapshot-M4NUUSNU.js → snapshot-WDQ6S7CJ.js} +457 -98
- package/dist/{src-6MSC62U2.js → src-NPR2JZOJ.js} +11 -11
- package/dist/{src-4UYM2K3S.js → src-RZ574OKP.js} +8 -8
- package/dist/{staticProjectServer-ERDTFP45.js → staticProjectServer-FTGTEZI4.js} +17 -17
- package/dist/studio/assets/{hyperframes-player-DEncBxR7.js → hyperframes-player-CoOdf435.js} +1 -1
- package/dist/studio/assets/{index-Cc22mgvY.js → index-CR85xg2x.js} +1 -1
- package/dist/studio/assets/{index-BABXr78Q.js → index-C_6rTpaB.js} +5 -5
- package/dist/studio/index.html +1 -1
- package/dist/{studio-api-SAKD3VKC.js → studio-api-TAWB7B23.js} +11 -11
- package/dist/{studioServer-IRI7EVOM.js → studioServer-HRQGJTBU.js} +48 -48
- package/dist/{telemetry-F4XADVAF.js → telemetry-QZ6HJF4W.js} +3 -3
- package/dist/templates/_shared/AGENTS.md +14 -19
- package/dist/templates/_shared/CLAUDE.md +14 -19
- package/dist/templates/blank/index.html +10 -4
- package/dist/{timeline-5I444RRE.js → timeline-IKUEW42T.js} +20 -19
- package/dist/{tokens-LRRYM35A.js → tokens-AUGUEWHS.js} +2 -2
- package/dist/{transcribe-44XDFNVU.js → transcribe-7734CG3N.js} +18 -18
- package/dist/{transcribe-WHYHWAB2.js → transcribe-FWU6EMEO.js} +12 -12
- package/dist/{updateCheck-7CPH3CAZ.js → updateCheck-VIPQ3FPW.js} +2 -2
- package/dist/{upgrade-WW4GQ2RI.js → upgrade-4VNDQTVO.js} +2 -2
- package/dist/{urlDownloader-OHLLP45A.js → urlDownloader-6CXL4CL7.js} +8 -8
- package/dist/{validate-VNCDH2LW.js → validate-QWCMVWID.js} +23 -23
- package/dist/{video-5OHTLL2D.js → video-245Q5WN4.js} +9 -9
- package/dist/warmCheck.js +36 -36
- package/package.json +1 -1
- package/dist/chunk-R2SQBPMH.js +0 -3805
- package/dist/skills/hyperframes/references/brief-contract.md +0 -108
- package/dist/skills/hyperframes/references/brief-format.md +0 -72
- package/dist/skills/hyperframes/references/capability-menu.md +0 -47
- package/dist/skills/hyperframes/references/frame-worker-core.md +0 -82
- package/dist/skills/hyperframes/references/intent-interview.md +0 -73
- package/dist/skills/hyperframes/references/pitch-round.md +0 -40
- package/dist/skills/hyperframes/references/production-loop.md +0 -26
- package/dist/skills/hyperframes/references/review-loop.md +0 -37
- package/dist/skills/hyperframes/references/route-briefs.md +0 -11
- package/dist/skills/hyperframes/references/routes/embedded-captions.md +0 -11
- package/dist/skills/hyperframes/references/routes/faceless-explainer.md +0 -12
- package/dist/skills/hyperframes/references/routes/general-video.md +0 -12
- package/dist/skills/hyperframes/references/routes/motion-graphics.md +0 -11
- package/dist/skills/hyperframes/references/routes/music-to-video.md +0 -12
- package/dist/skills/hyperframes/references/routes/pr-to-video.md +0 -28
- package/dist/skills/hyperframes/references/routes/product-launch-video.md +0 -13
- package/dist/skills/hyperframes/references/routes/remotion-to-hyperframes.md +0 -9
- package/dist/skills/hyperframes/references/routes/slideshow.md +0 -11
- package/dist/skills/hyperframes/references/routes/talking-head-recut.md +0 -11
- package/dist/skills/hyperframes/references/script-format.md +0 -52
- package/dist/skills/hyperframes/references/subagent-dispatch.md +0 -35
- package/dist/skills/hyperframes/references/workflow-catalog.md +0 -10
- package/dist/skills/hyperframes/scripts/lib/frame-packets-core.mjs +0 -176
- package/dist/skills/media-use/audio/scripts/lib/host-audio.mjs +0 -28
- package/dist/skills/media-use/audio/scripts/lib/host-audio.test.mjs +0 -106
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Route briefs (moved)
|
|
2
|
-
|
|
3
|
-
Each route's interview entry — must-haves, conditional questions, deferred asks,
|
|
4
|
-
pitch-eligible fields, and whether the run-shape questions apply — now lives in that
|
|
5
|
-
route's own file, together with its input/output/trigger contract:
|
|
6
|
-
|
|
7
|
-
`references/routes/<workflow>.md` — e.g. `routes/faceless-explainer.md`,
|
|
8
|
-
`routes/pr-to-video.md` (including the PR-size → length table).
|
|
9
|
-
|
|
10
|
-
The interview procedure itself (the eight steps) is `references/intent-interview.md`.
|
|
11
|
-
Field semantics and question rules: `hyperframes/references/brief-contract.md` § 2–3.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Route: embedded-captions
|
|
2
|
-
|
|
3
|
-
- **Input:** Existing talking-head footage to caption. It is an actual media file, not a URL or creative brief.
|
|
4
|
-
- **Output:** The same footage, untouched, with a caption layer and selected caption identity. The subject may occlude embedded captions. Any length.
|
|
5
|
-
- **Triggers:** "add captions", "add subtitles", "captions behind the subject", "cinematic captions for my clip".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **Must-haves:** which clip (the input file).
|
|
10
|
-
- **Deferred (announce):** the caption **identity** pick — its Step 0 probes the clip first, then shortlists 2–3 identities from the catalog and recommends one. Say that's coming.
|
|
11
|
-
- **Run-shape:** neither — the footage is untouched; there is no storyboard to review.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Route: faceless-explainer
|
|
2
|
-
|
|
3
|
-
- **Input:** A topic, article, notes, or arbitrary text being explained, with no product being marketed and no website to capture.
|
|
4
|
-
- **Output:** A faceless explainer MP4 with invented typography, abstract graphics, diagrams, or data visualization. Sweet spot 30–90s; hard cap about 3 minutes.
|
|
5
|
-
- **Triggers:** "faceless explainer about X", "explain how DNS works as a video", "turn this article into an explainer".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **Must-haves:** **angle** — concept / how-to / listicle / narrative, recommend the one the text's own shape suggests · **length** — inside the 30–90s sweet spot, scaled to how much the text actually teaches · **destination** — YouTube / embed → 16:9 · X / LinkedIn / Instagram feed → 1:1 · Shorts / TikTok → 9:16.
|
|
10
|
-
- **Conditional:** a pasted script adds **`VO_MODE`** — use it verbatim, or restructure per scene?
|
|
11
|
-
- **Pitch round:** `message` + `angle` — five tellings of the same topic are five different videos.
|
|
12
|
-
- **Run-shape:** both.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Route: general-video
|
|
2
|
-
|
|
3
|
-
- **Input:** Any custom creation or edit not covered by a specialized route: a static title card, longer brand or sizzle reel, multi-scene montage, static loop/poster, NLE-like footage remix, or freeform composition. It also executes every `flow: companion` brief.
|
|
4
|
-
- **Output:** A HyperFrames composition of any length or format through design → plan → static layout → animation → check → approval → render.
|
|
5
|
-
- **Triggers:** "make a static title card", "longer brand reel", "multi-scene composition", "static loop", "custom video", or any unmatched video request.
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **Open-ended requests only:** first derive a one-sentence `message`. Ask `audience` only when it is unclear and would change the story or terminology. Ask `destination` only when it would change aspect or composition. Ask for a priority only when the brief contains a real trade-off. Default to one best version; ask about variations only when the user requests options or comparison.
|
|
10
|
-
- **Specific requests:** a complete ask such as "a static title card with our logo for a website hero" needs no discovery questions.
|
|
11
|
-
- **Pitch round:** `message` — the unformed open-ended request is this round's home case.
|
|
12
|
-
- **Run-shape:** both questions apply. `/general-video` is also the companion host, so `flow: companion` stays on this route with the full toolbox.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Route: motion-graphics
|
|
2
|
-
|
|
3
|
-
- **Input:** A short design-led unit, typically under 10s, with no narration, where motion is the message: kinetic type, stat/count-up, chart hit, logo sting, animated title, lower-third, map, tweet/headline/page highlight, or asset-fusion shot.
|
|
4
|
-
- **Output:** A short MP4 or transparent alpha WebM/MOV overlay.
|
|
5
|
-
- **Triggers:** "an 8s logo sting", "animate this stat", "kinetic-type intro", "animate this title", "transparent lower-third overlay".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- Autonomous by design: at most **one** clarifying question, owned by its director step, in the flow. No must-haves here beyond confirming the input; route directly.
|
|
10
|
-
- **Run-shape:** neither — the piece is seconds long; a storyboard and a companion session have nothing to add.
|
|
11
|
-
- **Front-door capability offer:** skip it. The director's one-question limit is authoritative.
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
# Route: music-to-video
|
|
2
|
-
|
|
3
|
-
- **Input:** A music track, a video whose audio becomes the track, or a track generated from a mood brief — with no narration or website capture. User images or videos are optional, so a complete video needs zero supplied assets.
|
|
4
|
-
- **Output:** A beat-synced MP4 driven by a deterministic beat/energy map (`audiomap.json`). It may become a lyric video, slideshow, visualizer, or kinetic promo without changing pipelines.
|
|
5
|
-
- **Triggers:** "make a video for this song", "beat-synced video", "lyric video", "music visualizer", "kinetic promo to this beat".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **Must-haves:** the **music source** — a track file, a video to pull audio from, or generate one from a mood description · **destination → aspect**.
|
|
10
|
-
- **Deferred (announce):** brand (font + palette) and the genre feel are chosen at its Step 3 by design — they emerge from the track's analysis, not from a question up front.
|
|
11
|
-
- **Pitch round:** `message` — the visual concept riding the beat grid (lyric treatment, montage story, kinetic type); brand and genre feel still land at Step 3.
|
|
12
|
-
- **Run-shape:** both.
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
# Route: pr-to-video
|
|
2
|
-
|
|
3
|
-
- **Input:** A GitHub PR URL, `owner/repo#N`, or "this PR", read through `gh`; it is not a website capture request.
|
|
4
|
-
- **Output:** A changelog, feature reveal, fix explainer, or refactor walkthrough with diff, before/after, file-tree, and impact scenes. Hard cap about 3 minutes; duration follows change size.
|
|
5
|
-
- **Triggers:** "make a video about this PR", "turn PR #1187 into a changelog video", "release-notes video from this pull request".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **Must-haves:** the **PR reference** (URL, `owner/repo#N`, or "this PR") · **angle** — changelog / feature-reveal / fix-explainer / refactor-walkthrough, recommend the one the PR itself suggests · **audience** — developers (default) · mixed technical · non-technical stakeholders · **length** — from the size table below · **destination** — 16:9 is the default for a code explainer.
|
|
10
|
-
- **Length comes from the PR's change size**, not a fixed guess — peek once, read-only (the workflow's Step 1 still does the full deterministic fetch):
|
|
11
|
-
|
|
12
|
-
```bash
|
|
13
|
-
gh pr view <PR_REF> --json title,additions,deletions,changedFiles
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
Pick the tier from `additions + deletions` (nudged up by `changedFiles`) and lead with it (hard cap ~3 min):
|
|
17
|
-
|
|
18
|
-
| PR change size | Recommended length |
|
|
19
|
-
| --------------------------------- | ------------------ |
|
|
20
|
-
| trivial (≲ 50 lines changed) | ~20–40s |
|
|
21
|
-
| focused (~50–200 lines) | ~40–70s |
|
|
22
|
-
| substantial (~200–600 lines) | ~70–110s |
|
|
23
|
-
| large (≳ 600 lines, or 25+ files) | ~110–180s |
|
|
24
|
-
|
|
25
|
-
State the basis in one phrase ("~40s — small change, +44/−13 across 12 files"). The tier is a **ceiling** on how much story the diff can support, never a floor to fill: a one-headline story recommends inside 30–90s regardless of tier (the tier's range may still appear as a non-recommended fuller-walkthrough option).
|
|
26
|
-
|
|
27
|
-
- **Pitch round:** `angle` and the opening hook — the diff fixes the facts, not the telling.
|
|
28
|
-
- **Run-shape:** both.
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
# Route: product-launch-video
|
|
2
|
-
|
|
3
|
-
- **Input:** A website URL; a script or brief that names a site; or a product-launch script with no derivable site or an explicit "do not scrape" instruction. Capture website assets and brand tokens unless the brief selects no-capture mode. Ask whether supplied script copy is verbatim voice-over or may be restructured.
|
|
4
|
-
- **Output:** A product promo, launch video, site tour, or showcase MP4. Sweet spot 30–90s; hard cap about 3 minutes. A show-it-as-is brief features captured screens rather than inventing a separate route.
|
|
5
|
-
- **Triggers:** "launch video for X", "promo for our site", "turn this script into a 60s promo", "text-only launch video", "turn this website into a video", "site tour from this URL".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **First, sell or show?** One question when the request doesn't say: market the product (a promo), or show the site as-is (a tour / showcase)? A show-it answer is **intent, not a different pipeline**: write it into `BRIEF.md` (`## Intent` / `## Customizations` — "feature the site's own captured screens as the video's assets") and the workflow's normal steps carry it — the captured screens become the featured `asset_candidates`.
|
|
10
|
-
- **Must-haves:** **angle** — story shapes from the site's / brief's own positioning, recommend one with its basis · **length** — 30–90s sweet spot, scaled to the material · **destination** — YouTube / embed → 16:9 · X / LinkedIn / Instagram feed → 1:1 · Shorts / TikTok → 9:16.
|
|
11
|
-
- **Conditional:** a show-it-as-is ask adds **what to show** — the whole site, or specific pages/sections (into `BRIEF.md`'s body); a pasted script/brief adds **`VO_MODE`** (verbatim or restructured?); a script that only names a site adds **capture?** — crawl it for brand + assets (default), or text-only / "don't scrape" (no-capture mode, a preset supplies the design system).
|
|
12
|
-
- **Pitch round:** `message` + `angle`, after sell-or-show is settled — the pitches inherit that intent.
|
|
13
|
-
- **Run-shape:** both.
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
# Route: remotion-to-hyperframes
|
|
2
|
-
|
|
3
|
-
- **Input:** Existing Remotion React source, only when the user explicitly asks to port, convert, or migrate it. A passing Remotion mention is not a trigger.
|
|
4
|
-
- **Output:** A HyperFrames HTML composition translated from the source and compared with the Remotion render through the migration evaluation harness.
|
|
5
|
-
- **Triggers:** "port my Remotion project", "convert this Remotion composition", "migrate from Remotion".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- Not served by the intent layer — a migration with no brief. Route directly.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Route: slideshow
|
|
2
|
-
|
|
3
|
-
- **Input:** A brief, outline, or existing page to author as a presentation, pitch deck, or interactive deck. If "slides", "deck", or "convert this page" is ambiguous, confirm that the user wants a HyperFrames slideshow before authoring.
|
|
4
|
-
- **Output:** A runnable HyperFrames composition plus the JSON island used by `SlideshowController`: discrete slides, fragment reveals, branching, hotspots, presenter mode, and speaker notes. The deliverable is a navigable deck, not an MP4.
|
|
5
|
-
- **Triggers:** "make a pitch deck", "interactive presentation", "convert this page into slides", "slideshow with presenter mode".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- The one question is the routing confirmation itself — "do you want this as a HyperFrames slideshow?" — asked during triage (it survives every mode: wrong routing is a quality problem). The deck contract owns everything after.
|
|
10
|
-
- **Run-shape:** neither — the deliverable is a navigable deck, not a rendered video.
|
|
11
|
-
- **Front-door capability offer:** skip it. After route confirmation, the deck workflow owns all remaining choices.
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
# Route: talking-head-recut
|
|
2
|
-
|
|
3
|
-
- **Input:** Existing talking-head, interview, or podcast footage to package. The underlying clip plays unchanged.
|
|
4
|
-
- **Output:** The same footage with transcript-synced graphic-overlay cards: kinetic titles, lower-thirds, data callouts, pull-quotes, side panels, or picture-in-picture. Any length.
|
|
5
|
-
- **Triggers:** "package this video", "add graphic overlays to my talk", "add lower-thirds or data callouts to this interview".
|
|
6
|
-
|
|
7
|
-
## Interview
|
|
8
|
-
|
|
9
|
-
- **Must-haves:** which clip (the input file).
|
|
10
|
-
- **Deferred (announce):** its render-strategy questions — aspect ratio, layout, style group, card count — stay at its Step 7, where the recommendations come from the probed footage and transcript. Say they're coming.
|
|
11
|
-
- **Run-shape:** neither.
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
# `SCRIPT.md` — locked narration (optional)
|
|
2
|
-
|
|
3
|
-
The **locked narration** for a project: the final spoken lines + voice + delivery. It is an _optional_ plan-layer file — a video with no narration (bgm-only, silent overlay) has none. The storyboard's per-frame `voiceover` is the lighter, editable _guide_; `SCRIPT.md` is the _commit_. (Storyboard format → `references/storyboard-format.md`.)
|
|
4
|
-
|
|
5
|
-
This file defines the SCRIPT.md **shape** only. Synthesizing the spoken lines into audio is a capability owned by `media-use` → `../../media-use/audio/references/tts.md`.
|
|
6
|
-
|
|
7
|
-
Free-form markdown — there is no strict parser; the TTS step extracts the indented spoken lines.
|
|
8
|
-
|
|
9
|
-
## Shape
|
|
10
|
-
|
|
11
|
-
A header block, then one section per spoken line.
|
|
12
|
-
|
|
13
|
-
| Part | Holds |
|
|
14
|
-
| ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
|
|
15
|
-
| Header | `**Voice:**` (provider + voice), `**Voice settings:**` (e.g. stability / similarity / style), `**Voice direction:**` (overall delivery) |
|
|
16
|
-
| `## Line N — <label> (Frame N)` | one spoken line, tied to its storyboard frame |
|
|
17
|
-
| `**Time:**` | the frame's rough window — a _guide_, not authoritative (real timing comes from TTS word timestamps) |
|
|
18
|
-
| `**Delivery:**` | per-line delivery note |
|
|
19
|
-
| indented block | the **spoken text** — the only part fed to TTS |
|
|
20
|
-
|
|
21
|
-
## Example
|
|
22
|
-
|
|
23
|
-
```markdown
|
|
24
|
-
# SCRIPT — acme-launch
|
|
25
|
-
|
|
26
|
-
**Voice:** Rachel (ElevenLabs)
|
|
27
|
-
**Voice settings:** stability 0.35 · similarity 0.75 · style 0.20
|
|
28
|
-
**Voice direction:** Confident, warm, a little playful.
|
|
29
|
-
|
|
30
|
-
---
|
|
31
|
-
|
|
32
|
-
## Line 1 — Hook (Frame 1)
|
|
33
|
-
|
|
34
|
-
**Time:** 0.0 – 3.0s
|
|
35
|
-
**Delivery:** Land the promise on the beat.
|
|
36
|
-
|
|
37
|
-
Ship a launch video in an afternoon.
|
|
38
|
-
|
|
39
|
-
## Line 2 — The problem (Frame 2)
|
|
40
|
-
|
|
41
|
-
**Time:** 3.0 – 7.0s
|
|
42
|
-
**Delivery:** Wry, a touch tired.
|
|
43
|
-
|
|
44
|
-
The old way? Prompt, wait twenty minutes, get something that misses.
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## To TTS
|
|
48
|
-
|
|
49
|
-
Feed each line's spoken text to the provider documented in
|
|
50
|
-
`media-use/audio/references/tts.md`. The `hyperframes tts` command is
|
|
51
|
-
Kokoro-only; use its `--voice` flag, or use the bundled HeyGen helper when word
|
|
52
|
-
timestamps are required. Real per-word timing replaces the `**Time:**` guides.
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
# Subagent dispatch — harness adapter
|
|
2
|
-
|
|
3
|
-
The video workflows (`product-launch-video` / `faceless-explainer` / `pr-to-video` / `motion-graphics` / `general-video`) describe subagent dispatch in harness-neutral verbs. This file maps those verbs to the primitives of whatever agent harness you are running on. Read it once per run, before the first dispatch; everything else in the workflows (dispatch packets, file artifacts, exit-code gates, Resume tables) is harness-independent and needs no translation.
|
|
4
|
-
|
|
5
|
-
## The contract (identical on every harness)
|
|
6
|
-
|
|
7
|
-
- **DISPATCH(role_file, dispatch_context)** — start one child agent whose prompt is the **full contents of the named role file** (a builder-assembled payload like `.hyperframes/frame-packets/_role.md`, or a workflow's `sub-agents/<role>.md`) followed by the `## Dispatch context` block from the workflow, copied **verbatim** (never digested or paraphrased). Every harness below accepts arbitrary task text, so this works everywhere; never rely on the child seeing your conversation, memory, or skills — the prompt and the files on disk are its entire world.
|
|
8
|
-
- **Parallel fan-out** — when a step says "start N workers in parallel", the workers are mutually independent (no ordering, no shared state beyond the filesystem). Run as many concurrently as your harness allows.
|
|
9
|
-
- **WAIT** — a step's completion criterion is always **the expected artifact existing on disk** (e.g. `compositions/<scene-id>.html`), never the harness's completion notification (some harnesses deliver results best-effort). After waiting, verify the artifacts; a missing artifact means that child failed — re-dispatch it once with the same prompt before surfacing an error.
|
|
10
|
-
|
|
11
|
-
## Concurrency cap → batching rule (cap never changes scope)
|
|
12
|
-
|
|
13
|
-
A harness concurrency limit **reduces parallelism, not work**: every scene still gets built, with the available slots chewing through the full list. The workflow sets how many scenes each worker gets (`general-video` assigns 2–3).
|
|
14
|
-
|
|
15
|
-
- When the harness queues excess children internally, submit **all N at once** and let the queue drain.
|
|
16
|
-
- Harness hard-caps active children (e.g. OpenClaw `maxChildrenPerAgent`) → dispatch in **waves of the cap size**: start `cap` workers, wait for their artifacts, start the next wave, until all N scenes exist. Example: 9 scenes on a cap-3 harness = 3 waves of 3 — never drop scenes, never merge scenes into one worker to fit the cap.
|
|
17
|
-
|
|
18
|
-
## Harness mapping
|
|
19
|
-
|
|
20
|
-
Use the current harness's native delegation and waiting tools when they are available. The workflow contract stays the same:
|
|
21
|
-
|
|
22
|
-
- **DISPATCH** sends the complete role file and dispatch context to one worker.
|
|
23
|
-
- **Parallel fan-out** starts independent workers concurrently up to the harness limit.
|
|
24
|
-
- **WAIT** verifies the expected artifacts on disk, not only a completion notification.
|
|
25
|
-
- **Re-dispatch** starts a fresh worker with the same context plus the gate failure.
|
|
26
|
-
|
|
27
|
-
When native delegation is unavailable, use the existing fallback ladder: launch headless CLI workers that share the project filesystem, then fall back to inline serial execution.
|
|
28
|
-
|
|
29
|
-
On Codex, native delegation requires the user's explicit permission. Fold a one-line request into the workflow's first existing user pause before dispatch; a standing grant in `AGENTS.md` or the kickoff prompt also counts. Without it, use the fallback ladder rather than silently skipping work.
|
|
30
|
-
|
|
31
|
-
## Vocabulary mapping
|
|
32
|
-
|
|
33
|
-
- A request to work "in the background" means dispatch concurrently when the harness supports it.
|
|
34
|
-
- Load a named skill through the harness's skill mechanism, or read `<skills-root>/<skill>/SKILL.md` directly.
|
|
35
|
-
- Map generic read, write, edit, and shell verbs to the current harness's equivalent tools.
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# Workflow catalog (moved)
|
|
2
|
-
|
|
3
|
-
Each workflow's input/output/trigger contract now lives in its own route file — one
|
|
4
|
-
small read per candidate instead of a whole catalog:
|
|
5
|
-
|
|
6
|
-
`references/routes/<workflow>.md` — e.g. `routes/product-launch-video.md`,
|
|
7
|
-
`routes/general-video.md`, `routes/remotion-to-hyperframes.md`.
|
|
8
|
-
|
|
9
|
-
The same file carries that route's interview entry (must-haves, conditionals, deferred
|
|
10
|
-
asks, run-shape), so confirming a route is exactly one read.
|
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
// Frame packets inline the storyboard frame, blueprint and cited recipes.
|
|
2
|
-
// Workflow wrappers supply resource paths and workflow-specific sections.
|
|
3
|
-
// The role combines the shared worker contract with the workflow delta.
|
|
4
|
-
|
|
5
|
-
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
|
|
6
|
-
import { basename, join, resolve } from "node:path";
|
|
7
|
-
|
|
8
|
-
export function field(block, name) {
|
|
9
|
-
const match = block.match(new RegExp(`^-\\s+${name}:\\s*(.+)$`, "im"));
|
|
10
|
-
return match?.[1]?.trim() ?? null;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
export function splitFrames(storyboard) {
|
|
14
|
-
const matches = [...storyboard.matchAll(/^## Frame\s+([^\n]+)$/gm)];
|
|
15
|
-
return matches.map((match, index) => {
|
|
16
|
-
const start = match.index;
|
|
17
|
-
const end = matches[index + 1]?.index ?? storyboard.length;
|
|
18
|
-
return {
|
|
19
|
-
heading: match[1].trim(),
|
|
20
|
-
block: storyboard.slice(start, end).trim(),
|
|
21
|
-
};
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
export function frameId(frame) {
|
|
26
|
-
const src = field(frame.block, "src");
|
|
27
|
-
if (!src) throw new Error(`${frame.heading}: missing src`);
|
|
28
|
-
return basename(src).replace(/\.html?$/i, "");
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
export function selectedFile(path, heading) {
|
|
32
|
-
if (!path || !existsSync(path)) return "";
|
|
33
|
-
return `\n## ${heading}\n\n${readFileSync(path, "utf8").trim()}\n`;
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
function escapeRegExp(id) {
|
|
37
|
-
return id.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export function knownRuleIds(animationDir) {
|
|
41
|
-
const rulesDir = join(animationDir, "rules");
|
|
42
|
-
if (!existsSync(rulesDir)) {
|
|
43
|
-
console.warn(
|
|
44
|
-
`frame-packets: no rules dir at ${rulesDir} — packets will inline no motion recipes`,
|
|
45
|
-
);
|
|
46
|
-
return [];
|
|
47
|
-
}
|
|
48
|
-
return readdirSync(rulesDir)
|
|
49
|
-
.filter((name) => name.endsWith(".md"))
|
|
50
|
-
.map((name) => name.replace(/\.md$/, ""));
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
export function citedRules(block, ruleIds) {
|
|
54
|
-
const explicit = (field(block, "rules") ?? "")
|
|
55
|
-
.split(/[,\s]+/)
|
|
56
|
-
.map((rule) => rule.trim())
|
|
57
|
-
.filter(Boolean);
|
|
58
|
-
const mentioned = ruleIds.filter((id) =>
|
|
59
|
-
new RegExp(`(?<![\\w-])${escapeRegExp(id)}(?![\\w-])`, "i").test(block),
|
|
60
|
-
);
|
|
61
|
-
return [...new Set([...explicit, ...mentioned])].filter((id) => ruleIds.includes(id));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
// visual-design.md tells the author to write the blueprint as `<id> (Reproduce)`
|
|
65
|
-
// or `<id> (Adapt)` — the qualifier is direction for the frame worker, not part of
|
|
66
|
-
// the filename. Parse the field into the id it names (or null for `compose`), so
|
|
67
|
-
// no caller ever resolves a raw field value against the blueprints directory.
|
|
68
|
-
export function blueprintId(block) {
|
|
69
|
-
const raw = field(block, "blueprint");
|
|
70
|
-
if (!raw) return null;
|
|
71
|
-
const id = raw.replace(/\s*\([^)]*\)\s*$/, "").trim();
|
|
72
|
-
return id && id.toLowerCase() !== "compose" ? id : null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
export function resourceSections(block, { animationDir, ruleIds, frameId }) {
|
|
76
|
-
let sections = "";
|
|
77
|
-
const blueprint = blueprintId(block);
|
|
78
|
-
if (blueprint) {
|
|
79
|
-
const blueprintsDir = join(animationDir, "blueprints");
|
|
80
|
-
const path = join(blueprintsDir, `${blueprint}.md`);
|
|
81
|
-
// An installed library must contain the named blueprint.
|
|
82
|
-
// An absent on-demand library warns, like missing motion rules.
|
|
83
|
-
if (!existsSync(blueprintsDir)) {
|
|
84
|
-
console.warn(
|
|
85
|
-
`frame-packets: no blueprints dir at ${blueprintsDir} — packets will inline no blueprint`,
|
|
86
|
-
);
|
|
87
|
-
} else if (!existsSync(path)) {
|
|
88
|
-
throw new Error(`${frameId ?? "frame"}: blueprint "${blueprint}" has no file at ${path}`);
|
|
89
|
-
} else {
|
|
90
|
-
sections += selectedFile(path, `Selected blueprint: ${blueprint}`);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
for (const rule of citedRules(block, ruleIds)) {
|
|
94
|
-
sections += selectedFile(
|
|
95
|
-
join(animationDir, "rules", `${rule}.md`),
|
|
96
|
-
`Selected motion rule: ${rule}`,
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
return sections;
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
export function buildRolePayload({ corePath, deltaPath, outDir }) {
|
|
103
|
-
const core = readFileSync(corePath, "utf8").trim();
|
|
104
|
-
const delta = readFileSync(deltaPath, "utf8").trim();
|
|
105
|
-
const role = `${core}\n\n---\n\n${delta}\n`;
|
|
106
|
-
mkdirSync(outDir, { recursive: true });
|
|
107
|
-
const path = join(outDir, "_role.md");
|
|
108
|
-
writeFileSync(path, role);
|
|
109
|
-
return { path, bytes: Buffer.byteLength(role) };
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
export function buildFramePackets({
|
|
113
|
-
projectDir,
|
|
114
|
-
storyboardPath = join(projectDir, "STORYBOARD.md"),
|
|
115
|
-
outDir = join(projectDir, ".hyperframes", "frame-packets"),
|
|
116
|
-
maxPacketBytes = 48_000,
|
|
117
|
-
animationDir,
|
|
118
|
-
corePath,
|
|
119
|
-
deltaPath,
|
|
120
|
-
// Per-workflow hooks (all optional):
|
|
121
|
-
// designTruthLine(projectDir) -> the packet's design-truth input line
|
|
122
|
-
// validateFrame(frame, id) -> throw to reject a frame before packing
|
|
123
|
-
// extraSections(block) -> extra packet sections appended after the rule recipes
|
|
124
|
-
designTruthLine = (dir) => `- Design tokens: ${join(resolve(dir), "frame.md")}`,
|
|
125
|
-
validateFrame,
|
|
126
|
-
extraSections,
|
|
127
|
-
}) {
|
|
128
|
-
const storyboard = readFileSync(storyboardPath, "utf8");
|
|
129
|
-
const frames = splitFrames(storyboard);
|
|
130
|
-
if (frames.length === 0) throw new Error("STORYBOARD.md has no frame blocks");
|
|
131
|
-
const ruleIds = knownRuleIds(animationDir);
|
|
132
|
-
|
|
133
|
-
const packets = frames.map((frame) => {
|
|
134
|
-
const id = frameId(frame);
|
|
135
|
-
if (validateFrame) validateFrame(frame, id);
|
|
136
|
-
const packet = `# Frame packet: ${id}\n\n## Project inputs\n\n- Project: ${resolve(projectDir)}\n${designTruthLine(projectDir)}\n- RULES_DIR: ${join(animationDir, "rules")}\n\n## Assigned storyboard block\n\n${frame.block}\n${resourceSections(frame.block, { animationDir, ruleIds, frameId: id })}${extraSections ? extraSections(frame.block) : ""}`;
|
|
137
|
-
const bytes = Buffer.byteLength(packet);
|
|
138
|
-
if (bytes > maxPacketBytes) {
|
|
139
|
-
throw new Error(`${id}: frame packet is ${bytes} bytes (limit ${maxPacketBytes})`);
|
|
140
|
-
}
|
|
141
|
-
return { frameId: id, path: join(outDir, `${id}.md`), bytes, packet };
|
|
142
|
-
});
|
|
143
|
-
|
|
144
|
-
mkdirSync(outDir, { recursive: true });
|
|
145
|
-
for (const { path, packet } of packets) writeFileSync(path, packet);
|
|
146
|
-
buildRolePayload({ corePath, deltaPath, outDir });
|
|
147
|
-
return packets.map(({ packet: _packet, ...result }) => result);
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export function flag(argv, name, fallback) {
|
|
151
|
-
const index = argv.indexOf(`--${name}`);
|
|
152
|
-
return index >= 0 && argv[index + 1] ? argv[index + 1] : fallback;
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
export { isMainModule } from "./main-module.mjs";
|
|
156
|
-
|
|
157
|
-
export function runCli({ buildFramePackets: build, buildRolePayload: buildRole }) {
|
|
158
|
-
const argv = process.argv.slice(2);
|
|
159
|
-
const projectDir = resolve(flag(argv, "project", "."));
|
|
160
|
-
const outDir = resolve(flag(argv, "out-dir", join(projectDir, ".hyperframes", "frame-packets")));
|
|
161
|
-
try {
|
|
162
|
-
const packets = build({
|
|
163
|
-
projectDir,
|
|
164
|
-
storyboardPath: resolve(flag(argv, "storyboard", join(projectDir, "STORYBOARD.md"))),
|
|
165
|
-
outDir,
|
|
166
|
-
});
|
|
167
|
-
const role = buildRole({ outDir });
|
|
168
|
-
console.log(`✓ frame packets: ${packets.length} bounded packet(s)`);
|
|
169
|
-
for (const packet of packets)
|
|
170
|
-
console.log(` ${packet.frameId}: ${packet.bytes} bytes → ${packet.path}`);
|
|
171
|
-
console.log(` worker role: ${role.bytes} bytes → ${role.path}`);
|
|
172
|
-
} catch (error) {
|
|
173
|
-
console.error(`✗ frame packets: ${error.message}`);
|
|
174
|
-
process.exit(1);
|
|
175
|
-
}
|
|
176
|
-
}
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
// Audio the host app supplied survives every pass that rebuilds audio_meta.json from the storyboard: an entry
|
|
2
|
-
// marked "source": "host" whose file exists. A frame the host scored takes no looked-up cue sound.
|
|
3
|
-
/** The host's own entries in an earlier audio_meta.json, and why any other host-marked entry was dropped; `exists`
|
|
4
|
-
* resolves a path from the project root. A frame written as "1" is frame 1. */
|
|
5
|
-
export function hostAudio(previous, exists) {
|
|
6
|
-
const marked = [[previous?.bgm, "path"], ...(previous?.sfx ?? []).map((s) => [s, "file"])].filter(
|
|
7
|
-
([entry]) => entry?.source === "host",
|
|
8
|
-
);
|
|
9
|
-
const kept = new Set();
|
|
10
|
-
const dropped = [];
|
|
11
|
-
for (const [entry, key] of marked) {
|
|
12
|
-
const path = entry[key];
|
|
13
|
-
if (typeof path !== "string") dropped.push(`a host entry has no "${key}"`);
|
|
14
|
-
else if (!exists(path)) dropped.push(`${path} is not on disk`);
|
|
15
|
-
else kept.add(entry);
|
|
16
|
-
}
|
|
17
|
-
const bgm = kept.has(previous?.bgm) ? previous.bgm : null;
|
|
18
|
-
const sfx = (previous?.sfx ?? [])
|
|
19
|
-
.filter((s) => kept.has(s))
|
|
20
|
-
.map((s) => ({ ...s, frame: Number(s.frame) }));
|
|
21
|
-
return { bgm, sfx, frames: new Set(sfx.map((s) => s.frame)), dropped };
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
/** `rebuilt` with the host's bed and sounds put back; the host's bed wins over a looked-up one. */
|
|
25
|
-
export function keepHostAudio(rebuilt, host) {
|
|
26
|
-
const looked = (rebuilt.sfx ?? []).filter((s) => !host.frames.has(s.frame));
|
|
27
|
-
return { ...rebuilt, bgm: host.bgm ?? rebuilt.bgm, sfx: [...host.sfx, ...looked] };
|
|
28
|
-
}
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import { readFileSync } from "node:fs";
|
|
3
|
-
import test from "node:test";
|
|
4
|
-
import { hostAudio, keepHostAudio } from "./host-audio.mjs";
|
|
5
|
-
|
|
6
|
-
const onDisk = new Set([
|
|
7
|
-
"assets/bgm/host.mp3",
|
|
8
|
-
"assets/sfx/custom-whoosh.mp3",
|
|
9
|
-
"assets/sfx/whoosh.mp3",
|
|
10
|
-
]);
|
|
11
|
-
const exists = (path) => onDisk.has(path);
|
|
12
|
-
const hostWhoosh = {
|
|
13
|
-
frame: 1,
|
|
14
|
-
file: "assets/sfx/custom-whoosh.mp3",
|
|
15
|
-
offset_s: 0,
|
|
16
|
-
duration_s: 2,
|
|
17
|
-
source: "host",
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
test("a host sound and bed survive a rebuild, and the host's frame takes no looked-up sound", () => {
|
|
21
|
-
const previous = {
|
|
22
|
-
bgm: { path: "assets/bgm/host.mp3", source: "host" },
|
|
23
|
-
sfx: [hostWhoosh, { frame: 2, file: "assets/sfx/whoosh.mp3", offset_s: 0 }],
|
|
24
|
-
};
|
|
25
|
-
const rebuilt = {
|
|
26
|
-
bgm: null,
|
|
27
|
-
voices: [],
|
|
28
|
-
sfx: [
|
|
29
|
-
{ frame: 1, file: "assets/sfx/whoosh.mp3", offset_s: 0 },
|
|
30
|
-
{ frame: 2, file: "assets/sfx/whoosh.mp3", offset_s: 0 },
|
|
31
|
-
],
|
|
32
|
-
};
|
|
33
|
-
const kept = keepHostAudio(rebuilt, hostAudio(previous, exists));
|
|
34
|
-
assert.deepEqual(kept.bgm, previous.bgm);
|
|
35
|
-
assert.deepEqual(kept.sfx, [hostWhoosh, rebuilt.sfx[1]]);
|
|
36
|
-
});
|
|
37
|
-
|
|
38
|
-
test("an unmarked entry or a missing file is not the host's", () => {
|
|
39
|
-
const previous = {
|
|
40
|
-
bgm: { path: "assets/bgm/gone.mp3", source: "host" },
|
|
41
|
-
sfx: [
|
|
42
|
-
{ frame: 1, file: "assets/sfx/whoosh.mp3", offset_s: 0 },
|
|
43
|
-
{ frame: 3, file: "assets/sfx/gone.mp3", source: "host" },
|
|
44
|
-
],
|
|
45
|
-
};
|
|
46
|
-
const host = hostAudio(previous, exists);
|
|
47
|
-
assert.equal(host.bgm, null);
|
|
48
|
-
assert.deepEqual(host.sfx, []);
|
|
49
|
-
const rebuilt = { bgm: { path: "assets/bgm/looked.mp3" }, voices: [], sfx: [] };
|
|
50
|
-
assert.deepEqual(keepHostAudio(rebuilt, host), rebuilt);
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
test("no earlier audio_meta.json keeps the rebuild as it is", () => {
|
|
54
|
-
const rebuilt = { bgm: null, voices: [], sfx: [{ frame: 1, file: "assets/sfx/whoosh.mp3" }] };
|
|
55
|
-
assert.deepEqual(keepHostAudio(rebuilt, hostAudio(null, exists)), rebuilt);
|
|
56
|
-
});
|
|
57
|
-
|
|
58
|
-
// The narrated workflows tell the agent the same host-audio contract and the same meaning of silent.
|
|
59
|
-
const workflowText = (skill, file) =>
|
|
60
|
-
readFileSync(new URL(`../../../../${skill}/${file}`, import.meta.url), "utf8");
|
|
61
|
-
|
|
62
|
-
test("each narrated workflow tells a host app's music and sounds the way in, and when a film is silent", () => {
|
|
63
|
-
for (const skill of ["product-launch-video", "pr-to-video", "faceless-explainer"]) {
|
|
64
|
-
const steps = workflowText(skill, "SKILL.md");
|
|
65
|
-
assert.match(
|
|
66
|
-
steps,
|
|
67
|
-
/host app's own tools make the music or a sound effect[^\n]+"source": "host"/,
|
|
68
|
-
skill,
|
|
69
|
-
);
|
|
70
|
-
assert.match(steps, /"duration_s": <its length>[^\n]+Every audio pass keeps these/, skill);
|
|
71
|
-
assert.match(steps, /no `SCRIPT.md`, \*\*and\*\* no `sfx:` cues or host audio/, skill);
|
|
72
|
-
assert.match(
|
|
73
|
-
steps,
|
|
74
|
-
/marked silent \(`music: none`, no `SCRIPT.md`, no `sfx:` cues or host audio\)/,
|
|
75
|
-
skill,
|
|
76
|
-
);
|
|
77
|
-
assert.match(
|
|
78
|
-
workflowText(skill, "references/story-design.md"),
|
|
79
|
-
/no `SCRIPT.md` \+ no `sfx:` cues or host audio\*\* — the canonical/,
|
|
80
|
-
skill,
|
|
81
|
-
);
|
|
82
|
-
}
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
test("a frame written as a string is the same frame, and a gone host file is reported", () => {
|
|
86
|
-
const previous = {
|
|
87
|
-
bgm: { path: "assets/bgm/gone.mp3", source: "host" },
|
|
88
|
-
sfx: [{ ...hostWhoosh, frame: "1" }],
|
|
89
|
-
};
|
|
90
|
-
const host = hostAudio(previous, exists);
|
|
91
|
-
assert.deepEqual(host.sfx, [hostWhoosh]);
|
|
92
|
-
assert.ok(host.frames.has(1));
|
|
93
|
-
assert.deepEqual(host.dropped, ["assets/bgm/gone.mp3 is not on disk"]);
|
|
94
|
-
const rebuilt = { bgm: null, voices: [], sfx: [{ frame: 1, file: "assets/sfx/whoosh.mp3" }] };
|
|
95
|
-
assert.deepEqual(keepHostAudio(rebuilt, host).sfx, [hostWhoosh]);
|
|
96
|
-
});
|
|
97
|
-
|
|
98
|
-
test("a host entry with no path is reported, not thrown", () => {
|
|
99
|
-
const throwsOnNonString = (path) => {
|
|
100
|
-
if (typeof path !== "string") throw new TypeError("path must be a string");
|
|
101
|
-
return onDisk.has(path);
|
|
102
|
-
};
|
|
103
|
-
const host = hostAudio({ bgm: { src: "x.mp3", source: "host" }, sfx: [] }, throwsOnNonString);
|
|
104
|
-
assert.equal(host.bgm, null);
|
|
105
|
-
assert.deepEqual(host.dropped, ['a host entry has no "path"']);
|
|
106
|
-
});
|