create-ailk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (533) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +39 -0
  3. package/dist/cli.d.ts +2 -0
  4. package/dist/cli.js +80 -0
  5. package/dist/copy.d.ts +8 -0
  6. package/dist/copy.js +109 -0
  7. package/dist/index.d.ts +10 -0
  8. package/dist/index.js +10 -0
  9. package/dist/lib/pro-callout.d.ts +12 -0
  10. package/dist/lib/pro-callout.js +20 -0
  11. package/dist/parse-args.d.ts +13 -0
  12. package/dist/parse-args.js +81 -0
  13. package/dist/programmatic.d.ts +49 -0
  14. package/dist/programmatic.js +89 -0
  15. package/dist/substitute.d.ts +31 -0
  16. package/dist/substitute.js +45 -0
  17. package/dist/validate.d.ts +8 -0
  18. package/dist/validate.js +70 -0
  19. package/package.json +47 -0
  20. package/templates/.claude/.gitkeep +0 -0
  21. package/templates/.claude/agents/web.md +80 -0
  22. package/templates/.claude/rules/architecture.md +62 -0
  23. package/templates/.claude/rules/preserve-existing-style.md +51 -0
  24. package/templates/.claude/skills/README.md +43 -0
  25. package/templates/.claude/skills/add-schema/SKILL.md +270 -0
  26. package/templates/.claude/skills/add-schema/references/conflict-handling.md +200 -0
  27. package/templates/.claude/skills/add-schema/references/file-finding.md +123 -0
  28. package/templates/.claude/skills/add-schema/references/schema-types.md +131 -0
  29. package/templates/.claude/skills/audit-site/SKILL.md +213 -0
  30. package/templates/.claude/skills/audit-site/references/common-errors.md +113 -0
  31. package/templates/.claude/skills/audit-site/references/findings-glossary.md +138 -0
  32. package/templates/.claude/skills/audit-site/references/severity-levels.md +114 -0
  33. package/templates/.claude/skills/provision-config/SKILL.md +243 -0
  34. package/templates/.claude/skills/provision-config/references/env-vars-template.md +184 -0
  35. package/templates/.claude/skills/provision-config/references/runbook-template.md +248 -0
  36. package/templates/.claude/skills/provision-config/references/vercel-json-template.md +98 -0
  37. package/templates/.claude/skills/scaffold-auth/SKILL.md +261 -0
  38. package/templates/.claude/skills/scaffold-auth/references/env-vars.md +91 -0
  39. package/templates/.claude/skills/scaffold-auth/references/oauth-app-setup.md +171 -0
  40. package/templates/.claude/skills/scaffold-commerce/SKILL.md +310 -0
  41. package/templates/.claude/skills/scaffold-commerce/references/lookup-keys-template.md +71 -0
  42. package/templates/.claude/skills/scaffold-commerce/references/marketplace-brand-pages.md +83 -0
  43. package/templates/.claude/skills/scaffold-commerce/templates/marketplace-cta-route.tsx.tmpl +72 -0
  44. package/templates/.claude/skills/scaffold-page/SKILL.md +243 -0
  45. package/templates/.claude/skills/scaffold-page/references/page-types.md +169 -0
  46. package/templates/.claude/skills/scaffold-page/templates/content.mdx.tmpl +28 -0
  47. package/templates/.claude/skills/scaffold-page/templates/route.tsx.tmpl +28 -0
  48. package/templates/.claude/skills/suggest-site-pages/SKILL.md +242 -0
  49. package/templates/.claude/skills/suggest-site-pages/references/categories.md +287 -0
  50. package/templates/.env.example +205 -0
  51. package/templates/.gitkeep +2 -0
  52. package/templates/CLAUDE.md +142 -0
  53. package/templates/CONVENTIONS.md +222 -0
  54. package/templates/README.md +110 -0
  55. package/templates/apps/api/.env.example +40 -0
  56. package/templates/apps/api/CLAUDE.md +63 -0
  57. package/templates/apps/api/api/index.ts +144 -0
  58. package/templates/apps/api/jest.config.cjs +74 -0
  59. package/templates/apps/api/package.json +54 -0
  60. package/templates/apps/api/src/__tests__/factories/content-fixture.ts +138 -0
  61. package/templates/apps/api/src/__tests__/factories/index.ts +70 -0
  62. package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +82 -0
  63. package/templates/apps/api/src/__tests__/index.test.ts +118 -0
  64. package/templates/apps/api/src/__tests__/server.test.ts +207 -0
  65. package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +126 -0
  66. package/templates/apps/api/src/__tests__/setup.ts +24 -0
  67. package/templates/apps/api/src/cli.ts +30 -0
  68. package/templates/apps/api/src/config/__tests__/index.test.ts +97 -0
  69. package/templates/apps/api/src/config/index.ts +56 -0
  70. package/templates/apps/api/src/index.ts +32 -0
  71. package/templates/apps/api/src/lib/__mocks__/prisma-client.js +15 -0
  72. package/templates/apps/api/src/lib/__mocks__/prisma.ts +45 -0
  73. package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +178 -0
  74. package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +100 -0
  75. package/templates/apps/api/src/lib/__tests__/errors.test.ts +94 -0
  76. package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +144 -0
  77. package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +8 -0
  78. package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +227 -0
  79. package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +125 -0
  80. package/templates/apps/api/src/lib/__tests__/prisma.test.ts +165 -0
  81. package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +129 -0
  82. package/templates/apps/api/src/lib/__tests__/stripe.test.ts +74 -0
  83. package/templates/apps/api/src/lib/content-adapter.ts +86 -0
  84. package/templates/apps/api/src/lib/error-serializer.ts +77 -0
  85. package/templates/apps/api/src/lib/errors.ts +95 -0
  86. package/templates/apps/api/src/lib/file-fallback.ts +87 -0
  87. package/templates/apps/api/src/lib/lead-capture-store.ts +110 -0
  88. package/templates/apps/api/src/lib/locales.ts +201 -0
  89. package/templates/apps/api/src/lib/outbound-http.ts +122 -0
  90. package/templates/apps/api/src/lib/prisma.ts +21 -0
  91. package/templates/apps/api/src/lib/require-paid-tier.ts +53 -0
  92. package/templates/apps/api/src/lib/stripe.ts +30 -0
  93. package/templates/apps/api/src/lib/webhook-idempotency.ts +92 -0
  94. package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +111 -0
  95. package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +172 -0
  96. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +119 -0
  97. package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +138 -0
  98. package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +149 -0
  99. package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +139 -0
  100. package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +175 -0
  101. package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +76 -0
  102. package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +153 -0
  103. package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +72 -0
  104. package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +292 -0
  105. package/templates/apps/api/src/middleware/auth.ts +246 -0
  106. package/templates/apps/api/src/middleware/rate-limit.ts +132 -0
  107. package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +129 -0
  108. package/templates/apps/api/src/openapi/index.ts +12 -0
  109. package/templates/apps/api/src/openapi/spec.ts +408 -0
  110. package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +193 -0
  111. package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +201 -0
  112. package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +294 -0
  113. package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +486 -0
  114. package/templates/apps/api/src/routes/auth/tokens.ts +199 -0
  115. package/templates/apps/api/src/routes/auth/user.ts +244 -0
  116. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +588 -0
  117. package/templates/apps/api/src/routes/checkout/index.ts +13 -0
  118. package/templates/apps/api/src/routes/checkout/sessions.ts +185 -0
  119. package/templates/apps/api/src/routes/content/__tests__/create.test.ts +239 -0
  120. package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +201 -0
  121. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +141 -0
  122. package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +122 -0
  123. package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +44 -0
  124. package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +118 -0
  125. package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +51 -0
  126. package/templates/apps/api/src/routes/content/__tests__/update.test.ts +252 -0
  127. package/templates/apps/api/src/routes/content/create.ts +114 -0
  128. package/templates/apps/api/src/routes/content/delete.ts +81 -0
  129. package/templates/apps/api/src/routes/content/get-page.ts +98 -0
  130. package/templates/apps/api/src/routes/content/index.ts +32 -0
  131. package/templates/apps/api/src/routes/content/list-pages.ts +83 -0
  132. package/templates/apps/api/src/routes/content/list-types.ts +19 -0
  133. package/templates/apps/api/src/routes/content/rate-limit.ts +13 -0
  134. package/templates/apps/api/src/routes/content/slug.ts +9 -0
  135. package/templates/apps/api/src/routes/content/update.ts +111 -0
  136. package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +415 -0
  137. package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +165 -0
  138. package/templates/apps/api/src/routes/leads/index.ts +130 -0
  139. package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +296 -0
  140. package/templates/apps/api/src/routes/test/auth/session.ts +141 -0
  141. package/templates/apps/api/src/routes/webhooks/README.md +57 -0
  142. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +247 -0
  143. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +198 -0
  144. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +633 -0
  145. package/templates/apps/api/src/routes/webhooks/index.ts +41 -0
  146. package/templates/apps/api/src/routes/webhooks/stripe.ts +253 -0
  147. package/templates/apps/api/src/server.ts +157 -0
  148. package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +395 -0
  149. package/templates/apps/api/src/services/enrichment-shim.ts +53 -0
  150. package/templates/apps/api/src/services/lead-routing.ts +338 -0
  151. package/templates/apps/api/tsconfig.json +34 -0
  152. package/templates/apps/api/vercel.json +17 -0
  153. package/templates/apps/mcp/.env.example +52 -0
  154. package/templates/apps/mcp/CLAUDE.md +84 -0
  155. package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +52 -0
  156. package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +46 -0
  157. package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +36 -0
  158. package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +54 -0
  159. package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +110 -0
  160. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +213 -0
  161. package/templates/apps/mcp/__tests__/audit.test.ts +217 -0
  162. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +52 -0
  163. package/templates/apps/mcp/__tests__/create_page.test.ts +201 -0
  164. package/templates/apps/mcp/__tests__/delete_page.test.ts +176 -0
  165. package/templates/apps/mcp/__tests__/get_business_hours.test.ts +82 -0
  166. package/templates/apps/mcp/__tests__/get_faq.test.ts +80 -0
  167. package/templates/apps/mcp/__tests__/get_locations.test.ts +65 -0
  168. package/templates/apps/mcp/__tests__/get_offerings.test.ts +90 -0
  169. package/templates/apps/mcp/__tests__/get_pricing.test.ts +80 -0
  170. package/templates/apps/mcp/__tests__/get_site_info.test.ts +81 -0
  171. package/templates/apps/mcp/__tests__/http-transport.test.ts +323 -0
  172. package/templates/apps/mcp/__tests__/lib/errors.test.ts +75 -0
  173. package/templates/apps/mcp/__tests__/lib/require-paid-tier.test.ts +75 -0
  174. package/templates/apps/mcp/__tests__/list_pages.test.ts +112 -0
  175. package/templates/apps/mcp/__tests__/locale.test.ts +135 -0
  176. package/templates/apps/mcp/__tests__/parity.test.ts +205 -0
  177. package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +34 -0
  178. package/templates/apps/mcp/__tests__/read_content.test.ts +153 -0
  179. package/templates/apps/mcp/__tests__/request_callback.test.ts +163 -0
  180. package/templates/apps/mcp/__tests__/search_content.test.ts +153 -0
  181. package/templates/apps/mcp/__tests__/server.test.ts +115 -0
  182. package/templates/apps/mcp/__tests__/submit_lead.test.ts +165 -0
  183. package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +161 -0
  184. package/templates/apps/mcp/__tests__/tools/purchase.test.ts +227 -0
  185. package/templates/apps/mcp/__tests__/tools/scaffold.test.ts +237 -0
  186. package/templates/apps/mcp/__tests__/update_page.test.ts +195 -0
  187. package/templates/apps/mcp/jest.config.cjs +82 -0
  188. package/templates/apps/mcp/package.json +37 -0
  189. package/templates/apps/mcp/src/abuse/daily-cap.ts +47 -0
  190. package/templates/apps/mcp/src/abuse/email-validator.ts +25 -0
  191. package/templates/apps/mcp/src/abuse/honeypot.ts +21 -0
  192. package/templates/apps/mcp/src/abuse/index.ts +111 -0
  193. package/templates/apps/mcp/src/abuse/user-agent-deny.ts +58 -0
  194. package/templates/apps/mcp/src/http-transport.ts +303 -0
  195. package/templates/apps/mcp/src/index.ts +67 -0
  196. package/templates/apps/mcp/src/lib/audit-single-page.ts +194 -0
  197. package/templates/apps/mcp/src/lib/errors.ts +61 -0
  198. package/templates/apps/mcp/src/lib/locales.ts +171 -0
  199. package/templates/apps/mcp/src/lib/require-paid-tier.ts +44 -0
  200. package/templates/apps/mcp/src/lib/resolve-locale.ts +30 -0
  201. package/templates/apps/mcp/src/server.ts +139 -0
  202. package/templates/apps/mcp/src/tools/audit.ts +103 -0
  203. package/templates/apps/mcp/src/tools/capture_lead.ts +52 -0
  204. package/templates/apps/mcp/src/tools/create_page.ts +95 -0
  205. package/templates/apps/mcp/src/tools/delete_page.ts +73 -0
  206. package/templates/apps/mcp/src/tools/get_business_hours.ts +66 -0
  207. package/templates/apps/mcp/src/tools/get_faq.ts +69 -0
  208. package/templates/apps/mcp/src/tools/get_locations.ts +85 -0
  209. package/templates/apps/mcp/src/tools/get_offerings.ts +66 -0
  210. package/templates/apps/mcp/src/tools/get_pricing.ts +74 -0
  211. package/templates/apps/mcp/src/tools/get_site_info.ts +84 -0
  212. package/templates/apps/mcp/src/tools/index.ts +125 -0
  213. package/templates/apps/mcp/src/tools/list_pages.ts +72 -0
  214. package/templates/apps/mcp/src/tools/purchase.ts +89 -0
  215. package/templates/apps/mcp/src/tools/read_content.ts +61 -0
  216. package/templates/apps/mcp/src/tools/request_callback.ts +51 -0
  217. package/templates/apps/mcp/src/tools/scaffold.ts +119 -0
  218. package/templates/apps/mcp/src/tools/search_content.ts +59 -0
  219. package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +47 -0
  220. package/templates/apps/mcp/src/tools/update_page.ts +91 -0
  221. package/templates/apps/mcp/tsconfig.json +19 -0
  222. package/templates/apps/web/.env.example +47 -0
  223. package/templates/apps/web/CLAUDE.md +81 -0
  224. package/templates/apps/web/__tests__/auth/adversarial/cookie-attributes.test.ts +94 -0
  225. package/templates/apps/web/__tests__/auth/adversarial/oauth-state-parameter.test.ts +75 -0
  226. package/templates/apps/web/__tests__/auth/adversarial/redirect-uri-allowlist.test.ts +82 -0
  227. package/templates/apps/web/__tests__/auth/env-helpers.test.ts +168 -0
  228. package/templates/apps/web/__tests__/authority-list-routes.test.tsx +208 -0
  229. package/templates/apps/web/__tests__/better-stack.test.ts +66 -0
  230. package/templates/apps/web/__tests__/blog-dir-resolution.test.ts +87 -0
  231. package/templates/apps/web/__tests__/blog-source-populated.test.ts +130 -0
  232. package/templates/apps/web/__tests__/data-testid-coverage.test.tsx +60 -0
  233. package/templates/apps/web/__tests__/google-analytics.test.tsx +104 -0
  234. package/templates/apps/web/__tests__/i18n/middleware.test.ts +119 -0
  235. package/templates/apps/web/__tests__/i18n/routing.test.ts +114 -0
  236. package/templates/apps/web/__tests__/i18n/translations.test.ts +191 -0
  237. package/templates/apps/web/__tests__/json-ld.test.ts +98 -0
  238. package/templates/apps/web/__tests__/knowledge-events-routes.test.tsx +580 -0
  239. package/templates/apps/web/__tests__/layout-stealth.test.ts +39 -0
  240. package/templates/apps/web/__tests__/lighthouse-fixtures/improvement-image-shrink.tsx +103 -0
  241. package/templates/apps/web/__tests__/lighthouse-fixtures/override-fixture.md +114 -0
  242. package/templates/apps/web/__tests__/lighthouse-fixtures/regression-bloat.tsx +94 -0
  243. package/templates/apps/web/__tests__/page.test.tsx +230 -0
  244. package/templates/apps/web/__tests__/products-services-phase1.test.tsx +321 -0
  245. package/templates/apps/web/__tests__/projects-routes.test.tsx +392 -0
  246. package/templates/apps/web/__tests__/resources-downloads-integrations-phase2.test.tsx +475 -0
  247. package/templates/apps/web/__tests__/routes/ai-plugin-json.test.ts +53 -0
  248. package/templates/apps/web/__tests__/routes/blog-route.test.tsx +191 -0
  249. package/templates/apps/web/__tests__/routes/llms-txt.test.ts +123 -0
  250. package/templates/apps/web/__tests__/routes/robots-txt.test.ts +52 -0
  251. package/templates/apps/web/__tests__/routes/sitemap-xml.test.ts +78 -0
  252. package/templates/apps/web/__tests__/routes/well-known-mcp.test.ts +203 -0
  253. package/templates/apps/web/__tests__/section-routes.test.tsx +693 -0
  254. package/templates/apps/web/__tests__/security-headers.test.ts +201 -0
  255. package/templates/apps/web/__tests__/sentry-config.test.ts +116 -0
  256. package/templates/apps/web/__tests__/setup.ts +82 -0
  257. package/templates/apps/web/__tests__/sitemap-locales.test.ts +415 -0
  258. package/templates/apps/web/__tests__/standalone-informational-routes.test.tsx +844 -0
  259. package/templates/apps/web/app/.well-known/ai-plugin.json/route.ts +81 -0
  260. package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +110 -0
  261. package/templates/apps/web/app/.well-known/mcp.json/route.ts +58 -0
  262. package/templates/apps/web/app/[locale]/__tests__/layout.test.tsx +120 -0
  263. package/templates/apps/web/app/[locale]/__tests__/page-renderer-migration.test.tsx +202 -0
  264. package/templates/apps/web/app/[locale]/about/page.tsx +31 -0
  265. package/templates/apps/web/app/[locale]/blog/[[...slug]]/page.tsx +173 -0
  266. package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +45 -0
  267. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +117 -0
  268. package/templates/apps/web/app/[locale]/careers/page.tsx +25 -0
  269. package/templates/apps/web/app/[locale]/case-studies/[slug]/page.tsx +44 -0
  270. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +113 -0
  271. package/templates/apps/web/app/[locale]/case-studies/page.tsx +25 -0
  272. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +63 -0
  273. package/templates/apps/web/app/[locale]/clients/page.tsx +27 -0
  274. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +130 -0
  275. package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +152 -0
  276. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +92 -0
  277. package/templates/apps/web/app/[locale]/contact/contact.actions.ts +79 -0
  278. package/templates/apps/web/app/[locale]/contact/error.tsx +24 -0
  279. package/templates/apps/web/app/[locale]/contact/page.tsx +38 -0
  280. package/templates/apps/web/app/[locale]/courses/[slug]/page.tsx +34 -0
  281. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +119 -0
  282. package/templates/apps/web/app/[locale]/courses/page.tsx +25 -0
  283. package/templates/apps/web/app/[locale]/dev/purchase/__tests__/actions.test.ts +160 -0
  284. package/templates/apps/web/app/[locale]/dev/purchase/error.tsx +25 -0
  285. package/templates/apps/web/app/[locale]/dev/purchase/page.tsx +117 -0
  286. package/templates/apps/web/app/[locale]/dev/purchase/purchase.actions.ts +58 -0
  287. package/templates/apps/web/app/[locale]/docs/[[...slug]]/page.tsx +118 -0
  288. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +72 -0
  289. package/templates/apps/web/app/[locale]/downloads/page.tsx +25 -0
  290. package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +47 -0
  291. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +130 -0
  292. package/templates/apps/web/app/[locale]/events/page.tsx +25 -0
  293. package/templates/apps/web/app/[locale]/faq/page.tsx +36 -0
  294. package/templates/apps/web/app/[locale]/how-to/[slug]/page.tsx +34 -0
  295. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +78 -0
  296. package/templates/apps/web/app/[locale]/how-to/page.tsx +40 -0
  297. package/templates/apps/web/app/[locale]/integrations/[slug]/page.tsx +43 -0
  298. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +129 -0
  299. package/templates/apps/web/app/[locale]/integrations/page.tsx +25 -0
  300. package/templates/apps/web/app/[locale]/launch-service/page.tsx +31 -0
  301. package/templates/apps/web/app/[locale]/layout.tsx +241 -0
  302. package/templates/apps/web/app/[locale]/page.tsx +41 -0
  303. package/templates/apps/web/app/[locale]/partners/[slug]/page.tsx +44 -0
  304. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +113 -0
  305. package/templates/apps/web/app/[locale]/partners/page.tsx +25 -0
  306. package/templates/apps/web/app/[locale]/products/[slug]/page.tsx +43 -0
  307. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +129 -0
  308. package/templates/apps/web/app/[locale]/products/page.tsx +25 -0
  309. package/templates/apps/web/app/[locale]/projects/[slug]/page.tsx +39 -0
  310. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +138 -0
  311. package/templates/apps/web/app/[locale]/projects/page.tsx +30 -0
  312. package/templates/apps/web/app/[locale]/resources/[slug]/page.tsx +51 -0
  313. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +117 -0
  314. package/templates/apps/web/app/[locale]/resources/page.tsx +27 -0
  315. package/templates/apps/web/app/[locale]/services/[slug]/page.tsx +43 -0
  316. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +129 -0
  317. package/templates/apps/web/app/[locale]/services/page.tsx +25 -0
  318. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +34 -0
  319. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +81 -0
  320. package/templates/apps/web/app/[locale]/software/page.tsx +39 -0
  321. package/templates/apps/web/app/[locale]/tech-articles/[slug]/page.tsx +34 -0
  322. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +82 -0
  323. package/templates/apps/web/app/[locale]/tech-articles/page.tsx +39 -0
  324. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +63 -0
  325. package/templates/apps/web/app/[locale]/testimonials/page.tsx +27 -0
  326. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +63 -0
  327. package/templates/apps/web/app/[locale]/use-cases/page.tsx +27 -0
  328. package/templates/apps/web/app/[locale]/whitepapers/[slug]/page.tsx +34 -0
  329. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +82 -0
  330. package/templates/apps/web/app/[locale]/whitepapers/page.tsx +39 -0
  331. package/templates/apps/web/app/__tests__/error-boundaries.test.tsx +152 -0
  332. package/templates/apps/web/app/api/auth/[...all]/route.ts +16 -0
  333. package/templates/apps/web/app/error-fallback.tsx +75 -0
  334. package/templates/apps/web/app/error.tsx +23 -0
  335. package/templates/apps/web/app/layout.tsx +18 -0
  336. package/templates/apps/web/app/llms.txt/route.ts +101 -0
  337. package/templates/apps/web/app/not-found.tsx +48 -0
  338. package/templates/apps/web/app/og/__tests__/route.test.ts +164 -0
  339. package/templates/apps/web/app/og/route.tsx +135 -0
  340. package/templates/apps/web/app/robots.txt/route.ts +36 -0
  341. package/templates/apps/web/app/sitemap.xml/route.ts +146 -0
  342. package/templates/apps/web/auth.ts +141 -0
  343. package/templates/apps/web/components/ThemeToggle.tsx +60 -0
  344. package/templates/apps/web/components/google-analytics.tsx +34 -0
  345. package/templates/apps/web/content/en/blog/index.mdx +15 -0
  346. package/templates/apps/web/content/en/blog/launching-ailk.mdx +20 -0
  347. package/templates/apps/web/content/en/docs/getting-started.mdx +30 -0
  348. package/templates/apps/web/i18n/request.ts +36 -0
  349. package/templates/apps/web/jest.config.cjs +100 -0
  350. package/templates/apps/web/lib/__mocks__/next-mdx-remote-rsc.js +12 -0
  351. package/templates/apps/web/lib/__mocks__/source-server.js +31 -0
  352. package/templates/apps/web/lib/__tests__/og.test.ts +65 -0
  353. package/templates/apps/web/lib/auth-env.ts +66 -0
  354. package/templates/apps/web/lib/blog-list-data.ts +95 -0
  355. package/templates/apps/web/lib/blog-post-data.ts +79 -0
  356. package/templates/apps/web/lib/nav-config.ts +13 -0
  357. package/templates/apps/web/lib/observability/better-stack.ts +27 -0
  358. package/templates/apps/web/lib/og.ts +23 -0
  359. package/templates/apps/web/lib/prisma-for-auth.ts +34 -0
  360. package/templates/apps/web/lib/source.ts +34 -0
  361. package/templates/apps/web/messages/en.json +131 -0
  362. package/templates/apps/web/middleware.ts +80 -0
  363. package/templates/apps/web/next.config.mjs +167 -0
  364. package/templates/apps/web/package.json +62 -0
  365. package/templates/apps/web/public/.well-known/security.txt +17 -0
  366. package/templates/apps/web/public/android-chrome-192x192.png +0 -0
  367. package/templates/apps/web/public/android-chrome-512x512.png +0 -0
  368. package/templates/apps/web/public/apple-touch-icon.png +0 -0
  369. package/templates/apps/web/public/favicon-16x16.png +0 -0
  370. package/templates/apps/web/public/favicon-32x32.png +0 -0
  371. package/templates/apps/web/public/favicon.ico +0 -0
  372. package/templates/apps/web/public/favicon.svg +4 -0
  373. package/templates/apps/web/public/logo-dark.svg +21 -0
  374. package/templates/apps/web/public/logo-light.svg +21 -0
  375. package/templates/apps/web/public/logomark-dark.svg +4 -0
  376. package/templates/apps/web/public/logomark-light.svg +4 -0
  377. package/templates/apps/web/public/og-default.png +0 -0
  378. package/templates/apps/web/public/site.webmanifest +19 -0
  379. package/templates/apps/web/scripts/assert-content-bundled.ts +55 -0
  380. package/templates/apps/web/security-headers.config.ts +132 -0
  381. package/templates/apps/web/sentry.client.config.ts +27 -0
  382. package/templates/apps/web/sentry.edge.config.ts +15 -0
  383. package/templates/apps/web/sentry.server.config.ts +20 -0
  384. package/templates/apps/web/source.config.ts +78 -0
  385. package/templates/apps/web/src/components/SiteNav.tsx +21 -0
  386. package/templates/apps/web/src/lib/routes.ts +37 -0
  387. package/templates/apps/web/tsconfig.json +35 -0
  388. package/templates/apps/web/types/messages.d.ts +19 -0
  389. package/templates/content/.gitkeep +0 -0
  390. package/templates/content/CLAUDE.md +85 -0
  391. package/templates/content/_site.mdx +38 -0
  392. package/templates/content/ar/HomePage/home.mdx +123 -0
  393. package/templates/content/ar/_site.mdx +35 -0
  394. package/templates/content/de/_site.mdx +29 -0
  395. package/templates/content/en/.gitkeep +0 -0
  396. package/templates/content/en/AboutPage/about.mdx +19 -0
  397. package/templates/content/en/AboutPage/about.schema.json +82 -0
  398. package/templates/content/en/BookCall/book-call.mdx +19 -0
  399. package/templates/content/en/BookCall/book-call.schema.json +121 -0
  400. package/templates/content/en/BreadcrumbList/site-breadcrumbs.mdx +20 -0
  401. package/templates/content/en/CareersList/careers.mdx +24 -0
  402. package/templates/content/en/CaseStudiesList/case-studies.mdx +22 -0
  403. package/templates/content/en/CaseStudiesList/showcase.mdx +8 -0
  404. package/templates/content/en/CaseStudy/ailk-aeo-rollout.mdx +32 -0
  405. package/templates/content/en/CaseStudy/schema-builder-migration.mdx +41 -0
  406. package/templates/content/en/ClientsList/clients.mdx +38 -0
  407. package/templates/content/en/ContactPage/contact.mdx +19 -0
  408. package/templates/content/en/ContactPage/contact.schema.json +100 -0
  409. package/templates/content/en/ContactPoint/primary.mdx +14 -0
  410. package/templates/content/en/Course/aeo-fundamentals.mdx +37 -0
  411. package/templates/content/en/Course/schema-builder-workshop.mdx +62 -0
  412. package/templates/content/en/CoursesList/courses.mdx +22 -0
  413. package/templates/content/en/DownloadsList/downloads.mdx +22 -0
  414. package/templates/content/en/Event/aeo-office-hours-may-2026.mdx +39 -0
  415. package/templates/content/en/Event/ailk-launch-day-2026.mdx +35 -0
  416. package/templates/content/en/EventsList/events.mdx +26 -0
  417. package/templates/content/en/FAQPage/faq.mdx +420 -0
  418. package/templates/content/en/FAQPage/faq.schema.json +231 -0
  419. package/templates/content/en/GlossaryList/glossary.mdx +19 -0
  420. package/templates/content/en/GlossaryList/glossary.schema.json +300 -0
  421. package/templates/content/en/HomePage/home.mdx +312 -0
  422. package/templates/content/en/HomePage/home.schema.json +88 -0
  423. package/templates/content/en/HomePage/launch-service.mdx +475 -0
  424. package/templates/content/en/HomePage/launch-service.schema.json +138 -0
  425. package/templates/content/en/HowTo/add-mdx-content.mdx +38 -0
  426. package/templates/content/en/HowTo/configure-aeo-scoring.mdx +35 -0
  427. package/templates/content/en/HowTo/set-up-json-ld.mdx +36 -0
  428. package/templates/content/en/Integration/github-actions.mdx +31 -0
  429. package/templates/content/en/Integration/openai-api.mdx +26 -0
  430. package/templates/content/en/Integration/vercel.mdx +32 -0
  431. package/templates/content/en/IntegrationsList/integrations.mdx +22 -0
  432. package/templates/content/en/JobPosting/content-strategist.mdx +46 -0
  433. package/templates/content/en/JobPosting/developer-advocate.mdx +47 -0
  434. package/templates/content/en/JobPosting/senior-fullstack-engineer.mdx +57 -0
  435. package/templates/content/en/LandingPage/aeo-audit.mdx +19 -0
  436. package/templates/content/en/LandingPage/aeo-audit.schema.json +92 -0
  437. package/templates/content/en/LandingPage/agency-waitlist.mdx +340 -0
  438. package/templates/content/en/LandingPage/agency-waitlist.schema.json +152 -0
  439. package/templates/content/en/LandingPage/developers.mdx +19 -0
  440. package/templates/content/en/LandingPage/developers.schema.json +109 -0
  441. package/templates/content/en/LandingPage/for-agencies.mdx +390 -0
  442. package/templates/content/en/LandingPage/for-agencies.schema.json +107 -0
  443. package/templates/content/en/LandingPage/for-ai-search-agencies.mdx +417 -0
  444. package/templates/content/en/LandingPage/for-ai-search-agencies.schema.json +105 -0
  445. package/templates/content/en/LandingPage/for-businesses.mdx +19 -0
  446. package/templates/content/en/LandingPage/for-businesses.schema.json +96 -0
  447. package/templates/content/en/LandingPage/platform.mdx +369 -0
  448. package/templates/content/en/LandingPage/platform.schema.json +166 -0
  449. package/templates/content/en/LandingPage/vs-ai-website-builders.mdx +19 -0
  450. package/templates/content/en/LandingPage/vs-ai-website-builders.schema.json +102 -0
  451. package/templates/content/en/LandingPage/vs-wordpress.mdx +19 -0
  452. package/templates/content/en/LandingPage/vs-wordpress.schema.json +53 -0
  453. package/templates/content/en/NewsletterSignup/newsletter.mdx +236 -0
  454. package/templates/content/en/NewsletterSignup/newsletter.schema.json +91 -0
  455. package/templates/content/en/Organization/site-owner.mdx +16 -0
  456. package/templates/content/en/Partner/prisma.mdx +31 -0
  457. package/templates/content/en/Partner/supabase.mdx +30 -0
  458. package/templates/content/en/Partner/vercel.mdx +28 -0
  459. package/templates/content/en/PartnersList/partners.mdx +22 -0
  460. package/templates/content/en/Person/founder.mdx +18 -0
  461. package/templates/content/en/Pricing/pricing.mdx +538 -0
  462. package/templates/content/en/Pricing/pricing.schema.json +209 -0
  463. package/templates/content/en/PrivacyPage/privacy.mdx +165 -0
  464. package/templates/content/en/PrivacyPage/privacy.schema.json +64 -0
  465. package/templates/content/en/Product/ailk.mdx +19 -0
  466. package/templates/content/en/Product/ailk.schema.json +94 -0
  467. package/templates/content/en/Product/api-launch-kit.mdx +26 -0
  468. package/templates/content/en/Product/launch-kit.mdx +28 -0
  469. package/templates/content/en/ProductsList/products.mdx +26 -0
  470. package/templates/content/en/Project/ailk-phase-2.mdx +54 -0
  471. package/templates/content/en/ProjectsList/projects.mdx +25 -0
  472. package/templates/content/en/ResourceDetail/aeo-scoring-guide.mdx +27 -0
  473. package/templates/content/en/ResourceDetail/content-model-whitepaper.mdx +28 -0
  474. package/templates/content/en/ResourceDetail/schema-org-quick-reference.mdx +39 -0
  475. package/templates/content/en/ResourcesHub/resources.mdx +22 -0
  476. package/templates/content/en/Service/consulting.mdx +22 -0
  477. package/templates/content/en/Service/implementation.mdx +30 -0
  478. package/templates/content/en/Service/launch-service.mdx +232 -0
  479. package/templates/content/en/Service/launch.mdx +228 -0
  480. package/templates/content/en/ServicesList/services.mdx +84 -0
  481. package/templates/content/en/SoftwareProduct/ailk-aeo.mdx +44 -0
  482. package/templates/content/en/SoftwareProduct/ailk-content-adapters.mdx +47 -0
  483. package/templates/content/en/SoftwareProduct/ailk-schema.mdx +49 -0
  484. package/templates/content/en/TeamList/team.mdx +63 -0
  485. package/templates/content/en/TeamMember/founder.mdx +72 -0
  486. package/templates/content/en/TermsPage/terms.mdx +19 -0
  487. package/templates/content/en/TermsPage/terms.schema.json +99 -0
  488. package/templates/content/en/TestimonialsList/testimonials.mdx +44 -0
  489. package/templates/content/en/UseCasesList/use-cases.mdx +30 -0
  490. package/templates/content/en/Whitepaper/ax-first-product-development.mdx +27 -0
  491. package/templates/content/en/Whitepaper/open-core-commercial-strategy.mdx +27 -0
  492. package/templates/content/en/Whitepaper/structured-data-for-answer-engines.mdx +31 -0
  493. package/templates/content/en-XA/AboutPage/about.mdx +8 -0
  494. package/templates/content/en-XA/FAQPage/faq.mdx +8 -0
  495. package/templates/content/en-XA/HomePage/home.mdx +8 -0
  496. package/templates/content/es/_site.mdx +30 -0
  497. package/templates/content/fr/_site.mdx +30 -0
  498. package/templates/content/ja/_site.mdx +30 -0
  499. package/templates/content/pt-BR/AboutPage/about.mdx +8 -0
  500. package/templates/content/pt-BR/FAQPage/faq.mdx +8 -0
  501. package/templates/content/pt-BR/HomePage/home.mdx +23 -0
  502. package/templates/database/CHANGELOG.md +5 -0
  503. package/templates/database/README.md +234 -0
  504. package/templates/database/__tests__/user-cascade.test.ts +125 -0
  505. package/templates/database/auth/.gitkeep +0 -0
  506. package/templates/database/config/.gitkeep +0 -0
  507. package/templates/database/content/.gitkeep +0 -0
  508. package/templates/database/inbox/.gitkeep +0 -0
  509. package/templates/database/inbox/README.md +3 -0
  510. package/templates/database/inbox/__tests__/schema.test.ts +40 -0
  511. package/templates/database/inbox/schema.prisma +52 -0
  512. package/templates/database/jest.config.cjs +29 -0
  513. package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +328 -0
  514. package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +100 -0
  515. package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +28 -0
  516. package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +25 -0
  517. package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +42 -0
  518. package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +67 -0
  519. package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +21 -0
  520. package/templates/database/migrations/migration_lock.toml +3 -0
  521. package/templates/database/ops/.gitkeep +0 -0
  522. package/templates/database/package.json +45 -0
  523. package/templates/database/prisma.config.ts +20 -0
  524. package/templates/database/schema.prisma +487 -0
  525. package/templates/database/scripts/db-generate-locked.sh +80 -0
  526. package/templates/database/seed-test.ts +85 -0
  527. package/templates/database/tsconfig.build.json +16 -0
  528. package/templates/database/tsconfig.json +9 -0
  529. package/templates/package.json +125 -0
  530. package/templates/pnpm-workspace.yaml +6 -0
  531. package/templates/project.yaml +59 -0
  532. package/templates/tsconfig.base.json +18 -0
  533. package/templates/tsconfig.json +45 -0
