create-ailk 0.24.0 → 0.26.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 (638) hide show
  1. package/README.md +53 -22
  2. package/component-catalog.json +3 -3
  3. package/component-catalog.md +3 -3
  4. package/dist/add-module.js +4 -2
  5. package/dist/add-route.d.ts +12 -1
  6. package/dist/add-route.js +31 -3
  7. package/dist/cli.js +12 -7
  8. package/dist/derive-architecture.d.ts +3 -4
  9. package/dist/derive-architecture.js +65 -29
  10. package/dist/lib/design-checks.d.ts +9 -4
  11. package/dist/lib/design-checks.js +13 -7
  12. package/dist/lib/extract-module-bundle.js +29 -2
  13. package/dist/lib/fetch-template-snapshot.d.ts +2 -1
  14. package/dist/lib/fetch-template-snapshot.js +8 -3
  15. package/dist/lib/import-graph.d.ts +1 -1
  16. package/dist/lib/import-graph.js +4 -4
  17. package/dist/lib/module-license-gate.d.ts +12 -1
  18. package/dist/lib/module-license-gate.js +36 -15
  19. package/dist/lib/module-tier.d.ts +2 -8
  20. package/dist/lib/module-tier.js +13 -12
  21. package/dist/module-architecture.d.ts +20 -3
  22. package/dist/module-architecture.js +129 -552
  23. package/dist/paid-sections.d.ts +25 -1
  24. package/dist/paid-sections.js +88 -3
  25. package/dist/starter-grid.d.ts +6 -6
  26. package/dist/starter-grid.js +12 -5
  27. package/dist/surfaces.js +39 -2
  28. package/dist/template-record.d.ts +21 -3
  29. package/dist/template-record.js +38 -7
  30. package/dist/topology.d.ts +16 -3
  31. package/dist/topology.js +54 -23
  32. package/dist/update.d.ts +10 -1
  33. package/dist/update.js +715 -21
  34. package/package.json +3 -3
  35. package/release-scope.json +2 -2
  36. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +8 -2
  37. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +2 -2
  38. package/site-templates/marketing-site/ailk-template.json +7 -1
  39. package/site-templates/marketing-site/provenance.json +7 -1
  40. package/site-templates/saas-product/ailk-template.json +2 -1
  41. package/site-templates/saas-product/provenance.json +1 -0
  42. package/templates/.claude/cloudparity-repo-hooks.json +5 -0
  43. package/templates/.claude/hooks/template-guard.sh +137 -0
  44. package/templates/.claude/rules/extending.md +106 -0
  45. package/templates/.claude/rules/loop-contract.md +2 -2
  46. package/templates/.claude/settings.json +11 -0
  47. package/templates/.env.example +20 -5
  48. package/templates/.github/workflows/ci.yml +7 -4
  49. package/templates/CLAUDE.md +11 -1
  50. package/templates/CONVENTIONS.md +8 -10
  51. package/templates/README.md +14 -13
  52. package/templates/apps/api/.env.example +23 -2
  53. package/templates/apps/api/CLAUDE.md +119 -83
  54. package/templates/apps/api/jest.config.cjs +15 -5
  55. package/templates/apps/api/package.json +16 -20
  56. package/templates/apps/api/src/__tests__/trusted-origins.server.test.ts +2 -2
  57. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +4 -4
  58. package/templates/apps/api/src/index.ts +1 -1
  59. package/templates/apps/api/src/lib/__mocks__/prisma-client.js +16 -0
  60. package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -3
  61. package/templates/apps/api/src/modules/commerce.ts +10 -0
  62. package/templates/apps/api/src/modules/content-write.ts +10 -0
  63. package/templates/apps/api/src/modules/multi-tenant.ts +10 -0
  64. package/templates/apps/api/src/modules/scheduling.ts +10 -0
  65. package/templates/apps/api/src/modules/signal-collectors.ts +10 -0
  66. package/templates/apps/api/src/modules/workspace.ts +10 -0
  67. package/templates/apps/api/src/server.ts +117 -1882
  68. package/templates/apps/api/vercel.json +2 -2
  69. package/templates/apps/mcp/CLAUDE.md +90 -26
  70. package/templates/apps/mcp/__tests__/app-entry.test.ts +4 -254
  71. package/templates/apps/mcp/__tests__/boot-file.test.ts +92 -0
  72. package/templates/apps/mcp/jest.config.cjs +6 -1
  73. package/templates/apps/mcp/package.json +5 -13
  74. package/templates/apps/mcp/src/app.ts +8 -7
  75. package/templates/apps/mcp/src/index.ts +6 -34
  76. package/templates/apps/mcp/src/lib/paid-tools.generated.ts +10 -0
  77. package/templates/apps/mcp/src/lib/topology.generated.ts +2 -2
  78. package/templates/apps/mcp/src/site.ts +12 -0
  79. package/templates/apps/web/.env.example +1 -1
  80. package/templates/apps/web/CLAUDE.md +31 -3
  81. package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
  82. package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +43 -4
  83. package/templates/apps/web/app/[locale]/(auth)/legal-footnote.tsx +35 -0
  84. package/templates/apps/web/app/[locale]/(auth)/sign-in/__tests__/page.test.tsx +117 -8
  85. package/templates/apps/web/app/[locale]/(auth)/sign-in/page.tsx +14 -37
  86. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +6 -6
  87. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-text.ts +20 -35
  88. package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/page.test.tsx +108 -0
  89. package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/sign-up-card.test.tsx +111 -5
  90. package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +78 -16
  91. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +132 -12
  92. package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +53 -1
  93. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/billing.test.tsx +38 -0
  94. package/templates/apps/web/app/[locale]/(authed)/account/billing/page.tsx +4 -2
  95. package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +47 -24
  96. package/templates/apps/web/app/[locale]/(authed)/signed-out-gate.generated.tsx +23 -4
  97. package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
  98. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +22 -1
  99. package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +7 -3
  100. package/templates/apps/web/app/[locale]/layout.tsx +33 -13
  101. package/templates/apps/web/app/[locale]/meet/confirmed/BookingHandOff.tsx +128 -0
  102. package/templates/apps/web/app/[locale]/meet/confirmed/__tests__/BookingHandOff.test.tsx +126 -0
  103. package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +43 -0
  104. package/templates/apps/web/app/[locale]/pricing/page.tsx +7 -3
  105. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/__tests__/route.test.ts +222 -0
  106. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +10 -3
  107. package/templates/apps/web/app/api/revalidate/route.ts +3 -3
  108. package/templates/apps/web/auth.ts +10 -6
  109. package/templates/apps/web/i18n/request.ts +49 -1
  110. package/templates/apps/web/jest.config.cjs +1 -0
  111. package/templates/apps/web/lib/__tests__/account-config.test.ts +7 -0
  112. package/templates/apps/web/lib/__tests__/auth-email.test.ts +276 -0
  113. package/templates/apps/web/lib/auth-email.ts +103 -21
  114. package/templates/apps/web/lib/hub-session/__tests__/sign-in-gate.test.tsx +72 -23
  115. package/templates/apps/web/lib/hub-session/sign-in-gate.tsx +94 -70
  116. package/templates/apps/web/lib/prisma-for-auth.ts +5 -2
  117. package/templates/apps/web/lib/relay.ts +2 -2
  118. package/templates/apps/web/lib/release-scope.ts +47 -0
  119. package/templates/apps/web/lib/server-api.ts +1 -1
  120. package/templates/apps/web/lib/sign-up-agreements.ts +291 -28
  121. package/templates/apps/web/lib/site-contributions.ts +18 -0
  122. package/templates/apps/web/messages/en.json +186 -20
  123. package/templates/apps/web/messages/site/en.json +1 -0
  124. package/templates/apps/web/src/lib/commerce-claim.ts +1 -1
  125. package/templates/customizations.yaml +37 -0
  126. package/templates/database/prisma.config.ts +10 -14
  127. package/templates/database/seed-test.ts +2 -2
  128. package/templates/database/seed.ts +5 -5
  129. package/templates/package.json +12 -6
  130. package/templates/pnpm-workspace.yaml +0 -1
  131. package/templates/project.yaml +16 -8
  132. package/templates/tools/jest/reporters.cjs +65 -0
  133. package/templates/tools/lint-architecture.ts +553 -7
  134. package/templates/tsconfig.json +1 -2
  135. package/versions.json +49 -36
  136. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +0 -409
  137. package/templates/apps/api/src/__tests__/factories/agent-caller.ts +0 -102
  138. package/templates/apps/api/src/__tests__/factories/content-fixture.ts +0 -138
  139. package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +0 -441
  140. package/templates/apps/api/src/__tests__/factories/index.ts +0 -70
  141. package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +0 -82
  142. package/templates/apps/api/src/__tests__/leads-forwarded-rate-limit.test.ts +0 -135
  143. package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +0 -126
  144. package/templates/apps/api/src/__tests__/stripe-boot.test.ts +0 -132
  145. package/templates/apps/api/src/__tests__/support/hub-sign-in-fake-db.ts +0 -362
  146. package/templates/apps/api/src/bin/__tests__/rate-limit-probe.test.ts +0 -184
  147. package/templates/apps/api/src/bin/abandon-sweep.ts +0 -42
  148. package/templates/apps/api/src/bin/rate-limit-probe.ts +0 -53
  149. package/templates/apps/api/src/bin/spokes.ts +0 -198
  150. package/templates/apps/api/src/bin/stripe-connections-rekey.ts +0 -45
  151. package/templates/apps/api/src/config/__tests__/hub-require-spoke-key.test.ts +0 -196
  152. package/templates/apps/api/src/config/__tests__/index.test.ts +0 -233
  153. package/templates/apps/api/src/config/__tests__/modules.test.ts +0 -76
  154. package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +0 -185
  155. package/templates/apps/api/src/config/__tests__/trusted-origins.test.ts +0 -238
  156. package/templates/apps/api/src/config/index.ts +0 -596
  157. package/templates/apps/api/src/config/modules.ts +0 -83
  158. package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +0 -581
  159. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +0 -143
  160. package/templates/apps/api/src/lib/__tests__/consent-ledger-double.ts +0 -237
  161. package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +0 -353
  162. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +0 -201
  163. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +0 -224
  164. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +0 -120
  165. package/templates/apps/api/src/lib/__tests__/errors.test.ts +0 -94
  166. package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +0 -144
  167. package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +0 -8
  168. package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +0 -149
  169. package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +0 -116
  170. package/templates/apps/api/src/lib/__tests__/hub-sign-in-store.test.ts +0 -209
  171. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +0 -257
  172. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +0 -96
  173. package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +0 -125
  174. package/templates/apps/api/src/lib/__tests__/prisma.test.ts +0 -165
  175. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +0 -317
  176. package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +0 -129
  177. package/templates/apps/api/src/lib/__tests__/site.test.ts +0 -308
  178. package/templates/apps/api/src/lib/__tests__/slice-load.test.ts +0 -89
  179. package/templates/apps/api/src/lib/__tests__/spoke-store.test.ts +0 -202
  180. package/templates/apps/api/src/lib/__tests__/stripe-admission.test.ts +0 -217
  181. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +0 -82
  182. package/templates/apps/api/src/lib/agent-store.ts +0 -613
  183. package/templates/apps/api/src/lib/auth-email-budget.ts +0 -161
  184. package/templates/apps/api/src/lib/consent-store.ts +0 -363
  185. package/templates/apps/api/src/lib/content-adapter.ts +0 -112
  186. package/templates/apps/api/src/lib/deliverable-asset-store.ts +0 -96
  187. package/templates/apps/api/src/lib/error-serializer.ts +0 -164
  188. package/templates/apps/api/src/lib/errors.ts +0 -95
  189. package/templates/apps/api/src/lib/file-fallback.ts +0 -87
  190. package/templates/apps/api/src/lib/flow-completion-store.ts +0 -136
  191. package/templates/apps/api/src/lib/hub-sign-in-store.ts +0 -455
  192. package/templates/apps/api/src/lib/lead-capture-store.ts +0 -122
  193. package/templates/apps/api/src/lib/lead-delivery.ts +0 -52
  194. package/templates/apps/api/src/lib/license-key-store.ts +0 -45
  195. package/templates/apps/api/src/lib/locales.ts +0 -201
  196. package/templates/apps/api/src/lib/outbound-http.ts +0 -127
  197. package/templates/apps/api/src/lib/prisma.ts +0 -21
  198. package/templates/apps/api/src/lib/proposal-paid-store.ts +0 -66
  199. package/templates/apps/api/src/lib/rate-limit-probe.ts +0 -165
  200. package/templates/apps/api/src/lib/rate-limit-store.ts +0 -142
  201. package/templates/apps/api/src/lib/require-commerce-claim.ts +0 -250
  202. package/templates/apps/api/src/lib/require-paid-tier.ts +0 -53
  203. package/templates/apps/api/src/lib/site.ts +0 -257
  204. package/templates/apps/api/src/lib/slice-load.ts +0 -90
  205. package/templates/apps/api/src/lib/spoke-store.ts +0 -180
  206. package/templates/apps/api/src/lib/stripe.ts +0 -321
  207. package/templates/apps/api/src/lib/webhook-idempotency.ts +0 -156
  208. package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +0 -111
  209. package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +0 -172
  210. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +0 -119
  211. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +0 -138
  212. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-trusted-origins.test.ts +0 -142
  213. package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +0 -155
  214. package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +0 -139
  215. package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +0 -562
  216. package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +0 -76
  217. package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +0 -220
  218. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +0 -97
  219. package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +0 -557
  220. package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +0 -72
  221. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +0 -140
  222. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +0 -721
  223. package/templates/apps/api/src/middleware/__tests__/rate-limit-cross-isolate.db.test.ts +0 -220
  224. package/templates/apps/api/src/middleware/__tests__/rate-limit-store.test.ts +0 -430
  225. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +0 -1409
  226. package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +0 -174
  227. package/templates/apps/api/src/middleware/auth.ts +0 -864
  228. package/templates/apps/api/src/middleware/default-tenant.ts +0 -166
  229. package/templates/apps/api/src/middleware/rate-limit.ts +0 -983
  230. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +0 -391
  231. package/templates/apps/api/src/openapi/__tests__/spec-identity.test.ts +0 -182
  232. package/templates/apps/api/src/openapi/index.ts +0 -18
  233. package/templates/apps/api/src/openapi/spec.ts +0 -2148
  234. package/templates/apps/api/src/openapi/surface-drift.ts +0 -195
  235. package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +0 -175
  236. package/templates/apps/api/src/routes/aeo/index.ts +0 -107
  237. package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +0 -196
  238. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +0 -249
  239. package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +0 -532
  240. package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +0 -313
  241. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +0 -413
  242. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +0 -609
  243. package/templates/apps/api/src/routes/auth/hub-sign-in.ts +0 -242
  244. package/templates/apps/api/src/routes/auth/tokens.ts +0 -211
  245. package/templates/apps/api/src/routes/auth/transactional-email.ts +0 -301
  246. package/templates/apps/api/src/routes/auth/user.ts +0 -305
  247. package/templates/apps/api/src/routes/billing/plan-checkout.ts +0 -332
  248. package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +0 -178
  249. package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +0 -1426
  250. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +0 -448
  251. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +0 -1742
  252. package/templates/apps/api/src/routes/checkout/index.ts +0 -34
  253. package/templates/apps/api/src/routes/checkout/session.ts +0 -171
  254. package/templates/apps/api/src/routes/checkout/sessions.ts +0 -540
  255. package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +0 -386
  256. package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +0 -160
  257. package/templates/apps/api/src/routes/consent/account.ts +0 -268
  258. package/templates/apps/api/src/routes/consent/cookie.ts +0 -90
  259. package/templates/apps/api/src/routes/consent/index.ts +0 -26
  260. package/templates/apps/api/src/routes/consent/unsubscribe.ts +0 -127
  261. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +0 -853
  262. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +0 -230
  263. package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +0 -44
  264. package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +0 -118
  265. package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +0 -731
  266. package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +0 -753
  267. package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +0 -51
  268. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +0 -450
  269. package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +0 -762
  270. package/templates/apps/api/src/routes/content/get-page.ts +0 -183
  271. package/templates/apps/api/src/routes/content/index.ts +0 -49
  272. package/templates/apps/api/src/routes/content/list-pages.ts +0 -74
  273. package/templates/apps/api/src/routes/content/list-types.ts +0 -19
  274. package/templates/apps/api/src/routes/content/offerings.ts +0 -184
  275. package/templates/apps/api/src/routes/content/pricing.ts +0 -176
  276. package/templates/apps/api/src/routes/content/rate-limit.ts +0 -22
  277. package/templates/apps/api/src/routes/content/search.ts +0 -100
  278. package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
  279. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +0 -88
  280. package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +0 -171
  281. package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +0 -515
  282. package/templates/apps/api/src/routes/leads/__tests__/spoke.test.ts +0 -392
  283. package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +0 -165
  284. package/templates/apps/api/src/routes/leads/index.ts +0 -639
  285. package/templates/apps/api/src/routes/leads/list.ts +0 -104
  286. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +0 -626
  287. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +0 -1268
  288. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +0 -847
  289. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +0 -491
  290. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -476
  291. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +0 -872
  292. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +0 -1022
  293. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +0 -484
  294. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +0 -535
  295. package/templates/apps/api/src/routes/project-listings/index.ts +0 -164
  296. package/templates/apps/api/src/routes/project-listings/me.ts +0 -87
  297. package/templates/apps/api/src/routes/project-listings/patch-copy.ts +0 -224
  298. package/templates/apps/api/src/routes/project-listings/patch-draft.ts +0 -102
  299. package/templates/apps/api/src/routes/project-listings/public.ts +0 -98
  300. package/templates/apps/api/src/routes/project-listings/respond.ts +0 -48
  301. package/templates/apps/api/src/routes/project-listings/resume-token.ts +0 -27
  302. package/templates/apps/api/src/routes/project-listings/start.ts +0 -140
  303. package/templates/apps/api/src/routes/project-listings/submit.ts +0 -130
  304. package/templates/apps/api/src/routes/project-listings/verify-email.ts +0 -150
  305. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +0 -686
  306. package/templates/apps/api/src/routes/requests/confirm.ts +0 -601
  307. package/templates/apps/api/src/routes/requests/index.ts +0 -54
  308. package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +0 -306
  309. package/templates/apps/api/src/routes/test/auth/session.ts +0 -143
  310. package/templates/apps/api/src/routes/webhooks/README.md +0 -398
  311. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +0 -649
  312. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +0 -749
  313. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +0 -449
  314. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +0 -264
  315. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode-live.test.ts +0 -159
  316. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode.test.ts +0 -158
  317. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +0 -814
  318. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +0 -301
  319. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-proposal-paid.test.ts +0 -369
  320. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +0 -215
  321. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +0 -301
  322. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +0 -809
  323. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +0 -1155
  324. package/templates/apps/api/src/routes/webhooks/index.ts +0 -141
  325. package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +0 -384
  326. package/templates/apps/api/src/routes/webhooks/stripe.ts +0 -2028
  327. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -645
  328. package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +0 -132
  329. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +0 -1028
  330. package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +0 -313
  331. package/templates/apps/api/src/services/__tests__/consent-ledger.test.ts +0 -503
  332. package/templates/apps/api/src/services/__tests__/consent-migration.test.ts +0 -65
  333. package/templates/apps/api/src/services/__tests__/consent.test.ts +0 -299
  334. package/templates/apps/api/src/services/__tests__/default-tenant.test.ts +0 -147
  335. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +0 -877
  336. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +0 -379
  337. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +0 -368
  338. package/templates/apps/api/src/services/__tests__/entitlements.test.ts +0 -142
  339. package/templates/apps/api/src/services/__tests__/hub-sign-in.test.ts +0 -854
  340. package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +0 -234
  341. package/templates/apps/api/src/services/__tests__/lead-accept-user.test.ts +0 -251
  342. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +0 -2660
  343. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +0 -166
  344. package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +0 -389
  345. package/templates/apps/api/src/services/__tests__/person.test.ts +0 -1204
  346. package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -450
  347. package/templates/apps/api/src/services/__tests__/project-listings.counts.test.ts +0 -202
  348. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -151
  349. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +0 -137
  350. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +0 -531
  351. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +0 -372
  352. package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +0 -348
  353. package/templates/apps/api/src/services/__tests__/spoke-resolution.test.ts +0 -660
  354. package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +0 -941
  355. package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +0 -588
  356. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +0 -78
  357. package/templates/apps/api/src/services/abandon-email.ts +0 -336
  358. package/templates/apps/api/src/services/aeo-score.ts +0 -325
  359. package/templates/apps/api/src/services/answer-distributions.ts +0 -138
  360. package/templates/apps/api/src/services/audit-log.ts +0 -961
  361. package/templates/apps/api/src/services/checkout-buyer.ts +0 -168
  362. package/templates/apps/api/src/services/consent.ts +0 -834
  363. package/templates/apps/api/src/services/default-tenant.ts +0 -416
  364. package/templates/apps/api/src/services/deliverable-fulfillment.ts +0 -750
  365. package/templates/apps/api/src/services/dunning-policy.ts +0 -294
  366. package/templates/apps/api/src/services/enrichment-shim.ts +0 -53
  367. package/templates/apps/api/src/services/entitlements.ts +0 -338
  368. package/templates/apps/api/src/services/hub-sign-in.ts +0 -472
  369. package/templates/apps/api/src/services/lead-accept-user.ts +0 -126
  370. package/templates/apps/api/src/services/lead-promotion.ts +0 -160
  371. package/templates/apps/api/src/services/lead-routing.ts +0 -1372
  372. package/templates/apps/api/src/services/leads-inbox.ts +0 -312
  373. package/templates/apps/api/src/services/listing-config.ts +0 -178
  374. package/templates/apps/api/src/services/magnet-completion.ts +0 -242
  375. package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +0 -348
  376. package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +0 -268
  377. package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +0 -975
  378. package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +0 -416
  379. package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +0 -400
  380. package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -685
  381. package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
  382. package/templates/apps/api/src/services/offerings/catalog.ts +0 -318
  383. package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -403
  384. package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
  385. package/templates/apps/api/src/services/offerings/connection.ts +0 -1083
  386. package/templates/apps/api/src/services/offerings/index.ts +0 -614
  387. package/templates/apps/api/src/services/offerings/source.ts +0 -140
  388. package/templates/apps/api/src/services/offerings/store.ts +0 -150
  389. package/templates/apps/api/src/services/owner-workspaces.ts +0 -132
  390. package/templates/apps/api/src/services/person.ts +0 -1211
  391. package/templates/apps/api/src/services/plan-offerings.ts +0 -125
  392. package/templates/apps/api/src/services/project-listing-resume-email.ts +0 -326
  393. package/templates/apps/api/src/services/project-listings.ts +0 -2085
  394. package/templates/apps/api/src/services/public-site-resolver.ts +0 -396
  395. package/templates/apps/api/src/services/request-confirm.ts +0 -698
  396. package/templates/apps/api/src/services/revalidation.ts +0 -235
  397. package/templates/apps/api/src/services/slack-notify.ts +0 -291
  398. package/templates/apps/api/src/services/usage-aggregation.ts +0 -516
  399. package/templates/apps/api/src/services/usage-credits.ts +0 -340
  400. package/templates/apps/api/src/services/verified-email.ts +0 -71
  401. package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +0 -52
  402. package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +0 -46
  403. package/templates/apps/mcp/__tests__/abuse/guard.test.ts +0 -198
  404. package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +0 -36
  405. package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +0 -54
  406. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +0 -116
  407. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +0 -299
  408. package/templates/apps/mcp/__tests__/boot.test.ts +0 -280
  409. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +0 -359
  410. package/templates/apps/mcp/__tests__/config/modules.test.ts +0 -78
  411. package/templates/apps/mcp/__tests__/get_business_hours.test.ts +0 -82
  412. package/templates/apps/mcp/__tests__/get_faq.test.ts +0 -80
  413. package/templates/apps/mcp/__tests__/get_locations.test.ts +0 -65
  414. package/templates/apps/mcp/__tests__/get_offerings.test.ts +0 -557
  415. package/templates/apps/mcp/__tests__/get_pricing.test.ts +0 -524
  416. package/templates/apps/mcp/__tests__/get_site_info.test.ts +0 -81
  417. package/templates/apps/mcp/__tests__/http-transport.test.ts +0 -1232
  418. package/templates/apps/mcp/__tests__/index.test.ts +0 -195
  419. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +0 -191
  420. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +0 -531
  421. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +0 -70
  422. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -162
  423. package/templates/apps/mcp/__tests__/lib/content-root.test.ts +0 -93
  424. package/templates/apps/mcp/__tests__/lib/errors.test.ts +0 -75
  425. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +0 -180
  426. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
  427. package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -268
  428. package/templates/apps/mcp/__tests__/locale.test.ts +0 -120
  429. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +0 -175
  430. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +0 -101
  431. package/templates/apps/mcp/__tests__/rate-limit-write.test.ts +0 -189
  432. package/templates/apps/mcp/__tests__/read_content.test.ts +0 -511
  433. package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -160
  434. package/templates/apps/mcp/__tests__/search_content.test.ts +0 -271
  435. package/templates/apps/mcp/__tests__/server.test.ts +0 -388
  436. package/templates/apps/mcp/__tests__/start_purchase.test.ts +0 -448
  437. package/templates/apps/mcp/__tests__/submit_lead.test.ts +0 -222
  438. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -152
  439. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +0 -243
  440. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +0 -451
  441. package/templates/apps/mcp/src/abuse/daily-cap.ts +0 -47
  442. package/templates/apps/mcp/src/abuse/email-validator.ts +0 -25
  443. package/templates/apps/mcp/src/abuse/honeypot.ts +0 -21
  444. package/templates/apps/mcp/src/abuse/index.ts +0 -349
  445. package/templates/apps/mcp/src/abuse/user-agent-deny.ts +0 -58
  446. package/templates/apps/mcp/src/boot.ts +0 -167
  447. package/templates/apps/mcp/src/config/modules.ts +0 -43
  448. package/templates/apps/mcp/src/http-transport.ts +0 -564
  449. package/templates/apps/mcp/src/lib/audit-single-page.ts +0 -308
  450. package/templates/apps/mcp/src/lib/commerce-claim.ts +0 -263
  451. package/templates/apps/mcp/src/lib/content-adapter.ts +0 -116
  452. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -140
  453. package/templates/apps/mcp/src/lib/errors.ts +0 -61
  454. package/templates/apps/mcp/src/lib/license-key-store.ts +0 -45
  455. package/templates/apps/mcp/src/lib/locales.ts +0 -171
  456. package/templates/apps/mcp/src/lib/prisma.ts +0 -39
  457. package/templates/apps/mcp/src/lib/public-workspace.ts +0 -133
  458. package/templates/apps/mcp/src/lib/resolve-locale.ts +0 -30
  459. package/templates/apps/mcp/src/lib/shown-offerings.ts +0 -105
  460. package/templates/apps/mcp/src/lib/site-config.ts +0 -53
  461. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +0 -59
  462. package/templates/apps/mcp/src/request-context.ts +0 -52
  463. package/templates/apps/mcp/src/server.ts +0 -343
  464. package/templates/apps/mcp/src/serverless-app.ts +0 -88
  465. package/templates/apps/mcp/src/tools/audit.ts +0 -127
  466. package/templates/apps/mcp/src/tools/capture_lead.ts +0 -66
  467. package/templates/apps/mcp/src/tools/create_project.ts +0 -134
  468. package/templates/apps/mcp/src/tools/get_business_hours.ts +0 -68
  469. package/templates/apps/mcp/src/tools/get_faq.ts +0 -71
  470. package/templates/apps/mcp/src/tools/get_locations.ts +0 -88
  471. package/templates/apps/mcp/src/tools/get_offerings.ts +0 -96
  472. package/templates/apps/mcp/src/tools/get_pricing.ts +0 -94
  473. package/templates/apps/mcp/src/tools/get_site_info.ts +0 -86
  474. package/templates/apps/mcp/src/tools/index.ts +0 -138
  475. package/templates/apps/mcp/src/tools/list_pages.ts +0 -68
  476. package/templates/apps/mcp/src/tools/person_notes.ts +0 -25
  477. package/templates/apps/mcp/src/tools/proposals.ts +0 -27
  478. package/templates/apps/mcp/src/tools/purchase.ts +0 -205
  479. package/templates/apps/mcp/src/tools/read_content.ts +0 -81
  480. package/templates/apps/mcp/src/tools/request_callback.ts +0 -52
  481. package/templates/apps/mcp/src/tools/search_content.ts +0 -63
  482. package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -54
  483. package/templates/apps/mcp/src/workspace-server.ts +0 -224
  484. package/templates/database/CHANGELOG.md +0 -981
  485. package/templates/database/LICENSE +0 -202
  486. package/templates/database/NOTICE +0 -2
  487. package/templates/database/README.md +0 -243
  488. package/templates/database/__tests__/agents.db.test.ts +0 -320
  489. package/templates/database/__tests__/appointment.db.test.ts +0 -106
  490. package/templates/database/__tests__/artifact-content-store.db.test.ts +0 -316
  491. package/templates/database/__tests__/composite-fence.db.test.ts +0 -206
  492. package/templates/database/__tests__/consent-ledger.db.test.ts +0 -345
  493. package/templates/database/__tests__/consent-source-checkout-migration.test.ts +0 -79
  494. package/templates/database/__tests__/fence-fan-out.db.test.ts +0 -715
  495. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +0 -79
  496. package/templates/database/__tests__/fixtures/person-backfill.json +0 -264
  497. package/templates/database/__tests__/fixtures/person-contact-backfill.json +0 -182
  498. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +0 -100
  499. package/templates/database/__tests__/flow-completion-migration.test.ts +0 -115
  500. package/templates/database/__tests__/flow-completion.db.test.ts +0 -136
  501. package/templates/database/__tests__/flow-workspace-key.db.test.ts +0 -263
  502. package/templates/database/__tests__/flows-listing-diagnostic.test.ts +0 -392
  503. package/templates/database/__tests__/flows-presets.test.ts +0 -173
  504. package/templates/database/__tests__/in-page-magnets-migration.test.ts +0 -161
  505. package/templates/database/__tests__/lead-idempotency-key.db.test.ts +0 -92
  506. package/templates/database/__tests__/member-area.db.test.ts +0 -257
  507. package/templates/database/__tests__/member-contract-migration.test.ts +0 -85
  508. package/templates/database/__tests__/member-contract.db.test.ts +0 -413
  509. package/templates/database/__tests__/offerings-checkout-session.db.test.ts +0 -270
  510. package/templates/database/__tests__/offerings-migration.test.ts +0 -197
  511. package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +0 -86
  512. package/templates/database/__tests__/offerings.db.test.ts +0 -303
  513. package/templates/database/__tests__/outbound-message-action.db.test.ts +0 -80
  514. package/templates/database/__tests__/person-contact.db.test.ts +0 -563
  515. package/templates/database/__tests__/person-notes.db.test.ts +0 -249
  516. package/templates/database/__tests__/person.db.test.ts +0 -586
  517. package/templates/database/__tests__/piece-kind-migration.test.ts +0 -67
  518. package/templates/database/__tests__/piece-kind.db.test.ts +0 -208
  519. package/templates/database/__tests__/prefixed-ids.db.test.ts +0 -222
  520. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +0 -111
  521. package/templates/database/__tests__/seed.test.ts +0 -272
  522. package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
  523. package/templates/database/__tests__/tenancy.test.ts +0 -141
  524. package/templates/database/__tests__/trial-magnet-migration.test.ts +0 -186
  525. package/templates/database/__tests__/user-cascade.test.ts +0 -140
  526. package/templates/database/_gitignore +0 -8
  527. package/templates/database/auth/.gitkeep +0 -0
  528. package/templates/database/auth/schema.prisma +0 -641
  529. package/templates/database/config/.gitkeep +0 -0
  530. package/templates/database/config/schema.prisma +0 -441
  531. package/templates/database/content/.gitkeep +0 -0
  532. package/templates/database/content/schema.prisma +0 -339
  533. package/templates/database/eslint.config.mjs +0 -69
  534. package/templates/database/flows/listing-diagnostic.ts +0 -182
  535. package/templates/database/flows/presets.ts +0 -315
  536. package/templates/database/inbox/.gitkeep +0 -0
  537. package/templates/database/inbox/README.md +0 -3
  538. package/templates/database/inbox/__tests__/schema.test.ts +0 -44
  539. package/templates/database/inbox/schema.prisma +0 -1447
  540. package/templates/database/jest.config.cjs +0 -36
  541. package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +0 -328
  542. package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +0 -100
  543. package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +0 -28
  544. package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +0 -25
  545. package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +0 -42
  546. package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +0 -67
  547. package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +0 -21
  548. package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +0 -201
  549. package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +0 -67
  550. package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +0 -46
  551. package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +0 -25
  552. package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +0 -49
  553. package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +0 -197
  554. package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +0 -32
  555. package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +0 -22
  556. package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +0 -151
  557. package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +0 -223
  558. package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +0 -22
  559. package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +0 -32
  560. package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +0 -40
  561. package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +0 -4
  562. package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +0 -2
  563. package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +0 -2
  564. package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +0 -29
  565. package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +0 -6
  566. package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +0 -39
  567. package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +0 -24
  568. package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +0 -3
  569. package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +0 -33
  570. package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +0 -30
  571. package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +0 -47
  572. package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +0 -16
  573. package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +0 -47
  574. package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +0 -10
  575. package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +0 -26
  576. package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +0 -90
  577. package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +0 -174
  578. package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +0 -14
  579. package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +0 -25
  580. package/templates/database/migrations/20260911140000_listing_structured_address/migration.sql +0 -32
  581. package/templates/database/migrations/20260911180000_consent_grants/migration.sql +0 -71
  582. package/templates/database/migrations/20260911200000_listing_site_answers/migration.sql +0 -30
  583. package/templates/database/migrations/20260912120000_listing_owner_link/migration.sql +0 -49
  584. package/templates/database/migrations/20260914120000_listing_founder_identity/migration.sql +0 -123
  585. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +0 -15
  586. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +0 -158
  587. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +0 -40
  588. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +0 -67
  589. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +0 -70
  590. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +0 -181
  591. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +0 -172
  592. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +0 -41
  593. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +0 -185
  594. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +0 -70
  595. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +0 -57
  596. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +0 -68
  597. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +0 -1067
  598. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +0 -210
  599. package/templates/database/migrations/20261003120000_spoke_registry/migration.sql +0 -80
  600. package/templates/database/migrations/20261003130000_scheduling_connection/migration.sql +0 -49
  601. package/templates/database/migrations/20261005120000_agents/migration.sql +0 -84
  602. package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +0 -35
  603. package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +0 -20
  604. package/templates/database/migrations/20261009120000_agent_grants/migration.sql +0 -33
  605. package/templates/database/migrations/20261010120000_person/migration.sql +0 -106
  606. package/templates/database/migrations/20261010121000_person_backfill/migration.sql +0 -132
  607. package/templates/database/migrations/20261010130000_agent_grants_people_read/migration.sql +0 -20
  608. package/templates/database/migrations/20261011120000_member_area/migration.sql +0 -158
  609. package/templates/database/migrations/20261011130000_agent_grants_member_pieces_manage/migration.sql +0 -21
  610. package/templates/database/migrations/20261012120000_member_contract/migration.sql +0 -192
  611. package/templates/database/migrations/20261013120000_lead_spoke_checkout/migration.sql +0 -20
  612. package/templates/database/migrations/20261014120000_consent_ledger/migration.sql +0 -122
  613. package/templates/database/migrations/20261014120000_person_contact/migration.sql +0 -231
  614. package/templates/database/migrations/20261015120000_person_notes/migration.sql +0 -77
  615. package/templates/database/migrations/20261015120000_rate_limit_counters/migration.sql +0 -43
  616. package/templates/database/migrations/20261016120000_piece_kind/migration.sql +0 -95
  617. package/templates/database/migrations/20261017120000_outbound_message_action/migration.sql +0 -30
  618. package/templates/database/migrations/20261018120000_flow_completion/migration.sql +0 -52
  619. package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +0 -27
  620. package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +0 -146
  621. package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +0 -77
  622. package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +0 -45
  623. package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +0 -47
  624. package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +0 -16
  625. package/templates/database/migrations/20261025120000_trial_magnet/migration.sql +0 -28
  626. package/templates/database/migrations/20261026120000_trial_magnet_proof_line/migration.sql +0 -23
  627. package/templates/database/migrations/migration_lock.toml +0 -3
  628. package/templates/database/ops/.gitkeep +0 -0
  629. package/templates/database/ops/schema.prisma +0 -43
  630. package/templates/database/package.json +0 -89
  631. package/templates/database/schema.prisma +0 -71
  632. package/templates/database/scripts/db-generate-locked.sh +0 -80
  633. package/templates/database/scripts/person-backfill.sql +0 -132
  634. package/templates/database/tenancy.ts +0 -183
  635. package/templates/database/tsconfig.build.json +0 -16
  636. package/templates/database/tsconfig.flows.json +0 -15
  637. package/templates/database/tsconfig.json +0 -16
  638. package/templates/database/tsconfig.tenancy.json +0 -14
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-ailk",
3
- "version": "0.24.0",
3
+ "version": "0.26.0",
4
4
  "description": "Scaffolder for AI Launch Kit — `pnpm create ailk@latest <dir>` produces a starter repo consuming @working-theory/* from npm (per ADR 0007).",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -28,8 +28,8 @@
