create-ailk 0.23.0 → 0.25.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 (604) hide show
  1. package/README.md +68 -33
  2. package/component-catalog.json +3 -3
  3. package/component-catalog.md +3 -3
  4. package/dist/add-module.js +10 -3
  5. package/dist/add-route.d.ts +12 -1
  6. package/dist/add-route.js +38 -4
  7. package/dist/cli.js +12 -7
  8. package/dist/derive-architecture.d.ts +3 -4
  9. package/dist/derive-architecture.js +75 -22
  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 +1 -1
  14. package/dist/lib/fetch-template-snapshot.js +7 -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 +34 -12
  19. package/dist/lib/scaffold-render-sweep.d.ts +33 -0
  20. package/dist/lib/scaffold-render-sweep.js +45 -0
  21. package/dist/module-architecture.d.ts +20 -3
  22. package/dist/module-architecture.js +122 -538
  23. package/dist/paid-sections.d.ts +25 -1
  24. package/dist/paid-sections.js +88 -3
  25. package/dist/surfaces.js +10 -2
  26. package/dist/sync-routes.d.ts +30 -4
  27. package/dist/sync-routes.js +271 -18
  28. package/dist/template-record.d.ts +14 -4
  29. package/dist/template-record.js +23 -5
  30. package/dist/topology.d.ts +16 -3
  31. package/dist/topology.js +31 -19
  32. package/dist/update.d.ts +10 -1
  33. package/dist/update.js +540 -16
  34. package/package.json +3 -3
  35. package/release-scope.json +1 -1
  36. package/templates/.claude/cloudparity-repo-hooks.json +5 -0
  37. package/templates/.claude/hooks/template-guard.sh +137 -0
  38. package/templates/.claude/rules/extending.md +106 -0
  39. package/templates/.claude/rules/loop-contract.md +2 -2
  40. package/templates/.claude/settings.json +11 -0
  41. package/templates/.env.example +9 -5
  42. package/templates/.github/workflows/ci.yml +7 -4
  43. package/templates/CLAUDE.md +15 -3
  44. package/templates/CONVENTIONS.md +8 -10
  45. package/templates/README.md +14 -13
  46. package/templates/apps/api/.env.example +9 -2
  47. package/templates/apps/api/CLAUDE.md +122 -82
  48. package/templates/apps/api/jest.config.cjs +15 -5
  49. package/templates/apps/api/package.json +16 -20
  50. package/templates/apps/api/src/__tests__/trusted-origins.server.test.ts +2 -2
  51. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +4 -4
  52. package/templates/apps/api/src/index.ts +1 -1
  53. package/templates/apps/api/src/lib/__mocks__/prisma.ts +7 -4
  54. package/templates/apps/api/src/modules/commerce.ts +10 -0
  55. package/templates/apps/api/src/modules/content-write.ts +10 -0
  56. package/templates/apps/api/src/modules/multi-tenant.ts +10 -0
  57. package/templates/apps/api/src/modules/scheduling.ts +10 -0
  58. package/templates/apps/api/src/modules/signal-collectors.ts +10 -0
  59. package/templates/apps/api/src/modules/workspace.ts +10 -0
  60. package/templates/apps/api/src/server.ts +117 -1857
  61. package/templates/apps/api/vercel.json +2 -2
  62. package/templates/apps/mcp/CLAUDE.md +77 -24
  63. package/templates/apps/mcp/__tests__/app-entry.test.ts +4 -254
  64. package/templates/apps/mcp/__tests__/boot-file.test.ts +92 -0
  65. package/templates/apps/mcp/jest.config.cjs +6 -1
  66. package/templates/apps/mcp/package.json +5 -12
  67. package/templates/apps/mcp/src/app.ts +8 -7
  68. package/templates/apps/mcp/src/index.ts +6 -34
  69. package/templates/apps/mcp/src/lib/paid-tools.generated.ts +10 -0
  70. package/templates/apps/mcp/src/lib/topology.generated.ts +2 -2
  71. package/templates/apps/mcp/src/site.ts +12 -0
  72. package/templates/apps/web/.env.example +1 -1
  73. package/templates/apps/web/CLAUDE.md +21 -5
  74. package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
  75. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +1 -1
  76. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +14 -4
  77. package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
  78. package/templates/apps/web/app/[locale]/contact/intake-script.ts +1 -1
  79. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +22 -1
  80. package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +28 -7
  81. package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +43 -0
  82. package/templates/apps/web/app/[locale]/pricing/page.tsx +7 -3
  83. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/__tests__/route.test.ts +222 -0
  84. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +10 -3
  85. package/templates/apps/web/app/api/revalidate/route.ts +3 -3
  86. package/templates/apps/web/auth.ts +2 -2
  87. package/templates/apps/web/jest.config.cjs +1 -0
  88. package/templates/apps/web/lib/__tests__/magnet-routes.test.ts +7 -0
  89. package/templates/apps/web/lib/auth-email.ts +1 -1
  90. package/templates/apps/web/lib/magnet-routes.ts +3 -1
  91. package/templates/apps/web/lib/newsletter.actions.ts +9 -6
  92. package/templates/apps/web/lib/relay.ts +2 -2
  93. package/templates/apps/web/lib/release-scope.ts +47 -0
  94. package/templates/apps/web/lib/server-api.ts +1 -1
  95. package/templates/apps/web/src/lib/commerce-claim.ts +1 -1
  96. package/templates/customizations.yaml +37 -0
  97. package/templates/database/prisma.config.ts +10 -14
  98. package/templates/database/seed-test.ts +2 -2
  99. package/templates/database/seed.ts +32 -5
  100. package/templates/package.json +12 -6
  101. package/templates/pnpm-workspace.yaml +0 -1
  102. package/templates/project.yaml +16 -8
  103. package/templates/tools/jest/reporters.cjs +65 -0
  104. package/templates/tools/lint-architecture.ts +757 -7
  105. package/templates/tsconfig.json +1 -2
  106. package/versions.json +48 -35
  107. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +0 -409
  108. package/templates/apps/api/src/__tests__/factories/agent-caller.ts +0 -102
  109. package/templates/apps/api/src/__tests__/factories/content-fixture.ts +0 -138
  110. package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +0 -441
  111. package/templates/apps/api/src/__tests__/factories/index.ts +0 -70
  112. package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +0 -82
  113. package/templates/apps/api/src/__tests__/leads-forwarded-rate-limit.test.ts +0 -135
  114. package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +0 -126
  115. package/templates/apps/api/src/__tests__/stripe-boot.test.ts +0 -132
  116. package/templates/apps/api/src/__tests__/support/hub-sign-in-fake-db.ts +0 -362
  117. package/templates/apps/api/src/bin/__tests__/rate-limit-probe.test.ts +0 -184
  118. package/templates/apps/api/src/bin/abandon-sweep.ts +0 -42
  119. package/templates/apps/api/src/bin/rate-limit-probe.ts +0 -53
  120. package/templates/apps/api/src/bin/spokes.ts +0 -198
  121. package/templates/apps/api/src/bin/stripe-connections-rekey.ts +0 -45
  122. package/templates/apps/api/src/config/__tests__/hub-require-spoke-key.test.ts +0 -196
  123. package/templates/apps/api/src/config/__tests__/index.test.ts +0 -233
  124. package/templates/apps/api/src/config/__tests__/modules.test.ts +0 -76
  125. package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +0 -185
  126. package/templates/apps/api/src/config/__tests__/trusted-origins.test.ts +0 -238
  127. package/templates/apps/api/src/config/index.ts +0 -596
  128. package/templates/apps/api/src/config/modules.ts +0 -83
  129. package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +0 -581
  130. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +0 -143
  131. package/templates/apps/api/src/lib/__tests__/consent-ledger-double.ts +0 -237
  132. package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +0 -353
  133. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +0 -201
  134. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +0 -224
  135. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +0 -120
  136. package/templates/apps/api/src/lib/__tests__/errors.test.ts +0 -94
  137. package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +0 -144
  138. package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +0 -8
  139. package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +0 -149
  140. package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +0 -116
  141. package/templates/apps/api/src/lib/__tests__/hub-sign-in-store.test.ts +0 -209
  142. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +0 -257
  143. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +0 -96
  144. package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +0 -125
  145. package/templates/apps/api/src/lib/__tests__/prisma.test.ts +0 -165
  146. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +0 -317
  147. package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +0 -129
  148. package/templates/apps/api/src/lib/__tests__/site.test.ts +0 -292
  149. package/templates/apps/api/src/lib/__tests__/slice-load.test.ts +0 -89
  150. package/templates/apps/api/src/lib/__tests__/spoke-store.test.ts +0 -202
  151. package/templates/apps/api/src/lib/__tests__/stripe-admission.test.ts +0 -217
  152. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +0 -82
  153. package/templates/apps/api/src/lib/agent-store.ts +0 -613
  154. package/templates/apps/api/src/lib/auth-email-budget.ts +0 -161
  155. package/templates/apps/api/src/lib/consent-store.ts +0 -363
  156. package/templates/apps/api/src/lib/content-adapter.ts +0 -112
  157. package/templates/apps/api/src/lib/deliverable-asset-store.ts +0 -96
  158. package/templates/apps/api/src/lib/error-serializer.ts +0 -164
  159. package/templates/apps/api/src/lib/errors.ts +0 -95
  160. package/templates/apps/api/src/lib/file-fallback.ts +0 -87
  161. package/templates/apps/api/src/lib/flow-completion-store.ts +0 -136
  162. package/templates/apps/api/src/lib/hub-sign-in-store.ts +0 -455
  163. package/templates/apps/api/src/lib/lead-capture-store.ts +0 -122
  164. package/templates/apps/api/src/lib/lead-delivery.ts +0 -52
  165. package/templates/apps/api/src/lib/license-key-store.ts +0 -45
  166. package/templates/apps/api/src/lib/locales.ts +0 -201
  167. package/templates/apps/api/src/lib/outbound-http.ts +0 -127
  168. package/templates/apps/api/src/lib/prisma.ts +0 -21
  169. package/templates/apps/api/src/lib/proposal-paid-store.ts +0 -66
  170. package/templates/apps/api/src/lib/rate-limit-probe.ts +0 -165
  171. package/templates/apps/api/src/lib/rate-limit-store.ts +0 -142
  172. package/templates/apps/api/src/lib/require-commerce-claim.ts +0 -250
  173. package/templates/apps/api/src/lib/require-paid-tier.ts +0 -53
  174. package/templates/apps/api/src/lib/site.ts +0 -254
  175. package/templates/apps/api/src/lib/slice-load.ts +0 -90
  176. package/templates/apps/api/src/lib/spoke-store.ts +0 -180
  177. package/templates/apps/api/src/lib/stripe.ts +0 -318
  178. package/templates/apps/api/src/lib/webhook-idempotency.ts +0 -156
  179. package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +0 -111
  180. package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +0 -172
  181. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +0 -119
  182. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +0 -138
  183. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-trusted-origins.test.ts +0 -142
  184. package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +0 -155
  185. package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +0 -139
  186. package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +0 -562
  187. package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +0 -76
  188. package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +0 -220
  189. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +0 -97
  190. package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +0 -557
  191. package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +0 -72
  192. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +0 -140
  193. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +0 -721
  194. package/templates/apps/api/src/middleware/__tests__/rate-limit-cross-isolate.db.test.ts +0 -220
  195. package/templates/apps/api/src/middleware/__tests__/rate-limit-store.test.ts +0 -430
  196. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +0 -1409
  197. package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +0 -174
  198. package/templates/apps/api/src/middleware/auth.ts +0 -864
  199. package/templates/apps/api/src/middleware/default-tenant.ts +0 -166
  200. package/templates/apps/api/src/middleware/rate-limit.ts +0 -983
  201. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +0 -264
  202. package/templates/apps/api/src/openapi/__tests__/spec-identity.test.ts +0 -182
  203. package/templates/apps/api/src/openapi/index.ts +0 -18
  204. package/templates/apps/api/src/openapi/spec.ts +0 -1815
  205. package/templates/apps/api/src/openapi/surface-drift.ts +0 -195
  206. package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +0 -175
  207. package/templates/apps/api/src/routes/aeo/index.ts +0 -107
  208. package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +0 -196
  209. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +0 -249
  210. package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +0 -532
  211. package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +0 -313
  212. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +0 -413
  213. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +0 -609
  214. package/templates/apps/api/src/routes/auth/hub-sign-in.ts +0 -242
  215. package/templates/apps/api/src/routes/auth/tokens.ts +0 -211
  216. package/templates/apps/api/src/routes/auth/transactional-email.ts +0 -301
  217. package/templates/apps/api/src/routes/auth/user.ts +0 -305
  218. package/templates/apps/api/src/routes/billing/plan-checkout.ts +0 -325
  219. package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +0 -178
  220. package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +0 -1300
  221. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +0 -448
  222. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +0 -1742
  223. package/templates/apps/api/src/routes/checkout/index.ts +0 -34
  224. package/templates/apps/api/src/routes/checkout/session.ts +0 -171
  225. package/templates/apps/api/src/routes/checkout/sessions.ts +0 -540
  226. package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +0 -386
  227. package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +0 -160
  228. package/templates/apps/api/src/routes/consent/account.ts +0 -268
  229. package/templates/apps/api/src/routes/consent/cookie.ts +0 -90
  230. package/templates/apps/api/src/routes/consent/index.ts +0 -26
  231. package/templates/apps/api/src/routes/consent/unsubscribe.ts +0 -127
  232. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +0 -853
  233. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +0 -230
  234. package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +0 -44
  235. package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +0 -118
  236. package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +0 -731
  237. package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +0 -753
  238. package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +0 -51
  239. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +0 -450
  240. package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +0 -762
  241. package/templates/apps/api/src/routes/content/get-page.ts +0 -268
  242. package/templates/apps/api/src/routes/content/index.ts +0 -49
  243. package/templates/apps/api/src/routes/content/list-pages.ts +0 -95
  244. package/templates/apps/api/src/routes/content/list-types.ts +0 -19
  245. package/templates/apps/api/src/routes/content/offerings.ts +0 -184
  246. package/templates/apps/api/src/routes/content/pricing.ts +0 -176
  247. package/templates/apps/api/src/routes/content/rate-limit.ts +0 -22
  248. package/templates/apps/api/src/routes/content/search.ts +0 -129
  249. package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
  250. package/templates/apps/api/src/routes/content/slug.ts +0 -9
  251. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +0 -88
  252. package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +0 -171
  253. package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +0 -515
  254. package/templates/apps/api/src/routes/leads/__tests__/spoke.test.ts +0 -392
  255. package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +0 -165
  256. package/templates/apps/api/src/routes/leads/index.ts +0 -573
  257. package/templates/apps/api/src/routes/leads/list.ts +0 -104
  258. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +0 -626
  259. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +0 -1268
  260. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +0 -847
  261. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +0 -480
  262. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -465
  263. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +0 -872
  264. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +0 -1022
  265. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +0 -484
  266. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +0 -535
  267. package/templates/apps/api/src/routes/project-listings/index.ts +0 -164
  268. package/templates/apps/api/src/routes/project-listings/me.ts +0 -87
  269. package/templates/apps/api/src/routes/project-listings/patch-copy.ts +0 -224
  270. package/templates/apps/api/src/routes/project-listings/patch-draft.ts +0 -102
  271. package/templates/apps/api/src/routes/project-listings/public.ts +0 -98
  272. package/templates/apps/api/src/routes/project-listings/respond.ts +0 -48
  273. package/templates/apps/api/src/routes/project-listings/resume-token.ts +0 -27
  274. package/templates/apps/api/src/routes/project-listings/start.ts +0 -140
  275. package/templates/apps/api/src/routes/project-listings/submit.ts +0 -130
  276. package/templates/apps/api/src/routes/project-listings/verify-email.ts +0 -150
  277. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +0 -686
  278. package/templates/apps/api/src/routes/requests/confirm.ts +0 -601
  279. package/templates/apps/api/src/routes/requests/index.ts +0 -54
  280. package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +0 -306
  281. package/templates/apps/api/src/routes/test/auth/session.ts +0 -143
  282. package/templates/apps/api/src/routes/webhooks/README.md +0 -398
  283. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +0 -649
  284. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +0 -749
  285. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +0 -448
  286. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +0 -264
  287. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode-live.test.ts +0 -159
  288. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode.test.ts +0 -158
  289. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +0 -814
  290. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +0 -301
  291. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-proposal-paid.test.ts +0 -369
  292. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +0 -215
  293. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +0 -301
  294. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +0 -808
  295. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +0 -1155
  296. package/templates/apps/api/src/routes/webhooks/index.ts +0 -141
  297. package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +0 -384
  298. package/templates/apps/api/src/routes/webhooks/stripe.ts +0 -2026
  299. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -528
  300. package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +0 -132
  301. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +0 -1028
  302. package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +0 -313
  303. package/templates/apps/api/src/services/__tests__/consent-ledger.test.ts +0 -503
  304. package/templates/apps/api/src/services/__tests__/consent-migration.test.ts +0 -65
  305. package/templates/apps/api/src/services/__tests__/consent.test.ts +0 -299
  306. package/templates/apps/api/src/services/__tests__/default-tenant.test.ts +0 -147
  307. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +0 -867
  308. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +0 -379
  309. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +0 -368
  310. package/templates/apps/api/src/services/__tests__/entitlements.test.ts +0 -142
  311. package/templates/apps/api/src/services/__tests__/hub-sign-in.test.ts +0 -854
  312. package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +0 -234
  313. package/templates/apps/api/src/services/__tests__/lead-accept-user.test.ts +0 -251
  314. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +0 -2660
  315. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +0 -166
  316. package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +0 -389
  317. package/templates/apps/api/src/services/__tests__/person.test.ts +0 -1176
  318. package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -444
  319. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -154
  320. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +0 -137
  321. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +0 -531
  322. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +0 -372
  323. package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +0 -348
  324. package/templates/apps/api/src/services/__tests__/spoke-resolution.test.ts +0 -660
  325. package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +0 -941
  326. package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +0 -588
  327. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +0 -78
  328. package/templates/apps/api/src/services/abandon-email.ts +0 -313
  329. package/templates/apps/api/src/services/aeo-score.ts +0 -325
  330. package/templates/apps/api/src/services/answer-distributions.ts +0 -138
  331. package/templates/apps/api/src/services/audit-log.ts +0 -961
  332. package/templates/apps/api/src/services/checkout-buyer.ts +0 -168
  333. package/templates/apps/api/src/services/consent.ts +0 -834
  334. package/templates/apps/api/src/services/default-tenant.ts +0 -416
  335. package/templates/apps/api/src/services/deliverable-fulfillment.ts +0 -755
  336. package/templates/apps/api/src/services/dunning-policy.ts +0 -294
  337. package/templates/apps/api/src/services/enrichment-shim.ts +0 -53
  338. package/templates/apps/api/src/services/entitlements.ts +0 -338
  339. package/templates/apps/api/src/services/hub-sign-in.ts +0 -472
  340. package/templates/apps/api/src/services/lead-accept-user.ts +0 -126
  341. package/templates/apps/api/src/services/lead-promotion.ts +0 -160
  342. package/templates/apps/api/src/services/lead-routing.ts +0 -1372
  343. package/templates/apps/api/src/services/leads-inbox.ts +0 -312
  344. package/templates/apps/api/src/services/listing-config.ts +0 -178
  345. package/templates/apps/api/src/services/magnet-completion.ts +0 -242
  346. package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +0 -295
  347. package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +0 -268
  348. package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +0 -868
  349. package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +0 -416
  350. package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +0 -396
  351. package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -681
  352. package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
  353. package/templates/apps/api/src/services/offerings/catalog.ts +0 -308
  354. package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -385
  355. package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
  356. package/templates/apps/api/src/services/offerings/connection.ts +0 -1003
  357. package/templates/apps/api/src/services/offerings/index.ts +0 -614
  358. package/templates/apps/api/src/services/offerings/source.ts +0 -140
  359. package/templates/apps/api/src/services/offerings/store.ts +0 -150
  360. package/templates/apps/api/src/services/owner-workspaces.ts +0 -132
  361. package/templates/apps/api/src/services/person.ts +0 -1188
  362. package/templates/apps/api/src/services/plan-offerings.ts +0 -125
  363. package/templates/apps/api/src/services/project-listing-resume-email.ts +0 -326
  364. package/templates/apps/api/src/services/project-listings.ts +0 -2073
  365. package/templates/apps/api/src/services/public-site-resolver.ts +0 -396
  366. package/templates/apps/api/src/services/request-confirm.ts +0 -698
  367. package/templates/apps/api/src/services/revalidation.ts +0 -235
  368. package/templates/apps/api/src/services/slack-notify.ts +0 -291
  369. package/templates/apps/api/src/services/usage-aggregation.ts +0 -516
  370. package/templates/apps/api/src/services/usage-credits.ts +0 -340
  371. package/templates/apps/api/src/services/verified-email.ts +0 -71
  372. package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +0 -52
  373. package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +0 -46
  374. package/templates/apps/mcp/__tests__/abuse/guard.test.ts +0 -198
  375. package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +0 -36
  376. package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +0 -54
  377. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +0 -116
  378. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +0 -299
  379. package/templates/apps/mcp/__tests__/boot.test.ts +0 -280
  380. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +0 -359
  381. package/templates/apps/mcp/__tests__/config/modules.test.ts +0 -78
  382. package/templates/apps/mcp/__tests__/get_business_hours.test.ts +0 -82
  383. package/templates/apps/mcp/__tests__/get_faq.test.ts +0 -80
  384. package/templates/apps/mcp/__tests__/get_locations.test.ts +0 -65
  385. package/templates/apps/mcp/__tests__/get_offerings.test.ts +0 -557
  386. package/templates/apps/mcp/__tests__/get_pricing.test.ts +0 -524
  387. package/templates/apps/mcp/__tests__/get_site_info.test.ts +0 -81
  388. package/templates/apps/mcp/__tests__/http-transport.test.ts +0 -1151
  389. package/templates/apps/mcp/__tests__/index.test.ts +0 -195
  390. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +0 -191
  391. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +0 -531
  392. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +0 -65
  393. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -187
  394. package/templates/apps/mcp/__tests__/lib/content-root.test.ts +0 -93
  395. package/templates/apps/mcp/__tests__/lib/errors.test.ts +0 -75
  396. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +0 -165
  397. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
  398. package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -228
  399. package/templates/apps/mcp/__tests__/locale.test.ts +0 -135
  400. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +0 -175
  401. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +0 -101
  402. package/templates/apps/mcp/__tests__/read_content.test.ts +0 -474
  403. package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -225
  404. package/templates/apps/mcp/__tests__/search_content.test.ts +0 -256
  405. package/templates/apps/mcp/__tests__/server.test.ts +0 -388
  406. package/templates/apps/mcp/__tests__/start_purchase.test.ts +0 -448
  407. package/templates/apps/mcp/__tests__/submit_lead.test.ts +0 -307
  408. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -223
  409. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +0 -243
  410. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +0 -451
  411. package/templates/apps/mcp/src/abuse/daily-cap.ts +0 -47
  412. package/templates/apps/mcp/src/abuse/email-validator.ts +0 -25
  413. package/templates/apps/mcp/src/abuse/honeypot.ts +0 -21
  414. package/templates/apps/mcp/src/abuse/index.ts +0 -342
  415. package/templates/apps/mcp/src/abuse/user-agent-deny.ts +0 -58
  416. package/templates/apps/mcp/src/boot.ts +0 -167
  417. package/templates/apps/mcp/src/config/modules.ts +0 -43
  418. package/templates/apps/mcp/src/http-transport.ts +0 -526
  419. package/templates/apps/mcp/src/lib/audit-single-page.ts +0 -308
  420. package/templates/apps/mcp/src/lib/commerce-claim.ts +0 -263
  421. package/templates/apps/mcp/src/lib/content-adapter.ts +0 -142
  422. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -139
  423. package/templates/apps/mcp/src/lib/errors.ts +0 -61
  424. package/templates/apps/mcp/src/lib/license-key-store.ts +0 -45
  425. package/templates/apps/mcp/src/lib/locales.ts +0 -171
  426. package/templates/apps/mcp/src/lib/prisma.ts +0 -39
  427. package/templates/apps/mcp/src/lib/public-workspace.ts +0 -133
  428. package/templates/apps/mcp/src/lib/resolve-locale.ts +0 -30
  429. package/templates/apps/mcp/src/lib/shown-offerings.ts +0 -105
  430. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +0 -59
  431. package/templates/apps/mcp/src/request-context.ts +0 -52
  432. package/templates/apps/mcp/src/server.ts +0 -343
  433. package/templates/apps/mcp/src/serverless-app.ts +0 -88
  434. package/templates/apps/mcp/src/tools/audit.ts +0 -127
  435. package/templates/apps/mcp/src/tools/capture_lead.ts +0 -64
  436. package/templates/apps/mcp/src/tools/create_project.ts +0 -134
  437. package/templates/apps/mcp/src/tools/get_business_hours.ts +0 -68
  438. package/templates/apps/mcp/src/tools/get_faq.ts +0 -71
  439. package/templates/apps/mcp/src/tools/get_locations.ts +0 -88
  440. package/templates/apps/mcp/src/tools/get_offerings.ts +0 -96
  441. package/templates/apps/mcp/src/tools/get_pricing.ts +0 -94
  442. package/templates/apps/mcp/src/tools/get_site_info.ts +0 -86
  443. package/templates/apps/mcp/src/tools/index.ts +0 -137
  444. package/templates/apps/mcp/src/tools/list_pages.ts +0 -74
  445. package/templates/apps/mcp/src/tools/person_notes.ts +0 -25
  446. package/templates/apps/mcp/src/tools/proposals.ts +0 -27
  447. package/templates/apps/mcp/src/tools/purchase.ts +0 -205
  448. package/templates/apps/mcp/src/tools/read_content.ts +0 -75
  449. package/templates/apps/mcp/src/tools/request_callback.ts +0 -59
  450. package/templates/apps/mcp/src/tools/search_content.ts +0 -67
  451. package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -57
  452. package/templates/apps/mcp/src/workspace-server.ts +0 -224
  453. package/templates/database/CHANGELOG.md +0 -961
  454. package/templates/database/LICENSE +0 -202
  455. package/templates/database/NOTICE +0 -2
  456. package/templates/database/README.md +0 -243
  457. package/templates/database/__tests__/agents.db.test.ts +0 -320
  458. package/templates/database/__tests__/appointment.db.test.ts +0 -106
  459. package/templates/database/__tests__/artifact-content-store.db.test.ts +0 -316
  460. package/templates/database/__tests__/composite-fence.db.test.ts +0 -206
  461. package/templates/database/__tests__/consent-ledger.db.test.ts +0 -345
  462. package/templates/database/__tests__/consent-source-checkout-migration.test.ts +0 -79
  463. package/templates/database/__tests__/fence-fan-out.db.test.ts +0 -715
  464. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +0 -79
  465. package/templates/database/__tests__/fixtures/person-backfill.json +0 -264
  466. package/templates/database/__tests__/fixtures/person-contact-backfill.json +0 -182
  467. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +0 -100
  468. package/templates/database/__tests__/flow-completion-migration.test.ts +0 -115
  469. package/templates/database/__tests__/flow-completion.db.test.ts +0 -136
  470. package/templates/database/__tests__/flow-workspace-key.db.test.ts +0 -263
  471. package/templates/database/__tests__/flows-listing-diagnostic.test.ts +0 -392
  472. package/templates/database/__tests__/flows-presets.test.ts +0 -173
  473. package/templates/database/__tests__/in-page-magnets-migration.test.ts +0 -161
  474. package/templates/database/__tests__/lead-idempotency-key.db.test.ts +0 -92
  475. package/templates/database/__tests__/member-area.db.test.ts +0 -257
  476. package/templates/database/__tests__/member-contract-migration.test.ts +0 -85
  477. package/templates/database/__tests__/member-contract.db.test.ts +0 -413
  478. package/templates/database/__tests__/offerings-checkout-session.db.test.ts +0 -270
  479. package/templates/database/__tests__/offerings-migration.test.ts +0 -197
  480. package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +0 -86
  481. package/templates/database/__tests__/offerings.db.test.ts +0 -303
  482. package/templates/database/__tests__/outbound-message-action.db.test.ts +0 -80
  483. package/templates/database/__tests__/person-contact.db.test.ts +0 -563
  484. package/templates/database/__tests__/person-notes.db.test.ts +0 -249
  485. package/templates/database/__tests__/person.db.test.ts +0 -586
  486. package/templates/database/__tests__/piece-kind-migration.test.ts +0 -67
  487. package/templates/database/__tests__/piece-kind.db.test.ts +0 -208
  488. package/templates/database/__tests__/prefixed-ids.db.test.ts +0 -222
  489. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +0 -111
  490. package/templates/database/__tests__/seed.test.ts +0 -240
  491. package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
  492. package/templates/database/__tests__/tenancy.test.ts +0 -141
  493. package/templates/database/__tests__/user-cascade.test.ts +0 -140
  494. package/templates/database/_gitignore +0 -8
  495. package/templates/database/auth/.gitkeep +0 -0
  496. package/templates/database/auth/schema.prisma +0 -641
  497. package/templates/database/config/.gitkeep +0 -0
  498. package/templates/database/config/schema.prisma +0 -441
  499. package/templates/database/content/.gitkeep +0 -0
  500. package/templates/database/content/schema.prisma +0 -339
  501. package/templates/database/eslint.config.mjs +0 -69
  502. package/templates/database/flows/listing-diagnostic.ts +0 -182
  503. package/templates/database/flows/presets.ts +0 -315
  504. package/templates/database/inbox/.gitkeep +0 -0
  505. package/templates/database/inbox/README.md +0 -3
  506. package/templates/database/inbox/__tests__/schema.test.ts +0 -44
  507. package/templates/database/inbox/schema.prisma +0 -1447
  508. package/templates/database/jest.config.cjs +0 -36
  509. package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +0 -328
  510. package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +0 -100
  511. package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +0 -28
  512. package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +0 -25
  513. package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +0 -42
  514. package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +0 -67
  515. package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +0 -21
  516. package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +0 -201
  517. package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +0 -67
  518. package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +0 -46
  519. package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +0 -25
  520. package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +0 -49
  521. package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +0 -197
  522. package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +0 -32
  523. package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +0 -22
  524. package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +0 -151
  525. package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +0 -223
  526. package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +0 -22
  527. package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +0 -32
  528. package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +0 -40
  529. package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +0 -4
  530. package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +0 -2
  531. package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +0 -2
  532. package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +0 -29
  533. package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +0 -6
  534. package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +0 -39
  535. package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +0 -24
  536. package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +0 -3
  537. package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +0 -33
  538. package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +0 -30
  539. package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +0 -47
  540. package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +0 -16
  541. package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +0 -47
  542. package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +0 -10
  543. package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +0 -26
  544. package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +0 -90
  545. package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +0 -174
  546. package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +0 -14
  547. package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +0 -25
  548. package/templates/database/migrations/20260911140000_listing_structured_address/migration.sql +0 -32
  549. package/templates/database/migrations/20260911180000_consent_grants/migration.sql +0 -71
  550. package/templates/database/migrations/20260911200000_listing_site_answers/migration.sql +0 -30
  551. package/templates/database/migrations/20260912120000_listing_owner_link/migration.sql +0 -49
  552. package/templates/database/migrations/20260914120000_listing_founder_identity/migration.sql +0 -123
  553. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +0 -15
  554. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +0 -158
  555. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +0 -40
  556. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +0 -67
  557. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +0 -70
  558. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +0 -181
  559. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +0 -172
  560. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +0 -41
  561. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +0 -185
  562. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +0 -70
  563. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +0 -57
  564. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +0 -68
  565. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +0 -1067
  566. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +0 -210
  567. package/templates/database/migrations/20261003120000_spoke_registry/migration.sql +0 -80
  568. package/templates/database/migrations/20261003130000_scheduling_connection/migration.sql +0 -49
  569. package/templates/database/migrations/20261005120000_agents/migration.sql +0 -84
  570. package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +0 -35
  571. package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +0 -20
  572. package/templates/database/migrations/20261009120000_agent_grants/migration.sql +0 -33
  573. package/templates/database/migrations/20261010120000_person/migration.sql +0 -106
  574. package/templates/database/migrations/20261010121000_person_backfill/migration.sql +0 -132
  575. package/templates/database/migrations/20261010130000_agent_grants_people_read/migration.sql +0 -20
  576. package/templates/database/migrations/20261011120000_member_area/migration.sql +0 -158
  577. package/templates/database/migrations/20261011130000_agent_grants_member_pieces_manage/migration.sql +0 -21
  578. package/templates/database/migrations/20261012120000_member_contract/migration.sql +0 -192
  579. package/templates/database/migrations/20261013120000_lead_spoke_checkout/migration.sql +0 -20
  580. package/templates/database/migrations/20261014120000_consent_ledger/migration.sql +0 -122
  581. package/templates/database/migrations/20261014120000_person_contact/migration.sql +0 -231
  582. package/templates/database/migrations/20261015120000_person_notes/migration.sql +0 -77
  583. package/templates/database/migrations/20261015120000_rate_limit_counters/migration.sql +0 -43
  584. package/templates/database/migrations/20261016120000_piece_kind/migration.sql +0 -95
  585. package/templates/database/migrations/20261017120000_outbound_message_action/migration.sql +0 -30
  586. package/templates/database/migrations/20261018120000_flow_completion/migration.sql +0 -52
  587. package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +0 -27
  588. package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +0 -146
  589. package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +0 -77
  590. package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +0 -45
  591. package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +0 -47
  592. package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +0 -16
  593. package/templates/database/migrations/migration_lock.toml +0 -3
  594. package/templates/database/ops/.gitkeep +0 -0
  595. package/templates/database/ops/schema.prisma +0 -43
  596. package/templates/database/package.json +0 -89
  597. package/templates/database/schema.prisma +0 -71
  598. package/templates/database/scripts/db-generate-locked.sh +0 -80
  599. package/templates/database/scripts/person-backfill.sql +0 -132
  600. package/templates/database/tenancy.ts +0 -183
  601. package/templates/database/tsconfig.build.json +0 -16
  602. package/templates/database/tsconfig.flows.json +0 -15
  603. package/templates/database/tsconfig.json +0 -16
  604. 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.23.0",
