@stacksjs/defaults 0.75.109 → 0.75.110

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 (748) hide show
  1. package/ai/AGENTS.md +36 -1
  2. package/ai/README.md +39 -1
  3. package/ai/skills/stacks-actions/SKILL.md +64 -6
  4. package/ai/skills/stacks-ai/SKILL.md +36 -10
  5. package/ai/skills/stacks-alias/SKILL.md +40 -85
  6. package/ai/skills/stacks-analytics/SKILL.md +23 -3
  7. package/ai/skills/stacks-arrays/SKILL.md +35 -9
  8. package/ai/skills/stacks-audio/SKILL.md +34 -0
  9. package/ai/skills/stacks-auth/ACCOUNT-WORKFLOWS.md +113 -0
  10. package/ai/skills/stacks-auth/SKILL.md +90 -57
  11. package/ai/skills/stacks-auto-imports/SKILL.md +80 -138
  12. package/ai/skills/stacks-browser/SKILL.md +82 -138
  13. package/ai/skills/stacks-browser-extension/SKILL.md +40 -0
  14. package/ai/skills/stacks-buddy/SKILL.md +2 -0
  15. package/ai/skills/stacks-build/SKILL.md +42 -23
  16. package/ai/skills/stacks-cache/SKILL.md +75 -115
  17. package/ai/skills/stacks-calendar/SKILL.md +61 -97
  18. package/ai/skills/stacks-charts/SKILL.md +34 -0
  19. package/ai/skills/stacks-chat/SKILL.md +18 -2
  20. package/ai/skills/stacks-chief-of-staff/LICENSE +21 -0
  21. package/ai/skills/stacks-chief-of-staff/NOTICE.md +10 -0
  22. package/ai/skills/stacks-chief-of-staff/PLAYBOOK.md +42 -0
  23. package/ai/skills/stacks-chief-of-staff/SKILL.md +28 -0
  24. package/ai/skills/stacks-cli/SKILL.md +23 -7
  25. package/ai/skills/stacks-cloud/SKILL.md +37 -20
  26. package/ai/skills/stacks-cms/PAGES.md +70 -0
  27. package/ai/skills/stacks-cms/SKILL.md +30 -18
  28. package/ai/skills/stacks-codebase-design/LICENSE +21 -0
  29. package/ai/skills/stacks-codebase-design/NOTICE.md +10 -0
  30. package/ai/skills/stacks-codebase-design/SKILL.md +10 -0
  31. package/ai/skills/stacks-collections/SKILL.md +25 -8
  32. package/ai/skills/stacks-commerce/SKILL.md +25 -1
  33. package/ai/skills/stacks-composables/BROWSER.md +97 -0
  34. package/ai/skills/stacks-composables/SKILL.md +87 -181
  35. package/ai/skills/stacks-config/SKILL.md +108 -162
  36. package/ai/skills/stacks-cron/SKILL.md +27 -13
  37. package/ai/skills/stacks-crosswind/SKILL.md +62 -167
  38. package/ai/skills/stacks-dashboard/SKILL.md +8 -0
  39. package/ai/skills/stacks-database/SKILL.md +98 -68
  40. package/ai/skills/stacks-datetime/SKILL.md +21 -5
  41. package/ai/skills/stacks-deploy/SKILL.md +17 -1
  42. package/ai/skills/stacks-design-brutalist/SKILL.md +1 -1
  43. package/ai/skills/stacks-design-minimalist/SKILL.md +17 -3
  44. package/ai/skills/stacks-design-soft/SKILL.md +16 -4
  45. package/ai/skills/stacks-design-taste/SKILL.md +55 -35
  46. package/ai/skills/stacks-design-taste-codex/SKILL.md +5 -5
  47. package/ai/skills/stacks-desktop/SKILL.md +22 -16
  48. package/ai/skills/stacks-development/SKILL.md +19 -8
  49. package/ai/skills/stacks-dns/SKILL.md +72 -139
  50. package/ai/skills/stacks-domain-modeling/ADR-FORMAT.md +47 -0
  51. package/ai/skills/stacks-domain-modeling/GLOSSARY-FORMAT.md +60 -0
  52. package/ai/skills/stacks-domain-modeling/LICENSE +21 -0
  53. package/ai/skills/stacks-domain-modeling/NOTICE.md +10 -0
  54. package/ai/skills/stacks-domain-modeling/SKILL.md +11 -0
  55. package/ai/skills/stacks-email/DELIVERY-CONTROLS.md +84 -0
  56. package/ai/skills/stacks-email/SKILL.md +18 -2
  57. package/ai/skills/stacks-enums/SKILL.md +28 -81
  58. package/ai/skills/stacks-env/SKILL.md +23 -15
  59. package/ai/skills/stacks-error-handling/SKILL.md +68 -121
  60. package/ai/skills/stacks-events/SKILL.md +83 -264
  61. package/ai/skills/stacks-faker/SKILL.md +28 -13
  62. package/ai/skills/stacks-feature-flags/SKILL.md +41 -0
  63. package/ai/skills/stacks-features/SKILL.md +46 -0
  64. package/ai/skills/stacks-flow/ENGINEERING.md +84 -0
  65. package/ai/skills/stacks-flow/LICENSE +21 -0
  66. package/ai/skills/stacks-flow/NOTICE.md +10 -0
  67. package/ai/skills/stacks-flow/SKILL.md +32 -0
  68. package/ai/skills/stacks-flow/upstream-skills.json +726 -0
  69. package/ai/skills/stacks-forms/SKILL.md +44 -0
  70. package/ai/skills/stacks-git/LICENSE +21 -0
  71. package/ai/skills/stacks-git/NOTICE.md +10 -0
  72. package/ai/skills/stacks-git/SKILL.md +11 -0
  73. package/ai/skills/stacks-grill-with-docs/LICENSE +21 -0
  74. package/ai/skills/stacks-grill-with-docs/NOTICE.md +10 -0
  75. package/ai/skills/stacks-grill-with-docs/PLAYBOOK.md +4 -0
  76. package/ai/skills/stacks-grill-with-docs/SKILL.md +24 -0
  77. package/ai/skills/stacks-grilling/LICENSE +21 -0
  78. package/ai/skills/stacks-grilling/NOTICE.md +17 -0
  79. package/ai/skills/stacks-grilling/SKILL.md +7 -0
  80. package/ai/skills/stacks-guard/LICENSE +21 -0
  81. package/ai/skills/stacks-guard/NOTICE.md +10 -0
  82. package/ai/skills/stacks-guard/SKILL.md +6 -0
  83. package/ai/skills/stacks-handoff/LICENSE +21 -0
  84. package/ai/skills/stacks-handoff/NOTICE.md +17 -0
  85. package/ai/skills/stacks-handoff/SKILL.md +8 -0
  86. package/ai/skills/stacks-http/SKILL.md +64 -297
  87. package/ai/skills/stacks-humanizer/LICENSE +21 -0
  88. package/ai/skills/stacks-humanizer/NOTICE.md +19 -0
  89. package/ai/skills/stacks-humanizer/SKILL.md +85 -0
  90. package/ai/skills/stacks-humanizer/references/patterns.md +350 -0
  91. package/ai/skills/stacks-i18n/SKILL.md +33 -8
  92. package/ai/skills/stacks-image/SKILL.md +37 -0
  93. package/ai/skills/stacks-image-to-code/SKILL.md +11 -6
  94. package/ai/skills/stacks-implement/LICENSE +21 -0
  95. package/ai/skills/stacks-implement/NOTICE.md +10 -0
  96. package/ai/skills/stacks-implement/PLAYBOOK.md +14 -0
  97. package/ai/skills/stacks-implement/SKILL.md +24 -0
  98. package/ai/skills/stacks-implement-spec/LICENSE +21 -0
  99. package/ai/skills/stacks-implement-spec/NOTICE.md +10 -0
  100. package/ai/skills/stacks-implement-spec/PLAYBOOK.md +37 -0
  101. package/ai/skills/stacks-implement-spec/SKILL.md +24 -0
  102. package/ai/skills/stacks-improve-codebase-architecture/HTML-REPORT.md +126 -0
  103. package/ai/skills/stacks-improve-codebase-architecture/LICENSE +21 -0
  104. package/ai/skills/stacks-improve-codebase-architecture/NOTICE.md +10 -0
  105. package/ai/skills/stacks-improve-codebase-architecture/PLAYBOOK.md +68 -0
  106. package/ai/skills/stacks-improve-codebase-architecture/SKILL.md +24 -0
  107. package/ai/skills/stacks-investigate/LICENSE +21 -0
  108. package/ai/skills/stacks-investigate/NOTICE.md +10 -0
  109. package/ai/skills/stacks-investigate/SKILL.md +6 -0
  110. package/ai/skills/stacks-jobs/SKILL.md +29 -8
  111. package/ai/skills/stacks-listeners/SKILL.md +13 -5
  112. package/ai/skills/stacks-logging/SKILL.md +71 -68
  113. package/ai/skills/stacks-loop/LICENSE +21 -0
  114. package/ai/skills/stacks-loop/NOTICE.md +10 -0
  115. package/ai/skills/stacks-loop/PLAYBOOK.md +28 -0
  116. package/ai/skills/stacks-loop/SKILL.md +28 -0
  117. package/ai/skills/stacks-mail/SKILL.md +46 -7
  118. package/ai/skills/stacks-marketing/CATALOG.md +60 -0
  119. package/ai/skills/stacks-marketing/LICENSE +21 -0
  120. package/ai/skills/stacks-marketing/NOTICE.md +5 -0
  121. package/ai/skills/stacks-marketing/SKILL.md +27 -0
  122. package/ai/skills/stacks-marketing/WORKFLOW.md +83 -0
  123. package/ai/skills/stacks-marketing-ab-testing/LICENSE +21 -0
  124. package/ai/skills/stacks-marketing-ab-testing/NOTICE.md +13 -0
  125. package/ai/skills/stacks-marketing-ab-testing/PLAYBOOK.md +352 -0
  126. package/ai/skills/stacks-marketing-ab-testing/SKILL.md +30 -0
  127. package/ai/skills/stacks-marketing-ab-testing/evals/evals.json +116 -0
  128. package/ai/skills/stacks-marketing-ab-testing/references/sample-size-guide.md +263 -0
  129. package/ai/skills/stacks-marketing-ab-testing/references/test-templates.md +277 -0
  130. package/ai/skills/stacks-marketing-ad-creative/LICENSE +21 -0
  131. package/ai/skills/stacks-marketing-ad-creative/NOTICE.md +13 -0
  132. package/ai/skills/stacks-marketing-ad-creative/PLAYBOOK.md +434 -0
  133. package/ai/skills/stacks-marketing-ad-creative/SKILL.md +30 -0
  134. package/ai/skills/stacks-marketing-ad-creative/assets/creative-review-template.html +432 -0
  135. package/ai/skills/stacks-marketing-ad-creative/evals/evals.json +280 -0
  136. package/ai/skills/stacks-marketing-ad-creative/references/awareness-headlines.md +54 -0
  137. package/ai/skills/stacks-marketing-ad-creative/references/creative-review-page.md +109 -0
  138. package/ai/skills/stacks-marketing-ad-creative/references/creative-roadmap.md +118 -0
  139. package/ai/skills/stacks-marketing-ad-creative/references/generative-tools.md +613 -0
  140. package/ai/skills/stacks-marketing-ad-creative/references/hook-system.md +115 -0
  141. package/ai/skills/stacks-marketing-ad-creative/references/imessage-video-ads.md +197 -0
  142. package/ai/skills/stacks-marketing-ad-creative/references/meta-creative-formats.md +114 -0
  143. package/ai/skills/stacks-marketing-ad-creative/references/motion-video-ads.md +126 -0
  144. package/ai/skills/stacks-marketing-ad-creative/references/platform-specs.md +213 -0
  145. package/ai/skills/stacks-marketing-ad-creative/references/short-form-video-specs.md +213 -0
  146. package/ai/skills/stacks-marketing-ad-creative/references/static-ad-templates.md +308 -0
  147. package/ai/skills/stacks-marketing-ads/LICENSE +21 -0
  148. package/ai/skills/stacks-marketing-ads/NOTICE.md +13 -0
  149. package/ai/skills/stacks-marketing-ads/PLAYBOOK.md +464 -0
  150. package/ai/skills/stacks-marketing-ads/SKILL.md +30 -0
  151. package/ai/skills/stacks-marketing-ads/evals/evals.json +192 -0
  152. package/ai/skills/stacks-marketing-ads/references/abm-playbook.md +101 -0
  153. package/ai/skills/stacks-marketing-ads/references/ad-copy-templates.md +207 -0
  154. package/ai/skills/stacks-marketing-ads/references/audience-targeting.md +243 -0
  155. package/ai/skills/stacks-marketing-ads/references/audit-guardrails.md +83 -0
  156. package/ai/skills/stacks-marketing-ads/references/b2b-paid-playbook.md +115 -0
  157. package/ai/skills/stacks-marketing-ads/references/conversion-tracking.md +361 -0
  158. package/ai/skills/stacks-marketing-ads/references/creative-research-automation.md +103 -0
  159. package/ai/skills/stacks-marketing-ads/references/google-ads-audit-checklist.md +84 -0
  160. package/ai/skills/stacks-marketing-ads/references/google-search-playbook.md +120 -0
  161. package/ai/skills/stacks-marketing-ads/references/linkedin-b2b-playbook.md +107 -0
  162. package/ai/skills/stacks-marketing-ads/references/meta-andromeda-playbook.md +44 -0
  163. package/ai/skills/stacks-marketing-ads/references/meta-decision-system.md +176 -0
  164. package/ai/skills/stacks-marketing-ads/references/payback-period.md +73 -0
  165. package/ai/skills/stacks-marketing-ads/references/platform-setup-checklists.md +277 -0
  166. package/ai/skills/stacks-marketing-ads/references/reading-google-ads-data.md +121 -0
  167. package/ai/skills/stacks-marketing-ads/references/rsa-output-spec.md +88 -0
  168. package/ai/skills/stacks-marketing-ai-seo/LICENSE +21 -0
  169. package/ai/skills/stacks-marketing-ai-seo/NOTICE.md +13 -0
  170. package/ai/skills/stacks-marketing-ai-seo/PLAYBOOK.md +494 -0
  171. package/ai/skills/stacks-marketing-ai-seo/SKILL.md +30 -0
  172. package/ai/skills/stacks-marketing-ai-seo/evals/evals.json +163 -0
  173. package/ai/skills/stacks-marketing-ai-seo/references/agent-readiness.md +66 -0
  174. package/ai/skills/stacks-marketing-ai-seo/references/citations-vs-recommendations.md +89 -0
  175. package/ai/skills/stacks-marketing-ai-seo/references/content-patterns.md +287 -0
  176. package/ai/skills/stacks-marketing-ai-seo/references/content-types.md +82 -0
  177. package/ai/skills/stacks-marketing-ai-seo/references/format-volatility.md +95 -0
  178. package/ai/skills/stacks-marketing-ai-seo/references/linkedin-ai-citations.md +131 -0
  179. package/ai/skills/stacks-marketing-ai-seo/references/okf.md +104 -0
  180. package/ai/skills/stacks-marketing-ai-seo/references/platform-ranking-factors.md +167 -0
  181. package/ai/skills/stacks-marketing-ai-seo/references/positioning-and-consensus.md +102 -0
  182. package/ai/skills/stacks-marketing-ai-seo/references/youtube-ai-citations.md +66 -0
  183. package/ai/skills/stacks-marketing-analytics/LICENSE +21 -0
  184. package/ai/skills/stacks-marketing-analytics/NOTICE.md +13 -0
  185. package/ai/skills/stacks-marketing-analytics/PLAYBOOK.md +307 -0
  186. package/ai/skills/stacks-marketing-analytics/SKILL.md +30 -0
  187. package/ai/skills/stacks-marketing-analytics/evals/evals.json +117 -0
  188. package/ai/skills/stacks-marketing-analytics/references/event-library.md +260 -0
  189. package/ai/skills/stacks-marketing-analytics/references/ga4-implementation.md +304 -0
  190. package/ai/skills/stacks-marketing-analytics/references/gtm-implementation.md +396 -0
  191. package/ai/skills/stacks-marketing-aso/LICENSE +21 -0
  192. package/ai/skills/stacks-marketing-aso/NOTICE.md +13 -0
  193. package/ai/skills/stacks-marketing-aso/PLAYBOOK.md +310 -0
  194. package/ai/skills/stacks-marketing-aso/SKILL.md +30 -0
  195. package/ai/skills/stacks-marketing-aso/evals/evals.json +104 -0
  196. package/ai/skills/stacks-marketing-aso/references/apple-specs.md +107 -0
  197. package/ai/skills/stacks-marketing-aso/references/benchmarks.md +131 -0
  198. package/ai/skills/stacks-marketing-aso/references/google-play-specs.md +135 -0
  199. package/ai/skills/stacks-marketing-aso/references/report-template.md +213 -0
  200. package/ai/skills/stacks-marketing-aso/references/scoring-criteria.md +213 -0
  201. package/ai/skills/stacks-marketing-attribution/LICENSE +21 -0
  202. package/ai/skills/stacks-marketing-attribution/NOTICE.md +13 -0
  203. package/ai/skills/stacks-marketing-attribution/PLAYBOOK.md +223 -0
  204. package/ai/skills/stacks-marketing-attribution/SKILL.md +30 -0
  205. package/ai/skills/stacks-marketing-attribution/evals/evals.json +128 -0
  206. package/ai/skills/stacks-marketing-attribution/references/attribution-models.md +74 -0
  207. package/ai/skills/stacks-marketing-attribution/references/by-business-type.md +54 -0
  208. package/ai/skills/stacks-marketing-attribution/references/first-party-tracking.md +253 -0
  209. package/ai/skills/stacks-marketing-attribution/references/measurement-paradigms.md +85 -0
  210. package/ai/skills/stacks-marketing-churn-prevention/LICENSE +21 -0
  211. package/ai/skills/stacks-marketing-churn-prevention/NOTICE.md +13 -0
  212. package/ai/skills/stacks-marketing-churn-prevention/PLAYBOOK.md +420 -0
  213. package/ai/skills/stacks-marketing-churn-prevention/SKILL.md +30 -0
  214. package/ai/skills/stacks-marketing-churn-prevention/evals/evals.json +107 -0
  215. package/ai/skills/stacks-marketing-churn-prevention/references/cancel-flow-patterns.md +316 -0
  216. package/ai/skills/stacks-marketing-churn-prevention/references/dunning-playbook.md +413 -0
  217. package/ai/skills/stacks-marketing-co-marketing/LICENSE +21 -0
  218. package/ai/skills/stacks-marketing-co-marketing/NOTICE.md +13 -0
  219. package/ai/skills/stacks-marketing-co-marketing/PLAYBOOK.md +306 -0
  220. package/ai/skills/stacks-marketing-co-marketing/SKILL.md +30 -0
  221. package/ai/skills/stacks-marketing-co-marketing/evals/evals.json +98 -0
  222. package/ai/skills/stacks-marketing-co-marketing/references/partnership-types.md +100 -0
  223. package/ai/skills/stacks-marketing-cold-email/LICENSE +21 -0
  224. package/ai/skills/stacks-marketing-cold-email/NOTICE.md +13 -0
  225. package/ai/skills/stacks-marketing-cold-email/PLAYBOOK.md +210 -0
  226. package/ai/skills/stacks-marketing-cold-email/SKILL.md +30 -0
  227. package/ai/skills/stacks-marketing-cold-email/evals/evals.json +137 -0
  228. package/ai/skills/stacks-marketing-cold-email/references/benchmarks.md +87 -0
  229. package/ai/skills/stacks-marketing-cold-email/references/deliverability.md +111 -0
  230. package/ai/skills/stacks-marketing-cold-email/references/follow-up-sequences.md +81 -0
  231. package/ai/skills/stacks-marketing-cold-email/references/frameworks.md +90 -0
  232. package/ai/skills/stacks-marketing-cold-email/references/linkedin-outreach.md +91 -0
  233. package/ai/skills/stacks-marketing-cold-email/references/multichannel-cadence.md +79 -0
  234. package/ai/skills/stacks-marketing-cold-email/references/outbound-plays.md +88 -0
  235. package/ai/skills/stacks-marketing-cold-email/references/personalization.md +90 -0
  236. package/ai/skills/stacks-marketing-cold-email/references/reply-handling.md +65 -0
  237. package/ai/skills/stacks-marketing-cold-email/references/subject-lines.md +53 -0
  238. package/ai/skills/stacks-marketing-community-marketing/LICENSE +21 -0
  239. package/ai/skills/stacks-marketing-community-marketing/NOTICE.md +13 -0
  240. package/ai/skills/stacks-marketing-community-marketing/PLAYBOOK.md +171 -0
  241. package/ai/skills/stacks-marketing-community-marketing/SKILL.md +30 -0
  242. package/ai/skills/stacks-marketing-community-marketing/evals/evals.json +103 -0
  243. package/ai/skills/stacks-marketing-community-marketing/references/community-models.md +63 -0
  244. package/ai/skills/stacks-marketing-competitor-profiling/LICENSE +21 -0
  245. package/ai/skills/stacks-marketing-competitor-profiling/NOTICE.md +13 -0
  246. package/ai/skills/stacks-marketing-competitor-profiling/PLAYBOOK.md +436 -0
  247. package/ai/skills/stacks-marketing-competitor-profiling/SKILL.md +30 -0
  248. package/ai/skills/stacks-marketing-competitor-profiling/evals/evals.json +97 -0
  249. package/ai/skills/stacks-marketing-competitor-profiling/references/templates.md +167 -0
  250. package/ai/skills/stacks-marketing-competitor-profiling/references/tool-reference.md +314 -0
  251. package/ai/skills/stacks-marketing-competitors/LICENSE +21 -0
  252. package/ai/skills/stacks-marketing-competitors/NOTICE.md +13 -0
  253. package/ai/skills/stacks-marketing-competitors/PLAYBOOK.md +283 -0
  254. package/ai/skills/stacks-marketing-competitors/SKILL.md +30 -0
  255. package/ai/skills/stacks-marketing-competitors/evals/evals.json +119 -0
  256. package/ai/skills/stacks-marketing-competitors/references/content-architecture.md +277 -0
  257. package/ai/skills/stacks-marketing-competitors/references/templates.md +226 -0
  258. package/ai/skills/stacks-marketing-content-strategy/LICENSE +21 -0
  259. package/ai/skills/stacks-marketing-content-strategy/NOTICE.md +13 -0
  260. package/ai/skills/stacks-marketing-content-strategy/PLAYBOOK.md +437 -0
  261. package/ai/skills/stacks-marketing-content-strategy/SKILL.md +30 -0
  262. package/ai/skills/stacks-marketing-content-strategy/evals/evals.json +116 -0
  263. package/ai/skills/stacks-marketing-content-strategy/references/content-distribution.md +83 -0
  264. package/ai/skills/stacks-marketing-content-strategy/references/headless-cms.md +194 -0
  265. package/ai/skills/stacks-marketing-copy-editing/LICENSE +21 -0
  266. package/ai/skills/stacks-marketing-copy-editing/NOTICE.md +13 -0
  267. package/ai/skills/stacks-marketing-copy-editing/PLAYBOOK.md +485 -0
  268. package/ai/skills/stacks-marketing-copy-editing/SKILL.md +30 -0
  269. package/ai/skills/stacks-marketing-copy-editing/evals/evals.json +117 -0
  270. package/ai/skills/stacks-marketing-copy-editing/references/checklist.md +77 -0
  271. package/ai/skills/stacks-marketing-copy-editing/references/content-refresh.md +71 -0
  272. package/ai/skills/stacks-marketing-copy-editing/references/plain-english-alternatives.md +394 -0
  273. package/ai/skills/stacks-marketing-copywriting/LICENSE +21 -0
  274. package/ai/skills/stacks-marketing-copywriting/NOTICE.md +13 -0
  275. package/ai/skills/stacks-marketing-copywriting/PLAYBOOK.md +282 -0
  276. package/ai/skills/stacks-marketing-copywriting/SKILL.md +30 -0
  277. package/ai/skills/stacks-marketing-copywriting/evals/evals.json +140 -0
  278. package/ai/skills/stacks-marketing-copywriting/references/ai-tells.md +261 -0
  279. package/ai/skills/stacks-marketing-copywriting/references/copy-frameworks.md +432 -0
  280. package/ai/skills/stacks-marketing-copywriting/references/natural-transitions.md +256 -0
  281. package/ai/skills/stacks-marketing-council/LICENSE +21 -0
  282. package/ai/skills/stacks-marketing-council/NOTICE.md +13 -0
  283. package/ai/skills/stacks-marketing-council/PLAYBOOK.md +157 -0
  284. package/ai/skills/stacks-marketing-council/SKILL.md +30 -0
  285. package/ai/skills/stacks-marketing-council/evals/evals.json +70 -0
  286. package/ai/skills/stacks-marketing-council/references/advisor-template.md +51 -0
  287. package/ai/skills/stacks-marketing-council/references/advisors/alex-hormozi.md +43 -0
  288. package/ai/skills/stacks-marketing-council/references/advisors/ann-handley.md +43 -0
  289. package/ai/skills/stacks-marketing-council/references/advisors/april-dunford.md +41 -0
  290. package/ai/skills/stacks-marketing-council/references/advisors/byron-sharp.md +43 -0
  291. package/ai/skills/stacks-marketing-council/references/advisors/claude-hopkins.md +42 -0
  292. package/ai/skills/stacks-marketing-council/references/advisors/david-ogilvy.md +42 -0
  293. package/ai/skills/stacks-marketing-council/references/advisors/eugene-schwartz.md +42 -0
  294. package/ai/skills/stacks-marketing-council/references/advisors/gary-halbert.md +43 -0
  295. package/ai/skills/stacks-marketing-council/references/advisors/gary-vaynerchuk.md +43 -0
  296. package/ai/skills/stacks-marketing-council/references/advisors/rory-sutherland.md +42 -0
  297. package/ai/skills/stacks-marketing-council/references/advisors/russell-brunson.md +43 -0
  298. package/ai/skills/stacks-marketing-council/references/advisors/seth-godin.md +43 -0
  299. package/ai/skills/stacks-marketing-cro/LICENSE +21 -0
  300. package/ai/skills/stacks-marketing-cro/NOTICE.md +13 -0
  301. package/ai/skills/stacks-marketing-cro/PLAYBOOK.md +194 -0
  302. package/ai/skills/stacks-marketing-cro/SKILL.md +30 -0
  303. package/ai/skills/stacks-marketing-cro/evals/evals.json +111 -0
  304. package/ai/skills/stacks-marketing-cro/references/experiments.md +248 -0
  305. package/ai/skills/stacks-marketing-cro/references/form.md +422 -0
  306. package/ai/skills/stacks-marketing-customer-research/LICENSE +21 -0
  307. package/ai/skills/stacks-marketing-customer-research/NOTICE.md +13 -0
  308. package/ai/skills/stacks-marketing-customer-research/PLAYBOOK.md +304 -0
  309. package/ai/skills/stacks-marketing-customer-research/SKILL.md +30 -0
  310. package/ai/skills/stacks-marketing-customer-research/evals/evals.json +176 -0
  311. package/ai/skills/stacks-marketing-customer-research/references/interviews-and-surveys.md +155 -0
  312. package/ai/skills/stacks-marketing-customer-research/references/source-guides.md +401 -0
  313. package/ai/skills/stacks-marketing-directory-submissions/LICENSE +21 -0
  314. package/ai/skills/stacks-marketing-directory-submissions/NOTICE.md +13 -0
  315. package/ai/skills/stacks-marketing-directory-submissions/PLAYBOOK.md +397 -0
  316. package/ai/skills/stacks-marketing-directory-submissions/SKILL.md +30 -0
  317. package/ai/skills/stacks-marketing-directory-submissions/evals/evals.json +121 -0
  318. package/ai/skills/stacks-marketing-directory-submissions/references/directory-list.md +545 -0
  319. package/ai/skills/stacks-marketing-directory-submissions/references/positioning-variations.md +232 -0
  320. package/ai/skills/stacks-marketing-directory-submissions/references/submission-tracker-template.csv +272 -0
  321. package/ai/skills/stacks-marketing-emails/LICENSE +21 -0
  322. package/ai/skills/stacks-marketing-emails/NOTICE.md +13 -0
  323. package/ai/skills/stacks-marketing-emails/PLAYBOOK.md +336 -0
  324. package/ai/skills/stacks-marketing-emails/SKILL.md +30 -0
  325. package/ai/skills/stacks-marketing-emails/evals/evals.json +105 -0
  326. package/ai/skills/stacks-marketing-emails/references/copy-guidelines.md +113 -0
  327. package/ai/skills/stacks-marketing-emails/references/email-types.md +515 -0
  328. package/ai/skills/stacks-marketing-emails/references/sequence-templates.md +168 -0
  329. package/ai/skills/stacks-marketing-events/LICENSE +21 -0
  330. package/ai/skills/stacks-marketing-events/NOTICE.md +13 -0
  331. package/ai/skills/stacks-marketing-events/PLAYBOOK.md +127 -0
  332. package/ai/skills/stacks-marketing-events/SKILL.md +30 -0
  333. package/ai/skills/stacks-marketing-events/evals/evals.json +92 -0
  334. package/ai/skills/stacks-marketing-events/references/event-portfolio-strategy.md +80 -0
  335. package/ai/skills/stacks-marketing-events/references/speaking.md +49 -0
  336. package/ai/skills/stacks-marketing-events/references/sponsorship-roi.md +57 -0
  337. package/ai/skills/stacks-marketing-events/references/webinar-funnel.md +88 -0
  338. package/ai/skills/stacks-marketing-free-tools/LICENSE +21 -0
  339. package/ai/skills/stacks-marketing-free-tools/NOTICE.md +13 -0
  340. package/ai/skills/stacks-marketing-free-tools/PLAYBOOK.md +186 -0
  341. package/ai/skills/stacks-marketing-free-tools/SKILL.md +30 -0
  342. package/ai/skills/stacks-marketing-free-tools/evals/evals.json +103 -0
  343. package/ai/skills/stacks-marketing-free-tools/references/tool-benchmarks.md +35 -0
  344. package/ai/skills/stacks-marketing-free-tools/references/tool-types.md +217 -0
  345. package/ai/skills/stacks-marketing-ideas/LICENSE +21 -0
  346. package/ai/skills/stacks-marketing-ideas/NOTICE.md +13 -0
  347. package/ai/skills/stacks-marketing-ideas/PLAYBOOK.md +167 -0
  348. package/ai/skills/stacks-marketing-ideas/SKILL.md +30 -0
  349. package/ai/skills/stacks-marketing-ideas/evals/evals.json +105 -0
  350. package/ai/skills/stacks-marketing-ideas/references/guerrilla-marketing.md +56 -0
  351. package/ai/skills/stacks-marketing-ideas/references/ideas-by-category.md +366 -0
  352. package/ai/skills/stacks-marketing-image/LICENSE +21 -0
  353. package/ai/skills/stacks-marketing-image/NOTICE.md +13 -0
  354. package/ai/skills/stacks-marketing-image/PLAYBOOK.md +336 -0
  355. package/ai/skills/stacks-marketing-image/SKILL.md +30 -0
  356. package/ai/skills/stacks-marketing-image/evals/evals.json +89 -0
  357. package/ai/skills/stacks-marketing-image/references/ai-image-prompting.md +229 -0
  358. package/ai/skills/stacks-marketing-influencer-marketing/LICENSE +21 -0
  359. package/ai/skills/stacks-marketing-influencer-marketing/NOTICE.md +13 -0
  360. package/ai/skills/stacks-marketing-influencer-marketing/PLAYBOOK.md +198 -0
  361. package/ai/skills/stacks-marketing-influencer-marketing/SKILL.md +30 -0
  362. package/ai/skills/stacks-marketing-influencer-marketing/evals/evals.json +89 -0
  363. package/ai/skills/stacks-marketing-influencer-marketing/references/ugc-creator-program.md +91 -0
  364. package/ai/skills/stacks-marketing-launch/LICENSE +21 -0
  365. package/ai/skills/stacks-marketing-launch/NOTICE.md +13 -0
  366. package/ai/skills/stacks-marketing-launch/PLAYBOOK.md +381 -0
  367. package/ai/skills/stacks-marketing-launch/SKILL.md +30 -0
  368. package/ai/skills/stacks-marketing-launch/evals/evals.json +135 -0
  369. package/ai/skills/stacks-marketing-launch/references/shipped-changes.md +84 -0
  370. package/ai/skills/stacks-marketing-launch/references/site-launch-qa.md +57 -0
  371. package/ai/skills/stacks-marketing-lead-magnets/LICENSE +21 -0
  372. package/ai/skills/stacks-marketing-lead-magnets/NOTICE.md +13 -0
  373. package/ai/skills/stacks-marketing-lead-magnets/PLAYBOOK.md +308 -0
  374. package/ai/skills/stacks-marketing-lead-magnets/SKILL.md +30 -0
  375. package/ai/skills/stacks-marketing-lead-magnets/evals/evals.json +105 -0
  376. package/ai/skills/stacks-marketing-lead-magnets/references/benchmarks.md +129 -0
  377. package/ai/skills/stacks-marketing-lead-magnets/references/content-to-skill-corpus-design.md +89 -0
  378. package/ai/skills/stacks-marketing-lead-magnets/references/content-to-skill-release.md +71 -0
  379. package/ai/skills/stacks-marketing-lead-magnets/references/content-to-skill.md +109 -0
  380. package/ai/skills/stacks-marketing-lead-magnets/references/format-guide.md +196 -0
  381. package/ai/skills/stacks-marketing-loops/LICENSE +21 -0
  382. package/ai/skills/stacks-marketing-loops/NOTICE.md +13 -0
  383. package/ai/skills/stacks-marketing-loops/PLAYBOOK.md +111 -0
  384. package/ai/skills/stacks-marketing-loops/SKILL.md +30 -0
  385. package/ai/skills/stacks-marketing-loops/evals/evals.json +133 -0
  386. package/ai/skills/stacks-marketing-loops/references/loop-catalog.md +796 -0
  387. package/ai/skills/stacks-marketing-loops/references/loop-guardrails.md +73 -0
  388. package/ai/skills/stacks-marketing-loops/references/loop-orchestration.md +71 -0
  389. package/ai/skills/stacks-marketing-loops/references/loop-state.md +67 -0
  390. package/ai/skills/stacks-marketing-loops/references/loop-template.md +79 -0
  391. package/ai/skills/stacks-marketing-loops/references/outbound-operator.md +86 -0
  392. package/ai/skills/stacks-marketing-loops/references/seo-operator.md +110 -0
  393. package/ai/skills/stacks-marketing-offers/LICENSE +21 -0
  394. package/ai/skills/stacks-marketing-offers/NOTICE.md +13 -0
  395. package/ai/skills/stacks-marketing-offers/PLAYBOOK.md +151 -0
  396. package/ai/skills/stacks-marketing-offers/SKILL.md +30 -0
  397. package/ai/skills/stacks-marketing-offers/evals/evals.json +21 -0
  398. package/ai/skills/stacks-marketing-offers/references/bonus-stacking.md +150 -0
  399. package/ai/skills/stacks-marketing-offers/references/examples.md +215 -0
  400. package/ai/skills/stacks-marketing-offers/references/guarantee-design.md +172 -0
  401. package/ai/skills/stacks-marketing-offers/references/offer-anatomy.md +203 -0
  402. package/ai/skills/stacks-marketing-offers/references/offer-formats.md +240 -0
  403. package/ai/skills/stacks-marketing-offers/references/saas-offers.md +116 -0
  404. package/ai/skills/stacks-marketing-offers/references/scarcity-urgency.md +175 -0
  405. package/ai/skills/stacks-marketing-offers/references/value-equation.md +134 -0
  406. package/ai/skills/stacks-marketing-onboarding/LICENSE +21 -0
  407. package/ai/skills/stacks-marketing-onboarding/NOTICE.md +13 -0
  408. package/ai/skills/stacks-marketing-onboarding/PLAYBOOK.md +257 -0
  409. package/ai/skills/stacks-marketing-onboarding/SKILL.md +30 -0
  410. package/ai/skills/stacks-marketing-onboarding/evals/evals.json +108 -0
  411. package/ai/skills/stacks-marketing-onboarding/references/activation-models.md +57 -0
  412. package/ai/skills/stacks-marketing-onboarding/references/experiments.md +258 -0
  413. package/ai/skills/stacks-marketing-onboarding/references/minimum-path-to-value.md +49 -0
  414. package/ai/skills/stacks-marketing-paywalls/LICENSE +21 -0
  415. package/ai/skills/stacks-marketing-paywalls/NOTICE.md +13 -0
  416. package/ai/skills/stacks-marketing-paywalls/PLAYBOOK.md +223 -0
  417. package/ai/skills/stacks-marketing-paywalls/SKILL.md +30 -0
  418. package/ai/skills/stacks-marketing-paywalls/evals/evals.json +93 -0
  419. package/ai/skills/stacks-marketing-paywalls/references/experiments.md +164 -0
  420. package/ai/skills/stacks-marketing-plan/LICENSE +21 -0
  421. package/ai/skills/stacks-marketing-plan/NOTICE.md +13 -0
  422. package/ai/skills/stacks-marketing-plan/PLAYBOOK.md +300 -0
  423. package/ai/skills/stacks-marketing-plan/SKILL.md +30 -0
  424. package/ai/skills/stacks-marketing-plan/evals/evals.json +140 -0
  425. package/ai/skills/stacks-marketing-plan/references/aarrr-framework.md +180 -0
  426. package/ai/skills/stacks-marketing-plan/references/budget-planning.md +177 -0
  427. package/ai/skills/stacks-marketing-plan/references/client-types.md +373 -0
  428. package/ai/skills/stacks-marketing-plan/references/current-state-rubric.md +255 -0
  429. package/ai/skills/stacks-marketing-plan/references/example-quietude.md +972 -0
  430. package/ai/skills/stacks-marketing-plan/references/funding-stage-unlocks.md +230 -0
  431. package/ai/skills/stacks-marketing-plan/references/growth-patterns.md +190 -0
  432. package/ai/skills/stacks-marketing-plan/references/idea-cross-reference.md +265 -0
  433. package/ai/skills/stacks-marketing-plan/references/market-sizing.md +166 -0
  434. package/ai/skills/stacks-marketing-plan/references/measurement-framework.md +213 -0
  435. package/ai/skills/stacks-marketing-plan/references/methodology.md +365 -0
  436. package/ai/skills/stacks-marketing-plan/references/ops-stack-mapping.md +197 -0
  437. package/ai/skills/stacks-marketing-plan/references/plan-template.md +494 -0
  438. package/ai/skills/stacks-marketing-plan/references/team-and-agency-model.md +278 -0
  439. package/ai/skills/stacks-marketing-popups/LICENSE +21 -0
  440. package/ai/skills/stacks-marketing-popups/NOTICE.md +13 -0
  441. package/ai/skills/stacks-marketing-popups/PLAYBOOK.md +450 -0
  442. package/ai/skills/stacks-marketing-popups/SKILL.md +30 -0
  443. package/ai/skills/stacks-marketing-popups/evals/evals.json +94 -0
  444. package/ai/skills/stacks-marketing-pricing/LICENSE +21 -0
  445. package/ai/skills/stacks-marketing-pricing/NOTICE.md +13 -0
  446. package/ai/skills/stacks-marketing-pricing/PLAYBOOK.md +291 -0
  447. package/ai/skills/stacks-marketing-pricing/SKILL.md +30 -0
  448. package/ai/skills/stacks-marketing-pricing/evals/evals.json +131 -0
  449. package/ai/skills/stacks-marketing-pricing/references/pricing-models.md +66 -0
  450. package/ai/skills/stacks-marketing-pricing/references/pricing-page-teardown.md +87 -0
  451. package/ai/skills/stacks-marketing-pricing/references/research-methods.md +156 -0
  452. package/ai/skills/stacks-marketing-pricing/references/tier-structure.md +232 -0
  453. package/ai/skills/stacks-marketing-product-marketing/LICENSE +21 -0
  454. package/ai/skills/stacks-marketing-product-marketing/NOTICE.md +13 -0
  455. package/ai/skills/stacks-marketing-product-marketing/PLAYBOOK.md +255 -0
  456. package/ai/skills/stacks-marketing-product-marketing/SKILL.md +30 -0
  457. package/ai/skills/stacks-marketing-product-marketing/evals/evals.json +98 -0
  458. package/ai/skills/stacks-marketing-programmatic-seo/LICENSE +21 -0
  459. package/ai/skills/stacks-marketing-programmatic-seo/NOTICE.md +13 -0
  460. package/ai/skills/stacks-marketing-programmatic-seo/PLAYBOOK.md +238 -0
  461. package/ai/skills/stacks-marketing-programmatic-seo/SKILL.md +30 -0
  462. package/ai/skills/stacks-marketing-programmatic-seo/evals/evals.json +107 -0
  463. package/ai/skills/stacks-marketing-programmatic-seo/references/implementation-platforms.md +41 -0
  464. package/ai/skills/stacks-marketing-programmatic-seo/references/playbooks.md +308 -0
  465. package/ai/skills/stacks-marketing-prospecting/LICENSE +21 -0
  466. package/ai/skills/stacks-marketing-prospecting/NOTICE.md +13 -0
  467. package/ai/skills/stacks-marketing-prospecting/PLAYBOOK.md +273 -0
  468. package/ai/skills/stacks-marketing-prospecting/SKILL.md +30 -0
  469. package/ai/skills/stacks-marketing-prospecting/evals/evals.json +163 -0
  470. package/ai/skills/stacks-marketing-prospecting/references/account-research.md +59 -0
  471. package/ai/skills/stacks-marketing-prospecting/references/b2b-prospecting.md +106 -0
  472. package/ai/skills/stacks-marketing-prospecting/references/compliance.md +161 -0
  473. package/ai/skills/stacks-marketing-prospecting/references/data-sources.md +300 -0
  474. package/ai/skills/stacks-marketing-prospecting/references/demand-signals.md +131 -0
  475. package/ai/skills/stacks-marketing-prospecting/references/enrichment-playbook.md +61 -0
  476. package/ai/skills/stacks-marketing-prospecting/references/local-prospecting.md +165 -0
  477. package/ai/skills/stacks-marketing-prospecting/references/saas-prospecting.md +123 -0
  478. package/ai/skills/stacks-marketing-prospecting/references/signal-plays.md +99 -0
  479. package/ai/skills/stacks-marketing-prospecting/references/sourcing-and-enrichment.md +89 -0
  480. package/ai/skills/stacks-marketing-psychology/LICENSE +21 -0
  481. package/ai/skills/stacks-marketing-psychology/NOTICE.md +13 -0
  482. package/ai/skills/stacks-marketing-psychology/PLAYBOOK.md +451 -0
  483. package/ai/skills/stacks-marketing-psychology/SKILL.md +30 -0
  484. package/ai/skills/stacks-marketing-psychology/evals/evals.json +88 -0
  485. package/ai/skills/stacks-marketing-public-relations/LICENSE +21 -0
  486. package/ai/skills/stacks-marketing-public-relations/NOTICE.md +13 -0
  487. package/ai/skills/stacks-marketing-public-relations/PLAYBOOK.md +150 -0
  488. package/ai/skills/stacks-marketing-public-relations/SKILL.md +30 -0
  489. package/ai/skills/stacks-marketing-public-relations/evals/evals.json +36 -0
  490. package/ai/skills/stacks-marketing-public-relations/references/crisis-communications.md +113 -0
  491. package/ai/skills/stacks-marketing-public-relations/references/journalist-pitching.md +368 -0
  492. package/ai/skills/stacks-marketing-public-relations/references/media-outlets.md +207 -0
  493. package/ai/skills/stacks-marketing-public-relations/references/newsjacking.md +220 -0
  494. package/ai/skills/stacks-marketing-public-relations/references/podcast-guest-prep.md +60 -0
  495. package/ai/skills/stacks-marketing-public-relations/references/press-platforms.md +188 -0
  496. package/ai/skills/stacks-marketing-public-relations/references/statement-templates.md +145 -0
  497. package/ai/skills/stacks-marketing-public-relations/references/story-angles.md +87 -0
  498. package/ai/skills/stacks-marketing-referrals/LICENSE +21 -0
  499. package/ai/skills/stacks-marketing-referrals/NOTICE.md +13 -0
  500. package/ai/skills/stacks-marketing-referrals/PLAYBOOK.md +279 -0
  501. package/ai/skills/stacks-marketing-referrals/SKILL.md +30 -0
  502. package/ai/skills/stacks-marketing-referrals/evals/evals.json +202 -0
  503. package/ai/skills/stacks-marketing-referrals/references/affiliate-operations.md +64 -0
  504. package/ai/skills/stacks-marketing-referrals/references/affiliate-programs.md +167 -0
  505. package/ai/skills/stacks-marketing-referrals/references/program-examples.md +151 -0
  506. package/ai/skills/stacks-marketing-referrals/references/review-platform-rules.md +36 -0
  507. package/ai/skills/stacks-marketing-referrals/references/review-program-operations.md +62 -0
  508. package/ai/skills/stacks-marketing-referrals/references/review-programs.md +96 -0
  509. package/ai/skills/stacks-marketing-referrals/references/viral-mechanisms.md +102 -0
  510. package/ai/skills/stacks-marketing-revops/LICENSE +21 -0
  511. package/ai/skills/stacks-marketing-revops/NOTICE.md +13 -0
  512. package/ai/skills/stacks-marketing-revops/PLAYBOOK.md +345 -0
  513. package/ai/skills/stacks-marketing-revops/SKILL.md +30 -0
  514. package/ai/skills/stacks-marketing-revops/evals/evals.json +104 -0
  515. package/ai/skills/stacks-marketing-revops/references/automation-playbooks.md +290 -0
  516. package/ai/skills/stacks-marketing-revops/references/inbound-routing.md +43 -0
  517. package/ai/skills/stacks-marketing-revops/references/lifecycle-definitions.md +309 -0
  518. package/ai/skills/stacks-marketing-revops/references/routing-rules.md +203 -0
  519. package/ai/skills/stacks-marketing-revops/references/scoring-models.md +247 -0
  520. package/ai/skills/stacks-marketing-sales-enablement/LICENSE +21 -0
  521. package/ai/skills/stacks-marketing-sales-enablement/NOTICE.md +13 -0
  522. package/ai/skills/stacks-marketing-sales-enablement/PLAYBOOK.md +423 -0
  523. package/ai/skills/stacks-marketing-sales-enablement/SKILL.md +30 -0
  524. package/ai/skills/stacks-marketing-sales-enablement/evals/evals.json +153 -0
  525. package/ai/skills/stacks-marketing-sales-enablement/references/cold-call-scripts.md +68 -0
  526. package/ai/skills/stacks-marketing-sales-enablement/references/deck-frameworks.md +263 -0
  527. package/ai/skills/stacks-marketing-sales-enablement/references/demo-scripts.md +355 -0
  528. package/ai/skills/stacks-marketing-sales-enablement/references/objection-library.md +270 -0
  529. package/ai/skills/stacks-marketing-sales-enablement/references/one-pager-templates.md +208 -0
  530. package/ai/skills/stacks-marketing-sales-enablement/references/win-loss-analysis.md +72 -0
  531. package/ai/skills/stacks-marketing-schema/LICENSE +21 -0
  532. package/ai/skills/stacks-marketing-schema/NOTICE.md +13 -0
  533. package/ai/skills/stacks-marketing-schema/PLAYBOOK.md +187 -0
  534. package/ai/skills/stacks-marketing-schema/SKILL.md +30 -0
  535. package/ai/skills/stacks-marketing-schema/evals/evals.json +127 -0
  536. package/ai/skills/stacks-marketing-schema/references/schema-examples.md +392 -0
  537. package/ai/skills/stacks-marketing-seo-audit/LICENSE +21 -0
  538. package/ai/skills/stacks-marketing-seo-audit/NOTICE.md +13 -0
  539. package/ai/skills/stacks-marketing-seo-audit/PLAYBOOK.md +492 -0
  540. package/ai/skills/stacks-marketing-seo-audit/SKILL.md +30 -0
  541. package/ai/skills/stacks-marketing-seo-audit/evals/evals.json +204 -0
  542. package/ai/skills/stacks-marketing-seo-audit/references/ai-writing-detection.md +200 -0
  543. package/ai/skills/stacks-marketing-seo-audit/references/international-seo.md +228 -0
  544. package/ai/skills/stacks-marketing-seo-audit/references/local-seo-pages-and-measurement.md +39 -0
  545. package/ai/skills/stacks-marketing-seo-audit/references/local-seo-profile-and-citations.md +41 -0
  546. package/ai/skills/stacks-marketing-seo-audit/references/local-seo.md +86 -0
  547. package/ai/skills/stacks-marketing-seo-audit/references/rankings-push.md +62 -0
  548. package/ai/skills/stacks-marketing-seo-audit/references/title-tags.md +89 -0
  549. package/ai/skills/stacks-marketing-signup/LICENSE +21 -0
  550. package/ai/skills/stacks-marketing-signup/NOTICE.md +13 -0
  551. package/ai/skills/stacks-marketing-signup/PLAYBOOK.md +359 -0
  552. package/ai/skills/stacks-marketing-signup/SKILL.md +30 -0
  553. package/ai/skills/stacks-marketing-signup/evals/evals.json +88 -0
  554. package/ai/skills/stacks-marketing-site-architecture/LICENSE +21 -0
  555. package/ai/skills/stacks-marketing-site-architecture/NOTICE.md +13 -0
  556. package/ai/skills/stacks-marketing-site-architecture/PLAYBOOK.md +355 -0
  557. package/ai/skills/stacks-marketing-site-architecture/SKILL.md +30 -0
  558. package/ai/skills/stacks-marketing-site-architecture/evals/evals.json +113 -0
  559. package/ai/skills/stacks-marketing-site-architecture/references/mermaid-templates.md +216 -0
  560. package/ai/skills/stacks-marketing-site-architecture/references/navigation-patterns.md +305 -0
  561. package/ai/skills/stacks-marketing-site-architecture/references/platforms-and-migration.md +86 -0
  562. package/ai/skills/stacks-marketing-site-architecture/references/site-type-templates.md +293 -0
  563. package/ai/skills/stacks-marketing-sms/LICENSE +21 -0
  564. package/ai/skills/stacks-marketing-sms/NOTICE.md +13 -0
  565. package/ai/skills/stacks-marketing-sms/PLAYBOOK.md +348 -0
  566. package/ai/skills/stacks-marketing-sms/SKILL.md +30 -0
  567. package/ai/skills/stacks-marketing-sms/evals/evals.json +118 -0
  568. package/ai/skills/stacks-marketing-sms/references/compliance.md +202 -0
  569. package/ai/skills/stacks-marketing-sms/references/platforms.md +318 -0
  570. package/ai/skills/stacks-marketing-sms/references/sequence-templates.md +282 -0
  571. package/ai/skills/stacks-marketing-sms/references/whatsapp.md +260 -0
  572. package/ai/skills/stacks-marketing-social/LICENSE +21 -0
  573. package/ai/skills/stacks-marketing-social/NOTICE.md +13 -0
  574. package/ai/skills/stacks-marketing-social/PLAYBOOK.md +452 -0
  575. package/ai/skills/stacks-marketing-social/SKILL.md +30 -0
  576. package/ai/skills/stacks-marketing-social/evals/evals.json +150 -0
  577. package/ai/skills/stacks-marketing-social/references/carousel-frameworks.md +141 -0
  578. package/ai/skills/stacks-marketing-social/references/listening-sources-template.md +123 -0
  579. package/ai/skills/stacks-marketing-social/references/listening.md +288 -0
  580. package/ai/skills/stacks-marketing-social/references/platform-limits.md +110 -0
  581. package/ai/skills/stacks-marketing-social/references/platforms.md +176 -0
  582. package/ai/skills/stacks-marketing-social/references/post-templates.md +179 -0
  583. package/ai/skills/stacks-marketing-social/references/reverse-engineering.md +195 -0
  584. package/ai/skills/stacks-marketing-social/references/short-form-video.md +237 -0
  585. package/ai/skills/stacks-marketing-social/references/x-algorithm.md +69 -0
  586. package/ai/skills/stacks-marketing-video/LICENSE +21 -0
  587. package/ai/skills/stacks-marketing-video/NOTICE.md +13 -0
  588. package/ai/skills/stacks-marketing-video/PLAYBOOK.md +330 -0
  589. package/ai/skills/stacks-marketing-video/SKILL.md +30 -0
  590. package/ai/skills/stacks-marketing-video/evals/evals.json +118 -0
  591. package/ai/skills/stacks-marketing-video/references/ai-video-prompting.md +175 -0
  592. package/ai/skills/stacks-marketing-video/references/edit-anatomy.md +86 -0
  593. package/ai/skills/stacks-marketing-video/references/product-demo-recording.md +176 -0
  594. package/ai/skills/stacks-middleware/SKILL.md +37 -21
  595. package/ai/skills/stacks-migrations/SKILL.md +29 -5
  596. package/ai/skills/stacks-mobile/SKILL.md +25 -4
  597. package/ai/skills/stacks-models/SKILL.md +35 -15
  598. package/ai/skills/stacks-models/references/model-capabilities.md +104 -0
  599. package/ai/skills/stacks-native/CAPABILITIES.md +536 -0
  600. package/ai/skills/stacks-native/CATALOG.md +930 -0
  601. package/ai/skills/stacks-native/RECIPES.md +108 -0
  602. package/ai/skills/stacks-native/SKILL.md +79 -0
  603. package/ai/skills/stacks-newsletter/SKILL.md +39 -0
  604. package/ai/skills/stacks-notifications/SKILL.md +118 -203
  605. package/ai/skills/stacks-objects/SKILL.md +18 -4
  606. package/ai/skills/stacks-orm/SKILL.md +112 -328
  607. package/ai/skills/stacks-pagination/SKILL.md +40 -0
  608. package/ai/skills/stacks-path/SKILL.md +38 -18
  609. package/ai/skills/stacks-payments/SKILL.md +9 -1
  610. package/ai/skills/stacks-pr/CREDITS.md +3 -0
  611. package/ai/skills/stacks-pr/LICENSE +21 -0
  612. package/ai/skills/stacks-pr/NOTICE.md +10 -0
  613. package/ai/skills/stacks-pr/PLAYBOOK.md +127 -0
  614. package/ai/skills/stacks-pr/SKILL.md +23 -0
  615. package/ai/skills/stacks-prototype/LICENSE +21 -0
  616. package/ai/skills/stacks-prototype/NOTICE.md +10 -0
  617. package/ai/skills/stacks-prototype/SKILL.md +6 -0
  618. package/ai/skills/stacks-push/SKILL.md +20 -0
  619. package/ai/skills/stacks-query-builder/SKILL.md +21 -5
  620. package/ai/skills/stacks-queue/DURABLE-WORKFLOWS.md +121 -0
  621. package/ai/skills/stacks-queue/SKILL.md +37 -6
  622. package/ai/skills/stacks-realtime/SKILL.md +29 -140
  623. package/ai/skills/stacks-redesign/SKILL.md +1 -1
  624. package/ai/skills/stacks-registry/SKILL.md +20 -48
  625. package/ai/skills/stacks-repl/SKILL.md +31 -7
  626. package/ai/skills/stacks-research/LICENSE +21 -0
  627. package/ai/skills/stacks-research/NOTICE.md +10 -0
  628. package/ai/skills/stacks-research/PLAYBOOK.md +10 -0
  629. package/ai/skills/stacks-research/SKILL.md +23 -0
  630. package/ai/skills/stacks-retro/LICENSE +21 -0
  631. package/ai/skills/stacks-retro/NOTICE.md +10 -0
  632. package/ai/skills/stacks-retro/SKILL.md +10 -0
  633. package/ai/skills/stacks-review/LICENSE +21 -0
  634. package/ai/skills/stacks-review/NOTICE.md +10 -0
  635. package/ai/skills/stacks-review/SKILL.md +15 -0
  636. package/ai/skills/stacks-router/SKILL.md +33 -2
  637. package/ai/skills/stacks-routes/SKILL.md +25 -2
  638. package/ai/skills/stacks-scaffold-exercises/LICENSE +21 -0
  639. package/ai/skills/stacks-scaffold-exercises/NOTICE.md +10 -0
  640. package/ai/skills/stacks-scaffold-exercises/PLAYBOOK.md +106 -0
  641. package/ai/skills/stacks-scaffold-exercises/SKILL.md +23 -0
  642. package/ai/skills/stacks-scaffolding/SKILL.md +27 -11
  643. package/ai/skills/stacks-scheduler/SKILL.md +52 -25
  644. package/ai/skills/stacks-search-engine/SKILL.md +28 -7
  645. package/ai/skills/stacks-security/SKILL.md +22 -6
  646. package/ai/skills/stacks-server/SKILL.md +47 -85
  647. package/ai/skills/stacks-setup-deep-modules/LICENSE +21 -0
  648. package/ai/skills/stacks-setup-deep-modules/NOTICE.md +10 -0
  649. package/ai/skills/stacks-setup-deep-modules/SKILL.md +55 -0
  650. package/ai/skills/stacks-setup-engineering/LICENSE +21 -0
  651. package/ai/skills/stacks-setup-engineering/NOTICE.md +10 -0
  652. package/ai/skills/stacks-setup-engineering/PLAYBOOK.md +115 -0
  653. package/ai/skills/stacks-setup-engineering/SKILL.md +24 -0
  654. package/ai/skills/stacks-setup-engineering/domain.md +51 -0
  655. package/ai/skills/stacks-setup-engineering/issue-tracker-github.md +46 -0
  656. package/ai/skills/stacks-setup-engineering/issue-tracker-gitlab.md +46 -0
  657. package/ai/skills/stacks-setup-engineering/issue-tracker-local.md +30 -0
  658. package/ai/skills/stacks-setup-engineering/triage-labels.md +15 -0
  659. package/ai/skills/stacks-sites/SKILL.md +44 -0
  660. package/ai/skills/stacks-skills/SKILL.md +33 -0
  661. package/ai/skills/stacks-slug/SKILL.md +15 -12
  662. package/ai/skills/stacks-sms/SKILL.md +33 -6
  663. package/ai/skills/stacks-socials/SKILL.md +81 -294
  664. package/ai/skills/stacks-storage/SKILL.md +34 -15
  665. package/ai/skills/stacks-storage/UPLOADS-AND-DISKS.md +133 -0
  666. package/ai/skills/stacks-strings/SKILL.md +41 -35
  667. package/ai/skills/stacks-stx/SKILL.md +63 -58
  668. package/ai/skills/stacks-tdd/LICENSE +21 -0
  669. package/ai/skills/stacks-tdd/NOTICE.md +10 -0
  670. package/ai/skills/stacks-tdd/SKILL.md +10 -0
  671. package/ai/skills/stacks-tdd/mocking.md +59 -0
  672. package/ai/skills/stacks-tdd/tests.md +77 -0
  673. package/ai/skills/stacks-teach/GLOSSARY-FORMAT.md +35 -0
  674. package/ai/skills/stacks-teach/LEARNING-RECORD-FORMAT.md +46 -0
  675. package/ai/skills/stacks-teach/LICENSE +21 -0
  676. package/ai/skills/stacks-teach/MISSION-FORMAT.md +31 -0
  677. package/ai/skills/stacks-teach/NOTICE.md +10 -0
  678. package/ai/skills/stacks-teach/PLAYBOOK.md +136 -0
  679. package/ai/skills/stacks-teach/RESOURCES-FORMAT.md +32 -0
  680. package/ai/skills/stacks-teach/SKILL.md +24 -0
  681. package/ai/skills/stacks-technical-diagrams/SKILL.md +2 -2
  682. package/ai/skills/stacks-technical-diagrams/bin/diagrams +1 -1
  683. package/ai/skills/stacks-technical-diagrams/renderers/shared/bun-runtime.mjs +1 -1
  684. package/ai/skills/stacks-test-fixtures/LICENSE +21 -0
  685. package/ai/skills/stacks-test-fixtures/NOTICE.md +10 -0
  686. package/ai/skills/stacks-test-fixtures/SKILL.md +38 -0
  687. package/ai/skills/stacks-testing/SKILL.md +77 -4
  688. package/ai/skills/stacks-to-questionnaire/LICENSE +21 -0
  689. package/ai/skills/stacks-to-questionnaire/NOTICE.md +10 -0
  690. package/ai/skills/stacks-to-questionnaire/PLAYBOOK.md +51 -0
  691. package/ai/skills/stacks-to-questionnaire/SKILL.md +24 -0
  692. package/ai/skills/stacks-to-spec/LICENSE +21 -0
  693. package/ai/skills/stacks-to-spec/NOTICE.md +10 -0
  694. package/ai/skills/stacks-to-spec/PLAYBOOK.md +72 -0
  695. package/ai/skills/stacks-to-spec/SKILL.md +24 -0
  696. package/ai/skills/stacks-to-tickets/LICENSE +21 -0
  697. package/ai/skills/stacks-to-tickets/NOTICE.md +10 -0
  698. package/ai/skills/stacks-to-tickets/PLAYBOOK.md +102 -0
  699. package/ai/skills/stacks-to-tickets/SKILL.md +24 -0
  700. package/ai/skills/stacks-triage/AGENT-BRIEF.md +207 -0
  701. package/ai/skills/stacks-triage/LICENSE +21 -0
  702. package/ai/skills/stacks-triage/NOTICE.md +10 -0
  703. package/ai/skills/stacks-triage/OUT-OF-SCOPE.md +105 -0
  704. package/ai/skills/stacks-triage/PLAYBOOK.md +109 -0
  705. package/ai/skills/stacks-triage/SKILL.md +24 -0
  706. package/ai/skills/stacks-tunnel/SKILL.md +29 -19
  707. package/ai/skills/stacks-types/SKILL.md +77 -168
  708. package/ai/skills/stacks-ui/SKILL.md +66 -228
  709. package/ai/skills/stacks-unslop/NOTICE.md +25 -0
  710. package/ai/skills/stacks-unslop/SKILL.md +95 -0
  711. package/ai/skills/stacks-unslop/references/core-contract.md +88 -0
  712. package/ai/skills/stacks-unslop/references/patterns.md +110 -0
  713. package/ai/skills/stacks-unslop/references/presets.md +37 -0
  714. package/ai/skills/stacks-unslop/references/voice.md +95 -0
  715. package/ai/skills/stacks-utils/SKILL.md +45 -25
  716. package/ai/skills/stacks-validation/SKILL.md +67 -4
  717. package/ai/skills/stacks-video/SKILL.md +33 -0
  718. package/ai/skills/stacks-wait-what/LICENSE +21 -0
  719. package/ai/skills/stacks-wait-what/NOTICE.md +10 -0
  720. package/ai/skills/stacks-wait-what/PLAYBOOK.md +4 -0
  721. package/ai/skills/stacks-wait-what/SKILL.md +24 -0
  722. package/ai/skills/stacks-wayfinder/LICENSE +21 -0
  723. package/ai/skills/stacks-wayfinder/NOTICE.md +10 -0
  724. package/ai/skills/stacks-wayfinder/PLAYBOOK.md +125 -0
  725. package/ai/skills/stacks-wayfinder/SKILL.md +24 -0
  726. package/ai/skills/stacks-whois/SKILL.md +13 -3
  727. package/ai/skills/stacks-wizard/LICENSE +21 -0
  728. package/ai/skills/stacks-wizard/NOTICE.md +10 -0
  729. package/ai/skills/stacks-wizard/SKILL.md +8 -0
  730. package/ai/skills/stacks-wizard/scripts/template.sh +42 -26
  731. package/ai/skills/stacks-writing-beats/LICENSE +21 -0
  732. package/ai/skills/stacks-writing-beats/NOTICE.md +10 -0
  733. package/ai/skills/stacks-writing-beats/PLAYBOOK.md +64 -0
  734. package/ai/skills/stacks-writing-beats/SKILL.md +28 -0
  735. package/ai/skills/stacks-writing-for-agents/LICENSE +21 -0
  736. package/ai/skills/stacks-writing-for-agents/NOTICE.md +10 -0
  737. package/ai/skills/stacks-writing-for-agents/SKILL.md +7 -1
  738. package/ai/skills/stacks-writing-fragments/LICENSE +21 -0
  739. package/ai/skills/stacks-writing-fragments/NOTICE.md +10 -0
  740. package/ai/skills/stacks-writing-fragments/PLAYBOOK.md +76 -0
  741. package/ai/skills/stacks-writing-fragments/SKILL.md +28 -0
  742. package/ai/skills/stacks-writing-shape/LICENSE +21 -0
  743. package/ai/skills/stacks-writing-shape/NOTICE.md +10 -0
  744. package/ai/skills/stacks-writing-shape/PLAYBOOK.md +76 -0
  745. package/ai/skills/stacks-writing-shape/SKILL.md +28 -0
  746. package/ide/vscode/package.json +1 -1
  747. package/package.json +2 -2
  748. /package/ai/skills/stacks-technical-diagrams/{bunfig.toml → runtime.toml} +0 -0
