wizz-method 1.0.3 → 1.1.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 (630) hide show
  1. package/package.json +4 -2
  2. package/skills-registry.yaml +318 -0
  3. package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +7 -0
  4. package/src/core-skills/wizz-editorial-review-prose/SKILL.md +20 -45
  5. package/src/core-skills/wizz-party-mode/customize.toml +894 -0
  6. package/src/core-skills/wizz-party-mode/scripts/__pycache__/resolve_party.cpython-314.pyc +0 -0
  7. package/src/core-skills/wizz-review-adversarial-general/SKILL.md +23 -12
  8. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +47 -23
  9. package/src/skills-lib/ab-test-setup/SKILL.md +266 -0
  10. package/src/skills-lib/ab-test-setup/evals/evals.json +105 -0
  11. package/src/skills-lib/ab-test-setup/references/sample-size-guide.md +263 -0
  12. package/src/skills-lib/ab-test-setup/references/test-templates.md +277 -0
  13. package/src/skills-lib/ad-creative/SKILL.md +362 -0
  14. package/src/skills-lib/ad-creative/evals/evals.json +90 -0
  15. package/src/skills-lib/ad-creative/references/generative-tools.md +637 -0
  16. package/src/skills-lib/ad-creative/references/platform-specs.md +213 -0
  17. package/src/skills-lib/adversarial-reviewer/SKILL.md +122 -0
  18. package/src/skills-lib/agent-browser/SKILL.md +139 -0
  19. package/src/skills-lib/ai-seo/SKILL.md +398 -0
  20. package/src/skills-lib/ai-seo/evals/evals.json +90 -0
  21. package/src/skills-lib/ai-seo/references/content-patterns.md +285 -0
  22. package/src/skills-lib/ai-seo/references/platform-ranking-factors.md +152 -0
  23. package/src/skills-lib/analytics-tracking/SKILL.md +309 -0
  24. package/src/skills-lib/analytics-tracking/evals/evals.json +90 -0
  25. package/src/skills-lib/analytics-tracking/references/event-library.md +260 -0
  26. package/src/skills-lib/analytics-tracking/references/ga4-implementation.md +300 -0
  27. package/src/skills-lib/analytics-tracking/references/gtm-implementation.md +390 -0
  28. package/src/skills-lib/auth-and-secrets/SKILL.md +82 -0
  29. package/src/skills-lib/caching-and-queues/SKILL.md +58 -0
  30. package/src/skills-lib/cerebro/SKILL.md +368 -0
  31. package/src/skills-lib/churn-prevention/SKILL.md +424 -0
  32. package/src/skills-lib/churn-prevention/evals/evals.json +93 -0
  33. package/src/skills-lib/churn-prevention/references/cancel-flow-patterns.md +316 -0
  34. package/src/skills-lib/churn-prevention/references/dunning-playbook.md +408 -0
  35. package/src/skills-lib/cloud-and-infra/SKILL.md +36 -0
  36. package/src/skills-lib/cold-email/SKILL.md +158 -0
  37. package/src/skills-lib/cold-email/evals/evals.json +94 -0
  38. package/src/skills-lib/cold-email/references/benchmarks.md +83 -0
  39. package/src/skills-lib/cold-email/references/follow-up-sequences.md +81 -0
  40. package/src/skills-lib/cold-email/references/frameworks.md +90 -0
  41. package/src/skills-lib/cold-email/references/personalization.md +79 -0
  42. package/src/skills-lib/cold-email/references/subject-lines.md +53 -0
  43. package/src/skills-lib/competitor-alternatives/SKILL.md +256 -0
  44. package/src/skills-lib/competitor-alternatives/evals/evals.json +93 -0
  45. package/src/skills-lib/competitor-alternatives/references/content-architecture.md +271 -0
  46. package/src/skills-lib/competitor-alternatives/references/templates.md +223 -0
  47. package/src/skills-lib/content-strategy/SKILL.md +359 -0
  48. package/src/skills-lib/content-strategy/evals/evals.json +90 -0
  49. package/src/skills-lib/copy-editing/SKILL.md +447 -0
  50. package/src/skills-lib/copy-editing/evals/evals.json +89 -0
  51. package/src/skills-lib/copy-editing/references/plain-english-alternatives.md +394 -0
  52. package/src/skills-lib/copywriting/SKILL.md +252 -0
  53. package/src/skills-lib/copywriting/evals/evals.json +111 -0
  54. package/src/skills-lib/copywriting/references/copy-frameworks.md +344 -0
  55. package/src/skills-lib/copywriting/references/natural-transitions.md +272 -0
  56. package/src/skills-lib/database-and-deps/SKILL.md +80 -0
  57. package/src/skills-lib/database-scaling/SKILL.md +44 -0
  58. package/src/skills-lib/decision-maker/SKILL.md +534 -0
  59. package/src/skills-lib/desktop-security/SKILL.md +43 -0
  60. package/src/skills-lib/email-sequence/SKILL.md +309 -0
  61. package/src/skills-lib/email-sequence/evals/evals.json +93 -0
  62. package/src/skills-lib/email-sequence/references/copy-guidelines.md +113 -0
  63. package/src/skills-lib/email-sequence/references/email-types.md +515 -0
  64. package/src/skills-lib/email-sequence/references/sequence-templates.md +168 -0
  65. package/src/skills-lib/enhance-prompt/README.md +34 -0
  66. package/src/skills-lib/enhance-prompt/SKILL.md +204 -0
  67. package/src/skills-lib/enhance-prompt/references/KEYWORDS.md +114 -0
  68. package/src/skills-lib/find-skills/SKILL.md +181 -0
  69. package/src/skills-lib/form-cro/SKILL.md +429 -0
  70. package/src/skills-lib/form-cro/evals/evals.json +90 -0
  71. package/src/skills-lib/free-tool-strategy/SKILL.md +178 -0
  72. package/src/skills-lib/free-tool-strategy/evals/evals.json +90 -0
  73. package/src/skills-lib/free-tool-strategy/references/tool-types.md +217 -0
  74. package/src/skills-lib/graphify/.graphify_version +1 -0
  75. package/src/skills-lib/graphify/SKILL.md +1217 -0
  76. package/src/skills-lib/huashu-design/LICENSE +21 -0
  77. package/src/skills-lib/huashu-design/README.en.md +309 -0
  78. package/src/skills-lib/huashu-design/README.md +348 -0
  79. package/src/skills-lib/huashu-design/SKILL.md +631 -0
  80. package/src/skills-lib/huashu-design/assets/android_frame.jsx +175 -0
  81. package/src/skills-lib/huashu-design/assets/animations.jsx +348 -0
  82. package/src/skills-lib/huashu-design/assets/banner.svg +198 -0
  83. package/src/skills-lib/huashu-design/assets/bgm-ad.mp3 +0 -0
  84. package/src/skills-lib/huashu-design/assets/bgm-educational-alt.mp3 +0 -0
  85. package/src/skills-lib/huashu-design/assets/bgm-educational.mp3 +0 -0
  86. package/src/skills-lib/huashu-design/assets/bgm-tech.mp3 +0 -0
  87. package/src/skills-lib/huashu-design/assets/bgm-tutorial-alt.mp3 +0 -0
  88. package/src/skills-lib/huashu-design/assets/bgm-tutorial.mp3 +0 -0
  89. package/src/skills-lib/huashu-design/assets/browser_window.jsx +166 -0
  90. package/src/skills-lib/huashu-design/assets/deck_index.html +348 -0
  91. package/src/skills-lib/huashu-design/assets/deck_stage.js +420 -0
  92. package/src/skills-lib/huashu-design/assets/design_canvas.jsx +205 -0
  93. package/src/skills-lib/huashu-design/assets/director-notes-samples/launch-film-30s-sample.md +1713 -0
  94. package/src/skills-lib/huashu-design/assets/ios_frame.jsx +192 -0
  95. package/src/skills-lib/huashu-design/assets/macos_window.jsx +96 -0
  96. package/src/skills-lib/huashu-design/assets/narration_stage.jsx +476 -0
  97. package/src/skills-lib/huashu-design/assets/personal-asset-index.example.json +71 -0
  98. package/src/skills-lib/huashu-design/assets/sfx/container/card-flip.mp3 +0 -0
  99. package/src/skills-lib/huashu-design/assets/sfx/container/card-snap.mp3 +0 -0
  100. package/src/skills-lib/huashu-design/assets/sfx/container/modal-open.mp3 +0 -0
  101. package/src/skills-lib/huashu-design/assets/sfx/container/stack-collapse.mp3 +0 -0
  102. package/src/skills-lib/huashu-design/assets/sfx/feedback/achievement.mp3 +0 -0
  103. package/src/skills-lib/huashu-design/assets/sfx/feedback/error-tone.mp3 +0 -0
  104. package/src/skills-lib/huashu-design/assets/sfx/feedback/notification-pop.mp3 +0 -0
  105. package/src/skills-lib/huashu-design/assets/sfx/feedback/success-chime.mp3 +0 -0
  106. package/src/skills-lib/huashu-design/assets/sfx/impact/brand-stamp.mp3 +0 -0
  107. package/src/skills-lib/huashu-design/assets/sfx/impact/drop-thud.mp3 +0 -0
  108. package/src/skills-lib/huashu-design/assets/sfx/impact/logo-reveal-v2.mp3 +0 -0
  109. package/src/skills-lib/huashu-design/assets/sfx/impact/logo-reveal.mp3 +0 -0
  110. package/src/skills-lib/huashu-design/assets/sfx/keyboard/delete-key.mp3 +0 -0
  111. package/src/skills-lib/huashu-design/assets/sfx/keyboard/enter.mp3 +0 -0
  112. package/src/skills-lib/huashu-design/assets/sfx/keyboard/space-tap.mp3 +0 -0
  113. package/src/skills-lib/huashu-design/assets/sfx/keyboard/type-fast.mp3 +0 -0
  114. package/src/skills-lib/huashu-design/assets/sfx/keyboard/type.mp3 +0 -0
  115. package/src/skills-lib/huashu-design/assets/sfx/magic/ai-process.mp3 +0 -0
  116. package/src/skills-lib/huashu-design/assets/sfx/magic/sparkle.mp3 +0 -0
  117. package/src/skills-lib/huashu-design/assets/sfx/magic/transform.mp3 +0 -0
  118. package/src/skills-lib/huashu-design/assets/sfx/progress/complete-done.mp3 +0 -0
  119. package/src/skills-lib/huashu-design/assets/sfx/progress/generate-start.mp3 +0 -0
  120. package/src/skills-lib/huashu-design/assets/sfx/progress/loading-tick.mp3 +0 -0
  121. package/src/skills-lib/huashu-design/assets/sfx/terminal/command-execute.mp3 +0 -0
  122. package/src/skills-lib/huashu-design/assets/sfx/terminal/cursor-blink.mp3 +0 -0
  123. package/src/skills-lib/huashu-design/assets/sfx/terminal/output-appear.mp3 +0 -0
  124. package/src/skills-lib/huashu-design/assets/sfx/transition/dissolve.mp3 +0 -0
  125. package/src/skills-lib/huashu-design/assets/sfx/transition/slide-in.mp3 +0 -0
  126. package/src/skills-lib/huashu-design/assets/sfx/transition/swipe-horizontal.mp3 +0 -0
  127. package/src/skills-lib/huashu-design/assets/sfx/transition/whoosh-fast.mp3 +0 -0
  128. package/src/skills-lib/huashu-design/assets/sfx/transition/whoosh.mp3 +0 -0
  129. package/src/skills-lib/huashu-design/assets/sfx/ui/click-soft.mp3 +0 -0
  130. package/src/skills-lib/huashu-design/assets/sfx/ui/click.mp3 +0 -0
  131. package/src/skills-lib/huashu-design/assets/sfx/ui/focus.mp3 +0 -0
  132. package/src/skills-lib/huashu-design/assets/sfx/ui/hover-subtle.mp3 +0 -0
  133. package/src/skills-lib/huashu-design/assets/sfx/ui/tap-finger.mp3 +0 -0
  134. package/src/skills-lib/huashu-design/assets/sfx/ui/toggle-on.mp3 +0 -0
  135. package/src/skills-lib/huashu-design/assets/showcases/INDEX.md +115 -0
  136. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-build.html +235 -0
  137. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-build.png +0 -0
  138. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-pentagram.html +229 -0
  139. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-pentagram.png +0 -0
  140. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-takram.html +288 -0
  141. package/src/skills-lib/huashu-design/assets/showcases/cover/cover-takram.png +0 -0
  142. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-build.html +503 -0
  143. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-build.png +0 -0
  144. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-pentagram.html +600 -0
  145. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-pentagram.png +0 -0
  146. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-takram.html +670 -0
  147. package/src/skills-lib/huashu-design/assets/showcases/infographic/infographic-takram.png +0 -0
  148. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-build.html +382 -0
  149. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-build.png +0 -0
  150. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-pentagram.html +536 -0
  151. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-pentagram.png +0 -0
  152. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-takram.html +497 -0
  153. package/src/skills-lib/huashu-design/assets/showcases/ppt/ppt-takram.png +0 -0
  154. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-build.html +385 -0
  155. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-build.png +0 -0
  156. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.html +422 -0
  157. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-pentagram.png +0 -0
  158. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-takram.html +499 -0
  159. package/src/skills-lib/huashu-design/assets/showcases/website-ai-nav/ainav-takram.png +0 -0
  160. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.html +562 -0
  161. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-build.png +0 -0
  162. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.html +548 -0
  163. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-pentagram.png +0 -0
  164. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.html +696 -0
  165. package/src/skills-lib/huashu-design/assets/showcases/website-ai-writing/aiwriting-takram.png +0 -0
  166. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-build.html +372 -0
  167. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-build.png +0 -0
  168. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.html +460 -0
  169. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-pentagram.png +0 -0
  170. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-takram.html +494 -0
  171. package/src/skills-lib/huashu-design/assets/showcases/website-devdocs/devdocs-takram.png +0 -0
  172. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-build.html +367 -0
  173. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-build.png +0 -0
  174. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-pentagram.html +368 -0
  175. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-pentagram.png +0 -0
  176. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-takram.html +459 -0
  177. package/src/skills-lib/huashu-design/assets/showcases/website-homepage/homepage-takram.png +0 -0
  178. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-build.html +493 -0
  179. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-build.png +0 -0
  180. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-pentagram.html +556 -0
  181. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-pentagram.png +0 -0
  182. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-takram.html +604 -0
  183. package/src/skills-lib/huashu-design/assets/showcases/website-saas/saas-takram.png +0 -0
  184. package/src/skills-lib/huashu-design/demos/c1-ios-prototype-en.html +1145 -0
  185. package/src/skills-lib/huashu-design/demos/c1-ios-prototype.html +1142 -0
  186. package/src/skills-lib/huashu-design/demos/c2-slides-pptx-en.html +1055 -0
  187. package/src/skills-lib/huashu-design/demos/c2-slides-pptx.html +1055 -0
  188. package/src/skills-lib/huashu-design/demos/c3-motion-design-en.html +1134 -0
  189. package/src/skills-lib/huashu-design/demos/c3-motion-design.html +1134 -0
  190. package/src/skills-lib/huashu-design/demos/c4-tweaks-en.html +989 -0
  191. package/src/skills-lib/huashu-design/demos/c4-tweaks.html +989 -0
  192. package/src/skills-lib/huashu-design/demos/c5-infographic-en.html +816 -0
  193. package/src/skills-lib/huashu-design/demos/c5-infographic.html +813 -0
  194. package/src/skills-lib/huashu-design/demos/c6-expert-review-en.html +885 -0
  195. package/src/skills-lib/huashu-design/demos/c6-expert-review.html +894 -0
  196. package/src/skills-lib/huashu-design/demos/hero-animation-v10-en.html +1498 -0
  197. package/src/skills-lib/huashu-design/demos/md-html-narration/md-html-demo.html +615 -0
  198. package/src/skills-lib/huashu-design/demos/md-html-narration/script.md +69 -0
  199. package/src/skills-lib/huashu-design/demos/voiceover-demo/script.md +17 -0
  200. package/src/skills-lib/huashu-design/demos/voiceover-demo//344/273/200/344/271/210/346/230/257token.html +201 -0
  201. package/src/skills-lib/huashu-design/demos/w1-brand-protocol-en.html +684 -0
  202. package/src/skills-lib/huashu-design/demos/w1-brand-protocol.html +696 -0
  203. package/src/skills-lib/huashu-design/demos/w2-junior-designer-en.html +983 -0
  204. package/src/skills-lib/huashu-design/demos/w2-junior-designer.html +994 -0
  205. package/src/skills-lib/huashu-design/demos/w3-fallback-advisor-en.html +647 -0
  206. package/src/skills-lib/huashu-design/demos/w3-fallback-advisor.html +704 -0
  207. package/src/skills-lib/huashu-design/package-lock.json +846 -0
  208. package/src/skills-lib/huashu-design/package.json +8 -0
  209. package/src/skills-lib/huashu-design/references/animation-best-practices.md +506 -0
  210. package/src/skills-lib/huashu-design/references/animation-pitfalls.md +402 -0
  211. package/src/skills-lib/huashu-design/references/animations.md +249 -0
  212. package/src/skills-lib/huashu-design/references/apple-gallery-showcase.md +338 -0
  213. package/src/skills-lib/huashu-design/references/audio-design-rules.md +260 -0
  214. package/src/skills-lib/huashu-design/references/brand-asset-protocol.md +250 -0
  215. package/src/skills-lib/huashu-design/references/cinematic-patterns.md +264 -0
  216. package/src/skills-lib/huashu-design/references/content-guidelines.md +260 -0
  217. package/src/skills-lib/huashu-design/references/critique-guide.md +199 -0
  218. package/src/skills-lib/huashu-design/references/design-context.md +213 -0
  219. package/src/skills-lib/huashu-design/references/design-styles.md +370 -0
  220. package/src/skills-lib/huashu-design/references/editable-pptx.md +334 -0
  221. package/src/skills-lib/huashu-design/references/hero-animation-case-study.md +250 -0
  222. package/src/skills-lib/huashu-design/references/launch-film-director-notes.md +293 -0
  223. package/src/skills-lib/huashu-design/references/multi-perspective-parallel-case-study.md +267 -0
  224. package/src/skills-lib/huashu-design/references/react-setup.md +276 -0
  225. package/src/skills-lib/huashu-design/references/scene-templates.md +262 -0
  226. package/src/skills-lib/huashu-design/references/sfx-library.md +226 -0
  227. package/src/skills-lib/huashu-design/references/slide-decks.md +745 -0
  228. package/src/skills-lib/huashu-design/references/tweaks-system.md +313 -0
  229. package/src/skills-lib/huashu-design/references/verification.md +183 -0
  230. package/src/skills-lib/huashu-design/references/video-export.md +232 -0
  231. package/src/skills-lib/huashu-design/references/voiceover-pipeline.md +397 -0
  232. package/src/skills-lib/huashu-design/references/workflow.md +216 -0
  233. package/src/skills-lib/huashu-design/scripts/add-music.sh +108 -0
  234. package/src/skills-lib/huashu-design/scripts/convert-formats.sh +83 -0
  235. package/src/skills-lib/huashu-design/scripts/export_deck_pdf.mjs +98 -0
  236. package/src/skills-lib/huashu-design/scripts/export_deck_pptx.mjs +107 -0
  237. package/src/skills-lib/huashu-design/scripts/export_deck_stage_pdf.mjs +130 -0
  238. package/src/skills-lib/huashu-design/scripts/fetch_images.py +94 -0
  239. package/src/skills-lib/huashu-design/scripts/gen_deck_thumbs.mjs +55 -0
  240. package/src/skills-lib/huashu-design/scripts/html2pptx.js +1178 -0
  241. package/src/skills-lib/huashu-design/scripts/mix-voiceover.sh +127 -0
  242. package/src/skills-lib/huashu-design/scripts/narrate-pipeline.mjs +315 -0
  243. package/src/skills-lib/huashu-design/scripts/render-narration.sh +151 -0
  244. package/src/skills-lib/huashu-design/scripts/render-video-seek.js +238 -0
  245. package/src/skills-lib/huashu-design/scripts/render-video.js +289 -0
  246. package/src/skills-lib/huashu-design/scripts/tts-doubao.mjs +184 -0
  247. package/src/skills-lib/huashu-design/scripts/verify.py +154 -0
  248. package/src/skills-lib/huashu-design/test-prompts.json +38 -0
  249. package/src/skills-lib/humanizer/LICENSE +21 -0
  250. package/src/skills-lib/humanizer/README.md +145 -0
  251. package/src/skills-lib/humanizer/SKILL.md +474 -0
  252. package/src/skills-lib/humanizer/WARP.md +53 -0
  253. package/src/skills-lib/impeccable/SKILL.md +186 -0
  254. package/src/skills-lib/implementation-planner/SKILL.md +630 -0
  255. package/src/skills-lib/infrastructure/SKILL.md +34 -0
  256. package/src/skills-lib/inicio-de-projeto/SKILL.md +313 -0
  257. package/src/skills-lib/launch-strategy/SKILL.md +353 -0
  258. package/src/skills-lib/launch-strategy/evals/evals.json +91 -0
  259. package/src/skills-lib/marketing-ideas/SKILL.md +167 -0
  260. package/src/skills-lib/marketing-ideas/evals/evals.json +90 -0
  261. package/src/skills-lib/marketing-ideas/references/ideas-by-category.md +366 -0
  262. package/src/skills-lib/marketing-psychology/SKILL.md +455 -0
  263. package/src/skills-lib/marketing-psychology/evals/evals.json +88 -0
  264. package/src/skills-lib/motion-3d-director/SKILL.md +485 -0
  265. package/src/skills-lib/onboarding-cro/SKILL.md +220 -0
  266. package/src/skills-lib/onboarding-cro/evals/evals.json +92 -0
  267. package/src/skills-lib/onboarding-cro/references/experiments.md +258 -0
  268. package/src/skills-lib/page-cro/SKILL.md +182 -0
  269. package/src/skills-lib/page-cro/evals/evals.json +111 -0
  270. package/src/skills-lib/page-cro/references/experiments.md +248 -0
  271. package/src/skills-lib/paid-ads/SKILL.md +315 -0
  272. package/src/skills-lib/paid-ads/evals/evals.json +90 -0
  273. package/src/skills-lib/paid-ads/references/ad-copy-templates.md +207 -0
  274. package/src/skills-lib/paid-ads/references/audience-targeting.md +243 -0
  275. package/src/skills-lib/paid-ads/references/platform-setup-checklists.md +277 -0
  276. package/src/skills-lib/paywall-upgrade-cro/SKILL.md +227 -0
  277. package/src/skills-lib/paywall-upgrade-cro/evals/evals.json +93 -0
  278. package/src/skills-lib/paywall-upgrade-cro/references/experiments.md +164 -0
  279. package/src/skills-lib/popup-cro/SKILL.md +453 -0
  280. package/src/skills-lib/popup-cro/evals/evals.json +94 -0
  281. package/src/skills-lib/premium-landing-ui-researcher/SKILL.md +2090 -0
  282. package/src/skills-lib/pricing-strategy/SKILL.md +231 -0
  283. package/src/skills-lib/pricing-strategy/evals/evals.json +90 -0
  284. package/src/skills-lib/pricing-strategy/references/research-methods.md +152 -0
  285. package/src/skills-lib/pricing-strategy/references/tier-structure.md +232 -0
  286. package/src/skills-lib/product-marketing-context/SKILL.md +241 -0
  287. package/src/skills-lib/product-marketing-context/evals/evals.json +85 -0
  288. package/src/skills-lib/programmatic-seo/SKILL.md +238 -0
  289. package/src/skills-lib/programmatic-seo/evals/evals.json +94 -0
  290. package/src/skills-lib/programmatic-seo/references/playbooks.md +308 -0
  291. package/src/skills-lib/react-components/README.md +36 -0
  292. package/src/skills-lib/react-components/SKILL.md +51 -0
  293. package/src/skills-lib/react-components/examples/gold-standard-card.tsx +80 -0
  294. package/src/skills-lib/react-components/package-lock.json +231 -0
  295. package/src/skills-lib/react-components/package.json +16 -0
  296. package/src/skills-lib/react-components/resources/architecture-checklist.md +15 -0
  297. package/src/skills-lib/react-components/resources/component-template.tsx +37 -0
  298. package/src/skills-lib/react-components/resources/stitch-api-reference.md +14 -0
  299. package/src/skills-lib/react-components/resources/style-guide.json +27 -0
  300. package/src/skills-lib/react-components/scripts/fetch-stitch.sh +30 -0
  301. package/src/skills-lib/react-components/scripts/validate.js +70 -0
  302. package/src/skills-lib/references/premium-agency-rules.md +79 -0
  303. package/src/skills-lib/referral-program/SKILL.md +255 -0
  304. package/src/skills-lib/referral-program/evals/evals.json +89 -0
  305. package/src/skills-lib/referral-program/references/affiliate-programs.md +164 -0
  306. package/src/skills-lib/referral-program/references/program-examples.md +143 -0
  307. package/src/skills-lib/remotion-best-practices/SKILL.md +61 -0
  308. package/src/skills-lib/remotion-best-practices/rules/3d.md +86 -0
  309. package/src/skills-lib/remotion-best-practices/rules/animations.md +27 -0
  310. package/src/skills-lib/remotion-best-practices/rules/assets/charts-bar-chart.tsx +173 -0
  311. package/src/skills-lib/remotion-best-practices/rules/assets/text-animations-typewriter.tsx +100 -0
  312. package/src/skills-lib/remotion-best-practices/rules/assets/text-animations-word-highlight.tsx +103 -0
  313. package/src/skills-lib/remotion-best-practices/rules/assets.md +78 -0
  314. package/src/skills-lib/remotion-best-practices/rules/audio-visualization.md +198 -0
  315. package/src/skills-lib/remotion-best-practices/rules/audio.md +169 -0
  316. package/src/skills-lib/remotion-best-practices/rules/calculate-metadata.md +134 -0
  317. package/src/skills-lib/remotion-best-practices/rules/can-decode.md +75 -0
  318. package/src/skills-lib/remotion-best-practices/rules/charts.md +120 -0
  319. package/src/skills-lib/remotion-best-practices/rules/compositions.md +154 -0
  320. package/src/skills-lib/remotion-best-practices/rules/display-captions.md +184 -0
  321. package/src/skills-lib/remotion-best-practices/rules/extract-frames.md +229 -0
  322. package/src/skills-lib/remotion-best-practices/rules/ffmpeg.md +38 -0
  323. package/src/skills-lib/remotion-best-practices/rules/fonts.md +152 -0
  324. package/src/skills-lib/remotion-best-practices/rules/get-audio-duration.md +58 -0
  325. package/src/skills-lib/remotion-best-practices/rules/get-video-dimensions.md +68 -0
  326. package/src/skills-lib/remotion-best-practices/rules/get-video-duration.md +60 -0
  327. package/src/skills-lib/remotion-best-practices/rules/gifs.md +141 -0
  328. package/src/skills-lib/remotion-best-practices/rules/images.md +134 -0
  329. package/src/skills-lib/remotion-best-practices/rules/import-srt-captions.md +69 -0
  330. package/src/skills-lib/remotion-best-practices/rules/light-leaks.md +73 -0
  331. package/src/skills-lib/remotion-best-practices/rules/lottie.md +70 -0
  332. package/src/skills-lib/remotion-best-practices/rules/maps.md +412 -0
  333. package/src/skills-lib/remotion-best-practices/rules/measuring-dom-nodes.md +34 -0
  334. package/src/skills-lib/remotion-best-practices/rules/measuring-text.md +140 -0
  335. package/src/skills-lib/remotion-best-practices/rules/parameters.md +109 -0
  336. package/src/skills-lib/remotion-best-practices/rules/sequencing.md +118 -0
  337. package/src/skills-lib/remotion-best-practices/rules/sfx.md +26 -0
  338. package/src/skills-lib/remotion-best-practices/rules/subtitles.md +36 -0
  339. package/src/skills-lib/remotion-best-practices/rules/tailwind.md +11 -0
  340. package/src/skills-lib/remotion-best-practices/rules/text-animations.md +20 -0
  341. package/src/skills-lib/remotion-best-practices/rules/timing.md +179 -0
  342. package/src/skills-lib/remotion-best-practices/rules/transcribe-captions.md +70 -0
  343. package/src/skills-lib/remotion-best-practices/rules/transitions.md +197 -0
  344. package/src/skills-lib/remotion-best-practices/rules/transparent-videos.md +106 -0
  345. package/src/skills-lib/remotion-best-practices/rules/trimming.md +51 -0
  346. package/src/skills-lib/remotion-best-practices/rules/videos.md +171 -0
  347. package/src/skills-lib/remotion-best-practices/rules/voiceover.md +99 -0
  348. package/src/skills-lib/revops/SKILL.md +343 -0
  349. package/src/skills-lib/revops/evals/evals.json +91 -0
  350. package/src/skills-lib/revops/references/automation-playbooks.md +290 -0
  351. package/src/skills-lib/revops/references/lifecycle-definitions.md +278 -0
  352. package/src/skills-lib/revops/references/routing-rules.md +203 -0
  353. package/src/skills-lib/revops/references/scoring-models.md +247 -0
  354. package/src/skills-lib/sales-enablement/SKILL.md +349 -0
  355. package/src/skills-lib/sales-enablement/evals/evals.json +91 -0
  356. package/src/skills-lib/sales-enablement/references/deck-frameworks.md +263 -0
  357. package/src/skills-lib/sales-enablement/references/demo-scripts.md +355 -0
  358. package/src/skills-lib/sales-enablement/references/objection-library.md +270 -0
  359. package/src/skills-lib/sales-enablement/references/one-pager-templates.md +208 -0
  360. package/src/skills-lib/schema-markup/SKILL.md +179 -0
  361. package/src/skills-lib/schema-markup/evals/evals.json +87 -0
  362. package/src/skills-lib/schema-markup/references/schema-examples.md +398 -0
  363. package/src/skills-lib/seo-audit/SKILL.md +412 -0
  364. package/src/skills-lib/seo-audit/evals/evals.json +136 -0
  365. package/src/skills-lib/seo-audit/references/ai-writing-detection.md +200 -0
  366. package/src/skills-lib/signup-flow-cro/SKILL.md +359 -0
  367. package/src/skills-lib/signup-flow-cro/evals/evals.json +88 -0
  368. package/src/skills-lib/site-architecture/SKILL.md +357 -0
  369. package/src/skills-lib/site-architecture/evals/evals.json +88 -0
  370. package/src/skills-lib/site-architecture/references/mermaid-templates.md +216 -0
  371. package/src/skills-lib/site-architecture/references/navigation-patterns.md +305 -0
  372. package/src/skills-lib/site-architecture/references/site-type-templates.md +293 -0
  373. package/src/skills-lib/social-content/SKILL.md +278 -0
  374. package/src/skills-lib/social-content/evals/evals.json +92 -0
  375. package/src/skills-lib/social-content/references/platforms.md +170 -0
  376. package/src/skills-lib/social-content/references/post-templates.md +177 -0
  377. package/src/skills-lib/social-content/references/reverse-engineering.md +195 -0
  378. package/src/skills-lib/supabase-postgres-best-practices/AGENTS.md +68 -0
  379. package/src/skills-lib/supabase-postgres-best-practices/CLAUDE.md +68 -0
  380. package/src/skills-lib/supabase-postgres-best-practices/README.md +116 -0
  381. package/src/skills-lib/supabase-postgres-best-practices/SKILL.md +64 -0
  382. package/src/skills-lib/supabase-postgres-best-practices/references/_contributing.md +171 -0
  383. package/src/skills-lib/supabase-postgres-best-practices/references/_sections.md +39 -0
  384. package/src/skills-lib/supabase-postgres-best-practices/references/_template.md +34 -0
  385. package/src/skills-lib/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
  386. package/src/skills-lib/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
  387. package/src/skills-lib/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
  388. package/src/skills-lib/supabase-postgres-best-practices/references/conn-limits.md +44 -0
  389. package/src/skills-lib/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
  390. package/src/skills-lib/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
  391. package/src/skills-lib/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
  392. package/src/skills-lib/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
  393. package/src/skills-lib/supabase-postgres-best-practices/references/data-pagination.md +50 -0
  394. package/src/skills-lib/supabase-postgres-best-practices/references/data-upsert.md +50 -0
  395. package/src/skills-lib/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
  396. package/src/skills-lib/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
  397. package/src/skills-lib/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
  398. package/src/skills-lib/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
  399. package/src/skills-lib/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
  400. package/src/skills-lib/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
  401. package/src/skills-lib/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
  402. package/src/skills-lib/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
  403. package/src/skills-lib/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
  404. package/src/skills-lib/supabase-postgres-best-practices/references/query-index-types.md +48 -0
  405. package/src/skills-lib/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
  406. package/src/skills-lib/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
  407. package/src/skills-lib/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
  408. package/src/skills-lib/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
  409. package/src/skills-lib/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
  410. package/src/skills-lib/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
  411. package/src/skills-lib/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
  412. package/src/skills-lib/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
  413. package/src/skills-lib/supabase-postgres-best-practices/references/security-privileges.md +54 -0
  414. package/src/skills-lib/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
  415. package/src/skills-lib/supabase-postgres-best-practices/references/security-rls-performance.md +57 -0
  416. package/src/skills-lib/taste-redesign/SKILL.md +178 -0
  417. package/src/skills-lib/taste-skill/SKILL.md +1206 -0
  418. package/src/skills-lib/ui-component-curator/SKILL.md +102 -0
  419. package/src/skills-lib/ui-ux-pro-max/SKILL.md +377 -0
  420. package/src/skills-lib/ui-ux-pro-max/data/charts.csv +26 -0
  421. package/src/skills-lib/ui-ux-pro-max/data/colors.csv +97 -0
  422. package/src/skills-lib/ui-ux-pro-max/data/icons.csv +101 -0
  423. package/src/skills-lib/ui-ux-pro-max/data/landing.csv +31 -0
  424. package/src/skills-lib/ui-ux-pro-max/data/products.csv +97 -0
  425. package/src/skills-lib/ui-ux-pro-max/data/react-performance.csv +45 -0
  426. package/src/skills-lib/ui-ux-pro-max/data/stacks/astro.csv +54 -0
  427. package/src/skills-lib/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  428. package/src/skills-lib/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  429. package/src/skills-lib/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  430. package/src/skills-lib/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  431. package/src/skills-lib/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  432. package/src/skills-lib/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  433. package/src/skills-lib/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  434. package/src/skills-lib/ui-ux-pro-max/data/stacks/react.csv +54 -0
  435. package/src/skills-lib/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  436. package/src/skills-lib/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  437. package/src/skills-lib/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  438. package/src/skills-lib/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  439. package/src/skills-lib/ui-ux-pro-max/data/styles.csv +68 -0
  440. package/src/skills-lib/ui-ux-pro-max/data/typography.csv +58 -0
  441. package/src/skills-lib/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  442. package/src/skills-lib/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  443. package/src/skills-lib/ui-ux-pro-max/data/web-interface.csv +31 -0
  444. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/core.cpython-314.pyc +0 -0
  445. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-314.pyc +0 -0
  446. package/src/skills-lib/ui-ux-pro-max/scripts/__pycache__/search.cpython-314.pyc +0 -0
  447. package/src/skills-lib/ui-ux-pro-max/scripts/core.py +253 -0
  448. package/src/skills-lib/ui-ux-pro-max/scripts/design_system.py +1067 -0
  449. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/0964cef300f753b5cee0cc49777ca97035c85d45c212099405d9ee4da36e523f.json +1 -0
  450. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/21a40f6810c3a6f17acc3580f106171daf78c7b41bbd066bc80448a821ea0adf.json +1 -0
  451. package/src/skills-lib/ui-ux-pro-max/scripts/graphify-out/cache/69ea15a020ac81b8459e37ef63654398a50c1035fc01c43d8069df217389f7f3.json +1 -0
  452. package/src/skills-lib/ui-ux-pro-max/scripts/search.py +114 -0
  453. package/src/skills-lib/web-security/SKILL.md +147 -0
  454. package/src/skills-lib/wizz-router/SKILL.md +257 -0
  455. package/src/squads/README.md +39 -0
  456. package/src/squads/advisory-board/README.md +34 -0
  457. package/src/squads/advisory-board/agents/board-chair.md +161 -0
  458. package/src/squads/advisory-board/agents/brene-brown.md +296 -0
  459. package/src/squads/advisory-board/agents/charlie-munger.md +590 -0
  460. package/src/squads/advisory-board/agents/derek-sivers.md +268 -0
  461. package/src/squads/advisory-board/agents/naval-ravikant.md +251 -0
  462. package/src/squads/advisory-board/agents/patrick-lencioni.md +394 -0
  463. package/src/squads/advisory-board/agents/peter-thiel.md +269 -0
  464. package/src/squads/advisory-board/agents/ray-dalio.md +587 -0
  465. package/src/squads/advisory-board/agents/reid-hoffman.md +278 -0
  466. package/src/squads/advisory-board/agents/simon-sinek.md +291 -0
  467. package/src/squads/advisory-board/agents/yvon-chouinard.md +275 -0
  468. package/src/squads/advisory-board/squad.yaml +50 -0
  469. package/src/squads/brand-squad/README.md +60 -0
  470. package/src/squads/brand-squad/agents/al-ries.md +175 -0
  471. package/src/squads/brand-squad/agents/alina-wheeler.md +184 -0
  472. package/src/squads/brand-squad/agents/archetype-consultant.md +215 -0
  473. package/src/squads/brand-squad/agents/brand-chief.md +158 -0
  474. package/src/squads/brand-squad/agents/byron-sharp.md +169 -0
  475. package/src/squads/brand-squad/agents/david-aaker.md +166 -0
  476. package/src/squads/brand-squad/agents/denise-yohn.md +172 -0
  477. package/src/squads/brand-squad/agents/domain-scout.md +135 -0
  478. package/src/squads/brand-squad/agents/donald-miller.md +179 -0
  479. package/src/squads/brand-squad/agents/emily-heyward.md +147 -0
  480. package/src/squads/brand-squad/agents/jean-noel-kapferer.md +189 -0
  481. package/src/squads/brand-squad/agents/kevin-keller.md +199 -0
  482. package/src/squads/brand-squad/agents/marty-neumeier.md +170 -0
  483. package/src/squads/brand-squad/agents/miller-sticky-brand.md +180 -0
  484. package/src/squads/brand-squad/agents/naming-strategist.md +171 -0
  485. package/src/squads/brand-squad/squad.yaml +117 -0
  486. package/src/squads/c-level-squad/README.md +29 -0
  487. package/src/squads/c-level-squad/agents/caio-architect.md +235 -0
  488. package/src/squads/c-level-squad/agents/cio-engineer.md +209 -0
  489. package/src/squads/c-level-squad/agents/cmo-architect.md +208 -0
  490. package/src/squads/c-level-squad/agents/coo-orchestrator.md +193 -0
  491. package/src/squads/c-level-squad/agents/cto-architect.md +194 -0
  492. package/src/squads/c-level-squad/agents/vision-chief.md +201 -0
  493. package/src/squads/c-level-squad/squad.yaml +45 -0
  494. package/src/squads/claude-code-mastery/README.md +146 -0
  495. package/src/squads/claude-code-mastery/agents/claude-mastery-chief.md +554 -0
  496. package/src/squads/claude-code-mastery/agents/config-engineer.md +865 -0
  497. package/src/squads/claude-code-mastery/agents/hooks-architect.md +1013 -0
  498. package/src/squads/claude-code-mastery/agents/mcp-integrator.md +791 -0
  499. package/src/squads/claude-code-mastery/agents/project-integrator.md +1196 -0
  500. package/src/squads/claude-code-mastery/agents/roadmap-sentinel.md +931 -0
  501. package/src/squads/claude-code-mastery/agents/skill-craftsman.md +1250 -0
  502. package/src/squads/claude-code-mastery/agents/swarm-orchestrator.md +1008 -0
  503. package/src/squads/copy-squad/README.md +65 -0
  504. package/src/squads/copy-squad/agents/andre-chaperon.md +206 -0
  505. package/src/squads/copy-squad/agents/ben-settle.md +194 -0
  506. package/src/squads/copy-squad/agents/claude-hopkins.md +182 -0
  507. package/src/squads/copy-squad/agents/clayton-makepeace.md +225 -0
  508. package/src/squads/copy-squad/agents/copy-chief.md +166 -0
  509. package/src/squads/copy-squad/agents/dan-kennedy.md +202 -0
  510. package/src/squads/copy-squad/agents/dan-koe.md +223 -0
  511. package/src/squads/copy-squad/agents/david-deutsch.md +197 -0
  512. package/src/squads/copy-squad/agents/david-ogilvy.md +198 -0
  513. package/src/squads/copy-squad/agents/eugene-schwartz.md +238 -0
  514. package/src/squads/copy-squad/agents/frank-kern.md +195 -0
  515. package/src/squads/copy-squad/agents/gary-bencivenga.md +197 -0
  516. package/src/squads/copy-squad/agents/gary-halbert.md +219 -0
  517. package/src/squads/copy-squad/agents/jim-rutz.md +193 -0
  518. package/src/squads/copy-squad/agents/joe-sugarman.md +234 -0
  519. package/src/squads/copy-squad/agents/john-carlton.md +203 -0
  520. package/src/squads/copy-squad/agents/jon-benson.md +196 -0
  521. package/src/squads/copy-squad/agents/parris-lampropoulos.md +188 -0
  522. package/src/squads/copy-squad/agents/robert-collier.md +183 -0
  523. package/src/squads/copy-squad/agents/russell-brunson.md +229 -0
  524. package/src/squads/copy-squad/agents/ry-schwartz.md +185 -0
  525. package/src/squads/copy-squad/agents/stefan-georgi.md +188 -0
  526. package/src/squads/copy-squad/agents/todd-brown.md +171 -0
  527. package/src/squads/copy-squad/squad.yaml +87 -0
  528. package/src/squads/cybersecurity/README.md +38 -0
  529. package/src/squads/cybersecurity/agents/busterer.md +108 -0
  530. package/src/squads/cybersecurity/agents/cartographer.md +114 -0
  531. package/src/squads/cybersecurity/agents/chris-sanders.md +205 -0
  532. package/src/squads/cybersecurity/agents/command-generator.md +121 -0
  533. package/src/squads/cybersecurity/agents/cyber-chief.md +120 -0
  534. package/src/squads/cybersecurity/agents/dirber.md +111 -0
  535. package/src/squads/cybersecurity/agents/fuzzer.md +121 -0
  536. package/src/squads/cybersecurity/agents/georgia-weidman.md +178 -0
  537. package/src/squads/cybersecurity/agents/jim-manico.md +182 -0
  538. package/src/squads/cybersecurity/agents/marcus-carey.md +200 -0
  539. package/src/squads/cybersecurity/agents/omar-santos.md +206 -0
  540. package/src/squads/cybersecurity/agents/peter-kim.md +179 -0
  541. package/src/squads/cybersecurity/agents/ripper.md +121 -0
  542. package/src/squads/cybersecurity/agents/rogue.md +116 -0
  543. package/src/squads/cybersecurity/agents/shannon-runner.md +108 -0
  544. package/src/squads/cybersecurity/squad.yaml +56 -0
  545. package/src/squads/data-squad/README.md +30 -0
  546. package/src/squads/data-squad/agents/avinash-kaushik.md +268 -0
  547. package/src/squads/data-squad/agents/data-chief.md +167 -0
  548. package/src/squads/data-squad/agents/david-spinks.md +277 -0
  549. package/src/squads/data-squad/agents/nick-mehta.md +294 -0
  550. package/src/squads/data-squad/agents/peter-fader.md +246 -0
  551. package/src/squads/data-squad/agents/sean-ellis.md +303 -0
  552. package/src/squads/data-squad/agents/wes-kao.md +268 -0
  553. package/src/squads/data-squad/squad.yaml +46 -0
  554. package/src/squads/design-squad/README.md +31 -0
  555. package/src/squads/design-squad/agents/brad-frost.md +185 -0
  556. package/src/squads/design-squad/agents/dan-mall.md +178 -0
  557. package/src/squads/design-squad/agents/dave-malouf.md +198 -0
  558. package/src/squads/design-squad/agents/design-chief.md +109 -0
  559. package/src/squads/design-squad/agents/design-system-architect.md +109 -0
  560. package/src/squads/design-squad/agents/ui-engineer.md +102 -0
  561. package/src/squads/design-squad/agents/ux-designer.md +105 -0
  562. package/src/squads/design-squad/agents/visual-generator.md +108 -0
  563. package/src/squads/design-squad/squad.yaml +48 -0
  564. package/src/squads/hormozi-squad/README.md +39 -0
  565. package/src/squads/hormozi-squad/agents/hormozi-ads.md +159 -0
  566. package/src/squads/hormozi-squad/agents/hormozi-advisor.md +178 -0
  567. package/src/squads/hormozi-squad/agents/hormozi-audit.md +178 -0
  568. package/src/squads/hormozi-squad/agents/hormozi-chief.md +111 -0
  569. package/src/squads/hormozi-squad/agents/hormozi-closer.md +179 -0
  570. package/src/squads/hormozi-squad/agents/hormozi-content.md +166 -0
  571. package/src/squads/hormozi-squad/agents/hormozi-copy.md +152 -0
  572. package/src/squads/hormozi-squad/agents/hormozi-hooks.md +177 -0
  573. package/src/squads/hormozi-squad/agents/hormozi-launch.md +160 -0
  574. package/src/squads/hormozi-squad/agents/hormozi-leads.md +198 -0
  575. package/src/squads/hormozi-squad/agents/hormozi-models.md +191 -0
  576. package/src/squads/hormozi-squad/agents/hormozi-offers.md +197 -0
  577. package/src/squads/hormozi-squad/agents/hormozi-pricing.md +151 -0
  578. package/src/squads/hormozi-squad/agents/hormozi-retention.md +166 -0
  579. package/src/squads/hormozi-squad/agents/hormozi-scale.md +175 -0
  580. package/src/squads/hormozi-squad/agents/hormozi-workshop.md +160 -0
  581. package/src/squads/hormozi-squad/squad.yaml +60 -0
  582. package/src/squads/movement/README.md +29 -0
  583. package/src/squads/movement/agents/analista-de-impacto.md +350 -0
  584. package/src/squads/movement/agents/estrategista-de-ciclo.md +301 -0
  585. package/src/squads/movement/agents/fenomenologo.md +169 -0
  586. package/src/squads/movement/agents/identitario.md +265 -0
  587. package/src/squads/movement/agents/manifestador.md +279 -0
  588. package/src/squads/movement/agents/movement-architect.md +210 -0
  589. package/src/squads/movement/agents/movement-chief.md +135 -0
  590. package/src/squads/movement/squad.yaml +45 -0
  591. package/src/squads/storytelling/README.md +35 -0
  592. package/src/squads/storytelling/agents/blake-snyder.md +225 -0
  593. package/src/squads/storytelling/agents/dan-harmon.md +167 -0
  594. package/src/squads/storytelling/agents/joseph-campbell.md +184 -0
  595. package/src/squads/storytelling/agents/keith-johnstone.md +157 -0
  596. package/src/squads/storytelling/agents/kindra-hall.md +162 -0
  597. package/src/squads/storytelling/agents/marshall-ganz.md +167 -0
  598. package/src/squads/storytelling/agents/matthew-dicks.md +152 -0
  599. package/src/squads/storytelling/agents/nancy-duarte.md +154 -0
  600. package/src/squads/storytelling/agents/oren-klaff.md +166 -0
  601. package/src/squads/storytelling/agents/park-howell.md +152 -0
  602. package/src/squads/storytelling/agents/shawn-coyne.md +208 -0
  603. package/src/squads/storytelling/agents/story-chief.md +155 -0
  604. package/src/squads/storytelling/squad.yaml +52 -0
  605. package/src/squads/traffic-masters/README.md +39 -0
  606. package/src/squads/traffic-masters/agents/ad-midas.md +149 -0
  607. package/src/squads/traffic-masters/agents/ads-analyst.md +135 -0
  608. package/src/squads/traffic-masters/agents/creative-analyst.md +142 -0
  609. package/src/squads/traffic-masters/agents/depesh-mandalia.md +174 -0
  610. package/src/squads/traffic-masters/agents/fiscal.md +144 -0
  611. package/src/squads/traffic-masters/agents/kasim-aslam.md +158 -0
  612. package/src/squads/traffic-masters/agents/media-buyer.md +159 -0
  613. package/src/squads/traffic-masters/agents/molly-pittman.md +185 -0
  614. package/src/squads/traffic-masters/agents/nicholas-kusmich.md +157 -0
  615. package/src/squads/traffic-masters/agents/pedro-sobral.md +158 -0
  616. package/src/squads/traffic-masters/agents/performance-analyst.md +135 -0
  617. package/src/squads/traffic-masters/agents/pixel-specialist.md +144 -0
  618. package/src/squads/traffic-masters/agents/ralph-burns.md +163 -0
  619. package/src/squads/traffic-masters/agents/scale-optimizer.md +144 -0
  620. package/src/squads/traffic-masters/agents/tom-breeze.md +175 -0
  621. package/src/squads/traffic-masters/agents/traffic-chief.md +97 -0
  622. package/src/squads/traffic-masters/squad.yaml +59 -0
  623. package/tools/installer/commands/install.js +12 -0
  624. package/tools/installer/core/config.js +20 -0
  625. package/tools/installer/core/installer.js +100 -0
  626. package/tools/installer/core/manifest-generator.js +14 -3
  627. package/tools/installer/modules/cli-config.js +145 -0
  628. package/tools/installer/modules/mcp-config.js +137 -0
  629. package/tools/installer/modules/skills-lib.js +135 -0
  630. package/tools/installer/ui.js +210 -0
