create-ailk 0.23.0 → 0.25.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +68 -33
- package/component-catalog.json +3 -3
- package/component-catalog.md +3 -3
- package/dist/add-module.js +10 -3
- package/dist/add-route.d.ts +12 -1
- package/dist/add-route.js +38 -4
- package/dist/cli.js +12 -7
- package/dist/derive-architecture.d.ts +3 -4
- package/dist/derive-architecture.js +75 -22
- 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 +1 -1
- package/dist/lib/fetch-template-snapshot.js +7 -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 +34 -12
- package/dist/lib/scaffold-render-sweep.d.ts +33 -0
- package/dist/lib/scaffold-render-sweep.js +45 -0
- package/dist/module-architecture.d.ts +20 -3
- package/dist/module-architecture.js +122 -538
- package/dist/paid-sections.d.ts +25 -1
- package/dist/paid-sections.js +88 -3
- package/dist/surfaces.js +10 -2
- package/dist/sync-routes.d.ts +30 -4
- package/dist/sync-routes.js +271 -18
- package/dist/template-record.d.ts +14 -4
- package/dist/template-record.js +23 -5
- package/dist/topology.d.ts +16 -3
- package/dist/topology.js +31 -19
- package/dist/update.d.ts +10 -1
- package/dist/update.js +540 -16
- package/package.json +3 -3
- package/release-scope.json +1 -1
- 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 +9 -5
- package/templates/.github/workflows/ci.yml +7 -4
- package/templates/CLAUDE.md +15 -3
- package/templates/CONVENTIONS.md +8 -10
- package/templates/README.md +14 -13
- package/templates/apps/api/.env.example +9 -2
- package/templates/apps/api/CLAUDE.md +122 -82
- 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.ts +7 -4
- 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 -1857
- package/templates/apps/api/vercel.json +2 -2
- package/templates/apps/mcp/CLAUDE.md +77 -24
- 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 -12
- 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 +21 -5
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +9 -3
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +14 -4
- package/templates/apps/web/app/[locale]/contact/intake-analytics.ts +1 -1
- package/templates/apps/web/app/[locale]/contact/intake-script.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 +28 -7
- 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 +2 -2
- package/templates/apps/web/jest.config.cjs +1 -0
- package/templates/apps/web/lib/__tests__/magnet-routes.test.ts +7 -0
- package/templates/apps/web/lib/auth-email.ts +1 -1
- package/templates/apps/web/lib/magnet-routes.ts +3 -1
- package/templates/apps/web/lib/newsletter.actions.ts +9 -6
- 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/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 +32 -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 +757 -7
- package/templates/tsconfig.json +1 -2
- package/versions.json +48 -35
- 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 -292
- 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 -254
- 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 -318
- 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 -264
- 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 -1815
- 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 -325
- 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 -1300
- 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 -268
- package/templates/apps/api/src/routes/content/index.ts +0 -49
- package/templates/apps/api/src/routes/content/list-pages.ts +0 -95
- 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 -129
- package/templates/apps/api/src/routes/content/shown-offerings.ts +0 -229
- package/templates/apps/api/src/routes/content/slug.ts +0 -9
- 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 -573
- 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 -480
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +0 -465
- 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 -448
- 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 -808
- 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 -2026
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +0 -528
- 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 -867
- 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 -1176
- package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +0 -444
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +0 -154
- 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 -313
- 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 -755
- 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 -295
- 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 -868
- 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 -396
- package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +0 -681
- package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +0 -231
- package/templates/apps/api/src/services/offerings/catalog.ts +0 -308
- package/templates/apps/api/src/services/offerings/checkout-authorization.ts +0 -385
- package/templates/apps/api/src/services/offerings/checkout-session-record.ts +0 -192
- package/templates/apps/api/src/services/offerings/connection.ts +0 -1003
- 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 -1188
- 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 -2073
- 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 -1151
- 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 -65
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -187
- 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 -165
- package/templates/apps/mcp/__tests__/lib/public-workspace.test.ts +0 -124
- package/templates/apps/mcp/__tests__/list_pages.test.ts +0 -228
- package/templates/apps/mcp/__tests__/locale.test.ts +0 -135
- 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__/read_content.test.ts +0 -474
- package/templates/apps/mcp/__tests__/request_callback.test.ts +0 -225
- package/templates/apps/mcp/__tests__/search_content.test.ts +0 -256
- 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 -307
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +0 -223
- 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 -342
- 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 -526
- 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 -142
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +0 -139
- 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/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 -64
- 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 -137
- package/templates/apps/mcp/src/tools/list_pages.ts +0 -74
- 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 -75
- package/templates/apps/mcp/src/tools/request_callback.ts +0 -59
- package/templates/apps/mcp/src/tools/search_content.ts +0 -67
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +0 -57
- package/templates/apps/mcp/src/workspace-server.ts +0 -224
- package/templates/database/CHANGELOG.md +0 -961
- 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 -240
- package/templates/database/__tests__/spoke-registry.db.test.ts +0 -191
- package/templates/database/__tests__/tenancy.test.ts +0 -141
- 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/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.25.1",
|
|
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.46.0",
|
|
32
|
+
"@working-theory/templates": "0.46.0"
|
|
33
33
|
},
|
|
34
34
|
"repository": {
|
|
35
35
|
"type": "git",
|
package/release-scope.json
CHANGED
|
@@ -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
|
|
@@ -381,7 +381,7 @@ CONTENT_ADAPTER=mdx
|
|
|
381
381
|
|
|
382
382
|
# ── E2E test-auth seam (pre-OSS — never set in production) ───────────────────
|
|
383
383
|
# These two env vars enable the test-auth route at POST /api/test/auth/session
|
|
384
|
-
# (
|
|
384
|
+
# (packages/api/src/routes/test/auth/session.ts) so an e2e harness can mint a
|
|
385
385
|
# Better Auth session for a seeded test user WITHOUT going through Google
|
|
386
386
|
# OAuth, GitHub OAuth, or magic-link email.
|
|
387
387
|
#
|
|
@@ -396,7 +396,7 @@ CONTENT_ADAPTER=mdx
|
|
|
396
396
|
#
|
|
397
397
|
# Allowlist format: comma-separated user IDs (exact-match strings; no regex,
|
|
398
398
|
# no wildcard). Empty entries between commas are trimmed.
|
|
399
|
-
# Run `pnpm
|
|
399
|
+
# Run `pnpm db:seed:test` to seed three test users
|
|
400
400
|
# (user_00000000-0000-7000-8000-0000000000e1 / …e2 / …e3 — reserved-range
|
|
401
401
|
# prefixed ids per ADR-0031, distinguished by the Better Auth `role` field).
|
|
402
402
|
# The seed script itself refuses to run unless
|
|
@@ -446,6 +446,10 @@ CONTENT_ADAPTER=mdx
|
|
|
446
446
|
# that database. Rotation and the rekey bin: apps/api/.env.example.
|
|
447
447
|
# STRIPE_CONNECTION_KEY=
|
|
448
448
|
# STRIPE_CONNECTION_KEY_PREVIOUS=
|
|
449
|
+
# The Organization that owns STRIPE_SECRET_KEY (#9285): with the multi-tenant
|
|
450
|
+
# module only the Organization whose id is named here sells through it; unset
|
|
451
|
+
# means nobody. Without the module the single Organization owns it.
|
|
452
|
+
# STRIPE_ENV_ORGANIZATION_ID=
|
|
449
453
|
# HMAC-SHA256 key POST /v1/webhooks/calcom verifies the x-cal-signature-256
|
|
450
454
|
# header against (#6085). Unset makes the receiver answer 503 and accept
|
|
451
455
|
# nothing — the same fail-closed posture an unset STRIPE_WEBHOOK_SECRET has.
|
|
@@ -529,7 +533,7 @@ CONTENT_ADAPTER=mdx
|
|
|
529
533
|
# pre-#5040 in-process Map, which does not. Default: `database` when
|
|
530
534
|
# DATABASE_URL is set, else `memory`. A database failure or a 1s-slow call
|
|
531
535
|
# falls back to the in-process Map for that request rather than letting it
|
|
532
|
-
# through uncounted. Run `pnpm --filter @working-theory/api rate-limit:probe
|
|
536
|
+
# through uncounted. Run `pnpm --filter @working-theory/app-api rate-limit:probe
|
|
533
537
|
# --origin <https origin>` against a live deployment to check which store it
|
|
534
538
|
# selected and whether a burst holds — see
|
|
535
539
|
# docs/runbooks/site-configuration.md.
|
|
@@ -543,7 +547,7 @@ CONTENT_ADAPTER=mdx
|
|
|
543
547
|
#
|
|
544
548
|
# Hub and spokes — a spoke's reads and writes resolve to ITS OWN workspace
|
|
545
549
|
# (#7532). A hub holding one workspace per spoke registers each spoke in its
|
|
546
|
-
# database (`pnpm --filter @working-theory/api spokes register --workspace
|
|
550
|
+
# database (`pnpm --filter @working-theory/app-api spokes register --workspace
|
|
547
551
|
# <wksp_id> --name <label>`), which prints the spoke's key once. The spoke
|
|
548
552
|
# sends it on every server-side call, and the hub resolves meeting types, the
|
|
549
553
|
# 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,14 +19,20 @@ 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)
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
You consume `@working-theory/*` packages from npm
|
|
29
|
-
|
|
28
|
+
You consume `@working-theory/*` packages from npm: read a README or types,
|
|
29
|
+
not the source. Build on one by composing, wrapping or configuring it via
|
|
30
|
+
its documented extension points. Never copy it out of `node_modules`, fork,
|
|
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.
|
|
30
36
|
<!-- /ailk:template id="repo-shape" -->
|
|
31
37
|
|
|
32
38
|
<!-- ailk:template id="architecture" -->
|
|
@@ -121,6 +127,12 @@ For design work, the third-party impeccable plugin is optional:
|
|
|
121
127
|
| `pnpm test` | Failing unit tests |
|
|
122
128
|
| `/ailk:check-site` skill | Missing or invalid JSON-LD, weak citation-readiness |
|
|
123
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
|
+
|
|
124
136
|
<!-- /ailk:template id="checks" -->
|
|
125
137
|
|
|
126
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).
|
package/templates/README.md
CHANGED
|
@@ -33,7 +33,7 @@ pnpm preflight # architecture + CLAUDE.md drift + types + lint + build
|
|
|
33
33
|
pnpm build # production build
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
> Requires Node.js 20+ and `pnpm` — that is the whole prerequisite list. No database is needed to run or build this site (see [When you need a database](#when-you-need-a-database)), and no vendor API keys are required for first boot — Stripe, auth and email-provider integrations are opt-in.
|
|
36
|
+
> Requires Node.js 20+ and `pnpm` — that is the whole prerequisite list. No database is needed to run or build this site (see [When you need a database](#when-you-need-a-database)), and no vendor API keys are required for first boot — Stripe, auth and email-provider integrations are opt-in. The Prisma client ships prebuilt in `@working-theory/database`; there is no generator step to remember.
|
|
37
37
|
|
|
38
38
|
## Content
|
|
39
39
|
|
|
@@ -131,7 +131,7 @@ Set `AILK_PUBLIC_DOMAIN` to your own domain. `STEALTH=true` keeps a fresh deploy
|
|
|
131
131
|
|
|
132
132
|
## When you need a database
|
|
133
133
|
|
|
134
|
-
**A free marketing site needs no database at all.** `pnpm install`, `pnpm dev` and `pnpm build` all run green on an empty machine with no Postgres, no `DATABASE_URL` and no `.env` — the pages render from `content/*.mdx`, and the Prisma client
|
|
134
|
+
**A free marketing site needs no database at all.** `pnpm install`, `pnpm dev` and `pnpm build` all run green on an empty machine with no Postgres, no `DATABASE_URL` and no `.env` — the pages render from `content/*.mdx`, and the Prisma client ships prebuilt in `@working-theory/database` so the workspace type-checks and builds either way.
|
|
135
135
|
|
|
136
136
|
You need Postgres once you turn on one of these:
|
|
137
137
|
|
|
@@ -208,16 +208,17 @@ The AI Launch Kit skills come from the `ailk` Claude Code plugin; `.claude/setti
|
|
|
208
208
|
|
|
209
209
|
<!-- generated:begin skills -->
|
|
210
210
|
|
|
211
|
-
| Skill | What it does
|
|
212
|
-
| ---------------------- |
|
|
213
|
-
| `/ailk:add-auth` | Activate the site's sign-in providers (email-and-password, Google OAuth, GitHub OAuth) and write the env vars for the ones you pick.
|
|
214
|
-
| `/ailk:add-page` | Add a new page — its content file, its structured data and its nav link — in one confirm-before-write pass.
|
|
215
|
-
| `/ailk:check-site` | Run `ailk-audit` on the site and explain the score and findings in plain language. It never edits files.
|
|
216
|
-
| `/ailk:
|
|
217
|
-
| `/ailk:
|
|
218
|
-
| `/ailk:setup-
|
|
219
|
-
| `/ailk:
|
|
220
|
-
| `/ailk:
|
|
211
|
+
| Skill | What it does |
|
|
212
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
213
|
+
| `/ailk:add-auth` | Activate the site's sign-in providers (email-and-password, Google OAuth, GitHub OAuth) and write the env vars for the ones you pick. |
|
|
214
|
+
| `/ailk:add-page` | Add a new page — its content file, its structured data and its nav link — in one confirm-before-write pass. |
|
|
215
|
+
| `/ailk:check-site` | Run `ailk-audit` on the site and explain the score and findings in plain language. It never edits files. |
|
|
216
|
+
| `/ailk:extend-site` | Explain the five ways this site may be extended, walk you to the right one, and record a site-authored file in `customizations.yaml` with its build-in decision. |
|
|
217
|
+
| `/ailk:fill-page` | Fill one existing page's section content from a category profile: labelled sample content, or your own first draft from a short intake. |
|
|
218
|
+
| `/ailk:setup-database` | Take the site from no database to a working lead inbox, and prove it with one test message that must appear in the inbox. |
|
|
219
|
+
| `/ailk:setup-deploy` | Emit deploy configuration — `vercel.json` and `RUNBOOK.md`, plus an env checklist read from the site's own `.env.example`. |
|
|
220
|
+
| `/ailk:update-page` | Rename a page — its URL, its title, or both — in one plan-then-confirm pass, with a permanent redirect from the old URL. |
|
|
221
|
+
| `/ailk:upgrade-plan` | Explain the AI Launch Kit options side by side, recommend one option for this site, and link the public pricing page for prices. |
|
|
221
222
|
|
|
222
223
|
<!-- generated:end -->
|
|
223
224
|
|
|
@@ -225,7 +226,7 @@ The AI Launch Kit skills come from the `ailk` Claude Code plugin; `.claude/setti
|
|
|
225
226
|
|
|
226
227
|
This is your code — `{{PROJECT_NAME}}`, owned by {{COMPANY_NAME}} ({{COMPANY_DOMAIN}}). The root `package.json`'s `license` field ships set to `UNLICENSED` as a neutral placeholder; it's yours to change to whatever license suits your project (or to remove entirely if the repo is private).
|
|
227
228
|
|
|
228
|
-
The `LICENSE` files under `apps/*/`
|
|
229
|
+
The `LICENSE` files under `apps/*/` are the exception — they stay **Apache 2.0** because those directories are snapshots of `@working-theory/*` packages' own source, not code you authored.
|
|
229
230
|
|
|
230
231
|
The AI Launch Kit framework upstream is **Apache 2.0** — see <https://github.com/working-theory-labs/ai-launch-kit/blob/main/LICENSE>. Contributions are welcome at the upstream repo; start with the [contributing guide](https://github.com/working-theory-labs/ai-launch-kit/blob/main/CONTRIBUTING.md).
|
|
231
232
|
|
|
@@ -31,7 +31,7 @@ DATABASE_URL="postgresql://user:password@localhost:5432/customer_template"
|
|
|
31
31
|
# =============================================================================
|
|
32
32
|
# Stripe (Optional)
|
|
33
33
|
# =============================================================================
|
|
34
|
-
# Consumed by
|
|
34
|
+
# Consumed by packages/api/src/lib/stripe.ts via @working-theory/stripe-client wrapper.
|
|
35
35
|
# Use sandbox keys only — live-mode keys are rejected at runtime, unless
|
|
36
36
|
# STRIPE_MODE=live below admits a restricted live key (#8450).
|
|
37
37
|
STRIPE_SECRET_KEY=sk_test_xxx
|
|
@@ -115,7 +115,7 @@ STRIPE_WEBHOOK_SECRET=whsec_xxx
|
|
|
115
115
|
# ROTATION. Set STRIPE_CONNECTION_KEY_PREVIOUS to the old key and
|
|
116
116
|
# STRIPE_CONNECTION_KEY to a new one, redeploy, run
|
|
117
117
|
# `node dist/bin/stripe-connections-rekey.js` (dev:
|
|
118
|
-
# `pnpm --filter @working-theory/api stripe-connections:rekey`) with the
|
|
118
|
+
# `pnpm --filter @working-theory/app-api stripe-connections:rekey`) with the
|
|
119
119
|
# production environment (VERCEL_ENV=production, or NODE_ENV=production off
|
|
120
120
|
# Vercel) — anywhere else it prints `not_production` and touches nothing —
|
|
121
121
|
# and unset _PREVIOUS once it prints `remaining=0`. A row it counts `unreadable`
|
|
@@ -125,6 +125,13 @@ STRIPE_WEBHOOK_SECRET=whsec_xxx
|
|
|
125
125
|
# STRIPE_CONNECTION_KEY=
|
|
126
126
|
# STRIPE_CONNECTION_KEY_PREVIOUS=
|
|
127
127
|
#
|
|
128
|
+
# The Organization that owns STRIPE_SECRET_KEY (#9285). On a deployment with
|
|
129
|
+
# the multi-tenant module, only the Organization whose id is named here sees
|
|
130
|
+
# that key as its Stripe connection and sells its Offerings through it; unset,
|
|
131
|
+
# blank or naming no Organization, nobody owns it. Without the multi-tenant
|
|
132
|
+
# module the deployment's single Organization owns it and this is not read.
|
|
133
|
+
# STRIPE_ENV_ORGANIZATION_ID=
|
|
134
|
+
#
|
|
128
135
|
# The booking webhook receiver (#6085) — a SEPARATE credential from the
|
|
129
136
|
# three above: it verifies POST /v1/webhooks/calcom's x-cal-signature-256
|
|
130
137
|
# header, it does not call the provider. Unset makes the receiver answer 503
|