create-ailk 0.1.0 → 0.1.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 (605) hide show
  1. package/README.md +124 -3
  2. package/component-catalog.md +295 -0
  3. package/dist/cli.js +92 -16
  4. package/dist/component-catalog.d.ts +11 -0
  5. package/dist/component-catalog.js +39 -0
  6. package/dist/copy.d.ts +7 -0
  7. package/dist/copy.js +24 -0
  8. package/dist/derive-architecture.d.ts +13 -0
  9. package/dist/derive-architecture.js +238 -0
  10. package/dist/index.d.ts +7 -2
  11. package/dist/index.js +19 -2
  12. package/dist/lib/extract-module-bundle.d.ts +16 -0
  13. package/dist/lib/extract-module-bundle.js +184 -0
  14. package/dist/lib/fetch-module.d.ts +55 -0
  15. package/dist/lib/fetch-module.js +125 -0
  16. package/dist/lib/module-license-gate.d.ts +48 -0
  17. package/dist/lib/module-license-gate.js +67 -0
  18. package/dist/lib/module-tier.d.ts +35 -0
  19. package/dist/lib/module-tier.js +37 -0
  20. package/dist/module-architecture.d.ts +175 -0
  21. package/dist/module-architecture.js +663 -0
  22. package/dist/parse-args.d.ts +47 -1
  23. package/dist/parse-args.js +143 -2
  24. package/dist/programmatic.d.ts +160 -3
  25. package/dist/programmatic.js +196 -7
  26. package/dist/surfaces.d.ts +211 -0
  27. package/dist/surfaces.js +532 -0
  28. package/dist/sync-routes.d.ts +92 -0
  29. package/dist/sync-routes.js +350 -0
  30. package/package.json +22 -14
  31. package/templates/.claude/rules/architecture.md +6 -2
  32. package/templates/.claude/skills/README.md +9 -9
  33. package/templates/.claude/skills/add-schema/SKILL.md +14 -7
  34. package/templates/.claude/skills/add-schema/references/schema-types.md +109 -6
  35. package/templates/.claude/skills/provision-config/SKILL.md +1 -1
  36. package/templates/.claude/skills/scaffold-commerce/SKILL.md +498 -1
  37. package/templates/.claude/skills/scaffold-commerce/templates/checkout-route.template.ts +370 -0
  38. package/templates/.claude/skills/scaffold-commerce/templates/invoice-route.template.ts +376 -0
  39. package/templates/.claude/skills/scaffold-commerce/templates/payment-link-route.template.ts +471 -0
  40. package/templates/.claude/skills/scaffold-commerce/templates/portal-route.template.ts +365 -0
  41. package/templates/.claude/skills/scaffold-commerce/templates/stripe-config.template.ts +60 -0
  42. package/templates/.claude/skills/scaffold-commerce/templates/subscription-route.template.ts +446 -0
  43. package/templates/.claude/skills/suggest-site-pages/references/categories.md +4 -4
  44. package/templates/.env.example +126 -2
  45. package/templates/CLAUDE.md +11 -5
  46. package/templates/README.md +1 -1
  47. package/templates/apps/api/.env.example +38 -0
  48. package/templates/apps/api/CLAUDE.md +75 -1
  49. package/templates/apps/api/LICENSE +201 -0
  50. package/templates/apps/api/api/index.ts +6 -141
  51. package/templates/apps/api/jest.config.cjs +16 -0
  52. package/templates/apps/api/package.json +22 -6
  53. package/templates/apps/api/src/__tests__/module-exclusion.test.ts +141 -0
  54. package/templates/apps/api/src/__tests__/server.test.ts +46 -0
  55. package/templates/apps/api/src/__tests__/vercel-handler.test.ts +211 -0
  56. package/templates/apps/api/src/bin/abandon-sweep.ts +42 -0
  57. package/templates/apps/api/src/bin/deliverable-resend.ts +144 -0
  58. package/templates/apps/api/src/bin/deliverable-upload.ts +114 -0
  59. package/templates/apps/api/src/bin/followup-sweep.ts +44 -0
  60. package/templates/apps/api/src/bin/listing-csv-sweep.ts +46 -0
  61. package/templates/apps/api/src/bin/seed-presets.ts +58 -0
  62. package/templates/apps/api/src/bin/seed-waitlist-experiments.ts +104 -0
  63. package/templates/apps/api/src/bin/session-retention-sweep.ts +46 -0
  64. package/templates/apps/api/src/cli.ts +5 -11
  65. package/templates/apps/api/src/config/index.ts +35 -0
  66. package/templates/apps/api/src/config/modules.ts +43 -0
  67. package/templates/apps/api/src/lib/__mocks__/prisma-client.js +11 -0
  68. package/templates/apps/api/src/lib/__mocks__/prisma.ts +231 -0
  69. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +2 -2
  70. package/templates/apps/api/src/lib/site.ts +16 -0
  71. package/templates/apps/api/src/lib/stripe.ts +22 -0
  72. package/templates/apps/api/src/lib/tenant-db.ts +225 -0
  73. package/templates/apps/api/src/lib/ws-token.ts +91 -0
  74. package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +7 -1
  75. package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +7 -1
  76. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +91 -4
  77. package/templates/apps/api/src/middleware/auth.ts +43 -8
  78. package/templates/apps/api/src/middleware/rate-limit.ts +78 -3
  79. package/templates/apps/api/src/middleware/tenant.ts +99 -0
  80. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +92 -0
  81. package/templates/apps/api/src/openapi/spec.ts +312 -3
  82. package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +175 -0
  83. package/templates/apps/api/src/routes/aeo/index.ts +107 -0
  84. package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +5 -2
  85. package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +22 -3
  86. package/templates/apps/api/src/routes/auth/tokens.ts +13 -1
  87. package/templates/apps/api/src/routes/billing/__tests__/portal.test.ts +450 -0
  88. package/templates/apps/api/src/routes/billing/__tests__/read.test.ts +262 -0
  89. package/templates/apps/api/src/routes/billing/__tests__/usage.test.ts +436 -0
  90. package/templates/apps/api/src/routes/billing/index.ts +36 -0
  91. package/templates/apps/api/src/routes/billing/portal.ts +182 -0
  92. package/templates/apps/api/src/routes/billing/read.ts +75 -0
  93. package/templates/apps/api/src/routes/billing/usage.ts +153 -0
  94. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +99 -0
  95. package/templates/apps/api/src/routes/checkout/sessions.ts +20 -8
  96. package/templates/apps/api/src/routes/content/create.ts +1 -0
  97. package/templates/apps/api/src/routes/content/delete.ts +1 -0
  98. package/templates/apps/api/src/routes/content/index.ts +42 -6
  99. package/templates/apps/api/src/routes/content/update.ts +1 -0
  100. package/templates/apps/api/src/routes/deliverables/__tests__/index.test.ts +393 -0
  101. package/templates/apps/api/src/routes/deliverables/index.ts +200 -0
  102. package/templates/apps/api/src/routes/flow-checkouts/__tests__/index.test.ts +443 -0
  103. package/templates/apps/api/src/routes/flow-checkouts/index.ts +82 -0
  104. package/templates/apps/api/src/routes/flows/README.md +147 -0
  105. package/templates/apps/api/src/routes/flows/__tests__/index.test.ts +752 -0
  106. package/templates/apps/api/src/routes/flows/__tests__/recommender.test.ts +671 -0
  107. package/templates/apps/api/src/routes/flows/index.ts +202 -0
  108. package/templates/apps/api/src/routes/flows/recommender.ts +443 -0
  109. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +438 -31
  110. package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +10 -10
  111. package/templates/apps/api/src/routes/leads/index.ts +43 -9
  112. package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +547 -0
  113. package/templates/apps/api/src/routes/project-listings/__tests__/copy-edit.test.ts +815 -0
  114. package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +742 -0
  115. package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +424 -0
  116. package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +364 -0
  117. package/templates/apps/api/src/routes/project-listings/__tests__/tenant-isolation.test.ts +566 -0
  118. package/templates/apps/api/src/routes/project-listings/get.ts +70 -0
  119. package/templates/apps/api/src/routes/project-listings/index.ts +105 -0
  120. package/templates/apps/api/src/routes/project-listings/list.ts +47 -0
  121. package/templates/apps/api/src/routes/project-listings/patch-copy.ts +222 -0
  122. package/templates/apps/api/src/routes/project-listings/patch-draft.ts +97 -0
  123. package/templates/apps/api/src/routes/project-listings/patch.ts +136 -0
  124. package/templates/apps/api/src/routes/project-listings/public.ts +52 -0
  125. package/templates/apps/api/src/routes/project-listings/respond.ts +37 -0
  126. package/templates/apps/api/src/routes/project-listings/resume-token.ts +22 -0
  127. package/templates/apps/api/src/routes/project-listings/start.ts +98 -0
  128. package/templates/apps/api/src/routes/project-listings/submit.ts +122 -0
  129. package/templates/apps/api/src/routes/schedule/__tests__/index.test.ts +490 -0
  130. package/templates/apps/api/src/routes/schedule/index.ts +249 -0
  131. package/templates/apps/api/src/routes/slack/__tests__/actions.test.ts +385 -0
  132. package/templates/apps/api/src/routes/slack/actions.ts +177 -0
  133. package/templates/apps/api/src/routes/slack/index.ts +38 -0
  134. package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +16 -6
  135. package/templates/apps/api/src/routes/test/auth/session.ts +8 -6
  136. package/templates/apps/api/src/routes/waitlist-experiments/__tests__/tenant-isolation.test.ts +577 -0
  137. package/templates/apps/api/src/routes/waitlist-experiments/comparison.ts +78 -0
  138. package/templates/apps/api/src/routes/waitlist-experiments/index.ts +41 -0
  139. package/templates/apps/api/src/routes/waitlist-experiments/list.ts +64 -0
  140. package/templates/apps/api/src/routes/waitlist-experiments/respond.ts +42 -0
  141. package/templates/apps/api/src/routes/waitlist-experiments/signup.ts +84 -0
  142. package/templates/apps/api/src/routes/waitlist-experiments/signups.ts +119 -0
  143. package/templates/apps/api/src/routes/waitlist-signups/__tests__/index.test.ts +238 -0
  144. package/templates/apps/api/src/routes/waitlist-signups/index.ts +101 -0
  145. package/templates/apps/api/src/routes/webhooks/README.md +35 -12
  146. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +315 -0
  147. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +270 -0
  148. package/templates/apps/api/src/routes/webhooks/stripe.ts +248 -20
  149. package/templates/apps/api/src/routes/workspaces/__tests__/config-tenant-isolation.test.ts +356 -0
  150. package/templates/apps/api/src/routes/workspaces/__tests__/tenant-isolation.test.ts +671 -0
  151. package/templates/apps/api/src/routes/workspaces/config.ts +125 -0
  152. package/templates/apps/api/src/routes/workspaces/index.ts +194 -0
  153. package/templates/apps/api/src/routes/workspaces/sessions.ts +218 -0
  154. package/templates/apps/api/src/server.ts +293 -7
  155. package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +489 -0
  156. package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +475 -0
  157. package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +132 -0
  158. package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +523 -0
  159. package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +359 -0
  160. package/templates/apps/api/src/services/__tests__/entitlements.test.ts +142 -0
  161. package/templates/apps/api/src/services/__tests__/flow-aggregate.test.ts +425 -0
  162. package/templates/apps/api/src/services/__tests__/flow-engine.test.ts +2840 -0
  163. package/templates/apps/api/src/services/__tests__/lead-promotion.test.ts +393 -0
  164. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +8 -8
  165. package/templates/apps/api/src/services/__tests__/listing-csv-sweep.test.ts +560 -0
  166. package/templates/apps/api/src/services/__tests__/playbook-compile.test.ts +406 -0
  167. package/templates/apps/api/src/services/__tests__/playbook-render.test.ts +290 -0
  168. package/templates/apps/api/src/services/__tests__/project-listing-decision.test.ts +736 -0
  169. package/templates/apps/api/src/services/__tests__/project-listing-flow.test.ts +475 -0
  170. package/templates/apps/api/src/services/__tests__/project-listing-issue.test.ts +340 -0
  171. package/templates/apps/api/src/services/__tests__/recommender-capture.test.ts +983 -0
  172. package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +278 -0
  173. package/templates/apps/api/src/services/__tests__/tenant-context-cascade.test.ts +71 -0
  174. package/templates/apps/api/src/services/__tests__/tenant-context.test.ts +379 -0
  175. package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +941 -0
  176. package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +588 -0
  177. package/templates/apps/api/src/services/__tests__/usage-metering.test.ts +768 -0
  178. package/templates/apps/api/src/services/__tests__/waitlist-dashboard.test.ts +1314 -0
  179. package/templates/apps/api/src/services/__tests__/waitlist-experiments.test.ts +341 -0
  180. package/templates/apps/api/src/services/__tests__/waitlist-followup.test.ts +567 -0
  181. package/templates/apps/api/src/services/__tests__/waitlist-scoring.test.ts +474 -0
  182. package/templates/apps/api/src/services/__tests__/waitlist-signups.test.ts +354 -0
  183. package/templates/apps/api/src/services/abandon-email.ts +307 -0
  184. package/templates/apps/api/src/services/aeo-score.ts +288 -0
  185. package/templates/apps/api/src/services/answer-distributions.ts +138 -0
  186. package/templates/apps/api/src/services/deliverable-fulfillment.ts +523 -0
  187. package/templates/apps/api/src/services/entitlements.ts +102 -0
  188. package/templates/apps/api/src/services/flow-aggregate.ts +232 -0
  189. package/templates/apps/api/src/services/flow-checkouts.ts +123 -0
  190. package/templates/apps/api/src/services/flow-engine.ts +1278 -0
  191. package/templates/apps/api/src/services/lead-promotion.ts +176 -0
  192. package/templates/apps/api/src/services/lead-routing.ts +3 -3
  193. package/templates/apps/api/src/services/listing-config.ts +102 -0
  194. package/templates/apps/api/src/services/listing-csv-sweep.ts +455 -0
  195. package/templates/apps/api/src/services/playbook-compile.ts +398 -0
  196. package/templates/apps/api/src/services/playbook-render.ts +263 -0
  197. package/templates/apps/api/src/services/project-listing-decision.ts +490 -0
  198. package/templates/apps/api/src/services/project-listing-flow.ts +426 -0
  199. package/templates/apps/api/src/services/project-listing-issue.ts +251 -0
  200. package/templates/apps/api/src/services/project-listings.ts +1124 -0
  201. package/templates/apps/api/src/services/recommender-capture.ts +835 -0
  202. package/templates/apps/api/src/services/scheduling/cal-provider.ts +392 -0
  203. package/templates/apps/api/src/services/scheduling/index.ts +63 -0
  204. package/templates/apps/api/src/services/scheduling/types.ts +88 -0
  205. package/templates/apps/api/src/services/slack-notify.ts +240 -0
  206. package/templates/apps/api/src/services/tenant-context.ts +451 -0
  207. package/templates/apps/api/src/services/usage-aggregation.ts +516 -0
  208. package/templates/apps/api/src/services/usage-credits.ts +340 -0
  209. package/templates/apps/api/src/services/usage-metering.ts +699 -0
  210. package/templates/apps/api/src/services/waitlist-dashboard.ts +947 -0
  211. package/templates/apps/api/src/services/waitlist-experiments.ts +213 -0
  212. package/templates/apps/api/src/services/waitlist-followup.ts +486 -0
  213. package/templates/apps/api/src/services/waitlist-scoring.ts +166 -0
  214. package/templates/apps/api/src/services/waitlist-signups.ts +165 -0
  215. package/templates/apps/api/src/vercel-handler.ts +165 -0
  216. package/templates/apps/api/tsconfig.json +0 -12
  217. package/templates/apps/mcp/CLAUDE.md +19 -9
  218. package/templates/apps/mcp/LICENSE +201 -0
  219. package/templates/apps/mcp/__tests__/create_page.test.ts +1 -0
  220. package/templates/apps/mcp/__tests__/delete_page.test.ts +1 -0
  221. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +105 -0
  222. package/templates/apps/mcp/__tests__/parity.test.ts +70 -6
  223. package/templates/apps/mcp/__tests__/request_callback.test.ts +4 -4
  224. package/templates/apps/mcp/__tests__/schedule_tools.test.ts +242 -0
  225. package/templates/apps/mcp/__tests__/submit_lead.test.ts +4 -4
  226. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +4 -4
  227. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +47 -0
  228. package/templates/apps/mcp/__tests__/update_page.test.ts +1 -0
  229. package/templates/apps/mcp/package.json +6 -4
  230. package/templates/apps/mcp/src/config/modules.ts +37 -0
  231. package/templates/apps/mcp/src/server.ts +109 -18
  232. package/templates/apps/mcp/src/tools/capture_lead.ts +1 -1
  233. package/templates/apps/mcp/src/tools/create_booking.ts +58 -0
  234. package/templates/apps/mcp/src/tools/create_page.ts +1 -0
  235. package/templates/apps/mcp/src/tools/delete_page.ts +1 -0
  236. package/templates/apps/mcp/src/tools/get_event_meta.ts +55 -0
  237. package/templates/apps/mcp/src/tools/get_flow.ts +61 -0
  238. package/templates/apps/mcp/src/tools/index.ts +25 -0
  239. package/templates/apps/mcp/src/tools/list_availability.ts +67 -0
  240. package/templates/apps/mcp/src/tools/purchase.ts +3 -0
  241. package/templates/apps/mcp/src/tools/submit_flow_step.ts +83 -0
  242. package/templates/apps/mcp/src/tools/update_page.ts +1 -0
  243. package/templates/apps/mcp/tsconfig.json +1 -9
  244. package/templates/apps/web/.env.example +44 -0
  245. package/templates/apps/web/CLAUDE.md +28 -0
  246. package/templates/apps/web/LICENSE +201 -0
  247. package/templates/apps/web/__tests__/__mocks__/code-highlight.jest-stub.ts +24 -0
  248. package/templates/apps/web/__tests__/__mocks__/next-intl-server.ts +33 -0
  249. package/templates/apps/web/__tests__/__mocks__/next-intl.ts +18 -0
  250. package/templates/apps/web/__tests__/__mocks__/server-only.ts +13 -0
  251. package/templates/apps/web/__tests__/__mocks__/style-mock.js +4 -0
  252. package/templates/apps/web/__tests__/__mocks__/vercel-analytics-server.ts +9 -0
  253. package/templates/apps/web/__tests__/jest-support/import-meta-transformer.cjs +90 -0
  254. package/templates/apps/web/__tests__/setup.ts +22 -32
  255. package/templates/apps/web/app/.well-known/ai-plugin.json/route.ts +6 -3
  256. package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +8 -2
  257. package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +260 -0
  258. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +263 -0
  259. package/templates/apps/web/app/[locale]/(authed)/account/sign-out-button.tsx +39 -0
  260. package/templates/apps/web/app/[locale]/(authed)/layout.tsx +54 -0
  261. package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +96 -0
  262. package/templates/apps/web/app/[locale]/(authed)/waitlist/[experimentId]/page.tsx +309 -0
  263. package/templates/apps/web/app/[locale]/(authed)/waitlist/[experimentId]/signups/[leadId]/page.tsx +149 -0
  264. package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/comparison.test.tsx +273 -0
  265. package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/gate.test.tsx +172 -0
  266. package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/list.test.tsx +171 -0
  267. package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/signup.test.tsx +179 -0
  268. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/ExperimentsTable.tsx +116 -0
  269. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/ForbiddenState.tsx +24 -0
  270. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/OfferFunnelTable.tsx +66 -0
  271. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/RollupTicker.tsx +61 -0
  272. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/ScoreTrace.tsx +114 -0
  273. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/SignupsTable.tsx +139 -0
  274. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/WaitlistComparisonTabs.tsx +85 -0
  275. package/templates/apps/web/app/[locale]/(authed)/waitlist/components/status-badges.tsx +67 -0
  276. package/templates/apps/web/app/[locale]/(authed)/waitlist/format.ts +111 -0
  277. package/templates/apps/web/app/[locale]/(authed)/waitlist/page.tsx +179 -0
  278. package/templates/apps/web/app/[locale]/about/page.tsx +10 -1
  279. package/templates/apps/web/app/[locale]/blog/[[...slug]]/page.tsx +6 -1
  280. package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +9 -0
  281. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
  282. package/templates/apps/web/app/[locale]/careers/page.tsx +9 -1
  283. package/templates/apps/web/app/[locale]/case-studies/[slug]/page.tsx +9 -0
  284. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
  285. package/templates/apps/web/app/[locale]/case-studies/page.tsx +13 -1
  286. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +11 -1
  287. package/templates/apps/web/app/[locale]/clients/page.tsx +9 -1
  288. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +21 -1
  289. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +188 -0
  290. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +242 -0
  291. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +29 -0
  292. package/templates/apps/web/app/[locale]/contact/__tests__/intake-analytics.test.ts +51 -0
  293. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +39 -15
  294. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +21 -3
  295. package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +49 -0
  296. package/templates/apps/web/app/[locale]/contact/intake-script.ts +66 -0
  297. package/templates/apps/web/app/[locale]/contact/page.tsx +14 -4
  298. package/templates/apps/web/app/[locale]/courses/[slug]/page.tsx +13 -1
  299. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
  300. package/templates/apps/web/app/[locale]/courses/page.tsx +9 -1
  301. package/templates/apps/web/app/[locale]/docs/[[...slug]]/page.tsx +1 -0
  302. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +11 -1
  303. package/templates/apps/web/app/[locale]/downloads/page.tsx +13 -1
  304. package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +9 -0
  305. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +12 -2
  306. package/templates/apps/web/app/[locale]/events/page.tsx +9 -1
  307. package/templates/apps/web/app/[locale]/faq/page.tsx +10 -1
  308. package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +265 -0
  309. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.permalink.test.tsx +445 -0
  310. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.test.tsx +341 -0
  311. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/checkout.actions.test.ts +287 -0
  312. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/flow.actions.test.ts +302 -0
  313. package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/two-route-tool.test.tsx +128 -0
  314. package/templates/apps/web/app/[locale]/flows/[slug]/checkout.actions.ts +254 -0
  315. package/templates/apps/web/app/[locale]/flows/[slug]/flow.actions.ts +144 -0
  316. package/templates/apps/web/app/[locale]/flows/[slug]/page.tsx +108 -0
  317. package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/ResultsClient.tsx +532 -0
  318. package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/ResultsEmailStep.tsx +121 -0
  319. package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/__tests__/ResultsClient.checkout.test.tsx +457 -0
  320. package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/__tests__/page.test.tsx +396 -0
  321. package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/page.tsx +114 -0
  322. package/templates/apps/web/app/[locale]/flows/[slug]/start/page.tsx +52 -0
  323. package/templates/apps/web/app/[locale]/how-to/[slug]/page.tsx +13 -1
  324. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
  325. package/templates/apps/web/app/[locale]/integrations/[slug]/page.tsx +9 -0
  326. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
  327. package/templates/apps/web/app/[locale]/integrations/page.tsx +13 -1
  328. package/templates/apps/web/app/[locale]/launch-service/page.tsx +14 -1
  329. package/templates/apps/web/app/[locale]/layout.tsx +115 -16
  330. package/templates/apps/web/app/[locale]/page.tsx +10 -1
  331. package/templates/apps/web/app/[locale]/partners/[slug]/page.tsx +9 -0
  332. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
  333. package/templates/apps/web/app/[locale]/partners/page.tsx +9 -1
  334. package/templates/apps/web/app/[locale]/products/[slug]/page.tsx +9 -0
  335. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
  336. package/templates/apps/web/app/[locale]/products/page.tsx +9 -1
  337. package/templates/apps/web/app/[locale]/projects/[slug]/page.tsx +13 -1
  338. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +10 -0
  339. package/templates/apps/web/app/[locale]/projects/apply/ListingApplicationClient.tsx +110 -0
  340. package/templates/apps/web/app/[locale]/projects/apply/__tests__/ListingApplicationClient.test.tsx +96 -0
  341. package/templates/apps/web/app/[locale]/projects/page.tsx +13 -1
  342. package/templates/apps/web/app/[locale]/resources/[slug]/page.tsx +9 -0
  343. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +12 -2
  344. package/templates/apps/web/app/[locale]/resources/page.tsx +13 -1
  345. package/templates/apps/web/app/[locale]/schedule/__tests__/page.test.tsx +117 -0
  346. package/templates/apps/web/app/[locale]/schedule/confirmed/__tests__/page.test.tsx +96 -0
  347. package/templates/apps/web/app/[locale]/schedule/confirmed/page.tsx +92 -0
  348. package/templates/apps/web/app/[locale]/schedule/page.tsx +82 -0
  349. package/templates/apps/web/app/[locale]/services/[slug]/page.tsx +9 -0
  350. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
  351. package/templates/apps/web/app/[locale]/services/page.tsx +9 -1
  352. package/templates/apps/web/app/[locale]/sign-in/__tests__/next-path.test.ts +31 -0
  353. package/templates/apps/web/app/[locale]/sign-in/__tests__/page.test.tsx +152 -0
  354. package/templates/apps/web/app/[locale]/sign-in/next-path.ts +0 -0
  355. package/templates/apps/web/app/[locale]/sign-in/page.tsx +83 -0
  356. package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +123 -0
  357. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +13 -1
  358. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
  359. package/templates/apps/web/app/[locale]/tech-articles/[slug]/page.tsx +13 -1
  360. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
  361. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +11 -1
  362. package/templates/apps/web/app/[locale]/testimonials/page.tsx +13 -1
  363. package/templates/apps/web/app/[locale]/thanks/[slug]/__tests__/page.test.tsx +93 -0
  364. package/templates/apps/web/app/[locale]/thanks/[slug]/page.tsx +48 -0
  365. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +11 -1
  366. package/templates/apps/web/app/[locale]/use-cases/page.tsx +13 -1
  367. package/templates/apps/web/app/[locale]/whitepapers/[slug]/page.tsx +13 -1
  368. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
  369. package/templates/apps/web/app/globals.css +35 -0
  370. package/templates/apps/web/app/llms.txt/route.ts +2 -1
  371. package/templates/apps/web/app/og/route.tsx +10 -2
  372. package/templates/apps/web/auth.ts +8 -0
  373. package/templates/apps/web/components/sign-out-trigger.tsx +42 -0
  374. package/templates/apps/web/content/en/blog/README.txt +25 -0
  375. package/templates/apps/web/content/en/docs/index.mdx +28 -0
  376. package/templates/apps/web/jest.config.cjs +84 -27
  377. package/templates/apps/web/lib/__tests__/site-brand.test.ts +119 -0
  378. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +499 -0
  379. package/templates/apps/web/lib/account-config.ts +13 -0
  380. package/templates/apps/web/lib/server-api.ts +85 -0
  381. package/templates/apps/web/lib/site-brand.tsx +118 -0
  382. package/templates/apps/web/messages/en.json +275 -7
  383. package/templates/apps/web/middleware.ts +11 -3
  384. package/templates/apps/web/next.config.mjs +8 -2
  385. package/templates/apps/web/package.json +16 -7
  386. package/templates/apps/web/postcss.config.mjs +23 -0
  387. package/templates/apps/web/public/.well-known/security.txt +3 -3
  388. package/templates/apps/web/src/lib/routes.ts +15 -2
  389. package/templates/apps/web/tsconfig.json +1 -16
  390. package/templates/content/_site.mdx +24 -25
  391. package/templates/content/en/AboutPage/about.mdx +24 -14
  392. package/templates/content/en/ContactPage/contact.mdx +23 -14
  393. package/templates/content/en/FAQPage/faq.mdx +10 -392
  394. package/templates/content/en/HomePage/home.mdx +14 -285
  395. package/templates/database/CHANGELOG.md +382 -0
  396. package/templates/database/LICENSE +201 -0
  397. package/templates/database/README.md +3 -1
  398. package/templates/database/__tests__/flows-listing-diagnostic.test.ts +392 -0
  399. package/templates/database/__tests__/flows-presets.test.ts +173 -0
  400. package/templates/database/__tests__/prefixed-ids.db.test.ts +146 -0
  401. package/templates/database/__tests__/seed.test.ts +88 -0
  402. package/templates/database/__tests__/user-cascade.test.ts +19 -4
  403. package/templates/database/auth/schema.prisma +521 -0
  404. package/templates/database/config/schema.prisma +234 -0
  405. package/templates/database/content/schema.prisma +263 -0
  406. package/templates/database/flows/listing-diagnostic.ts +182 -0
  407. package/templates/database/flows/presets.ts +315 -0
  408. package/templates/database/inbox/__tests__/schema.test.ts +4 -0
  409. package/templates/database/inbox/schema.prisma +476 -3
  410. package/templates/database/jest.config.cjs +8 -0
  411. package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +201 -0
  412. package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +67 -0
  413. package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +46 -0
  414. package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +25 -0
  415. package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +49 -0
  416. package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +197 -0
  417. package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +32 -0
  418. package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +22 -0
  419. package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +151 -0
  420. package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +223 -0
  421. package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +22 -0
  422. package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +32 -0
  423. package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +40 -0
  424. package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +4 -0
  425. package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +2 -0
  426. package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +2 -0
  427. package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +29 -0
  428. package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +6 -0
  429. package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +39 -0
  430. package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +24 -0
  431. package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +3 -0
  432. package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +33 -0
  433. package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +30 -0
  434. package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +47 -0
  435. package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +16 -0
  436. package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +47 -0
  437. package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +10 -0
  438. package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +26 -0
  439. package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +90 -0
  440. package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +174 -0
  441. package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +14 -0
  442. package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +25 -0
  443. package/templates/database/ops/schema.prisma +27 -0
  444. package/templates/database/package.json +42 -4
  445. package/templates/database/prisma.config.ts +1 -1
  446. package/templates/database/schema.prisma +19 -435
  447. package/templates/database/scripts/db-generate-locked.sh +0 -0
  448. package/templates/database/seed-test.ts +14 -4
  449. package/templates/database/seed.ts +148 -0
  450. package/templates/database/tenancy.ts +45 -0
  451. package/templates/database/tsconfig.flows.json +15 -0
  452. package/templates/database/tsconfig.json +7 -1
  453. package/templates/database/tsconfig.tenancy.json +14 -0
  454. package/templates/package.json +30 -55
  455. package/templates/pnpm-workspace.yaml +0 -3
  456. package/templates/project.yaml +1 -1
  457. package/templates/tsconfig.json +1 -37
  458. package/templates/apps/web/__tests__/auth/adversarial/cookie-attributes.test.ts +0 -94
  459. package/templates/apps/web/__tests__/auth/adversarial/oauth-state-parameter.test.ts +0 -75
  460. package/templates/apps/web/__tests__/auth/adversarial/redirect-uri-allowlist.test.ts +0 -82
  461. package/templates/apps/web/__tests__/auth/env-helpers.test.ts +0 -168
  462. package/templates/apps/web/__tests__/authority-list-routes.test.tsx +0 -208
  463. package/templates/apps/web/__tests__/better-stack.test.ts +0 -66
  464. package/templates/apps/web/__tests__/blog-dir-resolution.test.ts +0 -87
  465. package/templates/apps/web/__tests__/blog-source-populated.test.ts +0 -130
  466. package/templates/apps/web/__tests__/data-testid-coverage.test.tsx +0 -60
  467. package/templates/apps/web/__tests__/google-analytics.test.tsx +0 -104
  468. package/templates/apps/web/__tests__/i18n/middleware.test.ts +0 -119
  469. package/templates/apps/web/__tests__/i18n/routing.test.ts +0 -114
  470. package/templates/apps/web/__tests__/i18n/translations.test.ts +0 -191
  471. package/templates/apps/web/__tests__/json-ld.test.ts +0 -98
  472. package/templates/apps/web/__tests__/knowledge-events-routes.test.tsx +0 -580
  473. package/templates/apps/web/__tests__/layout-stealth.test.ts +0 -39
  474. package/templates/apps/web/__tests__/lighthouse-fixtures/improvement-image-shrink.tsx +0 -103
  475. package/templates/apps/web/__tests__/lighthouse-fixtures/override-fixture.md +0 -114
  476. package/templates/apps/web/__tests__/lighthouse-fixtures/regression-bloat.tsx +0 -94
  477. package/templates/apps/web/__tests__/page.test.tsx +0 -230
  478. package/templates/apps/web/__tests__/products-services-phase1.test.tsx +0 -321
  479. package/templates/apps/web/__tests__/projects-routes.test.tsx +0 -392
  480. package/templates/apps/web/__tests__/resources-downloads-integrations-phase2.test.tsx +0 -475
  481. package/templates/apps/web/__tests__/routes/ai-plugin-json.test.ts +0 -53
  482. package/templates/apps/web/__tests__/routes/blog-route.test.tsx +0 -191
  483. package/templates/apps/web/__tests__/routes/llms-txt.test.ts +0 -123
  484. package/templates/apps/web/__tests__/routes/robots-txt.test.ts +0 -52
  485. package/templates/apps/web/__tests__/routes/sitemap-xml.test.ts +0 -78
  486. package/templates/apps/web/__tests__/routes/well-known-mcp.test.ts +0 -203
  487. package/templates/apps/web/__tests__/section-routes.test.tsx +0 -693
  488. package/templates/apps/web/__tests__/security-headers.test.ts +0 -201
  489. package/templates/apps/web/__tests__/sentry-config.test.ts +0 -116
  490. package/templates/apps/web/__tests__/sitemap-locales.test.ts +0 -415
  491. package/templates/apps/web/__tests__/standalone-informational-routes.test.tsx +0 -844
  492. package/templates/apps/web/app/[locale]/__tests__/layout.test.tsx +0 -120
  493. package/templates/apps/web/app/[locale]/__tests__/page-renderer-migration.test.tsx +0 -202
  494. package/templates/apps/web/app/__tests__/error-boundaries.test.tsx +0 -152
  495. package/templates/apps/web/content/en/blog/index.mdx +0 -15
  496. package/templates/apps/web/content/en/blog/launching-ailk.mdx +0 -20
  497. package/templates/apps/web/content/en/docs/getting-started.mdx +0 -30
  498. package/templates/content/.gitkeep +0 -0
  499. package/templates/content/CLAUDE.md +0 -85
  500. package/templates/content/ar/HomePage/home.mdx +0 -123
  501. package/templates/content/ar/_site.mdx +0 -35
  502. package/templates/content/de/_site.mdx +0 -29
  503. package/templates/content/en/.gitkeep +0 -0
  504. package/templates/content/en/AboutPage/about.schema.json +0 -82
  505. package/templates/content/en/BookCall/book-call.mdx +0 -19
  506. package/templates/content/en/BookCall/book-call.schema.json +0 -121
  507. package/templates/content/en/BreadcrumbList/site-breadcrumbs.mdx +0 -20
  508. package/templates/content/en/CareersList/careers.mdx +0 -24
  509. package/templates/content/en/CaseStudiesList/case-studies.mdx +0 -22
  510. package/templates/content/en/CaseStudiesList/showcase.mdx +0 -8
  511. package/templates/content/en/CaseStudy/ailk-aeo-rollout.mdx +0 -32
  512. package/templates/content/en/CaseStudy/schema-builder-migration.mdx +0 -41
  513. package/templates/content/en/ClientsList/clients.mdx +0 -38
  514. package/templates/content/en/ContactPage/contact.schema.json +0 -100
  515. package/templates/content/en/ContactPoint/primary.mdx +0 -14
  516. package/templates/content/en/Course/aeo-fundamentals.mdx +0 -37
  517. package/templates/content/en/Course/schema-builder-workshop.mdx +0 -62
  518. package/templates/content/en/CoursesList/courses.mdx +0 -22
  519. package/templates/content/en/DownloadsList/downloads.mdx +0 -22
  520. package/templates/content/en/Event/aeo-office-hours-may-2026.mdx +0 -39
  521. package/templates/content/en/Event/ailk-launch-day-2026.mdx +0 -35
  522. package/templates/content/en/EventsList/events.mdx +0 -26
  523. package/templates/content/en/FAQPage/faq.schema.json +0 -231
  524. package/templates/content/en/GlossaryList/glossary.mdx +0 -19
  525. package/templates/content/en/GlossaryList/glossary.schema.json +0 -300
  526. package/templates/content/en/HomePage/home.schema.json +0 -88
  527. package/templates/content/en/HomePage/launch-service.mdx +0 -475
  528. package/templates/content/en/HomePage/launch-service.schema.json +0 -138
  529. package/templates/content/en/HowTo/add-mdx-content.mdx +0 -38
  530. package/templates/content/en/HowTo/configure-aeo-scoring.mdx +0 -35
  531. package/templates/content/en/HowTo/set-up-json-ld.mdx +0 -36
  532. package/templates/content/en/Integration/github-actions.mdx +0 -31
  533. package/templates/content/en/Integration/openai-api.mdx +0 -26
  534. package/templates/content/en/Integration/vercel.mdx +0 -32
  535. package/templates/content/en/IntegrationsList/integrations.mdx +0 -22
  536. package/templates/content/en/JobPosting/content-strategist.mdx +0 -46
  537. package/templates/content/en/JobPosting/developer-advocate.mdx +0 -47
  538. package/templates/content/en/JobPosting/senior-fullstack-engineer.mdx +0 -57
  539. package/templates/content/en/LandingPage/aeo-audit.mdx +0 -19
  540. package/templates/content/en/LandingPage/aeo-audit.schema.json +0 -92
  541. package/templates/content/en/LandingPage/agency-waitlist.mdx +0 -340
  542. package/templates/content/en/LandingPage/agency-waitlist.schema.json +0 -152
  543. package/templates/content/en/LandingPage/developers.mdx +0 -19
  544. package/templates/content/en/LandingPage/developers.schema.json +0 -109
  545. package/templates/content/en/LandingPage/for-agencies.mdx +0 -390
  546. package/templates/content/en/LandingPage/for-agencies.schema.json +0 -107
  547. package/templates/content/en/LandingPage/for-ai-search-agencies.mdx +0 -417
  548. package/templates/content/en/LandingPage/for-ai-search-agencies.schema.json +0 -105
  549. package/templates/content/en/LandingPage/for-businesses.mdx +0 -19
  550. package/templates/content/en/LandingPage/for-businesses.schema.json +0 -96
  551. package/templates/content/en/LandingPage/platform.mdx +0 -369
  552. package/templates/content/en/LandingPage/platform.schema.json +0 -166
  553. package/templates/content/en/LandingPage/vs-ai-website-builders.mdx +0 -19
  554. package/templates/content/en/LandingPage/vs-ai-website-builders.schema.json +0 -102
  555. package/templates/content/en/LandingPage/vs-wordpress.mdx +0 -19
  556. package/templates/content/en/LandingPage/vs-wordpress.schema.json +0 -53
  557. package/templates/content/en/NewsletterSignup/newsletter.mdx +0 -236
  558. package/templates/content/en/NewsletterSignup/newsletter.schema.json +0 -91
  559. package/templates/content/en/Organization/site-owner.mdx +0 -16
  560. package/templates/content/en/Partner/prisma.mdx +0 -31
  561. package/templates/content/en/Partner/supabase.mdx +0 -30
  562. package/templates/content/en/Partner/vercel.mdx +0 -28
  563. package/templates/content/en/PartnersList/partners.mdx +0 -22
  564. package/templates/content/en/Person/founder.mdx +0 -18
  565. package/templates/content/en/Pricing/pricing.mdx +0 -538
  566. package/templates/content/en/Pricing/pricing.schema.json +0 -209
  567. package/templates/content/en/PrivacyPage/privacy.mdx +0 -165
  568. package/templates/content/en/PrivacyPage/privacy.schema.json +0 -64
  569. package/templates/content/en/Product/ailk.mdx +0 -19
  570. package/templates/content/en/Product/ailk.schema.json +0 -94
  571. package/templates/content/en/Product/api-launch-kit.mdx +0 -26
  572. package/templates/content/en/Product/launch-kit.mdx +0 -28
  573. package/templates/content/en/ProductsList/products.mdx +0 -26
  574. package/templates/content/en/Project/ailk-phase-2.mdx +0 -54
  575. package/templates/content/en/ProjectsList/projects.mdx +0 -25
  576. package/templates/content/en/ResourceDetail/aeo-scoring-guide.mdx +0 -27
  577. package/templates/content/en/ResourceDetail/content-model-whitepaper.mdx +0 -28
  578. package/templates/content/en/ResourceDetail/schema-org-quick-reference.mdx +0 -39
  579. package/templates/content/en/ResourcesHub/resources.mdx +0 -22
  580. package/templates/content/en/Service/consulting.mdx +0 -22
  581. package/templates/content/en/Service/implementation.mdx +0 -30
  582. package/templates/content/en/Service/launch-service.mdx +0 -232
  583. package/templates/content/en/Service/launch.mdx +0 -228
  584. package/templates/content/en/ServicesList/services.mdx +0 -84
  585. package/templates/content/en/SoftwareProduct/ailk-aeo.mdx +0 -44
  586. package/templates/content/en/SoftwareProduct/ailk-content-adapters.mdx +0 -47
  587. package/templates/content/en/SoftwareProduct/ailk-schema.mdx +0 -49
  588. package/templates/content/en/TeamList/team.mdx +0 -63
  589. package/templates/content/en/TeamMember/founder.mdx +0 -72
  590. package/templates/content/en/TermsPage/terms.mdx +0 -19
  591. package/templates/content/en/TermsPage/terms.schema.json +0 -99
  592. package/templates/content/en/TestimonialsList/testimonials.mdx +0 -44
  593. package/templates/content/en/UseCasesList/use-cases.mdx +0 -30
  594. package/templates/content/en/Whitepaper/ax-first-product-development.mdx +0 -27
  595. package/templates/content/en/Whitepaper/open-core-commercial-strategy.mdx +0 -27
  596. package/templates/content/en/Whitepaper/structured-data-for-answer-engines.mdx +0 -31
  597. package/templates/content/en-XA/AboutPage/about.mdx +0 -8
  598. package/templates/content/en-XA/FAQPage/faq.mdx +0 -8
  599. package/templates/content/en-XA/HomePage/home.mdx +0 -8
  600. package/templates/content/es/_site.mdx +0 -30
  601. package/templates/content/fr/_site.mdx +0 -30
  602. package/templates/content/ja/_site.mdx +0 -30
  603. package/templates/content/pt-BR/AboutPage/about.mdx +0 -8
  604. package/templates/content/pt-BR/FAQPage/faq.mdx +0 -8
  605. package/templates/content/pt-BR/HomePage/home.mdx +0 -23