@@ -0,0 +1,238 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HTML animation → MP4 via deterministic frame-by-frame SEEK (Playwright + ffmpeg).
4
+ *
5
+ * 这是 render-video.js(Playwright recordVideo)的逐帧替代渲染器。技术内核借鉴
6
+ * HeyGen HyperFrames(Apache 2.0)的「冻结时钟 + seek 到时间戳截图」思路,但不引入
7
+ * 任何第三方包——只用本 skill 已有的 playwright + ffmpeg,runtime 中立。
8
+ *
9
+ * 相比 render-video.js 解决的三个死结(见 references/video-export.md §「seek 渲染」):
10
+ * 1. 帧率不再被 Chromium headless compositor 锁死 25fps —— --fps 原生任意帧率
11
+ * 2. 不再需要 convert-formats.sh 的 minterpolate 事后插帧(有 ghosting + macOS
12
+ * QuickTime 兼容 bug,见 animation-pitfalls §14)—— 每帧都是真实 seek 画面
13
+ * 3. 不录屏 → 无开头黑帧 → 不需要 --trim / --fontwait / __ready 偏移那套逻辑
14
+ * 额外:seek 到时间戳截图,同输入同输出 deterministic(recordVideo 是实时录制非确定性)
15
+ *
16
+ * 前提:动画必须走 Stage 时钟(assets/animations.jsx 的 <Stage> 或 narration_stage.jsx
17
+ * 的 <NarrationStage>),它们会响应 window.__seekRender 冻结自驱时钟、并暴露
18
+ * window.__seek(t)。纯 CSS @keyframes / Lottie / 非 Stage 驱动的动画不吃 __seek,
19
+ * 这类请继续用 render-video.js。
20
+ *
21
+ * Requires: global playwright (`npm install -g playwright`), ffmpeg on PATH.
22
+ *
23
+ * Usage:
24
+ * NODE_PATH=$(npm root -g) node render-video-seek.js <html-file> \
25
+ * [--duration=30] [--fps=60] [--width=1920] [--height=1080] \
26
+ * [--concurrency=4] [--settle=2] [--keep-chrome]
27
+ *
28
+ * Output: next to the HTML file, same basename with .mp4 suffix.
29
+ */
30
+
31
+ const { chromium } = require('playwright');
32
+ const path = require('path');
33
+ const fs = require('fs');
34
+ const { spawnSync } = require('child_process');
35
+
36
+ function arg(name, def) {
37
+ const p = process.argv.find(a => a.startsWith('--' + name + '='));
38
+ return p ? p.slice(name.length + 3) : def;
39
+ }
40
+ function hasFlag(name) {
41
+ return process.argv.includes('--' + name);
42
+ }
43
+
44
+ const HTML_FILE = process.argv[2];
45
+ if (!HTML_FILE || HTML_FILE.startsWith('--')) {
46
+ console.error('Usage: node render-video-seek.js <html-file>');
47
+ console.error('Example: NODE_PATH=$(npm root -g) node render-video-seek.js my-animation.html --fps=60');
48
+ process.exit(1);
49
+ }
50
+
51
+ const DURATION = parseFloat(arg('duration', '30'));
52
+ const FPS = parseFloat(arg('fps', '60')); // 原生任意帧率,默认真 60fps
53
+ const WIDTH = parseInt(arg('width', '1920'));
54
+ const HEIGHT = parseInt(arg('height', '1080'));
55
+ const CONCURRENCY = Math.max(1, parseInt(arg('concurrency', '4'))); // 并行 worker 数(每个一个 page)
56
+ const SETTLE = Math.max(1, parseInt(arg('settle', '2'))); // seek 后等几个 rAF 再截图
57
+ const READY_TIMEOUT = parseFloat(arg('readytimeout', '8'));
58
+ const KEEP_CHROME = hasFlag('keep-chrome');
59
+
60
+ const HTML_ABS = path.resolve(HTML_FILE);
61
+ const BASENAME = path.basename(HTML_FILE, path.extname(HTML_FILE));
62
+ const DIR = path.dirname(HTML_ABS);
63
+ const TMP_DIR = path.join(DIR, '.seek-tmp-' + Date.now() + '-' + process.pid);
64
+ const MP4_OUT = path.join(DIR, BASENAME + '.mp4');
65
+
66
+ // 与 render-video.js 完全一致的 chrome 隐藏规则(保证两条链路出片外观一致)
67
+ const HIDE_CHROME_CSS = `
68
+ .no-record,
69
+ .progress, .progress-bar,
70
+ .counter, .tCur,
71
+ .phases, .phase-label, .phase,
72
+ .replay, button.replay,
73
+ .masthead, .kicker, .title,
74
+ .footer,
75
+ [data-role="chrome"], [data-record="hidden"] {
76
+ display: none !important;
77
+ }
78
+ `;
79
+
80
+ const TOTAL_FRAMES = Math.round(FPS * DURATION);
81
+
82
+ console.log(`▸ Seek-rendering: ${HTML_FILE}`);
83
+ console.log(` size: ${WIDTH}x${HEIGHT} · ${FPS}fps · duration: ${DURATION}s · frames: ${TOTAL_FRAMES} · workers: ${CONCURRENCY}`);
84
+ console.log(` output: ${MP4_OUT}`);
85
+
86
+ // 在 page 上下文里运行:等 SETTLE 个 rAF(让 React/Babel commit + 布局稳定后再截图)
87
+ async function waitRaf(page, n) {
88
+ await page.evaluate((count) => new Promise(resolve => {
89
+ let i = 0;
90
+ const step = () => { i++; (i >= count) ? resolve() : requestAnimationFrame(step); };
91
+ requestAnimationFrame(step);
92
+ }), n);
93
+ }
94
+
95
+ // 一个 worker:开一个 page,goto,等 __seek 就绪,渲染分配给它的帧
96
+ async function renderFrames(context, url, frames) {
97
+ const page = await context.newPage();
98
+ await page.goto(url, { waitUntil: 'load', timeout: 60000 });
99
+
100
+ // Stage / NarrationStage 在 __seekRender 模式下会暴露 window.__seek 并冻结自驱时钟
101
+ await page.waitForFunction(
102
+ () => window.__ready === true && typeof window.__seek === 'function',
103
+ { timeout: READY_TIMEOUT * 1000 },
104
+ );
105
+
106
+ for (const f of frames) {
107
+ const t = f / FPS;
108
+ await page.evaluate((tt) => window.__seek(tt), t);
109
+ await waitRaf(page, SETTLE);
110
+ await page.screenshot({
111
+ path: path.join(TMP_DIR, 'frame-' + String(f).padStart(6, '0') + '.png'),
112
+ clip: { x: 0, y: 0, width: WIDTH, height: HEIGHT },
113
+ });
114
+ }
115
+ await page.close();
116
+ }
117
+
118
+ (async () => {
119
+ fs.mkdirSync(TMP_DIR, { recursive: true });
120
+
121
+ const browser = await chromium.launch();
122
+ const url = 'file://' + HTML_ABS;
123
+
124
+ const context = await browser.newContext({
125
+ viewport: { width: WIDTH, height: HEIGHT },
126
+ deviceScaleFactor: 1,
127
+ });
128
+
129
+ // 关键信号:__seekRender 让 Stage / NarrationStage 冻结 wall-clock rAF,改由外部 __seek 推帧
130
+ // __recording 沿用,让 Stage 强制 loop=false(复用既有约定)
131
+ await context.addInitScript(() => {
132
+ window.__recording = true;
133
+ window.__seekRender = true;
134
+ });
135
+
136
+ if (!KEEP_CHROME) {
137
+ // 与 render-video.js 同款 chrome 隐藏(CSS + 固定栏启发式)
138
+ await context.addInitScript(css => {
139
+ const HIDE_MARK = 'data-video-hidden';
140
+ function injectStyle() {
141
+ const style = document.createElement('style');
142
+ style.setAttribute('data-inject', 'render-video-chrome-hide');
143
+ style.textContent = css;
144
+ (document.head || document.documentElement).appendChild(style);
145
+ }
146
+ function hideChromeBars() {
147
+ const vh = window.innerHeight;
148
+ document.querySelectorAll('div, nav, header, footer, section, aside')
149
+ .forEach(el => {
150
+ if (el.hasAttribute(HIDE_MARK)) return;
151
+ if (el.dataset.recordKeep === 'true') return;
152
+ const s = getComputedStyle(el);
153
+ if (s.position !== 'fixed' && s.position !== 'sticky') return;
154
+ const r = el.getBoundingClientRect();
155
+ if (r.height > vh * 0.25) return;
156
+ const atBottom = r.bottom >= vh - 30;
157
+ const atTop = r.top <= 30 && r.height < 80;
158
+ if (!atBottom && !atTop) return;
159
+ const txt = el.textContent || '';
160
+ const hasBtn = !!el.querySelector('button, [role="button"]');
161
+ const hasCtrls = /[⏸▶⏮⏭↻↺↩↪]|\d+\.\d+\s*s/.test(txt);
162
+ if (hasBtn || hasCtrls) {
163
+ el.style.setProperty('display', 'none', 'important');
164
+ el.setAttribute(HIDE_MARK, '1');
165
+ }
166
+ });
167
+ }
168
+ const start = () => {
169
+ injectStyle();
170
+ hideChromeBars();
171
+ const obs = new MutationObserver(hideChromeBars);
172
+ obs.observe(document.body, { childList: true, subtree: true });
173
+ setTimeout(() => obs.disconnect(), 6000);
174
+ };
175
+ if (document.readyState === 'loading') {
176
+ document.addEventListener('DOMContentLoaded', start, { once: true });
177
+ } else {
178
+ start();
179
+ }
180
+ }, HIDE_CHROME_CSS);
181
+ }
182
+
183
+ // 把帧 round-robin 分给 CONCURRENCY 个 worker(每个 page 独立 window,seek 互不干扰)
184
+ const buckets = Array.from({ length: CONCURRENCY }, () => []);
185
+ for (let f = 0; f < TOTAL_FRAMES; f++) buckets[f % CONCURRENCY].push(f);
186
+
187
+ console.log(`▸ Capturing ${TOTAL_FRAMES} frames across ${CONCURRENCY} workers…`);
188
+ try {
189
+ await Promise.all(buckets.map(b => b.length ? renderFrames(context, url, b) : Promise.resolve()));
190
+ } catch (e) {
191
+ const msg = String(e && e.message || e);
192
+ if (/__seek|__ready/.test(msg)) {
193
+ console.error('');
194
+ console.error('✗ 动画没有暴露 window.__seek(或未就绪)。');
195
+ console.error(' seek 渲染只支持走 Stage 时钟的动画(assets/animations.jsx 的 <Stage>');
196
+ console.error(' 或 narration_stage.jsx 的 <NarrationStage>)。纯 CSS @keyframes / Lottie /');
197
+ console.error(' 手写非 Stage 动画请改用 render-video.js。');
198
+ console.error('');
199
+ }
200
+ await browser.close();
201
+ fs.rmSync(TMP_DIR, { recursive: true, force: true });
202
+ console.error(msg.slice(0, 500));
203
+ process.exit(1);
204
+ }
205
+
206
+ await browser.close();
207
+
208
+ const pngCount = fs.readdirSync(TMP_DIR).filter(f => f.endsWith('.png')).length;
209
+ if (pngCount === 0) {
210
+ console.error('✗ 没有截到任何帧');
211
+ process.exit(1);
212
+ }
213
+ console.log(`▸ Captured ${pngCount}/${TOTAL_FRAMES} frames. Encoding H.264…`);
214
+
215
+ // PNG 序列 → MP4。无 trim(本来就没黑帧),输入输出帧率都设 FPS。
216
+ const ffmpeg = spawnSync('ffmpeg', [
217
+ '-y',
218
+ '-framerate', String(FPS),
219
+ '-i', path.join(TMP_DIR, 'frame-%06d.png'),
220
+ '-c:v', 'libx264',
221
+ '-pix_fmt', 'yuv420p',
222
+ '-crf', '18',
223
+ '-preset', 'medium',
224
+ '-r', String(FPS),
225
+ '-movflags', '+faststart',
226
+ MP4_OUT,
227
+ ], { stdio: ['ignore', 'ignore', 'pipe'] });
228
+
229
+ if (ffmpeg.status !== 0) {
230
+ console.error('✗ ffmpeg failed:\n' + ffmpeg.stderr.toString().slice(-2000));
231
+ process.exit(1);
232
+ }
233
+
234
+ fs.rmSync(TMP_DIR, { recursive: true, force: true });
235
+
236
+ const mp4Size = (fs.statSync(MP4_OUT).size / 1024 / 1024).toFixed(1);
237
+ console.log(`✓ Done: ${MP4_OUT} (${mp4Size} MB · ${FPS}fps native)`);
238
+ })();
@@ -0,0 +1,289 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * HTML animation → MP4 via Playwright recordVideo + ffmpeg.
4
+ *
5
+ * Requires: global playwright (`npm install -g playwright`), ffmpeg on PATH.
6
+ *
7
+ * Usage:
8
+ * NODE_PATH=$(npm root -g) node render-video.js <html-file> \
9
+ * [--duration=30] [--width=1920] [--height=1080] \
10
+ * [--trim=<seconds>] [--fontwait=1.5] [--readytimeout=8] \
11
+ * [--keep-chrome]
12
+ *
13
+ * Design:
14
+ * 1. Warmup context (no record) — caches fonts/assets, closes cleanly
15
+ * 2. Record context (fresh, recordVideo ON) — WebM starts writing at
16
+ * context creation. Babel-standalone compile + React mount +
17
+ * fonts.ready can take 1.5-3s, during which WebM writes black frames.
18
+ * We measure this by waiting for window.__ready (set by animations.jsx
19
+ * Stage component after first paint), then trim exactly that offset.
20
+ * 3. addInitScript injects CSS hiding "chrome" elements (progress bar,
21
+ * replay button, masthead, footer, etc.) that are fine for human
22
+ * debugging but shouldn't appear in exported video.
23
+ *
24
+ * Animation-ready signal:
25
+ * Set `window.__ready = true` in your HTML after first paint. This tells
26
+ * the recorder "animation has started rendering — treat now as t=0".
27
+ * If you use animations.jsx, Stage does this automatically. Otherwise
28
+ * add: `document.fonts.ready.then(() => requestAnimationFrame(() => { window.__ready = true }));`
29
+ * after your first render call.
30
+ *
31
+ * Without __ready, falls back to --fontwait=1.5s (may leave 1-2s of black
32
+ * at the start). Pass --trim=<seconds> to override manually.
33
+ *
34
+ * Chrome elements hidden by default (all common class names + `.no-record`
35
+ * convention). Pass --keep-chrome to disable this and see raw HTML.
36
+ *
37
+ * Output: next to the HTML file, same basename with .mp4 suffix.
38
+ */
39
+
40
+ const { chromium } = require('playwright');
41
+ const path = require('path');
42
+ const fs = require('fs');
43
+ const { spawnSync } = require('child_process');
44
+
45
+ function arg(name, def) {
46
+ const p = process.argv.find(a => a.startsWith('--' + name + '='));
47
+ return p ? p.slice(name.length + 3) : def;
48
+ }
49
+ function hasFlag(name) {
50
+ return process.argv.includes('--' + name);
51
+ }
52
+
53
+ const HTML_FILE = process.argv[2];
54
+ if (!HTML_FILE || HTML_FILE.startsWith('--')) {
55
+ console.error('Usage: node render-video.js <html-file>');
56
+ console.error('Example: NODE_PATH=$(npm root -g) node render-video.js my-animation.html');
57
+ process.exit(1);
58
+ }
59
+
60
+ const DURATION = parseFloat(arg('duration', '30'));
61
+ const WIDTH = parseInt(arg('width', '1920'));
62
+ const HEIGHT = parseInt(arg('height', '1080'));
63
+ const TRIM_OVERRIDE = arg('trim', null); // manual override (seconds). If unset, auto-detected.
64
+ const FONT_WAIT = parseFloat(arg('fontwait', '1.5')); // fallback when no __ready signal
65
+ const READY_TIMEOUT = parseFloat(arg('readytimeout', '8'));
66
+ const KEEP_CHROME = hasFlag('keep-chrome');
67
+
68
+ const HTML_ABS = path.resolve(HTML_FILE);
69
+ const BASENAME = path.basename(HTML_FILE, path.extname(HTML_FILE));
70
+ const DIR = path.dirname(HTML_ABS);
71
+ const TMP_DIR = path.join(DIR, '.video-tmp-' + Date.now() + '-' + process.pid);
72
+ const MP4_OUT = path.join(DIR, BASENAME + '.mp4');
73
+
74
+ // CSS to hide "chrome" elements during recording.
75
+ // Covers class-name conventions seen across skill-built animations,
76
+ // plus a `.no-record` explicit opt-out class.
77
+ const HIDE_CHROME_CSS = `
78
+ .no-record,
79
+ .progress, .progress-bar,
80
+ .counter, .tCur,
81
+ .phases, .phase-label, .phase,
82
+ .replay, button.replay,
83
+ .masthead, .kicker, .title,
84
+ .footer,
85
+ [data-role="chrome"], [data-record="hidden"] {
86
+ display: none !important;
87
+ }
88
+ `;
89
+
90
+ console.log(`▸ Rendering: ${HTML_FILE}`);
91
+ console.log(` size: ${WIDTH}x${HEIGHT} · duration: ${DURATION}s · hide-chrome: ${!KEEP_CHROME}`);
92
+ console.log(` output: ${MP4_OUT}`);
93
+
94
+ (async () => {
95
+ fs.mkdirSync(TMP_DIR, { recursive: true });
96
+
97
+ const browser = await chromium.launch();
98
+ const url = 'file://' + HTML_ABS;
99
+
100
+ // ── Phase 1: WARMUP (no recording, caches fonts/assets) ─────────────
101
+ console.log('▸ Warmup (caching fonts)…');
102
+ const warmupCtx = await browser.newContext({
103
+ viewport: { width: WIDTH, height: HEIGHT },
104
+ });
105
+ const warmupPage = await warmupCtx.newPage();
106
+ // 'load' not 'networkidle' — unpkg/Google Fonts can keep connections alive
107
+ // past our 30s budget even after all critical resources are in. __ready
108
+ // flag + FONT_WAIT handle animation-readiness properly.
109
+ await warmupPage.goto(url, { waitUntil: 'load', timeout: 60000 });
110
+ await warmupPage.waitForTimeout(FONT_WAIT * 1000);
111
+ await warmupCtx.close();
112
+
113
+ // ── Phase 2: RECORD (fresh context, animation from t=0) ─────────────
114
+ console.log('▸ Recording (clean start)…');
115
+ const recordCtx = await browser.newContext({
116
+ viewport: { width: WIDTH, height: HEIGHT },
117
+ deviceScaleFactor: 1,
118
+ recordVideo: {
119
+ dir: TMP_DIR,
120
+ size: { width: WIDTH, height: HEIGHT },
121
+ },
122
+ });
123
+
124
+ // Tell the page it's being recorded — animations.jsx Stage reads this
125
+ // and forces loop=false so the export ends on the final frame instead of
126
+ // capturing the start of the next cycle. Hand-written Stage components
127
+ // should also honor this signal (see animation-pitfalls.md §13).
128
+ await recordCtx.addInitScript(() => { window.__recording = true; });
129
+
130
+ // Inject CSS + JS heuristic to hide "chrome" elements.
131
+ // Two layers:
132
+ // A. CSS selectors for common class-name conventions (cheap)
133
+ // B. JS heuristic for fixed-position bars containing buttons or time
134
+ // readouts (catches inline-styled chrome like <Stage> controls)
135
+ // Persists across reloads via addInitScript.
136
+ if (!KEEP_CHROME) {
137
+ await recordCtx.addInitScript(css => {
138
+ const HIDE_MARK = 'data-video-hidden';
139
+
140
+ function injectStyle() {
141
+ const style = document.createElement('style');
142
+ style.setAttribute('data-inject', 'render-video-chrome-hide');
143
+ style.textContent = css;
144
+ (document.head || document.documentElement).appendChild(style);
145
+ }
146
+
147
+ function hideChromeBars() {
148
+ const vh = window.innerHeight;
149
+ document.querySelectorAll('div, nav, header, footer, section, aside')
150
+ .forEach(el => {
151
+ if (el.hasAttribute(HIDE_MARK)) return;
152
+ if (el.dataset.recordKeep === 'true') return;
153
+ const s = getComputedStyle(el);
154
+ if (s.position !== 'fixed' && s.position !== 'sticky') return;
155
+ const r = el.getBoundingClientRect();
156
+ // Only skinny bars (not full-screen overlays)
157
+ if (r.height > vh * 0.25) return;
158
+ const atBottom = r.bottom >= vh - 30;
159
+ const atTop = r.top <= 30 && r.height < 80;
160
+ if (!atBottom && !atTop) return;
161
+ // Chrome-like: contains button or scrubber/time glyphs
162
+ const txt = el.textContent || '';
163
+ const hasBtn = !!el.querySelector('button, [role="button"]');
164
+ const hasCtrls = /[⏸▶⏮⏭↻↺↩↪]|\d+\.\d+\s*s/.test(txt);
165
+ if (hasBtn || hasCtrls) {
166
+ el.style.setProperty('display', 'none', 'important');
167
+ el.setAttribute(HIDE_MARK, '1');
168
+ }
169
+ });
170
+ }
171
+
172
+ const start = () => {
173
+ injectStyle();
174
+ hideChromeBars();
175
+ // Re-run as React/Vue commits DOM changes
176
+ const obs = new MutationObserver(hideChromeBars);
177
+ obs.observe(document.body, { childList: true, subtree: true });
178
+ setTimeout(() => obs.disconnect(), 6000);
179
+ };
180
+
181
+ if (document.readyState === 'loading') {
182
+ document.addEventListener('DOMContentLoaded', start, { once: true });
183
+ } else {
184
+ start();
185
+ }
186
+ }, HIDE_CHROME_CSS);
187
+ }
188
+
189
+ // Record context opens page. The WebM starts writing the moment the
190
+ // context is created — so we track T0 here and measure how many seconds
191
+ // elapse before the animation is actually ready (Babel compile + React
192
+ // mount + fonts.ready). That elapsed time = exact trim offset.
193
+ const T0 = Date.now();
194
+ const page = await recordCtx.newPage();
195
+ await page.goto(url, { waitUntil: 'load', timeout: 60000 });
196
+
197
+ // Wait for animation ready signal. Stage component (animations.jsx) sets
198
+ // window.__ready = true on its first rAF after mount + fonts.ready.
199
+ // Fallback: if HTML doesn't set __ready within READY_TIMEOUT, use fontwait.
200
+ let animationStartSec;
201
+ const hasReady = await page.waitForFunction(
202
+ () => window.__ready === true,
203
+ { timeout: READY_TIMEOUT * 1000 },
204
+ ).then(() => true).catch(() => false);
205
+
206
+ if (hasReady) {
207
+ // 第二道防线:主动把动画 time 归零——对付 HTML 不严格遵守 starter tick 模板
208
+ // 的情况(例如 lastTick 用 performance.now() 导致字体加载时间被算进首帧 dt)
209
+ // 详见 references/animation-pitfalls.md §12
210
+ const seekCorrected = await page.evaluate(() => {
211
+ if (typeof window.__seek === 'function') {
212
+ window.__seek(0);
213
+ return true;
214
+ }
215
+ return false;
216
+ });
217
+ if (seekCorrected) {
218
+ // 等两个 rAF 让 seek 生效并渲染出 t=0 的画面
219
+ await page.evaluate(() => new Promise(r => requestAnimationFrame(() => requestAnimationFrame(r))));
220
+ }
221
+ animationStartSec = (Date.now() - T0) / 1000;
222
+ console.log(`▸ Ready at ${animationStartSec.toFixed(2)}s (from window.__ready${seekCorrected ? ' + __seek(0) correction' : ''})`);
223
+ } else {
224
+ await page.waitForTimeout(FONT_WAIT * 1000);
225
+ animationStartSec = (Date.now() - T0) / 1000;
226
+ // Fallback offset is unreliable: animation may have started in raf loop
227
+ // already, so trim could land mid-cycle. Add 0.5s safety margin (see
228
+ // animation-pitfalls.md §13). Loud warning so user knows to fix the HTML.
229
+ console.log('');
230
+ console.log(` ⚠️ WARNING: window.__ready signal not detected within ${READY_TIMEOUT}s`);
231
+ console.log(` Recording will use fallback trim of ${animationStartSec.toFixed(2)}s + 0.5s safety margin.`);
232
+ console.log(` This is UNRELIABLE — your video may start mid-animation or skip frames.`);
233
+ console.log('');
234
+ console.log(` FIX: in your HTML's animation tick (or rAF first frame), add:`);
235
+ console.log(` window.__ready = true;`);
236
+ console.log(` animations.jsx-based HTML does this automatically. If you wrote your`);
237
+ console.log(` own Stage, see references/animation-pitfalls.md §12 for the pattern.`);
238
+ console.log('');
239
+ }
240
+
241
+ // Now let the animation play out its full duration
242
+ await page.waitForTimeout(DURATION * 1000 + 300);
243
+
244
+ await page.close();
245
+ await recordCtx.close();
246
+ await browser.close();
247
+
248
+ const webmFiles = fs.readdirSync(TMP_DIR).filter(f => f.endsWith('.webm'));
249
+ if (webmFiles.length === 0) {
250
+ console.error('✗ No webm produced');
251
+ process.exit(1);
252
+ }
253
+ const webmPath = path.join(TMP_DIR, webmFiles[0]);
254
+ console.log(`▸ WebM: ${(fs.statSync(webmPath).size / 1024 / 1024).toFixed(1)} MB`);
255
+
256
+ // Resolve final trim offset:
257
+ // - manual --trim=X → use X (explicit user override)
258
+ // - hasReady → animationStartSec + 0.05s (Babel-commit nudge)
259
+ // - fallback (no __ready) → animationStartSec + 0.5s safety margin (raf
260
+ // loop may have started running already; without
261
+ // this we'd capture mid-cycle frames)
262
+ const resolvedTrim = TRIM_OVERRIDE !== null
263
+ ? parseFloat(TRIM_OVERRIDE)
264
+ : animationStartSec + (hasReady ? 0.05 : 0.5);
265
+
266
+ console.log(`▸ ffmpeg: trim=${resolvedTrim.toFixed(2)}s${TRIM_OVERRIDE !== null ? ' (manual)' : ' (auto)'}, encode H.264…`);
267
+ const ffmpeg = spawnSync('ffmpeg', [
268
+ '-y',
269
+ '-ss', String(resolvedTrim),
270
+ '-i', webmPath,
271
+ '-t', String(DURATION),
272
+ '-c:v', 'libx264',
273
+ '-pix_fmt', 'yuv420p',
274
+ '-crf', '18',
275
+ '-preset', 'medium',
276
+ '-movflags', '+faststart',
277
+ MP4_OUT,
278
+ ], { stdio: ['ignore', 'ignore', 'pipe'] });
279
+
280
+ if (ffmpeg.status !== 0) {
281
+ console.error('✗ ffmpeg failed:\n' + ffmpeg.stderr.toString().slice(-2000));
282
+ process.exit(1);
283
+ }
284
+
285
+ fs.rmSync(TMP_DIR, { recursive: true, force: true });
286
+
287
+ const mp4Size = (fs.statSync(MP4_OUT).size / 1024 / 1024).toFixed(1);
288
+ console.log(`✓ Done: ${MP4_OUT} (${mp4Size} MB)`);
289
+ })();