28
28
  "tar": "^7.5.21"
29
29
  },
30
30
  "devDependencies": {
31
- "@working-theory/schema": "0.45.0",
32
- "@working-theory/templates": "0.45.0"
31
+ "@working-theory/schema": "0.48.0",
32
+ "@working-theory/templates": "0.48.0"
33
33
  },
34
34
  "repository": {
35
35
  "type": "git",
@@ -17,9 +17,9 @@
17
17
  "docs-blog": "released",
18
18
  "scheduling": "released",
19
19
  "signal-collectors": "released",
20
- "workspace": "gated",
20
+ "workspace": "released",
21
21
  "multi-tenant": "gated",
22
22
  "commerce": "gated"
23
23
  },
24
- "levels": { "free": "released", "pro": "released", "pro-plus": "gated" }
24
+ "levels": { "free": "deferred", "pro": "released", "pro-plus": "gated" }
25
25
  }
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "template": "marketing-site",
3
- "requires": ["marketing", "docs-blog", "scheduling", "signal-collectors"],
3
+ "requires": [
4
+ "marketing",
5
+ "docs-blog",
6
+ "scheduling",
7
+ "signal-collectors",
8
+ "workspace"
9
+ ],
4
10
  "categories": [
5
11
  "accounting",
6
12
  "legal",
@@ -17,7 +23,7 @@
17
23
  ],
