@mevdragon/vidfarm-devcli 0.14.0 → 0.16.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (427) hide show
  1. package/.agents/skills/embedded-captions/CATALOG.md +93 -0
  2. package/.agents/skills/embedded-captions/SKILL.md +286 -0
  3. package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
  4. package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
  5. package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
  6. package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
  7. package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
  8. package/.agents/skills/embedded-captions/dna/README.md +148 -0
  9. package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
  10. package/.agents/skills/embedded-captions/dna/cream.json +69 -0
  11. package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
  12. package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
  13. package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
  14. package/.agents/skills/embedded-captions/dna/ink.json +65 -0
  15. package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
  16. package/.agents/skills/embedded-captions/dna/loud.json +75 -0
  17. package/.agents/skills/embedded-captions/dna/neon.json +58 -0
  18. package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
  19. package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
  20. package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
  21. package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
  22. package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
  23. package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
  24. package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
  25. package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
  26. package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
  27. package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
  28. package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
  29. package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
  30. package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
  31. package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
  32. package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
  33. package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
  34. package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
  35. package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
  36. package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
  37. package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
  38. package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
  39. package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
  40. package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
  41. package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
  42. package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
  43. package/.agents/skills/embedded-captions/references/rail.md +68 -0
  44. package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
  45. package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
  46. package/.agents/skills/embedded-captions/references/test-set.md +66 -0
  47. package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
  48. package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
  49. package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
  50. package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
  51. package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
  52. package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
  53. package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
  54. package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
  55. package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
  56. package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
  57. package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
  58. package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
  59. package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
  60. package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
  61. package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
  62. package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
  63. package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
  64. package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
  65. package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
  66. package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
  67. package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
  68. package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
  69. package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
  70. package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
  71. package/.agents/skills/embedded-captions/themes/README.md +244 -0
  72. package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
  73. package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
  74. package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
  75. package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
  76. package/.agents/skills/embedded-captions/themes/brush.json +74 -0
  77. package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
  78. package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
  79. package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
  80. package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
  81. package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
  82. package/.agents/skills/embedded-captions/themes/laser.json +46 -0
  83. package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
  84. package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
  85. package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
  86. package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
  87. package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
  88. package/.agents/skills/embedded-captions/themes/popup.json +46 -0
  89. package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
  90. package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
  91. package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
  92. package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
  93. package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
  94. package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
  95. package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
  96. package/.agents/skills/embedded-captions/themes/transit.json +44 -0
  97. package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
  98. package/.agents/skills/faceless-explainer/SKILL.md +209 -0
  99. package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
  100. package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
  101. package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
  102. package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
  103. package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
  104. package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
  105. package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
  106. package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
  107. package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
  108. package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
  109. package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
  110. package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
  111. package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
  112. package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
  113. package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
  114. package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
  115. package/.agents/skills/flockposter/LICENSE +17 -0
  116. package/.agents/skills/flockposter/README.md +72 -0
  117. package/.agents/skills/flockposter/SKILL.md +562 -0
  118. package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
  119. package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
  120. package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
  121. package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
  122. package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
  123. package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
  124. package/.agents/skills/general-video/SKILL.md +143 -0
  125. package/.agents/skills/hyperframes/SKILL.md +160 -0
  126. package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
  127. package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
  128. package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
  129. package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
  130. package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
  131. package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
  132. package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
  133. package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
  134. package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
  135. package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
  136. package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
  137. package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
  138. package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
  139. package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
  140. package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
  141. package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
  142. package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
  143. package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
  144. package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
  145. package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
  146. package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
  147. package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
  148. package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
  149. package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
  150. package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
  151. package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
  152. package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
  153. package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
  154. package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
  155. package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
  156. package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
  157. package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
  158. package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
  159. package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
  160. package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
  161. package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
  162. package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
  163. package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
  164. package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
  165. package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
  166. package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
  167. package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
  168. package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
  169. package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
  170. package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
  171. package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
  172. package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
  173. package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
  174. package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
  175. package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
  176. package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
  177. package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
  178. package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
  179. package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
  180. package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
  181. package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
  182. package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
  183. package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
  184. package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
  185. package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
  186. package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
  187. package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
  188. package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
  189. package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
  190. package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
  191. package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
  192. package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
  193. package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
  194. package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
  195. package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
  196. package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
  197. package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
  198. package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
  199. package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
  200. package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
  201. package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
  202. package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
  203. package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
  204. package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
  205. package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
  206. package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
  207. package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
  208. package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
  209. package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
  210. package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
  211. package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
  212. package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
  213. package/.agents/skills/hyperframes-animation/techniques.md +507 -0
  214. package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
  215. package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
  216. package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
  217. package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
  218. package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
  219. package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
  220. package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
  221. package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
  222. package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
  223. package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
  224. package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
  225. package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
  226. package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
  227. package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
  228. package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
  229. package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
  230. package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
  231. package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
  232. package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
  233. package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
  234. package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
  235. package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
  236. package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
  237. package/.agents/skills/hyperframes-core/SKILL.md +78 -0
  238. package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
  239. package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
  240. package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
  241. package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
  242. package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
  243. package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
  244. package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
  245. package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
  246. package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
  247. package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
  248. package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
  249. package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
  250. package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
  251. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
  252. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
  253. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
  254. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
  255. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
  256. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
  257. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
  258. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
  259. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
  260. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
  261. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
  262. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
  263. package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
  264. package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
  265. package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
  266. package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
  267. package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
  268. package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
  269. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
  270. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
  271. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
  272. package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
  273. package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
  274. package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
  275. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
  276. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
  277. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
  278. package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
  279. package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
  280. package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
  281. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
  282. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
  283. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
  284. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
  285. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
  286. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
  287. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
  288. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
  289. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
  290. package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
  291. package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
  292. package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
  293. package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
  294. package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
  295. package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
  296. package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
  297. package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
  298. package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
  299. package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
  300. package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
  301. package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
  302. package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
  303. package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
  304. package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
  305. package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
  306. package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
  307. package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
  308. package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
  309. package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
  310. package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
  311. package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
  312. package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
  313. package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
  314. package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
  315. package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
  316. package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
  317. package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
  318. package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
  319. package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
  320. package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
  321. package/.agents/skills/motion-graphics/SKILL.md +172 -0
  322. package/.agents/skills/motion-graphics/agents/builder.md +40 -0
  323. package/.agents/skills/motion-graphics/agents/director.md +53 -0
  324. package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
  325. package/.agents/skills/motion-graphics/catalog-map.md +40 -0
  326. package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
  327. package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
  328. package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
  329. package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
  330. package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
  331. package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
  332. package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
  333. package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
  334. package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
  335. package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
  336. package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
  337. package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
  338. package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
  339. package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
  340. package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
  341. package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
  342. package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
  343. package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
  344. package/.agents/skills/product-launch-video/SKILL.md +208 -0
  345. package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
  346. package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
  347. package/.agents/skills/product-launch-video/references/story-design.md +373 -0
  348. package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
  349. package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
  350. package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
  351. package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
  352. package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
  353. package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
  354. package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
  355. package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
  356. package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
  357. package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
  358. package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
  359. package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
  360. package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
  361. package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
  362. package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
  363. package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
  364. package/.agents/skills/slideshow/SKILL.md +550 -0
  365. package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
  366. package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
  367. package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
  368. package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
  369. package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
  370. package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
  371. package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
  372. package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
  373. package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
  374. package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
  375. package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
  376. package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
  377. package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
  378. package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
  379. package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
  380. package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
  381. package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
  382. package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
  383. package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
  384. package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
  385. package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
  386. package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
  387. package/.agents/skills/vidfarm-media/SKILL.md +85 -0
  388. package/.agents/skills/vidfarm-media/references/tts.md +54 -0
  389. package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
  390. package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
  391. package/.agents/skills/website-to-video/SKILL.md +145 -0
  392. package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
  393. package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
  394. package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
  395. package/.agents/skills/website-to-video/references/capabilities.md +713 -0
  396. package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
  397. package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
  398. package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
  399. package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
  400. package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
  401. package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
  402. package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
  403. package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
  404. package/SKILL.director.md +37 -0
  405. package/SKILL.platform.md +6 -1
  406. package/demo/dist/app.css +1 -1
  407. package/demo/dist/app.js +369 -85
  408. package/dist/src/app.js +630 -140
  409. package/dist/src/cli.js +529 -12
  410. package/dist/src/composition-runtime.js +262 -3
  411. package/dist/src/config.js +13 -0
  412. package/dist/src/devcli/doctor.js +192 -0
  413. package/dist/src/devcli/hyperframes-cli.js +118 -0
  414. package/dist/src/devcli/skills.js +476 -0
  415. package/dist/src/devcli/stills.js +249 -0
  416. package/dist/src/editor-chat.js +256 -0
  417. package/dist/src/frontend/homepage-client.js +50 -1
  418. package/dist/src/frontend/homepage-shared.js +197 -0
  419. package/dist/src/frontend/homepage-store.js +10 -1
  420. package/dist/src/frontend/homepage-view.js +43 -5
  421. package/dist/src/homepage.js +51 -18
  422. package/dist/src/hyperframes/composition.js +5 -5
  423. package/dist/src/services/composition-lint.js +199 -0
  424. package/dist/src/services/hyperframes.js +67 -13
  425. package/dist/src/services/serverless-records.js +9 -0
  426. package/package.json +2 -1
  427. package/public/assets/homepage-client-app.js +23 -23
