@stacksjs/defaults 0.75.109 → 0.75.111
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/resources/components/NativeSheet.stx +7 -12
- /package/ai/skills/stacks-technical-diagrams/{bunfig.toml → runtime.toml} +0 -0
|
@@ -70,7 +70,7 @@ route.group({ prefix: '/api/v1', middleware: ['auth', 'throttle'] }, () => {
|
|
|
70
70
|
```
|
|
71
71
|
|
|
72
72
|
### Handler Types
|
|
73
|
-
- Function: `(req) =>
|
|
73
|
+
- Function: `(req) => ...` - return a `Response`, or any value `formatResult`
|
|
74
74
|
handles: an object/array becomes JSON, a string becomes text, `null` becomes
|
|
75
75
|
204, a `ReadableStream` streams. `req.params` is narrowed to the path's own
|
|
76
76
|
placeholders, so `req.params.slugTypo` is a compile error rather than
|
|
@@ -186,6 +186,34 @@ export default {
|
|
|
186
186
|
} satisfies Record<string, string | RouteDefinition>
|
|
187
187
|
```
|
|
188
188
|
|
|
189
|
+
The registry is optional; `appRouteRegistry()` falls back to the API file
|
|
190
|
+
mounted at `/api`. App registrations precede default bundles and the first
|
|
191
|
+
duplicate method/path wins. Default bundles are selected explicitly or through
|
|
192
|
+
their feature gates; see `stacks-routes` for `STACKS_DEFAULT_ROUTES` and prefix
|
|
193
|
+
rules. Do not hard-code an assumption that every built-in route is mounted.
|
|
194
|
+
|
|
195
|
+
## Binding, signed access, and request lifecycle
|
|
196
|
+
|
|
197
|
+
`defineRouteModelBinding(param, resolver)` resolves a raw path value for policy
|
|
198
|
+
middleware. Explicit bindings take precedence over the optional fallback.
|
|
199
|
+
Unclaimed parameters stay raw; a claimed missing model is different from an
|
|
200
|
+
unclaimed parameter. Binding does not remove the need to validate a path key.
|
|
201
|
+
|
|
202
|
+
`signedUrl`, `signUrl`, `verifySignedUrl`, and `verifySignedUrlMiddleware`
|
|
203
|
+
support temporary signed access. Signing requires `APP_KEY` or the dedicated
|
|
204
|
+
secret. Verify method/URL/expiry according to the helper contract; changing a
|
|
205
|
+
signed URL is not equivalent to authorizing a row. Storage signatures are a
|
|
206
|
+
separate provider/delivery contract.
|
|
207
|
+
|
|
208
|
+
Native request context carries typed model/user data, query tracking, trace
|
|
209
|
+
IDs, route params, and hooks. `safePathParam`/`sanitizePathParam` protect path
|
|
210
|
+
segments, while numeric IDs need numeric validation as well. `stream` preserves
|
|
211
|
+
backpressure; do not eagerly collect a stream merely to attach JSON metadata.
|
|
212
|
+
|
|
213
|
+
Read `health`, `signed-url`, `route-model-binding`, `precognition`,
|
|
214
|
+
`request-context`, `after-response`, and `stream-backpressure` tests before
|
|
215
|
+
depending on the corresponding lifecycle behavior.
|
|
216
|
+
|
|
189
217
|
## Enhanced Request (Laravel-style)
|
|
190
218
|
|
|
191
219
|
### Input Methods
|
|
@@ -299,7 +327,10 @@ clearTrackedQueries()
|
|
|
299
327
|
clearMiddlewareCache()
|
|
300
328
|
```
|
|
301
329
|
|
|
302
|
-
## Default API
|
|
330
|
+
## Default API route families
|
|
331
|
+
|
|
332
|
+
These are examples of available bundles. The app's registry, selected default
|
|
333
|
+
bundles, and feature gates decide the mounted surface; inspect `buddy route:list`.
|
|
303
334
|
|
|
304
335
|
### Auth
|
|
305
336
|
- `POST /login`, `POST /register`, `POST /auth/refresh`, `POST /auth/token`
|
|
@@ -25,6 +25,18 @@ export default {
|
|
|
25
25
|
} satisfies Record<string, string | RouteDefinition>
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
+
`app/Routes.ts` is optional. Without a usable registry, `appRouteRegistry()`
|
|
29
|
+
falls back to `{ api: 'api' }`. Keys supply the default prefix; `web` is
|
|
30
|
+
root-mounted, and an explicit empty prefix mounts a route file at the root.
|
|
31
|
+
Route files define paths relative to that prefix, so `/api` should not be
|
|
32
|
+
repeated inside `routes/api.ts`.
|
|
33
|
+
|
|
34
|
+
App route files load before framework bundles. Duplicate method/path
|
|
35
|
+
registrations keep the first one, allowing an app route to override a default.
|
|
36
|
+
Discovered packages can contribute route files and other resource roots;
|
|
37
|
+
their registration does not automatically make components globally available.
|
|
38
|
+
See `stacks-config` for package discovery.
|
|
39
|
+
|
|
28
40
|
## Creating a Route File
|
|
29
41
|
|
|
30
42
|
```typescript
|
|
@@ -50,7 +62,13 @@ route.group({ prefix: '/admin', middleware: ['auth'] }, () => {
|
|
|
50
62
|
route.health()
|
|
51
63
|
```
|
|
52
64
|
|
|
53
|
-
## Default
|
|
65
|
+
## Default route bundles
|
|
66
|
+
|
|
67
|
+
Default bundles are selected by `STACKS_DEFAULT_ROUTES`, the route loader,
|
|
68
|
+
and the relevant feature gates. The following endpoint families are discovery
|
|
69
|
+
examples, not a guarantee they are mounted in every app. In particular,
|
|
70
|
+
enabling auth models is separate from exposing the default authentication
|
|
71
|
+
routes. Use `buddy route:list` to inspect this application's actual surface.
|
|
54
72
|
|
|
55
73
|
### Authentication
|
|
56
74
|
- `POST /login` → LoginAction
|
|
@@ -97,9 +115,14 @@ route.get('/ping', (req) => Response.json({ pong: true }))
|
|
|
97
115
|
- `buddy route:list` — list all registered routes
|
|
98
116
|
|
|
99
117
|
## Gotchas
|
|
100
|
-
-
|
|
118
|
+
- Additional route files need registration; the optional manifest's fallback
|
|
119
|
+
already mounts `routes/api.ts` at `/api`.
|
|
101
120
|
- String handlers (Actions/X) are dynamically imported at request time
|
|
102
121
|
- Route order matters — first match wins
|
|
103
122
|
- Use groups for shared middleware instead of repeating on each route
|
|
104
123
|
- The `health()` helper registers `GET /health` automatically
|
|
105
124
|
- For the router API (request helpers, middleware, responses), see the `stacks-router` skill
|
|
125
|
+
|
|
126
|
+
Source: `core/router/src/route-loader.ts`, `appRouteRegistry`, and
|
|
127
|
+
`app-route-registry`, `route-bundles-mounted`, `default-route-bundles`,
|
|
128
|
+
`duplicate-route-registration`, and package-discovery tests.
|
|
@@ -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
|
+
## scaffold-exercises
|
|
6
|
+
|
|
7
|
+
Source: [skills/misc/scaffold-exercises/SKILL.md](https://github.com/mattpocock/skills/blob/49dd158d1076134a641b33efb035946536778336/skills/misc/scaffold-exercises/SKILL.md),
|
|
8
|
+
revision `49dd158d1076134a641b33efb035946536778336`.
|
|
9
|
+
|
|
10
|
+
Ported with Stacks skill names, canonical guidance, local-tracker fallback, TypeScript/Bun tooling, and conditional external actions.
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
> Adapted playbook. Read [the Stacks rules](../stacks-flow/ENGINEERING.md) first. Commit, push, publish, and tracker mutations are conditional on the user's authorization.
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
# Scaffold Exercises
|
|
5
|
+
|
|
6
|
+
Create exercise directory structures that pass `./buddy lint`. Commit only when asked.
|
|
7
|
+
|
|
8
|
+
## Directory naming
|
|
9
|
+
|
|
10
|
+
- **Sections**: `XX-section-name/` inside `exercises/` (e.g., `01-retrieval-skill-building`)
|
|
11
|
+
- **Exercises**: `XX.YY-exercise-name/` inside a section (e.g., `01.03-retrieval-with-bm25`)
|
|
12
|
+
- Section number = `XX`, exercise number = `XX.YY`
|
|
13
|
+
- Names are dash-case (lowercase, hyphens)
|
|
14
|
+
|
|
15
|
+
## Exercise variants
|
|
16
|
+
|
|
17
|
+
Each exercise needs at least one of these subfolders:
|
|
18
|
+
|
|
19
|
+
- `problem/` - student workspace with TODOs
|
|
20
|
+
- `solution/` - reference implementation
|
|
21
|
+
- `explainer/` - conceptual material, no TODOs
|
|
22
|
+
|
|
23
|
+
When stubbing, default to `explainer/` unless the plan specifies otherwise.
|
|
24
|
+
|
|
25
|
+
## Required files
|
|
26
|
+
|
|
27
|
+
Each subfolder (`problem/`, `solution/`, `explainer/`) needs a `readme.md` that:
|
|
28
|
+
|
|
29
|
+
- Is **not empty** (must have real content, even a single title line works)
|
|
30
|
+
- Has no broken links
|
|
31
|
+
|
|
32
|
+
When stubbing, create a minimal readme with a title and a description:
|
|
33
|
+
|
|
34
|
+
```md
|
|
35
|
+
# Exercise Title
|
|
36
|
+
|
|
37
|
+
Description here
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
If the subfolder has code, it also needs a `main.ts` (>1 line). But for stubs, a readme-only exercise is fine.
|
|
41
|
+
|
|
42
|
+
## Workflow
|
|
43
|
+
|
|
44
|
+
1. **Parse the plan** - extract section names, exercise names, and variant types
|
|
45
|
+
2. **Create directories** - `mkdir -p` for each path
|
|
46
|
+
3. **Create stub readmes** - one `readme.md` per variant folder with a title
|
|
47
|
+
4. **Run lint** - `./buddy lint` to validate
|
|
48
|
+
5. **Fix any errors** - iterate until lint passes
|
|
49
|
+
|
|
50
|
+
## Exercise layout checks
|
|
51
|
+
|
|
52
|
+
`./buddy lint` checks source style. Verify the following exercise layout rules
|
|
53
|
+
with a TypeScript/Bun filesystem check or direct inspection. They are not
|
|
54
|
+
built-in buddy lint rules:
|
|
55
|
+
|
|
56
|
+
- Each exercise has subfolders (`problem/`, `solution/`, `explainer/`)
|
|
57
|
+
- At least one of `problem/`, `explainer/`, or `explainer.1/` exists
|
|
58
|
+
- `readme.md` exists and is non-empty in the primary subfolder
|
|
59
|
+
- No `.gitkeep` files
|
|
60
|
+
- No `speaker-notes.md` files
|
|
61
|
+
- No broken links in readmes
|
|
62
|
+
- No `pnpm run exercise` commands in readmes
|
|
63
|
+
- `main.ts` required per subfolder unless it's readme-only
|
|
64
|
+
|
|
65
|
+
## Moving/renaming exercises
|
|
66
|
+
|
|
67
|
+
When renumbering or moving exercises:
|
|
68
|
+
|
|
69
|
+
1. Use `git mv` (not `mv`) to rename directories - preserves git history
|
|
70
|
+
2. Update the numeric prefix to maintain order
|
|
71
|
+
3. Re-run lint after moves
|
|
72
|
+
|
|
73
|
+
Example:
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
git mv exercises/01-retrieval/01.03-embeddings exercises/01-retrieval/01.04-embeddings
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
## Example: stubbing from a plan
|
|
80
|
+
|
|
81
|
+
Given a plan like:
|
|
82
|
+
|
|
83
|
+
```
|
|
84
|
+
Section 05: Memory Skill Building
|
|
85
|
+
- 05.01 Introduction to Memory
|
|
86
|
+
- 05.02 Short-term Memory (explainer + problem + solution)
|
|
87
|
+
- 05.03 Long-term Memory
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Create:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
mkdir -p exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer
|
|
94
|
+
mkdir -p exercises/05-memory-skill-building/05.02-short-term-memory/{explainer,problem,solution}
|
|
95
|
+
mkdir -p exercises/05-memory-skill-building/05.03-long-term-memory/explainer
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
Then create readme stubs:
|
|
99
|
+
|
|
100
|
+
```
|
|
101
|
+
exercises/05-memory-skill-building/05.01-introduction-to-memory/explainer/readme.md -> "# Introduction to Memory"
|
|
102
|
+
exercises/05-memory-skill-building/05.02-short-term-memory/explainer/readme.md -> "# Short-term Memory"
|
|
103
|
+
exercises/05-memory-skill-building/05.02-short-term-memory/problem/readme.md -> "# Short-term Memory"
|
|
104
|
+
exercises/05-memory-skill-building/05.02-short-term-memory/solution/readme.md -> "# Short-term Memory"
|
|
105
|
+
exercises/05-memory-skill-building/05.03-long-term-memory/explainer/readme.md -> "# Long-term Memory"
|
|
106
|
+
```
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-scaffold-exercises
|
|
3
|
+
description: Use when scaffolding exercises, problem/solution variants, explainers, or a course section with TypeScript examples. Covers exercise layouts and Bun/pickier verification.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Scaffold Exercises
|
|
10
|
+
|
|
11
|
+
Read [the Stacks adaptation rules](../stacks-flow/ENGINEERING.md), then
|
|
12
|
+
[PLAYBOOK.md](PLAYBOOK.md). The playbook preserves this workflow's decision
|
|
13
|
+
criteria; the Stacks rules govern APIs, tooling, tracking, and authorization.
|
|
14
|
+
|
|
15
|
+
Credit: adapted from Matt Pocock's `scaffold-exercises` skill, MIT licensed.
|
|
16
|
+
See [NOTICE.md](NOTICE.md) and [LICENSE](LICENSE).
|
|
17
|
+
|
|
18
|
+
## Completion
|
|
19
|
+
|
|
20
|
+
Produce the requested behavior or reviewable artifact and satisfy the
|
|
21
|
+
playbook's completion criteria. Preserve existing decisions and user edits.
|
|
22
|
+
Use the native Stacks skills for implementation and verification, and carry
|
|
23
|
+
existing authorization through the workflow.
|
|
@@ -15,6 +15,12 @@ allowed-tools: Read Edit Write Bash Grep Glob
|
|
|
15
15
|
|
|
16
16
|
## CLI Make Commands
|
|
17
17
|
|
|
18
|
+
Use `buddy list` and the selected command's `--help` for the current generator
|
|
19
|
+
surface. Model, action, job, middleware, policy, resource, command and mail
|
|
20
|
+
generators are available as well as the examples below. A new model belongs in
|
|
21
|
+
`app/Models`; schema changes normally use `generate:migrations`, not a
|
|
22
|
+
handwritten `make:migration`. Read `stacks-new-feature` for that tracer bullet.
|
|
23
|
+
|
|
18
24
|
```bash
|
|
19
25
|
buddy make:component <name> # Create a new STX component
|
|
20
26
|
buddy make:function <name> # Create a new function/composable
|
|
@@ -35,6 +41,11 @@ import { createProject, addComponent, addPage, addStore, addLayout } from '@stac
|
|
|
35
41
|
|
|
36
42
|
### Create Project
|
|
37
43
|
|
|
44
|
+
This is the standalone STX generator contract. For a Stacks application prefer
|
|
45
|
+
Buddy scaffolding and its existing Bun/better-dx/STX/Crosswind setup. The legacy
|
|
46
|
+
tailwind option adds a separate Tailwind dependency and is not the Stacks
|
|
47
|
+
styling workflow.
|
|
48
|
+
|
|
38
49
|
```typescript
|
|
39
50
|
async function createProject(name: string, options?: CreateProjectOptions): Promise<ScaffoldResult>
|
|
40
51
|
|
|
@@ -137,7 +148,7 @@ interface ScaffoldResult {
|
|
|
137
148
|
| Language files | `locales/` |
|
|
138
149
|
| Layouts | `resources/layouts/` |
|
|
139
150
|
| Pages | `resources/views/` |
|
|
140
|
-
| Stores |
|
|
151
|
+
| Stores | Check the selected STX generator's configured store directory |
|
|
141
152
|
| Partials | `resources/partials/` |
|
|
142
153
|
|
|
143
154
|
Browser-extension scaffolding also follows this resource layout: popup pages
|
|
@@ -148,15 +159,20 @@ container app alongside the web-extension starter.
|
|
|
148
159
|
## Default Templates
|
|
149
160
|
|
|
150
161
|
Templates for generated code are in `storage/framework/defaults/`:
|
|
151
|
-
- `defaults/components/`
|
|
152
|
-
- `defaults/models/`
|
|
153
|
-
- `defaults/app/Middleware/`
|
|
154
|
-
- `defaults/layouts/`
|
|
155
|
-
- `defaults/views/`
|
|
162
|
+
- `defaults/components/` - component templates
|
|
163
|
+
- `defaults/models/` - model templates
|
|
164
|
+
- `defaults/app/Middleware/` - middleware templates
|
|
165
|
+
- `defaults/layouts/` - layout templates
|
|
166
|
+
- `defaults/views/` - view templates
|
|
156
167
|
|
|
157
168
|
## Gotchas
|
|
158
|
-
- **Always use make commands**
|
|
159
|
-
- **
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
- **
|
|
169
|
+
- **Always use make commands** - ensures consistent file structure and naming
|
|
170
|
+
- **Framework templates are reference defaults** - keep application-owned
|
|
171
|
+
overrides in application paths; editing a bundled framework template affects
|
|
172
|
+
the framework distribution and is not a durable per-app customization.
|
|
173
|
+
- **Run pickier after generating** - `bunx --bun pickier . --fix` to format generated code
|
|
174
|
+
- **`force` flag overwrites** - without it, existing files are not overwritten
|
|
175
|
+
- **STX scaffolding and buddy make differ** - STX project scaffolding targets a
|
|
176
|
+
standalone STX layout, while Buddy generators target Stacks application paths.
|
|
177
|
+
Verify generated destinations/options rather than assuming one is a wrapper
|
|
178
|
+
around the other. Keep components/layouts/views under resources in a Stacks app.
|
|
@@ -26,17 +26,17 @@ The `@stacksjs/scheduler` package provides fluent, chainable task scheduling for
|
|
|
26
26
|
scheduler/src/
|
|
27
27
|
├── index.ts # Re-exports everything from run, schedule, types
|
|
28
28
|
├── schedule.ts # Schedule class, Queue alias, sendAt(), timeout()
|
|
29
|
-
├── run.ts # runScheduler()
|
|
29
|
+
├── run.ts # runScheduler() - loads Jobs/*.ts + app/Scheduler.ts
|
|
30
30
|
└── types.ts # Timezone union, ScheduledJob, UntimedSchedule, TimedSchedule, BaseSchedule
|
|
31
31
|
|
|
32
32
|
cron/src/
|
|
33
|
-
├── index.ts # parse(), register(), remove()
|
|
34
|
-
├── parser.ts # parseCron()
|
|
33
|
+
├── index.ts # parse(), register(), remove() - delegates to Bun.cron or parseCron
|
|
34
|
+
├── parser.ts # parseCron() - native 5-field cron parser with POSIX OR logic
|
|
35
35
|
├── types.ts # CatchCallbackFn, ProtectCallbackFn, IntRange
|
|
36
36
|
└── bun-cron.d.ts # Bun.cron type declarations
|
|
37
37
|
|
|
38
38
|
queue/src/
|
|
39
|
-
└── scheduler.ts # startScheduler(), stopScheduler(), getSchedulerStatus()
|
|
39
|
+
└── scheduler.ts # startScheduler(), stopScheduler(), getSchedulerStatus() - queue-level scheduler
|
|
40
40
|
```
|
|
41
41
|
|
|
42
42
|
## Schedule Class (schedule.ts)
|
|
@@ -46,12 +46,12 @@ The `Schedule` class is the core scheduling API. The lowercase `schedule` export
|
|
|
46
46
|
```typescript
|
|
47
47
|
import { schedule } from '@stacksjs/scheduler'
|
|
48
48
|
|
|
49
|
-
// Static factory methods
|
|
49
|
+
// Static factory methods - each returns UntimedSchedule
|
|
50
50
|
schedule.job(name: JobName): UntimedSchedule // Runs a job by name via runJob()
|
|
51
51
|
schedule.action(name: string): UntimedSchedule // Runs an action by name via runAction()
|
|
52
52
|
schedule.command(cmd: string): UntimedSchedule // Runs a shell command via runCommand()
|
|
53
53
|
|
|
54
|
-
// Graceful shutdown
|
|
54
|
+
// Graceful shutdown - stops all tracked jobs
|
|
55
55
|
schedule.gracefulShutdown(): Promise<void>
|
|
56
56
|
```
|
|
57
57
|
|
|
@@ -61,7 +61,8 @@ schedule.gracefulShutdown(): Promise<void>
|
|
|
61
61
|
new Schedule(task: () => void)
|
|
62
62
|
```
|
|
63
63
|
|
|
64
|
-
The constructor accepts a task function and auto-starts
|
|
64
|
+
The constructor accepts a task function and auto-starts through queueMicrotask
|
|
65
|
+
after the synchronous chain completes. Keep configuration in that same chain.
|
|
65
66
|
|
|
66
67
|
### Timing Methods (returns TimedSchedule)
|
|
67
68
|
|
|
@@ -116,19 +117,20 @@ The `Timezone` type is a string union of ~70 IANA timezone identifiers (e.g., `'
|
|
|
116
117
|
|
|
117
118
|
- **Sub-minute** (`everySecond`): Uses `setInterval` with the configured `intervalMs`.
|
|
118
119
|
- **Minute+**: Uses `parse()` from `@stacksjs/cron` to compute the next run time, then `setTimeout` to fire at the right moment. When the delay exceeds `2^31-1 ms` (~24.8 days), it chains shorter timeouts.
|
|
119
|
-
- **Timezone-aware**:
|
|
120
|
+
- **Timezone-aware**: passes the configured IANA timezone to the cron parser through nextCronTime(). The returned Date is a UTC instant; local DST windows can still skip or repeat a scheduled local hour. Use idempotency when a task must have one effect in that window.
|
|
120
121
|
- **maxRuns**: Tracks `runCount` and calls `stop()` when the limit is reached.
|
|
121
122
|
- **Error handling**: If `options.catch` is set, errors are caught and passed to the handler instead of propagating.
|
|
122
123
|
|
|
124
|
+
|
|
123
125
|
### Overlap Prevention and Locking
|
|
124
126
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
127
|
+
`withoutOverlapping()` uses a local exclusive file lock, with a stale-lock
|
|
128
|
+
expiry. `onOneServer()` also requests a dedicated PostgreSQL/MySQL advisory
|
|
129
|
+
lock through `scheduler-lock.ts`, alongside the local file lock. DB locks
|
|
130
|
+
release when their connection disconnects. SQLite/Turso use only the host's file
|
|
131
|
+
lock, and a DB-unavailable fallback warns rather than promising cluster
|
|
132
|
+
coordination. Use the same task name on all participating hosts. Names are
|
|
133
|
+
sanitized and hashed for lock paths.
|
|
132
134
|
|
|
133
135
|
### Background Execution
|
|
134
136
|
|
|
@@ -156,10 +158,10 @@ timeout(cronExpression: string | Date): number
|
|
|
156
158
|
```typescript
|
|
157
159
|
import { parse } from '@stacksjs/cron'
|
|
158
160
|
|
|
159
|
-
parse(expression: string, relativeDate?: Date | number): Date | null
|
|
161
|
+
parse(expression: string, relativeDate?: Date | number, options?: { tz?: string }): Date | null
|
|
160
162
|
```
|
|
161
163
|
|
|
162
|
-
- Uses `Bun.cron.parse()` when available
|
|
164
|
+
- Uses `Bun.cron.parse()` when available and no timezone is supplied. With tz, or without native support, it uses the built-in parseCron implementation.
|
|
163
165
|
- Returns the next matching UTC `Date`, or `null` if no match within ~4 years.
|
|
164
166
|
- Throws on invalid expressions (wrong field count, out-of-range values).
|
|
165
167
|
|
|
@@ -217,11 +219,11 @@ Every.Year // '0 0 1 1 *'
|
|
|
217
219
|
|
|
218
220
|
The entry point for starting the scheduler process:
|
|
219
221
|
|
|
220
|
-
1. Globs `app/Jobs/*.ts`
|
|
221
|
-
2.
|
|
222
|
-
3.
|
|
223
|
-
4.
|
|
224
|
-
5.
|
|
222
|
+
1. Globs `app/Jobs/*.ts` and loads app/Scheduler.ts first.
|
|
223
|
+
2. Preserves each job filename's case as its schedulable name.
|
|
224
|
+
3. Skips a rate when the file or declared job name already has an explicit schedule.
|
|
225
|
+
4. Schedules remaining rate strings through schedule.job(name).cron(rate), including supported sub-minute intervals.
|
|
226
|
+
5. Logs individual import/rate failures and returns Ok on successful scheduler registration.
|
|
225
227
|
|
|
226
228
|
```typescript
|
|
227
229
|
import { runScheduler } from '@stacksjs/scheduler'
|
|
@@ -345,12 +347,12 @@ export default {
|
|
|
345
347
|
```
|
|
346
348
|
|
|
347
349
|
## Gotchas
|
|
348
|
-
- The
|
|
350
|
+
- The Schedule constructor starts through a microtask after the synchronous chain; asynchronous configuration arrives too late
|
|
349
351
|
- Default timezone is `'America/Los_Angeles'`, not UTC
|
|
350
352
|
- `everySecond()` uses `setInterval`, not cron -- it sets `intervalMs = 1000` and bypasses the cron parser entirely
|
|
351
353
|
- The `Queue` class in `schedule.ts` is just an empty subclass of `Schedule` (`export class Queue extends Schedule {}`) -- it adds no functionality
|
|
352
|
-
- `withoutOverlapping()`
|
|
353
|
-
-
|
|
354
|
+
- `withoutOverlapping()` provides local file locking. `onOneServer()` adds PostgreSQL/MySQL advisory coordination where available
|
|
355
|
+
- SQLite/Turso and DB-unavailable fallback cannot provide cluster-wide scheduler coordination; read scheduler-lock.ts and its warning
|
|
354
356
|
- `runInBackground()` runs the task by name in a `buddy schedule:run-one <name> --in-process` child, so the task must be registered under that name by the app's scheduler file, and an unnamed callback is refused
|
|
355
357
|
- There are TWO scheduler systems: `@stacksjs/scheduler` (fluent API in `schedule.ts`) and the queue-level scheduler in `@stacksjs/queue` (`queue/src/scheduler.ts`). The former runs tasks in-process; the latter dispatches to the queue
|
|
356
358
|
- `sendAt()` throws on invalid cron expressions (it delegates to `parse()` which throws)
|
|
@@ -361,3 +363,28 @@ export default {
|
|
|
361
363
|
- The cron parser uses POSIX OR logic when both day-of-month and day-of-week are specified (neither `*`) -- this means `0 0 15 * FRI` matches the 15th OR every Friday, not only Fridays that fall on the 15th
|
|
362
364
|
- Lock files are written with `{ flag: 'wx' }` for atomic creation, but this is not NFS-safe
|
|
363
365
|
- `parse()` returns `null` for impossible patterns (e.g., `0 0 30 2 *` -- Feb 30 never exists) rather than throwing
|
|
366
|
+
|
|
367
|
+
|
|
368
|
+
## Additional native scheduling operations
|
|
369
|
+
|
|
370
|
+
`cron(expression)` accepts five-field cron and deliberately restricted
|
|
371
|
+
six-field forms: all-wildcard intervals in seconds dividing 60, or leading zero
|
|
372
|
+
seconds with a five-field schedule. Unsupported specific-second forms throw.
|
|
373
|
+
`dailyAt(time)`, `weekdays()` and `onQueue(name)` are native methods.
|
|
374
|
+
`sendOutputTo(path)` and `appendOutputTo(path)` capture supported command
|
|
375
|
+
output. `runMissed({ since, max? })` performs bounded catch-up; read its
|
|
376
|
+
window/overlap behavior before using it for non-idempotent tasks.
|
|
377
|
+
|
|
378
|
+
`schedule.notification(recipient, payload, channels?, options?)` schedules
|
|
379
|
+
native notify fan-out and fails the task if any channel result failed.
|
|
380
|
+
Use `.withName()` for a stable operational name. `Schedule.listJobs()`,
|
|
381
|
+
`runNow(name, { inProcess? })`, `setEnabled/isEnabled/isScheduled` and
|
|
382
|
+
`listLocks()` expose registered process state, not an inventory of every host.
|
|
383
|
+
CLI: schedule:list/status/run-one/enable/disable. Read each command's help for
|
|
384
|
+
persistence scope and flags; schedule:run starts a long-running scheduler.
|
|
385
|
+
|
|
386
|
+
Source: `storage/framework/core/scheduler/src/schedule.ts` and
|
|
387
|
+
`scheduler-lock.ts`, `core/buddy/src/commands/schedule.ts`. Tests:
|
|
388
|
+
`cron-expression.test.ts`, `schedule-options.test.ts`,
|
|
389
|
+
`scheduler-lock.test.ts`, `run-missed.test.ts`,
|
|
390
|
+
`notification.test.ts` under `core/scheduler/tests/`.
|
|
@@ -28,10 +28,10 @@ import {
|
|
|
28
28
|
} from '@stacksjs/search-engine'
|
|
29
29
|
|
|
30
30
|
const search = useSearchEngine() // default driver
|
|
31
|
-
const algolia = useAlgolia() // Algolia client
|
|
32
|
-
const meili = useMeilisearch() // Meilisearch client
|
|
33
|
-
const openSearch = useOpensearch() // OpenSearch driver
|
|
34
|
-
const typesense = useTypesense() // Typesense driver
|
|
31
|
+
const algolia = await useAlgolia() // Algolia client
|
|
32
|
+
const meili = await useMeilisearch() // Meilisearch client
|
|
33
|
+
const openSearch = await useOpensearch() // OpenSearch driver
|
|
34
|
+
const typesense = await useTypesense() // Typesense driver
|
|
35
35
|
```
|
|
36
36
|
|
|
37
37
|
## Document Operations
|
|
@@ -96,7 +96,7 @@ buddy search-engine:settings --model Product # settings for specific model
|
|
|
96
96
|
|---------|-------------|---------|-----------|------------|
|
|
97
97
|
| Self-hosted | Yes | No | Yes | Yes |
|
|
98
98
|
| Managed option | Yes | Yes | Yes | Yes |
|
|
99
|
-
| Model lifecycle indexing | Yes | Yes | Yes |
|
|
99
|
+
| Model lifecycle indexing | Yes | Yes | Yes | Yes |
|
|
100
100
|
|
|
101
101
|
## config/search-engine.ts
|
|
102
102
|
|
|
@@ -107,7 +107,7 @@ buddy search-engine:settings --model Product # settings for specific model
|
|
|
107
107
|
Environment variables: `MEILISEARCH_HOST`, `MEILISEARCH_KEY`, `SEARCH_ENGINE_DRIVER`
|
|
108
108
|
|
|
109
109
|
## Gotchas
|
|
110
|
-
- Default driver is `opensearch`
|
|
110
|
+
- Default driver is `opensearch` - configure in config or env
|
|
111
111
|
- A selected driver must implement the complete `SearchEngineDriver` surface; never satisfy the type with an empty cast
|
|
112
112
|
- `useSearch` trait determines which model fields are indexed
|
|
113
113
|
- `displayable` controls which fields appear in search results
|
|
@@ -117,4 +117,25 @@ Environment variables: `MEILISEARCH_HOST`, `MEILISEARCH_KEY`, `SEARCH_ENGINE_DRI
|
|
|
117
117
|
- Use `buddy search-engine:update --flush` for full re-index
|
|
118
118
|
- Meilisearch requires a running Meilisearch server
|
|
119
119
|
- Algolia requires API keys from your Algolia dashboard
|
|
120
|
-
- Settings updates don't re-index
|
|
120
|
+
- Settings updates don't re-index - run `search-engine:update` after changes
|
|
121
|
+
|
|
122
|
+
|
|
123
|
+
## Readiness and driver boundaries
|
|
124
|
+
|
|
125
|
+
`useSearchEngine()` returns a synchronous deferred proxy whose async methods
|
|
126
|
+
wait for configuration and driver loading. The provider factories return promises
|
|
127
|
+
and require await. Use `await searchEngineReady()` before reading synchronous
|
|
128
|
+
client/resetClient members. This avoids capturing framework default config before
|
|
129
|
+
overridesReady settles.
|
|
130
|
+
|
|
131
|
+
Every driver implements SearchEngineDriver, but setting/collection schemas differ.
|
|
132
|
+
Typesense needs explicit schema handling for model field types and settings;
|
|
133
|
+
read its driver/schema tests before translating Meilisearch filters unchanged.
|
|
134
|
+
Lifecycle indexing errors are surfaced through the framework's search handling;
|
|
135
|
+
an external index is not a transactional substitute for the model database.
|
|
136
|
+
Read the source path used by your write before assuming bulk raw SQL auto-indexes.
|
|
137
|
+
|
|
138
|
+
Source: `storage/framework/core/search-engine/src/index.ts`,
|
|
139
|
+
`documents.ts` and `drivers/`. Retained tests:
|
|
140
|
+
`early-proxy.test.ts`, `driver-contract.test.ts`,
|
|
141
|
+
`document-errors.test.ts` and `typesense-schema.test.ts`.
|
|
@@ -27,7 +27,7 @@ security/src/
|
|
|
27
27
|
```typescript
|
|
28
28
|
import { generateAppKey } from '@stacksjs/security'
|
|
29
29
|
|
|
30
|
-
const key = generateAppKey() // 32
|
|
30
|
+
const key = generateAppKey() // base64: followed by 32 random bytes encoded as base64
|
|
31
31
|
// Run via CLI: buddy key:generate
|
|
32
32
|
```
|
|
33
33
|
|
|
@@ -74,9 +74,8 @@ const algo = detectAlgorithm(hash) // 'bcrypt' | 'argon2' | 'argon2id' | ...
|
|
|
74
74
|
### Algorithm-Specific Functions
|
|
75
75
|
```typescript
|
|
76
76
|
bcryptEncode(value, rounds?) // bcrypt hash
|
|
77
|
-
bcryptVerify(value, hash) // bcrypt verify
|
|
78
77
|
argon2Encode(value, options?) // argon2 hash
|
|
79
|
-
|
|
78
|
+
check(value, hash) // verifies supported bcrypt/argon2 hashes
|
|
80
79
|
base64Encode(value) // base64
|
|
81
80
|
```
|
|
82
81
|
|
|
@@ -144,12 +143,29 @@ import { eraseSubject, exportSubjectData, pruneRetainedData } from '@stacksjs/or
|
|
|
144
143
|
`log`, which writes to disk in production.
|
|
145
144
|
|
|
146
145
|
## Gotchas
|
|
147
|
-
- Default hashing is bcrypt with 12 rounds
|
|
148
|
-
- `needsRehash()` compares current hash options against provided options
|
|
149
|
-
- APP_KEY is used for `encrypt()`/`decrypt()`
|
|
146
|
+
- Default hashing is bcrypt with 12 rounds - sufficient for most applications
|
|
147
|
+
- `needsRehash()` compares current hash options against provided options - useful after config changes
|
|
148
|
+
- APP_KEY is used for `encrypt()`/`decrypt()` - generate via `buddy key:generate`
|
|
150
149
|
- APP_KEY format is colon-separated (validated during deployment)
|
|
151
150
|
- Argon2 requires more memory/time but is more resistant to GPU attacks
|
|
152
151
|
- Base64 is encoding, not hashing. Never use `base64Encode()` for credentials.
|
|
153
152
|
- MD5 and base64 password verification are intentionally absent from the main security API.
|
|
154
153
|
- The firewall config is used by cloud deployment for WAF rules
|
|
155
154
|
- Rate limiting is per-minute per-IP (500 default)
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
## Encryption and webhook contracts
|
|
158
|
+
|
|
159
|
+
New `encrypt()` ciphertext uses the versioned AES-256-GCM envelope and
|
|
160
|
+
PBKDF2-SHA-256 derivation in `core/security/src/crypt.ts`; decrypt retains
|
|
161
|
+
legacy formats for upgrades. The base64: APP_KEY prefix is normalized by that
|
|
162
|
+
implementation. Encryption/hashing/encoding are distinct APIs; use the exported
|
|
163
|
+
webhook helpers from `core/security/src/webhook.ts` for signed callback
|
|
164
|
+
validation rather than inventing a string comparison.
|
|
165
|
+
|
|
166
|
+
Generated model API exposure and ownership live under `config/security.ts`
|
|
167
|
+
api settings. Read `stacks-models`/`stacks-router` before opening generated
|
|
168
|
+
endpoints; a cloud WAF setting does not implement model row authorization.
|
|
169
|
+
Capability/config validation and credential recovery have separate tests and
|
|
170
|
+
failure contracts; propagate their real errors rather than interpreting an
|
|
171
|
+
awaited call as proof that a security state transition persisted.
|