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,118 @@
1
+ /**
2
+ * Site brand — the one place `apps/web` resolves its display name, base URL,
3
+ * and logo mark (#4984). Extracted verbatim from `app/[locale]/layout.tsx`
4
+ * so the /sign-in card can render the same brand mark the Nav + Footer
5
+ * chrome slots do, without a second copy drifting.
6
+ *
7
+ * #4157 — `SITE_NAME` / `SITE_BASE_URL` resolve, in order:
8
+ * 1. The env override (`NEXT_PUBLIC_SITE_NAME` / `NEXT_PUBLIC_BASE_URL`).
9
+ * 2. `content/_site.mdx`'s `siteName:` / `baseUrl:` frontmatter — the
10
+ * customer's own canonical site identity, set by `create-ailk` at
11
+ * scaffold time (or edited later, e.g. via the `set_site_identity` MCP
12
+ * tool).
13
+ * 3. A neutral, non-vendor fallback — used only when `_site.mdx` is
14
+ * missing or its frontmatter doesn't parse. NEVER "AI Launch Kit": a
15
+ * fresh scaffold's `_site.mdx` always carries the customer's real name
16
+ * (`packages/create-ailk/template-overlay/content/_site.mdx`), so this
17
+ * fallback is a last resort, not the everyday default.
18
+ *
19
+ * `_site.mdx` reading is a small, local, synchronous frontmatter parse
20
+ * rather than a dependency on `@working-theory/site-config`'s `loadSiteConfig`
21
+ * (`packages/site-config/src/server/load.ts`): that package is async (this
22
+ * module's exports are plain constants, read at many synchronous call
23
+ * sites — Nav/Footer props, `siteLogo()`, edge-safe route defaults) and
24
+ * brings gray-matter + Zod validation + optimistic-locking writes built for
25
+ * the agent-operator editing workflow — disproportionate for reading two
26
+ * fields. See docs/specs/4157-scaffold-brand-defaults-spec.md § Design
27
+ * Decisions (D1) for the full reasoning.
28
+ */
29
+
30
+ import { existsSync, readFileSync } from "node:fs";
31
+ import { join } from "node:path";
32
+
33
+ import type { ReactElement } from "react";
34
+ import { parse as parseYaml } from "yaml";
35
+
36
+ /** Neutral, non-vendor fallback — see module doc comment point 3. */
37
+ export const FALLBACK_SITE_NAME = "My Site";
38
+ /** Neutral, non-vendor fallback — see module doc comment point 3. */
39
+ export const FALLBACK_BASE_URL = "https://example.com";
40
+
41
+ const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
42
+
43
+ interface SiteFrontmatter {
44
+ // `| undefined` on top of `?` — required under exactOptionalPropertyTypes
45
+ // because readSiteFrontmatter() always sets both keys, sometimes to
46
+ // `undefined` (a plain `?: string` would forbid that explicit assignment).
47
+ siteName?: string | undefined;
48
+ baseUrl?: string | undefined;
49
+ }
50
+
51
+ /**
52
+ * Resolve the content root exactly the way
53
+ * `packages/page-renderer/src/content-selector.ts`'s (unexported)
54
+ * `resolveContentRoot()` does: `AILK_CONTENT_ROOT` env override, else two
55
+ * levels up from cwd — `apps/web` in dev/build, so `../../content` lands on
56
+ * the site/scaffold root's `content/` directory. Duplicated locally because
57
+ * that resolver isn't part of `@working-theory/page-renderer`'s public API.
58
+ */
59
+ function resolveContentRoot(): string {
60
+ const override = process.env.AILK_CONTENT_ROOT;
61
+ if (override && override.length > 0) return override;
62
+ return join(process.cwd(), "..", "..", "content");
63
+ }
64
+
65
+ /**
66
+ * Synchronously read + parse just the `siteName` / `baseUrl` frontmatter
67
+ * fields out of `_site.mdx`. Returns `null` on any failure (file absent,
68
+ * unreadable, no frontmatter block, unparseable YAML) — callers fall back to
69
+ * a neutral default, never to a vendor-branded one.
70
+ */
71
+ function readSiteFrontmatter(): SiteFrontmatter | null {
72
+ try {
73
+ const path = join(resolveContentRoot(), "_site.mdx");
74
+ if (!existsSync(path)) return null;
75
+
76
+ const raw = readFileSync(path, "utf8");
77
+ const match = FRONTMATTER_RE.exec(raw);
78
+ if (!match) return null;
79
+
80
+ const parsed: unknown = parseYaml(match[1] ?? "");
81
+ if (!parsed || typeof parsed !== "object") return null;
82
+
83
+ const { siteName, baseUrl } = parsed as Record<string, unknown>;
84
+ return {
85
+ siteName: typeof siteName === "string" ? siteName : undefined,
86
+ baseUrl: typeof baseUrl === "string" ? baseUrl : undefined,
87
+ };
88
+ } catch {
89
+ return null;
90
+ }
91
+ }
92
+
93
+ // Read once at module init — mirrors the existing SITE_NAME contract (a
94
+ // plain constant, not a function), and every consumer of this module already
95
+ // runs in the Node.js runtime (no `content/` access exists in the Edge
96
+ // runtime, so `app/og/route.tsx` — the one Edge-runtime consumer among the
97
+ // #4157 sites — deliberately does NOT import this module; see its own
98
+ // comment).
99
+ const siteFrontmatter = readSiteFrontmatter();
100
+
101
+ export const SITE_NAME =
102
+ process.env.NEXT_PUBLIC_SITE_NAME ?? siteFrontmatter?.siteName ?? FALLBACK_SITE_NAME;
103
+
104
+ export const SITE_BASE_URL =
105
+ process.env.NEXT_PUBLIC_BASE_URL ?? siteFrontmatter?.baseUrl ?? FALLBACK_BASE_URL;
106
+
107
+ /**
108
+ * Shared brand mark — the light/dark logo pair, mode-switched via the theme
109
+ * `dark:` utility. RSC-safe (no hooks, no client state).
110
+ */
111
+ export function siteLogo(): ReactElement {
112
+ return (
113
+ <>
114
+ <img src="/logo-light.svg" alt={SITE_NAME} height={28} className="block dark:hidden" />
115
+ <img src="/logo-dark.svg" alt={SITE_NAME} height={28} className="hidden dark:block" />
116
+ </>
117
+ );
118
+ }
@@ -4,7 +4,12 @@
4
4
  "docs": "Docs",
