hyperframes 0.8.143 → 0.8.145

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.
Files changed (202) hide show
  1. package/README.md +3 -2
  2. package/dist/{add-Q5EYDUAY.js → add-B6OUH46W.js} +12 -12
  3. package/dist/{animatedGifPrep-H2DUQEZ3.js → animatedGifPrep-MIWRDJIO.js} +7 -7
  4. package/dist/{asset-C7JBYYX4.js → asset-XJ2B2PU3.js} +2 -2
  5. package/dist/{assetCataloger-FRO4G6OU.js → assetCataloger-A5ZLSCMZ.js} +3 -3
  6. package/dist/{auth-FRWLCO36.js → auth-5HOVCZMV.js} +1 -1
  7. package/dist/{autoUpdate-E4OZXQK6.js → autoUpdate-WVNL5K3D.js} +2 -2
  8. package/dist/{backgroundChecks-FSUVHN5L.js → backgroundChecks-IGF54SFH.js} +3 -3
  9. package/dist/backgroundChecksWorker.js +3 -3
  10. package/dist/{batchRender-4U73BYTU.js → batchRender-T6JEGCQV.js} +4 -4
  11. package/dist/{beats-U6KJWF35.js → beats-37T6Y6QP.js} +13 -13
  12. package/dist/{benchmark-5ONT7V7B.js → benchmark-ZVVLOWPP.js} +9 -9
  13. package/dist/{browser-R4DU46IE.js → browser-4SSJOLH4.js} +39 -55
  14. package/dist/{bundleWithLocalizedFonts-VH55VOAL.js → bundleWithLocalizedFonts-XWK423QP.js} +2 -2
  15. package/dist/{capture-OGQAEYKO.js → capture-2SF7YP57.js} +2 -2
  16. package/dist/{capture-26G2DPSI.js → capture-KZXOPBMO.js} +18 -18
  17. package/dist/{catalog-RKORTIUE.js → catalog-NLD4A2C6.js} +12 -12
  18. package/dist/{catch-up-4OBERRQO.js → catch-up-4BSRN6IR.js} +4 -4
  19. package/dist/{check-P2XDN57S.js → check-IA44QQWM.js} +66 -55
  20. package/dist/{checkBrowser-NTGJGAEA.js → checkBrowser-VM35KZMW.js} +81 -30
  21. package/dist/{chunk-LVX6NK36.js → chunk-3IBMBNYY.js} +1 -1
  22. package/dist/{chunk-6XMFEICO.js → chunk-3KU3PFDW.js} +77 -92
  23. package/dist/{chunk-PJU63L6W.js → chunk-4ORLNTET.js} +1 -1
  24. package/dist/{chunk-DF2BHILQ.js → chunk-4QWD6JYN.js} +3 -3
  25. package/dist/{chunk-BT27OYYX.js → chunk-5NRXZGKK.js} +18 -12
  26. package/dist/{chunk-UM2GRYM3.js → chunk-5WVW7P23.js} +3 -3
  27. package/dist/{chunk-I7QGQAZM.js → chunk-6LGNTUZN.js} +7 -7
  28. package/dist/{chunk-LAOCA3MQ.js → chunk-A4Q7W4LV.js} +13 -8
  29. package/dist/{chunk-4PFZPP2N.js → chunk-A6S35NYA.js} +54 -16
  30. package/dist/{chunk-QRKLPWEX.js → chunk-ADF3X6GM.js} +11 -2
  31. package/dist/chunk-AUWHD7RA.js +3753 -0
  32. package/dist/{chunk-W35EKBS6.js → chunk-BFACGEII.js} +2 -2
  33. package/dist/{chunk-HW4AKJ5F.js → chunk-BIAC7IJT.js} +1 -1
  34. package/dist/{chunk-ZLW2V65P.js → chunk-BSQ7XANM.js} +3 -2
  35. package/dist/{chunk-LCSMOLGX.js → chunk-BYSBRF24.js} +69 -8
  36. package/dist/{chunk-2LBBHMKT.js → chunk-CFUXNBWH.js} +1 -1
  37. package/dist/{chunk-BFDJ63J5.js → chunk-DDIVWXN7.js} +1 -1
  38. package/dist/{chunk-KOEWEFHK.js → chunk-DIRJ322I.js} +10 -5
  39. package/dist/{chunk-FVYXDXEV.js → chunk-DWUKJQTO.js} +2 -2
  40. package/dist/{chunk-POLR33RB.js → chunk-EPE2HRJK.js} +15 -17
  41. package/dist/{chunk-UICWP23D.js → chunk-FBCULCAL.js} +3 -3
  42. package/dist/{chunk-F26LCYRY.js → chunk-FDT6KQV4.js} +142 -81
  43. package/dist/{chunk-P7THMINS.js → chunk-FXJJCPPB.js} +1 -1
  44. package/dist/{chunk-BYK73CR7.js → chunk-GBGJ7A3D.js} +5 -5
  45. package/dist/{sherpa-LVIUEAGF.js → chunk-GEMJYBRU.js} +11 -45
  46. package/dist/{chunk-KO5QBV73.js → chunk-GMAJB2P6.js} +1 -1
  47. package/dist/{chunk-KQLGTGE5.js → chunk-GRY3PN3K.js} +2 -2
  48. package/dist/{chunk-7UYBQ6NF.js → chunk-GXJEGZL2.js} +30 -20
  49. package/dist/{chunk-KJJLA674.js → chunk-GZVP4TWN.js} +1 -46
  50. package/dist/{chunk-QVYVUCWD.js → chunk-HB7FJOY4.js} +1 -1
  51. package/dist/{chunk-QFN7NVWM.js → chunk-ICKDMTLA.js} +1 -1
  52. package/dist/{chunk-XONFUK3M.js → chunk-IEIJRMLZ.js} +47 -35
  53. package/dist/{chunk-PAGIICKN.js → chunk-IHTRYDFN.js} +1 -1
  54. package/dist/chunk-IR35BCLK.js +13 -0
  55. package/dist/{chunk-KDPYVTEU.js → chunk-KBB4RG6F.js} +6 -1
  56. package/dist/{chunk-ZQQ3SEIE.js → chunk-KIFHYXPB.js} +99 -31
  57. package/dist/{chunk-TAMQYQGJ.js → chunk-LAFJSYDL.js} +1 -1
  58. package/dist/{chunk-U3X3TPBW.js → chunk-MAYCCGMQ.js} +11 -2
  59. package/dist/{chunk-HC7EVDEL.js → chunk-OB5MJR4W.js} +1 -1
  60. package/dist/{chunk-N3DQEVSI.js → chunk-OTHDVXOJ.js} +8 -5
  61. package/dist/{chunk-Y6QL2LGO.js → chunk-PLR7Z6TC.js} +1 -1
  62. package/dist/{chunk-OBXQRJWQ.js → chunk-QATWIE4K.js} +1 -1
  63. package/dist/{chunk-HLYOEIWM.js → chunk-QLSM7K5S.js} +2 -2
  64. package/dist/{chunk-LW6HO6U3.js → chunk-R42WWQVB.js} +1 -1
  65. package/dist/{chunk-HMT2RPZU.js → chunk-U5QY7KTN.js} +13 -9
  66. package/dist/chunk-UPFUC4DB.js +136 -0
  67. package/dist/{chunk-33RZPZ4K.js → chunk-UXO2L7HJ.js} +366 -156
  68. package/dist/{chunk-GNBGPUJ7.js → chunk-VHFEMFYL.js} +3 -3
  69. package/dist/{chunk-4M4EC7JX.js → chunk-VRW6EBHV.js} +12 -1
  70. package/dist/{chunk-VIVBA6E6.js → chunk-XBX4QJP7.js} +1 -1
  71. package/dist/{chunk-CLOH4LIB.js → chunk-XIHCMVMG.js} +2 -2
  72. package/dist/{chunk-TVCRUG2S.js → chunk-ZEUONDQG.js} +1 -1
  73. package/dist/{chunk-OSSHSIMD.js → chunk-ZF7SXQJ7.js} +1 -1
  74. package/dist/{chunk-5FISWJ37.js → chunk-ZIYZ77MR.js} +4 -4
  75. package/dist/{chunk-3NE7ZYU2.js → chunk-ZSVUAVMT.js} +3 -3
  76. package/dist/{clean-YHGPY33K.js → clean-RDKJB5FK.js} +18 -18
  77. package/dist/cli.js +68 -56
  78. package/dist/{cloud-DOFI5ISR.js → cloud-QVPVVNCW.js} +4 -4
  79. package/dist/{cloudrun-KTZ4XDHL.js → cloudrun-3RE2UCQG.js} +4 -4
  80. package/dist/{compare-SMMIZN2C.js → compare-LEDOY7MO.js} +25 -25
  81. package/dist/{compiler-TEXQWW6N.js → compiler-F54OZZPM.js} +10 -4
  82. package/dist/{component-B3GCNGSS.js → component-N42M67WY.js} +3 -3
  83. package/dist/{compositions-OQNZZTKF.js → compositions-VB2J2LZI.js} +11 -11
  84. package/dist/{delete-EL5LVSEP.js → delete-Q6RWMJ4Z.js} +2 -2
  85. package/dist/{dist-5UVIRMSM.js → dist-KDJTFJHA.js} +2 -2
  86. package/dist/{dist-XN234YFQ.js → dist-Q4BI5A73.js} +4 -4
  87. package/dist/{doctor-UOL3OI2A.js → doctor-JMMUHDRV.js} +13 -13
  88. package/dist/{events-K2DB2PBC.js → events-6ZBSIBE5.js} +2 -2
  89. package/dist/{events-NIZBS6S7.js → events-RGUAHIBW.js} +3 -3
  90. package/dist/{feedback-QMP4E6L7.js → feedback-FIID6MZW.js} +9 -9
  91. package/dist/{ffmpeg-QIUFEFTY.js → ffmpeg-T5SH2EFJ.js} +3 -2
  92. package/dist/{figma-2AUJRNVC.js → figma-BL3JJC36.js} +3 -3
  93. package/dist/fontLocalizeCli.js +9 -9
  94. package/dist/{get-P5NC7SRM.js → get-P46GS7S6.js} +2 -2
  95. package/dist/{gpuPolicy-7N5MCE2G.js → gpuPolicy-AQ2BPLBK.js} +11 -9
  96. package/dist/{grade-compare-HV5AFZ6P.js → grade-compare-GDCWU7ZZ.js} +27 -27
  97. package/dist/{help-3TSTXBLN.js → help-HJR3RWFG.js} +2 -2
  98. package/dist/{history-D65XFJ6D.js → history-GGO5AWJB.js} +5 -5
  99. package/dist/hyperframe-runtime.js +59 -59
  100. package/dist/hyperframe.manifest.json +1 -1
  101. package/dist/hyperframe.runtime.iife.js +59 -59
  102. package/dist/hyperframes-player.global.js +3 -3
  103. package/dist/{info-TXV7MLFO.js → info-3GFWUBJC.js} +8 -8
  104. package/dist/{init-OSDMJZJV.js → init-36OPU2ZG.js} +35 -36
  105. package/dist/{inspect-RQQSAYIJ.js → inspect-F2HEL5ON.js} +26 -26
  106. package/dist/{installer-CDOB32HE.js → installer-NI6P6GC4.js} +5 -5
  107. package/dist/{keyframes-V75Q6GRM.js → keyframes-7OY3LMAZ.js} +6 -6
  108. package/dist/{lambda-RODV4RCX.js → lambda-6GJIWNJ3.js} +5 -5
  109. package/dist/{layout-IZAI5SFC.js → layout-FTMLNL5A.js} +26 -26
  110. package/dist/{lint-PLXOXY5R.js → lint-U6POHUON.js} +8 -8
  111. package/dist/{lintProject-OQ6H6XBR.js → lintProject-UBZ3TDHU.js} +2 -2
  112. package/dist/{list-BQBPNKDZ.js → list-IP5KI5Q2.js} +2 -2
  113. package/dist/{login-NP6F4FHC.js → login-4VWTVPHG.js} +4 -4
  114. package/dist/{manager-CT3D67CG.js → manager-BPSR6D3V.js} +2 -2
  115. package/dist/{manager-GXYF4AVO.js → manager-YKMHR6LN.js} +8 -5
  116. package/dist/{media-treatment-PXGMZ4A4.js → media-treatment-XGV44AGV.js} +16 -13
  117. package/dist/{models-CEZM6XZ7.js → models-UCXB6UR5.js} +59 -19
  118. package/dist/{motionShot-R4GHYWYM.js → motionShot-WPVNBXKA.js} +21 -22
  119. package/dist/{normalize-H6KUHHEI.js → normalize-U3SL5VG3.js} +2 -2
  120. package/dist/{normalize-audio-MQ7NFCOV.js → normalize-audio-TYJ3UEHO.js} +6 -6
  121. package/dist/{open-AKQTGNXF.js → open-HENOLVB2.js} +4 -4
  122. package/dist/parakeetRunner-VFQ6WFTD.js +67 -0
  123. package/dist/{pipeline-SYJYP2RM.js → pipeline-6WPSC3H4.js} +10 -9
  124. package/dist/{play-NBH4B7PL.js → play-OI53WNUM.js} +19 -19
  125. package/dist/{preflight-Y5DN5D37.js → preflight-B4AFK3RG.js} +4 -4
  126. package/dist/{present-XAX55CFS.js → present-NGMEQ4NO.js} +15 -15
  127. package/dist/{preview-OLANKNFA.js → preview-VT2HWRWZ.js} +19 -19
  128. package/dist/{producer-Q6YNZZUJ.js → producer-7TYEAUF7.js} +1 -1
  129. package/dist/{projectConfig-EM26P45P.js → projectConfig-B2AF5DXY.js} +7 -7
  130. package/dist/{publication-OXWJZKSX.js → publication-2PANQVC6.js} +3 -3
  131. package/dist/{publish-4VBWP2UB.js → publish-O5OL42BG.js} +11 -11
  132. package/dist/{remove-background-REB7427G.js → remove-background-T2JM6UVP.js} +11 -10
  133. package/dist/{render-K25YOG3M.js → render-OLPKOJRU.js} +11 -11
  134. package/dist/{render-3CVZ2SZG.js → render-W7OFXDOJ.js} +4 -4
  135. package/dist/{render-TSE75QUL.js → render-Z253WHBK.js} +26 -26
  136. package/dist/{render-batch-GGUOK3DS.js → render-batch-46IIBFKL.js} +4 -4
  137. package/dist/{renderCancellation-PZRWB53I.js → renderCancellation-QTZOCDJ2.js} +10 -9
  138. package/dist/renderSetupWorker.js +32 -44
  139. package/dist/{resolver-S5VK6UCB.js → resolver-J2PL5FVJ.js} +5 -5
  140. package/dist/sherpa-ZF42V3RN.js +75 -0
  141. package/dist/sherpaWorker.js +2 -1
  142. package/dist/skills/hyperframes/scripts/lib/frame-packets-core.mjs +2 -20
  143. package/dist/skills/hyperframes/scripts/lib/main-module.mjs +13 -0
  144. package/dist/skills/hyperframes/scripts/lib/main-module.test.mjs +51 -0
  145. package/dist/skills/hyperframes/scripts/plugin-cli.mjs +4 -3
  146. package/dist/skills/hyperframes/scripts/plugin-cli.test.mjs +5 -1
  147. package/dist/skills/hyperframes-cli/SKILL.md +2 -0
  148. package/dist/skills/hyperframes-cli/references/lint-validate-inspect.md +1 -1
  149. package/dist/skills/media-use/audio/scripts/heygen-voice.mjs +2 -2
  150. package/dist/skills/media-use/audio/scripts/lib/main-module.mjs +13 -0
  151. package/dist/skills/media-use/scripts/lib/cube-validate.mjs +2 -3
  152. package/dist/skills/media-use/scripts/lib/main-module.mjs +13 -0
  153. package/dist/{skills-I65FU5HD.js → skills-ACDOO3PX.js} +7 -7
  154. package/dist/{skillsUpdateCheck-J57RNNIV.js → skillsUpdateCheck-L5OXVVPU.js} +3 -3
  155. package/dist/{snapshot-YROOGY22.js → snapshot-UUVNZOW5.js} +28 -28
  156. package/dist/{src-JO5JOV7Y.js → src-BSLKXEGX.js} +10 -6
  157. package/dist/{src-X426BZAG.js → src-KS3AWFGT.js} +8 -8
  158. package/dist/{staticProjectServer-5VMBS262.js → staticProjectServer-2TTVGPQH.js} +15 -15
  159. package/dist/studio/assets/{hyperframes-player-BXSuksFh.js → hyperframes-player-DZ5JrMDg.js} +3 -3
  160. package/dist/studio/assets/{index-FgyO_5Kv.js → index-BOs6C0aZ.js} +1 -1
  161. package/dist/studio/assets/{index-BgOVCqjo.js → index-BqFRhNZa.js} +1 -1
  162. package/dist/studio/assets/{index-J7jpL4pj.js → index-D8W0a0Z9.js} +149 -149
  163. package/dist/studio/{chunk-TFLU2MGI.js → chunk-6JY3MTIX.js} +108 -2
  164. package/dist/studio/{chunk-H2DUOXTF.js → chunk-NZPJUZKT.js} +100 -4
  165. package/dist/studio/{chunk-UYWON5AX.js → chunk-TP6D3U37.js} +7 -100
  166. package/dist/studio/{chunk-LOVBLSMR.js → chunk-Y2OHHNM2.js} +35 -19
  167. package/dist/studio/{domEditingLayers-KBTPQKGA.js → domEditingLayers-PTP2ICGM.js} +3 -3
  168. package/dist/studio/index.d.ts +8 -5
  169. package/dist/studio/index.html +1 -1
  170. package/dist/studio/index.js +545 -495
  171. package/dist/studio/player.js +3 -3
  172. package/dist/studio/ui.d.ts +4 -5
  173. package/dist/studio/ui.js +1 -1
  174. package/dist/{studio-api-VRBZUGAE.js → studio-api-WYWF7XRC.js} +9 -9
  175. package/dist/{studioServer-DBNKZ6I6.js → studioServer-3FG4YTP7.js} +72 -54
  176. package/dist/{telemetry-CXAX3TO3.js → telemetry-PAOOB4T4.js} +3 -3
  177. package/dist/{timeline-VQ34WH7J.js → timeline-JIIJKKPC.js} +69 -47
  178. package/dist/{tokens-62R7VFAZ.js → tokens-3QRAM75Z.js} +2 -2
  179. package/dist/{transcribe-XOHPPL2O.js → transcribe-QSBP5MUG.js} +115 -51
  180. package/dist/{transcribe-7KR7IPJA.js → transcribe-SZB6UMXE.js} +14 -12
  181. package/dist/{tts-MUV42JXT.js → tts-B6AHFQEO.js} +1 -1
  182. package/dist/{updateCheck-POYNH3B5.js → updateCheck-V3DSB26K.js} +2 -2
  183. package/dist/{upgrade-NBNOT7J2.js → upgrade-L5GISOEV.js} +2 -2
  184. package/dist/{urlDownloader-3NS63A7B.js → urlDownloader-52FERT4X.js} +6 -6
  185. package/dist/{validate-Y2QDHAEP.js → validate-HVVLX7KO.js} +20 -20
  186. package/dist/{video-SJDMTSTL.js → video-MEOWRMFG.js} +7 -7
  187. package/package.json +1 -1
  188. package/dist/chunk-6TPZSTCL.js +0 -3681
  189. package/dist/studio/chunk-EEXSYY5F.js.map +0 -1
  190. package/dist/studio/chunk-H2DUOXTF.js.map +0 -1
  191. package/dist/studio/chunk-LOVBLSMR.js.map +0 -1
  192. package/dist/studio/chunk-PZ5AY32C.js.map +0 -1
  193. package/dist/studio/chunk-TFLU2MGI.js.map +0 -1
  194. package/dist/studio/chunk-UYWON5AX.js.map +0 -1
  195. package/dist/studio/domEditingLayers-KBTPQKGA.js.map +0 -1
  196. package/dist/studio/index.css.map +0 -1
  197. package/dist/studio/index.js.map +0 -1
  198. package/dist/studio/player.js.map +0 -1
  199. package/dist/studio/styles/tailwind-preset.js.map +0 -1
  200. package/dist/studio/ui.js.map +0 -1
  201. package/dist/{screenshotCapture-TEUIWXWN.js → screenshotCapture-3JXXUZND.js} +3 -3
  202. package/dist/{synthesize-C3IWDAXF.js → synthesize-UCI4X5O7.js} +4 -4
