create-ailk 0.8.0 → 0.9.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 (211) hide show
  1. package/README.md +68 -0
  2. package/component-catalog.json +279 -45
  3. package/dist/add-module.d.ts +20 -0
  4. package/dist/add-module.js +43 -7
  5. package/dist/add-route.d.ts +56 -0
  6. package/dist/add-route.js +286 -0
  7. package/dist/apply-design-md.d.ts +7 -0
  8. package/dist/apply-design-md.js +50 -0
  9. package/dist/apply-design.d.ts +64 -0
  10. package/dist/apply-design.js +273 -0
  11. package/dist/claude-md.d.ts +111 -0
  12. package/dist/claude-md.js +334 -0
  13. package/dist/cli.js +92 -4
  14. package/dist/derive-architecture.js +41 -36
  15. package/dist/design-compile.d.ts +71 -0
  16. package/dist/design-compile.js +98 -0
  17. package/dist/design-package.d.ts +83 -0
  18. package/dist/design-package.js +468 -0
  19. package/dist/design-presets.d.ts +86 -0
  20. package/dist/design-presets.js +642 -0
  21. package/dist/design-scaffold.d.ts +76 -0
  22. package/dist/design-scaffold.js +220 -0
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.js +4 -1
  25. package/dist/legacy-nav-renderers.d.ts +45 -0
  26. package/dist/legacy-nav-renderers.js +545 -0
  27. package/dist/lib/auth-secret-file.d.ts +19 -0
  28. package/dist/lib/auth-secret-file.js +112 -0
  29. package/dist/lib/design-checks.d.ts +78 -0
  30. package/dist/lib/design-checks.js +174 -0
  31. package/dist/lib/license-key-files.d.ts +9 -0
  32. package/dist/lib/license-key-files.js +2 -2
  33. package/dist/lib/module-license-gate.d.ts +19 -9
  34. package/dist/lib/module-license-gate.js +19 -8
  35. package/dist/lib/render-verdict.d.ts +52 -0
  36. package/dist/lib/render-verdict.js +77 -0
  37. package/dist/lib/scaffold-render-sweep.d.ts +105 -0
  38. package/dist/lib/scaffold-render-sweep.js +236 -0
  39. package/dist/module-architecture.d.ts +19 -16
  40. package/dist/module-architecture.js +64 -21
  41. package/dist/parse-args.d.ts +12 -2
  42. package/dist/parse-args.js +74 -13
  43. package/dist/programmatic.d.ts +30 -6
  44. package/dist/programmatic.js +206 -17
  45. package/dist/site-chrome.d.ts +19 -9
  46. package/dist/site-chrome.js +23 -13
  47. package/dist/site-manifest.d.ts +25 -0
  48. package/dist/site-manifest.js +254 -0
  49. package/dist/site-roster.d.ts +41 -0
  50. package/dist/site-roster.js +141 -8
  51. package/dist/starter-grid.d.ts +32 -16
  52. package/dist/starter-grid.js +129 -33
  53. package/dist/surfaces.d.ts +41 -9
  54. package/dist/surfaces.js +200 -83
  55. package/dist/template-manifest.d.ts +30 -13
  56. package/dist/template-manifest.js +49 -24
  57. package/package.json +5 -4
  58. package/site-templates/_base/content/en/UseCase/persona-1.mdx +7 -6
  59. package/site-templates/_base/content/en/UseCase/persona-2.mdx +7 -6
  60. package/site-templates/_base/content/en/UseCase/persona-3.mdx +7 -6
  61. package/site-templates/{minimalism-site/TEMPLATE-MANIFEST.json → aliases/minimalism-site.TEMPLATE-MANIFEST.json} +72 -40
  62. package/site-templates/designs/minimalism/DESIGN.md +98 -6
  63. package/site-templates/designs/minimalism/sample/README.md +48 -0
  64. package/site-templates/designs/standard/DESIGN.md +98 -6
  65. package/site-templates/marketing-site/DESIGN.md +98 -6
  66. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +60 -27
  67. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +50 -30
  68. package/site-templates/marketing-site-free/DESIGN.md +98 -6
  69. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +60 -24
  70. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +44 -27
  71. package/site-templates/marketing-site-free/ailk-template.json +1 -1
  72. package/site-templates/saas-product/DESIGN.md +98 -6
  73. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +127 -18
  74. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +74 -20
  75. package/site-templates/shapes/local-business-service/ailk-template.json +1 -1
  76. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +127 -18
  77. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +74 -20
  78. package/site-templates/shapes/organization-service/ailk-template.json +1 -1
  79. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +127 -18
  80. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +75 -21
  81. package/site-templates/shapes/person-service/ailk-template.json +1 -1
  82. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +1 -1
  83. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +2 -2
  84. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +4 -2
  85. package/site-templates/shapes/person-service/content/en/ServicesList/services.mdx +1 -1
  86. package/templates/.claude/rules/architecture.md +7 -0
  87. package/templates/.claude/skills/README.md +3 -2
  88. package/templates/.claude/skills/add-auth/references/env-vars.md +22 -15
  89. package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +3 -2
  90. package/templates/.claude/skills/add-page/SKILL.md +241 -238
  91. package/templates/.claude/skills/add-page/references/page-types.md +85 -76
  92. package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
  93. package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
  94. package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
  95. package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
  96. package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
  97. package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
  98. package/templates/.claude/skills/check-site/SKILL.md +23 -0
  99. package/templates/.claude/skills/fill-page/SKILL.md +26 -7
  100. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
  101. package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +28 -11
  102. package/templates/.claude/skills/update-page/SKILL.md +117 -0
  103. package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
  104. package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
  105. package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
  106. package/templates/.github/workflows/ci.yml +4 -0
  107. package/templates/.prettierignore +1 -0
  108. package/templates/CLAUDE.md +146 -103
  109. package/templates/DESIGN.md +98 -6
  110. package/templates/README.md +50 -38
  111. package/templates/apps/api/.env.example +2 -1
  112. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
  113. package/templates/apps/api/src/__tests__/server.test.ts +116 -0
  114. package/templates/apps/api/src/lib/stripe.ts +9 -0
  115. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
  116. package/templates/apps/api/src/middleware/auth.ts +54 -0
  117. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
  118. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
  119. package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
  120. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
  121. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
  122. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
  123. package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
  124. package/templates/apps/api/src/server.ts +28 -0
  125. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
  126. package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
  127. package/templates/apps/api/src/services/revalidation.ts +60 -15
  128. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
  129. package/templates/apps/mcp/src/tools/purchase.ts +4 -2
  130. package/templates/apps/web/.env.example +13 -0
  131. package/templates/apps/web/CLAUDE.md +22 -28
  132. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
  133. package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
  134. package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
  135. package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
  136. package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
  137. package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
  138. package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
  139. package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
  140. package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +4 -3
  141. package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
  142. package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
  143. package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
  144. package/templates/apps/web/app/[locale]/layout.tsx +35 -19
  145. package/templates/apps/web/app/[locale]/newsletter/page.tsx +1 -1
  146. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +1 -1
  147. package/templates/apps/web/app/[locale]/portfolio/page.tsx +1 -1
  148. package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
  149. package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
  150. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
  151. package/templates/apps/web/app/api/revalidate/route.ts +78 -36
  152. package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
  153. package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
  154. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
  155. package/templates/apps/web/lib/locale-guard.ts +18 -0
  156. package/templates/apps/web/lib/meet-placeholder.ts +5 -0
  157. package/templates/apps/web/lib/nav-config.ts +14 -13
  158. package/templates/apps/web/lib/site-brand.tsx +13 -9
  159. package/templates/apps/web/lib/site-logo.tsx +36 -0
  160. package/templates/apps/web/lib/site-theme.ts +46 -26
  161. package/templates/apps/web/messages/en.json +23 -9
  162. package/templates/apps/web/middleware.ts +28 -4
  163. package/templates/content/en/BookCall/book-a-call.mdx +80 -0
  164. package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
  165. package/templates/content/en/BookCall/onsite-service.mdx +56 -0
  166. package/templates/content/en/BookCall/start-project.mdx +56 -0
  167. package/templates/content/en/ContactPage/contact.mdx +40 -1
  168. package/templates/content/en/HomePage/home.mdx +2 -6
  169. package/templates/content/en/LandingPage/meet.mdx +59 -0
  170. package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
  171. package/templates/database/CHANGELOG.md +7 -0
  172. package/templates/database/package.json +1 -1
  173. package/templates/package.json +2 -1
  174. package/templates/tools/check-claude-md.ts +128 -0
  175. package/versions.json +33 -33
  176. package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -52
  177. package/site-templates/minimalism-site/DESIGN.md +0 -162
  178. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -458
  179. package/site-templates/minimalism-site/ailk-template.json +0 -23
  180. package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
  181. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -52
  182. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
  183. package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
  184. package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
  185. package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
  186. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -123
  187. package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
  188. package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
  189. package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
  190. package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
  191. package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +0 -38
  192. package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +0 -38
  193. package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +0 -38
  194. package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +0 -73
  195. package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
  196. package/site-templates/minimalism-site/provenance.json +0 -4
  197. package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
  198. package/templates/apps/web/app/[locale]/book-a-call/page.tsx +0 -50
  199. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
  200. /package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +0 -0
  201. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
  202. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
  203. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
  204. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
  205. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
  206. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
  207. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
  208. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
  209. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
  210. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
  211. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