5
5
  "blog": "Blog",
6
6
  "openMenu": "Open navigation menu",
7
- "closeMenu": "Close navigation menu"
7
+ "closeMenu": "Close navigation menu",
8
+ "moreLinks": "More links",
9
+ "schedule": "Book a call",
10
+ "signIn": "Sign in",
11
+ "signOut": "Sign out",
12
+ "account": "Account"
8
13
  },
9
14
  "consent": {
10
15
  "title": "Cookie Preferences",
@@ -14,10 +19,10 @@
14
19
  "policyLinkLabel": "Privacy policy"
15
20
  },
16
21
  "common": {
17
- "siteTitle": "AI Launch Kit"
22
+ "siteTitle": "My Site"
18
23
  },
19
24
  "home": {
20
- "heading": "AI Launch Kit",
25
+ "heading": "My Site",
21
26
  "emptyState": "AX-first OSS template for shipping software with API + MCP as canonical surfaces."
22
27
  },
23
28
  "about": {
@@ -58,7 +63,22 @@
58
63
  "messageLabel": "Message",
59
64
  "sending": "Sending\u2026",
60
65
  "sendMessage": "Send message",
61
- "successMessage": "Thank you for reaching out! We will be in touch shortly."
66
+ "successMessage": "Thank you for reaching out! We will be in touch shortly.",
67
+ "intake": {
68
+ "guidedBadge": "Guided",
69
+ "skip": "Skip",
70
+ "send": "Send",
71
+ "freeTextPlaceholder": "Type your answer\u2026",
72
+ "nameAck": "Thanks for stopping by!",
73
+ "namePrompt": "What's your name?",
74
+ "messageAck": "Good to meet you.",
75
+ "messagePrompt": "What are you hoping to get done?",
76
+ "emailAck": "Got it \u2014 last one.",
77
+ "emailPrompt": "What's the best email to reach you at?",
78
+ "skipMessage": "No worries \u2014 here's our form instead.",
79
+ "completionMessage": "Thanks! We'll be in touch shortly.",
80
+ "submitError": "We couldn't send that automatically \u2014 please review and send below."
81
+ }
62
82
  },
