create-ailk 0.6.1 → 0.7.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 (232) hide show
  1. package/README.md +43 -4
  2. package/component-catalog.json +146 -21
  3. package/component-catalog.md +9 -6
  4. package/dist/add-module-core.d.ts +22 -0
  5. package/dist/add-module-core.js +50 -0
  6. package/dist/add-module.d.ts +89 -0
  7. package/dist/add-module.js +334 -0
  8. package/dist/category-profile.d.ts +126 -0
  9. package/dist/category-profile.js +262 -0
  10. package/dist/cli.js +73 -11
  11. package/dist/index.d.ts +4 -2
  12. package/dist/index.js +6 -1
  13. package/dist/lib/extract-module-bundle.d.ts +56 -1
  14. package/dist/lib/extract-module-bundle.js +165 -13
  15. package/dist/lib/license-key-files.d.ts +15 -0
  16. package/dist/lib/license-key-files.js +102 -0
  17. package/dist/lib/pro-callout.d.ts +16 -10
  18. package/dist/lib/pro-callout.js +26 -3
  19. package/dist/license-set.d.ts +34 -0
  20. package/dist/license-set.js +194 -0
  21. package/dist/module-architecture.d.ts +20 -0
  22. package/dist/module-architecture.js +77 -19
  23. package/dist/modules/commerce/0.6.1.tar.gz +0 -0
  24. package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
  25. package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
  26. package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
  27. package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
  28. package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
  29. package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
  30. package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
  31. package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
  32. package/dist/modules/workspace/0.6.1.tar.gz +0 -0
  33. package/dist/parse-args.d.ts +7 -0
  34. package/dist/parse-args.js +23 -1
  35. package/dist/programmatic.d.ts +46 -0
  36. package/dist/programmatic.js +130 -9
  37. package/dist/site-chrome.d.ts +18 -7
  38. package/dist/site-chrome.js +32 -14
  39. package/dist/site-roster.d.ts +127 -0
  40. package/dist/site-roster.js +494 -0
  41. package/dist/surfaces.d.ts +20 -7
  42. package/dist/surfaces.js +149 -28
  43. package/dist/sync-routes.d.ts +9 -0
  44. package/dist/sync-routes.js +2 -2
  45. package/dist/template-manifest.d.ts +58 -2
  46. package/dist/template-manifest.js +196 -69
  47. package/package.json +6 -4
  48. package/site-templates/_base/content/en/BookCall/book-call.mdx +53 -0
  49. package/site-templates/_base/content/en/GlossaryList/glossary.mdx +66 -0
  50. package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +68 -0
  51. package/site-templates/_base/content/en/Pricing/pricing.mdx +71 -62
  52. package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +2 -3
  53. package/site-templates/_base/content/en/TermsPage/terms.mdx +2 -3
  54. package/site-templates/_base/content/en/UseCase/first-use-case.mdx +23 -0
  55. package/site-templates/_base/content/en/UseCase/second-use-case.mdx +23 -0
  56. package/site-templates/_base/content/en/UseCase/third-use-case.mdx +23 -0
  57. package/site-templates/designs/minimalism/DESIGN.md +162 -0
  58. package/site-templates/designs/standard/DESIGN.md +162 -0
  59. package/site-templates/marketing-site/DESIGN.md +55 -41
  60. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +312 -57
  61. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +209 -90
  62. package/site-templates/marketing-site/ailk-template.json +1 -0
  63. package/site-templates/marketing-site-free/DESIGN.md +55 -41
  64. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +260 -66
  65. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +294 -114
  66. package/site-templates/marketing-site-free/ailk-template.json +3 -2
  67. package/site-templates/minimalism-site/DESIGN.md +54 -40
  68. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +246 -19
  69. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +185 -51
  70. package/site-templates/minimalism-site/ailk-template.json +3 -2
  71. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +53 -0
  72. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +3 -37
  73. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +124 -0
  74. package/site-templates/saas-product/DESIGN.md +55 -41
  75. package/site-templates/simple-service/DESIGN.md +55 -41
  76. package/site-templates/simple-service/TEMPLATE-MANIFEST.json +135 -26
  77. package/site-templates/simple-service/TEMPLATE-MANIFEST.md +114 -59
  78. package/site-templates/simple-service/ailk-template.json +4 -3
  79. package/site-templates/simple-service/content/en/BookCall/book-call.mdx +53 -0
  80. package/site-templates/simple-service/content/en/ContactPage/contact.mdx +1 -36
  81. package/site-templates/simple-service/content/en/PurchasePolicyPage/purchase-policy.mdx +124 -0
  82. package/templates/.claude/settings.json +15 -0
  83. package/templates/.claude/skills/README.md +8 -8
  84. package/templates/.claude/skills/{scaffold-auth → add-auth}/SKILL.md +7 -7
  85. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/env-vars.md +2 -2
  86. package/templates/.claude/skills/{scaffold-auth → add-auth}/references/oauth-app-setup.md +3 -3
  87. package/templates/.claude/skills/{scaffold-page → add-page}/SKILL.md +76 -62
  88. package/templates/.claude/skills/add-page/references/page-types.md +111 -0
  89. package/templates/.claude/skills/{scaffold-page → add-page}/templates/content.mdx.tmpl +4 -4
  90. package/templates/.claude/skills/{scaffold-page → add-page}/templates/route.tsx.tmpl +1 -1
  91. package/templates/.claude/skills/{audit-site → check-site}/SKILL.md +16 -17
  92. package/templates/.claude/skills/{audit-site → check-site}/references/common-errors.md +3 -3
  93. package/templates/.claude/skills/{audit-site → check-site}/references/findings-glossary.md +16 -14
  94. package/templates/.claude/skills/{audit-site → check-site}/references/severity-levels.md +1 -1
  95. package/templates/.claude/skills/fill-page/SKILL.md +180 -0
  96. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +80 -0
  97. package/templates/.claude/skills/fill-page/references/section-sources.md +41 -0
  98. package/templates/.claude/skills/{provision-config → setup-deploy}/SKILL.md +8 -8
  99. package/templates/.claude/skills/{provision-config → setup-deploy}/references/env-vars-template.md +2 -2
  100. package/templates/.claude/skills/{provision-config → setup-deploy}/references/runbook-template.md +8 -8
  101. package/templates/.claude/skills/{provision-config → setup-deploy}/references/vercel-json-template.md +1 -1
  102. package/templates/.claude/skills/upgrade-plan/SKILL.md +117 -0
  103. package/templates/.claude/skills/upgrade-plan/references/options.md +24 -0
  104. package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +527 -0
  105. package/templates/.github/workflows/ci.yml +5 -0
  106. package/templates/CLAUDE.md +8 -2
  107. package/templates/DESIGN.md +52 -45
  108. package/templates/README.md +108 -46
  109. package/templates/apps/api/.env.example +2 -1
  110. package/templates/apps/api/package.json +1 -1
  111. package/templates/apps/api/src/config/__tests__/index.test.ts +37 -2
  112. package/templates/apps/api/src/config/index.ts +19 -6
  113. package/templates/apps/api/src/lib/license-key-store.ts +45 -0
  114. package/templates/apps/api/src/lib/site.ts +5 -3
  115. package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +97 -0
  116. package/templates/apps/api/src/middleware/auth.ts +9 -0
  117. package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +127 -5
  118. package/templates/apps/api/src/routes/content/get-page.ts +86 -2
  119. package/templates/apps/api/src/server.ts +6 -0
  120. package/templates/apps/mcp/__tests__/audit-single-page.test.ts +75 -1
  121. package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +57 -9
  122. package/templates/apps/mcp/package.json +2 -1
  123. package/templates/apps/mcp/src/index.ts +7 -0
  124. package/templates/apps/mcp/src/lib/audit-single-page.ts +36 -10
  125. package/templates/apps/mcp/src/lib/license-key-store.ts +45 -0
  126. package/templates/apps/web/__tests__/setup.ts +18 -0
  127. package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +10 -2
  128. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +2 -2
  129. package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +10 -4
  130. package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +22 -14
  131. package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +26 -18
  132. package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +12 -4
  133. package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +35 -4
  134. package/templates/apps/web/app/[locale]/[slug]/page.tsx +49 -9
  135. package/templates/apps/web/app/[locale]/book-a-call/page.tsx +50 -0
  136. package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
  137. package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
  138. package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +3 -4
  139. package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +94 -33
  140. package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +53 -23
  141. package/templates/apps/web/app/[locale]/contact/__tests__/ContactForm.test.tsx +96 -0
  142. package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +84 -2
  143. package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +5 -6
  144. package/templates/apps/web/app/[locale]/contact/page.tsx +25 -7
  145. package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
  146. package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +3 -4
  147. package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +4 -5
  148. package/templates/apps/web/app/[locale]/glossary/page.tsx +50 -0
  149. package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
  150. package/templates/apps/web/app/[locale]/how-to/page.tsx +25 -15
  151. package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
  152. package/templates/apps/web/app/[locale]/layout.tsx +113 -51
  153. package/templates/apps/web/app/[locale]/newsletter/page.tsx +50 -0
  154. package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
  155. package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
  156. package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +4 -5
  157. package/templates/apps/web/app/[locale]/{shipping → purchase-policy}/page.tsx +15 -10
  158. package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +4 -5
  159. package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
  160. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +14 -1
  161. package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
  162. package/templates/apps/web/app/[locale]/software/page.tsx +25 -15
  163. package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
  164. package/templates/apps/web/app/[locale]/tech-articles/page.tsx +25 -15
  165. package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +3 -4
  166. package/templates/apps/web/app/[locale]/use-cases/[slug]/page.tsx +48 -0
  167. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +3 -4
  168. package/templates/apps/web/app/[locale]/use-cases/page.tsx +15 -2
  169. package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
  170. package/templates/apps/web/app/[locale]/whitepapers/page.tsx +25 -15
  171. package/templates/apps/web/app/error-fallback.tsx +17 -45
  172. package/templates/apps/web/app/not-found.tsx +14 -38
  173. package/templates/apps/web/app/og/route.tsx +6 -0
  174. package/templates/apps/web/eslint.config.mjs +3 -0
  175. package/templates/apps/web/instrumentation.ts +14 -0
  176. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +38 -0
  177. package/templates/apps/web/lib/license-key-store.ts +52 -0
  178. package/templates/apps/web/lib/nav-config.ts +64 -12
  179. package/templates/apps/web/lib/prisma-for-auth.ts +9 -6
  180. package/templates/apps/web/lib/site-brand.tsx +1 -1
  181. package/templates/apps/web/lib/site-chrome.ts +3 -3
  182. package/templates/apps/web/lib/site-identity.ts +134 -0
  183. package/templates/apps/web/lib/site-theme.ts +11 -0
  184. package/templates/apps/web/messages/en.json +52 -37
  185. package/templates/apps/web/public/android-chrome-192x192.png +0 -0
  186. package/templates/apps/web/public/android-chrome-512x512.png +0 -0
  187. package/templates/apps/web/public/apple-touch-icon.png +0 -0
  188. package/templates/apps/web/public/favicon-16x16.png +0 -0
  189. package/templates/apps/web/public/favicon-32x32.png +0 -0
  190. package/templates/apps/web/public/favicon.ico +0 -0
  191. package/templates/apps/web/public/favicon.svg +3 -3
  192. package/templates/apps/web/public/logomark.svg +6 -3
  193. package/templates/apps/web/public/logos/ai-launch-kit-light.svg +4 -0
  194. package/templates/apps/web/public/logos/ai-launch-kit.svg +4 -0
  195. package/templates/apps/web/public/logos/atomic-agent-light.svg +4 -0
  196. package/templates/apps/web/public/logos/atomic-agent.svg +4 -0
  197. package/templates/apps/web/public/logos/salessmyth-light.svg +4 -0
  198. package/templates/apps/web/public/logos/salessmyth.svg +4 -0
  199. package/templates/apps/web/public/site.webmanifest +4 -4
  200. package/templates/apps/web/public/wordmark-light.svg +4 -0
  201. package/templates/apps/web/public/wordmark.svg +3 -3
  202. package/templates/apps/web/security-headers.config.ts +5 -1
  203. package/templates/content/_site.mdx +23 -0
  204. package/templates/content/en/AboutPage/about.mdx +150 -144
  205. package/templates/content/en/BlogList/blog.mdx +105 -0
  206. package/templates/content/en/ContactPage/contact.mdx +44 -85
  207. package/templates/content/en/FAQPage/faq.mdx +86 -57
  208. package/templates/content/en/HomePage/home.mdx +276 -217
  209. package/templates/content/en/PurchasePolicyPage/purchase-policy.mdx +182 -0
  210. package/templates/content/en/SoftwareProduct/product.mdx +175 -0
  211. package/templates/content/en/UseCasesList/use-cases.mdx +170 -0
  212. package/templates/database/CHANGELOG.md +7 -0
  213. package/templates/database/package.json +1 -1
  214. package/templates/package.json +3 -1
  215. package/templates/tools/lint-architecture.ts +315 -0
  216. package/templates/tools/tsconfig.json +14 -0
  217. package/versions.json +33 -33
  218. package/templates/.claude/skills/add-schema/SKILL.md +0 -277
  219. package/templates/.claude/skills/add-schema/references/conflict-handling.md +0 -200
  220. package/templates/.claude/skills/add-schema/references/file-finding.md +0 -123
  221. package/templates/.claude/skills/add-schema/references/schema-types.md +0 -234
  222. package/templates/.claude/skills/scaffold-page/references/page-types.md +0 -169
  223. package/templates/.claude/skills/suggest-site-pages/SKILL.md +0 -242
  224. package/templates/.claude/skills/suggest-site-pages/references/categories.md +0 -287
  225. package/templates/apps/web/app/[locale]/cancellation/page.tsx +0 -44
  226. package/templates/apps/web/app/[locale]/returns/page.tsx +0 -44
  227. package/templates/content/en/CancellationPolicyPage/cancellation.mdx +0 -108
  228. package/templates/content/en/LandingPage/blog.mdx +0 -83
  229. package/templates/content/en/LandingPage/features.mdx +0 -103
  230. package/templates/content/en/LandingPage/how-it-works.mdx +0 -143
  231. package/templates/content/en/ReturnsPolicyPage/returns.mdx +0 -108
  232. package/templates/content/en/ShippingPolicyPage/shipping.mdx +0 -108
