create-ailk 0.5.0 → 0.6.1

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 (329) 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/cli.js +54 -5
  5. package/dist/copy.d.ts +14 -0
  6. package/dist/copy.js +38 -1
  7. package/dist/lib/api-boot-assertion.d.ts +46 -0
  8. package/dist/lib/api-boot-assertion.js +70 -0
  9. package/dist/lib/extract-module-bundle.d.ts +20 -1
  10. package/dist/lib/extract-module-bundle.js +64 -5
  11. package/dist/lib/import-graph.d.ts +29 -0
  12. package/dist/lib/import-graph.js +140 -0
  13. package/dist/lib/module-license-gate.d.ts +6 -1
  14. package/dist/lib/module-license-gate.js +6 -1
  15. package/dist/lib/pro-callout.js +1 -1
  16. package/dist/module-architecture.d.ts +1 -0
  17. package/dist/module-architecture.js +253 -127
  18. package/dist/modules/commerce/0.6.0.tar.gz +0 -0
  19. package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
  20. package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
  21. package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
  22. package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
  23. package/dist/modules/workspace/0.6.0.tar.gz +0 -0
  24. package/dist/programmatic.js +14 -10
  25. package/dist/surfaces.js +105 -7
  26. package/dist/template-manifest.d.ts +33 -0
  27. package/dist/template-manifest.js +99 -16
  28. package/dist/template-names.d.ts +1 -1
  29. package/dist/template-names.js +1 -0
  30. package/package.json +3 -2
  31. package/site-templates/marketing-site/DESIGN.md +148 -0
  32. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +22 -2
  33. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +9 -2
  34. package/site-templates/marketing-site/ailk-template.json +1 -1
  35. package/site-templates/marketing-site-free/DESIGN.md +148 -0
  36. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +2 -2
  37. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +1 -0
  38. package/site-templates/minimalism-site/DESIGN.md +148 -0
  39. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +10 -2
  40. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +47 -35
  41. package/site-templates/minimalism-site/ailk-template.json +2 -1
  42. package/site-templates/minimalism-site/assets/wordmark-placeholder.svg +28 -0
  43. package/site-templates/minimalism-site/content/en/HomePage/home.mdx +49 -19
  44. package/site-templates/saas-product/DESIGN.md +148 -0
  45. package/site-templates/simple-service/DESIGN.md +148 -0
  46. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +240 -0
  47. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +278 -0
  48. package/site-templates/simple-service/ailk-template.json +10 -0
  49. package/site-templates/simple-service/content/en/AboutPage/about.mdx +38 -0
  50. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +67 -0
  51. package/site-templates/simple-service/content/en/FAQPage/faq.mdx +56 -0
  52. package/site-templates/simple-service/content/en/HomePage/home.mdx +85 -0
  53. package/site-templates/simple-service/content/en/Service/landscape-design.mdx +40 -0
  54. package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +40 -0
  55. package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +40 -0
  56. package/site-templates/simple-service/content/en/ServicesList/services.mdx +72 -0
  57. package/site-templates/simple-service/provenance.json +4 -0
  58. package/templates/.env.example +72 -7
  59. package/templates/CLAUDE.md +2 -3
  60. package/templates/DESIGN.md +155 -0
  61. package/templates/README.md +42 -8
  62. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +8 -0
  63. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +12 -0
  64. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +12 -0
  65. package/templates/apps/api/.env.example +13 -0
  66. package/templates/apps/api/CLAUDE.md +26 -2
  67. package/templates/apps/api/jest.config.cjs +3 -0
  68. package/templates/apps/api/package.json +1 -0
  69. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +407 -0
  70. package/templates/apps/api/src/__tests__/module-exclusion.test.ts +83 -7
  71. package/templates/apps/api/src/__tests__/server.test.ts +471 -0
  72. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +45 -0
  73. package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +2 -0
  74. package/templates/apps/api/src/config/index.ts +62 -0
  75. package/templates/apps/api/src/config/modules.ts +7 -3
  76. package/templates/apps/api/src/lib/__mocks__/prisma.ts +238 -2
  77. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +143 -0
  78. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +23 -0
  79. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +125 -0
  80. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +20 -0
  81. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +317 -0
  82. package/templates/apps/api/src/lib/__tests__/site.test.ts +238 -0
  83. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +75 -0
  84. package/templates/apps/api/src/lib/auth-email-budget.ts +160 -0
  85. package/templates/apps/api/src/lib/content-adapter.ts +57 -31
  86. package/templates/apps/api/src/lib/deliverable-asset-store.ts +76 -0
  87. package/templates/apps/api/src/lib/error-serializer.ts +23 -3
  88. package/templates/apps/api/src/lib/outbound-http.ts +7 -2
  89. package/templates/apps/api/src/lib/require-commerce-claim.ts +250 -0
  90. package/templates/apps/api/src/lib/site.ts +208 -9
  91. package/templates/apps/api/src/lib/stripe.ts +66 -0
  92. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +182 -0
  93. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +42 -0
  94. package/templates/apps/api/src/middleware/rate-limit.ts +7 -1
  95. package/templates/apps/api/src/openapi/spec.ts +543 -2
  96. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +48 -0
  97. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +309 -0
  98. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +123 -0
  99. package/templates/apps/api/src/routes/auth/transactional-email.ts +273 -0
  100. package/templates/apps/api/src/routes/auth/user.ts +61 -0
  101. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +434 -0
  102. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +888 -0
  103. package/templates/apps/api/src/routes/checkout/index.ts +34 -0
  104. package/templates/apps/api/src/routes/checkout/session.ts +139 -0
  105. package/templates/apps/api/src/routes/checkout/sessions.ts +197 -0
  106. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +554 -0
  107. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +108 -0
  108. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +450 -0
  109. package/templates/apps/api/src/routes/content/get-page.ts +94 -12
  110. package/templates/apps/api/src/routes/content/index.ts +13 -73
  111. package/templates/apps/api/src/routes/content/list-pages.ts +15 -3
  112. package/templates/apps/api/src/routes/content/rate-limit.ts +15 -6
  113. package/templates/apps/api/src/routes/content/search.ts +129 -0
  114. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +447 -31
  115. package/templates/apps/api/src/routes/leads/index.ts +100 -13
  116. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +51 -0
  117. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +351 -0
  118. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +51 -0
  119. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +5 -2
  120. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +4 -1
  121. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +58 -0
  122. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +107 -6
  123. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +87 -2
  124. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +51 -0
  125. package/templates/apps/api/src/routes/project-listings/start.ts +5 -1
  126. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +686 -0
  127. package/templates/apps/api/src/routes/requests/confirm.ts +601 -0
  128. package/templates/apps/api/src/routes/requests/index.ts +54 -0
  129. package/templates/apps/api/src/routes/webhooks/README.md +265 -0
  130. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +749 -0
  131. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +330 -0
  132. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +262 -0
  133. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +285 -0
  134. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +213 -0
  135. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +301 -0
  136. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +648 -0
  137. package/templates/apps/api/src/routes/webhooks/index.ts +89 -0
  138. package/templates/apps/api/src/routes/webhooks/stripe.ts +1399 -0
  139. package/templates/apps/api/src/server.ts +439 -49
  140. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +39 -0
  141. package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +217 -40
  142. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +620 -0
  143. package/templates/apps/api/src/services/__tests__/consent.test.ts +2 -0
  144. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +300 -5
  145. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +20 -0
  146. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +368 -0
  147. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +160 -0
  148. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +166 -0
  149. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +154 -0
  150. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +137 -0
  151. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +444 -0
  152. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +238 -0
  153. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +78 -0
  154. package/templates/apps/api/src/services/abandon-email.ts +8 -2
  155. package/templates/apps/api/src/services/aeo-score.ts +49 -12
  156. package/templates/apps/api/src/services/audit-log.ts +668 -0
  157. package/templates/apps/api/src/services/consent.ts +18 -0
  158. package/templates/apps/api/src/services/default-tenant.ts +70 -31
  159. package/templates/apps/api/src/services/deliverable-fulfillment.ts +141 -13
  160. package/templates/apps/api/src/services/dunning-policy.ts +294 -0
  161. package/templates/apps/api/src/services/entitlements.ts +80 -0
  162. package/templates/apps/api/src/services/lead-promotion.ts +13 -14
  163. package/templates/apps/api/src/services/lead-routing.ts +161 -2
  164. package/templates/apps/api/src/services/leads-inbox.ts +23 -2
  165. package/templates/apps/api/src/services/listing-config.ts +27 -9
  166. package/templates/apps/api/src/services/project-listings.ts +201 -6
  167. package/templates/apps/api/src/services/public-site-resolver.ts +106 -0
  168. package/templates/apps/api/src/services/request-confirm.ts +646 -0
  169. package/templates/apps/api/src/services/revalidation.ts +173 -0
  170. package/templates/apps/api/src/services/verified-email.ts +71 -0
  171. package/templates/apps/api/src/vercel-handler.ts +75 -35
  172. package/templates/apps/mcp/.env.example +17 -0
  173. package/templates/apps/mcp/CLAUDE.md +57 -24
  174. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +6 -0
  175. package/templates/apps/mcp/__tests__/audit.test.ts +137 -8
  176. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +79 -36
  177. package/templates/apps/mcp/__tests__/get_offerings.test.ts +111 -2
  178. package/templates/apps/mcp/__tests__/get_pricing.test.ts +82 -2
  179. package/templates/apps/mcp/__tests__/http-transport.test.ts +541 -2
  180. package/templates/apps/mcp/__tests__/index.test.ts +39 -0
  181. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +143 -0
  182. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +111 -0
  183. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +65 -0
  184. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +188 -0
  185. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +165 -0
  186. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +124 -0
  187. package/templates/apps/mcp/__tests__/list_pages.test.ts +116 -0
  188. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +7 -1
  189. package/templates/apps/mcp/__tests__/parity.test.ts +10 -7
  190. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +89 -22
  191. package/templates/apps/mcp/__tests__/read_content.test.ts +322 -1
  192. package/templates/apps/mcp/__tests__/search_content.test.ts +105 -2
  193. package/templates/apps/mcp/__tests__/server.test.ts +67 -14
  194. package/templates/apps/mcp/__tests__/start_purchase.test.ts +252 -0
  195. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +300 -123
  196. package/templates/apps/mcp/jest.config.cjs +13 -0
  197. package/templates/apps/mcp/package.json +2 -0
  198. package/templates/apps/mcp/src/abuse/index.ts +159 -24
  199. package/templates/apps/mcp/src/config/modules.ts +10 -5
  200. package/templates/apps/mcp/src/http-transport.ts +102 -29
  201. package/templates/apps/mcp/src/index.ts +73 -11
  202. package/templates/apps/mcp/src/lib/audit-single-page.ts +90 -3
  203. package/templates/apps/mcp/src/lib/commerce-claim.ts +94 -0
  204. package/templates/apps/mcp/src/lib/content-adapter.ts +113 -0
  205. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +139 -0
  206. package/templates/apps/mcp/src/lib/prisma.ts +39 -0
  207. package/templates/apps/mcp/src/lib/public-workspace.ts +133 -0
  208. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +59 -0
  209. package/templates/apps/mcp/src/server.ts +59 -35
  210. package/templates/apps/mcp/src/tools/audit.ts +26 -2
  211. package/templates/apps/mcp/src/tools/get_business_hours.ts +4 -3
  212. package/templates/apps/mcp/src/tools/get_faq.ts +4 -3
  213. package/templates/apps/mcp/src/tools/get_locations.ts +5 -3
  214. package/templates/apps/mcp/src/tools/get_offerings.ts +16 -4
  215. package/templates/apps/mcp/src/tools/get_pricing.ts +25 -6
  216. package/templates/apps/mcp/src/tools/get_site_info.ts +4 -3
  217. package/templates/apps/mcp/src/tools/index.ts +6 -4
  218. package/templates/apps/mcp/src/tools/list_pages.ts +4 -3
  219. package/templates/apps/mcp/src/tools/purchase.ts +128 -45
  220. package/templates/apps/mcp/src/tools/read_content.ts +20 -6
  221. package/templates/apps/mcp/src/tools/search_content.ts +11 -4
  222. package/templates/apps/web/.env.example +71 -5
  223. package/templates/apps/web/CLAUDE.md +44 -0
  224. package/templates/apps/web/PRODUCT.md +86 -0
  225. package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +18 -2
  226. package/templates/apps/web/app/.well-known/mcp.json/route.ts +11 -3
  227. package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +282 -0
  228. package/templates/apps/web/app/[locale]/(auth)/__tests__/password-reset.test.tsx +515 -0
  229. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +89 -0
  230. package/templates/apps/web/app/[locale]/(auth)/forgot-password/page.tsx +109 -0
  231. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +92 -0
  232. package/templates/apps/web/app/[locale]/(auth)/reset-password/page.tsx +135 -0
  233. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +109 -0
  234. package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/page.test.tsx +48 -2
  235. package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/page.tsx +20 -6
  236. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +125 -0
  237. package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +96 -0
  238. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +101 -0
  239. package/templates/apps/web/app/[locale]/(auth)/use-auth-card-flow.ts +102 -0
  240. package/templates/apps/web/app/[locale]/(auth)/verify-email/page.tsx +87 -0
  241. package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +20 -10
  242. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +84 -0
  243. package/templates/apps/web/app/[locale]/(authed)/account/actions.ts +58 -0
  244. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +63 -8
  245. package/templates/apps/web/app/[locale]/(authed)/layout.tsx +18 -1
  246. package/templates/apps/web/app/[locale]/cancellation/page.tsx +44 -0
  247. package/templates/apps/web/app/[locale]/layout.tsx +133 -87
  248. package/templates/apps/web/app/[locale]/purchase/__tests__/cancel.test.tsx +162 -0
  249. package/templates/apps/web/app/[locale]/purchase/__tests__/module-scope.test.ts +68 -0
  250. package/templates/apps/web/app/[locale]/purchase/__tests__/success.test.tsx +361 -0
  251. package/templates/apps/web/app/[locale]/purchase/cancel/page.tsx +115 -0
  252. package/templates/apps/web/app/[locale]/purchase/success/page.tsx +307 -0
  253. package/templates/apps/web/app/[locale]/returns/page.tsx +44 -0
  254. package/templates/apps/web/app/[locale]/shipping/page.tsx +44 -0
  255. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +670 -0
  256. package/templates/apps/web/app/api/revalidate/route.ts +194 -0
  257. package/templates/apps/web/auth.ts +407 -8
  258. package/templates/apps/web/jest.config.cjs +8 -4
  259. package/templates/apps/web/lib/__tests__/auth-email.test.ts +214 -0
  260. package/templates/apps/web/lib/__tests__/auth-routes.test.ts +74 -0
  261. package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +72 -0
  262. package/templates/apps/web/lib/__tests__/site-theme.test.ts +135 -20
  263. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +18 -1
  264. package/templates/apps/web/lib/auth-email.ts +318 -0
  265. package/templates/apps/web/lib/auth-env.ts +85 -0
  266. package/templates/apps/web/lib/auth-routes.ts +55 -0
  267. package/templates/apps/web/lib/meeting-slugs.ts +53 -0
  268. package/templates/apps/web/lib/site-brand.tsx +4 -8
  269. package/templates/apps/web/lib/telemetry-scrub.ts +5 -1
  270. package/templates/apps/web/messages/en.json +187 -0
  271. package/templates/apps/web/middleware.ts +1 -1
  272. package/templates/apps/web/package.json +2 -1
  273. package/templates/apps/web/src/lib/commerce-claim.ts +33 -0
  274. package/templates/apps/web/src/lib/commerce-sections.ts +93 -0
  275. package/templates/content/_site.mdx +18 -3
  276. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +108 -0
  277. package/templates/content/en/ReturnsPolicyPage/returns.mdx +108 -0
  278. package/templates/content/en/ShippingPolicyPage/shipping.mdx +108 -0
  279. package/templates/database/CHANGELOG.md +149 -0
  280. package/templates/database/README.md +10 -3
  281. package/templates/database/__tests__/appointment.db.test.ts +106 -0
  282. package/templates/database/__tests__/artifact-content-store.db.test.ts +316 -0
  283. package/templates/database/__tests__/composite-fence.db.test.ts +206 -0
  284. package/templates/database/__tests__/fence-fan-out.db.test.ts +711 -0
  285. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +79 -0
  286. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +100 -0
  287. package/templates/database/__tests__/flow-workspace-key.db.test.ts +263 -0
  288. package/templates/database/__tests__/prefixed-ids.db.test.ts +85 -9
  289. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +111 -0
  290. package/templates/database/__tests__/tenancy.test.ts +141 -0
  291. package/templates/database/config/schema.prisma +79 -2
  292. package/templates/database/content/schema.prisma +87 -11
  293. package/templates/database/inbox/schema.prisma +452 -9
  294. package/templates/database/jest.config.cjs +5 -3
  295. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +15 -0
  296. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +158 -0
  297. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +40 -0
  298. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +67 -0
  299. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +70 -0
  300. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +181 -0
  301. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +172 -0
  302. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +41 -0
  303. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +185 -0
  304. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +70 -0
  305. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +57 -0
  306. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +68 -0
  307. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +1067 -0
  308. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +210 -0
  309. package/templates/database/package.json +3 -2
  310. package/templates/database/tenancy.ts +86 -1
  311. package/templates/database/tsconfig.json +1 -0
  312. package/versions.json +34 -34
  313. package/templates/apps/api/src/routes/content/__tests__/create.test.ts +0 -253
  314. package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +0 -215
  315. package/templates/apps/api/src/routes/content/__tests__/update.test.ts +0 -266
  316. package/templates/apps/api/src/routes/content/create.ts +0 -115
  317. package/templates/apps/api/src/routes/content/delete.ts +0 -82
  318. package/templates/apps/api/src/routes/content/update.ts +0 -112
  319. package/templates/apps/mcp/__tests__/create_page.test.ts +0 -202
  320. package/templates/apps/mcp/__tests__/delete_page.test.ts +0 -177
  321. package/templates/apps/mcp/__tests__/update_page.test.ts +0 -196
  322. package/templates/apps/mcp/src/tools/create_page.ts +0 -96
  323. package/templates/apps/mcp/src/tools/delete_page.ts +0 -74
  324. package/templates/apps/mcp/src/tools/update_page.ts +0 -92
  325. package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +0 -123
  326. package/templates/apps/web/public/logo-dark.svg +0 -21
  327. package/templates/apps/web/public/logo-light.svg +0 -21
  328. /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/next-path.test.ts +0 -0
  329. /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/next-path.ts +0 -0
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: Standard (Free) — marketing-site-free
3
+ description: The Free starter: nine-beat marketing home and core pages on the black-on-white foundation.
4
+ colors:
5
+ bg: "#ffffff"
6
+ fg: "#000000"
7
+ surface: "#ffffff"
8
+ surface-secondary: "#ffffff"
9
+ border: "#000000"
10
+ text-muted: "#333333"
11
+ brand: "#000000"
12
+ fg-on-brand: "#ffffff"
13
+ accent: "#000000"
14
+ bg-dark: "#000000"
15
+ fg-dark: "#ffffff"
16
+ border-dark: "#ffffff"
17
+ brand-dark: "#ffffff"
18
+ typography:
19
+ display:
20
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
21
+ fontSize: "6rem"
22
+ fontWeight: 400
23
+ lineHeight: 1
24
+ letterSpacing: "-0.05em"
25
+ heading-section:
26
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
27
+ fontSize: "2.25rem"
28
+ fontWeight: 400
29
+ lineHeight: 1.25
30
+ letterSpacing: "-0.05em"
31
+ heading-item:
32
+ fontSize: "1.25rem"
33
+ fontWeight: 600
34
+ lineHeight: 1.375
35
+ body:
36
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
37
+ fontSize: "1.125rem"
38
+ fontWeight: 400
39
+ lineHeight: 1.5
40
+ eyebrow:
41
+ fontSize: "0.875rem"
42
+ fontWeight: 600
43
+ lineHeight: 1.4
44
+ letterSpacing: "0.05em"
45
+ rounded:
46
+ button: "0.25rem"
47
+ card: "0.75rem"
48
+ spacing:
49
+ section: "4rem"
50
+ card: "1.5rem"
51
+ grid: "1.5rem"
52
+ container: "1280px"
53
+ ---
54
+
55
+ <!--
56
+ Source template: marketing-site-free
57
+ Version: create-ailk {{CREATE_AILK_VERSION}}
58
+ Extends: _base — installing this template replaces the base scaffold's
59
+ DESIGN.md with this file. Its tokens are the base foundation's, unchanged:
60
+ this template carries no theme of its own.
61
+
62
+ The tokens above describe what the site RENDERS today. Colours come from
63
+ content/_site.mdx (`theme.colors`); type, radius and spacing are platform
64
+ defaults a site cannot override yet — see "Where this is heading" below.
65
+ -->
66
+
67
+ # Standard (Free)
68
+
69
+ ## Overview
70
+
71
+ The Standard (Free) template is the base scaffold's own page set, recorded as a template. Its home is a conversion argument in nine beats — the offer, the logos, old way versus new way, what you get, what it connects to, how to start, the ask, why it exists, and the demo — each one full-width band with a lot of air around it. It carries no content or theme of its own: everything it renders comes from the base foundation.
72
+
73
+ ## Colors
74
+
75
+ ### Primary
76
+
77
+ **Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
78
+
79
+ ### Neutral
80
+
81
+ Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
82
+
83
+ Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
84
+
85
+ ### Named Rules
86
+
87
+ - **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
88
+
89
+ ## Typography
90
+
91
+ System sans throughout; no web font.
92
+
93
+ ### Hierarchy
94
+
95
+ | Role | Size | Weight | Notes |
96
+ | --------------- | -------- | ------ | --------------------------------------------------------------------------- |
97
+ | Hero headline | 6rem | 400 | Tracking -0.05em, line-height 1 |
98
+ | Section heading | 2.25rem | 400 | Tracking -0.05em — light and tight, not bold |
99
+ | Item heading | 1.25rem | 600 | Card, feature and step titles |
100
+ | Body | 1.125rem | 400 | `#333333`, line-height 1.5 |
101
+ | Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
102
+
103
+ Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
104
+
105
+ The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
106
+
107
+ ## Layout
108
+
109
+ Full navigation with the announcement banner; a multi-column footer; the default home. Every page and its sections are listed in `TEMPLATE-MANIFEST.md` in this directory. Shared foundation: a 1280px container, sections at 4rem, card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
110
+
111
+ ## Shapes
112
+
113
+ Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
114
+
115
+ ## Components
116
+
117
+ ### Buttons
118
+
119
+ Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
120
+
121
+ ### Cards / Containers
122
+
123
+ White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
124
+
125
+ ### Navigation
126
+
127
+ Full navigation: wordmark left, page links, an outlined and a filled button at the far right, the announcement banner above. A black hairline separates it from the page.
128
+
129
+ ## Where this is heading
130
+
131
+ The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. Six parts of that direction cannot be expressed through a site's theme today, so they wait on a platform change rather than being hand-coded. Until they land, this file describes the rendered site above, not these targets.
132
+
133
+ | Target | Reference value | Blocked by |
134
+ | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
135
+ | Square corners on buttons, cards and inputs | radius 0 | A site's `theme:` block accepts colours only — no radius |
136
+ | Bold, tighter headings | hero ~3.6rem and section headings ~2.9rem, both at weight 700 with tracking about -0.02em (today 6rem and 2.25rem at weight 400) | No per-site type-role override |
137
+ | Generous section pacing | about 10rem between sections, not 4rem | No per-site section-spacing override; `spacious` (6rem) is not author-selectable |
138
+ | Section label in sentence case, bold, no tracking | "Core Features", not "CORE FEATURES" | The eyebrow role bakes in uppercase and tracking |
139
+ | Whitespace between sections, not rules | no rule between bands | Section dividers share the one `border` colour with card outlines, so black outlines make black dividers |
140
+ | Outlined steps in "how it works" | three plain outlined columns | The steps section renders dark filled cards; no outlined variant |
141
+
142
+ ## Do's and Don'ts
143
+
144
+ - **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
145
+ - **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
146
+ - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
147
+ - **Don't** replace a black rule with a shadow or a grey fill.
148
+ - **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "template": "marketing-site-free",
3
3
  "requires": ["marketing"],
