create-ailk 0.5.0 → 0.6.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 (299) hide show
  1. package/README.md +55 -8
  2. package/component-catalog.json +336 -27
  3. package/component-catalog.md +25 -12
  4. package/dist/lib/api-boot-assertion.d.ts +46 -0
  5. package/dist/lib/api-boot-assertion.js +70 -0
  6. package/dist/lib/import-graph.d.ts +29 -0
  7. package/dist/lib/import-graph.js +140 -0
  8. package/dist/module-architecture.d.ts +1 -0
  9. package/dist/module-architecture.js +253 -127
  10. package/dist/surfaces.js +105 -7
  11. package/dist/template-manifest.d.ts +33 -0
  12. package/dist/template-manifest.js +99 -16
  13. package/dist/template-names.d.ts +1 -1
  14. package/dist/template-names.js +1 -0
  15. package/package.json +3 -2
  16. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +22 -2
  17. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +9 -2
  18. package/site-templates/marketing-site/ailk-template.json +1 -1
  19. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +2 -2
  20. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +1 -0
  21. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +10 -2
  22. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +47 -35
  23. package/site-templates/minimalism-site/ailk-template.json +2 -1
  24. package/site-templates/minimalism-site/assets/wordmark-placeholder.svg +28 -0
  25. package/site-templates/minimalism-site/content/en/HomePage/home.mdx +49 -19
  26. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +240 -0
  27. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +278 -0
  28. package/site-templates/simple-service/ailk-template.json +10 -0
  29. package/site-templates/simple-service/content/en/AboutPage/about.mdx +38 -0
  30. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +67 -0
  31. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +56 -0
  32. package/site-templates/simple-service/content/en/HomePage/home.mdx +85 -0
  33. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +40 -0
  34. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +40 -0
  35. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +40 -0
  36. package/site-templates/simple-service/content/en/ServicesList/services.mdx +72 -0
  37. package/site-templates/simple-service/provenance.json +4 -0
  38. package/templates/.env.example +72 -7
  39. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +8 -0
  40. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +12 -0
  41. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +12 -0
  42. package/templates/apps/api/.env.example +13 -0
  43. package/templates/apps/api/CLAUDE.md +26 -2
  44. package/templates/apps/api/jest.config.cjs +3 -0
  45. package/templates/apps/api/package.json +1 -0
  46. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +407 -0
  47. package/templates/apps/api/src/__tests__/module-exclusion.test.ts +83 -7
  48. package/templates/apps/api/src/__tests__/server.test.ts +471 -0
  49. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +45 -0
  50. package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +2 -0
  51. package/templates/apps/api/src/config/index.ts +62 -0
  52. package/templates/apps/api/src/config/modules.ts +7 -3
  53. package/templates/apps/api/src/lib/__mocks__/prisma.ts +238 -2
  54. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +143 -0
  55. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +23 -0
  56. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +125 -0
  57. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +20 -0
  58. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +317 -0
  59. package/templates/apps/api/src/lib/__tests__/site.test.ts +238 -0
  60. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +75 -0
  61. package/templates/apps/api/src/lib/auth-email-budget.ts +160 -0
  62. package/templates/apps/api/src/lib/content-adapter.ts +57 -31
  63. package/templates/apps/api/src/lib/deliverable-asset-store.ts +76 -0
  64. package/templates/apps/api/src/lib/error-serializer.ts +23 -3
  65. package/templates/apps/api/src/lib/outbound-http.ts +7 -2
  66. package/templates/apps/api/src/lib/require-commerce-claim.ts +250 -0
  67. package/templates/apps/api/src/lib/site.ts +208 -9
  68. package/templates/apps/api/src/lib/stripe.ts +66 -0
  69. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +182 -0
  70. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +42 -0
  71. package/templates/apps/api/src/middleware/rate-limit.ts +7 -1
  72. package/templates/apps/api/src/openapi/spec.ts +543 -2
  73. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +48 -0
  74. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +309 -0
  75. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +123 -0
  76. package/templates/apps/api/src/routes/auth/transactional-email.ts +273 -0
  77. package/templates/apps/api/src/routes/auth/user.ts +61 -0
  78. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +434 -0
  79. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +888 -0
  80. package/templates/apps/api/src/routes/checkout/index.ts +34 -0
  81. package/templates/apps/api/src/routes/checkout/session.ts +139 -0
  82. package/templates/apps/api/src/routes/checkout/sessions.ts +197 -0
  83. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +554 -0
  84. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +108 -0
  85. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +450 -0
  86. package/templates/apps/api/src/routes/content/get-page.ts +94 -12
  87. package/templates/apps/api/src/routes/content/index.ts +13 -73
  88. package/templates/apps/api/src/routes/content/list-pages.ts +15 -3
  89. package/templates/apps/api/src/routes/content/rate-limit.ts +15 -6
  90. package/templates/apps/api/src/routes/content/search.ts +129 -0
  91. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +447 -31
  92. package/templates/apps/api/src/routes/leads/index.ts +100 -13
  93. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +51 -0
  94. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +351 -0
  95. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +51 -0
  96. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +5 -2
  97. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +4 -1
  98. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +58 -0
  99. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +107 -6
  100. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +87 -2
  101. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +51 -0
  102. package/templates/apps/api/src/routes/project-listings/start.ts +5 -1
  103. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +686 -0
  104. package/templates/apps/api/src/routes/requests/confirm.ts +601 -0
  105. package/templates/apps/api/src/routes/requests/index.ts +54 -0
  106. package/templates/apps/api/src/routes/webhooks/README.md +265 -0
  107. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +749 -0
  108. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +330 -0
  109. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +262 -0
  110. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +285 -0
  111. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +213 -0
  112. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +301 -0
  113. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +648 -0
  114. package/templates/apps/api/src/routes/webhooks/index.ts +89 -0
  115. package/templates/apps/api/src/routes/webhooks/stripe.ts +1399 -0
  116. package/templates/apps/api/src/server.ts +439 -49
  117. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +39 -0
  118. package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +217 -40
  119. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +620 -0
  120. package/templates/apps/api/src/services/__tests__/consent.test.ts +2 -0
  121. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +300 -5
  122. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +20 -0
  123. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +368 -0
  124. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +160 -0
  125. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +166 -0
  126. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +154 -0
  127. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +137 -0
  128. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +444 -0
  129. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +238 -0
  130. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +78 -0
  131. package/templates/apps/api/src/services/abandon-email.ts +8 -2
  132. package/templates/apps/api/src/services/aeo-score.ts +49 -12
  133. package/templates/apps/api/src/services/audit-log.ts +668 -0
  134. package/templates/apps/api/src/services/consent.ts +18 -0
  135. package/templates/apps/api/src/services/default-tenant.ts +70 -31
  136. package/templates/apps/api/src/services/deliverable-fulfillment.ts +141 -13
  137. package/templates/apps/api/src/services/dunning-policy.ts +294 -0
  138. package/templates/apps/api/src/services/entitlements.ts +80 -0
  139. package/templates/apps/api/src/services/lead-promotion.ts +13 -14
  140. package/templates/apps/api/src/services/lead-routing.ts +161 -2
  141. package/templates/apps/api/src/services/leads-inbox.ts +23 -2
  142. package/templates/apps/api/src/services/listing-config.ts +27 -9
  143. package/templates/apps/api/src/services/project-listings.ts +201 -6
  144. package/templates/apps/api/src/services/public-site-resolver.ts +106 -0
  145. package/templates/apps/api/src/services/request-confirm.ts +646 -0
  146. package/templates/apps/api/src/services/revalidation.ts +173 -0
  147. package/templates/apps/api/src/services/verified-email.ts +71 -0
  148. package/templates/apps/api/src/vercel-handler.ts +75 -35
  149. package/templates/apps/mcp/.env.example +17 -0
  150. package/templates/apps/mcp/CLAUDE.md +57 -24
  151. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +6 -0
  152. package/templates/apps/mcp/__tests__/audit.test.ts +137 -8
  153. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +79 -36
  154. package/templates/apps/mcp/__tests__/get_offerings.test.ts +111 -2
  155. package/templates/apps/mcp/__tests__/get_pricing.test.ts +82 -2
  156. package/templates/apps/mcp/__tests__/http-transport.test.ts +541 -2
  157. package/templates/apps/mcp/__tests__/index.test.ts +39 -0
  158. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +143 -0
  159. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +111 -0
  160. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +65 -0
  161. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +188 -0
  162. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +165 -0
  163. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +124 -0
  164. package/templates/apps/mcp/__tests__/list_pages.test.ts +116 -0
  165. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +7 -1
  166. package/templates/apps/mcp/__tests__/parity.test.ts +10 -7
  167. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +89 -22
  168. package/templates/apps/mcp/__tests__/read_content.test.ts +322 -1
  169. package/templates/apps/mcp/__tests__/search_content.test.ts +105 -2
  170. package/templates/apps/mcp/__tests__/server.test.ts +67 -14
  171. package/templates/apps/mcp/__tests__/start_purchase.test.ts +252 -0
  172. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +300 -123
  173. package/templates/apps/mcp/jest.config.cjs +13 -0
  174. package/templates/apps/mcp/package.json +2 -0
  175. package/templates/apps/mcp/src/abuse/index.ts +159 -24
  176. package/templates/apps/mcp/src/config/modules.ts +10 -5
  177. package/templates/apps/mcp/src/http-transport.ts +102 -29
  178. package/templates/apps/mcp/src/index.ts +73 -11
  179. package/templates/apps/mcp/src/lib/audit-single-page.ts +90 -3
  180. package/templates/apps/mcp/src/lib/commerce-claim.ts +94 -0
  181. package/templates/apps/mcp/src/lib/content-adapter.ts +113 -0
  182. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +139 -0
  183. package/templates/apps/mcp/src/lib/prisma.ts +39 -0
  184. package/templates/apps/mcp/src/lib/public-workspace.ts +133 -0
  185. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +59 -0
  186. package/templates/apps/mcp/src/server.ts +59 -35
  187. package/templates/apps/mcp/src/tools/audit.ts +26 -2
  188. package/templates/apps/mcp/src/tools/get_business_hours.ts +4 -3
  189. package/templates/apps/mcp/src/tools/get_faq.ts +4 -3
  190. package/templates/apps/mcp/src/tools/get_locations.ts +5 -3
  191. package/templates/apps/mcp/src/tools/get_offerings.ts +16 -4
  192. package/templates/apps/mcp/src/tools/get_pricing.ts +25 -6
  193. package/templates/apps/mcp/src/tools/get_site_info.ts +4 -3
  194. package/templates/apps/mcp/src/tools/index.ts +6 -4
  195. package/templates/apps/mcp/src/tools/list_pages.ts +4 -3
  196. package/templates/apps/mcp/src/tools/purchase.ts +128 -45
  197. package/templates/apps/mcp/src/tools/read_content.ts +20 -6
  198. package/templates/apps/mcp/src/tools/search_content.ts +11 -4
  199. package/templates/apps/web/.env.example +71 -5
  200. package/templates/apps/web/CLAUDE.md +44 -0
  201. package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +18 -2
  202. package/templates/apps/web/app/.well-known/mcp.json/route.ts +11 -3
  203. package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +282 -0
  204. package/templates/apps/web/app/[locale]/(auth)/__tests__/password-reset.test.tsx +515 -0
  205. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +89 -0
  206. package/templates/apps/web/app/[locale]/(auth)/forgot-password/page.tsx +109 -0
  207. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +92 -0
  208. package/templates/apps/web/app/[locale]/(auth)/reset-password/page.tsx +135 -0
  209. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +109 -0
  210. package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/page.test.tsx +48 -2
  211. package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/page.tsx +20 -6
  212. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +125 -0
  213. package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +96 -0
  214. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +101 -0
  215. package/templates/apps/web/app/[locale]/(auth)/use-auth-card-flow.ts +102 -0
  216. package/templates/apps/web/app/[locale]/(auth)/verify-email/page.tsx +87 -0
  217. package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +20 -10
  218. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +84 -0
  219. package/templates/apps/web/app/[locale]/(authed)/account/actions.ts +58 -0
  220. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +63 -8
  221. package/templates/apps/web/app/[locale]/(authed)/layout.tsx +18 -1
  222. package/templates/apps/web/app/[locale]/cancellation/page.tsx +44 -0
  223. package/templates/apps/web/app/[locale]/layout.tsx +133 -87
  224. package/templates/apps/web/app/[locale]/purchase/__tests__/cancel.test.tsx +162 -0
  225. package/templates/apps/web/app/[locale]/purchase/__tests__/module-scope.test.ts +68 -0
  226. package/templates/apps/web/app/[locale]/purchase/__tests__/success.test.tsx +361 -0
  227. package/templates/apps/web/app/[locale]/purchase/cancel/page.tsx +115 -0
  228. package/templates/apps/web/app/[locale]/purchase/success/page.tsx +307 -0
  229. package/templates/apps/web/app/[locale]/returns/page.tsx +44 -0
  230. package/templates/apps/web/app/[locale]/shipping/page.tsx +44 -0
  231. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +670 -0
  232. package/templates/apps/web/app/api/revalidate/route.ts +194 -0
  233. package/templates/apps/web/auth.ts +407 -8
  234. package/templates/apps/web/jest.config.cjs +8 -4
  235. package/templates/apps/web/lib/__tests__/auth-email.test.ts +214 -0
  236. package/templates/apps/web/lib/__tests__/auth-routes.test.ts +74 -0
  237. package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +72 -0
  238. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +18 -1
  239. package/templates/apps/web/lib/auth-email.ts +318 -0
  240. package/templates/apps/web/lib/auth-env.ts +85 -0
  241. package/templates/apps/web/lib/auth-routes.ts +55 -0
  242. package/templates/apps/web/lib/meeting-slugs.ts +53 -0
  243. package/templates/apps/web/lib/telemetry-scrub.ts +5 -1
  244. package/templates/apps/web/messages/en.json +187 -0
  245. package/templates/apps/web/package.json +2 -1
  246. package/templates/apps/web/src/lib/commerce-claim.ts +33 -0
  247. package/templates/apps/web/src/lib/commerce-sections.ts +61 -0
  248. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +108 -0
  249. package/templates/content/en/ReturnsPolicyPage/returns.mdx +108 -0
  250. package/templates/content/en/ShippingPolicyPage/shipping.mdx +108 -0
  251. package/templates/database/CHANGELOG.md +142 -0
  252. package/templates/database/README.md +10 -3
  253. package/templates/database/__tests__/appointment.db.test.ts +106 -0
  254. package/templates/database/__tests__/artifact-content-store.db.test.ts +316 -0
  255. package/templates/database/__tests__/composite-fence.db.test.ts +206 -0
  256. package/templates/database/__tests__/fence-fan-out.db.test.ts +711 -0
  257. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +79 -0
  258. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +100 -0
  259. package/templates/database/__tests__/flow-workspace-key.db.test.ts +263 -0
  260. package/templates/database/__tests__/prefixed-ids.db.test.ts +85 -9
  261. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +111 -0
  262. package/templates/database/__tests__/tenancy.test.ts +141 -0
  263. package/templates/database/config/schema.prisma +79 -2
  264. package/templates/database/content/schema.prisma +87 -11
  265. package/templates/database/inbox/schema.prisma +452 -9
  266. package/templates/database/jest.config.cjs +5 -3
  267. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +15 -0
  268. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +158 -0
  269. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +40 -0
  270. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +67 -0
  271. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +70 -0
  272. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +181 -0
  273. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +172 -0
  274. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +41 -0
  275. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +185 -0
  276. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +70 -0
  277. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +57 -0
  278. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +68 -0
  279. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +1067 -0
  280. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +210 -0
  281. package/templates/database/package.json +1 -1
  282. package/templates/database/tenancy.ts +86 -1
  283. package/templates/database/tsconfig.json +1 -0
  284. package/versions.json +34 -34
  285. package/templates/apps/api/src/routes/content/__tests__/create.test.ts +0 -253
  286. package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +0 -215
  287. package/templates/apps/api/src/routes/content/__tests__/update.test.ts +0 -266
  288. package/templates/apps/api/src/routes/content/create.ts +0 -115
  289. package/templates/apps/api/src/routes/content/delete.ts +0 -82
  290. package/templates/apps/api/src/routes/content/update.ts +0 -112
  291. package/templates/apps/mcp/__tests__/create_page.test.ts +0 -202
  292. package/templates/apps/mcp/__tests__/delete_page.test.ts +0 -177
  293. package/templates/apps/mcp/__tests__/update_page.test.ts +0 -196
  294. package/templates/apps/mcp/src/tools/create_page.ts +0 -96
  295. package/templates/apps/mcp/src/tools/delete_page.ts +0 -74
  296. package/templates/apps/mcp/src/tools/update_page.ts +0 -92
  297. package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +0 -123
  298. /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/next-path.test.ts +0 -0
  299. /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/next-path.ts +0 -0