63
83
  "downloads": {
64
84
  "heading": "Downloads",
@@ -72,9 +92,71 @@
72
92
  "heading": "FAQ",
73
93
  "emptyState": "Frequently asked questions content coming soon."
74
94
  },
95
+ "flow": {
96
+ "progress": "Step {current} of {total}",
97
+ "validationRequired": "This field is required",
98
+ "validationInvalidEmail": "Enter a valid email address",
99
+ "validationSelectOption": "Choose an option to continue",
100
+ "validationTooLong": "This value is too long",
101
+ "validationInvalidUrl": "Enter a valid URL",
102
+ "validationTooShort": "Please add a bit more detail",
103
+ "validationSelectAtLeastOne": "Choose at least one option to continue",
104
+ "submitError": "Something went wrong, please try again.",
105
+ "rateLimited": "Too many attempts — please wait {seconds}s and try again.",
106
+ "next": "Continue",
107
+ "completedTitle": "You're all set",
108
+ "completedBody": "Thanks — we'll be in touch shortly.",
109
+ "goBack": "Go Back",
110
+ "computing": "Scoring your site's AI visibility...",
111
+ "whyThis": "Why this?",
112
+ "selectAllThatApply": "Select all that apply",
113
+ "getStarted": "Get Started",
114
+ "landingIntro": "A few short questions, then your result \u2014 it takes about a minute.",
115
+ "bookCall": "Book a Call",
116
+ "emailMePlan": "Save plan",
117
+ "pairingTitle": "Better together",
118
+ "pay": "Pay",
119
+ "back": "Back",
120
+ "emailStepTitle": "Where should we send your receipt?",
121
+ "emailStepSaveTitle": "Where should we send your plan?",
122
+ "emailPlaceholder": "you@company.com",
123
+ "checkoutSuccess": "Payment received \u2014 we'll be in touch to get you set up.",
124
+ "checkoutCancelled": "Checkout cancelled \u2014 your recommendation is still here whenever you're ready.",
125
+ "savedTitle": "Plan sent",
126
+ "savedBody": "Check your inbox \u2014 your recommendation is on its way.",
127
+ "checkoutError": "We couldn't start checkout \u2014 please try again.",
128
+ "sidePanel": {
129
+ "anchorTitle": "Not sure where to start?"
130
+ },
131
+ "price": {
132
+ "fromPrefix": "From"
133
+ },
134
+ "priceCard": {
135
+ "eyebrow": "Recommended for you",
136
+ "seatRowLabel": "Seats",
137
+ "creditRowLabel": "Credits",
138
+ "totalLabel": "Total",
139
+ "dueTodayLabel": "Due today",
140
+ "periodLabels": {
141
+ "monthly": "per month",
142
+ "annual": "per year",
143
+ "one-time": "one-time"
144
+ },
145
+ "seatsLabel": "Seats",
146
+ "decrementLabel": "Remove a seat",
147
+ "incrementLabel": "Add a seat",
148
+ "periodLabel": "Billing",
149
+ "creditsLabel": "Add-on credits",
150
+ "creditNoneLabel": "None",
151
+ "creditTierLabel": "{credits} credits",
152
+ "showBreakdownLabel": "Show breakdown",
153
+ "hideBreakdownLabel": "Hide breakdown"
154
+ },
155
+ "questions": {}
156
+ },
75
157
  "how-to": {
76
158
  "heading": "How-To Guides",
77
- "description": "Step-by-step guides for building with AI Launch Kit.",
159
+ "description": "Step-by-step guides for building with this site.",
78
160
  "emptyState": "How-to guides coming soon."
79
161
  },
80
162
  "integrations": {
@@ -101,6 +183,24 @@
101
183
  "heading": "Resources",
102
184
  "emptyState": "Resources listing coming soon."
103
185
  },