@@ -95,6 +95,28 @@ One `page=<route>` region per roster row, generated from the seed file the compo
95
95
  _Detail route over `content/en/Service/` — 3 seed pages: `first-job.mdx`, `second-job.mdx`, `third-job.mdx`._
96
96
  <!-- generated:end -->
97
97
 
98
+ `/for` (the persona hub — every shape carries the family now, #6878 D7):
99
+
100
+ <!-- generated:begin page=/for -->
101
+
102
+ | # | Section | Component | Copy (first line) |
103
+ | --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
104
+ | 1 | `hero` (eyebrow "Customers" · 2 CTAs) | `Hero` | {Customers: who your product or service is for} |
105
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product or service to do} |
106
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
107
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
108
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product or service in time amount or less} |
109
+ | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
110
+
111
+ <!-- generated:end -->
112
+
113
+ `/for/[slug]`:
114
+
115
+ <!-- generated:begin page=/for/[slug] -->
116
+
117
+ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
118
+ <!-- generated:end -->
119
+
98
120
  `/about`:
99
121
 
100
122
  <!-- generated:begin page=/about -->
@@ -110,9 +132,10 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-job.mdx`, `sec
110
132
 
111
133
  <!-- generated:begin page=/contact -->
112
134
 
113
- | # | Section | Component | Copy (first line) |
114
- | --- | --------------------------------------------------------- | --------- | ------------------------------------- |
115
- | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
135
+ | # | Section | Component | Copy (first line) |
136
+ | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
137
+ | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
138
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
116
139
 
