create-ailk 0.22.0 → 0.24.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 +27 -14
- package/component-catalog.json +149 -5
- package/component-catalog.md +7 -6
- package/dist/add-module.js +17 -10
- package/dist/add-route.d.ts +55 -1
- package/dist/add-route.js +301 -13
- package/dist/cli.js +27 -10
- package/dist/derive-architecture.d.ts +7 -5
- package/dist/derive-architecture.js +26 -32
- package/dist/lib/design-checks.js +4 -2
- package/dist/lib/env-catalog.js +0 -4
- package/dist/lib/npm-auth.d.ts +9 -0
- package/dist/lib/npm-auth.js +48 -0
- package/dist/lib/scaffold-render-sweep.d.ts +36 -2
- package/dist/lib/scaffold-render-sweep.js +50 -8
- package/dist/module-architecture.js +115 -10
- package/dist/paid-sections.d.ts +21 -2
- package/dist/paid-sections.js +69 -7
- package/dist/seed-flows.d.ts +4 -1
- package/dist/seed-flows.js +50 -4
- package/dist/spoke-checkout.d.ts +38 -35
- package/dist/spoke-checkout.js +66 -229
- package/dist/starter-grid.d.ts +0 -3
- package/dist/starter-grid.js +24 -14
- package/dist/surfaces.js +33 -12
- package/dist/sync-routes.d.ts +68 -5
- package/dist/sync-routes.js +455 -29
- package/dist/template-record.d.ts +1 -1
- package/dist/template-record.js +3 -2
- package/dist/update.js +10 -0
- package/package.json +3 -3
- package/site-templates/_base/content/en/NewsletterSignup/newsletter.mdx +4 -49
- package/site-templates/_base/content/en/Pricing/pricing.mdx +3 -21
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +23 -20
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +28 -14
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +15 -39
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +38 -34
- package/site-templates/marketing-site-free/content/en/NewsletterSignup/newsletter.mdx +6 -43
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +14 -31
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +26 -25
- package/site-templates/shapes/local-business-service/content/en/NewsletterSignup/newsletter.mdx +6 -43
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +14 -31
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +26 -25
- package/site-templates/shapes/organization-service/content/en/NewsletterSignup/newsletter.mdx +6 -43
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +14 -31
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +26 -25
- package/site-templates/shapes/person-service/content/en/NewsletterSignup/newsletter.mdx +6 -43
- package/templates/.env.example +13 -7
- package/templates/.github/workflows/ci.yml +13 -0
- package/templates/CLAUDE.md +4 -2
- package/templates/README.md +1 -0
- package/templates/_gitignore +4 -0
- package/templates/apps/api/.env.example +34 -0
- package/templates/apps/api/CLAUDE.md +94 -19
- package/templates/apps/api/package.json +1 -0
- package/templates/apps/api/src/__tests__/factories/in-memory-prisma.ts +2 -0
- package/templates/apps/api/src/bin/stripe-connections-rekey.ts +45 -0
- package/templates/apps/api/src/config/__tests__/stripe-connection-key.test.ts +185 -0
- package/templates/apps/api/src/config/index.ts +109 -0
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +7 -1
- package/templates/apps/api/src/lib/__tests__/flow-rename-race.db.test.ts +116 -0
- package/templates/apps/api/src/lib/__tests__/site.test.ts +16 -0
- package/templates/apps/api/src/lib/error-serializer.ts +74 -7
- package/templates/apps/api/src/lib/site.ts +4 -1
- package/templates/apps/api/src/lib/stripe.ts +77 -4
- package/templates/apps/api/src/lib/webhook-idempotency.ts +66 -2
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +218 -0
- package/templates/apps/api/src/middleware/__tests__/write-budget.test.ts +174 -0
- package/templates/apps/api/src/middleware/rate-limit.ts +226 -4
- package/templates/apps/api/src/openapi/__tests__/openapi.test.ts +127 -0
- package/templates/apps/api/src/openapi/spec.ts +343 -7
- package/templates/apps/api/src/routes/billing/plan-checkout.ts +332 -0
- package/templates/apps/api/src/routes/checkout/__tests__/live-key.test.ts +11 -0
- package/templates/apps/api/src/routes/checkout/__tests__/offerings-authorization.test.ts +1426 -0
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +11 -0
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +49 -0
- package/templates/apps/api/src/routes/checkout/session.ts +57 -25
- package/templates/apps/api/src/routes/checkout/sessions.ts +232 -82
- package/templates/apps/api/src/routes/consent/__tests__/account.test.ts +5 -5
- package/templates/apps/api/src/routes/consent/__tests__/sign-up-rate-limit.test.ts +160 -0
- package/templates/apps/api/src/routes/consent/account.ts +4 -2
- package/templates/apps/api/src/routes/content/__tests__/get-page.test.ts +2 -2
- package/templates/apps/api/src/routes/content/__tests__/offerings.test.ts +731 -0
- package/templates/apps/api/src/routes/content/__tests__/pricing.test.ts +753 -0
- package/templates/apps/api/src/routes/content/__tests__/shown-offerings.test.ts +762 -0
- package/templates/apps/api/src/routes/content/get-page.ts +34 -119
- package/templates/apps/api/src/routes/content/index.ts +16 -2
- package/templates/apps/api/src/routes/content/list-pages.ts +15 -36
- package/templates/apps/api/src/routes/content/offerings.ts +184 -0
- package/templates/apps/api/src/routes/content/pricing.ts +176 -0
- package/templates/apps/api/src/routes/content/search.ts +16 -45
- package/templates/apps/api/src/routes/content/shown-offerings.ts +229 -0
- package/templates/apps/api/src/routes/leads/index.ts +377 -308
- package/templates/apps/api/src/routes/project-listings/__tests__/me.test.ts +20 -9
- package/templates/apps/api/src/routes/project-listings/__tests__/public.test.ts +17 -6
- package/templates/apps/api/src/routes/project-listings/__tests__/site-answers.test.ts +1 -1
- package/templates/apps/api/src/routes/webhooks/README.md +66 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-offerings.test.ts +814 -0
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +80 -68
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-site-filter.test.ts +6 -5
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +8 -2
- package/templates/apps/api/src/routes/webhooks/index.ts +23 -0
- package/templates/apps/api/src/routes/webhooks/stripe-offerings.ts +384 -0
- package/templates/apps/api/src/routes/webhooks/stripe.ts +93 -17
- package/templates/apps/api/src/server.ts +165 -51
- package/templates/apps/api/src/services/__tests__/abandon-email.test.ts +121 -4
- package/templates/apps/api/src/services/__tests__/checkout-plan.test.ts +313 -0
- package/templates/apps/api/src/services/__tests__/deliverable-fulfillment.test.ts +61 -2
- package/templates/apps/api/src/services/__tests__/keyless-workspace-predicate.test.ts +234 -0
- package/templates/apps/api/src/services/__tests__/lead-routing.test.ts +374 -44
- package/templates/apps/api/src/services/__tests__/person.test.ts +260 -1
- package/templates/apps/api/src/services/__tests__/plan-offerings.test.ts +450 -0
- package/templates/apps/api/src/services/__tests__/project-listings.counts.test.ts +202 -0
- package/templates/apps/api/src/services/__tests__/project-listings.fence.test.ts +15 -18
- package/templates/apps/api/src/services/abandon-email.ts +28 -5
- package/templates/apps/api/src/services/deliverable-fulfillment.ts +15 -12
- package/templates/apps/api/src/services/entitlements.ts +157 -1
- package/templates/apps/api/src/services/lead-routing.ts +113 -58
- package/templates/apps/api/src/services/offerings/__tests__/catalog.test.ts +348 -0
- package/templates/apps/api/src/services/offerings/__tests__/checkout-session-record.test.ts +268 -0
- package/templates/apps/api/src/services/offerings/__tests__/connection.test.ts +975 -0
- package/templates/apps/api/src/services/offerings/__tests__/fixtures.ts +416 -0
- package/templates/apps/api/src/services/offerings/__tests__/org-products.test.ts +400 -0
- package/templates/apps/api/src/services/offerings/__tests__/readers.test.ts +685 -0
- package/templates/apps/api/src/services/offerings/__tests__/source.test.ts +231 -0
- package/templates/apps/api/src/services/offerings/catalog.ts +318 -0
- package/templates/apps/api/src/services/offerings/checkout-authorization.ts +403 -0
- package/templates/apps/api/src/services/offerings/checkout-session-record.ts +192 -0
- package/templates/apps/api/src/services/offerings/connection.ts +1083 -0
- package/templates/apps/api/src/services/offerings/index.ts +614 -0
- package/templates/apps/api/src/services/offerings/source.ts +140 -0
- package/templates/apps/api/src/services/offerings/store.ts +150 -0
- package/templates/apps/api/src/services/person.ts +147 -9
- package/templates/apps/api/src/services/plan-offerings.ts +96 -30
- package/templates/apps/api/src/services/project-listings.ts +43 -31
- package/templates/apps/api/src/services/public-site-resolver.ts +19 -14
- package/templates/apps/mcp/CLAUDE.md +32 -18
- package/templates/apps/mcp/__tests__/app-entry.test.ts +2 -2
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +9 -4
- package/templates/apps/mcp/__tests__/get_offerings.test.ts +358 -0
- package/templates/apps/mcp/__tests__/get_pricing.test.ts +364 -0
- package/templates/apps/mcp/__tests__/http-transport.test.ts +95 -14
- package/templates/apps/mcp/__tests__/lib/content-adapter-parity.test.ts +8 -3
- package/templates/apps/mcp/__tests__/lib/content-adapter.test.ts +0 -25
- package/templates/apps/mcp/__tests__/lib/fail-closed-tools.test.ts +22 -7
- package/templates/apps/mcp/__tests__/list_pages.test.ts +84 -44
- package/templates/apps/mcp/__tests__/locale.test.ts +41 -56
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +2 -2
- package/templates/apps/mcp/__tests__/rate-limit-write.test.ts +189 -0
- package/templates/apps/mcp/__tests__/read_content.test.ts +115 -78
- package/templates/apps/mcp/__tests__/request_callback.test.ts +63 -128
- package/templates/apps/mcp/__tests__/search_content.test.ts +76 -61
- package/templates/apps/mcp/__tests__/server.test.ts +13 -11
- package/templates/apps/mcp/__tests__/start_purchase.test.ts +208 -12
- package/templates/apps/mcp/__tests__/submit_lead.test.ts +82 -167
- package/templates/apps/mcp/__tests__/subscribe_newsletter.test.ts +59 -130
- package/templates/apps/mcp/__tests__/tools/purchase.test.ts +11 -11
- package/templates/apps/mcp/package.json +1 -0
- package/templates/apps/mcp/src/abuse/index.ts +18 -11
- package/templates/apps/mcp/src/http-transport.ts +47 -9
- package/templates/apps/mcp/src/lib/content-adapter.ts +0 -26
- package/templates/apps/mcp/src/lib/empty-content-adapter.ts +5 -4
- package/templates/apps/mcp/src/lib/shown-offerings.ts +105 -0
- package/templates/apps/mcp/src/lib/site-config.ts +53 -0
- package/templates/apps/mcp/src/server.ts +5 -0
- package/templates/apps/mcp/src/tools/capture_lead.ts +30 -28
- package/templates/apps/mcp/src/tools/get_offerings.ts +47 -30
- package/templates/apps/mcp/src/tools/get_pricing.ts +40 -40
- package/templates/apps/mcp/src/tools/index.ts +22 -21
- package/templates/apps/mcp/src/tools/list_pages.ts +27 -33
- package/templates/apps/mcp/src/tools/purchase.ts +30 -2
- package/templates/apps/mcp/src/tools/read_content.ts +46 -40
- package/templates/apps/mcp/src/tools/request_callback.ts +21 -28
- package/templates/apps/mcp/src/tools/search_content.ts +20 -24
- package/templates/apps/mcp/src/tools/subscribe_newsletter.ts +23 -26
- package/templates/apps/mcp/src/workspace-server.ts +15 -0
- package/templates/apps/web/.env.example +10 -31
- package/templates/apps/web/CLAUDE.md +324 -42
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/agreements-prompt.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/layout.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/(authed)/account/__tests__/privacy.test.tsx +3 -3
- package/templates/apps/web/app/[locale]/careers/[slug]/[action]/page.tsx +189 -0
- package/templates/apps/web/app/[locale]/careers/[slug]/apply.actions.ts +4 -2
- package/templates/apps/web/app/[locale]/careers/[slug]/job-application-form.ts +8 -3
- package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +22 -144
- package/templates/apps/web/app/[locale]/careers/__tests__/apply.actions.test.ts +9 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/careers-hub.test.tsx +172 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/careers-set.test.tsx +149 -0
- package/templates/apps/web/app/[locale]/careers/__tests__/job-application-form.test.ts +22 -24
- package/templates/apps/web/app/[locale]/careers/__tests__/job-apply-page.test.tsx +140 -66
- package/templates/apps/web/app/[locale]/careers/__tests__/page-renderer-migration.test.tsx +57 -22
- package/templates/apps/web/app/[locale]/careers/page.tsx +129 -5
- package/templates/apps/web/app/[locale]/contact/__tests__/ConversationalIntakeWrapper.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/contact/__tests__/contact-magnet-page.test.tsx +119 -11
- package/templates/apps/web/app/[locale]/contact/__tests__/contact.actions.test.ts +28 -5
- package/templates/apps/web/app/[locale]/contact/contact.actions.ts +20 -6
- package/templates/apps/web/app/[locale]/contact/intake-script.ts +1 -1
- package/templates/apps/web/app/[locale]/contact/page.tsx +99 -92
- package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +237 -5
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.count.test.tsx +43 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.deliverable.test.tsx +200 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.ending.test.tsx +197 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/magnet-page.test.tsx +430 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/two-route-tool.test.tsx +21 -9
- package/templates/apps/web/app/[locale]/flows/[slug]/magnet-page.tsx +369 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/page.tsx +12 -73
- package/templates/apps/web/app/[locale]/flows/[slug]/start/page.tsx +10 -31
- package/templates/apps/web/app/[locale]/layout.tsx +55 -4
- package/templates/apps/web/app/[locale]/newsletter/__tests__/page.test.tsx +174 -104
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +95 -58
- package/templates/apps/web/app/[locale]/pricing/__tests__/__snapshots__/unconnected.test.tsx.snap +7 -0
- package/templates/apps/web/app/[locale]/pricing/__tests__/offerings.test.tsx +599 -0
- package/templates/apps/web/app/[locale]/pricing/__tests__/page.test.tsx +216 -0
- package/templates/apps/web/app/[locale]/pricing/__tests__/unconnected.test.tsx +236 -0
- package/templates/apps/web/app/[locale]/pricing/page.tsx +367 -6
- package/templates/apps/web/app/[locale]/team/__tests__/team-routes.test.tsx +4 -1
- package/templates/apps/web/app/[locale]/unsubscribe/__tests__/unsubscribe-rsc-boundary.test.tsx +17 -0
- package/templates/apps/web/app/[locale]/unsubscribe/__tests__/unsubscribe.test.tsx +62 -3
- package/templates/apps/web/app/[locale]/unsubscribe/page.tsx +70 -18
- package/templates/apps/web/app/[locale]/unsubscribe/unsubscribe-button.tsx +30 -9
- package/templates/apps/web/app/api/offerings/checkout/[lookupKey]/route.ts +316 -0
- package/templates/apps/web/app/api/offerings/checkout/__tests__/route.test.ts +810 -0
- package/templates/apps/web/lib/__tests__/auth-routes.test.ts +27 -1
- package/templates/apps/web/lib/__tests__/deck-page.test.ts +2 -1
- package/templates/apps/web/lib/__tests__/in-page-magnet.test.ts +265 -0
- package/templates/apps/web/lib/__tests__/magnet-routes.test.ts +64 -0
- package/templates/apps/web/lib/__tests__/newsletter.actions.test.ts +293 -0
- package/templates/apps/web/lib/__tests__/offerings-pricing.test.ts +601 -0
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +67 -8
- package/templates/apps/web/lib/auth-routes.ts +36 -2
- package/templates/apps/web/lib/checkout-config.ts +9 -20
- package/templates/apps/web/lib/deck-page.ts +1 -0
- package/templates/apps/web/lib/deliverable-grant.ts +18 -0
- package/templates/apps/web/lib/in-page-magnet.ts +416 -0
- package/templates/apps/web/lib/magnet-routes.ts +44 -0
- package/templates/apps/web/lib/modules.generated.ts +9 -0
- package/templates/apps/web/lib/newsletter.actions.ts +205 -0
- package/templates/apps/web/lib/offerings-pricing.ts +326 -0
- package/templates/apps/web/lib/posting-title.ts +17 -0
- package/templates/apps/web/lib/sign-up-agreements.ts +4 -2
- package/templates/apps/web/messages/en.json +49 -15
- package/templates/apps/web/middleware.ts +12 -2
- package/templates/apps/web/security-headers.config.ts +17 -0
- package/templates/content/en/BlogList/blog.mdx +4 -71
- package/templates/content/en/BookCall/book-a-call.mdx +1 -41
- package/templates/content/en/BookCall/onsite-estimate.mdx +1 -17
- package/templates/content/en/BookCall/onsite-service.mdx +1 -17
- package/templates/content/en/BookCall/start-project.mdx +1 -17
- package/templates/content/en/ContactPage/contact.mdx +6 -63
- package/templates/content/en/HomePage/home.mdx +3 -21
- package/templates/database/CHANGELOG.md +51 -0
- package/templates/database/__tests__/in-page-magnets-migration.test.ts +161 -0
- package/templates/database/__tests__/offerings-checkout-session.db.test.ts +270 -0
- package/templates/database/__tests__/offerings-migration.test.ts +197 -0
- package/templates/database/__tests__/offerings-shown-price-ids-migration.test.ts +86 -0
- package/templates/database/__tests__/offerings.db.test.ts +303 -0
- package/templates/database/__tests__/seed.test.ts +63 -1
- package/templates/database/__tests__/trial-magnet-migration.test.ts +186 -0
- package/templates/database/auth/schema.prisma +4 -0
- package/templates/database/config/schema.prisma +91 -0
- package/templates/database/migrations/20261020120000_offerings_data_model/migration.sql +146 -0
- package/templates/database/migrations/20261021120000_offerings_checkout_session/migration.sql +77 -0
- package/templates/database/migrations/20261022120000_in_page_magnets/migration.sql +45 -0
- package/templates/database/migrations/20261023120000_offerings_shown_price_ids/migration.sql +47 -0
- package/templates/database/migrations/20261024120000_organization_plan_checkout_session/migration.sql +16 -0
- package/templates/database/migrations/20261025120000_trial_magnet/migration.sql +28 -0
- package/templates/database/migrations/20261026120000_trial_magnet_proof_line/migration.sql +23 -0
- package/templates/database/package.json +1 -1
- package/templates/database/seed.ts +57 -2
- package/templates/tools/lint-architecture.ts +205 -1
- package/versions.json +35 -35
- package/site-templates/marketing-site-free/content/en/Pricing/pricing.mdx +0 -199
- package/templates/apps/api/src/routes/content/slug.ts +0 -9
- package/templates/apps/web/app/[locale]/downloads/__tests__/page-renderer-migration.test.tsx +0 -93
- package/templates/apps/web/app/[locale]/downloads/page.tsx +0 -37
- package/templates/apps/web/app/[locale]/newsletter/__tests__/newsletter.actions.test.ts +0 -139
- package/templates/apps/web/app/[locale]/newsletter/newsletter.actions.ts +0 -93
- package/templates/apps/web/app/api/checkout/[offering]/route.ts +0 -48
- package/templates/apps/web/app/api/checkout/__tests__/route.test.ts +0 -120
- package/templates/apps/web/app/api/checkout/__tests__/success-path.test.ts +0 -86
- package/templates/apps/web/app/api/webhooks/stripe/__tests__/route.test.ts +0 -92
- package/templates/apps/web/app/api/webhooks/stripe/route.ts +0 -31
- package/templates/apps/web/lib/__tests__/checkout.test.ts +0 -243
- package/templates/apps/web/lib/__tests__/meeting-slugs.test.ts +0 -120
- package/templates/apps/web/lib/checkout.ts +0 -93
- package/templates/apps/web/lib/meeting-slugs.ts +0 -63
|
@@ -133,10 +133,9 @@ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `per
|
|
|
133
133
|
|
|
134
134
|
<!-- generated:begin page=/contact -->
|
|
135
135
|
|
|
136
|
-
| # | Section
|
|
137
|
-
| --- |
|
|
138
|
-
| 1 | `
|
|
139
|
-
| 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
|
|
136
|
+
| # | Section | Component | Copy (first line) |
|
|
137
|
+
| --- | ----------------------------------- | ------------- | ----------------- |
|
|
138
|
+
| 1 | `contact-form` (column · fields ×0) | `ContactForm` | |
|
|
140
139
|
|
|
141
140
|
<!-- generated:end -->
|
|
142
141
|
|
|
@@ -165,13 +164,17 @@ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `per
|
|
|
165
164
|
|
|
166
165
|
<!-- generated:begin page=/newsletter -->
|
|
167
166
|
|
|
168
|
-
| # | Section
|
|
169
|
-
| --- |
|
|
170
|
-
| 1 | `
|
|
171
|
-
| 2 | `faq` (expanded · items ×3) | `FAQ` | FAQs |
|
|
167
|
+
| # | Section | Component | Copy (first line) |
|
|
168
|
+
| --- | ----------------------------------- | ------------- | ----------------- |
|
|
169
|
+
| 1 | `contact-form` (column · fields ×0) | `ContactForm` | |
|
|
172
170
|
|
|
173
171
|
<!-- generated:end -->
|
|
174
172
|
|
|
173
|
+
<!-- generated:begin page=/unsubscribe -->
|
|
174
|
+
|
|
175
|
+
_Code route — no content, no sections._
|
|
176
|
+
<!-- generated:end -->
|
|
177
|
+
|
|
175
178
|
<!-- generated:begin page=/meet -->
|
|
176
179
|
|
|
177
180
|
| # | Section | Component | Copy (first line) |
|
|
@@ -183,12 +186,10 @@ _Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `per
|
|
|
183
186
|
|
|
184
187
|
<!-- generated:begin page=/meet/[slug] -->
|
|
185
188
|
|
|
186
|
-
| # | Section | Component | Copy (first line)
|
|
187
|
-
| --- | -------------------------------------- | -------------- |
|
|
188
|
-
| 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call
|
|
189
|
-
| 2 | `
|
|
190
|
-
| 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
|
|
191
|
-
| 4 | `content-block` (1 CTA) | `ContentBlock` | |
|
|
189
|
+
| # | Section | Component | Copy (first line) |
|
|
190
|
+
| --- | -------------------------------------- | -------------- | ----------------- |
|
|
191
|
+
| 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
|
|
192
|
+
| 2 | `content-block` (1 CTA) | `ContentBlock` | |
|
|
192
193
|
|
|
193
194
|
<!-- generated:end -->
|
|
194
195
|
|
|
@@ -244,12 +245,11 @@ _Code route — no content, no sections._
|
|
|
244
245
|
|
|
245
246
|
<!-- generated:begin page=/blog -->
|
|
246
247
|
|
|
247
|
-
| # | Section
|
|
248
|
-
| --- |
|
|
249
|
-
| 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog"
|
|
250
|
-
| 2 | `
|
|
251
|
-
| 3 | `
|
|
252
|
-
| 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
|
|
248
|
+
| # | Section | Component | Copy (first line) |
|
|
249
|
+
| --- | --------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
|
|
250
|
+
| 1 | `hero` (centered · gapBelow=tight · eyebrow "Blog") | `Hero` | {Blog} |
|
|
251
|
+
| 2 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
252
|
+
| 3 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
|
|
253
253
|
|
|
254
254
|
<!-- generated:end -->
|
|
255
255
|
|
|
@@ -324,6 +324,7 @@ person-service:
|
|
|
324
324
|
- { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
|
|
325
325
|
- { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
|
|
326
326
|
- { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
|
|
327
|
+
- { route: "/unsubscribe", kind: route }
|
|
327
328
|
- { route: "/sign-in", kind: route }
|
|
328
329
|
- { route: "/sign-up", kind: route }
|
|
329
330
|
- { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
|
|
@@ -354,10 +355,10 @@ Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` co
|
|
|
354
355
|
|
|
355
356
|
<!-- generated:begin inventory -->
|
|
356
357
|
|
|
357
|
-
| Tier | Used by this template
|
|
358
|
-
| -------- |
|
|
359
|
-
| Shell | `MarketingShell`
|
|
360
|
-
| Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`)
|
|
361
|
-
| Sections | `
|
|
358
|
+
| Tier | Used by this template |
|
|
359
|
+
| -------- | ----------------------------------------------------------------------------------------------------------------------------- |
|
|
360
|
+
| Shell | `MarketingShell` |
|
|
361
|
+
| Chrome | `Nav`, `Footer`, `Banner` (+ `BannerConsentIsland`, `BannerDismissIsland`) |
|
|
362
|
+
| Sections | `ContactForm`, `ContentBlock`, `CTA`, `DocumentChassis`, `FAQ`, `GlossaryIndex`, `Hero`, `Items`, `LogoCloud`, `Testimonials` |
|
|
362
363
|
|
|
363
364
|
<!-- generated:end -->
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
---
|
|
2
2
|
type: "NewsletterSignup"
|
|
3
3
|
slug: "newsletter"
|
|
4
|
-
title: "
|
|
5
|
-
description: "{
|
|
4
|
+
title: "Get the newsletter"
|
|
5
|
+
description: "{One sentence on what this newsletter covers and who it is for}"
|
|
6
6
|
schema:
|
|
7
7
|
mainEntity:
|
|
8
8
|
"@type": "Offer"
|
|
@@ -12,48 +12,11 @@ schema:
|
|
|
12
12
|
sections:
|
|
13
13
|
[
|
|
14
14
|
{
|
|
15
|
-
"id": "
|
|
16
|
-
"type": "
|
|
17
|
-
"data":
|
|
18
|
-
{
|
|
19
|
-
"eyebrow": "Newsletter",
|
|
20
|
-
"headline": "{Start a free newsletter with Substack}",
|
|
21
|
-
"subheadline": "{Or upgrade to Pro to capture every subscriber and build your own marketing database.}",
|
|
22
|
-
"primaryCta":
|
|
23
|
-
{ "label": "{Connect Substack}", "href": "https://substack.com" },
|
|
24
|
-
"secondaryCta":
|
|
25
|
-
{
|
|
26
|
-
"label": "{Upgrade to Pro}",
|
|
27
|
-
"href": "https://ailaunchkit.ai/pricing",
|
|
28
|
-
"variant": "outline",
|
|
29
|
-
},
|
|
30
|
-
},
|
|
31
|
-
},
|
|
32
|
-
{
|
|
33
|
-
"id": "faq",
|
|
34
|
-
"type": "faq",
|
|
35
|
-
"data":
|
|
36
|
-
{
|
|
37
|
-
"headline": "FAQs",
|
|
38
|
-
"presentation": "expanded",
|
|
39
|
-
"items":
|
|
40
|
-
[
|
|
41
|
-
{
|
|
42
|
-
"question": "{How often will I hear from you?}",
|
|
43
|
-
"answer": "{Answer in one or two plain sentences}",
|
|
44
|
-
},
|
|
45
|
-
{
|
|
46
|
-
"question": "{What will I get?}",
|
|
47
|
-
"answer": "{Answer in one or two plain sentences}",
|
|
48
|
-
},
|
|
49
|
-
{
|
|
50
|
-
"question": "{Can I unsubscribe?}",
|
|
51
|
-
"answer": "{Answer in one or two plain sentences}",
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
},
|
|
15
|
+
"id": "signup",
|
|
16
|
+
"type": "contact-form",
|
|
17
|
+
"data": { "variant": "column", "fields": [] },
|
|
55
18
|
},
|
|
56
19
|
]
|
|
57
20
|
---
|
|
58
21
|
|
|
59
|
-
{/* Rendered from frontmatter `sections[]` by the /newsletter route. The
|
|
22
|
+
{/* Rendered from frontmatter `sections[]` by the /newsletter route. The page's one signup surface is the workspace's Newsletter magnet: its heading, sentence, field, consent, button and ending all come from the magnet, mounted by the route in this section's slot. To change the signup, change the magnet in Admin → Magnets. The `schema:` Offer is the page's JSON-LD main entity — a free subscription. Replace every {brace} with your own words before you launch. */}
|
package/templates/.env.example
CHANGED
|
@@ -437,19 +437,25 @@ CONTENT_ADAPTER=mdx
|
|
|
437
437
|
# random bytes, `openssl rand -base64 32`. Unset = connections cannot be
|
|
438
438
|
# written; any other shape stops the API. Losing it unreads every connection.
|
|
439
439
|
# SCHEDULING_CREDENTIAL_KEY=
|
|
440
|
+
# The key each Organization's Stripe connection is encrypted under (#8907),
|
|
441
|
+
# and the key it replaced during a rotation: 32 random bytes each, `openssl
|
|
442
|
+
# rand -base64 32`, distinct from each other and from SCHEDULING_CREDENTIAL_KEY.
|
|
443
|
+
# Unset = a connection can be read and removed but not written; any other
|
|
444
|
+
# shape stops the API. ONE KEY PER DATABASE: a database holding live
|
|
445
|
+
# connections gets its key on production only — never on a preview sharing
|
|
446
|
+
# that database. Rotation and the rekey bin: apps/api/.env.example.
|
|
447
|
+
# STRIPE_CONNECTION_KEY=
|
|
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=
|
|
440
453
|
# HMAC-SHA256 key POST /v1/webhooks/calcom verifies the x-cal-signature-256
|
|
441
454
|
# header against (#6085). Unset makes the receiver answer 503 and accept
|
|
442
455
|
# nothing — the same fail-closed posture an unset STRIPE_WEBHOOK_SECRET has.
|
|
443
456
|
# CAL_WEBHOOK_SECRET=
|
|
444
457
|
# SCHEDULING_PUBLIC_BASE_URL=https://cal.com
|
|
445
458
|
# SCHEDULING_PROVIDER=cal
|
|
446
|
-
#
|
|
447
|
-
# Which event the /meet page books, as "<owner>/<event-slug>" (the path of
|
|
448
|
-
# the provider's own public booking page). Read server-side by apps/web; unset
|
|
449
|
-
# means the /meet route 404s, exactly as if the scheduling module were not
|
|
450
|
-
# installed. Deliberately NOT a NEXT_PUBLIC_ variable — the whole scheduling
|
|
451
|
-
# config surface is server-read.
|
|
452
|
-
# SCHEDULING_CAL_LINK=owner/event-slug
|
|
453
459
|
|
|
454
460
|
# ── Recommender mode — the purchase hand-off (REL-013, #4762 / #4879) ────────
|
|
455
461
|
# A `recommending` flow's email + checkout moment spans two deployments:
|
|
@@ -26,6 +26,19 @@ jobs:
|
|
|
26
26
|
cache: pnpm
|
|
27
27
|
cache-dependency-path: pnpm-lock.yaml
|
|
28
28
|
|
|
29
|
+
# The private @working-theory/* scope needs NPM_TOKEN (#9092) — add it
|
|
30
|
+
# as a repository secret. It goes into the runner's user-level npmrc,
|
|
31
|
+
# never a committed project .npmrc (pnpm >= 11 ignores credentials
|
|
32
|
+
# there), and stays there for the rest of the job — fine on a hosted
|
|
33
|
+
# runner, which is discarded after it. With no secret the step is a
|
|
34
|
+
# no-op; public packages still install.
|
|
35
|
+
- env:
|
|
36
|
+
NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
|
|
37
|
+
run: |
|
|
38
|
+
if [ -n "$NPM_TOKEN" ]; then
|
|
39
|
+
pnpm config set "//registry.npmjs.org/:_authToken" "$NPM_TOKEN"
|
|
40
|
+
fi
|
|
41
|
+
|
|
29
42
|
# Not --frozen-lockfile: the scaffold ships no pnpm-lock.yaml (it is
|
|
30
43
|
# generated fresh by the customer's own first `pnpm install`, and the
|
|
31
44
|
# placeholder step above is a cache-key stand-in, not a real lockfile),
|
package/templates/CLAUDE.md
CHANGED
|
@@ -25,8 +25,10 @@ content/ Site settings (_site.mdx) and MDX pages (en/<TypeName>/)
|
|
|
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.
|
|
30
32
|
<!-- /ailk:template id="repo-shape" -->
|
|
31
33
|
|
|
32
34
|
<!-- ailk:template id="architecture" -->
|
package/templates/README.md
CHANGED
|
@@ -56,6 +56,7 @@ The pages of the Free `organization-product` shape, and where each one's copy li
|
|
|
56
56
|
| `/contact` | `content/en/ContactPage/contact.mdx` | every scaffold |
|
|
57
57
|
| `/glossary` | `content/en/GlossaryList/glossary.mdx` | `--shape organization-product` |
|
|
58
58
|
| `/newsletter` | `content/en/NewsletterSignup/newsletter.mdx` | `--shape organization-product` |
|
|
59
|
+
| `/unsubscribe` | — (a code route) | every scaffold |
|
|
59
60
|
| `/sign-in` | — (a code route) | every scaffold |
|
|
60
61
|
| `/sign-up` | — (a code route) | every scaffold |
|
|
61
62
|
| `/privacy` | `content/en/PrivacyPage/privacy.mdx` | `--shape organization-product` |
|
package/templates/_gitignore
CHANGED
|
@@ -158,5 +158,9 @@ __pycache__/
|
|
|
158
158
|
tests/e2e/.stack/
|
|
159
159
|
tests/e2e/.results/
|
|
160
160
|
|
|
161
|
+
# session scratch swept into the 0.43.0 release commit by git add -A; never tracked
|
|
162
|
+
undefined/
|
|
163
|
+
.impeccable/
|
|
164
|
+
|
|
161
165
|
# create-ailk licence key file (`--license`, `ailk license set`) — owner-only, never committed
|
|
162
166
|
ailk.key
|
|
@@ -98,6 +98,40 @@ STRIPE_WEBHOOK_SECRET=whsec_xxx
|
|
|
98
98
|
# unreadable: each workspace must then reconnect. Never log or share it.
|
|
99
99
|
# SCHEDULING_CREDENTIAL_KEY=
|
|
100
100
|
#
|
|
101
|
+
# An Organization's Stripe connection (#8907) — the AES-256-GCM key each
|
|
102
|
+
# Organization's restricted Stripe key and webhook signing secret are
|
|
103
|
+
# encrypted under. The same shape rule: exactly 32 random bytes in canonical
|
|
104
|
+
# standard base64 (`openssl rand -base64 32`), and never the same bytes as
|
|
105
|
+
# SCHEDULING_CREDENTIAL_KEY. Any other value stops the API at startup. Unset
|
|
106
|
+
# means a connection can be read, reset and removed, but connect, go-live and
|
|
107
|
+
# the webhook secret answer 503 credential_key_not_configured.
|
|
108
|
+
#
|
|
109
|
+
# ONE KEY PER DATABASE. A deployment whose database holds live connections
|
|
110
|
+
# sets this key on production only; a preview or development deployment that
|
|
111
|
+
# shares that database must never be given it. A preview with its own
|
|
112
|
+
# database takes its own key. (A build that is not production also refuses to
|
|
113
|
+
# read or change a live connection.)
|
|
114
|
+
#
|
|
115
|
+
# ROTATION. Set STRIPE_CONNECTION_KEY_PREVIOUS to the old key and
|
|
116
|
+
# STRIPE_CONNECTION_KEY to a new one, redeploy, run
|
|
117
|
+
# `node dist/bin/stripe-connections-rekey.js` (dev:
|
|
118
|
+
# `pnpm --filter @working-theory/api stripe-connections:rekey`) with the
|
|
119
|
+
# production environment (VERCEL_ENV=production, or NODE_ENV=production off
|
|
120
|
+
# Vercel) — anywhere else it prints `not_production` and touches nothing —
|
|
121
|
+
# and unset _PREVIOUS once it prints `remaining=0`. A row it counts `unreadable`
|
|
122
|
+
# decrypts under neither key and stays so after _PREVIOUS is unset: its owner
|
|
123
|
+
# reconnects or disconnects. _PREVIOUS without a current key, or equal to it,
|
|
124
|
+
# stops the API.
|
|
125
|
+
# STRIPE_CONNECTION_KEY=
|
|
126
|
+
# STRIPE_CONNECTION_KEY_PREVIOUS=
|
|
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
|
+
#
|
|
101
135
|
# The booking webhook receiver (#6085) — a SEPARATE credential from the
|
|
102
136
|
# three above: it verifies POST /v1/webhooks/calcom's x-cal-signature-256
|
|
103
137
|
# header, it does not call the provider. Unset makes the receiver answer 503
|