create-ailk 0.8.0 → 0.10.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 (238) hide show
  1. package/README.md +71 -3
  2. package/component-catalog.json +279 -45
  3. package/dist/add-module.d.ts +20 -0
  4. package/dist/add-module.js +43 -7
  5. package/dist/add-route.d.ts +56 -0
  6. package/dist/add-route.js +286 -0
  7. package/dist/apply-design-md.d.ts +7 -0
  8. package/dist/apply-design-md.js +50 -0
  9. package/dist/apply-design.d.ts +64 -0
  10. package/dist/apply-design.js +273 -0
  11. package/dist/claude-md.d.ts +111 -0
  12. package/dist/claude-md.js +334 -0
  13. package/dist/cli.js +104 -5
  14. package/dist/derive-architecture.js +41 -36
  15. package/dist/design-compile.d.ts +71 -0
  16. package/dist/design-compile.js +98 -0
  17. package/dist/design-package.d.ts +83 -0
  18. package/dist/design-package.js +468 -0
  19. package/dist/design-presets.d.ts +86 -0
  20. package/dist/design-presets.js +642 -0
  21. package/dist/design-scaffold.d.ts +76 -0
  22. package/dist/design-scaffold.js +220 -0
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.js +4 -1
  25. package/dist/legacy-nav-renderers.d.ts +45 -0
  26. package/dist/legacy-nav-renderers.js +545 -0
  27. package/dist/lib/auth-secret-file.d.ts +19 -0
  28. package/dist/lib/auth-secret-file.js +112 -0
  29. package/dist/lib/design-checks.d.ts +78 -0
  30. package/dist/lib/design-checks.js +174 -0
  31. package/dist/lib/license-key-files.d.ts +9 -0
  32. package/dist/lib/license-key-files.js +2 -2
  33. package/dist/lib/module-license-gate.d.ts +48 -32
  34. package/dist/lib/module-license-gate.js +117 -8
  35. package/dist/lib/render-verdict.d.ts +52 -0
  36. package/dist/lib/render-verdict.js +77 -0
  37. package/dist/lib/scaffold-render-sweep.d.ts +105 -0
  38. package/dist/lib/scaffold-render-sweep.js +236 -0
  39. package/dist/module-architecture.d.ts +19 -16
  40. package/dist/module-architecture.js +67 -23
  41. package/dist/parse-args.d.ts +12 -2
  42. package/dist/parse-args.js +74 -13
  43. package/dist/programmatic.d.ts +30 -6
  44. package/dist/programmatic.js +216 -19
  45. package/dist/site-chrome.d.ts +19 -9
  46. package/dist/site-chrome.js +23 -13
  47. package/dist/site-manifest.d.ts +25 -0
  48. package/dist/site-manifest.js +254 -0
  49. package/dist/site-roster.d.ts +41 -0
  50. package/dist/site-roster.js +141 -8
  51. package/dist/starter-grid.d.ts +16 -63
  52. package/dist/starter-grid.js +102 -84
  53. package/dist/surfaces.d.ts +41 -9
  54. package/dist/surfaces.js +200 -83
  55. package/dist/template-manifest.d.ts +30 -13
  56. package/dist/template-manifest.js +53 -28
  57. package/package.json +6 -3
  58. package/release-scope.json +25 -0
  59. package/site-templates/_base/content/en/UseCase/persona-1.mdx +7 -6
  60. package/site-templates/_base/content/en/UseCase/persona-2.mdx +7 -6
  61. package/site-templates/_base/content/en/UseCase/persona-3.mdx +7 -6
  62. package/site-templates/designs/minimalism/DESIGN.md +98 -6
  63. package/site-templates/designs/minimalism/sample/README.md +48 -0
  64. package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +1 -1
  65. package/site-templates/designs/standard/DESIGN.md +98 -6
  66. package/site-templates/marketing-site/DESIGN.md +98 -6
  67. package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +60 -27
  68. package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +50 -30
  69. package/site-templates/marketing-site-free/DESIGN.md +98 -6
  70. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +60 -24
  71. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +44 -27
  72. package/site-templates/marketing-site-free/ailk-template.json +1 -1
  73. package/site-templates/saas-product/DESIGN.md +98 -6
  74. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +127 -18
  75. package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +74 -20
  76. package/site-templates/shapes/local-business-service/ailk-template.json +1 -1
  77. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +127 -18
  78. package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +74 -20
  79. package/site-templates/shapes/organization-service/ailk-template.json +1 -1
  80. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +127 -18
  81. package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +75 -21
  82. package/site-templates/shapes/person-service/ailk-template.json +1 -1
  83. package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +1 -1
  84. package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +2 -2
  85. package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +4 -2
  86. package/site-templates/shapes/person-service/content/en/ServicesList/services.mdx +1 -1
  87. package/templates/.claude/agents/web.md +10 -8
  88. package/templates/.claude/rules/architecture.md +17 -7
  89. package/templates/.claude/skills/README.md +3 -2
  90. package/templates/.claude/skills/add-auth/SKILL.md +142 -90
  91. package/templates/.claude/skills/add-auth/references/env-vars.md +32 -17
  92. package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +17 -8
  93. package/templates/.claude/skills/add-page/SKILL.md +241 -238
  94. package/templates/.claude/skills/add-page/references/page-types.md +94 -86
  95. package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
  96. package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
  97. package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
  98. package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
  99. package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
  100. package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
  101. package/templates/.claude/skills/check-site/SKILL.md +51 -18
  102. package/templates/.claude/skills/check-site/references/common-errors.md +12 -9
  103. package/templates/.claude/skills/check-site/references/findings-glossary.md +4 -4
  104. package/templates/.claude/skills/check-site/references/severity-levels.md +3 -3
  105. package/templates/.claude/skills/fill-page/SKILL.md +26 -7
  106. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
  107. package/templates/.claude/skills/setup-deploy/SKILL.md +75 -38
  108. package/templates/.claude/skills/update-page/SKILL.md +117 -0
  109. package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
  110. package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
  111. package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
  112. package/templates/.env.example +23 -2
  113. package/templates/.github/workflows/ci.yml +4 -0
  114. package/templates/.prettierignore +1 -0
  115. package/templates/CLAUDE.md +146 -103
  116. package/templates/DESIGN.md +98 -6
  117. package/templates/README.md +50 -38
  118. package/templates/apps/api/.env.example +2 -1
  119. package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
  120. package/templates/apps/api/src/__tests__/server.test.ts +116 -0
  121. package/templates/apps/api/src/lib/stripe.ts +9 -0
  122. package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
  123. package/templates/apps/api/src/middleware/auth.ts +54 -0
  124. package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
  125. package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
  126. package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
  127. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
  128. package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
  129. package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
  130. package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
  131. package/templates/apps/api/src/server.ts +28 -0
  132. package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
  133. package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
  134. package/templates/apps/api/src/services/revalidation.ts +60 -15
  135. package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
  136. package/templates/apps/mcp/src/tools/purchase.ts +4 -2
  137. package/templates/apps/web/.env.example +13 -0
  138. package/templates/apps/web/CLAUDE.md +22 -28
  139. package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
  140. package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
  141. package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
  142. package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
  143. package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
  144. package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
  145. package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
  146. package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
  147. package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +4 -3
  148. package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
  149. package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
  150. package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
  151. package/templates/apps/web/app/[locale]/layout.tsx +35 -19
  152. package/templates/apps/web/app/[locale]/newsletter/page.tsx +1 -1
  153. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +1 -1
  154. package/templates/apps/web/app/[locale]/portfolio/page.tsx +1 -1
  155. package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
  156. package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
  157. package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
  158. package/templates/apps/web/app/api/revalidate/route.ts +78 -36
  159. package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
  160. package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
  161. package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
  162. package/templates/apps/web/lib/locale-guard.ts +18 -0
  163. package/templates/apps/web/lib/meet-placeholder.ts +5 -0
  164. package/templates/apps/web/lib/nav-config.ts +14 -13
  165. package/templates/apps/web/lib/site-brand.tsx +13 -9
  166. package/templates/apps/web/lib/site-logo.tsx +36 -0
  167. package/templates/apps/web/lib/site-theme.ts +46 -26
  168. package/templates/apps/web/messages/en.json +23 -9
  169. package/templates/apps/web/middleware.ts +28 -4
  170. package/templates/content/en/BookCall/book-a-call.mdx +80 -0
  171. package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
  172. package/templates/content/en/BookCall/onsite-service.mdx +56 -0
  173. package/templates/content/en/BookCall/start-project.mdx +56 -0
  174. package/templates/content/en/ContactPage/contact.mdx +40 -1
  175. package/templates/content/en/HomePage/home.mdx +2 -6
  176. package/templates/content/en/LandingPage/meet.mdx +59 -0
  177. package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
  178. package/templates/database/CHANGELOG.md +7 -0
  179. package/templates/database/package.json +1 -1
  180. package/templates/package.json +4 -1
  181. package/templates/tools/check-claude-md.ts +128 -0
  182. package/versions.json +33 -33
  183. package/dist/modules/commerce/0.6.0.tar.gz +0 -0
  184. package/dist/modules/commerce/0.6.1.tar.gz +0 -0
  185. package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
  186. package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
  187. package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
  188. package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
  189. package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
  190. package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
  191. package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
  192. package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
  193. package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
  194. package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
  195. package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
  196. package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
  197. package/dist/modules/workspace/0.6.0.tar.gz +0 -0
  198. package/dist/modules/workspace/0.6.1.tar.gz +0 -0
  199. package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -52
  200. package/site-templates/minimalism-site/DESIGN.md +0 -162
  201. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +0 -506
  202. package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -458
  203. package/site-templates/minimalism-site/ailk-template.json +0 -23
  204. package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
  205. package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -52
  206. package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
  207. package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
  208. package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
  209. package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
  210. package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -123
  211. package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
  212. package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
  213. package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
  214. package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
  215. package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +0 -38
  216. package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +0 -38
  217. package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +0 -38
  218. package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +0 -73
  219. package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
  220. package/site-templates/minimalism-site/provenance.json +0 -4
  221. package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
  222. package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +0 -175
  223. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +0 -8
  224. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +0 -12
  225. package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +0 -12
  226. package/templates/apps/web/app/[locale]/book-a-call/page.tsx +0 -50
  227. package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
  228. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
  229. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
  230. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
  231. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
  232. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
  233. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
  234. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
  235. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
  236. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
  237. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
  238. /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
