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.
Files changed (324) hide show
  1. package/README.md +87 -14
  2. package/component-catalog.json +735 -95
  3. package/component-catalog.md +13 -7
  4. package/dist/add-module-core.d.ts +22 -0
  5. package/dist/add-module-core.js +50 -0
  6. package/dist/add-module.d.ts +89 -0
  7. package/dist/add-module.js +334 -0
  8. package/dist/category-profile.d.ts +126 -0
  9. package/dist/category-profile.js +262 -0
  10. package/dist/cli.js +89 -29
  11. package/dist/index.d.ts +4 -2
  12. package/dist/index.js +6 -1
  13. package/dist/lib/extract-module-bundle.d.ts +56 -1
  14. package/dist/lib/extract-module-bundle.js +170 -14
  15. package/dist/lib/license-key-files.d.ts +15 -0
  16. package/dist/lib/license-key-files.js +102 -0
  17. package/dist/lib/module-license-gate.d.ts +79 -0
  18. package/dist/lib/module-license-gate.js +160 -12
  19. package/dist/lib/module-tier.d.ts +45 -16
  20. package/dist/lib/module-tier.js +76 -0
  21. package/dist/lib/pro-callout.d.ts +16 -10
  22. package/dist/lib/pro-callout.js +34 -3
  23. package/dist/license-set.d.ts +34 -0
  24. package/dist/license-set.js +194 -0
  25. package/dist/module-architecture.d.ts +20 -0
  26. package/dist/module-architecture.js +77 -19
  27. package/dist/modules/commerce/0.6.1.tar.gz +0 -0
  28. package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
  29. package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
  30. package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
  31. package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
  32. package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
  33. package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
  34. package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
  35. package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
  36. package/dist/modules/workspace/0.6.1.tar.gz +0 -0
  37. package/dist/parse-args.d.ts +85 -10
  38. package/dist/parse-args.js +227 -15
  39. package/dist/programmatic.d.ts +81 -5
  40. package/dist/programmatic.js +291 -32
  41. package/dist/site-chrome.d.ts +18 -7
  42. package/dist/site-chrome.js +32 -14
  43. package/dist/site-roster.d.ts +127 -0
  44. package/dist/site-roster.js +499 -0
  45. package/dist/starter-grid.d.ts +216 -0
  46. package/dist/starter-grid.js +449 -0
  47. package/dist/surfaces.d.ts +20 -7
  48. package/dist/surfaces.js +204 -24
  49. package/dist/sync-routes.d.ts +9 -0
  50. package/dist/sync-routes.js +2 -2
  51. package/dist/template-manifest.d.ts +94 -19
  52. package/dist/template-manifest.js +170 -289
  53. package/dist/template-names.d.ts +14 -12
  54. package/dist/template-names.js +13 -17
  55. package/package.json +6 -4
  56. package/site-templates/_base/content/en/BookCall/book-call.mdx +52 -0
  57. package/site-templates/_base/content/en/Feature/feature-1.mdx +69 -0
  58. package/site-templates/_base/content/en/Feature/feature-2.mdx +69 -0
  59. package/site-templates/_base/content/en/Feature/feature-3.mdx +69 -0
  60. package/site-templates/_base/content/en/FeaturesList/features.mdx +91 -0
  61. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +65 -0
  62. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +67 -0
  63. package/site-templates/_base/content/en/PortfolioItem/sample-four.mdx +105 -0
  64. package/site-templates/_base/content/en/PortfolioItem/sample-one.mdx +34 -0
  65. package/site-templates/_base/content/en/PortfolioItem/sample-three.mdx +94 -0
  66. package/site-templates/_base/content/en/PortfolioItem/sample-two.mdx +45 -0
  67. package/site-templates/_base/content/en/PortfolioList/portfolio.mdx +169 -0
  68. package/site-templates/_base/content/en/Pricing/pricing.mdx +71 -62
  69. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +17 -3
  70. package/site-templates/_base/content/en/TermsPage/terms.mdx +2 -3
  71. package/site-templates/_base/content/en/UseCase/persona-1.mdx +69 -0
  72. package/site-templates/_base/content/en/UseCase/persona-2.mdx +69 -0
  73. package/site-templates/_base/content/en/UseCase/persona-3.mdx +69 -0
  74. package/site-templates/designs/minimalism/DESIGN.md +162 -0
  75. package/site-templates/designs/standard/DESIGN.md +167 -0
  76. package/site-templates/marketing-site/DESIGN.md +59 -40
  77. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +376 -57
  78. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +230 -90
  79. package/site-templates/marketing-site/ailk-template.json +1 -0
  80. package/site-templates/marketing-site-free/DESIGN.md +59 -40
  81. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +323 -63
  82. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +323 -113
  83. package/site-templates/marketing-site-free/ailk-template.json +3 -2
  84. package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +59 -0
  85. package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +199 -0
  86. package/site-templates/minimalism-site/DESIGN.md +54 -40
  87. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +246 -19
  88. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +173 -51
  89. package/site-templates/minimalism-site/ailk-template.json +3 -2
  90. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +52 -0
  91. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +3 -37
  92. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  93. package/site-templates/saas-product/DESIGN.md +59 -40
  94. package/site-templates/saas-product/TEMPLATE-MANIFEST.md +9 -1
  95. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +369 -0
  96. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +302 -0
  97. package/site-templates/shapes/local-business-service/ailk-template.json +10 -0
  98. package/site-templates/{simple-service → shapes/local-business-service}/content/en/AboutPage/about.mdx +4 -4
  99. package/site-templates/shapes/local-business-service/content/en/HomePage/home.mdx +70 -0
  100. package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  101. package/site-templates/shapes/local-business-service/content/en/PortfolioList/portfolio.mdx +171 -0
  102. package/site-templates/shapes/local-business-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  103. package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +39 -0
  104. package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +39 -0
  105. package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +39 -0
  106. package/site-templates/shapes/local-business-service/content/en/ServicesList/services.mdx +61 -0
  107. package/site-templates/shapes/local-business-service/provenance.json +4 -0
  108. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +362 -0
  109. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +300 -0
  110. package/site-templates/shapes/organization-service/ailk-template.json +10 -0
  111. package/site-templates/shapes/organization-service/content/en/AboutPage/about.mdx +38 -0
  112. package/site-templates/shapes/organization-service/content/en/HomePage/home.mdx +85 -0
  113. package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  114. package/site-templates/shapes/organization-service/content/en/PortfolioList/portfolio.mdx +171 -0
  115. package/site-templates/shapes/organization-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  116. package/site-templates/shapes/organization-service/content/en/Service/first-engagement.mdx +38 -0
  117. package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +38 -0
  118. package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +38 -0
  119. package/site-templates/shapes/organization-service/content/en/ServicesList/services.mdx +72 -0
  120. package/site-templates/shapes/organization-service/provenance.json +4 -0
  121. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +369 -0
  122. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +299 -0
  123. package/site-templates/shapes/person-service/ailk-template.json +10 -0
  124. package/site-templates/shapes/person-service/content/_site.mdx +85 -0
  125. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +39 -0
  126. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +97 -0
  127. package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +59 -0
  128. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +169 -0
  129. package/site-templates/shapes/person-service/content/en/PurchasePolicyPage/purchase-policy.mdx +123 -0
  130. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +38 -0
  131. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +38 -0
  132. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +38 -0
  133. package/site-templates/{simple-service → shapes/person-service}/content/en/ServicesList/services.mdx +16 -16
  134. package/site-templates/shapes/person-service/provenance.json +4 -0
  135. package/templates/.claude/settings.json +15 -0
  136. package/templates/.claude/skills/README.md +10 -9
  137. package/templates/.claude/skills/{scaffold-auth → add-auth}/SKILL.md +7 -7
  138. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/env-vars.md +2 -2
  139. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/oauth-app-setup.md +3 -3
  140. package/templates/.claude/skills/{scaffold-page → add-page}/SKILL.md +76 -62
  141. package/templates/.claude/skills/add-page/references/page-types.md +115 -0
  142. package/templates/.claude/skills/{scaffold-page → add-page}/templates/content.mdx.tmpl +4 -4
  143. package/templates/.claude/skills/{scaffold-page → add-page}/templates/route.tsx.tmpl +1 -1
  144. package/templates/.claude/skills/{audit-site → check-site}/SKILL.md +16 -17
  145. package/templates/.claude/skills/{audit-site → check-site}/references/common-errors.md +3 -3
  146. package/templates/.claude/skills/{audit-site → check-site}/references/findings-glossary.md +16 -14
  147. package/templates/.claude/skills/{audit-site → check-site}/references/severity-levels.md +1 -1
  148. package/templates/.claude/skills/fill-page/SKILL.md +180 -0
  149. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +80 -0
  150. package/templates/.claude/skills/fill-page/references/section-sources.md +41 -0
  151. package/templates/.claude/skills/setup-database/SKILL.md +156 -0
  152. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +154 -0
  153. package/templates/.claude/skills/{provision-config → setup-deploy}/SKILL.md +73 -41
  154. package/templates/.claude/skills/{provision-config → setup-deploy}/references/env-vars-template.md +21 -30
  155. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +204 -0
  156. package/templates/.claude/skills/{provision-config → setup-deploy}/references/vercel-json-template.md +1 -1
  157. package/templates/.claude/skills/upgrade-plan/SKILL.md +117 -0
  158. package/templates/.claude/skills/upgrade-plan/references/options.md +24 -0
  159. package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +527 -0
  160. package/templates/.github/workflows/ci.yml +5 -0
  161. package/templates/CLAUDE.md +8 -2
  162. package/templates/DESIGN.md +56 -44
  163. package/templates/README.md +116 -46
  164. package/templates/apps/api/.env.example +2 -1
  165. package/templates/apps/api/CLAUDE.md +3 -2
  166. package/templates/apps/api/package.json +1 -1
  167. package/templates/apps/api/src/config/__tests__/index.test.ts +146 -10
  168. package/templates/apps/api/src/config/index.ts +46 -14
  169. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +30 -0
  170. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +96 -0
  171. package/templates/apps/api/src/lib/lead-capture-store.ts +12 -0
  172. package/templates/apps/api/src/lib/lead-delivery.ts +52 -0
  173. package/templates/apps/api/src/lib/license-key-store.ts +45 -0
  174. package/templates/apps/api/src/lib/site.ts +5 -3
  175. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +97 -0
  176. package/templates/apps/api/src/middleware/auth.ts +9 -0
  177. package/templates/apps/api/src/openapi/spec.ts +63 -12
  178. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +127 -5
  179. package/templates/apps/api/src/routes/content/get-page.ts +86 -2
  180. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +88 -0
  181. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +100 -0
  182. package/templates/apps/api/src/routes/leads/index.ts +46 -1
  183. package/templates/apps/api/src/server.ts +13 -0
  184. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +194 -0
  185. package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +124 -0
  186. package/templates/apps/api/src/services/lead-routing.ts +140 -30
  187. package/templates/apps/api/src/services/leads-inbox.ts +48 -11
  188. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +75 -1
  189. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +57 -9
  190. package/templates/apps/mcp/__tests__/parity.test.ts +5 -4
  191. package/templates/apps/mcp/package.json +2 -1
  192. package/templates/apps/mcp/src/index.ts +7 -0
  193. package/templates/apps/mcp/src/lib/audit-single-page.ts +36 -10
  194. package/templates/apps/mcp/src/lib/license-key-store.ts +45 -0
  195. package/templates/apps/mcp/src/tools/create_project.ts +21 -6
  196. package/templates/apps/web/__tests__/setup.ts +18 -0
  197. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +10 -2
  198. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +2 -2
  199. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +10 -4
  200. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +22 -14
  201. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +26 -18
  202. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +12 -4
  203. package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +35 -4
  204. package/templates/apps/web/app/[locale]/[slug]/page.tsx +49 -9
  205. package/templates/apps/web/app/[locale]/book-a-call/page.tsx +50 -0
  206. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
  207. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
  208. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +3 -4
  209. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +67 -29
  210. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +94 -11
  211. package/templates/apps/web/app/[locale]/contact/__tests__/contact-form-text.test.ts +32 -0
  212. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +129 -0
  213. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +228 -86
  214. package/templates/apps/web/app/[locale]/contact/contact-form-text.ts +50 -0
  215. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +73 -20
  216. package/templates/apps/web/app/[locale]/contact/page.tsx +115 -7
  217. package/templates/apps/web/app/[locale]/contact/site-contact-email.ts +54 -0
  218. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
  219. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +3 -4
  220. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +4 -5
  221. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +64 -0
  222. package/templates/apps/web/app/[locale]/features/page.tsx +52 -0
  223. package/templates/apps/web/app/[locale]/glossary/page.tsx +50 -0
  224. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
  225. package/templates/apps/web/app/[locale]/how-to/page.tsx +25 -15
  226. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
  227. package/templates/apps/web/app/[locale]/layout.tsx +146 -52
  228. package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +75 -0
  229. package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +163 -0
  230. package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +66 -0
  231. package/templates/apps/web/app/[locale]/newsletter/page.tsx +142 -0
  232. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
  233. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +59 -0
  234. package/templates/apps/web/app/[locale]/portfolio/page.tsx +49 -0
  235. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
  236. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +4 -5
  237. package/templates/apps/web/app/[locale]/{cancellation → purchase-policy}/page.tsx +15 -10
  238. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +4 -5
  239. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
  240. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +14 -1
  241. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
  242. package/templates/apps/web/app/[locale]/software/page.tsx +25 -15
  243. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
  244. package/templates/apps/web/app/[locale]/tech-articles/page.tsx +25 -15
  245. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +3 -4
  246. package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +63 -0
  247. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +3 -4
  248. package/templates/apps/web/app/[locale]/use-cases/page.tsx +15 -2
  249. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
  250. package/templates/apps/web/app/[locale]/whitepapers/page.tsx +25 -15
  251. package/templates/apps/web/app/error-fallback.tsx +17 -45
  252. package/templates/apps/web/app/not-found.tsx +14 -38
  253. package/templates/apps/web/app/og/route.tsx +6 -0
  254. package/templates/apps/web/eslint.config.mjs +3 -0
  255. package/templates/apps/web/instrumentation.ts +14 -0
  256. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +38 -0
  257. package/templates/apps/web/lib/license-key-store.ts +52 -0
  258. package/templates/apps/web/lib/nav-config.ts +82 -18
  259. package/templates/apps/web/lib/prisma-for-auth.ts +9 -6
  260. package/templates/apps/web/lib/site-brand.tsx +1 -1
  261. package/templates/apps/web/lib/site-chrome.ts +3 -3
  262. package/templates/apps/web/lib/site-identity.ts +148 -0
  263. package/templates/apps/web/lib/site-theme.ts +11 -0
  264. package/templates/apps/web/messages/en.json +78 -37
  265. package/templates/apps/web/public/android-chrome-192x192.png +0 -0
  266. package/templates/apps/web/public/android-chrome-512x512.png +0 -0
  267. package/templates/apps/web/public/apple-touch-icon.png +0 -0
  268. package/templates/apps/web/public/favicon-16x16.png +0 -0
  269. package/templates/apps/web/public/favicon-32x32.png +0 -0
  270. package/templates/apps/web/public/favicon.ico +0 -0
  271. package/templates/apps/web/public/favicon.svg +3 -3
  272. package/templates/apps/web/public/logomark.svg +6 -3
  273. package/templates/apps/web/public/logos/ai-launch-kit-light.svg +4 -0
  274. package/templates/apps/web/public/logos/ai-launch-kit.svg +4 -0
  275. package/templates/apps/web/public/logos/atomic-agent-light.svg +4 -0
  276. package/templates/apps/web/public/logos/atomic-agent.svg +4 -0
  277. package/templates/apps/web/public/logos/salessmyth-light.svg +4 -0
  278. package/templates/apps/web/public/logos/salessmyth.svg +4 -0
  279. package/templates/apps/web/public/site.webmanifest +4 -4
  280. package/templates/apps/web/public/wordmark-light.svg +4 -0
  281. package/templates/apps/web/public/wordmark.svg +3 -3
  282. package/templates/apps/web/security-headers.config.ts +5 -1
  283. package/templates/content/_site.mdx +25 -0
  284. package/templates/content/en/AboutPage/about.mdx +150 -144
  285. package/templates/content/en/BlogList/blog.mdx +126 -0
  286. package/templates/content/en/ContactPage/contact.mdx +21 -92
  287. package/templates/content/en/FAQPage/faq.mdx +86 -57
  288. package/templates/content/en/HomePage/home.mdx +268 -217
  289. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +181 -0
  290. package/templates/content/en/UseCasesList/use-cases.mdx +170 -0
  291. package/templates/database/CHANGELOG.md +14 -0
  292. package/templates/database/package.json +1 -1
  293. package/templates/package.json +3 -1
  294. package/templates/tools/lint-architecture.ts +315 -0
  295. package/templates/tools/tsconfig.json +14 -0
  296. package/versions.json +33 -33
  297. package/site-templates/simple-service/DESIGN.md +0 -148
  298. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +0 -240
  299. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +0 -278
  300. package/site-templates/simple-service/ailk-template.json +0 -10
  301. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +0 -67
  302. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +0 -56
  303. package/site-templates/simple-service/content/en/HomePage/home.mdx +0 -85
  304. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +0 -40
  305. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +0 -40
  306. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +0 -40
  307. package/site-templates/simple-service/provenance.json +0 -4
  308. package/templates/.claude/skills/add-schema/SKILL.md +0 -277
  309. package/templates/.claude/skills/add-schema/references/conflict-handling.md +0 -200
  310. package/templates/.claude/skills/add-schema/references/file-finding.md +0 -123
  311. package/templates/.claude/skills/add-schema/references/schema-types.md +0 -234
  312. package/templates/.claude/skills/provision-config/references/runbook-template.md +0 -248
  313. package/templates/.claude/skills/scaffold-page/references/page-types.md +0 -169
  314. package/templates/.claude/skills/suggest-site-pages/SKILL.md +0 -242
  315. package/templates/.claude/skills/suggest-site-pages/references/categories.md +0 -287
  316. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +0 -150
  317. package/templates/apps/web/app/[locale]/returns/page.tsx +0 -44
  318. package/templates/apps/web/app/[locale]/shipping/page.tsx +0 -44
  319. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +0 -108
  320. package/templates/content/en/LandingPage/blog.mdx +0 -83
  321. package/templates/content/en/LandingPage/features.mdx +0 -103
  322. package/templates/content/en/LandingPage/how-it-works.mdx +0 -143
  323. package/templates/content/en/ReturnsPolicyPage/returns.mdx +0 -108
  324. package/templates/content/en/ShippingPolicyPage/shipping.mdx +0 -108
