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
@@ -4,7 +4,7 @@
4
4
  "categories": ["accounting", "legal", "technology"],
5
5
  "shape": "organization-product",
6
6
  "design": "standard",
7
- "generatedHash": "e7d2b343d863a1b095dff583c61421b6fc95a4a55e10796568435672a209abfb",
7
+ "generatedHash": "54b11878a0ad8b1f1dccae73ba4580c08b7135bec274bd52182ffd431a6108ee",
8
8
  "layout": {
9
9
  "nav": "full",
10
10
  "footer": "columns",
@@ -160,7 +160,7 @@
160
160
  "sections": []
161
161
  },
162
162
  {
163
- "route": "/use-cases",
163
+ "route": "/for",
164
164
  "kind": "page",
165
165
  "pageType": "UseCasesList",
166
166
  "schema": "UseCasesList",
@@ -200,7 +200,7 @@
200
200
  ]
201
201
  },
202
202
  {
203
- "route": "/use-cases/[slug]",
203
+ "route": "/for/[slug]",
204
204
  "kind": "page",
205
205
  "contentDir": "content/en/UseCase",
206
206
  "seeds": [
@@ -329,6 +329,13 @@
329
329
  {
330
330
  "type": "hero",
331
331
  "component": "Hero"
332
+ },
333
+ {
334
+ "type": "items",
335
+ "component": "Items",
336
+ "options": {
337
+ "columns": 2
338
+ }
332
339
  }
333
340
  ]
334
341
  },
@@ -368,27 +375,6 @@
368
375
  }
369
376
  ]
370
377
  },
371
- {
372
- "route": "/book-a-call",
373
- "kind": "page",
374
- "pageType": "BookCall",
375
- "schema": "BookCall",
376
- "shell": "MarketingShell",
377
- "chrome": "on",
378
- "sections": [
379
- {
380
- "type": "hero",
381
- "component": "Hero"
382
- },
383
- {
384
- "type": "items",
385
- "component": "Items",
386
- "options": {
387
- "columns": 3
388
- }
389
- }
390
- ]
391
- },
392
378
  {
393
379
  "route": "/sign-in",
394
380
  "kind": "route",
@@ -490,6 +476,56 @@
490
476
  }
491
477
  ]
492
478
  },
479
+ {
480
+ "route": "/meet",
481
+ "kind": "page",
482
+ "pageType": "LandingPage",
483
+ "schema": "WebPage",
484
+ "shell": "MarketingShell",
485
+ "chrome": "on",
486
+ "sections": [
487
+ {
488
+ "type": "hero",
489
+ "component": "Hero"
490
+ },
491
+ {
492
+ "type": "items",
493
+ "component": "Items",
494
+ "options": {
495
+ "columns": 2
496
+ }
497
+ }
498
+ ]
499
+ },
500
+ {
501
+ "route": "/meet/[slug]",
502
+ "kind": "page",
503
+ "pageType": "BookCall",
504
+ "schema": "BookCall",
505
+ "shell": "MarketingShell",
506
+ "chrome": "on",
507
+ "sections": [
508
+ {
509
+ "type": "hero",
510
+ "component": "Hero"
511
+ },
512
+ {
513
+ "type": "cta",
514
+ "component": "CTA"
515
+ },
516
+ {
517
+ "type": "items",
518
+ "component": "Items",
519
+ "options": {
520
+ "columns": 3
521
+ }
522
+ },
523
+ {
524
+ "type": "content-block",
525
+ "component": "ContentBlock"
526
+ }
527
+ ]
528
+ },
493
529
  {
494
530
  "route": "/portfolio",
495
531
  "kind": "page",
@@ -99,28 +99,28 @@ Reference: `screenshots/home.png`, `copy/home.txt`. Ten page sections; the newsl
99
99
 
100
100
  <!-- generated:end -->
101
101
 
102
- ### `/use-cases` — UseCasesList · schema `CollectionPage` · chrome on
102
+ ### `/for` — UseCasesList · schema `CollectionPage` · chrome on
103
103
 
104
- Rendered by the `/use-cases` route over `content/en/UseCasesList/use-cases.mdx` — a UseCasesList page composing `sections[]` (operator ruling 2026-09-23), emitting the UseCasesList builder's `CollectionPage`. Since #6658 D4 it is a real list: one `items` section of three cards, each linking a `UseCase` page and titled with that page's title, so the `ItemList` names the three pages. The how-it-works steps moved to the product page.
104
+ Rendered by the `/for` route over `content/en/UseCasesList/for.mdx` — a UseCasesList page composing `sections[]` (operator ruling 2026-09-23), emitting the UseCasesList builder's `CollectionPage`. Since #6658 D4 it is a real list: one `items` section of three cards, each linking a `UseCase` page and titled with that page's title, so the `ItemList` names the three pages. The how-it-works steps moved to the product page.
105
105
 
106
- <!-- generated:begin page=/use-cases -->
106
+ <!-- generated:begin page=/for -->
107
107
 
108
108
  | # | Section | Component | Copy (first line) |
109
109
  | --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
110
- | 1 | `hero` (eyebrow "Use cases" · 2 CTAs) | `Hero` | {Use cases: who your product is for} |
111
- | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product to do} |
110
+ | 1 | `hero` (eyebrow "Customers" · 2 CTAs) | `Hero` | {Customers: who your product or service is for} |
111
+ | 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product or service to do} |
112
112
  | 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