18
24
  "shape": "organization-product",
19
25
  "design": "standard",
20
- "generatedHash": "f4a8f11aba42a071794585c4563015bd1c99cbe6917a36ee0629d37c6f5f476c",
26
+ "generatedHash": "d58492d416674a21b1358858d285b7050d14618f5e2bed2f0ae20bdbc5267d5a",
21
27
  "layout": {
22
28
  "nav": "full",
23
29
  "footer": "columns",
@@ -6,7 +6,7 @@
6
6
  | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
7
7
  | Template | `marketing-site` |
8
8
  | Level | Pro |
9
- | `requires` | `[marketing, docs-blog, scheduling, signal-collectors]` (spec 5462 D12/D15, settled by Sam 2026-09-14) |
9
+ | `requires` | `[marketing, docs-blog, scheduling, signal-collectors, workspace]` (spec 5462 D12/D15, settled by Sam 2026-09-14; `workspace` since #9696) |
10
10
  | Delivery | licence-checked module bundle (#5441); never in the Free tarball. Composed base → modules → template (#5618): `/pricing`, `/privacy`, `/terms` arrive from the `_base` layer it `extends`, every module sample from the docs-blog and signal-collectors bundles its `requires` names, and this tree ships one copy override (blog post 05 onto `launching-ailk.mdx`) |
11
11
  | Sample content posture | every sample report, post and flow in the demo is **public** |
12
12
 
@@ -513,7 +513,7 @@ Everything in the Free manifest § 2a applies. Pro adds:
513
513
 
514
514
  ```
515
515
  marketing-site:
516
- requires: [marketing, docs-blog, scheduling, signal-collectors]
516
+ requires: [marketing, docs-blog, scheduling, signal-collectors, workspace]
517
517
  categories: [accounting, legal, consulting, hvac, roofing, plumbing, electrical, landscaping, auto-repair, real-estate, technology, medical-specialty]
518
518
  shape: organization-product
519
519
  design: standard
@@ -1,6 +1,12 @@
1
1
  {
2
2
  "name": "marketing-site",
3
- "requires": ["marketing", "docs-blog", "scheduling", "signal-collectors"],
3
+ "requires": [
4
+ "marketing",
5
+ "docs-blog",
6
+ "scheduling",
7
+ "signal-collectors",
8
+ "workspace"
9
+ ],
4
10
  "extends": "_base",
5
11
  "$comment": "Pro template (#5464). installMap: bundle-relative source -> scaffold-relative destination; the stager reads only installMap/postInstall/patches. After #5618 D6 this tree holds compositions and copy overrides only: the base pages (/pricing, /privacy, /terms) arrive from the _base layer it extends, and every module sample (the blog listing and posts 01-04, the three docs pages, the projects, thank-you, flow, waitlist and report samples) ships in the docs-blog and signal-collectors bundles its requires names. Its one content file, post 05, is deliberately mapped ONTO apps/web/content/en/blog/launching-ailk.mdx (D6.2a): the template lands last and can overwrite but never remove the module's own seed post, so this is Rule B's copy-override clause with a real instance (a template-owned replacement of a seed row is a docs-blog gap on #5467, spec 5618 s7 finding 9). Unmapped content/en/** would land at the scaffold root's content/, exactly as marketing-site-free's does; today nothing is unmapped.",
6
12
  "installMap": {
@@ -1,4 +1,10 @@
1
1
  {
2
2
  "template": "marketing-site",
3
- "requires": ["marketing", "docs-blog", "scheduling", "signal-collectors"]
3
+ "requires": [
4
+ "marketing",
5
+ "docs-blog",
6
+ "scheduling",
7
+ "signal-collectors",
8
+ "workspace"
9
+ ]
4
10
  }
@@ -5,6 +5,7 @@
5
5
  "docs-blog",
6
6
  "scheduling",
7
7
  "signal-collectors",
8
+ "workspace",
8
9
  "multi-tenant"
9
10
  ],
10
11
  "extends": "_base",
@@ -12,5 +13,5 @@
12
13
  "installMap": {
13
14
  "provenance.json": ".ailk-template.json"
14
15
  },
15
- "postInstall": "Template saas-product installed. Its Pro Plus modules - docs-blog, scheduling, signal-collectors and multi-tenant (the authed apps/admin app) - are delivered by their own module bundles. This template's own page compositions, copy and demo data are pending under #5470; until they land it contributes the provenance record and its requires cross-check only, and the scaffold renders each module's own seed content."
16
+ "postInstall": "Template saas-product installed. Its Pro Plus modules - docs-blog, scheduling, signal-collectors, workspace (the /admin settings pages) and multi-tenant (the authed apps/admin app) - are delivered by their own module bundles. This template's own page compositions, copy and demo data are pending under #5470; until they land it contributes the provenance record and its requires cross-check only, and the scaffold renders each module's own seed content."
16
17
  }
@@ -5,6 +5,7 @@
5
5
  "docs-blog",
6
6
  "scheduling",
7
7
  "signal-collectors",
8
+ "workspace",
8
9
  "multi-tenant"
9
10
  ]
10
11
  }
@@ -1,5 +1,10 @@
1
1
  {
2
2
  "hooks": [
3
+ {
4
+ "event": "PreToolUse",
5
+ "matcher": "Edit|Write",
6
+ "command": "bash .claude/hooks/template-guard.sh"
7
+ },
3
8
  {
4
9
  "event": "PostToolUse",
5
10
  "matcher": "Edit|Write",
@@ -0,0 +1,137 @@
1
+ #!/usr/bin/env bash
2
+ # PreToolUse (Edit|Write): refuse an unrecorded edit to a template-owned file.
3
+ # A code file under apps/ that .ailk-template-files.json records, whose bytes
4
+ # still match the template's sha256, is refused (exit 2) unless an entry in
5
+ # customizations.yaml names it; the refusal on stderr names the file, the
6
+ # entry to add and the upstream route. An edited, unrecorded or manifest-named
7
+ # file passes. A site with no record warns and passes. Pure bash, grep, awk
8
+ # and sha256sum/shasum — nothing a scaffold has to install. Registered in
9
+ # .claude/settings.json and declared in .claude/cloudparity-repo-hooks.json;
10
+ # keep the two in step.
11
+ export LC_ALL=C
12
+ cd "$CLAUDE_PROJECT_DIR" || exit 0
13
+
14
+ IFS= read -r -d '' input
15
+ [[ $input =~ \"file_path\"[[:space:]]*:[[:space:]]*\"([^\"\\]*)\" ]] || exit 0
16
+ rel=${BASH_REMATCH[1]}
17
+ case $rel in
18
+ "$PWD"/*) rel=${rel#"$PWD"/} ;;
19
+ /*) exit 0 ;;
20
+ ./*) rel=${rel#./} ;;
21
+ esac
22
+ # Only a code file under one of the three recordable roots can be template-owned.
23
+ case $rel in
24
+ *.d.ts) exit 0 ;;
25
+ apps/web/*|apps/api/*|apps/mcp/*)
26
+ case $rel in
27
+ *.ts|*.tsx|*.js|*.jsx|*.mts|*.cts|*.mjs|*.cjs) ;;
28
+ *) exit 0 ;;
29
+ esac ;;
30
+ *) exit 0 ;;
31
+ esac
32
+ case "/$rel/" in
33
+ */./*|*/../*|*//*) exit 0 ;;
34
+ esac
35
+
36
+ record=.ailk-template-files.json
37
+ if [ ! -f "$record" ]; then
38
+ printf '%s\n' '{"systemMessage":"template-guard: warning — no .ailk-template-files.json, so template files cannot be told from site files and edits under apps/ are not guarded; run create-ailk update to write it"}'
39
+ exit 0
40
+ fi
41
+ # The record is written by serializeTemplateRecord only: one ` "<path>": {`
42
+ # line per file, its `"sha256"` on the next.
43
+ row=$(grep -F -x -A1 -- " \"$rel\": {" "$record") || exit 0
44
+ [[ $row =~ \"sha256\":[[:space:]]*\"([0-9a-f]{64})\" ]] || exit 0
45
+ template=${BASH_REMATCH[1]}
46
+ [ -f "$rel" ] || exit 0
47
+
48
+ if command -v sha256sum >/dev/null 2>&1; then
49
+ disk=$(sha256sum -- "$rel")
50
+ elif command -v shasum >/dev/null 2>&1; then
51
+ disk=$(shasum -a 256 -- "$rel")
52
+ else
53
+ printf '%s\n' '{"systemMessage":"template-guard: warning — neither sha256sum nor shasum is on PATH, so edits to template files are not guarded"}'
54
+ exit 0
55
+ fi
56
+ # Edited already (update's own rule): the owner's file, a three-way-merge target.
57
+ [ "${disk%% *}" = "$template" ] || exit 0
58
+
59
+ # Named by a customizations.yaml pattern? Read lexically: every quoted scalar
60
+ # and every `- <plain>` item outside a comment that starts `apps/`, matched as
61
+ # a glob where `**` spans segments, `*` stays inside one and all else is literal.
62
+ if [ -f customizations.yaml ] && awk -v rel="$rel" -v sq="'" '
63
+ function matches(pat, n, seg, i, j, c, re, s) {
64
+ if (pat !~ /^apps\//) return 0
65
+ n = split(pat, seg, "/")
66
+ re = "^"
67
+ for (i = 1; i <= n; i++) {
68
+ s = seg[i]
69
+ if (s == "**") { re = re (i == n ? ".*" : "([^/]+/)*"); continue }
70
+ for (j = 1; j <= length(s); j++) {
71
+ c = substr(s, j, 1)
72
+ if (c == "*") re = re "[^/]*"
73
+ else if (c == "]") re = re "[]]"
74
+ else if (c == "^") re = re "\\^"
75
+ else if (c == "\\") re = re "\\\\"
76
+ else if (index(".[()+?{}|$", c)) re = re "[" c "]"
77
+ else re = re c
78
+ }
79
+ if (i < n) re = re "/"
80
+ }
81
+ return rel ~ (re "$")
82
+ }
83
+ /^[ \t]*#/ { next }
84
+ {
85
+ line = $0; n = length(line); quote = ""; cut = n
86
+ for (i = 1; i <= n; i++) {
87
+ c = substr(line, i, 1)
88
+ if (quote != "") { if (c == quote) quote = ""; continue }
89
+ if (c == "\"" || c == sq) { quote = c; continue }
90
+ if (c == "#" && (i == 1 || substr(line, i - 1, 1) ~ /[ \t]/)) { cut = i - 1; break }
91
+ }
92
+ line = substr(line, 1, cut)
93
+ rest = line
94
+ while (match(rest, "\"[^\"]*\"|" sq "[^" sq "]*" sq)) {
95
+ if (matches(substr(rest, RSTART + 1, RLENGTH - 2))) { found = 1; exit }
96
+ rest = substr(rest, RSTART + RLENGTH)
97
+ }
98
+ if (match(line, /^[ \t]*- /)) {
99
+ item = substr(line, RLENGTH + 1)
100
+ sub(/[ \t]+$/, "", item)
101
+ if (matches(item)) { found = 1; exit }
102
+ }
103
+ }
104
+ END { exit !found }
105
+ ' customizations.yaml; then
106
+ exit 0
107
+ fi
108
+
109
+ # The seed id (#9223's rule) and the issue title, percent-encoded byte by byte.
110
+ out=$(awk -v rel="$rel" '
111
+ BEGIN {
112
+ id = tolower(rel); gsub(/[^a-z0-9]+/, "-", id); sub(/^-/, "", id); sub(/-$/, "", id)
113
+ for (i = 1; i < 256; i++) ord[sprintf("%c", i)] = i
114
+ s = "Template change: " rel
115
+ for (i = 1; i <= length(s); i++) {
116
+ c = substr(s, i, 1)
117
+ title = title (c ~ /[A-Za-z0-9._~-]/ ? c : sprintf("%%%02X", ord[c]))
118
+ }
119
+ print id; print title
120
+ }')
121
+ id=${out%%$'\n'*}
122
+ title=${out#*$'\n'}
123
+
124
+ printf '%s\n' >&2 \
125
+ "template-guard: $rel is a template file, unchanged since create-ailk wrote it, and no customizations.yaml entry names it." \
126
+ "A template file takes its fixes from create-ailk update; change it here only once the change is recorded." \
127
+ "Fix, one of:" \
128
+ " 1. Record it: add this entry under customizations: in customizations.yaml, fill in request and decision, then retry." \
129
+ " - id: $id" \
130
+ " paths:" \
131
+ " - \"$rel\"" \
132
+ " request: \"<owner>/<repo>#<issue>\"" \
133
+ " decision: \"build-in: site — <decider>, <YYYY-MM-DD>, <reason>\"" \
134
+ " decision is one of: build-in: ailk#<N> | build-in: site — <decider>, <YYYY-MM-DD>, <reason> | undecided (only while undecided_ok_until is in the future)." \
135
+ " 2. File it upstream, so AILK builds it in and this site takes it as a version bump:" \
136
+ " https://github.com/working-theory-labs/ai-launch-kit/issues/new?title=$title"
137
+ exit 2
@@ -0,0 +1,106 @@
1
+ # Extending the Site
2
+
3
+ ## The five extension points
4
+
5
+ This site stays upgradeable because it changes in five sanctioned ways,
6
+ and only five. From the program decision, with the manifest named:
7
+
8
+ > site config and content; the design package and theme; a section swap through the sections registry; wrapping a published component from an app; a site-authored file recorded in `customizations.yaml` with a build-in decision.
9
+
10
+ Everything else files upstream. The manifest's `undecided_ok_until`
11
+ grace is the only escape valve.
12
+
13
+ ## Why this matters
14
+
15
+ - Every `@working-theory/*` package and every template-owned file is
16
+ replaced on upgrade. A change made anywhere else is a change the next
17
+ `create-ailk update` either overwrites or has to merge by hand.
18
+ - The five points are the places an upgrade preserves. Work done through
19
+ them survives a bump without a merge.
20
+ - A site that drifts outside them is a fork in all but name, and a fork
21
+ stops getting fixes.
22
+
23
+ ## How to apply
24
+
25
+ Find the point your change belongs to, in this order, and use the first
26
+ that fits:
27
+
28
+ 1. **Site config and content.** The site's name, identity entity, `theme:`
29
+ and `brand:` are `content/_site.mdx`; every page is an MDX file under
30
+ `content/<locale>/<TypeName>/`. New copy, a new page, a changed nav
31
+ label, which section a page renders and where it stands in the page's
32
+ `sections:` list: all content.
33
+ 2. **The design package and theme.** The locked look is `DESIGN.md` plus
34
+ the `theme:` block in `_site.mdx`. A different look is
35
+ `pnpm create ailk@latest apply-design <name|path>`, which keeps
36
+ `brand:`; the owner's colours and fonts are the `brand:` block.
37
+ 3. **A section swap through the sections registry.** When a section
38
+ needs different markup, the site registers a local component for that
39
+ section name in place of the published one (ADR 0007): the registry
40
+ seam is `registerSliceRenderer` from `@working-theory/ui`, and it
41
+ accepts only the keys the runtime offers for a swap (today `booker` and
42
+ `payment-receipt`); any other key is refused, not swapped. The local
43
+ component is site-authored code under `apps/`, so it is also recorded
44
+ under point five. A section the runtime offers no swap for is an
45
+ upstream request, not a component you write into the app.
46
+ 4. **Wrapping a published component from an app.** When a published
47
+ component must behave differently here, wrap it in a file of this
48
+ site's and import the wrapper: never edit the package, patch it, or
49
+ copy its source in. The wrapper is site-authored code under `apps/`, so
50
+ it is also recorded under point five.
51
+ 5. **A site-authored file recorded in `customizations.yaml` with a
52
+ build-in decision.** Source under `apps/` that none of the first four
53
+ points covers is the exception, and the exception is recorded before
54
+ it is written. One entry per customization:
55
+
56
+ ```yaml
57
+ undecided_ok_until: 2027-01-31 # optional; YYYY-MM-DD
58
+ customizations: # required; may be []
59
+ - id: booking-embed # required; unique; /^[a-z0-9][a-z0-9-]*$/
60
+ paths: # required; ≥1; each starts "apps/"; no ".." segment
61
+ - "apps/web/components/booking/**"
62
+ request: "salessmyth/wendihenry#12" # /^([\w.-]+\/[\w.-]+)?#\d+$/; required unless undecided
63
+ decision: "build-in: ailk#9300 — removed when the bump lands"
64
+ ```
65
+
66
+ `decision` is exactly one of:
67
+
68
+ - `undecided`
69
+ - `build-in: ailk#<N>`, optionally followed by ` — <text>`
70
+ - `build-in: site — <decider>, <YYYY-MM-DD>, <reason>`
71
+
72
+ AILK builds a customization in unless it decides not to. `build-in:
73
+ ailk#N` means AILK ships it and this site's copy, tests included, goes
74
+ when the bump lands. `build-in: site` means AILK decided not to, and
75
+ the site keeps the file with the decider, the date and the reason.
76
+ `pnpm architecture` refuses site code with no entry.
77
+
78
+ ## Everything else files upstream
79
+
80
+ A change that fits none of the five is a request to AI Launch Kit, not an
81
+ edit here. Open an issue at
82
+ <https://github.com/working-theory-labs/ai-launch-kit/issues> describing
83
+ what the site needs and why the five points do not cover it, and record
84
+ the request's issue in the manifest entry. Do not edit a template-owned
85
+ file, do not patch or pin off a `@working-theory/*` package (the
86
+ architecture rule already refuses each), and do not carry the change as
87
+ an unrecorded file.
88
+
89
+ ## The one escape valve
90
+
91
+ An `undecided` entry passes the lint only while `undecided_ok_until` is a
92
+ date strictly after today (UTC). It exists so a site can be seeded, or a
93
+ request can be filed and decided, without going red the same day. It is
94
+ a deadline, not a state: when the date passes, record the decision or
95
+ move it with the request's owner.
96
+
97
+ ## Escalation
98
+
99
+ Stop and surface the question rather than decide alone if:
100
+
101
+ - A change seems to need a sixth way in: an edit to a template-owned
102
+ file, a package patch, a copied source tree.
103
+ - The right point is unclear between four and five, or between three and
104
+ an upstream request.
105
+ - An `undecided` entry is about to go out of grace with no decision on
106
+ its request.
@@ -70,8 +70,8 @@ result on the PR.
70
70
 
71
71
  For PRs touching specific surfaces:
72
72
 
73
- - `database/` schema changes — also run `pnpm db:migrate` locally if
74
- you added a migration.
73
+ - `database/` — never add a migration or a schema file; bump
74
+ `@working-theory/database` and run `pnpm db:migrate:deploy`.
75
75
 
76
76
  ## Commit + PR
77
77
 
@@ -1,5 +1,16 @@
1
1
  {
2
2
  "hooks": {
3
+ "PreToolUse": [
4
+ {
5
+ "matcher": "Edit|Write",
6
+ "hooks": [
7
+ {
8
+ "type": "command",
9
+ "command": "bash .claude/hooks/template-guard.sh"
10
+ }
11
+ ]
12
+ }
13
+ ],
3
14
  "PostToolUse": [
4
15
  {
5
16
  "matcher": "Edit|Write",
@@ -148,7 +148,7 @@ CONTENT_ADAPTER=mdx
148
148
  # ── Site id (apps/api, apps/web) ─────────────────────────────────────────────
149
149
  # The scope captured rows are stamped with. Lead, WaitlistExperiment and
150
150
  # ProjectListing carry `siteId`, which defaults to the literal "default"
151
- # (apps/api/src/lib/site.ts), while tenancy scopes reads by WORKSPACE id.
151
+ # (packages/api/src/lib/site.ts), while tenancy scopes reads by WORKSPACE id.
152
152
  # A single-tenant deployment should set this to the default workspace
153
153
  # sentinel so the two agree:
154
154
  # AILK_SITE_ID=wksp_00000000-0000-7000-8000-000000000001
@@ -188,6 +188,13 @@ CONTENT_ADAPTER=mdx
188
188
  # config declares a `followUps` block.
189
189
  # AILK_FOLLOWUP_EMAIL_FROM=
190
190
  #
191
+ # The inbox's sender (#9690): an Admin reply emailed to the client, and the
192
+ # Invite to sign up email. Optional — falls back to
193
+ # AILK_LEAD_NOTIFICATION_FROM when unset; with neither, a reply is still saved
194
+ # (its email is `not_configured`) and an invitation is refused. The links
195
+ # start at FRONTEND_URL (https only outside development).
196
+ # AILK_INBOX_FROM=
197
+ #
191
198
  # The Resend Contacts audience the #4732 follow-up sweep checks before
192
199
  # sending — a lead found unsubscribed in this audience is suppressed.
193
200
  # Optional: unset degrades to "cannot verify — proceed" (never to "block all
@@ -381,7 +388,7 @@ CONTENT_ADAPTER=mdx
381
388
 
382
389
  # ── E2E test-auth seam (pre-OSS — never set in production) ───────────────────
383
390
  # These two env vars enable the test-auth route at POST /api/test/auth/session
384
- # (apps/api/src/routes/test/auth/session.ts) so an e2e harness can mint a
391
+ # (packages/api/src/routes/test/auth/session.ts) so an e2e harness can mint a
385
392
  # Better Auth session for a seeded test user WITHOUT going through Google
386
393
  # OAuth, GitHub OAuth, or magic-link email.
387
394
  #
@@ -396,7 +403,7 @@ CONTENT_ADAPTER=mdx
396
403
  #
397
404
  # Allowlist format: comma-separated user IDs (exact-match strings; no regex,
398
405
  # no wildcard). Empty entries between commas are trimmed.
399
- # Run `pnpm --filter @working-theory/database db:seed:test` to seed three test users
406
+ # Run `pnpm db:seed:test` to seed three test users
400
407
  # (user_00000000-0000-7000-8000-0000000000e1 / …e2 / …e3 — reserved-range
401
408
  # prefixed ids per ADR-0031, distinguished by the Better Auth `role` field).
402
409
  # The seed script itself refuses to run unless
@@ -446,6 +453,14 @@ CONTENT_ADAPTER=mdx
446
453
  # that database. Rotation and the rekey bin: apps/api/.env.example.
447
454
  # STRIPE_CONNECTION_KEY=
448
455
  # STRIPE_CONNECTION_KEY_PREVIOUS=
456
+ # The key each Organization's Slack connection is encrypted under (#9748),
457
+ # and the key it replaced during a rotation: 32 random bytes each, `openssl
458
+ # rand -base64 32`, distinct from each other and from SCHEDULING_CREDENTIAL_KEY
459
+ # and both Stripe connection keys. Unset = a connection cannot be written and
460
+ # reads as not connected, but can be removed; any other shape stops the API.
461
+ # No rekey walk: rotation and the leaked-key rule in apps/api/.env.example.
462
+ # SLACK_CONNECTION_KEY=
463
+ # SLACK_CONNECTION_KEY_PREVIOUS=
449
464
  # The Organization that owns STRIPE_SECRET_KEY (#9285): with the multi-tenant
450
465
  # module only the Organization whose id is named here sells through it; unset
451
466
  # means nobody. Without the module the single Organization owns it.
@@ -533,7 +548,7 @@ CONTENT_ADAPTER=mdx
533
548
  # pre-#5040 in-process Map, which does not. Default: `database` when
534
549
  # DATABASE_URL is set, else `memory`. A database failure or a 1s-slow call
535
550
  # falls back to the in-process Map for that request rather than letting it
536
- # through uncounted. Run `pnpm --filter @working-theory/api rate-limit:probe
551
+ # through uncounted. Run `pnpm --filter @working-theory/app-api rate-limit:probe
537
552
  # --origin <https origin>` against a live deployment to check which store it
538
553
  # selected and whether a burst holds — see
539
554
  # docs/runbooks/site-configuration.md.
@@ -547,7 +562,7 @@ CONTENT_ADAPTER=mdx
547
562
  #
548
563
  # Hub and spokes — a spoke's reads and writes resolve to ITS OWN workspace
549
564
  # (#7532). A hub holding one workspace per spoke registers each spoke in its
550
- # database (`pnpm --filter @working-theory/api spokes register --workspace
565
+ # database (`pnpm --filter @working-theory/app-api spokes register --workspace
551
566
  # <wksp_id> --name <label>`), which prints the spoke's key once. The spoke
552
567
  # sends it on every server-side call, and the hub resolves meeting types, the
553
568
  # three lead writes, bookings and public content reads to that spoke's
@@ -5,6 +5,9 @@ on:
5
5
 
6
6
  jobs:
7
7
  ci:
8
+ # Posted as the `preflight` status check — the one to make required on the
9
+ # default branch (project.yaml `ci.required_checks`, CLAUDE.md § Checks).
10
+ name: preflight
8
11
  runs-on: ubuntu-latest
9
12
  steps:
10
13
  - uses: actions/checkout@v4
@@ -46,10 +49,10 @@ jobs:
46
49
  # real lockfile has been committed.
47
50
  - run: pnpm install
48
51
 
49
- # Prisma's generated client (database/generated/) is a build artifact,
50
- # not part of the scaffold — type-check/build/test all resolve
51
- # `@working-theory/database`'s generated types, and `prisma generate` needs
52
- # no DATABASE_URL (it reads only the schema file, no live DB).
52
+ # The Prisma client ships prebuilt in the installed @working-theory/database;
53
+ # `db:generate` (through database/prisma.config.ts) is the cheapest proof
54
+ # that the installed schema loads under this site's own Prisma CLI, and it
55
+ # needs no DATABASE_URL (it reads only the schema files, no live DB).
53
56
  - run: pnpm db:generate
54
57
 
55
58
  - run: pnpm type-check
@@ -19,7 +19,7 @@ CloudParity block goes just above it.
19
19
  apps/web/ Next.js app — visitor-facing UX
20
20
  apps/api/ Fastify HTTP API — lead capture, checkout, webhooks
21
21
  apps/mcp/ MCP server — agent-callable tools
22
- database/ Prisma schema + migrations
22
+ database/ Prisma config + seed; schema and migrations ship in @working-theory/database
23
23
  content/ Site settings (_site.mdx) and MDX pages (en/<TypeName>/)
24
24
  .claude/ Rules, the agent definition and settings for Claude Code
25
25
  tools/ This repo's own checks (architecture, CLAUDE.md drift)
@@ -29,6 +29,10 @@ You consume `@working-theory/*` packages from npm: read a README or types,
29
29
  not the source. Build on one by composing, wrapping or configuring it via
30
30
  its documented extension points. Never copy it out of `node_modules`, fork,
31
31
  patch or pin it: a copy stops taking fixes. `pnpm architecture` refuses each.
32
+
33
+ Before you write a new source file under `apps/`, record it in `customizations.yaml`:
34
+ its paths, the request issue, and the build-in decision. AILK builds a customization
35
+ in unless it decides not to. `pnpm architecture` refuses site code with no entry.
32
36
  <!-- /ailk:template id="repo-shape" -->
33
37
 
34
38
  <!-- ailk:template id="architecture" -->
@@ -123,6 +127,12 @@ For design work, the third-party impeccable plugin is optional:
123
127
  | `pnpm test` | Failing unit tests |
124
128
  | `/ailk:check-site` skill | Missing or invalid JSON-LD, weak citation-readiness |
125
129
 
130
+ `.github/workflows/ci.yml` runs the preflight checks and `pnpm test` on every
131
+ pull request as the `preflight` status check. One step is yours: make
132
+ `preflight` a required status check on your default branch (GitHub: Settings →
133
+ Branches), so a change that fails it — an AI Launch Kit upgrade included —
134
+ cannot merge.
135
+
126
136
  <!-- /ailk:template id="checks" -->
127
137
 
128
138
  <!-- ailk:template id="workflow" -->
@@ -96,13 +96,12 @@ decision — write a short rationale in `docs/` first.
96
96
 
97
97
  If you've enabled the optional database layer:
98
98
 
99
- - **Prisma is the source of truth.** Schema lives in
100
- `prisma/schema.prisma`; migrations are generated with
101
- `pnpm db:migrate`.
102
- - **Migrations are forward-only.** Never edit a migration that has
103
- already been applied. Write a corrective migration instead.
104
- - **No raw SQL outside the migrations folder.** All runtime data
105
- access goes through Prisma.
99
+ - **The schema and the migrations ship in `@working-theory/database`.**
100
+ This site carries neither: `database/prisma.config.ts` points Prisma at
101
+ the installed package. Take new ones by bumping that dependency and
102
+ running `pnpm db:migrate:deploy`. Never write a migration or a `.prisma`
103
+ file here.
104
+ - **No raw SQL; all runtime data access goes through Prisma.**
106
105
  - **`@map` for snake_case ↔ camelCase.** DB columns are snake_case;
107
106
  TS field names are camelCase.
108
107
  - **Index every query you ship.** Add `@@index([...])` for any field
@@ -117,9 +116,8 @@ If you've enabled the optional database layer:
117
116
 
118
117
  ## Testing
119
118
 
120
- - **Jest + ts-jest** for unit tests, co-located. Each app and `database/`
121
- ships its own Jest config; the root `pnpm test` fans out via
122
- `pnpm -r test`.
119
+ - **Jest + ts-jest** for unit tests, co-located. Each app ships its own
120
+ Jest config; the root `pnpm test` fans out via `pnpm -r test`.
123
121
  - Source: `Foo.tsx` → tests: `__tests__/Foo.test.tsx`.
124
122
  - Run: `pnpm --filter <pkg> test`.
125
123
  - **Playwright** for end-to-end (root `e2e/` once you add it).