@@ -0,0 +1,148 @@
1
+ /**
2
+ * Default-workspace provision seed (roadmap
3
+ * docs/roadmaps/site-config-workspace-tenancy-roadmap.md Phase 1, #3622).
4
+ *
5
+ * Single-tenant AILK has no Workspace at all today. This seed deterministically
6
+ * provisions exactly one default Organization + Workspace (well-known ids/slugs)
7
+ * so every deployment has a resolvable Workspace scope — a foundation for the
8
+ * Phase 2 session wiring (`activeWorkspaceId` resolution) and the Phase 3
9
+ * site-config re-anchor. See docs/specs/default-workspace-provision-spec.md.
10
+ *
11
+ * Race-safe: `upsert` on the unique keys (Organization.slug,
12
+ * Workspace.organizationId_slug) means a concurrent re-invocation converges
13
+ * rather than duplicating.
14
+ *
15
+ * Production-safe: NO `*_ENABLED`-style env guard (unlike seed-test.ts) —
16
+ * default-workspace provisioning is safe to run in production. The
17
+ * `count === 0` guard (not an unconditional upsert) is what keeps this a no-op
18
+ * once ANY Workspace exists — covering both single-tenant re-run idempotency
19
+ * and a multi-tenant deployment that already has real Workspaces.
20
+ *
21
+ * Run via:
22
+ * pnpm --filter @working-theory/database db:seed
23
+ */
24
+ import "dotenv/config";
25
+
26
+ import { basename } from "node:path";
27
+
28
+ import type { PrismaClient } from "./generated/client/client.js";
29
+ import {
30
+ DEFAULT_ORG_ID,
31
+ DEFAULT_ORG_SLUG,
32
+ DEFAULT_WORKSPACE_ID,
33
+ DEFAULT_WORKSPACE_SLUG,
34
+ OPERATOR_MEMBERSHIP_ID,
35
+ } from "./tenancy.js";
36
+
37
+ // Re-exported so existing consumers (e.g. __tests__/seed.test.ts) keep
38
+ // importing the well-known ids from this module — `database/tenancy.ts` is
39
+ // the one declaration (spec D3); this file re-exports rather than declaring
40
+ // a second copy.
41
+ export {
42
+ DEFAULT_ORG_ID,
43
+ DEFAULT_ORG_SLUG,
44
+ DEFAULT_WORKSPACE_ID,
45
+ DEFAULT_WORKSPACE_SLUG,
46
+ OPERATOR_MEMBERSHIP_ID,
47
+ };
48
+
49
+ /**
50
+ * The DI surface `provisionDefaultWorkspace` needs — just the two Prisma
51
+ * delegates it touches. A `Pick` off the real `PrismaClient` type (not a
52
+ * hand-rolled shape), so a real client satisfies it by construction and the
53
+ * DB-free unit test can pass a lightweight stub with no live Postgres.
54
+ */
55
+ export type DefaultWorkspacePrismaClient = Pick<
56
+ PrismaClient,
57
+ "organization" | "workspace"
58
+ >;
59
+
60
+ /**
61
+ * Provisions one default Organization + Workspace when no Workspace exists
62
+ * yet; no-op (no create/upsert calls) once any Workspace is present — covering
63
+ * both single-tenant re-run idempotency and a multi-tenant deployment that
64
+ * already has real Workspaces.
65
+ */
66
+ export async function provisionDefaultWorkspace(
67
+ prisma: DefaultWorkspacePrismaClient,
68
+ ): Promise<{ created: boolean }> {
69
+ const existingWorkspaceCount = await prisma.workspace.count();
70
+ if (existingWorkspaceCount > 0) {
71
+ return { created: false };
72
+ }
73
+
74
+ await prisma.organization.upsert({
75
+ where: { slug: DEFAULT_ORG_SLUG },
76
+ create: {
77
+ id: DEFAULT_ORG_ID,
78
+ name: "Default Organization",
79
+ slug: DEFAULT_ORG_SLUG,
80
+ },
81
+ update: {},
82
+ });
83
+
84
+ await prisma.workspace.upsert({
85
+ where: {
86
+ organizationId_slug: {
87
+ organizationId: DEFAULT_ORG_ID,
88
+ slug: DEFAULT_WORKSPACE_SLUG,
89
+ },
90
+ },
91
+ create: {
92
+ id: DEFAULT_WORKSPACE_ID,
93
+ organizationId: DEFAULT_ORG_ID,
94
+ name: "Default Workspace",
95
+ slug: DEFAULT_WORKSPACE_SLUG,
96
+ },
97
+ update: {},
98
+ });
99
+
100
+ return { created: true };
101
+ }
102
+
103
+ async function main(): Promise<void> {
104
+ // Dynamic imports: the generated client + adapter are constructed only when
105
+ // this module actually runs as the seed entrypoint — never at import time
106
+ // (spec §5.2 Quality Constraints), matching the DI note on seed-test.ts's
107
+ // sibling and the lazy-require pattern in apps-paid/workspace/auth.ts.
108
+ const [{ PrismaClient: RealPrismaClient }, { PrismaPg }] = await Promise.all([
109
+ import("./generated/client/client.js"),
110
+ import("@prisma/adapter-pg"),
111
+ ]);
112
+ // Prisma 7 requires an explicit driver adapter (mirrors
113
+ // apps/api/src/lib/prisma.ts) — `new PrismaClient()` with no adapter throws.
114
+ const adapter = new PrismaPg({ connectionString: process.env.DATABASE_URL });
115
+ const prisma = new RealPrismaClient({ adapter });
116
+ try {
117
+ const { created } = await provisionDefaultWorkspace(prisma);
118
+ if (created) {
119
+ console.log(
120
+ `[seed] provisioned default workspace (org=${DEFAULT_ORG_ID}, workspace=${DEFAULT_WORKSPACE_ID})`,
121
+ );
122
+ } else {
123
+ console.log(
124
+ "[seed] no-op — a Workspace already exists (re-run or multi-tenant)",
125
+ );
126
+ }
127
+ } finally {
128
+ await prisma.$disconnect();
129
+ }
130
+ }
131
+
132
+ // Only run main() when this module is executed directly (`tsx seed.ts`), not
133
+ // when imported by the unit test — keeps the testable core free of any
134
+ // module-level client construction (spec §5.2 Quality Constraints).
135
+ //
136
+ // Compares argv[1]'s basename rather than `import.meta.url` or
137
+ // `require.main`: this package is `"type": "module"`, so neither `require`
138
+ // nor `__filename` exists at real runtime (tsx does not shim them under true
139
+ // ESM), and `import.meta` is a TS compile-time restriction under ts-jest's
140
+ // CommonJS-targeted transform (jest.config.cjs) that would break
141
+ // `__tests__/seed.test.ts` importing this module regardless of whether the
142
+ // guard ever evaluates true.
143
+ if (basename(process.argv[1] ?? "") === "seed.ts") {
144
+ main().catch((err) => {
145
+ console.error("[seed] failed:", err);
146
+ process.exit(1);
147
+ });
148
+ }
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Default tenancy identity constants — the SINGLE source of truth (spec D3).
3
+ *
4
+ * The well-known default Organization + Workspace ids/slugs that the
5
+ * single-tenant provision seed (Phase 1, #3622 — `database/seed.ts`) creates,
6
+ * and that the session-resolution guard (Phase 2, #3627 —
7
+ * `apps/api/src/services/tenant-context.ts`) binds on to resolve a default
8
+ * scope for a single-tenant deployment. Exported publicly via the
9
+ * `@working-theory/database/tenancy` subpath (see `package.json` `exports`)
10
+ * so `apps/api` can import them across the package boundary without a second,
11
+ * drift-prone declaration of the tenant-isolation identity.
12
+ *
13
+ * See docs/specs/single-tenant-session-workspace-spec.md §3 D3.
14
+ */
15
+
16
+ // The three constants below are SENTINEL ids from the reserved range of the
17
+ // prefixed-UUIDv7 scheme (ADR-0031 rule 7): zero timestamp bits + version 7 +
18
+ // variant 8 + a small counter suffix. They are valid-shaped v7 ids (the
19
+ // database CHECK constraints admit them), can never collide with a generated
20
+ // id (a real v7's timestamp bits are the current epoch-ms, never zero), and
21
+ // are recognizable via `isSentinel(id)` from `@working-theory/ids` — key on
22
+ // that predicate, never a hardcoded literal. They carry the branded `Id<E>`
23
+ // types so consumers get compile-time entity safety (ADR-0031 rule 5).
24
+
25
+ import type { Id } from "@working-theory/ids";
26
+
27
+ /** Well-known default Organization identity — a fixed reserved-range sentinel. */
28
+ export const DEFAULT_ORG_ID =
29
+ "org_00000000-0000-7000-8000-000000000001" as Id<"organization">;
30
+ export const DEFAULT_ORG_SLUG = "default";
31
+
32
+ /** Well-known default Workspace identity — a fixed reserved-range sentinel. */
33
+ export const DEFAULT_WORKSPACE_ID =
34
+ "wksp_00000000-0000-7000-8000-000000000001" as Id<"workspace">;
35
+ export const DEFAULT_WORKSPACE_SLUG = "default";
36
+
37
+ /**
38
+ * Well-known Membership id the single-tenant owner-pin binds the operator
39
+ * to (docs/specs/single-tenant-owner-pin-spec.md D2). A fixed sentinel id
40
+ * makes the TOFU operator-binding insert race-safe: the `Membership.id`
41
+ * primary-key uniqueness — not application-level "is this the first
42
+ * user?" logic — enforces exactly one owner under concurrent first-logins.
43
+ */
44
+ export const OPERATOR_MEMBERSHIP_ID =
45
+ "member_00000000-0000-7000-8000-000000000001" as Id<"membership">;
@@ -0,0 +1,15 @@
1
+ {
2
+ "extends": "../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "./dist",
7
+ "rootDir": ".",
8
+ "declaration": true,
9
+ "noEmit": false,
10
+ "skipLibCheck": true,
11
+ "types": ["node"]
12
+ },
13
+ "include": ["flows/**/*.ts"],
14
+ "exclude": ["node_modules", "dist", "**/*.test.ts", "**/__tests__/**"]
15
+ }
@@ -5,5 +5,11 @@
5
5
  "rootDir": ".",
