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,35 @@
1
+ ---
2
+ type: HowTo
3
+ slug: configure-aeo-scoring
4
+ title: How to Configure AEO Scoring
5
+ description: Run the deterministic AEO scorer against your site's pages and interpret the Layer 1 citation-readiness output.
6
+ publishedAt: "2026-05-10"
7
+ ---
8
+
9
+ # How to Configure AEO Scoring
10
+
11
+ `@working-theory/aeo` grades pages against Layer 1 citation-readiness rules. The scorer is deterministic — the same input always returns the same score, with no network calls.
12
+
13
+ ## Step 1 — Install `@working-theory/aeo`
14
+
15
+ ```bash
16
+ pnpm add @working-theory/aeo
17
+ ```
18
+
19
+ ## Step 2 — Run the scorer
20
+
21
+ Pass a `ContentPage` (from the content adapter) to `scoreAeo`:
22
+
23
+ ```ts
24
+ import { scoreAeo } from "@working-theory/aeo";
25
+ const result = scoreAeo(page);
26
+ console.log(result.score, result.findings);
27
+ ```
28
+
29
+ ## Step 3 — Interpret findings
30
+
31
+ Each finding has a `rule`, a `severity` (`error` | `warning` | `info`), and a `message`. Errors block the Layer 1 passing threshold; warnings are informational.
32
+
33
+ ## Step 4 — Fix and re-score
34
+
35
+ Add missing frontmatter fields (most commonly `publishedAt`, `image`, or a `schema` override). Re-run the scorer until `result.passing` is `true`.
@@ -0,0 +1,36 @@
1
+ ---
2
+ type: HowTo
3
+ slug: set-up-json-ld
4
+ title: How to Set Up JSON-LD with AI Launch Kit
5
+ description: A step-by-step guide to enabling structured data on your AILK site — from package install to validated schema.org output.
6
+ publishedAt: "2026-05-01"
7
+ ---
8
+
9
+ # How to Set Up JSON-LD with AI Launch Kit
10
+
11
+ Structured data tells answer engines what your pages are about. This guide walks through adding JSON-LD to every page in an AILK site.
12
+
13
+ ## Step 1 — Install `@working-theory/schema`
14
+
15
+ `@working-theory/schema` ships the typed JSON-LD builders. Add it to your workspace:
16
+
17
+ ```bash
18
+ pnpm add @working-theory/schema
19
+ ```
20
+
21
+ ## Step 2 — Add a content directory
22
+
23
+ Create `content/en/<Type>/` directories for each page type you want to support. Drop an MDX file inside with the required frontmatter fields:
24
+
25
+ - `type` — the schema.org type key (e.g. `HowTo`)
26
+ - `slug` — the URL segment
27
+ - `title` — page title
28
+ - `description` — one-sentence description
29
+
30
+ ## Step 3 — Wire the route
31
+
32
+ Create a Next.js route at `app/[locale]/<path>/[slug]/page.tsx`. Import `getMdxSource` from the content lib and `pageToJsonLd` from the JSON-LD bridge. Return a `<JsonLdScript>` alongside your `<main>` element.
33
+
34
+ ## Step 4 — Verify
35
+
36
+ Run `pnpm preflight`. The type-check step validates that every MDX frontmatter field matches the content adapter's type contract. The build step confirms Next.js can prerender the route.
@@ -0,0 +1,31 @@
1
+ ---
2
+ type: Integration
3
+ slug: github-actions
4
+ title: GitHub Actions
5
+ description: Run pnpm preflight, content validation, and AEO scoring automatically on every pull request via GitHub Actions CI.
6
+ schema:
7
+ mainEntity:
8
+ "@type": SoftwareApplication
9
+ name: GitHub Actions
10
+ applicationCategory: DeveloperTools
11
+ operatingSystem: Web
12
+ ---
13
+
14
+ # GitHub Actions
15
+
16
+ AILK ships a ready-to-use CI configuration for GitHub Actions. Every pull request runs the full preflight suite: architecture lint, type-check, content validation, and AEO scoring.
17
+
18
+ ## What runs in CI
19
+
20
+ - `pnpm architecture` — import boundary lint against `architecture.yaml`
21
+ - `pnpm content:check` — MDX frontmatter validation
22
+ - `pnpm --filter @working-theory/web build` — Next.js build verification
23
+ - `pnpm -r test` — full test suite
24
+
25
+ ## Setting up
26
+
27
+ Copy `.github/workflows/ci.yml` from the AILK template into your repo. The workflow uses `pnpm` caching by default — first runs are slower, subsequent runs pick up the cache.
28
+
29
+ ## AEO regression gate
30
+
31
+ Add the `@working-theory/aeo` scoring step to your workflow to catch citation-readiness regressions before they ship. The scorer exits non-zero when a page's score drops below its baseline.
@@ -0,0 +1,26 @@
1
+ ---
2
+ type: Integration
3
+ slug: openai-api
4
+ title: OpenAI API
5
+ description: Connect AILK-powered sites to OpenAI's API for agent-driven content generation, structured extraction, and answer-engine query routing.
6
+ schema:
7
+ mainEntity:
8
+ "@type": SoftwareApplication
9
+ name: OpenAI API
10
+ applicationCategory: ArtificialIntelligence
11
+ operatingSystem: Web
12
+ ---
13
+
14
+ # OpenAI API
15
+
16
+ AILK's MCP server exposes tool definitions that map directly to OpenAI function-calling conventions. Connect your OpenAI-powered agents to AILK data without writing custom adapters.
17
+
18
+ ## What the integration covers
19
+
20
+ - **Structured extraction** — pass MDX body text through an OpenAI model to extract structured data; write the result back as frontmatter fields
21
+ - **Agent query routing** — route natural-language queries from an OpenAI agent to the correct AILK content type via the MCP tool surface
22
+ - **Schema generation assist** — use a model to suggest schema.org field values from unstructured page content
23
+
24
+ ## Getting started
25
+
26
+ Set `OPENAI_API_KEY` in your `.env`. Import the client from `@working-theory/api-client` and call `createAgentSession()` to get a session bound to your OpenAI credentials.
@@ -0,0 +1,32 @@
1
+ ---
2
+ type: Integration
3
+ slug: vercel
4
+ title: Vercel
5
+ description: Deploy AILK-powered Next.js sites to Vercel with zero configuration — environment variable mapping, preview deployment URLs, and edge-runtime compatibility.
6
+ schema:
7
+ mainEntity:
8
+ "@type": SoftwareApplication
9
+ name: Vercel
10
+ applicationCategory: DeveloperTools
11
+ operatingSystem: Web
12
+ ---
13
+
14
+ # Vercel
15
+
16
+ AILK's `apps/web` is a standard Next.js application and deploys to Vercel without modification. The `vercel.json` in the template configures preview URL patterns and environment variable mappings.
17
+
18
+ ## Environment variables
19
+
20
+ Map these from your Vercel project settings:
21
+
22
+ - `DATABASE_URL` — your Prisma connection string
23
+ - `NEXTAUTH_SECRET` — a random 32-byte secret for session signing
24
+ - `NEXTAUTH_URL` — your production URL (or preview URL for branch deployments)
25
+
26
+ ## Preview deployments
27
+
28
+ Every pull request gets a unique preview URL. AILK's `verify-preview` script can optionally run Playwright smoke tests against the preview URL before merge.
29
+
30
+ ## Edge compatibility
31
+
32
+ The MCP server (`apps/mcp`) is not edge-compatible and should be deployed separately as a standard Node.js server. `apps/web` and `apps/api` are edge-compatible and run in Vercel's edge runtime.
@@ -0,0 +1,22 @@
1
+ ---
2
+ type: IntegrationsList
3
+ slug: integrations
4
+ title: Integrations
5
+ description: First-party integrations for AI Launch Kit — connect your AILK-powered site to the AI providers, CI platforms, and deployment targets your team already uses.
6
+ ---
7
+
8
+ # Integrations
9
+
10
+ AILK is built to work alongside the tools your team already uses. These integrations cover the most common connection points: AI providers, CI pipelines, and deployment platforms.
11
+
12
+ ## AI providers
13
+
14
+ Connect to OpenAI, Anthropic, and other model providers via the MCP tool surface. AILK's agent-compatible API routes are model-agnostic — swap providers without changing your content layer.
15
+
16
+ ## CI platforms
17
+
18
+ GitHub Actions, CircleCI, and similar platforms can run AILK's preflight suite and AEO scoring gate on every pull request. The scoring gate exits non-zero on regression, keeping your citation readiness from drifting.
19
+
20
+ ## Deployment targets
21
+
22
+ AILK's Next.js web app deploys to Vercel, Netlify, and self-hosted Node.js environments. The API server targets any Node.js 20+ runtime. The MCP server follows the same runtime requirement.
@@ -0,0 +1,46 @@
1
+ ---
2
+ type: JobPosting
3
+ slug: content-strategist
4
+ title: Content Strategist
5
+ description: Own the AILK content pipeline — how-to guides, technical articles, whitepapers, and AEO-optimized landing pages. Remote, part-time to full-time.
6
+ publishedAt: "2026-05-05"
7
+ schema:
8
+ mainEntity:
9
+ "@type": JobPosting
10
+ title: Content Strategist
11
+ description: Own the AILK content pipeline — how-to guides, technical articles, whitepapers, and AEO-optimized landing pages.
12
+ datePosted: "2026-05-05"
13
+ employmentType: PART_TIME
14
+ hiringOrganization:
15
+ "@type": Organization
16
+ name: AI Launch Kit
17
+ jobLocation:
18
+ "@type": Place
19
+ address:
20
+ "@type": PostalAddress
21
+ addressCountry: US
22
+ ---
23
+
24
+ # Content Strategist
25
+
26
+ AILK ships content alongside code. We need a strategist who understands both — someone who can write a clear how-to guide and also understand why `inLanguage` matters for AEO.
27
+
28
+ ## What you will do
29
+
30
+ - Plan and produce how-to guides, technical articles, and whitepapers
31
+ - Optimize existing content for Layer 1 AEO citation-readiness
32
+ - Work with the engineering team to document new features as they ship
33
+ - Develop a content calendar aligned with roadmap phases
34
+
35
+ ## What we are looking for
36
+
37
+ - Strong technical writing — you can explain APIs to developers clearly
38
+ - Curiosity about structured data, schema.org, and answer engine optimization
39
+ - Comfort working asynchronously with a small, distributed team
40
+ - Portfolio of published technical content (blog posts, docs, guides)
41
+
42
+ ## What we offer
43
+
44
+ - Flexible hours — part-time to full-time based on your availability
45
+ - Fully remote
46
+ - Direct access to the product team for research and context
@@ -0,0 +1,47 @@
1
+ ---
2
+ type: JobPosting
3
+ slug: developer-advocate
4
+ title: Developer Advocate
5
+ description: Help the AILK community succeed — talks, workshops, demos, and the open-source feedback loop between users and the core team.
6
+ publishedAt: "2026-05-10"
7
+ schema:
8
+ mainEntity:
9
+ "@type": JobPosting
10
+ title: Developer Advocate
11
+ description: Help the AILK community succeed — talks, workshops, demos, and the open-source feedback loop between users and the core team.
12
+ datePosted: "2026-05-10"
13
+ employmentType: FULL_TIME
14
+ hiringOrganization:
15
+ "@type": Organization
16
+ name: AI Launch Kit
17
+ jobLocation:
18
+ "@type": Place
19
+ address:
20
+ "@type": PostalAddress
21
+ addressCountry: US
22
+ ---
23
+
24
+ # Developer Advocate
25
+
26
+ AILK's community is growing. We need an advocate who can represent the project externally, help developers succeed with the template, and bring real usage patterns back into the product roadmap.
27
+
28
+ ## What you will do
29
+
30
+ - Give talks and run workshops on AX-first development and structured data
31
+ - Produce demo projects and example integrations
32
+ - Triage community issues and PRs with the engineering team
33
+ - Write blog posts and guides that show AILK solving real problems
34
+ - Represent AILK at developer conferences
35
+
36
+ ## What we are looking for
37
+
38
+ - Experience in developer relations, developer education, or technical content
39
+ - Comfort on stage and in front of a camera
40
+ - Genuine interest in structured data, AEO, and agent-era product patterns
41
+ - Ability to build and ship small demo projects independently
42
+
43
+ ## What we offer
44
+
45
+ - Competitive salary + conference travel budget
46
+ - Fully remote with flexibility to attend events
47
+ - Direct input into product direction from community feedback
@@ -0,0 +1,57 @@
1
+ ---
2
+ type: JobPosting
3
+ slug: senior-fullstack-engineer
4
+ title: Senior Full-Stack Engineer
5
+ description: Build the AILK platform — schema builders, content adapters, and the Next.js web app. TypeScript-first, test-driven, remote-friendly.
6
+ publishedAt: "2026-05-01"
7
+ schema:
8
+ mainEntity:
9
+ "@type": JobPosting
10
+ title: Senior Full-Stack Engineer
11
+ description: Build and extend the AILK platform — schema builders, content adapters, and the Next.js web app. TypeScript-first, test-driven, remote-friendly.
12
+ datePosted: "2026-05-01"
13
+ employmentType: FULL_TIME
14
+ hiringOrganization:
15
+ "@type": Organization
16
+ name: AI Launch Kit
17
+ jobLocation:
18
+ "@type": Place
19
+ address:
20
+ "@type": PostalAddress
21
+ addressCountry: US
22
+ baseSalary:
23
+ "@type": MonetaryAmount
24
+ currency: USD
25
+ value:
26
+ "@type": QuantitativeValue
27
+ minValue: 150000
28
+ maxValue: 200000
29
+ unitText: YEAR
30
+ ---
31
+
32
+ # Senior Full-Stack Engineer
33
+
34
+ We are looking for a senior engineer to join the core AILK team. You will own features end-to-end — from schema builder design to Next.js route implementation to CI green.
35
+
36
+ ## What you will do
37
+
38
+ - Design and implement new schema.org builders in `@working-theory/schema`
39
+ - Build Next.js routes and content adapter extensions
40
+ - Write tests first (TDD is the default, not the exception)
41
+ - Review PRs and mentor junior contributors
42
+ - Participate in architecture decisions
43
+
44
+ ## What we are looking for
45
+
46
+ - 5+ years of TypeScript in production
47
+ - Experience with Next.js App Router and React Server Components
48
+ - Familiarity with schema.org, structured data, or AEO a plus
49
+ - Strong testing discipline — you reach for tests before implementation
50
+ - Clear written communication (we are async-first)
51
+
52
+ ## What we offer
53
+
54
+ - Competitive salary ($150k–$200k depending on experience)
55
+ - Fully remote, async-first culture
56
+ - Meaningful equity in a growing OSS business
57
+ - Access to the full AILK toolchain from day one
@@ -0,0 +1,19 @@
1
+ ---
2
+ type: "LandingPage"
3
+ slug: "aeo-audit"
4
+ title: "Score your AEO structure before your site ships."
5
+ description: "See what ailk audit checks before your site ships — free, in the Apache 2.0 foundation, running the same schema and structured-data checks enterprise AEO platforms charge to run after launch."
6
+ sections: [{"id": "hero", "type": "hero", "data": {"badge": "Free in the Apache 2.0 foundation — runs pre-launch and in CI", "headline": "Score your AEO structure before your site ships.", "subheadline": "ailk audit runs the same schema and structured-data checks in your terminal and in CI. Free, in the Apache 2.0 foundation. Catches a missing schema or an unscored page before it costs a citation.", "primaryCta": {"label": "Clone the OSS", "href": "https://github.com/working-theory-labs/ai-launch-kit", "external": true, "variant": "default"}, "secondaryCta": {"label": "Read about the foundation", "href": "/ailk", "external": false, "variant": "ghost"}}}, {"id": "insight-bridge", "type": "content-block", "data": {"headline": "The page is the unit of citation, not the site.", "body": "When an AI system recommends a business, it read pages, attributed them to a brand, and quoted what it trusted enough to cite. A site can rank well, load fast, and still never get quoted, because the page itself didn't carry the structure a model needs to identify the brand behind it and trust the claim.\n\nThat structure is checkable. Missing schema. Ambiguous entity markup. A page that never emits JSON-LD. These are AEO problems, and AEO problems are silent — the site doesn't crash, it just doesn't get cited, and nothing tells you why.\n\nailk audit exists to make that failure loud instead of silent. It runs against the typed schema registry every AILK page ships with, checking the structural properties a model relies on to extract and attribute a claim. It reports the gaps before the site goes live, not three months after an agency notices the client stopped showing up in AI answers."}}, {"id": "what-it-measures", "type": "feature", "data": {"headline": "ailk audit checks the structural properties AI systems need to cite a page.", "description": "It runs against AILK's typed schema registry of 60 page-type entries, scoring each page for the specific things a model looks for before it trusts a claim enough to quote it.", "features": [{"title": "Schema presence and validity", "description": "Confirms each page type carries the right JSON-LD, validated per-type against the typed registry — not a generic schema stub."}, {"title": "Entity clarity", "description": "Flags a page where the brand behind the claim isn't unambiguous, the exact gap that leaves a model unable to attribute what it's reading."}, {"title": "JSON-LD emission", "description": "Verifies the page actually emits the markup at build time, not just that the frontmatter intends to."}, {"title": "FAQ and glossary structure", "description": "Checks that FAQ and glossary content is marked up so it's extractable as a direct answer, not buried in undifferentiated prose."}]}}, {"id": "audit-checks-list", "type": "items", "data": {"headline": "What a failed check actually looks like", "description": "Four failure patterns ailk audit is built to catch — the ones that cost a citation without ever throwing an error.", "columns": 2, "items": [{"title": "The missing schema", "description": "A page ships without the JSON-LD its page type requires. It renders fine for a human visitor and stays invisible to a model deciding what to cite."}, {"title": "The ambiguous entity", "description": "A page never clearly states which brand it belongs to. A model reading it can't attribute the claim, so it looks elsewhere for a source it can name."}, {"title": "The silent JSON-LD failure", "description": "The frontmatter is correct, but the build step never emits the markup. Nothing breaks visibly; the page just quietly stops being structured data."}, {"title": "The unscored page", "description": "A page gets added after the last audit runs and never gets checked. In CI, this is the exact gap the parity and schema checks catch automatically."}]}}, {"id": "vs-enterprise-aeo", "type": "comparison-table", "data": {"eyebrow": "The structural difference", "headline": "Pre-launch and free, instead of post-hoc and paid", "description": "Enterprise AEO platforms charge $295 or more a month to measure whether a site is already being cited, after the structural gap has already cost the citation. ailk audit measures the structure itself, before the site ships.", "columns": [{"key": "ailk", "name": "ailk audit", "highlighted": true}, {"key": "enterprise", "name": "Enterprise AEO platform"}], "groups": [{"groupName": "What it measures and when", "rows": [{"featureName": "Cost", "values": {"ailk": "Free, in the Apache 2.0 OSS", "enterprise": "$295+/month"}}, {"featureName": "When it runs", "values": {"ailk": "Pre-launch and in CI, on every change", "enterprise": "Post-launch, after citations are already lost"}}, {"featureName": "What it measures", "values": {"ailk": "Structural readiness — schema, entity clarity, JSON-LD emission", "enterprise": "Citation share and prompt-level visibility, after the fact"}}, {"featureName": "License", "values": {"ailk": "Apache 2.0 — complete, not gated", "enterprise": "Proprietary, subscription-gated"}}]}], "footnote": "The two aren't the same tool. Post-hoc citation tracking still has value once a site is live. ailk audit's job is making sure the structure is right before that tracking ever starts."}}, {"id": "why-free-in-oss", "type": "content-block", "data": {"headline": "Structural readiness isn't a premium feature.", "body": "AILK's OSS layer is Apache 2.0 — not source-available, not free-until-you-make-money. It isn't deliberately limited so a paid tier can earn. Paid tiers on AILK add capability. They don't gate access, and a structural AEO check is access, not capability.\n\nThat's why ailk audit ships in the free foundation and runs in CI on every change, not behind a login. A developer or an AEO-practitioner agency should be able to verify the structure is right without a subscription standing between them and the answer."}}, {"id": "page-faq", "type": "faq", "data": {"headline": "Common questions about ailk audit", "items": [{"question": "Is ailk audit different from a schema markup validator?", "answer": "Yes. A schema markup validator checks whether existing JSON-LD is syntactically correct. ailk audit checks something upstream of that: whether the right schema exists at all for a given page type, whether it's emitted at build time, and whether the entity behind the page is unambiguous. It's a structural readiness check, not a syntax check."}, {"question": "Does ailk audit replace a structured data testing tool?", "answer": "It complements one. A structured data testing tool validates a single page's markup after the fact. ailk audit runs across the whole site, pre-launch and in CI, against AILK's typed schema registry, so gaps get caught before a page ships rather than found one URL at a time afterward."}, {"question": "What does 'AEO scoring' mean in ailk audit's output?", "answer": "The score reflects structural readiness for AI-mediated discovery: schema presence, entity clarity, and JSON-LD emission per page type. It's not citation volume or ranking position. It answers whether the page is built so a model can read and attribute it, not how often the page is already being cited."}, {"question": "Can I run an AI search audit against a site I don't own?", "answer": "ailk audit is built to run against any AILK site, including this one, since it checks structure that's already public in the rendered page and its JSON-LD. Running it against a non-AILK site isn't the intended use case; the checks are built against AILK's typed schema registry, not a generic crawler."}]}}, {"id": "closing-cta", "type": "cta", "data": {"headline": "Clone the OSS and run your first audit.", "description": "ailk audit ships in the Apache 2.0 foundation. Clone the repo, scaffold a site, and run the check before you ship the first page, not after you notice you're invisible.", "primaryCta": {"label": "Clone the OSS", "href": "https://github.com/working-theory-labs/ai-launch-kit", "external": true, "variant": "default"}}}]
7
+ status: "Approved"
8
+ pageKey: "WebPage (/aeo-audit)"
9
+ entity: "ailaunchkit"
10
+ urlSlug: "aeo-audit"
11
+ lastUpdated: "2026-07-06"
12
+ pageLevelSchemaType: "LandingPage"
13
+ ---
14
+
15
+ import { JsonLd } from '@/components/JsonLd'
16
+
17
+ <JsonLd data={{"@context": "https://schema.org", "@graph": [{"@type": "Product", "additionalType": "SoftwareApplication", "@id": "https://ailaunchkit.ai/#product", "name": "AI Launch Kit", "alternateName": ["AI Launch Kit by Working Theory", "AILK by Working Theory", "AILK", "@ailaunchkit", "@ailk", "@working-theory", "ai-launch-kit"], "url": "https://ailaunchkit.ai", "description": "AI Launch Kit is the open-source website foundation for the agent-first internet — Apache 2.0, agent-ready, AEO-scored, deployable in days.", "sameAs": ["https://github.com/working-theory-labs/ai-launch-kit", "https://x.com/ailaunchkit", "https://www.npmjs.com/org/ailk", "https://youtube.com/@working-theory", "https://linkedin.com/company/working-theory"], "foundingDate": "2026", "category": "Open-source website foundation", "applicationCategory": "DeveloperApplication", "operatingSystem": "Cross-platform (Node.js)", "license": "https://www.apache.org/licenses/LICENSE-2.0", "codeRepository": "https://github.com/working-theory-labs/ai-launch-kit", "manufacturer": {"@id": "https://workingtheory.ai/#organization"}, "brand": {"@id": "https://workingtheory.ai/#organization"}, "creator": {"@id": "https://samhenry.org/#person"}}, {"@type": "WebPage", "@id": "https://ailaunchkit.ai/aeo-audit#webpage", "url": "https://ailaunchkit.ai/aeo-audit", "name": "Score your AEO structure before your site ships.", "description": "See what ailk audit checks before your site ships — free, in the Apache 2.0 foundation, running the same schema and structured-data checks enterprise AEO platforms charge to run after launch.", "isPartOf": {"@id": "https://ailaunchkit.ai/#product"}, "mainEntity": {"@type": "FAQPage", "@id": "https://ailaunchkit.ai/aeo-audit#faq", "mainEntity": [{"@type": "Question", "name": "Is ailk audit different from a schema markup validator?", "acceptedAnswer": {"@type": "Answer", "text": "Yes. A schema markup validator checks whether existing JSON-LD is syntactically correct. ailk audit checks something upstream of that: whether the right schema exists at all for a given page type, whether it's emitted at build time, and whether the entity behind the page is unambiguous. It's a structural readiness check, not a syntax check."}}, {"@type": "Question", "name": "Does ailk audit replace a structured data testing tool?", "acceptedAnswer": {"@type": "Answer", "text": "It complements one. A structured data testing tool validates a single page's markup after the fact. ailk audit runs across the whole site, pre-launch and in CI, against AILK's typed schema registry, so gaps get caught before a page ships rather than found one URL at a time afterward."}}, {"@type": "Question", "name": "What does 'AEO scoring' mean in ailk audit's output?", "acceptedAnswer": {"@type": "Answer", "text": "The score reflects structural readiness for AI-mediated discovery: schema presence, entity clarity, and JSON-LD emission per page type. It's not citation volume or ranking position. It answers whether the page is built so a model can read and attribute it, not how often the page is already being cited."}}, {"@type": "Question", "name": "Can I run an AI search audit against a site I don't own?", "acceptedAnswer": {"@type": "Answer", "text": "ailk audit is built to run against any AILK site, including this one, since it checks structure that's already public in the rendered page and its JSON-LD. Running it against a non-AILK site isn't the intended use case; the checks are built against AILK's typed schema registry, not a generic crawler."}}]}}]}} />
18
+
19
+ {/* Rendered from frontmatter `sections[]`; the MDX body is not read by the section-catalog renderer. Landed by land-section-catalog.py (#3111). */}
@@ -0,0 +1,92 @@
1
+ {
2
+ "@context": "https://schema.org",
3
+ "@graph": [
4
+ {
5
+ "@type": "Product",
6
+ "additionalType": "SoftwareApplication",
7
+ "@id": "https://ailaunchkit.ai/#product",
8
+ "name": "AI Launch Kit",
9
+ "alternateName": [
10
+ "AI Launch Kit by Working Theory",
11
+ "AILK by Working Theory",
12
+ "AILK",
13
+ "@ailaunchkit",
14
+ "@ailk",
15
+ "@working-theory",
16
+ "ai-launch-kit"
17
+ ],
18
+ "url": "https://ailaunchkit.ai",
19
+ "description": "AI Launch Kit is the open-source website foundation for the agent-first internet — Apache 2.0, agent-ready, AEO-scored, deployable in days.",
20
+ "sameAs": [
21
+ "https://github.com/working-theory-labs/ai-launch-kit",
22
+ "https://x.com/ailaunchkit",
23
+ "https://www.npmjs.com/org/ailk",
24
+ "https://youtube.com/@working-theory",
25
+ "https://linkedin.com/company/working-theory"
26
+ ],
27
+ "foundingDate": "2026",
28
+ "category": "Open-source website foundation",
29
+ "applicationCategory": "DeveloperApplication",
30
+ "operatingSystem": "Cross-platform (Node.js)",
31
+ "license": "https://www.apache.org/licenses/LICENSE-2.0",
32
+ "codeRepository": "https://github.com/working-theory-labs/ai-launch-kit",
33
+ "manufacturer": {
34
+ "@id": "https://workingtheory.ai/#organization"
35
+ },
36
+ "brand": {
37
+ "@id": "https://workingtheory.ai/#organization"
38
+ },
39
+ "creator": {
40
+ "@id": "https://samhenry.org/#person"
41
+ }
42
+ },
43
+ {
44
+ "@type": "WebPage",
45
+ "@id": "https://ailaunchkit.ai/aeo-audit#webpage",
46
+ "url": "https://ailaunchkit.ai/aeo-audit",
47
+ "name": "Score your AEO structure before your site ships.",
48
+ "description": "See what ailk audit checks before your site ships — free, in the Apache 2.0 foundation, running the same schema and structured-data checks enterprise AEO platforms charge to run after launch.",
49
+ "isPartOf": {
50
+ "@id": "https://ailaunchkit.ai/#product"
51
+ },
52
+ "mainEntity": {
53
+ "@type": "FAQPage",
54
+ "@id": "https://ailaunchkit.ai/aeo-audit#faq",
55
+ "mainEntity": [
56
+ {
57
+ "@type": "Question",
58
+ "name": "Is ailk audit different from a schema markup validator?",
59
+ "acceptedAnswer": {
60
+ "@type": "Answer",
61
+ "text": "Yes. A schema markup validator checks whether existing JSON-LD is syntactically correct. ailk audit checks something upstream of that: whether the right schema exists at all for a given page type, whether it's emitted at build time, and whether the entity behind the page is unambiguous. It's a structural readiness check, not a syntax check."
62
+ }
63
+ },
64
+ {
65
+ "@type": "Question",
66
+ "name": "Does ailk audit replace a structured data testing tool?",
67
+ "acceptedAnswer": {
68
+ "@type": "Answer",
69
+ "text": "It complements one. A structured data testing tool validates a single page's markup after the fact. ailk audit runs across the whole site, pre-launch and in CI, against AILK's typed schema registry, so gaps get caught before a page ships rather than found one URL at a time afterward."
70
+ }
71
+ },
72
+ {
73
+ "@type": "Question",
74
+ "name": "What does 'AEO scoring' mean in ailk audit's output?",
75
+ "acceptedAnswer": {
76
+ "@type": "Answer",
77
+ "text": "The score reflects structural readiness for AI-mediated discovery: schema presence, entity clarity, and JSON-LD emission per page type. It's not citation volume or ranking position. It answers whether the page is built so a model can read and attribute it, not how often the page is already being cited."
78
+ }
79
+ },
80
+ {
81
+ "@type": "Question",
82
+ "name": "Can I run an AI search audit against a site I don't own?",
83
+ "acceptedAnswer": {
84
+ "@type": "Answer",
85
+ "text": "ailk audit is built to run against any AILK site, including this one, since it checks structure that's already public in the rendered page and its JSON-LD. Running it against a non-AILK site isn't the intended use case; the checks are built against AILK's typed schema registry, not a generic crawler."
86
+ }
87
+ }
88
+ ]
89
+ }
90
+ }
91
+ ]
92
+ }