create-ailk 0.4.0 → 0.6.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 +55 -8
- package/component-catalog.json +12248 -0
- package/component-catalog.md +193 -68
- package/dist/cli.js +29 -1
- package/dist/derive-architecture.js +5 -2
- package/dist/lib/api-boot-assertion.d.ts +46 -0
- package/dist/lib/api-boot-assertion.js +70 -0
- package/dist/lib/extract-module-bundle.d.ts +50 -2
- package/dist/lib/extract-module-bundle.js +223 -15
- package/dist/lib/fetch-guard.d.ts +28 -0
- package/dist/lib/fetch-guard.js +101 -0
- package/dist/lib/fetch-module.js +4 -0
- package/dist/lib/fetch-template.js +4 -0
- package/dist/lib/import-graph.d.ts +29 -0
- package/dist/lib/import-graph.js +140 -0
- package/dist/module-architecture.d.ts +60 -8
- package/dist/module-architecture.js +587 -242
- package/dist/parse-args.js +6 -2
- package/dist/programmatic.d.ts +10 -0
- package/dist/programmatic.js +134 -19
- package/dist/site-chrome.d.ts +80 -0
- package/dist/site-chrome.js +135 -0
- package/dist/surfaces.d.ts +21 -6
- package/dist/surfaces.js +209 -36
- package/dist/template-manifest.d.ts +88 -3
- package/dist/template-manifest.js +281 -29
- package/dist/template-names.d.ts +1 -1
- package/dist/template-names.js +2 -0
- package/package.json +10 -2
- package/site-templates/_base/ailk-template.json +6 -0
- package/site-templates/_base/content/en/Pricing/pricing.mdx +169 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +351 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +400 -0
- package/site-templates/marketing-site/ailk-template.json +11 -0
- package/site-templates/marketing-site/content/en/blog/05-this-vc-morning-routine-will-make-you-super-annoying.mdx +36 -0
- package/site-templates/marketing-site/provenance.json +4 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +288 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +286 -0
- package/site-templates/marketing-site-free/ailk-template.json +2 -1
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +279 -0
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +336 -0
- package/site-templates/minimalism-site/ailk-template.json +22 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-1.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-2.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-3.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-4.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-5.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-6.svg +7 -0
- package/site-templates/minimalism-site/assets/hero-backdrop.svg +17 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-1.svg +6 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-2.svg +6 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-3.svg +6 -0
- package/site-templates/minimalism-site/assets/wordmark-placeholder.svg +28 -0
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +110 -0
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +68 -0
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +57 -0
- package/site-templates/minimalism-site/content/en/HomePage/home.mdx +244 -0
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +77 -0
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +73 -0
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +52 -0
- package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +73 -0
- package/site-templates/minimalism-site/flows/referral.flow.json +71 -0
- package/site-templates/minimalism-site/provenance.json +4 -0
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +61 -0
- package/site-templates/saas-product/ailk-template.json +16 -0
- package/site-templates/saas-product/provenance.json +10 -0
- package/site-templates/simple-service/TEMPLATE-MANIFEST.json +240 -0
- package/site-templates/simple-service/TEMPLATE-MANIFEST.md +278 -0
- package/site-templates/simple-service/ailk-template.json +10 -0
- package/site-templates/simple-service/content/en/AboutPage/about.mdx +38 -0
- package/site-templates/simple-service/content/en/ContactPage/contact.mdx +67 -0
- package/site-templates/simple-service/content/en/FAQPage/faq.mdx +56 -0
- package/site-templates/simple-service/content/en/HomePage/home.mdx +85 -0
- package/site-templates/simple-service/content/en/Service/landscape-design.mdx +40 -0
- package/site-templates/simple-service/content/en/Service/lawn-maintenance.mdx +40 -0
- package/site-templates/simple-service/content/en/Service/seasonal-cleanup.mdx +40 -0
- package/site-templates/simple-service/content/en/ServicesList/services.mdx +72 -0
- package/site-templates/simple-service/provenance.json +4 -0
- package/templates/.claude/skills/README.md +16 -25
- package/templates/.env.example +102 -12
- package/templates/.github/workflows/ci.yml +48 -0
- package/templates/README.md +3 -1
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +8 -0
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +12 -0
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +12 -0
- package/templates/apps/api/.env.example +13 -0
- package/templates/apps/api/CLAUDE.md +29 -2
- package/templates/apps/api/eslint.config.mjs +69 -0
- package/templates/apps/api/jest.config.cjs +3 -0
- package/templates/apps/api/package.json +7 -2
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +407 -0
- package/templates/apps/api/src/__tests__/module-exclusion.test.ts +89 -9
- package/templates/apps/api/src/__tests__/review-surface-registration.test.ts +167 -0
- package/templates/apps/api/src/__tests__/server.test.ts +471 -0
- package/templates/apps/api/src/__tests__/vercel-handler.test.ts +45 -0
- package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +10 -1
- package/templates/apps/api/src/config/index.ts +62 -0
- package/templates/apps/api/src/config/modules.ts +7 -3
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +241 -2
- package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +143 -0
- package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +23 -0
- package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +125 -0
- package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +20 -0
- package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +317 -0
- package/templates/apps/api/src/lib/__tests__/site.test.ts +238 -0
- package/templates/apps/api/src/lib/__tests__/stripe.test.ts +75 -0
- package/templates/apps/api/src/lib/auth-email-budget.ts +160 -0
- package/templates/apps/api/src/lib/content-adapter.ts +57 -31
- package/templates/apps/api/src/lib/deliverable-asset-store.ts +76 -0
- package/templates/apps/api/src/lib/error-serializer.ts +23 -3
- package/templates/apps/api/src/lib/outbound-http.ts +7 -2
- package/templates/apps/api/src/lib/require-commerce-claim.ts +250 -0
- package/templates/apps/api/src/lib/site.ts +208 -9
- package/templates/apps/api/src/lib/stripe.ts +66 -0
- package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +521 -0
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +150 -0
- package/templates/apps/api/src/middleware/default-tenant.ts +136 -0
- package/templates/apps/api/src/middleware/rate-limit.ts +7 -1
- package/templates/apps/api/src/openapi/spec.ts +543 -2
- package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +48 -0
- package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +309 -0
- package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +123 -0
- package/templates/apps/api/src/routes/auth/transactional-email.ts +273 -0
- package/templates/apps/api/src/routes/auth/user.ts +61 -0
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +434 -0
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +888 -0
- package/templates/apps/api/src/routes/checkout/index.ts +34 -0
- package/templates/apps/api/src/routes/checkout/session.ts +139 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +197 -0
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +554 -0
- package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +108 -0
- package/templates/apps/api/src/routes/content/__tests__/search.test.ts +450 -0
- package/templates/apps/api/src/routes/content/get-page.ts +94 -12
- package/templates/apps/api/src/routes/content/index.ts +13 -73
- package/templates/apps/api/src/routes/content/list-pages.ts +15 -3
- package/templates/apps/api/src/routes/content/rate-limit.ts +15 -6
- package/templates/apps/api/src/routes/content/search.ts +129 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +447 -31
- package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +171 -0
- package/templates/apps/api/src/routes/leads/index.ts +100 -13
- package/templates/apps/api/src/routes/leads/list.ts +104 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +51 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +351 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +51 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +5 -2
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +4 -1
- package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +58 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +107 -6
- package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +87 -2
- package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +51 -0
- package/templates/apps/api/src/routes/project-listings/start.ts +5 -1
- package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +686 -0
- package/templates/apps/api/src/routes/requests/confirm.ts +601 -0
- package/templates/apps/api/src/routes/requests/index.ts +54 -0
- package/templates/apps/api/src/routes/webhooks/README.md +265 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +749 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +330 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +262 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +285 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +213 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +301 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +648 -0
- package/templates/apps/api/src/routes/webhooks/index.ts +89 -0
- package/templates/apps/api/src/routes/webhooks/stripe.ts +1399 -0
- package/templates/apps/api/src/server.ts +521 -55
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +39 -0
- package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +217 -40
- package/templates/apps/api/src/services/__tests__/audit-log.test.ts +620 -0
- package/templates/apps/api/src/services/__tests__/consent.test.ts +2 -0
- package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +300 -5
- package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +20 -0
- package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +368 -0
- package/templates/apps/api/src/services/__tests__/lead-promotion.test.ts +408 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +160 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +329 -0
- package/templates/apps/api/src/services/__tests__/listing-config.test.ts +166 -0
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +154 -0
- package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +137 -0
- package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +444 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +238 -0
- package/templates/apps/api/src/services/__tests__/verified-email.test.ts +78 -0
- package/templates/apps/api/src/services/abandon-email.ts +8 -2
- package/templates/apps/api/src/services/aeo-score.ts +49 -12
- package/templates/apps/api/src/services/audit-log.ts +668 -0
- package/templates/apps/api/src/services/consent.ts +18 -0
- package/templates/apps/api/src/services/default-tenant.ts +300 -0
- package/templates/apps/api/src/services/deliverable-fulfillment.ts +141 -13
- package/templates/apps/api/src/services/dunning-policy.ts +294 -0
- package/templates/apps/api/src/services/entitlements.ts +80 -0
- package/templates/apps/api/src/services/lead-promotion.ts +160 -0
- package/templates/apps/api/src/services/lead-routing.ts +161 -2
- package/templates/apps/api/src/services/leads-inbox.ts +284 -0
- package/templates/apps/api/src/services/listing-config.ts +27 -9
- package/templates/apps/api/src/services/owner-workspaces.ts +132 -0
- package/templates/apps/api/src/services/project-listings.ts +201 -6
- package/templates/apps/api/src/services/public-site-resolver.ts +106 -0
- package/templates/apps/api/src/services/request-confirm.ts +646 -0
- package/templates/apps/api/src/services/revalidation.ts +173 -0
- package/templates/apps/api/src/services/verified-email.ts +71 -0
- package/templates/apps/api/src/vercel-handler.ts +75 -35
- package/templates/apps/mcp/.env.example +17 -0
- package/templates/apps/mcp/CLAUDE.md +58 -25
- package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +6 -0
- package/templates/apps/mcp/__tests__/audit.test.ts +137 -8
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +79 -36
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +111 -2
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +82 -2
- package/templates/apps/mcp/__tests__/http-transport.test.ts +541 -2
- package/templates/apps/mcp/__tests__/index.test.ts +39 -0
- package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +143 -0
- package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +111 -0
- package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +65 -0
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +188 -0
- package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +165 -0
- package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +124 -0
- package/templates/apps/mcp/__tests__/list_pages.test.ts +116 -0
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +7 -1
- package/templates/apps/mcp/__tests__/parity.test.ts +12 -9
- package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +89 -22
- package/templates/apps/mcp/__tests__/read_content.test.ts +322 -1
- package/templates/apps/mcp/__tests__/search_content.test.ts +105 -2
- package/templates/apps/mcp/__tests__/server.test.ts +67 -14
- package/templates/apps/mcp/__tests__/start_purchase.test.ts +252 -0
- package/templates/apps/mcp/__tests__/tools/{scaffold.test.ts → create_project.test.ts} +23 -23
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +300 -123
- package/templates/apps/mcp/eslint.config.mjs +69 -0
- package/templates/apps/mcp/jest.config.cjs +13 -0
- package/templates/apps/mcp/package.json +8 -2
- package/templates/apps/mcp/src/abuse/index.ts +159 -24
- package/templates/apps/mcp/src/config/modules.ts +10 -5
- package/templates/apps/mcp/src/http-transport.ts +102 -29
- package/templates/apps/mcp/src/index.ts +73 -11
- package/templates/apps/mcp/src/lib/audit-single-page.ts +90 -3
- package/templates/apps/mcp/src/lib/commerce-claim.ts +94 -0
- package/templates/apps/mcp/src/lib/content-adapter.ts +113 -0
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +139 -0
- package/templates/apps/mcp/src/lib/prisma.ts +39 -0
- package/templates/apps/mcp/src/lib/public-workspace.ts +133 -0
- package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +59 -0
- package/templates/apps/mcp/src/server.ts +61 -37
- package/templates/apps/mcp/src/tools/audit.ts +26 -2
- package/templates/apps/mcp/src/tools/{scaffold.ts → create_project.ts} +3 -3
- package/templates/apps/mcp/src/tools/get_business_hours.ts +4 -3
- package/templates/apps/mcp/src/tools/get_faq.ts +4 -3
- package/templates/apps/mcp/src/tools/get_locations.ts +5 -3
- package/templates/apps/mcp/src/tools/get_offerings.ts +16 -4
- package/templates/apps/mcp/src/tools/get_pricing.ts +25 -6
- package/templates/apps/mcp/src/tools/get_site_info.ts +4 -3
- package/templates/apps/mcp/src/tools/index.ts +9 -7
- package/templates/apps/mcp/src/tools/list_pages.ts +4 -3
- package/templates/apps/mcp/src/tools/purchase.ts +128 -45
- package/templates/apps/mcp/src/tools/read_content.ts +20 -6
- package/templates/apps/mcp/src/tools/search_content.ts +11 -4
- package/templates/apps/web/.env.example +74 -8
- package/templates/apps/web/CLAUDE.md +46 -0
- package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +18 -2
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +11 -3
- package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +282 -0
- package/templates/apps/web/app/[locale]/(auth)/__tests__/password-reset.test.tsx +515 -0
- package/templates/apps/web/app/[locale]/(auth)/forgot-password/forgot-password-card.tsx +89 -0
- package/templates/apps/web/app/[locale]/(auth)/forgot-password/page.tsx +109 -0
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +92 -0
- package/templates/apps/web/app/[locale]/(auth)/reset-password/page.tsx +135 -0
- package/templates/apps/web/app/[locale]/(auth)/reset-password/reset-password-card.tsx +109 -0
- package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/page.test.tsx +48 -2
- package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/page.tsx +20 -6
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +125 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +96 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +101 -0
- package/templates/apps/web/app/[locale]/(auth)/use-auth-card-flow.ts +102 -0
- package/templates/apps/web/app/[locale]/(auth)/verify-email/page.tsx +87 -0
- package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +20 -10
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +84 -0
- package/templates/apps/web/app/[locale]/(authed)/account/actions.ts +58 -0
- package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +67 -14
- package/templates/apps/web/app/[locale]/(authed)/layout.tsx +19 -2
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +181 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/components/LeadsTable.tsx +137 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +111 -0
- package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +1 -1
- package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +111 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +65 -0
- package/templates/apps/web/app/[locale]/cancellation/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.permalink.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.test.tsx +6 -5
- package/templates/apps/web/app/[locale]/flows/[slug]/flow.actions.ts +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +308 -65
- package/templates/apps/web/app/[locale]/purchase/__tests__/cancel.test.tsx +162 -0
- package/templates/apps/web/app/[locale]/purchase/__tests__/module-scope.test.ts +68 -0
- package/templates/apps/web/app/[locale]/purchase/__tests__/success.test.tsx +361 -0
- package/templates/apps/web/app/[locale]/purchase/cancel/page.tsx +115 -0
- package/templates/apps/web/app/[locale]/purchase/success/page.tsx +307 -0
- package/templates/apps/web/app/[locale]/returns/page.tsx +44 -0
- package/templates/apps/web/app/[locale]/shipping/page.tsx +44 -0
- package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +670 -0
- package/templates/apps/web/app/api/revalidate/route.ts +194 -0
- package/templates/apps/web/auth.ts +407 -8
- package/templates/apps/web/components/google-analytics.tsx +18 -1
- package/templates/apps/web/eslint.config.mjs +69 -0
- package/templates/apps/web/jest.config.cjs +15 -19
- package/templates/apps/web/lib/__tests__/auth-email.test.ts +214 -0
- package/templates/apps/web/lib/__tests__/auth-routes.test.ts +74 -0
- package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +72 -0
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +50 -6
- package/templates/apps/web/lib/auth-email.ts +318 -0
- package/templates/apps/web/lib/auth-env.ts +85 -0
- package/templates/apps/web/lib/auth-routes.ts +55 -0
- package/templates/apps/web/lib/meeting-slugs.ts +53 -0
- package/templates/apps/web/lib/nav-config.ts +27 -7
- package/templates/apps/web/lib/server-api.ts +1 -1
- package/templates/apps/web/lib/site-chrome.ts +29 -0
- package/templates/apps/web/lib/telemetry-scrub.ts +50 -0
- package/templates/apps/web/messages/en.json +216 -2
- package/templates/apps/web/next.config.mjs +20 -0
- package/templates/apps/web/package.json +8 -3
- package/templates/apps/web/sentry.client.config.ts +131 -0
- package/templates/apps/web/sentry.edge.config.ts +72 -0
- package/templates/apps/web/sentry.server.config.ts +72 -0
- package/templates/apps/web/src/lib/commerce-claim.ts +33 -0
- package/templates/apps/web/src/lib/commerce-sections.ts +61 -0
- package/templates/apps/web/src/lib/routes.ts +13 -18
- package/templates/brand_assets/README.md +24 -0
- package/templates/content/en/AboutPage/about.mdx +160 -15
- package/templates/content/en/CancellationPolicyPage/cancellation.mdx +108 -0
- package/templates/content/en/ContactPage/contact.mdx +90 -13
- package/templates/content/en/FAQPage/faq.mdx +62 -22
- package/templates/content/en/HomePage/home.mdx +244 -20
- package/templates/content/en/LandingPage/blog.mdx +83 -0
- package/templates/content/en/LandingPage/features.mdx +103 -0
- package/templates/content/en/LandingPage/how-it-works.mdx +143 -0
- package/templates/content/en/ReturnsPolicyPage/returns.mdx +108 -0
- package/templates/content/en/ShippingPolicyPage/shipping.mdx +108 -0
- package/templates/database/CHANGELOG.md +149 -0
- package/templates/database/README.md +10 -3
- package/templates/database/__tests__/appointment.db.test.ts +106 -0
- package/templates/database/__tests__/artifact-content-store.db.test.ts +316 -0
- package/templates/database/__tests__/composite-fence.db.test.ts +206 -0
- package/templates/database/__tests__/fence-fan-out.db.test.ts +711 -0
- package/templates/database/__tests__/fixtures/appointment-create-probe.ts +79 -0
- package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +100 -0
- package/templates/database/__tests__/flow-workspace-key.db.test.ts +263 -0
- package/templates/database/__tests__/prefixed-ids.db.test.ts +85 -9
- package/templates/database/__tests__/project-listing-consent-at.db.test.ts +111 -0
- package/templates/database/__tests__/seed.test.ts +1 -1
- package/templates/database/__tests__/tenancy.test.ts +141 -0
- package/templates/database/config/schema.prisma +79 -2
- package/templates/database/content/schema.prisma +87 -11
- package/templates/database/eslint.config.mjs +69 -0
- package/templates/database/inbox/schema.prisma +452 -9
- package/templates/database/jest.config.cjs +5 -3
- package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +15 -0
- package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +158 -0
- package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +40 -0
- package/templates/database/migrations/20260918120000_add_appointment/migration.sql +67 -0
- package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +70 -0
- package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +181 -0
- package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +172 -0
- package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +41 -0
- package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +185 -0
- package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +70 -0
- package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +57 -0
- package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +68 -0
- package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +1067 -0
- package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +210 -0
- package/templates/database/package.json +7 -3
- package/templates/database/seed.ts +1 -1
- package/templates/database/tenancy.ts +86 -1
- package/templates/database/tsconfig.json +1 -0
- package/templates/package.json +1 -14
- package/versions.json +52 -0
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +0 -103
- package/templates/apps/api/src/routes/content/__tests__/create.test.ts +0 -253
- package/templates/apps/api/src/routes/content/__tests__/delete.test.ts +0 -215
- package/templates/apps/api/src/routes/content/__tests__/update.test.ts +0 -266
- package/templates/apps/api/src/routes/content/create.ts +0 -115
- package/templates/apps/api/src/routes/content/delete.ts +0 -82
- package/templates/apps/api/src/routes/content/update.ts +0 -112
- package/templates/apps/mcp/__tests__/create_page.test.ts +0 -202
- package/templates/apps/mcp/__tests__/delete_page.test.ts +0 -177
- package/templates/apps/mcp/__tests__/update_page.test.ts +0 -196
- package/templates/apps/mcp/src/tools/create_page.ts +0 -96
- package/templates/apps/mcp/src/tools/delete_page.ts +0 -74
- package/templates/apps/mcp/src/tools/update_page.ts +0 -92
- package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +0 -123
- /package/site-templates/{marketing-site-free → _base}/content/en/PrivacyPage/privacy.mdx +0 -0
- /package/site-templates/{marketing-site-free → _base}/content/en/TermsPage/terms.mdx +0 -0
- /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/__tests__/next-path.test.ts +0 -0
- /package/templates/apps/web/app/[locale]/{sign-in → (auth)/sign-in}/next-path.ts +0 -0
- /package/templates/apps/web/{src/components → components}/SiteNav.tsx +0 -0
|
@@ -0,0 +1,288 @@
|
|
|
1
|
+
{
|
|
2
|
+
"template": "marketing-site-free",
|
|
3
|
+
"requires": ["marketing"],
|
|
4
|
+
"categories": ["accounting", "legal", "technology"],
|
|
5
|
+
"generatedHash": "c12535b332c6ff664fea110372c0cd9b1a0f719f8e274586d2ca66954cc9f2a2",
|
|
6
|
+
"layout": {
|
|
7
|
+
"nav": "full",
|
|
8
|
+
"footer": "columns",
|
|
9
|
+
"announcementBanner": true,
|
|
10
|
+
"home": "default"
|
|
11
|
+
},
|
|
12
|
+
"rows": [
|
|
13
|
+
{
|
|
14
|
+
"route": "/",
|
|
15
|
+
"pageType": "HomePage",
|
|
16
|
+
"schema": "HomePage",
|
|
17
|
+
"shell": "MarketingShell",
|
|
18
|
+
"chrome": "on",
|
|
19
|
+
"sections": [
|
|
20
|
+
{
|
|
21
|
+
"type": "hero",
|
|
22
|
+
"component": "Hero"
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"type": "logoCloud",
|
|
26
|
+
"component": "LogoCloud"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"type": "decision-split",
|
|
30
|
+
"component": "DecisionSplit"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"type": "feature",
|
|
34
|
+
"component": "Feature"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"type": "cta",
|
|
38
|
+
"component": "CTA"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"type": "stair-steps",
|
|
42
|
+
"component": "StairSteps"
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"type": "cta",
|
|
46
|
+
"component": "CTA"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"type": "content-block",
|
|
50
|
+
"component": "ContentBlock"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"type": "video-section",
|
|
54
|
+
"component": "VideoSection"
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"route": "/how-it-works",
|
|
60
|
+
"pageType": "LandingPage",
|
|
61
|
+
"schema": "WebPage",
|
|
62
|
+
"shell": "MarketingShell",
|
|
63
|
+
"chrome": "on",
|
|
64
|
+
"sections": [
|
|
65
|
+
{
|
|
66
|
+
"type": "hero",
|
|
67
|
+
"component": "Hero"
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
"type": "feature",
|
|
71
|
+
"component": "Feature"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"type": "logoCloud",
|
|
75
|
+
"component": "LogoCloud"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"type": "testimonials",
|
|
79
|
+
"component": "Testimonials"
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"type": "cta",
|
|
83
|
+
"component": "CTA"
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
"type": "faq",
|
|
87
|
+
"component": "FAQ"
|
|
88
|
+
}
|
|
89
|
+
]
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"route": "/features",
|
|
93
|
+
"pageType": "LandingPage",
|
|
94
|
+
"schema": "WebPage",
|
|
95
|
+
"shell": "MarketingShell",
|
|
96
|
+
"chrome": "on",
|
|
97
|
+
"sections": [
|
|
98
|
+
{
|
|
99
|
+
"type": "feature",
|
|
100
|
+
"component": "Feature"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"type": "cta",
|
|
104
|
+
"component": "CTA"
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"type": "cta",
|
|
108
|
+
"component": "CTA"
|
|
109
|
+
}
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"route": "/pricing",
|
|
114
|
+
"pageType": "Pricing",
|
|
115
|
+
"schema": "Pricing",
|
|
116
|
+
"shell": "MarketingShell",
|
|
117
|
+
"chrome": "on",
|
|
118
|
+
"sections": [
|
|
119
|
+
{
|
|
120
|
+
"type": "hero",
|
|
121
|
+
"component": "Hero"
|
|
122
|
+
},
|
|
123
|
+
{
|
|
124
|
+
"type": "pricing",
|
|
125
|
+
"component": "Pricing"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"type": "logoCloud",
|
|
129
|
+
"component": "LogoCloud"
|
|
130
|
+
},
|
|
131
|
+
{
|
|
132
|
+
"type": "testimonials",
|
|
133
|
+
"component": "Testimonials"
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
"type": "cta",
|
|
137
|
+
"component": "CTA"
|
|
138
|
+
},
|
|
139
|
+
{
|
|
140
|
+
"type": "faq",
|
|
141
|
+
"component": "FAQ"
|
|
142
|
+
}
|
|
143
|
+
]
|
|
144
|
+
},
|
|
145
|
+
{
|
|
146
|
+
"route": "/about",
|
|
147
|
+
"pageType": "AboutPage",
|
|
148
|
+
"schema": "AboutPage",
|
|
149
|
+
"shell": "MarketingShell",
|
|
150
|
+
"chrome": "on",
|
|
151
|
+
"sections": [
|
|
152
|
+
{
|
|
153
|
+
"type": "content-block",
|
|
154
|
+
"component": "ContentBlock"
|
|
155
|
+
},
|
|
156
|
+
{
|
|
157
|
+
"type": "team",
|
|
158
|
+
"component": "Team"
|
|
159
|
+
},
|
|
160
|
+
{
|
|
161
|
+
"type": "logoCloud",
|
|
162
|
+
"component": "LogoCloud"
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
"type": "testimonials",
|
|
166
|
+
"component": "Testimonials"
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
"type": "cta",
|
|
170
|
+
"component": "CTA"
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
"type": "faq",
|
|
174
|
+
"component": "FAQ"
|
|
175
|
+
}
|
|
176
|
+
]
|
|
177
|
+
},
|
|
178
|
+
{
|
|
179
|
+
"route": "/faq",
|
|
180
|
+
"pageType": "FAQPage",
|
|
181
|
+
"schema": "FAQPage",
|
|
182
|
+
"shell": "MarketingShell",
|
|
183
|
+
"chrome": "on",
|
|
184
|
+
"sections": [
|
|
185
|
+
{
|
|
186
|
+
"type": "hero",
|
|
187
|
+
"component": "Hero"
|
|
188
|
+
},
|
|
189
|
+
{
|
|
190
|
+
"type": "faq",
|
|
191
|
+
"component": "FAQ"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"type": "cta",
|
|
195
|
+
"component": "CTA"
|
|
196
|
+
}
|
|
197
|
+
]
|
|
198
|
+
},
|
|
199
|
+
{
|
|
200
|
+
"route": "/contact",
|
|
201
|
+
"pageType": "ContactPage",
|
|
202
|
+
"schema": "ContactPage",
|
|
203
|
+
"shell": "MarketingShell",
|
|
204
|
+
"chrome": "on",
|
|
205
|
+
"sections": [
|
|
206
|
+
{
|
|
207
|
+
"type": "hero",
|
|
208
|
+
"component": "Hero"
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
"type": "contact-form",
|
|
212
|
+
"component": "ContactForm"
|
|
213
|
+
},
|
|
214
|
+
{
|
|
215
|
+
"type": "logoCloud",
|
|
216
|
+
"component": "LogoCloud"
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
"type": "testimonials",
|
|
220
|
+
"component": "Testimonials"
|
|
221
|
+
}
|
|
222
|
+
]
|
|
223
|
+
},
|
|
224
|
+
{
|
|
225
|
+
"route": "/sign-in",
|
|
226
|
+
"pageType": null,
|
|
227
|
+
"schema": null,
|
|
228
|
+
"shell": "MarketingShell",
|
|
229
|
+
"chrome": "on",
|
|
230
|
+
"sections": []
|
|
231
|
+
},
|
|
232
|
+
{
|
|
233
|
+
"route": "/privacy",
|
|
234
|
+
"pageType": "PrivacyPage",
|
|
235
|
+
"schema": "PrivacyPage",
|
|
236
|
+
"shell": "MarketingShell",
|
|
237
|
+
"chrome": "on",
|
|
238
|
+
"sections": [
|
|
239
|
+
{
|
|
240
|
+
"type": "document-chassis",
|
|
241
|
+
"component": "DocumentChassis"
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"route": "/terms",
|
|
247
|
+
"pageType": "TermsPage",
|
|
248
|
+
"schema": "TermsPage",
|
|
249
|
+
"shell": "MarketingShell",
|
|
250
|
+
"chrome": "on",
|
|
251
|
+
"sections": [
|
|
252
|
+
{
|
|
253
|
+
"type": "document-chassis",
|
|
254
|
+
"component": "DocumentChassis"
|
|
255
|
+
}
|
|
256
|
+
]
|
|
257
|
+
},
|
|
258
|
+
{
|
|
259
|
+
"route": "/blog",
|
|
260
|
+
"pageType": "LandingPage",
|
|
261
|
+
"schema": "WebPage",
|
|
262
|
+
"shell": "MarketingShell",
|
|
263
|
+
"chrome": "on",
|
|
264
|
+
"sections": [
|
|
265
|
+
{
|
|
266
|
+
"type": "hero",
|
|
267
|
+
"component": "Hero"
|
|
268
|
+
},
|
|
269
|
+
{
|
|
270
|
+
"type": "cta",
|
|
271
|
+
"component": "CTA"
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
"type": "newsletter",
|
|
275
|
+
"component": "Newsletter"
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
"type": "logoCloud",
|
|
279
|
+
"component": "LogoCloud"
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"type": "testimonials",
|
|
283
|
+
"component": "Testimonials"
|
|
284
|
+
}
|
|
285
|
+
]
|
|
286
|
+
}
|
|
287
|
+
]
|
|
288
|
+
}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
# Template manifest — `marketing-site-free`
|
|
2
|
+
|
|
3
|
+
> **Approved by Sam 2026-09-15 (shape, home-beat mapping, generated-file rule).** The regions between `<!-- generated:begin … -->` / `<!-- generated:end -->` are GENERATED by `scripts/build-template-manifest.mjs --template marketing-site-free` from the registry roster, each page's MDX `sections[]` and `component-catalog.json` (`pnpm --filter create-ailk manifest:check` fails when they drift); everything else is hand-authored. Generated from the live copy on the Mini (create-ailk at `d2a2dd4`, `@working-theory/*` 0.23.0) plus the standardissue capture (`docs/research/standardissue-capture/`, 2026-09-14). Once approved it moves to `packages/create-ailk/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md` as a **generated** file (roster + each page's MDX `sections` + `component-catalog.json`), and becomes the spec the run-cards build against.
|
|
4
|
+
|
|
5
|
+
| Field | Value |
|
|
6
|
+
| ------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
7
|
+
| Template | `marketing-site-free` |
|
|
8
|
+
| Level | Free |
|
|
9
|
+
| `requires` | `[marketing]` |
|
|
10
|
+
| Delivery | Free overlay in the `create-ailk` tarball, Apache-2.0, public forever (D-16) |
|
|
11
|
+
| Reference | standardissue.webflow.io — structure only; copy is mad-lib placeholder |
|
|
12
|
+
| Brand in the sample | Working Theory Labs · © SalesSmyth LLC · "Built by Working Theory Labs" |
|
|
13
|
+
| Design system | one type family (`system-ui`), weights 400/700, no accent colour, no dark mode in the reference (we keep the theme toggle in the footer) |
|
|
14
|
+
|
|
15
|
+
**Status legend:** ✅ on the live copy today · 🟡 exists in the tree, not wired on the default path · ❌ not built · 🔧 filed gap (issue)
|
|
16
|
+
|
|
17
|
+
## 1. Chrome (every page)
|
|
18
|
+
|
|
19
|
+
| Piece | Component | Props that matter | Status |
|
|
20
|
+
| ---------------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------- |
|
|
21
|
+
| Shell | `MarketingShell` | `gutters="plain"`, `contentOwnsMain`, `bannerPlacement="above-nav"` | ✅ |
|
|
22
|
+
| Announcement bar | `Banner` (chrome) | `variant="contrast"`, `routes={{ include: ["/"] }}` — **home only**, no dismiss | ✅ · 🔧 #5558 message colour |
|
|
23
|
+
| Nav | `Nav` → `BrandLogo` (mark + wordmark, mark-only < md) | items: Product (flyout: How it works · Features · FAQ) · How it works · Pricing · About; actions: Get started (primary → `/contact`), Sign in (outline → `/sign-in`); `showThemeToggle={false}`; mobile = mark + hamburger only | ✅ |
|
|
24
|
+
| Footer | `Footer` → `FooterBottomBar` | columns: Site pages · Product · Legal · Subscribe (`Newsletter` block); bottom bar: theme toggle · © 2026 SalesSmyth LLC · Privacy Policy · Terms of Service · social ×5 · `LocaleSwitcher` | ✅ bar · 🟡 columns + subscribe · 🔧 `LanguageSwitcher` client wrapper is scaffold code, not a block |
|
|
25
|
+
| Cookie consent | `Banner variant="info"` + `BannerConsentIsland` (bottom) | consent copy from `messages/en.json`; hidden on the sample | 🔧 #5557 |
|
|
26
|
+
|
|
27
|
+
### Layout knobs (#5612)
|
|
28
|
+
|
|
29
|
+
The template's `layout` block — resolved with `resolveSiteChrome`, defaults filled. This template declares none, so every knob shows its default (byte-identical to the monorepo's own `apps/web/lib/site-chrome.ts`).
|
|
30
|
+
|
|
31
|
+
<!-- generated:begin layout -->
|
|
32
|
+
|
|
33
|
+
| Knob | Value |
|
|
34
|
+
| -------------------- | --------- |
|
|
35
|
+
| `nav` | `full` |
|
|
36
|
+
| `footer` | `columns` |
|
|
37
|
+
| `announcementBanner` | `true` |
|
|
38
|
+
| `home` | `default` |
|
|
39
|
+
|
|
40
|
+
<!-- generated:end -->
|
|
41
|
+
|
|
42
|
+
## 2. Pages
|
|
43
|
+
|
|
44
|
+
Sections are listed in render order. Components resolve through `component-catalog.json`; every section named here exists in `packages/ui` (§ 4). _Live_ = what the scaffold rendered on 2026-09-15; _Target_ = the standardissue-matched composition. **Corrected 2026-09-15** against the captured copy (`docs/research/standardissue-capture/copy/<slug>.txt`) after a prop-coverage check of every beat against `packages/validation/src/schemas/page-sections.ts`; three bounded fields the reproduction needs are commissioned in **#5576** (Hero `checklist`, Feature `actions`, CTA `closingLine`) and are marked 🔧 #5576 below.
|
|
45
|
+
|
|
46
|
+
**Copy rule (Sam, 2026-09-15): verbatim, mad-lib style exactly.** Every headline, body, bullet, label and CTA is the reference's text from `copy/<slug>.txt`, braces included (`{outcome}`, `{Primary CTA}`, `{Social Proof goes here}`). Lorem ipsum stays lorem ipsum where the reference has it. Nothing is paraphrased, shortened or "improved"; the operator rewrites the copy after the match is achieved. Only chrome text differs (§ 1).
|
|
47
|
+
|
|
48
|
+
### `/` — HomePage · schema `HomePage` · `MarketingShell` · chrome on
|
|
49
|
+
|
|
50
|
+
Reference: `screenshots/home.png`, `copy/home.txt`. Nine page sections; the newsletter and the blog list on the reference are in its footer, not the page (§ 1).
|
|
51
|
+
|
|
52
|
+
<!-- generated:begin page=/ -->
|
|
53
|
+
|
|
54
|
+
| # | Section | Component | Copy (first line) |
|
|
55
|
+
| --- | ------------------------------------------------------------ | --------------- | -------------------------------------------------- |
|
|
56
|
+
| 1 | `hero` (split · checklist ×3 · 2 CTAs · closingLine) | `Hero` | How to get {outcome} without {problem} |
|
|
57
|
+
| 2 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
58
|
+
| 3 | `decision-split` (panels ×2) | `DecisionSplit` | There's a better way to {fix problem / get result} |
|
|
59
|
+
| 4 | `feature` (eyebrow "Core Features" · features ×5 · 2 CTAs) | `Feature` | Everything you need to {achieve a desired outcome} |
|
|
60
|
+
| 5 | `cta` (2 CTAs) | `CTA` | Direct integrations with your favorite tools |
|
|
61
|
+
| 6 | `stair-steps` (tiles ×3) | `StairSteps` | Get setup in {number} easy steps |
|
|
62
|
+
| 7 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
|
|
63
|
+
| 8 | `content-block` (media-right · eyebrow "Manifesto" · 2 CTAs) | `ContentBlock` | We want you to {ability they couldn't do before} |
|
|
64
|
+
| 9 | `video-section` (1 CTA · playBadge) | `VideoSection` | See {your product} in action |
|
|
65
|
+
|
|
66
|
+
<!-- generated:end -->
|
|
67
|
+
|
|
68
|
+
### `/how-it-works` — LandingPage · schema `WebPage` · chrome on
|
|
69
|
+
|
|
70
|
+
Reference: `screenshots/how-it-works.png`, `copy/how-it-works.txt`. Rendered by the generic `[slug]` route over `content/en/LandingPage/how-it-works.mdx`, emitting the LandingPage builder's `WebPage`. (`WebPage` is a schema.org @type the registry emits, not a content type the adapter accepts — the `[slug]` route's own header comment records why. A `schema` override to `HowTo` is refused by the scaffold's own `structured-data` gate, which validates every LandingPage as `WebPage`.)
|
|
71
|
+
|
|
72
|
+
<!-- generated:begin page=/how-it-works -->
|
|
73
|
+
|
|
74
|
+
| # | Section | Component | Copy (first line) |
|
|
75
|
+
| --- | -------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
|
|
76
|
+
| 1 | `hero` (eyebrow "How it Works" · 2 CTAs) | `Hero` | Get set up in {number} easy steps |
|
|
77
|
+
| 2 | `feature` (alternating · numbered · features ×3) | `Feature` | The first thing they need to do to get the outcome they want |
|
|
78
|
+
| 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
79
|
+
| 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
|
|
80
|
+
| 5 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
|
|
81
|
+
| 6 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | FAQs |
|
|
82
|
+
|
|
83
|
+
<!-- generated:end -->
|
|
84
|
+
|
|
85
|
+
### `/features` — LandingPage · schema `WebPage` · chrome on
|
|
86
|
+
|
|
87
|
+
Reference: `screenshots/features.png`, `copy/features.txt`. Rendered by the `[slug]` route over `content/en/LandingPage/features.mdx`. No hero: the page opens on the feature grid.
|
|
88
|
+
|
|
89
|
+
<!-- generated:begin page=/features -->
|
|
90
|
+
|
|
91
|
+
| # | Section | Component | Copy (first line) |
|
|
92
|
+
| --- | ------------------------------------------------- | --------- | ------------------------------------------------- |
|
|
93
|
+
| 1 | `feature` (eyebrow "Core Features" · features ×5) | `Feature` | Medium length section heading goes here |
|
|
94
|
+
| 2 | `cta` (2 CTAs) | `CTA` | Direct integrations with your favorite tools |
|
|
95
|
+
| 3 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
|
|
96
|
+
|
|
97
|
+
<!-- generated:end -->
|
|
98
|
+
|
|
99
|
+
### `/pricing` — Pricing · schema `Pricing` · chrome on
|
|
100
|
+
|
|
101
|
+
Reference: `screenshots/pricing.png`, `copy/pricing.txt`. The reference opens on a hero (eyebrow Pricing, the headline, two CTAs) ABOVE the plans section, which repeats the headline — composed as the reference and the copy have it. Route enabled by the roster (#5469 D10).
|
|
102
|
+
|
|
103
|
+
<!-- generated:begin page=/pricing -->
|
|
104
|
+
|
|
105
|
+
| # | Section | Component | Copy (first line) |
|
|
106
|
+
| --- | ---------------------------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
|
|
107
|
+
| 1 | `hero` (eyebrow "Pricing" · 2 CTAs) | `Hero` | Pays for itself in {tangible value or outcome} |
|
|
108
|
+
| 2 | `pricing` (three-tiers-with-toggle · eyebrow "Pricing" · plans ×3 · billingToggle) | `Pricing` | Pays for itself in {tangible value or outcome} |
|
|
109
|
+
| 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
110
|
+
| 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
|
|
111
|
+
| 5 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
|
|
112
|
+
| 6 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | FAQs |
|
|
113
|
+
|
|
114
|
+
<!-- generated:end -->
|
|
115
|
+
|
|
116
|
+
### `/about` — AboutPage · schema `AboutPage` · chrome on
|
|
117
|
+
|
|
118
|
+
Reference: `screenshots/about.png`, `copy/about.txt`. No hero: the page opens on the manifesto (the home page's row 8, same copy).
|
|
119
|
+
|
|
120
|
+
<!-- generated:begin page=/about -->
|
|
121
|
+
|
|
122
|
+
| # | Section | Component | Copy (first line) |
|
|
123
|
+
| --- | -------------------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
|
|
124
|
+
| 1 | `content-block` (media-right · eyebrow "Manifesto" · 2 CTAs) | `ContentBlock` | We want you to {ability they couldn't do before} |
|
|
125
|
+
| 2 | `team` (members ×5) | `Team` | Our team |
|
|
126
|
+
| 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
127
|
+
| 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
|
|
128
|
+
| 5 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
|
|
129
|
+
| 6 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | FAQs |
|
|
130
|
+
|
|
131
|
+
<!-- generated:end -->
|
|
132
|
+
|
|
133
|
+
### `/faq` — FAQPage · schema `FAQPage` · chrome on
|
|
134
|
+
|
|
135
|
+
No standardissue page; folded into the Product flyout. Copy: the reference's FAQ block (`copy/pricing.txt` § FAQs) under a `hero` "FAQs".
|
|
136
|
+
|
|
137
|
+
<!-- generated:begin page=/faq -->
|
|
138
|
+
|
|
139
|
+
| # | Section | Component | Copy (first line) |
|
|
140
|
+
| --- | -------------------------------------------------------------- | --------- | ---------------------------------------------------------------------- |
|
|
141
|
+
| 1 | `hero` | `Hero` | FAQs |
|
|
142
|
+
| 2 | `faq` (accordion · items ×5 · supportLink · initialOpen first) | `FAQ` | Vel odio odit voluptatum ut veritatis. Ex rerum aspernatur voluptas u… |
|
|
143
|
+
| 3 | `cta` (box · chips ×3 · 2 CTAs · closingLine) | `CTA` | Switch to {your product} in {time amount} or less |
|
|
144
|
+
|
|
145
|
+
<!-- generated:end -->
|
|
146
|
+
|
|
147
|
+
### `/contact` — ContactPage · schema `ContactPage` · chrome on
|
|
148
|
+
|
|
149
|
+
Reference: `screenshots/contact.png`, `copy/contact.txt`. The reference is a split: copy + 3 bullets on the left, the form (Name · Email · Message · "I accept the Terms") on the right; the form confirms inline, no `/thanks` redirect by design (#3960).
|
|
150
|
+
|
|
151
|
+
<!-- generated:begin page=/contact -->
|
|
152
|
+
|
|
153
|
+
| # | Section | Component | Copy (first line) |
|
|
154
|
+
| --- | ----------------------------------------------------- | -------------- | ---------------------------------------------------------------------- |
|
|
155
|
+
| 1 | `hero` (split · eyebrow "Book a Demo" · checklist ×3) | `Hero` | Ready to {achieve a valuable outcome}? |
|
|
156
|
+
| 2 | `contact-form` (card · fields ×3) | `ContactForm` | Name · Email · Message |
|
|
157
|
+
| 3 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
158
|
+
| 4 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
|
|
159
|
+
|
|
160
|
+
<!-- generated:end -->
|
|
161
|
+
|
|
162
|
+
### `/blog` — LandingPage · schema `WebPage` · chrome on (Free teaser)
|
|
163
|
+
|
|
164
|
+
Reference: `screenshots/blog.png`, `copy/blog.txt` for the opener and the newsletter. Free ships **one static page**: the reference's opener, a CTA to the Pro docs-blog module (the one non-verbatim block), the newsletter, and the reference's logo strip + testimonial. Pro replaces this route with the real listing by directory precedence (#5469 D3).
|
|
165
|
+
|
|
166
|
+
<!-- generated:begin page=/blog -->
|
|
167
|
+
|
|
168
|
+
| # | Section | Component | Copy (first line) |
|
|
169
|
+
| --- | ------------------------------------ | -------------- | ---------------------------------------------------------------------- |
|
|
170
|
+
| 1 | `hero` (centered · eyebrow "Blog") | `Hero` | Resources for {customer profile} |
|
|
171
|
+
| 2 | `cta` (2 CTAs) | `CTA` | The blog listing ships with the Pro docs-blog module |
|
|
172
|
+
| 3 | `newsletter` | `Newsletter` | Stay Up to Date with our {fequency} Newsletter |
|
|
173
|
+
| 4 | `logoCloud` (logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
174
|
+
| 5 | `testimonials` (featured · items ×1) | `Testimonials` | Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse … |
|
|
175
|
+
|
|
176
|
+
<!-- generated:end -->
|
|
177
|
+
|
|
178
|
+
### `/sign-in` — code route (`SignInCard`) · chrome on
|
|
179
|
+
|
|
180
|
+
Renders the `SignInCard` client island (providers from env) inside the locale layout — the layout owns the chrome for every route, so the nav and footer are present here too. No reference page.
|
|
181
|
+
|
|
182
|
+
<!-- generated:begin page=/sign-in -->
|
|
183
|
+
|
|
184
|
+
_Code route — no content, no sections._
|
|
185
|
+
<!-- generated:end -->
|
|
186
|
+
|
|
187
|
+
### `/privacy`, `/terms` — PrivacyPage / TermsPage · schema same · chrome on
|
|
188
|
+
|
|
189
|
+
Reference: `screenshots/legal--privacy-policy.png`, `copy/legal--*.txt`. Content ✅ (the `document-chassis` placeholder document, not re-authored — the two pages stay as #5565 shipped them). Route enabled by the roster (#5469 D10).
|
|
190
|
+
|
|
191
|
+
`/privacy`:
|
|
192
|
+
|
|
193
|
+
<!-- generated:begin page=/privacy -->
|
|
194
|
+
|
|
195
|
+
| # | Section | Component | Copy (first line) |
|
|
196
|
+
| --- | ------------------------------------------------------------------ | ----------------- | ----------------- |
|
|
197
|
+
| 1 | `document-chassis` (eyebrow "PLACEHOLDER — REPLACE BEFORE LAUNCH") | `DocumentChassis` | Privacy Policy |
|
|
198
|
+
|
|
199
|
+
<!-- generated:end -->
|
|
200
|
+
|
|
201
|
+
`/terms`:
|
|
202
|
+
|
|
203
|
+
<!-- generated:begin page=/terms -->
|
|
204
|
+
|
|
205
|
+
| # | Section | Component | Copy (first line) |
|
|
206
|
+
| --- | ------------------------------------------------------------------ | ----------------- | ----------------- |
|
|
207
|
+
| 1 | `document-chassis` (eyebrow "PLACEHOLDER — REPLACE BEFORE LAUNCH") | `DocumentChassis` | Terms of Service |
|
|
208
|
+
|
|
209
|
+
<!-- generated:end -->
|
|
210
|
+
|
|
211
|
+
### `/thanks/<slug>` — per-form confirmation (InstrumentDeliveryPage) · chrome on
|
|
212
|
+
|
|
213
|
+
Not a hub page by design (#3960). Free ships none because the contact form confirms inline. Listed so nobody re-files it.
|
|
214
|
+
|
|
215
|
+
## 2a. State and persistence (every interactive element)
|
|
216
|
+
|
|
217
|
+
The template is content and config; the states live in the components. This table is what the local review clicks through (#5469 AC), per element: the states, where they persist, and what a returning visitor sees.
|
|
218
|
+
|
|
219
|
+
| Element | States | Persists in | Returning visitor sees | Empty / error state |
|
|
220
|
+
| -------------------------------------- | ------------------------------------------ | ------------------------------------------- | ------------------------------------- | ---------------------------------------------------------------------------------------------------------- |
|
|
221
|
+
| Announcement banner (home only) | shown; no dismiss | — | shown on `/`, never elsewhere | — |
|
|
222
|
+
| Cookie consent (`BannerConsentIsland`) | unset → shown; accepted; declined | consent cookie (the island's) | nothing until the cookie expires | a blocked storage write leaves it shown |
|
|
223
|
+
| Theme toggle (footer) | light · dark · system | `data-theme` + localStorage (`ThemeToggle`) | last choice | falls back to system |
|
|
224
|
+
| Locale switcher (footer) | one of `NEXT_PUBLIC_ENABLED_LOCALES` | `NEXT_LOCALE` cookie + the URL prefix | last locale, unprefixed when default | single-locale site shows one option |
|
|
225
|
+
| Nav (mobile) | closed · open (hamburger) | — | closed | — |
|
|
226
|
+
| Product flyout (desktop) | closed · open on hover/focus | — | closed | — |
|
|
227
|
+
| Contact form | idle · sending · success (inline) · error | — | idle | validation errors per field; consent unchecked blocks submit |
|
|
228
|
+
| Newsletter (footer + `/blog`) | idle · sending · success · error | — | idle | the reference's two lines: "Thank you! Your submission has been received!" / "Oops! Something went wrong…" |
|
|
229
|
+
| Pricing billing toggle | monthly · yearly | — | monthly | — |
|
|
230
|
+
| FAQ accordion | per item open/closed (`initialOpen`) | — | first open | no items → section hidden |
|
|
231
|
+
| Video section | poster · playing (`playBadge`) | — | poster | missing asset → poster only |
|
|
232
|
+
| Sign-in card | providers listed · magic-link sent · error | session cookie (auth) | signed in → redirected by `next-path` | no provider configured → honest empty state |
|
|
233
|
+
| Legal document chassis | contents nav scroll position | — | top | — |
|
|
234
|
+
|
|
235
|
+
## 3. Roster, as the registry declares it
|
|
236
|
+
|
|
237
|
+
<!-- generated:begin roster -->
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
marketing-site-free:
|
|
241
|
+
requires: [marketing]
|
|
242
|
+
categories: [accounting, legal, technology]
|
|
243
|
+
roster:
|
|
244
|
+
- { route: "/", content: ["content/en/HomePage/home.mdx"] }
|
|
245
|
+
- { route: "/how-it-works", content: ["content/en/LandingPage/how-it-works.mdx"] }
|
|
246
|
+
- { route: "/features", content: ["content/en/LandingPage/features.mdx"] }
|
|
247
|
+
- { route: "/pricing", content: ["content/en/Pricing/pricing.mdx"] }
|
|
248
|
+
- { route: "/about", content: ["content/en/AboutPage/about.mdx"] }
|
|
249
|
+
- { route: "/faq", content: ["content/en/FAQPage/faq.mdx"] }
|
|
250
|
+
- { route: "/contact", content: ["content/en/ContactPage/contact.mdx"] }
|
|
251
|
+
- { route: "/sign-in" }
|
|
252
|
+
- { route: "/privacy", content: ["content/en/PrivacyPage/privacy.mdx"] }
|
|
253
|
+
- { route: "/terms", content: ["content/en/TermsPage/terms.mdx"] }
|
|
254
|
+
- { route: "/blog", content: ["content/en/LandingPage/blog.mdx"] }
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
<!-- generated:end -->
|
|
258
|
+
|
|
259
|
+
All eleven rows are declared on the registry (`TEMPLATE_BASE_ROSTER` + the Free `/blog` teaser row, #5469 D3/D4), so the template is one declared page set whichever mechanism scaffolds each: the always-copied overlay for the core pages, `site-templates/marketing-site-free/content/**` for the three module-less ones.
|
|
260
|
+
|
|
261
|
+
## 4. Component inventory (Free, by tier)
|
|
262
|
+
|
|
263
|
+
<!-- generated:begin inventory -->
|
|
264
|
+
|
|
265
|
+
| Tier | Used by this template |
|
|
266
|
+
| -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
267
|
+
| Shell | `MarketingShell` |
|
|
268
|
+
| Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
|
|
269
|
+
| Sections | `ContactForm`, `ContentBlock`, `CTA`, `DecisionSplit`, `DocumentChassis`, `FAQ`, `Feature`, `Hero`, `LogoCloud`, `Newsletter`, `Pricing`, `StairSteps`, `Team`, `Testimonials`, `VideoSection` |
|
|
270
|
+
|
|
271
|
+
<!-- generated:end -->
|
|
272
|
+
|
|
273
|
+
Every section above already exists in `packages/ui`; the reproduction is composition and content, not component work. If a standardissue beat has no fit here, it becomes a component commission (DESIGN-DOCTRINE §2), never a bespoke block.
|
|
274
|
+
|
|
275
|
+
## 5. Known gaps this manifest depends on
|
|
276
|
+
|
|
277
|
+
| Gap | Issue |
|
|
278
|
+
| -------------------------------------------------------------------------------------------- | ---------------------------- |
|
|
279
|
+
| `--template` path never enabled the three module-less surfaces (mergeRoster dead) | #5469 D10 (from #5554) |
|
|
280
|
+
| Hero `checklist`, Feature `actions`, CTA `closingLine` — three bounded fields the beats need | #5576 |
|
|
281
|
+
| Consent banner not wired | #5557 |
|
|
282
|
+
| `Banner` contrast variant hides its message | #5558 |
|
|
283
|
+
| `LanguageSwitcher` route wrapper lives in the scaffold, not in `packages/ui` | to file with the template PR |
|
|
284
|
+
| Footer columns + subscribe not composed on the default path | this template's build |
|
|
285
|
+
| `/meet` rename (Pro) | #5563 |
|
|
286
|
+
| `ReportPage` (Pro) | #5562 |
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "marketing-site-free",
|
|
3
3
|
"requires": ["marketing"],
|
|
4
|
+
"extends": "_base",
|
|
4
5
|
"installMap": {
|
|
5
6
|
"provenance.json": ".ailk-template.json"
|
|
6
7
|
},
|
|
7
|
-
"postInstall": "Template marketing-site-free installed. Its
|
|
8
|
+
"postInstall": "Template marketing-site-free installed. Its /pricing, /privacy and /terms seed copy came with the base layer it extends (content/en/) - replace the placeholder copy before you launch."
|
|
8
9
|
}
|