6
6
  "types": ["node"]
7
7
  },
8
- "include": ["prisma.config.ts", "seed-test.ts"]
8
+ "include": [
9
+ "prisma.config.ts",
10
+ "seed.ts",
11
+ "seed-test.ts",
12
+ "tenancy.ts",
13
+ "flows/**/*.ts"
14
+ ]
9
15
  }
@@ -0,0 +1,14 @@
1
+ {
2
+ "extends": "../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "module": "NodeNext",
5
+ "moduleResolution": "NodeNext",
6
+ "outDir": "./dist",
7
+ "rootDir": ".",
8
+ "declaration": true,
9
+ "noEmit": false,
10
+ "skipLibCheck": true,
11
+ "types": ["node"]
12
+ },
13
+ "include": ["tenancy.ts"]
14
+ }
@@ -4,64 +4,28 @@
4
4
  "description": "AI Launch Kit starter site.",
5
5
  "license": "UNLICENSED",
6
6
  "scripts": {
7
- "lint": "NODE_OPTIONS=--max-old-space-size=12288 eslint . --cache",
8
- "lint:ci": "tsx scripts/lint-sharded.ts",
9
- "lint:frontend": "NODE_OPTIONS=--max-old-space-size=12288 eslint packages/ui packages/theme --cache",
10
- "lint:fix": "NODE_OPTIONS=--max-old-space-size=12288 eslint . --cache --fix",
11
- "type-check": "pnpm --filter @working-theory/database run db:generate && pnpm --filter @working-theory/web exec fumadocs-mdx && tsc -b && pnpm --filter \"@working-theory/dashboard-web\" run type-check && pnpm --filter \"@working-theory/storybook-gate\" run type-check",
12
- "verify:ui-clean": "pnpm --filter @working-theory/theme run build && pnpm --filter @working-theory/ui exec tsc -b --force",
13
- "architecture": "tsx tools/lint-architecture.ts",
14
- "audit:coverage": "tsx tools/audit-coverage.ts",
15
- "lint:coverage-thresholds": "tsx tools/lint-coverage-thresholds.ts",
16
- "env:check": "tsx tools/validate-env.ts",
17
- "schema:check": "tsx tools/validate-schemas.ts",
18
- "spec-ac:check": "tsx tools/lint-spec-ac.ts",
19
- "lint:rtl": "tsx tools/lint-rtl/check.ts",
20
- "lint:styling-conformance": "tsx tools/lint-styling-conformance/check.ts",
21
- "lint:required-checks": "tsx tools/lint-required-checks.ts",
22
- "collisions:check": "bash tools/check-collisions.sh",
23
- "component:inventory": "tsx scripts/component/component-inventory.ts",
24
- "component:manifest": "tsx scripts/component/gen-sweep-manifest.ts",
25
- "component:page-manifest": "tsx scripts/component/gen-page-manifest.ts docs/internal/pages/page-manifest.md",
26
- "pages:check": "tsx scripts/component/gen-page-manifest.ts docs/internal/pages/page-manifest.md --check",
27
- "check-page-types": "tsx scripts/component/check-page-type-alignment.ts",
28
- "check-content-renders": "tsx tools/lint-check-content-renders.ts",
29
- "check-mdx-vocabulary": "tsx tools/lint-mdx-component-vocabulary.ts",
30
- "theme:check": "tsx scripts/check-design-system-sync.ts",
31
- "content:compile": "TSX_TSCONFIG_PATH=tools/tsconfig.json tsx tools/content-compile/index.ts",
32
- "codegen": "tsx tools/codegen/run.ts",
33
- "preflight": "bash scripts/preflight.sh",
34
- "preflight:frontend": "PREFLIGHT_SCOPE=frontend bash scripts/preflight.sh",
7
+ "dev": "pnpm --parallel -r dev",
8
+ "build": "pnpm -r build",
9
+ "start": "pnpm --filter @working-theory/web start",
10
+ "test": "pnpm -r test",
11
+ "test:watch": "pnpm -r test:watch",
12
+ "lint": "pnpm -r --if-present lint",
13
+ "type-check": "pnpm -r --if-present type-check",
35
14
  "format": "prettier --write .",
36
15
  "format:check": "prettier --check .",
37
- "test": "pnpm -r test && jest --config jest.config.cjs",
38
- "test:ci": "tsx scripts/test-sharded.ts",
39
- "test:architecture": "jest --config jest.config.cjs tests/architecture",
40
- "test:watch": "pnpm -r test:watch",
41
- "build": "pnpm -r build",
42
- "dev": "pnpm --parallel -r dev",
43
- "db:generate": "pnpm --filter @working-theory/database exec prisma generate",
44
- "db:migrate": "pnpm --filter @working-theory/database exec prisma migrate dev",
45
- "db:migrate:deploy": "pnpm --filter @working-theory/database exec prisma migrate deploy",
46
- "db:seed": "pnpm --filter @working-theory/database run seed",
47
- "db:studio": "pnpm --filter @working-theory/database exec prisma studio",
48
- "prepare": "husky",
49
- "aeo": "pnpm --filter @working-theory/aeo run",
50
- "changeset": "changeset",
51
- "changeset:version": "changeset version && pnpm install --lockfile-only",
52
- "changeset:publish": "changeset publish",
53
- "storybook:build": "pnpm --filter @working-theory/theme run build && pnpm --filter @working-theory/ui run build && pnpm --filter @working-theory/ui exec storybook build -o ../../storybook-static",
54
- "visual:test": "playwright test --config tests/visual/playwright.config.ts",
55
- "visual:test:live-app": "playwright test --config tests/visual/playwright-live-app.config.ts"
16
+ "db:generate": "pnpm --filter @working-theory/database run db:generate",
17
+ "db:migrate": "pnpm --filter @working-theory/database run db:migrate",
18
+ "db:migrate:deploy": "pnpm --filter @working-theory/database run db:migrate:deploy",
19
+ "db:seed": "pnpm --filter @working-theory/database run db:seed",
20
+ "db:studio": "pnpm --filter @working-theory/database run db:studio"
56
21
  },
