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
@@ -0,0 +1,216 @@
1
+ /**
2
+ * The starter grid's data (#6753): the shape rosters and the alias table
3
+ * every `--template` name resolves through. A starter is one shape rendered
4
+ * in one design with a module list (starter-template contract § The three
5
+ * axes); an alias names those coordinates plus how its own rows differ from
6
+ * the shape's standard roster.
7
+ *
8
+ * DATA ONLY, AND IMPORT-FREE AT RUNTIME. Every import below is `import type`,
9
+ * erased at emit. `template-names.ts` derives `RECOGNIZED_TEMPLATES` from
10
+ * `ALIASES` and `parse-args.ts` imports that at runtime, so a runtime import
11
+ * here could reach `lib/module-tier.ts` and re-open the `RECOGNIZED_MODULES`
12
+ * temporal-dead-zone cycle `template-names.ts`'s header records (spec 6753
13
+ * D1). The composition itself — shape roster, minus `drop`, plus `add` —
14
+ * lives in `template-manifest.ts`, whose `resolveTemplate` is the one reader
15
+ * that yields a template's roster. Nothing but those two files imports this one.
16
+ */
17
+ import type { CategorySlug } from "@working-theory/schema/categories";
18
+ import type { ModuleName } from "./parse-args.js";
19
+ import type { TemplateLayout } from "./site-chrome.js";
20
+ import type { StarterDesign, StarterShape, TemplateRosterRow } from "./template-manifest.js";
21
+ /** The shapes a starter can be built from — every StarterShape but the reserved one. */
22
+ export type BuildableShape = Exclude<StarterShape, "local-business-product">;
23
+ /** How an alias's own rows differ from its shape's standard roster. */
24
+ export interface AliasDifferences {
25
+ /** Shape-roster routes this alias does not carry. */
26
+ readonly drop?: readonly string[];
27
+ /** Rows this alias carries that its shape roster does not. */
28
+ readonly add?: readonly TemplateRosterRow[];
29
+ /** The retained shape route `add` is inserted before; absent → appended. */
30
+ readonly before?: string;
31
+ /**
32
+ * Further positioned groups (#6757 D7): each group's rows go before its
33
+ * own `before` route, applied group by group in array order, AFTER `add`
34
+ * is placed. The one alias that needs more than one anchor
35
+ * (`minimalism-site`, which interleaves rows at two separate points in the
36
+ * shape's row order) uses this; every other alias leaves it unset.
37
+ */
38
+ readonly insert?: readonly {
39
+ readonly before: string;
40
+ readonly rows: readonly TemplateRosterRow[];
41
+ }[];
42
+ }
43
+ /**
44
+ * One `--template` name: the grid coordinates it stands for.
45
+ *
46
+ * No `tier`, `level`, `price` or optional-module member, for the reason
47
+ * `TemplateManifest` carries none (parent § D4, D12): the level is derived
48
+ * from `modules`, never declared, and the type is what makes declaring one a
49
+ * compile error.
50
+ */
51
+ export interface TemplateAlias {
52
+ readonly shape: BuildableShape;
53
+ readonly design: StarterDesign;
54
+ /** Becomes the manifest's `requires`. */
55
+ readonly modules: readonly ModuleName[];
56
+ readonly categories: readonly CategorySlug[];
57
+ readonly layout?: TemplateLayout;
58
+ readonly differences?: AliasDifferences;
59
+ }
60
+ /**
61
+ * Each buildable shape's standard roster (#6753 D3) — the rows an alias starts
62
+ * from before its `differences` apply.
63
+ *
64
+ * `organization-product` is today's base roster, the `/blog` teaser and the
65
+ * portfolio pair. `organization-service`, `local-business-service` (#6757)
66
+ * and `person-service` (#6758, roadmap § 6 Phase 2) are each their own rows,
67
+ * the `/blog` teaser and the portfolio pair.
68
+ */
69
+ export declare const SHAPE_ROSTERS: Readonly<Record<BuildableShape, readonly TemplateRosterRow[]>>;
70
+ /**
71
+ * The `--template` names and the grid coordinates each stands for (#6753) —
72
+ * the one table `TEMPLATE_MANIFESTS` and `RECOGNIZED_TEMPLATES` derive from,
73
+ * in the declaration order both keep. The plain name is the Pro one: it is
74
+ * the flagship and the demo (Sam, 2026-09-14, parent § D12).
75
+ *
76
+ * `workspace` appears in no module list. It is a Pro module, but an authed app
77
+ * surface contributing no PUBLIC page to a marketing site, and `modules` names
78
+ * what the roster uses (parent § D15). A Pro key unlocks it regardless of any
79
+ * template.
80
+ *
81
+ * `commerce` is a per-site add-on available at any level, so no alias exists
82
+ * FOR it (parent § D13); it still contributes rows to whichever alias takes
83
+ * it, through `mergeRoster`.
84
+ *
85
+ * Frozen (#5507): the registry composed from this table is also the issuer's
86
+ * authorization allowlist (spec 5480 § C7). A test needing a different table
87
+ * passes its own to `resolveTemplate(name, aliases)` rather than mutating
88
+ * this one.
89
+ */
90
+ export declare const ALIASES: Readonly<{
91
+ /**
92
+ * The Free template, and the mechanism's own proof (parent § D11): it
93
+ * requires only `marketing`, so the keyless merge path is exercised by a
94
+ * template we ship anyway rather than by a throwaway fixture. The bare
95
+ * `organization-product` shape — no differences at all.
96
+ */
97
+ readonly "marketing-site-free": {
98
+ readonly shape: "organization-product";
99
+ readonly design: "standard";
100
+ readonly modules: readonly ["marketing"];
101
+ readonly categories: readonly ["accounting", "legal", "technology"];
102
+ readonly layout: {
103
+ readonly announcementBanner: true;
104
+ };
105
+ };
106
+ /**
107
+ * The Pro flagship. Its module list is OFFERINGS § 4 offering 3's tiers line
108
+ * — "docs, scheduling and flows modules" — where "flows" is
109
+ * `signal-collectors` (`MODULE_SURFACES` maps it to `["flows"]`). It drops
110
+ * the shape's `/blog` teaser because docs-blog contributes the real `/blog`,
111
+ * and adds the signal-collectors sample rows ahead of the portfolio pair.
112
+ */
113
+ readonly "marketing-site": {
114
+ readonly shape: "organization-product";
115
+ readonly design: "standard";
116
+ readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors"];
117
+ readonly categories: readonly ["accounting", "legal", "consulting", "hvac", "roofing", "plumbing", "electrical", "landscaping", "auto-repair", "real-estate", "technology", "medical-specialty"];
118
+ readonly differences: {
119
+ readonly drop: readonly ["/blog"];
120
+ readonly add: readonly import("./module-architecture.js").PageRosterRow[];
121
+ readonly before: "/portfolio";
122
+ };
123
+ };
124
+ /**
125
+ * Pro Plus — the Pro list plus `multi-tenant`, which is correctly in the
126
+ * list because it DOES contribute pages (the org and workspace surfaces).
127
+ * Its `pageContributions` is nonetheless unset today, deferred to its own
128
+ * instance, so this template's merged roster carries the same contributed
129
+ * rows as `marketing-site`'s and no more. That is a module which has
130
+ * declared no rows yet — visible in the diff — not a merge that dropped
131
+ * declared rows.
132
+ */
133
+ readonly "saas-product": {
134
+ readonly shape: "organization-product";
135
+ readonly design: "standard";
136
+ readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors", "multi-tenant"];
137
+ readonly categories: readonly ["technology", "medical-specialty"];
138
+ readonly differences: {
139
+ readonly drop: readonly ["/blog"];
140
+ readonly add: readonly import("./module-architecture.js").PageRosterRow[];
141
+ readonly before: "/portfolio";
142
+ };
143
+ };
144
+ /**
145
+ * The second Pro template (#5589) — the reports-first, scroll-snap deck
146
+ * site. NOT `marketing-site` plus a module: its `modules` omit `docs-blog`,
147
+ * so the two Pro templates are siblings under `_base` (#5618 D2), never a
148
+ * lineage. Level still derives from `modules`: `scheduling` and
149
+ * `signal-collectors` are paid, so `templateDelivery` returns `"paid"`
150
+ * exactly as it does for `marketing-site`.
151
+ *
152
+ * It composes the `organization-service` shape roster (#6757) rather than
153
+ * the organization-product one: the deck home replaces the document-scroll
154
+ * home, and `/how-it-works`, the product page, `/pricing` and `/sign-in`
155
+ * are not pages this site has. The roster is what the
156
+ * template IS, so an unrostered page has neither a route directory
157
+ * (`rosterSurfaces`) nor its `_base`/overlay seed (#6646 D1).
158
+ *
159
+ * It declares NO `layout` block (#6638): the deck home, mark-only nav and
160
+ * centered footer are the `minimalism` design's, supplied by
161
+ * `DESIGN_LAYOUTS` from `design:` — the look any shape can wear. The
162
+ * roster rows the `organization-service` shape does not derive
163
+ * (`/reports`, `/referral`) are recorded with their reasons in this
164
+ * template's TEMPLATE-MANIFEST.md § 3a.
165
+ *
166
+ * `/reports` and `/referral` carry no `GATEABLE_SURFACES` entry and need
167
+ * none: both are single-segment `LandingPage` slugs served by the generic
168
+ * `[slug]` route (#5469 D2), the same mechanism Free's `/how-it-works`
169
+ * uses. `/reports/[slug]` (the reader) is the signal-collectors module's
170
+ * own contributed row.
171
+ *
172
+ * `/services/[slug]` declares its seed DIRECTORY as `contentDir`
173
+ * (`content/en/Service`, as `routes-map.ts` records it). The three
174
+ * samples ride the template tree unmapped, landing at that directory.
175
+ *
176
+ * Since #6757, `organization-service` carries a real standard roster
177
+ * (D1), so this alias's `differences` is additions and drops only: it
178
+ * drops the `/blog` teaser (a Pro alias does not upsell its own level,
179
+ * D8) and the portfolio pair (the reports are the proof, not a
180
+ * portfolio), adds the signal-collectors samples, and INSERTS its two own
181
+ * rows — `/reports` before `/about`, `/referral` before `/faq` (D7) — to
182
+ * reproduce its pre-#6757 row order (§ 1.2) exactly.
183
+ */
184
+ readonly "minimalism-site": {
185
+ readonly shape: "organization-service";
186
+ readonly design: "minimalism";
187
+ readonly modules: readonly ["marketing", "scheduling", "signal-collectors"];
188
+ readonly categories: readonly ["real-estate", "technology", "legal"];
189
+ readonly differences: {
190
+ readonly drop: readonly ["/blog", "/portfolio", "/portfolio/[slug]"];
191
+ readonly add: readonly import("./module-architecture.js").PageRosterRow[];
192
+ readonly insert: readonly [{
193
+ readonly before: "/about";
194
+ readonly rows: readonly [import("./module-architecture.js").PageRosterRow];
195
+ }, {
196
+ readonly before: "/faq";
197
+ readonly rows: readonly [import("./module-architecture.js").PageRosterRow];
198
+ }];
199
+ };
200
+ };
201
+ }>;
202
+ /**
203
+ * The coordinates a keyless `--shape S` builds (#6757 D5) — the composed
204
+ * FREE manifest per shape, for a shape with no `--template` alias of its
205
+ * own. Frozen and `Partial`; `organization-product` needs none — its
206
+ * keyless tree is `marketing-site-free`'s (#6754 AC-2).
207
+ *
208
+ * No `differences` (a bare shape is its standard roster, D1) and no
209
+ * `layout`. Every category is a leaf of `packages/schema/src/categories.ts`,
210
+ * as `TemplateManifest.categories` requires. `person-service`'s single
211
+ * `consulting` category is the operator's disposition (2026-09-26,
212
+ * ai-launch-kit-internal#6758): the leaf did not exist when #6758's spec was
213
+ * written, and adding it replaced that spec's `["accounting", "legal",
214
+ * "technology"]` author-pick stand-in.
215
+ */
216
+ export declare const SHAPE_STARTER_ALIASES: Readonly<Partial<Record<BuildableShape, TemplateAlias>>>;
@@ -0,0 +1,449 @@
1
+ /**
2
+ * The three pages every starter carries whatever its shape (#6658 D5,
3
+ * `docs/decisions/starter-roster-page-set.md` D4/D7): a glossary, a newsletter
4
+ * signup and a book-a-call page. Each is a module-less `GATEABLE_SURFACES`
5
+ * entry the roster enables, with its seed in `_base`. A template carrying the
6
+ * scheduling module overrides `BookCall/book-call.mdx` in its own tree, so the
7
+ * call to action opens `/meet` rather than `/contact`.
8
+ */
9
+ const SHAPE_INDEPENDENT_ROWS = [
10
+ { route: "/glossary", content: ["content/en/GlossaryList/glossary.mdx"] },
11
+ {
12
+ route: "/newsletter",
13
+ content: ["content/en/NewsletterSignup/newsletter.mdx"],
14
+ },
15
+ { route: "/book-a-call", content: ["content/en/BookCall/book-call.mdx"] },
16
+ ];
17
+ /**
18
+ * The rows every `organization-product` template brings itself — one declared
19
+ * page set, whichever layer carries each seed. Re-derived by #6658 from the
20
+ * standard (`derive-roster.py --entity-type software --offering-type software
21
+ * --primary-goal convert --scale global`, the `--shape organization-product`
22
+ * equivalent), edited only by the deviations the Free manifest's § 3a records
23
+ * with their reasons. With a template named, `scaffold()` keeps a `_base` or
24
+ * overlay seed only when a merged roster row names it (#6646 D1): the roster
25
+ * decides what installs, and the manifest generator's `--check` proves it.
26
+ *
27
+ * Two layers, one roster:
28
+ *
29
+ * - `/`, `/software/[slug]`, `/use-cases`, `/about`, `/faq`, `/contact` and
30
+ * `/purchase-policy` take their content from the overlay
31
+ * (`template-overlay/content/en/**`, copied whole into `templates/` by
32
+ * `build-templates.mjs`). `/features` is the FeaturesList hub over one
33
+ * Feature page per feature at `/features/[slug]` (#6721, reversing the
34
+ * single `/software/product` page of #6658 D3); both ride the `features`
35
+ * surface the roster enables.
36
+ * `/use-cases` lists the three UseCase pages at `/use-cases/[slug]`
37
+ * (#6658 D4).
38
+ * - `/pricing`, `/privacy`, `/terms`, `/glossary`, `/newsletter`,
39
+ * `/book-a-call` and the three UseCase pages take their content from the
40
+ * base layer (`site-templates/_base/content/**`, #5618 D1), which every
41
+ * template reaches by declaring `extends` — installed before the module
42
+ * bundles and the template's own tree, so a template may override a base
43
+ * page by shipping the same path. Their surfaces are module-less by
44
+ * construction (parent § D16, #6658 D5): a template enables them by
45
+ * NAMING them in its roster — `scaffold()` selects their
46
+ * `GATEABLE_SURFACES` entries from the merged roster's routes (#5469 D10).
47
+ *
48
+ * `/software`, `/sign-in` and `/sign-up` carry no `content`: they are code
49
+ * routes (the SoftwareProduct listing, the SignInCard island, the sign-up
50
+ * form), like the API-backed rows the scheduling module contributes — listed
51
+ * so the manifest is a complete install record, where the generator marks
52
+ * them `kind: route` (#6646 D2).
53
+ *
54
+ * `/purchase-policy` is the product-shape purchase policy (#6646 D3): its
55
+ * overlay seed carries returns, shipping and refunds sections — the overlay,
56
+ * not `_base`, because the route is core and a scaffold naming no template
57
+ * serves it too. A service-shape template overrides that seed with its own
58
+ * cancellation and refunds file.
59
+ *
60
+ * `/blog` is deliberately NOT here (#5469 D3): the docs-blog module
61
+ * contributes its own `/blog` row, so a base row would make `mergeRoster`
62
+ * refuse every template that takes that module. The teaser row is an
63
+ * `organization-product` shape row instead (#6753 D3), which the two aliases
64
+ * taking docs-blog drop.
65
+ */
66
+ const TEMPLATE_BASE_ROSTER = [
67
+ { route: "/", content: ["content/en/HomePage/home.mdx"] },
68
+ // #6721 — the product's features: a FeaturesList hub over one Feature page
69
+ // per feature (replaces the single /software/product page, #6658 D3).
70
+ { route: "/features", content: ["content/en/FeaturesList/features.mdx"] },
71
+ { route: "/features/[slug]", contentDir: "content/en/Feature" },
72
+ {
73
+ route: "/use-cases",
74
+ content: ["content/en/UseCasesList/use-cases.mdx"],
75
+ },
76
+ { route: "/use-cases/[slug]", contentDir: "content/en/UseCase" },
77
+ { route: "/pricing", content: ["content/en/Pricing/pricing.mdx"] },
78
+ { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
79
+ { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
80
+ { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
81
+ ...SHAPE_INDEPENDENT_ROWS,
82
+ { route: "/sign-in" },
83
+ { route: "/sign-up" },
84
+ { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] },
85
+ { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] },
86
+ {
87
+ route: "/purchase-policy",
88
+ content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"],
89
+ },
90
+ ];
91
+ /**
92
+ * The Free `/blog` teaser (#5469 D3) — one static BlogList page (schema `Blog`
93
+ * with an empty `ItemList`; the correct page type, not a LandingPage) that
94
+ * says what the Pro docs-blog module gives you. It is served by the generic
95
+ * `[slug]` route — which probes `LandingPage` first, then `BlogList` — over
96
+ * `content/en/BlogList/blog.mdx`, which ships in the always-copied overlay. `/blog` degrades by DIRECTORY PRECEDENCE, not
97
+ * by a module gate: in a keyed docs-blog scaffold the module's own
98
+ * `blog/[[...slug]]/page.tsx` directory exists and Next.js resolves the static
99
+ * segment first, so the teaser file is inert; keyless, no `blog/` directory
100
+ * exists and the teaser renders. An `organization-product` shape row
101
+ * (#6753 D3): the aliases taking docs-blog drop it, so on `marketing-site`
102
+ * the docs-blog contribution claims the route.
103
+ */
104
+ const FREE_BLOG_TEASER_ROW = {
105
+ route: "/blog",
106
+ content: ["content/en/BlogList/blog.mdx"],
107
+ };
108
+ /**
109
+ * The rows for the `signal-collectors` bundle's six sample pages (#6646
110
+ * disposition (a)) — the project listing, its two project pages and the
111
+ * three thank-you pages its `installMap` lands. The module contributes no
112
+ * row for any of these routes (`module-architecture.ts`'s installMap
113
+ * comment), so a template that takes the module declares them, and the
114
+ * roster names every page the scaffold installs. `/projects` is a
115
+ * module-less `GATEABLE_SURFACES` entry, so naming it here also copies the
116
+ * route directory the samples render through (`rosterSurfaces`).
117
+ */
118
+ const SIGNAL_COLLECTORS_SAMPLE_ROWS = [
119
+ { route: "/projects", content: ["content/en/ProjectsList/projects.mdx"] },
120
+ { route: "/projects/[slug]", contentDir: "content/en/Project" },
121
+ { route: "/thanks/[slug]", contentDir: "content/en/ThankYouPage" },
122
+ ];
123
+ /**
124
+ * The portfolio pages (#6687) — before/after project comparisons: a
125
+ * PortfolioList hub on the /alternatives stack and one PortfolioItem page per
126
+ * comparison, each one `before-after` section carrying its header band and
127
+ * pager. They belong to the SHAPE, Free included (roadmap § 4, operator
128
+ * 2026-09-25, reversing #6687's "Pro and up"): every shape roster below
129
+ * carries them, and an alias sheds them only by an explicit `drop`. The seeds
130
+ * live in the `_base` layer under `content/en/PortfolioItem/`; the detail
131
+ * row's `contentDir` installs them (#6646 D1), exactly as `/use-cases/[slug]`
132
+ * serves `content/en/UseCase`.
133
+ */
134
+ // NO_HAND_IMPLEMENT_OK: /build-starter operator-directed live pass (#6687).
135
+ const PORTFOLIO_ROWS = [
136
+ { route: "/portfolio", content: ["content/en/PortfolioList/portfolio.mdx"] },
137
+ { route: "/portfolio/[slug]", contentDir: "content/en/PortfolioItem" },
138
+ ];
139
+ /**
140
+ * `minimalism-site`'s two OWN rows (#5589, shrunk from its own 17-row roster
141
+ * by #6757 once the `organization-service` shape carried a standard roster of
142
+ * its own): the deck's two `LandingPage` slugs, positioned by `insert` (D7)
143
+ * at the two points this alias interleaves them into the shape's row order
144
+ * (§ 1.2) — `/reports` before `/about`, `/referral` before `/faq`. Neither
145
+ * carries a `GATEABLE_SURFACES` entry: both are single-segment slugs served
146
+ * by the generic `[slug]` route (#5469 D2), the same mechanism Free's
147
+ * `/how-it-works` used.
148
+ */
149
+ const REPORTS_ROW = {
150
+ route: "/reports",
151
+ content: ["content/en/LandingPage/reports.mdx"],
152
+ };
153
+ const REFERRAL_ROW = {
154
+ route: "/referral",
155
+ content: ["content/en/LandingPage/referral.mdx"],
156
+ };
157
+ /**
158
+ * `organization-service`'s own rows (#6757 D1), derived from
159
+ * `derive-roster.py --shape organization-service --primary-goal generate-leads
160
+ * --registry packages/schema/src/registry/entries.ts` at harness commit
161
+ * `7bdaf148e1b0e639cd90a80008955e55cc4aa2b5`, edited only by the deviations
162
+ * `site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md` § 3a
163
+ * records with their reasons. Row order matches `minimalism-site`'s (D3), so
164
+ * that alias's `differences` are additions and drops only.
165
+ */
166
+ const ORGANIZATION_SERVICE_ROWS = [
167
+ { route: "/", content: ["content/en/HomePage/home.mdx"] },
168
+ { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
169
+ { route: "/services", content: ["content/en/ServicesList/services.mdx"] },
170
+ { route: "/services/[slug]", contentDir: "content/en/Service" },
171
+ { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
172
+ { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
173
+ ...SHAPE_INDEPENDENT_ROWS,
174
+ { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] },
175
+ { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] },
176
+ {
177
+ route: "/purchase-policy",
178
+ content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"],
179
+ },
180
+ ];
181
+ /**
182
+ * `local-business-service`'s own rows (#6757 D1), derived the same way with
183
+ * `--shape local-business-service`. It has no `--template` alias of its own
184
+ * since #6789 retired the one alias that composed it; `--shape` is its only entry.
185
+ */
186
+ const LOCAL_BUSINESS_SERVICE_ROWS = [
187
+ { route: "/", content: ["content/en/HomePage/home.mdx"] },
188
+ { route: "/services", content: ["content/en/ServicesList/services.mdx"] },
189
+ { route: "/services/[slug]", contentDir: "content/en/Service" },
190
+ { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
191
+ { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
192
+ { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
193
+ ...SHAPE_INDEPENDENT_ROWS,
194
+ {
195
+ route: "/purchase-policy",
196
+ content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"],
197
+ },
198
+ { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] },
199
+ { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] },
200
+ ];
201
+ /**
202
+ * `person-service`'s own rows (#6758 D1, D3), derived from
203
+ * `derive-roster.py --shape person-service --primary-goal generate-leads
204
+ * --registry packages/schema/src/registry/entries.ts` at harness commit
205
+ * `7bdaf148e1b0e639cd90a80008955e55cc4aa2b5` (the vendored equivalent:
206
+ * `--entity-type person --offering-type services --primary-goal
207
+ * generate-leads --scale global`), edited only by the deviations
208
+ * `site-templates/shapes/person-service/TEMPLATE-MANIFEST.md` § 3a records
209
+ * with their reasons. Row order matches `local-business-service`'s (D3):
210
+ * services before about, because a consultant is hired for an engagement
211
+ * first.
212
+ */
213
+ const PERSON_SERVICE_ROWS = [
214
+ { route: "/", content: ["content/en/HomePage/home.mdx"] },
215
+ { route: "/services", content: ["content/en/ServicesList/services.mdx"] },
216
+ { route: "/services/[slug]", contentDir: "content/en/Service" },
217
+ { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
218
+ { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
219
+ { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
220
+ ...SHAPE_INDEPENDENT_ROWS,
221
+ {
222
+ route: "/purchase-policy",
223
+ content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"],
224
+ },
225
+ { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] },
226
+ { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] },
227
+ ];
228
+ /**
229
+ * Each buildable shape's standard roster (#6753 D3) — the rows an alias starts
230
+ * from before its `differences` apply.
231
+ *
232
+ * `organization-product` is today's base roster, the `/blog` teaser and the
233
+ * portfolio pair. `organization-service`, `local-business-service` (#6757)
234
+ * and `person-service` (#6758, roadmap § 6 Phase 2) are each their own rows,
235
+ * the `/blog` teaser and the portfolio pair.
236
+ */
237
+ export const SHAPE_ROSTERS = Object.freeze({
238
+ "organization-product": [
239
+ ...TEMPLATE_BASE_ROSTER,
240
+ FREE_BLOG_TEASER_ROW,
241
+ ...PORTFOLIO_ROWS,
242
+ ],
243
+ "organization-service": [
244
+ ...ORGANIZATION_SERVICE_ROWS,
245
+ FREE_BLOG_TEASER_ROW,
246
+ ...PORTFOLIO_ROWS,
247
+ ],
248
+ "local-business-service": [
249
+ ...LOCAL_BUSINESS_SERVICE_ROWS,
250
+ FREE_BLOG_TEASER_ROW,
251
+ ...PORTFOLIO_ROWS,
252
+ ],
253
+ "person-service": [
254
+ ...PERSON_SERVICE_ROWS,
255
+ FREE_BLOG_TEASER_ROW,
256
+ ...PORTFOLIO_ROWS,
257
+ ],
258
+ });
259
+ /**
260
+ * The `--template` names and the grid coordinates each stands for (#6753) —
261
+ * the one table `TEMPLATE_MANIFESTS` and `RECOGNIZED_TEMPLATES` derive from,
262
+ * in the declaration order both keep. The plain name is the Pro one: it is
263
+ * the flagship and the demo (Sam, 2026-09-14, parent § D12).
264
+ *
265
+ * `workspace` appears in no module list. It is a Pro module, but an authed app
266
+ * surface contributing no PUBLIC page to a marketing site, and `modules` names
267
+ * what the roster uses (parent § D15). A Pro key unlocks it regardless of any
268
+ * template.
269
+ *
270
+ * `commerce` is a per-site add-on available at any level, so no alias exists
271
+ * FOR it (parent § D13); it still contributes rows to whichever alias takes
272
+ * it, through `mergeRoster`.
273
+ *
274
+ * Frozen (#5507): the registry composed from this table is also the issuer's
275
+ * authorization allowlist (spec 5480 § C7). A test needing a different table
276
+ * passes its own to `resolveTemplate(name, aliases)` rather than mutating
277
+ * this one.
278
+ */
279
+ export const ALIASES = Object.freeze({
280
+ /**
281
+ * The Free template, and the mechanism's own proof (parent § D11): it
282
+ * requires only `marketing`, so the keyless merge path is exercised by a
283
+ * template we ship anyway rather than by a throwaway fixture. The bare
284
+ * `organization-product` shape — no differences at all.
285
+ */
286
+ "marketing-site-free": {
287
+ shape: "organization-product",
288
+ design: "standard",
289
+ modules: ["marketing"],
290
+ categories: ["accounting", "legal", "technology"],
291
+ // The demo site carries the "Get started with this template" banner
292
+ // (operator ruling 2026-09-23); every other layout knob keeps its default.
293
+ layout: { announcementBanner: true },
294
+ },
295
+ /**
296
+ * The Pro flagship. Its module list is OFFERINGS § 4 offering 3's tiers line
297
+ * — "docs, scheduling and flows modules" — where "flows" is
298
+ * `signal-collectors` (`MODULE_SURFACES` maps it to `["flows"]`). It drops
299
+ * the shape's `/blog` teaser because docs-blog contributes the real `/blog`,
300
+ * and adds the signal-collectors sample rows ahead of the portfolio pair.
301
+ */
302
+ "marketing-site": {
303
+ shape: "organization-product",
304
+ design: "standard",
305
+ modules: ["marketing", "docs-blog", "scheduling", "signal-collectors"],
306
+ // The flagship is the general-purpose template: it carries the whole
307
+ // registry, so every group tile on the hub has at least one template.
308
+ categories: [
309
+ "accounting",
310
+ "legal",
311
+ "consulting",
312
+ "hvac",
313
+ "roofing",
314
+ "plumbing",
315
+ "electrical",
316
+ "landscaping",
317
+ "auto-repair",
318
+ "real-estate",
319
+ "technology",
320
+ "medical-specialty",
321
+ ],
322
+ differences: {
323
+ drop: ["/blog"],
324
+ add: SIGNAL_COLLECTORS_SAMPLE_ROWS,
325
+ before: "/portfolio",
326
+ },
327
+ },
328
+ /**
329
+ * Pro Plus — the Pro list plus `multi-tenant`, which is correctly in the
330
+ * list because it DOES contribute pages (the org and workspace surfaces).
331
+ * Its `pageContributions` is nonetheless unset today, deferred to its own
332
+ * instance, so this template's merged roster carries the same contributed
333
+ * rows as `marketing-site`'s and no more. That is a module which has
334
+ * declared no rows yet — visible in the diff — not a merge that dropped
335
+ * declared rows.
336
+ */
337
+ "saas-product": {
338
+ shape: "organization-product",
339
+ design: "standard",
340
+ modules: [
341
+ "marketing",
342
+ "docs-blog",
343
+ "scheduling",
344
+ "signal-collectors",
345
+ "multi-tenant",
346
+ ],
347
+ categories: ["technology", "medical-specialty"],
348
+ differences: {
349
+ drop: ["/blog"],
350
+ add: SIGNAL_COLLECTORS_SAMPLE_ROWS,
351
+ before: "/portfolio",
352
+ },
353
+ },
354
+ /**
355
+ * The second Pro template (#5589) — the reports-first, scroll-snap deck
356
+ * site. NOT `marketing-site` plus a module: its `modules` omit `docs-blog`,
357
+ * so the two Pro templates are siblings under `_base` (#5618 D2), never a
358
+ * lineage. Level still derives from `modules`: `scheduling` and
359
+ * `signal-collectors` are paid, so `templateDelivery` returns `"paid"`
360
+ * exactly as it does for `marketing-site`.
361
+ *
362
+ * It composes the `organization-service` shape roster (#6757) rather than
363
+ * the organization-product one: the deck home replaces the document-scroll
364
+ * home, and `/how-it-works`, the product page, `/pricing` and `/sign-in`
365
+ * are not pages this site has. The roster is what the
366
+ * template IS, so an unrostered page has neither a route directory
367
+ * (`rosterSurfaces`) nor its `_base`/overlay seed (#6646 D1).
368
+ *
369
+ * It declares NO `layout` block (#6638): the deck home, mark-only nav and
370
+ * centered footer are the `minimalism` design's, supplied by
371
+ * `DESIGN_LAYOUTS` from `design:` — the look any shape can wear. The
372
+ * roster rows the `organization-service` shape does not derive
373
+ * (`/reports`, `/referral`) are recorded with their reasons in this
374
+ * template's TEMPLATE-MANIFEST.md § 3a.
375
+ *
376
+ * `/reports` and `/referral` carry no `GATEABLE_SURFACES` entry and need
377
+ * none: both are single-segment `LandingPage` slugs served by the generic
378
+ * `[slug]` route (#5469 D2), the same mechanism Free's `/how-it-works`
379
+ * uses. `/reports/[slug]` (the reader) is the signal-collectors module's
380
+ * own contributed row.
381
+ *
382
+ * `/services/[slug]` declares its seed DIRECTORY as `contentDir`
383
+ * (`content/en/Service`, as `routes-map.ts` records it). The three
384
+ * samples ride the template tree unmapped, landing at that directory.
385
+ *
386
+ * Since #6757, `organization-service` carries a real standard roster
387
+ * (D1), so this alias's `differences` is additions and drops only: it
388
+ * drops the `/blog` teaser (a Pro alias does not upsell its own level,
389
+ * D8) and the portfolio pair (the reports are the proof, not a
390
+ * portfolio), adds the signal-collectors samples, and INSERTS its two own
391
+ * rows — `/reports` before `/about`, `/referral` before `/faq` (D7) — to
392
+ * reproduce its pre-#6757 row order (§ 1.2) exactly.
393
+ */
394
+ "minimalism-site": {
395
+ shape: "organization-service",
396
+ design: "minimalism",
397
+ modules: ["marketing", "scheduling", "signal-collectors"],
398
+ categories: ["real-estate", "technology", "legal"],
399
+ differences: {
400
+ drop: ["/blog", "/portfolio", "/portfolio/[slug]"],
401
+ add: SIGNAL_COLLECTORS_SAMPLE_ROWS,
402
+ insert: [
403
+ { before: "/about", rows: [REPORTS_ROW] },
404
+ { before: "/faq", rows: [REFERRAL_ROW] },
405
+ ],
406
+ },
407
+ },
408
+ });
409
+ /**
410
+ * The coordinates a keyless `--shape S` builds (#6757 D5) — the composed
411
+ * FREE manifest per shape, for a shape with no `--template` alias of its
412
+ * own. Frozen and `Partial`; `organization-product` needs none — its
413
+ * keyless tree is `marketing-site-free`'s (#6754 AC-2).
414
+ *
415
+ * No `differences` (a bare shape is its standard roster, D1) and no
416
+ * `layout`. Every category is a leaf of `packages/schema/src/categories.ts`,
417
+ * as `TemplateManifest.categories` requires. `person-service`'s single
418
+ * `consulting` category is the operator's disposition (2026-09-26,
419
+ * ai-launch-kit-internal#6758): the leaf did not exist when #6758's spec was
420
+ * written, and adding it replaced that spec's `["accounting", "legal",
421
+ * "technology"]` author-pick stand-in.
422
+ */
423
+ export const SHAPE_STARTER_ALIASES = Object.freeze({
424
+ "organization-service": {
425
+ shape: "organization-service",
426
+ design: "standard",
427
+ modules: ["marketing"],
428
+ categories: ["accounting", "legal", "real-estate"],
429
+ },
430
+ "local-business-service": {
431
+ shape: "local-business-service",
432
+ design: "standard",
433
+ modules: ["marketing"],
434
+ categories: [
435
+ "hvac",
436
+ "roofing",
437
+ "plumbing",
438
+ "electrical",
439
+ "landscaping",
440
+ "auto-repair",
441
+ ],
442
+ },
443
+ "person-service": {
444
+ shape: "person-service",
445
+ design: "standard",
446
+ modules: ["marketing"],
447
+ categories: ["consulting"],
448
+ },
449
+ });