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.
- package/LICENSE +201 -0
- package/README.md +39 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +80 -0
- package/dist/copy.d.ts +8 -0
- package/dist/copy.js +109 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +10 -0
- package/dist/lib/pro-callout.d.ts +12 -0
- package/dist/lib/pro-callout.js +20 -0
- package/dist/parse-args.d.ts +13 -0
- package/dist/parse-args.js +81 -0
- package/dist/programmatic.d.ts +49 -0
- package/dist/programmatic.js +89 -0
- package/dist/substitute.d.ts +31 -0
- package/dist/substitute.js +45 -0
- package/dist/validate.d.ts +8 -0
- package/dist/validate.js +70 -0
- package/package.json +47 -0
- package/templates/.claude/.gitkeep +0 -0
- package/templates/.claude/agents/web.md +80 -0
- package/templates/.claude/rules/architecture.md +62 -0
- package/templates/.claude/rules/preserve-existing-style.md +51 -0
- package/templates/.claude/skills/README.md +43 -0
- package/templates/.claude/skills/add-schema/SKILL.md +270 -0
- package/templates/.claude/skills/add-schema/references/conflict-handling.md +200 -0
- package/templates/.claude/skills/add-schema/references/file-finding.md +123 -0
- package/templates/.claude/skills/add-schema/references/schema-types.md +131 -0
- package/templates/.claude/skills/audit-site/SKILL.md +213 -0
- package/templates/.claude/skills/audit-site/references/common-errors.md +113 -0
- package/templates/.claude/skills/audit-site/references/findings-glossary.md +138 -0
- package/templates/.claude/skills/audit-site/references/severity-levels.md +114 -0
- package/templates/.claude/skills/provision-config/SKILL.md +243 -0
- package/templates/.claude/skills/provision-config/references/env-vars-template.md +184 -0
- package/templates/.claude/skills/provision-config/references/runbook-template.md +248 -0
- package/templates/.claude/skills/provision-config/references/vercel-json-template.md +98 -0
- package/templates/.claude/skills/scaffold-auth/SKILL.md +261 -0
- package/templates/.claude/skills/scaffold-auth/references/env-vars.md +91 -0
- package/templates/.claude/skills/scaffold-auth/references/oauth-app-setup.md +171 -0
- package/templates/.claude/skills/scaffold-commerce/SKILL.md +310 -0
- package/templates/.claude/skills/scaffold-commerce/references/lookup-keys-template.md +71 -0
- package/templates/.claude/skills/scaffold-commerce/references/marketplace-brand-pages.md +83 -0
- package/templates/.claude/skills/scaffold-commerce/templates/marketplace-cta-route.tsx.tmpl +72 -0
- package/templates/.claude/skills/scaffold-page/SKILL.md +243 -0
- package/templates/.claude/skills/scaffold-page/references/page-types.md +169 -0
- package/templates/.claude/skills/scaffold-page/templates/content.mdx.tmpl +28 -0
- package/templates/.claude/skills/scaffold-page/templates/route.tsx.tmpl +28 -0
- package/templates/.claude/skills/suggest-site-pages/SKILL.md +242 -0
- package/templates/.claude/skills/suggest-site-pages/references/categories.md +287 -0
- package/templates/.env.example +205 -0
- package/templates/.gitkeep +2 -0
- package/templates/CLAUDE.md +142 -0
- package/templates/CONVENTIONS.md +222 -0
- package/templates/README.md +110 -0
- package/templates/apps/api/.env.example +40 -0
- package/templates/apps/api/CLAUDE.md +63 -0
- package/templates/apps/api/api/index.ts +144 -0
- package/templates/apps/api/jest.config.cjs +74 -0
- package/templates/apps/api/package.json +54 -0
- package/templates/apps/api/src/__tests__/factories/content-fixture.ts +138 -0
- package/templates/apps/api/src/__tests__/factories/index.ts +70 -0
- package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +82 -0
- package/templates/apps/api/src/__tests__/index.test.ts +118 -0
- package/templates/apps/api/src/__tests__/server.test.ts +207 -0
- package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +126 -0
- package/templates/apps/api/src/__tests__/setup.ts +24 -0
- package/templates/apps/api/src/cli.ts +30 -0
- package/templates/apps/api/src/config/__tests__/index.test.ts +97 -0
- package/templates/apps/api/src/config/index.ts +56 -0
- package/templates/apps/api/src/index.ts +32 -0
- package/templates/apps/api/src/lib/__mocks__/prisma-client.js +15 -0
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +45 -0
- package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +178 -0
- package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +100 -0
- package/templates/apps/api/src/lib/__tests__/errors.test.ts +94 -0
- package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +144 -0
- package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +8 -0
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +227 -0
- package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +125 -0
- package/templates/apps/api/src/lib/__tests__/prisma.test.ts +165 -0
- package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +129 -0
- package/templates/apps/api/src/lib/__tests__/stripe.test.ts +74 -0
- package/templates/apps/api/src/lib/content-adapter.ts +86 -0
- package/templates/apps/api/src/lib/error-serializer.ts +77 -0
- package/templates/apps/api/src/lib/errors.ts +95 -0
- package/templates/apps/api/src/lib/file-fallback.ts +87 -0
- package/templates/apps/api/src/lib/lead-capture-store.ts +110 -0
- package/templates/apps/api/src/lib/locales.ts +201 -0
- package/templates/apps/api/src/lib/outbound-http.ts +122 -0
- package/templates/apps/api/src/lib/prisma.ts +21 -0
- package/templates/apps/api/src/lib/require-paid-tier.ts +53 -0
- package/templates/apps/api/src/lib/stripe.ts +30 -0
- package/templates/apps/api/src/lib/webhook-idempotency.ts +92 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +111 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +172 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +119 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +138 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +149 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +139 -0
- package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +175 -0
- package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +76 -0
- package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +153 -0
- package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +72 -0
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +292 -0
- package/templates/apps/api/src/middleware/auth.ts +246 -0
- package/templates/apps/api/src/middleware/rate-limit.ts +132 -0
- package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +129 -0
- package/templates/apps/api/src/openapi/index.ts +12 -0
- package/templates/apps/api/src/openapi/spec.ts +408 -0
- package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +193 -0
- package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +201 -0
- package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +294 -0
- package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +486 -0
- package/templates/apps/api/src/routes/auth/tokens.ts +199 -0
- package/templates/apps/api/src/routes/auth/user.ts +244 -0
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +588 -0
- package/templates/apps/api/src/routes/checkout/index.ts +13 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +185 -0
- package/templates/apps/api/src/routes/content/__tests__/create.test.ts +239 -0
- package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +201 -0
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +141 -0
- package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +122 -0
- package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +44 -0
- package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +118 -0
- package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +51 -0
- package/templates/apps/api/src/routes/content/__tests__/update.test.ts +252 -0
- package/templates/apps/api/src/routes/content/create.ts +114 -0
- package/templates/apps/api/src/routes/content/delete.ts +81 -0
- package/templates/apps/api/src/routes/content/get-page.ts +98 -0
- package/templates/apps/api/src/routes/content/index.ts +32 -0
- package/templates/apps/api/src/routes/content/list-pages.ts +83 -0
- package/templates/apps/api/src/routes/content/list-types.ts +19 -0
- package/templates/apps/api/src/routes/content/rate-limit.ts +13 -0
- package/templates/apps/api/src/routes/content/slug.ts +9 -0
- package/templates/apps/api/src/routes/content/update.ts +111 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +415 -0
- package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +165 -0
- package/templates/apps/api/src/routes/leads/index.ts +130 -0
- package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +296 -0
- package/templates/apps/api/src/routes/test/auth/session.ts +141 -0
- package/templates/apps/api/src/routes/webhooks/README.md +57 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +247 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +198 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +633 -0
- package/templates/apps/api/src/routes/webhooks/index.ts +41 -0
- package/templates/apps/api/src/routes/webhooks/stripe.ts +253 -0
- package/templates/apps/api/src/server.ts +157 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +395 -0
- package/templates/apps/api/src/services/enrichment-shim.ts +53 -0
- package/templates/apps/api/src/services/lead-routing.ts +338 -0
- package/templates/apps/api/tsconfig.json +34 -0
- package/templates/apps/api/vercel.json +17 -0
- package/templates/apps/mcp/.env.example +52 -0
- package/templates/apps/mcp/CLAUDE.md +84 -0
- package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +52 -0
- package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +46 -0
- package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +36 -0
- package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +54 -0
- package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +110 -0
- package/templates/apps/mcp/__tests__/audit-single-page.test.ts +213 -0
- package/templates/apps/mcp/__tests__/audit.test.ts +217 -0
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +52 -0
- package/templates/apps/mcp/__tests__/create_page.test.ts +201 -0
- package/templates/apps/mcp/__tests__/delete_page.test.ts +176 -0
- package/templates/apps/mcp/__tests__/get_business_hours.test.ts +82 -0
- package/templates/apps/mcp/__tests__/get_faq.test.ts +80 -0
- package/templates/apps/mcp/__tests__/get_locations.test.ts +65 -0
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +90 -0
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +80 -0
- package/templates/apps/mcp/__tests__/get_site_info.test.ts +81 -0
- package/templates/apps/mcp/__tests__/http-transport.test.ts +323 -0
- package/templates/apps/mcp/__tests__/lib/errors.test.ts +75 -0
- package/templates/apps/mcp/__tests__/lib/require-paid-tier.test.ts +75 -0
- package/templates/apps/mcp/__tests__/list_pages.test.ts +112 -0
- package/templates/apps/mcp/__tests__/locale.test.ts +135 -0
- package/templates/apps/mcp/__tests__/parity.test.ts +205 -0
- package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +34 -0
- package/templates/apps/mcp/__tests__/read_content.test.ts +153 -0
- package/templates/apps/mcp/__tests__/request_callback.test.ts +163 -0
- package/templates/apps/mcp/__tests__/search_content.test.ts +153 -0
- package/templates/apps/mcp/__tests__/server.test.ts +115 -0
- package/templates/apps/mcp/__tests__/submit_lead.test.ts +165 -0
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +161 -0
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +227 -0
- package/templates/apps/mcp/__tests__/tools/scaffold.test.ts +237 -0
- package/templates/apps/mcp/__tests__/update_page.test.ts +195 -0
- package/templates/apps/mcp/jest.config.cjs +82 -0
- package/templates/apps/mcp/package.json +37 -0
- package/templates/apps/mcp/src/abuse/daily-cap.ts +47 -0
- package/templates/apps/mcp/src/abuse/email-validator.ts +25 -0
- package/templates/apps/mcp/src/abuse/honeypot.ts +21 -0
- package/templates/apps/mcp/src/abuse/index.ts +111 -0
- package/templates/apps/mcp/src/abuse/user-agent-deny.ts +58 -0
- package/templates/apps/mcp/src/http-transport.ts +303 -0
- package/templates/apps/mcp/src/index.ts +67 -0
- package/templates/apps/mcp/src/lib/audit-single-page.ts +194 -0
- package/templates/apps/mcp/src/lib/errors.ts +61 -0
- package/templates/apps/mcp/src/lib/locales.ts +171 -0
- package/templates/apps/mcp/src/lib/require-paid-tier.ts +44 -0
- package/templates/apps/mcp/src/lib/resolve-locale.ts +30 -0
- package/templates/apps/mcp/src/server.ts +139 -0
- package/templates/apps/mcp/src/tools/audit.ts +103 -0
- package/templates/apps/mcp/src/tools/capture_lead.ts +52 -0
- package/templates/apps/mcp/src/tools/create_page.ts +95 -0
- package/templates/apps/mcp/src/tools/delete_page.ts +73 -0
- package/templates/apps/mcp/src/tools/get_business_hours.ts +66 -0
- package/templates/apps/mcp/src/tools/get_faq.ts +69 -0
- package/templates/apps/mcp/src/tools/get_locations.ts +85 -0
- package/templates/apps/mcp/src/tools/get_offerings.ts +66 -0
- package/templates/apps/mcp/src/tools/get_pricing.ts +74 -0
- package/templates/apps/mcp/src/tools/get_site_info.ts +84 -0
- package/templates/apps/mcp/src/tools/index.ts +125 -0
- package/templates/apps/mcp/src/tools/list_pages.ts +72 -0
- package/templates/apps/mcp/src/tools/purchase.ts +89 -0
- package/templates/apps/mcp/src/tools/read_content.ts +61 -0
- package/templates/apps/mcp/src/tools/request_callback.ts +51 -0
- package/templates/apps/mcp/src/tools/scaffold.ts +119 -0
- package/templates/apps/mcp/src/tools/search_content.ts +59 -0
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +47 -0
- package/templates/apps/mcp/src/tools/update_page.ts +91 -0
- package/templates/apps/mcp/tsconfig.json +19 -0
- package/templates/apps/web/.env.example +47 -0
- package/templates/apps/web/CLAUDE.md +81 -0
- package/templates/apps/web/__tests__/auth/adversarial/cookie-attributes.test.ts +94 -0
- package/templates/apps/web/__tests__/auth/adversarial/oauth-state-parameter.test.ts +75 -0
- package/templates/apps/web/__tests__/auth/adversarial/redirect-uri-allowlist.test.ts +82 -0
- package/templates/apps/web/__tests__/auth/env-helpers.test.ts +168 -0
- package/templates/apps/web/__tests__/authority-list-routes.test.tsx +208 -0
- package/templates/apps/web/__tests__/better-stack.test.ts +66 -0
- package/templates/apps/web/__tests__/blog-dir-resolution.test.ts +87 -0
- package/templates/apps/web/__tests__/blog-source-populated.test.ts +130 -0
- package/templates/apps/web/__tests__/data-testid-coverage.test.tsx +60 -0
- package/templates/apps/web/__tests__/google-analytics.test.tsx +104 -0
- package/templates/apps/web/__tests__/i18n/middleware.test.ts +119 -0
- package/templates/apps/web/__tests__/i18n/routing.test.ts +114 -0
- package/templates/apps/web/__tests__/i18n/translations.test.ts +191 -0
- package/templates/apps/web/__tests__/json-ld.test.ts +98 -0
- package/templates/apps/web/__tests__/knowledge-events-routes.test.tsx +580 -0
- package/templates/apps/web/__tests__/layout-stealth.test.ts +39 -0
- package/templates/apps/web/__tests__/lighthouse-fixtures/improvement-image-shrink.tsx +103 -0
- package/templates/apps/web/__tests__/lighthouse-fixtures/override-fixture.md +114 -0
- package/templates/apps/web/__tests__/lighthouse-fixtures/regression-bloat.tsx +94 -0
- package/templates/apps/web/__tests__/page.test.tsx +230 -0
- package/templates/apps/web/__tests__/products-services-phase1.test.tsx +321 -0
- package/templates/apps/web/__tests__/projects-routes.test.tsx +392 -0
- package/templates/apps/web/__tests__/resources-downloads-integrations-phase2.test.tsx +475 -0
- package/templates/apps/web/__tests__/routes/ai-plugin-json.test.ts +53 -0
- package/templates/apps/web/__tests__/routes/blog-route.test.tsx +191 -0
- package/templates/apps/web/__tests__/routes/llms-txt.test.ts +123 -0
- package/templates/apps/web/__tests__/routes/robots-txt.test.ts +52 -0
- package/templates/apps/web/__tests__/routes/sitemap-xml.test.ts +78 -0
- package/templates/apps/web/__tests__/routes/well-known-mcp.test.ts +203 -0
- package/templates/apps/web/__tests__/section-routes.test.tsx +693 -0
- package/templates/apps/web/__tests__/security-headers.test.ts +201 -0
- package/templates/apps/web/__tests__/sentry-config.test.ts +116 -0
- package/templates/apps/web/__tests__/setup.ts +82 -0
- package/templates/apps/web/__tests__/sitemap-locales.test.ts +415 -0
- package/templates/apps/web/__tests__/standalone-informational-routes.test.tsx +844 -0
- package/templates/apps/web/app/.well-known/ai-plugin.json/route.ts +81 -0
- package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +110 -0
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +58 -0
- package/templates/apps/web/app/[locale]/__tests__/layout.test.tsx +120 -0
- package/templates/apps/web/app/[locale]/__tests__/page-renderer-migration.test.tsx +202 -0
- package/templates/apps/web/app/[locale]/about/page.tsx +31 -0
- package/templates/apps/web/app/[locale]/blog/[[...slug]]/page.tsx +173 -0
- package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +45 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +117 -0
- package/templates/apps/web/app/[locale]/careers/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/case-studies/[slug]/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +113 -0
- package/templates/apps/web/app/[locale]/case-studies/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +63 -0
- package/templates/apps/web/app/[locale]/clients/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +130 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +152 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +92 -0
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +79 -0
- package/templates/apps/web/app/[locale]/contact/error.tsx +24 -0
- package/templates/apps/web/app/[locale]/contact/page.tsx +38 -0
- package/templates/apps/web/app/[locale]/courses/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +119 -0
- package/templates/apps/web/app/[locale]/courses/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/dev/purchase/__tests__/actions.test.ts +160 -0
- package/templates/apps/web/app/[locale]/dev/purchase/error.tsx +25 -0
- package/templates/apps/web/app/[locale]/dev/purchase/page.tsx +117 -0
- package/templates/apps/web/app/[locale]/dev/purchase/purchase.actions.ts +58 -0
- package/templates/apps/web/app/[locale]/docs/[[...slug]]/page.tsx +118 -0
- package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +72 -0
- package/templates/apps/web/app/[locale]/downloads/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +47 -0
- package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +130 -0
- package/templates/apps/web/app/[locale]/events/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/faq/page.tsx +36 -0
- package/templates/apps/web/app/[locale]/how-to/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +78 -0
- package/templates/apps/web/app/[locale]/how-to/page.tsx +40 -0
- package/templates/apps/web/app/[locale]/integrations/[slug]/page.tsx +43 -0
- package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +129 -0
- package/templates/apps/web/app/[locale]/integrations/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/launch-service/page.tsx +31 -0
- package/templates/apps/web/app/[locale]/layout.tsx +241 -0
- package/templates/apps/web/app/[locale]/page.tsx +41 -0
- package/templates/apps/web/app/[locale]/partners/[slug]/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +113 -0
- package/templates/apps/web/app/[locale]/partners/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/products/[slug]/page.tsx +43 -0
- package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +129 -0
- package/templates/apps/web/app/[locale]/products/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/projects/[slug]/page.tsx +39 -0
- package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +138 -0
- package/templates/apps/web/app/[locale]/projects/page.tsx +30 -0
- package/templates/apps/web/app/[locale]/resources/[slug]/page.tsx +51 -0
- package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +117 -0
- package/templates/apps/web/app/[locale]/resources/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/services/[slug]/page.tsx +43 -0
- package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +129 -0
- package/templates/apps/web/app/[locale]/services/page.tsx +25 -0
- package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +81 -0
- package/templates/apps/web/app/[locale]/software/page.tsx +39 -0
- package/templates/apps/web/app/[locale]/tech-articles/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +82 -0
- package/templates/apps/web/app/[locale]/tech-articles/page.tsx +39 -0
- package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +63 -0
- package/templates/apps/web/app/[locale]/testimonials/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +63 -0
- package/templates/apps/web/app/[locale]/use-cases/page.tsx +27 -0
- package/templates/apps/web/app/[locale]/whitepapers/[slug]/page.tsx +34 -0
- package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +82 -0
- package/templates/apps/web/app/[locale]/whitepapers/page.tsx +39 -0
- package/templates/apps/web/app/__tests__/error-boundaries.test.tsx +152 -0
- package/templates/apps/web/app/api/auth/[...all]/route.ts +16 -0
- package/templates/apps/web/app/error-fallback.tsx +75 -0
- package/templates/apps/web/app/error.tsx +23 -0
- package/templates/apps/web/app/layout.tsx +18 -0
- package/templates/apps/web/app/llms.txt/route.ts +101 -0
- package/templates/apps/web/app/not-found.tsx +48 -0
- package/templates/apps/web/app/og/__tests__/route.test.ts +164 -0
- package/templates/apps/web/app/og/route.tsx +135 -0
- package/templates/apps/web/app/robots.txt/route.ts +36 -0
- package/templates/apps/web/app/sitemap.xml/route.ts +146 -0
- package/templates/apps/web/auth.ts +141 -0
- package/templates/apps/web/components/ThemeToggle.tsx +60 -0
- package/templates/apps/web/components/google-analytics.tsx +34 -0
- package/templates/apps/web/content/en/blog/index.mdx +15 -0
- package/templates/apps/web/content/en/blog/launching-ailk.mdx +20 -0
- package/templates/apps/web/content/en/docs/getting-started.mdx +30 -0
- package/templates/apps/web/i18n/request.ts +36 -0
- package/templates/apps/web/jest.config.cjs +100 -0
- package/templates/apps/web/lib/__mocks__/next-mdx-remote-rsc.js +12 -0
- package/templates/apps/web/lib/__mocks__/source-server.js +31 -0
- package/templates/apps/web/lib/__tests__/og.test.ts +65 -0
- package/templates/apps/web/lib/auth-env.ts +66 -0
- package/templates/apps/web/lib/blog-list-data.ts +95 -0
- package/templates/apps/web/lib/blog-post-data.ts +79 -0
- package/templates/apps/web/lib/nav-config.ts +13 -0
- package/templates/apps/web/lib/observability/better-stack.ts +27 -0
- package/templates/apps/web/lib/og.ts +23 -0
- package/templates/apps/web/lib/prisma-for-auth.ts +34 -0
- package/templates/apps/web/lib/source.ts +34 -0
- package/templates/apps/web/messages/en.json +131 -0
- package/templates/apps/web/middleware.ts +80 -0
- package/templates/apps/web/next.config.mjs +167 -0
- package/templates/apps/web/package.json +62 -0
- package/templates/apps/web/public/.well-known/security.txt +17 -0
- package/templates/apps/web/public/android-chrome-192x192.png +0 -0
- package/templates/apps/web/public/android-chrome-512x512.png +0 -0
- package/templates/apps/web/public/apple-touch-icon.png +0 -0
- package/templates/apps/web/public/favicon-16x16.png +0 -0
- package/templates/apps/web/public/favicon-32x32.png +0 -0
- package/templates/apps/web/public/favicon.ico +0 -0
- package/templates/apps/web/public/favicon.svg +4 -0
- package/templates/apps/web/public/logo-dark.svg +21 -0
- package/templates/apps/web/public/logo-light.svg +21 -0
- package/templates/apps/web/public/logomark-dark.svg +4 -0
- package/templates/apps/web/public/logomark-light.svg +4 -0
- package/templates/apps/web/public/og-default.png +0 -0
- package/templates/apps/web/public/site.webmanifest +19 -0
- package/templates/apps/web/scripts/assert-content-bundled.ts +55 -0
- package/templates/apps/web/security-headers.config.ts +132 -0
- package/templates/apps/web/sentry.client.config.ts +27 -0
- package/templates/apps/web/sentry.edge.config.ts +15 -0
- package/templates/apps/web/sentry.server.config.ts +20 -0
- package/templates/apps/web/source.config.ts +78 -0
- package/templates/apps/web/src/components/SiteNav.tsx +21 -0
- package/templates/apps/web/src/lib/routes.ts +37 -0
- package/templates/apps/web/tsconfig.json +35 -0
- package/templates/apps/web/types/messages.d.ts +19 -0
- package/templates/content/.gitkeep +0 -0
- package/templates/content/CLAUDE.md +85 -0
- package/templates/content/_site.mdx +38 -0
- package/templates/content/ar/HomePage/home.mdx +123 -0
- package/templates/content/ar/_site.mdx +35 -0
- package/templates/content/de/_site.mdx +29 -0
- package/templates/content/en/.gitkeep +0 -0
- package/templates/content/en/AboutPage/about.mdx +19 -0
- package/templates/content/en/AboutPage/about.schema.json +82 -0
- package/templates/content/en/BookCall/book-call.mdx +19 -0
- package/templates/content/en/BookCall/book-call.schema.json +121 -0
- package/templates/content/en/BreadcrumbList/site-breadcrumbs.mdx +20 -0
- package/templates/content/en/CareersList/careers.mdx +24 -0
- package/templates/content/en/CaseStudiesList/case-studies.mdx +22 -0
- package/templates/content/en/CaseStudiesList/showcase.mdx +8 -0
- package/templates/content/en/CaseStudy/ailk-aeo-rollout.mdx +32 -0
- package/templates/content/en/CaseStudy/schema-builder-migration.mdx +41 -0
- package/templates/content/en/ClientsList/clients.mdx +38 -0
- package/templates/content/en/ContactPage/contact.mdx +19 -0
- package/templates/content/en/ContactPage/contact.schema.json +100 -0
- package/templates/content/en/ContactPoint/primary.mdx +14 -0
- package/templates/content/en/Course/aeo-fundamentals.mdx +37 -0
- package/templates/content/en/Course/schema-builder-workshop.mdx +62 -0
- package/templates/content/en/CoursesList/courses.mdx +22 -0
- package/templates/content/en/DownloadsList/downloads.mdx +22 -0
- package/templates/content/en/Event/aeo-office-hours-may-2026.mdx +39 -0
- package/templates/content/en/Event/ailk-launch-day-2026.mdx +35 -0
- package/templates/content/en/EventsList/events.mdx +26 -0
- package/templates/content/en/FAQPage/faq.mdx +420 -0
- package/templates/content/en/FAQPage/faq.schema.json +231 -0
- package/templates/content/en/GlossaryList/glossary.mdx +19 -0
- package/templates/content/en/GlossaryList/glossary.schema.json +300 -0
- package/templates/content/en/HomePage/home.mdx +312 -0
- package/templates/content/en/HomePage/home.schema.json +88 -0
- package/templates/content/en/HomePage/launch-service.mdx +475 -0
- package/templates/content/en/HomePage/launch-service.schema.json +138 -0
- package/templates/content/en/HowTo/add-mdx-content.mdx +38 -0
- package/templates/content/en/HowTo/configure-aeo-scoring.mdx +35 -0
- package/templates/content/en/HowTo/set-up-json-ld.mdx +36 -0
- package/templates/content/en/Integration/github-actions.mdx +31 -0
- package/templates/content/en/Integration/openai-api.mdx +26 -0
- package/templates/content/en/Integration/vercel.mdx +32 -0
- package/templates/content/en/IntegrationsList/integrations.mdx +22 -0
- package/templates/content/en/JobPosting/content-strategist.mdx +46 -0
- package/templates/content/en/JobPosting/developer-advocate.mdx +47 -0
- package/templates/content/en/JobPosting/senior-fullstack-engineer.mdx +57 -0
- package/templates/content/en/LandingPage/aeo-audit.mdx +19 -0
- package/templates/content/en/LandingPage/aeo-audit.schema.json +92 -0
- package/templates/content/en/LandingPage/agency-waitlist.mdx +340 -0
- package/templates/content/en/LandingPage/agency-waitlist.schema.json +152 -0
- package/templates/content/en/LandingPage/developers.mdx +19 -0
- package/templates/content/en/LandingPage/developers.schema.json +109 -0
- package/templates/content/en/LandingPage/for-agencies.mdx +390 -0
- package/templates/content/en/LandingPage/for-agencies.schema.json +107 -0
- package/templates/content/en/LandingPage/for-ai-search-agencies.mdx +417 -0
- package/templates/content/en/LandingPage/for-ai-search-agencies.schema.json +105 -0
- package/templates/content/en/LandingPage/for-businesses.mdx +19 -0
- package/templates/content/en/LandingPage/for-businesses.schema.json +96 -0
- package/templates/content/en/LandingPage/platform.mdx +369 -0
- package/templates/content/en/LandingPage/platform.schema.json +166 -0
- package/templates/content/en/LandingPage/vs-ai-website-builders.mdx +19 -0
- package/templates/content/en/LandingPage/vs-ai-website-builders.schema.json +102 -0
- package/templates/content/en/LandingPage/vs-wordpress.mdx +19 -0
- package/templates/content/en/LandingPage/vs-wordpress.schema.json +53 -0
- package/templates/content/en/NewsletterSignup/newsletter.mdx +236 -0
- package/templates/content/en/NewsletterSignup/newsletter.schema.json +91 -0
- package/templates/content/en/Organization/site-owner.mdx +16 -0
- package/templates/content/en/Partner/prisma.mdx +31 -0
- package/templates/content/en/Partner/supabase.mdx +30 -0
- package/templates/content/en/Partner/vercel.mdx +28 -0
- package/templates/content/en/PartnersList/partners.mdx +22 -0
- package/templates/content/en/Person/founder.mdx +18 -0
- package/templates/content/en/Pricing/pricing.mdx +538 -0
- package/templates/content/en/Pricing/pricing.schema.json +209 -0
- package/templates/content/en/PrivacyPage/privacy.mdx +165 -0
- package/templates/content/en/PrivacyPage/privacy.schema.json +64 -0
- package/templates/content/en/Product/ailk.mdx +19 -0
- package/templates/content/en/Product/ailk.schema.json +94 -0
- package/templates/content/en/Product/api-launch-kit.mdx +26 -0
- package/templates/content/en/Product/launch-kit.mdx +28 -0
- package/templates/content/en/ProductsList/products.mdx +26 -0
- package/templates/content/en/Project/ailk-phase-2.mdx +54 -0
- package/templates/content/en/ProjectsList/projects.mdx +25 -0
- package/templates/content/en/ResourceDetail/aeo-scoring-guide.mdx +27 -0
- package/templates/content/en/ResourceDetail/content-model-whitepaper.mdx +28 -0
- package/templates/content/en/ResourceDetail/schema-org-quick-reference.mdx +39 -0
- package/templates/content/en/ResourcesHub/resources.mdx +22 -0
- package/templates/content/en/Service/consulting.mdx +22 -0
- package/templates/content/en/Service/implementation.mdx +30 -0
- package/templates/content/en/Service/launch-service.mdx +232 -0
- package/templates/content/en/Service/launch.mdx +228 -0
- package/templates/content/en/ServicesList/services.mdx +84 -0
- package/templates/content/en/SoftwareProduct/ailk-aeo.mdx +44 -0
- package/templates/content/en/SoftwareProduct/ailk-content-adapters.mdx +47 -0
- package/templates/content/en/SoftwareProduct/ailk-schema.mdx +49 -0
- package/templates/content/en/TeamList/team.mdx +63 -0
- package/templates/content/en/TeamMember/founder.mdx +72 -0
- package/templates/content/en/TermsPage/terms.mdx +19 -0
- package/templates/content/en/TermsPage/terms.schema.json +99 -0
- package/templates/content/en/TestimonialsList/testimonials.mdx +44 -0
- package/templates/content/en/UseCasesList/use-cases.mdx +30 -0
- package/templates/content/en/Whitepaper/ax-first-product-development.mdx +27 -0
- package/templates/content/en/Whitepaper/open-core-commercial-strategy.mdx +27 -0
- package/templates/content/en/Whitepaper/structured-data-for-answer-engines.mdx +31 -0
- package/templates/content/en-XA/AboutPage/about.mdx +8 -0
- package/templates/content/en-XA/FAQPage/faq.mdx +8 -0
- package/templates/content/en-XA/HomePage/home.mdx +8 -0
- package/templates/content/es/_site.mdx +30 -0
- package/templates/content/fr/_site.mdx +30 -0
- package/templates/content/ja/_site.mdx +30 -0
- package/templates/content/pt-BR/AboutPage/about.mdx +8 -0
- package/templates/content/pt-BR/FAQPage/faq.mdx +8 -0
- package/templates/content/pt-BR/HomePage/home.mdx +23 -0
- package/templates/database/CHANGELOG.md +5 -0
- package/templates/database/README.md +234 -0
- package/templates/database/__tests__/user-cascade.test.ts +125 -0
- package/templates/database/auth/.gitkeep +0 -0
- package/templates/database/config/.gitkeep +0 -0
- package/templates/database/content/.gitkeep +0 -0
- package/templates/database/inbox/.gitkeep +0 -0
- package/templates/database/inbox/README.md +3 -0
- package/templates/database/inbox/__tests__/schema.test.ts +40 -0
- package/templates/database/inbox/schema.prisma +52 -0
- package/templates/database/jest.config.cjs +29 -0
- package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +328 -0
- package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +100 -0
- package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +28 -0
- package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +25 -0
- package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +42 -0
- package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +67 -0
- package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +21 -0
- package/templates/database/migrations/migration_lock.toml +3 -0
- package/templates/database/ops/.gitkeep +0 -0
- package/templates/database/package.json +45 -0
- package/templates/database/prisma.config.ts +20 -0
- package/templates/database/schema.prisma +487 -0
- package/templates/database/scripts/db-generate-locked.sh +80 -0
- package/templates/database/seed-test.ts +85 -0
- package/templates/database/tsconfig.build.json +16 -0
- package/templates/database/tsconfig.json +9 -0
- package/templates/package.json +125 -0
- package/templates/pnpm-workspace.yaml +6 -0
- package/templates/project.yaml +59 -0
- package/templates/tsconfig.base.json +18 -0
- 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.
|