113
113
  | 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
114
- | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product in time amount or less} |
114
+ | 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product or service in time amount or less} |
115
115
  | 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
116
116
 
117
117
  <!-- generated:end -->
118
118
 
119
- ### `/use-cases/<slug>` — UseCase · schema `WebPage` → `Article` · chrome on
119
+ ### `/for/<slug>` — UseCase · schema `WebPage` → `Article` · chrome on
120
120
 
121
- Three placeholder use cases from the base layer (#6658 D4): `first-use-case`, `second-use-case` and `third-use-case`, rendered as prose by the `/use-cases/[slug]` route.
121
+ Three placeholder use cases from the base layer (#6658 D4): `first-use-case`, `second-use-case` and `third-use-case`, rendered as prose by the `/for/[slug]` route.
122
122
 
123
- <!-- generated:begin page=/use-cases/[slug] -->
123
+ <!-- generated:begin page=/for/[slug] -->
124
124
 
125
125
  _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
126
126
  <!-- generated:end -->
@@ -141,7 +141,7 @@ Lists every `SoftwareProduct` page by slug. The route is core since #6658: the p
141
141
 
142
142
  ### `/features/<slug>` (seeds: `feature-1` · `feature-2` · `feature-3`) — Feature · schema `WebPage` → `SoftwareApplication` (named for the feature, `featureList: [it]`) · chrome on
143
143
 
144
- Reference: `screenshots/features.png`, `copy/features.txt`, plus the how-it-works steps. One page per feature (#6721, reversing #6658 D5), rendered by the `/features/[slug]` route over `content/en/Feature/<slug>.mdx`; the `/features` hub (`FeaturesList`) lists them. Its JSON-LD is a `WebPage` whose `mainEntity` is a `SoftwareApplication` named by the page title; its feature titles become the site's `featureList` when `_site.mdx` declares a `SoftwareApplication` secondary. It carries the former `/features` sections, with their links re-pointed to in-page anchors, and the how-it-works steps that moved off `/use-cases` (the brief's "how-it-works folds into the product page"). The nav's Features links and the home page's feature links point here.
144
+ Reference: `screenshots/features.png`, `copy/features.txt`, plus the how-it-works steps. One page per feature (#6721, reversing #6658 D5), rendered by the `/features/[slug]` route over `content/en/Feature/<slug>.mdx`; the `/features` hub (`FeaturesList`) lists them. Its JSON-LD is a `WebPage` whose `mainEntity` is a `SoftwareApplication` named by the page title; its feature titles become the site's `featureList` when `_site.mdx` declares a `SoftwareApplication` secondary. It carries the former `/features` sections, with their links re-pointed to in-page anchors, and the how-it-works steps that moved off `/for` (the brief's "how-it-works folds into the product page"). The nav's Features links and the home page's feature links point here.
145
145
 
146
146
  <!-- generated:begin page=/features/[slug] -->
147
147
 
@@ -201,9 +201,10 @@ Reference: `screenshots/contact.png`, `copy/contact.txt`. The reference is a spl
201
201
 
202
202
  <!-- generated:begin page=/contact -->
203
203
 
204
- | # | Section | Component | Copy (first line) |
205
- | --- | --------------------------------------------------------- | --------- | ------------------------------------- |
206
- | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
204
+ | # | Section | Component | Copy (first line) |
205
+ | --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
206
+ | 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
207
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
207
208
 
208
209
  <!-- generated:end -->
209
210
 
@@ -233,16 +234,31 @@ A base-layer seed every starter carries (#6658 D5). The form posts to lead captu
233
234
 
234
235
  <!-- generated:end -->
235
236
 
236
- ### `/book-a-call` — BookCall · schema `WebPage` → `Offer` · chrome on
237
+ ### `/meet` — LandingPage · schema `WebPage` · chrome on
237
238
 
238
- A base-layer seed every starter carries (#6658 D5): a hero whose call to action is `/contact`, then what happens on the call. A template carrying the scheduling module overrides the seed so the call to action opens `/meet`. Linked from the footer's Site pages column.
239
+ An always-copied overlay seed (#6897 D3): a meeting-types hub, served by the generic `[slug]` route, listing the four `/meet/<slug>` tiles below through the same `items` `tiles` variant Contact uses. A template carrying the scheduling module serves its own `meet/` route directory instead, by Next.js static-segment precedence.
239
240
 
240
- <!-- generated:begin page=/book-a-call -->
241
+ <!-- generated:begin page=/meet -->
241
242
 
242
- | # | Section | Component | Copy (first line) |
243
- | --- | -------------------------------------- | --------- | ------------------------------------------ |
244
- | 1 | `hero` (eyebrow "Book a call" · 1 CTA) | `Hero` | {Book a call: what a visitor gets from it} |
245
- | 2 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
243
+ | # | Section | Component | Copy (first line) |
244
+ | --- | -------------------------------------- | --------- | --------------------- |
245
+ | 1 | `hero` (eyebrow "Meet") | `Hero` | {Book a time with us} |
246
+ | 2 | `items` (tiles · columns=2 · items ×4) | `Items` | |
247
+
248
+ <!-- generated:end -->
249
+
250
+ ### `/meet/[slug]` — BookCall · schema `WebPage` -> `Offer` · chrome on
251
+
252
+ Four always-copied overlay seeds (#6897 D4/D5), served by the new `[slug]/[detail]` route: each carries a visitor-facing "{Get in touch}" CTA to `/contact`, an owner-placeholder upgrade block linking the pricing page in place of the calendar, and a "<- All meeting types" link back to `/meet`. `book-a-call` also carries the retired `/book-a-call` page's "What happens on the call?" section, moved here verbatim (#6897 D10). Linked from the footer's Site pages column (`/meet/book-a-call`, always rendered - never gated on a surface, the same `/blog` precedent).
253
+
254
+ <!-- generated:begin page=/meet/[slug] -->
255
+
256
+ | # | Section | Component | Copy (first line) |
257
+ | --- | -------------------------------------- | -------------- | ------------------------------------------------ |
258
+ | 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
259
+ | 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
260
+ | 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
261
+ | 4 | `content-block` (1 CTA) | `ContentBlock` | |
246
262
 
247
263
  <!-- generated:end -->
248
264
 
@@ -389,21 +405,22 @@ marketing-site-free:
389
405
  - { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
390
406
  - { route: "/features", kind: page, content: ["content/en/FeaturesList/features.mdx"] }
391
407
  - { route: "/features/[slug]", kind: page, contentDir: "content/en/Feature" }
392
- - { route: "/use-cases", kind: page, content: ["content/en/UseCasesList/use-cases.mdx"] }
393
- - { route: "/use-cases/[slug]", kind: page, contentDir: "content/en/UseCase" }
408
+ - { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
409
+ - { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
394
410
  - { route: "/pricing", kind: page, content: ["content/en/Pricing/pricing.mdx"] }
395
411
  - { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
396
412
  - { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
397
413
  - { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
398
414
  - { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
399
415
  - { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
400
- - { route: "/book-a-call", kind: page, content: ["content/en/BookCall/book-call.mdx"] }
401
416
  - { route: "/sign-in", kind: route }
402
417
  - { route: "/sign-up", kind: route }
403
418
  - { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
404
419
  - { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
405
420
  - { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
406
421
  - { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
422
+ - { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
423
+ - { 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"] }
407
424
  - { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
408
425
  - { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
409
426
  ```
@@ -432,10 +449,10 @@ reversed (`docs/decisions/starter-roster-page-set.md` D4, D7).
432
449
  | `Integration` | a placeholder starter has no integrations to list |
433
450
  | `CoursesList` | there is no course offering |
434
451
  | `Course` | there is no course offering |
435
- | `CaseStudiesList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
436
- | `CaseStudy` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
437
- | `TestimonialsList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
438
- | `ClientsList` | proof pages need real customers; the use-cases page carries one placeholder testimonial and one logo strip instead |
452
+ | `CaseStudiesList` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
453
+ | `CaseStudy` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
454
+ | `TestimonialsList` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
455
+ | `ClientsList` | proof pages need real customers; the customers page carries one placeholder testimonial and one logo strip instead |
439
456
 
440
457
  **Rows added:**
441
458
 
@@ -6,5 +6,5 @@
6
6
  "provenance.json": ".ailk-template.json",
7
7
  "TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
8
8
  },
9
- "postInstall": "Template marketing-site-free installed. Its /pricing, /privacy, /terms, /glossary, /newsletter, /book-a-call and three /use-cases/<slug> seed pages came with the base layer it extends (content/en/) - replace the placeholder copy before you launch."
9
+ "postInstall": "Template marketing-site-free installed. Its /pricing, /privacy, /terms, /glossary, /newsletter and three /for/<slug> seed pages came with the base layer it extends (content/en/); /meet and its four /meet/<slug> pages came with the always-copied overlay - replace the placeholder copy before you launch."
10
10
  }
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: Standard
3
- description: The standard design — the black-on-white foundation any shape wears by default: full navigation, a multi-column footer, the document-scroll home.
3
+ description: "The standard design — the black-on-white foundation any shape wears by default: full navigation, a multi-column footer, the document-scroll home."
4
4
  colors:
5
5
  bg: "#ffffff"
6
6
  fg: "#000000"
@@ -15,6 +15,19 @@ colors:
15
15
  fg-dark: "#ffffff"
16
16
  border-dark: "#ffffff"
17
17
  brand-dark: "#ffffff"
18
+ text-muted-dark: "#cccccc"
19
+ treatments:
20
+ corners: square
21
+ eyebrowCase: sentence
22
+ placeholders: fill
23
+ checkmarks: plain
24
+ layout:
25
+ nav: full
26
+ footer: columns
27
+ announcementBanner: false
28
+ home: default
29
+ copy:
30
+ density: standard
18
31
  typography:
19
32
  display:
20
33
  fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
@@ -69,9 +82,12 @@ spacing:
69
82
  stays on-system.
70
83
  Edit the canonical file, never a copy — a test holds every copy to it.
71
84
 
72
- The tokens above describe what the site RENDERS today. Colours come from
73
- content/_site.mdx (`theme.colors`); type, radius and spacing are platform
74
- defaults a site cannot override yet — see "Where this is heading" below.
85
+ The tokens above describe what the site RENDERS today. The design's own
86
+ colours and shape knobs live in content/_site.mdx `theme:`, which
87
+ `create-ailk apply-design` replaces wholesale; the owner's brand colours and
88
+ fonts live beside it in `brand.colors` and `brand.fonts`, which applying a
89
+ design never rewrites. Radius and spacing are platform defaults a site
90
+ cannot override yet — see "Where this is heading" below.
75
91
  -->
76
92
 
77
93
  # Standard
@@ -84,6 +100,27 @@ Every page is composed from the AI Launch Kit component library (`@working-theor
84
100
 
85
101
  ## Colors
86
102
 
103
+ <!-- generated:begin colors -->
104
+
105
+ | Key | Value | Compiles to |
106
+ | ------------------- | --------- | -------------------------------------------------------------------------------------------------------------- |
107
+ | `bg` | `#ffffff` | `light.bg` |
108
+ | `fg` | `#000000` | `light.text` |
109
+ | `surface` | `#ffffff` | `light.surface` |
110
+ | `surface-secondary` | `#ffffff` | `light.bgMuted` |
111
+ | `border` | `#000000` | `light.border` |
112
+ | `text-muted` | `#333333` | `light.textMuted` |
113
+ | `brand` | `#000000` | `light.primary` |
114
+ | `fg-on-brand` | `#ffffff` | `light.primaryFg` |
115
+ | `accent` | `#000000` | `light.accent` |
116
+ | `bg-dark` | `#000000` | `dark.bg`, `dark.bgMuted` (fallback of L1), `dark.surface` (fallback of L2), `dark.primaryFg` (fallback of L4) |
117
+ | `fg-dark` | `#ffffff` | `dark.text` |
118
+ | `border-dark` | `#ffffff` | `dark.border` |
119
+ | `brand-dark` | `#ffffff` | `dark.primary`, `dark.accent` (fallback of L5) |
120
+ | `text-muted-dark` | `#cccccc` | `dark.textMuted` |
121
+
122
+ <!-- generated:end -->
123
+
87
124
  ### Primary
88
125
 
89
126
  **Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
@@ -100,6 +137,18 @@ Dark mode inverts: black ground, white ink, white rules, white primary button wi
100
137
 
101
138
  ## Typography
102
139
 
140
+ <!-- generated:begin typography -->
141
+
142
+ | Role | Family | Size | Weight | Line height | Tracking |
143
+ | ----------------- | ------------------------------------------------------------------------ | ---------- | ------ | ----------- | -------- |
144
+ | `display` | `system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif` | `3.5rem` | 700 | 1.1 | `normal` |
145
+ | `heading-section` | `system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif` | `3rem` | 700 | 1.1 | `normal` |
146
+ | `heading-item` | — | `2rem` | 700 | 1.375 | `normal` |
147
+ | `body` | `system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif` | `1.125rem` | 400 | 1.5 | — |
148
+ | `eyebrow` | — | `0.875rem` | 600 | 1.4 | `0.05em` |
149
+
150
+ <!-- generated:end -->
151
+
103
152
  System sans throughout; no web font.
104
153
 
105
154
  ### Hierarchy
@@ -118,10 +167,53 @@ The small label above a section heading is **kept** as part of this foundation's
118
167
 
119
168
  ## Layout
120
169
 
170
+ <!-- generated:begin layout -->
171
+
172
+ | Knob | Value |
173
+ | -------------------- | --------- |
174
+ | `nav` | `full` |
175
+ | `footer` | `columns` |
176
+ | `announcementBanner` | `false` |
177
+ | `home` | `default` |
178
+
179
+ | Spacing | Value |
180
+ | ---------------- | -------- |
181
+ | `section` | `7rem` |
182
+ | `section-mobile` | `4rem` |
183
+ | `card` | `1.5rem` |
184
+ | `grid` | `1.5rem` |
185
+ | `container` | `1280px` |
186
+ | `measure` | `36rem` |
187
+
188
+ <!-- generated:end -->
189
+
121
190
  Full navigation; a multi-column footer; the default home. The home-only announcement banner is off by default (`layout.announcementBanner`). Every page this site carries is listed in its roster of record, `.ailk-site-manifest.json` at the site root. Shared foundation: a 1280px container, sections at 7rem (4rem below 1024px), card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
122
191
 
192
+ ## Copy
193
+
194
+ <!-- generated:begin copy -->
195
+
196
+ Copy density: standard — pages carry the ordinary amount of body copy for their section.
197
+ <!-- generated:end -->
198
+
123
199
  ## Shapes
124
200
 
201
+ <!-- generated:begin shapes -->
202
+
203
+ | Rounded | Value |
204
+ | -------- | --------- |
205
+ | `button` | `0.5rem` |
206
+ | `card` | `0.75rem` |
207
+
208
+ | Treatment | Value |
209
+ | ------------------------- | ---------- |
210
+ | `treatments.corners` | `square` |
211
+ | `treatments.eyebrowCase` | `sentence` |
212
+ | `treatments.placeholders` | `fill` |
213
+ | `treatments.checkmarks` | `plain` |
214
+
215
+ <!-- generated:end -->
216
+
125
217
  Square corners everywhere (`theme.corners: square`) — buttons, cards, the auth card, image placeholders; the tokens above are the base foundation's defaults a site overrides.
126
218
 
127
219
  ## Components
@@ -156,8 +248,8 @@ The foundation's pinned direction is the pacing of a classic wireframe marketing
156
248
  ## Do's and Don'ts
157
249
 
158
250
  - **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
159
- - **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
160
- - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
251
+ - **Do** set your brand colours (`primary`, `primaryFg`, `accent`, per mode) in `content/_site.mdx` `brand.colors` and your fonts (`display`, `body`) in `brand.fonts`; they reach every section and survive applying another design, which replaces `theme:`.
252
+ - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through `brand.colors`.
161
253
  - **Don't** replace a black rule with a shadow or a grey fill.
162
254
  - **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
163
255
 
@@ -11,7 +11,7 @@
11
11
  ],
12
12
  "shape": "local-business-service",
13
13
  "design": "standard",
14
- "generatedHash": "5a75067bc0b4f11911289cef648460e7fdb302b746900f7e1d37e004d0bd1188",
14
+ "generatedHash": "1251ff7dc2a780c9725c97571ca27979704a2f08dc968df2b789e93d20698b9a",
15
15
  "layout": {
16
16
  "nav": "full",
17
17
  "footer": "columns",
@@ -114,6 +114,61 @@
114
114
  "chrome": "on",
115
115
  "sections": []
116
116
  },
117
+ {
118
+ "route": "/for",
119
+ "kind": "page",
120
+ "pageType": "UseCasesList",
121
+ "schema": "UseCasesList",
122
+ "shell": "MarketingShell",
123
+ "chrome": "on",
124
+ "sections": [
125
+ {
126
+ "type": "hero",
127
+ "component": "Hero"
128
+ },
129
+ {
130
+ "type": "items",
131
+ "component": "Items",
132
+ "options": {
133
+ "columns": 3
134
+ }
135
+ },
136
+ {
137
+ "type": "logoCloud",
138
+ "component": "LogoCloud",
139
+ "options": {
140
+ "layout": "inline"
141
+ }
142
+ },
143
+ {
144
+ "type": "testimonials",
145
+ "component": "Testimonials"
146
+ },
147
+ {
148
+ "type": "cta",
149
+ "component": "CTA"
150
+ },
151
+ {
152
+ "type": "faq",
153
+ "component": "FAQ"
154
+ }
155
+ ]
156
+ },
157
+ {
158
+ "route": "/for/[slug]",
159
+ "kind": "page",
160
+ "contentDir": "content/en/UseCase",
161
+ "seeds": [
162
+ "content/en/UseCase/persona-1.mdx",
163
+ "content/en/UseCase/persona-2.mdx",
164
+ "content/en/UseCase/persona-3.mdx"
165
+ ],
166
+ "pageType": "UseCase",
167
+ "schema": "UseCase",
168
+ "shell": "MarketingShell",
169
+ "chrome": "on",
170
+ "sections": []
171
+ },
117
172
  {
118
173
  "route": "/about",
119
174
  "kind": "page",
@@ -143,6 +198,13 @@
143
198
  {
144
199
  "type": "hero",
145
200
  "component": "Hero"
201
+ },
202
+ {
203
+ "type": "items",
204
+ "component": "Items",
205
+ "options": {
206
+ "columns": 2
207
+ }
146
208
  }
147
209
  ]
148
210
  },
@@ -208,25 +270,22 @@
208
270
  ]
209
271
  },
210
272
  {
211
- "route": "/book-a-call",
212
- "kind": "page",
213
- "pageType": "BookCall",
214
- "schema": "BookCall",
273
+ "route": "/sign-in",
274
+ "kind": "route",
275
+ "pageType": null,
276
+ "schema": null,
215
277
  "shell": "MarketingShell",
216
278
  "chrome": "on",
217
- "sections": [
218
- {
219
- "type": "hero",
220
- "component": "Hero"
221
- },
222
- {
223
- "type": "items",
224
- "component": "Items",
225
- "options": {
226
- "columns": 3
227
- }
228
- }
229
- ]
279
+ "sections": []
280
+ },
281
+ {
282
+ "route": "/sign-up",
283
+ "kind": "route",
284
+ "pageType": null,
285
+ "schema": null,
286
+ "shell": "MarketingShell",
287
+ "chrome": "on",
288
+ "sections": []
230
289
  },
231
290
  {
232
291
  "route": "/purchase-policy",
@@ -311,6 +370,56 @@
311
370
  }
312
371
  ]
313
372
  },
373
+ {
374
+ "route": "/meet",
375
+ "kind": "page",
376
+ "pageType": "LandingPage",
377
+ "schema": "WebPage",
378
+ "shell": "MarketingShell",
379
+ "chrome": "on",
380
+ "sections": [
381
+ {
382
+ "type": "hero",
383
+ "component": "Hero"
384
+ },
385
+ {
386
+ "type": "items",
387
+ "component": "Items",
388
+ "options": {
389
+ "columns": 2
390
+ }
391
+ }
392
+ ]
393
+ },
394
+ {
395
+ "route": "/meet/[slug]",
396
+ "kind": "page",
397
+ "pageType": "BookCall",
398
+ "schema": "BookCall",
399
+ "shell": "MarketingShell",
400
+ "chrome": "on",
401
+ "sections": [
402
+ {
403
+ "type": "hero",
404
+ "component": "Hero"
405
+ },
406
+ {
407
+ "type": "cta",
408
+ "component": "CTA"
409
+ },
410
+ {
411
+ "type": "items",
412
+ "component": "Items",
413
+ "options": {
414
+ "columns": 3
415
+ }
416
+ },
417
+ {
418
+ "type": "content-block",
419
+ "component": "ContentBlock"
420
+ }
421
+ ]
422
+ },
314
423
  {
315
424
  "route": "/portfolio",
316
425
  "kind": "page",