117
140
  <!-- generated:end -->
118
141
 
@@ -128,7 +151,7 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-job.mdx`, `sec
128
151
 
129
152
  <!-- generated:end -->
130
153
 
131
- `/glossary`, `/newsletter`, `/book-a-call` (base-layer seeds every starter carries, #6658 D5 — `/newsletter` is this tree's own byte copy of the Free newsletter, D4/D9):
154
+ `/glossary`, `/newsletter` (base-layer seeds every starter carries, #6658 D5 — `/newsletter` is this tree's own byte copy of the Free newsletter, D4/D9), plus the always-copied overlay's `/meet` hub and `/meet/[slug]` BookCall detail seeds (#6897 D3-D5):
132
155
 
133
156
  <!-- generated:begin page=/glossary -->
134
157
 
@@ -148,15 +171,38 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-job.mdx`, `sec
148
171
 
149
172
  <!-- generated:end -->
150
173
 
151
- <!-- generated:begin page=/book-a-call -->
174
+ <!-- generated:begin page=/meet -->
152
175
 
153
- | # | Section | Component | Copy (first line) |
154
- | --- | -------------------------------------- | --------- | ------------------------------------------ |
155
- | 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
156
- | 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
176
+ | # | Section | Component | Copy (first line) |
177
+ | --- | -------------------------------------- | --------- | --------------------- |
178
+ | 1 | `hero` (eyebrow "Meet") | `Hero` | {Book a time with us} |
179
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | |
157
180
 
158
181
  <!-- generated:end -->
159
182
 
183
+ <!-- generated:begin page=/meet/[slug] -->
184
+
185
+ | # | Section | Component | Copy (first line) |
186
+ | --- | -------------------------------------- | -------------- | ------------------------------------------------ |
187
+ | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
188
+ | 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
189
+ | 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
190
+ | 4 | `content-block` (1 CTA) | `ContentBlock` | |
191
+
192
+ <!-- generated:end -->
193
+
194
+ `/sign-in`, `/sign-up` (code routes — the `SignInCard` island and the sign-up form inside the locale layout, whose header links both; listed so the manifest is a complete install record, #6797):
195
+
196
+ <!-- generated:begin page=/sign-in -->
197
+
198
+ _Code route — no content, no sections._
199
+ <!-- generated:end -->
200
+
201
+ <!-- generated:begin page=/sign-up -->
202
+
203
+ _Code route — no content, no sections._
204
+ <!-- generated:end -->
205
+
160
206
  `/purchase-policy` (this tree's own service-shape override — cancellation and refunds, D4):
161
207
 
162
208
  <!-- generated:begin page=/purchase-policy -->
@@ -232,20 +278,22 @@ The standard page set for this shape (`derive-roster.py --shape local-business-s
232
278
  | `ProjectsList` · `Project` | the portfolio pair (`/portfolio`) is the proof of past work; `/projects` is the signal-collectors sample listing |
233
279
  | `Pricing` | a service is priced on its own `Service` page (or quoted), not on a pricing table |
234
280
  | `CaseStudiesList` · `CaseStudy` · `TestimonialsList` · `ClientsList` | proof pages need real customers (the #6658 reason) |
235
- | `UseCasesList` · `UseCase` | each `Service` page names who it is for; the `_base` persona seeds are product copy that links `/pricing` |
236
281
  | `EventsList` · `Event` · `DownloadsList` | a placeholder starter has no events or downloads |
237
282
  | `ResourcesHub` · `ResourceDetail` · `HowTo` · `Whitepaper` | the Resources content system is the goal-driven default a site grows into, not a starter page |
238
283
  | `LocationsList` · `Location` · `ServiceAreaPage` | a placeholder starter is one location; `/contact` carries the address and the area served |
239
284
 
240
285
  **Rows added:**
241
286
 
242
- | Row added | Reason |
243
- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
244
- | `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3) |
245
- | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
246
- | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
287
+ | Row added | Reason |
288
+ | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
289
+ | `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3) |
290
+ | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
291
+ | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
292
+ | `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
293
+
294
+ `|S − D| = 13` and `|R| = 18`.
247
295
 
248
- `|S − D| = 11` and `|R| = 15`.
296
+ `/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
249
297
 
250
298
  ## 4. Roster, as the registry declares it
251
299
 
@@ -263,16 +311,21 @@ local-business-service:
263
311
  - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
264
312
  - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
265
313
  - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
314
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
315
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
266
316
  - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
267
317
  - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
268
318
  - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
269
319
  - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
270
320
  - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
271
- - { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
321
+ - { route: "/sign-in", kind: route }
322
+ - { route: "/sign-up", kind: route }
272
323
  - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
273
324
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
274
325
  - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
275
326
  - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
327
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
328
+ - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
276
329
  - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
277
330
  - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
278
331
  ```
@@ -283,11 +336,12 @@ By source:
283
336
 
284
337
  ```
285
338
  starter: / · /services · /services/<slug> · /about · /contact · /faq
286
- /glossary · /newsletter · /book-a-call · /purchase-policy
287
- /privacy · /terms · /blog · /portfolio · /portfolio/<slug>
339
+ /glossary · /newsletter · /sign-in · /sign-up
340
+ /purchase-policy · /privacy · /terms · /blog · /meet · /meet/<slug>
341
+ /portfolio · /portfolio/<slug>
288
342
  ```
289
343
 
290
- Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own fifteen rows.
344
+ Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own seventeen rows.
291
345
 
292
346
  ## 5. Component inventory
293
347
 
@@ -6,5 +6,5 @@
6
6
  "provenance.json": ".ailk-template.json",
7
7
  "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
8
  },
9
- "postInstall": "Starter local-business-service installed. Its /faq, /contact and /blog seed pages came with the always-copied overlay; /glossary, /newsletter, /book-a-call, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three jobs), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder — replace it before you launch."
9
+ "postInstall": "Starter local-business-service installed. Its /faq, /contact, /blog, /meet and its four /meet/<slug> seed pages came with the always-copied overlay; /glossary, /newsletter, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three jobs), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder \u2014 replace it before you launch."
10
10
  }
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "real-estate"],
5
5
  "shape": "organization-service",
6
6
  "design": "standard",
7
- "generatedHash": "ecd6d84a7b4b19b1fa2f36060060bfebad83ad79da8f0328db1846545c0136a7",
7
+ "generatedHash": "f469bf694b5a4fff3c818757230f56f035d33b6aa9e43039e75a0c20a1558c87",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -125,6 +125,61 @@
125
125
  "chrome": "on",
126
126
  "sections": []
127
127
  },