186
+ "schedule": {
187
+ "title": "Book a call",
188
+ "description": "Pick a time that works for you.",
189
+ "eyebrow": "Book a call",
190
+ "headline": "Pick a time that works",
191
+ "confirmed": {
192
+ "title": "You're booked",
193
+ "description": "Your call is confirmed and the calendar invite is on its way.",
194
+ "headline": "You're booked",
195
+ "subheadline": "The calendar invite is on its way to your inbox. Add it now so the time is held on both sides.",
196
+ "prepareHeadline": "Before the call",
197
+ "prepareBody": "Come with the one problem you most want solved. The more specific it is, the more we can get through in the time we have. If something changes, the invite carries a reschedule link \u2014 use it rather than letting the slot go quiet.",
198
+ "ctaHeadline": "While you wait",
199
+ "ctaDescription": "Have a look around, or get in touch if something comes up before we speak.",
200
+ "ctaPrimaryLabel": "Back to the site",
201
+ "ctaSecondaryLabel": "Contact us"
202
+ }
203
+ },
104
204
  "services": {
105
205
  "heading": "Services",
106
206
  "emptyState": "Services listing coming soon."
@@ -112,7 +212,7 @@
112
212
  },
113
213
  "tech-articles": {
114
214
  "heading": "Technical Articles",
115
- "description": "Deep dives into the architecture and internals of AI Launch Kit.",
215
+ "description": "Deep dives into the architecture and internals of this site.",
116
216
  "emptyState": "Technical articles coming soon."
117
217
  },
118
218
  "testimonials": {
@@ -123,9 +223,177 @@
123
223
  "heading": "Use Cases",
124
224
  "emptyState": "Use cases listing coming soon."
125
225
  },