@@ -0,0 +1,111 @@
1
+ <!-- GENERATED — do not hand-edit. Regenerate with:
2
+ cd packages/create-ailk && pnpm page-types:build
3
+ Source: packages/schema/src/registry/entries.ts
4
+ Generator: packages/create-ailk/scripts/generate-page-types-reference.ts
5
+ -->
6
+
7
+ # Page-Type → schema.org Registry Reference
8
+
9
+ The full page-type catalog the `add-page` skill reads at runtime to
10
+ resolve a slug or page-purpose hint to a family, chassis, schema.org
11
+ `@type`, and route convention. Generated from
12
+ `packages/schema/src/registry/entries.ts` — every registered page type
13
+ appears exactly once, list/detail pairs are shown together, and no row
14
+ here can name a type the registry doesn't have.
15
+
16
+ The skill resolves in this order:
17
+
18
+ 1. **Exact slug match** — `pricing` → `Pricing`.
19
+ 2. **Slug-prefix match** — `blog/<anything>` → `BlogPosting`.
20
+ 3. **Free-text hint match** — "company story" / "team" → `AboutPage`.
21
+ 4. **Ask** — if nothing matches, ask the consumer rather than guessing.
22
+
23
+ `<slug>` in a route below is the page's own slug (e.g. `hello-world`);
24
+ `<Type>` families using two-layer builders route supplementary schema
25
+ through the `schema:` frontmatter override — see this skill's
26
+ [Adding schema to an existing page](../SKILL.md#adding-schema-to-an-existing-page) section, or `packages/schema/README.md` for the full
27
+ override contract.
28
+
29
+ ## Core
30
+
31
+ | Key | `@type` | Family | Chassis | Route |
32
+ | --- | --- | --- | --- | --- |
33
+ | `HomePage` | `HomePage` | core | home | / |
34
+ | `AboutPage` | `AboutPage` | core | detail | /about |
35
+ | `ContactPage` | `ContactPage` | core | detail | /contact |
36
+ | `PrivacyPage` | `WebPage` | core | detail | /privacy |
37
+ | `TermsPage` | `WebPage` | core | detail | /terms |
38
+ | `PurchasePolicyPage` | `WebPage` | core | detail | /purchase-policy |
39
+ | `WorkingAgreementPage` | `WebPage` | core | detail | /working-agreement |
40
+ | `LandingPage` | `WebPage` | core | home | /<slug> |
41
+ | `ThankYouPage` | `WebPage` | core | detail | /thanks/<slug> |
42
+ | `BookCall` | `WebPage` | core | home | /book-a-call |
43
+ | `NewsletterSignup` | `WebPage` | core | home | /newsletter |
44
+ | `DemoRequest` | `WebPage` | core | home | /demo-request |
45
+ | `TrialSignup` | `WebPage` | core | home | /trial-signup |
46
+ | `Waitlist` | `WebPage` | core | home | /waitlist |
47
+ | `Assessment` | `WebApplication` | core | home | /assessment |
48
+ | `Calculator` | `WebApplication` | core | home | /calculator |
49
+ | `CampaignLP` | `WebPage` | core | home | /<slug> |
50
+
51
+ ## Identity
52
+
53
+ | Key | `@type` | Family | Chassis | Route |
54
+ | --- | --- | --- | --- | --- |
55
+ | `Organization` | `Organization` | identity | detail | — site-wide identity — emitted on the home page or in a layout |
56
+ | `Person` | `Person` | identity | detail | — site-wide identity — emitted on the home page or in a layout |
57
+ | `BreadcrumbList` | `BreadcrumbList` | identity | detail | — site-wide — attached alongside another page's own schema |
58
+ | `ContactPoint` | `ContactPoint` | identity | detail | — site-wide — embedded in `Organization` or `Person` |
59
+
60
+ ## Canonical
61
+
62
+ | Key | `@type` | Family | Chassis | Route |
63
+ | --- | --- | --- | --- | --- |
64
+ | `ServicesList` | `CollectionPage` | canonical-list | list | /services |
65
+ | `Service` | `Service` | canonical-detail | detail | /services/<slug> |
66
+ | `ProductsList` | `CollectionPage` | canonical-list | list | /products |
67
+ | `Product` | `Product` | canonical-detail | detail | /products/<slug> |
68
+ | `ProjectsList` | `CollectionPage` | canonical-list | list | /projects |
69
+ | `Project` | `CreativeWork` | canonical-detail | detail | /projects/<slug> |
70
+ | `FAQPage` | `FAQPage` | canonical-list | list | /faq |
71
+ | `CareersList` | `CollectionPage` | canonical-list | list | /careers |
72
+ | `JobPosting` | `JobPosting` | canonical-detail | detail | /careers/<slug> |
73
+ | `UseCasesList` | `CollectionPage` | canonical-list | list | /use-cases |
74
+ | `UseCase` | `WebPage` | canonical-detail | detail | /use-cases/<slug> |
75
+ | `TestimonialsList` | `CollectionPage` | canonical-list | list | /testimonials |
76
+ | `ClientsList` | `CollectionPage` | canonical-list | list | /clients |
77
+ | `DownloadsList` | `CollectionPage` | canonical-list | list | /downloads |
78
+ | `EventsList` | `CollectionPage` | canonical-list | list | /events |
79
+ | `Event` | `Event` | canonical-detail | detail | /events/<slug> |
80
+ | `CoursesList` | `CollectionPage` | canonical-list | list | /courses |
81
+ | `Course` | `Course` | canonical-detail | detail | /courses/<slug> |
82
+ | `TeamList` | `CollectionPage` | canonical-list | list | /team |
83
+ | `TeamMember` | `ProfilePage` | canonical-detail | detail | /team/<slug> |
84
+ | `PartnersList` | `CollectionPage` | canonical-list | list | /partners |
85
+ | `Partner` | `AboutPage` | canonical-detail | detail | /partners/<slug> |
86
+ | `IntegrationsList` | `CollectionPage` | canonical-list | list | /integrations |
87
+ | `Integration` | `WebPage` | canonical-detail | detail | /integrations/<slug> |
88
+ | `GlossaryList` | `CollectionPage` | canonical-list | list | /glossary |
89
+ | `LocationsList` | `CollectionPage` | canonical-list | list | /locations |
90
+ | `Location` | `Place` | canonical-detail | detail | /locations/<slug> |
91
+ | `DocsList` | `CollectionPage` | canonical-list | list | /docs |
92
+ | `SoftwareProduct` | `WebPage` | canonical-detail | detail | /software/<slug> |
93
+ | `ServiceAreaPage` | `WebPage` | canonical-detail | detail | /service-areas/<slug> |
94
+ | `Pricing` | `WebPage` | canonical-detail | detail | /pricing |
95
+ | `ComparisonPage` | `WebPage` | canonical-detail | detail | /comparisons/<slug> |
96
+ | `ReportPage` | `Report` | canonical-detail | detail | /reports/<slug> |
97
+
98
+ ## Editorial
99
+
100
+ | Key | `@type` | Family | Chassis | Route |
101
+ | --- | --- | --- | --- | --- |
102
+ | `BlogList` | `Blog` | editorial-list | list | /blog |
103
+ | `BlogPosting` | `BlogPosting` | editorial-detail | detail | /blog/<slug> |
104
+ | `ResourcesHub` | `CollectionPage` | editorial-list | list | /resources |
105
+ | `ResourceDetail` | `Article` | editorial-detail | detail | /resources/<slug> |
106
+ | `CaseStudiesList` | `CollectionPage` | editorial-list | list | /case-studies |
107
+ | `CaseStudy` | `Article` | editorial-detail | detail | /case-studies/<slug> |
108
+ | `HowTo` | `HowTo` | editorial-detail | detail | /how-to/<slug> |
109
+ | `Whitepaper` | `Article` | editorial-detail | detail | /whitepapers/<slug> |
110
+ | `TechArticle` | `TechArticle` | editorial-detail | detail | /tech-articles/<slug> |
111
+ | `DocsDetail` | `TechArticle` | editorial-detail | detail | /docs/<slug> |
@@ -10,7 +10,7 @@ description: {{DESCRIPTION}}
10
10
  {{DESCRIPTION}}
11
11
 
12
12
  <!--
13
- This is the MDX content stub emitted by `scaffold-page`.
13
+ This is the MDX content stub emitted by `add-page`.
14
14
  The frontmatter is the source of truth for JSON-LD — the
15
15
  `{{BUILDER}}(page)` call in `app/{{SLUG}}/page.tsx` reads it.
16
16
 
@@ -21,8 +21,8 @@ description: {{DESCRIPTION}}
21
21
  - Don't change `type` unless you also update the route's import
22
22
  to match a different `@working-theory/schema` builder.
23
23
 
24
- When you're happy with the page, run `audit-site` (#365) to see
25
- how it scores on citation-readiness. Use `add-schema` (#366) to
26
- add supplementary schema (FAQPage, HowTo, etc.) without
24
+ When you're happy with the page, run `check-site` to see
25
+ how it scores on citation-readiness. Use the `schema:` frontmatter
26
+ override to add supplementary schema (FAQPage, HowTo, etc.) without
27
27
  re-scaffolding.
28
28
  -->
@@ -1,4 +1,4 @@
1
- // Emitted by `scaffold-page` at `app/{{SLUG}}/page.tsx`. Substitutions:
1
+ // Emitted by `add-page` at `app/{{SLUG}}/page.tsx`. Substitutions:
2
2
  // {{SLUG}} — page slug (e.g., "pricing")
3
3
  // {{TYPE}} — schema.org @type (e.g., "Service")
4
4
  // {{BUILDER}} — typed builder name (e.g., "buildService")
@@ -1,14 +1,14 @@
1
1
  ---
2
- name: audit-site
2
+ name: check-site
3
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
4
  ---
5
5
 
6
- # audit-site
6
+ # check-site
7
7
 
8
8
  Shell out to `ailk-audit --json`, parse the JSON, and turn it into a
9
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.
10
+ the skill names fix tools (like the `schema:` frontmatter override)
11
+ but does not invoke them.
12
12
 
13
13
  ## When to use
14
14
 
@@ -24,7 +24,7 @@ citation-readiness audit (AEO Layer 1). Triggers:
24
24
  Skip this skill when:
25
25
 
26
26
  - The consumer wants to _fix_ a finding — point them at the fix
27
- tool (usually `add-schema` (#366)) and stop. This skill reports;
27
+ tool (usually `add-page`'s `schema:` frontmatter override) and stop. This skill reports;
28
28
  fix tools fix.
29
29
  - The consumer is asking about deploy-time monitoring or continuous
30
30
  audits — those are Pro features (`ailk pro` for details). Mention
@@ -131,18 +131,17 @@ themselves on a subsequent turn.
131
131
 
132
132
  | Rule | Fix tool |
133
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 |
134
+ | `schema-coverage` | `add-page`'s `schema:` frontmatter override — add the missing schema type to the named page |
135
+ | `jsonld-validity` | `add-page`'s `schema:` frontmatter override — replace the invalid block; or hand-fix the MDX |
136
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 |
137
+ | `faq-howto-incentive` | `add-page`'s `schema:` frontmatter override — add an `FAQPage` or `HowTo` block to a relevant page |
138
138
 
139
139
  Phrase the pointer as a single sentence:
140
140
 
141
- > "Missing `Product` schema on `/pricing` — run `add-schema` (#366)
142
- > to add it."
141
+ > "Missing `Product` schema on `/pricing` — add it via `add-page`'s
142
+ > `schema:` frontmatter override."
143
143
 
144
- Never invoke `add-schema` automatically. Never write to the
145
- consumer's repo from inside this skill.
144
+ Never write to the consumer's repo from inside this skill.
146
145
 
147
146
  ### Step 8 — Soft Pro mention
148
147
 
@@ -187,8 +186,8 @@ Never recommend "weekly" / "monthly" / a date.
187
186
  ## What this skill does NOT do
188
187
 
189
188
  - 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).
189
+ - Add JSON-LD to pages (that's the `schema:` frontmatter override, documented in `add-page`).
190
+ - Create new pages (that's `add-page`).
192
191
  - Cache results between runs.
193
192
  - Track score history or trends.
194
193
  - Auto-invoke fix tools.
@@ -202,9 +201,9 @@ Never recommend "weekly" / "monthly" / a date.
202
201
 
203
202
  ## Coordination
204
203
 
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
204
+ - **`add-page`'s `schema:` frontmatter override** — primary fix
205
+ mechanism the skill points at. Never auto-invoked.
206
+ - **`add-page`** — new-page creation; not a fix-tool
208
207
  for audit findings (audit reports on existing pages).
209
208
  - **`packages/aeo`** — owner of the `ailk-audit` CLI and rule set.
210
209
  This skill depends only on the CLI's `--json` output schema, not
@@ -1,7 +1,7 @@
1
1
  # Common Errors — Plain-Language Translations
2
2
 
3
3
  The three most common ways `ailk-audit` fails on a real consumer
4
- setup, with translations the `audit-site` skill emits instead of
4
+ setup, with translations the `check-site` skill emits instead of
5
5
  the raw stderr. Errors not matching any of these signatures pass
6
6
  through verbatim with a one-line `` `ailk-audit` failed — `` prefix
7
7
  (see SKILL.md Step 2).
@@ -56,8 +56,8 @@ mis-translate an unfamiliar error into a familiar fix path.
56
56
  >
57
57
  > - Your content lives elsewhere — pass `--content-root <path>`
58
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.
59
+ > - You haven't authored any pages yet — run `add-page` to generate
60
+ > them.
61
61
  > - The MDX files exist but aren't in the format the AILK content
62
62
  > adapter expects — make sure each page has frontmatter with at
63
63
  > least `title` and `type`.
@@ -2,7 +2,7 @@
2
2
 
3
3
  What each AEO rule means in plain language, what its `pass: false`
4
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
5
+ `check-site` skill in Step 6 (drill-down) and Step 7 (fix-tool
6
6
  pointer).
7
7
 
8
8
  The structure deliberately matches `perRule[].id` from the audit
@@ -30,9 +30,10 @@ SGE, Perplexity, ChatGPT search) read to understand your pages. A
30
30
  page with no schema is invisible to citation; a page with the
31
31
  wrong schema gets miscategorized.
32
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.
33
+ **Fix tool:** `add-page`'s `schema:` frontmatter override — set the
34
+ schema type the registry expects (the audit names it) on the page's
35
+ frontmatter. The typed builder emits a `<JsonLd>` block matching the
36
+ page's content.
36
37
 
37
38
  ---
38
39
 
@@ -52,10 +53,10 @@ invalid blocks. The page exists, the JSON-LD exists, but the
52
53
  citation surface is broken because the block doesn't parse as
53
54
  valid schema.org.
54
55
 
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.
56
+ **Fix tool:** `add-page`'s `schema:` frontmatter override — replace
57
+ the malformed block. For one-off edits to MDX, the consumer can also
58
+ hand-edit the JSON-LD inline; the frontmatter override is the safer
59
+ path because it uses typed builders.
59
60
 
60
61
  ---
61
62
 
@@ -81,8 +82,9 @@ have nothing to anchor to.
81
82
  layout component rendered on every page) emits an
82
83
  `Organization` (or `Person`) JSON-LD block. The `<JsonLd
83
84
  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
85
+ is the one this is going to ship as. `add-page`'s `schema:`
86
+ frontmatter override can land the block on a specific page if you'd
87
+ rather; but typically
86
88
  identity goes in a layout, not a leaf page.
87
89
 
88
90
  ---
@@ -105,10 +107,10 @@ explicit Q&A or step-by-step content because those are easier to
105
107
  quote directly into a generated response. Adding an FAQ or HowTo
106
108
  block to relevant pages is a low-effort score boost.
107
109
 
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
110
+ **Fix tool:** `add-page`'s `schema:` frontmatter override — add an
111
+ `FAQPage` block to your `/pricing` or `/contact` page (anywhere your
112
+ customers ask predictable questions), or a `HowTo` block to any
113
+ process/instructions content. `check-site` will surface this as
112
114
  an _incentive_ in drill-down, not a finding to "fix."
113
115
 
114
116
  ---
@@ -1,7 +1,7 @@
1
1
  # Severity Levels — Score Banding + Severity Mapping
2
2
 
3
3
  The AEO audit JSON does **not** include explicit severity fields.
4
- Severity is **derived** by the `audit-site` skill from each rule's
4
+ Severity is **derived** by the `check-site` skill from each rule's
5
5
  `weight` and `pass`. This file is the source of truth for that
6
6
  mapping.
7
7
 
@@ -0,0 +1,180 @@
1
+ ---
2
+ name: fill-page
3
+ description: Fill one existing page's section content from a category profile. Tier 1 writes realistic, labelled sample content for the category (a plumber's home page, say). Tier 2 asks the owner the profile's questions and writes the company's own first draft from their answers and `_site.mdx`. Use when the user says "fill this page", "fill the home page for a plumber", "write sample content for my services page", or "write my real copy from what I tell you". It never creates a page, never changes a page's section stack, and never edits `_site.mdx`.
4
+ ---
5
+
6
+ # fill-page
7
+
8
+ Replace one page's `{brace}` instructions with content, reading the
9
+ content from a **category profile** (`profiles/<slug>.yaml` beside this
10
+ file). A profile is the data for one business type: the schema.org
11
+ subtype, the typical offerings, the proof buyers expect, the buyer's own
12
+ words, and the questions to ask the owner.
13
+
14
+ Two tiers:
15
+
16
+ | Tier | Source | Result | `placeholder` |
17
+ | ---- | -------------------------------------------------------- | ------------------------------------------ | ------------- |
18
+ | 1 | the profile | realistic sample content for the category | `true` |
19
+ | 2 | `_site.mdx` + the owner's answers (`content/_intake.yaml`) | the company's own first draft | by the rule in Step 2.4 |
20
+
21
+ `placeholder: true` in a page's frontmatter makes the site render a
22
+ **PLACEHOLDER — REPLACE BEFORE LAUNCH** label at the top of the page.
23
+ The label is for people. Structured data reaches agents without it, so
24
+ tier-1 content must be safe to publish by itself (see the never-invent
25
+ list).
26
+
27
+ ## Inputs
28
+
29
+ - **The page file** — `content/<locale>/<Type>/<slug>.mdx`. It must
30
+ already exist; `add-page` creates pages.
31
+ - **The page type** — the frontmatter `type`.
32
+ - **The profile slug** — a file under `profiles/` (e.g. `plumbing`).
33
+ Ask if the user did not name one. If there is no profile for their
34
+ category, say so and stop.
35
+ - **The tier** — 1 unless the user asks for their own copy.
36
+
37
+ ## What never changes
38
+
39
+ - The page's **section stack**: every section's `id` and `type`, in
40
+ order. Never add, remove or reorder a section. The starter's manifest
41
+ records each page's sections, and a changed stack fails its check.
42
+ - Each section's **layout options** that are already present:
43
+ `variant`, `columns`, `layout`, `initialOpen`, `size` and the like.
44
+ They are the site's locked look.
45
+ - Link targets (`href`) that are already present, except a link to a
46
+ Service page, which follows that page's slug (Step 1.3).
47
+ - `{/* … */}` comments in the MDX body.
48
+ - `_site.mdx`. Identity strings (the company name) are read from it,
49
+ never written to it.
50
+
51
+ ## Never invent (tier 1)
52
+
53
+ At tier 1, write none of these. Remove any you find in the page:
54
+
55
+ - `price`, `priceCurrency`, `availability` or `stripe` — each feeds the
56
+ schema.org `Offer` an agent quotes as the company's price.
57
+ - A person's name or another company's name.
58
+ - A phone number, a street address, or a licence or registration number.
59
+ - A town, a county, or a distance: the service area is a company fact.
60
+ - Testimonials: `author` is the literal `Sample customer`; no `company`,
61
+ `rating` or `avatar`.
62
+ - Statistics a reader would take as measured (a count of jobs, a years
63
+ figure). Use the profile's `proof[]` labels as words, not numbers.
64
+
65
+ The company name is the one identity string tier 1 may write, and it
66
+ comes from `_site.mdx` `siteIdentity.name`.
67
+
68
+ ## Step 0 — Read
69
+
70
+ 1. Read the profile: `profiles/<slug>.yaml`.
71
+ 2. Read `content/_site.mdx` for `siteIdentity.name`.
72
+ 3. Read the page file. Note its stack (`sections[].type` in order).
73
+ 4. For each section type in the stack, read its data schema: the
74
+ `<Type>SectionDataSchema` (or `<Type>DataSchema`) export in the
75
+ installed `@working-theory/validation`'s `schemas/page-sections`. Fill
76
+ only fields the schema declares. Every field a section renders from
77
+ copy gets content; a field the source page did not use stays unused.
78
+ 5. Find the route that renders this page type under `apps/web/app/[locale]/`
79
+ and read its `bodyMode`. When it is `"mdx-body"`, the MDX body is
80
+ rendered and must be filled too. Otherwise the body is a short note,
81
+ and you rewrite it as one plain sentence that names no braces.
82
+
83
+ `references/section-sources.md` maps each section type to the profile
84
+ fields and intake answers that fill it.
85
+
86
+ ## Step 1 — Tier 1: sample content
87
+
88
+ 1. **Sections.** For each section, in place, write every copy field from
89
+ the profile using `references/section-sources.md`:
90
+ - offerings → `items` entries (`title` = the offering `name`,
91
+ `description` = its `job`, `link.href` = `/services/<kebab name>`);
92
+ - vocabulary → headlines, eyebrows and FAQ questions (the buyer's own
93
+ words: the `problem` list for what went wrong, `outcome` for what
94
+ they get);
95
+ - proof → `stats` labels and `testimonials` quotes, under the
96
+ never-invent list.
97
+ Keep `id`, `type` and every layout option.
98
+ 2. **Frontmatter.** Rewrite `title` and `description` without braces.
99
+ Use the company name from `_site.mdx` where the page names the
100
+ company. On a page that carries `provider.name`, set it to the company
101
+ name. Drop `schema.areaServed`; set `schema.serviceType` to the
102
+ offering name. Remove every key the never-invent list names.
103
+ 3. **Service pages.** A `Service` page is one offering. The user names
104
+ the offering, or you take the first profile offering that no other
105
+ Service page carries yet. Set `title` and `schema.serviceType` to the
106
+ offering `name`, and `slug` and the file name to its name in kebab
107
+ case (`Drain clearing` → `drain-clearing`): rename the file, never
108
+ copy it. To give every offering a page, the user first adds one
109
+ Service page per offering (`add-page`, or a copy of an existing one),
110
+ then runs this skill on each.
111
+ 4. **Body.** When the route renders `mdx-body`, rewrite each paragraph
112
+ and list item under the page's existing headings in the category's
113
+ words. Keep the headings, keep the order, keep the comments. Drop
114
+ every `\{…\}` instruction. Under a price heading, say how the job is
115
+ priced (the offering's `pricing`: `quote`, `fixed`, `hourly`,
116
+ `subscription`) in words, with no figure.
117
+ 5. **Label.** Set `placeholder: true` in the frontmatter.
118
+ 6. **Check** (below).
119
+
120
+ ## Step 2 — Tier 2: the company's own draft
121
+
122
+ 1. **Ask.** Ask each `intake[]` question from the profile, in order, one
123
+ at a time. Record the answers in `content/_intake.yaml`:
124
+
125
+ ```yaml
126
+ answers:
127
+ offerings: [Drain clearing, Emergency call-out]
128
+ service_area: "…"
129
+ faq: null # unanswered
130
+ ```
131
+
132
+ A list answer stays a list. An unanswered or skipped question is
133
+ `null`. Offerings are named exactly as the profile names them.
134
+ 2. **Fill.** Fill the page as in Step 1, but from `_site.mdx` and the
135
+ answers first; the profile fills only what the answers leave open.
136
+ - A profile offering the owner does not offer appears on no page:
137
+ remove its `items` entries, and ask before deleting its Service
138
+ page (the one file this skill may delete).
139
+ - A price appears only when the owner gave one, with `priceCurrency`.
140
+ - The company name appears in each page's frontmatter (`title` or
141
+ `description`), and the service area in the home hero when given.
142
+ - A section whose sources have no answer keeps its tier-1 sample
143
+ content.
144
+ 3. **Never invent** still holds for everything the owner did not give.
145
+ Testimonials stay `Sample customer` unless the owner supplies a
146
+ customer's name with permission to publish it.
147
+ 4. **Label.** Set `placeholder: false` only when every section is filled
148
+ from company facts:
149
+ - every section type in the stack appears in the `fills` of at least
150
+ one intake item whose answer is not empty, and
151
+ - when the stack has a `hero` or `cta`, `_site.mdx` has
152
+ `siteIdentity.name`.
153
+
154
+ A page with no sections is judged on its body: a `Service` page is
155
+ cleared only when the `offerings` answer names its offering; any
156
+ other page with no sections keeps `placeholder: true`. In every other
157
+ case, keep `placeholder: true`.
158
+ 5. **Check** (below).
159
+
160
+ ## The check
161
+
162
+ Run the site's own structured-data check. It reads every content page
163
+ through the same frontmatter and section schemas the site renders with,
164
+ and validates each page's JSON-LD:
165
+
166
+ ```bash
167
+ pnpm --filter web test -- lib/__tests__/structured-data.test.tsx
168
+ ```
169
+
170
+ Then search the filled file for a `{` or `}` in any frontmatter string or
171
+ in the body outside `{/* … */}` comments. Fix everything either reports
172
+ and run both again. Stop only when both are clean.
173
+
174
+ ## What this skill does not do
175
+
176
+ - Tier 3 (the Messaging Canvas through the content pipeline).
177
+ - Create a page — use `add-page`.
178
+ - Edit `_site.mdx`, the nav or the page roster. A profile's `roster` and
179
+ `nav` entries are declared for a later step and are not applied here.
180
+ - Write a price, a name or an address the owner did not give.
@@ -0,0 +1,80 @@
1
+ # Category profile — Local Plumbing (#6640; starter-template contract § D).
2
+ # Read by the `fill-page` skill: tier 1 fills a page with labelled sample
3
+ # content from this file; tier 2 asks `intake[]` and fills from the answers.
4
+ # Twin: templates/.claude/skills/fill-page/profiles/plumbing.yaml (byte-identical).
5
+ slug: plumbing
6
+ shape: local-business-service
7
+ subtype: Plumber
8
+ secondary: Person
9
+ offerings:
10
+ - name: Drain clearing
11
+ job: Clears blocked sinks, showers, toilets and main drains, and says what caused the blockage.
12
+ pricing: quote
13
+ - name: Water heater installation
14
+ job: Removes the old tank or boiler and fits, tests and registers a new water heater.
15
+ pricing: fixed
16
+ - name: Emergency call-out
17
+ job: A plumber at the door the same day for a burst pipe, a flood or no water at all.
18
+ pricing: hourly
19
+ - name: Leak detection and repair
20
+ job: Finds the hidden leak behind a wall or under a floor and fixes it with the least damage.
21
+ pricing: quote
22
+ proof:
23
+ - kind: credential
24
+ label: Licensed and insured
25
+ - kind: reviews
26
+ label: Reviews from local customers
27
+ - kind: response-time
28
+ label: Same-day response on emergency calls
29
+ - kind: guarantee
30
+ label: Workmanship guaranteed
31
+ vocabulary:
32
+ problem:
33
+ - burst pipe
34
+ - blocked drain
35
+ - no hot water
36
+ - leaking tap
37
+ - low water pressure
38
+ - water stain on the ceiling
39
+ service:
40
+ - drain clearing
41
+ - water heater install
42
+ - emergency call-out
43
+ - leak repair
44
+ - pipe replacement
45
+ outcome:
46
+ - same-day fix
47
+ - hot water back on
48
+ - no water damage
49
+ - upfront quote
50
+ - tidy job, nothing left behind
51
+ roster:
52
+ - op: add
53
+ route: /emergency
54
+ pageType: BookCall
55
+ reason: Emergency jobs book a call, not a form.
56
+ - op: drop
57
+ route: /pricing
58
+ reason: Most plumbing work is quote-priced, so a price table misleads.
59
+ nav:
60
+ Services: Plumbing services
61
+ content_posture: sample
62
+ intake:
63
+ - id: offerings
64
+ ask: Which of these jobs do you take on, and is there one you do not list? (Drain clearing, water heater installation, emergency call-out, leak detection and repair.)
65
+ fills: [hero, items]
66
+ - id: service_area
67
+ ask: Which towns, postcodes or radius do you cover?
68
+ fills: [hero, cta]
69
+ - id: about
70
+ ask: How did the business start, who does the work, and what will you not take on?
71
+ fills: [content-block]
72
+ - id: proof
73
+ ask: What can a customer check — your licence, your insurance, your reviews, your response time, your guarantee?
74
+ fills: [stats, testimonials, social-proof]
75
+ - id: faq
76
+ ask: What do customers ask before they book, and what do you tell them?
77
+ fills: [faq]
78
+ - id: contact
79
+ ask: How should a customer reach you — phone, form or booking — and how fast do you reply?
80
+ fills: [cta]
@@ -0,0 +1,41 @@
1
+ # Section sources
2
+
3
+ Where each section's copy comes from. **Profile** is tier 1's source;
4
+ **Intake** lists the `intake[]` answers that fill the section at tier 2
5
+ (the same ids appear in each question's `fills`). Fields not named here
6
+ are layout options: keep them as they are.
7
+
8
+ | Section type | Copy fields | Profile (tier 1) | Intake (tier 2) |
9
+ | --------------- | --------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------- |
10
+ | `hero` | `eyebrow`, `headline`, `subheadline`, `primaryCta.label`, `secondaryCta.label` | `vocabulary.problem` + `vocabulary.outcome` for the headline; the category name for the eyebrow | `offerings`, `service_area` |
11
+ | `items` | `headline`, `description`, `items[].title`, `items[].description`, `items[].link` | one item per `offerings[]` entry: `title` = `name`, `description` = `job`, `link.href` = `/services/<kebab name>` | `offerings` |
12
+ | `cta` | `headline`, `description`, `primaryCta.label`, `secondaryCta.label` | `vocabulary.outcome` | `service_area`, `contact` |
13
+ | `content-block` | `eyebrow`, `headline`, `body` | `proof[].label` and `vocabulary.service`, with no names, places or numbers | `about` |
14
+ | `faq` | `headline`, `items[].question`, `items[].answer` | questions in `vocabulary.problem` words; answers from `offerings[].pricing` and `proof[]` | `faq` |
15
+ | `stats` | `headline`, `items[].label`, `items[].value` | `proof[].label` as the label; a value only when it is not a measurement (e.g. `Same day`) | `proof` |
16
+ | `testimonials` | `headline`, `items[].quote`, `items[].author` | quotes in `vocabulary.outcome` words; `author: Sample customer`; no `company`, `rating` or `avatar` | `proof` |
17
+ | `social-proof` | `headline`, labels | `proof[].label` | `proof` |
18
+
19
+ A section type not in this table: fill its copy fields from the profile's
20
+ `vocabulary` and leave its data otherwise as it was. At tier 2 no intake
21
+ answer fills it, so a page carrying it keeps `placeholder: true`.
22
+
23
+ ## Frontmatter
24
+
25
+ | Key | Tier 1 | Tier 2 |
26
+ | ---------------------- | -------------------------------------------------- | ------------------------------------------- |
27
+ | `title`, `description` | the category's words; the company name from `_site.mdx` where the page names the company | the company name and the owner's answers |
28
+ | `provider.name` | `siteIdentity.name` | `siteIdentity.name` |
29
+ | `schema.serviceType` | the offering `name` | the offering `name` |
30
+ | `schema.areaServed` | removed | the `service_area` answer |
31
+ | `price`, `priceCurrency`, `availability`, `stripe` | removed | only a price the owner gave, with its currency |
32
+ | `placeholder` | `true` | by the rule in `SKILL.md` Step 2.4 |
33
+
34
+ ## Pricing words (Service bodies, FAQ answers)
35
+
36
+ | `pricing` | Say |
37
+ | -------------- | ------------------------------------------------------------------- |
38
+ | `quote` | priced after a look at the job; the quote is given before work starts |
39
+ | `fixed` | one fixed price for the job, agreed before work starts |
40
+ | `hourly` | charged by the hour on site, with the call-out rate stated up front |
41
+ | `subscription` | a regular plan, billed on a schedule |