57
22
  "devDependencies": {
58
23
  "@changesets/changelog-github": "^0.7.0",
59
- "@playwright/test": "^1.61.1",
60
- "http-server": "^14.1.1",
61
- "wait-on": "^8.0.1",
62
24
  "@changesets/cli": "^2.27.0",
63
25
  "@eslint/js": "^10.0.1",
64
26
  "@lhci/cli": "^0.15.1",
27
+ "@mdx-js/mdx": "^3.1.1",
28
+ "@playwright/test": "^1.61.1",
65
29
  "@stryker-mutator/core": "^8.7.1",
66
30
  "@stryker-mutator/jest-runner": "^8.7.1",
67
31
  "@types/jest": "^30.0.0",
@@ -70,6 +34,7 @@
70
34
  "@typescript-eslint/parser": "^8.62.1",
71
35
  "ajv": "^8.20.0",
72
36
  "ajv-formats": "^3.0.1",
37
+ "axe-core": "^4.10.0",
73
38
  "eslint": "^10.6.0",
74
39
  "eslint-import-resolver-typescript": "^4.4.5",
75
40
  "eslint-plugin-import-x": "^4.17.1",
@@ -78,20 +43,24 @@
78
43
  "eslint-plugin-promise": "^7.2.1",
79
44
  "expect-type": "^1.4.0",
80
45
  "globals": "^17.7.0",
81
- "ts-declaration-location": "^1.0.7",
46
+ "gray-matter": "^4.0.3",
47
+ "http-server": "^14.1.1",
82
48
  "husky": "^9.1.7",
83
49
  "jest": "^30.4.2",
84
50
  "jiti": "^2.4.2",
85
51
  "lint-staged": "^15.3.0",
86
52
  "prettier": "^3.9.4",
53
+ "ts-declaration-location": "^1.0.7",
87
54
  "ts-jest": "^29.4.11",
88
55
  "tsx": "^4.22.4",
56
+ "turbo": "^2.10.4",
89
57
  "typescript": "^6.0.3",
90
58
  "typescript-eslint": "^8.62.1",
59
+ "wait-on": "^8.0.1",
91
60
  "yaml": "^2.9.0",
92
61
  "zod": "^4.2.1",
93
62
  "zod-to-ts": "^2.1.0",
94
- "@working-theory/cli": "^0.1.2"
63
+ "@working-theory/cli": "^0.19.0"
95
64
  },
