create-ailk 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +87 -14
- package/component-catalog.json +735 -95
- package/component-catalog.md +13 -7
- package/dist/add-module-core.d.ts +22 -0
- package/dist/add-module-core.js +50 -0
- package/dist/add-module.d.ts +89 -0
- package/dist/add-module.js +334 -0
- package/dist/category-profile.d.ts +126 -0
- package/dist/category-profile.js +262 -0
- package/dist/cli.js +89 -29
- package/dist/index.d.ts +4 -2
- package/dist/index.js +6 -1
- package/dist/lib/extract-module-bundle.d.ts +56 -1
- package/dist/lib/extract-module-bundle.js +170 -14
- package/dist/lib/license-key-files.d.ts +15 -0
- package/dist/lib/license-key-files.js +102 -0
- package/dist/lib/module-license-gate.d.ts +79 -0
- package/dist/lib/module-license-gate.js +160 -12
- package/dist/lib/module-tier.d.ts +45 -16
- package/dist/lib/module-tier.js +76 -0
- package/dist/lib/pro-callout.d.ts +16 -10
- package/dist/lib/pro-callout.js +34 -3
- package/dist/license-set.d.ts +34 -0
- package/dist/license-set.js +194 -0
- package/dist/module-architecture.d.ts +20 -0
- package/dist/module-architecture.js +77 -19
- package/dist/modules/commerce/0.6.1.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
- package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
- package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
- package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
- package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
- package/dist/modules/workspace/0.6.1.tar.gz +0 -0
- package/dist/parse-args.d.ts +85 -10
- package/dist/parse-args.js +227 -15
- package/dist/programmatic.d.ts +81 -5
- package/dist/programmatic.js +291 -32
- package/dist/site-chrome.d.ts +18 -7
- package/dist/site-chrome.js +32 -14
- package/dist/site-roster.d.ts +127 -0
- package/dist/site-roster.js +499 -0
- package/dist/starter-grid.d.ts +216 -0
- package/dist/starter-grid.js +449 -0
- package/dist/surfaces.d.ts +20 -7
- package/dist/surfaces.js +204 -24
- package/dist/sync-routes.d.ts +9 -0
- package/dist/sync-routes.js +2 -2
- package/dist/template-manifest.d.ts +94 -19
- package/dist/template-manifest.js +170 -289
- package/dist/template-names.d.ts +14 -12
- package/dist/template-names.js +13 -17
- package/package.json +6 -4
- package/site-templates/_base/content/en/BookCall/book-call.mdx +52 -0
- package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
- package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
- package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
- package/site-templates/_base/content/en/GlossaryList/glossary.mdx +65 -0
- package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +67 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
- package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
- package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
- package/site-templates/_base/content/en/Pricing/pricing.mdx +71 -62
- package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +17 -3
- package/site-templates/_base/content/en/TermsPage/terms.mdx +2 -3
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +69 -0
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +69 -0
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +69 -0
- package/site-templates/designs/minimalism/DESIGN.md +162 -0
- package/site-templates/designs/standard/DESIGN.md +167 -0
- package/site-templates/marketing-site/DESIGN.md +59 -40
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +376 -57
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +230 -90
- package/site-templates/marketing-site/ailk-template.json +1 -0
- package/site-templates/marketing-site-free/DESIGN.md +59 -40
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +323 -63
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +323 -113
- package/site-templates/marketing-site-free/ailk-template.json +3 -2
- package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
- package/site-templates/minimalism-site/DESIGN.md +54 -40
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +246 -19
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +173 -51
- package/site-templates/minimalism-site/ailk-template.json +3 -2
- package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +3 -37
- package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/saas-product/DESIGN.md +59 -40
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +369 -0
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +302 -0
- package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
- package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
- package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
- package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/shapes/local-business-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
- package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
- package/site-templates/shapes/local-business-service/provenance.json +4 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +362 -0
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +300 -0
- package/site-templates/shapes/organization-service/ailk-template.json +10 -0
- package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
- package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
- package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/shapes/organization-service/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/shapes/organization-service/content/en/ServicesList/services.mdx +72 -0
- package/site-templates/shapes/organization-service/provenance.json +4 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +369 -0
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +299 -0
- package/site-templates/shapes/person-service/ailk-template.json +10 -0
- package/site-templates/shapes/person-service/content/_site.mdx +85 -0
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
- package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +169 -0
- package/site-templates/shapes/person-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
- package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
- package/site-templates/shapes/person-service/provenance.json +4 -0
- package/templates/.claude/settings.json +15 -0
- package/templates/.claude/skills/README.md +10 -9
- package/templates/.claude/skills/{scaffold-auth → add-auth}/SKILL.md +7 -7
- package/templates/.claude/skills/{scaffold-auth → add-auth}/references/env-vars.md +2 -2
- package/templates/.claude/skills/{scaffold-auth → add-auth}/references/oauth-app-setup.md +3 -3
- package/templates/.claude/skills/{scaffold-page → add-page}/SKILL.md +76 -62
- package/templates/.claude/skills/add-page/references/page-types.md +115 -0
- package/templates/.claude/skills/{scaffold-page → add-page}/templates/content.mdx.tmpl +4 -4
- package/templates/.claude/skills/{scaffold-page → add-page}/templates/route.tsx.tmpl +1 -1
- package/templates/.claude/skills/{audit-site → check-site}/SKILL.md +16 -17
- package/templates/.claude/skills/{audit-site → check-site}/references/common-errors.md +3 -3
- package/templates/.claude/skills/{audit-site → check-site}/references/findings-glossary.md +16 -14
- package/templates/.claude/skills/{audit-site → check-site}/references/severity-levels.md +1 -1
- package/templates/.claude/skills/fill-page/SKILL.md +180 -0
- package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +80 -0
- package/templates/.claude/skills/fill-page/references/section-sources.md +41 -0
- package/templates/.claude/skills/setup-database/SKILL.md +156 -0
- package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
- package/templates/.claude/skills/{provision-config → setup-deploy}/SKILL.md +73 -41
- package/templates/.claude/skills/{provision-config → setup-deploy}/references/env-vars-template.md +21 -30
- package/templates/.claude/skills/setup-deploy/references/runbook-template.md +204 -0
- package/templates/.claude/skills/{provision-config → setup-deploy}/references/vercel-json-template.md +1 -1
- package/templates/.claude/skills/upgrade-plan/SKILL.md +117 -0
- package/templates/.claude/skills/upgrade-plan/references/options.md +24 -0
- package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +527 -0
- package/templates/.github/workflows/ci.yml +5 -0
- package/templates/CLAUDE.md +8 -2
- package/templates/DESIGN.md +56 -44
- package/templates/README.md +116 -46
- package/templates/apps/api/.env.example +2 -1
- package/templates/apps/api/CLAUDE.md +3 -2
- package/templates/apps/api/package.json +1 -1
- package/templates/apps/api/src/config/__tests__/index.test.ts +146 -10
- package/templates/apps/api/src/config/index.ts +46 -14
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
- package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
- package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
- package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
- package/templates/apps/api/src/lib/license-key-store.ts +45 -0
- package/templates/apps/api/src/lib/site.ts +5 -3
- package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +97 -0
- package/templates/apps/api/src/middleware/auth.ts +9 -0
- package/templates/apps/api/src/openapi/spec.ts +63 -12
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +127 -5
- package/templates/apps/api/src/routes/content/get-page.ts +86 -2
- package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
- package/templates/apps/api/src/routes/leads/index.ts +46 -1
- package/templates/apps/api/src/server.ts +13 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
- package/templates/apps/api/src/services/lead-routing.ts +140 -30
- package/templates/apps/api/src/services/leads-inbox.ts +48 -11
- package/templates/apps/mcp/__tests__/audit-single-page.test.ts +75 -1
- package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +57 -9
- package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
- package/templates/apps/mcp/package.json +2 -1
- package/templates/apps/mcp/src/index.ts +7 -0
- package/templates/apps/mcp/src/lib/audit-single-page.ts +36 -10
- package/templates/apps/mcp/src/lib/license-key-store.ts +45 -0
- package/templates/apps/mcp/src/tools/create_project.ts +21 -6
- package/templates/apps/web/__tests__/setup.ts +18 -0
- package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +10 -2
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +2 -2
- package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +10 -4
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +22 -14
- package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +26 -18
- package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +12 -4
- package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +35 -4
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +49 -9
- package/templates/apps/web/app/[locale]/book-a-call/page.tsx +50 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +3 -4
- package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +67 -29
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +94 -11
- package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +228 -86
- package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
- package/templates/apps/web/app/[locale]/contact/page.tsx +115 -7
- package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
- package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +3 -4
- package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +4 -5
- package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
- package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
- package/templates/apps/web/app/[locale]/glossary/page.tsx +50 -0
- package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/how-to/page.tsx +25 -15
- package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/layout.tsx +146 -52
- package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
- package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
- package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +142 -0
- package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
- package/templates/apps/web/app/[locale]/portfolio/page.tsx +49 -0
- package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +4 -5
- package/templates/apps/web/app/[locale]/{cancellation → purchase-policy}/page.tsx +15 -10
- package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +4 -5
- package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +14 -1
- package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/software/page.tsx +25 -15
- package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/tech-articles/page.tsx +25 -15
- package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +3 -4
- package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +63 -0
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +3 -4
- package/templates/apps/web/app/[locale]/use-cases/page.tsx +15 -2
- package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/whitepapers/page.tsx +25 -15
- package/templates/apps/web/app/error-fallback.tsx +17 -45
- package/templates/apps/web/app/not-found.tsx +14 -38
- package/templates/apps/web/app/og/route.tsx +6 -0
- package/templates/apps/web/eslint.config.mjs +3 -0
- package/templates/apps/web/instrumentation.ts +14 -0
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +38 -0
- package/templates/apps/web/lib/license-key-store.ts +52 -0
- package/templates/apps/web/lib/nav-config.ts +82 -18
- package/templates/apps/web/lib/prisma-for-auth.ts +9 -6
- package/templates/apps/web/lib/site-brand.tsx +1 -1
- package/templates/apps/web/lib/site-chrome.ts +3 -3
- package/templates/apps/web/lib/site-identity.ts +148 -0
- package/templates/apps/web/lib/site-theme.ts +11 -0
- package/templates/apps/web/messages/en.json +78 -37
- package/templates/apps/web/public/android-chrome-192x192.png +0 -0
- package/templates/apps/web/public/android-chrome-512x512.png +0 -0
- package/templates/apps/web/public/apple-touch-icon.png +0 -0
- package/templates/apps/web/public/favicon-16x16.png +0 -0
- package/templates/apps/web/public/favicon-32x32.png +0 -0
- package/templates/apps/web/public/favicon.ico +0 -0
- package/templates/apps/web/public/favicon.svg +3 -3
- package/templates/apps/web/public/logomark.svg +6 -3
- package/templates/apps/web/public/logos/ai-launch-kit-light.svg +4 -0
- package/templates/apps/web/public/logos/ai-launch-kit.svg +4 -0
- package/templates/apps/web/public/logos/atomic-agent-light.svg +4 -0
- package/templates/apps/web/public/logos/atomic-agent.svg +4 -0
- package/templates/apps/web/public/logos/salessmyth-light.svg +4 -0
- package/templates/apps/web/public/logos/salessmyth.svg +4 -0
- package/templates/apps/web/public/site.webmanifest +4 -4
- package/templates/apps/web/public/wordmark-light.svg +4 -0
- package/templates/apps/web/public/wordmark.svg +3 -3
- package/templates/apps/web/security-headers.config.ts +5 -1
- package/templates/content/_site.mdx +25 -0
- package/templates/content/en/AboutPage/about.mdx +150 -144
- package/templates/content/en/BlogList/blog.mdx +126 -0
- package/templates/content/en/ContactPage/contact.mdx +21 -92
- package/templates/content/en/FAQPage/faq.mdx +86 -57
- package/templates/content/en/HomePage/home.mdx +268 -217
- package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +181 -0
- package/templates/content/en/UseCasesList/use-cases.mdx +170 -0
- package/templates/database/CHANGELOG.md +14 -0
- package/templates/database/package.json +1 -1
- package/templates/package.json +3 -1
- package/templates/tools/lint-architecture.ts +315 -0
- package/templates/tools/tsconfig.json +14 -0
- package/versions.json +33 -33
- package/site-templates/simple-service/DESIGN.md +0 -148
- package/site-templates/simple-service/TEMPLATE-MANIFEST.json +0 -240
- package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -278
- package/site-templates/simple-service/ailk-template.json +0 -10
- package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -67
- package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
- package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
- package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
- package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
- package/site-templates/simple-service/provenance.json +0 -4
- package/templates/.claude/skills/add-schema/SKILL.md +0 -277
- package/templates/.claude/skills/add-schema/references/conflict-handling.md +0 -200
- package/templates/.claude/skills/add-schema/references/file-finding.md +0 -123
- package/templates/.claude/skills/add-schema/references/schema-types.md +0 -234
- package/templates/.claude/skills/provision-config/references/runbook-template.md +0 -248
- package/templates/.claude/skills/scaffold-page/references/page-types.md +0 -169
- package/templates/.claude/skills/suggest-site-pages/SKILL.md +0 -242
- package/templates/.claude/skills/suggest-site-pages/references/categories.md +0 -287
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -150
- package/templates/apps/web/app/[locale]/returns/page.tsx +0 -44
- package/templates/apps/web/app/[locale]/shipping/page.tsx +0 -44
- package/templates/content/en/CancellationPolicyPage/cancellation.mdx +0 -108
- package/templates/content/en/LandingPage/blog.mdx +0 -83
- package/templates/content/en/LandingPage/features.mdx +0 -103
- package/templates/content/en/LandingPage/how-it-works.mdx +0 -143
- package/templates/content/en/ReturnsPolicyPage/returns.mdx +0 -108
- package/templates/content/en/ShippingPolicyPage/shipping.mdx +0 -108
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
---
|
|
2
|
-
name:
|
|
3
|
-
description: Emit deploy configuration for an AILK consumer site — `vercel.json`, `.env.example`, and `RUNBOOK.md`. Vercel-only at v1; other platforms reject with a clear "not yet supported" message. Use when the user asks "set up Vercel", "provision deploy config", "what env vars do I need for production?", "I'm ready to ship to Vercel", or otherwise asks about pre-deploy file setup.
|
|
2
|
+
name: setup-deploy
|
|
3
|
+
description: Emit deploy configuration for an AILK consumer site — `vercel.json`, `.env.example`, and `RUNBOOK.md`. Vercel-only at v1; other platforms reject with a clear "not yet supported" message. Use when the user asks "set up Vercel", "provision deploy config", "what env vars do I need for production?", "I'm ready to ship to Vercel", or otherwise asks about pre-deploy file setup. Asks where leads should go — the email key (`RESEND_API_KEY` + the two notification addresses) or a database (`setup-database`) — and warns when neither is set. The RUNBOOK documents the two lead destinations: Email (default) and Lead inbox (setup-database).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
#
|
|
6
|
+
# setup-deploy
|
|
7
7
|
|
|
8
8
|
Emit `vercel.json`, `.env.example`, and `RUNBOOK.md` at the consumer's
|
|
9
9
|
project root, ready for a Vercel deploy. Vercel is the only valid
|
|
@@ -42,9 +42,11 @@ Skip this skill when:
|
|
|
42
42
|
(merge / overwrite / skip) before writing.
|
|
43
43
|
- Emit the three artifacts at the consumer's project root, derived
|
|
44
44
|
from templates in `references/`.
|
|
45
|
+
- Ask where leads go (Step 5a) — the email key, or a database via
|
|
46
|
+
`setup-database` — and warn, verbatim, when neither is set.
|
|
45
47
|
- Validate the emitted output (parse `vercel.json` as JSON, check
|
|
46
48
|
`.env.example` covers required vars, confirm `RUNBOOK.md` has the
|
|
47
|
-
|
|
49
|
+
two lead-destination headings).
|
|
48
50
|
|
|
49
51
|
**Does not:**
|
|
50
52
|
|
|
@@ -64,15 +66,13 @@ Skip this skill when:
|
|
|
64
66
|
Default platform is `vercel`. If the consumer asks for any other
|
|
65
67
|
platform, respond:
|
|
66
68
|
|
|
67
|
-
> "`
|
|
69
|
+
> "`setup-deploy` is Vercel-only at v1. Netlify / Cloudflare /
|
|
68
70
|
> Render / Fly / self-host support are tracked at the upstream repo —
|
|
69
71
|
> file an issue at <https://github.com/working-theory-labs/ai-launch-kit/issues>
|
|
70
72
|
> if your platform is missing.
|
|
71
73
|
>
|
|
72
74
|
> Cloudflare is deferred entirely (deploy target + KV/D1/R2 data
|
|
73
|
-
> layer) as a coherent follow-up.
|
|
74
|
-
> persistence per platform because Workers lack the Node `fs` API
|
|
75
|
-
> the JSONL fallback depends on."
|
|
75
|
+
> layer) as a coherent follow-up."
|
|
76
76
|
|
|
77
77
|
Then stop. Do not emit any files.
|
|
78
78
|
|
|
@@ -100,11 +100,11 @@ Wait for the consumer's choice per file. Do not blindly overwrite.
|
|
|
100
100
|
**Merge logic — `.env.example`:** if a var listed in
|
|
101
101
|
`references/env-vars-template.md` is **missing** from the existing
|
|
102
102
|
file, append it (with comment) at the bottom under a "## Added by
|
|
103
|
-
|
|
103
|
+
setup-deploy" section. Vars already present are not modified.
|
|
104
104
|
|
|
105
|
-
**Merge logic — `RUNBOOK.md`:** if
|
|
106
|
-
|
|
107
|
-
|
|
105
|
+
**Merge logic — `RUNBOOK.md`:** if the "Leads — where messages go"
|
|
106
|
+
section (with its two headings, `Email (default)` and
|
|
107
|
+
`Lead inbox (setup-database)`) is missing from the existing file,
|
|
108
108
|
append it at the end. Existing sections are not modified.
|
|
109
109
|
|
|
110
110
|
**Merge logic — `vercel.json`:** **not supported.** `vercel.json` is
|
|
@@ -144,9 +144,37 @@ NextAuth secrets.
|
|
|
144
144
|
After write, count the declared vars and confirm the count matches
|
|
145
145
|
the template's expected count. If a var the consumer's site uses
|
|
146
146
|
(grep `process.env.X` from a quick scan) is missing from the
|
|
147
|
-
template, add it under "## Added by
|
|
147
|
+
template, add it under "## Added by setup-deploy" — never silently
|
|
148
148
|
omit a var the consumer needs.
|
|
149
149
|
|
|
150
|
+
### Step 5a — Lead delivery
|
|
151
|
+
|
|
152
|
+
Where a contact-form message goes is decided by the API project's
|
|
153
|
+
environment (RUNBOOK § "Leads — where messages go"). Ask the consumer
|
|
154
|
+
two questions:
|
|
155
|
+
|
|
156
|
+
1. **Will this site use a database?** If yes, point them to the
|
|
157
|
+
`setup-database` skill — it provisions Postgres, sets
|
|
158
|
+
`DATABASE_URL`, runs migrations and verifies a test lead reaches
|
|
159
|
+
the inbox. Do not collect a connection string here.
|
|
160
|
+
2. **What email should messages go to?** Ask for
|
|
161
|
+
`RESEND_API_KEY`, `AILK_LEAD_NOTIFICATION_TO` (their address) and
|
|
162
|
+
`AILK_LEAD_NOTIFICATION_FROM` (a sender on their Resend-verified
|
|
163
|
+
domain). All three are needed — a key alone sends nothing. Write
|
|
164
|
+
**placeholders only** into `.env.example`; tell the consumer to set
|
|
165
|
+
the real values in the **API** project's dashboard. Never write a
|
|
166
|
+
key into a file.
|
|
167
|
+
|
|
168
|
+
If the consumer provides neither a database nor all three email
|
|
169
|
+
values, print this, verbatim:
|
|
170
|
+
|
|
171
|
+
> ⚠ No lead destination is set. In production your contact page will show
|
|
172
|
+
> your contact email instead of the form, and no messages will be collected.
|
|
173
|
+
> Run setup-database, or set RESEND_API_KEY, AILK_LEAD_NOTIFICATION_TO and
|
|
174
|
+
> AILK_LEAD_NOTIFICATION_FROM on the API project.
|
|
175
|
+
|
|
176
|
+
Then continue — the warning does not stop the deploy config.
|
|
177
|
+
|
|
150
178
|
### Step 6 — Emit `RUNBOOK.md`
|
|
151
179
|
|
|
152
180
|
Use the template at `references/runbook-template.md`. The emitted
|
|
@@ -154,26 +182,24 @@ runbook has these sections:
|
|
|
154
182
|
|
|
155
183
|
1. **Pre-deploy checklist** — what to set in Vercel's project
|
|
156
184
|
dashboard before clicking Deploy.
|
|
157
|
-
2. **
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
Postgres-via-`@working-theory/database`). All three must be present. If any
|
|
176
|
-
is missing, the skill has a bug — flag with the literal error.
|
|
185
|
+
2. **Leads — where messages go** — the two lead destinations, in
|
|
186
|
+
plain words:
|
|
187
|
+
- **Email (default)** — no database; each message is emailed to
|
|
188
|
+
the owner (`RESEND_API_KEY`, `AILK_LEAD_NOTIFICATION_TO`,
|
|
189
|
+
`AILK_LEAD_NOTIFICATION_FROM` on the API project).
|
|
190
|
+
- **Lead inbox (setup-database)** — `DATABASE_URL` set; messages
|
|
191
|
+
land in `/leads` and newsletter signups are collected.
|
|
192
|
+
With neither, production `/contact` shows the site's contact email
|
|
193
|
+
instead of the form. On a non-Vercel host, the API process needs
|
|
194
|
+
`NODE_ENV=production`.
|
|
195
|
+
3. **Custom domain + DNS** — pointer at Vercel's domain docs.
|
|
196
|
+
4. **Production callbacks for OAuth** — for consumers who used
|
|
197
|
+
`add-auth` and need to register prod redirect URIs.
|
|
198
|
+
|
|
199
|
+
After write, grep the RUNBOOK for the two lead-destination headings
|
|
200
|
+
(`Email (default)`, `Lead inbox (setup-database)`). Both must be
|
|
201
|
+
present. If either is missing, the skill has a bug — flag with the
|
|
202
|
+
literal error.
|
|
177
203
|
|
|
178
204
|
### Step 7 — Closing summary
|
|
179
205
|
|
|
@@ -181,8 +207,9 @@ Print:
|
|
|
181
207
|
|
|
182
208
|
- Which artifacts were emitted vs skipped (per consumer's Step 3
|
|
183
209
|
choices).
|
|
184
|
-
-
|
|
185
|
-
|
|
210
|
+
- Where leads will go (email, the lead inbox, or — with the Step 5a
|
|
211
|
+
warning repeated — nowhere), with a pointer to `RUNBOOK.md`'s
|
|
212
|
+
"Leads — where messages go" section.
|
|
186
213
|
- A reminder that Vercel project-level env-vars need to be set in
|
|
187
214
|
the Vercel dashboard before deploy — `.env.example` is the
|
|
188
215
|
contract, not the values.
|
|
@@ -203,8 +230,10 @@ Before reporting "done":
|
|
|
203
230
|
|
|
204
231
|
- `vercel.json` parses as JSON ✓
|
|
205
232
|
- `.env.example` declares >= the count of vars in the template ✓
|
|
206
|
-
- `RUNBOOK.md` contains
|
|
207
|
-
|
|
233
|
+
- `RUNBOOK.md` contains both lead-destination headings
|
|
234
|
+
(`Email (default)`, `Lead inbox (setup-database)`) ✓
|
|
235
|
+
- Step 5a ran: the consumer chose a lead destination, or saw the
|
|
236
|
+
no-destination warning ✓
|
|
208
237
|
|
|
209
238
|
If any check fails, surface the failure to the consumer (not silent).
|
|
210
239
|
|
|
@@ -214,7 +243,7 @@ If any check fails, surface the failure to the consumer (not silent).
|
|
|
214
243
|
`vercel deploy`'s job.
|
|
215
244
|
- That env-var values in the consumer's Vercel dashboard are
|
|
216
245
|
correct or live. The skill never reads dashboard state.
|
|
217
|
-
- That OAuth callback URLs in `
|
|
246
|
+
- That OAuth callback URLs in `add-auth`'s RUNBOOK are
|
|
218
247
|
registered in production OAuth apps. That's the consumer's job
|
|
219
248
|
pre-launch.
|
|
220
249
|
|
|
@@ -223,12 +252,15 @@ If any check fails, surface the failure to the consumer (not silent).
|
|
|
223
252
|
- `references/vercel-json-template.md` — minimal viable `vercel.json`.
|
|
224
253
|
- `references/env-vars-template.md` — `.env.example` structure with
|
|
225
254
|
placeholder values per category.
|
|
226
|
-
- `references/runbook-template.md` — `RUNBOOK.md` with the
|
|
227
|
-
|
|
255
|
+
- `references/runbook-template.md` — `RUNBOOK.md` with the two lead
|
|
256
|
+
destinations (Email (default), Lead inbox (setup-database)).
|
|
228
257
|
|
|
229
258
|
## Coordination
|
|
230
259
|
|
|
231
|
-
- **`
|
|
260
|
+
- **`setup-database`** — takes a site from no database to a working
|
|
261
|
+
lead inbox. Step 5a hands off to it; this skill never collects a
|
|
262
|
+
connection string.
|
|
263
|
+
- **`add-auth`** — produces its own `RUNBOOK.md`
|
|
232
264
|
sections for OAuth setup (dev callback URLs). This skill's
|
|
233
265
|
RUNBOOK adds production callback URLs and merges with any
|
|
234
266
|
existing runbook content (not blindly overwrites).
|
package/templates/.claude/skills/{provision-config → setup-deploy}/references/env-vars-template.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `.env.example` Template
|
|
2
2
|
|
|
3
|
-
The structure the `
|
|
3
|
+
The structure the `setup-deploy` skill emits at the consumer's
|
|
4
4
|
project root. Placeholder values only — the skill never echoes a
|
|
5
5
|
real secret.
|
|
6
6
|
|
|
@@ -28,11 +28,23 @@ CONTENT_BACKEND=mdx
|
|
|
28
28
|
# Override the content directory. Default is <repo-root>/content.
|
|
29
29
|
# AILK_CONTENT_ROOT=
|
|
30
30
|
|
|
31
|
-
# ──
|
|
32
|
-
#
|
|
33
|
-
#
|
|
34
|
-
#
|
|
31
|
+
# ── Lead delivery ────────────────────────────────────────────────
|
|
32
|
+
# Where contact-form messages go (RUNBOOK.md § "Leads — where
|
|
33
|
+
# messages go"). Set these on the API project.
|
|
34
|
+
#
|
|
35
|
+
# Lead inbox — set by the `setup-database` skill. With it, messages
|
|
36
|
+
# land in /leads and newsletter signups are collected.
|
|
35
37
|
# DATABASE_URL=postgres://user:pass@host:5432/db
|
|
38
|
+
# DATABASE_URL_NON_POOLED=postgres://user:pass@host:5432/db
|
|
39
|
+
#
|
|
40
|
+
# Email (default) — with no database, each message is emailed to you.
|
|
41
|
+
# All three are required; a key alone sends nothing.
|
|
42
|
+
# RESEND_API_KEY=
|
|
43
|
+
# AILK_LEAD_NOTIFICATION_TO=you@your-domain.com
|
|
44
|
+
# AILK_LEAD_NOTIFICATION_FROM=leads@your-domain.com
|
|
45
|
+
#
|
|
46
|
+
# With neither, /contact shows your contact email (content/_site.mdx
|
|
47
|
+
# `contactEmail`) instead of the form in production.
|
|
36
48
|
|
|
37
49
|
# ── Auth — required env vars ─────────────────────────────────────
|
|
38
50
|
# Set to "1" to require sign-in for protected routes; default is
|
|
@@ -78,11 +90,6 @@ CONTENT_BACKEND=mdx
|
|
|
78
90
|
# Webhooks → <endpoint> → Signing secret. Format: whsec_*.
|
|
79
91
|
# STRIPE_WEBHOOK_SECRET=
|
|
80
92
|
|
|
81
|
-
# ── Email provider (Resend) ──────────────────────────────────────
|
|
82
|
-
# Used by transactional senders outside auth (e.g., contact form).
|
|
83
|
-
# Same Resend account as magic-link if both are configured.
|
|
84
|
-
# RESEND_API_KEY=
|
|
85
|
-
|
|
86
93
|
# ── Analytics — all off by default ───────────────────────────────
|
|
87
94
|
# Each provider is independent. Set the env var(s) to enable.
|
|
88
95
|
#
|
|
@@ -105,26 +112,11 @@ CONTENT_BACKEND=mdx
|
|
|
105
112
|
# Get the token from search.google.com/search-console → Settings →
|
|
106
113
|
# Ownership verification → HTML tag. Paste only the content="..." value.
|
|
107
114
|
# GOOGLE_SITE_VERIFICATION=
|
|
108
|
-
|
|
109
|
-
# ── Persistent leads (optional) ──────────────────────────────────
|
|
110
|
-
# By default, leads.jsonl is written to apps/api/leads.jsonl. On
|
|
111
|
-
# Vercel's ephemeral filesystem this does NOT persist across cold
|
|
112
|
-
# starts. See RUNBOOK.md § "Persistence upgrade" for the three
|
|
113
|
-
# named upgrade paths.
|
|
114
|
-
#
|
|
115
|
-
# Vercel KV (drop-in):
|
|
116
|
-
# KV_REST_API_URL=
|
|
117
|
-
# KV_REST_API_TOKEN=
|
|
118
|
-
#
|
|
119
|
-
# Supabase (Postgres + auth + storage):
|
|
120
|
-
# NEXT_PUBLIC_SUPABASE_URL=
|
|
121
|
-
# NEXT_PUBLIC_SUPABASE_ANON_KEY=
|
|
122
|
-
# SUPABASE_SERVICE_ROLE_KEY=
|
|
123
115
|
```
|
|
124
116
|
|
|
125
117
|
## Categories the skill emits
|
|
126
118
|
|
|
127
|
-
The template above groups vars into
|
|
119
|
+
The template above groups vars into six categories. Every emitted
|
|
128
120
|
`.env.example` should hit each category at least with its header
|
|
129
121
|
comment, even if the consumer hasn't activated any vars in that
|
|
130
122
|
category — the comment block tells future-them what's available.
|
|
@@ -133,11 +125,10 @@ Categories:
|
|
|
133
125
|
|
|
134
126
|
1. Marketing / canonical domain
|
|
135
127
|
2. Content backend
|
|
136
|
-
3.
|
|
128
|
+
3. Lead delivery (database or email)
|
|
137
129
|
4. Auth — required + per-provider
|
|
138
130
|
5. Stripe (sandbox-only)
|
|
139
|
-
6.
|
|
140
|
-
7. Persistent leads (optional)
|
|
131
|
+
6. Analytics
|
|
141
132
|
|
|
142
133
|
## What the skill never includes
|
|
143
134
|
|
|
@@ -177,7 +168,7 @@ Step 3) offers merge / overwrite / skip. Merge logic:
|
|
|
177
168
|
4. Vars **missing** are appended at the end of the existing file
|
|
178
169
|
under a new section:
|
|
179
170
|
```
|
|
180
|
-
# ── Added by
|
|
171
|
+
# ── Added by setup-deploy ────────────────────────────────
|
|
181
172
|
```
|
|
182
173
|
|
|
183
174
|
This avoids duplicating vars while still surfacing additions the
|
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
# `RUNBOOK.md` Template
|
|
2
|
+
|
|
3
|
+
The `setup-deploy` skill emits this runbook at the consumer's
|
|
4
|
+
project root. It documents pre-deploy steps and where the site's
|
|
5
|
+
leads go — the two lead destinations, **Email (default)** and
|
|
6
|
+
**Lead inbox (setup-database)**.
|
|
7
|
+
|
|
8
|
+
The skill must verify both lead-destination headings are present
|
|
9
|
+
after emit (per SKILL.md Step 6 validation). If either is missing,
|
|
10
|
+
the skill has a bug.
|
|
11
|
+
|
|
12
|
+
## Template
|
|
13
|
+
|
|
14
|
+
```markdown
|
|
15
|
+
# RUNBOOK — Production Operations
|
|
16
|
+
|
|
17
|
+
This runbook is generated by the `setup-deploy` skill. It covers
|
|
18
|
+
what to do before and after deploying to Vercel, plus the
|
|
19
|
+
operational caveats AILK ships with.
|
|
20
|
+
|
|
21
|
+
If you re-run `setup-deploy`, new sections may be appended at
|
|
22
|
+
the end under "## Added by setup-deploy." Existing sections are
|
|
23
|
+
not modified by the skill.
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Pre-deploy checklist
|
|
28
|
+
|
|
29
|
+
Before you click Deploy in Vercel:
|
|
30
|
+
|
|
31
|
+
- [ ] **Add a Vercel project** pointed at this repo
|
|
32
|
+
(`vercel link` from the CLI, or the dashboard).
|
|
33
|
+
- [ ] **Set environment variables** in Vercel's project dashboard
|
|
34
|
+
(Settings → Environment Variables). Use `.env.example` as the
|
|
35
|
+
contract — every variable listed there should have a value
|
|
36
|
+
set in Vercel before deploy.
|
|
37
|
+
- [ ] **Configure your custom domain** if you have one (Vercel
|
|
38
|
+
Project → Settings → Domains). Vercel handles TLS automatically.
|
|
39
|
+
- [ ] **Pick where leads go** — see "Leads — where messages go"
|
|
40
|
+
below. With neither an email key nor a database, your contact
|
|
41
|
+
page shows your contact email instead of the form in
|
|
42
|
+
production, and no messages are collected.
|
|
43
|
+
- [ ] **On a host other than Vercel**, set `NODE_ENV=production` on
|
|
44
|
+
the API process — that is how it knows it is in production.
|
|
45
|
+
- [ ] **Register production OAuth callbacks** if you used
|
|
46
|
+
`add-auth` and activated Google or GitHub. Each provider
|
|
47
|
+
needs the prod callback URL added to its OAuth app settings.
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Leads — where messages go
|
|
52
|
+
|
|
53
|
+
Where a contact-form message goes depends only on what you set on
|
|
54
|
+
the **API** project:
|
|
55
|
+
|
|
56
|
+
| You set | A message… |
|
|
57
|
+
| ----------------------------------------- | -------------------------------------------- |
|
|
58
|
+
| `DATABASE_URL` | lands in your lead inbox at `/leads` |
|
|
59
|
+
| the three email variables, no database | is emailed to you |
|
|
60
|
+
| neither (production) | is not collected — `/contact` shows your contact email instead of the form |
|
|
61
|
+
| neither (`pnpm dev`) | is written to a local file, for testing |
|
|
62
|
+
|
|
63
|
+
A newsletter signup needs the database: without one, `/newsletter`
|
|
64
|
+
offers no signup form. A visitor is never told a message was sent
|
|
65
|
+
when it reached nobody.
|
|
66
|
+
|
|
67
|
+
### Email (default)
|
|
68
|
+
|
|
69
|
+
**When to pick:** you want messages in your inbox with no database
|
|
70
|
+
to run. This is the default for a new site.
|
|
71
|
+
|
|
72
|
+
**Setup:**
|
|
73
|
+
|
|
74
|
+
1. Create an API key at <https://resend.com/api-keys> and verify the
|
|
75
|
+
domain you will send from (Resend Dashboard → Domains).
|
|
76
|
+
2. On the **API** project in Vercel (Settings → Environment
|
|
77
|
+
Variables), set:
|
|
78
|
+
- `RESEND_API_KEY` — the key.
|
|
79
|
+
- `AILK_LEAD_NOTIFICATION_TO` — the address messages go to (yours).
|
|
80
|
+
- `AILK_LEAD_NOTIFICATION_FROM` — a sender on your verified domain.
|
|
81
|
+
3. Redeploy the API.
|
|
82
|
+
|
|
83
|
+
All three are required: a key without both addresses sends nothing.
|
|
84
|
+
If Resend refuses a message, the visitor is told it could not be
|
|
85
|
+
sent, so they can try again or email you directly.
|
|
86
|
+
|
|
87
|
+
### Lead inbox (setup-database)
|
|
88
|
+
|
|
89
|
+
**When to pick:** you want every message kept, searchable, in a
|
|
90
|
+
lead inbox you review signed in — and newsletter signups collected.
|
|
91
|
+
|
|
92
|
+
**Setup:** run the `setup-database` skill ("set up the database"). It
|
|
93
|
+
walks you through provisioning Postgres, setting `DATABASE_URL`,
|
|
94
|
+
running migrations, pinning you as the owner
|
|
95
|
+
(`AILK_OPERATOR_EMAIL`), and sending one test message that must
|
|
96
|
+
appear in `/leads` before it reports done. If the email variables
|
|
97
|
+
are also set, you still get an email for each new lead.
|
|
98
|
+
|
|
99
|
+
---
|
|
100
|
+
|
|
101
|
+
## Custom domain + DNS
|
|
102
|
+
|
|
103
|
+
Vercel handles TLS automatically once a domain is added to your
|
|
104
|
+
project. Two paths:
|
|
105
|
+
|
|
106
|
+
- **Vercel-managed DNS** — let Vercel handle nameservers. Easiest;
|
|
107
|
+
Vercel Dashboard → Project → Settings → Domains → Add → "Manage
|
|
108
|
+
DNS Records."
|
|
109
|
+
- **External DNS** — add an A record (or CNAME for subdomains)
|
|
110
|
+
pointing at Vercel's IP, then add the domain to your project.
|
|
111
|
+
Vercel docs walk through it.
|
|
112
|
+
|
|
113
|
+
For email-sending domains (Resend, magic-link), you'll also need
|
|
114
|
+
to verify the sending domain in Resend's dashboard before
|
|
115
|
+
production magic-link emails will deliver. Resend Dashboard →
|
|
116
|
+
Domains → Add → DNS records → wait for verification.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Production callbacks for OAuth (if you used `add-auth`)
|
|
121
|
+
|
|
122
|
+
If you activated Google or GitHub OAuth via `add-auth`,
|
|
123
|
+
those activations used dev callback URLs (`localhost:3000`). For
|
|
124
|
+
production, add the prod callback URLs to each OAuth app:
|
|
125
|
+
|
|
126
|
+
### Google
|
|
127
|
+
|
|
128
|
+
1. Open the Google Cloud Console OAuth client you created
|
|
129
|
+
(<https://console.cloud.google.com/apis/credentials>).
|
|
130
|
+
2. Under **Authorized redirect URIs**, add:
|
|
131
|
+
`https://<your-prod-domain>/api/auth/callback/google`
|
|
132
|
+
3. Save.
|
|
133
|
+
|
|
134
|
+
### GitHub
|
|
135
|
+
|
|
136
|
+
1. Open the GitHub OAuth App you created
|
|
137
|
+
(<https://github.com/settings/developers>).
|
|
138
|
+
2. Edit either:
|
|
139
|
+
- The same app's **Authorization callback URL** to add a second
|
|
140
|
+
line for prod (GitHub allows multiple).
|
|
141
|
+
- Or create a separate OAuth App for production.
|
|
142
|
+
3. Update the env vars in Vercel if you created a separate app.
|
|
143
|
+
|
|
144
|
+
---
|
|
145
|
+
|
|
146
|
+
## When to redeploy
|
|
147
|
+
|
|
148
|
+
- After changing any `NEXT_PUBLIC_*` env var (those bake at build
|
|
149
|
+
time).
|
|
150
|
+
- After running database migrations (data shape changed).
|
|
151
|
+
- After updating `vercel.json` (deploy config changed).
|
|
152
|
+
|
|
153
|
+
You do **not** need to redeploy after:
|
|
154
|
+
|
|
155
|
+
- Adding a non-`NEXT_PUBLIC_*` env var in Vercel's dashboard
|
|
156
|
+
(server-side reads pick it up on next request).
|
|
157
|
+
- Editing MDX content in `content/` and pushing — Vercel rebuilds
|
|
158
|
+
on push.
|
|
159
|
+
|
|
160
|
+
---
|
|
161
|
+
|
|
162
|
+
## Troubleshooting
|
|
163
|
+
|
|
164
|
+
- **"My contact page shows an email address instead of the form"**
|
|
165
|
+
→ the API has no lead destination. Set the three email variables,
|
|
166
|
+
or run `setup-database` (see "Leads — where messages go").
|
|
167
|
+
- **"OAuth login redirects to localhost in production"** → you
|
|
168
|
+
haven't added the production callback URL to the OAuth app
|
|
169
|
+
(see above).
|
|
170
|
+
- **"Magic-link emails aren't arriving in production"** → your
|
|
171
|
+
Resend sender domain isn't verified yet (Resend Dashboard →
|
|
172
|
+
Domains).
|
|
173
|
+
|
|
174
|
+
---
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Section headings the validation must find
|
|
178
|
+
|
|
179
|
+
After emit, the skill must grep for these two headings (verbatim
|
|
180
|
+
match). Both must be present:
|
|
181
|
+
|
|
182
|
+
- `### Email (default)`
|
|
183
|
+
- `### Lead inbox (setup-database)`
|
|
184
|
+
|
|
185
|
+
If either is missing, the template was edited in a way that broke
|
|
186
|
+
the contract. Surface the failure to the consumer (not silent).
|
|
187
|
+
|
|
188
|
+
## Merge logic
|
|
189
|
+
|
|
190
|
+
If the consumer already has `RUNBOOK.md`, the skill (per SKILL.md
|
|
191
|
+
Step 3) offers merge / overwrite / skip. Merge logic:
|
|
192
|
+
|
|
193
|
+
1. Read the existing file.
|
|
194
|
+
2. Check whether the "Leads — where messages go" section and its two
|
|
195
|
+
lead-destination headings are already present.
|
|
196
|
+
3. Headings already present → not modified.
|
|
197
|
+
4. Headings missing → append at the end of the existing file under:
|
|
198
|
+
```
|
|
199
|
+
## Added by setup-deploy
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
The pre-deploy checklist, custom-domain, and OAuth-prod-callbacks
|
|
203
|
+
sections are also appended if missing. Sections that are already
|
|
204
|
+
present (even with different content) are not modified.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# `vercel.json` Template
|
|
2
2
|
|
|
3
|
-
The minimal viable Vercel config the `
|
|
3
|
+
The minimal viable Vercel config the `setup-deploy` skill emits.
|
|
4
4
|
Customization beyond this template is the consumer's responsibility —
|
|
5
5
|
the skill's job is to ship the consumer with a working baseline.
|
|
6
6
|
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: upgrade-plan
|
|
3
|
+
description: Explain the AI Launch Kit options — Free, Pro, Pro Plus, Agency and the commerce add-on's three rungs (Commerce, SaaS, SaaS with Usage) — side by side, with the prices the public pricing page publishes right now, read this site's own modules and shape, and recommend exactly one option with a reason. Use when the user asks "what does Pro get me?", "should I upgrade?", "compare plans", "which plan do I need?", "how much is commerce?", or types /upgrade-plan. The skill reads and explains only — it never buys, never installs, and never states a price from memory.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# upgrade-plan
|
|
7
|
+
|
|
8
|
+
Answer "what does a paid level get me, and which one should I buy?" from two
|
|
9
|
+
live sources: the public pricing page (for prices) and this repository (for
|
|
10
|
+
what the site actually uses). A bundled helper does the reading and the
|
|
11
|
+
choosing; this skill runs it and explains the result in plain words.
|
|
12
|
+
|
|
13
|
+
## When to use
|
|
14
|
+
|
|
15
|
+
- "what does Pro get me?" / "what's in Pro Plus?"
|
|
16
|
+
- "should I upgrade?" / "which plan do I need?"
|
|
17
|
+
- "compare the plans" / "how does Agency work?"
|
|
18
|
+
- "can I sell things on my site?" / "how much is the commerce add-on?"
|
|
19
|
+
- `/upgrade-plan`
|
|
20
|
+
|
|
21
|
+
Skip this skill when the user wants to actually buy or install something —
|
|
22
|
+
this skill explains and recommends; the purchase happens on the pricing
|
|
23
|
+
page, and installing a module is a separate step (see "What happens next").
|
|
24
|
+
|
|
25
|
+
## The mechanic
|
|
26
|
+
|
|
27
|
+
### Step 1 — Map the user's stated need (optional)
|
|
28
|
+
|
|
29
|
+
If the user said what they want to do, map it to one `--need` value:
|
|
30
|
+
|
|
31
|
+
| The user says… | `--need` |
|
|
32
|
+
| ------------------------------------------------- | -------------- |
|
|
33
|
+
| "I build sites for clients" | `agency` |
|
|
34
|
+
| "I want to sell / take payments" | `sell` |
|
|
35
|
+
| "my product bills its own customers on plans" | `saas` |
|
|
36
|
+
| "I bill my customers by usage / credits" | `usage` |
|
|
37
|
+
| "I need docs or a blog" | `docs` |
|
|
38
|
+
| "I need booking / scheduling" | `scheduling` |
|
|
39
|
+
| "I need organizations / teams / many workspaces" | `multi-tenant` |
|
|
40
|
+
|
|
41
|
+
If the need maps to none of these, omit `--need`, and tell the user which
|
|
42
|
+
need you could not map — the recommendation then comes from the site alone.
|
|
43
|
+
|
|
44
|
+
### Step 2 — Run the helper
|
|
45
|
+
|
|
46
|
+
From the project root:
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
pnpm exec tsx .claude/skills/upgrade-plan/scripts/upgrade-plan.ts [--need <value>]
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
It prints one JSON object:
|
|
53
|
+
|
|
54
|
+
- `pricing.status` — `ok` (the page published prices), `unpublished` (the
|
|
55
|
+
page loaded but carries no machine-readable offers) or `unreachable`
|
|
56
|
+
(network error, timeout or error status). `pricing.url` is the link to give
|
|
57
|
+
the user.
|
|
58
|
+
- `options[]` — the seven options, always all seven, each with `adds`,
|
|
59
|
+
`requires`, and `prices[]` (empty, with `status: "not published on the
|
|
60
|
+
pricing page"`, when the page does not price it).
|
|
61
|
+
- `alsoPublished[]` — other offers on the pricing page that are none of the
|
|
62
|
+
seven (for example a one-off service), with their published price.
|
|
63
|
+
- `site` — this site's `modules`, `template`, `shape`, `design`, whether it
|
|
64
|
+
already prices something (`sellsSomething`), whether commerce is installed,
|
|
65
|
+
and whether `AILK_LICENSE_KEY` is set in this shell (`licenseKeySet` —
|
|
66
|
+
presence only, never the value).
|
|
67
|
+
- `recommendation` — one `option`, its `reason`, and its `link`.
|
|
68
|
+
|
|
69
|
+
Exit status 0 in all three pricing states. Exit 2 is a usage error — re-run
|
|
70
|
+
without the argument it names.
|
|
71
|
+
|
|
72
|
+
### Step 3 — Explain it
|
|
73
|
+
|
|
74
|
+
Answer in this order, in plain words:
|
|
75
|
+
|
|
76
|
+
1. **Your site.** State the shape and the modules from `site`, the template
|
|
77
|
+
and design when recorded, whether it already prices anything, and whether
|
|
78
|
+
a licence key is set in this shell. A `null` field is "not recorded —
|
|
79
|
+
scaffolded without `--template`"; never guess a shape. If the key is not
|
|
80
|
+
set, say "not set in this shell" (a key kept only in `.env` reads that way).
|
|
81
|
+
2. **The options, side by side.** A table of all seven options: name, what it
|
|
82
|
+
adds, what it requires, and its price exactly as `prices[]` gives it
|
|
83
|
+
(figure, currency and unit text). An option with no price reads
|
|
84
|
+
"not published on the pricing page — see https://ailaunchkit.ai/pricing".
|
|
85
|
+
Then list `alsoPublished` under "Also on the pricing page".
|
|
86
|
+
3. **The recommendation.** Exactly one option — `recommendation.option` —
|
|
87
|
+
with its reason, naming the module or need that decided it. Do not offer a
|
|
88
|
+
second recommendation; you may say what would change it (for example "if
|
|
89
|
+
you add multi-tenant later, that moves you to Pro Plus").
|
|
90
|
+
4. **What happens next.** Link `recommendation.link`. After purchase the
|
|
91
|
+
licence key arrives by email; set it as `AILK_LICENSE_KEY` in your
|
|
92
|
+
environment. To install the module(s): run
|
|
93
|
+
`pnpm dlx create-ailk@latest --help`, and name `add-module` only if that
|
|
94
|
+
output lists it. Otherwise say: re-run `create-ailk` with
|
|
95
|
+
`--modules <module>` and the key set, into a new directory, and move your
|
|
96
|
+
content across.
|
|
97
|
+
|
|
98
|
+
## Hard rules
|
|
99
|
+
|
|
100
|
+
- **Never state a price that is not in the helper's output for this run.**
|
|
101
|
+
Not from memory, not from an earlier run, not from another page, not as an
|
|
102
|
+
estimate or a range. A price appears in your answer only if it appears in
|
|
103
|
+
this run's `options[].prices` or `alsoPublished`.
|
|
104
|
+
- **Unreachable means no prices.** When `pricing.status` is `unreachable`,
|
|
105
|
+
say the pricing page could not be reached, give no price for any option,
|
|
106
|
+
and link https://ailaunchkit.ai/pricing. Still show the site and the
|
|
107
|
+
recommendation — neither depends on a price.
|
|
108
|
+
- **Unpublished means no prices.** When `pricing.status` is `unpublished`,
|
|
109
|
+
say the pricing page does not publish machine-readable prices yet and link
|
|
110
|
+
https://ailaunchkit.ai/pricing.
|
|
111
|
+
- **Read-only.** Write no file and install nothing. The only outside command
|
|
112
|
+
besides the helper is the `--help` probe in step 3.
|
|
113
|
+
- **Never print the licence key.** Report only whether it is set.
|
|
114
|
+
|
|
115
|
+
## References
|
|
116
|
+
|
|
117
|
+
- `references/options.md` — the seven options in plain words.
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# The options
|
|
2
|
+
|
|
3
|
+
What each option adds and what it requires, in plain words. Names and
|
|
4
|
+
structure only — prices come from https://ailaunchkit.ai/pricing at run time,
|
|
5
|
+
never from this file.
|
|
6
|
+
|
|
7
|
+
Source: the AI Launch Kit product vocabulary (Commerce; Packaging and
|
|
8
|
+
delivery). Levels are Free, Pro and Pro Plus; Agency is an agreement, not a
|
|
9
|
+
level; Commerce, SaaS and SaaS with Usage are the three rungs of the one
|
|
10
|
+
commerce add-on, bought on top of a level.
|
|
11
|
+
|
|
12
|
+
| Option | What it adds | Requires |
|
|
13
|
+
| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | ----------------------------------------- |
|
|
14
|
+
| **Free** | The open-source base: the website, its API and MCP server, and the marketing module. Every site is agent-discoverable at this level. | Nothing — no licence key |
|
|
15
|
+
| **Pro** | The paid modules for one site — docs and blog, scheduling, signal collectors, the Admin app — kept current. | A licence key for the site |
|
|
16
|
+
| **Pro Plus** | Everything in Pro, plus the multi-tenant module: organizations, workspaces and members. | A licence key for the site |
|
|
17
|
+
| **Agency** | A reseller agreement for building sites for clients. Not a bigger level. | Each client site is licensed Pro or Pro Plus |
|
|
18
|
+
| **Commerce** | Checkout, payment links, hosted invoices, subscriptions and the customer portal, through your own Stripe account. | Any paid level (Pro or Pro Plus) |
|
|
19
|
+
| **SaaS** | Commerce plus plans, trials, coupons and entitlements mapped to feature flags — for a product that bills its tenants. | Pro Plus |
|
|
20
|
+
| **SaaS with Usage** | SaaS plus usage metering, prepaid credits, overage and spend limits. | Pro Plus |
|
|
21
|
+
|
|
22
|
+
Payment always happens on a Stripe-hosted page; the site never renders a card
|
|
23
|
+
form. Paid bookings (deposits, no-show holds) belong to the scheduling module,
|
|
24
|
+
not to Commerce.
|