226
+ "waitlistDashboard": {
227
+ "gate": {
228
+ "emptyHeadline": "Sign-in is not configured",
229
+ "emptyDescription": "No sign-in provider is active for this deployment yet. Set the provider environment variables to enable operator access.",
230
+ "signInLink": "Go to the sign-in page"
231
+ },
232
+ "status": {
233
+ "live": "Live",
234
+ "closed": "Closed",
235
+ "draft": "Draft"
236
+ },
237
+ "mode": {
238
+ "lead-capture": "Lead capture",
239
+ "qualifying": "Qualifying",
240
+ "paid": "Paid",
241
+ "recommending": "Recommending"
242
+ },
243
+ "common": {
244
+ "unavailable": "—",
245
+ "direct": "(direct)",
246
+ "other": "(other)",
247
+ "forbiddenHeadline": "You don't have access",
248
+ "forbiddenDescription": "Ask an owner or admin on this workspace for access to the waitlist dashboard."
249
+ },
250
+ "list": {
251
+ "title": "Waitlist experiments",
252
+ "description": "Every experiment in your scope, with a cross-experiment rollup above the list.",
253
+ "rollupAriaLabel": "Waitlist rollup",
254
+ "rollup": {
255
+ "live": "live",
256
+ "closed": "closed",
257
+ "draft": "draft",
258
+ "raw": "raw signups",
259
+ "qualified": "qualified",
260
+ "rate": "qualification rate",
261
+ "sites": "sites"
262
+ },
263
+ "table": {
264
+ "caption": "Experiments in your scope",
265
+ "columnKey": "Key",
266
+ "columnMode": "Mode",
267
+ "columnStatus": "Status",
268
+ "columnWaitlists": "Waitlists",
269
+ "columnRaw": "Raw",
270
+ "columnQualified": "Qualified",
271
+ "columnRate": "Rate",
272
+ "columnUpdated": "Updated",
273
+ "emptyHeadline": "No experiments yet",
274
+ "emptyDescription": "Experiments you create will appear here."
275
+ },
276
+ "offers": {
277
+ "captionPrefix": "Offer funnel \u2014",
278
+ "columnOffer": "Offer",
279
+ "columnRecommended": "Recommended",
280
+ "columnSaved": "Saved",
281
+ "columnCheckedOut": "Checked out"
282
+ }
283
+ },
284
+ "level": {
285
+ "gate": "Gate",
286
+ "label": "Level {n}"
287
+ },
288
+ "comparison": {
289
+ "breadcrumbExperiments": "Experiments",
290
+ "site": "Site",
291
+ "created": "Created",
292
+ "waitlistsCount": "Waitlists",
293
+ "campaigns": "Campaigns",
294
+ "tableCaption": "Signups by waitlist",
295
+ "columnTotal": "Total",
296
+ "rowRaw": "Raw signups",
297
+ "rowQualified": "Qualified",
298
+ "rowRate": "Qualification rate",
299
+ "tierRowPrefix": "Tier",
300
+ "bySourceCaption": "Conversion by source",
301
+ "bySourceColumnSource": "Source",
302
+ "bySourceColumnRaw": "Raw",
303
+ "bySourceColumnQualified": "Qualified",
304
+ "bySourceColumnRate": "Rate",
305
+ "distributionAnswered": "{count} answered",
306
+ "distributionNoAnswers": "No answers yet.",
307
+ "signupsCaption": "Signups",
308
+ "signupsColumnEmail": "Email",
309
+ "signupsColumnWaitlist": "Waitlist",
310
+ "signupsColumnSource": "Source",
311
+ "signupsColumnCreated": "Captured",
312
+ "signupsColumnTier": "Tier",
313
+ "signupsColumnScore": "Score",
314
+ "signupsNext": "Next",
315
+ "notFoundHeadline": "Experiment not found",
316
+ "notFoundDescription": "This experiment doesn't exist, or isn't in your scope.",
317
+ "genericTitle": "Waitlist comparison"
318
+ },
319
+ "signup": {
320
+ "breadcrumbComparison": "Comparison",
321
+ "email": "Email",
322
+ "waitlist": "Waitlist",
323
+ "source": "Source",
324
+ "captured": "Captured",
325
+ "tier": "Tier",
326
+ "score": "Score",
327
+ "answersTitle": "Answers",
328
+ "categoryScoresTitle": "Category scores",
329
+ "decidingDefsTitle": "Deciding factors",
330
+ "ruleTraceTitle": "Rule trace",
331
+ "notScoredHeadline": "Not scored",
332
+ "notScoredDescription": "No score has been computed for this signup yet.",
333
+ "notFoundHeadline": "Signup not found",
334
+ "notFoundDescription": "This signup doesn't exist, or isn't in your scope.",
335
+ "genericTitle": "Waitlist signup"
336
+ }
337
+ },
126
338
  "whitepapers": {
127
339
  "heading": "Whitepapers",
128
- "description": "In-depth research and strategy papers from the AI Launch Kit team.",
340
+ "description": "In-depth research and strategy papers from this site's team.",
129
341
  "emptyState": "Whitepapers coming soon."
342
+ },
343
+ "signIn": {
344
+ "title": "Sign in",
345
+ "description": "Sign in to your account.",
346
+ "heading": "Sign in to your account",
347
+ "subhead": "Welcome back. Choose how you'd like to continue.",
348
+ "notConfiguredSubhead": "Sign-in is not configured for this site yet. Set a provider's environment variables to enable it.",
349
+ "ssoPrefix": "Sign in with",
350
+ "google": "Google",
351
+ "github": "GitHub",
352
+ "email": "Email address",
353
+ "password": "Password",
354
+ "forgot": "Forgot password?",
355
+ "submit": "Sign in",
356
+ "orContinue": "Or continue with",
357
+ "signInFailed": "We couldn't sign you in. Check your details and try again.",
358
+ "providerFailed": "We couldn't start sign-in with that provider. Try again."
359
+ },
360
+ "account": {
361
+ "title": "Your account",
362
+ "description": "Your profile, results, and purchases.",
363
+ "nav": {
364
+ "profile": "Profile",
365
+ "results": "Results",
366
+ "purchases": "Purchases"
367
+ },
368
+ "profile": {
369
+ "heading": "Profile",
370
+ "name": "Name",
371
+ "email": "Email",
372
+ "verified": "Email verified",
373
+ "unverified": "Email not verified",
374
+ "unavailable": "—",
375
+ "signOut": "Sign out"
376
+ },
377
+ "results": {
378
+ "heading": "My results",
379
+ "experiment": "Experiment",
380
+ "waitlist": "Waitlist",
381
+ "tier": "Tier",
382
+ "score": "Score",
383
+ "completedAt": "Completed",
384
+ "unavailable": "—",
385
+ "emptyHeadline": "No results yet",
386
+ "emptyDescription": "Complete a diagnostic and your results will appear here."
387
+ },
388
+ "purchases": {
389
+ "heading": "My purchases",
390
+ "offer": "Offer",
391
+ "status": "Status",
392
+ "amount": "Amount",
393
+ "period": "Period",
394
+ "date": "Date",
395
+ "emptyHeadline": "No purchases yet",
396
+ "emptyDescription": "Purchases you complete will appear here."
397
+ }
130
398
  }