128
+ {
129
+ "route": "/for",
130
+ "kind": "page",
131
+ "pageType": "UseCasesList",
132
+ "schema": "UseCasesList",
133
+ "shell": "MarketingShell",
134
+ "chrome": "on",
135
+ "sections": [
136
+ {
137
+ "type": "hero",
138
+ "component": "Hero"
139
+ },
140
+ {
141
+ "type": "items",
142
+ "component": "Items",
143
+ "options": {
144
+ "columns": 3
145
+ }
146
+ },
147
+ {
148
+ "type": "logoCloud",
149
+ "component": "LogoCloud",
150
+ "options": {
151
+ "layout": "inline"
152
+ }
153
+ },
154
+ {
155
+ "type": "testimonials",
156
+ "component": "Testimonials"
157
+ },
158
+ {
159
+ "type": "cta",
160
+ "component": "CTA"
161
+ },
162
+ {
163
+ "type": "faq",
164
+ "component": "FAQ"
165
+ }
166
+ ]
167
+ },
168
+ {
169
+ "route": "/for/[slug]",
170
+ "kind": "page",
171
+ "contentDir": "content/en/UseCase",
172
+ "seeds": [
173
+ "content/en/UseCase/persona-1.mdx",
174
+ "content/en/UseCase/persona-2.mdx",
175
+ "content/en/UseCase/persona-3.mdx"
176
+ ],
177
+ "pageType": "UseCase",
178
+ "schema": "UseCase",
179
+ "shell": "MarketingShell",
180
+ "chrome": "on",
181
+ "sections": []
182
+ },
128
183
  {
129
184
  "route": "/contact",
130
185
  "kind": "page",
@@ -136,6 +191,13 @@
136
191
  {
137
192
  "type": "hero",
138
193
  "component": "Hero"
194
+ },
195
+ {
196
+ "type": "items",
197
+ "component": "Items",
198
+ "options": {
199
+ "columns": 2
200
+ }
139
201
  }
140
202
  ]