@@ -0,0 +1,476 @@
1
+ // `vidfarm skills` — install/refresh multi-file agent skills into a project.
2
+ //
3
+ // Layout convention (matches how the vidfarm repo itself is set up):
4
+ // <root>/.agents/skills/<name>/ canonical install target
5
+ // <root>/.claude/skills/<name> RELATIVE symlink → ../../.agents/skills/<name>
6
+ // (falls back to a real copy where
7
+ // symlinks are unavailable, e.g. Windows)
8
+ // <root>/skills-lock.json merged lock file (other tools'
9
+ // entries are preserved verbatim)
10
+ //
11
+ // Root resolution (defuses the cwd trap): --dir wins; else walk UP from cwd to
12
+ // the first directory containing .agents/skills or .git; else cwd.
13
+ //
14
+ // Sources, in order:
15
+ // (a) LOCAL — the vidfarm repo's own .agents/skills/<name>, found by walking
16
+ // up from this module's directory (same walk-up pattern as
17
+ // locateBundledSkill in src/cli.ts).
18
+ // (b) REMOTE — the vidfarm skill-pack routes on
19
+ // `${--host || VIDFARM_SKILLS_HOST || VIDFARM_HOST || https://vidfarm.cc}`:
20
+ // GET /skill-pack/index.json → { skills: [{ name, description }] }
21
+ // GET /skill-pack/:name/manifest.json → { name, files: [{ path, size, sha256 }] }
22
+ // GET /skill-pack/:name/files/<relpath> → raw bytes
23
+ // Every downloaded file's sha256 is verified against the manifest.
24
+ import { createHash } from "node:crypto";
25
+ import { cpSync, existsSync, lstatSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, symlinkSync, unlinkSync, writeFileSync } from "node:fs";
26
+ import path from "node:path";
27
+ import { fileURLToPath } from "node:url";
28
+ import { parseArgs } from "node:util";
29
+ const DEFAULT_SKILLS_HOST = "https://vidfarm.cc";
30
+ const GREEN = "\x1b[32m";
31
+ const RED = "\x1b[31m";
32
+ const DIM = "\x1b[2m";
33
+ const BOLD = "\x1b[1m";
34
+ const RESET = "\x1b[0m";
35
+ // ── Root + source resolution ────────────────────────────────────────────────
36
+ /** --dir wins; else walk UP from cwd to the first dir with .agents/skills or .git; else cwd. */
37
+ export function resolveSkillsRoot(dirFlag) {
38
+ if (dirFlag)
39
+ return path.resolve(process.cwd(), dirFlag);
40
+ let dir = process.cwd();
41
+ for (let i = 0; i < 24; i += 1) {
42
+ if (existsSync(path.join(dir, ".agents", "skills")) || existsSync(path.join(dir, ".git"))) {
43
+ return dir;
44
+ }
45
+ const parent = path.dirname(dir);
46
+ if (parent === dir)
47
+ break;
48
+ dir = parent;
49
+ }
50
+ return process.cwd();
51
+ }
52
+ /** Walk up from this module (mirrors locateBundledSkill in src/cli.ts) to the
53
+ * vidfarm repo/package root that carries its own .agents/skills. */
54
+ function locateLocalSkillsSource() {
55
+ let dir = path.dirname(fileURLToPath(import.meta.url));
56
+ for (let i = 0; i < 6; i += 1) {
57
+ const candidate = path.join(dir, ".agents", "skills");
58
+ if (existsSync(candidate))
59
+ return candidate;
60
+ const parent = path.dirname(dir);
61
+ if (parent === dir)
62
+ break;
63
+ dir = parent;
64
+ }
65
+ return null;
66
+ }
67
+ function resolveSkillsHost(hostFlag) {
68
+ const raw = hostFlag
69
+ || process.env.VIDFARM_SKILLS_HOST
70
+ || process.env.VIDFARM_HOST
71
+ || DEFAULT_SKILLS_HOST;
72
+ return raw.replace(/\/+$/, "");
73
+ }
74
+ // ── Hashing ─────────────────────────────────────────────────────────────────
75
+ /**
76
+ * Lock-file hash algorithm (locally reproducible):
77
+ * sha256 over the concatenation of, for EACH file sorted by its posix-style
78
+ * relative path: `${relpath}\0${bytes}\0` — i.e. the UTF-8 relpath, a NUL
79
+ * byte, the raw file bytes, and a trailing NUL byte, files in sorted order.
80
+ */
81
+ export function computeSkillHash(files) {
82
+ const hash = createHash("sha256");
83
+ const sorted = [...files].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
84
+ for (const file of sorted) {
85
+ hash.update(Buffer.from(file.path, "utf8"));
86
+ hash.update(Buffer.from([0]));
87
+ hash.update(file.bytes);
88
+ hash.update(Buffer.from([0]));
89
+ }
90
+ return hash.digest("hex");
91
+ }
92
+ function sha256Hex(bytes) {
93
+ return createHash("sha256").update(bytes).digest("hex");
94
+ }
95
+ function readSkillDirFiles(skillDir) {
96
+ const files = [];
97
+ const walk = (dir, prefix) => {
98
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
99
+ const abs = path.join(dir, entry.name);
100
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
101
+ if (entry.isDirectory()) {
102
+ walk(abs, rel);
103
+ }
104
+ else if (entry.isFile() || entry.isSymbolicLink()) {
105
+ try {
106
+ files.push({ path: rel, bytes: readFileSync(abs) });
107
+ }
108
+ catch {
109
+ // unreadable entry — skip rather than abort the whole install
110
+ }
111
+ }
112
+ }
113
+ };
114
+ walk(skillDir, "");
115
+ return files;
116
+ }
117
+ async function fetchSkillPackIndex(host) {
118
+ const res = await fetch(`${host}/skill-pack/index.json`, { headers: { accept: "application/json" } });
119
+ if (!res.ok)
120
+ throw new Error(`GET ${host}/skill-pack/index.json → ${res.status}`);
121
+ const json = await res.json().catch(() => null);
122
+ const skills = Array.isArray(json?.skills) ? json.skills : [];
123
+ return skills
124
+ .filter((entry) => entry && typeof entry.name === "string")
125
+ .map((entry) => ({ name: entry.name, description: typeof entry.description === "string" ? entry.description : undefined }));
126
+ }
127
+ /** Manifest path → posix-relative path, refusing traversal segments. */
128
+ function normalizeManifestPath(name, rawPath) {
129
+ const rel = rawPath.replace(/\\/g, "/").replace(/^\/+/, "");
130
+ if (rel.split("/").some((segment) => segment === "..")) {
131
+ throw new Error(`skill-pack manifest for "${name}" contains an unsafe path: ${rawPath}`);
132
+ }
133
+ return rel;
134
+ }
135
+ async function fetchSkillManifestEntries(host, name) {
136
+ const manifestUrl = `${host}/skill-pack/${encodeURIComponent(name)}/manifest.json`;
137
+ const manifestRes = await fetch(manifestUrl, { headers: { accept: "application/json" } });
138
+ if (!manifestRes.ok)
139
+ throw new Error(`GET ${manifestUrl} → ${manifestRes.status}`);
140
+ const manifest = await manifestRes.json().catch(() => null);
141
+ const entries = Array.isArray(manifest?.files)
142
+ ? manifest.files.filter((f) => f && typeof f.path === "string")
143
+ : [];
144
+ if (entries.length === 0)
145
+ throw new Error(`skill-pack manifest for "${name}" lists no files.`);
146
+ return entries;
147
+ }
148
+ /** True when the manifest's per-file {path → sha256} set exactly matches the
149
+ * locally installed pack — every file present, hashes equal, no extras. Any
150
+ * manifest entry without a sha256 means we cannot verify → false (download). */
151
+ function localPackMatchesManifest(root, name, entries) {
152
+ const skillDir = path.join(root, ".agents", "skills", name);
153
+ if (!existsSync(skillDir))
154
+ return false;
155
+ let local;
156
+ try {
157
+ local = readSkillDirFiles(skillDir);
158
+ }
159
+ catch {
160
+ return false;
161
+ }
162
+ if (local.length !== entries.length)
163
+ return false;
164
+ const localHashes = new Map(local.map((file) => [file.path, sha256Hex(file.bytes)]));
165
+ for (const entry of entries) {
166
+ const expected = entry.sha256?.trim().toLowerCase();
167
+ if (!expected)
168
+ return false;
169
+ const rel = normalizeManifestPath(name, entry.path);
170
+ if (localHashes.get(rel) !== expected)
171
+ return false;
172
+ }
173
+ return true;
174
+ }
175
+ // Bounded download parallelism — plenty for small skill files without
176
+ // hammering the host or tripping per-origin connection limits.
177
+ const REMOTE_FETCH_BATCH = 8;
178
+ async function fetchRemoteSkillFiles(host, name) {
179
+ const entries = await fetchSkillManifestEntries(host, name);
180
+ // Validate every path up front (before any network round-trip)…
181
+ const rels = entries.map((entry) => normalizeManifestPath(name, entry.path));
182
+ // …then download in bounded batches, preserving manifest order and applying
183
+ // the same per-file sha256 verification as the sequential version.
184
+ const files = new Array(entries.length);
185
+ for (let start = 0; start < entries.length; start += REMOTE_FETCH_BATCH) {
186
+ const batch = entries.slice(start, start + REMOTE_FETCH_BATCH);
187
+ await Promise.all(batch.map(async (entry, offset) => {
188
+ const index = start + offset;
189
+ const rel = rels[index];
190
+ const fileUrl = `${host}/skill-pack/${encodeURIComponent(name)}/files/${rel.split("/").map(encodeURIComponent).join("/")}`;
191
+ const res = await fetch(fileUrl);
192
+ if (!res.ok)
193
+ throw new Error(`GET ${fileUrl} → ${res.status}`);
194
+ const bytes = Buffer.from(await res.arrayBuffer());
195
+ if (typeof entry.sha256 === "string" && entry.sha256.trim()) {
196
+ const actual = sha256Hex(bytes);
197
+ if (actual !== entry.sha256.trim().toLowerCase()) {
198
+ throw new Error(`sha256 mismatch for ${name}/${rel}: manifest ${entry.sha256}, downloaded ${actual}.`);
199
+ }
200
+ }
201
+ files[index] = { path: rel, bytes };
202
+ }));
203
+ }
204
+ return files;
205
+ }
206
+ // ── Lock file ───────────────────────────────────────────────────────────────
207
+ function readLockFile(root) {
208
+ const lockPath = path.join(root, "skills-lock.json");
209
+ if (!existsSync(lockPath))
210
+ return { version: 1, skills: {} };
211
+ try {
212
+ const parsed = JSON.parse(readFileSync(lockPath, "utf8"));
213
+ if (!parsed || typeof parsed !== "object")
214
+ return { version: 1, skills: {} };
215
+ if (!parsed.skills || typeof parsed.skills !== "object")
216
+ parsed.skills = {};
217
+ if (typeof parsed.version !== "number")
218
+ parsed.version = 1;
219
+ return parsed;
220
+ }
221
+ catch {
222
+ throw new Error(`${lockPath} is not valid JSON — fix or remove it before installing skills.`);
223
+ }
224
+ }
225
+ // MERGE, never clobber: entries owned by other tools (sourceType !== "vidfarm")
226
+ // ride through untouched.
227
+ function writeLockFile(root, lock) {
228
+ const lockPath = path.join(root, "skills-lock.json");
229
+ const sortedSkills = {};
230
+ for (const name of Object.keys(lock.skills).sort())
231
+ sortedSkills[name] = lock.skills[name];
232
+ writeFileSync(lockPath, `${JSON.stringify({ ...lock, skills: sortedSkills }, null, 2)}\n`, "utf8");
233
+ return lockPath;
234
+ }
235
+ // ── Install machinery ───────────────────────────────────────────────────────
236
+ function writeSkillFiles(root, name, files) {
237
+ const target = path.join(root, ".agents", "skills", name);
238
+ rmSync(target, { recursive: true, force: true });
239
+ for (const file of files) {
240
+ const dest = path.join(target, ...file.path.split("/"));
241
+ const resolved = path.resolve(dest);
242
+ if (resolved !== path.resolve(target) && !resolved.startsWith(`${path.resolve(target)}${path.sep}`)) {
243
+ throw new Error(`Refusing to write outside the skill dir: ${file.path}`);
244
+ }
245
+ mkdirSync(path.dirname(dest), { recursive: true });
246
+ writeFileSync(dest, file.bytes);
247
+ }
248
+ return target;
249
+ }
250
+ /** RELATIVE symlink <root>/.claude/skills/<name> → ../../.agents/skills/<name>;
251
+ * a real copy where symlink creation fails (e.g. Windows without dev mode). */
252
+ function linkClaudeSkill(root, name) {
253
+ const claudeDir = path.join(root, ".claude", "skills");
254
+ mkdirSync(claudeDir, { recursive: true });
255
+ const linkPath = path.join(claudeDir, name);
256
+ const relativeTarget = path.join("..", "..", ".agents", "skills", name);
257
+ let existing = null;
258
+ try {
259
+ existing = lstatSync(linkPath);
260
+ }
261
+ catch {
262
+ // nothing there yet
263
+ }
264
+ if (existing) {
265
+ // unlinkSync handles symlinks (even ones pointing at directories) and
266
+ // plain files; only a REAL directory (previous copy-mode install) needs
267
+ // the recursive remove.
268
+ if (existing.isDirectory())
269
+ rmSync(linkPath, { recursive: true, force: true });
270
+ else
271
+ unlinkSync(linkPath);
272
+ }
273
+ try {
274
+ symlinkSync(relativeTarget, linkPath, "junction");
275
+ return { mode: "symlink", path: linkPath };
276
+ }
277
+ catch {
278
+ cpSync(path.join(root, ".agents", "skills", name), linkPath, { recursive: true });
279
+ return { mode: "copy", path: linkPath };
280
+ }
281
+ }
282
+ async function installSkill(root, name, host) {
283
+ // (a) LOCAL: the vidfarm repo's own bundled copy wins when reachable.
284
+ const localSource = locateLocalSkillsSource();
285
+ let files = null;
286
+ let source = "vidfarm-repo";
287
+ if (localSource && existsSync(path.join(localSource, name))) {
288
+ files = readSkillDirFiles(path.join(localSource, name));
289
+ if (files.length === 0)
290
+ files = null;
291
+ }
292
+ // (b) REMOTE: the vidfarm skill-pack routes.
293
+ if (!files) {
294
+ files = await fetchRemoteSkillFiles(host, name);
295
+ source = host;
296
+ }
297
+ writeSkillFiles(root, name, files);
298
+ const link = linkClaudeSkill(root, name);
299
+ const hash = computeSkillHash(files);
300
+ const lock = readLockFile(root);
301
+ lock.skills[name] = {
302
+ ...(lock.skills[name] ?? {}),
303
+ source,
304
+ sourceType: "vidfarm",
305
+ skillPath: `.agents/skills/${name}`,
306
+ computedHash: hash
307
+ };
308
+ writeLockFile(root, lock);
309
+ return { name, source, files: files.length, hash, linkMode: link.mode };
310
+ }
311
+ // ── Subcommands ─────────────────────────────────────────────────────────────
312
+ async function runList(root, host, json) {
313
+ const lock = readLockFile(root);
314
+ const skillsDir = path.join(root, ".agents", "skills");
315
+ const onDisk = existsSync(skillsDir)
316
+ ? readdirSync(skillsDir).filter((name) => {
317
+ try {
318
+ return statSync(path.join(skillsDir, name)).isDirectory();
319
+ }
320
+ catch {
321
+ return false;
322
+ }
323
+ })
324
+ : [];
325
+ const installedNames = [...new Set([...Object.keys(lock.skills), ...onDisk])].sort();
326
+ const installed = installedNames.map((name) => ({
327
+ name,
328
+ on_disk: onDisk.includes(name),
329
+ source: lock.skills[name]?.source ?? null,
330
+ source_type: lock.skills[name]?.sourceType ?? null
331
+ }));
332
+ let available = [];
333
+ let availableSource = host;
334
+ try {
335
+ available = await fetchSkillPackIndex(host);
336
+ }
337
+ catch {
338
+ const localSource = locateLocalSkillsSource();
339
+ if (localSource) {
340
+ availableSource = "vidfarm-repo";
341
+ available = readdirSync(localSource)
342
+ .filter((name) => existsSync(path.join(localSource, name, "SKILL.md")))
343
+ .map((name) => ({ name }));
344
+ }
345
+ }
346
+ if (json) {
347
+ process.stdout.write(`${JSON.stringify({ ok: true, root, installed, available, available_source: availableSource }, null, 2)}\n`);
348
+ return;
349
+ }
350
+ console.log(`${BOLD}Installed${RESET} ${DIM}(${root}/.agents/skills + skills-lock.json)${RESET}`);
351
+ if (installed.length === 0)
352
+ console.log(` ${DIM}(none)${RESET}`);
353
+ for (const entry of installed) {
354
+ const flags = [
355
+ entry.on_disk ? null : "missing on disk",
356
+ entry.source_type && entry.source_type !== "vidfarm" ? entry.source_type : null
357
+ ].filter(Boolean).join(", ");
358
+ console.log(` ${entry.name}${entry.source ? ` ${DIM}${entry.source}${flags ? ` [${flags}]` : ""}${RESET}` : flags ? ` ${DIM}[${flags}]${RESET}` : ""}`);
359
+ }
360
+ console.log("");
361
+ console.log(`${BOLD}Available${RESET} ${DIM}(${availableSource})${RESET}`);
362
+ const installedSet = new Set(installedNames);
363
+ for (const entry of available) {
364
+ const mark = installedSet.has(entry.name) ? `${GREEN}✓${RESET} ` : " ";
365
+ console.log(`${mark}${entry.name}${entry.description ? ` ${DIM}${entry.description}${RESET}` : ""}`);
366
+ }
367
+ if (available.length === 0)
368
+ console.log(` ${DIM}(index unavailable)${RESET}`);
369
+ console.log("");
370
+ console.log(`${DIM}Install with: vidfarm skills add <names…>${RESET}`);
371
+ }
372
+ async function runAdd(root, host, names, json) {
373
+ if (names.length === 0)
374
+ throw new Error("skills add requires one or more skill names: `vidfarm skills add hyperframes motion-graphics`.");
375
+ const installed = [];
376
+ for (const name of names) {
377
+ installed.push(await installSkill(root, name, host));
378
+ }
379
+ if (json) {
380
+ process.stdout.write(`${JSON.stringify({ ok: true, root, installed }, null, 2)}\n`);
381
+ return;
382
+ }
383
+ for (const entry of installed) {
384
+ console.log(`${GREEN}Installed ${entry.name}${RESET} ${DIM}(${entry.files} files from ${entry.source}; .claude/skills/${entry.name} ${entry.linkMode})${RESET}`);
385
+ }
386
+ console.log(`${DIM}Lock updated: ${path.join(root, "skills-lock.json")}${RESET}`);
387
+ }
388
+ async function runUpdate(root, host, json) {
389
+ const lock = readLockFile(root);
390
+ const vidfarmSkills = Object.entries(lock.skills).filter(([, entry]) => entry.sourceType === "vidfarm");
391
+ if (vidfarmSkills.length === 0) {
392
+ if (json)
393
+ process.stdout.write(`${JSON.stringify({ ok: true, root, updated: [], note: "no vidfarm-sourced skills in the lock file" }, null, 2)}\n`);
394
+ else
395
+ console.log(`${DIM}No vidfarm-sourced skills in ${path.join(root, "skills-lock.json")} — nothing to update.${RESET}`);
396
+ return;
397
+ }
398
+ const results = [];
399
+ // installSkill prefers the local repo copy whenever one is reachable — the
400
+ // remote short-circuit below only applies when the pack would actually be
401
+ // downloaded (no bundled copy of that skill next to this module).
402
+ const localSource = locateLocalSkillsSource();
403
+ for (const [name, entry] of vidfarmSkills) {
404
+ const previousHash = entry.computedHash;
405
+ try {
406
+ // Re-fetch honoring the entry's original source: repo-sourced entries
407
+ // refresh from the repo copy; host-sourced entries from their host.
408
+ const entryHost = entry.source && entry.source !== "vidfarm-repo" ? entry.source.replace(/\/+$/, "") : host;
409
+ const usesLocalSource = Boolean(localSource && existsSync(path.join(localSource, name)));
410
+ if (!usesLocalSource) {
411
+ // Cheap short-circuit: fetch ONLY the manifest and diff its per-file
412
+ // sha256 set against the installed files — skip every byte download
413
+ // when nothing changed. (The lock's computedHash covers file BYTES,
414
+ // so hashing the local files against the manifest is the
415
+ // lock-compatible comparison.)
416
+ try {
417
+ const manifestEntries = await fetchSkillManifestEntries(entryHost, name);
418
+ if (localPackMatchesManifest(root, name, manifestEntries)) {
419
+ linkClaudeSkill(root, name); // repair a missing .claude link; no downloads
420
+ results.push({ name, status: "unchanged" });
421
+ continue;
422
+ }
423
+ }
424
+ catch {
425
+ // manifest probe failed — fall through to the full install, whose
426
+ // error reporting is authoritative.
427
+ }
428
+ }
429
+ const result = await installSkill(root, name, entryHost);
430
+ results.push({ name, status: result.hash === previousHash ? "unchanged" : "changed" });
431
+ }
432
+ catch (error) {
433
+ results.push({ name, status: "failed", detail: error instanceof Error ? error.message : String(error) });
434
+ }
435
+ }
436
+ if (json) {
437
+ process.stdout.write(`${JSON.stringify({ ok: results.every((r) => r.status !== "failed"), root, updated: results }, null, 2)}\n`);
438
+ }
439
+ else {
440
+ for (const result of results) {
441
+ const color = result.status === "changed" ? GREEN : result.status === "failed" ? RED : DIM;
442
+ console.log(`${color}${result.status.padEnd(9)}${RESET} ${result.name}${result.detail ? ` ${DIM}${result.detail}${RESET}` : ""}`);
443
+ }
444
+ }
445
+ if (results.some((r) => r.status === "failed"))
446
+ process.exitCode = 1;
447
+ }
448
+ export async function runSkillsCommand(argv) {
449
+ const parsed = parseArgs({
450
+ args: argv,
451
+ allowPositionals: true,
452
+ options: {
453
+ dir: { type: "string" },
454
+ host: { type: "string" },
455
+ json: { type: "boolean", default: false }
456
+ }
457
+ });
458
+ const sub = parsed.positionals[0] ?? "list";
459
+ const root = resolveSkillsRoot(parsed.values.dir);
460
+ const host = resolveSkillsHost(parsed.values.host);
461
+ const json = Boolean(parsed.values.json);
462
+ switch (sub) {
463
+ case "list":
464
+ await runList(root, host, json);
465
+ return;
466
+ case "add":
467
+ await runAdd(root, host, parsed.positionals.slice(1), json);
468
+ return;
469
+ case "update":
470
+ await runUpdate(root, host, json);
471
+ return;
472
+ default:
473
+ throw new Error(`Unknown skills subcommand "${sub}". Use: vidfarm skills <list|add <names…>|update> [--dir <root>] [--host <url>]`);
474
+ }
475
+ }
476
+ //# sourceMappingURL=skills.js.map