@@ -6,21 +6,21 @@ var __filename = __hf_fileURLToPath(import.meta.url);
6
6
  var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  maybePromptRenderFeedback
9
- } from "./chunk-3NE7ZYU2.js";
9
+ } from "./chunk-ZSVUAVMT.js";
10
10
  import {
11
11
  reportVariableIssues,
12
12
  resolveVariablesArg,
13
13
  validateVariablesAgainstProject
14
- } from "./chunk-LW6HO6U3.js";
14
+ } from "./chunk-R42WWQVB.js";
15
15
  import {
16
16
  loadProducer
17
- } from "./chunk-QVYVUCWD.js";
17
+ } from "./chunk-HB7FJOY4.js";
18
18
  import {
19
19
  formatLintStartupMessage
20
20
  } from "./chunk-6CSYCFQV.js";
21
21
  import {
22
22
  resolveProject
23
- } from "./chunk-VIVBA6E6.js";
23
+ } from "./chunk-XBX4QJP7.js";
24
24
  import {
25
25
  renderJobObservabilityTelemetryPayload
26
26
  } from "./chunk-VXVRPIJA.js";
@@ -32,7 +32,7 @@ import {
32
32
  resolveCompositionEntryArg,
33
33
  resolveDefaultFpsArg,
34
34
  windowsChromeCrashRemediation
35
- } from "./chunk-P7THMINS.js";
35
+ } from "./chunk-FXJJCPPB.js";
36
36
  import "./chunk-WPNE5NEP.js";