96
65
  "lint-staged": {
97
66
  "*.{ts,tsx}": [
@@ -104,22 +73,28 @@
104
73
  "bash -c 'pnpm architecture'"
105
74
  ]
106
75
  },
107
- "packageManager": "pnpm@9.15.0",
76
+ "packageManager": "pnpm@10.34.5+sha512.a4ee05f2f73658255bd6a89859c065a45c28a57daefae2c893a168ee2b73168c37b91e83e57ea67654ad03f03031746430e8bce38e362e042605fb8abc80192e",
108
77
  "engines": {
109
78
  "node": ">=20.19.0"
110
79
  },
111
80
  "pnpm": {
81
+ "onlyBuiltDependencies": [
82
+ "prisma"
83
+ ],
112
84
  "auditConfig": {
113
85
  "ignoreGhsas": [
114
86
  "GHSA-gv7w-rqvm-qjhr"
115
87
  ]
116
88
  },
117
89
  "overrides": {
118
- "tar": "^7.5.15",
90
+ "tar": "^7.5.21",
119
91
  "protobufjs": "^8.4.1",
120
92
  "@grpc/grpc-js": "^1.14.4",
121
93
  "hono": ">=4.12.25",
122
- "undici": "^7.28.0"
94
+ "undici": "^7.28.0",
95
+ "js-yaml@3": "^3.15.0",
96
+ "js-yaml@4": "^4.3.0",
97
+ "brace-expansion@2": "^2.1.2"
123
98
  }
124
99
  }
