create-ailk 0.24.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 (599) hide show
  1. package/README.md +42 -20
  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 +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/module-architecture.d.ts +20 -3
  20. package/dist/module-architecture.js +117 -550
  21. package/dist/paid-sections.d.ts +25 -1
  22. package/dist/paid-sections.js +88 -3
  23. package/dist/surfaces.js +10 -2
  24. package/dist/template-record.d.ts +14 -4
  25. package/dist/template-record.js +23 -5
  26. package/dist/topology.d.ts +16 -3
  27. package/dist/topology.js +31 -19
  28. package/dist/update.d.ts +10 -1
  29. package/dist/update.js +540 -16
  30. package/package.json +3 -3
  31. package/release-scope.json +1 -1
  32. package/templates/.claude/cloudparity-repo-hooks.json +5 -0
  33. package/templates/.claude/hooks/template-guard.sh +137 -0
  34. package/templates/.claude/rules/extending.md +106 -0
  35. package/templates/.claude/rules/loop-contract.md +2 -2
  36. package/templates/.claude/settings.json +11 -0
  37. package/templates/.env.example +5 -5
  38. package/templates/.github/workflows/ci.yml +7 -4
  39. package/templates/CLAUDE.md +11 -1
  40. package/templates/CONVENTIONS.md +8 -10
  41. package/templates/README.md +14 -13
  42. package/templates/apps/api/.env.example +2 -2
  43. package/templates/apps/api/CLAUDE.md +102 -76
  44. package/templates/apps/api/jest.config.cjs +15 -5
  45. package/templates/apps/api/package.json +16 -20
  46. package/templates/apps/api/src/__tests__/trusted-origins.server.test.ts +2 -2
  47. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +4 -4
  48. package/templates/apps/api/src/index.ts +1 -1
  49. package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -3
  50. package/templates/apps/api/src/modules/commerce.ts +10 -0
  51. package/templates/apps/api/src/modules/content-write.ts +10 -0
  52. package/templates/apps/api/src/modules/multi-tenant.ts +10 -0
  53. package/templates/apps/api/src/modules/scheduling.ts +10 -0
  54. package/templates/apps/api/src/modules/signal-collectors.ts +10 -0
  55. package/templates/apps/api/src/modules/workspace.ts +10 -0
  56. package/templates/apps/api/src/server.ts +117 -1882
  57. package/templates/apps/api/vercel.json +2 -2
  58. package/templates/apps/mcp/CLAUDE.md +67 -20
  59. package/templates/apps/mcp/__tests__/app-entry.test.ts +4 -254
  60. package/templates/apps/mcp/__tests__/boot-file.test.ts +92 -0
  61. package/templates/apps/mcp/jest.config.cjs +6 -1
  62. package/templates/apps/mcp/package.json +5 -13
  63. package/templates/apps/mcp/src/app.ts +8 -7
  64. package/templates/apps/mcp/src/index.ts +6 -34
  65. package/templates/apps/mcp/src/lib/paid-tools.generated.ts +10 -0
  66. package/templates/apps/mcp/src/lib/topology.generated.ts +2 -2
  67. package/templates/apps/mcp/src/site.ts +12 -0
  68. package/templates/apps/web/.env.example +1 -1
  69. package/templates/apps/web/CLAUDE.md +10 -3
  70. package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
  71. package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
  72. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +22 -1
  73. package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +7 -3
  74. package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +43 -0
  75. package/templates/apps/web/app/[locale]/pricing/page.tsx +7 -3
  76. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/__tests__/route.test.ts +222 -0
  77. package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +10 -3
  78. package/templates/apps/web/app/api/revalidate/route.ts +3 -3
  79. package/templates/apps/web/auth.ts +2 -2
  80. package/templates/apps/web/jest.config.cjs +1 -0
  81. package/templates/apps/web/lib/auth-email.ts +1 -1
  82. package/templates/apps/web/lib/relay.ts +2 -2
  83. package/templates/apps/web/lib/release-scope.ts +47 -0
  84. package/templates/apps/web/lib/server-api.ts +1 -1
  85. package/templates/apps/web/src/lib/commerce-claim.ts +1 -1
  86. package/templates/customizations.yaml +37 -0
  87. package/templates/database/prisma.config.ts +10 -14
  88. package/templates/database/seed-test.ts +2 -2
  89. package/templates/database/seed.ts +5 -5
  90. package/templates/package.json +12 -6
  91. package/templates/pnpm-workspace.yaml +0 -1
  92. package/templates/project.yaml +16 -8
  93. package/templates/tools/jest/reporters.cjs +65 -0
  94. package/templates/tools/lint-architecture.ts +553 -7
  95. package/templates/tsconfig.json +1 -2
  96. package/versions.json +48 -35
  97. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +0 -409
  98. package/templates/apps/api/src/__tests__/factories/agent-caller.ts +0 -102
  99. package/templates/apps/api/src/__tests__/factories/content-fixture.ts +0 -138
  100. package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +0 -441
  101. package/templates/apps/api/src/__tests__/factories/index.ts +0 -70
  102. package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +0 -82
  103. package/templates/apps/api/src/__tests__/leads-forwarded-rate-limit.test.ts +0 -135
  104. package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +0 -126
  105. package/templates/apps/api/src/__tests__/stripe-boot.test.ts +0 -132
  106. package/templates/apps/api/src/__tests__/support/hub-sign-in-fake-db.ts +0 -362
  107. package/templates/apps/api/src/bin/__tests__/rate-limit-probe.test.ts +0 -184
  108. package/templates/apps/api/src/bin/abandon-sweep.ts +0 -42
  109. package/templates/apps/api/src/bin/rate-limit-probe.ts +0 -53
  110. package/templates/apps/api/src/bin/spokes.ts +0 -198
  111. package/templates/apps/api/src/bin/stripe-connections-rekey.ts +0 -45
  112. package/templates/apps/api/src/config/__tests__/hub-require-spoke-key.test.ts +0 -196
  113. package/templates/apps/api/src/config/__tests__/index.test.ts +0 -233
  114. package/templates/apps/api/src/config/__tests__/modules.test.ts +0 -76
  115. package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +0 -185
  116. package/templates/apps/api/src/config/__tests__/trusted-origins.test.ts +0 -238
  117. package/templates/apps/api/src/config/index.ts +0 -596
  118. package/templates/apps/api/src/config/modules.ts +0 -83
  119. package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +0 -581
  120. package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +0 -143
  121. package/templates/apps/api/src/lib/__tests__/consent-ledger-double.ts +0 -237
  122. package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +0 -353
  123. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +0 -201
  124. package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +0 -224
  125. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +0 -120
  126. package/templates/apps/api/src/lib/__tests__/errors.test.ts +0 -94
  127. package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +0 -144
  128. package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +0 -8
  129. package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +0 -149
  130. package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +0 -116
  131. package/templates/apps/api/src/lib/__tests__/hub-sign-in-store.test.ts +0 -209
  132. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +0 -257
  133. package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +0 -96
  134. package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +0 -125
  135. package/templates/apps/api/src/lib/__tests__/prisma.test.ts +0 -165
  136. package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +0 -317
  137. package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +0 -129
  138. package/templates/apps/api/src/lib/__tests__/site.test.ts +0 -308
  139. package/templates/apps/api/src/lib/__tests__/slice-load.test.ts +0 -89
  140. package/templates/apps/api/src/lib/__tests__/spoke-store.test.ts +0 -202
  141. package/templates/apps/api/src/lib/__tests__/stripe-admission.test.ts +0 -217
  142. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +0 -82
  143. package/templates/apps/api/src/lib/agent-store.ts +0 -613
  144. package/templates/apps/api/src/lib/auth-email-budget.ts +0 -161
  145. package/templates/apps/api/src/lib/consent-store.ts +0 -363
  146. package/templates/apps/api/src/lib/content-adapter.ts +0 -112
  147. package/templates/apps/api/src/lib/deliverable-asset-store.ts +0 -96
  148. package/templates/apps/api/src/lib/error-serializer.ts +0 -164
  149. package/templates/apps/api/src/lib/errors.ts +0 -95
  150. package/templates/apps/api/src/lib/file-fallback.ts +0 -87
  151. package/templates/apps/api/src/lib/flow-completion-store.ts +0 -136
  152. package/templates/apps/api/src/lib/hub-sign-in-store.ts +0 -455
  153. package/templates/apps/api/src/lib/lead-capture-store.ts +0 -122
  154. package/templates/apps/api/src/lib/lead-delivery.ts +0 -52
  155. package/templates/apps/api/src/lib/license-key-store.ts +0 -45
  156. package/templates/apps/api/src/lib/locales.ts +0 -201
  157. package/templates/apps/api/src/lib/outbound-http.ts +0 -127
  158. package/templates/apps/api/src/lib/prisma.ts +0 -21
  159. package/templates/apps/api/src/lib/proposal-paid-store.ts +0 -66
  160. package/templates/apps/api/src/lib/rate-limit-probe.ts +0 -165
  161. package/templates/apps/api/src/lib/rate-limit-store.ts +0 -142
  162. package/templates/apps/api/src/lib/require-commerce-claim.ts +0 -250
  163. package/templates/apps/api/src/lib/require-paid-tier.ts +0 -53
  164. package/templates/apps/api/src/lib/site.ts +0 -257
  165. package/templates/apps/api/src/lib/slice-load.ts +0 -90
  166. package/templates/apps/api/src/lib/spoke-store.ts +0 -180
  167. package/templates/apps/api/src/lib/stripe.ts +0 -321
  168. package/templates/apps/api/src/lib/webhook-idempotency.ts +0 -156
  169. package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +0 -111
  170. package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +0 -172
  171. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +0 -119
  172. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +0 -138
  173. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-trusted-origins.test.ts +0 -142
  174. package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +0 -155
  175. package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +0 -139
  176. package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +0 -562
  177. package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +0 -76
  178. package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +0 -220
  179. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +0 -97
  180. package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +0 -557
  181. package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +0 -72
  182. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +0 -140
  183. package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +0 -721
  184. package/templates/apps/api/src/middleware/__tests__/rate-limit-cross-isolate.db.test.ts +0 -220
  185. package/templates/apps/api/src/middleware/__tests__/rate-limit-store.test.ts +0 -430
  186. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +0 -1409
  187. package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +0 -174
  188. package/templates/apps/api/src/middleware/auth.ts +0 -864
  189. package/templates/apps/api/src/middleware/default-tenant.ts +0 -166
  190. package/templates/apps/api/src/middleware/rate-limit.ts +0 -983
  191. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +0 -391
  192. package/templates/apps/api/src/openapi/__tests__/spec-identity.test.ts +0 -182
  193. package/templates/apps/api/src/openapi/index.ts +0 -18
  194. package/templates/apps/api/src/openapi/spec.ts +0 -2148
  195. package/templates/apps/api/src/openapi/surface-drift.ts +0 -195
  196. package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +0 -175
  197. package/templates/apps/api/src/routes/aeo/index.ts +0 -107
  198. package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +0 -196
  199. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +0 -249
  200. package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +0 -532
  201. package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +0 -313
  202. package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +0 -413
  203. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +0 -609
  204. package/templates/apps/api/src/routes/auth/hub-sign-in.ts +0 -242
  205. package/templates/apps/api/src/routes/auth/tokens.ts +0 -211
  206. package/templates/apps/api/src/routes/auth/transactional-email.ts +0 -301
  207. package/templates/apps/api/src/routes/auth/user.ts +0 -305
  208. package/templates/apps/api/src/routes/billing/plan-checkout.ts +0 -332
  209. package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +0 -178
  210. package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +0 -1426
  211. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +0 -448
  212. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +0 -1742
  213. package/templates/apps/api/src/routes/checkout/index.ts +0 -34
  214. package/templates/apps/api/src/routes/checkout/session.ts +0 -171
  215. package/templates/apps/api/src/routes/checkout/sessions.ts +0 -540
  216. package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +0 -386
  217. package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +0 -160
  218. package/templates/apps/api/src/routes/consent/account.ts +0 -268
  219. package/templates/apps/api/src/routes/consent/cookie.ts +0 -90
  220. package/templates/apps/api/src/routes/consent/index.ts +0 -26
  221. package/templates/apps/api/src/routes/consent/unsubscribe.ts +0 -127
  222. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +0 -853
  223. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +0 -230
  224. package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +0 -44
  225. package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +0 -118
  226. package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +0 -731
  227. package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +0 -753
  228. package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +0 -51
  229. package/templates/apps/api/src/routes/content/__tests__/search.test.ts +0 -450
  230. package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +0 -762
  231. package/templates/apps/api/src/routes/content/get-page.ts +0 -183
  232. package/templates/apps/api/src/routes/content/index.ts +0 -49
  233. package/templates/apps/api/src/routes/content/list-pages.ts +0 -74
  234. package/templates/apps/api/src/routes/content/list-types.ts +0 -19
  235. package/templates/apps/api/src/routes/content/offerings.ts +0 -184
  236. package/templates/apps/api/src/routes/content/pricing.ts +0 -176
  237. package/templates/apps/api/src/routes/content/rate-limit.ts +0 -22
  238. package/templates/apps/api/src/routes/content/search.ts +0 -100
  239. package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
  240. package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +0 -88
  241. package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +0 -171
  242. package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +0 -515
  243. package/templates/apps/api/src/routes/leads/__tests__/spoke.test.ts +0 -392
  244. package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +0 -165
  245. package/templates/apps/api/src/routes/leads/index.ts +0 -639
  246. package/templates/apps/api/src/routes/leads/list.ts +0 -104
  247. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +0 -626
  248. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +0 -1268
  249. package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +0 -847
  250. package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +0 -491
  251. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -476
  252. package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +0 -872
  253. package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +0 -1022
  254. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +0 -484
  255. package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +0 -535
  256. package/templates/apps/api/src/routes/project-listings/index.ts +0 -164
  257. package/templates/apps/api/src/routes/project-listings/me.ts +0 -87
  258. package/templates/apps/api/src/routes/project-listings/patch-copy.ts +0 -224
  259. package/templates/apps/api/src/routes/project-listings/patch-draft.ts +0 -102
  260. package/templates/apps/api/src/routes/project-listings/public.ts +0 -98
  261. package/templates/apps/api/src/routes/project-listings/respond.ts +0 -48
  262. package/templates/apps/api/src/routes/project-listings/resume-token.ts +0 -27
  263. package/templates/apps/api/src/routes/project-listings/start.ts +0 -140
  264. package/templates/apps/api/src/routes/project-listings/submit.ts +0 -130
  265. package/templates/apps/api/src/routes/project-listings/verify-email.ts +0 -150
  266. package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +0 -686
  267. package/templates/apps/api/src/routes/requests/confirm.ts +0 -601
  268. package/templates/apps/api/src/routes/requests/index.ts +0 -54
  269. package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +0 -306
  270. package/templates/apps/api/src/routes/test/auth/session.ts +0 -143
  271. package/templates/apps/api/src/routes/webhooks/README.md +0 -398
  272. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +0 -649
  273. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +0 -749
  274. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +0 -449
  275. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +0 -264
  276. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode-live.test.ts +0 -159
  277. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode.test.ts +0 -158
  278. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +0 -814
  279. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +0 -301
  280. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-proposal-paid.test.ts +0 -369
  281. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +0 -215
  282. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +0 -301
  283. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +0 -809
  284. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +0 -1155
  285. package/templates/apps/api/src/routes/webhooks/index.ts +0 -141
  286. package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +0 -384
  287. package/templates/apps/api/src/routes/webhooks/stripe.ts +0 -2028
  288. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -645
  289. package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +0 -132
  290. package/templates/apps/api/src/services/__tests__/audit-log.test.ts +0 -1028
  291. package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +0 -313
  292. package/templates/apps/api/src/services/__tests__/consent-ledger.test.ts +0 -503
  293. package/templates/apps/api/src/services/__tests__/consent-migration.test.ts +0 -65
  294. package/templates/apps/api/src/services/__tests__/consent.test.ts +0 -299
  295. package/templates/apps/api/src/services/__tests__/default-tenant.test.ts +0 -147
  296. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +0 -877
  297. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +0 -379
  298. package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +0 -368
  299. package/templates/apps/api/src/services/__tests__/entitlements.test.ts +0 -142
  300. package/templates/apps/api/src/services/__tests__/hub-sign-in.test.ts +0 -854
  301. package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +0 -234
  302. package/templates/apps/api/src/services/__tests__/lead-accept-user.test.ts +0 -251
  303. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +0 -2660
  304. package/templates/apps/api/src/services/__tests__/listing-config.test.ts +0 -166
  305. package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +0 -389
  306. package/templates/apps/api/src/services/__tests__/person.test.ts +0 -1204
  307. package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -450
  308. package/templates/apps/api/src/services/__tests__/project-listings.counts.test.ts +0 -202
  309. package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -151
  310. package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +0 -137
  311. package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +0 -531
  312. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +0 -372
  313. package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +0 -348
  314. package/templates/apps/api/src/services/__tests__/spoke-resolution.test.ts +0 -660
  315. package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +0 -941
  316. package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +0 -588
  317. package/templates/apps/api/src/services/__tests__/verified-email.test.ts +0 -78
  318. package/templates/apps/api/src/services/abandon-email.ts +0 -336
  319. package/templates/apps/api/src/services/aeo-score.ts +0 -325
  320. package/templates/apps/api/src/services/answer-distributions.ts +0 -138
  321. package/templates/apps/api/src/services/audit-log.ts +0 -961
  322. package/templates/apps/api/src/services/checkout-buyer.ts +0 -168
  323. package/templates/apps/api/src/services/consent.ts +0 -834
  324. package/templates/apps/api/src/services/default-tenant.ts +0 -416
  325. package/templates/apps/api/src/services/deliverable-fulfillment.ts +0 -750
  326. package/templates/apps/api/src/services/dunning-policy.ts +0 -294
  327. package/templates/apps/api/src/services/enrichment-shim.ts +0 -53
  328. package/templates/apps/api/src/services/entitlements.ts +0 -338
  329. package/templates/apps/api/src/services/hub-sign-in.ts +0 -472
  330. package/templates/apps/api/src/services/lead-accept-user.ts +0 -126
  331. package/templates/apps/api/src/services/lead-promotion.ts +0 -160
  332. package/templates/apps/api/src/services/lead-routing.ts +0 -1372
  333. package/templates/apps/api/src/services/leads-inbox.ts +0 -312
  334. package/templates/apps/api/src/services/listing-config.ts +0 -178
  335. package/templates/apps/api/src/services/magnet-completion.ts +0 -242
  336. package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +0 -348
  337. package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +0 -268
  338. package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +0 -975
  339. package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +0 -416
  340. package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +0 -400
  341. package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -685
  342. package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
  343. package/templates/apps/api/src/services/offerings/catalog.ts +0 -318
  344. package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -403
  345. package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
  346. package/templates/apps/api/src/services/offerings/connection.ts +0 -1083
  347. package/templates/apps/api/src/services/offerings/index.ts +0 -614
  348. package/templates/apps/api/src/services/offerings/source.ts +0 -140
  349. package/templates/apps/api/src/services/offerings/store.ts +0 -150
  350. package/templates/apps/api/src/services/owner-workspaces.ts +0 -132
  351. package/templates/apps/api/src/services/person.ts +0 -1211
  352. package/templates/apps/api/src/services/plan-offerings.ts +0 -125
  353. package/templates/apps/api/src/services/project-listing-resume-email.ts +0 -326
  354. package/templates/apps/api/src/services/project-listings.ts +0 -2085
  355. package/templates/apps/api/src/services/public-site-resolver.ts +0 -396
  356. package/templates/apps/api/src/services/request-confirm.ts +0 -698
  357. package/templates/apps/api/src/services/revalidation.ts +0 -235
  358. package/templates/apps/api/src/services/slack-notify.ts +0 -291
  359. package/templates/apps/api/src/services/usage-aggregation.ts +0 -516
  360. package/templates/apps/api/src/services/usage-credits.ts +0 -340
  361. package/templates/apps/api/src/services/verified-email.ts +0 -71
  362. package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +0 -52
  363. package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +0 -46
  364. package/templates/apps/mcp/__tests__/abuse/guard.test.ts +0 -198
  365. package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +0 -36
  366. package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +0 -54
  367. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +0 -116
  368. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +0 -299
  369. package/templates/apps/mcp/__tests__/boot.test.ts +0 -280
  370. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +0 -359
  371. package/templates/apps/mcp/__tests__/config/modules.test.ts +0 -78
  372. package/templates/apps/mcp/__tests__/get_business_hours.test.ts +0 -82
  373. package/templates/apps/mcp/__tests__/get_faq.test.ts +0 -80
  374. package/templates/apps/mcp/__tests__/get_locations.test.ts +0 -65
  375. package/templates/apps/mcp/__tests__/get_offerings.test.ts +0 -557
  376. package/templates/apps/mcp/__tests__/get_pricing.test.ts +0 -524
  377. package/templates/apps/mcp/__tests__/get_site_info.test.ts +0 -81
  378. package/templates/apps/mcp/__tests__/http-transport.test.ts +0 -1232
  379. package/templates/apps/mcp/__tests__/index.test.ts +0 -195
  380. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +0 -191
  381. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +0 -531
  382. package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +0 -70
  383. package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -162
  384. package/templates/apps/mcp/__tests__/lib/content-root.test.ts +0 -93
  385. package/templates/apps/mcp/__tests__/lib/errors.test.ts +0 -75
  386. package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +0 -180
  387. package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
  388. package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -268
  389. package/templates/apps/mcp/__tests__/locale.test.ts +0 -120
  390. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +0 -175
  391. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +0 -101
  392. package/templates/apps/mcp/__tests__/rate-limit-write.test.ts +0 -189
  393. package/templates/apps/mcp/__tests__/read_content.test.ts +0 -511
  394. package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -160
  395. package/templates/apps/mcp/__tests__/search_content.test.ts +0 -271
  396. package/templates/apps/mcp/__tests__/server.test.ts +0 -388
  397. package/templates/apps/mcp/__tests__/start_purchase.test.ts +0 -448
  398. package/templates/apps/mcp/__tests__/submit_lead.test.ts +0 -222
  399. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -152
  400. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +0 -243
  401. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +0 -451
  402. package/templates/apps/mcp/src/abuse/daily-cap.ts +0 -47
  403. package/templates/apps/mcp/src/abuse/email-validator.ts +0 -25
  404. package/templates/apps/mcp/src/abuse/honeypot.ts +0 -21
  405. package/templates/apps/mcp/src/abuse/index.ts +0 -349
  406. package/templates/apps/mcp/src/abuse/user-agent-deny.ts +0 -58
  407. package/templates/apps/mcp/src/boot.ts +0 -167
  408. package/templates/apps/mcp/src/config/modules.ts +0 -43
  409. package/templates/apps/mcp/src/http-transport.ts +0 -564
  410. package/templates/apps/mcp/src/lib/audit-single-page.ts +0 -308
  411. package/templates/apps/mcp/src/lib/commerce-claim.ts +0 -263
  412. package/templates/apps/mcp/src/lib/content-adapter.ts +0 -116
  413. package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -140
  414. package/templates/apps/mcp/src/lib/errors.ts +0 -61
  415. package/templates/apps/mcp/src/lib/license-key-store.ts +0 -45
  416. package/templates/apps/mcp/src/lib/locales.ts +0 -171
  417. package/templates/apps/mcp/src/lib/prisma.ts +0 -39
  418. package/templates/apps/mcp/src/lib/public-workspace.ts +0 -133
  419. package/templates/apps/mcp/src/lib/resolve-locale.ts +0 -30
  420. package/templates/apps/mcp/src/lib/shown-offerings.ts +0 -105
  421. package/templates/apps/mcp/src/lib/site-config.ts +0 -53
  422. package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +0 -59
  423. package/templates/apps/mcp/src/request-context.ts +0 -52
  424. package/templates/apps/mcp/src/server.ts +0 -343
  425. package/templates/apps/mcp/src/serverless-app.ts +0 -88
  426. package/templates/apps/mcp/src/tools/audit.ts +0 -127
  427. package/templates/apps/mcp/src/tools/capture_lead.ts +0 -66
  428. package/templates/apps/mcp/src/tools/create_project.ts +0 -134
  429. package/templates/apps/mcp/src/tools/get_business_hours.ts +0 -68
  430. package/templates/apps/mcp/src/tools/get_faq.ts +0 -71
  431. package/templates/apps/mcp/src/tools/get_locations.ts +0 -88
  432. package/templates/apps/mcp/src/tools/get_offerings.ts +0 -96
  433. package/templates/apps/mcp/src/tools/get_pricing.ts +0 -94
  434. package/templates/apps/mcp/src/tools/get_site_info.ts +0 -86
  435. package/templates/apps/mcp/src/tools/index.ts +0 -138
  436. package/templates/apps/mcp/src/tools/list_pages.ts +0 -68
  437. package/templates/apps/mcp/src/tools/person_notes.ts +0 -25
  438. package/templates/apps/mcp/src/tools/proposals.ts +0 -27
  439. package/templates/apps/mcp/src/tools/purchase.ts +0 -205
  440. package/templates/apps/mcp/src/tools/read_content.ts +0 -81
  441. package/templates/apps/mcp/src/tools/request_callback.ts +0 -52
  442. package/templates/apps/mcp/src/tools/search_content.ts +0 -63
  443. package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -54
  444. package/templates/apps/mcp/src/workspace-server.ts +0 -224
  445. package/templates/database/CHANGELOG.md +0 -981
  446. package/templates/database/LICENSE +0 -202
  447. package/templates/database/NOTICE +0 -2
  448. package/templates/database/README.md +0 -243
  449. package/templates/database/__tests__/agents.db.test.ts +0 -320
  450. package/templates/database/__tests__/appointment.db.test.ts +0 -106
  451. package/templates/database/__tests__/artifact-content-store.db.test.ts +0 -316
  452. package/templates/database/__tests__/composite-fence.db.test.ts +0 -206
  453. package/templates/database/__tests__/consent-ledger.db.test.ts +0 -345
  454. package/templates/database/__tests__/consent-source-checkout-migration.test.ts +0 -79
  455. package/templates/database/__tests__/fence-fan-out.db.test.ts +0 -715
  456. package/templates/database/__tests__/fixtures/appointment-create-probe.ts +0 -79
  457. package/templates/database/__tests__/fixtures/person-backfill.json +0 -264
  458. package/templates/database/__tests__/fixtures/person-contact-backfill.json +0 -182
  459. package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +0 -100
  460. package/templates/database/__tests__/flow-completion-migration.test.ts +0 -115
  461. package/templates/database/__tests__/flow-completion.db.test.ts +0 -136
  462. package/templates/database/__tests__/flow-workspace-key.db.test.ts +0 -263
  463. package/templates/database/__tests__/flows-listing-diagnostic.test.ts +0 -392
  464. package/templates/database/__tests__/flows-presets.test.ts +0 -173
  465. package/templates/database/__tests__/in-page-magnets-migration.test.ts +0 -161
  466. package/templates/database/__tests__/lead-idempotency-key.db.test.ts +0 -92
  467. package/templates/database/__tests__/member-area.db.test.ts +0 -257
  468. package/templates/database/__tests__/member-contract-migration.test.ts +0 -85
  469. package/templates/database/__tests__/member-contract.db.test.ts +0 -413
  470. package/templates/database/__tests__/offerings-checkout-session.db.test.ts +0 -270
  471. package/templates/database/__tests__/offerings-migration.test.ts +0 -197
  472. package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +0 -86
  473. package/templates/database/__tests__/offerings.db.test.ts +0 -303
  474. package/templates/database/__tests__/outbound-message-action.db.test.ts +0 -80
  475. package/templates/database/__tests__/person-contact.db.test.ts +0 -563
  476. package/templates/database/__tests__/person-notes.db.test.ts +0 -249
  477. package/templates/database/__tests__/person.db.test.ts +0 -586
  478. package/templates/database/__tests__/piece-kind-migration.test.ts +0 -67
  479. package/templates/database/__tests__/piece-kind.db.test.ts +0 -208
  480. package/templates/database/__tests__/prefixed-ids.db.test.ts +0 -222
  481. package/templates/database/__tests__/project-listing-consent-at.db.test.ts +0 -111
  482. package/templates/database/__tests__/seed.test.ts +0 -272
  483. package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
  484. package/templates/database/__tests__/tenancy.test.ts +0 -141
  485. package/templates/database/__tests__/trial-magnet-migration.test.ts +0 -186
  486. package/templates/database/__tests__/user-cascade.test.ts +0 -140
  487. package/templates/database/_gitignore +0 -8
  488. package/templates/database/auth/.gitkeep +0 -0
  489. package/templates/database/auth/schema.prisma +0 -641
  490. package/templates/database/config/.gitkeep +0 -0
  491. package/templates/database/config/schema.prisma +0 -441
  492. package/templates/database/content/.gitkeep +0 -0
  493. package/templates/database/content/schema.prisma +0 -339
  494. package/templates/database/eslint.config.mjs +0 -69
  495. package/templates/database/flows/listing-diagnostic.ts +0 -182
  496. package/templates/database/flows/presets.ts +0 -315
  497. package/templates/database/inbox/.gitkeep +0 -0
  498. package/templates/database/inbox/README.md +0 -3
  499. package/templates/database/inbox/__tests__/schema.test.ts +0 -44
  500. package/templates/database/inbox/schema.prisma +0 -1447
  501. package/templates/database/jest.config.cjs +0 -36
  502. package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +0 -328
  503. package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +0 -100
  504. package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +0 -28
  505. package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +0 -25
  506. package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +0 -42
  507. package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +0 -67
  508. package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +0 -21
  509. package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +0 -201
  510. package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +0 -67
  511. package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +0 -46
  512. package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +0 -25
  513. package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +0 -49
  514. package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +0 -197
  515. package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +0 -32
  516. package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +0 -22
  517. package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +0 -151
  518. package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +0 -223
  519. package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +0 -22
  520. package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +0 -32
  521. package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +0 -40
  522. package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +0 -4
  523. package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +0 -2
  524. package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +0 -2
  525. package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +0 -29
  526. package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +0 -6
  527. package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +0 -39
  528. package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +0 -24
  529. package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +0 -3
  530. package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +0 -33
  531. package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +0 -30
  532. package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +0 -47
  533. package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +0 -16
  534. package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +0 -47
  535. package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +0 -10
  536. package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +0 -26
  537. package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +0 -90
  538. package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +0 -174
  539. package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +0 -14
  540. package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +0 -25
  541. package/templates/database/migrations/20260911140000_listing_structured_address/migration.sql +0 -32
  542. package/templates/database/migrations/20260911180000_consent_grants/migration.sql +0 -71
  543. package/templates/database/migrations/20260911200000_listing_site_answers/migration.sql +0 -30
  544. package/templates/database/migrations/20260912120000_listing_owner_link/migration.sql +0 -49
  545. package/templates/database/migrations/20260914120000_listing_founder_identity/migration.sql +0 -123
  546. package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +0 -15
  547. package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +0 -158
  548. package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +0 -40
  549. package/templates/database/migrations/20260918120000_add_appointment/migration.sql +0 -67
  550. package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +0 -70
  551. package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +0 -181
  552. package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +0 -172
  553. package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +0 -41
  554. package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +0 -185
  555. package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +0 -70
  556. package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +0 -57
  557. package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +0 -68
  558. package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +0 -1067
  559. package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +0 -210
  560. package/templates/database/migrations/20261003120000_spoke_registry/migration.sql +0 -80
  561. package/templates/database/migrations/20261003130000_scheduling_connection/migration.sql +0 -49
  562. package/templates/database/migrations/20261005120000_agents/migration.sql +0 -84
  563. package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +0 -35
  564. package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +0 -20
  565. package/templates/database/migrations/20261009120000_agent_grants/migration.sql +0 -33
  566. package/templates/database/migrations/20261010120000_person/migration.sql +0 -106
  567. package/templates/database/migrations/20261010121000_person_backfill/migration.sql +0 -132
  568. package/templates/database/migrations/20261010130000_agent_grants_people_read/migration.sql +0 -20
  569. package/templates/database/migrations/20261011120000_member_area/migration.sql +0 -158
  570. package/templates/database/migrations/20261011130000_agent_grants_member_pieces_manage/migration.sql +0 -21
  571. package/templates/database/migrations/20261012120000_member_contract/migration.sql +0 -192
  572. package/templates/database/migrations/20261013120000_lead_spoke_checkout/migration.sql +0 -20
  573. package/templates/database/migrations/20261014120000_consent_ledger/migration.sql +0 -122
  574. package/templates/database/migrations/20261014120000_person_contact/migration.sql +0 -231
  575. package/templates/database/migrations/20261015120000_person_notes/migration.sql +0 -77
  576. package/templates/database/migrations/20261015120000_rate_limit_counters/migration.sql +0 -43
  577. package/templates/database/migrations/20261016120000_piece_kind/migration.sql +0 -95
  578. package/templates/database/migrations/20261017120000_outbound_message_action/migration.sql +0 -30
  579. package/templates/database/migrations/20261018120000_flow_completion/migration.sql +0 -52
  580. package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +0 -27
  581. package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +0 -146
  582. package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +0 -77
  583. package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +0 -45
  584. package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +0 -47
  585. package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +0 -16
  586. package/templates/database/migrations/20261025120000_trial_magnet/migration.sql +0 -28
  587. package/templates/database/migrations/20261026120000_trial_magnet_proof_line/migration.sql +0 -23
  588. package/templates/database/migrations/migration_lock.toml +0 -3
  589. package/templates/database/ops/.gitkeep +0 -0
  590. package/templates/database/ops/schema.prisma +0 -43
  591. package/templates/database/package.json +0 -89
  592. package/templates/database/schema.prisma +0 -71
  593. package/templates/database/scripts/db-generate-locked.sh +0 -80
  594. package/templates/database/scripts/person-backfill.sql +0 -132
  595. package/templates/database/tenancy.ts +0 -183
  596. package/templates/database/tsconfig.build.json +0 -16
  597. package/templates/database/tsconfig.flows.json +0 -15
  598. package/templates/database/tsconfig.json +0 -16
  599. 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.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.45.0",
32
- "@working-theory/templates": "0.45.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
@@ -533,7 +533,7 @@ CONTENT_ADAPTER=mdx
533
533
  # pre-#5040 in-process Map, which does not. Default: `database` when
534
534
  # DATABASE_URL is set, else `memory`. A database failure or a 1s-slow call
535
535
  # 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
536
+ # through uncounted. Run `pnpm --filter @working-theory/app-api rate-limit:probe
537
537
  # --origin <https origin>` against a live deployment to check which store it
538
538
  # selected and whether a burst holds — see
539
539
  # docs/runbooks/site-configuration.md.
@@ -547,7 +547,7 @@ CONTENT_ADAPTER=mdx
547
547
  #
548
548
  # Hub and spokes — a spoke's reads and writes resolve to ITS OWN workspace
549
549
  # (#7532). A hub holding one workspace per spoke registers each spoke in its
550
- # database (`pnpm --filter @working-theory/api spokes register --workspace
550
+ # database (`pnpm --filter @working-theory/app-api spokes register --workspace
551
551
  # <wksp_id> --name <label>`), which prints the spoke's key once. The spoke
552
552
  # sends it on every server-side call, and the hub resolves meeting types, the
553
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,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).
@@ -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`