141
203
  },
@@ -201,25 +263,22 @@
201
263
  ]
202
264
  },
203
265
  {
204
- "route": "/book-a-call",
205
- "kind": "page",
206
- "pageType": "BookCall",
207
- "schema": "BookCall",
266
+ "route": "/sign-in",
267
+ "kind": "route",
268
+ "pageType": null,
269
+ "schema": null,
208
270
  "shell": "MarketingShell",
209
271
  "chrome": "on",
210
- "sections": [
211
- {
212
- "type": "hero",
213
- "component": "Hero"
214
- },
215
- {
216
- "type": "items",
217
- "component": "Items",
218
- "options": {
219
- "columns": 3
220
- }
221
- }
222
- ]
272
+ "sections": []
273
+ },
274
+ {
275
+ "route": "/sign-up",
276
+ "kind": "route",
277
+ "pageType": null,
278
+ "schema": null,
279
+ "shell": "MarketingShell",
280
+ "chrome": "on",
281
+ "sections": []
223
282
  },
224
283
  {
225
284
  "route": "/privacy",
@@ -304,6 +363,56 @@
304
363
  }
305
364
  ]
306
365
  },
366
+ {
367
+ "route": "/meet",
368
+ "kind": "page",
369
+ "pageType": "LandingPage",
370
+ "schema": "WebPage",
371
+ "shell": "MarketingShell",
372
+ "chrome": "on",
373
+ "sections": [
374
+ {
375
+ "type": "hero",
376
+ "component": "Hero"
377
+ },
378
+ {
379
+ "type": "items",
380
+ "component": "Items",
381
+ "options": {
382
+ "columns": 2
383
+ }
384
+ }
385
+ ]
386
+ },
387
+ {
388
+ "route": "/meet/[slug]",
389
+ "kind": "page",
390
+ "pageType": "BookCall",
391
+ "schema": "BookCall",
392
+ "shell": "MarketingShell",
393
+ "chrome": "on",
394
+ "sections": [
395
+ {
396
+ "type": "hero",
397
+ "component": "Hero"
398
+ },
399
+ {
400
+ "type": "cta",
401
+ "component": "CTA"
402
+ },
403
+ {
404
+ "type": "items",
405
+ "component": "Items",
406
+ "options": {
407
+ "columns": 3
408
+ }
409
+ },
410
+ {
411
+ "type": "content-block",
412
+ "component": "ContentBlock"
413
+ }
414
+ ]
415
+ },
307
416
  {
308
417
  "route": "/portfolio",
309
418
  "kind": "page",
@@ -105,13 +105,36 @@ One `page=<route>` region per roster row, generated from the seed file the compo
105
105
  _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx`, `second-engagement.mdx`, `third-engagement.mdx`._
106
106
  <!-- generated:end -->
107
107
 
108
+ `/for` (the persona hub — every shape carries the family now, #6878 D7):
109
+
110
+ <!-- generated:begin page=/for -->
111
+
112
+ | # | Section | Component | Copy (first line) |
113
+ | --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
114
+ | 1 | `hero` (eyebrow "Customers" · 2 CTAs) | `Hero` | {Customers: who your product or service is for} |
115
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product or service to do} |
116
+ | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
117
+ | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
118
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product or service in time amount or less} |
119
+ | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
120
+
121
+ <!-- generated:end -->
122
+
123
+ `/for/[slug]`:
124
+
125
+ <!-- generated:begin page=/for/[slug] -->
126
+
127
+ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
128
+ <!-- generated:end -->
129
+
108
130
  `/contact` (always-copied overlay seed):
109
131
 
110
132
  <!-- generated:begin page=/contact -->
111
133
 
112
- | # | Section | Component | Copy (first line) |
113
- | --- | --------------------------------------------------------- | --------- | ------------------------------------- |
114
- | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
134
+ | # | Section | Component | Copy (first line) |
135
+ | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
136
+ | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
137
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
115
138
 
116
139
  <!-- generated:end -->
117
140
 
@@ -127,7 +150,7 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx
127
150
 
128
151
  <!-- generated:end -->
129
152
 
130
- `/glossary`, `/newsletter`, `/book-a-call` (base-layer seeds every starter carries, #6658 D5 — `/newsletter` is this tree's own byte copy of the Free newsletter, D4/D9):
153
+ `/glossary`, `/newsletter` (base-layer seeds every starter carries, #6658 D5 — `/newsletter` is this tree's own byte copy of the Free newsletter, D4/D9), plus the always-copied overlay's `/meet` hub and `/meet/[slug]` BookCall detail seeds (#6897 D3-D5):
131
154
 
132
155
  <!-- generated:begin page=/glossary -->
133
156
 
@@ -147,15 +170,38 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx
147
170
 
148
171
  <!-- generated:end -->
149
172
 
150
- <!-- generated:begin page=/book-a-call -->
173
+ <!-- generated:begin page=/meet -->
151
174
 
152
- | # | Section | Component | Copy (first line) |
153
- | --- | -------------------------------------- | --------- | ------------------------------------------ |
154
- | 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
155
- | 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
175
+ | # | Section | Component | Copy (first line) |
176
+ | --- | -------------------------------------- | --------- | --------------------- |
177
+ | 1 | `hero` (eyebrow "Meet") | `Hero` | {Book a time with us} |
178
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | |
156
179
 
157
180
  <!-- generated:end -->
158
181
 
182
+ <!-- generated:begin page=/meet/[slug] -->
183
+
184
+ | # | Section | Component | Copy (first line) |
185
+ | --- | -------------------------------------- | -------------- | ------------------------------------------------ |
186
+ | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
187
+ | 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
188
+ | 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
189
+ | 4 | `content-block` (1 CTA) | `ContentBlock` | |
190
+
191
+ <!-- generated:end -->
192
+
193
+ `/sign-in`, `/sign-up` (code routes — the `SignInCard` island and the sign-up form inside the locale layout, whose header links both; listed so the manifest is a complete install record, #6797):
194
+
195
+ <!-- generated:begin page=/sign-in -->
196
+
197
+ _Code route — no content, no sections._
198
+ <!-- generated:end -->
199
+
200
+ <!-- generated:begin page=/sign-up -->
201
+
202
+ _Code route — no content, no sections._
203
+ <!-- generated:end -->
204
+
159
205
  `/privacy`, `/terms` (base-layer seeds):
160
206
 
161
207
  <!-- generated:begin page=/privacy -->
@@ -231,19 +277,21 @@ The standard page set for this shape (`derive-roster.py --shape organization-ser
231
277
  | `ProjectsList` · `Project` | the portfolio pair (`/portfolio`) is the proof of past work; `/projects` is the signal-collectors sample listing |
232
278
  | `Pricing` | a service is priced on its own `Service` page (or quoted), not on a pricing table |
233
279
  | `CaseStudiesList` · `CaseStudy` · `TestimonialsList` · `ClientsList` | proof pages need real customers (the #6658 reason) |
234
- | `UseCasesList` · `UseCase` | each `Service` page names who it is for; the `_base` persona seeds are product copy that links `/pricing` |
235
280
  | `EventsList` · `Event` · `DownloadsList` | a placeholder starter has no events or downloads |
236
281
  | `ResourcesHub` · `ResourceDetail` · `HowTo` · `Whitepaper` | the Resources content system is the goal-driven default a site grows into, not a starter page |
237
282
 
238
283
  **Rows added:**
239
284
 
240
- | Row added | Reason |
241
- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
242
- | `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3) |
243
- | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
244
- | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
285
+ | Row added | Reason |
286
+ | --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
287
+ | `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3) |
288
+ | `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
289
+ | `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (§ 1.8) |
290
+ | `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
291
+
292
+ `|S − D| = 13` and `|R| = 18`.
245
293
 
246
- `|S − D| = 11` and `|R| = 15`.
294
+ `/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
247
295
 
248
296
  ## 4. Roster, as the registry declares it
249
297
 
@@ -262,15 +310,20 @@ organization-service:
262
310
  - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
263
311
  - { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
264
312
  - { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
313
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
314
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
265
315
  - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
266
316
  - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
267
317
  - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
268
318
  - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
269
- - { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
319
+ - { route: "/sign-in", kind: route }
320
+ - { route: "/sign-up", kind: route }
270
321
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
271
322
  - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
272
323
  - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
273
324
  - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
325
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
326
+ - { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
274
327
  - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
275
328
  - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
276
329
  ```
@@ -281,11 +334,12 @@ By source:
281
334
 
282
335
  ```
283
336
  starter: / · /about · /services · /services/<slug> · /contact · /faq
284
- /glossary · /newsletter · /book-a-call · /privacy · /terms
285
- /purchase-policy · /blog · /portfolio · /portfolio/<slug>
337
+ /glossary · /newsletter · /sign-in · /sign-up
338
+ /privacy · /terms · /purchase-policy · /blog · /meet · /meet/<slug>
339
+ /portfolio · /portfolio/<slug>
286
340
  ```
287
341
 
288
- Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own fifteen rows.
342
+ Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own seventeen rows.
289
343
 
290
344
  ## 5. Component inventory
291
345
 
@@ -6,5 +6,5 @@
6
6
  "provenance.json": ".ailk-template.json",
7
7
  "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
8
  },
9
- "postInstall": "Starter organization-service installed. Its /faq, /contact and /blog seed pages came with the always-copied overlay; /glossary, /newsletter, /book-a-call, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three engagements), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder — replace it before you launch."
9
+ "postInstall": "Starter organization-service installed. Its /faq, /contact, /blog, /meet and its four /meet/<slug> seed pages came with the always-copied overlay; /glossary, /newsletter, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three engagements), /purchase-policy and /portfolio pages are its own compositions. Every line of copy is a placeholder \u2014 replace it before you launch."
10
10
  }