125
100
  }
@@ -1,6 +1,3 @@
1
1
  packages:
2
2
  - "apps/*"
3
- - "apps-paid/*"
4
- - "packages/*"
5
- - "packages-paid/*"
6
3
  - "database"
@@ -3,7 +3,7 @@ schema_version: 1
3
3
  # project.yaml — per-repo configuration consumed by Claude Code skills and
4
4
  # global rules. Replace REPLACE_ME values with your repo's actual identity.
5
5
  #
6
- # See https://github.com/tailwind-ai/ai-launch-kit/blob/main/project.yaml
6
+ # See https://github.com/working-theory-labs/ai-launch-kit/blob/main/project.yaml
7
7
  # for AI Launch Kit's own canonical example.
8
8
 
9
9
  identity:
@@ -4,42 +4,6 @@
4
4
  { "path": "./apps/api" },
5
5
  { "path": "./apps/mcp" },
6
6
  { "path": "./apps/web" },
7
- { "path": "./database/tsconfig.build.json" },
8
- { "path": "./apps-paid/billing" },
9
- { "path": "./apps-paid/license-issuer" },
10
- { "path": "./apps-paid/marketing-api" },
11
- { "path": "./apps-paid/marketing-mcp" },
12
- { "path": "./packages/aeo" },
13
- { "path": "./packages/agent-context" },
14
- { "path": "./packages/analytics" },
15
- { "path": "./packages/api-client" },
16
- { "path": "./packages/common" },
17
- { "path": "./packages/license" },
18
- { "path": "./packages/cda-filesystem" },
19
- { "path": "./packages/cli" },
20
- { "path": "./packages/content-adapters" },
21
- { "path": "./packages/content-projection" },
22
- { "path": "./packages/email" },
23
- { "path": "./packages/env" },
24
- { "path": "./packages/fumadocs-schema" },
25
- { "path": "./packages/metadata" },
26
- { "path": "./packages/observability" },
27
- { "path": "./packages/schema" },
28
- { "path": "./packages/schema-validator" },
29
- { "path": "./packages/schema-pack-registry" },
30
- { "path": "./packages/sections-registry" },
31
- { "path": "./packages/site-config" },
32
- { "path": "./packages/stripe-client" },
33
- { "path": "./packages/theme" },
34
- { "path": "./packages/ui" },
35
- { "path": "./packages/validation" },
36
- { "path": "./packages/web-i18n" },
37
- { "path": "./packages-paid/billing-client" },
38
- { "path": "./packages-paid/branding" },
39
- { "path": "./packages-paid/license-client" },
40
- { "path": "./packages-paid/license-manifest" },
41
- { "path": "./packages-paid/marketing-api-client" },
42
- { "path": "./packages-paid/partner-session" },
43
- { "path": "./packages-paid/preview-protocol" }
7
+ { "path": "./database/tsconfig.build.json" }
44
8
  ]