3
+ "version": "0.25.1",
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.44.0",
32
- "@working-theory/templates": "0.44.0"
31
+ "@working-theory/schema": "0.46.0",
32
+ "@working-theory/templates": "0.46.0"
33
33
  },
34
34
  "repository": {
35
35
  "type": "git",
@@ -21,5 +21,5 @@
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,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
@@ -381,7 +381,7 @@ CONTENT_ADAPTER=mdx
381
381
 
382
382
  # ── E2E test-auth seam (pre-OSS — never set in production) ───────────────────
383
383
  # 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
384
+ # (packages/api/src/routes/test/auth/session.ts) so an e2e harness can mint a
385
385
  # Better Auth session for a seeded test user WITHOUT going through Google
386
386
  # OAuth, GitHub OAuth, or magic-link email.
387
387
  #
@@ -396,7 +396,7 @@ CONTENT_ADAPTER=mdx
396
396
  #
397
397
  # Allowlist format: comma-separated user IDs (exact-match strings; no regex,
398
398
  # no wildcard). Empty entries between commas are trimmed.
399
- # Run `pnpm --filter @working-theory/database db:seed:test` to seed three test users
399
+ # Run `pnpm db:seed:test` to seed three test users
400
400
  # (user_00000000-0000-7000-8000-0000000000e1 / …e2 / …e3 — reserved-range
401
401
  # prefixed ids per ADR-0031, distinguished by the Better Auth `role` field).
402
402
  # The seed script itself refuses to run unless
@@ -446,6 +446,10 @@ CONTENT_ADAPTER=mdx
446
446
  # that database. Rotation and the rekey bin: apps/api/.env.example.
447
447
  # STRIPE_CONNECTION_KEY=
448
448
  # STRIPE_CONNECTION_KEY_PREVIOUS=
449
+ # The Organization that owns STRIPE_SECRET_KEY (#9285): with the multi-tenant
450
+ # module only the Organization whose id is named here sells through it; unset
451
+ # means nobody. Without the module the single Organization owns it.
452
+ # STRIPE_ENV_ORGANIZATION_ID=
449
453
  # HMAC-SHA256 key POST /v1/webhooks/calcom verifies the x-cal-signature-256
450
454
  # header against (#6085). Unset makes the receiver answer 503 and accept
451
455
  # nothing — the same fail-closed posture an unset STRIPE_WEBHOOK_SECRET has.
@@ -529,7 +533,7 @@ CONTENT_ADAPTER=mdx
529
533
  # pre-#5040 in-process Map, which does not. Default: `database` when
530
534
  # DATABASE_URL is set, else `memory`. A database failure or a 1s-slow call
531
535
  # falls back to the in-process Map for that request rather than letting it
532
- # through uncounted. Run `pnpm --filter @working-theory/api rate-limit:probe
536
+ # through uncounted. Run `pnpm --filter @working-theory/app-api rate-limit:probe
533
537
  # --origin <https origin>` against a live deployment to check which store it
534
538
  # selected and whether a burst holds — see
535
539
  # docs/runbooks/site-configuration.md.
@@ -543,7 +547,7 @@ CONTENT_ADAPTER=mdx
543
547
  #
544
548
  # Hub and spokes — a spoke's reads and writes resolve to ITS OWN workspace
545
549
  # (#7532). A hub holding one workspace per spoke registers each spoke in its
546
- # database (`pnpm --filter @working-theory/api spokes register --workspace
550
+ # database (`pnpm --filter @working-theory/app-api spokes register --workspace
547
551
  # <wksp_id> --name <label>`), which prints the spoke's key once. The spoke
548
552
  # sends it on every server-side call, and the hub resolves meeting types, the
549
553
  # 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,14 +19,20 @@ 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)
26
26
  ```
27
27
 
28
- You consume `@working-theory/*` packages from npm. Treat each one as a
29
- third-party dependency: read its README or its types, not its source.
28
+ You consume `@working-theory/*` packages from npm: read a README or types,
29
+ not the source. Build on one by composing, wrapping or configuring it via
30
+ its documented extension points. Never copy it out of `node_modules`, fork,
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.
30
36
  <!-- /ailk:template id="repo-shape" -->
31
37
 
32
38
  <!-- ailk:template id="architecture" -->
@@ -121,6 +127,12 @@ For design work, the third-party impeccable plugin is optional:
121
127
  | `pnpm test` | Failing unit tests |
122
128
  | `/ailk:check-site` skill | Missing or invalid JSON-LD, weak citation-readiness |
123
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
+
124
136
  <!-- /ailk:template id="checks" -->
125
137
 
126
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).
@@ -33,7 +33,7 @@ pnpm preflight # architecture + CLAUDE.md drift + types + lint + build
33
33
  pnpm build # production build
34
34
  ```
35
35
 
36
- > Requires Node.js 20+ and `pnpm` — that is the whole prerequisite list. No database is needed to run or build this site (see [When you need a database](#when-you-need-a-database)), and no vendor API keys are required for first boot — Stripe, auth and email-provider integrations are opt-in. `pnpm install` generates the Prisma client for you; there is no generator step to remember.
36
+ > Requires Node.js 20+ and `pnpm` — that is the whole prerequisite list. No database is needed to run or build this site (see [When you need a database](#when-you-need-a-database)), and no vendor API keys are required for first boot — Stripe, auth and email-provider integrations are opt-in. The Prisma client ships prebuilt in `@working-theory/database`; there is no generator step to remember.
37
37
 
38
38
  ## Content
39
39
 
@@ -131,7 +131,7 @@ Set `AILK_PUBLIC_DOMAIN` to your own domain. `STEALTH=true` keeps a fresh deploy
131
131
 
132
132
  ## When you need a database
133
133
 
134
- **A free marketing site needs no database at all.** `pnpm install`, `pnpm dev` and `pnpm build` all run green on an empty machine with no Postgres, no `DATABASE_URL` and no `.env` — the pages render from `content/*.mdx`, and the Prisma client is generated for you by `database`'s `postinstall` so the workspace type-checks and builds either way.
134
+ **A free marketing site needs no database at all.** `pnpm install`, `pnpm dev` and `pnpm build` all run green on an empty machine with no Postgres, no `DATABASE_URL` and no `.env` — the pages render from `content/*.mdx`, and the Prisma client ships prebuilt in `@working-theory/database` so the workspace type-checks and builds either way.
135
135
 
136
136
  You need Postgres once you turn on one of these:
137
137
 
@@ -208,16 +208,17 @@ The AI Launch Kit skills come from the `ailk` Claude Code plugin; `.claude/setti
208
208
 
209
209
  <!-- generated:begin skills -->
210
210
 
211
- | Skill | What it does |
212
- | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
213
- | `/ailk:add-auth` | Activate the site's sign-in providers (email-and-password, Google OAuth, GitHub OAuth) and write the env vars for the ones you pick. |
214
- | `/ailk:add-page` | Add a new page — its content file, its structured data and its nav link — in one confirm-before-write pass. |
215
- | `/ailk:check-site` | Run `ailk-audit` on the site and explain the score and findings in plain language. It never edits files. |
216
- | `/ailk:fill-page` | Fill one existing page's section content from a category profile: labelled sample content, or your own first draft from a short intake. |
217
- | `/ailk:setup-database` | Take the site from no database to a working lead inbox, and prove it with one test message that must appear in the inbox. |
218
- | `/ailk:setup-deploy` | Emit deploy configuration — `vercel.json` and `RUNBOOK.md`, plus an env checklist read from the site's own `.env.example`. |
219
- | `/ailk:update-page` | Rename a page — its URL, its title, or both — in one plan-then-confirm pass, with a permanent redirect from the old URL. |
220
- | `/ailk:upgrade-plan` | Explain the AI Launch Kit options side by side, recommend one option for this site, and link the public pricing page for prices. |
211
+ | Skill | What it does |
212
+ | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
213
+ | `/ailk:add-auth` | Activate the site's sign-in providers (email-and-password, Google OAuth, GitHub OAuth) and write the env vars for the ones you pick. |
214
+ | `/ailk:add-page` | Add a new page — its content file, its structured data and its nav link — in one confirm-before-write pass. |
215
+ | `/ailk:check-site` | Run `ailk-audit` on the site and explain the score and findings in plain language. It never edits files. |
216
+ | `/ailk:extend-site` | Explain the five ways this site may be extended, walk you to the right one, and record a site-authored file in `customizations.yaml` with its build-in decision. |
217
+ | `/ailk:fill-page` | Fill one existing page's section content from a category profile: labelled sample content, or your own first draft from a short intake. |
218
+ | `/ailk:setup-database` | Take the site from no database to a working lead inbox, and prove it with one test message that must appear in the inbox. |
219
+ | `/ailk:setup-deploy` | Emit deploy configuration — `vercel.json` and `RUNBOOK.md`, plus an env checklist read from the site's own `.env.example`. |
220
+ | `/ailk:update-page` | Rename a page — its URL, its title, or both — in one plan-then-confirm pass, with a permanent redirect from the old URL. |
221
+ | `/ailk:upgrade-plan` | Explain the AI Launch Kit options side by side, recommend one option for this site, and link the public pricing page for prices. |
221
222
 
222
223
  <!-- generated:end -->
223
224
 
@@ -225,7 +226,7 @@ The AI Launch Kit skills come from the `ailk` Claude Code plugin; `.claude/setti
225
226
 
226
227
  This is your code — `{{PROJECT_NAME}}`, owned by {{COMPANY_NAME}} ({{COMPANY_DOMAIN}}). The root `package.json`'s `license` field ships set to `UNLICENSED` as a neutral placeholder; it's yours to change to whatever license suits your project (or to remove entirely if the repo is private).
227
228
 
228
- The `LICENSE` files under `apps/*/` and `database/` are the exception — they stay **Apache 2.0** because those directories are snapshots of `@working-theory/*` packages' own source, not code you authored.
229
+ The `LICENSE` files under `apps/*/` are the exception — they stay **Apache 2.0** because those directories are snapshots of `@working-theory/*` packages' own source, not code you authored.
229
230
 
230
231
  The AI Launch Kit framework upstream is **Apache 2.0** — see <https://github.com/working-theory-labs/ai-launch-kit/blob/main/LICENSE>. Contributions are welcome at the upstream repo; start with the [contributing guide](https://github.com/working-theory-labs/ai-launch-kit/blob/main/CONTRIBUTING.md).
231
232
 
@@ -31,7 +31,7 @@ DATABASE_URL="postgresql://user:password@localhost:5432/customer_template"
31
31
  # =============================================================================
32
32
  # Stripe (Optional)
33
33
  # =============================================================================
34
- # Consumed by apps/api/src/lib/stripe.ts via @working-theory/stripe-client wrapper.
34
+ # Consumed by packages/api/src/lib/stripe.ts via @working-theory/stripe-client wrapper.
35
35
  # Use sandbox keys only — live-mode keys are rejected at runtime, unless
36
36
  # STRIPE_MODE=live below admits a restricted live key (#8450).
37
37
  STRIPE_SECRET_KEY=sk_test_xxx
@@ -115,7 +115,7 @@ STRIPE_WEBHOOK_SECRET=whsec_xxx
115
115
  # ROTATION. Set STRIPE_CONNECTION_KEY_PREVIOUS to the old key and
116
116
  # STRIPE_CONNECTION_KEY to a new one, redeploy, run
117
117
  # `node dist/bin/stripe-connections-rekey.js` (dev:
118
- # `pnpm --filter @working-theory/api stripe-connections:rekey`) with the
118
+ # `pnpm --filter @working-theory/app-api stripe-connections:rekey`) with the
119
119
  # production environment (VERCEL_ENV=production, or NODE_ENV=production off
120
120
  # Vercel) — anywhere else it prints `not_production` and touches nothing —
121
121
  # and unset _PREVIOUS once it prints `remaining=0`. A row it counts `unreadable`
@@ -125,6 +125,13 @@ STRIPE_WEBHOOK_SECRET=whsec_xxx
125
125
  # STRIPE_CONNECTION_KEY=
126
126
  # STRIPE_CONNECTION_KEY_PREVIOUS=
127
127
  #
128
+ # The Organization that owns STRIPE_SECRET_KEY (#9285). On a deployment with
129
+ # the multi-tenant module, only the Organization whose id is named here sees
130
+ # that key as its Stripe connection and sells its Offerings through it; unset,
131
+ # blank or naming no Organization, nobody owns it. Without the multi-tenant
132
+ # module the deployment's single Organization owns it and this is not read.
133
+ # STRIPE_ENV_ORGANIZATION_ID=
134
+ #
128
135
  # The booking webhook receiver (#6085) — a SEPARATE credential from the
129
136
  # three above: it verifies POST /v1/webhooks/calcom's x-cal-signature-256
130
137
  # header, it does not call the provider. Unset makes the receiver answer 503