@@ -31,9 +31,8 @@ export interface AliasDifferences {
31
31
  /**
32
32
  * Further positioned groups (#6757 D7): each group's rows go before its
33
33
  * own `before` route, applied group by group in array order, AFTER `add`
34
- * is placed. The one alias that needs more than one anchor
35
- * (`minimalism-site`, which interleaves rows at two separate points in the
36
- * shape's row order) uses this; every other alias leaves it unset.
34
+ * is placed — for an alias that interleaves rows at more than one point
35
+ * in the shape's row order. No alias in the table below needs it today.
37
36
  */
38
37
  readonly insert?: readonly {
39
38
  readonly before: string;
@@ -56,6 +55,15 @@ export interface TemplateAlias {
56
55
  readonly categories: readonly CategorySlug[];
57
56
  readonly layout?: TemplateLayout;
58
57
  readonly differences?: AliasDifferences;
58
+ /**
59
+ * Whether this alias ships its own `site-templates/<name>/` tree (spec 6892
60
+ * D1). Absent means `true` — every alias today keeps its own directory.
61
+ * `false` declares that the alias resolves purely from the
62
+ * grid: its seed layer is its shape's tree (`templateTreeDir`), and its
63
+ * generated roster record lives under `site-templates/aliases/` rather
64
+ * than a directory of its own (`shippedManifestPath`).
65
+ */
66
+ readonly ownTree?: boolean;
59
67
  }
60
68
  /**
61
69
  * Each buildable shape's standard roster (#6753 D3) — the rows an alias starts
@@ -64,7 +72,9 @@ export interface TemplateAlias {
64
72
  * `organization-product` is today's base roster, the `/blog` teaser and the
65
73
  * portfolio pair. `organization-service`, `local-business-service` (#6757)
66
74
  * and `person-service` (#6758, roadmap § 6 Phase 2) are each their own rows,
67
- * the `/blog` teaser and the portfolio pair.
75
+ * the `/blog` teaser and the portfolio pair. Every shape's own rows carry
76
+ * `/sign-in` and `/sign-up` (#6797): the locale layout's header links both on
77
+ * every shape, so the roster of record lists them as code routes.
68
78
  */
69
79
  export declare const SHAPE_ROSTERS: Readonly<Record<BuildableShape, readonly TemplateRosterRow[]>>;
70
80
  /**
@@ -116,7 +126,7 @@ export declare const ALIASES: Readonly<{
116
126
  readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors"];
117
127
  readonly categories: readonly ["accounting", "legal", "consulting", "hvac", "roofing", "plumbing", "electrical", "landscaping", "auto-repair", "real-estate", "technology", "medical-specialty"];
118
128
  readonly differences: {
119
- readonly drop: readonly ["/blog"];
129
+ readonly drop: readonly ["/blog", "/meet", "/meet/[slug]"];
120
130
  readonly add: readonly import("./module-architecture.js").PageRosterRow[];
121
131
  readonly before: "/portfolio";
122
132
  };
@@ -136,68 +146,11 @@ export declare const ALIASES: Readonly<{
136
146
  readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors", "multi-tenant"];
137
147
  readonly categories: readonly ["technology", "medical-specialty"];
138
148
  readonly differences: {
139
- readonly drop: readonly ["/blog"];
149
+ readonly drop: readonly ["/blog", "/meet", "/meet/[slug]"];
140
150
  readonly add: readonly import("./module-architecture.js").PageRosterRow[];
141
151
  readonly before: "/portfolio";
142
152
  };
143
153
  };
144
- /**
145
- * The second Pro template (#5589) — the reports-first, scroll-snap deck
146
- * site. NOT `marketing-site` plus a module: its `modules` omit `docs-blog`,
147
- * so the two Pro templates are siblings under `_base` (#5618 D2), never a
148
- * lineage. Level still derives from `modules`: `scheduling` and
149
- * `signal-collectors` are paid, so `templateDelivery` returns `"paid"`
150
- * exactly as it does for `marketing-site`.
151
- *
152
- * It composes the `organization-service` shape roster (#6757) rather than
153
- * the organization-product one: the deck home replaces the document-scroll
154
- * home, and `/how-it-works`, the product page, `/pricing` and `/sign-in`
155
- * are not pages this site has. The roster is what the
156
- * template IS, so an unrostered page has neither a route directory
157
- * (`rosterSurfaces`) nor its `_base`/overlay seed (#6646 D1).
158
- *
159
- * It declares NO `layout` block (#6638): the deck home, mark-only nav and
160
- * centered footer are the `minimalism` design's, supplied by
161
- * `DESIGN_LAYOUTS` from `design:` — the look any shape can wear. The
162
- * roster rows the `organization-service` shape does not derive
163
- * (`/reports`, `/referral`) are recorded with their reasons in this
164
- * template's TEMPLATE-MANIFEST.md § 3a.
165
- *
166
- * `/reports` and `/referral` carry no `GATEABLE_SURFACES` entry and need
167
- * none: both are single-segment `LandingPage` slugs served by the generic
168
- * `[slug]` route (#5469 D2), the same mechanism Free's `/how-it-works`
169
- * uses. `/reports/[slug]` (the reader) is the signal-collectors module's
170
- * own contributed row.
171
- *
172
- * `/services/[slug]` declares its seed DIRECTORY as `contentDir`
173
- * (`content/en/Service`, as `routes-map.ts` records it). The three
174
- * samples ride the template tree unmapped, landing at that directory.
175
- *
176
- * Since #6757, `organization-service` carries a real standard roster
177
- * (D1), so this alias's `differences` is additions and drops only: it
178
- * drops the `/blog` teaser (a Pro alias does not upsell its own level,
179
- * D8) and the portfolio pair (the reports are the proof, not a
180
- * portfolio), adds the signal-collectors samples, and INSERTS its two own
181
- * rows — `/reports` before `/about`, `/referral` before `/faq` (D7) — to
182
- * reproduce its pre-#6757 row order (§ 1.2) exactly.
183
- */
184
- readonly "minimalism-site": {
185
- readonly shape: "organization-service";
186
- readonly design: "minimalism";
187
- readonly modules: readonly ["marketing", "scheduling", "signal-collectors"];
188
- readonly categories: readonly ["real-estate", "technology", "legal"];
189
- readonly differences: {
190
- readonly drop: readonly ["/blog", "/portfolio", "/portfolio/[slug]"];
191
- readonly add: readonly import("./module-architecture.js").PageRosterRow[];
192
- readonly insert: readonly [{
193
- readonly before: "/about";
194
- readonly rows: readonly [import("./module-architecture.js").PageRosterRow];
195
- }, {
196
- readonly before: "/faq";
197
- readonly rows: readonly [import("./module-architecture.js").PageRosterRow];
198
- }];
199
- };
200
- };
201
154
  }>;
202
155
  /**
203
156
  * The coordinates a keyless `--shape S` builds (#6757 D5) — the composed
@@ -1,10 +1,13 @@
1
1
  /**
2
- * The three pages every starter carries whatever its shape (#6658 D5,
3
- * `docs/decisions/starter-roster-page-set.md` D4/D7): a glossary, a newsletter
4
- * signup and a book-a-call page. Each is a module-less `GATEABLE_SURFACES`
5
- * entry the roster enables, with its seed in `_base`. A template carrying the
6
- * scheduling module overrides `BookCall/book-call.mdx` in its own tree, so the
7
- * call to action opens `/meet` rather than `/contact`.
2
+ * The two pages every starter carries whatever its shape (#6658 D5,
3
+ * `docs/decisions/starter-roster-page-set.md` D4/D7): a glossary and a
4
+ * newsletter signup. Each is a module-less `GATEABLE_SURFACES` entry the
5
+ * roster enables, with its seed in `_base`.
6
+ *
7
+ * The third — `/book-a-call` — was retired by #6897 D10: every scaffold's
8
+ * former `/book-a-call` link now points at `/meet/book-a-call`, served by
9
+ * `FREE_MEET_PLACEHOLDER_ROWS` below (a Free placeholder) or by the
10
+ * scheduling module's own live `/meet/[slug]` page.
8
11
  */
9
12
  const SHAPE_INDEPENDENT_ROWS = [
10
13
  { route: "/glossary", content: ["content/en/GlossaryList/glossary.mdx"] },
@@ -12,7 +15,37 @@ const SHAPE_INDEPENDENT_ROWS = [
12
15
  route: "/newsletter",
13
16
  content: ["content/en/NewsletterSignup/newsletter.mdx"],
14
17
  },
15
- { route: "/book-a-call", content: ["content/en/BookCall/book-call.mdx"] },
18
+ ];
19
+ /**
20
+ * The Free `/meet` placeholder pages (#6897 D5) — a meeting-types hub
21
+ * (`LandingPage`, served by the generic `[slug]` route) and its four
22
+ * `BookCall` detail seeds (served by the `[slug]/[detail]` route, D2). Both
23
+ * ship in the always-copied overlay, beside `FREE_BLOG_TEASER_ROW`, so a
24
+ * template-less scaffold's Contact tiles (which link `/meet/*` too) reach
25
+ * real pages. The second row uses an explicit `content` list, not
26
+ * `contentDir`, because only a `content`-list row is removed by
27
+ * `planRosterAppend`'s add-module supersede (F4's add-module half,
28
+ * `site-roster.ts`).
29
+ *
30
+ * Every alias that takes the `scheduling` module drops `"/meet"` and
31
+ * `"/meet/[slug]"` (D5) — otherwise `mergeRoster` refuses the duplicate
32
+ * route the module's own rows also contribute. The ROWS go; the SEEDS stay
33
+ * (#6942, operator 2026-09-28, partly reversing D5): until
34
+ * `SCHEDULING_CAL_LINK` is configured the module's pages hand off to the Free
35
+ * placeholder routes, which serve these seeds. `withMeetPlaceholderSeeds`
36
+ * (`site-roster.ts`) folds them onto the module's rows.
37
+ */
38
+ const FREE_MEET_PLACEHOLDER_ROWS = [
39
+ { route: "/meet", content: ["content/en/LandingPage/meet.mdx"] },
40
+ {
41
+ route: "/meet/[slug]",
42
+ content: [
43
+ "content/en/BookCall/book-a-call.mdx",
44
+ "content/en/BookCall/onsite-estimate.mdx",
45
+ "content/en/BookCall/start-project.mdx",
46
+ "content/en/BookCall/onsite-service.mdx",
47
+ ],
48
+ },
16
49
  ];
17
50
  /**
18
51
  * The rows every `organization-product` template brings itself — one declared
@@ -26,17 +59,17 @@ const SHAPE_INDEPENDENT_ROWS = [
26
59
  *
27
60
  * Two layers, one roster:
28
61
  *
29
- * - `/`, `/software/[slug]`, `/use-cases`, `/about`, `/faq`, `/contact` and
62
+ * - `/`, `/software/[slug]`, `/for`, `/about`, `/faq`, `/contact` and
30
63
  * `/purchase-policy` take their content from the overlay
31
64
  * (`template-overlay/content/en/**`, copied whole into `templates/` by
32
65
  * `build-templates.mjs`). `/features` is the FeaturesList hub over one
33
66
  * Feature page per feature at `/features/[slug]` (#6721, reversing the
34
67
  * single `/software/product` page of #6658 D3); both ride the `features`
35
68
  * surface the roster enables.
36
- * `/use-cases` lists the three UseCase pages at `/use-cases/[slug]`
69
+ * `/for` lists the three UseCase pages at `/for/[slug]`
37
70
  * (#6658 D4).
38
71
  * - `/pricing`, `/privacy`, `/terms`, `/glossary`, `/newsletter`,
39
- * `/book-a-call` and the three UseCase pages take their content from the
72
+ * and the three UseCase pages take their content from the
40
73
  * base layer (`site-templates/_base/content/**`, #5618 D1), which every
41
74
  * template reaches by declaring `extends` — installed before the module
42
75
  * bundles and the template's own tree, so a template may override a base
@@ -70,10 +103,11 @@ const TEMPLATE_BASE_ROSTER = [
70
103
  { route: "/features", content: ["content/en/FeaturesList/features.mdx"] },
71
104
  { route: "/features/[slug]", contentDir: "content/en/Feature" },
72
105
  {
73
- route: "/use-cases",
74
- content: ["content/en/UseCasesList/use-cases.mdx"],
106
+ // #6878 D7 — the persona hub, renamed from /use-cases.
107
+ route: "/for",
108
+ content: ["content/en/UseCasesList/for.mdx"],
75
109
  },
76
- { route: "/use-cases/[slug]", contentDir: "content/en/UseCase" },
110
+ { route: "/for/[slug]", contentDir: "content/en/UseCase" },
77
111
  { route: "/pricing", content: ["content/en/Pricing/pricing.mdx"] },
78
112
  { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
79
113
  { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
@@ -128,7 +162,7 @@ const SIGNAL_COLLECTORS_SAMPLE_ROWS = [
128
162
  * 2026-09-25, reversing #6687's "Pro and up"): every shape roster below
129
163
  * carries them, and an alias sheds them only by an explicit `drop`. The seeds
130
164
  * live in the `_base` layer under `content/en/PortfolioItem/`; the detail
131
- * row's `contentDir` installs them (#6646 D1), exactly as `/use-cases/[slug]`
165
+ * row's `contentDir` installs them (#6646 D1), exactly as `/for/[slug]`
132
166
  * serves `content/en/UseCase`.
133
167
  */
134
168
  // NO_HAND_IMPLEMENT_OK: /build-starter operator-directed live pass (#6687).
@@ -137,40 +171,56 @@ const PORTFOLIO_ROWS = [
137
171
  { route: "/portfolio/[slug]", contentDir: "content/en/PortfolioItem" },
138
172
  ];
139
173
  /**
140
- * `minimalism-site`'s two OWN rows (#5589, shrunk from its own 17-row roster
141
- * by #6757 once the `organization-service` shape carried a standard roster of
142
- * its own): the deck's two `LandingPage` slugs, positioned by `insert` (D7)
143
- * at the two points this alias interleaves them into the shape's row order
144
- * (§ 1.2) — `/reports` before `/about`, `/referral` before `/faq`. Neither
145
- * carries a `GATEABLE_SURFACES` entry: both are single-segment slugs served
146
- * by the generic `[slug]` route (#5469 D2), the same mechanism Free's
147
- * `/how-it-works` used.
174
+ * The two report/referral sample rows. Neither carries a `GATEABLE_SURFACES`
175
+ * entry: `/referral` is a single-segment `LandingPage` slug served by the
176
+ * generic `[slug]` route (#5469 D2), the same mechanism Free's
177
+ * `/how-it-works` used, and `/reports` is its own routes-map row.
148
178
  */
149
179
  const REPORTS_ROW = {
150
180
  route: "/reports",
151
- content: ["content/en/LandingPage/reports.mdx"],
181
+ content: ["content/en/ReportsList/reports.mdx"],
152
182
  };
153
183
  const REFERRAL_ROW = {
154
184
  route: "/referral",
155
185
  content: ["content/en/LandingPage/referral.mdx"],
156
186
  };
187
+ /**
188
+ * The signal-collectors module's report/referral sample rows (spec 6892 D3):
189
+ * `/reports`, a `ReportsList` hub over the module's four `ReportPage` seeds,
190
+ * and `/referral`, a sample flow landing page. `marketing-site` and
191
+ * `saas-product` add these before `/portfolio`, alongside
192
+ * `SIGNAL_COLLECTORS_SAMPLE_ROWS`.
193
+ */
194
+ const SIGNAL_COLLECTORS_REPORT_ROWS = [
195
+ REPORTS_ROW,
196
+ REFERRAL_ROW,
197
+ ];
157
198
  /**
158
199
  * `organization-service`'s own rows (#6757 D1), derived from
159
200
  * `derive-roster.py --shape organization-service --primary-goal generate-leads
160
201
  * --registry packages/schema/src/registry/entries.ts` at harness commit
161
202
  * `7bdaf148e1b0e639cd90a80008955e55cc4aa2b5`, edited only by the deviations
162
203
  * `site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md` § 3a
163
- * records with their reasons. Row order matches `minimalism-site`'s (D3), so
164
- * that alias's `differences` are additions and drops only.
204
+ * records with their reasons.
165
205
  */
166
206
  const ORGANIZATION_SERVICE_ROWS = [
167
207
  { route: "/", content: ["content/en/HomePage/home.mdx"] },
168
208
  { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
169
209
  { route: "/services", content: ["content/en/ServicesList/services.mdx"] },
170
210
  { route: "/services/[slug]", contentDir: "content/en/Service" },
211
+ // #6878 D7 — every shape carries the /for family now, service shapes
212
+ // included: the seeds are shape-neutral (D7), so no per-shape override is
213
+ // needed.
214
+ {
215
+ route: "/for",
216
+ content: ["content/en/UseCasesList/for.mdx"],
217
+ },
218
+ { route: "/for/[slug]", contentDir: "content/en/UseCase" },
171
219
  { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
172
220
  { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
173
221
  ...SHAPE_INDEPENDENT_ROWS,
222
+ { route: "/sign-in" },
223
+ { route: "/sign-up" },
174
224
  { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] },
175
225
  { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] },
176
226
  {
@@ -187,10 +237,18 @@ const LOCAL_BUSINESS_SERVICE_ROWS = [
187
237
  { route: "/", content: ["content/en/HomePage/home.mdx"] },
188
238
  { route: "/services", content: ["content/en/ServicesList/services.mdx"] },
189
239
  { route: "/services/[slug]", contentDir: "content/en/Service" },
240
+ // #6878 D7 — every shape carries the /for family now (D7 shape-neutral seeds).
241
+ {
242
+ route: "/for",
243
+ content: ["content/en/UseCasesList/for.mdx"],
244
+ },
245
+ { route: "/for/[slug]", contentDir: "content/en/UseCase" },
190
246
  { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
191
247
  { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
192
248
  { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
193
249
  ...SHAPE_INDEPENDENT_ROWS,
250
+ { route: "/sign-in" },
251
+ { route: "/sign-up" },
194
252
  {
195
253
  route: "/purchase-policy",
196
254
  content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"],
@@ -214,10 +272,18 @@ const PERSON_SERVICE_ROWS = [
214
272
  { route: "/", content: ["content/en/HomePage/home.mdx"] },
215
273
  { route: "/services", content: ["content/en/ServicesList/services.mdx"] },
216
274
  { route: "/services/[slug]", contentDir: "content/en/Service" },
275
+ // #6878 D7 — every shape carries the /for family now (D7 shape-neutral seeds).
276
+ {
277
+ route: "/for",
278
+ content: ["content/en/UseCasesList/for.mdx"],
279
+ },
280
+ { route: "/for/[slug]", contentDir: "content/en/UseCase" },
217
281
  { route: "/about", content: ["content/en/AboutPage/about.mdx"] },
218
282
  { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] },
219
283
  { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] },
220
284
  ...SHAPE_INDEPENDENT_ROWS,
285
+ { route: "/sign-in" },
286
+ { route: "/sign-up" },
221
287
  {
222
288
  route: "/purchase-policy",
223
289
  content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"],
@@ -232,27 +298,33 @@ const PERSON_SERVICE_ROWS = [
232
298
  * `organization-product` is today's base roster, the `/blog` teaser and the
233
299
  * portfolio pair. `organization-service`, `local-business-service` (#6757)
234
300
  * and `person-service` (#6758, roadmap § 6 Phase 2) are each their own rows,
235
- * the `/blog` teaser and the portfolio pair.
301
+ * the `/blog` teaser and the portfolio pair. Every shape's own rows carry
302
+ * `/sign-in` and `/sign-up` (#6797): the locale layout's header links both on
303
+ * every shape, so the roster of record lists them as code routes.
236
304
  */
237
305
  export const SHAPE_ROSTERS = Object.freeze({
238
306
  "organization-product": [
239
307
  ...TEMPLATE_BASE_ROSTER,
240
308
  FREE_BLOG_TEASER_ROW,
309
+ ...FREE_MEET_PLACEHOLDER_ROWS,
241
310
  ...PORTFOLIO_ROWS,
242
311
  ],
243
312
  "organization-service": [
244
313
  ...ORGANIZATION_SERVICE_ROWS,
245
314
  FREE_BLOG_TEASER_ROW,
315
+ ...FREE_MEET_PLACEHOLDER_ROWS,
246
316
  ...PORTFOLIO_ROWS,
247
317
  ],
248
318
  "local-business-service": [
249
319
  ...LOCAL_BUSINESS_SERVICE_ROWS,
250
320
  FREE_BLOG_TEASER_ROW,
321
+ ...FREE_MEET_PLACEHOLDER_ROWS,
251
322
  ...PORTFOLIO_ROWS,
252
323
  ],
253
324
  "person-service": [
254
325
  ...PERSON_SERVICE_ROWS,
255
326
  FREE_BLOG_TEASER_ROW,
327
+ ...FREE_MEET_PLACEHOLDER_ROWS,
256
328
  ...PORTFOLIO_ROWS,
257
329
  ],
258
330
  });
@@ -320,8 +392,8 @@ export const ALIASES = Object.freeze({
320
392
  "medical-specialty",
321
393
  ],
322
394
  differences: {
323
- drop: ["/blog"],
324
- add: SIGNAL_COLLECTORS_SAMPLE_ROWS,
395
+ drop: ["/blog", "/meet", "/meet/[slug]"],
396
+ add: [...SIGNAL_COLLECTORS_SAMPLE_ROWS, ...SIGNAL_COLLECTORS_REPORT_ROWS],
325
397
  before: "/portfolio",
326
398
  },
327
399
  },
@@ -346,65 +418,11 @@ export const ALIASES = Object.freeze({
346
418
  ],
347
419
  categories: ["technology", "medical-specialty"],
348
420
  differences: {
349
- drop: ["/blog"],
350
- add: SIGNAL_COLLECTORS_SAMPLE_ROWS,
421
+ drop: ["/blog", "/meet", "/meet/[slug]"],
422
+ add: [...SIGNAL_COLLECTORS_SAMPLE_ROWS, ...SIGNAL_COLLECTORS_REPORT_ROWS],
351
423
  before: "/portfolio",
352
424
  },
353
425
  },
354
- /**
355
- * The second Pro template (#5589) — the reports-first, scroll-snap deck
356
- * site. NOT `marketing-site` plus a module: its `modules` omit `docs-blog`,
357
- * so the two Pro templates are siblings under `_base` (#5618 D2), never a
358
- * lineage. Level still derives from `modules`: `scheduling` and
359
- * `signal-collectors` are paid, so `templateDelivery` returns `"paid"`
360
- * exactly as it does for `marketing-site`.
361
- *
362
- * It composes the `organization-service` shape roster (#6757) rather than
363
- * the organization-product one: the deck home replaces the document-scroll
364
- * home, and `/how-it-works`, the product page, `/pricing` and `/sign-in`
365
- * are not pages this site has. The roster is what the
366
- * template IS, so an unrostered page has neither a route directory
367
- * (`rosterSurfaces`) nor its `_base`/overlay seed (#6646 D1).
368
- *
369
- * It declares NO `layout` block (#6638): the deck home, mark-only nav and
370
- * centered footer are the `minimalism` design's, supplied by
371
- * `DESIGN_LAYOUTS` from `design:` — the look any shape can wear. The
372
- * roster rows the `organization-service` shape does not derive
373
- * (`/reports`, `/referral`) are recorded with their reasons in this
374
- * template's TEMPLATE-MANIFEST.md § 3a.
375
- *
376
- * `/reports` and `/referral` carry no `GATEABLE_SURFACES` entry and need
377
- * none: both are single-segment `LandingPage` slugs served by the generic
378
- * `[slug]` route (#5469 D2), the same mechanism Free's `/how-it-works`
379
- * uses. `/reports/[slug]` (the reader) is the signal-collectors module's
380
- * own contributed row.
381
- *
382
- * `/services/[slug]` declares its seed DIRECTORY as `contentDir`
383
- * (`content/en/Service`, as `routes-map.ts` records it). The three
384
- * samples ride the template tree unmapped, landing at that directory.
385
- *
386
- * Since #6757, `organization-service` carries a real standard roster
387
- * (D1), so this alias's `differences` is additions and drops only: it
388
- * drops the `/blog` teaser (a Pro alias does not upsell its own level,
389
- * D8) and the portfolio pair (the reports are the proof, not a
390
- * portfolio), adds the signal-collectors samples, and INSERTS its two own
391
- * rows — `/reports` before `/about`, `/referral` before `/faq` (D7) — to
392
- * reproduce its pre-#6757 row order (§ 1.2) exactly.
393
- */
394
- "minimalism-site": {
395
- shape: "organization-service",
396
- design: "minimalism",
397
- modules: ["marketing", "scheduling", "signal-collectors"],
398
- categories: ["real-estate", "technology", "legal"],
399
- differences: {
400
- drop: ["/blog", "/portfolio", "/portfolio/[slug]"],
401
- add: SIGNAL_COLLECTORS_SAMPLE_ROWS,
402
- insert: [
403
- { before: "/about", rows: [REPORTS_ROW] },
404
- { before: "/faq", rows: [REFERRAL_ROW] },
405
- ],
406
- },
407
- },
408
426
  });
409
427
  /**
410
428
  * The coordinates a keyless `--shape S` builds (#6757 D5) — the composed
@@ -181,6 +181,33 @@ export declare const ROUTE_DEPENDENCIES: Readonly<Record<string, readonly string
181
181
  export declare const ROUTE_MESSAGE_NAMESPACES: Readonly<Record<string, readonly string[]>>;
182
182
  /** Template-relative path of the generated site-nav registry. */
183
183
  export declare const NAV_CONFIG_PATH = "apps/web/lib/nav-config.ts";
184
+ /**
185
+ * Verify a rendered nav's self-hashing stamp (#6908 D1/F1–F2): `"valid"` when
186
+ * the first line's hash matches every byte after it, `"invalid"` when a
187
+ * stamp line is present but the hash fails (an edited, still-stamped nav),
188
+ * `"absent"` when there is no stamp line at all. A stamp that verifies proves
189
+ * the file unedited whatever generator wrote it — the check needs only the
190
+ * file, never the generator's code.
191
+ */
192
+ export declare function readNavConfigStamp(text: string): "valid" | "invalid" | "absent";
193
+ /**
194
+ * Every byte after a nav's stamp line, or `text` unchanged when it carries
195
+ * none. The one place the D1 stamp-line shape is matched outside
196
+ * `readNavConfigStamp` itself, so a test simulating an edit below the stamp
197
+ * (or a bare pre-D1 body) never re-derives `NAV_STAMP_RE`'s pattern by hand.
198
+ */
199
+ export declare function stripNavConfigStamp(text: string): string;
200
+ /** Options for `renderNavConfig` (#6878 D6). */
201
+ export interface RenderNavConfigOptions {
202
+ /**
203
+ * Service page slugs — the basenames, minus `.mdx`, of a site's
204
+ * `content/en/Service/*.mdx` — for the Services flyout column on a
205
+ * service shape. Sorted, then cut to the first three. Absent/empty →
206
+ * the offering column emits no Services links even when the `services`
207
+ * surface is on (there is nothing to link yet).
208
+ */
209
+ serviceSlugs?: readonly string[];
210
+ }
184
211
  /**
185
212
  * Render `apps/web/lib/nav-config.ts` for an enabled surface set.
186
213
  *
@@ -191,14 +218,19 @@ export declare const NAV_CONFIG_PATH = "apps/web/lib/nav-config.ts";
191
218
  * surface set for the same reason the route tree does.
192
219
  *
193
220
  * The base items are the Free marketing-site chrome (#5469 D5, the approved
194
- * chrome diff recorded on that card, re-pointed by #6658 D8):
195
- * a Product flyout in two columns (Features · Use Cases, #6721), then Blog,
196
- * Pricing and About. The feature and use-case links ride the `features` and
197
- * `use-cases` surfaces; `/blog` is always linked (the teaser or the docs-blog
198
- * module serves it). Pricing is gateable
199
- * surfaces: each item is emitted only when its surface is enabled (a template
200
- * roster enables it, #5469 D10), so the nav still never links a page the
201
- * scaffold does not carry.
221
+ * chrome diff recorded on that card, re-pointed by #6658 D8, then by #6878 D6):
222
+ * ONE flyout rule for every shape — an offering column (Features on product
223
+ * shapes, Services on service shapes) beside a Customers column linking the
224
+ * /for persona pages — then Blog, Pricing and About. `/blog` is always linked
225
+ * (the teaser or the docs-blog module serves it). Pricing and every other
226
+ * gateable surface: each item is emitted only when its surface is enabled (a
227
+ * template roster enables it, #5469 D10), so the nav still never links a page
228
+ * the scaffold does not carry. Portfolio is never a flyout link (D6): on a
229
+ * service shape it is a plain top-level link directly after the Services
230
+ * flyout, and every shape's footer Site pages column links it (#6895), both
231
+ * under the `portfolio` surface's gate. No empty flyout is ever emitted: with
232
+ * neither column non-empty, no flyout item is emitted at all (closes #6766's
233
+ * AC-1).
202
234
  *
203
235
  * Only gateable surfaces carrying a `navLabelKey` are linked after the base
204
236
  * items, because a nav entry needs a translated label. Emitting an entry whose
@@ -212,4 +244,4 @@ export declare const NAV_CONFIG_PATH = "apps/web/lib/nav-config.ts";
212
244
  * Deterministic: gateable entries follow GATEABLE_SURFACES order (alphabetical
213
245
  * by id), after the fixed base items.
214
246
  */
215
- export declare function renderNavConfig(enabled: string[]): string;
247
+ export declare function renderNavConfig(enabled: string[], options?: RenderNavConfigOptions): string;