@stacksjs/defaults 0.75.108 → 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.
- package/ai/AGENTS.md +36 -1
- package/ai/README.md +39 -1
- package/ai/skills/stacks-actions/SKILL.md +64 -6
- package/ai/skills/stacks-ai/SKILL.md +36 -10
- package/ai/skills/stacks-alias/SKILL.md +40 -85
- package/ai/skills/stacks-analytics/SKILL.md +23 -3
- package/ai/skills/stacks-arrays/SKILL.md +35 -9
- package/ai/skills/stacks-audio/SKILL.md +34 -0
- package/ai/skills/stacks-auth/ACCOUNT-WORKFLOWS.md +113 -0
- package/ai/skills/stacks-auth/SKILL.md +90 -57
- package/ai/skills/stacks-auto-imports/SKILL.md +80 -138
- package/ai/skills/stacks-browser/SKILL.md +82 -138
- package/ai/skills/stacks-browser-extension/SKILL.md +40 -0
- package/ai/skills/stacks-buddy/SKILL.md +2 -0
- package/ai/skills/stacks-build/SKILL.md +42 -23
- package/ai/skills/stacks-cache/SKILL.md +75 -115
- package/ai/skills/stacks-calendar/SKILL.md +61 -97
- package/ai/skills/stacks-charts/SKILL.md +34 -0
- package/ai/skills/stacks-chat/SKILL.md +18 -2
- package/ai/skills/stacks-chief-of-staff/LICENSE +21 -0
- package/ai/skills/stacks-chief-of-staff/NOTICE.md +10 -0
- package/ai/skills/stacks-chief-of-staff/PLAYBOOK.md +42 -0
- package/ai/skills/stacks-chief-of-staff/SKILL.md +28 -0
- package/ai/skills/stacks-cli/SKILL.md +23 -7
- package/ai/skills/stacks-cloud/SKILL.md +37 -20
- package/ai/skills/stacks-cms/PAGES.md +70 -0
- package/ai/skills/stacks-cms/SKILL.md +30 -18
- package/ai/skills/stacks-codebase-design/LICENSE +21 -0
- package/ai/skills/stacks-codebase-design/NOTICE.md +10 -0
- package/ai/skills/stacks-codebase-design/SKILL.md +10 -0
- package/ai/skills/stacks-collections/SKILL.md +25 -8
- package/ai/skills/stacks-commerce/SKILL.md +25 -1
- package/ai/skills/stacks-composables/BROWSER.md +97 -0
- package/ai/skills/stacks-composables/SKILL.md +87 -181
- package/ai/skills/stacks-config/SKILL.md +108 -162
- package/ai/skills/stacks-cron/SKILL.md +27 -13
- package/ai/skills/stacks-crosswind/SKILL.md +62 -167
- package/ai/skills/stacks-dashboard/SKILL.md +8 -0
- package/ai/skills/stacks-database/SKILL.md +98 -68
- package/ai/skills/stacks-datetime/SKILL.md +21 -5
- package/ai/skills/stacks-deploy/SKILL.md +17 -1
- package/ai/skills/stacks-design-brutalist/SKILL.md +1 -1
- package/ai/skills/stacks-design-minimalist/SKILL.md +17 -3
- package/ai/skills/stacks-design-soft/SKILL.md +16 -4
- package/ai/skills/stacks-design-taste/SKILL.md +55 -35
- package/ai/skills/stacks-design-taste-codex/SKILL.md +5 -5
- package/ai/skills/stacks-desktop/SKILL.md +22 -16
- package/ai/skills/stacks-development/SKILL.md +19 -8
- package/ai/skills/stacks-dns/SKILL.md +72 -139
- package/ai/skills/stacks-domain-modeling/ADR-FORMAT.md +47 -0
- package/ai/skills/stacks-domain-modeling/GLOSSARY-FORMAT.md +60 -0
- package/ai/skills/stacks-domain-modeling/LICENSE +21 -0
- package/ai/skills/stacks-domain-modeling/NOTICE.md +10 -0
- package/ai/skills/stacks-domain-modeling/SKILL.md +11 -0
- package/ai/skills/stacks-email/DELIVERY-CONTROLS.md +84 -0
- package/ai/skills/stacks-email/SKILL.md +18 -2
- package/ai/skills/stacks-enums/SKILL.md +28 -81
- package/ai/skills/stacks-env/SKILL.md +23 -15
- package/ai/skills/stacks-error-handling/SKILL.md +68 -121
- package/ai/skills/stacks-events/SKILL.md +83 -264
- package/ai/skills/stacks-faker/SKILL.md +28 -13
- package/ai/skills/stacks-feature-flags/SKILL.md +41 -0
- package/ai/skills/stacks-features/SKILL.md +46 -0
- package/ai/skills/stacks-flow/ENGINEERING.md +84 -0
- package/ai/skills/stacks-flow/LICENSE +21 -0
- package/ai/skills/stacks-flow/NOTICE.md +10 -0
- package/ai/skills/stacks-flow/SKILL.md +32 -0
- package/ai/skills/stacks-flow/upstream-skills.json +726 -0
- package/ai/skills/stacks-forms/SKILL.md +44 -0
- package/ai/skills/stacks-git/LICENSE +21 -0
- package/ai/skills/stacks-git/NOTICE.md +10 -0
- package/ai/skills/stacks-git/SKILL.md +11 -0
- package/ai/skills/stacks-grill-with-docs/LICENSE +21 -0
- package/ai/skills/stacks-grill-with-docs/NOTICE.md +10 -0
- package/ai/skills/stacks-grill-with-docs/PLAYBOOK.md +4 -0
- package/ai/skills/stacks-grill-with-docs/SKILL.md +24 -0
- package/ai/skills/stacks-grilling/LICENSE +21 -0
- package/ai/skills/stacks-grilling/NOTICE.md +17 -0
- package/ai/skills/stacks-grilling/SKILL.md +7 -0
- package/ai/skills/stacks-guard/LICENSE +21 -0
- package/ai/skills/stacks-guard/NOTICE.md +10 -0
- package/ai/skills/stacks-guard/SKILL.md +6 -0
- package/ai/skills/stacks-handoff/LICENSE +21 -0
- package/ai/skills/stacks-handoff/NOTICE.md +17 -0
- package/ai/skills/stacks-handoff/SKILL.md +8 -0
- package/ai/skills/stacks-http/SKILL.md +64 -297
- package/ai/skills/stacks-humanizer/LICENSE +21 -0
- package/ai/skills/stacks-humanizer/NOTICE.md +19 -0
- package/ai/skills/stacks-humanizer/SKILL.md +85 -0
- package/ai/skills/stacks-humanizer/references/patterns.md +350 -0
- package/ai/skills/stacks-i18n/SKILL.md +33 -8
- package/ai/skills/stacks-image/SKILL.md +37 -0
- package/ai/skills/stacks-image-to-code/SKILL.md +11 -6
- package/ai/skills/stacks-implement/LICENSE +21 -0
- package/ai/skills/stacks-implement/NOTICE.md +10 -0
- package/ai/skills/stacks-implement/PLAYBOOK.md +14 -0
- package/ai/skills/stacks-implement/SKILL.md +24 -0
- package/ai/skills/stacks-implement-spec/LICENSE +21 -0
- package/ai/skills/stacks-implement-spec/NOTICE.md +10 -0
- package/ai/skills/stacks-implement-spec/PLAYBOOK.md +37 -0
- package/ai/skills/stacks-implement-spec/SKILL.md +24 -0
- package/ai/skills/stacks-improve-codebase-architecture/HTML-REPORT.md +126 -0
- package/ai/skills/stacks-improve-codebase-architecture/LICENSE +21 -0
- package/ai/skills/stacks-improve-codebase-architecture/NOTICE.md +10 -0
- package/ai/skills/stacks-improve-codebase-architecture/PLAYBOOK.md +68 -0
- package/ai/skills/stacks-improve-codebase-architecture/SKILL.md +24 -0
- package/ai/skills/stacks-investigate/LICENSE +21 -0
- package/ai/skills/stacks-investigate/NOTICE.md +10 -0
- package/ai/skills/stacks-investigate/SKILL.md +6 -0
- package/ai/skills/stacks-jobs/SKILL.md +29 -8
- package/ai/skills/stacks-listeners/SKILL.md +13 -5
- package/ai/skills/stacks-logging/SKILL.md +71 -68
- package/ai/skills/stacks-loop/LICENSE +21 -0
- package/ai/skills/stacks-loop/NOTICE.md +10 -0
- package/ai/skills/stacks-loop/PLAYBOOK.md +28 -0
- package/ai/skills/stacks-loop/SKILL.md +28 -0
- package/ai/skills/stacks-mail/SKILL.md +46 -7
- package/ai/skills/stacks-marketing/CATALOG.md +60 -0
- package/ai/skills/stacks-marketing/LICENSE +21 -0
- package/ai/skills/stacks-marketing/NOTICE.md +5 -0
- package/ai/skills/stacks-marketing/SKILL.md +27 -0
- package/ai/skills/stacks-marketing/WORKFLOW.md +83 -0
- package/ai/skills/stacks-marketing-ab-testing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-ab-testing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-ab-testing/PLAYBOOK.md +352 -0
- package/ai/skills/stacks-marketing-ab-testing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-ab-testing/evals/evals.json +116 -0
- package/ai/skills/stacks-marketing-ab-testing/references/sample-size-guide.md +263 -0
- package/ai/skills/stacks-marketing-ab-testing/references/test-templates.md +277 -0
- package/ai/skills/stacks-marketing-ad-creative/LICENSE +21 -0
- package/ai/skills/stacks-marketing-ad-creative/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-ad-creative/PLAYBOOK.md +434 -0
- package/ai/skills/stacks-marketing-ad-creative/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-ad-creative/assets/creative-review-template.html +432 -0
- package/ai/skills/stacks-marketing-ad-creative/evals/evals.json +280 -0
- package/ai/skills/stacks-marketing-ad-creative/references/awareness-headlines.md +54 -0
- package/ai/skills/stacks-marketing-ad-creative/references/creative-review-page.md +109 -0
- package/ai/skills/stacks-marketing-ad-creative/references/creative-roadmap.md +118 -0
- package/ai/skills/stacks-marketing-ad-creative/references/generative-tools.md +613 -0
- package/ai/skills/stacks-marketing-ad-creative/references/hook-system.md +115 -0
- package/ai/skills/stacks-marketing-ad-creative/references/imessage-video-ads.md +197 -0
- package/ai/skills/stacks-marketing-ad-creative/references/meta-creative-formats.md +114 -0
- package/ai/skills/stacks-marketing-ad-creative/references/motion-video-ads.md +126 -0
- package/ai/skills/stacks-marketing-ad-creative/references/platform-specs.md +213 -0
- package/ai/skills/stacks-marketing-ad-creative/references/short-form-video-specs.md +213 -0
- package/ai/skills/stacks-marketing-ad-creative/references/static-ad-templates.md +308 -0
- package/ai/skills/stacks-marketing-ads/LICENSE +21 -0
- package/ai/skills/stacks-marketing-ads/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-ads/PLAYBOOK.md +464 -0
- package/ai/skills/stacks-marketing-ads/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-ads/evals/evals.json +192 -0
- package/ai/skills/stacks-marketing-ads/references/abm-playbook.md +101 -0
- package/ai/skills/stacks-marketing-ads/references/ad-copy-templates.md +207 -0
- package/ai/skills/stacks-marketing-ads/references/audience-targeting.md +243 -0
- package/ai/skills/stacks-marketing-ads/references/audit-guardrails.md +83 -0
- package/ai/skills/stacks-marketing-ads/references/b2b-paid-playbook.md +115 -0
- package/ai/skills/stacks-marketing-ads/references/conversion-tracking.md +361 -0
- package/ai/skills/stacks-marketing-ads/references/creative-research-automation.md +103 -0
- package/ai/skills/stacks-marketing-ads/references/google-ads-audit-checklist.md +84 -0
- package/ai/skills/stacks-marketing-ads/references/google-search-playbook.md +120 -0
- package/ai/skills/stacks-marketing-ads/references/linkedin-b2b-playbook.md +107 -0
- package/ai/skills/stacks-marketing-ads/references/meta-andromeda-playbook.md +44 -0
- package/ai/skills/stacks-marketing-ads/references/meta-decision-system.md +176 -0
- package/ai/skills/stacks-marketing-ads/references/payback-period.md +73 -0
- package/ai/skills/stacks-marketing-ads/references/platform-setup-checklists.md +277 -0
- package/ai/skills/stacks-marketing-ads/references/reading-google-ads-data.md +121 -0
- package/ai/skills/stacks-marketing-ads/references/rsa-output-spec.md +88 -0
- package/ai/skills/stacks-marketing-ai-seo/LICENSE +21 -0
- package/ai/skills/stacks-marketing-ai-seo/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-ai-seo/PLAYBOOK.md +494 -0
- package/ai/skills/stacks-marketing-ai-seo/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-ai-seo/evals/evals.json +163 -0
- package/ai/skills/stacks-marketing-ai-seo/references/agent-readiness.md +66 -0
- package/ai/skills/stacks-marketing-ai-seo/references/citations-vs-recommendations.md +89 -0
- package/ai/skills/stacks-marketing-ai-seo/references/content-patterns.md +287 -0
- package/ai/skills/stacks-marketing-ai-seo/references/content-types.md +82 -0
- package/ai/skills/stacks-marketing-ai-seo/references/format-volatility.md +95 -0
- package/ai/skills/stacks-marketing-ai-seo/references/linkedin-ai-citations.md +131 -0
- package/ai/skills/stacks-marketing-ai-seo/references/okf.md +104 -0
- package/ai/skills/stacks-marketing-ai-seo/references/platform-ranking-factors.md +167 -0
- package/ai/skills/stacks-marketing-ai-seo/references/positioning-and-consensus.md +102 -0
- package/ai/skills/stacks-marketing-ai-seo/references/youtube-ai-citations.md +66 -0
- package/ai/skills/stacks-marketing-analytics/LICENSE +21 -0
- package/ai/skills/stacks-marketing-analytics/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-analytics/PLAYBOOK.md +307 -0
- package/ai/skills/stacks-marketing-analytics/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-analytics/evals/evals.json +117 -0
- package/ai/skills/stacks-marketing-analytics/references/event-library.md +260 -0
- package/ai/skills/stacks-marketing-analytics/references/ga4-implementation.md +304 -0
- package/ai/skills/stacks-marketing-analytics/references/gtm-implementation.md +396 -0
- package/ai/skills/stacks-marketing-aso/LICENSE +21 -0
- package/ai/skills/stacks-marketing-aso/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-aso/PLAYBOOK.md +310 -0
- package/ai/skills/stacks-marketing-aso/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-aso/evals/evals.json +104 -0
- package/ai/skills/stacks-marketing-aso/references/apple-specs.md +107 -0
- package/ai/skills/stacks-marketing-aso/references/benchmarks.md +131 -0
- package/ai/skills/stacks-marketing-aso/references/google-play-specs.md +135 -0
- package/ai/skills/stacks-marketing-aso/references/report-template.md +213 -0
- package/ai/skills/stacks-marketing-aso/references/scoring-criteria.md +213 -0
- package/ai/skills/stacks-marketing-attribution/LICENSE +21 -0
- package/ai/skills/stacks-marketing-attribution/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-attribution/PLAYBOOK.md +223 -0
- package/ai/skills/stacks-marketing-attribution/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-attribution/evals/evals.json +128 -0
- package/ai/skills/stacks-marketing-attribution/references/attribution-models.md +74 -0
- package/ai/skills/stacks-marketing-attribution/references/by-business-type.md +54 -0
- package/ai/skills/stacks-marketing-attribution/references/first-party-tracking.md +253 -0
- package/ai/skills/stacks-marketing-attribution/references/measurement-paradigms.md +85 -0
- package/ai/skills/stacks-marketing-churn-prevention/LICENSE +21 -0
- package/ai/skills/stacks-marketing-churn-prevention/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-churn-prevention/PLAYBOOK.md +420 -0
- package/ai/skills/stacks-marketing-churn-prevention/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-churn-prevention/evals/evals.json +107 -0
- package/ai/skills/stacks-marketing-churn-prevention/references/cancel-flow-patterns.md +316 -0
- package/ai/skills/stacks-marketing-churn-prevention/references/dunning-playbook.md +413 -0
- package/ai/skills/stacks-marketing-co-marketing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-co-marketing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-co-marketing/PLAYBOOK.md +306 -0
- package/ai/skills/stacks-marketing-co-marketing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-co-marketing/evals/evals.json +98 -0
- package/ai/skills/stacks-marketing-co-marketing/references/partnership-types.md +100 -0
- package/ai/skills/stacks-marketing-cold-email/LICENSE +21 -0
- package/ai/skills/stacks-marketing-cold-email/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-cold-email/PLAYBOOK.md +210 -0
- package/ai/skills/stacks-marketing-cold-email/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-cold-email/evals/evals.json +137 -0
- package/ai/skills/stacks-marketing-cold-email/references/benchmarks.md +87 -0
- package/ai/skills/stacks-marketing-cold-email/references/deliverability.md +111 -0
- package/ai/skills/stacks-marketing-cold-email/references/follow-up-sequences.md +81 -0
- package/ai/skills/stacks-marketing-cold-email/references/frameworks.md +90 -0
- package/ai/skills/stacks-marketing-cold-email/references/linkedin-outreach.md +91 -0
- package/ai/skills/stacks-marketing-cold-email/references/multichannel-cadence.md +79 -0
- package/ai/skills/stacks-marketing-cold-email/references/outbound-plays.md +88 -0
- package/ai/skills/stacks-marketing-cold-email/references/personalization.md +90 -0
- package/ai/skills/stacks-marketing-cold-email/references/reply-handling.md +65 -0
- package/ai/skills/stacks-marketing-cold-email/references/subject-lines.md +53 -0
- package/ai/skills/stacks-marketing-community-marketing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-community-marketing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-community-marketing/PLAYBOOK.md +171 -0
- package/ai/skills/stacks-marketing-community-marketing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-community-marketing/evals/evals.json +103 -0
- package/ai/skills/stacks-marketing-community-marketing/references/community-models.md +63 -0
- package/ai/skills/stacks-marketing-competitor-profiling/LICENSE +21 -0
- package/ai/skills/stacks-marketing-competitor-profiling/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-competitor-profiling/PLAYBOOK.md +436 -0
- package/ai/skills/stacks-marketing-competitor-profiling/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-competitor-profiling/evals/evals.json +97 -0
- package/ai/skills/stacks-marketing-competitor-profiling/references/templates.md +167 -0
- package/ai/skills/stacks-marketing-competitor-profiling/references/tool-reference.md +314 -0
- package/ai/skills/stacks-marketing-competitors/LICENSE +21 -0
- package/ai/skills/stacks-marketing-competitors/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-competitors/PLAYBOOK.md +283 -0
- package/ai/skills/stacks-marketing-competitors/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-competitors/evals/evals.json +119 -0
- package/ai/skills/stacks-marketing-competitors/references/content-architecture.md +277 -0
- package/ai/skills/stacks-marketing-competitors/references/templates.md +226 -0
- package/ai/skills/stacks-marketing-content-strategy/LICENSE +21 -0
- package/ai/skills/stacks-marketing-content-strategy/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-content-strategy/PLAYBOOK.md +437 -0
- package/ai/skills/stacks-marketing-content-strategy/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-content-strategy/evals/evals.json +116 -0
- package/ai/skills/stacks-marketing-content-strategy/references/content-distribution.md +83 -0
- package/ai/skills/stacks-marketing-content-strategy/references/headless-cms.md +194 -0
- package/ai/skills/stacks-marketing-copy-editing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-copy-editing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-copy-editing/PLAYBOOK.md +485 -0
- package/ai/skills/stacks-marketing-copy-editing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-copy-editing/evals/evals.json +117 -0
- package/ai/skills/stacks-marketing-copy-editing/references/checklist.md +77 -0
- package/ai/skills/stacks-marketing-copy-editing/references/content-refresh.md +71 -0
- package/ai/skills/stacks-marketing-copy-editing/references/plain-english-alternatives.md +394 -0
- package/ai/skills/stacks-marketing-copywriting/LICENSE +21 -0
- package/ai/skills/stacks-marketing-copywriting/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-copywriting/PLAYBOOK.md +282 -0
- package/ai/skills/stacks-marketing-copywriting/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-copywriting/evals/evals.json +140 -0
- package/ai/skills/stacks-marketing-copywriting/references/ai-tells.md +261 -0
- package/ai/skills/stacks-marketing-copywriting/references/copy-frameworks.md +432 -0
- package/ai/skills/stacks-marketing-copywriting/references/natural-transitions.md +256 -0
- package/ai/skills/stacks-marketing-council/LICENSE +21 -0
- package/ai/skills/stacks-marketing-council/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-council/PLAYBOOK.md +157 -0
- package/ai/skills/stacks-marketing-council/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-council/evals/evals.json +70 -0
- package/ai/skills/stacks-marketing-council/references/advisor-template.md +51 -0
- package/ai/skills/stacks-marketing-council/references/advisors/alex-hormozi.md +43 -0
- package/ai/skills/stacks-marketing-council/references/advisors/ann-handley.md +43 -0
- package/ai/skills/stacks-marketing-council/references/advisors/april-dunford.md +41 -0
- package/ai/skills/stacks-marketing-council/references/advisors/byron-sharp.md +43 -0
- package/ai/skills/stacks-marketing-council/references/advisors/claude-hopkins.md +42 -0
- package/ai/skills/stacks-marketing-council/references/advisors/david-ogilvy.md +42 -0
- package/ai/skills/stacks-marketing-council/references/advisors/eugene-schwartz.md +42 -0
- package/ai/skills/stacks-marketing-council/references/advisors/gary-halbert.md +43 -0
- package/ai/skills/stacks-marketing-council/references/advisors/gary-vaynerchuk.md +43 -0
- package/ai/skills/stacks-marketing-council/references/advisors/rory-sutherland.md +42 -0
- package/ai/skills/stacks-marketing-council/references/advisors/russell-brunson.md +43 -0
- package/ai/skills/stacks-marketing-council/references/advisors/seth-godin.md +43 -0
- package/ai/skills/stacks-marketing-cro/LICENSE +21 -0
- package/ai/skills/stacks-marketing-cro/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-cro/PLAYBOOK.md +194 -0
- package/ai/skills/stacks-marketing-cro/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-cro/evals/evals.json +111 -0
- package/ai/skills/stacks-marketing-cro/references/experiments.md +248 -0
- package/ai/skills/stacks-marketing-cro/references/form.md +422 -0
- package/ai/skills/stacks-marketing-customer-research/LICENSE +21 -0
- package/ai/skills/stacks-marketing-customer-research/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-customer-research/PLAYBOOK.md +304 -0
- package/ai/skills/stacks-marketing-customer-research/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-customer-research/evals/evals.json +176 -0
- package/ai/skills/stacks-marketing-customer-research/references/interviews-and-surveys.md +155 -0
- package/ai/skills/stacks-marketing-customer-research/references/source-guides.md +401 -0
- package/ai/skills/stacks-marketing-directory-submissions/LICENSE +21 -0
- package/ai/skills/stacks-marketing-directory-submissions/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-directory-submissions/PLAYBOOK.md +397 -0
- package/ai/skills/stacks-marketing-directory-submissions/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-directory-submissions/evals/evals.json +121 -0
- package/ai/skills/stacks-marketing-directory-submissions/references/directory-list.md +545 -0
- package/ai/skills/stacks-marketing-directory-submissions/references/positioning-variations.md +232 -0
- package/ai/skills/stacks-marketing-directory-submissions/references/submission-tracker-template.csv +272 -0
- package/ai/skills/stacks-marketing-emails/LICENSE +21 -0
- package/ai/skills/stacks-marketing-emails/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-emails/PLAYBOOK.md +336 -0
- package/ai/skills/stacks-marketing-emails/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-emails/evals/evals.json +105 -0
- package/ai/skills/stacks-marketing-emails/references/copy-guidelines.md +113 -0
- package/ai/skills/stacks-marketing-emails/references/email-types.md +515 -0
- package/ai/skills/stacks-marketing-emails/references/sequence-templates.md +168 -0
- package/ai/skills/stacks-marketing-events/LICENSE +21 -0
- package/ai/skills/stacks-marketing-events/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-events/PLAYBOOK.md +127 -0
- package/ai/skills/stacks-marketing-events/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-events/evals/evals.json +92 -0
- package/ai/skills/stacks-marketing-events/references/event-portfolio-strategy.md +80 -0
- package/ai/skills/stacks-marketing-events/references/speaking.md +49 -0
- package/ai/skills/stacks-marketing-events/references/sponsorship-roi.md +57 -0
- package/ai/skills/stacks-marketing-events/references/webinar-funnel.md +88 -0
- package/ai/skills/stacks-marketing-free-tools/LICENSE +21 -0
- package/ai/skills/stacks-marketing-free-tools/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-free-tools/PLAYBOOK.md +186 -0
- package/ai/skills/stacks-marketing-free-tools/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-free-tools/evals/evals.json +103 -0
- package/ai/skills/stacks-marketing-free-tools/references/tool-benchmarks.md +35 -0
- package/ai/skills/stacks-marketing-free-tools/references/tool-types.md +217 -0
- package/ai/skills/stacks-marketing-ideas/LICENSE +21 -0
- package/ai/skills/stacks-marketing-ideas/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-ideas/PLAYBOOK.md +167 -0
- package/ai/skills/stacks-marketing-ideas/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-ideas/evals/evals.json +105 -0
- package/ai/skills/stacks-marketing-ideas/references/guerrilla-marketing.md +56 -0
- package/ai/skills/stacks-marketing-ideas/references/ideas-by-category.md +366 -0
- package/ai/skills/stacks-marketing-image/LICENSE +21 -0
- package/ai/skills/stacks-marketing-image/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-image/PLAYBOOK.md +336 -0
- package/ai/skills/stacks-marketing-image/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-image/evals/evals.json +89 -0
- package/ai/skills/stacks-marketing-image/references/ai-image-prompting.md +229 -0
- package/ai/skills/stacks-marketing-influencer-marketing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-influencer-marketing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-influencer-marketing/PLAYBOOK.md +198 -0
- package/ai/skills/stacks-marketing-influencer-marketing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-influencer-marketing/evals/evals.json +89 -0
- package/ai/skills/stacks-marketing-influencer-marketing/references/ugc-creator-program.md +91 -0
- package/ai/skills/stacks-marketing-launch/LICENSE +21 -0
- package/ai/skills/stacks-marketing-launch/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-launch/PLAYBOOK.md +381 -0
- package/ai/skills/stacks-marketing-launch/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-launch/evals/evals.json +135 -0
- package/ai/skills/stacks-marketing-launch/references/shipped-changes.md +84 -0
- package/ai/skills/stacks-marketing-launch/references/site-launch-qa.md +57 -0
- package/ai/skills/stacks-marketing-lead-magnets/LICENSE +21 -0
- package/ai/skills/stacks-marketing-lead-magnets/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-lead-magnets/PLAYBOOK.md +308 -0
- package/ai/skills/stacks-marketing-lead-magnets/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-lead-magnets/evals/evals.json +105 -0
- package/ai/skills/stacks-marketing-lead-magnets/references/benchmarks.md +129 -0
- package/ai/skills/stacks-marketing-lead-magnets/references/content-to-skill-corpus-design.md +89 -0
- package/ai/skills/stacks-marketing-lead-magnets/references/content-to-skill-release.md +71 -0
- package/ai/skills/stacks-marketing-lead-magnets/references/content-to-skill.md +109 -0
- package/ai/skills/stacks-marketing-lead-magnets/references/format-guide.md +196 -0
- package/ai/skills/stacks-marketing-loops/LICENSE +21 -0
- package/ai/skills/stacks-marketing-loops/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-loops/PLAYBOOK.md +111 -0
- package/ai/skills/stacks-marketing-loops/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-loops/evals/evals.json +133 -0
- package/ai/skills/stacks-marketing-loops/references/loop-catalog.md +796 -0
- package/ai/skills/stacks-marketing-loops/references/loop-guardrails.md +73 -0
- package/ai/skills/stacks-marketing-loops/references/loop-orchestration.md +71 -0
- package/ai/skills/stacks-marketing-loops/references/loop-state.md +67 -0
- package/ai/skills/stacks-marketing-loops/references/loop-template.md +79 -0
- package/ai/skills/stacks-marketing-loops/references/outbound-operator.md +86 -0
- package/ai/skills/stacks-marketing-loops/references/seo-operator.md +110 -0
- package/ai/skills/stacks-marketing-offers/LICENSE +21 -0
- package/ai/skills/stacks-marketing-offers/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-offers/PLAYBOOK.md +151 -0
- package/ai/skills/stacks-marketing-offers/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-offers/evals/evals.json +21 -0
- package/ai/skills/stacks-marketing-offers/references/bonus-stacking.md +150 -0
- package/ai/skills/stacks-marketing-offers/references/examples.md +215 -0
- package/ai/skills/stacks-marketing-offers/references/guarantee-design.md +172 -0
- package/ai/skills/stacks-marketing-offers/references/offer-anatomy.md +203 -0
- package/ai/skills/stacks-marketing-offers/references/offer-formats.md +240 -0
- package/ai/skills/stacks-marketing-offers/references/saas-offers.md +116 -0
- package/ai/skills/stacks-marketing-offers/references/scarcity-urgency.md +175 -0
- package/ai/skills/stacks-marketing-offers/references/value-equation.md +134 -0
- package/ai/skills/stacks-marketing-onboarding/LICENSE +21 -0
- package/ai/skills/stacks-marketing-onboarding/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-onboarding/PLAYBOOK.md +257 -0
- package/ai/skills/stacks-marketing-onboarding/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-onboarding/evals/evals.json +108 -0
- package/ai/skills/stacks-marketing-onboarding/references/activation-models.md +57 -0
- package/ai/skills/stacks-marketing-onboarding/references/experiments.md +258 -0
- package/ai/skills/stacks-marketing-onboarding/references/minimum-path-to-value.md +49 -0
- package/ai/skills/stacks-marketing-paywalls/LICENSE +21 -0
- package/ai/skills/stacks-marketing-paywalls/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-paywalls/PLAYBOOK.md +223 -0
- package/ai/skills/stacks-marketing-paywalls/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-paywalls/evals/evals.json +93 -0
- package/ai/skills/stacks-marketing-paywalls/references/experiments.md +164 -0
- package/ai/skills/stacks-marketing-plan/LICENSE +21 -0
- package/ai/skills/stacks-marketing-plan/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-plan/PLAYBOOK.md +300 -0
- package/ai/skills/stacks-marketing-plan/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-plan/evals/evals.json +140 -0
- package/ai/skills/stacks-marketing-plan/references/aarrr-framework.md +180 -0
- package/ai/skills/stacks-marketing-plan/references/budget-planning.md +177 -0
- package/ai/skills/stacks-marketing-plan/references/client-types.md +373 -0
- package/ai/skills/stacks-marketing-plan/references/current-state-rubric.md +255 -0
- package/ai/skills/stacks-marketing-plan/references/example-quietude.md +972 -0
- package/ai/skills/stacks-marketing-plan/references/funding-stage-unlocks.md +230 -0
- package/ai/skills/stacks-marketing-plan/references/growth-patterns.md +190 -0
- package/ai/skills/stacks-marketing-plan/references/idea-cross-reference.md +265 -0
- package/ai/skills/stacks-marketing-plan/references/market-sizing.md +166 -0
- package/ai/skills/stacks-marketing-plan/references/measurement-framework.md +213 -0
- package/ai/skills/stacks-marketing-plan/references/methodology.md +365 -0
- package/ai/skills/stacks-marketing-plan/references/ops-stack-mapping.md +197 -0
- package/ai/skills/stacks-marketing-plan/references/plan-template.md +494 -0
- package/ai/skills/stacks-marketing-plan/references/team-and-agency-model.md +278 -0
- package/ai/skills/stacks-marketing-popups/LICENSE +21 -0
- package/ai/skills/stacks-marketing-popups/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-popups/PLAYBOOK.md +450 -0
- package/ai/skills/stacks-marketing-popups/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-popups/evals/evals.json +94 -0
- package/ai/skills/stacks-marketing-pricing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-pricing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-pricing/PLAYBOOK.md +291 -0
- package/ai/skills/stacks-marketing-pricing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-pricing/evals/evals.json +131 -0
- package/ai/skills/stacks-marketing-pricing/references/pricing-models.md +66 -0
- package/ai/skills/stacks-marketing-pricing/references/pricing-page-teardown.md +87 -0
- package/ai/skills/stacks-marketing-pricing/references/research-methods.md +156 -0
- package/ai/skills/stacks-marketing-pricing/references/tier-structure.md +232 -0
- package/ai/skills/stacks-marketing-product-marketing/LICENSE +21 -0
- package/ai/skills/stacks-marketing-product-marketing/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-product-marketing/PLAYBOOK.md +255 -0
- package/ai/skills/stacks-marketing-product-marketing/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-product-marketing/evals/evals.json +98 -0
- package/ai/skills/stacks-marketing-programmatic-seo/LICENSE +21 -0
- package/ai/skills/stacks-marketing-programmatic-seo/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-programmatic-seo/PLAYBOOK.md +238 -0
- package/ai/skills/stacks-marketing-programmatic-seo/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-programmatic-seo/evals/evals.json +107 -0
- package/ai/skills/stacks-marketing-programmatic-seo/references/implementation-platforms.md +41 -0
- package/ai/skills/stacks-marketing-programmatic-seo/references/playbooks.md +308 -0
- package/ai/skills/stacks-marketing-prospecting/LICENSE +21 -0
- package/ai/skills/stacks-marketing-prospecting/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-prospecting/PLAYBOOK.md +273 -0
- package/ai/skills/stacks-marketing-prospecting/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-prospecting/evals/evals.json +163 -0
- package/ai/skills/stacks-marketing-prospecting/references/account-research.md +59 -0
- package/ai/skills/stacks-marketing-prospecting/references/b2b-prospecting.md +106 -0
- package/ai/skills/stacks-marketing-prospecting/references/compliance.md +161 -0
- package/ai/skills/stacks-marketing-prospecting/references/data-sources.md +300 -0
- package/ai/skills/stacks-marketing-prospecting/references/demand-signals.md +131 -0
- package/ai/skills/stacks-marketing-prospecting/references/enrichment-playbook.md +61 -0
- package/ai/skills/stacks-marketing-prospecting/references/local-prospecting.md +165 -0
- package/ai/skills/stacks-marketing-prospecting/references/saas-prospecting.md +123 -0
- package/ai/skills/stacks-marketing-prospecting/references/signal-plays.md +99 -0
- package/ai/skills/stacks-marketing-prospecting/references/sourcing-and-enrichment.md +89 -0
- package/ai/skills/stacks-marketing-psychology/LICENSE +21 -0
- package/ai/skills/stacks-marketing-psychology/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-psychology/PLAYBOOK.md +451 -0
- package/ai/skills/stacks-marketing-psychology/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-psychology/evals/evals.json +88 -0
- package/ai/skills/stacks-marketing-public-relations/LICENSE +21 -0
- package/ai/skills/stacks-marketing-public-relations/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-public-relations/PLAYBOOK.md +150 -0
- package/ai/skills/stacks-marketing-public-relations/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-public-relations/evals/evals.json +36 -0
- package/ai/skills/stacks-marketing-public-relations/references/crisis-communications.md +113 -0
- package/ai/skills/stacks-marketing-public-relations/references/journalist-pitching.md +368 -0
- package/ai/skills/stacks-marketing-public-relations/references/media-outlets.md +207 -0
- package/ai/skills/stacks-marketing-public-relations/references/newsjacking.md +220 -0
- package/ai/skills/stacks-marketing-public-relations/references/podcast-guest-prep.md +60 -0
- package/ai/skills/stacks-marketing-public-relations/references/press-platforms.md +188 -0
- package/ai/skills/stacks-marketing-public-relations/references/statement-templates.md +145 -0
- package/ai/skills/stacks-marketing-public-relations/references/story-angles.md +87 -0
- package/ai/skills/stacks-marketing-referrals/LICENSE +21 -0
- package/ai/skills/stacks-marketing-referrals/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-referrals/PLAYBOOK.md +279 -0
- package/ai/skills/stacks-marketing-referrals/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-referrals/evals/evals.json +202 -0
- package/ai/skills/stacks-marketing-referrals/references/affiliate-operations.md +64 -0
- package/ai/skills/stacks-marketing-referrals/references/affiliate-programs.md +167 -0
- package/ai/skills/stacks-marketing-referrals/references/program-examples.md +151 -0
- package/ai/skills/stacks-marketing-referrals/references/review-platform-rules.md +36 -0
- package/ai/skills/stacks-marketing-referrals/references/review-program-operations.md +62 -0
- package/ai/skills/stacks-marketing-referrals/references/review-programs.md +96 -0
- package/ai/skills/stacks-marketing-referrals/references/viral-mechanisms.md +102 -0
- package/ai/skills/stacks-marketing-revops/LICENSE +21 -0
- package/ai/skills/stacks-marketing-revops/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-revops/PLAYBOOK.md +345 -0
- package/ai/skills/stacks-marketing-revops/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-revops/evals/evals.json +104 -0
- package/ai/skills/stacks-marketing-revops/references/automation-playbooks.md +290 -0
- package/ai/skills/stacks-marketing-revops/references/inbound-routing.md +43 -0
- package/ai/skills/stacks-marketing-revops/references/lifecycle-definitions.md +309 -0
- package/ai/skills/stacks-marketing-revops/references/routing-rules.md +203 -0
- package/ai/skills/stacks-marketing-revops/references/scoring-models.md +247 -0
- package/ai/skills/stacks-marketing-sales-enablement/LICENSE +21 -0
- package/ai/skills/stacks-marketing-sales-enablement/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-sales-enablement/PLAYBOOK.md +423 -0
- package/ai/skills/stacks-marketing-sales-enablement/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-sales-enablement/evals/evals.json +153 -0
- package/ai/skills/stacks-marketing-sales-enablement/references/cold-call-scripts.md +68 -0
- package/ai/skills/stacks-marketing-sales-enablement/references/deck-frameworks.md +263 -0
- package/ai/skills/stacks-marketing-sales-enablement/references/demo-scripts.md +355 -0
- package/ai/skills/stacks-marketing-sales-enablement/references/objection-library.md +270 -0
- package/ai/skills/stacks-marketing-sales-enablement/references/one-pager-templates.md +208 -0
- package/ai/skills/stacks-marketing-sales-enablement/references/win-loss-analysis.md +72 -0
- package/ai/skills/stacks-marketing-schema/LICENSE +21 -0
- package/ai/skills/stacks-marketing-schema/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-schema/PLAYBOOK.md +187 -0
- package/ai/skills/stacks-marketing-schema/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-schema/evals/evals.json +127 -0
- package/ai/skills/stacks-marketing-schema/references/schema-examples.md +392 -0
- package/ai/skills/stacks-marketing-seo-audit/LICENSE +21 -0
- package/ai/skills/stacks-marketing-seo-audit/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-seo-audit/PLAYBOOK.md +492 -0
- package/ai/skills/stacks-marketing-seo-audit/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-seo-audit/evals/evals.json +204 -0
- package/ai/skills/stacks-marketing-seo-audit/references/ai-writing-detection.md +200 -0
- package/ai/skills/stacks-marketing-seo-audit/references/international-seo.md +228 -0
- package/ai/skills/stacks-marketing-seo-audit/references/local-seo-pages-and-measurement.md +39 -0
- package/ai/skills/stacks-marketing-seo-audit/references/local-seo-profile-and-citations.md +41 -0
- package/ai/skills/stacks-marketing-seo-audit/references/local-seo.md +86 -0
- package/ai/skills/stacks-marketing-seo-audit/references/rankings-push.md +62 -0
- package/ai/skills/stacks-marketing-seo-audit/references/title-tags.md +89 -0
- package/ai/skills/stacks-marketing-signup/LICENSE +21 -0
- package/ai/skills/stacks-marketing-signup/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-signup/PLAYBOOK.md +359 -0
- package/ai/skills/stacks-marketing-signup/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-signup/evals/evals.json +88 -0
- package/ai/skills/stacks-marketing-site-architecture/LICENSE +21 -0
- package/ai/skills/stacks-marketing-site-architecture/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-site-architecture/PLAYBOOK.md +355 -0
- package/ai/skills/stacks-marketing-site-architecture/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-site-architecture/evals/evals.json +113 -0
- package/ai/skills/stacks-marketing-site-architecture/references/mermaid-templates.md +216 -0
- package/ai/skills/stacks-marketing-site-architecture/references/navigation-patterns.md +305 -0
- package/ai/skills/stacks-marketing-site-architecture/references/platforms-and-migration.md +86 -0
- package/ai/skills/stacks-marketing-site-architecture/references/site-type-templates.md +293 -0
- package/ai/skills/stacks-marketing-sms/LICENSE +21 -0
- package/ai/skills/stacks-marketing-sms/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-sms/PLAYBOOK.md +348 -0
- package/ai/skills/stacks-marketing-sms/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-sms/evals/evals.json +118 -0
- package/ai/skills/stacks-marketing-sms/references/compliance.md +202 -0
- package/ai/skills/stacks-marketing-sms/references/platforms.md +318 -0
- package/ai/skills/stacks-marketing-sms/references/sequence-templates.md +282 -0
- package/ai/skills/stacks-marketing-sms/references/whatsapp.md +260 -0
- package/ai/skills/stacks-marketing-social/LICENSE +21 -0
- package/ai/skills/stacks-marketing-social/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-social/PLAYBOOK.md +452 -0
- package/ai/skills/stacks-marketing-social/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-social/evals/evals.json +150 -0
- package/ai/skills/stacks-marketing-social/references/carousel-frameworks.md +141 -0
- package/ai/skills/stacks-marketing-social/references/listening-sources-template.md +123 -0
- package/ai/skills/stacks-marketing-social/references/listening.md +288 -0
- package/ai/skills/stacks-marketing-social/references/platform-limits.md +110 -0
- package/ai/skills/stacks-marketing-social/references/platforms.md +176 -0
- package/ai/skills/stacks-marketing-social/references/post-templates.md +179 -0
- package/ai/skills/stacks-marketing-social/references/reverse-engineering.md +195 -0
- package/ai/skills/stacks-marketing-social/references/short-form-video.md +237 -0
- package/ai/skills/stacks-marketing-social/references/x-algorithm.md +69 -0
- package/ai/skills/stacks-marketing-video/LICENSE +21 -0
- package/ai/skills/stacks-marketing-video/NOTICE.md +13 -0
- package/ai/skills/stacks-marketing-video/PLAYBOOK.md +330 -0
- package/ai/skills/stacks-marketing-video/SKILL.md +30 -0
- package/ai/skills/stacks-marketing-video/evals/evals.json +118 -0
- package/ai/skills/stacks-marketing-video/references/ai-video-prompting.md +175 -0
- package/ai/skills/stacks-marketing-video/references/edit-anatomy.md +86 -0
- package/ai/skills/stacks-marketing-video/references/product-demo-recording.md +176 -0
- package/ai/skills/stacks-middleware/SKILL.md +37 -21
- package/ai/skills/stacks-migrations/SKILL.md +29 -5
- package/ai/skills/stacks-mobile/SKILL.md +25 -4
- package/ai/skills/stacks-models/SKILL.md +35 -15
- package/ai/skills/stacks-models/references/model-capabilities.md +104 -0
- package/ai/skills/stacks-native/CAPABILITIES.md +536 -0
- package/ai/skills/stacks-native/CATALOG.md +930 -0
- package/ai/skills/stacks-native/RECIPES.md +108 -0
- package/ai/skills/stacks-native/SKILL.md +79 -0
- package/ai/skills/stacks-newsletter/SKILL.md +39 -0
- package/ai/skills/stacks-notifications/SKILL.md +118 -203
- package/ai/skills/stacks-objects/SKILL.md +18 -4
- package/ai/skills/stacks-orm/SKILL.md +112 -328
- package/ai/skills/stacks-pagination/SKILL.md +40 -0
- package/ai/skills/stacks-path/SKILL.md +38 -18
- package/ai/skills/stacks-payments/SKILL.md +9 -1
- package/ai/skills/stacks-pr/CREDITS.md +3 -0
- package/ai/skills/stacks-pr/LICENSE +21 -0
- package/ai/skills/stacks-pr/NOTICE.md +10 -0
- package/ai/skills/stacks-pr/PLAYBOOK.md +127 -0
- package/ai/skills/stacks-pr/SKILL.md +23 -0
- package/ai/skills/stacks-prototype/LICENSE +21 -0
- package/ai/skills/stacks-prototype/NOTICE.md +10 -0
- package/ai/skills/stacks-prototype/SKILL.md +6 -0
- package/ai/skills/stacks-push/SKILL.md +20 -0
- package/ai/skills/stacks-query-builder/SKILL.md +21 -5
- package/ai/skills/stacks-queue/DURABLE-WORKFLOWS.md +121 -0
- package/ai/skills/stacks-queue/SKILL.md +37 -6
- package/ai/skills/stacks-realtime/SKILL.md +29 -140
- package/ai/skills/stacks-redesign/SKILL.md +1 -1
- package/ai/skills/stacks-registry/SKILL.md +20 -48
- package/ai/skills/stacks-repl/SKILL.md +31 -7
- package/ai/skills/stacks-research/LICENSE +21 -0
- package/ai/skills/stacks-research/NOTICE.md +10 -0
- package/ai/skills/stacks-research/PLAYBOOK.md +10 -0
- package/ai/skills/stacks-research/SKILL.md +23 -0
- package/ai/skills/stacks-retro/LICENSE +21 -0
- package/ai/skills/stacks-retro/NOTICE.md +10 -0
- package/ai/skills/stacks-retro/SKILL.md +10 -0
- package/ai/skills/stacks-review/LICENSE +21 -0
- package/ai/skills/stacks-review/NOTICE.md +10 -0
- package/ai/skills/stacks-review/SKILL.md +15 -0
- package/ai/skills/stacks-router/SKILL.md +33 -2
- package/ai/skills/stacks-routes/SKILL.md +25 -2
- package/ai/skills/stacks-scaffold-exercises/LICENSE +21 -0
- package/ai/skills/stacks-scaffold-exercises/NOTICE.md +10 -0
- package/ai/skills/stacks-scaffold-exercises/PLAYBOOK.md +106 -0
- package/ai/skills/stacks-scaffold-exercises/SKILL.md +23 -0
- package/ai/skills/stacks-scaffolding/SKILL.md +27 -11
- package/ai/skills/stacks-scheduler/SKILL.md +52 -25
- package/ai/skills/stacks-search-engine/SKILL.md +28 -7
- package/ai/skills/stacks-security/SKILL.md +22 -6
- package/ai/skills/stacks-server/SKILL.md +47 -85
- package/ai/skills/stacks-setup-deep-modules/LICENSE +21 -0
- package/ai/skills/stacks-setup-deep-modules/NOTICE.md +10 -0
- package/ai/skills/stacks-setup-deep-modules/SKILL.md +55 -0
- package/ai/skills/stacks-setup-engineering/LICENSE +21 -0
- package/ai/skills/stacks-setup-engineering/NOTICE.md +10 -0
- package/ai/skills/stacks-setup-engineering/PLAYBOOK.md +115 -0
- package/ai/skills/stacks-setup-engineering/SKILL.md +24 -0
- package/ai/skills/stacks-setup-engineering/domain.md +51 -0
- package/ai/skills/stacks-setup-engineering/issue-tracker-github.md +46 -0
- package/ai/skills/stacks-setup-engineering/issue-tracker-gitlab.md +46 -0
- package/ai/skills/stacks-setup-engineering/issue-tracker-local.md +30 -0
- package/ai/skills/stacks-setup-engineering/triage-labels.md +15 -0
- package/ai/skills/stacks-sites/SKILL.md +44 -0
- package/ai/skills/stacks-skills/SKILL.md +33 -0
- package/ai/skills/stacks-slug/SKILL.md +15 -12
- package/ai/skills/stacks-sms/SKILL.md +33 -6
- package/ai/skills/stacks-socials/SKILL.md +81 -294
- package/ai/skills/stacks-storage/SKILL.md +34 -15
- package/ai/skills/stacks-storage/UPLOADS-AND-DISKS.md +133 -0
- package/ai/skills/stacks-strings/SKILL.md +41 -35
- package/ai/skills/stacks-stx/SKILL.md +63 -58
- package/ai/skills/stacks-tdd/LICENSE +21 -0
- package/ai/skills/stacks-tdd/NOTICE.md +10 -0
- package/ai/skills/stacks-tdd/SKILL.md +10 -0
- package/ai/skills/stacks-tdd/mocking.md +59 -0
- package/ai/skills/stacks-tdd/tests.md +77 -0
- package/ai/skills/stacks-teach/GLOSSARY-FORMAT.md +35 -0
- package/ai/skills/stacks-teach/LEARNING-RECORD-FORMAT.md +46 -0
- package/ai/skills/stacks-teach/LICENSE +21 -0
- package/ai/skills/stacks-teach/MISSION-FORMAT.md +31 -0
- package/ai/skills/stacks-teach/NOTICE.md +10 -0
- package/ai/skills/stacks-teach/PLAYBOOK.md +136 -0
- package/ai/skills/stacks-teach/RESOURCES-FORMAT.md +32 -0
- package/ai/skills/stacks-teach/SKILL.md +24 -0
- package/ai/skills/stacks-technical-diagrams/SKILL.md +2 -2
- package/ai/skills/stacks-technical-diagrams/bin/diagrams +1 -1
- package/ai/skills/stacks-technical-diagrams/renderers/shared/bun-runtime.mjs +1 -1
- package/ai/skills/stacks-test-fixtures/LICENSE +21 -0
- package/ai/skills/stacks-test-fixtures/NOTICE.md +10 -0
- package/ai/skills/stacks-test-fixtures/SKILL.md +38 -0
- package/ai/skills/stacks-testing/SKILL.md +77 -4
- package/ai/skills/stacks-to-questionnaire/LICENSE +21 -0
- package/ai/skills/stacks-to-questionnaire/NOTICE.md +10 -0
- package/ai/skills/stacks-to-questionnaire/PLAYBOOK.md +51 -0
- package/ai/skills/stacks-to-questionnaire/SKILL.md +24 -0
- package/ai/skills/stacks-to-spec/LICENSE +21 -0
- package/ai/skills/stacks-to-spec/NOTICE.md +10 -0
- package/ai/skills/stacks-to-spec/PLAYBOOK.md +72 -0
- package/ai/skills/stacks-to-spec/SKILL.md +24 -0
- package/ai/skills/stacks-to-tickets/LICENSE +21 -0
- package/ai/skills/stacks-to-tickets/NOTICE.md +10 -0
- package/ai/skills/stacks-to-tickets/PLAYBOOK.md +102 -0
- package/ai/skills/stacks-to-tickets/SKILL.md +24 -0
- package/ai/skills/stacks-triage/AGENT-BRIEF.md +207 -0
- package/ai/skills/stacks-triage/LICENSE +21 -0
- package/ai/skills/stacks-triage/NOTICE.md +10 -0
- package/ai/skills/stacks-triage/OUT-OF-SCOPE.md +105 -0
- package/ai/skills/stacks-triage/PLAYBOOK.md +109 -0
- package/ai/skills/stacks-triage/SKILL.md +24 -0
- package/ai/skills/stacks-tunnel/SKILL.md +29 -19
- package/ai/skills/stacks-types/SKILL.md +77 -168
- package/ai/skills/stacks-ui/SKILL.md +66 -228
- package/ai/skills/stacks-unslop/NOTICE.md +25 -0
- package/ai/skills/stacks-unslop/SKILL.md +95 -0
- package/ai/skills/stacks-unslop/references/core-contract.md +88 -0
- package/ai/skills/stacks-unslop/references/patterns.md +110 -0
- package/ai/skills/stacks-unslop/references/presets.md +37 -0
- package/ai/skills/stacks-unslop/references/voice.md +95 -0
- package/ai/skills/stacks-utils/SKILL.md +45 -25
- package/ai/skills/stacks-validation/SKILL.md +67 -4
- package/ai/skills/stacks-video/SKILL.md +33 -0
- package/ai/skills/stacks-wait-what/LICENSE +21 -0
- package/ai/skills/stacks-wait-what/NOTICE.md +10 -0
- package/ai/skills/stacks-wait-what/PLAYBOOK.md +4 -0
- package/ai/skills/stacks-wait-what/SKILL.md +24 -0
- package/ai/skills/stacks-wayfinder/LICENSE +21 -0
- package/ai/skills/stacks-wayfinder/NOTICE.md +10 -0
- package/ai/skills/stacks-wayfinder/PLAYBOOK.md +125 -0
- package/ai/skills/stacks-wayfinder/SKILL.md +24 -0
- package/ai/skills/stacks-whois/SKILL.md +13 -3
- package/ai/skills/stacks-wizard/LICENSE +21 -0
- package/ai/skills/stacks-wizard/NOTICE.md +10 -0
- package/ai/skills/stacks-wizard/SKILL.md +8 -0
- package/ai/skills/stacks-wizard/scripts/template.sh +42 -26
- package/ai/skills/stacks-writing-beats/LICENSE +21 -0
- package/ai/skills/stacks-writing-beats/NOTICE.md +10 -0
- package/ai/skills/stacks-writing-beats/PLAYBOOK.md +64 -0
- package/ai/skills/stacks-writing-beats/SKILL.md +28 -0
- package/ai/skills/stacks-writing-for-agents/LICENSE +21 -0
- package/ai/skills/stacks-writing-for-agents/NOTICE.md +10 -0
- package/ai/skills/stacks-writing-for-agents/SKILL.md +7 -1
- package/ai/skills/stacks-writing-fragments/LICENSE +21 -0
- package/ai/skills/stacks-writing-fragments/NOTICE.md +10 -0
- package/ai/skills/stacks-writing-fragments/PLAYBOOK.md +76 -0
- package/ai/skills/stacks-writing-fragments/SKILL.md +28 -0
- package/ai/skills/stacks-writing-shape/LICENSE +21 -0
- package/ai/skills/stacks-writing-shape/NOTICE.md +10 -0
- package/ai/skills/stacks-writing-shape/PLAYBOOK.md +76 -0
- package/ai/skills/stacks-writing-shape/SKILL.md +28 -0
- package/ide/vscode/package.json +1 -1
- package/package.json +2 -2
- /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 {
|
|
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:
|
|
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<
|
|
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()`
|
|
212
|
-
- `visibility()`
|
|
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 {
|
|
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
|
-
|
|
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
|
-
-
|
|
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
|
|
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
|
-
-
|
|
624
|
-
-
|
|
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`
|
|
20
|
-
- `pluralize.ts`
|
|
21
|
-
- `slug.ts`
|
|
22
|
-
- `utils.ts`
|
|
23
|
-
- `macro.ts`
|
|
24
|
-
- `validators.ts`
|
|
25
|
-
- `sponge-case.ts`
|
|
26
|
-
- `swap-case.ts`
|
|
27
|
-
- `title-case.ts`
|
|
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'
|
|
68
|
-
pascalCase('hello world') // 'HelloWorld'
|
|
69
|
-
snakeCase('hello world') // 'hello_world'
|
|
70
|
-
kebabCase('hello world') // 'hello-world'
|
|
71
|
-
constantCase('hello world') // 'HELLO_WORLD'
|
|
72
|
-
trainCase('hello world') // 'Hello-World'
|
|
73
|
-
dotCase('hello world') // 'hello.world'
|
|
74
|
-
pathCase('hello world') // 'hello/world'
|
|
75
|
-
sentenceCase('hello world') // 'Hello world'
|
|
76
|
-
capitalCase('hello world') // 'Hello World'
|
|
77
|
-
noCase('helloWorld') // 'hello world'
|
|
78
|
-
pascalSnakeCase('hello world') // 'Hello_World'
|
|
79
|
-
paramCase('hello world') // 'hello-world'
|
|
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'
|
|
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'
|
|
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?)`
|
|
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?)`
|
|
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('
|
|
205
|
-
slugify('
|
|
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'
|
|
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('
|
|
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
|
|
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('
|
|
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
|
-
-
|
|
413
|
-
|
|
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`
|
|
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
|
|
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
|
-
###
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
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**
|
|
228
|
-
- **Streaming**
|
|
229
|
-
- **Hydration**
|
|
230
|
-
- **Suspense**
|
|
231
|
-
- **Error boundaries**
|
|
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**
|
|
235
|
-
- **Forms**
|
|
236
|
-
- **i18n**
|
|
237
|
-
- **SEO**
|
|
238
|
-
- **PWA**
|
|
239
|
-
- **Animation**
|
|
240
|
-
- **Markdown**
|
|
241
|
-
- **A11y**
|
|
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**
|
|
303
|
-
- **`bun-plugin-stx` must be loaded**
|
|
304
|
-
- **
|
|
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/`**
|
|
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**
|
|
315
|
-
- **Script block restrictions**
|
|
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/`**
|
|
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**
|
|
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.
|