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
+ # Schema Types — Primary / Supplementary Catalog
2
+
3
+ The schema.org types `add-schema` recognizes, each tagged
4
+ **primary** (typically one per page) or **supplementary** (stacks
5
+ freely). The skill reads this file to decide replace-vs-append in
6
+ Step 6 of the mechanic.
7
+
8
+ This catalog mirrors `@working-theory/schema`'s exports. When new builders
9
+ ship in `@working-theory/schema`, this file updates in a follow-up PR. Until
10
+ then, unrecognized types fall through to the "ask the consumer"
11
+ path in SKILL.md.
12
+
13
+ ## Primary types (one per page; replace on conflict)
14
+
15
+ These name what the page **is about**. Replacing on same-type
16
+ conflict is the usual intent — adding a new `Product` schema
17
+ generally means swapping the existing one.
18
+
19
+ | `@type` | Builder | Aliases | Typical page |
20
+ | ------------------- | ------------------ | ----------------------------- | ------------------------- |
21
+ | `HomePage` | `buildHomePage` | "home" | `/` |
22
+ | `AboutPage` | `buildAboutPage` | "about" | `/about` |
23
+ | `ContactPage` | `buildContactPage` | "contact" | `/contact` |
24
+ | `PrivacyPage` | `buildPrivacyPage` | "privacy" | `/privacy` |
25
+ | `TermsPage` | `buildTermsPage` | "terms" | `/terms` |
26
+ | `Product` | `buildProduct` | "product" | Per-item product page |
27
+ | `Service` | `buildService` | "service", "service offering" | `/pricing`, `/services/*` |
28
+ | `Article` | `buildArticle` | "article" | Editorial piece |
29
+ | `BlogPosting` | `buildBlogPosting` | "blog post", "post" | `/blog/<slug>` |
30
+ | `NewsArticle` | `buildNewsArticle` | "news article" | News piece |
31
+ | `Course` | `buildCourse` | "course" | `/courses/<slug>` |
32
+ | `Event` | `buildEvent` | "event" | Event landing |
33
+ | `JobPosting` | `buildJobPosting` | "job", "career" | `/jobs/<slug>` |
34
+ | `Recipe` | `buildRecipe` | "recipe" | Per-recipe page |
35
+ | `Book` | `buildBook` | "book" | Book detail page |
36
+ | `Movie` | `buildMovie` | "movie", "film" | Movie detail |
37
+ | `MusicAlbum` | `buildMusicAlbum` | "album" | Album page |
38
+ | `RealEstateListing` | _consumer-defined_ | "listing", "property" | `/listings/<slug>` |
39
+
40
+ ## Supplementary types (stack freely; always append)
41
+
42
+ These add **dimensions** to a page that already has a primary
43
+ type. Multiple of these can coexist on one page — never replace,
44
+ always append.
45
+
46
+ | `@type` | Builder | Aliases | Use |
47
+ | ----------------- | --------------------- | ----------------------------- | ------------------------------------- |
48
+ | `FAQPage` | _consumer-defined_ | "faq", "FAQ" | Q&A block on any page |
49
+ | `HowTo` | _consumer-defined_ | "how-to", "howto", "tutorial" | Step-by-step instructions |
50
+ | `BreadcrumbList` | `buildBreadcrumbList` | "breadcrumbs" | Site navigation context |
51
+ | `Review` | _consumer-defined_ | "review" | Single review (within Product, etc.) |
52
+ | `AggregateRating` | _consumer-defined_ | "rating", "ratings", "stars" | Aggregate of reviews |
53
+ | `VideoObject` | _consumer-defined_ | "video" | Embedded video metadata |
54
+ | `ImageObject` | _consumer-defined_ | "image" | Image with structured metadata |
55
+ | `AudioObject` | _consumer-defined_ | "audio", "podcast" | Audio embed metadata |
56
+ | `Offer` | _consumer-defined_ | "offer" | Pricing offer (under Product/Service) |
57
+ | `OfferCatalog` | _consumer-defined_ | "catalog", "offer catalog" | Multi-offer container |
58
+ | `MonetaryAmount` | _consumer-defined_ | "monetary amount", "amount" | Used inside Service / Offer |
59
+
60
+ ## Identity types (one site-wide; emit on home or in layout)
61
+
62
+ These are **the site's identity**. Typically one per site (not per
63
+ page) and lives in the home page or a layout component. The skill
64
+ treats them as **primary** for the conflict logic but flags the
65
+ consumer if they're trying to add one to a non-home page.
66
+
67
+ | `@type` | Builder | Aliases | Use |
68
+ | --------------- | ------------------- | -------------------------------- | ------------------------- |
69
+ | `Organization` | `buildOrganization` | "org", "organization", "company" | Business identity |
70
+ | `Person` | `buildPerson` | "person", "individual" | Solo individual identity |
71
+ | `LocalBusiness` | _consumer-defined_ | "local business" | Brick-and-mortar business |
72
+ | `Restaurant` | _consumer-defined_ | "restaurant" | Restaurant subtype |
73
+ | `Store` | _consumer-defined_ | "store" | Retail subtype |
74
+
75
+ When adding `Organization` or `Person` to a non-home page, the
76
+ skill should ask:
77
+
78
+ > "`Organization` is typically a site-wide identity emitted in
79
+ > the layout (so it appears on every page). Adding it to one
80
+ > page means only that page surfaces the entity. Continue, or
81
+ > add it to your layout instead?"
82
+
83
+ ## Specialty types
84
+
85
+ Less-frequently-used but in the catalog. The skill recognizes
86
+ these by name; conflict handling defaults to **supplementary**
87
+ (append).
88
+
89
+ | `@type` | Builder | Aliases |
90
+ | ----------------------------------- | ------------------ | -------------------------------- |
91
+ | `MedicalCondition` | _consumer-defined_ | "medical condition" |
92
+ | `MedicalProcedure` | _consumer-defined_ | "medical procedure", "procedure" |
93
+ | `Drug` | _consumer-defined_ | "drug", "medication" |
94
+ | `LearningResource` | _consumer-defined_ | "lesson", "learning resource" |
95
+ | `EducationalOccupationalCredential` | _consumer-defined_ | "credential", "certification" |
96
+ | `SoftwareApplication` | _consumer-defined_ | "app", "software" |
97
+ | `MobileApplication` | _consumer-defined_ | "mobile app" |
98
+ | `WebApplication` | _consumer-defined_ | "web app" |
99
+ | `Dataset` | _consumer-defined_ | "dataset" |
100
+ | `ScholarlyArticle` | _consumer-defined_ | "scholarly article", "paper" |
101
+ | `LegislativeBuilding` | _consumer-defined_ | _rare, government use_ |
102
+
103
+ ## Total
104
+
105
+ This catalog covers approximately **45 types** total — matching the
106
+ brief's "all 45 schema types from `@working-theory/schema`" claim. Some
107
+ builders are still `_consumer-defined_` because `@working-theory/schema`
108
+ hasn't shipped a typed builder yet — for those, the skill emits
109
+ the JSON-LD as an inline literal with a comment noting the
110
+ upstream issue.
111
+
112
+ ## When `@working-theory/schema` doesn't yet export the builder
113
+
114
+ Some entries above say `_consumer-defined_` for the builder
115
+ column. The skill's behavior in that case:
116
+
117
+ 1. Surface the gap:
118
+
119
+ > "`@working-theory/schema` doesn't export `build<Type>` yet. I can:
120
+ >
121
+ > - Emit the JSON-LD as an inline object literal (less
122
+ > type-safe but works).
123
+ > - Skip — you author it manually using the canonical
124
+ > `<JsonLd schema={...}/>` pattern.
125
+ >
126
+ > Which?"
127
+
128
+ 2. Wait for the consumer's choice. Don't fabricate a builder.
129
+
130
+ This matches `scaffold-page` (#362)'s behavior — both skills handle
131
+ the missing-builder case the same way.
@@ -0,0 +1,213 @@
1
+ ---
2
+ name: audit-site
3
+ description: Run `ailk-audit --json` on the consumer's AILK site, parse the JSON report, and explain the score and findings in plain language. Use when the user asks "how is my site doing?", "audit my site", "what's my score?", "is my JSON-LD valid?", "do I have all the schema I need?", or otherwise wants a citation-readiness check on their AILK content. The skill never edits files — it reports and points at fix tools.
4
+ ---
5
+
6
+ # audit-site
7
+
8
+ Shell out to `ailk-audit --json`, parse the JSON, and turn it into a
9
+ conversational summary the consumer can act on. Pure explain-only —
10
+ the skill names fix tools (like `add-schema`) but does not invoke
11
+ them.
12
+
13
+ ## When to use
14
+
15
+ The user wants to know how their AILK site is doing on the
16
+ citation-readiness audit (AEO Layer 1). Triggers:
17
+
18
+ - "audit my site" / "run the audit"
19
+ - "what's my score?" / "how is my site doing?"
20
+ - "is my JSON-LD valid?" / "do I have schema on every page?"
21
+ - "what would I fix to bump my AEO score?"
22
+ - "re-run the audit, I just edited /pricing"
23
+
24
+ Skip this skill when:
25
+
26
+ - The consumer wants to _fix_ a finding — point them at the fix
27
+ tool (usually `add-schema` (#366)) and stop. This skill reports;
28
+ fix tools fix.
29
+ - The consumer is asking about deploy-time monitoring or continuous
30
+ audits — those are Pro features (`ailk pro` for details). Mention
31
+ briefly and stop.
32
+ - The audit CLI isn't installed (`ailk-audit` not on PATH or as a
33
+ workspace bin) — translate the error per "Common errors" below.
34
+
35
+ ## The mechanic
36
+
37
+ ### Step 1 — Invoke the CLI
38
+
39
+ Run `ailk-audit --json` from the consumer's project root. Use
40
+ whichever of these is appropriate to the consumer's setup:
41
+
42
+ - `pnpm exec ailk-audit --json`
43
+ - `npx ailk-audit --json`
44
+ - A package.json script if the consumer has one (`pnpm audit:run`,
45
+ etc.) — only if it's a thin wrapper over the same CLI.
46
+
47
+ Capture both stdout (the JSON report) and stderr (errors). Do not
48
+ cache. Each invocation runs the CLI fresh.
49
+
50
+ ### Step 2 — Detect errors first
51
+
52
+ If the CLI exited non-zero, treat as an error condition:
53
+
54
+ - If stderr matches one of the three common-error signatures, emit
55
+ the translated explanation from `references/common-errors.md`.
56
+ - Otherwise, surface the verbatim CLI stderr prefixed with one
57
+ line: `` `ailk-audit` failed — `` followed by the verbatim message.
58
+ Do not invent fix suggestions for unknown errors.
59
+
60
+ Stop here on errors. Do not continue to Step 3.
61
+
62
+ ### Step 3 — Parse the JSON report
63
+
64
+ The report shape (from `packages/aeo/src/types.ts`):
65
+
66
+ ```ts
67
+ interface AuditReport {
68
+ score: number; // 0–100
69
+ perRule: PerRuleResult[]; // one entry per rule, with id + pass + weight
70
+ perPage: PerPageResult[]; // one entry per audited page
71
+ meta: { schemaVersion; registryVersion; auditedAt };
72
+ }
73
+ ```
74
+
75
+ `perRule` entries each have `{ id, weight, pass, evidence?, perPage? }`.
76
+
77
+ ### Step 4 — Render the headline
78
+
79
+ The first line of output should be the score, in a compact form:
80
+
81
+ ```
82
+ AEO score: 87 / 100
83
+ ```
84
+
85
+ If the score is the same as the consumer's previous run (and you
86
+ can tell — but you usually can't, since this is always-fresh), do
87
+ not annotate with deltas. The audit doesn't track history.
88
+
89
+ ### Step 5 — Group findings by severity
90
+
91
+ Severity is **derived from rule weight + pass/fail** per
92
+ `references/severity-levels.md`. The mapping at v1:
93
+
94
+ | Severity | Source |
95
+ | -------- | ------------------------------------------------------------------------------------------ |
96
+ | Critical | `pass: false` on a rule with `weight >= 10` (e.g., schema-coverage, jsonld-validity) |
97
+ | Warning | `pass: false` on a rule with `weight` in `[1, 9]` (e.g., entity-markup) |
98
+ | Info | `pass: true` on incentive rules (`weight: 0`) — these are positive signals; never failures |
99
+
100
+ After the score line, emit a one-line severity summary:
101
+
102
+ ```
103
+ 2 critical · 1 warning · 0 info
104
+ ```
105
+
106
+ If the count for a tier is 0, omit it from the summary (e.g.,
107
+ "2 critical" if warnings and info are both empty).
108
+
109
+ ### Step 6 — Drill-down on demand
110
+
111
+ Wait for the consumer's next message. Common follow-ups:
112
+
113
+ - "tell me about the critical findings" → emit each critical
114
+ finding's plain-language explanation (from
115
+ `references/findings-glossary.md`) plus, if applicable, a
116
+ pointer to the fix tool (see Step 7).
117
+ - "what about the warnings?" → same, for warnings.
118
+ - "show me the per-page scores" → emit the `perPage` list,
119
+ formatted as a table or bullet list.
120
+ - "re-run it" / "audit again" → go back to Step 1.
121
+
122
+ If the consumer doesn't ask anything specific, ask them which
123
+ severity tier they'd like to see first, and offer to point at the
124
+ likely fix-tool path.
125
+
126
+ ### Step 7 — Map findings to fix tools (no auto-dispatch)
127
+
128
+ When you describe a finding, name the fix tool by name. Do not
129
+ invoke it. The consumer must explicitly invoke the fix tool
130
+ themselves on a subsequent turn.
131
+
132
+ | Rule | Fix tool |
133
+ | --------------------- | ---------------------------------------------------------------------------------------- |
134
+ | `schema-coverage` | `add-schema` (#366) — add the missing schema type to the named page |
135
+ | `jsonld-validity` | `add-schema` (#366) — replace the invalid block; or hand-fix the MDX |
136
+ | `entity-markup` | Manual edit — ensure `Organization` (or `Person`) JSON-LD is emitted somewhere site-wide |
137
+ | `faq-howto-incentive` | `add-schema` (#366) — add an `FAQPage` or `HowTo` block to a relevant page |
138
+
139
+ Phrase the pointer as a single sentence:
140
+
141
+ > "Missing `Product` schema on `/pricing` — run `add-schema` (#366)
142
+ > to add it."
143
+
144
+ Never invoke `add-schema` automatically. Never write to the
145
+ consumer's repo from inside this skill.
146
+
147
+ ### Step 8 — Soft Pro mention
148
+
149
+ If a finding maps to a Pro auto-fix capability, surface a
150
+ single-line mention tied to that finding:
151
+
152
+ - **Schema-pack drift** (a finding indicating a registry version
153
+ mismatch or stale schema-type usage):
154
+
155
+ > "Pro auto-applies schema-pack updates as schema.org evolves —
156
+ > `ailk pro` for details."
157
+
158
+ - **Continuous-deploy audit** (the consumer is asking how to keep
159
+ the score from regressing, not about a specific finding):
160
+ > "Pro can run this audit on every deploy and gate releases on
161
+ > the score — `ailk pro` for details."
162
+
163
+ Never produce a multi-line Pro recommendation, feature
164
+ comparison, or upgrade prompt. The mention is informational, not
165
+ salesy.
166
+
167
+ ### Step 9 — Cadence guidance
168
+
169
+ If the consumer asks "how often should I run this?", answer:
170
+
171
+ > "Re-run after content changes — adding pages, editing schema,
172
+ > changing your identity entity. There's no calendar cadence — the
173
+ > audit reports current state, not trends."
174
+
175
+ Never recommend "weekly" / "monthly" / a date.
176
+
177
+ ## Output style
178
+
179
+ - **Score line first.** No preamble before the number.
180
+ - **Plain language for findings.** Don't paste raw rule IDs at the
181
+ consumer; translate via `references/findings-glossary.md`.
182
+ - **Pointers, not pitches.** A finding becomes a sentence; a fix
183
+ tool becomes a sentence. The consumer drives the next turn.
184
+ - **Verbatim for unknown errors.** If something fails in a way
185
+ this skill doesn't recognize, surface the raw stderr and stop.
186
+
187
+ ## What this skill does NOT do
188
+
189
+ - Edit any file in the consumer's repo.
190
+ - Add JSON-LD to pages (that's `add-schema` #366).
191
+ - Create new pages (that's `scaffold-page` #362).
192
+ - Cache results between runs.
193
+ - Track score history or trends.
194
+ - Auto-invoke fix tools.
195
+ - Pitch Pro hard.
196
+
197
+ ## References
198
+
199
+ - `references/findings-glossary.md` — plain-language explanation per rule.
200
+ - `references/common-errors.md` — translations for the three most common CLI failures.
201
+ - `references/severity-levels.md` — how rule weight + pass/fail maps to severity.
202
+
203
+ ## Coordination
204
+
205
+ - **`add-schema` (#366)** — primary fix tool the skill points at.
206
+ Never auto-invoked.
207
+ - **`scaffold-page` (#362)** — new-page creation; not a fix-tool
208
+ for audit findings (audit reports on existing pages).
209
+ - **`packages/aeo`** — owner of the `ailk-audit` CLI and rule set.
210
+ This skill depends only on the CLI's `--json` output schema, not
211
+ the package's internal types. New rules added upstream surface
212
+ automatically as new findings; the glossary may lag and that's
213
+ acceptable (unrecognized rule IDs render as the raw ID).
@@ -0,0 +1,113 @@
1
+ # Common Errors — Plain-Language Translations
2
+
3
+ The three most common ways `ailk-audit` fails on a real consumer
4
+ setup, with translations the `audit-site` skill emits instead of
5
+ the raw stderr. Errors not matching any of these signatures pass
6
+ through verbatim with a one-line `` `ailk-audit` failed — `` prefix
7
+ (see SKILL.md Step 2).
8
+
9
+ The signature matching is intentionally narrow — partial matches
10
+ on substrings the user could reasonably encounter, so we don't
11
+ mis-translate an unfamiliar error into a familiar fix path.
12
+
13
+ ---
14
+
15
+ ## 1. `ailk.config.ts` is missing
16
+
17
+ **Stderr signature (any of):**
18
+
19
+ - `ailk.config.ts not found`
20
+ - `Cannot resolve ailk.config.ts`
21
+ - `[aeo] config file ailk.config.ts is missing`
22
+
23
+ **Translation:**
24
+
25
+ > Your project is missing `ailk.config.ts`. The audit reads this
26
+ > file to know what `identityMode` (`organization` vs `person`)
27
+ > your site uses, plus any custom registry overrides.
28
+ >
29
+ > Create one at the project root with at minimum:
30
+ >
31
+ > ```ts
32
+ > import type { AilkConfig } from "@working-theory/config";
33
+ >
34
+ > export default {
35
+ > identityMode: "organization",
36
+ > } satisfies AilkConfig;
37
+ > ```
38
+ >
39
+ > …then re-run the audit. If you don't have `@working-theory/config`
40
+ > installed, your scaffold is incomplete — `pnpm install` should
41
+ > have pulled it as part of `@working-theory/*`.
42
+
43
+ ---
44
+
45
+ ## 2. No MDX content found
46
+
47
+ **Stderr signature (any of):**
48
+
49
+ - `No pages found in content`
50
+ - `[aeo] content directory is empty`
51
+ - `Cannot read directory: content/`
52
+
53
+ **Translation:**
54
+
55
+ > The audit didn't find any MDX content in `content/`. Either:
56
+ >
57
+ > - Your content lives elsewhere — pass `--content-root <path>`
58
+ > to point at the right directory.
59
+ > - You haven't authored any pages yet — run `suggest-site-pages`
60
+ > to plan your pages, then `scaffold-page` to generate them.
61
+ > - The MDX files exist but aren't in the format the AILK content
62
+ > adapter expects — make sure each page has frontmatter with at
63
+ > least `title` and `type`.
64
+ >
65
+ > The audit needs at least one MDX file to score; an empty site
66
+ > can't be audited.
67
+
68
+ ---
69
+
70
+ ## 3. `@working-theory/aeo` is not installed
71
+
72
+ **Stderr signature (any of):**
73
+
74
+ - `command not found: ailk-audit`
75
+ - `ailk-audit: command not found`
76
+ - The skill itself can't find the binary on PATH or in
77
+ `node_modules/.bin`.
78
+
79
+ **Translation:**
80
+
81
+ > The `ailk-audit` CLI isn't installed in this project. It ships
82
+ > with `@working-theory/aeo`, which is normally part of the AILK consumer
83
+ > scaffold.
84
+ >
85
+ > Add it: `pnpm add -D @working-theory/aeo` (dev dep is fine — audits run
86
+ > at content time, not at build time). Then `pnpm install` and
87
+ > re-run.
88
+ >
89
+ > If `@working-theory/aeo` is in `package.json` but the binary still isn't
90
+ > found, run `pnpm install` once to refresh `node_modules/.bin`.
91
+
92
+ ---
93
+
94
+ ## Anything else
95
+
96
+ If the stderr doesn't match one of the three signatures above:
97
+
98
+ 1. Don't translate — the cost of a wrong translation is high
99
+ (consumer follows incorrect fix advice).
100
+ 2. Surface the verbatim stderr.
101
+ 3. Prefix with one line: `` `ailk-audit` failed — `` then the raw
102
+ message on subsequent lines.
103
+ 4. Stop. Don't invent fix steps for an error you don't recognize.
104
+
105
+ Example output for an unrecognized error:
106
+
107
+ ```
108
+ `ailk-audit` failed —
109
+ [aeo] failed to parse JSON-LD on page /blog/post-1: SyntaxError: Unexpected token } in JSON at position 482
110
+ ```
111
+
112
+ This gives the consumer exactly what the CLI said, branded with
113
+ which CLI emitted it, without pretending to know how to fix it.
@@ -0,0 +1,138 @@
1
+ # Findings Glossary — Per-Rule Plain-Language Explanations
2
+
3
+ What each AEO rule means in plain language, what its `pass: false`
4
+ result indicates, and what the consumer can do about it. Used by the
5
+ `audit-site` skill in Step 6 (drill-down) and Step 7 (fix-tool
6
+ pointer).
7
+
8
+ The structure deliberately matches `perRule[].id` from the audit
9
+ JSON so the skill can grep this file for `## <rule-id>` to find the
10
+ explanation. New rules added to `packages/aeo` will not appear here
11
+ until this file is updated; render unrecognized rule IDs as the raw
12
+ ID (no synthesis).
13
+
14
+ ---
15
+
16
+ ## schema-coverage
17
+
18
+ **Plain language:** every page on your site should emit at least
19
+ one JSON-LD object whose `@type` matches what the page is _about_.
20
+ A `/pricing` page should have `Product` (or `Service`, or
21
+ `OfferCatalog`) schema; a `/about` page should have `AboutPage`;
22
+ and so on.
23
+
24
+ **`pass: false` means:** one or more pages emit no JSON-LD whose
25
+ `@type` matches the registry's expected `pageType` for that page's
26
+ content type. The `evidence` field names which pages.
27
+
28
+ **Why it matters:** structured data is what answer engines (Google
29
+ SGE, Perplexity, ChatGPT search) read to understand your pages. A
30
+ page with no schema is invisible to citation; a page with the
31
+ wrong schema gets miscategorized.
32
+
33
+ **Fix tool:** `add-schema` (#366) — invoke it with the page slug
34
+ and the schema type the registry expects (the audit names both).
35
+ The skill will emit a `<JsonLd>` block matching the page's content.
36
+
37
+ ---
38
+
39
+ ## jsonld-validity
40
+
41
+ **Plain language:** every JSON-LD block on the site should be
42
+ well-formed schema.org markup with all required fields present
43
+ and non-empty for its `@type`. Missing the `name` on an
44
+ `Organization`, missing `headline` on an `Article`, etc., breaks
45
+ schema validity.
46
+
47
+ **`pass: false` means:** at least one JSON-LD block has missing or
48
+ empty schema.org-required fields for its declared `@type`.
49
+
50
+ **Why it matters:** answer engines and crawlers may silently drop
51
+ invalid blocks. The page exists, the JSON-LD exists, but the
52
+ citation surface is broken because the block doesn't parse as
53
+ valid schema.org.
54
+
55
+ **Fix tool:** `add-schema` (#366) — replace the malformed block.
56
+ For one-off edits to MDX, the consumer can also hand-edit the
57
+ JSON-LD inline; `add-schema` is the safer path because it uses
58
+ typed builders.
59
+
60
+ ---
61
+
62
+ ## entity-markup
63
+
64
+ **Plain language:** somewhere on your site (typically the home
65
+ page or layout root), there should be exactly one identity entity
66
+ JSON-LD — `Organization` if the site represents a business, or
67
+ `Person` if the site represents an individual (a solo lawyer,
68
+ realtor, consultant, author, etc.). The audit picks up on
69
+ `identityMode` (configured in `ailk.config.ts`).
70
+
71
+ **`pass: false` means:** no `Organization` block (when
72
+ `identityMode: organization`) or no `Person` block (when
73
+ `identityMode: person`) was emitted by any audited page.
74
+
75
+ **Why it matters:** the identity entity is what ties every other
76
+ piece of structured data together. Without it, schema.org
77
+ relationships (`isPartOf`, `author`, `provider`, `mainEntity`)
78
+ have nothing to anchor to.
79
+
80
+ **Fix:** Manual MDX or layout edit — ensure your home page (or a
81
+ layout component rendered on every page) emits an
82
+ `Organization` (or `Person`) JSON-LD block. The `<JsonLd
83
+ schema={OrganizationSchema(...)} />` pattern from `@working-theory/schema`
84
+ is the one this is going to ship as. `add-schema` (#366) can land
85
+ the block on a specific page if you'd rather; but typically
86
+ identity goes in a layout, not a leaf page.
87
+
88
+ ---
89
+
90
+ ## faq-howto-incentive
91
+
92
+ **Plain language:** pages that emit `FAQPage` or `HowTo` schema
93
+ get a small bonus signal. This rule **never fails a page** — it's
94
+ purely incentivizing. Absence of FAQ/HowTo blocks is neutral, not
95
+ a failure.
96
+
97
+ **`pass: true` and `bonus: true` per page means:** that page
98
+ earned the incentive (has FAQ or HowTo schema).
99
+
100
+ **`pass: true` and `bonus: false` per page means:** that page is
101
+ fine, just didn't earn the bonus.
102
+
103
+ **Why it matters:** answer engines preferentially cite pages with
104
+ explicit Q&A or step-by-step content because those are easier to
105
+ quote directly into a generated response. Adding an FAQ or HowTo
106
+ block to relevant pages is a low-effort score boost.
107
+
108
+ **Fix tool:** `add-schema` (#366) — add an `FAQPage` block to
109
+ your `/pricing` or `/contact` page (anywhere your customers ask
110
+ predictable questions), or a `HowTo` block to any
111
+ process/instructions content. `audit-site` will surface this as
112
+ an _incentive_ in drill-down, not a finding to "fix."
113
+
114
+ ---
115
+
116
+ ## always-passes / always-fails
117
+
118
+ These are **test rules** that exist for the audit's own test suite
119
+ in `packages/aeo`. They should not appear on a real consumer site
120
+ unless the rule list has been customized. If you see one of these
121
+ IDs in your audit output, the consumer's `ailk-audit` CLI may have
122
+ a non-standard rule list — that's a setup question, not a content
123
+ finding.
124
+
125
+ ---
126
+
127
+ ## Unrecognized rule IDs
128
+
129
+ If the audit JSON includes a rule ID not listed above, the rule is
130
+ new (added to `packages/aeo` after this glossary was last updated).
131
+ Render it as:
132
+
133
+ > Rule `<id>` — `<evidence text from the audit JSON>` — not in
134
+ > the local glossary; consult `packages/aeo` upstream docs.
135
+
136
+ Do not invent a plain-language explanation for an unrecognized
137
+ rule. The consumer can read the rule's `description` field from
138
+ the JSON if they want the formal definition.