@@ -1,9 +1,9 @@
1
1
  ---
2
- name: provision-config
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. The RUNBOOK includes the three named persistence-upgrade paths for leads.jsonl (Vercel KV / Supabase / Postgres-via-`@working-theory/database`).
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
- # provision-config
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
- three named persistence-upgrade headings).
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
- > "`provision-config` is Vercel-only at v1. Netlify / Cloudflare /
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. CF requires different default
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
- provision-config" section. Vars already present are not modified.
103
+ setup-deploy" section. Vars already present are not modified.
104
104
 
105
- **Merge logic — `RUNBOOK.md`:** if any of the three named
106
- persistence sections (Vercel KV, Supabase,
107
- Postgres-via-`@working-theory/database`) is missing from the existing file,
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 provision-config" — never silently
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. **Operations — leads.jsonl persistence** — the **critical**
158
- section. AILK's lead-capture writes JSONL to
159
- `apps/api/leads.jsonl`, which **does not persist** on Vercel's
160
- ephemeral filesystem. Consumer must pick a persistence backend
161
- before going live or leads disappear on cold-start.
162
- 3. **Persistence upgrade — Vercel KV** — drop-in, no new infra,
163
- cheapest fix. When to pick.
164
- 4. **Persistence upgrade — Supabase** — Postgres + auth + storage
165
- in one provider. When to pick.
166
- 5. **Persistence upgrade — Postgres via `@working-theory/database`** — for
167
- consumers who already have Postgres elsewhere (Neon, Railway,
168
- RDS). When to pick.
169
- 6. **Custom domain + DNS** — pointer at Vercel's domain docs.
170
- 7. **Production callbacks for OAuth** — for consumers who used
171
- `scaffold-auth` (#364) and need to register prod redirect URIs.
172
-
173
- After write, grep the RUNBOOK for the three named persistence
174
- section headings (Vercel KV, Supabase,
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
- - A pointer to `RUNBOOK.md`'s leads-persistence section (the
185
- highest-stakes operational caveat).
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 all three named persistence section
207
- headings ✓
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 `scaffold-auth`'s RUNBOOK are
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 three
227
- named persistence-upgrade sections.
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
- - **`scaffold-auth` (#364)** — produces its own `RUNBOOK.md`
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).
@@ -1,6 +1,6 @@
1
1
  # `.env.example` Template
2
2
 
3
- The structure the `provision-config` skill emits at the consumer's
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
- # ── Database (optional in standalone mode) ───────────────────────
32
- # Required only if you've installed @working-theory/database for persistent
33
- # leads, sessions, or other data. See RUNBOOK.md § "Persistence
34
- # upgrade — Postgres via @working-theory/database" for setup.
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 seven categories. Every emitted
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. Database (optional)
128
+ 3. Lead delivery (database or email)
137
129
  4. Auth — required + per-provider
138
130
  5. Stripe (sandbox-only)
139
- 6. Email + Analytics
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 provision-config ────────────────────────────────
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 `provision-config` skill emits.
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.