@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
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# Triage Labels
|
|
2
|
+
|
|
3
|
+
The skills speak in terms of five canonical triage roles. This file maps those roles to the actual label strings used in this repo's issue tracker.
|
|
4
|
+
|
|
5
|
+
| Label in mattpocock/skills | Label in our tracker | Meaning |
|
|
6
|
+
| -------------------------- | -------------------- | ---------------------------------------- |
|
|
7
|
+
| `needs-triage` | `needs-triage` | Maintainer needs to evaluate this issue |
|
|
8
|
+
| `needs-info` | `needs-info` | Waiting on reporter for more information |
|
|
9
|
+
| `ready-for-agent` | `ready-for-agent` | Fully specified, ready for an AFK agent |
|
|
10
|
+
| `ready-for-human` | `ready-for-human` | Requires human implementation |
|
|
11
|
+
| `wontfix` | `wontfix` | Will not be actioned |
|
|
12
|
+
|
|
13
|
+
When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label string from this table.
|
|
14
|
+
|
|
15
|
+
Edit the "Label in our tracker" column to match whatever vocabulary you actually use.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-sites
|
|
3
|
+
description: Use when resolving multi-site tenants by host, provisioning sites, scoping queries, or authorizing site-owned content. Covers @stacksjs/sites and config/sites.ts.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Multi-site tenancy
|
|
10
|
+
|
|
11
|
+
The native package resolves hosts and carries a site snapshot through a request.
|
|
12
|
+
Host tenancy and an authenticated administrator's team ownership are different
|
|
13
|
+
contracts; do not substitute one for the other.
|
|
14
|
+
|
|
15
|
+
## Resolution and explicit scoping
|
|
16
|
+
|
|
17
|
+
Use siteResolver with configured resolver/store behavior. normalizeHost,
|
|
18
|
+
classifyHost, requestHost and resolveSiteByHost own host parsing and lookup.
|
|
19
|
+
currentSite, currentSiteId, requireSite and runWithSite serve API request context.
|
|
20
|
+
An unresolved site fails a required-site operation rather than silently selecting
|
|
21
|
+
another tenant. Respect platform hosts and configured forwarded-host trust.
|
|
22
|
+
|
|
23
|
+
forSite(query, column, siteId) adds an explicit predicate. Defining a Site model
|
|
24
|
+
does not globally scope every raw query. A site id in an arbitrary request body
|
|
25
|
+
is not an authenticated or host-resolved tenant. siteOwnership governs admin
|
|
26
|
+
resources using the caller's real team membership; public reads scope by host.
|
|
27
|
+
|
|
28
|
+
API AsyncLocalStorage is not the snapshot read by every stx server render.
|
|
29
|
+
Templates use requestContext.site() through the serving layer's per-request
|
|
30
|
+
snapshot. Read stacks-config and stacks-stx before crossing that boundary.
|
|
31
|
+
|
|
32
|
+
## Provisioning
|
|
33
|
+
|
|
34
|
+
provisionSite refreshes a supplied tenant's site/branding and creates missing
|
|
35
|
+
starter pages while preserving matched existing paths. Verify normalized nested
|
|
36
|
+
slugs and parent paths before relying on reprovisioning idempotency for a complex
|
|
37
|
+
page hierarchy. Pass actual tenancy and
|
|
38
|
+
page input; it does not invent a tenant model or overwrite all CMS content.
|
|
39
|
+
Use stacks-cms document APIs for pages and stacks-forms for site-owned forms.
|
|
40
|
+
|
|
41
|
+
Test two concurrent sites, platform/unresolved hosts, query predicates,
|
|
42
|
+
administrator membership, reprovisioning and edited-page preservation.
|
|
43
|
+
Source: core/sites/src/{context,resolver,middleware,scoping,provision,snapshot}.ts.
|
|
44
|
+
Evidence: sites.test.ts and provision.test.ts.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: stacks-skills
|
|
3
|
+
description: Use when discovering, validating, overriding, or distributing Stacks agent skills. Covers @stacksjs/skills, app/Skills, bundled defaults and buddy setup:ai.
|
|
4
|
+
license: MIT
|
|
5
|
+
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
|
+
allowed-tools: Read Edit Write Bash Grep Glob
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Native skill discovery
|
|
10
|
+
|
|
11
|
+
listSkills returns sorted unique names. resolveSkillPath and getSkill resolve
|
|
12
|
+
app/Skills before storage/framework/defaults/ai/skills. A same-name app skill
|
|
13
|
+
shadows the framework definition; it is not a second copy in the result.
|
|
14
|
+
|
|
15
|
+
getSkill returns metadata, instructions, source path and supporting directory
|
|
16
|
+
entries. validateSkill checks name/description requirements, name spelling,
|
|
17
|
+
lengths and folder-name agreement. It is not a full YAML parser or a semantic
|
|
18
|
+
proof that every referenced API exists. Use loadSkillMetadata for discovery
|
|
19
|
+
without inventing a separate registry of names.
|
|
20
|
+
|
|
21
|
+
buddy setup:ai materializes the merged set for the selected agent, using
|
|
22
|
+
per-skill symlinks or copies. Preserve shared references inside skill directories
|
|
23
|
+
so copy mode still works. Do not overwrite authored AGENTS.md or a real CLAUDE.md
|
|
24
|
+
merely to refresh generated files. Future app installs receive bundled skills
|
|
25
|
+
through @stacksjs/defaults and managed scaffold sync.
|
|
26
|
+
|
|
27
|
+
Read stacks-writing-for-agents before authoring instructions. New native
|
|
28
|
+
packages need a skill or an explicit mapping in docs:native-skills. Keep the
|
|
29
|
+
documentation page, sidebar, source notice when imported, and supporting files
|
|
30
|
+
together. Test runtime discovery and fresh-app distribution, not only filenames.
|
|
31
|
+
|
|
32
|
+
Source: core/skills/src/skills.ts and core/buddy/src/commands/setup-ai.ts.
|
|
33
|
+
Evidence: skills.test.ts, setup-ai.test.ts and the docs/distribution contracts.
|
|
@@ -18,17 +18,14 @@ URL-friendly slug generation with database uniqueness checking.
|
|
|
18
18
|
```typescript
|
|
19
19
|
import { uniqueSlug } from '@stacksjs/slug'
|
|
20
20
|
|
|
21
|
-
//
|
|
21
|
+
// No table/column supplied: plain slugification, no database collision check
|
|
22
22
|
const slug = await uniqueSlug('My Blog Post Title')
|
|
23
23
|
// → 'my-blog-post-title'
|
|
24
24
|
|
|
25
|
-
//
|
|
26
|
-
// → 'my-blog-post-title-2'
|
|
27
|
-
|
|
28
|
-
// With options
|
|
25
|
+
// Supply BOTH table and column to check collisions
|
|
29
26
|
const slug = await uniqueSlug('Product Name', {
|
|
30
27
|
table: 'products', // database table to check
|
|
31
|
-
column: 'slug' //
|
|
28
|
+
column: 'slug' // required for database checking
|
|
32
29
|
})
|
|
33
30
|
```
|
|
34
31
|
|
|
@@ -48,7 +45,7 @@ slugify('Ünïcödé Têxt') // 'unicode-text'
|
|
|
48
45
|
slugify(' Extra Spaces ') // 'extra-spaces'
|
|
49
46
|
```
|
|
50
47
|
|
|
51
|
-
Re-exported from `ts-slug`
|
|
48
|
+
Re-exported from `ts-slug` - handles Unicode transliteration.
|
|
52
49
|
|
|
53
50
|
## Model Usage
|
|
54
51
|
|
|
@@ -62,7 +59,7 @@ defineModel({
|
|
|
62
59
|
slug: {
|
|
63
60
|
unique: true,
|
|
64
61
|
validation: { rule: schema.string() },
|
|
65
|
-
//
|
|
62
|
+
// Populate explicitly in the action using uniqueSlug(title, options)
|
|
66
63
|
}
|
|
67
64
|
}
|
|
68
65
|
})
|
|
@@ -72,14 +69,20 @@ defineModel({
|
|
|
72
69
|
|
|
73
70
|
```typescript
|
|
74
71
|
interface SlugifyOptions {
|
|
75
|
-
table
|
|
76
|
-
column
|
|
72
|
+
table: TableNames // database table for uniqueness check
|
|
73
|
+
column: string // no implicit column default
|
|
77
74
|
}
|
|
78
75
|
```
|
|
79
76
|
|
|
80
77
|
## Gotchas
|
|
81
|
-
-
|
|
82
|
-
-
|
|
78
|
+
- Omitting either table or column returns the base slug with no query.
|
|
79
|
+
- The check and insert are separate: keep a UNIQUE index and handle/retry an
|
|
80
|
+
insert conflict. A helper cannot reserve the returned slug against a race.
|
|
81
|
+
- Collision attempts are bounded; after repeated conflicts the helper returns
|
|
82
|
+
a cryptographically randomized suffix instead of looping forever.
|
|
83
|
+
- Declaring a slug attribute does not itself populate it from the title.
|
|
84
|
+
- `uniqueSlug()` is async - it queries the database
|
|
85
|
+
- `slugify()` is sync - no database interaction
|
|
83
86
|
- Collision detection appends `-2`, `-3`, etc. (not random suffixes)
|
|
84
87
|
- Unicode characters are transliterated (u → u, e → e, etc.)
|
|
85
88
|
- For string-only slugification without DB, use `slug()` from `@stacksjs/strings` instead
|
|
@@ -22,7 +22,7 @@ Multi-driver SMS system with verification (OTP), templates, bulk sending, and a
|
|
|
22
22
|
|
|
23
23
|
```typescript
|
|
24
24
|
// Main facade and functions
|
|
25
|
-
import SMS,
|
|
25
|
+
import { SMS, sms, send, sendSms, sendBulk, sendTemplate } from '@stacksjs/sms'
|
|
26
26
|
import { startVerification, checkVerification, cancelVerification } from '@stacksjs/sms'
|
|
27
27
|
import { formatE164, isValidPhoneNumber, isEnabled, getConfig, configure, getDriver, init } from '@stacksjs/sms'
|
|
28
28
|
import { SmsBuilder } from '@stacksjs/sms'
|
|
@@ -34,7 +34,7 @@ import { VonageDriver, createVonageDriver } from '@stacksjs/sms'
|
|
|
34
34
|
|
|
35
35
|
## SMS Facade Object
|
|
36
36
|
|
|
37
|
-
The `SMS`
|
|
37
|
+
The named `SMS` export aggregates the SMS facade functions:
|
|
38
38
|
|
|
39
39
|
```typescript
|
|
40
40
|
SMS.init() // Load config from config/sms.ts
|
|
@@ -190,7 +190,7 @@ Returns a failed result (without throwing) if the template is not found.
|
|
|
190
190
|
import { formatE164, isValidPhoneNumber } from '@stacksjs/sms'
|
|
191
191
|
|
|
192
192
|
// Normalize to E.164 format
|
|
193
|
-
formatE164('+1 (234) 567-
|
|
193
|
+
formatE164('+1 (234) 567-8900') // '+12345678900'
|
|
194
194
|
formatE164('2345678900', '1') // '+12345678900'
|
|
195
195
|
formatE164('002345678900') // '+2345678900' (00 prefix stripped)
|
|
196
196
|
|
|
@@ -371,15 +371,42 @@ interface VerificationResult {
|
|
|
371
371
|
```
|
|
372
372
|
|
|
373
373
|
## Gotchas
|
|
374
|
-
- SMS
|
|
374
|
+
- SMS config defaults disabled, but low-level send does not enforce isEnabled; application entrypoints must honor that gate before dispatch
|
|
375
375
|
- Provider API keys go in `.env`, not config files
|
|
376
376
|
- Config is loaded lazily via dynamic import on first `send()`/operation -- `init()` pre-loads it
|
|
377
377
|
- Only Twilio and Vonage drivers are fully implemented; other drivers (gupshup, plivo, sns, telnyx, etc.) are commented-out placeholders
|
|
378
378
|
- `pinpoint` appears in config but has no driver implementation in `getDriver()` -- using it throws `'Unsupported SMS provider: pinpoint'`
|
|
379
379
|
- `defaultCountryCode` is a numeric dialing prefix such as `'1'` for the US or `'44'` for the UK
|
|
380
380
|
- Template variables use single-brace syntax `{variableName}`, NOT double-brace
|
|
381
|
-
-
|
|
382
|
-
- Twilio verification
|
|
381
|
+
- Facade sendBulk uses config.bulk.concurrency (default 10) and delayMs between chunks; provider driver sendBulk still sends its chunk concurrently
|
|
382
|
+
- Twilio verification uses drivers.twilio.verifyServiceSid from TWILIO_VERIFY_SERVICE_SID, forwarded by getDriver to the constructor
|
|
383
383
|
- Vonage JWT authentication is a simplified placeholder -- real RS256 signing is not fully implemented
|
|
384
384
|
- `getDriver()` creates a new driver instance each time unless accessed through the cached `getDefaultDriver()`
|
|
385
385
|
- `sendTemplate()` returns a failed result (not an exception) if the template name is not found
|
|
386
|
+
|
|
387
|
+
|
|
388
|
+
## Native inbound compliance and helpers
|
|
389
|
+
|
|
390
|
+
`handleInboundSms({ from, body }, { appName?, helpContact? })` classifies
|
|
391
|
+
STOP/START/HELP, persists opt-out or opt-in, and returns the reply an inbound
|
|
392
|
+
webhook should send. `optOutPhone`, `optInPhone`,
|
|
393
|
+
`isPhoneOptedOut` and `normalizePhone` use the persistent
|
|
394
|
+
`sms_opt_outs` table. Apply its model migration first. Sending through the
|
|
395
|
+
generic notification SMS channel checks opt-outs; inspect the selected direct
|
|
396
|
+
send path before assuming a low-level provider call applies that policy.
|
|
397
|
+
|
|
398
|
+
For Twilio webhooks, `verifyTwilioWebhook(url, fields, signature, authToken)`
|
|
399
|
+
validates the exact external URL and submitted fields. `parseTwilioInbound`
|
|
400
|
+
normalizes its payload. `classifySmsIntent/smsComplianceReply` are pure helpers;
|
|
401
|
+
they do not themselves persist consent. Use the persistent handleInboundSms
|
|
402
|
+
workflow when consent state must affect future sends.
|
|
403
|
+
|
|
404
|
+
`estimateSmsSegments(body)` reports GSM-7/UCS-2 estimates; provider billing is
|
|
405
|
+
authoritative. `isWithinSmsQuietHours(date, { startHour, endHour, timezone? })`
|
|
406
|
+
is a policy helper, not an automatic send gate. Config keys such as spend caps
|
|
407
|
+
or quiet hours must be traced to their consumers before promising enforcement.
|
|
408
|
+
|
|
409
|
+
Sources: `storage/framework/core/sms/src/opt-out.ts` and `compliance.ts`.
|
|
410
|
+
Tests: `opt-out.test.ts` and `compliance.test.ts` under core/sms/tests.
|
|
411
|
+
Twilio/Vonage implementations do not imply a live provider delivery contract;
|
|
412
|
+
credentials, registration and provider account configuration remain prerequisites.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: stacks-socials
|
|
3
|
-
description: Use when implementing social
|
|
3
|
+
description: Use when implementing social sign-in, Apple callbacks, PKCE/session handoff, named publishing identities, or publishing through native platform drivers. Covers @stacksjs/socials and config/socials.ts.
|
|
4
4
|
license: MIT
|
|
5
5
|
compatibility: Bun >= 1.3.0, TypeScript
|
|
6
6
|
allowed-tools: Read Edit Write Bash Grep Glob
|
|
@@ -8,296 +8,83 @@ allowed-tools: Read Edit Write Bash Grep Glob
|
|
|
8
8
|
|
|
9
9
|
# Stacks Socials
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
protected usesPKCE(): boolean
|
|
92
|
-
protected getCodeVerifier(): string // 48 random bytes -> 96 hex chars
|
|
93
|
-
protected async getCodeChallenge(): Promise<string> // SHA-256 of verifier, base64url encoded
|
|
94
|
-
protected getCodeChallengeMethod(): string // always 'S256'
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
The `getCodeFields()` method builds the query parameters for the authorization URL:
|
|
99
|
-
- Always includes: `client_id`, `redirect_uri`, `scope` (joined by `scopeSeparator`), `response_type: 'code'`
|
|
100
|
-
- Conditionally adds `state` when `usesState()` is true
|
|
101
|
-
- Conditionally adds `code_challenge` and `code_challenge_method` when `usesPKCE()` is true
|
|
102
|
-
- Merges in any custom `parameters` set via `with()`
|
|
103
|
-
|
|
104
|
-
## Provider Implementations
|
|
105
|
-
|
|
106
|
-
### GitHub Provider
|
|
107
|
-
|
|
108
|
-
```typescript
|
|
109
|
-
class GitHubProvider extends AbstractProvider {
|
|
110
|
-
protected baseUrl = 'https://github.com'
|
|
111
|
-
protected apiUrl = 'https://api.github.com'
|
|
112
|
-
}
|
|
113
|
-
```
|
|
114
|
-
|
|
115
|
-
- Config source: `config.services.github` (clientId, clientSecret, redirectUrl, scopes)
|
|
116
|
-
- Default scopes: `['read:user', 'user:email']`
|
|
117
|
-
- Auth URL: `https://github.com/login/oauth/authorize` with scopes joined by space
|
|
118
|
-
- Token URL: `https://github.com/login/oauth/access_token` (POST)
|
|
119
|
-
- User API: Fetches `/user` and `/user/emails` in parallel via `Promise.all`
|
|
120
|
-
- Email resolution: Primary email first, then verified, then first available
|
|
121
|
-
- Uses `@stacksjs/api` `fetcher` for HTTP requests
|
|
122
|
-
- Throws `ConfigException` if clientId, clientSecret, or redirectUrl missing
|
|
123
|
-
- GitHub token response: `GitHubTokenResponse { access_token, error?, error_description? }`
|
|
124
|
-
|
|
125
|
-
### Google Provider
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
class GoogleProvider extends AbstractProvider {
|
|
129
|
-
protected baseUrl = 'https://accounts.google.com'
|
|
130
|
-
protected apiUrl = 'https://www.googleapis.com'
|
|
131
|
-
}
|
|
132
|
-
```
|
|
133
|
-
|
|
134
|
-
- Config source: `config.services.google`
|
|
135
|
-
- Default scopes: `['https://www.googleapis.com/auth/userinfo.profile', 'https://www.googleapis.com/auth/userinfo.email']`
|
|
136
|
-
- Auth URL: `https://accounts.google.com/o/oauth2/v2/auth` (includes `access_type: 'offline'`, `prompt: 'consent'`)
|
|
137
|
-
- Token URL: `https://accounts.google.com/oauth2/v4/token` (POST with `grant_type: 'authorization_code'`)
|
|
138
|
-
- User API: `https://www.googleapis.com/oauth2/v2/userinfo` with Bearer token
|
|
139
|
-
- Maps `given_name` to `nickname`, `picture` to `avatar`
|
|
140
|
-
- Google user type: `{ id, email, verified_email, name, given_name, family_name, picture, locale }`
|
|
141
|
-
|
|
142
|
-
### Facebook Provider
|
|
143
|
-
|
|
144
|
-
```typescript
|
|
145
|
-
class FacebookProvider extends AbstractProvider {
|
|
146
|
-
protected baseUrl = 'https://www.facebook.com'
|
|
147
|
-
protected apiUrl = 'https://graph.facebook.com'
|
|
148
|
-
}
|
|
149
|
-
```
|
|
150
|
-
|
|
151
|
-
- Config source: `config.services.facebook`
|
|
152
|
-
- Default scopes: `['email', 'public_profile']`
|
|
153
|
-
- Auth URL: `https://www.facebook.com/v18.0/dialog/oauth` with scopes joined by comma
|
|
154
|
-
- Token URL: `https://graph.facebook.com/v18.0/oauth/access_token` (GET request, not POST)
|
|
155
|
-
- User API: `https://graph.facebook.com/v18.0/me?fields=id,name,email,picture`
|
|
156
|
-
- Token is passed as query parameter `access_token`, not in Authorization header
|
|
157
|
-
- Always sets `nickname: null` (Facebook does not expose usernames)
|
|
158
|
-
- Avatar extracted from `picture.data.url`
|
|
159
|
-
- Error response shape: `{ error: { message, type, code } }` (nested object, unlike other providers)
|
|
160
|
-
|
|
161
|
-
### Twitter/X Provider
|
|
162
|
-
|
|
163
|
-
```typescript
|
|
164
|
-
class TwitterProvider extends AbstractProvider {
|
|
165
|
-
protected baseUrl = 'https://twitter.com'
|
|
166
|
-
protected apiUrl = 'https://api.twitter.com'
|
|
167
|
-
private codeVerifier: string | null = null
|
|
168
|
-
}
|
|
169
|
-
```
|
|
170
|
-
|
|
171
|
-
- Config source: `config.services.twitter`
|
|
172
|
-
- Default scopes: `['users.read', 'tweet.read']`
|
|
173
|
-
- Uses OAuth 2.0 with PKCE (not OAuth 1.0a)
|
|
174
|
-
- Auth URL: `https://twitter.com/i/oauth2/authorize` with PKCE code challenge
|
|
175
|
-
- Token URL: `https://api.twitter.com/2/oauth2/token` (POST with Basic auth)
|
|
176
|
-
- User API: `https://api.twitter.com/2/users/me?user.fields=profile_image_url` with Bearer token
|
|
177
|
-
- PKCE implementation uses its own `generateCodeVerifier()` and `generateCodeChallenge()` methods (using `node:crypto` `randomBytes` and `createHash`), not the base class PKCE
|
|
178
|
-
- Code verifier: `randomBytes(32)` -> base64 -> alphanumeric only -> max 128 chars
|
|
179
|
-
- Token exchange uses Basic auth: `Buffer.from(clientId:clientSecret).toString('base64')`
|
|
180
|
-
- `getAccessToken()` throws if `codeVerifier` is null -- `getAuthUrl()` must be called first
|
|
181
|
-
- Maps `username` to `nickname`, `profile_image_url` to `avatar`
|
|
182
|
-
|
|
183
|
-
## SocialUser Interface
|
|
184
|
-
|
|
185
|
-
```typescript
|
|
186
|
-
interface SocialUser {
|
|
187
|
-
id: string
|
|
188
|
-
nickname: string | null
|
|
189
|
-
name: string
|
|
190
|
-
email: string | null
|
|
191
|
-
avatar: string | null
|
|
192
|
-
token: string
|
|
193
|
-
raw?: any // full provider API response
|
|
194
|
-
}
|
|
195
|
-
```
|
|
196
|
-
|
|
197
|
-
## ProviderInterface
|
|
198
|
-
|
|
199
|
-
```typescript
|
|
200
|
-
interface ProviderInterface {
|
|
201
|
-
getAuthUrl: () => Promise<string>
|
|
202
|
-
getAccessToken: (code: string) => Promise<string>
|
|
203
|
-
getUserByToken: (token: string) => Promise<SocialUser>
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Token Class
|
|
208
|
-
|
|
209
|
-
```typescript
|
|
210
|
-
class Token {
|
|
211
|
-
constructor(
|
|
212
|
-
public accessToken: string,
|
|
213
|
-
public refreshToken: string | null = null,
|
|
214
|
-
public expiresIn: number | null = null,
|
|
215
|
-
public approvedScopes: string[] = [],
|
|
216
|
-
) {}
|
|
217
|
-
}
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
## Provider-Specific Types
|
|
221
|
-
|
|
222
|
-
```typescript
|
|
223
|
-
// GitHub
|
|
224
|
-
interface GitHubUser { id: number, login: string, name: string | null, avatar_url: string | null, [key: string]: any }
|
|
225
|
-
interface GitHubEmail { email: string, primary: boolean, verified: boolean }
|
|
226
|
-
interface GitHubTokenResponse { access_token: string, error?: string, error_description?: string }
|
|
227
|
-
|
|
228
|
-
// Twitter/X
|
|
229
|
-
interface TwitterUser { id: string, username: string, name: string, email?: string, profile_image_url?: string }
|
|
230
|
-
interface TwitterTokenResponse { access_token: string, token_type: string, expires_in: number, scope: string, error?: string, error_description?: string }
|
|
231
|
-
|
|
232
|
-
// Google (local to google.ts)
|
|
233
|
-
interface GoogleUser { id: string, email: string, verified_email: boolean, name: string, given_name: string, family_name: string, picture: string, locale: string }
|
|
234
|
-
interface GoogleTokenResponse { access_token: string, token_type: string, expires_in: number, error?: string, error_description?: string }
|
|
235
|
-
|
|
236
|
-
// Facebook (local to facebook.ts)
|
|
237
|
-
interface FacebookUser { id: string, email?: string, name: string, picture?: { data: { url: string } } }
|
|
238
|
-
interface FacebookTokenResponse { access_token: string, token_type: string, expires_in: number, error?: { message: string, type: string, code: number } }
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
## Exceptions
|
|
242
|
-
|
|
243
|
-
```typescript
|
|
244
|
-
class InvalidStateException extends Error { name = 'InvalidStateException' }
|
|
245
|
-
class ConfigException extends Error { name = 'ConfigException' }
|
|
246
|
-
```
|
|
247
|
-
|
|
248
|
-
Providers throw `ConfigException` when `clientId`, `clientSecret`, or `redirectUrl` are missing.
|
|
249
|
-
|
|
250
|
-
## OAuth2 Flow
|
|
251
|
-
|
|
252
|
-
### 1. Get Auth URL
|
|
253
|
-
```typescript
|
|
254
|
-
const github = new GitHubProvider({ clientId: '', clientSecret: '', redirectUrl: '' })
|
|
255
|
-
const authUrl = await github.scopes(['user:email', 'read:org']).getAuthUrl()
|
|
256
|
-
// Each provider reads actual config from config.services.<provider>
|
|
257
|
-
// The constructor config is overridden by getConfig() in each provider
|
|
258
|
-
```
|
|
259
|
-
|
|
260
|
-
### 2. Handle Callback
|
|
261
|
-
```typescript
|
|
262
|
-
const token = await github.getAccessToken(code)
|
|
263
|
-
const user = await github.getUserByToken(token)
|
|
264
|
-
// user: { id, nickname, name, email, avatar, token, raw }
|
|
265
|
-
```
|
|
266
|
-
|
|
267
|
-
### 3. User from Existing Token
|
|
268
|
-
```typescript
|
|
269
|
-
const user = await github.userFromToken(existingToken)
|
|
270
|
-
// Calls getUserByToken internally, adds token to result
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
## Configuration Source
|
|
274
|
-
|
|
275
|
-
All providers read from the Stacks config object:
|
|
276
|
-
```typescript
|
|
277
|
-
config.services.github // { clientId, clientSecret, redirectUrl, scopes }
|
|
278
|
-
config.services.google // { clientId, clientSecret, redirectUrl, scopes }
|
|
279
|
-
config.services.facebook // { clientId, clientSecret, redirectUrl, scopes }
|
|
280
|
-
config.services.twitter // { clientId, clientSecret, redirectUrl, scopes }
|
|
281
|
-
```
|
|
282
|
-
|
|
283
|
-
Each provider's `getConfig()` method reads these and also calls `this.setScopes()` with the configured scopes.
|
|
284
|
-
|
|
285
|
-
## Dependencies
|
|
286
|
-
- `@stacksjs/api` -- `fetcher` used for all HTTP requests (provides `.withHeaders()`, `.get()`, `.post()`)
|
|
287
|
-
- `@stacksjs/config` -- provides `config.services.*` for provider credentials
|
|
288
|
-
- `node:buffer` and `node:crypto` -- used by Twitter provider for PKCE and Basic auth
|
|
289
|
-
|
|
290
|
-
## Gotchas
|
|
291
|
-
- The `ProviderConfig` constructor params are largely ignored -- each provider's `getConfig()` reads from `config.services.*` instead
|
|
292
|
-
- `getAuthUrl()` returns `Promise<string>` (not `string`) -- it is async
|
|
293
|
-
- `getTokenUrl()` is `protected` -- not part of the public `ProviderInterface`
|
|
294
|
-
- GitHub joins scopes with space, Facebook with comma, Google with space, Twitter with space
|
|
295
|
-
- Facebook uses GET for token exchange; all others use POST
|
|
296
|
-
- Facebook `nickname` is always `null`
|
|
297
|
-
- Twitter requires `getAuthUrl()` before `getAccessToken()` because the code verifier is stored as instance state
|
|
298
|
-
- Twitter uses its own PKCE implementation via `node:crypto`, not the base class `getCodeVerifier()`/`getCodeChallenge()`
|
|
299
|
-
- Google auth URL includes `access_type: 'offline'` and `prompt: 'consent'` for refresh token support
|
|
300
|
-
- The base class state token is 40 hex chars (20 bytes), not the 20 chars stated in some docs
|
|
301
|
-
- `userFromToken()` spreads the user object and adds/overwrites the `token` field
|
|
302
|
-
- All providers include the full API response in `SocialUser.raw`
|
|
303
|
-
- Errors from GitHub/Google/Twitter are flat objects with `error` + `error_description`; Facebook nests it under `error.message`
|
|
11
|
+
The native package has separate social sign-in and publishing APIs. Selecting a
|
|
12
|
+
publishing identity does not sign a user into the app, and a sign-in token is not
|
|
13
|
+
necessarily authorized to publish.
|
|
14
|
+
|
|
15
|
+
## Social sign-in
|
|
16
|
+
|
|
17
|
+
Apple, Facebook, GitHub, Google and X providers implement getAuthUrl,
|
|
18
|
+
getAccessToken(code), getUserByToken(token) and inherited userFromToken.
|
|
19
|
+
configuredSocialProviders/isSocialProviderConfigured/socialProvider expose the
|
|
20
|
+
native provider registry and prerequisite checks. Render buttons from that
|
|
21
|
+
registry rather than guessing clientId/clientSecret works for every provider.
|
|
22
|
+
|
|
23
|
+
Apple uses teamId/keyId/privateKey to mint a client-secret JWT; it has no static
|
|
24
|
+
client secret requirement. Its callback is a cross-site POST, so a GET-only
|
|
25
|
+
callback cannot complete it. Read the native default auth route/actions and
|
|
26
|
+
provider test before handling one-time Apple name data or ID-token verification.
|
|
27
|
+
Meta API version is centralized in meta-graph.ts rather than an obsolete v18
|
|
28
|
+
copied into every example.
|
|
29
|
+
|
|
30
|
+
Scopes/setScopes/with/setRedirectUrl belong to AbstractProvider. Providers read
|
|
31
|
+
their actual services config and impose provider-specific scope and credential
|
|
32
|
+
rules. withState supplies the flow's state and validateState checks the expected
|
|
33
|
+
and returned values; persist expected state in the native callback session.
|
|
34
|
+
Twitter sign-in keeps a PKCE verifier on its instance; getAuthUrl must
|
|
35
|
+
precede its exchange on the same stateful flow. Persist and validate state/PKCE
|
|
36
|
+
through the native callback path before minting an app credential; low-level
|
|
37
|
+
getUserByToken alone does not prove the browser initiated a login.
|
|
38
|
+
|
|
39
|
+
SocialUser includes emailVerified. Respect the provider's verification signal
|
|
40
|
+
and the configured account-linking policy, using auth's resolveSocialSignIn
|
|
41
|
+
instead of attaching any equal email address to an existing account. Provider
|
|
42
|
+
errors and ConfigException/InvalidStateException are different from successful
|
|
43
|
+
profile retrieval. Never log raw credential fields.
|
|
44
|
+
|
|
45
|
+
## Session handoff
|
|
46
|
+
|
|
47
|
+
socialHandoffRedirect(pack, { redirectTo?, allowedHosts? }) emits a no-store
|
|
48
|
+
redirect with the native encoded session handoff. Browser useAuth's
|
|
49
|
+
completeSocialLogin consumes it and removes the fragment. isSafeHandoffTarget
|
|
50
|
+
checks permitted redirect shape; choose a server-owned landing path. The helper
|
|
51
|
+
also supplies a failed-sign-in redirect. These are separate from provider token
|
|
52
|
+
exchange and the auth cookie/session issuance policy.
|
|
53
|
+
|
|
54
|
+
## Named publishing identities
|
|
55
|
+
|
|
56
|
+
config/socials.ts declares identities/platforms and optional defaultIdentity.
|
|
57
|
+
resolveSocialCredentials and the six platform-specific resolvers read settings
|
|
58
|
+
after config readiness, with explicit identity selection and environment-backed
|
|
59
|
+
credentials. envName/envSegment define the SOCIALS_<IDENTITY>_<PLATFORM>_<FIELD>
|
|
60
|
+
namespace. An identity's declared platform and required fields are checked; a
|
|
61
|
+
handle used in a permalink is not an authentication credential.
|
|
62
|
+
|
|
63
|
+
Native publishing drivers cover Bluesky, X, LinkedIn, Mastodon, Instagram and
|
|
64
|
+
Threads. publishingDriver/platform options and toDriverIdentity map the actual
|
|
65
|
+
account/instance/URN fields; socialPublishTarget resolves a complete target,
|
|
66
|
+
including a Bluesky session, and publishAs(platform, post, identity?, env?) sends
|
|
67
|
+
through it. PublishPostInput/PublishedPost/SocialPublishingDriver are exported
|
|
68
|
+
contracts. Read their driver methods before using media, metrics, deletion,
|
|
69
|
+
refresh or profile functionality; support differs per provider.
|
|
70
|
+
|
|
71
|
+
## Authorization and operational limits
|
|
72
|
+
|
|
73
|
+
The native terminal consent helper in authorize.ts currently supports X only.
|
|
74
|
+
It uses loopback callback URI, checked state and PKCE; offline.access supplies
|
|
75
|
+
refresh credentials. Declaring another publishing platform does not make the
|
|
76
|
+
same interactive consent helper support it. Stored tokens, platform account
|
|
77
|
+
access and provider app registration remain prerequisites.
|
|
78
|
+
|
|
79
|
+
Drafting or reviewing a post does not itself authorize publishAs, deletion,
|
|
80
|
+
credential writes or a consent flow. Use the task's explicit authorization for
|
|
81
|
+
those actions. Local driver/request tests establish behavior, not live platform
|
|
82
|
+
conformance or successful publication for arbitrary accounts.
|
|
83
|
+
|
|
84
|
+
## Source and evidence
|
|
85
|
+
|
|
86
|
+
`storage/framework/core/socials/src/index.ts`, registry.ts, abstract.ts,
|
|
87
|
+
handoff.ts, identities.ts, publish.ts, authorize.ts, meta-graph.ts and drivers/.
|
|
88
|
+
Tests: registry.test.ts, apple.test.ts, session-handoff.test.ts,
|
|
89
|
+
identities.test.ts, publish.test.ts, authorize.test.ts,
|
|
90
|
+
credentials-stay-out-of-output.test.ts and meta-graph.test.ts.
|