@@ -42,29 +42,33 @@ The template's `layout` block — resolved with `resolveSiteChrome`, defaults fi
42
42
 
43
43
  `layout.home: "deck"` makes every direct section child of `home.mdx` one full-viewport snap target, in order. The mark is hidden on slide 1 (the deck-hero landing state) and revealed from slide 2 on.
44
44
 
45
- | # | Slide | Section | Ground | Action |
46
- | --- | ----------------- | ------------------------------------------- | ---------------------------------- | --------------------------------------------------------------------------------------------------------- |
47
- | 1 | Landing | `hero` | gradient band, full-bleed | `{Primary CTA} →` → `/reports`, centered; 44px scroll cue. _No mark — but see the Nav-wiring note below._ |
48
- | 2 | Tagline | `content-block` | light | — (_the mark reveals here once #5697 lands_) |
49
- | 3 | Our community | `logoCloud` | light | _"Refer someone →" → `/referral` — **pending #5691**_ |
50
- | 4 | Reports headline | `content-block` | light | — |
51
- | 5 | Special reports | `reports-list` (`list`) | _light; on-dark **pending #5691**_ | four dated titles → `/reports/<slug>` |
52
- | 6 | Favorites | `reports-list` (`list`) | _light; on-dark **pending #5691**_ | year-only titles → `/reports/<slug>` |
53
- | 7 | Services headline | `content-block` | light | `Hire me →` → `/meet` |
54
- | 8 | Partners | `team` (`with-large-images`, `hoverReveal`) | light | _→ `/about` — **pending #5691**_ |
55
- | 9 | Closing | `cta` (`minimal`) | light | `Contact me →` → `/contact`, centered |
56
-
57
- ### What is pending, and why it is pending rather than patched
58
-
59
- Sam's site principle for this template — _every slide's action sits at the bottom, centered, at 44px or larger; grids are 3 columns on desktop and 2 on mobile_ — needs section props that do not exist. A template may not reach for a `className` override or hand-rolled markup to get them (`.claude/rules/frontend.md` § Chrome Composes Blocks), so they are filed as one bounded additive-props batch, **#5691**, in the #5622 shape. Until it lands, the affected slides ship the nearest composition the section vocabulary allows — never a patched one:
60
-
61
- | Gap | Slide | Ships today |
62
- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- | -------------------------------------------------------------------------------------------------------------------------------- |
63
- | `hero` has no full-bleed backdrop media slot, and its `image` slot counts as a stacked reveal (which suppresses `scrollCue`) | 1 | the `gradient-brand` band + the 44px cue. `assets/hero-backdrop.svg` installs at `/hero-backdrop.svg` and is ready for the slot. |
64
- | `logoCloud` and `team` carry no action field | 3, 8 | headline + grid, no action |
65
- | `SectionSurfaceSchema` has no dark value, so `reports-list`'s `tone: "on-dark"` (#5562, shipped **for** this template) has no dark band to sit on. `SectionFrameBand` already has `gradient-dark`. | 5, 6 | `tone: "on-light"` |
66
- | `content-block` has neither `align` nor `fill`, so its headline and bottom CTA are start-aligned and sit at the TOP of a full-viewport panel | 2, 4, 7 | start-aligned, top-anchored |
67
- | `CardGrid`'s ramp is 1-up below 768px by a deliberate system decision; Sam's principle asks for 2-up at 390 | 8 | 1-up at 390, 3-up at 1440. Not a prop — a decision for Sam, recorded on #5691. |
45
+ | # | Slide | Section | Ground | Action |
46
+ | --- | ----------------- | -------------------------------------------------------------- | ------------------------ | --------------------------------------------------------------------------------------------------------- |
47
+ | 1 | Landing | `hero` (`backdrop`) | gradient band + backdrop | `{Primary CTA} →` → `/reports`, centered; 44px scroll cue. _No mark — but see the Nav-wiring note below._ |
48
+ | 2 | Tagline | `content-block` (`align: center`, `fill: viewport`) | light | — (_the mark reveals here once #5697 lands_) |
49
+ | 3 | Our community | `logoCloud` (`actions`) | light | `Refer someone →` → `/referral`, bottom-centered at 44px |
50
+ | 4 | Reports headline | `content-block` (`align: center`, `fill: viewport`) | light | — |
51
+ | 5 | Special reports | `reports-list` (`list`, `tone: on-dark`) | dark (`gradient-dark`) | four dated titles → `/reports/<slug>` |
52
+ | 6 | Favorites | `reports-list` (`list`, `tone: on-dark`) | dark (`gradient-dark`) | year-only titles → `/reports/<slug>` |
53
+ | 7 | Services headline | `content-block` (`align: center`, `fill: viewport`) | light | `Hire me →` → `/meet` |
54
+ | 8 | Partners | `team` (`with-large-images`, `hoverReveal`, `phoneColumns: 2`) | light | `About us →` → `/about`, bottom-centered at 44px |
55
+ | 9 | Closing | `cta` (`minimal`) | light | `Contact me →` → `/contact`, centered |
56
+
57
+ ### How the deck honours the site principle
58
+
59
+ Sam's site principle for this template — _every slide's action sits at the bottom, centered, at 44px or larger; grids are 2-up on a phone_ — is held by bounded section props, never by a `className` override or hand-rolled markup in a template (`.claude/rules/frontend.md` § Chrome Composes Blocks). #5691 landed the seven the deck was missing and this tree sets all seven; the composition of every slide is unchanged from the table above.
60
+
61
+ | Prop | Owner | Slides that set it | What it does here |
62
+ | ------------------------------------------- | ---------------------------------------- | ------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
63
+ | `hero.backdrop` | `packages/ui/src/sections/Hero.tsx` | 1 | paints `assets/hero-backdrop.svg` (installed at `/hero-backdrop.svg`) full-bleed behind the copy. A distinct slot from `image`, which counts as a stacked reveal — so the 44px scroll cue survives it. |
64
+ | `content-block.align` | `.../ContentBlock.tsx` | 2, 4, 7 | centers the headline cluster, the body and the CTA row, through `SectionHeader`'s own `align` prop |
65
+ | `content-block.fill` | `.../ContentBlock.tsx` | 2, 4, 7 | the copy centers in the middle of the full-viewport snap panel instead of sitting at its top |
66
+ | `logoCloud.actions` | `.../LogoCloud.tsx` | 3 | one bottom-centered action at the 44px floor beneath the strip (the #5622 `stair-steps` footer placement) |
67
+ | `team.actions` | `.../Team.tsx` | 8 | the same row beneath the member wall |
68
+ | `'gradient-dark'` on `SectionSurfaceSchema` | `packages/validation/…/page-sections.ts` | 5, 6 | the dark ground `tone: "on-dark"` (#5562, shipped **for** this template) was always meant to sit on. `SectionFrameBand` has carried the band itself since 2026-08-29. |
69
+ | `CardGrid.phoneColumns` | `packages/ui/src/panels/CardGrid.tsx` | 8 | the six-tile wall is two-up at 390 rather than overflowing the snap panel one tile at a time |
70
+
71
+ Two notes on the last row. `CardGrid`'s 1-up-below-`md` ramp stays the system-wide default — the recorded #2803 fix, since an `sm` step made every phone 2-up-cramped — and `phoneColumns: 2` is the opt-in Sam disposed on 2026-09-16 for this deck and the client decks built from it; nothing else in the repo sets it. And slide 8 is the only deck slide that reaches `CardGrid` at all: slide 3's logo strip is a reflowing flex row with no column count, and `reports-list`'s `list` variant has no grid — so one knob on one slide satisfies the whole principle.
68
72
 
69
73
  ### The Nav wiring — #5697, and not this template's to fix
70
74
 
@@ -80,17 +84,17 @@ One `page=<route>` region per roster row, generated from the seed file the compo
80
84
 
81
85
  <!-- generated:begin page=/ -->
82
86
 
83
- | # | Section | Component | Copy (first line) |
84
- | --- | --------------------------------------- | -------------- | ---------------------------------------------------------------------- |
85
- | 1 | `hero` (centered · 1 CTA) | `Hero` | Your Company |
86
- | 2 | `content-block` (narrow) | `ContentBlock` | A working partnership with the teams building {what your market needs… |
87
- | 3 | `logoCloud` (logos ×3) | `LogoCloud` | Our community |
88
- | 4 | `content-block` (narrow) | `ContentBlock` | Research on {your field}, and on where the next decade of it is going |
89
- | 5 | `reports-list` (list) | `ReportsList` | Special reports |
90
- | 6 | `reports-list` (list) | `ReportsList` | Favorites |
91
- | 7 | `content-block` (narrow · 1 CTA) | `ContentBlock` | Trusted work for the people who carry {the outcome you deliver} |
92
- | 8 | `team` (with-large-images · members ×6) | `Team` | Partners |
93
- | 9 | `cta` (minimal · 1 CTA) | `CTA` | Your Company |
87
+ | # | Section | Component | Copy (first line) |
88
+ | --- | ----------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
89
+ | 1 | `hero` (centered · 1 CTA) | `Hero` | Your Company |
90
+ | 2 | `content-block` (narrow) | `ContentBlock` | A working partnership with the teams building {what your market needs… |
91
+ | 3 | `logoCloud` (logos ×3 · 1 CTA) | `LogoCloud` | Our community |
92
+ | 4 | `content-block` (narrow) | `ContentBlock` | Research on {your field}, and on where the next decade of it is going |
93
+ | 5 | `reports-list` (list) | `ReportsList` | Special reports |
94
+ | 6 | `reports-list` (list) | `ReportsList` | Favorites |
95
+ | 7 | `content-block` (narrow · 1 CTA) | `ContentBlock` | Trusted work for the people who carry {the outcome you deliver} |
96
+ | 8 | `team` (with-large-images · members ×6 · 1 CTA) | `Team` | Partners |
97
+ | 9 | `cta` (minimal · 1 CTA) | `CTA` | Your Company |
94
98
 
95
99
  <!-- generated:end -->
96
100
 
@@ -213,6 +217,13 @@ _Code route — no content, no sections._
213
217
  _Code route — no content, no sections._
214
218
  <!-- generated:end -->
215
219
 
220
+ `/appointments`:
221
+
222
+ <!-- generated:begin page=/appointments -->
223
+
224
+ _Code route — no content, no sections._
225
+ <!-- generated:end -->
226
+
216
227
  `/flows/[slug]`:
217
228
 
218
229
  <!-- generated:begin page=/flows/[slug] -->
@@ -250,6 +261,7 @@ _Code route — no content, no sections._
250
261
  ```
251
262
  minimalism-site:
252
263
  requires: [marketing, scheduling, signal-collectors]
264
+ categories: [real-estate, technology, legal]
253
265
  roster:
254
266
  - { route: "/", content: ["content/en/HomePage/home.mdx"] }
255
267
  - { route: "/reports", content: ["content/en/LandingPage/reports.mdx"] }
@@ -264,6 +276,7 @@ minimalism-site:
264
276
  - { route: "/meet" }
265
277
  - { route: "/meet/[slug]" }
266
278
  - { route: "/meet/confirmed" }
279
+ - { route: "/appointments" }
267
280
  - { route: "/flows/[slug]" }
268
281
  - { route: "/flows/[slug]/start" }
269
282
  - { route: "/flows/[slug]/results/[payload]" }
@@ -318,7 +331,6 @@ Every component the roster rows' seed content composes today (generated):
318
331
 
319
332
  | Gap | Issue |
320
333
  | ------------------------------------------------------------------- | ---------- |
321
- | The six bounded section props the deck's slides need | #5691 |
322
334
  | The deck's Nav wiring (`sticky` + `deckMorph` under `home: "deck"`) | #5697 |
323
335
  | `/about` rename as one routes-map row | #5572 |
324
336
  | The Pro demo host `minimalism-site.ailaunchkit.ai` — provisioning | #5589 body |
@@ -6,6 +6,7 @@
6
6
  "installMap": {
7
7
  "provenance.json": ".ailk-template.json",
8
8
  "assets/hero-backdrop.svg": "apps/web/public/hero-backdrop.svg",
9
+ "assets/wordmark-placeholder.svg": "apps/web/public/wordmark-placeholder.svg",
9
10
  "assets/logo-placeholder-1.svg": "apps/web/public/logo-placeholder-1.svg",
10
11
  "assets/logo-placeholder-2.svg": "apps/web/public/logo-placeholder-2.svg",
11
12
  "assets/logo-placeholder-3.svg": "apps/web/public/logo-placeholder-3.svg",
@@ -17,5 +18,5 @@
17
18
  "assets/avatar-placeholder-6.svg": "apps/web/public/avatar-placeholder-6.svg",
18
19
  "flows/referral.flow.json": "database/flows/referral.flow.json"
19
20
  },
20
- "postInstall": "Template minimalism-site installed. The home page is a NINE-SLIDE SCROLL-SNAP DECK (content/en/HomePage/home.mdx): one full-viewport panel per section, the brand mark hidden on slide 1 and revealed from slide 2 on, no nav items, and the footer bottom bar carrying Privacy, Terms, FAQ, the social row, the theme toggle and the locale switcher. Its module pages arrived with their bundles: the booker at /meet from scheduling, the report reader at /reports/<slug> and the flow routes from signal-collectors; /privacy and /terms came with the base layer. This template adds the deck, /reports, /about, /services (+ three samples), /contact, /faq, /referral, four sample reports and the referral flow at /flows/referral/start. RENAMING /about: many sites want /partners, /team, /family or /company instead. That is a route rename in YOUR scaffold, never a content move - keep content/en/AboutPage/ (AboutPage is a schema type, not a URL), rename the route directory (git mv 'apps/web/app/[locale]/about' 'apps/web/app/[locale]/partners'), and update the one footer label that names it (messages/<locale>.json). Once the routes map ships in the scaffold it is one row: the /about row's route plus a legacyRoutes entry so the old path 301s. EVERY line of copy, all four sample reports, the three logo placeholders, the six portrait placeholders and the hero backdrop are placeholders - replace them before you launch."
21
+ "postInstall": "Template minimalism-site installed. The home page is a NINE-SLIDE SCROLL-SNAP DECK (content/en/HomePage/home.mdx): one full-viewport panel per section, the brand mark hidden on slide 1 and revealed from slide 2 on, no nav items, and the footer bottom bar carrying Privacy, Terms, FAQ, the social row, the theme toggle and the locale switcher. Its module pages arrived with their bundles: the booker at /meet from scheduling, the report reader at /reports/<slug> and the flow routes from signal-collectors; /privacy and /terms came with the base layer. This template adds the deck, /reports, /about, /services (+ three samples), /contact, /faq, /referral, four sample reports and the referral flow at /flows/referral/start. RENAMING /about: many sites want /partners, /team, /family or /company instead. That is a route rename in YOUR scaffold, never a content move - keep content/en/AboutPage/ (AboutPage is a schema type, not a URL), rename the route directory (git mv 'apps/web/app/[locale]/about' 'apps/web/app/[locale]/partners'), and update the one footer label that names it (messages/<locale>.json). Once the routes map ships in the scaffold it is one row: the /about row's route plus a legacyRoutes entry so the old path 301s. EVERY line of copy, all four sample reports, the three logo placeholders, the six portrait placeholders, the wordmark lockup on slide 1 and the hero backdrop are placeholders - replace them before you launch."
21
22
  }
@@ -0,0 +1,28 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="-14 -14 1043 128" width="1043" height="128" role="img" aria-label="Placeholder wordmark">
2
+ <title>Placeholder wordmark</title>
3
+ <desc>Monoline "Your Company" wordmark, drawn as paths so it needs no font. Replace with your own logo lockup before you launch.</desc>
4
+ <g fill="none" stroke="#6b6b73" stroke-width="10" stroke-linecap="round" stroke-linejoin="round">
5
+ <!-- Y -->
6
+ <path d="M0 0 L35 55 L70 0 M35 55 L35 100" />
7
+ <!-- O -->
8
+ <ellipse cx="125" cy="50" rx="35" ry="50" />
9
+ <!-- U -->
10
+ <path d="M180 0 L180 65 A35 35 0 0 0 250 65 L250 0" />
11
+ <!-- R -->
12
+ <path d="M270 100 L270 0 L315 0 A27.5 27.5 0 0 1 315 55 L270 55 M312 55 L340 100" />
13
+ <!-- C -->
14
+ <path d="M462.5 11.7 A35 50 0 1 0 462.5 88.3" />
15
+ <!-- O -->
16
+ <ellipse cx="530" cy="50" rx="35" ry="50" />
17
+ <!-- M -->
18
+ <path d="M585 100 L585 0 L620 55 L655 0 L655 100" />
19
+ <!-- P -->
20
+ <path d="M675 100 L675 0 L717 0 A29 29 0 0 1 717 58 L675 58" />
21
+ <!-- A -->
22
+ <path d="M765 100 L800 0 L835 100 M779 72 L821 72" />
23
+ <!-- N -->
24
+ <path d="M855 100 L855 0 L925 100 L925 0" />
25
+ <!-- Y -->
26
+ <path d="M945 0 L980 55 L1015 0 M980 55 L980 100" />
27
+ </g>
28
+ </svg>
@@ -13,7 +13,15 @@ sections:
13
13
  "variant": "centered",
14
14
  "fill": "viewport",
15
15
  "surface": "gradient-brand",
16
+ "backdrop": { "src": "/hero-backdrop.svg", "alt": "" },
16
17
  "headline": "Your Company",
18
+ "lockup":
19
+ {
20
+ "src": "/wordmark-placeholder.svg",
21
+ "alt": "",
22
+ "width": 1043,
23
+ "height": 128,
24
+ },
17
25
  "primaryCta": { "label": "{Primary CTA} →", "href": "/reports" },
18
26
  "ctaSize": "xl",
19
27
  "scrollCue": { "label": "Scroll" },
@@ -25,6 +33,8 @@ sections:
25
33
  "data":
26
34
  {
27
35
  "variant": "narrow",
36
+ "align": "center",
37
+ "fill": "viewport",
28
38
  "headline": "A working partnership with the teams building {what your market needs next}",
29
39
  "body": "{One line on who you work with, and what they get from you that they cannot get elsewhere.}",
30
40
  },
@@ -43,6 +53,14 @@ sections:
43
53
  { "name": "{logo}", "src": "/logo-placeholder-2.svg" },
44
54
  { "name": "{logo}", "src": "/logo-placeholder-3.svg" },
45
55
  ],
56
+ "actions":
57
+ [
58
+ {
59
+ "kind": "button",
60
+ "label": "Refer someone →",
61
+ "href": "/referral",
62
+ },
63
+ ],
46
64
  },
47
65
  },
48
66
  {
@@ -51,6 +69,8 @@ sections:
51
69
  "data":
52
70
  {
53
71
  "variant": "narrow",
72
+ "align": "center",
73
+ "fill": "viewport",
54
74
  "headline": "Research on {your field}, and on where the next decade of it is going",
55
75
  "body": "{One line on what a reader walks away with. Keep it to a single sentence.}",
56
76
  },
@@ -62,7 +82,8 @@ sections:
62
82
  {
63
83
  "headline": "Special reports",
64
84
  "variant": "list",
65
- "tone": "on-light",
85
+ "tone": "on-dark",
86
+ "surface": "gradient-dark",
66
87
  "reports":
67
88
  [
68
89
  {
@@ -95,7 +116,8 @@ sections:
95
116
  {
96
117
  "headline": "Favorites",
97
118
  "variant": "list",
98
- "tone": "on-light",
119
+ "tone": "on-dark",
120
+ "surface": "gradient-dark",
99
121
  "reports":
100
122
  [
101
123
  { "slug": "state-of-the-market-2026", "title": "2026" },
@@ -111,6 +133,8 @@ sections:
111
133
  "data":
112
134
  {
113
135
  "variant": "narrow",
136
+ "align": "center",
137
+ "fill": "viewport",
114
138
  "headline": "Trusted work for the people who carry {the outcome you deliver}",
115
139
  "body": "{One line on how an engagement starts and what the first month looks like.}",
116
140
  "cta": { "label": "Hire me →", "href": "/meet" },
@@ -125,6 +149,9 @@ sections:
125
149
  "variant": "with-large-images",
126
150
  "hoverReveal": true,
127
151
  "largePhotos": true,
152
+ "phoneColumns": 2,
153
+ "actions":
154
+ [{ "kind": "button", "label": "About us →", "href": "/about" }],
128
155
  "members":
129
156
  [
130
157
  {
@@ -192,23 +219,26 @@ the reference's own words. Replace all of it before you launch — including
192
219
  the four sample reports, the three logo placeholders and the six portrait
193
220
  placeholders.
194
221
 
195
- Three slides carry LESS than the template's design intends, because the
196
- section prop each needs does not exist yet (#5691 — one bounded additive-props
197
- batch, the #5622 shape). When those props land, this file gains the fields and
198
- nothing is recomposed:
222
+ Every slide now carries the full composition the template intends — #5691
223
+ landed the seven bounded section props the deck was waiting on, and this file
224
+ sets all seven without recomposing a single slide:
199
225
 
200
- - slide 1 `landing` — wants a full-bleed backdrop IMAGE
201
- (`assets/hero-backdrop.svg`, installed at `/hero-backdrop.svg`). Hero has
202
- no backdrop slot, and its `image` slot counts as a stacked reveal, which
203
- suppresses `scrollCue`. Ships on the `gradient-brand` band, which is a
204
- full-bleed gradient and keeps the 44px cue.
205
- - slide 3 `community` and slide 8 `partners` — want a bottom-centered
206
- action ("Refer someone →" → /referral; → /about). `logoCloud` and `team`
207
- carry no action field.
208
- - slides 5 `special-reports` and 6 `favorites` — want the on-DARK ground the
209
- reference alternates to. `reports-list` already has `tone: "on-dark"`
210
- (#5562, shipped for this template), but `SectionSurfaceSchema` has no dark
211
- value to put under it, so on-dark type would render on a light band. They
212
- ship `on-light` until it does.
226
+ - slide 1 `landing` — `backdrop` paints `assets/hero-backdrop.svg`
227
+ (installed at `/hero-backdrop.svg`) full-bleed behind the copy. It is a
228
+ distinct slot from the hero's `image`, which counts as a stacked reveal,
229
+ so the 44px `scrollCue` survives it.
230
+ - slide 3 `community` and slide 8 `partners` — `actions` puts one
231
+ bottom-centered action at the 44px floor on each ("Refer someone →" →
232
+ /referral; "About us →" → /about).
233
+ - slides 2 `tagline`, 4 `reports-headline` and 7 `services-headline` —
234
+ `align: "center"` + `fill: "viewport"` centre the copy in the middle of
235
+ the snap panel instead of pinning it to the top.
236
+ - slides 5 `special-reports` and 6 `favorites` — `surface:
237
+ "gradient-dark"` is the dark ground `tone: "on-dark"` (#5562, shipped
238
+ for this template) was always meant to sit on.
239
+ - slide 8 `partners` — `phoneColumns: 2` puts the six-tile wall two-up at
240
+ 390 instead of overflowing the snap panel one tile at a time. Slide 8 is
241
+ the only slide that renders through `CardGrid`: slide 3's logo strip is
242
+ a reflowing flex row, and `reports-list`'s `list` variant has no grid.
213
243
 
214
244
  \*/}
@@ -0,0 +1,240 @@
1
+ {
2
+ "template": "simple-service",
3
+ "requires": ["marketing", "scheduling", "commerce"],
4
+ "categories": ["landscaping"],
5
+ "generatedHash": "f0dce515363186cee7ec9d1b1fd91d0ca11e039db31e843d1235d451dd49e736",
6
+ "layout": {
7
+ "nav": "full",
8
+ "footer": "columns",
9
+ "announcementBanner": true,
10
+ "home": "default"
11
+ },
12
+ "rows": [
13
+ {
14
+ "route": "/",
15
+ "pageType": "HomePage",
16
+ "schema": "HomePage",
17
+ "shell": "MarketingShell",
18
+ "chrome": "on",
19
+ "sections": [
20
+ {
21
+ "type": "hero",
22
+ "component": "Hero"
23
+ },
24
+ {
25
+ "type": "items",
26
+ "component": "Items"
27
+ },
28
+ {
29
+ "type": "cta",
30
+ "component": "CTA"
31
+ }
32
+ ]
33
+ },
34
+ {
35
+ "route": "/services",
36
+ "pageType": "ServicesList",
37
+ "schema": "ServicesList",
38
+ "shell": "MarketingShell",
39
+ "chrome": "on",
40
+ "sections": [
41
+ {
42
+ "type": "hero",
43
+ "component": "Hero"
44
+ },
45
+ {
46
+ "type": "items",
47
+ "component": "Items"
48
+ },
49
+ {
50
+ "type": "cta",
51
+ "component": "CTA"
52
+ }
53
+ ]
54
+ },
55
+ {
56
+ "route": "/services/[slug]",
57
+ "pageType": null,
58
+ "schema": null,
59
+ "shell": "MarketingShell",
60
+ "chrome": "on",
61
+ "sections": []
62
+ },
63
+ {
64
+ "route": "/about",
65
+ "pageType": "AboutPage",
66
+ "schema": "AboutPage",
67
+ "shell": "MarketingShell",
68
+ "chrome": "on",
69
+ "sections": [
70
+ {
71
+ "type": "content-block",
72
+ "component": "ContentBlock"
73
+ },
74
+ {
75
+ "type": "cta",
76
+ "component": "CTA"
77
+ }
78
+ ]
79
+ },
80
+ {
81
+ "route": "/contact",
82
+ "pageType": "ContactPage",
83
+ "schema": "ContactPage",
84
+ "shell": "MarketingShell",
85
+ "chrome": "on",
86
+ "sections": [
87
+ {
88
+ "type": "hero",
89
+ "component": "Hero"
90
+ },
91
+ {
92
+ "type": "contact-form",
93
+ "component": "ContactForm"
94
+ },
95
+ {
96
+ "type": "cta",
97
+ "component": "CTA"
98
+ }
99
+ ]
100
+ },
101
+ {
102
+ "route": "/faq",
103
+ "pageType": "FAQPage",
104
+ "schema": "FAQPage",
105
+ "shell": "MarketingShell",
106
+ "chrome": "on",
107
+ "sections": [
108
+ {
109
+ "type": "faq",
110
+ "component": "FAQ"
111
+ },
112
+ {
113
+ "type": "cta",
114
+ "component": "CTA"
115
+ }
116
+ ]
117
+ },
118
+ {
119
+ "route": "/returns",
120
+ "pageType": "ReturnsPolicyPage",
121
+ "schema": "ReturnsPolicyPage",
122
+ "shell": "MarketingShell",
123
+ "chrome": "on",
124
+ "sections": [
125
+ {
126
+ "type": "document-chassis",
127
+ "component": "DocumentChassis"
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ "route": "/cancellation",
133
+ "pageType": "CancellationPolicyPage",
134
+ "schema": "CancellationPolicyPage",
135
+ "shell": "MarketingShell",
136
+ "chrome": "on",
137
+ "sections": [
138
+ {
139
+ "type": "document-chassis",
140
+ "component": "DocumentChassis"
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ "route": "/shipping",
146
+ "pageType": "ShippingPolicyPage",
147
+ "schema": "ShippingPolicyPage",
148
+ "shell": "MarketingShell",
149
+ "chrome": "on",
150
+ "sections": [
151
+ {
152
+ "type": "document-chassis",
153
+ "component": "DocumentChassis"
154
+ }
155
+ ]
156
+ },
157
+ {
158
+ "route": "/privacy",
159
+ "pageType": "PrivacyPage",
160
+ "schema": "PrivacyPage",
161
+ "shell": "MarketingShell",
162
+ "chrome": "on",
163
+ "sections": [
164
+ {
165
+ "type": "document-chassis",
166
+ "component": "DocumentChassis"
167
+ }
168
+ ]
169
+ },
170
+ {
171
+ "route": "/terms",
172
+ "pageType": "TermsPage",
173
+ "schema": "TermsPage",
174
+ "shell": "MarketingShell",
175
+ "chrome": "on",
176
+ "sections": [
177
+ {
178
+ "type": "document-chassis",
179
+ "component": "DocumentChassis"
180
+ }
181
+ ]
182
+ },
183
+ {
184
+ "route": "/account",
185
+ "pageType": null,
186
+ "schema": null,
187
+ "shell": "MarketingShell",
188
+ "chrome": "on",
189
+ "sections": []
190
+ },
191
+ {
192
+ "route": "/purchase/success",
193
+ "pageType": null,
194
+ "schema": null,
195
+ "shell": "MarketingShell",
196
+ "chrome": "on",
197
+ "sections": []
198
+ },
199
+ {
200
+ "route": "/purchase/cancel",
201
+ "pageType": null,
202
+ "schema": null,
203
+ "shell": "MarketingShell",
204
+ "chrome": "on",
205
+ "sections": []
206
+ },
207
+ {
208
+ "route": "/meet",
209
+ "pageType": null,
210
+ "schema": null,
211
+ "shell": "MarketingShell",
212
+ "chrome": "on",
213
+ "sections": []
214
+ },
215
+ {
216
+ "route": "/meet/[slug]",
217
+ "pageType": null,
218
+ "schema": null,
219
+ "shell": "MarketingShell",
220
+ "chrome": "on",
221
+ "sections": []
222
+ },
223
+ {
224
+ "route": "/meet/confirmed",
225
+ "pageType": null,
226
+ "schema": null,
227
+ "shell": "MarketingShell",
228
+ "chrome": "on",
229
+ "sections": []
230
+ },
231
+ {
232
+ "route": "/appointments",
233
+ "pageType": null,
234
+ "schema": null,
235
+ "shell": "MarketingShell",
236
+ "chrome": "on",
237
+ "sections": []
238
+ }
239
+ ]
240
+ }