131
399
  }
@@ -72,9 +72,17 @@ export function middleware(request: NextRequest): NextResponse {
72
72
  return intlResponse;
73
73
  }
74
74
 
75
- // Skip Next.js internal assets and favicons — security headers attach to
76
- // user-facing routes and API handlers, not framework asset endpoints.
75
+ // Skip Next.js internal assets and public/ files — security headers attach to
76
+ // user-facing routes and API handlers, not framework or static asset endpoints.
77
77
  // Also exclude next-intl-specific internal paths (_next/server).
78
+ //
79
+ // The trailing `.*\\..*` alternative excludes any path whose last segment
80
+ // contains a dot, i.e. every file with an extension. Without it the negative
81
+ // lookahead named only favicon.ico, so next-intl's locale rewrite swallowed
82
+ // every OTHER public/ asset — logo-light.svg, logo-dark.svg, site.webmanifest,
83
+ // og-default.png — and each 404'd (#4090 item 4). robots.txt and sitemap.xml are
84
+ // route handlers rather than public/ files, but they carry extensions too and
85
+ // are equally not locale-scoped, so the same rule covers them.
78
86
  export const config = {
79
- matcher: "/((?!_next/static|_next/image|_next/server|favicon.ico).*)",
87
+ matcher: "/((?!_next/static|_next/image|_next/server|.*\\..*).*)",
80
88
  };
@@ -88,10 +88,16 @@ const nextConfig = {
88
88
  // pnpm-workspace.yaml files exist (e.g. in agent worktrees).
89
89
  outputFileTracingRoot: join(process.cwd(), "../../"),
90
90
  // Include all MDX content files in the standalone bundle.
91
- // Paths are relative to outputFileTracingRoot (repo root).
92
91
  // Scoped to *.mdx only — avoids pulling images/binaries into the standalone bundle.
92
+ //
93
+ // The glob resolves against THIS APP'S cwd (apps/web), not against
94
+ // outputFileTracingRoot — a comment here previously claimed the opposite, and
95
+ // the claim was the bug (#4090 item 3). "./content/**/*.mdx" therefore matched
96
+ // only apps/web/content (the fumadocs blog/docs tree) and never the site-level
97
+ // content/ directory that carries the schema-typed pages, so the standalone
98
+ // output shipped without them and postbuild's assert-content-bundled failed.
93
99
  outputFileTracingIncludes: {
94
- "/**": ["./content/**/*.mdx"],
100
+ "/**": ["../../content/**/*.mdx"],
95
101
  },
96
102
  // Workspace packages live outside this app's directory. Next.js must
97
103
  // transpile them from source so that "use client" / "use server" directives
@@ -12,43 +12,49 @@
12
12
  "start": "next start",
13
13
  "pretypecheck": "fumadocs-mdx",
14
14
  "type-check": "tsc --noEmit",
15
- "lint": "eslint . --no-cache",
15
+ "lint": "next lint",
16
16
  "pretest": "fumadocs-mdx",
17
17
  "test": "jest",
18
18
  "test:watch": "jest --watch"
19
19
  },
