create-ailk 0.24.0 → 0.26.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 +53 -22
- package/component-catalog.json +3 -3
- package/component-catalog.md +3 -3
- package/dist/add-module.js +4 -2
- package/dist/add-route.d.ts +12 -1
- package/dist/add-route.js +31 -3
- package/dist/cli.js +12 -7
- package/dist/derive-architecture.d.ts +3 -4
- package/dist/derive-architecture.js +65 -29
- package/dist/lib/design-checks.d.ts +9 -4
- package/dist/lib/design-checks.js +13 -7
- package/dist/lib/extract-module-bundle.js +29 -2
- package/dist/lib/fetch-template-snapshot.d.ts +2 -1
- package/dist/lib/fetch-template-snapshot.js +8 -3
- package/dist/lib/import-graph.d.ts +1 -1
- package/dist/lib/import-graph.js +4 -4
- package/dist/lib/module-license-gate.d.ts +12 -1
- package/dist/lib/module-license-gate.js +36 -15
- package/dist/lib/module-tier.d.ts +2 -8
- package/dist/lib/module-tier.js +13 -12
- package/dist/module-architecture.d.ts +20 -3
- package/dist/module-architecture.js +129 -552
- package/dist/paid-sections.d.ts +25 -1
- package/dist/paid-sections.js +88 -3
- package/dist/starter-grid.d.ts +6 -6
- package/dist/starter-grid.js +12 -5
- package/dist/surfaces.js +39 -2
- package/dist/template-record.d.ts +21 -3
- package/dist/template-record.js +38 -7
- package/dist/topology.d.ts +16 -3
- package/dist/topology.js +54 -23
- package/dist/update.d.ts +10 -1
- package/dist/update.js +715 -21
- package/package.json +3 -3
- package/release-scope.json +2 -2
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +8 -2
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +2 -2
- package/site-templates/marketing-site/ailk-template.json +7 -1
- package/site-templates/marketing-site/provenance.json +7 -1
- package/site-templates/saas-product/ailk-template.json +2 -1
- package/site-templates/saas-product/provenance.json +1 -0
- package/templates/.claude/cloudparity-repo-hooks.json +5 -0
- package/templates/.claude/hooks/template-guard.sh +137 -0
- package/templates/.claude/rules/extending.md +106 -0
- package/templates/.claude/rules/loop-contract.md +2 -2
- package/templates/.claude/settings.json +11 -0
- package/templates/.env.example +20 -5
- package/templates/.github/workflows/ci.yml +7 -4
- package/templates/CLAUDE.md +11 -1
- package/templates/CONVENTIONS.md +8 -10
- package/templates/README.md +14 -13
- package/templates/apps/api/.env.example +23 -2
- package/templates/apps/api/CLAUDE.md +119 -83
- package/templates/apps/api/jest.config.cjs +15 -5
- package/templates/apps/api/package.json +16 -20
- package/templates/apps/api/src/__tests__/trusted-origins.server.test.ts +2 -2
- package/templates/apps/api/src/__tests__/vercel-handler.test.ts +4 -4
- package/templates/apps/api/src/index.ts +1 -1
- package/templates/apps/api/src/lib/__mocks__/prisma-client.js +16 -0
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -3
- package/templates/apps/api/src/modules/commerce.ts +10 -0
- package/templates/apps/api/src/modules/content-write.ts +10 -0
- package/templates/apps/api/src/modules/multi-tenant.ts +10 -0
- package/templates/apps/api/src/modules/scheduling.ts +10 -0
- package/templates/apps/api/src/modules/signal-collectors.ts +10 -0
- package/templates/apps/api/src/modules/workspace.ts +10 -0
- package/templates/apps/api/src/server.ts +117 -1882
- package/templates/apps/api/vercel.json +2 -2
- package/templates/apps/mcp/CLAUDE.md +90 -26
- package/templates/apps/mcp/__tests__/app-entry.test.ts +4 -254
- package/templates/apps/mcp/__tests__/boot-file.test.ts +92 -0
- package/templates/apps/mcp/jest.config.cjs +6 -1
- package/templates/apps/mcp/package.json +5 -13
- package/templates/apps/mcp/src/app.ts +8 -7
- package/templates/apps/mcp/src/index.ts +6 -34
- package/templates/apps/mcp/src/lib/paid-tools.generated.ts +10 -0
- package/templates/apps/mcp/src/lib/topology.generated.ts +2 -2
- package/templates/apps/mcp/src/site.ts +12 -0
- package/templates/apps/web/.env.example +1 -1
- package/templates/apps/web/CLAUDE.md +31 -3
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
- package/templates/apps/web/app/[locale]/(auth)/__tests__/auth-pages.test.tsx +43 -4
- package/templates/apps/web/app/[locale]/(auth)/legal-footnote.tsx +35 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-in/__tests__/page.test.tsx +117 -8
- package/templates/apps/web/app/[locale]/(auth)/sign-in/page.tsx +14 -37
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-card.tsx +6 -6
- package/templates/apps/web/app/[locale]/(auth)/sign-in/sign-in-text.ts +20 -35
- package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/page.test.tsx +108 -0
- package/templates/apps/web/app/[locale]/(auth)/sign-up/__tests__/sign-up-card.test.tsx +111 -5
- package/templates/apps/web/app/[locale]/(auth)/sign-up/page.tsx +78 -16
- package/templates/apps/web/app/[locale]/(auth)/sign-up/sign-up-card.tsx +132 -12
- package/templates/apps/web/app/[locale]/(authed)/__tests__/gate.test.tsx +53 -1
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/billing.test.tsx +38 -0
- package/templates/apps/web/app/[locale]/(authed)/account/billing/page.tsx +4 -2
- package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +47 -24
- package/templates/apps/web/app/[locale]/(authed)/signed-out-gate.generated.tsx +23 -4
- package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +22 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +7 -3
- package/templates/apps/web/app/[locale]/layout.tsx +33 -13
- package/templates/apps/web/app/[locale]/meet/confirmed/BookingHandOff.tsx +128 -0
- package/templates/apps/web/app/[locale]/meet/confirmed/__tests__/BookingHandOff.test.tsx +126 -0
- package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +43 -0
- package/templates/apps/web/app/[locale]/pricing/page.tsx +7 -3
- package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/__tests__/route.test.ts +222 -0
- package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +10 -3
- package/templates/apps/web/app/api/revalidate/route.ts +3 -3
- package/templates/apps/web/auth.ts +10 -6
- package/templates/apps/web/i18n/request.ts +49 -1
- package/templates/apps/web/jest.config.cjs +1 -0
- package/templates/apps/web/lib/__tests__/account-config.test.ts +7 -0
- package/templates/apps/web/lib/__tests__/auth-email.test.ts +276 -0
- package/templates/apps/web/lib/auth-email.ts +103 -21
- package/templates/apps/web/lib/hub-session/__tests__/sign-in-gate.test.tsx +72 -23
- package/templates/apps/web/lib/hub-session/sign-in-gate.tsx +94 -70
- package/templates/apps/web/lib/prisma-for-auth.ts +5 -2
- package/templates/apps/web/lib/relay.ts +2 -2
- package/templates/apps/web/lib/release-scope.ts +47 -0
- package/templates/apps/web/lib/server-api.ts +1 -1
- package/templates/apps/web/lib/sign-up-agreements.ts +291 -28
- package/templates/apps/web/lib/site-contributions.ts +18 -0
- package/templates/apps/web/messages/en.json +186 -20
- package/templates/apps/web/messages/site/en.json +1 -0
- package/templates/apps/web/src/lib/commerce-claim.ts +1 -1
- package/templates/customizations.yaml +37 -0
- package/templates/database/prisma.config.ts +10 -14
- package/templates/database/seed-test.ts +2 -2
- package/templates/database/seed.ts +5 -5
- package/templates/package.json +12 -6
- package/templates/pnpm-workspace.yaml +0 -1
- package/templates/project.yaml +16 -8
- package/templates/tools/jest/reporters.cjs +65 -0
- package/templates/tools/lint-architecture.ts +553 -7
- package/templates/tsconfig.json +1 -2
- package/versions.json +49 -36
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +0 -409
- package/templates/apps/api/src/__tests__/factories/agent-caller.ts +0 -102
- package/templates/apps/api/src/__tests__/factories/content-fixture.ts +0 -138
- package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +0 -441
- package/templates/apps/api/src/__tests__/factories/index.ts +0 -70
- package/templates/apps/api/src/__tests__/factories/lead-fixture.ts +0 -82
- package/templates/apps/api/src/__tests__/leads-forwarded-rate-limit.test.ts +0 -135
- package/templates/apps/api/src/__tests__/services/enrichment-shim.test.ts +0 -126
- package/templates/apps/api/src/__tests__/stripe-boot.test.ts +0 -132
- package/templates/apps/api/src/__tests__/support/hub-sign-in-fake-db.ts +0 -362
- package/templates/apps/api/src/bin/__tests__/rate-limit-probe.test.ts +0 -184
- package/templates/apps/api/src/bin/abandon-sweep.ts +0 -42
- package/templates/apps/api/src/bin/rate-limit-probe.ts +0 -53
- package/templates/apps/api/src/bin/spokes.ts +0 -198
- package/templates/apps/api/src/bin/stripe-connections-rekey.ts +0 -45
- package/templates/apps/api/src/config/__tests__/hub-require-spoke-key.test.ts +0 -196
- package/templates/apps/api/src/config/__tests__/index.test.ts +0 -233
- package/templates/apps/api/src/config/__tests__/modules.test.ts +0 -76
- package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +0 -185
- package/templates/apps/api/src/config/__tests__/trusted-origins.test.ts +0 -238
- package/templates/apps/api/src/config/index.ts +0 -596
- package/templates/apps/api/src/config/modules.ts +0 -83
- package/templates/apps/api/src/lib/__tests__/agent-store.test.ts +0 -581
- package/templates/apps/api/src/lib/__tests__/auth-email-budget.test.ts +0 -143
- package/templates/apps/api/src/lib/__tests__/consent-ledger-double.ts +0 -237
- package/templates/apps/api/src/lib/__tests__/consent-store.test.ts +0 -353
- package/templates/apps/api/src/lib/__tests__/content-adapter.test.ts +0 -201
- package/templates/apps/api/src/lib/__tests__/deliverable-asset-store.test.ts +0 -224
- package/templates/apps/api/src/lib/__tests__/error-serializer.test.ts +0 -120
- package/templates/apps/api/src/lib/__tests__/errors.test.ts +0 -94
- package/templates/apps/api/src/lib/__tests__/file-fallback.test.ts +0 -144
- package/templates/apps/api/src/lib/__tests__/fixtures/HomePage/home.mdx +0 -8
- package/templates/apps/api/src/lib/__tests__/flow-completion-store.test.ts +0 -149
- package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +0 -116
- package/templates/apps/api/src/lib/__tests__/hub-sign-in-store.test.ts +0 -209
- package/templates/apps/api/src/lib/__tests__/lead-capture-store.test.ts +0 -257
- package/templates/apps/api/src/lib/__tests__/lead-delivery.test.ts +0 -96
- package/templates/apps/api/src/lib/__tests__/outbound-http.test.ts +0 -125
- package/templates/apps/api/src/lib/__tests__/prisma.test.ts +0 -165
- package/templates/apps/api/src/lib/__tests__/require-commerce-claim.test.ts +0 -317
- package/templates/apps/api/src/lib/__tests__/require-paid-tier.test.ts +0 -129
- package/templates/apps/api/src/lib/__tests__/site.test.ts +0 -308
- package/templates/apps/api/src/lib/__tests__/slice-load.test.ts +0 -89
- package/templates/apps/api/src/lib/__tests__/spoke-store.test.ts +0 -202
- package/templates/apps/api/src/lib/__tests__/stripe-admission.test.ts +0 -217
- package/templates/apps/api/src/lib/__tests__/stripe.test.ts +0 -82
- package/templates/apps/api/src/lib/agent-store.ts +0 -613
- package/templates/apps/api/src/lib/auth-email-budget.ts +0 -161
- package/templates/apps/api/src/lib/consent-store.ts +0 -363
- package/templates/apps/api/src/lib/content-adapter.ts +0 -112
- package/templates/apps/api/src/lib/deliverable-asset-store.ts +0 -96
- package/templates/apps/api/src/lib/error-serializer.ts +0 -164
- package/templates/apps/api/src/lib/errors.ts +0 -95
- package/templates/apps/api/src/lib/file-fallback.ts +0 -87
- package/templates/apps/api/src/lib/flow-completion-store.ts +0 -136
- package/templates/apps/api/src/lib/hub-sign-in-store.ts +0 -455
- package/templates/apps/api/src/lib/lead-capture-store.ts +0 -122
- package/templates/apps/api/src/lib/lead-delivery.ts +0 -52
- package/templates/apps/api/src/lib/license-key-store.ts +0 -45
- package/templates/apps/api/src/lib/locales.ts +0 -201
- package/templates/apps/api/src/lib/outbound-http.ts +0 -127
- package/templates/apps/api/src/lib/prisma.ts +0 -21
- package/templates/apps/api/src/lib/proposal-paid-store.ts +0 -66
- package/templates/apps/api/src/lib/rate-limit-probe.ts +0 -165
- package/templates/apps/api/src/lib/rate-limit-store.ts +0 -142
- package/templates/apps/api/src/lib/require-commerce-claim.ts +0 -250
- package/templates/apps/api/src/lib/require-paid-tier.ts +0 -53
- package/templates/apps/api/src/lib/site.ts +0 -257
- package/templates/apps/api/src/lib/slice-load.ts +0 -90
- package/templates/apps/api/src/lib/spoke-store.ts +0 -180
- package/templates/apps/api/src/lib/stripe.ts +0 -321
- package/templates/apps/api/src/lib/webhook-idempotency.ts +0 -156
- package/templates/apps/api/src/middleware/__tests__/adversarial/bearer-token-format.test.ts +0 -111
- package/templates/apps/api/src/middleware/__tests__/adversarial/cookie-or-bearer-precedence.test.ts +0 -172
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-bearer-skip.test.ts +0 -119
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-cookie-path.test.ts +0 -138
- package/templates/apps/api/src/middleware/__tests__/adversarial/csrf-trusted-origins.test.ts +0 -142
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-fixation.test.ts +0 -155
- package/templates/apps/api/src/middleware/__tests__/adversarial/session-timeout.test.ts +0 -139
- package/templates/apps/api/src/middleware/__tests__/auth.bearer-path.test.ts +0 -562
- package/templates/apps/api/src/middleware/__tests__/auth.both-present-precedence.test.ts +0 -76
- package/templates/apps/api/src/middleware/__tests__/auth.cookie-path.test.ts +0 -220
- package/templates/apps/api/src/middleware/__tests__/auth.database-not-configured.test.ts +0 -97
- package/templates/apps/api/src/middleware/__tests__/auth.hub-session-path.test.ts +0 -557
- package/templates/apps/api/src/middleware/__tests__/auth.neither-present.test.ts +0 -72
- package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +0 -140
- package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +0 -721
- package/templates/apps/api/src/middleware/__tests__/rate-limit-cross-isolate.db.test.ts +0 -220
- package/templates/apps/api/src/middleware/__tests__/rate-limit-store.test.ts +0 -430
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +0 -1409
- package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +0 -174
- package/templates/apps/api/src/middleware/auth.ts +0 -864
- package/templates/apps/api/src/middleware/default-tenant.ts +0 -166
- package/templates/apps/api/src/middleware/rate-limit.ts +0 -983
- package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +0 -391
- package/templates/apps/api/src/openapi/__tests__/spec-identity.test.ts +0 -182
- package/templates/apps/api/src/openapi/index.ts +0 -18
- package/templates/apps/api/src/openapi/spec.ts +0 -2148
- package/templates/apps/api/src/openapi/surface-drift.ts +0 -195
- package/templates/apps/api/src/routes/aeo/__tests__/index.test.ts +0 -175
- package/templates/apps/api/src/routes/aeo/index.ts +0 -107
- package/templates/apps/api/src/routes/auth/__tests__/auth-tokens.functional.test.ts +0 -196
- package/templates/apps/api/src/routes/auth/__tests__/auth-user.functional.test.ts +0 -249
- package/templates/apps/api/src/routes/auth/__tests__/hub-sign-in.test.ts +0 -532
- package/templates/apps/api/src/routes/auth/__tests__/tokens.test.ts +0 -313
- package/templates/apps/api/src/routes/auth/__tests__/transactional-email.test.ts +0 -413
- package/templates/apps/api/src/routes/auth/__tests__/user.test.ts +0 -609
- package/templates/apps/api/src/routes/auth/hub-sign-in.ts +0 -242
- package/templates/apps/api/src/routes/auth/tokens.ts +0 -211
- package/templates/apps/api/src/routes/auth/transactional-email.ts +0 -301
- package/templates/apps/api/src/routes/auth/user.ts +0 -305
- package/templates/apps/api/src/routes/billing/plan-checkout.ts +0 -332
- package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +0 -178
- package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +0 -1426
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +0 -448
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +0 -1742
- package/templates/apps/api/src/routes/checkout/index.ts +0 -34
- package/templates/apps/api/src/routes/checkout/session.ts +0 -171
- package/templates/apps/api/src/routes/checkout/sessions.ts +0 -540
- package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +0 -386
- package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +0 -160
- package/templates/apps/api/src/routes/consent/account.ts +0 -268
- package/templates/apps/api/src/routes/consent/cookie.ts +0 -90
- package/templates/apps/api/src/routes/consent/index.ts +0 -26
- package/templates/apps/api/src/routes/consent/unsubscribe.ts +0 -127
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +0 -853
- package/templates/apps/api/src/routes/content/__tests__/list-pages.test.ts +0 -230
- package/templates/apps/api/src/routes/content/__tests__/list-types.test.ts +0 -44
- package/templates/apps/api/src/routes/content/__tests__/locale.test.ts +0 -118
- package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +0 -731
- package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +0 -753
- package/templates/apps/api/src/routes/content/__tests__/rate-limit.test.ts +0 -51
- package/templates/apps/api/src/routes/content/__tests__/search.test.ts +0 -450
- package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +0 -762
- package/templates/apps/api/src/routes/content/get-page.ts +0 -183
- package/templates/apps/api/src/routes/content/index.ts +0 -49
- package/templates/apps/api/src/routes/content/list-pages.ts +0 -74
- package/templates/apps/api/src/routes/content/list-types.ts +0 -19
- package/templates/apps/api/src/routes/content/offerings.ts +0 -184
- package/templates/apps/api/src/routes/content/pricing.ts +0 -176
- package/templates/apps/api/src/routes/content/rate-limit.ts +0 -22
- package/templates/apps/api/src/routes/content/search.ts +0 -100
- package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
- package/templates/apps/api/src/routes/leads/__tests__/capture.test.ts +0 -88
- package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +0 -171
- package/templates/apps/api/src/routes/leads/__tests__/magnet-completion.test.ts +0 -515
- package/templates/apps/api/src/routes/leads/__tests__/spoke.test.ts +0 -392
- package/templates/apps/api/src/routes/leads/__tests__/track.test.ts +0 -165
- package/templates/apps/api/src/routes/leads/index.ts +0 -639
- package/templates/apps/api/src/routes/leads/list.ts +0 -104
- package/templates/apps/api/src/routes/project-listings/__tests__/configured-application.test.ts +0 -626
- package/templates/apps/api/src/routes/project-listings/__tests__/drafts.test.ts +0 -1268
- package/templates/apps/api/src/routes/project-listings/__tests__/founder-identity.test.ts +0 -847
- package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +0 -491
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -476
- package/templates/apps/api/src/routes/project-listings/__tests__/resume-email.test.ts +0 -872
- package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +0 -1022
- package/templates/apps/api/src/routes/project-listings/__tests__/site-key.test.ts +0 -484
- package/templates/apps/api/src/routes/project-listings/__tests__/structured-address.test.ts +0 -535
- package/templates/apps/api/src/routes/project-listings/index.ts +0 -164
- package/templates/apps/api/src/routes/project-listings/me.ts +0 -87
- package/templates/apps/api/src/routes/project-listings/patch-copy.ts +0 -224
- package/templates/apps/api/src/routes/project-listings/patch-draft.ts +0 -102
- package/templates/apps/api/src/routes/project-listings/public.ts +0 -98
- package/templates/apps/api/src/routes/project-listings/respond.ts +0 -48
- package/templates/apps/api/src/routes/project-listings/resume-token.ts +0 -27
- package/templates/apps/api/src/routes/project-listings/start.ts +0 -140
- package/templates/apps/api/src/routes/project-listings/submit.ts +0 -130
- package/templates/apps/api/src/routes/project-listings/verify-email.ts +0 -150
- package/templates/apps/api/src/routes/requests/__tests__/confirm.test.ts +0 -686
- package/templates/apps/api/src/routes/requests/confirm.ts +0 -601
- package/templates/apps/api/src/routes/requests/index.ts +0 -54
- package/templates/apps/api/src/routes/test/auth/__tests__/session.test.ts +0 -306
- package/templates/apps/api/src/routes/test/auth/session.ts +0 -143
- package/templates/apps/api/src/routes/webhooks/README.md +0 -398
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-checkout-consent.test.ts +0 -649
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-dunning.test.ts +0 -749
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +0 -449
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-idempotency.test.ts +0 -264
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode-live.test.ts +0 -159
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-livemode.test.ts +0 -158
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +0 -814
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +0 -301
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-proposal-paid.test.ts +0 -369
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-rate-limit.test.ts +0 -215
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-request-paid.test.ts +0 -301
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +0 -809
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +0 -1155
- package/templates/apps/api/src/routes/webhooks/index.ts +0 -141
- package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +0 -384
- package/templates/apps/api/src/routes/webhooks/stripe.ts +0 -2028
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -645
- package/templates/apps/api/src/services/__tests__/answer-distributions.test.ts +0 -132
- package/templates/apps/api/src/services/__tests__/audit-log.test.ts +0 -1028
- package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +0 -313
- package/templates/apps/api/src/services/__tests__/consent-ledger.test.ts +0 -503
- package/templates/apps/api/src/services/__tests__/consent-migration.test.ts +0 -65
- package/templates/apps/api/src/services/__tests__/consent.test.ts +0 -299
- package/templates/apps/api/src/services/__tests__/default-tenant.test.ts +0 -147
- package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +0 -877
- package/templates/apps/api/src/services/__tests__/deliverable-resend.test.ts +0 -379
- package/templates/apps/api/src/services/__tests__/dunning-policy.test.ts +0 -368
- package/templates/apps/api/src/services/__tests__/entitlements.test.ts +0 -142
- package/templates/apps/api/src/services/__tests__/hub-sign-in.test.ts +0 -854
- package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +0 -234
- package/templates/apps/api/src/services/__tests__/lead-accept-user.test.ts +0 -251
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +0 -2660
- package/templates/apps/api/src/services/__tests__/listing-config.test.ts +0 -166
- package/templates/apps/api/src/services/__tests__/magnet-completion.test.ts +0 -389
- package/templates/apps/api/src/services/__tests__/person.test.ts +0 -1204
- package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -450
- package/templates/apps/api/src/services/__tests__/project-listings.counts.test.ts +0 -202
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -151
- package/templates/apps/api/src/services/__tests__/public-site-resolver.test.ts +0 -137
- package/templates/apps/api/src/services/__tests__/request-confirm.test.ts +0 -531
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +0 -372
- package/templates/apps/api/src/services/__tests__/slack-notify.test.ts +0 -348
- package/templates/apps/api/src/services/__tests__/spoke-resolution.test.ts +0 -660
- package/templates/apps/api/src/services/__tests__/usage-aggregation.test.ts +0 -941
- package/templates/apps/api/src/services/__tests__/usage-credits.test.ts +0 -588
- package/templates/apps/api/src/services/__tests__/verified-email.test.ts +0 -78
- package/templates/apps/api/src/services/abandon-email.ts +0 -336
- package/templates/apps/api/src/services/aeo-score.ts +0 -325
- package/templates/apps/api/src/services/answer-distributions.ts +0 -138
- package/templates/apps/api/src/services/audit-log.ts +0 -961
- package/templates/apps/api/src/services/checkout-buyer.ts +0 -168
- package/templates/apps/api/src/services/consent.ts +0 -834
- package/templates/apps/api/src/services/default-tenant.ts +0 -416
- package/templates/apps/api/src/services/deliverable-fulfillment.ts +0 -750
- package/templates/apps/api/src/services/dunning-policy.ts +0 -294
- package/templates/apps/api/src/services/enrichment-shim.ts +0 -53
- package/templates/apps/api/src/services/entitlements.ts +0 -338
- package/templates/apps/api/src/services/hub-sign-in.ts +0 -472
- package/templates/apps/api/src/services/lead-accept-user.ts +0 -126
- package/templates/apps/api/src/services/lead-promotion.ts +0 -160
- package/templates/apps/api/src/services/lead-routing.ts +0 -1372
- package/templates/apps/api/src/services/leads-inbox.ts +0 -312
- package/templates/apps/api/src/services/listing-config.ts +0 -178
- package/templates/apps/api/src/services/magnet-completion.ts +0 -242
- package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +0 -348
- package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +0 -268
- package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +0 -975
- package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +0 -416
- package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +0 -400
- package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -685
- package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
- package/templates/apps/api/src/services/offerings/catalog.ts +0 -318
- package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -403
- package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
- package/templates/apps/api/src/services/offerings/connection.ts +0 -1083
- package/templates/apps/api/src/services/offerings/index.ts +0 -614
- package/templates/apps/api/src/services/offerings/source.ts +0 -140
- package/templates/apps/api/src/services/offerings/store.ts +0 -150
- package/templates/apps/api/src/services/owner-workspaces.ts +0 -132
- package/templates/apps/api/src/services/person.ts +0 -1211
- package/templates/apps/api/src/services/plan-offerings.ts +0 -125
- package/templates/apps/api/src/services/project-listing-resume-email.ts +0 -326
- package/templates/apps/api/src/services/project-listings.ts +0 -2085
- package/templates/apps/api/src/services/public-site-resolver.ts +0 -396
- package/templates/apps/api/src/services/request-confirm.ts +0 -698
- package/templates/apps/api/src/services/revalidation.ts +0 -235
- package/templates/apps/api/src/services/slack-notify.ts +0 -291
- package/templates/apps/api/src/services/usage-aggregation.ts +0 -516
- package/templates/apps/api/src/services/usage-credits.ts +0 -340
- package/templates/apps/api/src/services/verified-email.ts +0 -71
- package/templates/apps/mcp/__tests__/abuse/daily-cap.test.ts +0 -52
- package/templates/apps/mcp/__tests__/abuse/email-validator.test.ts +0 -46
- package/templates/apps/mcp/__tests__/abuse/guard.test.ts +0 -198
- package/templates/apps/mcp/__tests__/abuse/honeypot.test.ts +0 -36
- package/templates/apps/mcp/__tests__/abuse/user-agent-deny.test.ts +0 -54
- package/templates/apps/mcp/__tests__/aeo-cli-parity.test.ts +0 -116
- package/templates/apps/mcp/__tests__/audit-single-page.test.ts +0 -299
- package/templates/apps/mcp/__tests__/boot.test.ts +0 -280
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +0 -359
- package/templates/apps/mcp/__tests__/config/modules.test.ts +0 -78
- package/templates/apps/mcp/__tests__/get_business_hours.test.ts +0 -82
- package/templates/apps/mcp/__tests__/get_faq.test.ts +0 -80
- package/templates/apps/mcp/__tests__/get_locations.test.ts +0 -65
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +0 -557
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +0 -524
- package/templates/apps/mcp/__tests__/get_site_info.test.ts +0 -81
- package/templates/apps/mcp/__tests__/http-transport.test.ts +0 -1232
- package/templates/apps/mcp/__tests__/index.test.ts +0 -195
- package/templates/apps/mcp/__tests__/lib/audit-single-page-readiness-scan.test.ts +0 -191
- package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +0 -531
- package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +0 -70
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -162
- package/templates/apps/mcp/__tests__/lib/content-root.test.ts +0 -93
- package/templates/apps/mcp/__tests__/lib/errors.test.ts +0 -75
- package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +0 -180
- package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
- package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -268
- package/templates/apps/mcp/__tests__/locale.test.ts +0 -120
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +0 -175
- package/templates/apps/mcp/__tests__/purchase-disabled.test.ts +0 -101
- package/templates/apps/mcp/__tests__/rate-limit-write.test.ts +0 -189
- package/templates/apps/mcp/__tests__/read_content.test.ts +0 -511
- package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -160
- package/templates/apps/mcp/__tests__/search_content.test.ts +0 -271
- package/templates/apps/mcp/__tests__/server.test.ts +0 -388
- package/templates/apps/mcp/__tests__/start_purchase.test.ts +0 -448
- package/templates/apps/mcp/__tests__/submit_lead.test.ts +0 -222
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -152
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +0 -243
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +0 -451
- package/templates/apps/mcp/src/abuse/daily-cap.ts +0 -47
- package/templates/apps/mcp/src/abuse/email-validator.ts +0 -25
- package/templates/apps/mcp/src/abuse/honeypot.ts +0 -21
- package/templates/apps/mcp/src/abuse/index.ts +0 -349
- package/templates/apps/mcp/src/abuse/user-agent-deny.ts +0 -58
- package/templates/apps/mcp/src/boot.ts +0 -167
- package/templates/apps/mcp/src/config/modules.ts +0 -43
- package/templates/apps/mcp/src/http-transport.ts +0 -564
- package/templates/apps/mcp/src/lib/audit-single-page.ts +0 -308
- package/templates/apps/mcp/src/lib/commerce-claim.ts +0 -263
- package/templates/apps/mcp/src/lib/content-adapter.ts +0 -116
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -140
- package/templates/apps/mcp/src/lib/errors.ts +0 -61
- package/templates/apps/mcp/src/lib/license-key-store.ts +0 -45
- package/templates/apps/mcp/src/lib/locales.ts +0 -171
- package/templates/apps/mcp/src/lib/prisma.ts +0 -39
- package/templates/apps/mcp/src/lib/public-workspace.ts +0 -133
- package/templates/apps/mcp/src/lib/resolve-locale.ts +0 -30
- package/templates/apps/mcp/src/lib/shown-offerings.ts +0 -105
- package/templates/apps/mcp/src/lib/site-config.ts +0 -53
- package/templates/apps/mcp/src/lib/stripe-tax-signal.ts +0 -59
- package/templates/apps/mcp/src/request-context.ts +0 -52
- package/templates/apps/mcp/src/server.ts +0 -343
- package/templates/apps/mcp/src/serverless-app.ts +0 -88
- package/templates/apps/mcp/src/tools/audit.ts +0 -127
- package/templates/apps/mcp/src/tools/capture_lead.ts +0 -66
- package/templates/apps/mcp/src/tools/create_project.ts +0 -134
- package/templates/apps/mcp/src/tools/get_business_hours.ts +0 -68
- package/templates/apps/mcp/src/tools/get_faq.ts +0 -71
- package/templates/apps/mcp/src/tools/get_locations.ts +0 -88
- package/templates/apps/mcp/src/tools/get_offerings.ts +0 -96
- package/templates/apps/mcp/src/tools/get_pricing.ts +0 -94
- package/templates/apps/mcp/src/tools/get_site_info.ts +0 -86
- package/templates/apps/mcp/src/tools/index.ts +0 -138
- package/templates/apps/mcp/src/tools/list_pages.ts +0 -68
- package/templates/apps/mcp/src/tools/person_notes.ts +0 -25
- package/templates/apps/mcp/src/tools/proposals.ts +0 -27
- package/templates/apps/mcp/src/tools/purchase.ts +0 -205
- package/templates/apps/mcp/src/tools/read_content.ts +0 -81
- package/templates/apps/mcp/src/tools/request_callback.ts +0 -52
- package/templates/apps/mcp/src/tools/search_content.ts +0 -63
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -54
- package/templates/apps/mcp/src/workspace-server.ts +0 -224
- package/templates/database/CHANGELOG.md +0 -981
- package/templates/database/LICENSE +0 -202
- package/templates/database/NOTICE +0 -2
- package/templates/database/README.md +0 -243
- package/templates/database/__tests__/agents.db.test.ts +0 -320
- package/templates/database/__tests__/appointment.db.test.ts +0 -106
- package/templates/database/__tests__/artifact-content-store.db.test.ts +0 -316
- package/templates/database/__tests__/composite-fence.db.test.ts +0 -206
- package/templates/database/__tests__/consent-ledger.db.test.ts +0 -345
- package/templates/database/__tests__/consent-source-checkout-migration.test.ts +0 -79
- package/templates/database/__tests__/fence-fan-out.db.test.ts +0 -715
- package/templates/database/__tests__/fixtures/appointment-create-probe.ts +0 -79
- package/templates/database/__tests__/fixtures/person-backfill.json +0 -264
- package/templates/database/__tests__/fixtures/person-contact-backfill.json +0 -182
- package/templates/database/__tests__/fixtures/project-listing-consent-probe.ts +0 -100
- package/templates/database/__tests__/flow-completion-migration.test.ts +0 -115
- package/templates/database/__tests__/flow-completion.db.test.ts +0 -136
- package/templates/database/__tests__/flow-workspace-key.db.test.ts +0 -263
- package/templates/database/__tests__/flows-listing-diagnostic.test.ts +0 -392
- package/templates/database/__tests__/flows-presets.test.ts +0 -173
- package/templates/database/__tests__/in-page-magnets-migration.test.ts +0 -161
- package/templates/database/__tests__/lead-idempotency-key.db.test.ts +0 -92
- package/templates/database/__tests__/member-area.db.test.ts +0 -257
- package/templates/database/__tests__/member-contract-migration.test.ts +0 -85
- package/templates/database/__tests__/member-contract.db.test.ts +0 -413
- package/templates/database/__tests__/offerings-checkout-session.db.test.ts +0 -270
- package/templates/database/__tests__/offerings-migration.test.ts +0 -197
- package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +0 -86
- package/templates/database/__tests__/offerings.db.test.ts +0 -303
- package/templates/database/__tests__/outbound-message-action.db.test.ts +0 -80
- package/templates/database/__tests__/person-contact.db.test.ts +0 -563
- package/templates/database/__tests__/person-notes.db.test.ts +0 -249
- package/templates/database/__tests__/person.db.test.ts +0 -586
- package/templates/database/__tests__/piece-kind-migration.test.ts +0 -67
- package/templates/database/__tests__/piece-kind.db.test.ts +0 -208
- package/templates/database/__tests__/prefixed-ids.db.test.ts +0 -222
- package/templates/database/__tests__/project-listing-consent-at.db.test.ts +0 -111
- package/templates/database/__tests__/seed.test.ts +0 -272
- package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
- package/templates/database/__tests__/tenancy.test.ts +0 -141
- package/templates/database/__tests__/trial-magnet-migration.test.ts +0 -186
- package/templates/database/__tests__/user-cascade.test.ts +0 -140
- package/templates/database/_gitignore +0 -8
- package/templates/database/auth/.gitkeep +0 -0
- package/templates/database/auth/schema.prisma +0 -641
- package/templates/database/config/.gitkeep +0 -0
- package/templates/database/config/schema.prisma +0 -441
- package/templates/database/content/.gitkeep +0 -0
- package/templates/database/content/schema.prisma +0 -339
- package/templates/database/eslint.config.mjs +0 -69
- package/templates/database/flows/listing-diagnostic.ts +0 -182
- package/templates/database/flows/presets.ts +0 -315
- package/templates/database/inbox/.gitkeep +0 -0
- package/templates/database/inbox/README.md +0 -3
- package/templates/database/inbox/__tests__/schema.test.ts +0 -44
- package/templates/database/inbox/schema.prisma +0 -1447
- package/templates/database/jest.config.cjs +0 -36
- package/templates/database/migrations/20260508000000_add_inbox_namespace/migration.sql +0 -328
- package/templates/database/migrations/20260513000000_better_auth_migration/migration.sql +0 -100
- package/templates/database/migrations/20260515000000_add_user_billing_fields/migration.sql +0 -28
- package/templates/database/migrations/20260516000000_add_user_tier_care_plan_seat/migration.sql +0 -25
- package/templates/database/migrations/20260518000000_add_telemetry_records/migration.sql +0 -42
- package/templates/database/migrations/20260525000000_theme_wiring/migration.sql +0 -67
- package/templates/database/migrations/20260710000000_retire_commercial_tier/migration.sql +0 -21
- package/templates/database/migrations/20260712215647_add_multi_tenant_tenancy/migration.sql +0 -201
- package/templates/database/migrations/20260713143320_reanchor_site_config_to_workspace/migration.sql +0 -67
- package/templates/database/migrations/20260713174000_add_audit_logs/migration.sql +0 -46
- package/templates/database/migrations/20260713190000_drop_telemetry_records/migration.sql +0 -25
- package/templates/database/migrations/20260713192000_add_uuidv7_function/migration.sql +0 -49
- package/templates/database/migrations/20260713192429_prefixed_uuid_entity_ids/migration.sql +0 -197
- package/templates/database/migrations/20260713200000_add_org_billing/migration.sql +0 -32
- package/templates/database/migrations/20260714000000_add_lead_promotion_fields/migration.sql +0 -22
- package/templates/database/migrations/20260714010000_add_usage_billing_content_models/migration.sql +0 -151
- package/templates/database/migrations/20260714020000_add_usage_billing_auth_config_models/migration.sql +0 -223
- package/templates/database/migrations/20260714030000_credit_balance_non_negative/migration.sql +0 -22
- package/templates/database/migrations/20260714030000_widen_usage_billing_report_aggregates/migration.sql +0 -32
- package/templates/database/migrations/20260810233516_add_flow_engine_models/migration.sql +0 -40
- package/templates/database/migrations/20260811020000_add_flow_session_abandon_email_columns/migration.sql +0 -4
- package/templates/database/migrations/20260811030000_add_flow_session_abandon_email_index/migration.sql +0 -2
- package/templates/database/migrations/20260811040000_add_flow_session_segment/migration.sql +0 -2
- package/templates/database/migrations/20260811050000_add_deliverable_models/migration.sql +0 -29
- package/templates/database/migrations/20260812000000_add_deliverable_grant_send_columns/migration.sql +0 -6
- package/templates/database/migrations/20260902222948_add_waitlist_experiment_models/migration.sql +0 -39
- package/templates/database/migrations/20260902224500_add_waitlist_id_format_checks/migration.sql +0 -24
- package/templates/database/migrations/20260903004112_add_flow_session_flags_aeo_score/migration.sql +0 -3
- package/templates/database/migrations/20260903010000_add_playbook_instance/migration.sql +0 -33
- package/templates/database/migrations/20260904000000_add_waitlist_followup_send/migration.sql +0 -30
- package/templates/database/migrations/20260905230000_add_flow_checkout/migration.sql +0 -47
- package/templates/database/migrations/20260906000000_add_flow_checkout_idempotency/migration.sql +0 -16
- package/templates/database/migrations/20260907120000_add_project_listing/migration.sql +0 -47
- package/templates/database/migrations/20260907130000_add_project_listing_slack_columns/migration.sql +0 -10
- package/templates/database/migrations/20260907180000_add_listing_csv_send/migration.sql +0 -26
- package/templates/database/migrations/20260909120000_project_listings_platform/migration.sql +0 -90
- package/templates/database/migrations/20260909180000_listing_draft_and_fields/migration.sql +0 -174
- package/templates/database/migrations/20260910120000_listing_public_site_key/migration.sql +0 -14
- package/templates/database/migrations/20260911120000_listing_copy_edit_audit/migration.sql +0 -25
- package/templates/database/migrations/20260911140000_listing_structured_address/migration.sql +0 -32
- package/templates/database/migrations/20260911180000_consent_grants/migration.sql +0 -71
- package/templates/database/migrations/20260911200000_listing_site_answers/migration.sql +0 -30
- package/templates/database/migrations/20260912120000_listing_owner_link/migration.sql +0 -49
- package/templates/database/migrations/20260914120000_listing_founder_identity/migration.sql +0 -123
- package/templates/database/migrations/20260915120000_project_listing_solution/migration.sql +0 -15
- package/templates/database/migrations/20260916120000_artifact_content_store/migration.sql +0 -158
- package/templates/database/migrations/20260917120000_callback_request_confirm/migration.sql +0 -40
- package/templates/database/migrations/20260918120000_add_appointment/migration.sql +0 -67
- package/templates/database/migrations/20260918120000_asset_metadata_columns/migration.sql +0 -70
- package/templates/database/migrations/20260919120000_flow_workspace_key/migration.sql +0 -181
- package/templates/database/migrations/20260919130000_flow_definition_admin_columns/migration.sql +0 -172
- package/templates/database/migrations/20260919130000_workspace_meetings/migration.sql +0 -41
- package/templates/database/migrations/20260919140000_inbox_workspace_key/migration.sql +0 -185
- package/templates/database/migrations/20260920120000_lead_handled_at/migration.sql +0 -70
- package/templates/database/migrations/20260920130000_lead_workspace_source_index/migration.sql +0 -57
- package/templates/database/migrations/20260921120000_deliverable_grant_workspace_key/migration.sql +0 -68
- package/templates/database/migrations/20260922120000_tenancy_fence/migration.sql +0 -1067
- package/templates/database/migrations/20260923120000_listing_capturing_magnet/migration.sql +0 -210
- package/templates/database/migrations/20261003120000_spoke_registry/migration.sql +0 -80
- package/templates/database/migrations/20261003130000_scheduling_connection/migration.sql +0 -49
- package/templates/database/migrations/20261005120000_agents/migration.sql +0 -84
- package/templates/database/migrations/20261008120000_user_last_workspace/migration.sql +0 -35
- package/templates/database/migrations/20261008130000_lead_idempotency_key/migration.sql +0 -20
- package/templates/database/migrations/20261009120000_agent_grants/migration.sql +0 -33
- package/templates/database/migrations/20261010120000_person/migration.sql +0 -106
- package/templates/database/migrations/20261010121000_person_backfill/migration.sql +0 -132
- package/templates/database/migrations/20261010130000_agent_grants_people_read/migration.sql +0 -20
- package/templates/database/migrations/20261011120000_member_area/migration.sql +0 -158
- package/templates/database/migrations/20261011130000_agent_grants_member_pieces_manage/migration.sql +0 -21
- package/templates/database/migrations/20261012120000_member_contract/migration.sql +0 -192
- package/templates/database/migrations/20261013120000_lead_spoke_checkout/migration.sql +0 -20
- package/templates/database/migrations/20261014120000_consent_ledger/migration.sql +0 -122
- package/templates/database/migrations/20261014120000_person_contact/migration.sql +0 -231
- package/templates/database/migrations/20261015120000_person_notes/migration.sql +0 -77
- package/templates/database/migrations/20261015120000_rate_limit_counters/migration.sql +0 -43
- package/templates/database/migrations/20261016120000_piece_kind/migration.sql +0 -95
- package/templates/database/migrations/20261017120000_outbound_message_action/migration.sql +0 -30
- package/templates/database/migrations/20261018120000_flow_completion/migration.sql +0 -52
- package/templates/database/migrations/20261019120000_consent_source_checkout/migration.sql +0 -27
- package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +0 -146
- package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +0 -77
- package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +0 -45
- package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +0 -47
- package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +0 -16
- package/templates/database/migrations/20261025120000_trial_magnet/migration.sql +0 -28
- package/templates/database/migrations/20261026120000_trial_magnet_proof_line/migration.sql +0 -23
- package/templates/database/migrations/migration_lock.toml +0 -3
- package/templates/database/ops/.gitkeep +0 -0
- package/templates/database/ops/schema.prisma +0 -43
- package/templates/database/package.json +0 -89
- package/templates/database/schema.prisma +0 -71
- package/templates/database/scripts/db-generate-locked.sh +0 -80
- package/templates/database/scripts/person-backfill.sql +0 -132
- package/templates/database/tenancy.ts +0 -183
- package/templates/database/tsconfig.build.json +0 -16
- package/templates/database/tsconfig.flows.json +0 -15
- package/templates/database/tsconfig.json +0 -16
- package/templates/database/tsconfig.tenancy.json +0 -14
package/dist/paid-sections.d.ts
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
export declare const PAID_SECTIONS_PATH = "apps/web/lib/paid-sections.generated.ts";
|
|
3
3
|
/** Scaffold-relative path of the generated module-presence flags (#8843 D10). */
|
|
4
4
|
export declare const MODULE_FLAGS_PATH = "apps/web/lib/modules.generated.ts";
|
|
5
|
+
/** Scaffold-relative path of the generated paid MCP tool registry (#9460 DD6). */
|
|
6
|
+
export declare const PAID_MCP_TOOLS_PATH = "apps/mcp/src/lib/paid-tools.generated.ts";
|
|
5
7
|
export interface PaidSectionRow {
|
|
6
8
|
module: string;
|
|
7
9
|
package: string;
|
|
@@ -33,9 +35,31 @@ export declare function renderModuleFlags(flags: {
|
|
|
33
35
|
* `undefined` (writing nothing) for a scaffold with no web app.
|
|
34
36
|
*/
|
|
35
37
|
export declare function writeModuleFlags(targetDir: string): "added" | "updated" | "unchanged" | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* The paid MCP tool packages, one row each (#9460 DD6): every slice's
|
|
40
|
+
* `paidMcpToolPackages` in `RECOGNIZED_MODULES` order, then first
|
|
41
|
+
* appearance, so a package two modules deliver is one row.
|
|
42
|
+
*/
|
|
43
|
+
export declare function paidMcpToolRows(): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Render the MCP registry: one `() => import("<package>")` per carried
|
|
46
|
+
* package, `[]` when none is carried. Line 1 is `// oss: false` exactly when
|
|
47
|
+
* a row is present — #7536's rule, so the public strip drops the file.
|
|
48
|
+
*/
|
|
49
|
+
export declare function renderPaidMcpTools(present: ReadonlySet<string>): string;
|
|
50
|
+
/**
|
|
51
|
+
* Write the MCP registry into a scaffold from its own `apps/mcp/package.json`
|
|
52
|
+
* `dependencies` (#9460 DD6), creating `apps/mcp/src/lib/` if need be.
|
|
53
|
+
* Answers whether the file was `added`, `updated` (changed bytes) or
|
|
54
|
+
* `unchanged`, or `undefined` (writing nothing) when that package.json is
|
|
55
|
+
* absent — a `--without-mcp` spoke — the `writeModuleFlags` shape, so
|
|
56
|
+
* `create-ailk update` reports it the same way (#9567).
|
|
57
|
+
*/
|
|
58
|
+
export declare function writePaidMcpTools(targetDir: string): "added" | "updated" | "unchanged" | undefined;
|
|
36
59
|
/**
|
|
37
60
|
* Write the registry into a scaffold, deriving presence from the scaffold's
|
|
38
|
-
* own `apps/web/package.json`, and the module-presence flags beside it
|
|
61
|
+
* own `apps/web/package.json`, and the module-presence flags beside it,
|
|
62
|
+
* then the MCP registry from `apps/mcp/package.json` (#9460 DD6).
|
|
39
63
|
* Returns `false` (writing nothing) when that file or `apps/web/lib/` is
|
|
40
64
|
* absent — a scaffold with no web app.
|
|
41
65
|
*/
|
package/dist/paid-sections.js
CHANGED
|
@@ -23,14 +23,16 @@
|
|
|
23
23
|
* file, importing nothing, because the registry's `import()`s would pull UI
|
|
24
24
|
* packages into any edge code that reads the flag.
|
|
25
25
|
*/
|
|
26
|
-
import { existsSync, readFileSync, writeFileSync } from "node:fs";
|
|
27
|
-
import { join } from "node:path";
|
|
26
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
27
|
+
import { dirname, join } from "node:path";
|
|
28
28
|
import { MODULE_SLICES } from "./module-architecture.js";
|
|
29
29
|
import { RECOGNIZED_MODULES } from "./parse-args.js";
|
|
30
30
|
/** Scaffold-relative path of the generated registry. */
|
|
31
31
|
export const PAID_SECTIONS_PATH = "apps/web/lib/paid-sections.generated.ts";
|
|
32
32
|
/** Scaffold-relative path of the generated module-presence flags (#8843 D10). */
|
|
33
33
|
export const MODULE_FLAGS_PATH = "apps/web/lib/modules.generated.ts";
|
|
34
|
+
/** Scaffold-relative path of the generated paid MCP tool registry (#9460 DD6). */
|
|
35
|
+
export const PAID_MCP_TOOLS_PATH = "apps/mcp/src/lib/paid-tools.generated.ts";
|
|
34
36
|
/** The dependency whose presence means the scheduling module's pages exist. */
|
|
35
37
|
const SCHEDULING_PAGES_PACKAGE = "@working-theory/ui-scheduling";
|
|
36
38
|
function pascalCase(shortName) {
|
|
@@ -162,9 +164,91 @@ export function writeModuleFlags(targetDir) {
|
|
|
162
164
|
writeFileSync(path, next);
|
|
163
165
|
return before === undefined ? "added" : "updated";
|
|
164
166
|
}
|
|
167
|
+
/**
|
|
168
|
+
* The paid MCP tool packages, one row each (#9460 DD6): every slice's
|
|
169
|
+
* `paidMcpToolPackages` in `RECOGNIZED_MODULES` order, then first
|
|
170
|
+
* appearance, so a package two modules deliver is one row.
|
|
171
|
+
*/
|
|
172
|
+
export function paidMcpToolRows() {
|
|
173
|
+
const rows = [];
|
|
174
|
+
for (const name of RECOGNIZED_MODULES) {
|
|
175
|
+
for (const pkg of MODULE_SLICES[name].paidMcpToolPackages ?? []) {
|
|
176
|
+
if (!rows.includes(pkg))
|
|
177
|
+
rows.push(pkg);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return rows;
|
|
181
|
+
}
|
|
182
|
+
const PAID_MCP_TOOLS_HEADER = `// paid-tools.generated.ts — the paid MCP tool packages this site carries.
|
|
183
|
+
//
|
|
184
|
+
// GENERATED by create-ailk from MODULE_SLICES (\`paidMcpToolPackages\`) and
|
|
185
|
+
// this app's package.json dependencies (#9460). Do not edit: every scaffold
|
|
186
|
+
// and \`create-ailk add-module\` rewrites it. A carried package is a bundled
|
|
187
|
+
// dynamic import the server resolves its paid tools from at call time; a
|
|
188
|
+
// site that carries none exports an empty list.
|
|
189
|
+
`;
|
|
190
|
+
/**
|
|
191
|
+
* Render the MCP registry: one `() => import("<package>")` per carried
|
|
192
|
+
* package, `[]` when none is carried. Line 1 is `// oss: false` exactly when
|
|
193
|
+
* a row is present — #7536's rule, so the public strip drops the file.
|
|
194
|
+
*/
|
|
195
|
+
export function renderPaidMcpTools(present) {
|
|
196
|
+
// Spelled through a constant, not a `from "…"` literal: create-ailk's own
|
|
197
|
+
// dist must carry no `@working-theory/*` import text (#8412), while the
|
|
198
|
+
// scaffold's generated registry still imports the type (#9460 DD6).
|
|
199
|
+
const MCP_SERVER_PACKAGE = "@working-theory/mcp-server";
|
|
200
|
+
const rows = paidMcpToolRows().filter((pkg) => present.has(pkg));
|
|
201
|
+
const lines = [];
|
|
202
|
+
if (rows.length > 0)
|
|
203
|
+
lines.push("// oss: false");
|
|
204
|
+
lines.push(PAID_MCP_TOOLS_HEADER.trimEnd());
|
|
205
|
+
lines.push(`import type { McpToolPackLoader } from ${JSON.stringify(MCP_SERVER_PACKAGE)};`);
|
|
206
|
+
lines.push("");
|
|
207
|
+
if (rows.length === 0) {
|
|
208
|
+
lines.push("export const PAID_TOOL_PACKS: readonly McpToolPackLoader[] = [];");
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
lines.push("export const PAID_TOOL_PACKS: readonly McpToolPackLoader[] = [");
|
|
212
|
+
for (const pkg of rows)
|
|
213
|
+
lines.push(` () => import("${pkg}"),`);
|
|
214
|
+
lines.push("];");
|
|
215
|
+
}
|
|
216
|
+
return `${lines.join("\n")}\n`;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Write the MCP registry into a scaffold from its own `apps/mcp/package.json`
|
|
220
|
+
* `dependencies` (#9460 DD6), creating `apps/mcp/src/lib/` if need be.
|
|
221
|
+
* Answers whether the file was `added`, `updated` (changed bytes) or
|
|
222
|
+
* `unchanged`, or `undefined` (writing nothing) when that package.json is
|
|
223
|
+
* absent — a `--without-mcp` spoke — the `writeModuleFlags` shape, so
|
|
224
|
+
* `create-ailk update` reports it the same way (#9567).
|
|
225
|
+
*/
|
|
226
|
+
export function writePaidMcpTools(targetDir) {
|
|
227
|
+
const pkgPath = join(targetDir, "apps/mcp/package.json");
|
|
228
|
+
if (!existsSync(pkgPath))
|
|
229
|
+
return undefined;
|
|
230
|
+
let pkg;
|
|
231
|
+
try {
|
|
232
|
+
pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
|
|
233
|
+
}
|
|
234
|
+
catch (err) {
|
|
235
|
+
throw new Error(`cannot read ${pkgPath} to write the paid MCP tool registry: ${err.message}`, { cause: err });
|
|
236
|
+
}
|
|
237
|
+
const deps = pkg.dependencies ?? {};
|
|
238
|
+
const present = new Set(paidMcpToolRows().filter((name) => Object.hasOwn(deps, name)));
|
|
239
|
+
const path = join(targetDir, PAID_MCP_TOOLS_PATH);
|
|
240
|
+
const before = existsSync(path) ? readFileSync(path, "utf8") : undefined;
|
|
241
|
+
const next = renderPaidMcpTools(present);
|
|
242
|
+
if (before === next)
|
|
243
|
+
return "unchanged";
|
|
244
|
+
mkdirSync(dirname(path), { recursive: true });
|
|
245
|
+
writeFileSync(path, next);
|
|
246
|
+
return before === undefined ? "added" : "updated";
|
|
247
|
+
}
|
|
165
248
|
/**
|
|
166
249
|
* Write the registry into a scaffold, deriving presence from the scaffold's
|
|
167
|
-
* own `apps/web/package.json`, and the module-presence flags beside it
|
|
250
|
+
* own `apps/web/package.json`, and the module-presence flags beside it,
|
|
251
|
+
* then the MCP registry from `apps/mcp/package.json` (#9460 DD6).
|
|
168
252
|
* Returns `false` (writing nothing) when that file or `apps/web/lib/` is
|
|
169
253
|
* absent — a scaffold with no web app.
|
|
170
254
|
*/
|
|
@@ -177,5 +261,6 @@ export function writePaidSections(targetDir) {
|
|
|
177
261
|
.filter((name) => Object.hasOwn(deps, name)));
|
|
178
262
|
writeFileSync(join(targetDir, PAID_SECTIONS_PATH), renderPaidSections(present));
|
|
179
263
|
writeModuleFlags(targetDir);
|
|
264
|
+
writePaidMcpTools(targetDir);
|
|
180
265
|
return true;
|
|
181
266
|
}
|
package/dist/starter-grid.d.ts
CHANGED
|
@@ -83,10 +83,10 @@ export declare const SHAPE_ROSTERS: Readonly<Record<BuildableShape, readonly Tem
|
|
|
83
83
|
* in the declaration order both keep. The plain name is the Pro one: it is
|
|
84
84
|
* the flagship and the demo (Sam, 2026-09-14, parent § D12).
|
|
85
85
|
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
*
|
|
89
|
-
*
|
|
86
|
+
* Both paid aliases carry `workspace` because a Pro or Pro Plus key switches
|
|
87
|
+
* it on (#9696, reversing parent § D15), and a template's `requires` is what
|
|
88
|
+
* the alias path fetches, since it derives no level. It is an authed app
|
|
89
|
+
* surface, so it contributes no PUBLIC row to either roster.
|
|
90
90
|
*
|
|
91
91
|
* `commerce` is a per-site add-on available at any level, so no alias exists
|
|
92
92
|
* FOR it (parent § D13); it still contributes rows to whichever alias takes
|
|
@@ -120,7 +120,7 @@ export declare const ALIASES: Readonly<{
|
|
|
120
120
|
readonly "marketing-site": {
|
|
121
121
|
readonly shape: "organization-product";
|
|
122
122
|
readonly design: "standard";
|
|
123
|
-
readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors"];
|
|
123
|
+
readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors", "workspace"];
|
|
124
124
|
readonly categories: readonly ["accounting", "legal", "consulting", "hvac", "roofing", "plumbing", "electrical", "landscaping", "auto-repair", "real-estate", "technology", "medical-specialty"];
|
|
125
125
|
readonly differences: {
|
|
126
126
|
readonly drop: readonly ["/blog", "/meet", "/meet/[slug]"];
|
|
@@ -140,7 +140,7 @@ export declare const ALIASES: Readonly<{
|
|
|
140
140
|
readonly "saas-product": {
|
|
141
141
|
readonly shape: "organization-product";
|
|
142
142
|
readonly design: "standard";
|
|
143
|
-
readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors", "multi-tenant"];
|
|
143
|
+
readonly modules: readonly ["marketing", "docs-blog", "scheduling", "signal-collectors", "workspace", "multi-tenant"];
|
|
144
144
|
readonly categories: readonly ["technology", "medical-specialty"];
|
|
145
145
|
readonly differences: {
|
|
146
146
|
readonly drop: readonly ["/blog", "/meet", "/meet/[slug]"];
|
package/dist/starter-grid.js
CHANGED
|
@@ -372,10 +372,10 @@ export const SHAPE_ROSTERS = Object.freeze({
|
|
|
372
372
|
* in the declaration order both keep. The plain name is the Pro one: it is
|
|
373
373
|
* the flagship and the demo (Sam, 2026-09-14, parent § D12).
|
|
374
374
|
*
|
|
375
|
-
*
|
|
376
|
-
*
|
|
377
|
-
*
|
|
378
|
-
*
|
|
375
|
+
* Both paid aliases carry `workspace` because a Pro or Pro Plus key switches
|
|
376
|
+
* it on (#9696, reversing parent § D15), and a template's `requires` is what
|
|
377
|
+
* the alias path fetches, since it derives no level. It is an authed app
|
|
378
|
+
* surface, so it contributes no PUBLIC row to either roster.
|
|
379
379
|
*
|
|
380
380
|
* `commerce` is a per-site add-on available at any level, so no alias exists
|
|
381
381
|
* FOR it (parent § D13); it still contributes rows to whichever alias takes
|
|
@@ -415,7 +415,13 @@ export const ALIASES = Object.freeze({
|
|
|
415
415
|
"marketing-site": {
|
|
416
416
|
shape: "organization-product",
|
|
417
417
|
design: "standard",
|
|
418
|
-
modules: [
|
|
418
|
+
modules: [
|
|
419
|
+
"marketing",
|
|
420
|
+
"docs-blog",
|
|
421
|
+
"scheduling",
|
|
422
|
+
"signal-collectors",
|
|
423
|
+
"workspace",
|
|
424
|
+
],
|
|
419
425
|
// The flagship is the general-purpose template: it carries the whole
|
|
420
426
|
// registry, so every group tile on the hub has at least one template.
|
|
421
427
|
categories: [
|
|
@@ -455,6 +461,7 @@ export const ALIASES = Object.freeze({
|
|
|
455
461
|
"docs-blog",
|
|
456
462
|
"scheduling",
|
|
457
463
|
"signal-collectors",
|
|
464
|
+
"workspace",
|
|
458
465
|
"multi-tenant",
|
|
459
466
|
],
|
|
460
467
|
categories: ["technology", "medical-specialty"],
|
package/dist/surfaces.js
CHANGED
|
@@ -713,7 +713,7 @@ export const ROUTE_SINCE = {
|
|
|
713
713
|
// is one too. Whether it shows a ROW is a separate question with two
|
|
714
714
|
// deployment preconditions (a resolvable workspace, and a `siteId` that
|
|
715
715
|
// equals a workspace id); both fail empty, never wide. See
|
|
716
|
-
// `
|
|
716
|
+
// `packages/api/src/services/leads-inbox.ts` § "What it takes for this to
|
|
717
717
|
// return anything".
|
|
718
718
|
"(authed)/leads": "0.24.0",
|
|
719
719
|
// #5371 — the workspace module's three settings routes. Genuinely new route
|
|
@@ -725,6 +725,12 @@ export const ROUTE_SINCE = {
|
|
|
725
725
|
"(authed)/admin": "0.22.1",
|
|
726
726
|
"(authed)/admin/site": "0.22.1",
|
|
727
727
|
"(authed)/admin/team": "0.22.1",
|
|
728
|
+
// #9746 D10 — the Magnets and Meetings tabs. Genuinely new route
|
|
729
|
+
// directories, so they attach at today's fixed-group version.
|
|
730
|
+
"(authed)/admin/magnets": "0.46.0",
|
|
731
|
+
"(authed)/admin/magnets/new/[kind]": "0.46.0",
|
|
732
|
+
"(authed)/admin/meetings": "0.46.0",
|
|
733
|
+
"(authed)/admin/meetings/[slug]": "0.46.0",
|
|
728
734
|
// #5977 — the Pro content host's editor routes (spec 5872 FR1/FR2), added
|
|
729
735
|
// to apps/web by #5957. Genuinely new route directories, so they attach at
|
|
730
736
|
// today's fixed-group version, the same "attach at today's version" rule
|
|
@@ -785,6 +791,13 @@ export function surfaceForRouteDir(routeDir) {
|
|
|
785
791
|
return "core";
|
|
786
792
|
return GATEABLE_SURFACES.find((s) => s.routes.includes(top))?.id;
|
|
787
793
|
}
|
|
794
|
+
/** #9746 D10 — what each Magnets and Meetings tab page imports beside itself. */
|
|
795
|
+
const ADMIN_PANEL_ROUTE_DEPENDENCIES = [
|
|
796
|
+
"apps/web/lib/server-api.ts",
|
|
797
|
+
`${ROUTE_ROOT}/(authed)/waitlist/components/ForbiddenState.tsx`,
|
|
798
|
+
`${ROUTE_ROOT}/(authed)/admin/admin-nav.ts`,
|
|
799
|
+
`${ROUTE_ROOT}/(authed)/admin/admin-panels.tsx`,
|
|
800
|
+
];
|
|
788
801
|
/**
|
|
789
802
|
* Non-route consumer-side files a route's own source imports, that a sync
|
|
790
803
|
* must ALSO bring along so `--apply` never leaves a route that cannot
|
|
@@ -964,6 +977,8 @@ export const ROUTE_DEPENDENCIES = {
|
|
|
964
977
|
],
|
|
965
978
|
"(authed)/account/billing": [
|
|
966
979
|
"apps/web/lib/account-config.ts",
|
|
980
|
+
// #9401 D7 — the site's own Billing sections, the frozen stub the page imports.
|
|
981
|
+
"apps/web/lib/site-contributions.ts",
|
|
967
982
|
"apps/web/lib/server-api.ts",
|
|
968
983
|
`${ROUTE_ROOT}/(authed)/account/account-data.ts`,
|
|
969
984
|
`${ROUTE_ROOT}/(authed)/account/actions.ts`,
|
|
@@ -1034,6 +1049,8 @@ export const ROUTE_DEPENDENCIES = {
|
|
|
1034
1049
|
"(authed)/admin": [
|
|
1035
1050
|
"apps/web/lib/server-api.ts",
|
|
1036
1051
|
`${ROUTE_ROOT}/(authed)/waitlist/components/ForbiddenState.tsx`,
|
|
1052
|
+
// #9746 D8 — the shared nav every /admin tab imports.
|
|
1053
|
+
`${ROUTE_ROOT}/(authed)/admin/admin-nav.ts`,
|
|
1037
1054
|
],
|
|
1038
1055
|
"(authed)/leads": ["apps/web/lib/server-api.ts"],
|
|
1039
1056
|
// #5977 — the editor routes' own imports, read from their sources: both
|
|
@@ -1053,11 +1070,19 @@ export const ROUTE_DEPENDENCIES = {
|
|
|
1053
1070
|
"(authed)/admin/site": [
|
|
1054
1071
|
"apps/web/lib/server-api.ts",
|
|
1055
1072
|
`${ROUTE_ROOT}/(authed)/waitlist/components/ForbiddenState.tsx`,
|
|
1073
|
+
`${ROUTE_ROOT}/(authed)/admin/admin-nav.ts`,
|
|
1056
1074
|
],
|
|
1057
1075
|
"(authed)/admin/team": [
|
|
1058
1076
|
"apps/web/lib/server-api.ts",
|
|
1059
1077
|
`${ROUTE_ROOT}/(authed)/waitlist/components/ForbiddenState.tsx`,
|
|
1078
|
+
`${ROUTE_ROOT}/(authed)/admin/admin-nav.ts`,
|
|
1060
1079
|
],
|
|
1080
|
+
// #9746 D10 — the Magnets and Meetings tabs: the nav plus the client
|
|
1081
|
+
// bindings of the shared admin-ui components.
|
|
1082
|
+
"(authed)/admin/magnets": ADMIN_PANEL_ROUTE_DEPENDENCIES,
|
|
1083
|
+
"(authed)/admin/magnets/new/[kind]": ADMIN_PANEL_ROUTE_DEPENDENCIES,
|
|
1084
|
+
"(authed)/admin/meetings": ADMIN_PANEL_ROUTE_DEPENDENCIES,
|
|
1085
|
+
"(authed)/admin/meetings/[slug]": ADMIN_PANEL_ROUTE_DEPENDENCIES,
|
|
1061
1086
|
"(authed)/waitlist": ["apps/web/lib/server-api.ts"],
|
|
1062
1087
|
// #8843 D6 — the booking pages share one builder over the meetings read;
|
|
1063
1088
|
// `/private` returns the index frame that lives under `meet/`.
|
|
@@ -1065,7 +1090,15 @@ export const ROUTE_DEPENDENCIES = {
|
|
|
1065
1090
|
"meet/[slug]": ["apps/web/lib/meetings.tsx"],
|
|
1066
1091
|
private: ["apps/web/lib/meetings.tsx", `${ROUTE_ROOT}/meet/meeting-index.tsx`],
|
|
1067
1092
|
// #8927 D8 — /pricing maps the Offerings shown set through the mapper.
|
|
1068
|
-
|
|
1093
|
+
// #9480 — and reads its browser-facing API origin through the topology seam
|
|
1094
|
+
// (#7874 D12), so a spoke with /pricing reads no refused name. Every
|
|
1095
|
+
// scaffold since #7874 already carries its own render of the seam, and a
|
|
1096
|
+
// dependency copy never overwrites, so this entry admits the import; it
|
|
1097
|
+
// never replaces a spoke's render with the template's hub one.
|
|
1098
|
+
pricing: [
|
|
1099
|
+
"apps/web/lib/offerings-pricing.ts",
|
|
1100
|
+
"apps/web/lib/api-origin.generated.ts",
|
|
1101
|
+
],
|
|
1069
1102
|
};
|
|
1070
1103
|
/**
|
|
1071
1104
|
* i18n message namespaces (dot-path into `apps/web/messages/<locale>.json`) a
|
|
@@ -1107,6 +1140,10 @@ export const ROUTE_MESSAGE_NAMESPACES = {
|
|
|
1107
1140
|
"(authed)/edit/[type]/[slug]": ["edit"],
|
|
1108
1141
|
"(authed)/admin/site": ["admin"],
|
|
1109
1142
|
"(authed)/admin/team": ["admin"],
|
|
1143
|
+
"(authed)/admin/magnets": ["admin"],
|
|
1144
|
+
"(authed)/admin/magnets/new/[kind]": ["admin"],
|
|
1145
|
+
"(authed)/admin/meetings": ["admin"],
|
|
1146
|
+
"(authed)/admin/meetings/[slug]": ["admin"],
|
|
1110
1147
|
"(authed)/waitlist": ["waitlistDashboard.gate"],
|
|
1111
1148
|
// #7744 — the /team hub's empty state reads the `team` namespace.
|
|
1112
1149
|
team: ["team"],
|
|
@@ -3,16 +3,34 @@ export declare const TEMPLATE_RECORD_PATH = ".ailk-template-files.json";
|
|
|
3
3
|
/**
|
|
4
4
|
* The app paths a generator rewrites after `copyTemplate` lands its copy
|
|
5
5
|
* (§1): the nav, the site chrome, the site fonts, the paid-sections
|
|
6
|
-
* registry and its module-presence flags (#8843 D10), the
|
|
6
|
+
* registry and its module-presence flags (#8843 D10), the paid MCP tool
|
|
7
|
+
* registry (#9460 DD6; `update` rewrites it every run, #9567), the four spoke seams, and a commerce spoke's checkout config,
|
|
7
8
|
* which the checkout writer stamps and the site owns from then on (#8748
|
|
8
9
|
* D2). Composed from each writer's own exported path constant, so a renamed
|
|
9
10
|
* constant carries its path along here too (#8522 D2).
|
|
10
11
|
*/
|
|
11
12
|
export declare const REGENERATED_APP_PATHS: readonly string[];
|
|
13
|
+
/**
|
|
14
|
+
* A hub's thin `database/` (#9569 DD1/DD8): the Prisma config that points at
|
|
15
|
+
* the installed `@working-theory/database`, and the two seeds the package
|
|
16
|
+
* does not publish. Recorded and carried by `update` like an app file; the
|
|
17
|
+
* module data files beside them (`database/flows/`, `database/waitlist/`)
|
|
18
|
+
* are bundle output, never recorded.
|
|
19
|
+
*/
|
|
20
|
+
export declare const DATABASE_BOOT_FILES: readonly string[];
|
|
21
|
+
/**
|
|
22
|
+
* The root `tools/` files every app `jest.config.cjs` requires by its
|
|
23
|
+
* repo-relative path (#9654): the timezone pin (#8657) and the shared
|
|
24
|
+
* reporters (#9430) — `SNAPSHOT_FILES` in `scripts/build-templates.mjs`
|
|
25
|
+
* ships both at that path. Recorded and carried by `update` like an app
|
|
26
|
+
* file, so a merged config never names a file the site lacks.
|
|
27
|
+
*/
|
|
28
|
+
export declare const ROOT_TOOL_FILES: readonly string[];
|
|
12
29
|
/**
|
|
13
30
|
* Whether a destination path (`/`-separated, as `templateDestination`
|
|
14
|
-
* returns it) is one `update` ever records or touches (#8522 D2):
|
|
15
|
-
*
|
|
31
|
+
* returns it) is one `update` ever records or touches (#8522 D2): one of
|
|
32
|
+
* the three `DATABASE_BOOT_FILES` or the `ROOT_TOOL_FILES`, or under one of
|
|
33
|
+
* the three app trees, not a `package.json`, not an `.env*` file, no
|
|
16
34
|
* `.claude` segment, and not a path a generator rewrites after the copy.
|
|
17
35
|
*/
|
|
18
36
|
export declare function isRecordable(destRel: string): boolean;
|
package/dist/template-record.js
CHANGED
|
@@ -4,9 +4,10 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Written beside `.ailk-site-manifest.json` at the site root, it lists every
|
|
6
6
|
* `apps/web/`, `apps/api/` and `apps/mcp/` file the base `templates/` copy
|
|
7
|
-
* wrote and no later layer rewrote
|
|
8
|
-
*
|
|
9
|
-
*
|
|
7
|
+
* wrote and no later layer rewrote — and the few files outside them the
|
|
8
|
+
* record also carries (`DATABASE_BOOT_FILES`, `ROOT_TOOL_FILES`) — with the
|
|
9
|
+
* sha256 of the template's copy of that file and the create-ailk version it
|
|
10
|
+
* came from. `create-ailk update` (`update.ts`) reads it to tell an untouched copy from an owner's
|
|
10
11
|
* edit; `scaffold()` (`programmatic.ts`) writes it, as its last write, from
|
|
11
12
|
* the `onWrite` hook `copyTemplate` (`copy.ts`) calls once per file.
|
|
12
13
|
*
|
|
@@ -18,7 +19,7 @@
|
|
|
18
19
|
import { createHash } from "node:crypto";
|
|
19
20
|
import { existsSync, readFileSync } from "node:fs";
|
|
20
21
|
import { join } from "node:path";
|
|
21
|
-
import { MODULE_FLAGS_PATH, PAID_SECTIONS_PATH } from "./paid-sections.js";
|
|
22
|
+
import { MODULE_FLAGS_PATH, PAID_MCP_TOOLS_PATH, PAID_SECTIONS_PATH } from "./paid-sections.js";
|
|
22
23
|
import { SITE_CHROME_PATH } from "./site-chrome.js";
|
|
23
24
|
import { SITE_FONTS_PATH } from "./site-fonts.js";
|
|
24
25
|
import { SPOKE_CHECKOUT_CONFIG_PATH } from "./spoke-checkout.js";
|
|
@@ -29,7 +30,8 @@ export const TEMPLATE_RECORD_PATH = ".ailk-template-files.json";
|
|
|
29
30
|
/**
|
|
30
31
|
* The app paths a generator rewrites after `copyTemplate` lands its copy
|
|
31
32
|
* (§1): the nav, the site chrome, the site fonts, the paid-sections
|
|
32
|
-
* registry and its module-presence flags (#8843 D10), the
|
|
33
|
+
* registry and its module-presence flags (#8843 D10), the paid MCP tool
|
|
34
|
+
* registry (#9460 DD6; `update` rewrites it every run, #9567), the four spoke seams, and a commerce spoke's checkout config,
|
|
33
35
|
* which the checkout writer stamps and the site owns from then on (#8748
|
|
34
36
|
* D2). Composed from each writer's own exported path constant, so a renamed
|
|
35
37
|
* constant carries its path along here too (#8522 D2).
|
|
@@ -40,18 +42,47 @@ export const REGENERATED_APP_PATHS = [
|
|
|
40
42
|
SITE_FONTS_PATH,
|
|
41
43
|
PAID_SECTIONS_PATH,
|
|
42
44
|
MODULE_FLAGS_PATH,
|
|
45
|
+
PAID_MCP_TOOLS_PATH,
|
|
43
46
|
...SPOKE_SEAM_FILES,
|
|
44
47
|
SPOKE_CHECKOUT_CONFIG_PATH,
|
|
45
48
|
];
|
|
46
49
|
const REGENERATED_SET = new Set(REGENERATED_APP_PATHS);
|
|
47
50
|
const RECORDABLE_APP_ROOT = /^apps\/(web|api|mcp)\//;
|
|
51
|
+
/**
|
|
52
|
+
* A hub's thin `database/` (#9569 DD1/DD8): the Prisma config that points at
|
|
53
|
+
* the installed `@working-theory/database`, and the two seeds the package
|
|
54
|
+
* does not publish. Recorded and carried by `update` like an app file; the
|
|
55
|
+
* module data files beside them (`database/flows/`, `database/waitlist/`)
|
|
56
|
+
* are bundle output, never recorded.
|
|
57
|
+
*/
|
|
58
|
+
export const DATABASE_BOOT_FILES = [
|
|
59
|
+
"database/prisma.config.ts",
|
|
60
|
+
"database/seed.ts",
|
|
61
|
+
"database/seed-test.ts",
|
|
62
|
+
];
|
|
63
|
+
const DATABASE_BOOT_SET = new Set(DATABASE_BOOT_FILES);
|
|
64
|
+
/**
|
|
65
|
+
* The root `tools/` files every app `jest.config.cjs` requires by its
|
|
66
|
+
* repo-relative path (#9654): the timezone pin (#8657) and the shared
|
|
67
|
+
* reporters (#9430) — `SNAPSHOT_FILES` in `scripts/build-templates.mjs`
|
|
68
|
+
* ships both at that path. Recorded and carried by `update` like an app
|
|
69
|
+
* file, so a merged config never names a file the site lacks.
|
|
70
|
+
*/
|
|
71
|
+
export const ROOT_TOOL_FILES = [
|
|
72
|
+
"tools/jest/pin-timezone.cjs",
|
|
73
|
+
"tools/jest/reporters.cjs",
|
|
74
|
+
];
|
|
75
|
+
const ROOT_TOOL_SET = new Set(ROOT_TOOL_FILES);
|
|
48
76
|
/**
|
|
49
77
|
* Whether a destination path (`/`-separated, as `templateDestination`
|
|
50
|
-
* returns it) is one `update` ever records or touches (#8522 D2):
|
|
51
|
-
*
|
|
78
|
+
* returns it) is one `update` ever records or touches (#8522 D2): one of
|
|
79
|
+
* the three `DATABASE_BOOT_FILES` or the `ROOT_TOOL_FILES`, or under one of
|
|
80
|
+
* the three app trees, not a `package.json`, not an `.env*` file, no
|
|
52
81
|
* `.claude` segment, and not a path a generator rewrites after the copy.
|
|
53
82
|
*/
|
|
54
83
|
export function isRecordable(destRel) {
|
|
84
|
+
if (DATABASE_BOOT_SET.has(destRel) || ROOT_TOOL_SET.has(destRel))
|
|
85
|
+
return true;
|
|
55
86
|
if (!RECORDABLE_APP_ROOT.test(destRel))
|
|
56
87
|
return false;
|
|
57
88
|
const segments = destRel.split("/");
|
package/dist/topology.d.ts
CHANGED
|
@@ -150,13 +150,26 @@ export declare function renderWebSeam(topology: Topology, signIn?: SignInMode, o
|
|
|
150
150
|
* @throws TopologyError for a spoke in the default mode.
|
|
151
151
|
*/
|
|
152
152
|
export declare function renderAuthedGateSeam(topology: Topology, signIn?: SignInMode): string;
|
|
153
|
+
/** The hub seam's source of its workspace resolution and licence store (#9460 DD7). */
|
|
154
|
+
export declare const MCP_SERVER_HUB = "@working-theory/mcp-server/hub";
|
|
153
155
|
/** `apps/mcp/src/lib/topology.generated.ts` for `topology` (D5). */
|
|
154
156
|
export declare function renderMcpSeam(topology: Topology): string;
|
|
155
157
|
/** `apps/web/lib/api-origin.generated.ts` for `topology` (#7874 D12). */
|
|
156
158
|
export declare function renderApiOriginSeam(topology: Topology): string;
|
|
157
|
-
/**
|
|
158
|
-
|
|
159
|
-
|
|
159
|
+
/**
|
|
160
|
+
* The packages a hub's root `package.json` declares for its thin `database/`
|
|
161
|
+
* (#9569 DD3): the two the boot files import, and the three the `db:*`
|
|
162
|
+
* scripts run. `build-templates.mjs` writes them into the snapshot's root
|
|
163
|
+
* `devDependencies`; the spoke transform below strips the same five.
|
|
164
|
+
*/
|
|
165
|
+
export declare const DATABASE_CONSUMER_DEPENDENCIES: readonly string[];
|
|
166
|
+
/**
|
|
167
|
+
* The root `package.json` without its `db:*` scripts and without the
|
|
168
|
+
* `DATABASE_CONSUMER_DEPENDENCIES` lines (#9569 DD6): a spoke has no
|
|
169
|
+
* `database/`, so it runs no database script and installs no Prisma.
|
|
170
|
+
* @throws TopologyError when the `scripts` block or the
|
|
171
|
+
* `@working-theory/database` declaration is absent.
|
|
172
|
+
*/
|
|
160
173
|
export declare function transformRootPackageJson(text: string): string;
|
|
161
174
|
/** The spoke's declared-env script (#7874 D11) — named apart from the monorepo's `env:check`. */
|
|
162
175
|
export declare const ENV_DECLARED_SCRIPT = "env:declared";
|
package/dist/topology.js
CHANGED
|
@@ -67,9 +67,6 @@ export const SPOKE_REMOVAL_SEEDS = [
|
|
|
67
67
|
"apps/web/app/api/auth",
|
|
68
68
|
"apps/web/app/[locale]/(auth)",
|
|
69
69
|
"apps/web/app/[locale]/(authed)",
|
|
70
|
-
"apps/mcp/src/lib/prisma.ts",
|
|
71
|
-
"apps/mcp/src/lib/public-workspace.ts",
|
|
72
|
-
"apps/mcp/src/lib/license-key-store.ts",
|
|
73
70
|
...SPOKE_HUB_CHECKOUT_SEEDS,
|
|
74
71
|
];
|
|
75
72
|
/**
|
|
@@ -518,9 +515,11 @@ import { readLocales } from "${WEB_I18N_PACKAGE}";
|
|
|
518
515
|
import { getTranslations } from "${NEXT_INTL_SERVER}";
|
|
519
516
|
import type { ReactElement } from "${REACT_PACKAGE}";
|
|
520
517
|
|
|
518
|
+
import { legalFootnote } from "../(auth)/legal-footnote";
|
|
521
519
|
import { resolveSignInCardText } from "../(auth)/sign-in/sign-in-text";
|
|
522
520
|
import { getActiveProviderIds } from "../../../lib/auth-env";
|
|
523
521
|
import { isAccountPath } from "../../../lib/auth-routes";
|
|
522
|
+
import { siteLogo } from "../../../lib/site-logo";
|
|
524
523
|
|
|
525
524
|
import { SignInGate } from "./sign-in-gate";
|
|
526
525
|
|
|
@@ -542,9 +541,7 @@ export async function SignedOutGate({
|
|
|
542
541
|
namespace: isAccount ? "account.gate" : "waitlistDashboard.gate",
|
|
543
542
|
});
|
|
544
543
|
const active = getActiveProviderIds();
|
|
545
|
-
const emailLink = active.includes("magic-link")
|
|
546
|
-
? { text: await resolveSignInCardText(locale) }
|
|
547
|
-
: undefined;
|
|
544
|
+
const emailLink = active.includes("magic-link");
|
|
548
545
|
const providers = active.filter((id): id is AuthPanelProvider =>
|
|
549
546
|
(SUPPORTED_PROVIDERS as readonly string[]).includes(id),
|
|
550
547
|
);
|
|
@@ -578,6 +575,25 @@ export async function SignedOutGate({
|
|
|
578
575
|
);
|
|
579
576
|
}
|
|
580
577
|
|
|
578
|
+
// The sign-in card: with the email link on, and on the member gate, which
|
|
579
|
+
// also wears the one card's frame — the mark, the toggle line to /sign-up
|
|
580
|
+
// and the Terms + Privacy acknowledgement (#9662).
|
|
581
|
+
const text =
|
|
582
|
+
emailLink || isAccount ? await resolveSignInCardText(locale) : undefined;
|
|
583
|
+
const card = text
|
|
584
|
+
? {
|
|
585
|
+
text,
|
|
586
|
+
emailLink,
|
|
587
|
+
...(isAccount
|
|
588
|
+
? {
|
|
589
|
+
logo: siteLogo(),
|
|
590
|
+
prospect: { ...text.prospect, href: localeHref(locale, "/sign-up") },
|
|
591
|
+
footnote: legalFootnote(locale, text.acknowledgement),
|
|
592
|
+
}
|
|
593
|
+
: {}),
|
|
594
|
+
}
|
|
595
|
+
: undefined;
|
|
596
|
+
|
|
581
597
|
return (
|
|
582
598
|
<SignInGate
|
|
583
599
|
labels={{
|
|
@@ -587,7 +603,7 @@ export async function SignedOutGate({
|
|
|
587
603
|
}}
|
|
588
604
|
signInPath={signInPath}
|
|
589
605
|
providers={providers}
|
|
590
|
-
{...(
|
|
606
|
+
{...(card ? { card } : {})}
|
|
591
607
|
/>
|
|
592
608
|
);
|
|
593
609
|
}
|
|
@@ -618,6 +634,8 @@ export function SignedOutGate({
|
|
|
618
634
|
* create-ailk carries no runtime dependency.
|
|
619
635
|
*/
|
|
620
636
|
const CONTENT_ADAPTERS_PACKAGE = "@working-theory/content-adapters";
|
|
637
|
+
/** The hub seam's source of its workspace resolution and licence store (#9460 DD7). */
|
|
638
|
+
export const MCP_SERVER_HUB = "@working-theory/mcp-server/hub";
|
|
621
639
|
/** `apps/mcp/src/lib/topology.generated.ts` for `topology` (D5). */
|
|
622
640
|
export function renderMcpSeam(topology) {
|
|
623
641
|
if (topology === "hub") {
|
|
@@ -626,9 +644,9 @@ import {
|
|
|
626
644
|
initMcpPublicWorkspace,
|
|
627
645
|
mcpPublicWorkspace,
|
|
628
646
|
type McpWorkspaceResolution,
|
|
629
|
-
} from "
|
|
647
|
+
} from "${MCP_SERVER_HUB}";
|
|
630
648
|
|
|
631
|
-
export { registerLicenseKeyStore } from "
|
|
649
|
+
export { registerLicenseKeyStore } from "${MCP_SERVER_HUB}";
|
|
632
650
|
export type { McpWorkspaceResolution };
|
|
633
651
|
|
|
634
652
|
export const TOPOLOGY: "hub" | "spoke" = "hub";
|
|
@@ -709,22 +727,37 @@ function dropLines(text, drop, label, json) {
|
|
|
709
727
|
}
|
|
710
728
|
return next;
|
|
711
729
|
}
|
|
712
|
-
/**
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
717
|
-
|
|
718
|
-
|
|
719
|
-
|
|
720
|
-
|
|
730
|
+
/**
|
|
731
|
+
* The packages a hub's root `package.json` declares for its thin `database/`
|
|
732
|
+
* (#9569 DD3): the two the boot files import, and the three the `db:*`
|
|
733
|
+
* scripts run. `build-templates.mjs` writes them into the snapshot's root
|
|
734
|
+
* `devDependencies`; the spoke transform below strips the same five.
|
|
735
|
+
*/
|
|
736
|
+
export const DATABASE_CONSUMER_DEPENDENCIES = [
|
|
737
|
+
"@working-theory/database",
|
|
738
|
+
"@working-theory/validation",
|
|
739
|
+
"@prisma/adapter-pg",
|
|
740
|
+
"prisma",
|
|
741
|
+
"dotenv",
|
|
742
|
+
];
|
|
743
|
+
/**
|
|
744
|
+
* The root `package.json` without its `db:*` scripts and without the
|
|
745
|
+
* `DATABASE_CONSUMER_DEPENDENCIES` lines (#9569 DD6): a spoke has no
|
|
746
|
+
* `database/`, so it runs no database script and installs no Prisma.
|
|
747
|
+
* @throws TopologyError when the `scripts` block or the
|
|
748
|
+
* `@working-theory/database` declaration is absent.
|
|
749
|
+
*/
|
|
721
750
|
export function transformRootPackageJson(text) {
|
|
722
751
|
const pkg = JSON.parse(text);
|
|
723
752
|
if (pkg.scripts === undefined) {
|
|
724
753
|
throw new TopologyError(`package.json: no "scripts" block to remove the db:* scripts from`);
|
|
725
754
|
}
|
|
726
755
|
const scriptLine = /^\s*"db:[^"]*"\s*:/;
|
|
727
|
-
|
|
756
|
+
const depLine = new RegExp(`^\\s*"(${DATABASE_CONSUMER_DEPENDENCIES.map((name) => name.replace(/[/@.]/g, "\\$&")).join("|")})"\\s*:`);
|
|
757
|
+
if (!text.split("\n").some((line) => /^\s*"@working-theory\/database"\s*:/.test(line))) {
|
|
758
|
+
throw new TopologyError(`package.json: no "@working-theory/database" dependency to remove`);
|
|
759
|
+
}
|
|
760
|
+
return dropLines(text, (line) => scriptLine.test(line) || depLine.test(line), "package.json", true);
|
|
728
761
|
}
|
|
729
762
|
/** The spoke's declared-env script (#7874 D11) — named apart from the monorepo's `env:check`. */
|
|
730
763
|
export const ENV_DECLARED_SCRIPT = "env:declared";
|
|
@@ -825,7 +858,6 @@ export function applySpokeTransforms(targetDir, opts) {
|
|
|
825
858
|
if (next !== text)
|
|
826
859
|
writeFileSync(path, next);
|
|
827
860
|
};
|
|
828
|
-
edit("pnpm-workspace.yaml", transformWorkspaceYaml);
|
|
829
861
|
edit("package.json", (text) => addEnvCheckScripts(transformRootPackageJson(text)));
|
|
830
862
|
edit(".github/workflows/ci.yml", transformCiWorkflow);
|
|
831
863
|
edit("tsconfig.json", (text) => transformRootTsconfig(text, opts));
|
|
@@ -937,9 +969,8 @@ export function renderSpokeHardFloors(opts) {
|
|
|
937
969
|
? " reason: sign-in paths — this spoke signs in through its hub; every change requires human review"
|
|
938
970
|
: " reason: sign-in paths — absent on a spoke; their return requires human review",
|
|
939
971
|
];
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
}
|
|
972
|
+
// No MCP tool floor (#9567): a spoke's `apps/mcp/src` is the boot set, and
|
|
973
|
+
// the tool surface lives in `@working-theory/mcp-server`.
|
|
943
974
|
return `${lines.join("\n")}\n`;
|
|
944
975
|
}
|
|
945
976
|
/** `project.yaml` with its `hard_floors:` block replaced by the spoke's (D9). */
|