4
- "createAilkVersion": "0.5.0",
5
- "generatedHash": "caf43a290ed0404a0e69d378b39952b58f9d24fb28389ff26beb618502b9ef4c",
4
+ "categories": ["accounting", "legal", "technology"],
5
+ "generatedHash": "c12535b332c6ff664fea110372c0cd9b1a0f719f8e274586d2ca66954cc9f2a2",
6
6
  "layout": {
7
7
  "nav": "full",
8
8
  "footer": "columns",
@@ -239,6 +239,7 @@ The template is content and config; the states live in the components. This tabl
239
239
  ```
240
240
  marketing-site-free:
241
241
  requires: [marketing]
242
+ categories: [accounting, legal, technology]
242
243
  roster:
243
244
  - { route: "/", content: ["content/en/HomePage/home.mdx"] }
244
245
  - { route: "/how-it-works", content: ["content/en/LandingPage/how-it-works.mdx"] }
@@ -0,0 +1,148 @@
1
+ ---
2
+ name: Minimalism site (Pro) — minimalism-site
3
+ description: A reports-first site whose home is a nine-slide scroll-snap deck, with a mark-only navigation and a centred footer.
4
+ colors:
5
+ bg: "#ffffff"
6
+ fg: "#000000"
7
+ surface: "#ffffff"
8
+ surface-secondary: "#ffffff"
9
+ border: "#000000"
10
+ text-muted: "#333333"
11
+ brand: "#000000"
12
+ fg-on-brand: "#ffffff"
13
+ accent: "#000000"
14
+ bg-dark: "#000000"
15
+ fg-dark: "#ffffff"
16
+ border-dark: "#ffffff"
17
+ brand-dark: "#ffffff"
18
+ typography:
19
+ display:
20
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
21
+ fontSize: "6rem"
22
+ fontWeight: 400
23
+ lineHeight: 1
24
+ letterSpacing: "-0.05em"
25
+ heading-section:
26
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
27
+ fontSize: "2.25rem"
28
+ fontWeight: 400
29
+ lineHeight: 1.25
30
+ letterSpacing: "-0.05em"
31
+ heading-item:
32
+ fontSize: "1.25rem"
33
+ fontWeight: 600
34
+ lineHeight: 1.375
35
+ body:
36
+ fontFamily: "system-ui, -apple-system, Segoe UI, Roboto, Helvetica Neue, sans-serif"
37
+ fontSize: "1.125rem"
38
+ fontWeight: 400
39
+ lineHeight: 1.5
40
+ eyebrow:
41
+ fontSize: "0.875rem"
42
+ fontWeight: 600
43
+ lineHeight: 1.4
44
+ letterSpacing: "0.05em"
45
+ rounded:
46
+ button: "0.25rem"
47
+ card: "0.75rem"
48
+ spacing:
49
+ section: "4rem"
50
+ card: "1.5rem"
51
+ grid: "1.5rem"
52
+ container: "1280px"
53
+ ---
54
+
55
+ <!--
56
+ Source template: minimalism-site
57
+ Version: create-ailk {{CREATE_AILK_VERSION}}
58
+ Extends: _base — installing this template replaces the base scaffold's
59
+ DESIGN.md with this file. Its tokens are the base foundation's, unchanged:
60
+ this template carries no theme of its own.
61
+
62
+ The tokens above describe what the site RENDERS today. Colours come from
63
+ content/_site.mdx (`theme.colors`); type, radius and spacing are platform
64
+ defaults a site cannot override yet — see "Where this is heading" below.
65
+ -->
66
+
67
+ # Minimalism site (Pro)
68
+
69
+ ## Overview
70
+
71
+ A reports-first template. The home page is a nine-slide deck that snaps one slide per scroll, so the site reads like a presentation before it reads like a website. The rest of the site — reports, services, booking, referral — is quiet and document-like. It runs on the base foundation's colours and type; its character comes from structure, not a palette.
72
+
73
+ ## Colors
74
+
75
+ ### Primary
76
+
77
+ **Black** (`brand` `#000000`) fills the primary button; its label is white. The secondary button is white with a black hairline and black label.
78
+
79
+ ### Neutral
80
+
81
+ Pure white ground (`bg` `#ffffff`), pure black ink for headings (`fg` `#000000`), and near-black `#333333` for body copy — well above AA on white. **Borders are black** (`#000000`): card outlines, the rule under the navigation, the rules between sections and the rule above the footer are all 1px black lines. Cards are white, not tinted (`surface-secondary` is white too). There is no accent colour — `accent` is black.
82
+
83
+ Dark mode inverts: black ground, white ink, white rules, white primary button with black label.
84
+
85
+ ### Named Rules
86
+
87
+ - **Rules, not fills.** A container is drawn with a black hairline on the white ground. Grey fills are reserved for image placeholders.
88
+
89
+ ## Typography
90
+
91
+ System sans throughout; no web font.
92
+
93
+ ### Hierarchy
94
+
95
+ | Role | Size | Weight | Notes |
96
+ | --------------- | -------- | ------ | --------------------------------------------------------------------------- |
97
+ | Hero headline | 6rem | 400 | Tracking -0.05em, line-height 1 |
98
+ | Section heading | 2.25rem | 400 | Tracking -0.05em — light and tight, not bold |
99
+ | Item heading | 1.25rem | 600 | Card, feature and step titles |
100
+ | Body | 1.125rem | 400 | `#333333`, line-height 1.5 |
101
+ | Section label | 0.875rem | 600 | Uppercase, +0.05em tracking today — the small label above a section heading |
102
+
103
+ Measured from the rendered scaffold (1440px wide), not transcribed from tokens.
104
+
105
+ The small label above a section heading is **kept** as part of this foundation's voice (operator-disposed 2026-09-22) and is headed toward the treatment below.
106
+
107
+ ## Layout
108
+
109
+ Home is the `deck` layout: nine full-viewport slides with scroll-snap. The navigation is `mark-only`, the footer is `centered`, and there is no announcement banner. Placeholder illustrations ship in `assets/`. Every page and its sections are listed in `TEMPLATE-MANIFEST.md` in this directory. Shared foundation: a 1280px container, sections at 4rem, card grids at 1.5rem, breakpoints 320 / 768 / 1024 / 1440.
110
+
111
+ ## Shapes
112
+
113
+ Two radii today: buttons at 0.25rem, cards and outlined boxes at 0.75rem. Headed toward square corners — see below.
114
+
115
+ ## Components
116
+
117
+ ### Buttons
118
+
119
+ Primary: black fill, white label, 0.25rem corners. Secondary: transparent with a black 1px outline and black label. Both are the library `Button`.
120
+
121
+ ### Cards / Containers
122
+
123
+ White panels with a black 1px outline, 0.75rem corners, `card` (1.5rem) padding. The one exception today: the "how it works" steps render as dark filled cards (see below).
124
+
125
+ ### Navigation
126
+
127
+ Mark-only: the logomark alone, top left. No link row and no buttons in the header.
128
+
129
+ ## Where this is heading
130
+
131
+ The foundation's pinned direction is the pacing of a classic wireframe marketing kit — `standardissue.webflow.io` is the reference for rhythm, type scale, spacing density and section pacing only; no image, copy or code is taken from it. Six parts of that direction cannot be expressed through a site's theme today, so they wait on a platform change rather than being hand-coded. Until they land, this file describes the rendered site above, not these targets.
132
+
133
+ | Target | Reference value | Blocked by |
134
+ | ------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------- |
135
+ | Square corners on buttons, cards and inputs | radius 0 | A site's `theme:` block accepts colours only — no radius |
136
+ | Bold, tighter headings | hero ~3.6rem and section headings ~2.9rem, both at weight 700 with tracking about -0.02em (today 6rem and 2.25rem at weight 400) | No per-site type-role override |
137
+ | Generous section pacing | about 10rem between sections, not 4rem | No per-site section-spacing override; `spacious` (6rem) is not author-selectable |
138
+ | Section label in sentence case, bold, no tracking | "Core Features", not "CORE FEATURES" | The eyebrow role bakes in uppercase and tracking |
139
+ | Whitespace between sections, not rules | no rule between bands | Section dividers share the one `border` colour with card outlines, so black outlines make black dividers |
140
+ | Outlined steps in "how it works" | three plain outlined columns | The steps section renders dark filled cards; no outlined variant |
141
+
142
+ ## Do's and Don'ts
143
+
144
+ - **Do** keep every page built from registered sections. If a section you need does not exist, request it rather than writing one-off markup.
145
+ - **Do** change colours in `content/_site.mdx` `theme.colors`; they reach every section.
146
+ - **Don't** add a colour accent. The foundation's one idea is black on white; a brand pass adds colour deliberately, through the theme.
147
+ - **Don't** replace a black rule with a shadow or a grey fill.
148
+ - **Don't** hard-code the "heading toward" values above into a page. They arrive through the platform, or not at all.
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "template": "minimalism-site",
3
3
  "requires": ["marketing", "scheduling", "signal-collectors"],
4
- "createAilkVersion": "0.5.0",
5
- "generatedHash": "f06728a588e1358f6fb3ece824340ebc780d5f4431230dd4b4e039bd2b6f8172",
4
+ "categories": ["real-estate", "technology", "legal"],
5
+ "generatedHash": "639c3fc8cf1783e33b55908c875defc80ad638979f04ed09eed5ee608e9c09cb",
6
6
  "layout": {
7
7
  "nav": "mark-only",
8
8
  "footer": "centered",
@@ -235,6 +235,14 @@
235
235
  "chrome": "on",
236
236
  "sections": []
237
237
  },
238
+ {
239
+ "route": "/appointments",
240
+ "pageType": null,
241
+ "schema": null,
242
+ "shell": "MarketingShell",
243
+ "chrome": "on",
244
+ "sections": []
245
+ },
238
246
  {
239
247
  "route": "/flows/[slug]",
240
248
  "pageType": null,
@@ -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>