20
20
  "dependencies": {
21
+ "@prisma/adapter-pg": "^7.8.0",
22
+ "@sentry/nextjs": "^10.58.0",
21
23
  "@working-theory/analytics": "workspace:*",
22
- "@working-theory/page-renderer": "workspace:*",
23
24
  "@working-theory/api-client": "workspace:*",
24
25
  "@working-theory/content-adapters": "workspace:*",
25
26
  "@working-theory/database": "workspace:*",
26
27
  "@working-theory/fumadocs-schema": "workspace:*",
28
+ "@working-theory/jsonld": "workspace:*",
27
29
  "@working-theory/metadata": "workspace:*",
30
+ "@working-theory/page-renderer": "workspace:*",
28
31
  "@working-theory/schema": "workspace:*",
29
32
  "@working-theory/schema-pack-registry": "workspace:*",
33
+ "@working-theory/schema-validator": "workspace:*",
30
34
  "@working-theory/templates": "workspace:*",
31
35
  "@working-theory/theme": "workspace:*",
32
36
  "@working-theory/ui": "workspace:*",
33
37
  "@working-theory/validation": "workspace:*",
34
38
  "@working-theory/web-i18n": "workspace:*",
35
- "@prisma/adapter-pg": "^7.8.0",
36
- "@sentry/nextjs": "^10.58.0",
37
- "better-auth": "1.6.19",
39
+ "better-auth": "1.6.22",
38
40
  "fumadocs-core": "^16.10.4",
39
41
  "fumadocs-mdx": "^15.0.12",
40
- "next": "^16.2.9",
42
+ "lucide-react": "^0.577.0",
43
+ "next": "^16.3.3",
41
44
  "next-intl": "^3.26.3",
42
45
  "next-mdx-remote": "^6.0.0",
43
46
  "pg": "^8.22.0",
44
47
  "react": "^19.2.7",
45
48
  "react-dom": "^19.2.7",
49
+ "yaml": "^2.9.0",
46
50
  "zod": "^4.2.1"
47
51
  },
48
52
  "devDependencies": {
49
53
  "@next/bundle-analyzer": "^15.5.19",
54
+ "@tailwindcss/postcss": "^4.3.2",
50
55
  "@testing-library/jest-dom": "^6.6.3",
51
56
  "@testing-library/react": "^16.3.0",
57
+ "@testing-library/user-event": "^14.5.2",
52
58
  "@types/jest": "^30.0.0",
53
59
  "@types/node": "^22.20.0",
54
60
  "@types/pg": "^8.20.0",
@@ -56,7 +62,10 @@
56
62
  "@types/react-dom": "^19.2.0",
57
63
  "jest": "^30.4.2",
58
64
  "jest-environment-jsdom": "^30.4.1",
65
+ "tailwindcss": "^4.3.2",
59
66
  "ts-jest": "^29.4.11",
60
- "typescript": "^6.0.3"
67
+ "typescript": "^6.0.3",
68
+ "@working-theory/license": "workspace:*",
69
+ "@working-theory/sections-registry": "workspace:*"
61
70
  }
62
71
  }
@@ -0,0 +1,23 @@
1
+ // PostCSS configuration for @working-theory/web.
2
+ //
3
+ // Uses @tailwindcss/postcss (Tailwind v4's PostCSS plugin) so Next.js processes
4
+ // the `@import "tailwindcss"` in app/globals.css and emits real utility classes.
5
+ // Without this file Next runs CSS through its built-in PostCSS pipeline, which
6
+ // does not include Tailwind — `flex`, `hidden`, `md:flex` compile to nothing and
7
+ // every page renders unstyled (#1531, and #4090 item 1 for the scaffold).
8
+ //
9
+ // Extension: `.mjs`, not `.js` or `.cjs`. Neither this package nor the repo root
10
+ // declares `"type"`, so a bare `.js` here would be parsed as CommonJS and the
11
+ // ESM `export default` below would be a syntax error. `.mjs` states the format
12
+ // in the filename instead of inheriting it from a `"type"` field that a consumer
13
+ // may later add or remove, and matches this app's existing next.config.mjs.
14
+ // (apps-paid/marketing-web can use a plain `.js` only because it declares
15
+ // `"type": "module"` — see #4090, whose premise that apps/web does the same does
16
+ // not hold.)
17
+
18
+ /** @type {import('postcss').ProcessOptions} */
19
+ export default {
20
+ plugins: {
21
+ "@tailwindcss/postcss": {},
22
+ },
23
+ };
@@ -7,11 +7,11 @@
7
7
  # gpg --verify security.txt.sig security.txt
