create-ailk 0.1.0 → 0.1.1
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 +124 -3
- package/component-catalog.md +295 -0
- package/dist/cli.js +92 -16
- package/dist/component-catalog.d.ts +11 -0
- package/dist/component-catalog.js +39 -0
- package/dist/copy.d.ts +7 -0
- package/dist/copy.js +24 -0
- package/dist/derive-architecture.d.ts +13 -0
- package/dist/derive-architecture.js +238 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.js +19 -2
- package/dist/lib/extract-module-bundle.d.ts +16 -0
- package/dist/lib/extract-module-bundle.js +184 -0
- package/dist/lib/fetch-module.d.ts +55 -0
- package/dist/lib/fetch-module.js +125 -0
- package/dist/lib/module-license-gate.d.ts +48 -0
- package/dist/lib/module-license-gate.js +67 -0
- package/dist/lib/module-tier.d.ts +35 -0
- package/dist/lib/module-tier.js +37 -0
- package/dist/module-architecture.d.ts +175 -0
- package/dist/module-architecture.js +663 -0
- package/dist/parse-args.d.ts +47 -1
- package/dist/parse-args.js +143 -2
- package/dist/programmatic.d.ts +160 -3
- package/dist/programmatic.js +196 -7
- package/dist/surfaces.d.ts +211 -0
- package/dist/surfaces.js +532 -0
- package/dist/sync-routes.d.ts +92 -0
- package/dist/sync-routes.js +350 -0
- package/package.json +22 -14
- package/templates/.claude/rules/architecture.md +6 -2
- package/templates/.claude/skills/README.md +9 -9
- package/templates/.claude/skills/add-schema/SKILL.md +14 -7
- package/templates/.claude/skills/add-schema/references/schema-types.md +109 -6
- package/templates/.claude/skills/provision-config/SKILL.md +1 -1
- package/templates/.claude/skills/scaffold-commerce/SKILL.md +498 -1
- package/templates/.claude/skills/scaffold-commerce/templates/checkout-route.template.ts +370 -0
- package/templates/.claude/skills/scaffold-commerce/templates/invoice-route.template.ts +376 -0
- package/templates/.claude/skills/scaffold-commerce/templates/payment-link-route.template.ts +471 -0
- package/templates/.claude/skills/scaffold-commerce/templates/portal-route.template.ts +365 -0
- package/templates/.claude/skills/scaffold-commerce/templates/stripe-config.template.ts +60 -0
- package/templates/.claude/skills/scaffold-commerce/templates/subscription-route.template.ts +446 -0
- package/templates/.claude/skills/suggest-site-pages/references/categories.md +4 -4
- package/templates/.env.example +126 -2
- package/templates/CLAUDE.md +11 -5
- package/templates/README.md +1 -1
- package/templates/apps/api/.env.example +38 -0
- package/templates/apps/api/CLAUDE.md +75 -1
- package/templates/apps/api/LICENSE +201 -0
- package/templates/apps/api/api/index.ts +6 -141
- package/templates/apps/api/jest.config.cjs +16 -0
- package/templates/apps/api/package.json +22 -6
- package/templates/apps/api/src/__tests__/module-exclusion.test.ts +141 -0
- package/templates/apps/api/src/__tests__/server.test.ts +46 -0
- package/templates/apps/api/src/__tests__/vercel-handler.test.ts +211 -0
- package/templates/apps/api/src/bin/abandon-sweep.ts +42 -0
- package/templates/apps/api/src/bin/deliverable-resend.ts +144 -0
- package/templates/apps/api/src/bin/deliverable-upload.ts +114 -0
- package/templates/apps/api/src/bin/followup-sweep.ts +44 -0
- package/templates/apps/api/src/bin/listing-csv-sweep.ts +46 -0
- package/templates/apps/api/src/bin/seed-presets.ts +58 -0
- package/templates/apps/api/src/bin/seed-waitlist-experiments.ts +104 -0
- package/templates/apps/api/src/bin/session-retention-sweep.ts +46 -0
- package/templates/apps/api/src/cli.ts +5 -11
- package/templates/apps/api/src/config/index.ts +35 -0
- package/templates/apps/api/src/config/modules.ts +43 -0
- package/templates/apps/api/src/lib/__mocks__/prisma-client.js +11 -0
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +231 -0
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +2 -2
- package/templates/apps/api/src/lib/site.ts +16 -0
- package/templates/apps/api/src/lib/stripe.ts +22 -0
- package/templates/apps/api/src/lib/tenant-db.ts +225 -0
- package/templates/apps/api/src/lib/ws-token.ts +91 -0
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +7 -1
- package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +7 -1
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +91 -4
- package/templates/apps/api/src/middleware/auth.ts +43 -8
- package/templates/apps/api/src/middleware/rate-limit.ts +78 -3
- package/templates/apps/api/src/middleware/tenant.ts +99 -0
- package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +92 -0
- package/templates/apps/api/src/openapi/spec.ts +312 -3
- package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +175 -0
- package/templates/apps/api/src/routes/aeo/index.ts +107 -0
- package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +5 -2
- package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +22 -3
- package/templates/apps/api/src/routes/auth/tokens.ts +13 -1
- package/templates/apps/api/src/routes/billing/__tests__/portal.test.ts +450 -0
- package/templates/apps/api/src/routes/billing/__tests__/read.test.ts +262 -0
- package/templates/apps/api/src/routes/billing/__tests__/usage.test.ts +436 -0
- package/templates/apps/api/src/routes/billing/index.ts +36 -0
- package/templates/apps/api/src/routes/billing/portal.ts +182 -0
- package/templates/apps/api/src/routes/billing/read.ts +75 -0
- package/templates/apps/api/src/routes/billing/usage.ts +153 -0
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +99 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +20 -8
- package/templates/apps/api/src/routes/content/create.ts +1 -0
- package/templates/apps/api/src/routes/content/delete.ts +1 -0
- package/templates/apps/api/src/routes/content/index.ts +42 -6
- package/templates/apps/api/src/routes/content/update.ts +1 -0
- package/templates/apps/api/src/routes/deliverables/__tests__/index.test.ts +393 -0
- package/templates/apps/api/src/routes/deliverables/index.ts +200 -0
- package/templates/apps/api/src/routes/flow-checkouts/__tests__/index.test.ts +443 -0
- package/templates/apps/api/src/routes/flow-checkouts/index.ts +82 -0
- package/templates/apps/api/src/routes/flows/README.md +147 -0
- package/templates/apps/api/src/routes/flows/__tests__/index.test.ts +752 -0
- package/templates/apps/api/src/routes/flows/__tests__/recommender.test.ts +671 -0
- package/templates/apps/api/src/routes/flows/index.ts +202 -0
- package/templates/apps/api/src/routes/flows/recommender.ts +443 -0
- package/templates/apps/api/src/routes/leads/__tests__/index.test.ts +438 -31
- package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +10 -10
- package/templates/apps/api/src/routes/leads/index.ts +43 -9
- package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +547 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/copy-edit.test.ts +815 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +742 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +424 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +364 -0
- package/templates/apps/api/src/routes/project-listings/__tests__/tenant-isolation.test.ts +566 -0
- package/templates/apps/api/src/routes/project-listings/get.ts +70 -0
- package/templates/apps/api/src/routes/project-listings/index.ts +105 -0
- package/templates/apps/api/src/routes/project-listings/list.ts +47 -0
- package/templates/apps/api/src/routes/project-listings/patch-copy.ts +222 -0
- package/templates/apps/api/src/routes/project-listings/patch-draft.ts +97 -0
- package/templates/apps/api/src/routes/project-listings/patch.ts +136 -0
- package/templates/apps/api/src/routes/project-listings/public.ts +52 -0
- package/templates/apps/api/src/routes/project-listings/respond.ts +37 -0
- package/templates/apps/api/src/routes/project-listings/resume-token.ts +22 -0
- package/templates/apps/api/src/routes/project-listings/start.ts +98 -0
- package/templates/apps/api/src/routes/project-listings/submit.ts +122 -0
- package/templates/apps/api/src/routes/schedule/__tests__/index.test.ts +490 -0
- package/templates/apps/api/src/routes/schedule/index.ts +249 -0
- package/templates/apps/api/src/routes/slack/__tests__/actions.test.ts +385 -0
- package/templates/apps/api/src/routes/slack/actions.ts +177 -0
- package/templates/apps/api/src/routes/slack/index.ts +38 -0
- package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +16 -6
- package/templates/apps/api/src/routes/test/auth/session.ts +8 -6
- package/templates/apps/api/src/routes/waitlist-experiments/__tests__/tenant-isolation.test.ts +577 -0
- package/templates/apps/api/src/routes/waitlist-experiments/comparison.ts +78 -0
- package/templates/apps/api/src/routes/waitlist-experiments/index.ts +41 -0
- package/templates/apps/api/src/routes/waitlist-experiments/list.ts +64 -0
- package/templates/apps/api/src/routes/waitlist-experiments/respond.ts +42 -0
- package/templates/apps/api/src/routes/waitlist-experiments/signup.ts +84 -0
- package/templates/apps/api/src/routes/waitlist-experiments/signups.ts +119 -0
- package/templates/apps/api/src/routes/waitlist-signups/__tests__/index.test.ts +238 -0
- package/templates/apps/api/src/routes/waitlist-signups/index.ts +101 -0
- package/templates/apps/api/src/routes/webhooks/README.md +35 -12
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +315 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +270 -0
- package/templates/apps/api/src/routes/webhooks/stripe.ts +248 -20
- package/templates/apps/api/src/routes/workspaces/__tests__/config-tenant-isolation.test.ts +356 -0
- package/templates/apps/api/src/routes/workspaces/__tests__/tenant-isolation.test.ts +671 -0
- package/templates/apps/api/src/routes/workspaces/config.ts +125 -0
- package/templates/apps/api/src/routes/workspaces/index.ts +194 -0
- package/templates/apps/api/src/routes/workspaces/sessions.ts +218 -0
- package/templates/apps/api/src/server.ts +293 -7
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +489 -0
- package/templates/apps/api/src/services/__tests__/aeo-score.test.ts +475 -0
- package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +132 -0
- package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +523 -0
- package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +359 -0
- package/templates/apps/api/src/services/__tests__/entitlements.test.ts +142 -0
- package/templates/apps/api/src/services/__tests__/flow-aggregate.test.ts +425 -0
- package/templates/apps/api/src/services/__tests__/flow-engine.test.ts +2840 -0
- package/templates/apps/api/src/services/__tests__/lead-promotion.test.ts +393 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +8 -8
- package/templates/apps/api/src/services/__tests__/listing-csv-sweep.test.ts +560 -0
- package/templates/apps/api/src/services/__tests__/playbook-compile.test.ts +406 -0
- package/templates/apps/api/src/services/__tests__/playbook-render.test.ts +290 -0
- package/templates/apps/api/src/services/__tests__/project-listing-decision.test.ts +736 -0
- package/templates/apps/api/src/services/__tests__/project-listing-flow.test.ts +475 -0
- package/templates/apps/api/src/services/__tests__/project-listing-issue.test.ts +340 -0
- package/templates/apps/api/src/services/__tests__/recommender-capture.test.ts +983 -0
- package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +278 -0
- package/templates/apps/api/src/services/__tests__/tenant-context-cascade.test.ts +71 -0
- package/templates/apps/api/src/services/__tests__/tenant-context.test.ts +379 -0
- package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +941 -0
- package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +588 -0
- package/templates/apps/api/src/services/__tests__/usage-metering.test.ts +768 -0
- package/templates/apps/api/src/services/__tests__/waitlist-dashboard.test.ts +1314 -0
- package/templates/apps/api/src/services/__tests__/waitlist-experiments.test.ts +341 -0
- package/templates/apps/api/src/services/__tests__/waitlist-followup.test.ts +567 -0
- package/templates/apps/api/src/services/__tests__/waitlist-scoring.test.ts +474 -0
- package/templates/apps/api/src/services/__tests__/waitlist-signups.test.ts +354 -0
- package/templates/apps/api/src/services/abandon-email.ts +307 -0
- package/templates/apps/api/src/services/aeo-score.ts +288 -0
- package/templates/apps/api/src/services/answer-distributions.ts +138 -0
- package/templates/apps/api/src/services/deliverable-fulfillment.ts +523 -0
- package/templates/apps/api/src/services/entitlements.ts +102 -0
- package/templates/apps/api/src/services/flow-aggregate.ts +232 -0
- package/templates/apps/api/src/services/flow-checkouts.ts +123 -0
- package/templates/apps/api/src/services/flow-engine.ts +1278 -0
- package/templates/apps/api/src/services/lead-promotion.ts +176 -0
- package/templates/apps/api/src/services/lead-routing.ts +3 -3
- package/templates/apps/api/src/services/listing-config.ts +102 -0
- package/templates/apps/api/src/services/listing-csv-sweep.ts +455 -0
- package/templates/apps/api/src/services/playbook-compile.ts +398 -0
- package/templates/apps/api/src/services/playbook-render.ts +263 -0
- package/templates/apps/api/src/services/project-listing-decision.ts +490 -0
- package/templates/apps/api/src/services/project-listing-flow.ts +426 -0
- package/templates/apps/api/src/services/project-listing-issue.ts +251 -0
- package/templates/apps/api/src/services/project-listings.ts +1124 -0
- package/templates/apps/api/src/services/recommender-capture.ts +835 -0
- package/templates/apps/api/src/services/scheduling/cal-provider.ts +392 -0
- package/templates/apps/api/src/services/scheduling/index.ts +63 -0
- package/templates/apps/api/src/services/scheduling/types.ts +88 -0
- package/templates/apps/api/src/services/slack-notify.ts +240 -0
- package/templates/apps/api/src/services/tenant-context.ts +451 -0
- package/templates/apps/api/src/services/usage-aggregation.ts +516 -0
- package/templates/apps/api/src/services/usage-credits.ts +340 -0
- package/templates/apps/api/src/services/usage-metering.ts +699 -0
- package/templates/apps/api/src/services/waitlist-dashboard.ts +947 -0
- package/templates/apps/api/src/services/waitlist-experiments.ts +213 -0
- package/templates/apps/api/src/services/waitlist-followup.ts +486 -0
- package/templates/apps/api/src/services/waitlist-scoring.ts +166 -0
- package/templates/apps/api/src/services/waitlist-signups.ts +165 -0
- package/templates/apps/api/src/vercel-handler.ts +165 -0
- package/templates/apps/api/tsconfig.json +0 -12
- package/templates/apps/mcp/CLAUDE.md +19 -9
- package/templates/apps/mcp/LICENSE +201 -0
- package/templates/apps/mcp/__tests__/create_page.test.ts +1 -0
- package/templates/apps/mcp/__tests__/delete_page.test.ts +1 -0
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +105 -0
- package/templates/apps/mcp/__tests__/parity.test.ts +70 -6
- package/templates/apps/mcp/__tests__/request_callback.test.ts +4 -4
- package/templates/apps/mcp/__tests__/schedule_tools.test.ts +242 -0
- package/templates/apps/mcp/__tests__/submit_lead.test.ts +4 -4
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +4 -4
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +47 -0
- package/templates/apps/mcp/__tests__/update_page.test.ts +1 -0
- package/templates/apps/mcp/package.json +6 -4
- package/templates/apps/mcp/src/config/modules.ts +37 -0
- package/templates/apps/mcp/src/server.ts +109 -18
- package/templates/apps/mcp/src/tools/capture_lead.ts +1 -1
- package/templates/apps/mcp/src/tools/create_booking.ts +58 -0
- package/templates/apps/mcp/src/tools/create_page.ts +1 -0
- package/templates/apps/mcp/src/tools/delete_page.ts +1 -0
- package/templates/apps/mcp/src/tools/get_event_meta.ts +55 -0
- package/templates/apps/mcp/src/tools/get_flow.ts +61 -0
- package/templates/apps/mcp/src/tools/index.ts +25 -0
- package/templates/apps/mcp/src/tools/list_availability.ts +67 -0
- package/templates/apps/mcp/src/tools/purchase.ts +3 -0
- package/templates/apps/mcp/src/tools/submit_flow_step.ts +83 -0
- package/templates/apps/mcp/src/tools/update_page.ts +1 -0
- package/templates/apps/mcp/tsconfig.json +1 -9
- package/templates/apps/web/.env.example +44 -0
- package/templates/apps/web/CLAUDE.md +28 -0
- package/templates/apps/web/LICENSE +201 -0
- package/templates/apps/web/__tests__/__mocks__/code-highlight.jest-stub.ts +24 -0
- package/templates/apps/web/__tests__/__mocks__/next-intl-server.ts +33 -0
- package/templates/apps/web/__tests__/__mocks__/next-intl.ts +18 -0
- package/templates/apps/web/__tests__/__mocks__/server-only.ts +13 -0
- package/templates/apps/web/__tests__/__mocks__/style-mock.js +4 -0
- package/templates/apps/web/__tests__/__mocks__/vercel-analytics-server.ts +9 -0
- package/templates/apps/web/__tests__/jest-support/import-meta-transformer.cjs +90 -0
- package/templates/apps/web/__tests__/setup.ts +22 -32
- package/templates/apps/web/app/.well-known/ai-plugin.json/route.ts +6 -3
- package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +8 -2
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/page.test.tsx +260 -0
- package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +263 -0
- package/templates/apps/web/app/[locale]/(authed)/account/sign-out-button.tsx +39 -0
- package/templates/apps/web/app/[locale]/(authed)/layout.tsx +54 -0
- package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +96 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/[experimentId]/page.tsx +309 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/[experimentId]/signups/[leadId]/page.tsx +149 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/comparison.test.tsx +273 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/gate.test.tsx +172 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/list.test.tsx +171 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/__tests__/signup.test.tsx +179 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/ExperimentsTable.tsx +116 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/ForbiddenState.tsx +24 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/OfferFunnelTable.tsx +66 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/RollupTicker.tsx +61 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/ScoreTrace.tsx +114 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/SignupsTable.tsx +139 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/WaitlistComparisonTabs.tsx +85 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/components/status-badges.tsx +67 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/format.ts +111 -0
- package/templates/apps/web/app/[locale]/(authed)/waitlist/page.tsx +179 -0
- package/templates/apps/web/app/[locale]/about/page.tsx +10 -1
- package/templates/apps/web/app/[locale]/blog/[[...slug]]/page.tsx +6 -1
- package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/careers/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/case-studies/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/case-studies/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/case-studies/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/clients/__tests__/page-renderer-migration.test.tsx +11 -1
- package/templates/apps/web/app/[locale]/clients/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/contact/ContactForm.tsx +21 -1
- package/templates/apps/web/app/[locale]/contact/ConversationalIntakeWrapper.tsx +188 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +242 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +29 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/intake-analytics.test.ts +51 -0
- package/templates/apps/web/app/[locale]/contact/__tests__/page-renderer-migration.test.tsx +39 -15
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +21 -3
- package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +49 -0
- package/templates/apps/web/app/[locale]/contact/intake-script.ts +66 -0
- package/templates/apps/web/app/[locale]/contact/page.tsx +14 -4
- package/templates/apps/web/app/[locale]/courses/[slug]/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/courses/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/courses/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/docs/[[...slug]]/page.tsx +1 -0
- package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +11 -1
- package/templates/apps/web/app/[locale]/downloads/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/events/__tests__/page-renderer-migration.test.tsx +12 -2
- package/templates/apps/web/app/[locale]/events/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/faq/page.tsx +10 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +265 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.permalink.test.tsx +445 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.test.tsx +341 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/checkout.actions.test.ts +287 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/flow.actions.test.ts +302 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/two-route-tool.test.tsx +128 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/checkout.actions.ts +254 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/flow.actions.ts +144 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/page.tsx +108 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/ResultsClient.tsx +532 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/ResultsEmailStep.tsx +121 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/__tests__/ResultsClient.checkout.test.tsx +457 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/__tests__/page.test.tsx +396 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/results/[payload]/page.tsx +114 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/start/page.tsx +52 -0
- package/templates/apps/web/app/[locale]/how-to/[slug]/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/how-to/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/integrations/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/integrations/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/integrations/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/launch-service/page.tsx +14 -1
- package/templates/apps/web/app/[locale]/layout.tsx +115 -16
- package/templates/apps/web/app/[locale]/page.tsx +10 -1
- package/templates/apps/web/app/[locale]/partners/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/partners/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/partners/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/products/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/products/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/products/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/projects/[slug]/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/projects/__tests__/page-renderer-migration.test.tsx +10 -0
- package/templates/apps/web/app/[locale]/projects/apply/ListingApplicationClient.tsx +110 -0
- package/templates/apps/web/app/[locale]/projects/apply/__tests__/ListingApplicationClient.test.tsx +96 -0
- package/templates/apps/web/app/[locale]/projects/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/resources/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/resources/__tests__/page-renderer-migration.test.tsx +12 -2
- package/templates/apps/web/app/[locale]/resources/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/schedule/__tests__/page.test.tsx +117 -0
- package/templates/apps/web/app/[locale]/schedule/confirmed/__tests__/page.test.tsx +96 -0
- package/templates/apps/web/app/[locale]/schedule/confirmed/page.tsx +92 -0
- package/templates/apps/web/app/[locale]/schedule/page.tsx +82 -0
- package/templates/apps/web/app/[locale]/services/[slug]/page.tsx +9 -0
- package/templates/apps/web/app/[locale]/services/__tests__/page-renderer-migration.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/services/page.tsx +9 -1
- package/templates/apps/web/app/[locale]/sign-in/__tests__/next-path.test.ts +31 -0
- package/templates/apps/web/app/[locale]/sign-in/__tests__/page.test.tsx +152 -0
- package/templates/apps/web/app/[locale]/sign-in/next-path.ts +0 -0
- package/templates/apps/web/app/[locale]/sign-in/page.tsx +83 -0
- package/templates/apps/web/app/[locale]/sign-in/sign-in-card.tsx +123 -0
- package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/software/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/tech-articles/[slug]/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/tech-articles/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/testimonials/__tests__/page-renderer-migration.test.tsx +11 -1
- package/templates/apps/web/app/[locale]/testimonials/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/thanks/[slug]/__tests__/page.test.tsx +93 -0
- package/templates/apps/web/app/[locale]/thanks/[slug]/page.tsx +48 -0
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +11 -1
- package/templates/apps/web/app/[locale]/use-cases/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/whitepapers/[slug]/page.tsx +13 -1
- package/templates/apps/web/app/[locale]/whitepapers/__tests__/page-renderer-migration.test.tsx +1 -1
- package/templates/apps/web/app/globals.css +35 -0
- package/templates/apps/web/app/llms.txt/route.ts +2 -1
- package/templates/apps/web/app/og/route.tsx +10 -2
- package/templates/apps/web/auth.ts +8 -0
- package/templates/apps/web/components/sign-out-trigger.tsx +42 -0
- package/templates/apps/web/content/en/blog/README.txt +25 -0
- package/templates/apps/web/content/en/docs/index.mdx +28 -0
- package/templates/apps/web/jest.config.cjs +84 -27
- package/templates/apps/web/lib/__tests__/site-brand.test.ts +119 -0
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +499 -0
- package/templates/apps/web/lib/account-config.ts +13 -0
- package/templates/apps/web/lib/server-api.ts +85 -0
- package/templates/apps/web/lib/site-brand.tsx +118 -0
- package/templates/apps/web/messages/en.json +275 -7
- package/templates/apps/web/middleware.ts +11 -3
- package/templates/apps/web/next.config.mjs +8 -2
- package/templates/apps/web/package.json +16 -7
- package/templates/apps/web/postcss.config.mjs +23 -0
- package/templates/apps/web/public/.well-known/security.txt +3 -3
- package/templates/apps/web/src/lib/routes.ts +15 -2
- package/templates/apps/web/tsconfig.json +1 -16
- package/templates/content/_site.mdx +24 -25
- package/templates/content/en/AboutPage/about.mdx +24 -14
- package/templates/content/en/ContactPage/contact.mdx +23 -14
- package/templates/content/en/FAQPage/faq.mdx +10 -392
- package/templates/content/en/HomePage/home.mdx +14 -285
- package/templates/database/CHANGELOG.md +382 -0
- package/templates/database/LICENSE +201 -0
- package/templates/database/README.md +3 -1
- package/templates/database/__tests__/flows-listing-diagnostic.test.ts +392 -0
- package/templates/database/__tests__/flows-presets.test.ts +173 -0
- package/templates/database/__tests__/prefixed-ids.db.test.ts +146 -0
- package/templates/database/__tests__/seed.test.ts +88 -0
- package/templates/database/__tests__/user-cascade.test.ts +19 -4
- package/templates/database/auth/schema.prisma +521 -0
- package/templates/database/config/schema.prisma +234 -0
- package/templates/database/content/schema.prisma +263 -0
- package/templates/database/flows/listing-diagnostic.ts +182 -0
- package/templates/database/flows/presets.ts +315 -0
- package/templates/database/inbox/__tests__/schema.test.ts +4 -0
- package/templates/database/inbox/schema.prisma +476 -3
- package/templates/database/jest.config.cjs +8 -0
- package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +201 -0
- package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +67 -0
- package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +46 -0
- package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +25 -0
- package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +49 -0
- package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +197 -0
- package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +32 -0
- package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +22 -0
- package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +151 -0
- package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +223 -0
- package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +22 -0
- package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +32 -0
- package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +40 -0
- package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +4 -0
- package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +2 -0
- package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +2 -0
- package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +29 -0
- package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +6 -0
- package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +39 -0
- package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +24 -0
- package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +3 -0
- package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +33 -0
- package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +30 -0
- package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +47 -0
- package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +16 -0
- package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +47 -0
- package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +10 -0
- package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +26 -0
- package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +90 -0
- package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +174 -0
- package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +14 -0
- package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +25 -0
- package/templates/database/ops/schema.prisma +27 -0
- package/templates/database/package.json +42 -4
- package/templates/database/prisma.config.ts +1 -1
- package/templates/database/schema.prisma +19 -435
- package/templates/database/scripts/db-generate-locked.sh +0 -0
- package/templates/database/seed-test.ts +14 -4
- package/templates/database/seed.ts +148 -0
- package/templates/database/tenancy.ts +45 -0
- package/templates/database/tsconfig.flows.json +15 -0
- package/templates/database/tsconfig.json +7 -1
- package/templates/database/tsconfig.tenancy.json +14 -0
- package/templates/package.json +30 -55
- package/templates/pnpm-workspace.yaml +0 -3
- package/templates/project.yaml +1 -1
- package/templates/tsconfig.json +1 -37
- package/templates/apps/web/__tests__/auth/adversarial/cookie-attributes.test.ts +0 -94
- package/templates/apps/web/__tests__/auth/adversarial/oauth-state-parameter.test.ts +0 -75
- package/templates/apps/web/__tests__/auth/adversarial/redirect-uri-allowlist.test.ts +0 -82
- package/templates/apps/web/__tests__/auth/env-helpers.test.ts +0 -168
- package/templates/apps/web/__tests__/authority-list-routes.test.tsx +0 -208
- package/templates/apps/web/__tests__/better-stack.test.ts +0 -66
- package/templates/apps/web/__tests__/blog-dir-resolution.test.ts +0 -87
- package/templates/apps/web/__tests__/blog-source-populated.test.ts +0 -130
- package/templates/apps/web/__tests__/data-testid-coverage.test.tsx +0 -60
- package/templates/apps/web/__tests__/google-analytics.test.tsx +0 -104
- package/templates/apps/web/__tests__/i18n/middleware.test.ts +0 -119
- package/templates/apps/web/__tests__/i18n/routing.test.ts +0 -114
- package/templates/apps/web/__tests__/i18n/translations.test.ts +0 -191
- package/templates/apps/web/__tests__/json-ld.test.ts +0 -98
- package/templates/apps/web/__tests__/knowledge-events-routes.test.tsx +0 -580
- package/templates/apps/web/__tests__/layout-stealth.test.ts +0 -39
- package/templates/apps/web/__tests__/lighthouse-fixtures/improvement-image-shrink.tsx +0 -103
- package/templates/apps/web/__tests__/lighthouse-fixtures/override-fixture.md +0 -114
- package/templates/apps/web/__tests__/lighthouse-fixtures/regression-bloat.tsx +0 -94
- package/templates/apps/web/__tests__/page.test.tsx +0 -230
- package/templates/apps/web/__tests__/products-services-phase1.test.tsx +0 -321
- package/templates/apps/web/__tests__/projects-routes.test.tsx +0 -392
- package/templates/apps/web/__tests__/resources-downloads-integrations-phase2.test.tsx +0 -475
- package/templates/apps/web/__tests__/routes/ai-plugin-json.test.ts +0 -53
- package/templates/apps/web/__tests__/routes/blog-route.test.tsx +0 -191
- package/templates/apps/web/__tests__/routes/llms-txt.test.ts +0 -123
- package/templates/apps/web/__tests__/routes/robots-txt.test.ts +0 -52
- package/templates/apps/web/__tests__/routes/sitemap-xml.test.ts +0 -78
- package/templates/apps/web/__tests__/routes/well-known-mcp.test.ts +0 -203
- package/templates/apps/web/__tests__/section-routes.test.tsx +0 -693
- package/templates/apps/web/__tests__/security-headers.test.ts +0 -201
- package/templates/apps/web/__tests__/sentry-config.test.ts +0 -116
- package/templates/apps/web/__tests__/sitemap-locales.test.ts +0 -415
- package/templates/apps/web/__tests__/standalone-informational-routes.test.tsx +0 -844
- package/templates/apps/web/app/[locale]/__tests__/layout.test.tsx +0 -120
- package/templates/apps/web/app/[locale]/__tests__/page-renderer-migration.test.tsx +0 -202
- package/templates/apps/web/app/__tests__/error-boundaries.test.tsx +0 -152
- package/templates/apps/web/content/en/blog/index.mdx +0 -15
- package/templates/apps/web/content/en/blog/launching-ailk.mdx +0 -20
- package/templates/apps/web/content/en/docs/getting-started.mdx +0 -30
- package/templates/content/.gitkeep +0 -0
- package/templates/content/CLAUDE.md +0 -85
- package/templates/content/ar/HomePage/home.mdx +0 -123
- package/templates/content/ar/_site.mdx +0 -35
- package/templates/content/de/_site.mdx +0 -29
- package/templates/content/en/.gitkeep +0 -0
- package/templates/content/en/AboutPage/about.schema.json +0 -82
- package/templates/content/en/BookCall/book-call.mdx +0 -19
- package/templates/content/en/BookCall/book-call.schema.json +0 -121
- package/templates/content/en/BreadcrumbList/site-breadcrumbs.mdx +0 -20
- package/templates/content/en/CareersList/careers.mdx +0 -24
- package/templates/content/en/CaseStudiesList/case-studies.mdx +0 -22
- package/templates/content/en/CaseStudiesList/showcase.mdx +0 -8
- package/templates/content/en/CaseStudy/ailk-aeo-rollout.mdx +0 -32
- package/templates/content/en/CaseStudy/schema-builder-migration.mdx +0 -41
- package/templates/content/en/ClientsList/clients.mdx +0 -38
- package/templates/content/en/ContactPage/contact.schema.json +0 -100
- package/templates/content/en/ContactPoint/primary.mdx +0 -14
- package/templates/content/en/Course/aeo-fundamentals.mdx +0 -37
- package/templates/content/en/Course/schema-builder-workshop.mdx +0 -62
- package/templates/content/en/CoursesList/courses.mdx +0 -22
- package/templates/content/en/DownloadsList/downloads.mdx +0 -22
- package/templates/content/en/Event/aeo-office-hours-may-2026.mdx +0 -39
- package/templates/content/en/Event/ailk-launch-day-2026.mdx +0 -35
- package/templates/content/en/EventsList/events.mdx +0 -26
- package/templates/content/en/FAQPage/faq.schema.json +0 -231
- package/templates/content/en/GlossaryList/glossary.mdx +0 -19
- package/templates/content/en/GlossaryList/glossary.schema.json +0 -300
- package/templates/content/en/HomePage/home.schema.json +0 -88
- package/templates/content/en/HomePage/launch-service.mdx +0 -475
- package/templates/content/en/HomePage/launch-service.schema.json +0 -138
- package/templates/content/en/HowTo/add-mdx-content.mdx +0 -38
- package/templates/content/en/HowTo/configure-aeo-scoring.mdx +0 -35
- package/templates/content/en/HowTo/set-up-json-ld.mdx +0 -36
- package/templates/content/en/Integration/github-actions.mdx +0 -31
- package/templates/content/en/Integration/openai-api.mdx +0 -26
- package/templates/content/en/Integration/vercel.mdx +0 -32
- package/templates/content/en/IntegrationsList/integrations.mdx +0 -22
- package/templates/content/en/JobPosting/content-strategist.mdx +0 -46
- package/templates/content/en/JobPosting/developer-advocate.mdx +0 -47
- package/templates/content/en/JobPosting/senior-fullstack-engineer.mdx +0 -57
- package/templates/content/en/LandingPage/aeo-audit.mdx +0 -19
- package/templates/content/en/LandingPage/aeo-audit.schema.json +0 -92
- package/templates/content/en/LandingPage/agency-waitlist.mdx +0 -340
- package/templates/content/en/LandingPage/agency-waitlist.schema.json +0 -152
- package/templates/content/en/LandingPage/developers.mdx +0 -19
- package/templates/content/en/LandingPage/developers.schema.json +0 -109
- package/templates/content/en/LandingPage/for-agencies.mdx +0 -390
- package/templates/content/en/LandingPage/for-agencies.schema.json +0 -107
- package/templates/content/en/LandingPage/for-ai-search-agencies.mdx +0 -417
- package/templates/content/en/LandingPage/for-ai-search-agencies.schema.json +0 -105
- package/templates/content/en/LandingPage/for-businesses.mdx +0 -19
- package/templates/content/en/LandingPage/for-businesses.schema.json +0 -96
- package/templates/content/en/LandingPage/platform.mdx +0 -369
- package/templates/content/en/LandingPage/platform.schema.json +0 -166
- package/templates/content/en/LandingPage/vs-ai-website-builders.mdx +0 -19
- package/templates/content/en/LandingPage/vs-ai-website-builders.schema.json +0 -102
- package/templates/content/en/LandingPage/vs-wordpress.mdx +0 -19
- package/templates/content/en/LandingPage/vs-wordpress.schema.json +0 -53
- package/templates/content/en/NewsletterSignup/newsletter.mdx +0 -236
- package/templates/content/en/NewsletterSignup/newsletter.schema.json +0 -91
- package/templates/content/en/Organization/site-owner.mdx +0 -16
- package/templates/content/en/Partner/prisma.mdx +0 -31
- package/templates/content/en/Partner/supabase.mdx +0 -30
- package/templates/content/en/Partner/vercel.mdx +0 -28
- package/templates/content/en/PartnersList/partners.mdx +0 -22
- package/templates/content/en/Person/founder.mdx +0 -18
- package/templates/content/en/Pricing/pricing.mdx +0 -538
- package/templates/content/en/Pricing/pricing.schema.json +0 -209
- package/templates/content/en/PrivacyPage/privacy.mdx +0 -165
- package/templates/content/en/PrivacyPage/privacy.schema.json +0 -64
- package/templates/content/en/Product/ailk.mdx +0 -19
- package/templates/content/en/Product/ailk.schema.json +0 -94
- package/templates/content/en/Product/api-launch-kit.mdx +0 -26
- package/templates/content/en/Product/launch-kit.mdx +0 -28
- package/templates/content/en/ProductsList/products.mdx +0 -26
- package/templates/content/en/Project/ailk-phase-2.mdx +0 -54
- package/templates/content/en/ProjectsList/projects.mdx +0 -25
- package/templates/content/en/ResourceDetail/aeo-scoring-guide.mdx +0 -27
- package/templates/content/en/ResourceDetail/content-model-whitepaper.mdx +0 -28
- package/templates/content/en/ResourceDetail/schema-org-quick-reference.mdx +0 -39
- package/templates/content/en/ResourcesHub/resources.mdx +0 -22
- package/templates/content/en/Service/consulting.mdx +0 -22
- package/templates/content/en/Service/implementation.mdx +0 -30
- package/templates/content/en/Service/launch-service.mdx +0 -232
- package/templates/content/en/Service/launch.mdx +0 -228
- package/templates/content/en/ServicesList/services.mdx +0 -84
- package/templates/content/en/SoftwareProduct/ailk-aeo.mdx +0 -44
- package/templates/content/en/SoftwareProduct/ailk-content-adapters.mdx +0 -47
- package/templates/content/en/SoftwareProduct/ailk-schema.mdx +0 -49
- package/templates/content/en/TeamList/team.mdx +0 -63
- package/templates/content/en/TeamMember/founder.mdx +0 -72
- package/templates/content/en/TermsPage/terms.mdx +0 -19
- package/templates/content/en/TermsPage/terms.schema.json +0 -99
- package/templates/content/en/TestimonialsList/testimonials.mdx +0 -44
- package/templates/content/en/UseCasesList/use-cases.mdx +0 -30
- package/templates/content/en/Whitepaper/ax-first-product-development.mdx +0 -27
- package/templates/content/en/Whitepaper/open-core-commercial-strategy.mdx +0 -27
- package/templates/content/en/Whitepaper/structured-data-for-answer-engines.mdx +0 -31
- package/templates/content/en-XA/AboutPage/about.mdx +0 -8
- package/templates/content/en-XA/FAQPage/faq.mdx +0 -8
- package/templates/content/en-XA/HomePage/home.mdx +0 -8
- package/templates/content/es/_site.mdx +0 -30
- package/templates/content/fr/_site.mdx +0 -30
- package/templates/content/ja/_site.mdx +0 -30
- package/templates/content/pt-BR/AboutPage/about.mdx +0 -8
- package/templates/content/pt-BR/FAQPage/faq.mdx +0 -8
- package/templates/content/pt-BR/HomePage/home.mdx +0 -23
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Site brand — the one place `apps/web` resolves its display name, base URL,
|
|
3
|
+
* and logo mark (#4984). Extracted verbatim from `app/[locale]/layout.tsx`
|
|
4
|
+
* so the /sign-in card can render the same brand mark the Nav + Footer
|
|
5
|
+
* chrome slots do, without a second copy drifting.
|
|
6
|
+
*
|
|
7
|
+
* #4157 — `SITE_NAME` / `SITE_BASE_URL` resolve, in order:
|
|
8
|
+
* 1. The env override (`NEXT_PUBLIC_SITE_NAME` / `NEXT_PUBLIC_BASE_URL`).
|
|
9
|
+
* 2. `content/_site.mdx`'s `siteName:` / `baseUrl:` frontmatter — the
|
|
10
|
+
* customer's own canonical site identity, set by `create-ailk` at
|
|
11
|
+
* scaffold time (or edited later, e.g. via the `set_site_identity` MCP
|
|
12
|
+
* tool).
|
|
13
|
+
* 3. A neutral, non-vendor fallback — used only when `_site.mdx` is
|
|
14
|
+
* missing or its frontmatter doesn't parse. NEVER "AI Launch Kit": a
|
|
15
|
+
* fresh scaffold's `_site.mdx` always carries the customer's real name
|
|
16
|
+
* (`packages/create-ailk/template-overlay/content/_site.mdx`), so this
|
|
17
|
+
* fallback is a last resort, not the everyday default.
|
|
18
|
+
*
|
|
19
|
+
* `_site.mdx` reading is a small, local, synchronous frontmatter parse
|
|
20
|
+
* rather than a dependency on `@working-theory/site-config`'s `loadSiteConfig`
|
|
21
|
+
* (`packages/site-config/src/server/load.ts`): that package is async (this
|
|
22
|
+
* module's exports are plain constants, read at many synchronous call
|
|
23
|
+
* sites — Nav/Footer props, `siteLogo()`, edge-safe route defaults) and
|
|
24
|
+
* brings gray-matter + Zod validation + optimistic-locking writes built for
|
|
25
|
+
* the agent-operator editing workflow — disproportionate for reading two
|
|
26
|
+
* fields. See docs/specs/4157-scaffold-brand-defaults-spec.md § Design
|
|
27
|
+
* Decisions (D1) for the full reasoning.
|
|
28
|
+
*/
|
|
29
|
+
|
|
30
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
31
|
+
import { join } from "node:path";
|
|
32
|
+
|
|
33
|
+
import type { ReactElement } from "react";
|
|
34
|
+
import { parse as parseYaml } from "yaml";
|
|
35
|
+
|
|
36
|
+
/** Neutral, non-vendor fallback — see module doc comment point 3. */
|
|
37
|
+
export const FALLBACK_SITE_NAME = "My Site";
|
|
38
|
+
/** Neutral, non-vendor fallback — see module doc comment point 3. */
|
|
39
|
+
export const FALLBACK_BASE_URL = "https://example.com";
|
|
40
|
+
|
|
41
|
+
const FRONTMATTER_RE = /^---\r?\n([\s\S]*?)\r?\n---/;
|
|
42
|
+
|
|
43
|
+
interface SiteFrontmatter {
|
|
44
|
+
// `| undefined` on top of `?` — required under exactOptionalPropertyTypes
|
|
45
|
+
// because readSiteFrontmatter() always sets both keys, sometimes to
|
|
46
|
+
// `undefined` (a plain `?: string` would forbid that explicit assignment).
|
|
47
|
+
siteName?: string | undefined;
|
|
48
|
+
baseUrl?: string | undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resolve the content root exactly the way
|
|
53
|
+
* `packages/page-renderer/src/content-selector.ts`'s (unexported)
|
|
54
|
+
* `resolveContentRoot()` does: `AILK_CONTENT_ROOT` env override, else two
|
|
55
|
+
* levels up from cwd — `apps/web` in dev/build, so `../../content` lands on
|
|
56
|
+
* the site/scaffold root's `content/` directory. Duplicated locally because
|
|
57
|
+
* that resolver isn't part of `@working-theory/page-renderer`'s public API.
|
|
58
|
+
*/
|
|
59
|
+
function resolveContentRoot(): string {
|
|
60
|
+
const override = process.env.AILK_CONTENT_ROOT;
|
|
61
|
+
if (override && override.length > 0) return override;
|
|
62
|
+
return join(process.cwd(), "..", "..", "content");
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Synchronously read + parse just the `siteName` / `baseUrl` frontmatter
|
|
67
|
+
* fields out of `_site.mdx`. Returns `null` on any failure (file absent,
|
|
68
|
+
* unreadable, no frontmatter block, unparseable YAML) — callers fall back to
|
|
69
|
+
* a neutral default, never to a vendor-branded one.
|
|
70
|
+
*/
|
|
71
|
+
function readSiteFrontmatter(): SiteFrontmatter | null {
|
|
72
|
+
try {
|
|
73
|
+
const path = join(resolveContentRoot(), "_site.mdx");
|
|
74
|
+
if (!existsSync(path)) return null;
|
|
75
|
+
|
|
76
|
+
const raw = readFileSync(path, "utf8");
|
|
77
|
+
const match = FRONTMATTER_RE.exec(raw);
|
|
78
|
+
if (!match) return null;
|
|
79
|
+
|
|
80
|
+
const parsed: unknown = parseYaml(match[1] ?? "");
|
|
81
|
+
if (!parsed || typeof parsed !== "object") return null;
|
|
82
|
+
|
|
83
|
+
const { siteName, baseUrl } = parsed as Record<string, unknown>;
|
|
84
|
+
return {
|
|
85
|
+
siteName: typeof siteName === "string" ? siteName : undefined,
|
|
86
|
+
baseUrl: typeof baseUrl === "string" ? baseUrl : undefined,
|
|
87
|
+
};
|
|
88
|
+
} catch {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// Read once at module init — mirrors the existing SITE_NAME contract (a
|
|
94
|
+
// plain constant, not a function), and every consumer of this module already
|
|
95
|
+
// runs in the Node.js runtime (no `content/` access exists in the Edge
|
|
96
|
+
// runtime, so `app/og/route.tsx` — the one Edge-runtime consumer among the
|
|
97
|
+
// #4157 sites — deliberately does NOT import this module; see its own
|
|
98
|
+
// comment).
|
|
99
|
+
const siteFrontmatter = readSiteFrontmatter();
|
|
100
|
+
|
|
101
|
+
export const SITE_NAME =
|
|
102
|
+
process.env.NEXT_PUBLIC_SITE_NAME ?? siteFrontmatter?.siteName ?? FALLBACK_SITE_NAME;
|
|
103
|
+
|
|
104
|
+
export const SITE_BASE_URL =
|
|
105
|
+
process.env.NEXT_PUBLIC_BASE_URL ?? siteFrontmatter?.baseUrl ?? FALLBACK_BASE_URL;
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* Shared brand mark — the light/dark logo pair, mode-switched via the theme
|
|
109
|
+
* `dark:` utility. RSC-safe (no hooks, no client state).
|
|
110
|
+
*/
|
|
111
|
+
export function siteLogo(): ReactElement {
|
|
112
|
+
return (
|
|
113
|
+
<>
|
|
114
|
+
<img src="/logo-light.svg" alt={SITE_NAME} height={28} className="block dark:hidden" />
|
|
115
|
+
<img src="/logo-dark.svg" alt={SITE_NAME} height={28} className="hidden dark:block" />
|
|
116
|
+
</>
|
|
117
|
+
);
|
|
118
|
+
}
|
|
@@ -4,7 +4,12 @@
|
|
|
4
4
|
"docs": "Docs",
|
|
5
5
|
"blog": "Blog",
|
|
6
6
|
"openMenu": "Open navigation menu",
|
|
7
|
-
"closeMenu": "Close navigation menu"
|
|
7
|
+
"closeMenu": "Close navigation menu",
|
|
8
|
+
"moreLinks": "More links",
|
|
9
|
+
"schedule": "Book a call",
|
|
10
|
+
"signIn": "Sign in",
|
|
11
|
+
"signOut": "Sign out",
|
|
12
|
+
"account": "Account"
|
|
8
13
|
},
|
|
9
14
|
"consent": {
|
|
10
15
|
"title": "Cookie Preferences",
|
|
@@ -14,10 +19,10 @@
|
|
|
14
19
|
"policyLinkLabel": "Privacy policy"
|
|
15
20
|
},
|
|
16
21
|
"common": {
|
|
17
|
-
"siteTitle": "
|
|
22
|
+
"siteTitle": "My Site"
|
|
18
23
|
},
|
|
19
24
|
"home": {
|
|
20
|
-
"heading": "
|
|
25
|
+
"heading": "My Site",
|
|
21
26
|
"emptyState": "AX-first OSS template for shipping software with API + MCP as canonical surfaces."
|
|
22
27
|
},
|
|
23
28
|
"about": {
|
|
@@ -58,7 +63,22 @@
|
|
|
58
63
|
"messageLabel": "Message",
|
|
59
64
|
"sending": "Sending\u2026",
|
|
60
65
|
"sendMessage": "Send message",
|
|
61
|
-
"successMessage": "Thank you for reaching out! We will be in touch shortly."
|
|
66
|
+
"successMessage": "Thank you for reaching out! We will be in touch shortly.",
|
|
67
|
+
"intake": {
|
|
68
|
+
"guidedBadge": "Guided",
|
|
69
|
+
"skip": "Skip",
|
|
70
|
+
"send": "Send",
|
|
71
|
+
"freeTextPlaceholder": "Type your answer\u2026",
|
|
72
|
+
"nameAck": "Thanks for stopping by!",
|
|
73
|
+
"namePrompt": "What's your name?",
|
|
74
|
+
"messageAck": "Good to meet you.",
|
|
75
|
+
"messagePrompt": "What are you hoping to get done?",
|
|
76
|
+
"emailAck": "Got it \u2014 last one.",
|
|
77
|
+
"emailPrompt": "What's the best email to reach you at?",
|
|
78
|
+
"skipMessage": "No worries \u2014 here's our form instead.",
|
|
79
|
+
"completionMessage": "Thanks! We'll be in touch shortly.",
|
|
80
|
+
"submitError": "We couldn't send that automatically \u2014 please review and send below."
|
|
81
|
+
}
|
|
62
82
|
},
|
|
63
83
|
"downloads": {
|
|
64
84
|
"heading": "Downloads",
|
|
@@ -72,9 +92,71 @@
|
|
|
72
92
|
"heading": "FAQ",
|
|
73
93
|
"emptyState": "Frequently asked questions content coming soon."
|
|
74
94
|
},
|
|
95
|
+
"flow": {
|
|
96
|
+
"progress": "Step {current} of {total}",
|
|
97
|
+
"validationRequired": "This field is required",
|
|
98
|
+
"validationInvalidEmail": "Enter a valid email address",
|
|
99
|
+
"validationSelectOption": "Choose an option to continue",
|
|
100
|
+
"validationTooLong": "This value is too long",
|
|
101
|
+
"validationInvalidUrl": "Enter a valid URL",
|
|
102
|
+
"validationTooShort": "Please add a bit more detail",
|
|
103
|
+
"validationSelectAtLeastOne": "Choose at least one option to continue",
|
|
104
|
+
"submitError": "Something went wrong, please try again.",
|
|
105
|
+
"rateLimited": "Too many attempts — please wait {seconds}s and try again.",
|
|
106
|
+
"next": "Continue",
|
|
107
|
+
"completedTitle": "You're all set",
|
|
108
|
+
"completedBody": "Thanks — we'll be in touch shortly.",
|
|
109
|
+
"goBack": "Go Back",
|
|
110
|
+
"computing": "Scoring your site's AI visibility...",
|
|
111
|
+
"whyThis": "Why this?",
|
|
112
|
+
"selectAllThatApply": "Select all that apply",
|
|
113
|
+
"getStarted": "Get Started",
|
|
114
|
+
"landingIntro": "A few short questions, then your result \u2014 it takes about a minute.",
|
|
115
|
+
"bookCall": "Book a Call",
|
|
116
|
+
"emailMePlan": "Save plan",
|
|
117
|
+
"pairingTitle": "Better together",
|
|
118
|
+
"pay": "Pay",
|
|
119
|
+
"back": "Back",
|
|
120
|
+
"emailStepTitle": "Where should we send your receipt?",
|
|
121
|
+
"emailStepSaveTitle": "Where should we send your plan?",
|
|
122
|
+
"emailPlaceholder": "you@company.com",
|
|
123
|
+
"checkoutSuccess": "Payment received \u2014 we'll be in touch to get you set up.",
|
|
124
|
+
"checkoutCancelled": "Checkout cancelled \u2014 your recommendation is still here whenever you're ready.",
|
|
125
|
+
"savedTitle": "Plan sent",
|
|
126
|
+
"savedBody": "Check your inbox \u2014 your recommendation is on its way.",
|
|
127
|
+
"checkoutError": "We couldn't start checkout \u2014 please try again.",
|
|
128
|
+
"sidePanel": {
|
|
129
|
+
"anchorTitle": "Not sure where to start?"
|
|
130
|
+
},
|
|
131
|
+
"price": {
|
|
132
|
+
"fromPrefix": "From"
|
|
133
|
+
},
|
|
134
|
+
"priceCard": {
|
|
135
|
+
"eyebrow": "Recommended for you",
|
|
136
|
+
"seatRowLabel": "Seats",
|
|
137
|
+
"creditRowLabel": "Credits",
|
|
138
|
+
"totalLabel": "Total",
|
|
139
|
+
"dueTodayLabel": "Due today",
|
|
140
|
+
"periodLabels": {
|
|
141
|
+
"monthly": "per month",
|
|
142
|
+
"annual": "per year",
|
|
143
|
+
"one-time": "one-time"
|
|
144
|
+
},
|
|
145
|
+
"seatsLabel": "Seats",
|
|
146
|
+
"decrementLabel": "Remove a seat",
|
|
147
|
+
"incrementLabel": "Add a seat",
|
|
148
|
+
"periodLabel": "Billing",
|
|
149
|
+
"creditsLabel": "Add-on credits",
|
|
150
|
+
"creditNoneLabel": "None",
|
|
151
|
+
"creditTierLabel": "{credits} credits",
|
|
152
|
+
"showBreakdownLabel": "Show breakdown",
|
|
153
|
+
"hideBreakdownLabel": "Hide breakdown"
|
|
154
|
+
},
|
|
155
|
+
"questions": {}
|
|
156
|
+
},
|
|
75
157
|
"how-to": {
|
|
76
158
|
"heading": "How-To Guides",
|
|
77
|
-
"description": "Step-by-step guides for building with
|
|
159
|
+
"description": "Step-by-step guides for building with this site.",
|
|
78
160
|
"emptyState": "How-to guides coming soon."
|
|
79
161
|
},
|
|
80
162
|
"integrations": {
|
|
@@ -101,6 +183,24 @@
|
|
|
101
183
|
"heading": "Resources",
|
|
102
184
|
"emptyState": "Resources listing coming soon."
|
|
103
185
|
},
|
|
186
|
+
"schedule": {
|
|
187
|
+
"title": "Book a call",
|
|
188
|
+
"description": "Pick a time that works for you.",
|
|
189
|
+
"eyebrow": "Book a call",
|
|
190
|
+
"headline": "Pick a time that works",
|
|
191
|
+
"confirmed": {
|
|
192
|
+
"title": "You're booked",
|
|
193
|
+
"description": "Your call is confirmed and the calendar invite is on its way.",
|
|
194
|
+
"headline": "You're booked",
|
|
195
|
+
"subheadline": "The calendar invite is on its way to your inbox. Add it now so the time is held on both sides.",
|
|
196
|
+
"prepareHeadline": "Before the call",
|
|
197
|
+
"prepareBody": "Come with the one problem you most want solved. The more specific it is, the more we can get through in the time we have. If something changes, the invite carries a reschedule link \u2014 use it rather than letting the slot go quiet.",
|
|
198
|
+
"ctaHeadline": "While you wait",
|
|
199
|
+
"ctaDescription": "Have a look around, or get in touch if something comes up before we speak.",
|
|
200
|
+
"ctaPrimaryLabel": "Back to the site",
|
|
201
|
+
"ctaSecondaryLabel": "Contact us"
|
|
202
|
+
}
|
|
203
|
+
},
|
|
104
204
|
"services": {
|
|
105
205
|
"heading": "Services",
|
|
106
206
|
"emptyState": "Services listing coming soon."
|
|
@@ -112,7 +212,7 @@
|
|
|
112
212
|
},
|
|
113
213
|
"tech-articles": {
|
|
114
214
|
"heading": "Technical Articles",
|
|
115
|
-
"description": "Deep dives into the architecture and internals of
|
|
215
|
+
"description": "Deep dives into the architecture and internals of this site.",
|
|
116
216
|
"emptyState": "Technical articles coming soon."
|
|
117
217
|
},
|
|
118
218
|
"testimonials": {
|
|
@@ -123,9 +223,177 @@
|
|
|
123
223
|
"heading": "Use Cases",
|
|
124
224
|
"emptyState": "Use cases listing coming soon."
|
|
125
225
|
},
|
|
226
|
+
"waitlistDashboard": {
|
|
227
|
+
"gate": {
|
|
228
|
+
"emptyHeadline": "Sign-in is not configured",
|
|
229
|
+
"emptyDescription": "No sign-in provider is active for this deployment yet. Set the provider environment variables to enable operator access.",
|
|
230
|
+
"signInLink": "Go to the sign-in page"
|
|
231
|
+
},
|
|
232
|
+
"status": {
|
|
233
|
+
"live": "Live",
|
|
234
|
+
"closed": "Closed",
|
|
235
|
+
"draft": "Draft"
|
|
236
|
+
},
|
|
237
|
+
"mode": {
|
|
238
|
+
"lead-capture": "Lead capture",
|
|
239
|
+
"qualifying": "Qualifying",
|
|
240
|
+
"paid": "Paid",
|
|
241
|
+
"recommending": "Recommending"
|
|
242
|
+
},
|
|
243
|
+
"common": {
|
|
244
|
+
"unavailable": "—",
|
|
245
|
+
"direct": "(direct)",
|
|
246
|
+
"other": "(other)",
|
|
247
|
+
"forbiddenHeadline": "You don't have access",
|
|
248
|
+
"forbiddenDescription": "Ask an owner or admin on this workspace for access to the waitlist dashboard."
|
|
249
|
+
},
|
|
250
|
+
"list": {
|
|
251
|
+
"title": "Waitlist experiments",
|
|
252
|
+
"description": "Every experiment in your scope, with a cross-experiment rollup above the list.",
|
|
253
|
+
"rollupAriaLabel": "Waitlist rollup",
|
|
254
|
+
"rollup": {
|
|
255
|
+
"live": "live",
|
|
256
|
+
"closed": "closed",
|
|
257
|
+
"draft": "draft",
|
|
258
|
+
"raw": "raw signups",
|
|
259
|
+
"qualified": "qualified",
|
|
260
|
+
"rate": "qualification rate",
|
|
261
|
+
"sites": "sites"
|
|
262
|
+
},
|
|
263
|
+
"table": {
|
|
264
|
+
"caption": "Experiments in your scope",
|
|
265
|
+
"columnKey": "Key",
|
|
266
|
+
"columnMode": "Mode",
|
|
267
|
+
"columnStatus": "Status",
|
|
268
|
+
"columnWaitlists": "Waitlists",
|
|
269
|
+
"columnRaw": "Raw",
|
|
270
|
+
"columnQualified": "Qualified",
|
|
271
|
+
"columnRate": "Rate",
|
|
272
|
+
"columnUpdated": "Updated",
|
|
273
|
+
"emptyHeadline": "No experiments yet",
|
|
274
|
+
"emptyDescription": "Experiments you create will appear here."
|
|
275
|
+
},
|
|
276
|
+
"offers": {
|
|
277
|
+
"captionPrefix": "Offer funnel \u2014",
|
|
278
|
+
"columnOffer": "Offer",
|
|
279
|
+
"columnRecommended": "Recommended",
|
|
280
|
+
"columnSaved": "Saved",
|
|
281
|
+
"columnCheckedOut": "Checked out"
|
|
282
|
+
}
|
|
283
|
+
},
|
|
284
|
+
"level": {
|
|
285
|
+
"gate": "Gate",
|
|
286
|
+
"label": "Level {n}"
|
|
287
|
+
},
|
|
288
|
+
"comparison": {
|
|
289
|
+
"breadcrumbExperiments": "Experiments",
|
|
290
|
+
"site": "Site",
|
|
291
|
+
"created": "Created",
|
|
292
|
+
"waitlistsCount": "Waitlists",
|
|
293
|
+
"campaigns": "Campaigns",
|
|
294
|
+
"tableCaption": "Signups by waitlist",
|
|
295
|
+
"columnTotal": "Total",
|
|
296
|
+
"rowRaw": "Raw signups",
|
|
297
|
+
"rowQualified": "Qualified",
|
|
298
|
+
"rowRate": "Qualification rate",
|
|
299
|
+
"tierRowPrefix": "Tier",
|
|
300
|
+
"bySourceCaption": "Conversion by source",
|
|
301
|
+
"bySourceColumnSource": "Source",
|
|
302
|
+
"bySourceColumnRaw": "Raw",
|
|
303
|
+
"bySourceColumnQualified": "Qualified",
|
|
304
|
+
"bySourceColumnRate": "Rate",
|
|
305
|
+
"distributionAnswered": "{count} answered",
|
|
306
|
+
"distributionNoAnswers": "No answers yet.",
|
|
307
|
+
"signupsCaption": "Signups",
|
|
308
|
+
"signupsColumnEmail": "Email",
|
|
309
|
+
"signupsColumnWaitlist": "Waitlist",
|
|
310
|
+
"signupsColumnSource": "Source",
|
|
311
|
+
"signupsColumnCreated": "Captured",
|
|
312
|
+
"signupsColumnTier": "Tier",
|
|
313
|
+
"signupsColumnScore": "Score",
|
|
314
|
+
"signupsNext": "Next",
|
|
315
|
+
"notFoundHeadline": "Experiment not found",
|
|
316
|
+
"notFoundDescription": "This experiment doesn't exist, or isn't in your scope.",
|
|
317
|
+
"genericTitle": "Waitlist comparison"
|
|
318
|
+
},
|
|
319
|
+
"signup": {
|
|
320
|
+
"breadcrumbComparison": "Comparison",
|
|
321
|
+
"email": "Email",
|
|
322
|
+
"waitlist": "Waitlist",
|
|
323
|
+
"source": "Source",
|
|
324
|
+
"captured": "Captured",
|
|
325
|
+
"tier": "Tier",
|
|
326
|
+
"score": "Score",
|
|
327
|
+
"answersTitle": "Answers",
|
|
328
|
+
"categoryScoresTitle": "Category scores",
|
|
329
|
+
"decidingDefsTitle": "Deciding factors",
|
|
330
|
+
"ruleTraceTitle": "Rule trace",
|
|
331
|
+
"notScoredHeadline": "Not scored",
|
|
332
|
+
"notScoredDescription": "No score has been computed for this signup yet.",
|
|
333
|
+
"notFoundHeadline": "Signup not found",
|
|
334
|
+
"notFoundDescription": "This signup doesn't exist, or isn't in your scope.",
|
|
335
|
+
"genericTitle": "Waitlist signup"
|
|
336
|
+
}
|
|
337
|
+
},
|
|
126
338
|
"whitepapers": {
|
|
127
339
|
"heading": "Whitepapers",
|
|
128
|
-
"description": "In-depth research and strategy papers from
|
|
340
|
+
"description": "In-depth research and strategy papers from this site's team.",
|
|
129
341
|
"emptyState": "Whitepapers coming soon."
|
|
342
|
+
},
|
|
343
|
+
"signIn": {
|
|
344
|
+
"title": "Sign in",
|
|
345
|
+
"description": "Sign in to your account.",
|
|
346
|
+
"heading": "Sign in to your account",
|
|
347
|
+
"subhead": "Welcome back. Choose how you'd like to continue.",
|
|
348
|
+
"notConfiguredSubhead": "Sign-in is not configured for this site yet. Set a provider's environment variables to enable it.",
|
|
349
|
+
"ssoPrefix": "Sign in with",
|
|
350
|
+
"google": "Google",
|
|
351
|
+
"github": "GitHub",
|
|
352
|
+
"email": "Email address",
|
|
353
|
+
"password": "Password",
|
|
354
|
+
"forgot": "Forgot password?",
|
|
355
|
+
"submit": "Sign in",
|
|
356
|
+
"orContinue": "Or continue with",
|
|
357
|
+
"signInFailed": "We couldn't sign you in. Check your details and try again.",
|
|
358
|
+
"providerFailed": "We couldn't start sign-in with that provider. Try again."
|
|
359
|
+
},
|
|
360
|
+
"account": {
|
|
361
|
+
"title": "Your account",
|
|
362
|
+
"description": "Your profile, results, and purchases.",
|
|
363
|
+
"nav": {
|
|
364
|
+
"profile": "Profile",
|
|
365
|
+
"results": "Results",
|
|
366
|
+
"purchases": "Purchases"
|
|
367
|
+
},
|
|
368
|
+
"profile": {
|
|
369
|
+
"heading": "Profile",
|
|
370
|
+
"name": "Name",
|
|
371
|
+
"email": "Email",
|
|
372
|
+
"verified": "Email verified",
|
|
373
|
+
"unverified": "Email not verified",
|
|
374
|
+
"unavailable": "—",
|
|
375
|
+
"signOut": "Sign out"
|
|
376
|
+
},
|
|
377
|
+
"results": {
|
|
378
|
+
"heading": "My results",
|
|
379
|
+
"experiment": "Experiment",
|
|
380
|
+
"waitlist": "Waitlist",
|
|
381
|
+
"tier": "Tier",
|
|
382
|
+
"score": "Score",
|
|
383
|
+
"completedAt": "Completed",
|
|
384
|
+
"unavailable": "—",
|
|
385
|
+
"emptyHeadline": "No results yet",
|
|
386
|
+
"emptyDescription": "Complete a diagnostic and your results will appear here."
|
|
387
|
+
},
|
|
388
|
+
"purchases": {
|
|
389
|
+
"heading": "My purchases",
|
|
390
|
+
"offer": "Offer",
|
|
391
|
+
"status": "Status",
|
|
392
|
+
"amount": "Amount",
|
|
393
|
+
"period": "Period",
|
|
394
|
+
"date": "Date",
|
|
395
|
+
"emptyHeadline": "No purchases yet",
|
|
396
|
+
"emptyDescription": "Purchases you complete will appear here."
|
|
397
|
+
}
|
|
130
398
|
}
|
|
131
399
|
}
|
|
@@ -72,9 +72,17 @@ export function middleware(request: NextRequest): NextResponse {
|
|
|
72
72
|
return intlResponse;
|
|
73
73
|
}
|
|
74
74
|
|
|
75
|
-
// Skip Next.js internal assets and
|
|
76
|
-
// user-facing routes and API handlers, not framework asset endpoints.
|
|
75
|
+
// Skip Next.js internal assets and public/ files — security headers attach to
|
|
76
|
+
// user-facing routes and API handlers, not framework or static asset endpoints.
|
|
77
77
|
// Also exclude next-intl-specific internal paths (_next/server).
|
|
78
|
+
//
|
|
79
|
+
// The trailing `.*\\..*` alternative excludes any path whose last segment
|
|
80
|
+
// contains a dot, i.e. every file with an extension. Without it the negative
|
|
81
|
+
// lookahead named only favicon.ico, so next-intl's locale rewrite swallowed
|
|
82
|
+
// every OTHER public/ asset — logo-light.svg, logo-dark.svg, site.webmanifest,
|
|
83
|
+
// og-default.png — and each 404'd (#4090 item 4). robots.txt and sitemap.xml are
|
|
84
|
+
// route handlers rather than public/ files, but they carry extensions too and
|
|
85
|
+
// are equally not locale-scoped, so the same rule covers them.
|
|
78
86
|
export const config = {
|
|
79
|
-
matcher: "/((?!_next/static|_next/image|_next/server
|
|
87
|
+
matcher: "/((?!_next/static|_next/image|_next/server|.*\\..*).*)",
|
|
80
88
|
};
|
|
@@ -88,10 +88,16 @@ const nextConfig = {
|
|
|
88
88
|
// pnpm-workspace.yaml files exist (e.g. in agent worktrees).
|
|
89
89
|
outputFileTracingRoot: join(process.cwd(), "../../"),
|
|
90
90
|
// Include all MDX content files in the standalone bundle.
|
|
91
|
-
// Paths are relative to outputFileTracingRoot (repo root).
|
|
92
91
|
// Scoped to *.mdx only — avoids pulling images/binaries into the standalone bundle.
|
|
92
|
+
//
|
|
93
|
+
// The glob resolves against THIS APP'S cwd (apps/web), not against
|
|
94
|
+
// outputFileTracingRoot — a comment here previously claimed the opposite, and
|
|
95
|
+
// the claim was the bug (#4090 item 3). "./content/**/*.mdx" therefore matched
|
|
96
|
+
// only apps/web/content (the fumadocs blog/docs tree) and never the site-level
|
|
97
|
+
// content/ directory that carries the schema-typed pages, so the standalone
|
|
98
|
+
// output shipped without them and postbuild's assert-content-bundled failed.
|
|
93
99
|
outputFileTracingIncludes: {
|
|
94
|
-
"/**": ["
|
|
100
|
+
"/**": ["../../content/**/*.mdx"],
|
|
95
101
|
},
|
|
96
102
|
// Workspace packages live outside this app's directory. Next.js must
|
|
97
103
|
// transpile them from source so that "use client" / "use server" directives
|
|
@@ -12,43 +12,49 @@
|
|
|
12
12
|
"start": "next start",
|
|
13
13
|
"pretypecheck": "fumadocs-mdx",
|
|
14
14
|
"type-check": "tsc --noEmit",
|
|
15
|
-
"lint": "
|
|
15
|
+
"lint": "next lint",
|
|
16
16
|
"pretest": "fumadocs-mdx",
|
|
17
17
|
"test": "jest",
|
|
18
18
|
"test:watch": "jest --watch"
|
|
19
19
|
},
|
|
20
20
|
"dependencies": {
|
|
21
|
+
"@prisma/adapter-pg": "^7.8.0",
|
|
22
|
+
"@sentry/nextjs": "^10.58.0",
|
|
21
23
|
"@working-theory/analytics": "workspace:*",
|
|
22
|
-
"@working-theory/page-renderer": "workspace:*",
|
|
23
24
|
"@working-theory/api-client": "workspace:*",
|
|
24
25
|
"@working-theory/content-adapters": "workspace:*",
|
|
25
26
|
"@working-theory/database": "workspace:*",
|
|
26
27
|
"@working-theory/fumadocs-schema": "workspace:*",
|
|
28
|
+
"@working-theory/jsonld": "workspace:*",
|
|
27
29
|
"@working-theory/metadata": "workspace:*",
|
|
30
|
+
"@working-theory/page-renderer": "workspace:*",
|
|
28
31
|
"@working-theory/schema": "workspace:*",
|
|
29
32
|
"@working-theory/schema-pack-registry": "workspace:*",
|
|
33
|
+
"@working-theory/schema-validator": "workspace:*",
|
|
30
34
|
"@working-theory/templates": "workspace:*",
|
|
31
35
|
"@working-theory/theme": "workspace:*",
|
|
32
36
|
"@working-theory/ui": "workspace:*",
|
|
33
37
|
"@working-theory/validation": "workspace:*",
|
|
34
38
|
"@working-theory/web-i18n": "workspace:*",
|
|
35
|
-
"
|
|
36
|
-
"@sentry/nextjs": "^10.58.0",
|
|
37
|
-
"better-auth": "1.6.19",
|
|
39
|
+
"better-auth": "1.6.22",
|
|
38
40
|
"fumadocs-core": "^16.10.4",
|
|
39
41
|
"fumadocs-mdx": "^15.0.12",
|
|
40
|
-
"
|
|
42
|
+
"lucide-react": "^0.577.0",
|
|
43
|
+
"next": "^16.3.3",
|
|
41
44
|
"next-intl": "^3.26.3",
|
|
42
45
|
"next-mdx-remote": "^6.0.0",
|
|
43
46
|
"pg": "^8.22.0",
|
|
44
47
|
"react": "^19.2.7",
|
|
45
48
|
"react-dom": "^19.2.7",
|
|
49
|
+
"yaml": "^2.9.0",
|
|
46
50
|
"zod": "^4.2.1"
|
|
47
51
|
},
|
|
48
52
|
"devDependencies": {
|
|
49
53
|
"@next/bundle-analyzer": "^15.5.19",
|
|
54
|
+
"@tailwindcss/postcss": "^4.3.2",
|
|
50
55
|
"@testing-library/jest-dom": "^6.6.3",
|
|
51
56
|
"@testing-library/react": "^16.3.0",
|
|
57
|
+
"@testing-library/user-event": "^14.5.2",
|
|
52
58
|
"@types/jest": "^30.0.0",
|
|
53
59
|
"@types/node": "^22.20.0",
|
|
54
60
|
"@types/pg": "^8.20.0",
|
|
@@ -56,7 +62,10 @@
|
|
|
56
62
|
"@types/react-dom": "^19.2.0",
|
|
57
63
|
"jest": "^30.4.2",
|
|
58
64
|
"jest-environment-jsdom": "^30.4.1",
|
|
65
|
+
"tailwindcss": "^4.3.2",
|
|
59
66
|
"ts-jest": "^29.4.11",
|
|
60
|
-
"typescript": "^6.0.3"
|
|
67
|
+
"typescript": "^6.0.3",
|
|
68
|
+
"@working-theory/license": "workspace:*",
|
|
69
|
+
"@working-theory/sections-registry": "workspace:*"
|
|
61
70
|
}
|
|
62
71
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// PostCSS configuration for @working-theory/web.
|
|
2
|
+
//
|
|
3
|
+
// Uses @tailwindcss/postcss (Tailwind v4's PostCSS plugin) so Next.js processes
|
|
4
|
+
// the `@import "tailwindcss"` in app/globals.css and emits real utility classes.
|
|
5
|
+
// Without this file Next runs CSS through its built-in PostCSS pipeline, which
|
|
6
|
+
// does not include Tailwind — `flex`, `hidden`, `md:flex` compile to nothing and
|
|
7
|
+
// every page renders unstyled (#1531, and #4090 item 1 for the scaffold).
|
|
8
|
+
//
|
|
9
|
+
// Extension: `.mjs`, not `.js` or `.cjs`. Neither this package nor the repo root
|
|
10
|
+
// declares `"type"`, so a bare `.js` here would be parsed as CommonJS and the
|
|
11
|
+
// ESM `export default` below would be a syntax error. `.mjs` states the format
|
|
12
|
+
// in the filename instead of inheriting it from a `"type"` field that a consumer
|
|
13
|
+
// may later add or remove, and matches this app's existing next.config.mjs.
|
|
14
|
+
// (apps-paid/marketing-web can use a plain `.js` only because it declares
|
|
15
|
+
// `"type": "module"` — see #4090, whose premise that apps/web does the same does
|
|
16
|
+
// not hold.)
|
|
17
|
+
|
|
18
|
+
/** @type {import('postcss').ProcessOptions} */
|
|
19
|
+
export default {
|
|
20
|
+
plugins: {
|
|
21
|
+
"@tailwindcss/postcss": {},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
@@ -7,11 +7,11 @@
|
|
|
7
7
|
# gpg --verify security.txt.sig security.txt
|
|
8
8
|
|
|
9
9
|
Contact: mailto:security@ailaunchkit.ai
|
|
10
|
-
Contact: https://github.com/
|
|
10
|
+
Contact: https://github.com/working-theory-labs/ai-launch-kit/security/advisories/new
|
|
11
11
|
Expires: 2027-05-13T00:00:00.000Z
|
|
12
12
|
Encryption: https://keys.openpgp.org/vks/v1/by-email/security@ailaunchkit.ai
|
|
13
13
|
Preferred-Languages: en
|
|
14
14
|
Canonical: https://ailaunchkit.ai/.well-known/security.txt
|
|
15
|
-
Policy: https://github.com/
|
|
16
|
-
Acknowledgments: https://github.com/
|
|
15
|
+
Policy: https://github.com/working-theory-labs/ai-launch-kit/blob/main/SECURITY.md
|
|
16
|
+
Acknowledgments: https://github.com/working-theory-labs/ai-launch-kit/blob/main/SECURITY.md#hall-of-fame
|
|
17
17
|
Hiring: https://ailaunchkit.ai/careers
|
|
@@ -5,12 +5,25 @@
|
|
|
5
5
|
* handlers to avoid copy-paste duplication.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { SITE_BASE_URL } from "../../lib/site-brand";
|
|
9
|
+
|
|
8
10
|
/**
|
|
9
11
|
* Resolves the canonical base URL for the site.
|
|
10
|
-
*
|
|
12
|
+
*
|
|
13
|
+
* #4157 — the same resolution order `lib/site-brand.tsx`'s `SITE_BASE_URL`
|
|
14
|
+
* documents: `NEXT_PUBLIC_BASE_URL` (env override) → `content/_site.mdx`'s
|
|
15
|
+
* `baseUrl:` frontmatter → a neutral placeholder. `process.env` is read
|
|
16
|
+
* FRESH on every call rather than delegating straight to `SITE_BASE_URL`
|
|
17
|
+
* (a module-load-time constant) — this function's callers (route handlers)
|
|
18
|
+
* expect a per-call env read, the same contract this function had before
|
|
19
|
+
* #4157; a frozen snapshot would silently stop honoring an env var set
|
|
20
|
+
* after this module first loaded. Every caller runs in the Node.js runtime
|
|
21
|
+
* (none of robots.txt/sitemap.xml/llms.txt/ai-plugin.json/mcp.json/layout
|
|
22
|
+
* declares `runtime = "edge"`), so the frontmatter-derived fallback
|
|
23
|
+
* (`SITE_BASE_URL`, when no env override is set) is safe here.
|
|
11
24
|
*/
|
|
12
25
|
export function resolveBaseUrl(): string {
|
|
13
|
-
return process.env["NEXT_PUBLIC_BASE_URL"] ??
|
|
26
|
+
return process.env["NEXT_PUBLIC_BASE_URL"] ?? SITE_BASE_URL;
|
|
14
27
|
}
|
|
15
28
|
|
|
16
29
|
/**
|
|
@@ -16,20 +16,5 @@
|
|
|
16
16
|
"types": ["jest", "node", "@testing-library/jest-dom"]
|
|
17
17
|
},
|
|
18
18
|
"include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"],
|
|
19
|
-
"exclude": ["node_modules", ".next", "dist"]
|
|
20
|
-
"references": [
|
|
21
|
-
{ "path": "../../packages/analytics" },
|
|
22
|
-
{ "path": "../../packages/page-renderer" },
|
|
23
|
-
{ "path": "../../packages/api-client" },
|
|
24
|
-
{ "path": "../../packages/theme" },
|
|
25
|
-
{ "path": "../../packages/content-adapters" },
|
|
26
|
-
{ "path": "../../packages/fumadocs-schema" },
|
|
27
|
-
{ "path": "../../packages/metadata" },
|
|
28
|
-
{ "path": "../../packages/schema" },
|
|
29
|
-
{ "path": "../../packages/schema-pack-registry" },
|
|
30
|
-
{ "path": "../../packages/templates" },
|
|
31
|
-
{ "path": "../../packages/ui" },
|
|
32
|
-
{ "path": "../../packages/validation" },
|
|
33
|
-
{ "path": "../../packages/web-i18n" }
|
|
34
|
-
]
|
|
19
|
+
"exclude": ["node_modules", ".next", "dist"]
|
|
35
20
|
}
|