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.
- package/README.md +71 -3
- package/component-catalog.json +279 -45
- package/dist/add-module.d.ts +20 -0
- package/dist/add-module.js +43 -7
- package/dist/add-route.d.ts +56 -0
- package/dist/add-route.js +286 -0
- package/dist/apply-design-md.d.ts +7 -0
- package/dist/apply-design-md.js +50 -0
- package/dist/apply-design.d.ts +64 -0
- package/dist/apply-design.js +273 -0
- package/dist/claude-md.d.ts +111 -0
- package/dist/claude-md.js +334 -0
- package/dist/cli.js +104 -5
- package/dist/derive-architecture.js +41 -36
- package/dist/design-compile.d.ts +71 -0
- package/dist/design-compile.js +98 -0
- package/dist/design-package.d.ts +83 -0
- package/dist/design-package.js +468 -0
- package/dist/design-presets.d.ts +86 -0
- package/dist/design-presets.js +642 -0
- package/dist/design-scaffold.d.ts +76 -0
- package/dist/design-scaffold.js +220 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/legacy-nav-renderers.d.ts +45 -0
- package/dist/legacy-nav-renderers.js +545 -0
- package/dist/lib/auth-secret-file.d.ts +19 -0
- package/dist/lib/auth-secret-file.js +112 -0
- package/dist/lib/design-checks.d.ts +78 -0
- package/dist/lib/design-checks.js +174 -0
- package/dist/lib/license-key-files.d.ts +9 -0
- package/dist/lib/license-key-files.js +2 -2
- package/dist/lib/module-license-gate.d.ts +48 -32
- package/dist/lib/module-license-gate.js +117 -8
- package/dist/lib/render-verdict.d.ts +52 -0
- package/dist/lib/render-verdict.js +77 -0
- package/dist/lib/scaffold-render-sweep.d.ts +105 -0
- package/dist/lib/scaffold-render-sweep.js +236 -0
- package/dist/module-architecture.d.ts +19 -16
- package/dist/module-architecture.js +67 -23
- package/dist/parse-args.d.ts +12 -2
- package/dist/parse-args.js +74 -13
- package/dist/programmatic.d.ts +30 -6
- package/dist/programmatic.js +216 -19
- package/dist/site-chrome.d.ts +19 -9
- package/dist/site-chrome.js +23 -13
- package/dist/site-manifest.d.ts +25 -0
- package/dist/site-manifest.js +254 -0
- package/dist/site-roster.d.ts +41 -0
- package/dist/site-roster.js +141 -8
- package/dist/starter-grid.d.ts +16 -63
- package/dist/starter-grid.js +102 -84
- package/dist/surfaces.d.ts +41 -9
- package/dist/surfaces.js +200 -83
- package/dist/template-manifest.d.ts +30 -13
- package/dist/template-manifest.js +53 -28
- package/package.json +6 -3
- package/release-scope.json +25 -0
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +7 -6
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +7 -6
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +7 -6
- package/site-templates/designs/minimalism/DESIGN.md +98 -6
- package/site-templates/designs/minimalism/sample/README.md +48 -0
- package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +1 -1
- package/site-templates/designs/standard/DESIGN.md +98 -6
- package/site-templates/marketing-site/DESIGN.md +98 -6
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +60 -27
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +50 -30
- package/site-templates/marketing-site-free/DESIGN.md +98 -6
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +60 -24
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +44 -27
- package/site-templates/marketing-site-free/ailk-template.json +1 -1
- package/site-templates/saas-product/DESIGN.md +98 -6
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +74 -20
- package/site-templates/shapes/local-business-service/ailk-template.json +1 -1
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +74 -20
- package/site-templates/shapes/organization-service/ailk-template.json +1 -1
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +75 -21
- package/site-templates/shapes/person-service/ailk-template.json +1 -1
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +1 -1
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +2 -2
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +4 -2
- package/site-templates/shapes/person-service/content/en/ServicesList/services.mdx +1 -1
- package/templates/.claude/agents/web.md +10 -8
- package/templates/.claude/rules/architecture.md +17 -7
- package/templates/.claude/skills/README.md +3 -2
- package/templates/.claude/skills/add-auth/SKILL.md +142 -90
- package/templates/.claude/skills/add-auth/references/env-vars.md +32 -17
- package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +17 -8
- package/templates/.claude/skills/add-page/SKILL.md +241 -238
- package/templates/.claude/skills/add-page/references/page-types.md +94 -86
- package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
- package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
- package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
- package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
- package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
- package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
- package/templates/.claude/skills/check-site/SKILL.md +51 -18
- package/templates/.claude/skills/check-site/references/common-errors.md +12 -9
- package/templates/.claude/skills/check-site/references/findings-glossary.md +4 -4
- package/templates/.claude/skills/check-site/references/severity-levels.md +3 -3
- package/templates/.claude/skills/fill-page/SKILL.md +26 -7
- package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
- package/templates/.claude/skills/setup-deploy/SKILL.md +75 -38
- package/templates/.claude/skills/update-page/SKILL.md +117 -0
- package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
- package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
- package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
- package/templates/.env.example +23 -2
- package/templates/.github/workflows/ci.yml +4 -0
- package/templates/.prettierignore +1 -0
- package/templates/CLAUDE.md +146 -103
- package/templates/DESIGN.md +98 -6
- package/templates/README.md +50 -38
- package/templates/apps/api/.env.example +2 -1
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
- package/templates/apps/api/src/__tests__/server.test.ts +116 -0
- package/templates/apps/api/src/lib/stripe.ts +9 -0
- package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
- package/templates/apps/api/src/middleware/auth.ts +54 -0
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
- package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
- package/templates/apps/api/src/server.ts +28 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
- package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
- package/templates/apps/api/src/services/revalidation.ts +60 -15
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
- package/templates/apps/mcp/src/tools/purchase.ts +4 -2
- package/templates/apps/web/.env.example +13 -0
- package/templates/apps/web/CLAUDE.md +22 -28
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
- package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
- package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
- package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +4 -3
- package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
- package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +35 -19
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/portfolio/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
- package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
- package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
- package/templates/apps/web/app/api/revalidate/route.ts +78 -36
- package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
- package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
- package/templates/apps/web/lib/locale-guard.ts +18 -0
- package/templates/apps/web/lib/meet-placeholder.ts +5 -0
- package/templates/apps/web/lib/nav-config.ts +14 -13
- package/templates/apps/web/lib/site-brand.tsx +13 -9
- package/templates/apps/web/lib/site-logo.tsx +36 -0
- package/templates/apps/web/lib/site-theme.ts +46 -26
- package/templates/apps/web/messages/en.json +23 -9
- package/templates/apps/web/middleware.ts +28 -4
- package/templates/content/en/BookCall/book-a-call.mdx +80 -0
- package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
- package/templates/content/en/BookCall/onsite-service.mdx +56 -0
- package/templates/content/en/BookCall/start-project.mdx +56 -0
- package/templates/content/en/ContactPage/contact.mdx +40 -1
- package/templates/content/en/HomePage/home.mdx +2 -6
- package/templates/content/en/LandingPage/meet.mdx +59 -0
- package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
- package/templates/database/CHANGELOG.md +7 -0
- package/templates/database/package.json +1 -1
- package/templates/package.json +4 -1
- package/templates/tools/check-claude-md.ts +128 -0
- package/versions.json +33 -33
- package/dist/modules/commerce/0.6.0.tar.gz +0 -0
- package/dist/modules/commerce/0.6.1.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
- package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
- package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
- package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
- package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
- package/dist/modules/workspace/0.6.0.tar.gz +0 -0
- package/dist/modules/workspace/0.6.1.tar.gz +0 -0
- package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -52
- package/site-templates/minimalism-site/DESIGN.md +0 -162
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +0 -506
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -458
- package/site-templates/minimalism-site/ailk-template.json +0 -23
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
- package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
- package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -123
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
- package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +0 -73
- package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
- package/site-templates/minimalism-site/provenance.json +0 -4
- package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
- package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +0 -175
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +0 -8
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +0 -12
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +0 -12
- package/templates/apps/web/app/[locale]/book-a-call/page.tsx +0 -50
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
package/dist/starter-grid.d.ts
CHANGED
|
@@ -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
|
|
35
|
-
*
|
|
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
|
package/dist/starter-grid.js
CHANGED
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
* `docs/decisions/starter-roster-page-set.md` D4/D7): a glossary
|
|
4
|
-
* signup
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
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
|
-
|
|
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]`, `/
|
|
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
|
-
* `/
|
|
69
|
+
* `/for` lists the three UseCase pages at `/for/[slug]`
|
|
37
70
|
* (#6658 D4).
|
|
38
71
|
* - `/pricing`, `/privacy`, `/terms`, `/glossary`, `/newsletter`,
|
|
39
|
-
*
|
|
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
|
-
|
|
74
|
-
|
|
106
|
+
// #6878 D7 — the persona hub, renamed from /use-cases.
|
|
107
|
+
route: "/for",
|
|
108
|
+
content: ["content/en/UseCasesList/for.mdx"],
|
|
75
109
|
},
|
|
76
|
-
{ route: "/
|
|
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 `/
|
|
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
|
-
*
|
|
141
|
-
*
|
|
142
|
-
*
|
|
143
|
-
*
|
|
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/
|
|
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.
|
|
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
|
package/dist/surfaces.d.ts
CHANGED
|
@@ -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
|
-
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
198
|
-
* module serves it). Pricing
|
|
199
|
-
*
|
|
200
|
-
* roster enables it, #5469 D10), so the nav still never links a page
|
|
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;
|