37
37
  import {
38
38
  desktopHint
@@ -49,24 +49,24 @@ import "./chunk-DCAI5DBR.js";
49
49
  import "./chunk-EOVYQ3IG.js";
50
50
  import {
51
51
  runEnvironmentChecks
52
- } from "./chunk-KOEWEFHK.js";
52
+ } from "./chunk-DIRJ322I.js";
53
53
  import "./chunk-442JNXRM.js";
54
54
  import {
55
55
  createRenderCancellationScope
56
- } from "./chunk-UICWP23D.js";
56
+ } from "./chunk-FBCULCAL.js";
57
57
  import {
58
58
  loadProjectConfig,
59
59
  readProjectConfigWithStatus,
60
60
  seedProjectAuthoringSkill
61
- } from "./chunk-2LBBHMKT.js";
61
+ } from "./chunk-CFUXNBWH.js";
62
62
  import "./chunk-XT7X6QCP.js";
63
63
  import "./chunk-4YYJOFKS.js";
64
64
  import {
65
65
  normalizeSkillSlug
66
66
  } from "./chunk-HVW7ABXD.js";
67
- import "./chunk-HW4AKJ5F.js";
68
- import "./chunk-CLOH4LIB.js";
69
- import "./chunk-TAMQYQGJ.js";
67
+ import "./chunk-BIAC7IJT.js";
68
+ import "./chunk-XIHCMVMG.js";
69
+ import "./chunk-LAFJSYDL.js";
70
70
  import "./chunk-AWDFDFI3.js";