45
9
  }
@@ -1,94 +0,0 @@
1
- /**
2
- * @file cookie-attributes.test.ts (S13 adversarial)
3
- *
4
- * Verifies that `apps/web/auth.ts` does NOT weaken Better Auth's secure-cookie
5
- * defaults. Better Auth's `nextCookies()` plugin emits session cookies with
6
- * `HttpOnly`, `Secure` (in non-dev environments), `SameSite=Lax`, and
7
- * `Path=/`. The configuration in `auth.ts` must not override any of those.
8
- *
9
- * Strategy: mock `better-auth` so its real ESM-only module never loads in the
10
- * Jest CJS preset. The mock's `betterAuth(options)` returns `{ options }` so
11
- * the test can inspect the raw config object the AILK code passed in. The
12
- * assertions guard the AILK-owned surface, not Better Auth's emission
13
- * (that's the library's contract).
14
- */
15
-
16
- jest.mock("better-auth", () => ({
17
- betterAuth: (options: unknown) => ({ options }),
18
- }));
19
-
20
- jest.mock("better-auth/adapters/prisma", () => ({
21
- prismaAdapter: () => ({ id: "mock-prisma-adapter" }),
22
- }));
23
-
24
- jest.mock("better-auth/next-js", () => ({
25
- nextCookies: () => ({ id: "next-cookies" }),
26
- }));
27
-
28
- import { createAuth } from "../../../auth";
29
-
30
- // Stub PrismaClient — avoids a real DB connection at module-load time.
31
- // Injected via createAuth({ prisma }) instead of jest.mock("../../../lib/prisma-for-auth").
32
- // Pattern mirrors apps-paid/dashboard-web/auth.ts DI.
33
- const stubPrisma = {} as NonNullable<NonNullable<Parameters<typeof createAuth>[0]>["prisma"]>;
34
- const auth = createAuth({ prisma: stubPrisma });
35
-
36
- type CookieAttrs = {
37
- httpOnly?: boolean;
38
- secure?: boolean;
39
- sameSite?: "lax" | "strict" | "none";
40
- path?: string;
41
- };
42
-
43
- type AdvancedCookies = {
44
- session_token?: { attributes?: CookieAttrs };
45
- session_data?: { attributes?: CookieAttrs };
46
- };
47
-
48
- type AuthOptions = {
49
- advanced?: {
50
- useSecureCookies?: boolean;
51
- cookies?: AdvancedCookies;
52
- defaultCookieAttributes?: CookieAttrs;
53
- };
54
- plugins?: Array<{ id?: string }>;
55
- session?: { expiresIn?: number; updateAge?: number };
56
- };
57
-
58
- // eslint-disable-next-line no-restricted-syntax -- the mocked betterAuth returns { options: <unknown> }; the real type carries no public options shape, so a double assertion is the narrow path to inspect the AILK-owned config object.
59
- const options = (auth as unknown as { options: AuthOptions }).options;
60
-
61
- describe("S13 adversarial — cookie attributes (config surface)", () => {
62
- it("does NOT disable useSecureCookies (Better Auth secure default preserved)", () => {
63
- expect(options.advanced?.useSecureCookies).not.toBe(false);
64
- });
65
-
66
- it("does NOT override session_token cookie to drop HttpOnly", () => {
67
- const sessionAttrs = options.advanced?.cookies?.session_token?.attributes;
68
- expect(sessionAttrs?.httpOnly).not.toBe(false);
69
- });
70
-
71
- it("does NOT override session_token cookie to drop Secure", () => {
72
- const sessionAttrs = options.advanced?.cookies?.session_token?.attributes;
73
- expect(sessionAttrs?.secure).not.toBe(false);
74
- });
75
-
76
- it("does NOT relax sameSite to 'none' (CSRF protection preserved)", () => {
77
- expect(
78
- options.advanced?.cookies?.session_token?.attributes?.sameSite,
79
- ).not.toBe("none");
80
- expect(options.advanced?.defaultCookieAttributes?.sameSite).not.toBe(
81
- "none",
82
- );
83
- });
84
-
85
- it("includes the nextCookies() plugin so Next.js sets cookies via Response", () => {
86
- const pluginIds = (options.plugins ?? []).map((p) => p.id);
87
- expect(pluginIds).toContain("next-cookies");
88
- });
89
-
90
- it("persists sessions in the database (admin-revocable model)", () => {
91
- expect(options.session).toBeDefined();
92
- expect(options.session?.expiresIn).toBeGreaterThan(0);
93
- });
94
- });
@@ -1,75 +0,0 @@
1
- /**
2
- * @file oauth-state-parameter.test.ts (S13 adversarial)
3
- *
4
- * OAuth `state` parameter protection. Better Auth's social-signin flow
5
- * generates an opaque `state` value on every OAuth handshake; the callback
6
- * route validates it. The AILK-owned surface that could disable this is
7
- * `auth.options` — there is no documented Better Auth knob to turn state
8
- * generation off, but a future migration to a custom plugin (e.g.
9
- * `genericOAuth`) could weaken it. This file pins the AILK config so a
10
- * regression that introduces a state-disabling override is caught.
11
- *
12
- * Strategy: mock `better-auth` so the real ESM-only module never loads;
13
- * inspect the options object the AILK code constructed.
14
- */
15
-
16
- jest.mock("better-auth", () => ({
17
- betterAuth: (options: unknown) => ({ options }),
18
- }));
19
-
20
- jest.mock("better-auth/adapters/prisma", () => ({
21
- prismaAdapter: () => ({ id: "mock-prisma-adapter" }),
22
- }));
23
-
24
- jest.mock("better-auth/next-js", () => ({
25
- nextCookies: () => ({ id: "next-cookies" }),
26
- }));
27
-
28
- import { createAuth } from "../../../auth";
29
-
30
- // Stub PrismaClient — avoids a real DB connection at module-load time.
31
- // Injected via createAuth({ prisma }) instead of jest.mock("../../../lib/prisma-for-auth").
32
- // Pattern mirrors apps-paid/dashboard-web/auth.ts DI.
33
- const stubPrisma = {} as NonNullable<NonNullable<Parameters<typeof createAuth>[0]>["prisma"]>;
34
- const auth = createAuth({ prisma: stubPrisma });
35
-
36
- type SocialProviderOpts = {
37
- skipStateCheck?: boolean;
38
- disableState?: boolean;
39
- };
40
-
41
- type AuthOptions = {
42
- plugins?: Array<{ id?: string }>;
43
- socialProviders?: Record<string, SocialProviderOpts>;
44
- };
45
-
46
- // eslint-disable-next-line no-restricted-syntax -- the mocked betterAuth returns { options: <unknown> }; the real type carries no public options shape, so a double assertion is the narrow path to inspect the AILK-owned config object.
47
- const options = (auth as unknown as { options: AuthOptions }).options;
48
-
49
- describe("S13 adversarial — OAuth state parameter", () => {
50
- it("auth config does NOT register a generic-oauth plugin (which would need explicit state config review)", () => {
51
- const plugins = options.plugins ?? [];
52
- const generic = plugins.find((p) => p.id === "generic-oauth");
53
- expect(generic).toBeUndefined();
54
- });
55
-
56
- it("active social providers do NOT carry a skipStateCheck override", () => {
57
- const providers = options.socialProviders ?? {};
58
- for (const [, opts] of Object.entries(providers)) {
59
- // No Better Auth option named skipStateCheck/disableState exists today.
60
- // The assertion guards against a custom wrapper that adds one.
61
- expect(opts.skipStateCheck).toBeFalsy();
62
- expect(opts.disableState).toBeFalsy();
63
- }
64
- });
65
-
66
- it("social provider entries are syntactically valid (each has an id-shaped key)", () => {
67
- const providers = options.socialProviders ?? {};
68
- // When env vars are unset (OSS standalone default) the map is empty.
69
- // Test passes vacuously. When wired, each provider has a non-empty key
70
- // which Better Auth uses to route state into the right cookie namespace.
71
- for (const name of Object.keys(providers)) {
72
- expect(name.length).toBeGreaterThan(0);
73
- }
74
- });
75
- });