@@ -0,0 +1,131 @@
1
+ {
2
+ "nav": {
3
+ "home": "Home",
4
+ "docs": "Docs",
5
+ "blog": "Blog",
6
+ "openMenu": "Open navigation menu",
7
+ "closeMenu": "Close navigation menu"
8
+ },
9
+ "consent": {
10
+ "title": "Cookie Preferences",
11
+ "body": "We use analytics to understand how visitors use this site. We don't sell your data.",
12
+ "acceptLabel": "Accept",
13
+ "rejectLabel": "Reject",
14
+ "policyLinkLabel": "Privacy policy"
15
+ },
16
+ "common": {
17
+ "siteTitle": "AI Launch Kit"
18
+ },
19
+ "home": {
20
+ "heading": "AI Launch Kit",
21
+ "emptyState": "AX-first OSS template for shipping software with API + MCP as canonical surfaces."
22
+ },
23
+ "about": {
24
+ "heading": "About",
25
+ "emptyState": "About page content coming soon."
26
+ },
27
+ "blog": {
28
+ "heading": "Blog",
29
+ "emptyState": "No posts yet. Drop MDX files into",
30
+ "emptyStateTrailing": "to populate this list."
31
+ },
32
+ "docs": {
33
+ "heading": "Docs",
34
+ "emptyState": "No documentation yet. Add MDX files to",
35
+ "emptyStateTrailing": "to populate this list."
36
+ },
37
+ "careers": {
38
+ "heading": "Careers",
39
+ "emptyState": "Career listings coming soon."
40
+ },
41
+ "case-studies": {
42
+ "heading": "Case Studies",
43
+ "emptyState": "Case studies listing coming soon."
44
+ },
45
+ "courses": {
46
+ "heading": "Courses",
47
+ "emptyState": "Courses listing coming soon."
48
+ },
49
+ "clients": {
50
+ "heading": "Clients",
51
+ "emptyState": "Clients listing coming soon."
52
+ },
53
+ "contact": {
54
+ "heading": "Contact",
55
+ "emptyState": "Contact page content coming soon.",
56
+ "nameLabel": "Name",
57
+ "emailLabel": "Email",
58
+ "messageLabel": "Message",
59
+ "sending": "Sending\u2026",
60
+ "sendMessage": "Send message",
61
+ "successMessage": "Thank you for reaching out! We will be in touch shortly."
62
+ },
63
+ "downloads": {
64
+ "heading": "Downloads",
65
+ "emptyState": "Downloads listing coming soon."
66
+ },
67
+ "events": {
68
+ "heading": "Events",
69
+ "emptyState": "Events listing coming soon."
70
+ },
71
+ "faq": {
72
+ "heading": "FAQ",
73
+ "emptyState": "Frequently asked questions content coming soon."
74
+ },
75
+ "how-to": {
76
+ "heading": "How-To Guides",
77
+ "description": "Step-by-step guides for building with AI Launch Kit.",
78
+ "emptyState": "How-to guides coming soon."
79
+ },
80
+ "integrations": {
81
+ "heading": "Integrations",
82
+ "emptyState": "Integrations listing coming soon."
83
+ },
84
+ "launch-service": {
85
+ "heading": "Launch Service",
86
+ "emptyState": "Launch Service page content coming soon."
87
+ },
88
+ "partners": {
89
+ "heading": "Partners",
90
+ "emptyState": "Partners listing coming soon."
91
+ },
92
+ "products": {
93
+ "heading": "Products",
94
+ "emptyState": "Products listing coming soon."
95
+ },
96
+ "projects": {
97
+ "heading": "Projects",
98
+ "emptyState": "Projects listing coming soon."
99
+ },
100
+ "resources": {
101
+ "heading": "Resources",
102
+ "emptyState": "Resources listing coming soon."
103
+ },
104
+ "services": {
105
+ "heading": "Services",
106
+ "emptyState": "Services listing coming soon."
107
+ },
108
+ "software": {
109
+ "heading": "Software",
110
+ "description": "The @working-theory/* packages \u2014 typed tools for building AX-first products.",
111
+ "emptyState": "Software listings coming soon."
112
+ },
113
+ "tech-articles": {
114
+ "heading": "Technical Articles",
115
+ "description": "Deep dives into the architecture and internals of AI Launch Kit.",
116
+ "emptyState": "Technical articles coming soon."
117
+ },
118
+ "testimonials": {
119
+ "heading": "Testimonials",
120
+ "emptyState": "Testimonials coming soon."
121
+ },
122
+ "use-cases": {
123
+ "heading": "Use Cases",
124
+ "emptyState": "Use cases listing coming soon."
125
+ },
126
+ "whitepapers": {
127
+ "heading": "Whitepapers",
128
+ "description": "In-depth research and strategy papers from the AI Launch Kit team.",
129
+ "emptyState": "Whitepapers coming soon."
130
+ }
131
+ }
@@ -0,0 +1,80 @@
1
+ // S16 + i18n S2 — Composed middleware: next-intl locale detection + security headers
2
+ // i18n P2 S1 — forward x-pathname for hreflang alternates in generateMetadata (#972)
3
+ //
4
+ // Composition order (required by spec §5.2):
5
+ // 1. next-intl middleware — locale detection, URL rewrite/redirect
6
+ // 2. Security headers — applied to whatever response next-intl produced
7
+ // 3. x-pathname request header — forwarded to server components for hreflang
8
+ //
9
+ // next-intl MUST run first so the locale rewrite happens before any subsequent
10
+ // middleware logic. Security headers are then stamped on the outgoing response.
11
+ //
12
+ // Locale list: read once at module load from project.yaml via readLocales() (S1).
13
+ // Static assets and internal Next.js paths are excluded via the matcher below.
14
+ //
15
+ // S16 spec: docs/internal/specs/ailk-pre-oss-security-phase-3-s16-security-headers-spec.md
16
+ // S2 spec: docs/internal/specs/i18n-phase1-s2-next-intl-foundation-spec.md
17
+ // P2 S1 spec: docs/internal/specs/i18n-phase2-s1-hreflang-metadata-spec.md §3
18
+
19
+ import { NextRequest, type NextResponse } from "next/server";
20
+ import createMiddleware from "next-intl/middleware";
21
+
22
+ import {
23
+ DEFAULT_SECURITY_HEADERS,
24
+ applyHeaders,
25
+ } from "./security-headers.config";
26
+
27
+ // Locale list is baked into the bundle at build time via next.config.mjs
28
+ // (which calls readLocales() in Node.js context and exposes the result as
29
+ // NEXT_PUBLIC_ENABLED_LOCALES). Reading it here as an env var avoids
30
+ // importing lib/locales — which uses node:fs and process.cwd() — into the
31
+ // Edge runtime that runs middleware.
32
+ // Falls back to ["en"] in test environments where the env var is unset.
33
+ const enabledLocales = (
34
+ process.env.NEXT_PUBLIC_ENABLED_LOCALES ?? "en"
35
+ ).split(",");
36
+ const DEFAULT_LOCALE = "en";
37
+
38
+ // next-intl middleware instance — locale detection priority chain:
39
+ // 1. URL prefix /<locale>/
40
+ // 2. Accept-Language header
41
+ // 3. NEXT_LOCALE cookie
42
+ // 4. Default locale (product.default_locale from project.yaml)
43
+ //
44
+ // localePrefix: 'as-needed' — default-locale URLs stay bare (no /en/ prefix);
45
+ // non-default locales are prefixed. Preserves backward-compat for OSS forks.
46
+ const intlMiddleware = createMiddleware({
47
+ locales: enabledLocales,
48
+ defaultLocale: DEFAULT_LOCALE,
49
+ localePrefix: "as-needed",
50
+ });
51
+
52
+ export function middleware(request: NextRequest): NextResponse {
53
+ // Step 1: Forward x-pathname to server components so generateMetadata can
54
+ // build path-aware hreflang alternates (P2 S1). Clone the request headers
55
+ // and inject the pathname before running next-intl so the rewritten URL
56
+ // doesn't clobber the original user-facing path.
57
+ const requestHeaders = new Headers(request.headers);
58
+ requestHeaders.set("x-pathname", request.nextUrl.pathname);
59
+
60
+ const requestWithPathname = new NextRequest(request.url, {
61
+ headers: requestHeaders,
62
+ method: request.method,
63
+ body: request.body,
64
+ });
65
+
66
+ // Step 2: run next-intl middleware (locale detection + rewrite/redirect)
67
+ const intlResponse = intlMiddleware(requestWithPathname) as NextResponse;
68
+
69
+ // Step 3: apply the 7 baseline security headers to the response
70
+ applyHeaders(intlResponse.headers, DEFAULT_SECURITY_HEADERS);
71
+
72
+ return intlResponse;
73
+ }
74
+
75
+ // Skip Next.js internal assets and favicons — security headers attach to
76
+ // user-facing routes and API handlers, not framework asset endpoints.
77
+ // Also exclude next-intl-specific internal paths (_next/server).
78
+ export const config = {
79
+ matcher: "/((?!_next/static|_next/image|_next/server|favicon.ico).*)",
80
+ };
@@ -0,0 +1,167 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { parse as parseYaml } from "yaml";
4
+ import bundleAnalyzer from "@next/bundle-analyzer";
5
+ import { withSentryConfig } from "@sentry/nextjs";
6
+ import { createMDX } from "fumadocs-mdx/next";
7
+ import createNextIntlPlugin from "next-intl/plugin";
8
+
9
+ // @next/bundle-analyzer — enabled when ANALYZE=true (set by ci-bundle.yml).
10
+ // analyzerMode 'json' writes .next/analyze/client.json (and nodejs.json,
11
+ // edge.json) so scripts/bundle-analyzer-comment.ts can parse chunk sizes.
12
+ // The default 'static' mode writes HTML only with no parseable JSON output.
13
+ const withBundleAnalyzer = bundleAnalyzer({
14
+ enabled: process.env.ANALYZE === "true",
15
+ openAnalyzer: false,
16
+ analyzerMode: "json",
17
+ });
18
+
19
+ // When STEALTH=true, every response carries X-Robots-Tag: noindex, nofollow,
20
+ // noarchive — paired with the <meta robots> tag in app/layout.tsx. Layer 2 of
21
+ // the three-layer stealth posture (#884); new AILK installs default to
22
+ // STEALTH=true so a forked instance doesn't ship indexable by accident.
23
+ const STEALTH = process.env.STEALTH === "true";
24
+
25
+ // next-intl plugin — no explicit path: uses next-intl's default convention
26
+ // lookup (./i18n/request.ts). We use `next build --webpack` (see package.json)
27
+ // because Next.js 16 defaults to Turbopack for production builds and next-intl's
28
+ // Turbopack resolveAlias support produces a relative path that fails to resolve
29
+ // when the project lives in a worktree (workspace root mis-detection). The
30
+ // webpack build resolves the alias to an absolute path, which works correctly.
31
+ // i18n S2 spec: docs/internal/specs/i18n-phase1-s2-next-intl-foundation-spec.md
32
+ const withNextIntl = createNextIntlPlugin();
33
+
34
+ // Read enabled locales once at build time (Node.js context — plain JS, no .ts
35
+ // import needed). next.config.mjs runs under Node's native ESM loader which
36
+ // cannot resolve .ts extensions without a tsx/jiti shim. We inline the minimal
37
+ // locale-reading logic here rather than importing lib/locales.ts directly.
38
+ // lib/locales.ts stays authoritative for runtime consumers (API routes, etc.).
39
+ //
40
+ // Locale list is exposed as NEXT_PUBLIC_ENABLED_LOCALES so the Edge-runtime
41
+ // middleware can read it without importing node:fs-dependent code.
42
+ // Falls back to ["en"] when project.yaml is absent (CI / OSS forks).
43
+ function readLocalesFromProjectYaml() {
44
+ try {
45
+ // next.config.mjs runs from apps/web/; project.yaml is at repo root (../../)
46
+ const filePath = join(process.cwd(), "../../project.yaml");
47
+ const raw = readFileSync(filePath, "utf8");
48
+ const doc = parseYaml(raw);
49
+ const locales = doc?.product?.locales;
50
+ if (Array.isArray(locales) && locales.length > 0) {
51
+ return locales.join(",");
52
+ }
53
+ } catch {
54
+ // Absent or malformed project.yaml — fall back to English-only.
55
+ }
56
+ return "en";
57
+ }
58
+
59
+ function readDefaultLocaleFromProjectYaml() {
60
+ try {
61
+ const filePath = join(process.cwd(), "../../project.yaml");
62
+ const raw = readFileSync(filePath, "utf8");
63
+ const doc = parseYaml(raw);
64
+ const defaultLocale = doc?.product?.default_locale;
65
+ if (typeof defaultLocale === "string" && defaultLocale.length > 0) {
66
+ return defaultLocale;
67
+ }
68
+ } catch {
69
+ // Absent or malformed project.yaml — fall back to English.
70
+ }
71
+ return "en";
72
+ }
73
+
74
+ const enabledLocalesAtBuild = readLocalesFromProjectYaml();
75
+ const defaultLocaleAtBuild = readDefaultLocaleFromProjectYaml();
76
+
77
+ /** @type {import('next').NextConfig} */
78
+ const nextConfig = {
79
+ reactStrictMode: true,
80
+ // Vercel uses standalone output — include content/ so the runtime can read MDX files.
81
+ // Without this declaration, Next.js file-tracing excludes content/ because it's
82
+ // accessed via fs.readFile at runtime (not via import), producing ENOENT in production.
83
+ // See: docs/runbooks/page-renderer-deploy-verification.md §1 Cause 2.
84
+ output: "standalone",
85
+ // Anchor file tracing to the monorepo root so cross-package paths resolve
86
+ // correctly (e.g. content/ at ../../content from apps/web/).
87
+ // Without this, Next.js may detect the wrong workspace root when multiple
88
+ // pnpm-workspace.yaml files exist (e.g. in agent worktrees).
89
+ outputFileTracingRoot: join(process.cwd(), "../../"),
90
+ // Include all MDX content files in the standalone bundle.
91
+ // Paths are relative to outputFileTracingRoot (repo root).
92
+ // Scoped to *.mdx only — avoids pulling images/binaries into the standalone bundle.
93
+ outputFileTracingIncludes: {
94
+ "/**": ["./content/**/*.mdx"],
95
+ },
96
+ // Workspace packages live outside this app's directory. Next.js must
97
+ // transpile them from source so that "use client" / "use server" directives
98
+ // are correctly honoured at the RSC module-boundary level. Without this,
99
+ // class components inside dist-compiled packages (e.g. SectionErrorBoundary)
100
+ // are consumed as server modules, crashing the build.
101
+ // Keep this list in sync with package.json workspace:* dependencies.
102
+ // Mirror of the transpilePackages list in apps-paid/marketing-web/next.config.ts.
103
+ transpilePackages: [
104
+ "@working-theory/analytics",
105
+ "@working-theory/api-client",
106
+ "@working-theory/content-adapters",
107
+ "@working-theory/fumadocs-schema",
108
+ "@working-theory/jsonld",
109
+ "@working-theory/metadata",
110
+ "@working-theory/page-renderer",
111
+ "@working-theory/schema",
112
+ "@working-theory/schema-pack-registry",
113
+ "@working-theory/sections-registry",
114
+ "@working-theory/site-config",
115
+ "@working-theory/theme",
116
+ "@working-theory/ui",
117
+ "@working-theory/validation",
118
+ "@working-theory/web-i18n",
119
+ ],
120
+ // better-auth@1.6.12 bundles @better-auth/kysely-adapter whose ESM barrel
121
+ // imports named exports from kysely that our pinned version doesn't export.
122
+ // The app uses the Prisma adapter only — the kysely adapter is dead weight.
123
+ // Marking better-auth as a server external prevents webpack from statically
124
+ // bundling it (and the unused kysely adapter) into the server chunk.
125
+ serverExternalPackages: ["better-auth"],
126
+ env: {
127
+ // Comma-separated locale list baked at build time — consumed by middleware
128
+ // and the sitemap route. NEXT_PUBLIC_ prefix makes it available in Edge
129
+ // runtime and during prerender without bundling node:fs-dependent lib/locales.
130
+ NEXT_PUBLIC_ENABLED_LOCALES: enabledLocalesAtBuild,
131
+ // Default locale baked at build time — consumed by the sitemap route for
132
+ // x-default URL composition and bare-path default-locale serving.
133
+ NEXT_PUBLIC_DEFAULT_LOCALE: defaultLocaleAtBuild,
134
+ },
135
+ async headers() {
136
+ if (!STEALTH) return [];
137
+ return [
138
+ {
139
+ source: "/:path*",
140
+ headers: [
141
+ { key: "X-Robots-Tag", value: "noindex, nofollow, noarchive" },
142
+ ],
143
+ },
144
+ ];
145
+ },
146
+ };
147
+
148
+ // Sentry build-time plugin wrap (#894). When SENTRY_AUTH_TOKEN / SENTRY_ORG /
149
+ // SENTRY_PROJECT are set, source maps upload at build time so production stack
150
+ // traces are readable. When unset (the OSS default), the upload step skips
151
+ // silently — `next build` still succeeds. Runtime SDK gating lives in the
152
+ // sentry.{client,server,edge}.config.ts files.
153
+ const sentryBuildOptions = {
154
+ silent: !process.env.CI,
155
+ ...(process.env.SENTRY_ORG ? { org: process.env.SENTRY_ORG } : {}),
156
+ ...(process.env.SENTRY_PROJECT
157
+ ? { project: process.env.SENTRY_PROJECT }
158
+ : {}),
159
+ ...(process.env.SENTRY_AUTH_TOKEN
160
+ ? { authToken: process.env.SENTRY_AUTH_TOKEN }
161
+ : {}),
162
+ };
163
+
164
+ export default withSentryConfig(
165
+ withBundleAnalyzer(withNextIntl(createMDX()(nextConfig))),
166
+ sentryBuildOptions,
167
+ );
@@ -0,0 +1,62 @@
1
+ {
2
+ "name": "@working-theory/web",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "description": "AI Launch Kit web — Next.js App Router UX surface (placeholder; MDX content adapter wires in B1).",
6
+ "license": "Apache-2.0",
7
+ "scripts": {
8
+ "dev": "next dev",
9
+ "prebuild": "fumadocs-mdx",
10
+ "build": "next build --webpack",
11
+ "postbuild": "tsx scripts/assert-content-bundled.ts",
12
+ "start": "next start",
13
+ "pretypecheck": "fumadocs-mdx",
14
+ "type-check": "tsc --noEmit",
15
+ "lint": "eslint . --no-cache",
16
+ "pretest": "fumadocs-mdx",
17
+ "test": "jest",
18
+ "test:watch": "jest --watch"
19
+ },
20
+ "dependencies": {
21
+ "@working-theory/analytics": "workspace:*",
22
+ "@working-theory/page-renderer": "workspace:*",
23
+ "@working-theory/api-client": "workspace:*",
24
+ "@working-theory/content-adapters": "workspace:*",
25
+ "@working-theory/database": "workspace:*",
26
+ "@working-theory/fumadocs-schema": "workspace:*",
27
+ "@working-theory/metadata": "workspace:*",
28
+ "@working-theory/schema": "workspace:*",
29
+ "@working-theory/schema-pack-registry": "workspace:*",
30
+ "@working-theory/templates": "workspace:*",
31
+ "@working-theory/theme": "workspace:*",
32
+ "@working-theory/ui": "workspace:*",
33
+ "@working-theory/validation": "workspace:*",
34
+ "@working-theory/web-i18n": "workspace:*",
35
+ "@prisma/adapter-pg": "^7.8.0",
36
+ "@sentry/nextjs": "^10.58.0",
37
+ "better-auth": "1.6.19",
38
+ "fumadocs-core": "^16.10.4",
39
+ "fumadocs-mdx": "^15.0.12",
40
+ "next": "^16.2.9",
41
+ "next-intl": "^3.26.3",
42
+ "next-mdx-remote": "^6.0.0",
43
+ "pg": "^8.22.0",
44
+ "react": "^19.2.7",
45
+ "react-dom": "^19.2.7",
46
+ "zod": "^4.2.1"
47
+ },
48
+ "devDependencies": {
49
+ "@next/bundle-analyzer": "^15.5.19",
50
+ "@testing-library/jest-dom": "^6.6.3",
51
+ "@testing-library/react": "^16.3.0",
52
+ "@types/jest": "^30.0.0",
53
+ "@types/node": "^22.20.0",
54
+ "@types/pg": "^8.20.0",
55
+ "@types/react": "^19.2.17",
56
+ "@types/react-dom": "^19.2.0",
57
+ "jest": "^30.4.2",
58
+ "jest-environment-jsdom": "^30.4.1",
59
+ "ts-jest": "^29.4.11",
60
+ "typescript": "^6.0.3"
61
+ }
62
+ }
@@ -0,0 +1,17 @@
1
+ # AI Launch Kit — security disclosure channel
2
+ # RFC 9116 (https://www.rfc-editor.org/rfc/rfc9116)
3
+ #
4
+ # Detached PGP signature available at:
5
+ # https://ailaunchkit.ai/.well-known/security.txt.sig
6
+ # Verify with:
7
+ # gpg --verify security.txt.sig security.txt
8
+
9
+ Contact: mailto:security@ailaunchkit.ai
10
+ Contact: https://github.com/tailwind-ai/ai-launch-kit/security/advisories/new
11
+ Expires: 2027-05-13T00:00:00.000Z
12
+ Encryption: https://keys.openpgp.org/vks/v1/by-email/security@ailaunchkit.ai
13
+ Preferred-Languages: en
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
17
+ Hiring: https://ailaunchkit.ai/careers
@@ -0,0 +1,4 @@
1
+ <svg width="1080" height="1080" viewBox="0 0 1080 1080" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="1080" height="1080" rx="190" fill="#F0B100"/>
3
+ <path d="M127.624 704.255C127.624 704.255 303.232 444.079 606.336 428.823C606.336 428.823 827.464 405.543 824.36 645.295C824.36 645.295 824.344 832.999 659.872 916.079C507.8 992.887 380.56 892.023 383.664 757.023C386.552 631.327 467.136 458.695 824.392 199.167L792.552 155.463L952.384 137.359L893.416 288.399L861.864 246.503C861.864 246.503 529.792 463.231 475.216 676.335C475.216 676.335 432.544 848.583 558.992 852.527C689.056 856.591 794.88 637.543 696.856 535.383C613.632 448.639 369.888 498.079 163.504 733.167L127.616 704.263L127.624 704.255Z" fill="white"/>
4
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg width="2030" height="280" viewBox="0 0 2030 280" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M9.93994 193.411C9.93994 193.411 67.0399 108.811 165.59 103.851C165.59 103.851 237.49 96.2805 236.48 174.231C236.48 174.231 236.48 235.261 183 262.271C133.55 287.251 92.1799 254.451 93.1899 210.551C94.1299 169.681 120.33 113.551 236.49 29.1605L226.14 14.9505L278.11 9.06055L258.94 58.1705L248.68 44.5505C248.68 44.5505 140.71 115.021 122.96 184.311C122.96 184.311 109.08 240.321 150.2 241.601C192.49 242.921 226.9 171.701 195.03 138.481C167.97 110.281 88.7199 126.351 21.6099 202.791L9.93994 193.391V193.411Z" fill="white"/>
3
+ <path d="M637.61 160.87C637.63 154.62 636.59 148.15 635.13 142.13C632.94 133.15 628.62 125.05 622.74 118.38C614.7 109.27 603.75 102.84 591.32 100.6C586.99 99.8205 582.24 99.3305 577.13 99.2305C572.02 99.3405 567.27 99.8205 562.93 100.6C550.5 102.84 539.55 109.26 531.51 118.38C525.63 125.05 521.3 133.16 519.12 142.13C517.65 148.15 516.62 154.62 516.64 160.87C516.64 162.11 516.69 163.35 516.78 164.59C517.73 177.68 523.18 189.49 531.57 198.63V198.66C532.43 199.83 536.29 204.3 543.67 208.68C550.94 213.23 559.29 216.27 568.23 217.33C569.21 217.45 570.62 217.55 572.14 217.63C573.8 217.72 575.47 217.74 577.14 217.72C578.8 217.74 580.47 217.72 582.13 217.63C583.65 217.55 585.06 217.45 586.04 217.33C594.98 216.28 603.32 213.24 610.6 208.68C617.98 204.3 621.84 199.83 622.71 198.66V198.63C631.09 189.49 636.53 177.68 637.48 164.59C637.57 163.35 637.62 162.11 637.62 160.87H637.61ZM575.36 206.24C566.13 205.88 557.29 199.8 553.69 196.26C551.02 193.63 548.42 189.82 546.2 185.23C539.48 171.3 536.35 150.06 545.84 131.91C547.64 128.47 549.89 125.13 552.66 121.98C557.44 116.54 566.12 111.25 575.35 110.9C575.68 110.89 576 110.9 576.33 110.9C576.59 110.9 576.85 110.9 577.11 110.9C577.37 110.9 577.63 110.9 577.89 110.9C578.22 110.9 578.54 110.89 578.87 110.9C588.1 111.26 596.78 116.55 601.56 121.98C604.33 125.13 606.58 128.46 608.38 131.91C617.87 150.06 614.74 171.29 608.02 185.23C605.81 189.82 603.2 193.63 600.53 196.26C596.94 199.8 588.09 205.88 578.86 206.24C578.53 206.25 575.67 206.25 575.34 206.24H575.36Z" fill="white"/>
4
+ <path d="M505.68 85.8203L505.53 85.8403H505.68V85.8203Z" fill="white"/>
5
+ <path d="M327.62 85.8105V85.8405H327.8L327.62 85.8105Z" fill="white"/>
6
+ <path d="M505.53 85.8398L494.94 87.3498L484.07 85.8398H484.05C484.05 85.8398 484.05 86.7899 483.89 88.7999C483.4 94.9599 481.42 111.05 473.33 140L455.99 201.17L429.11 85.8398H405.93L376.12 201.17L349.99 87.4198L349.63 85.8699L338.96 87.3498L327.79 85.8398H327.61L331.06 100.44L358.78 217.72H385.47L414.69 112.33L439.82 217.72H465.15L501.18 100.44L505.67 85.8398H505.53Z" fill="white"/>
7
+ <path d="M728.22 217.349L745.98 217.719L713.14 163.199C721.26 161.599 728.25 158.669 732.61 154.419C738.84 148.309 741.96 140.699 741.96 131.589C741.96 124.799 740.21 118.819 736.71 113.629C733.21 108.449 728.59 104.749 722.85 102.529C717.11 100.309 705.58 99.1992 694.56 99.1992H666.3V217.719H685.27V164.649H696.54L728.23 217.339L728.22 217.349ZM685.59 104.789H694.4C703.1 104.789 710.22 105.479 715.76 110.699C721.3 115.909 724.08 123.039 724.08 132.079C724.08 141.119 721.31 148.169 715.76 153.419C710.21 158.669 703.24 159.619 694.83 159.619H685.59V104.789Z" fill="white"/>
8
+ <path d="M820.6 142.339L856.1 99.9395H848.7L796.87 161.859V99.9494L785.92 101.539L774.66 99.9395V217.729H796.87V170.949L805.62 160.349L837.25 217.729H862.83L820.6 142.339Z" fill="white"/>
9
+ <path d="M902.32 100.75L891.52 99.25V104.85V217.73H912.98V104.85V99.25L902.32 100.75Z" fill="white"/>
10
+ <path d="M1039.33 100.59L1028.57 99.1003V104.69V187.73H1027.53L971.68 99.0703H952.44V217.73H973.94V129.55H974.92L1030.83 217.73H1049.95V104.69V99.1003L1039.33 100.59Z" fill="white"/>
11
+ <path d="M1195.3 158.031H1129.76V166.471H1175.76C1169.26 217.871 1110.97 219.621 1102.73 168.571C1099.6 152.161 1103.17 134.121 1114.51 121.491C1129.92 103.751 1157.79 107.831 1165.58 131.511C1168.67 131.481 1176.64 131.411 1179.82 131.391L1184.91 117.861C1164.6 94.3305 1123.71 92.2005 1099.67 111.651C1074.53 132.211 1070.62 174.681 1093.29 198.491V198.511C1121.22 227.991 1169.39 221.981 1186.42 191.221C1191.17 182.641 1195.48 171.141 1195.3 158.031Z" fill="white"/>
12
+ <path d="M1749.04 160.98C1749.06 154.74 1748.02 148.27 1746.56 142.26C1744.38 133.29 1740.06 125.2 1734.18 118.54C1726.15 109.44 1715.21 103.02 1702.8 100.79C1698.47 100.01 1693.73 99.5199 1688.62 99.4199C1683.51 99.5299 1678.77 100.01 1674.44 100.79C1662.03 103.03 1651.09 109.44 1643.06 118.54C1637.18 125.2 1632.86 133.3 1630.68 142.26C1629.22 148.27 1628.18 154.74 1628.2 160.98C1628.2 162.22 1628.25 163.46 1628.34 164.69C1629.29 177.77 1634.73 189.56 1643.11 198.69V198.72C1643.97 199.89 1647.83 204.36 1655.2 208.73C1662.46 213.28 1670.8 216.31 1679.73 217.37C1680.71 217.49 1682.12 217.59 1683.64 217.67C1685.3 217.76 1686.97 217.78 1688.63 217.76C1690.29 217.78 1691.96 217.76 1693.62 217.67C1695.14 217.59 1696.55 217.49 1697.53 217.37C1706.46 216.32 1714.79 213.28 1722.06 208.73C1729.43 204.35 1733.29 199.89 1734.16 198.72V198.69C1742.53 189.56 1747.97 177.77 1748.92 164.69C1749.01 163.45 1749.06 162.21 1749.06 160.98H1749.04ZM1686.87 206.29C1677.65 205.93 1668.82 199.86 1665.23 196.32C1662.56 193.69 1659.96 189.89 1657.75 185.3C1651.04 171.38 1647.92 150.17 1657.39 132.04C1659.19 128.6 1661.44 125.27 1664.21 122.13C1668.98 116.7 1677.66 111.42 1686.87 111.06C1687.2 111.05 1687.52 111.06 1687.85 111.06C1688.11 111.06 1688.37 111.06 1688.63 111.06C1688.89 111.06 1689.15 111.06 1689.41 111.06C1689.74 111.06 1690.06 111.05 1690.39 111.06C1699.61 111.42 1708.28 116.7 1713.05 122.13C1715.82 125.28 1718.07 128.6 1719.87 132.04C1729.35 150.17 1726.22 171.38 1719.51 185.3C1717.3 189.89 1714.7 193.69 1712.03 196.32C1708.44 199.86 1699.6 205.93 1690.39 206.29C1690.06 206.3 1687.2 206.3 1686.87 206.29Z" fill="white"/>
13
+ <path d="M1611.56 107.62L1611.46 99.25L1544.77 99.43V217.59L1611.46 217.77V209.14L1564.58 211.2L1564.62 158.2L1601.82 158.64V151.84L1564.81 152.98L1564.88 106.32L1611.56 107.62Z" fill="white"/>
14
+ <path d="M1962.37 100.82L1962.22 100.79C1962.22 100.79 1958.47 99.99 1953.46 99.34C1953.22 99.31 1953.03 99.28 1952.86 99.25L1924.61 152.5L1893.92 99.59C1892.11 99.69 1886.03 100.06 1881.61 100.72L1881.49 100.74H1881.38C1881.31 100.72 1874.59 99.93 1868.44 99.69L1911.28 165.9L1911.22 217.76H1931.48L1931.53 166.7L1972.21 99.85C1970.08 100.01 1966.24 100.32 1962.51 100.8L1962.36 100.82H1962.37Z" fill="white"/>
15
+ <path d="M1308.42 217.77H1330.5V92.3595L1373.65 96.9095L1373.68 85.5195H1265.24L1265.21 96.7495L1308.42 92.3695V217.77Z" fill="white"/>
16
+ <path d="M1488.06 98.8398L1487.98 149.98L1453.07 152.05L1419.34 149.68L1419.42 99.1398L1409.2 100.73L1398.68 99.1298V217.77L1408.32 217.66L1419.42 217.77L1419.49 157.59L1453.21 157.19L1487.84 157.59L1488.06 217.48L1498.28 217.38L1508.81 217.48V98.8398L1498.59 100.44L1488.06 98.8398Z" fill="white"/>
17
+ <path d="M1838.64 217.401L1856.38 217.771L1823.58 163.311C1831.69 161.711 1838.67 158.791 1843.03 154.541C1849.26 148.431 1852.37 140.831 1852.37 131.741C1852.37 124.961 1850.62 118.981 1847.13 113.801C1843.64 108.631 1839.02 104.931 1833.28 102.711C1827.54 100.491 1816.03 99.3809 1805.03 99.3809H1776.8V217.761H1795.75V164.761H1807.01L1838.66 217.391L1838.64 217.401ZM1796.06 104.961H1804.86C1813.55 104.961 1820.66 105.651 1826.2 110.861C1831.74 116.071 1834.51 123.191 1834.51 132.221C1834.51 141.251 1831.74 148.291 1826.2 153.531C1820.66 158.771 1813.69 159.731 1805.29 159.731H1796.06V104.961Z" fill="white"/>
18
+ <path d="M2000.62 112V113.89H1997.43V122.66H1995.19V113.89H1991.99V112H2000.63H2000.62Z" fill="white"/>
19
+ <path d="M2009 112H2012.21V122.66H2010.13V115.45C2010.13 115.24 2010.13 114.95 2010.13 114.58C2010.13 114.21 2010.13 113.92 2010.13 113.72L2008.11 122.67H2005.95L2003.94 113.72C2003.94 113.92 2003.94 114.21 2003.94 114.58C2003.94 114.95 2003.94 115.24 2003.94 115.45V122.66H2001.86V112H2005.1L2007.04 120.38L2008.97 112H2009Z" fill="white"/>
20
+ <path d="M2002.09 134.78C1992.18 134.78 1984.12 126.72 1984.12 116.81C1984.12 106.9 1992.18 98.8398 2002.09 98.8398C2012 98.8398 2020.06 106.9 2020.06 116.81C2020.06 126.72 2012 134.78 2002.09 134.78ZM2002.09 102.93C1994.44 102.93 1988.22 109.15 1988.22 116.81C1988.22 124.47 1994.44 130.69 2002.09 130.69C2009.74 130.69 2015.97 124.47 2015.97 116.81C2015.97 109.15 2009.75 102.93 2002.09 102.93Z" fill="white"/>
21
+ </svg>
@@ -0,0 +1,21 @@
1
+ <svg width="2030" height="280" viewBox="0 0 2030 280" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <path d="M9.93994 193.411C9.93994 193.411 67.0399 108.811 165.59 103.851C165.59 103.851 237.49 96.2805 236.48 174.231C236.48 174.231 236.48 235.261 183 262.271C133.55 287.251 92.1799 254.451 93.1899 210.551C94.1299 169.681 120.33 113.551 236.49 29.1605L226.14 14.9505L278.11 9.06055L258.94 58.1705L248.68 44.5505C248.68 44.5505 140.71 115.021 122.96 184.311C122.96 184.311 109.08 240.321 150.2 241.601C192.49 242.921 226.9 171.701 195.03 138.481C167.97 110.281 88.7199 126.351 21.6099 202.791L9.93994 193.391V193.411Z" fill="black"/>
3
+ <path d="M637.61 160.87C637.63 154.62 636.59 148.15 635.13 142.13C632.94 133.15 628.62 125.05 622.74 118.38C614.7 109.27 603.75 102.84 591.32 100.6C586.99 99.8205 582.24 99.3305 577.13 99.2305C572.02 99.3405 567.27 99.8205 562.93 100.6C550.5 102.84 539.55 109.26 531.51 118.38C525.63 125.05 521.3 133.16 519.12 142.13C517.65 148.15 516.62 154.62 516.64 160.87C516.64 162.11 516.69 163.35 516.78 164.59C517.73 177.68 523.18 189.49 531.57 198.63V198.66C532.43 199.83 536.29 204.3 543.67 208.68C550.94 213.23 559.29 216.27 568.23 217.33C569.21 217.45 570.62 217.55 572.14 217.63C573.8 217.72 575.47 217.74 577.14 217.72C578.8 217.74 580.47 217.72 582.13 217.63C583.65 217.55 585.06 217.45 586.04 217.33C594.98 216.28 603.32 213.24 610.6 208.68C617.98 204.3 621.84 199.83 622.71 198.66V198.63C631.09 189.49 636.53 177.68 637.48 164.59C637.57 163.35 637.62 162.11 637.62 160.87H637.61ZM575.36 206.24C566.13 205.88 557.29 199.8 553.69 196.26C551.02 193.63 548.42 189.82 546.2 185.23C539.48 171.3 536.35 150.06 545.84 131.91C547.64 128.47 549.89 125.13 552.66 121.98C557.44 116.54 566.12 111.25 575.35 110.9C575.68 110.89 576 110.9 576.33 110.9C576.59 110.9 576.85 110.9 577.11 110.9C577.37 110.9 577.63 110.9 577.89 110.9C578.22 110.9 578.54 110.89 578.87 110.9C588.1 111.26 596.78 116.55 601.56 121.98C604.33 125.13 606.58 128.46 608.38 131.91C617.87 150.06 614.74 171.29 608.02 185.23C605.81 189.82 603.2 193.63 600.53 196.26C596.94 199.8 588.09 205.88 578.86 206.24C578.53 206.25 575.67 206.25 575.34 206.24H575.36Z" fill="black"/>
4
+ <path d="M505.68 85.8203L505.53 85.8403H505.68V85.8203Z" fill="black"/>
5
+ <path d="M327.62 85.8105V85.8405H327.8L327.62 85.8105Z" fill="black"/>
6
+ <path d="M505.53 85.8398L494.94 87.3498L484.07 85.8398H484.05C484.05 85.8398 484.05 86.7899 483.89 88.7999C483.4 94.9599 481.42 111.05 473.33 140L455.99 201.17L429.11 85.8398H405.93L376.12 201.17L349.99 87.4198L349.63 85.8699L338.96 87.3498L327.79 85.8398H327.61L331.06 100.44L358.78 217.72H385.47L414.69 112.33L439.82 217.72H465.15L501.18 100.44L505.67 85.8398H505.53Z" fill="black"/>
7
+ <path d="M728.22 217.349L745.98 217.719L713.14 163.199C721.26 161.599 728.25 158.669 732.61 154.419C738.84 148.309 741.96 140.699 741.96 131.589C741.96 124.799 740.21 118.819 736.71 113.629C733.21 108.449 728.59 104.749 722.85 102.529C717.11 100.309 705.58 99.1992 694.56 99.1992H666.3V217.719H685.27V164.649H696.54L728.23 217.339L728.22 217.349ZM685.59 104.789H694.4C703.1 104.789 710.22 105.479 715.76 110.699C721.3 115.909 724.08 123.039 724.08 132.079C724.08 141.119 721.31 148.169 715.76 153.419C710.21 158.669 703.24 159.619 694.83 159.619H685.59V104.789Z" fill="black"/>
8
+ <path d="M820.6 142.339L856.1 99.9395H848.7L796.87 161.859V99.9494L785.92 101.539L774.66 99.9395V217.729H796.87V170.949L805.62 160.349L837.25 217.729H862.83L820.6 142.339Z" fill="black"/>
9
+ <path d="M902.32 100.75L891.52 99.25V104.85V217.73H912.98V104.85V99.25L902.32 100.75Z" fill="black"/>
10
+ <path d="M1039.33 100.59L1028.57 99.1003V104.69V187.73H1027.53L971.68 99.0703H952.44V217.73H973.94V129.55H974.92L1030.83 217.73H1049.95V104.69V99.1003L1039.33 100.59Z" fill="black"/>
11
+ <path d="M1195.3 158.031H1129.76V166.471H1175.76C1169.26 217.871 1110.97 219.621 1102.73 168.571C1099.6 152.161 1103.17 134.121 1114.51 121.491C1129.92 103.751 1157.79 107.831 1165.58 131.511C1168.67 131.481 1176.64 131.411 1179.82 131.391L1184.91 117.861C1164.6 94.3305 1123.71 92.2005 1099.67 111.651C1074.53 132.211 1070.62 174.681 1093.29 198.491V198.511C1121.22 227.991 1169.39 221.981 1186.42 191.221C1191.17 182.641 1195.48 171.141 1195.3 158.031Z" fill="black"/>
12
+ <path d="M1749.04 160.98C1749.06 154.74 1748.02 148.27 1746.56 142.26C1744.38 133.29 1740.06 125.2 1734.18 118.54C1726.15 109.44 1715.21 103.02 1702.8 100.79C1698.47 100.01 1693.73 99.5199 1688.62 99.4199C1683.51 99.5299 1678.77 100.01 1674.44 100.79C1662.03 103.03 1651.09 109.44 1643.06 118.54C1637.18 125.2 1632.86 133.3 1630.68 142.26C1629.22 148.27 1628.18 154.74 1628.2 160.98C1628.2 162.22 1628.25 163.46 1628.34 164.69C1629.29 177.77 1634.73 189.56 1643.11 198.69V198.72C1643.97 199.89 1647.83 204.36 1655.2 208.73C1662.46 213.28 1670.8 216.31 1679.73 217.37C1680.71 217.49 1682.12 217.59 1683.64 217.67C1685.3 217.76 1686.97 217.78 1688.63 217.76C1690.29 217.78 1691.96 217.76 1693.62 217.67C1695.14 217.59 1696.55 217.49 1697.53 217.37C1706.46 216.32 1714.79 213.28 1722.06 208.73C1729.43 204.35 1733.29 199.89 1734.16 198.72V198.69C1742.53 189.56 1747.97 177.77 1748.92 164.69C1749.01 163.45 1749.06 162.21 1749.06 160.98H1749.04ZM1686.87 206.29C1677.65 205.93 1668.82 199.86 1665.23 196.32C1662.56 193.69 1659.96 189.89 1657.75 185.3C1651.04 171.38 1647.92 150.17 1657.39 132.04C1659.19 128.6 1661.44 125.27 1664.21 122.13C1668.98 116.7 1677.66 111.42 1686.87 111.06C1687.2 111.05 1687.52 111.06 1687.85 111.06C1688.11 111.06 1688.37 111.06 1688.63 111.06C1688.89 111.06 1689.15 111.06 1689.41 111.06C1689.74 111.06 1690.06 111.05 1690.39 111.06C1699.61 111.42 1708.28 116.7 1713.05 122.13C1715.82 125.28 1718.07 128.6 1719.87 132.04C1729.35 150.17 1726.22 171.38 1719.51 185.3C1717.3 189.89 1714.7 193.69 1712.03 196.32C1708.44 199.86 1699.6 205.93 1690.39 206.29C1690.06 206.3 1687.2 206.3 1686.87 206.29Z" fill="black"/>
13
+ <path d="M1611.56 107.62L1611.46 99.25L1544.77 99.43V217.59L1611.46 217.77V209.14L1564.58 211.2L1564.62 158.2L1601.82 158.64V151.84L1564.81 152.98L1564.88 106.32L1611.56 107.62Z" fill="black"/>
14
+ <path d="M1962.37 100.82L1962.22 100.79C1962.22 100.79 1958.47 99.99 1953.46 99.34C1953.22 99.31 1953.03 99.28 1952.86 99.25L1924.61 152.5L1893.92 99.59C1892.11 99.69 1886.03 100.06 1881.61 100.72L1881.49 100.74H1881.38C1881.31 100.72 1874.59 99.93 1868.44 99.69L1911.28 165.9L1911.22 217.76H1931.48L1931.53 166.7L1972.21 99.85C1970.08 100.01 1966.24 100.32 1962.51 100.8L1962.36 100.82H1962.37Z" fill="black"/>
15
+ <path d="M1308.42 217.77H1330.5V92.3595L1373.65 96.9095L1373.68 85.5195H1265.24L1265.21 96.7495L1308.42 92.3695V217.77Z" fill="black"/>
16
+ <path d="M1488.06 98.8398L1487.98 149.98L1453.07 152.05L1419.34 149.68L1419.42 99.1398L1409.2 100.73L1398.68 99.1298V217.77L1408.32 217.66L1419.42 217.77L1419.49 157.59L1453.21 157.19L1487.84 157.59L1488.06 217.48L1498.28 217.38L1508.81 217.48V98.8398L1498.59 100.44L1488.06 98.8398Z" fill="black"/>
17
+ <path d="M1838.64 217.401L1856.38 217.771L1823.58 163.311C1831.69 161.711 1838.67 158.791 1843.03 154.541C1849.26 148.431 1852.37 140.831 1852.37 131.741C1852.37 124.961 1850.62 118.981 1847.13 113.801C1843.64 108.631 1839.02 104.931 1833.28 102.711C1827.54 100.491 1816.03 99.3809 1805.03 99.3809H1776.8V217.761H1795.75V164.761H1807.01L1838.66 217.391L1838.64 217.401ZM1796.06 104.961H1804.86C1813.55 104.961 1820.66 105.651 1826.2 110.861C1831.74 116.071 1834.51 123.191 1834.51 132.221C1834.51 141.251 1831.74 148.291 1826.2 153.531C1820.66 158.771 1813.69 159.731 1805.29 159.731H1796.06V104.961Z" fill="black"/>
18
+ <path d="M2000.62 112V113.89H1997.43V122.66H1995.19V113.89H1991.99V112H2000.63H2000.62Z" fill="black"/>
19
+ <path d="M2009 112H2012.21V122.66H2010.13V115.45C2010.13 115.24 2010.13 114.95 2010.13 114.58C2010.13 114.21 2010.13 113.92 2010.13 113.72L2008.11 122.67H2005.95L2003.94 113.72C2003.94 113.92 2003.94 114.21 2003.94 114.58C2003.94 114.95 2003.94 115.24 2003.94 115.45V122.66H2001.86V112H2005.1L2007.04 120.38L2008.97 112H2009Z" fill="black"/>
20
+ <path d="M2002.09 134.78C1992.18 134.78 1984.12 126.72 1984.12 116.81C1984.12 106.9 1992.18 98.8398 2002.09 98.8398C2012 98.8398 2020.06 106.9 2020.06 116.81C2020.06 126.72 2012 134.78 2002.09 134.78ZM2002.09 102.93C1994.44 102.93 1988.22 109.15 1988.22 116.81C1988.22 124.47 1994.44 130.69 2002.09 130.69C2009.74 130.69 2015.97 124.47 2015.97 116.81C2015.97 109.15 2009.75 102.93 2002.09 102.93Z" fill="black"/>
21
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="1080" height="1080" viewBox="0 0 1080 1080" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="1080" height="1080" rx="190" fill="white"/>
3
+ <path d="M127.624 704.255C127.624 704.255 303.232 444.079 606.336 428.823C606.336 428.823 827.464 405.543 824.36 645.295C824.36 645.295 824.344 832.999 659.872 916.079C507.8 992.887 380.56 892.023 383.664 757.023C386.552 631.327 467.136 458.695 824.392 199.167L792.552 155.463L952.384 137.359L893.416 288.399L861.864 246.503C861.864 246.503 529.792 463.231 475.216 676.335C475.216 676.335 432.544 848.583 558.992 852.527C689.056 856.591 794.88 637.543 696.856 535.383C613.632 448.639 369.888 498.079 163.504 733.167L127.616 704.263L127.624 704.255Z" fill="black"/>
4
+ </svg>
@@ -0,0 +1,4 @@
1
+ <svg width="1080" height="1080" viewBox="0 0 1080 1080" fill="none" xmlns="http://www.w3.org/2000/svg">
2
+ <rect width="1080" height="1080" rx="190" fill="black"/>
3
+ <path d="M127.624 704.255C127.624 704.255 303.232 444.079 606.336 428.823C606.336 428.823 827.464 405.543 824.36 645.295C824.36 645.295 824.344 832.999 659.872 916.079C507.8 992.887 380.56 892.023 383.664 757.023C386.552 631.327 467.136 458.695 824.392 199.167L792.552 155.463L952.384 137.359L893.416 288.399L861.864 246.503C861.864 246.503 529.792 463.231 475.216 676.335C475.216 676.335 432.544 848.583 558.992 852.527C689.056 856.591 794.88 637.543 696.856 535.383C613.632 448.639 369.888 498.079 163.504 733.167L127.616 704.263L127.624 704.255Z" fill="white"/>
4
+ </svg>
@@ -0,0 +1,19 @@
1
+ {
2
+ "name": "AI Launch Kit",
3
+ "short_name": "AI Launch Kit",
4
+ "icons": [
5
+ {
6
+ "src": "/android-chrome-192x192.png",
7
+ "sizes": "192x192",
8
+ "type": "image/png"
9
+ },
10
+ {
11
+ "src": "/android-chrome-512x512.png",
12
+ "sizes": "512x512",
13
+ "type": "image/png"
14
+ }
15
+ ],
16
+ "theme_color": "#F0B100",
17
+ "background_color": "#ffffff",
18
+ "display": "standalone"
19
+ }
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Assert that content/ was bundled into the Next.js standalone output.
3
+ *
4
+ * Standalone layout: Next.js copies traced files into .next/standalone/
5
+ * preserving their path relative to outputFileTracingRoot (repo root). So
6
+ * <repo-root>/content/en/HomePage/home.mdx → .next/standalone/content/en/...
7
+ *
8
+ * See: docs/runbooks/page-renderer-deploy-verification.md §1 Cause 2
9
+ */
10
+
11
+ import { existsSync } from "node:fs";
12
+ import { join, resolve } from "node:path";
13
+ import { fileURLToPath } from "node:url";
14
+
15
+ // apps/web/ is one level up from scripts/
16
+ // Use import.meta.url (ESM) rather than __dirname (CJS).
17
+ const scriptDir = resolve(fileURLToPath(import.meta.url), "..");
18
+ const appWebDir = resolve(scriptDir, "..");
19
+ const standaloneDir = join(appWebDir, ".next", "standalone");
20
+
21
+ // Sentinel file: content/en/HomePage/home.mdx
22
+ // Traced from ../../content/en/HomePage/home.mdx (relative to apps/web),
23
+ // placed at standaloneDir/content/en/HomePage/home.mdx by Next.js file tracing.
24
+ const sentinelRelative = join("content", "en", "HomePage", "home.mdx");
25
+ const sentinelPath = join(standaloneDir, sentinelRelative);
26
+
27
+ if (!existsSync(standaloneDir)) {
28
+ console.error(
29
+ "[assert-content-bundled] ERROR: .next/standalone/ does not exist.",
30
+ "Run `next build` before this assertion.",
31
+ );
32
+ process.exit(1);
33
+ }
34
+
35
+ if (!existsSync(sentinelPath)) {
36
+ console.error(
37
+ `[assert-content-bundled] ERROR: ${sentinelRelative} is missing from the standalone output.`,
38
+ );
39
+ console.error(" Expected path:", sentinelPath);
40
+ console.error(
41
+ " This means outputFileTracingIncludes did not bundle content/ into the build artifact.",
42
+ );
43
+ console.error(" The deployed site cannot serve MDX content.");
44
+ console.error(
45
+ " Fix: verify outputFileTracingIncludes in apps/web/next.config.mjs covers '../../content/**/*.mdx'.",
46
+ );
47
+ console.error(
48
+ " See: docs/runbooks/page-renderer-deploy-verification.md §1 Cause 2",
49
+ );
50
+ process.exit(1);
51
+ }
52
+
53
+ console.log(
54
+ `[assert-content-bundled] ✓ ${sentinelRelative} present in .next/standalone/`,
55
+ );