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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-ailk",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.26.0",
|
|
4
4
|
"description": "Scaffolder for AI Launch Kit — `pnpm create ailk@latest <dir>` produces a starter repo consuming @working-theory/* from npm (per ADR 0007).",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -28,8 +28,8 @@
|
|
|
28
28
|
"tar": "^7.5.21"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@working-theory/schema": "0.
|
|
32
|
-
"@working-theory/templates": "0.
|
|
31
|
+
"@working-theory/schema": "0.48.0",
|
|
32
|
+
"@working-theory/templates": "0.48.0"
|
|
33
33
|
},
|
|
34
34
|
"repository": {
|
|
35
35
|
"type": "git",
|
package/release-scope.json
CHANGED
|
@@ -17,9 +17,9 @@
|
|
|
17
17
|
"docs-blog": "released",
|
|
18
18
|
"scheduling": "released",
|
|
19
19
|
"signal-collectors": "released",
|
|
20
|
-
"workspace": "
|
|
20
|
+
"workspace": "released",
|
|
21
21
|
"multi-tenant": "gated",
|
|
22
22
|
"commerce": "gated"
|
|
23
23
|
},
|
|
24
|
-
"levels": { "free": "
|
|
24
|
+
"levels": { "free": "deferred", "pro": "released", "pro-plus": "gated" }
|
|
25
25
|
}
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"template": "marketing-site",
|
|
3
|
-
"requires": [
|
|
3
|
+
"requires": [
|
|
4
|
+
"marketing",
|
|
5
|
+
"docs-blog",
|
|
6
|
+
"scheduling",
|
|
7
|
+
"signal-collectors",
|
|
8
|
+
"workspace"
|
|
9
|
+
],
|
|
4
10
|
"categories": [
|
|
5
11
|
"accounting",
|
|
6
12
|
"legal",
|
|
@@ -17,7 +23,7 @@
|
|
|
17
23
|
],
|
|
18
24
|
"shape": "organization-product",
|
|
19
25
|
"design": "standard",
|
|
20
|
-
"generatedHash": "
|
|
26
|
+
"generatedHash": "d58492d416674a21b1358858d285b7050d14618f5e2bed2f0ae20bdbc5267d5a",
|
|
21
27
|
"layout": {
|
|
22
28
|
"nav": "full",
|
|
23
29
|
"footer": "columns",
|
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
| ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
7
7
|
| Template | `marketing-site` |
|
|
8
8
|
| Level | Pro |
|
|
9
|
-
| `requires` | `[marketing, docs-blog, scheduling, signal-collectors]` (spec 5462 D12/D15, settled by Sam 2026-09-14)
|
|
9
|
+
| `requires` | `[marketing, docs-blog, scheduling, signal-collectors, workspace]` (spec 5462 D12/D15, settled by Sam 2026-09-14; `workspace` since #9696) |
|
|
10
10
|
| Delivery | licence-checked module bundle (#5441); never in the Free tarball. Composed base → modules → template (#5618): `/pricing`, `/privacy`, `/terms` arrive from the `_base` layer it `extends`, every module sample from the docs-blog and signal-collectors bundles its `requires` names, and this tree ships one copy override (blog post 05 onto `launching-ailk.mdx`) |
|
|
11
11
|
| Sample content posture | every sample report, post and flow in the demo is **public** |
|
|
12
12
|
|
|
@@ -513,7 +513,7 @@ Everything in the Free manifest § 2a applies. Pro adds:
|
|
|
513
513
|
|
|
514
514
|
```
|
|
515
515
|
marketing-site:
|
|
516
|
-
requires: [marketing, docs-blog, scheduling, signal-collectors]
|
|
516
|
+
requires: [marketing, docs-blog, scheduling, signal-collectors, workspace]
|
|
517
517
|
categories: [accounting, legal, consulting, hvac, roofing, plumbing, electrical, landscaping, auto-repair, real-estate, technology, medical-specialty]
|
|
518
518
|
shape: organization-product
|
|
519
519
|
design: standard
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "marketing-site",
|
|
3
|
-
"requires": [
|
|
3
|
+
"requires": [
|
|
4
|
+
"marketing",
|
|
5
|
+
"docs-blog",
|
|
6
|
+
"scheduling",
|
|
7
|
+
"signal-collectors",
|
|
8
|
+
"workspace"
|
|
9
|
+
],
|
|
4
10
|
"extends": "_base",
|
|
5
11
|
"$comment": "Pro template (#5464). installMap: bundle-relative source -> scaffold-relative destination; the stager reads only installMap/postInstall/patches. After #5618 D6 this tree holds compositions and copy overrides only: the base pages (/pricing, /privacy, /terms) arrive from the _base layer it extends, and every module sample (the blog listing and posts 01-04, the three docs pages, the projects, thank-you, flow, waitlist and report samples) ships in the docs-blog and signal-collectors bundles its requires names. Its one content file, post 05, is deliberately mapped ONTO apps/web/content/en/blog/launching-ailk.mdx (D6.2a): the template lands last and can overwrite but never remove the module's own seed post, so this is Rule B's copy-override clause with a real instance (a template-owned replacement of a seed row is a docs-blog gap on #5467, spec 5618 s7 finding 9). Unmapped content/en/** would land at the scaffold root's content/, exactly as marketing-site-free's does; today nothing is unmapped.",
|
|
6
12
|
"installMap": {
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
"docs-blog",
|
|
6
6
|
"scheduling",
|
|
7
7
|
"signal-collectors",
|
|
8
|
+
"workspace",
|
|
8
9
|
"multi-tenant"
|
|
9
10
|
],
|
|
10
11
|
"extends": "_base",
|
|
@@ -12,5 +13,5 @@
|
|
|
12
13
|
"installMap": {
|
|
13
14
|
"provenance.json": ".ailk-template.json"
|
|
14
15
|
},
|
|
15
|
-
"postInstall": "Template saas-product installed. Its Pro Plus modules - docs-blog, scheduling, signal-collectors and multi-tenant (the authed apps/admin app) - are delivered by their own module bundles. This template's own page compositions, copy and demo data are pending under #5470; until they land it contributes the provenance record and its requires cross-check only, and the scaffold renders each module's own seed content."
|
|
16
|
+
"postInstall": "Template saas-product installed. Its Pro Plus modules - docs-blog, scheduling, signal-collectors, workspace (the /admin settings pages) and multi-tenant (the authed apps/admin app) - are delivered by their own module bundles. This template's own page compositions, copy and demo data are pending under #5470; until they land it contributes the provenance record and its requires cross-check only, and the scaffold renders each module's own seed content."
|
|
16
17
|
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# PreToolUse (Edit|Write): refuse an unrecorded edit to a template-owned file.
|
|
3
|
+
# A code file under apps/ that .ailk-template-files.json records, whose bytes
|
|
4
|
+
# still match the template's sha256, is refused (exit 2) unless an entry in
|
|
5
|
+
# customizations.yaml names it; the refusal on stderr names the file, the
|
|
6
|
+
# entry to add and the upstream route. An edited, unrecorded or manifest-named
|
|
7
|
+
# file passes. A site with no record warns and passes. Pure bash, grep, awk
|
|
8
|
+
# and sha256sum/shasum — nothing a scaffold has to install. Registered in
|
|
9
|
+
# .claude/settings.json and declared in .claude/cloudparity-repo-hooks.json;
|
|
10
|
+
# keep the two in step.
|
|
11
|
+
export LC_ALL=C
|
|
12
|
+
cd "$CLAUDE_PROJECT_DIR" || exit 0
|
|
13
|
+
|
|
14
|
+
IFS= read -r -d '' input
|
|
15
|
+
[[ $input =~ \"file_path\"[[:space:]]*:[[:space:]]*\"([^\"\\]*)\" ]] || exit 0
|
|
16
|
+
rel=${BASH_REMATCH[1]}
|
|
17
|
+
case $rel in
|
|
18
|
+
"$PWD"/*) rel=${rel#"$PWD"/} ;;
|
|
19
|
+
/*) exit 0 ;;
|
|
20
|
+
./*) rel=${rel#./} ;;
|
|
21
|
+
esac
|
|
22
|
+
# Only a code file under one of the three recordable roots can be template-owned.
|
|
23
|
+
case $rel in
|
|
24
|
+
*.d.ts) exit 0 ;;
|
|
25
|
+
apps/web/*|apps/api/*|apps/mcp/*)
|
|
26
|
+
case $rel in
|
|
27
|
+
*.ts|*.tsx|*.js|*.jsx|*.mts|*.cts|*.mjs|*.cjs) ;;
|
|
28
|
+
*) exit 0 ;;
|
|
29
|
+
esac ;;
|
|
30
|
+
*) exit 0 ;;
|
|
31
|
+
esac
|
|
32
|
+
case "/$rel/" in
|
|
33
|
+
*/./*|*/../*|*//*) exit 0 ;;
|
|
34
|
+
esac
|
|
35
|
+
|
|
36
|
+
record=.ailk-template-files.json
|
|
37
|
+
if [ ! -f "$record" ]; then
|
|
38
|
+
printf '%s\n' '{"systemMessage":"template-guard: warning — no .ailk-template-files.json, so template files cannot be told from site files and edits under apps/ are not guarded; run create-ailk update to write it"}'
|
|
39
|
+
exit 0
|
|
40
|
+
fi
|
|
41
|
+
# The record is written by serializeTemplateRecord only: one ` "<path>": {`
|
|
42
|
+
# line per file, its `"sha256"` on the next.
|
|
43
|
+
row=$(grep -F -x -A1 -- " \"$rel\": {" "$record") || exit 0
|
|
44
|
+
[[ $row =~ \"sha256\":[[:space:]]*\"([0-9a-f]{64})\" ]] || exit 0
|
|
45
|
+
template=${BASH_REMATCH[1]}
|
|
46
|
+
[ -f "$rel" ] || exit 0
|
|
47
|
+
|
|
48
|
+
if command -v sha256sum >/dev/null 2>&1; then
|
|
49
|
+
disk=$(sha256sum -- "$rel")
|
|
50
|
+
elif command -v shasum >/dev/null 2>&1; then
|
|
51
|
+
disk=$(shasum -a 256 -- "$rel")
|
|
52
|
+
else
|
|
53
|
+
printf '%s\n' '{"systemMessage":"template-guard: warning — neither sha256sum nor shasum is on PATH, so edits to template files are not guarded"}'
|
|
54
|
+
exit 0
|
|
55
|
+
fi
|
|
56
|
+
# Edited already (update's own rule): the owner's file, a three-way-merge target.
|
|
57
|
+
[ "${disk%% *}" = "$template" ] || exit 0
|
|
58
|
+
|
|
59
|
+
# Named by a customizations.yaml pattern? Read lexically: every quoted scalar
|
|
60
|
+
# and every `- <plain>` item outside a comment that starts `apps/`, matched as
|
|
61
|
+
# a glob where `**` spans segments, `*` stays inside one and all else is literal.
|
|
62
|
+
if [ -f customizations.yaml ] && awk -v rel="$rel" -v sq="'" '
|
|
63
|
+
function matches(pat, n, seg, i, j, c, re, s) {
|
|
64
|
+
if (pat !~ /^apps\//) return 0
|
|
65
|
+
n = split(pat, seg, "/")
|
|
66
|
+
re = "^"
|
|
67
|
+
for (i = 1; i <= n; i++) {
|
|
68
|
+
s = seg[i]
|
|
69
|
+
if (s == "**") { re = re (i == n ? ".*" : "([^/]+/)*"); continue }
|
|
70
|
+
for (j = 1; j <= length(s); j++) {
|
|
71
|
+
c = substr(s, j, 1)
|
|
72
|
+
if (c == "*") re = re "[^/]*"
|
|
73
|
+
else if (c == "]") re = re "[]]"
|
|
74
|
+
else if (c == "^") re = re "\\^"
|
|
75
|
+
else if (c == "\\") re = re "\\\\"
|
|
76
|
+
else if (index(".[()+?{}|$", c)) re = re "[" c "]"
|
|
77
|
+
else re = re c
|
|
78
|
+
}
|
|
79
|
+
if (i < n) re = re "/"
|
|
80
|
+
}
|
|
81
|
+
return rel ~ (re "$")
|
|
82
|
+
}
|
|
83
|
+
/^[ \t]*#/ { next }
|
|
84
|
+
{
|
|
85
|
+
line = $0; n = length(line); quote = ""; cut = n
|
|
86
|
+
for (i = 1; i <= n; i++) {
|
|
87
|
+
c = substr(line, i, 1)
|
|
88
|
+
if (quote != "") { if (c == quote) quote = ""; continue }
|
|
89
|
+
if (c == "\"" || c == sq) { quote = c; continue }
|
|
90
|
+
if (c == "#" && (i == 1 || substr(line, i - 1, 1) ~ /[ \t]/)) { cut = i - 1; break }
|
|
91
|
+
}
|
|
92
|
+
line = substr(line, 1, cut)
|
|
93
|
+
rest = line
|
|
94
|
+
while (match(rest, "\"[^\"]*\"|" sq "[^" sq "]*" sq)) {
|
|
95
|
+
if (matches(substr(rest, RSTART + 1, RLENGTH - 2))) { found = 1; exit }
|
|
96
|
+
rest = substr(rest, RSTART + RLENGTH)
|
|
97
|
+
}
|
|
98
|
+
if (match(line, /^[ \t]*- /)) {
|
|
99
|
+
item = substr(line, RLENGTH + 1)
|
|
100
|
+
sub(/[ \t]+$/, "", item)
|
|
101
|
+
if (matches(item)) { found = 1; exit }
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
END { exit !found }
|
|
105
|
+
' customizations.yaml; then
|
|
106
|
+
exit 0
|
|
107
|
+
fi
|
|
108
|
+
|
|
109
|
+
# The seed id (#9223's rule) and the issue title, percent-encoded byte by byte.
|
|
110
|
+
out=$(awk -v rel="$rel" '
|
|
111
|
+
BEGIN {
|
|
112
|
+
id = tolower(rel); gsub(/[^a-z0-9]+/, "-", id); sub(/^-/, "", id); sub(/-$/, "", id)
|
|
113
|
+
for (i = 1; i < 256; i++) ord[sprintf("%c", i)] = i
|
|
114
|
+
s = "Template change: " rel
|
|
115
|
+
for (i = 1; i <= length(s); i++) {
|
|
116
|
+
c = substr(s, i, 1)
|
|
117
|
+
title = title (c ~ /[A-Za-z0-9._~-]/ ? c : sprintf("%%%02X", ord[c]))
|
|
118
|
+
}
|
|
119
|
+
print id; print title
|
|
120
|
+
}')
|
|
121
|
+
id=${out%%$'\n'*}
|
|
122
|
+
title=${out#*$'\n'}
|
|
123
|
+
|
|
124
|
+
printf '%s\n' >&2 \
|
|
125
|
+
"template-guard: $rel is a template file, unchanged since create-ailk wrote it, and no customizations.yaml entry names it." \
|
|
126
|
+
"A template file takes its fixes from create-ailk update; change it here only once the change is recorded." \
|
|
127
|
+
"Fix, one of:" \
|
|
128
|
+
" 1. Record it: add this entry under customizations: in customizations.yaml, fill in request and decision, then retry." \
|
|
129
|
+
" - id: $id" \
|
|
130
|
+
" paths:" \
|
|
131
|
+
" - \"$rel\"" \
|
|
132
|
+
" request: \"<owner>/<repo>#<issue>\"" \
|
|
133
|
+
" decision: \"build-in: site — <decider>, <YYYY-MM-DD>, <reason>\"" \
|
|
134
|
+
" decision is one of: build-in: ailk#<N> | build-in: site — <decider>, <YYYY-MM-DD>, <reason> | undecided (only while undecided_ok_until is in the future)." \
|
|
135
|
+
" 2. File it upstream, so AILK builds it in and this site takes it as a version bump:" \
|
|
136
|
+
" https://github.com/working-theory-labs/ai-launch-kit/issues/new?title=$title"
|
|
137
|
+
exit 2
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# Extending the Site
|
|
2
|
+
|
|
3
|
+
## The five extension points
|
|
4
|
+
|
|
5
|
+
This site stays upgradeable because it changes in five sanctioned ways,
|
|
6
|
+
and only five. From the program decision, with the manifest named:
|
|
7
|
+
|
|
8
|
+
> site config and content; the design package and theme; a section swap through the sections registry; wrapping a published component from an app; a site-authored file recorded in `customizations.yaml` with a build-in decision.
|
|
9
|
+
|
|
10
|
+
Everything else files upstream. The manifest's `undecided_ok_until`
|
|
11
|
+
grace is the only escape valve.
|
|
12
|
+
|
|
13
|
+
## Why this matters
|
|
14
|
+
|
|
15
|
+
- Every `@working-theory/*` package and every template-owned file is
|
|
16
|
+
replaced on upgrade. A change made anywhere else is a change the next
|
|
17
|
+
`create-ailk update` either overwrites or has to merge by hand.
|
|
18
|
+
- The five points are the places an upgrade preserves. Work done through
|
|
19
|
+
them survives a bump without a merge.
|
|
20
|
+
- A site that drifts outside them is a fork in all but name, and a fork
|
|
21
|
+
stops getting fixes.
|
|
22
|
+
|
|
23
|
+
## How to apply
|
|
24
|
+
|
|
25
|
+
Find the point your change belongs to, in this order, and use the first
|
|
26
|
+
that fits:
|
|
27
|
+
|
|
28
|
+
1. **Site config and content.** The site's name, identity entity, `theme:`
|
|
29
|
+
and `brand:` are `content/_site.mdx`; every page is an MDX file under
|
|
30
|
+
`content/<locale>/<TypeName>/`. New copy, a new page, a changed nav
|
|
31
|
+
label, which section a page renders and where it stands in the page's
|
|
32
|
+
`sections:` list: all content.
|
|
33
|
+
2. **The design package and theme.** The locked look is `DESIGN.md` plus
|
|
34
|
+
the `theme:` block in `_site.mdx`. A different look is
|
|
35
|
+
`pnpm create ailk@latest apply-design <name|path>`, which keeps
|
|
36
|
+
`brand:`; the owner's colours and fonts are the `brand:` block.
|
|
37
|
+
3. **A section swap through the sections registry.** When a section
|
|
38
|
+
needs different markup, the site registers a local component for that
|
|
39
|
+
section name in place of the published one (ADR 0007): the registry
|
|
40
|
+
seam is `registerSliceRenderer` from `@working-theory/ui`, and it
|
|
41
|
+
accepts only the keys the runtime offers for a swap (today `booker` and
|
|
42
|
+
`payment-receipt`); any other key is refused, not swapped. The local
|
|
43
|
+
component is site-authored code under `apps/`, so it is also recorded
|
|
44
|
+
under point five. A section the runtime offers no swap for is an
|
|
45
|
+
upstream request, not a component you write into the app.
|
|
46
|
+
4. **Wrapping a published component from an app.** When a published
|
|
47
|
+
component must behave differently here, wrap it in a file of this
|
|
48
|
+
site's and import the wrapper: never edit the package, patch it, or
|
|
49
|
+
copy its source in. The wrapper is site-authored code under `apps/`, so
|
|
50
|
+
it is also recorded under point five.
|
|
51
|
+
5. **A site-authored file recorded in `customizations.yaml` with a
|
|
52
|
+
build-in decision.** Source under `apps/` that none of the first four
|
|
53
|
+
points covers is the exception, and the exception is recorded before
|
|
54
|
+
it is written. One entry per customization:
|
|
55
|
+
|
|
56
|
+
```yaml
|
|
57
|
+
undecided_ok_until: 2027-01-31 # optional; YYYY-MM-DD
|
|
58
|
+
customizations: # required; may be []
|
|
59
|
+
- id: booking-embed # required; unique; /^[a-z0-9][a-z0-9-]*$/
|
|
60
|
+
paths: # required; ≥1; each starts "apps/"; no ".." segment
|
|
61
|
+
- "apps/web/components/booking/**"
|
|
62
|
+
request: "salessmyth/wendihenry#12" # /^([\w.-]+\/[\w.-]+)?#\d+$/; required unless undecided
|
|
63
|
+
decision: "build-in: ailk#9300 — removed when the bump lands"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
`decision` is exactly one of:
|
|
67
|
+
|
|
68
|
+
- `undecided`
|
|
69
|
+
- `build-in: ailk#<N>`, optionally followed by ` — <text>`
|
|
70
|
+
- `build-in: site — <decider>, <YYYY-MM-DD>, <reason>`
|
|
71
|
+
|
|
72
|
+
AILK builds a customization in unless it decides not to. `build-in:
|
|
73
|
+
ailk#N` means AILK ships it and this site's copy, tests included, goes
|
|
74
|
+
when the bump lands. `build-in: site` means AILK decided not to, and
|
|
75
|
+
the site keeps the file with the decider, the date and the reason.
|
|
76
|
+
`pnpm architecture` refuses site code with no entry.
|
|
77
|
+
|
|
78
|
+
## Everything else files upstream
|
|
79
|
+
|
|
80
|
+
A change that fits none of the five is a request to AI Launch Kit, not an
|
|
81
|
+
edit here. Open an issue at
|
|
82
|
+
<https://github.com/working-theory-labs/ai-launch-kit/issues> describing
|
|
83
|
+
what the site needs and why the five points do not cover it, and record
|
|
84
|
+
the request's issue in the manifest entry. Do not edit a template-owned
|
|
85
|
+
file, do not patch or pin off a `@working-theory/*` package (the
|
|
86
|
+
architecture rule already refuses each), and do not carry the change as
|
|
87
|
+
an unrecorded file.
|
|
88
|
+
|
|
89
|
+
## The one escape valve
|
|
90
|
+
|
|
91
|
+
An `undecided` entry passes the lint only while `undecided_ok_until` is a
|
|
92
|
+
date strictly after today (UTC). It exists so a site can be seeded, or a
|
|
93
|
+
request can be filed and decided, without going red the same day. It is
|
|
94
|
+
a deadline, not a state: when the date passes, record the decision or
|
|
95
|
+
move it with the request's owner.
|
|
96
|
+
|
|
97
|
+
## Escalation
|
|
98
|
+
|
|
99
|
+
Stop and surface the question rather than decide alone if:
|
|
100
|
+
|
|
101
|
+
- A change seems to need a sixth way in: an edit to a template-owned
|
|
102
|
+
file, a package patch, a copied source tree.
|
|
103
|
+
- The right point is unclear between four and five, or between three and
|
|
104
|
+
an upstream request.
|
|
105
|
+
- An `undecided` entry is about to go out of grace with no decision on
|
|
106
|
+
its request.
|
|
@@ -70,8 +70,8 @@ result on the PR.
|
|
|
70
70
|
|
|
71
71
|
For PRs touching specific surfaces:
|
|
72
72
|
|
|
73
|
-
- `database/`
|
|
74
|
-
|
|
73
|
+
- `database/` — never add a migration or a schema file; bump
|
|
74
|
+
`@working-theory/database` and run `pnpm db:migrate:deploy`.
|
|
75
75
|
|
|
76
76
|
## Commit + PR
|
|
77
77
|
|
package/templates/.env.example
CHANGED
|
@@ -148,7 +148,7 @@ CONTENT_ADAPTER=mdx
|
|
|
148
148
|
# ── Site id (apps/api, apps/web) ─────────────────────────────────────────────
|
|
149
149
|
# The scope captured rows are stamped with. Lead, WaitlistExperiment and
|
|
150
150
|
# ProjectListing carry `siteId`, which defaults to the literal "default"
|
|
151
|
-
# (
|
|
151
|
+
# (packages/api/src/lib/site.ts), while tenancy scopes reads by WORKSPACE id.
|
|
152
152
|
# A single-tenant deployment should set this to the default workspace
|
|
153
153
|
# sentinel so the two agree:
|
|
154
154
|
# AILK_SITE_ID=wksp_00000000-0000-7000-8000-000000000001
|
|
@@ -188,6 +188,13 @@ CONTENT_ADAPTER=mdx
|
|
|
188
188
|
# config declares a `followUps` block.
|
|
189
189
|
# AILK_FOLLOWUP_EMAIL_FROM=
|
|
190
190
|
#
|
|
191
|
+
# The inbox's sender (#9690): an Admin reply emailed to the client, and the
|
|
192
|
+
# Invite to sign up email. Optional — falls back to
|
|
193
|
+
# AILK_LEAD_NOTIFICATION_FROM when unset; with neither, a reply is still saved
|
|
194
|
+
# (its email is `not_configured`) and an invitation is refused. The links
|
|
195
|
+
# start at FRONTEND_URL (https only outside development).
|
|
196
|
+
# AILK_INBOX_FROM=
|
|
197
|
+
#
|
|
191
198
|
# The Resend Contacts audience the #4732 follow-up sweep checks before
|
|
192
199
|
# sending — a lead found unsubscribed in this audience is suppressed.
|
|
193
200
|
# Optional: unset degrades to "cannot verify — proceed" (never to "block all
|
|
@@ -381,7 +388,7 @@ CONTENT_ADAPTER=mdx
|
|
|
381
388
|
|
|
382
389
|
# ── E2E test-auth seam (pre-OSS — never set in production) ───────────────────
|
|
383
390
|
# These two env vars enable the test-auth route at POST /api/test/auth/session
|
|
384
|
-
# (
|
|
391
|
+
# (packages/api/src/routes/test/auth/session.ts) so an e2e harness can mint a
|
|
385
392
|
# Better Auth session for a seeded test user WITHOUT going through Google
|
|
386
393
|
# OAuth, GitHub OAuth, or magic-link email.
|
|
387
394
|
#
|
|
@@ -396,7 +403,7 @@ CONTENT_ADAPTER=mdx
|
|
|
396
403
|
#
|
|
397
404
|
# Allowlist format: comma-separated user IDs (exact-match strings; no regex,
|
|
398
405
|
# no wildcard). Empty entries between commas are trimmed.
|
|
399
|
-
# Run `pnpm
|
|
406
|
+
# Run `pnpm db:seed:test` to seed three test users
|
|
400
407
|
# (user_00000000-0000-7000-8000-0000000000e1 / …e2 / …e3 — reserved-range
|
|
401
408
|
# prefixed ids per ADR-0031, distinguished by the Better Auth `role` field).
|
|
402
409
|
# The seed script itself refuses to run unless
|
|
@@ -446,6 +453,14 @@ CONTENT_ADAPTER=mdx
|
|
|
446
453
|
# that database. Rotation and the rekey bin: apps/api/.env.example.
|
|
447
454
|
# STRIPE_CONNECTION_KEY=
|
|
448
455
|
# STRIPE_CONNECTION_KEY_PREVIOUS=
|
|
456
|
+
# The key each Organization's Slack connection is encrypted under (#9748),
|
|
457
|
+
# and the key it replaced during a rotation: 32 random bytes each, `openssl
|
|
458
|
+
# rand -base64 32`, distinct from each other and from SCHEDULING_CREDENTIAL_KEY
|
|
459
|
+
# and both Stripe connection keys. Unset = a connection cannot be written and
|
|
460
|
+
# reads as not connected, but can be removed; any other shape stops the API.
|
|
461
|
+
# No rekey walk: rotation and the leaked-key rule in apps/api/.env.example.
|
|
462
|
+
# SLACK_CONNECTION_KEY=
|
|
463
|
+
# SLACK_CONNECTION_KEY_PREVIOUS=
|
|
449
464
|
# The Organization that owns STRIPE_SECRET_KEY (#9285): with the multi-tenant
|
|
450
465
|
# module only the Organization whose id is named here sells through it; unset
|
|
451
466
|
# means nobody. Without the module the single Organization owns it.
|
|
@@ -533,7 +548,7 @@ CONTENT_ADAPTER=mdx
|
|
|
533
548
|
# pre-#5040 in-process Map, which does not. Default: `database` when
|
|
534
549
|
# DATABASE_URL is set, else `memory`. A database failure or a 1s-slow call
|
|
535
550
|
# falls back to the in-process Map for that request rather than letting it
|
|
536
|
-
# through uncounted. Run `pnpm --filter @working-theory/api rate-limit:probe
|
|
551
|
+
# through uncounted. Run `pnpm --filter @working-theory/app-api rate-limit:probe
|
|
537
552
|
# --origin <https origin>` against a live deployment to check which store it
|
|
538
553
|
# selected and whether a burst holds — see
|
|
539
554
|
# docs/runbooks/site-configuration.md.
|
|
@@ -547,7 +562,7 @@ CONTENT_ADAPTER=mdx
|
|
|
547
562
|
#
|
|
548
563
|
# Hub and spokes — a spoke's reads and writes resolve to ITS OWN workspace
|
|
549
564
|
# (#7532). A hub holding one workspace per spoke registers each spoke in its
|
|
550
|
-
# database (`pnpm --filter @working-theory/api spokes register --workspace
|
|
565
|
+
# database (`pnpm --filter @working-theory/app-api spokes register --workspace
|
|
551
566
|
# <wksp_id> --name <label>`), which prints the spoke's key once. The spoke
|
|
552
567
|
# sends it on every server-side call, and the hub resolves meeting types, the
|
|
553
568
|
# three lead writes, bookings and public content reads to that spoke's
|
|
@@ -5,6 +5,9 @@ on:
|
|
|
5
5
|
|
|
6
6
|
jobs:
|
|
7
7
|
ci:
|
|
8
|
+
# Posted as the `preflight` status check — the one to make required on the
|
|
9
|
+
# default branch (project.yaml `ci.required_checks`, CLAUDE.md § Checks).
|
|
10
|
+
name: preflight
|
|
8
11
|
runs-on: ubuntu-latest
|
|
9
12
|
steps:
|
|
10
13
|
- uses: actions/checkout@v4
|
|
@@ -46,10 +49,10 @@ jobs:
|
|
|
46
49
|
# real lockfile has been committed.
|
|
47
50
|
- run: pnpm install
|
|
48
51
|
|
|
49
|
-
# Prisma
|
|
50
|
-
#
|
|
51
|
-
#
|
|
52
|
-
# no DATABASE_URL (it reads only the schema
|
|
52
|
+
# The Prisma client ships prebuilt in the installed @working-theory/database;
|
|
53
|
+
# `db:generate` (through database/prisma.config.ts) is the cheapest proof
|
|
54
|
+
# that the installed schema loads under this site's own Prisma CLI, and it
|
|
55
|
+
# needs no DATABASE_URL (it reads only the schema files, no live DB).
|
|
53
56
|
- run: pnpm db:generate
|
|
54
57
|
|
|
55
58
|
- run: pnpm type-check
|
package/templates/CLAUDE.md
CHANGED
|
@@ -19,7 +19,7 @@ CloudParity block goes just above it.
|
|
|
19
19
|
apps/web/ Next.js app — visitor-facing UX
|
|
20
20
|
apps/api/ Fastify HTTP API — lead capture, checkout, webhooks
|
|
21
21
|
apps/mcp/ MCP server — agent-callable tools
|
|
22
|
-
database/ Prisma
|
|
22
|
+
database/ Prisma config + seed; schema and migrations ship in @working-theory/database
|
|
23
23
|
content/ Site settings (_site.mdx) and MDX pages (en/<TypeName>/)
|
|
24
24
|
.claude/ Rules, the agent definition and settings for Claude Code
|
|
25
25
|
tools/ This repo's own checks (architecture, CLAUDE.md drift)
|
|
@@ -29,6 +29,10 @@ You consume `@working-theory/*` packages from npm: read a README or types,
|
|
|
29
29
|
not the source. Build on one by composing, wrapping or configuring it via
|
|
30
30
|
its documented extension points. Never copy it out of `node_modules`, fork,
|
|
31
31
|
patch or pin it: a copy stops taking fixes. `pnpm architecture` refuses each.
|
|
32
|
+
|
|
33
|
+
Before you write a new source file under `apps/`, record it in `customizations.yaml`:
|
|
34
|
+
its paths, the request issue, and the build-in decision. AILK builds a customization
|
|
35
|
+
in unless it decides not to. `pnpm architecture` refuses site code with no entry.
|
|
32
36
|
<!-- /ailk:template id="repo-shape" -->
|
|
33
37
|
|
|
34
38
|
<!-- ailk:template id="architecture" -->
|
|
@@ -123,6 +127,12 @@ For design work, the third-party impeccable plugin is optional:
|
|
|
123
127
|
| `pnpm test` | Failing unit tests |
|
|
124
128
|
| `/ailk:check-site` skill | Missing or invalid JSON-LD, weak citation-readiness |
|
|
125
129
|
|
|
130
|
+
`.github/workflows/ci.yml` runs the preflight checks and `pnpm test` on every
|
|
131
|
+
pull request as the `preflight` status check. One step is yours: make
|
|
132
|
+
`preflight` a required status check on your default branch (GitHub: Settings →
|
|
133
|
+
Branches), so a change that fails it — an AI Launch Kit upgrade included —
|
|
134
|
+
cannot merge.
|
|
135
|
+
|
|
126
136
|
<!-- /ailk:template id="checks" -->
|
|
127
137
|
|
|
128
138
|
<!-- ailk:template id="workflow" -->
|
package/templates/CONVENTIONS.md
CHANGED
|
@@ -96,13 +96,12 @@ decision — write a short rationale in `docs/` first.
|
|
|
96
96
|
|
|
97
97
|
If you've enabled the optional database layer:
|
|
98
98
|
|
|
99
|
-
- **
|
|
100
|
-
`prisma
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
- **No raw SQL
|
|
105
|
-
access goes through Prisma.
|
|
99
|
+
- **The schema and the migrations ship in `@working-theory/database`.**
|
|
100
|
+
This site carries neither: `database/prisma.config.ts` points Prisma at
|
|
101
|
+
the installed package. Take new ones by bumping that dependency and
|
|
102
|
+
running `pnpm db:migrate:deploy`. Never write a migration or a `.prisma`
|
|
103
|
+
file here.
|
|
104
|
+
- **No raw SQL; all runtime data access goes through Prisma.**
|
|
106
105
|
- **`@map` for snake_case ↔ camelCase.** DB columns are snake_case;
|
|
107
106
|
TS field names are camelCase.
|
|
108
107
|
- **Index every query you ship.** Add `@@index([...])` for any field
|
|
@@ -117,9 +116,8 @@ If you've enabled the optional database layer:
|
|
|
117
116
|
|
|
118
117
|
## Testing
|
|
119
118
|
|
|
120
|
-
- **Jest + ts-jest** for unit tests, co-located. Each app
|
|
121
|
-
|
|
122
|
-
`pnpm -r test`.
|
|
119
|
+
- **Jest + ts-jest** for unit tests, co-located. Each app ships its own
|
|
120
|
+
Jest config; the root `pnpm test` fans out via `pnpm -r test`.
|
|
123
121
|
- Source: `Foo.tsx` → tests: `__tests__/Foo.test.tsx`.
|
|
124
122
|
- Run: `pnpm --filter <pkg> test`.
|
|
125
123
|
- **Playwright** for end-to-end (root `e2e/` once you add it).
|