71
71
  import "./chunk-P6LJ4Y32.js";
72
72
  import {
@@ -76,14 +76,14 @@ import {
76
76
  findFFmpeg,
77
77
  findFFprobe,
78
78
  getFFmpegInstallHint
79
- } from "./chunk-TVCRUG2S.js";
79
+ } from "./chunk-ZEUONDQG.js";
80
80
  import {
81
81
  trackRenderComplete,
82
82
  trackRenderError,
83
83
  trackRenderObservation,
84
84
  trackRenderPreflightRejected
85
- } from "./chunk-QFN7NVWM.js";
86
- import "./chunk-OSSHSIMD.js";
85
+ } from "./chunk-ICKDMTLA.js";
86
+ import "./chunk-ZF7SXQJ7.js";
87
87
  import "./chunk-VWG7OQKU.js";
88
88
  import {
89
89
  bytesToMb
@@ -110,8 +110,8 @@ import {
110
110
  MAX_VP9_CPU_USED,
111
111
  MIN_VP9_CPU_USED,
112
112
  isVideoFrameFormat
113
- } from "./chunk-33RZPZ4K.js";
114
- import "./chunk-F26LCYRY.js";
113
+ } from "./chunk-UXO2L7HJ.js";
114
+ import "./chunk-FDT6KQV4.js";
115
115
  import "./chunk-NE55C6S5.js";
116
116
  import "./chunk-USDEMXXL.js";
117
117
  import {
@@ -119,8 +119,8 @@ import {
119
119
  fpsToFfmpegArg,
120
120
  fpsToNumber,
121
121
  parseFps
122
- } from "./chunk-4M4EC7JX.js";
123
- import "./chunk-6TPZSTCL.js";
122
+ } from "./chunk-VRW6EBHV.js";
123
+ import "./chunk-AUWHD7RA.js";
124
124
  import "./chunk-VC76R6W2.js";
125
125
  import "./chunk-YA62XGXS.js";
126
126
  import {
@@ -137,25 +137,25 @@ import "./chunk-RQVDTPGD.js";
137
137
  import {
138
138
  hasDefinitiveEntryMismatch
139
139
  } from "./chunk-Q5X2B5WT.js";
140
- import "./chunk-4PFZPP2N.js";
140
+ import "./chunk-A6S35NYA.js";
141
141
  import {
142
142
  killOrphanedProcessesForRender
143
- } from "./chunk-LAOCA3MQ.js";
143
+ } from "./chunk-A4Q7W4LV.js";
144
144
  import {
145
145
  runRenderSetupWorker
146
- } from "./chunk-LCSMOLGX.js";
146
+ } from "./chunk-BYSBRF24.js";
147
147
  import "./chunk-TWWSYAKJ.js";
148
148
  import {
149
149
  lintProject,
150
150
  shouldBlockRender
151
- } from "./chunk-XONFUK3M.js";
151
+ } from "./chunk-IEIJRMLZ.js";
152
152
  import {
153
153
  collectSubCompositionSrcs
154
154
  } from "./chunk-IWFLMU2N.js";
155
155
  import "./chunk-APDLWWFG.js";
156
156
  import "./chunk-PJ3HDUCY.js";
157
157
  import "./chunk-3RM2ETQT.js";
158
- import "./chunk-ZLW2V65P.js";
158
+ import "./chunk-BSQ7XANM.js";
159
159
  import "./chunk-SDYDNHEE.js";
160
160
  import "./chunk-2PSPARWP.js";
161
161
  import "./chunk-T42U2W2R.js";
@@ -172,7 +172,7 @@ import {
172
172
  } from "./chunk-ISN5GRYI.js";
173
173
  import {
174
174
  VERSION
175
- } from "./chunk-W35EKBS6.js";
175
+ } from "./chunk-BFACGEII.js";
176
176
  import {
177
177
  normalizeErrorMessage
178
178
  } from "./chunk-KNU5COPB.js";