@@ -57,7 +57,7 @@ import { Visibility, createDirectoryListing, normalizeExpiryToMilliseconds, norm
57
57
 
58
58
  // Low-level file operations
59
59
  import { copy, copyFile, copyFolder } from '@stacksjs/storage'
60
- import { move, rename } from '@stacksjs/storage'
60
+ import { storage } from '@stacksjs/storage' // storage.move, storage.rename
61
61
  import { del, deleteFile, deleteFolder, deleteEmptyFolder, deleteEmptyFolders, deleteGlob, isDirectoryEmpty } from '@stacksjs/storage'
62
62
  import { readJsonFile, readPackageJson, readTextFile, writeFile, writeJsonFile, writeTextFile, put, get, getFiles, deleteFiles, hasFiles } from '@stacksjs/storage'
63
63
  import { isFolder, isDir, doesFolderExist, createFolder, getFolders } from '@stacksjs/storage'
@@ -160,7 +160,7 @@ Storage.reset()
160
160
  The facade auto-configures these disks from `config/filesystems.ts`:
161
161
 
162
162
  - **`local`** -- `driver: 'local'`, root: `<project>/storage/app`, visibility: from config (default `'private'`)
163
- - **`public`** -- `driver: 'local'`, root: `<project>/public`, url: `<appUrl>/storage`, visibility: `'public'`
163
+ - **`public`** -- `driver: 'local'`, root: `<project>/public`, url: the application origin, visibility: `'public'`
164
164
  - **`s3`** -- only added if `s3.bucket` is configured in filesystems config
165
165
 
166
166
  ## StorageAdapter Interface
@@ -169,7 +169,7 @@ All adapters implement this interface:
169
169
 
170
170
  ```typescript
171
171
  interface StorageAdapter {
172
- write(path: string, contents: FileContents): Promise<void>
172
+ write(path: string, contents: FileContents): Promise<PutResult>
173
173
  read(path: string): Promise<FileContents>
174
174
  readToString(path: string): Promise<string>
175
175
  readToBuffer(path: string): Promise<Buffer>
@@ -208,8 +208,8 @@ const local = createLocalStorage({ root: './storage' })
208
208
  - `moveFile()` uses `fs.rename()`; `copyFile()` uses `fs.copyFile()`
209
209
  - `checksum()` uses `Bun.CryptoHasher` (default algorithm: `sha256`)
210
210
  - `temporaryUrl()` generates HMAC-signed URLs using `APP_KEY` env var
211
- - `changeVisibility()` is a no-op (Node.js doesn't map to public/private simply)
212
- - `visibility()` always returns `'private'`
211
+ - `changeVisibility()` changes POSIX modes: public files/directories use 0644/0755, private use 0600/0700
212
+ - `visibility()` reads mode bits; a world-readable entry is public, other modes collapse to private
213
213
  - MIME type detection is extension-based (supports txt, html, css, js, json, xml, pdf, zip, jpg, jpeg, png, gif, svg, mp4, mp3, wav)
214
214
  - `list()` returns an async iterable; supports `deep: true` for recursive listing
215
215
 
@@ -370,17 +370,19 @@ copyFolder('srcDir/', 'destDir/', ['dist']) // directory with exclusions
370
370
  ### Move/Rename
371
371
 
372
372
  ```typescript
373
- import { move, rename } from '@stacksjs/storage'
373
+ import { storage } from '@stacksjs/storage'
374
374
 
375
- const result = await move('old.txt', 'new.txt') // single file
376
- const result = await move(['a.txt', 'b.txt'], 'dest/') // multiple files to directory
377
- const result = await move('old.txt', 'new.txt', { overwrite: true })
375
+ const result = await storage.move('old.txt', 'new.txt') // single file
376
+ const result = await storage.move(['a.txt', 'b.txt'], 'dest/') // multiple files to directory
377
+ const result = await storage.move('old.txt', 'new.txt', { overwrite: true })
378
378
 
379
- const result = await rename('old.txt', 'new.txt')
379
+ const result = await storage.rename('old.txt', 'new.txt')
380
380
  // Returns Result<{ message: string }, Error>
381
381
  ```
382
382
 
383
- `move()` creates destination directories if needed. Without `overwrite: true`, throws if destination exists.
383
+ Low-level storage.move/rename returns a Result; inspect an error result instead
384
+ of assuming an awaited call succeeded. The facade Storage.move targets a disk
385
+ and has a different void/error contract.
384
386
 
385
387
  ### Delete
386
388
 
@@ -610,9 +612,9 @@ const config = configFromEnv({ default: 'local' })
610
612
  ```
611
613
 
612
614
  ## Gotchas
613
- - Default driver is `'bun'` (not `'local'`), but the Storage facade only supports `'local'` and `'s3'` drivers -- the `buildConfig()` in the facade maps the filesystems config to `'local'` as the default disk driver
615
+ - The default is the local disk. filesystems.driver names a configured disk, not an adapter; facade drivers are local, s3 and azure
614
616
  - The `local` disk root is `<project>/storage/app`, not the project root
615
- - The `public` disk root is `<project>/public` with URL prefix `<appUrl>/storage`
617
+ - The public disk root is `<project>/public`, served from the application origin, with no /storage prefix
616
618
  - S3 disk is only added if `s3.bucket` is configured
617
619
  - `list()` returns an `AsyncIterable` -- use `for await` to iterate
618
620
  - `checksum()` defaults to `sha256` in both adapters (not `md5`)
@@ -620,11 +622,28 @@ const config = configFromEnv({ default: 'local' })
620
622
  - `temporaryUrl()` on S3 adapter uses pre-signed URLs via `getSignedUrl()`
621
623
  - `LocalStorageAdapter` prevents path traversal -- throws if resolved path escapes the root
622
624
  - `S3StorageAdapter` requires a bucket name -- throws on construction if missing
623
- - `changeVisibility()` is a no-op on both local and S3 adapters
624
- - `visibility()` always returns `'private'` on both adapters
625
+ - Local uses POSIX permissions; S3 uses provider ACL operations. Azure refuses per-object visibility changes because visibility belongs to its container
626
+ - Query visibility through the adapter; a generated publicUrl does not by itself grant public read access
625
627
  - The `Storage` singleton is pre-instantiated -- use `Storage.reset()` to clear caches for testing
626
628
  - `UploadedFile.storeAs()` rejects filenames containing `..`, `/`, or `\` to prevent path traversal
627
629
  - `UploadedFile.hashName()` is cached -- calling it multiple times returns the same hash
628
630
  - Low-level operations (`copy`, `move`, `delete*`, etc.) use synchronous `fs` methods, while the Storage facade uses async operations
629
631
  - `zip()` and `unzip()` shell out to the `zip`/`unzip` commands -- they require these tools to be installed on the system
630
632
  - `STORAGE_DRIVER` env var controls the driver selection in `config/filesystems.ts`
633
+
634
+
635
+ ## Upload, stream and signed-link workflows
636
+
637
+ Read [UPLOADS-AND-DISKS.md](UPLOADS-AND-DISKS.md) when implementing uploads,
638
+ direct-to-provider writes, signed downloads, tenant scoping, large file streams
639
+ or cross-disk transfers. It covers the facade/adapter distinction and the limits
640
+ that change application behavior.
641
+
642
+ ## Provider evidence
643
+
644
+ The capability registry in `core/config/src/capabilities.ts` marks local
645
+ and memory supported; S3, Azure and Bun adapter parity are partial. S3/Azure
646
+ tests prove signing/request construction, not a live provider round-trip.
647
+ `ensureBucket/ensureConfiguredBuckets` provisions S3-compatible buckets;
648
+ Azure containers must exist already. An adapter's optional streaming, signed
649
+ URL and presigned write methods must be checked before a generic call.
@@ -0,0 +1,133 @@
1
+ # Uploads and disks
2
+
3
+ Read this for application upload workflows and topology-dependent behavior.
4
+ Source root: `storage/framework/core/storage/src/`.
5
+
6
+ ## Facade versus adapter
7
+
8
+ `Storage` is a manager: put/get/delete/url/copy/move and metadata conveniences
9
+ target the configured default disk. `Storage.disk(name)` returns a StorageAdapter,
10
+ whose equivalent names are write/readToString/deleteFile/publicUrl/copyFile/
11
+ moveFile. It does not return a second facade with put/get methods.
12
+
13
+ ```ts
14
+ import { Storage } from '@stacksjs/storage'
15
+
16
+ const result = await Storage.disk('public').write('exports/report.txt', 'Report')
17
+ const publicUrl = await Storage.disk('public').publicUrl(result.path)
18
+ ```
19
+
20
+ `write` and facade put return PutResult with path/size and optional provider
21
+ metadata. Optional etag/contentType/lastModified values are not synthesized as
22
+ proof of an unavailable provider response. `Storage.stat(path)` provides a full
23
+ metadata read. `filesystems.driver` names a configured disk: local/public/S3
24
+ out of the box, custom names after init/configure. Default is local.
25
+
26
+ ## Server-proxied uploaded files
27
+
28
+ `Storage.put(file, options?)` accepts UploadedFileLike from a parsed request or
29
+ the native UploadedFile wrapper and returns PutResult plus url. Options are disk,
30
+ dir, filename strategy (uuid/hash/original/custom), preserveExtension, overwrite
31
+ and transform. Default uuid naming avoids leaking client names. overwrite defaults
32
+ true, so set an explicit policy for collision-sensitive uploads.
33
+
34
+ Use the native request file macro, validate the boundary, then pass the file to
35
+ storage. Client MIME and file extension are hints. `verifyUploadedMime` and
36
+ `detectMimeFromMagicBytes` provide byte checks; read `mime-verify.ts` for supported
37
+ formats and result semantics. fileInfo/fileInfoFromBytes/fileKind/isPreviewable/
38
+ resolveMime provide native metadata. A transform that changes image format must
39
+ also update the output MIME/name policy. The optional image pipeline is under
40
+ `@stacksjs/storage/image`, separate from the lightweight public entry.
41
+
42
+ Source: `put-file.ts`, `uploaded-file.ts`, `mime-verify.ts`, `file-info.ts`.
43
+ Evidence: `tests/put-file.test.ts`, `mime-verify.test.ts`, `file-info.test.ts`.
44
+
45
+ ## Direct provider uploads
46
+
47
+ `presignedUploadUrl({ contentType, expiresIn, dir?, filename?, maxSize? })`
48
+ returns a signed PUT destination. `maxSize` is advisory; a browser can ignore it.
49
+ The provider signs the exact Content-Type. Authenticate and authorize the
50
+ presign action, select the server-owned directory, then verify the uploaded object
51
+ before accepting it as the user's record.
52
+
53
+ For a provider-enforced size cap, use the S3 POST policy API:
54
+
55
+ ```ts
56
+ import { Storage } from '@stacksjs/storage'
57
+
58
+ const policy = await Storage.disk('s3').presignedUploadPolicy({
59
+ key: 'avatars/user-7/avatar.jpg',
60
+ contentType: 'image/jpeg',
61
+ contentLengthRange: { min: 1, max: 2 * 1024 * 1024 },
62
+ expiresIn: 300,
63
+ })
64
+ ```
65
+
66
+ Submit every policy.fields entry and the file as multipart form data to policy.url.
67
+ Local/memory adapters do not implement a remote upload URL; generic facade calls
68
+ throw clearly when the optional adapter method is absent. A frontend direct-upload
69
+ composable must be imported from its package when it is absent from the actual
70
+ STX runtime globals. See stacks-composables and stacks-auto-imports.
71
+
72
+ Source: `facade.ts`, `types.ts`, `s3-presigned-post.ts`, `adapters/s3.ts`.
73
+ Evidence: `tests/s3-presigned-post.test.ts`, `path-sanitize.test.ts`.
74
+
75
+ ## Streams and cross-disk movement
76
+
77
+ `getStream(path, { signal? })` returns a web ReadableStream; putStream accepts
78
+ that stream and optional contentType/signal plus S3 multipart tuning. Local and
79
+ Azure reads are incremental; S3 reads currently buffer. S3 writes multipart large
80
+ streams; Azure stages blocks and commits the block list. Abort is driver-specific;
81
+ read the adapter when planning memory bounds or retries.
82
+
83
+ `Storage.copyAcross('sourceDisk:path', 'destinationDisk:path')` uses a native
84
+ copy for the same disk, otherwise reads then writes buffered content.
85
+ moveAcross uses native same-disk movement, or copy then source delete across
86
+ disks. A cross-disk delete failure can leave both copies after a successful
87
+ destination write; it is not an atomic distributed move. Moving a path onto
88
+ itself preserves the file.
89
+
90
+ Source: `facade.ts`, adapters; evidence: `tests/streaming.test.ts`,
91
+ `readable-stream-guard.test.ts`, `move-onto-itself.test.ts`.
92
+
93
+ ## Provider disks and visibility
94
+
95
+ Native presets: localDisk/s3Disk/azureDisk/r2Disk/gcsDisk/filebaseDisk/
96
+ backblazeDisk/hetznerDisk. Read `types/filesystem.ts` for their options and
97
+ credentials. S3-compatible providers share the S3 adapter but vary endpoint,
98
+ path style, region and public URL. config/filesystems.s3.usePathStyleEndpoint
99
+ overrides the endpoint default; virtual-hosted providers need the appropriate
100
+ false value. R2's API host is not a public object host.
101
+
102
+ Local visibility changes POSIX permissions and reads world-readable mode bits;
103
+ S3 uses provider ACL calls. Modern bucket-owner-enforced S3 buckets reject object
104
+ ACL changes, so use provider policies or signed URLs for those buckets. Public URL
105
+ generation is not itself an ACL change. Azure has container-wide visibility and
106
+ rejects changeVisibility for one blob. Azure service-SAS generation needs an
107
+ account key; a configured SAS token cannot be widened into fresh signed grants.
108
+ ensureConfiguredBuckets provisions S3 buckets, not Azure containers.
109
+
110
+ KnownDisks is an augmentable name registry for completion, not runtime
111
+ configuration. Declare the disk and configure it as well. Provider evidence
112
+ is recorded in `core/config/src/capabilities.ts`; partial live-provider evidence
113
+ is not upgraded by a preset or TypeScript type.
114
+
115
+ Evidence: `tests/default-disk.test.ts`, `config-path-style.test.ts`,
116
+ `s3-compatible-disks.test.ts`, `visibility.test.ts`, `s3-visibility.test.ts`,
117
+ `azure-adapter.test.ts` and `azure-signing.test.ts`.
118
+
119
+ ## Signed links and tenant scopes
120
+
121
+ `signedUrl(path, { expiresIn, ... })` grants temporary access; local signed links
122
+ use APP_KEY and the native storage-serving route, while providers use their
123
+ own signed URL mechanism. Verify the actual route/adapter and disk claim rather
124
+ than serving an arbitrary client-supplied path. PublicUrl and signedUrl have
125
+ different access guarantees.
126
+
127
+ `scoped(Storage.disk(name), { scope: tenantId })` wraps an adapter with a validated
128
+ path prefix and tenant-relative listing/metadata. Derive tenantId from authenticated
129
+ authority. The wrapper protects path scope, not a caller's right to choose the
130
+ tenant. Underlying optional methods still need driver support.
131
+
132
+ Source: `signed-url.ts`, `static-serve.ts`, `adapters/scoped.ts`; evidence:
133
+ `tests/scoped.test.ts`, `static-serve.test.ts`, `path-sanitize.test.ts`.
@@ -16,15 +16,15 @@ allowed-tools: Read Edit Write Bash Grep Glob
16
16
  ## Architecture
17
17
 
18
18
  The package re-exports from these submodules:
19
- - `case.ts` — case conversion functions (camelCase, pascalCase, snakeCase, etc.)
20
- - `pluralize.ts` — English pluralization/singularization with rule engine
21
- - `slug.ts` — URL slug generation with extensive character map
22
- - `utils.ts` — random strings, template interpolation, slash, prefix/suffix, truncate, detect-indent, detect-newline
23
- - `macro.ts` — `Str` and `str` facade objects
24
- - `validators.ts` — re-exports from `is.ts` (native string validators)
25
- - `sponge-case.ts` — random upper/lower case
26
- - `swap-case.ts` — swap upper/lower case
27
- - `title-case.ts` — intelligent title case with small word handling
19
+ - `case.ts` - case conversion functions (camelCase, pascalCase, snakeCase, etc.)
20
+ - `pluralize.ts` - English pluralization/singularization with rule engine
21
+ - `slug.ts` - URL slug generation with extensive character map
22
+ - `utils.ts` - random strings, template interpolation, slash, prefix/suffix, truncate, detect-indent, detect-newline
23
+ - `macro.ts` - `Str` and `str` facade objects
24
+ - `validators.ts` - re-exports from `is.ts` (native string validators)
25
+ - `sponge-case.ts` - random upper/lower case
26
+ - `swap-case.ts` - swap upper/lower case
27
+ - `title-case.ts` - intelligent title case with small word handling
28
28
 
29
29
  The top-level `index.ts` does:
30
30
  ```typescript
@@ -64,28 +64,28 @@ interface PascalCaseOptions extends CaseOptions {
64
64
  ### Functions
65
65
 
66
66
  ```typescript
67
- camelCase('hello world') // 'helloWorld' — first word lowercase, rest capitalized
68
- pascalCase('hello world') // 'HelloWorld' — all words capitalized
69
- snakeCase('hello world') // 'hello_world' — alias for noCase with '_' delimiter
70
- kebabCase('hello world') // 'hello-world' — alias for noCase with '-' delimiter
71
- constantCase('hello world') // 'HELLO_WORLD' — all uppercase with '_' delimiter
72
- trainCase('hello world') // 'Hello-World' — capitalCase with '-' delimiter
73
- dotCase('hello world') // 'hello.world' — noCase with '.' delimiter
74
- pathCase('hello world') // 'hello/world' — noCase with '/' delimiter
75
- sentenceCase('hello world') // 'Hello world' — first word capitalized, rest lowercase
76
- capitalCase('hello world') // 'Hello World' — all words capitalized, space delimiter
77
- noCase('helloWorld') // 'hello world' — lowercase with space delimiter
78
- pascalSnakeCase('hello world') // 'Hello_World' — capitalCase with '_' delimiter
79
- paramCase('hello world') // 'hello-world' — alias for kebabCase
67
+ camelCase('hello world') // 'helloWorld' - first word lowercase, rest capitalized
68
+ pascalCase('hello world') // 'HelloWorld' - all words capitalized
69
+ snakeCase('hello world') // 'hello_world' - alias for noCase with '_' delimiter
70
+ kebabCase('hello world') // 'hello-world' - alias for noCase with '-' delimiter
71
+ constantCase('hello world') // 'HELLO_WORLD' - all uppercase with '_' delimiter
72
+ trainCase('hello world') // 'Hello-World' - capitalCase with '-' delimiter
73
+ dotCase('hello world') // 'hello.world' - noCase with '.' delimiter
74
+ pathCase('hello world') // 'hello/world' - noCase with '/' delimiter
75
+ sentenceCase('hello world') // 'Hello world' - first word capitalized, rest lowercase
76
+ capitalCase('hello world') // 'Hello World' - all words capitalized, space delimiter
77
+ noCase('helloWorld') // 'hello world' - lowercase with space delimiter
78
+ pascalSnakeCase('hello world') // 'Hello_World' - capitalCase with '_' delimiter
79
+ paramCase('hello world') // 'hello-world' - alias for kebabCase
80
80
  ```
81
81
 
82
82
  ### Special Case Functions
83
83
 
84
84
  ```typescript
85
- spongeCase('hello world') // 'hElLo wOrLd' — random upper/lower per character
85
+ spongeCase('hello world') // 'hElLo wOrLd' - random upper/lower per character
86
86
  spongeCase('hello', 'en') // accepts optional locale
87
87
 
88
- swapCase('Hello') // 'hELLO' — swaps each character's case
88
+ swapCase('Hello') // 'hELLO' - swaps each character's case
89
89
  swapCase('Hello', 'en') // accepts optional locale
90
90
  ```
91
91
 
@@ -164,13 +164,13 @@ The pluralization engine preserves the case pattern of the input word:
164
164
 
165
165
  Two slug functions with different defaults:
166
166
 
167
- ### `slug(str, options?)` — Simple slug (strict + lowercase by default)
167
+ ### `slug(str, options?)` - Simple slug (strict + lowercase by default)
168
168
  ```typescript
169
169
  slug('Hello World') // 'hello-world'
170
170
  slug('Hello World', { lower: false }) // 'Hello-World'
171
171
  ```
172
172
 
173
- ### `slugify(str, options?)` — Full-featured slug
173
+ ### `slugify(str, options?)` - Full-featured slug
174
174
  ```typescript
175
175
  slugify('Hello World!') // 'Hello-World!' (not strict/lowercase by default)
176
176
  slugify('Hello World!', { lower: true, strict: true }) // 'hello-world'
@@ -201,8 +201,8 @@ Extensive built-in character map covering:
201
201
  Locale-specific character mappings for: `bg`, `de`, `es`, `fr`, `pt`, `uk`, `vi`, `da`, `nb`, `it`, `nl`, `sv`.
202
202
 
203
203
  ```typescript
204
- slugify('AE', { locale: 'de' }) // 'AE' (German)
205
- slugify('AE') // 'A' (default)
204
+ slugify('Ä', { locale: 'de' }) // 'AE' (German character map)
205
+ slugify('Ä') // 'A' (default character map)
206
206
  ```
207
207
 
208
208
  ### Extending the Character Map
@@ -213,7 +213,7 @@ extendCharMap({ 'EUR': 'EUR', 'GBP': 'GBP' })
213
213
  ## String Utilities
214
214
 
215
215
  ```typescript
216
- capitalize('hello world') // 'Hello world' — first char upper, rest lower
216
+ capitalize('hello world') // 'Hello world' - first char upper, rest lower
217
217
  lowercase('HELLO') // 'hello'
218
218
  slash('path\\to\\file') // 'path/to/file'
219
219
  ensurePrefix('https://', 'google.com') // 'https://google.com'
@@ -259,7 +259,7 @@ isJSON('{"key":"value"}') // true -- JSON.parse succeeds
259
259
  isHSL('hsl(0, 100%, 50%)') // true
260
260
  isMimeType('text/html') // true -- /^[a-z]+\/[a-z0-9\-+.]+$/i
261
261
  isDataURI('data:text/plain;base64,...') // true
262
- isJWT('eyJhbGciOi...') // true -- 3 dot-separated base64url segments
262
+ isJWT('eyJhbGciOiJIUzI1NiJ9.e30.c2ln') // true -- shape check only, not signature verification
263
263
  ```
264
264
 
265
265
  ### Network Validators
@@ -291,14 +291,14 @@ isPostalCode('12345') // true -- US, UK, Canada, generic for
291
291
  ### Phone, Identity, Date Validators
292
292
  ```typescript
293
293
  isMobilePhone('+1234567890') // true -- international format, min 7 digits
294
- isUUID('550e8400-e29b-41d4-a716...') // true -- v1-v5
294
+ isUUID('550e8400-e29b-41d4-a716-446655440000') // true -- full value required
295
295
  isISO8601('2024-01-01T00:00:00Z') // true -- with Date validity check
296
296
  isIdentityCard('AB123456') // true -- generic 5-20 alphanumeric
297
297
  isISRC('USRC17607839') // true
298
298
  isISO31661Alpha2('US') // true
299
299
  isISO31661Alpha3('USA') // true
300
300
  validateUsername('user123') // true -- alias for isAlphanumeric
301
- isHash('abc123...', 'md5') // true -- supports md5(32), sha1(40), sha256(64), sha384(96), sha512(128)
301
+ isHash('d41d8cd98f00b204e9800998ecf8427e', 'md5') // true -- exact algorithm length required
302
302
  isByteLength('hello', { min: 1, max: 10 }) // true
303
303
  isFullWidth('\uFF21') // true
304
304
  isHalfWidth('a') // true
@@ -409,8 +409,14 @@ interface PluralizeOptions { count?, inclusive? }
409
409
  - `pascalCase` and `camelCase` accept `PascalCaseOptions` with `mergeAmbiguousCharacters` to control number-prefixed word handling
410
410
  - All case functions support `prefixCharacters`/`suffixCharacters` to preserve leading/trailing non-word characters
411
411
  - `pluralize()` is both a function AND an object with methods -- `pluralize.plural()`, `pluralize.singular()`, etc.
412
- - The `random()` function uses `Math.random()`, not crypto -- fine for IDs but not for security tokens
413
- - `isNumeric()` only matches whole numbers (`/^\d+$/`), not floats -- use parseFloat for float checking
412
+ - `random()` uses crypto.getRandomValues and fails if that facility is absent.
413
+ A caller still owns the alphabet/length and storage/expiry of its token; the
414
+ helper is not a complete authentication-token workflow.
415
+ - `isNumeric()` only matches unsigned digit strings (`/^\d+$/`), not floats.
416
+ Use a numeric validator and full input validation for a request; parseFloat
417
+ accepts a numeric prefix and is not a complete validity check.
414
418
  - `isURL()` requires `http:` or `https:` protocol -- rejects other protocols and bare domains
415
419
  - The `Str` facade does NOT include validators -- only case, utility, and pluralization methods
416
- - `helpers.ts` only exports `toString()` which returns `Object.prototype.toString.call(v)`
420
+ - `helpers.ts` exports `toString()` (Object.prototype.toString, not ordinary
421
+ string coercion) and `mask(value, character, index, length?)`. Mask supports
422
+ a negative starting index and uses the first character of its mask string.
@@ -23,9 +23,10 @@ When the task is how a page should *look* (not just how stx renders), pair this
23
23
  - Partials: `resources/partials/`
24
24
  - Views: `resources/views/`
25
25
  - Package: `@stacksjs/stx`
26
+ - Utility CSS configuration: `config/css.ts` (`@stacksjs/ts-css/engine`)
26
27
 
27
28
  ## CRITICAL Rules
28
- 1. **ALWAYS use STX** for templating — never write vanilla JS
29
+ 1. **ALWAYS use STX** for templating - never write vanilla JS
29
30
  2. **NEVER use** `var`, `document.*`, `window.*` in STX templates
30
31
  3. STX `<script>` tags should ONLY contain stx-compatible code (signals, composables, directives)
31
32
 
@@ -157,42 +158,44 @@ export default {
157
158
  } satisfies StxOptions
158
159
  ```
159
160
 
160
- ### Full StxConfig
161
-
162
- ```typescript
163
- interface StxConfig {
164
- enabled: boolean
165
- debug: boolean
166
- componentsDir: string
167
- partialsDir: string
168
- layoutsDir?: string
169
- defaultLayout?: string
170
- templatesDir?: string
171
- cachePath: string
172
- ssr?: boolean
173
- cache?: boolean
174
- defaultTitle?: string
175
- defaultDescription?: string
176
-
177
- // Feature modules
178
- i18n?: Partial<I18nConfig>
179
- webComponents?: Partial<WebComponentConfig>
180
- streaming?: Partial<StreamingConfig>
181
- hydration?: Partial<HydrationConfig>
182
- a11y?: Partial<A11yConfig>
183
- seo?: Partial<SeoFeatureConfig>
184
- animation?: Partial<AnimationConfig>
185
- markdown?: Partial<MarkdownConfig>
186
- forms?: Partial<FormConfig>
187
- pwa?: Partial<PwaConfig>
188
- components?: Partial<ComponentConfig>
189
- media?: Partial<MediaConfig>
190
- strict?: boolean | StrictModeConfig
191
- customDirectives?: CustomDirective[]
192
- }
193
- ```
194
-
195
- ## STX Capabilities (118+ modules)
161
+ ### Configuration source
162
+
163
+ Import `StxOptions` from the installed package and use `satisfies`; the exported
164
+ type and `config/ui.ts` are authoritative. Optional rendering, hydration,
165
+ streaming, SEO, i18n, component/plugin, form, PWA and strict settings vary with
166
+ the installed STX version. Adding a key to a handwritten interface does not
167
+ enable a module. Read the implementation and retained test for the selected
168
+ setting instead of copying an obsolete flattened config shape.
169
+
170
+ ## Request, state and component boundaries
171
+
172
+ Use `config/ui.ts`'s explicit `root: 'resources'` and relative component,
173
+ layout and partial directories. `stateDir: 'storage/framework/stx'` owns caches,
174
+ client bundles and generated route artifacts. Keep application overrides under
175
+ `resources/`; framework defaults remain the fallback. `defaultViews` controls
176
+ which auth/storefront/error/mail views are served, and its default follows the
177
+ mounted default route bundles. A view existing on disk does not establish that
178
+ its POST endpoint is enabled.
179
+
180
+ Server scripts run per render; client scripts run in the browser. Serialize
181
+ server data through the supported hydration bridge rather than sharing mutable
182
+ process state. In server templates read the request snapshot (including site)
183
+ through `requestContext`; API AsyncLocalStorage site context does not extend
184
+ through STX's asynchronous render boundary. Pair tenant features with
185
+ `stacks-sites`.
186
+
187
+ The browser has both eagerly delivered and demand-bundled composables.
188
+ Observers, motion helpers and STX `useForm` are usable client primitives in
189
+ current STX, even when they are not explicit `window.name` aliases. Read
190
+ `stacks-composables/BROWSER.md` before choosing a signature or mixing the
191
+ browser signal API with explicit module Refs.
192
+
193
+ For account-persisted initial UI use `keptState` or `cachedQuery`, establish
194
+ `setKeptScope` before values are created, and clear the account scope on
195
+ sign-out. Use `clearServerData(key?)` after mutations invalidate hydration
196
+ data. Ordinary localStorage is a different persistence boundary.
197
+
198
+ ## STX capability discovery
196
199
 
197
200
  ### Core
198
201
  - Template parsing and compilation
@@ -224,21 +227,21 @@ function showSearch(): void {
224
227
  `nextTick()` runs after the current synchronous signal and effect flush. Prefer it over `querySelector`, manual DOM polling, or `requestAnimationFrame` when the task is waiting for STX to materialize reactive markup.
225
228
 
226
229
  ### Rendering
227
- - **SSR** — Server-Side Rendering
228
- - **Streaming** — Progressive HTML streaming
229
- - **Hydration** — Progressive and islands-based hydration
230
- - **Suspense** — Async component loading with fallbacks
231
- - **Error boundaries** — Graceful error handling in components
230
+ - **SSR** - Server-Side Rendering
231
+ - **Streaming** - Progressive HTML streaming
232
+ - **Hydration** - Progressive and islands-based hydration
233
+ - **Suspense** - Async component loading with fallbacks
234
+ - **Error boundaries** - Graceful error handling in components
232
235
 
233
236
  ### Features
234
- - **Router** — Client-side routing
235
- - **Forms** — Built-in form handling and validation
236
- - **i18n** — Internationalization support
237
- - **SEO** — Meta tags, Open Graph, Twitter cards, structured data
238
- - **PWA** — Progressive Web App support
239
- - **Animation** — CSS and JS animation system
240
- - **Markdown** — Markdown rendering with syntax highlighting
241
- - **A11y** — Accessibility checking and auto-fixing
237
+ - **Router** - Client-side routing
238
+ - **Forms** - Built-in form handling and validation
239
+ - **i18n** - Internationalization support
240
+ - **SEO** - Meta tags, Open Graph, Twitter cards, structured data
241
+ - **PWA** - Progressive Web App support
242
+ - **Animation** - CSS and JS animation system
243
+ - **Markdown** - Markdown rendering with syntax highlighting
244
+ - **A11y** - Accessibility checking and auto-fixing
242
245
 
243
246
  ### SEO directives
244
247
 
@@ -299,21 +302,23 @@ await addLayout('admin', { nav: true, footer: true })
299
302
  `default`, `minimal`, `full`, `blog`, `dashboard`, `landing`
300
303
 
301
304
  ## Gotchas
302
- - **STX is the ONLY templating system** — do not use other template engines
303
- - **`bun-plugin-stx` must be loaded** — without it, `.stx` files won't be processed
304
- - **Auto-imports** — browser auto-imports defined in `storage/framework/browser-auto-imports.json`
305
+ - **STX is the ONLY templating system** - do not use other template engines
306
+ - **`bun-plugin-stx` must be loaded** - without it, `.stx` files won't be processed
307
+ - **Client delivery** - eager runtime/compiler primitives, demand composables
308
+ and explicit module imports are distinct. The ambient browser manifest
309
+ does not establish which browser implementation or signature is delivered.
305
310
  - **Imported module dependencies** - browser auto-imports are injected into the STX script entry only; imported `.ts` modules must explicitly import every function or store they use
306
311
  - **Project-root server imports** - use `~/path` or `@/path` inside `<script server>` when a layout, partial, or page needs a project file. STX resolves both aliases against the application root before executing the server script. Relative imports still resolve against the `.stx` file
307
312
  - **Browser package inputs are bundled** - core browser helpers and model auto-import bootstraps are compiler bundle inputs. Rendered HTML must never contain a bare `import '@stacksjs/browser'`, because browsers cannot resolve package specifiers without an import map
308
313
  - **Server-to-client values are explicit** - a JSON-serializable top-level value exported by `<script server>` can be referenced by name in `<script client>`. STX serializes only referenced values and never overwrites a client-owned declaration
309
- - **`storage/framework/stx/`** — stx build cache and the generated route manifest. `config/ui.ts` sets stx's `stateDir` here, so nothing lands in the project root. Gitignored; safe to delete
314
+ - **`storage/framework/stx/`** - stx build cache and the generated route manifest. `config/ui.ts` sets stx's `stateDir` here, so nothing lands in the project root. Gitignored; safe to delete
310
315
  - **Reactivity is signal-based** - use callable `state()` and `derived()` signals, not Vue-style `ref()` or `.value`
311
316
  - **Client loop conditions** - `@if` chains that read `:for` or `@for` aliases compile into scoped runtime chains; aliases do not leak outside the loop element
312
317
  - **Component tag case is semantic** - `<Input v-model:value="query">` is a paired component, while lowercase `<input v-model="query">` is a native void element. Keep component tags PascalCase, including names that collide with native elements
313
318
  - **Structural DOM timing** - use `nextTick()` with `useRef()` after opening reactive markup
314
- - **Crosswind for styling** — use utility classes, not inline styles
315
- - **Script block restrictions** — only stx-compatible code (signals, composables, directives), no vanilla DOM APIs
319
+ - **Crosswind for styling** - use utility classes, not inline styles
320
+ - **Script block restrictions** - only stx-compatible code (signals, composables, directives), no vanilla DOM APIs
316
321
  - **Pre-paint state** - use `@appearanceBootstrap`, never a raw browser script in the template
317
- - **Components go in `resources/`** — not in `app/` or `storage/`
322
+ - **Components go in `resources/`** - not in `app/` or `storage/`
318
323
  - **SEO directives take expressions** - `@seo(seo)`, `@meta('author', post.author)` and `@structuredData(product)` are evaluated; a failure shows up as an inline `<!-- [... Error] -->` comment plus a `[stx]` console warning naming the file, never as silent emptiness. Keep `@seo` inside `<head>`
319
- - **118+ modules** — STX is a comprehensive framework covering rendering, routing, forms, i18n, SEO, PWA, and more
324
+ - **118+ modules** - STX is a comprehensive framework covering rendering, routing, forms, i18n, SEO, PWA, and more
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Matt Pocock
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ # Source and license
2
+
3
+ The upstream MIT notice is preserved in [LICENSE](LICENSE).
4
+
5
+ ## tdd
6
+
7
+ Source: [skills/engineering/tdd/SKILL.md](https://github.com/mattpocock/skills/blob/49dd158d1076134a641b33efb035946536778336/skills/engineering/tdd/SKILL.md),
8
+ revision `49dd158d1076134a641b33efb035946536778336`.
9
+
10
+ Reviewed against the existing Stacks workflow. Stacks API guidance is retained; current workflow changes and supporting references are integrated where applicable.
@@ -13,6 +13,11 @@ produce tests worth keeping: what a good test is, where tests go, the
13
13
  anti-patterns, and the rules of the loop. Every section applies on every cycle.
14
14
  Consult them before and during, not after.
15
15
 
16
+ Use the project's established `CONTEXT.md` or `GLOSSARY.md` vocabulary in test
17
+ names and interfaces, and respect existing ADRs. For each proposed test seam,
18
+ state in one line what it catches and what it misses. Existing agreement on a
19
+ seam carries forward; ask only when that decision remains unsettled.
20
+
16
21
  `stacks-testing` is the *mechanics*: `setupDatabase()`, `refreshDatabase()`,
17
22
  DynamoDB Local, `bunfig.toml` preload, the CLI flags. This skill is the
18
23
  *discipline*. Read that one for the API and this one for the decisions.
@@ -30,6 +35,8 @@ internal structure.
30
35
 
31
36
  See [EXAMPLES.md](EXAMPLES.md) for good and bad tests side by side, and for
32
37
  where mocking is legitimate.
38
+ The refreshed upstream examples are [tests.md](tests.md) and
39
+ [mocking.md](mocking.md). For fixture assertions, use `stacks-test-fixtures`.
33
40
 
34
41
  ## Seams: where tests go
35
42
 
@@ -121,5 +128,8 @@ environment. See `stacks-new-feature` for the full slice and
121
128
 
122
129
  ## Downstream
123
130
 
131
+ Current upstream provenance is in [NOTICE.md](NOTICE.md); read
132
+ [the Stacks adaptation rules](../stacks-flow/ENGINEERING.md) with this workflow.
133
+
124
134
  > Green? Run `/stacks-review` for the two-axis review, then `/stacks-browse` if
125
135
  > the slice has a UI.