8
8
 
9
9
  Contact: mailto:security@ailaunchkit.ai
10
- Contact: https://github.com/tailwind-ai/ai-launch-kit/security/advisories/new
10
+ Contact: https://github.com/working-theory-labs/ai-launch-kit/security/advisories/new
11
11
  Expires: 2027-05-13T00:00:00.000Z
12
12
  Encryption: https://keys.openpgp.org/vks/v1/by-email/security@ailaunchkit.ai
13
13
  Preferred-Languages: en
14
14
  Canonical: https://ailaunchkit.ai/.well-known/security.txt
15
- Policy: https://github.com/tailwind-ai/ai-launch-kit/blob/main/SECURITY.md
16
- Acknowledgments: https://github.com/tailwind-ai/ai-launch-kit/blob/main/SECURITY.md#hall-of-fame
15
+ Policy: https://github.com/working-theory-labs/ai-launch-kit/blob/main/SECURITY.md
16
+ Acknowledgments: https://github.com/working-theory-labs/ai-launch-kit/blob/main/SECURITY.md#hall-of-fame
17
17
  Hiring: https://ailaunchkit.ai/careers
@@ -5,12 +5,25 @@
5
5
  * handlers to avoid copy-paste duplication.
6
6
  */
7
7
 
8
+ import { SITE_BASE_URL } from "../../lib/site-brand";
9
+
8
10
  /**
9
11
  * Resolves the canonical base URL for the site.
10
- * Falls back to a placeholder so routes work without env configuration.
12
+ *
13
+ * #4157 — the same resolution order `lib/site-brand.tsx`'s `SITE_BASE_URL`
14
+ * documents: `NEXT_PUBLIC_BASE_URL` (env override) → `content/_site.mdx`'s
15
+ * `baseUrl:` frontmatter → a neutral placeholder. `process.env` is read
16
+ * FRESH on every call rather than delegating straight to `SITE_BASE_URL`
17
+ * (a module-load-time constant) — this function's callers (route handlers)
18
+ * expect a per-call env read, the same contract this function had before
19
+ * #4157; a frozen snapshot would silently stop honoring an env var set
20
+ * after this module first loaded. Every caller runs in the Node.js runtime
21
+ * (none of robots.txt/sitemap.xml/llms.txt/ai-plugin.json/mcp.json/layout
22
+ * declares `runtime = "edge"`), so the frontmatter-derived fallback
23
+ * (`SITE_BASE_URL`, when no env override is set) is safe here.
11
24
  */
12
25
  export function resolveBaseUrl(): string {
13
- return process.env["NEXT_PUBLIC_BASE_URL"] ?? "https://ailk.example.com";
26
+ return process.env["NEXT_PUBLIC_BASE_URL"] ?? SITE_BASE_URL;
14
27
  }
15
28
 
16
29
  /**
@@ -16,20 +16,5 @@
16
16
  "types": ["jest", "node", "@testing-library/jest-dom"]
17
17
  },
18
18
  "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
19
- "exclude": ["node_modules", ".next", "dist"],
20
- "references": [
21
- { "path": "../../packages/analytics" },
22
- { "path": "../../packages/page-renderer" },
23
- { "path": "../../packages/api-client" },
24
- { "path": "../../packages/theme" },
25
- { "path": "../../packages/content-adapters" },
26
- { "path": "../../packages/fumadocs-schema" },
27
- { "path": "../../packages/metadata" },
28
- { "path": "../../packages/schema" },
29
- { "path": "../../packages/schema-pack-registry" },
30
- { "path": "../../packages/templates" },
31
- { "path": "../../packages/ui" },
32
- { "path": "../../packages/validation" },
33
- { "path": "../../packages/web-i18n" }
34
- ]
19
+ "exclude": ["node_modules", ".next", "dist"]
35
20
  }