@@ -671,7 +671,7 @@ async function executeRenderPlan(plan, dependencies, cancellation) {
671
671
  let batchModule;
672
672
  let preparedBatch;
673
673
  if (plan.batchPath) {
674
- batchModule = await import("./batchRender-4U73BYTU.js");
674
+ batchModule = await import("./batchRender-T6JEGCQV.js");
675
675
  try {
676
676
  preparedBatch = batchModule.prepareBatchRender({
677
677
  batchPath: plan.batchPath,
@@ -760,7 +760,7 @@ function assertRenderActive(cancellation) {
760
760
  cancellation?.signal.throwIfAborted();
761
761
  }
762
762
  async function ensureRenderBrowser(plan, signal) {
763
- const { ensureBrowser } = await import("./manager-CT3D67CG.js");
763
+ const { ensureBrowser } = await import("./manager-BPSR6D3V.js");
764
764
  let browserSpinner;
765
765
  try {
766
766
  if (plan.effectiveQuiet) {
@@ -14,7 +14,7 @@ import {
14
14
  loadProjectVariableSchema,
15
15
  reportVariableIssues,
16
16
  validateVariablesAgainstSchema
17
- } from "./chunk-LW6HO6U3.js";
17
+ } from "./chunk-R42WWQVB.js";
18
18
  import "./chunk-FH7WODJH.js";
19
19
  import {
20
20
  errorBox
@@ -24,8 +24,8 @@ import {
24
24
  failCommand,
25
25
  setCommandExitCode
26
26
  } from "./chunk-PBN6GBJE.js";
27
- import "./chunk-4M4EC7JX.js";
28
- import "./chunk-6TPZSTCL.js";
27
+ import "./chunk-VRW6EBHV.js";
28
+ import "./chunk-AUWHD7RA.js";
29
29
  import "./chunk-VC76R6W2.js";
30
30
  import "./chunk-YA62XGXS.js";
31
31
  import "./chunk-MQZVBHEY.js";
@@ -35,7 +35,7 @@ import "./chunk-T76PLPD6.js";
35
35
  import "./chunk-FXMKHHPO.js";
36
36
  import "./chunk-RQVDTPGD.js";
37
37
  import "./chunk-3RM2ETQT.js";
38
- import "./chunk-ZLW2V65P.js";
38
+ import "./chunk-BSQ7XANM.js";
39
39
  import "./chunk-SDYDNHEE.js";
40
40
  import "./chunk-2PSPARWP.js";
41
41
  import "./chunk-T42U2W2R.js";
@@ -7,13 +7,13 @@ var __dirname = __hf_dirname(__filename);
7
7
  import {
8
8
  createRenderCancellationScope,
9
9
  stoppedByCancelSignal
10
- } from "./chunk-UICWP23D.js";
11
- import "./chunk-33RZPZ4K.js";
12
- import "./chunk-F26LCYRY.js";
10
+ } from "./chunk-FBCULCAL.js";
11
+ import "./chunk-UXO2L7HJ.js";
12
+ import "./chunk-FDT6KQV4.js";
13
13
  import "./chunk-NE55C6S5.js";
14
14
  import "./chunk-USDEMXXL.js";
15
- import "./chunk-4M4EC7JX.js";
16
- import "./chunk-6TPZSTCL.js";
15
+ import "./chunk-VRW6EBHV.js";
16
+ import "./chunk-AUWHD7RA.js";
17
17
  import "./chunk-VC76R6W2.js";
18
18
  import "./chunk-YA62XGXS.js";
19
19
  import "./chunk-MQZVBHEY.js";
@@ -22,18 +22,19 @@ import "./chunk-DPVXBVLL.js";
22
22
  import "./chunk-T76PLPD6.js";
23
23
  import "./chunk-FXMKHHPO.js";
24
24
  import "./chunk-RQVDTPGD.js";
25
- import "./chunk-LAOCA3MQ.js";
26
- import "./chunk-LCSMOLGX.js";
25
+ import "./chunk-A4Q7W4LV.js";
26
+ import "./chunk-BYSBRF24.js";
27
27
  import "./chunk-TWWSYAKJ.js";
28
- import "./chunk-XONFUK3M.js";
28
+ import "./chunk-IEIJRMLZ.js";
29
29
  import "./chunk-IWFLMU2N.js";
30
30
  import "./chunk-APDLWWFG.js";
31
31
  import "./chunk-PJ3HDUCY.js";
32
32
  import "./chunk-3RM2ETQT.js";
33
- import "./chunk-ZLW2V65P.js";
33
+ import "./chunk-BSQ7XANM.js";
34
34
  import "./chunk-SDYDNHEE.js";
35
35
  import "./chunk-2PSPARWP.js";
36
36
  import "./chunk-T42U2W2R.js";
37
+ import "./chunk-KNU5COPB.js";
37
38
  import "./chunk-3GXQPCJC.js";
38
39
  import "./chunk-M2WBOQ2Q.js";
39
40
  export {
@@ -8,20 +8,24 @@ import "./chunk-Q5X2B5WT.js";
8
8
  import {
9
9
  ensureBrowser,
10
10
  releaseOwnedBrowserInstallLock
11
- } from "./chunk-4PFZPP2N.js";
11
+ } from "./chunk-A6S35NYA.js";
12
12
  import {
13
13
  killOrphanedProcesses
14
- } from "./chunk-LAOCA3MQ.js";
15
- import "./chunk-LCSMOLGX.js";
14
+ } from "./chunk-A4Q7W4LV.js";
15
+ import {
16
+ installRenderSetupSignalHandlers,
17
+ renderSetupErrorLine,
18
+ renderSetupResultLine
19
+ } from "./chunk-BYSBRF24.js";
16
20
  import "./chunk-TWWSYAKJ.js";
17
21
  import {
18
22
  lintProject
19
- } from "./chunk-XONFUK3M.js";
23
+ } from "./chunk-IEIJRMLZ.js";
20
24
  import "./chunk-IWFLMU2N.js";
21
25
  import "./chunk-APDLWWFG.js";
22
26
  import "./chunk-PJ3HDUCY.js";
23
27
  import "./chunk-3RM2ETQT.js";
24
- import "./chunk-ZLW2V65P.js";
28
+ import "./chunk-BSQ7XANM.js";
25
29
  import "./chunk-SDYDNHEE.js";
26
30
  import "./chunk-2PSPARWP.js";
27
31
  import "./chunk-T42U2W2R.js";
@@ -30,28 +34,6 @@ import "./chunk-M2WBOQ2Q.js";
30
34
 
31
35
  // src/renderSetupWorker.ts
32
36
  import { constants, setPriority } from "os";
33
-
34
- // src/renderSetupWorkerLifecycle.ts
35
- var RENDER_SETUP_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
36
- function installRenderSetupSignalHandlers(signalTarget, releaseLock, resendSignal, handleHangup = true) {
37
- const handlers = /* @__PURE__ */ new Map();
38
- const handledSignals = handleHangup ? RENDER_SETUP_SIGNALS : RENDER_SETUP_SIGNALS.filter((signal) => signal !== "SIGHUP");
39
- for (const signal of handledSignals) {
40
- const handler = () => {
41
- releaseLock();
42
- signalTarget.off(signal, handler);
43
- resendSignal(signal);
44
- };
45
- handlers.set(signal, handler);
46
- signalTarget.on(signal, handler);
47
- }
48
- return () => {
49
- for (const [signal, handler] of handlers) signalTarget.off(signal, handler);
50
- };
51
- }
52
-
53
- // src/renderSetupWorker.ts
54
- var RESULT_PREFIX = "HYPERFRAMES_RENDER_SETUP_RESULT:";
55
37
  var mode = process.argv[2];
56
38
  var input = JSON.parse(process.env.HYPERFRAMES_RENDER_SETUP_INPUT ?? "{}");
57
39
  var disposeSignalHandlers = installRenderSetupSignalHandlers(
@@ -60,22 +42,28 @@ var disposeSignalHandlers = installRenderSetupSignalHandlers(
60
42
  (signal) => process.kill(process.pid, signal),
61
43
  process.env.HYPERFRAMES_RENDER_DETACHED !== "1"
62
44
  );
63
- var result;
64
- if (mode === "browser") {
65
- result = await ensureBrowser(input);
66
- } else if (mode === "lint") {
67
- setPriority(constants.priority.PRIORITY_LOW);
68
- result = await lintProject(
69
- input.projectDir,
70
- input.entryFile,
71
- input.host ? { host: input.host } : void 0
72
- );
73
- } else if (mode === "orphan-cleanup") {
74
- const killed = killOrphanedProcesses();
75
- result = killed;
76
- if (killed > 0) await new Promise((resolve) => setTimeout(resolve, 600));
77
- } else {
45
+ async function runMode() {
46
+ if (mode === "browser") return ensureBrowser(input);
47
+ if (mode === "lint") {
48
+ setPriority(constants.priority.PRIORITY_LOW);
49
+ return lintProject(
50
+ input.projectDir,
51
+ input.entryFile,
52
+ input.host ? { host: input.host } : void 0
53
+ );
54
+ }
55
+ if (mode === "orphan-cleanup") {
56
+ const killed = killOrphanedProcesses();
57
+ if (killed > 0) await new Promise((resolve) => setTimeout(resolve, 600));
58
+ return killed;
59
+ }
78
60
  throw new Error(`Unknown render setup mode: ${mode}`);
79
61
  }
80
- disposeSignalHandlers();
81
- process.stdout.write(RESULT_PREFIX + JSON.stringify(result) + "\n");
62
+ try {
63
+ const result = await runMode().finally(disposeSignalHandlers);
64
+ process.stdout.write(renderSetupResultLine(result));
65
+ } catch (error) {
66
+ process.stderr.write(renderSetupErrorLine(error), () => {
67
+ throw error;
68
+ });
69
+ }
@@ -11,13 +11,13 @@ import {
11
11
  resolveItemWithDependencies,
12
12
  resolveItemsByTag,
13
13
  unreachableRegistryMessage
14
- } from "./chunk-HW4AKJ5F.js";
15
- import "./chunk-TAMQYQGJ.js";
14
+ } from "./chunk-BIAC7IJT.js";
15
+ import "./chunk-LAFJSYDL.js";
16
16
  import "./chunk-AWDFDFI3.js";
17
17
  import "./chunk-P6LJ4Y32.js";
18
18
  import "./chunk-GMECXFAN.js";
19
- import "./chunk-4M4EC7JX.js";
20
- import "./chunk-6TPZSTCL.js";
19
+ import "./chunk-VRW6EBHV.js";
20
+ import "./chunk-AUWHD7RA.js";
21
21
  import "./chunk-VC76R6W2.js";
22
22
  import "./chunk-YA62XGXS.js";
23
23
  import "./chunk-MQZVBHEY.js";
@@ -27,7 +27,7 @@ import "./chunk-T76PLPD6.js";
27
27
  import "./chunk-FXMKHHPO.js";
28
28
  import "./chunk-RQVDTPGD.js";
29
29
  import "./chunk-3RM2ETQT.js";
30
- import "./chunk-ZLW2V65P.js";
30
+ import "./chunk-BSQ7XANM.js";
31
31
  import "./chunk-SDYDNHEE.js";
32
32
  import "./chunk-2PSPARWP.js";
33
33
  import "./chunk-T42U2W2R.js";
@@ -0,0 +1,75 @@
1
+ import { createRequire as __hf_createRequire } from "node:module";
2
+ import { fileURLToPath as __hf_fileURLToPath } from "node:url";
3
+ import { dirname as __hf_dirname } from "node:path";
4
+ var require = __hf_createRequire(import.meta.url);
5
+ var __filename = __hf_fileURLToPath(import.meta.url);
6
+ var __dirname = __hf_dirname(__filename);
7
+ import {
8
+ DecodeCancelled,
9
+ PARAKEET_MODEL_DIR,
10
+ SHERPA_RUNTIME_DIR,
11
+ ensureParakeetModel,
12
+ installSherpaRuntime,
13
+ prepareSherpaWav,
14
+ sherpaParakeetInstalled,
15
+ sherpaPlatformPackage,
16
+ sherpaRuntimeLoadError,
17
+ sherpaUnsupportedReason,
18
+ transcribeWithSherpa
19
+ } from "./chunk-GEMJYBRU.js";
20
+ import "./chunk-BXCMXMJQ.js";
21
+ import "./chunk-3DKN5WKL.js";
22
+ import "./chunk-EOVYQ3IG.js";
23
+ import "./chunk-OTHDVXOJ.js";
24
+ import "./chunk-6IHWCZ3W.js";
25
+ import "./chunk-FBCULCAL.js";
26
+ import "./chunk-6BEFEWFB.js";
27
+ import "./chunk-MAYCCGMQ.js";
28
+ import "./chunk-BHVFTYSI.js";
29
+ import "./chunk-ZEUONDQG.js";
30
+ import "./chunk-AMKC3AXA.js";
31
+ import "./chunk-UXO2L7HJ.js";
32
+ import "./chunk-FDT6KQV4.js";
33
+ import "./chunk-NE55C6S5.js";
34
+ import "./chunk-USDEMXXL.js";
35
+ import "./chunk-VRW6EBHV.js";
36
+ import "./chunk-AUWHD7RA.js";
37
+ import "./chunk-VC76R6W2.js";
38
+ import "./chunk-YA62XGXS.js";
39
+ import "./chunk-MQZVBHEY.js";
40
+ import "./chunk-OFQWTKPW.js";
41
+ import "./chunk-DPVXBVLL.js";
42
+ import "./chunk-T76PLPD6.js";
43
+ import "./chunk-FXMKHHPO.js";
44
+ import "./chunk-RQVDTPGD.js";
45
+ import "./chunk-A4Q7W4LV.js";
46
+ import "./chunk-BYSBRF24.js";
47
+ import "./chunk-TWWSYAKJ.js";
48
+ import "./chunk-IEIJRMLZ.js";
49
+ import "./chunk-IWFLMU2N.js";
50
+ import "./chunk-APDLWWFG.js";
51
+ import "./chunk-PJ3HDUCY.js";
52
+ import "./chunk-3RM2ETQT.js";
53
+ import "./chunk-BSQ7XANM.js";
54
+ import "./chunk-SDYDNHEE.js";
55
+ import "./chunk-2PSPARWP.js";
56
+ import "./chunk-T42U2W2R.js";
57
+ import "./chunk-KNU5COPB.js";
58
+ import "./chunk-KBB4RG6F.js";
59
+ import "./chunk-UOFAE5RF.js";
60
+ import "./chunk-IR35BCLK.js";
61
+ import "./chunk-3GXQPCJC.js";
62
+ import "./chunk-M2WBOQ2Q.js";
63
+ export {
64
+ DecodeCancelled,
65
+ PARAKEET_MODEL_DIR,
66
+ SHERPA_RUNTIME_DIR,
67
+ ensureParakeetModel,
68
+ installSherpaRuntime,
69
+ prepareSherpaWav,
70
+ sherpaParakeetInstalled,
71
+ sherpaPlatformPackage,
72
+ sherpaRuntimeLoadError,
73
+ sherpaUnsupportedReason,
74
+ transcribeWithSherpa
75
+ };
@@ -11,10 +11,11 @@ import {
11
11
  droppedSpeechGaps,
12
12
  silenceCuts,
13
13
  spliceGap
14
- } from "./chunk-KDPYVTEU.js";
14
+ } from "./chunk-KBB4RG6F.js";
15
15
  import {
16
16
  readWav
17
17
  } from "./chunk-UOFAE5RF.js";
18
+ import "./chunk-IR35BCLK.js";
18
19
  import "./chunk-M2WBOQ2Q.js";
19
20
 
20
21
  // src/whisper/sherpaWorker.ts
@@ -2,16 +2,8 @@
2
2
  // Workflow wrappers supply resource paths and workflow-specific sections.
3
3
  // The role combines the shared worker contract with the workflow delta.
4
4
 
5
- import {
6
- existsSync,
7
- mkdirSync,
8
- readFileSync,
9
- readdirSync,
10
- realpathSync,
11
- writeFileSync,
12
- } from "node:fs";
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from "node:fs";
13
6
  import { basename, join, resolve } from "node:path";
14
- import { pathToFileURL } from "node:url";
15
7
 
16
8
  export function field(block, name) {
17
9
  const match = block.match(new RegExp(`^-\\s+${name}:\\s*(.+)$`, "im"));
@@ -160,17 +152,7 @@ export function flag(argv, name, fallback) {
160
152
  return index >= 0 && argv[index + 1] ? argv[index + 1] : fallback;
161
153
  }
162
154
 
163
- // realpath both sides: on macOS /tmp → /private/tmp, and node resolves the main
164
- // module's symlinks in import.meta.url while argv[1] keeps the invoked spelling —
165
- // a raw compare silently skips main() when invoked through any symlinked path.
166
- export function isMainModule(importMetaUrl) {
167
- if (!process.argv[1]) return false;
168
- try {
169
- return pathToFileURL(realpathSync(process.argv[1])).href === importMetaUrl;
170
- } catch {
171
- return false;
172
- }
173
- }
155
+ export { isMainModule } from "./main-module.mjs";
174
156
 
175
157
  export function runCli({ buildFramePackets: build, buildRolePayload: buildRole }) {
176
158
  const argv = process.argv.slice(2);
@@ -0,0 +1,13 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ // Node resolves symlinks in the main module's import.meta.url but argv[1] keeps the invoked
5
+ // spelling (a symlinked skills dir, or /tmp vs /private/tmp on macOS), so compare real paths.
6
+ export function isMainModule(importMetaUrl) {
7
+ if (!process.argv[1]) return false;
8
+ try {
9
+ return pathToFileURL(realpathSync(process.argv[1])).href === importMetaUrl;
10
+ } catch {
11
+ return false;
12
+ }
13
+ }
@@ -0,0 +1,51 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { test } from "node:test";
3
+ import { mkdtempSync, readFileSync, readdirSync, rmSync, symlinkSync } from "node:fs";
4
+ import { spawnSync } from "node:child_process";
5
+ import { dirname, join, relative, resolve } from "node:path";
6
+ import { tmpdir } from "node:os";
7
+ import { fileURLToPath } from "node:url";
8
+
9
+ const SKILLS = resolve(dirname(fileURLToPath(import.meta.url)), "../../..");
10
+ const CLI_MEDIA_USE = resolve(SKILLS, "../packages/cli/src/media-use");
11
+
12
+ // Agents install skills by symlinking the skills dir, so each script must still run its CLI.
13
+ test("skill CLIs run when invoked through a symlinked skills dir", () => {
14
+ const dir = mkdtempSync(join(tmpdir(), "skills-link-"));
15
+ try {
16
+ symlinkSync(SKILLS, join(dir, "skills"), "dir");
17
+ for (const script of [
18
+ "faceless-explainer/scripts/captions.mjs",
19
+ "pr-to-video/scripts/captions.mjs",
20
+ "product-launch-video/scripts/captions.mjs",
21
+ "media-use/audio/scripts/heygen-voice.mjs",
22
+ ]) {
23
+ const run = spawnSync(process.execPath, [join(dir, "skills", script), "not-a-command"], {
24
+ encoding: "utf8",
25
+ });
26
+ assert.notEqual(run.status, 0, `${script} exited ${run.status} without running its CLI`);
27
+ assert.match(run.stderr, /usage/, script);
28
+ }
29
+ } finally {
30
+ rmSync(dir, { recursive: true, force: true });
31
+ }
32
+ });
33
+
34
+ function skillScripts(dir) {
35
+ return readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {
36
+ const path = join(dir, entry.name);
37
+ if (entry.isDirectory()) return entry.name === "node_modules" ? [] : skillScripts(path);
38
+ return /\.(mjs|js)$/.test(entry.name) && !/\.test\.mjs$/.test(entry.name) ? [path] : [];
39
+ });
40
+ }
41
+
42
+ test("skill scripts detect their CLI entry through lib/main-module.mjs only", () => {
43
+ const handRolled = [...skillScripts(SKILLS), ...skillScripts(CLI_MEDIA_USE)].filter(
44
+ (path) =>
45
+ !path.endsWith("main-module.mjs") && readFileSync(path, "utf8").includes("process.argv[1]"),
46
+ );
47
+ assert.deepEqual(
48
+ handRolled.map((path) => relative(SKILLS, path)),
49
+ [],
50
+ );
51
+ });
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  // Run from the user's project; locate the release from this installed file.
3
3
  import { spawnSync } from "node:child_process";
4
- import { existsSync, readFileSync, realpathSync } from "node:fs";
4
+ import { existsSync, readFileSync } from "node:fs";
5
5
  import { join, win32 } from "node:path";
6
- import { fileURLToPath, pathToFileURL } from "node:url";
6
+ import { fileURLToPath } from "node:url";
7
+ import { isMainModule } from "./lib/main-module.mjs";
7
8
 
8
9
  const root = fileURLToPath(new URL("../../../", import.meta.url));
9
10
  const manifests = [
@@ -71,7 +72,7 @@ export function invocation(
71
72
  return { command: node, args: [npx, ...cliArgs], env: childEnv };
72
73
  }
73
74
 
74
- if (process.argv[1] && pathToFileURL(realpathSync(process.argv[1])).href === import.meta.url) {
75
+ if (isMainModule(import.meta.url)) {
75
76
  try {
76
77
  const command = invocation(process.argv.slice(2));
77
78
  const result = spawnSync(command.command, command.args, {
@@ -17,11 +17,15 @@ import { invocation, pluginVersion } from "./plugin-cli.mjs";
17
17
  function fixture(t, manifest = "plugin.json", version = "1.2.3") {
18
18
  const root = mkdtempSync(join(tmpdir(), "hf-plugin-"));
19
19
  t.after(() => rmSync(root, { recursive: true, force: true }));
20
- mkdirSync(join(root, "skills/hyperframes/scripts"), { recursive: true });
20
+ mkdirSync(join(root, "skills/hyperframes/scripts/lib"), { recursive: true });
21
21
  mkdirSync(join(root, manifest, ".."), { recursive: true });
22
22
  writeFileSync(join(root, manifest), JSON.stringify({ name: "hyperframes", version }));
23
23
  const launcher = join(root, "skills/hyperframes/scripts/plugin-cli.mjs");
24
24
  copyFileSync(new URL("./plugin-cli.mjs", import.meta.url), launcher);
25
+ copyFileSync(
26
+ new URL("./lib/main-module.mjs", import.meta.url),
27
+ join(root, "skills/hyperframes/scripts/lib/main-module.mjs"),
28
+ );
25
29
  return { root, launcher };
26
30
  }
27
31
 
@@ -130,6 +130,8 @@ Use `selection.target.hfId` when available, otherwise its selector and source fi
130
130
  | Self-managed distributed AWS render | `npx hyperframes lambda render <project> --width 1920 --height 1080 --wait` |
131
131
  | Self-managed distributed GCP render | `npx hyperframes cloudrun render <project> --width 1920 --height 1080 --wait` |
132
132
 
133
+ A render stops when whatever started it stops, so a Ctrl-C or a closed terminal never leaves Chrome running. If your tool kills its whole process group when a command times out or ends, a long render dies with it. Start such a render in its own process group with `HYPERFRAMES_RENDER_DETACHED=1`, for example `bash -c 'set -m; HYPERFRAMES_RENDER_DETACHED=1 npx hyperframes render --output out.mp4 < /dev/null > render.log 2>&1 &'` (works on macOS and Linux), then check the log and the output file instead of waiting on the command.
134
+
133
135
  Skill attribution is automatic — the examples above need no `--skill`. A project scaffolded by a workflow (`hyperframes init --skill=<workflow>`) records its owning skill in `hyperframes.json`, and every later render inherits it on anonymous telemetry: re-renders, `npm run render`, and `--batch` alike. Pass `--skill=<slug>` explicitly only to stamp a project that was not created through a workflow (its first render then persists it).
134
136
 
135
137
  Use cloud rendering when the user wants hosted rendering without local Chrome, FFmpeg, or AWS. Use Lambda only when AWS ownership is a requirement. Use Cloud Run only when GCP ownership is a requirement. Read the matching reference before running any cloud path.
@@ -50,7 +50,7 @@ One command, one Chrome boot. `check` runs the linter first and skips the browse
50
50
 
51
51
  Every finding carries a selector, the element's `data-*` identity, the composition source file, a bbox, and the sample time: jump straight from the JSON to the HTML you must edit and re-run.
52
52
 
53
- **Severity is persistence-aware.** A dynamic issue observed at a single grid sample (an entrance/exit transient) demotes to info and never gates. Issues held across samples gate the exit code, a held `content_overlap` is an error, and a held, partially-visible `canvas_overflow` breaching ≥5% of the canvas promotes to warning. Coordinate-frame findings (`escaped_container`, `panel_out_of_canvas`, `connector_detached`) flag geometry computed in one frame but rendered in another — an element far outside its offset parent, a painted panel stuck across the canvas edge, a connector line detached from every node. Text drawn into a `<canvas>` has no DOM box, so `canvas_overflow` cannot see it; `canvas_content_at_edge` warns when a canvas's pixels show sharp content (drawn text, hard shapes) along the frame edge — mark intentional full-bleed art (particles, photos) with `data-layout-allow-overflow`. If a 3s+ composition shows no visible change across every sample, `check` fails with `sweep_static`: a frozen timeline makes every green verdict unreliable, so it refuses to pass. When only audio advanced, it warns instead; a composition meant to be still takes `data-no-timeline` on its root. The fingerprint includes per-element opacity, so opacity-only reveals (code typing, staggered fades) count as motion — but only while they're still in flight at the sampled times. The classic trap is a reveal that completes early and then holds a static frame for the rest of the duration: every sample lands on the settled state and the run fails. Spread the reveal across the timeline or keep one continuously animated element alive (a blinking caret is idiomatic for code typing) — don't bolt on a slow position drift just to appease the check.
53
+ **Severity is persistence-aware.** A dynamic issue observed at a single grid sample (an entrance/exit transient) demotes to info and never gates. Issues held across samples gate the exit code, a held `content_overlap` is an error, and a held, partially-visible `canvas_overflow` breaching ≥5% of the canvas promotes to warning. Coordinate-frame findings (`escaped_container`, `panel_out_of_canvas`, `connector_detached`) flag geometry computed in one frame but rendered in another — an element far outside its offset parent, a painted panel stuck across the canvas edge, a connector line detached from every node. Text drawn into a `<canvas>` has no DOM box, so `canvas_overflow` cannot see it; `canvas_content_at_edge` warns when a canvas's pixels show sharp content (drawn text, hard shapes) along the frame edge — mark intentional full-bleed art (particles, photos) with `data-layout-allow-overflow`. If a 3s+ composition shows no visible change across every sample, `check` fails with `sweep_static`: a frame that never changes while a GSAP timeline or tween, or a CSS or Web animation, holds the same time without ever finishing means the seek is not driving the page, so it refuses to pass. Any other frame that never changes (a still title card, an audio-only advance) is a warning that `--strict` fails; a composition meant to be still can take `data-no-timeline` on its root to skip it. The fingerprint includes per-element opacity, so opacity-only reveals (code typing, staggered fades) count as motion — but only while they're still in flight at the sampled times. The classic trap is a reveal that completes early and then holds a static frame for the rest of the duration: every sample lands on the settled state and check warns that nothing on screen moved (`--strict` fails it). Spread the reveal across the timeline or keep one continuously animated element alive (a blinking caret is idiomatic for code typing) — don't bolt on a slow position drift just to appease the check.
54
54
 
55
55
  **Escape hatches** (mark intent in the HTML, then re-run):
56
56
 
@@ -5,9 +5,9 @@
5
5
 
6
6
  import { readFileSync } from "node:fs";
7
7
  import { extname } from "node:path";
8
- import { fileURLToPath } from "node:url";
9
8
  import { parseArgs } from "node:util";
10
9
  import { heygenAuthHeaders, heygenJSON, heygenMessage, loadEnvFromDir } from "./lib/heygen.mjs";
10
+ import { isMainModule } from "./lib/main-module.mjs";
11
11
 
12
12
  const MEDIA_TYPES = { ".mp3": "audio/mpeg", ".wav": "audio/wav" };
13
13
  const POLL_MS = 2_000;
@@ -92,7 +92,7 @@ export async function main(
92
92
  }
93
93
  }
94
94
 
95
- if (process.argv[1] === fileURLToPath(import.meta.url)) {
95
+ if (isMainModule(import.meta.url)) {
96
96
  loadEnvFromDir(process.cwd());
97
97
  process.exitCode = await main(process.argv.slice(2));
98
98
  }
@@ -0,0 +1,13 @@
1
+ import { realpathSync } from "node:fs";
2
+ import { pathToFileURL } from "node:url";
3
+
4
+ // Node resolves symlinks in the main module's import.meta.url but argv[1] keeps the invoked
5
+ // spelling (a symlinked skills dir, or /tmp vs /private/tmp on macOS), so compare real paths.
6
+ export function isMainModule(importMetaUrl) {
7
+ if (!process.argv[1]) return false;
8
+ try {
9
+ return pathToFileURL(realpathSync(process.argv[1])).href === importMetaUrl;
10
+ } catch {
11
+ return false;
12
+ }
13
+ }