create-ailk 0.8.0 → 0.10.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 +71 -3
- package/component-catalog.json +279 -45
- package/dist/add-module.d.ts +20 -0
- package/dist/add-module.js +43 -7
- package/dist/add-route.d.ts +56 -0
- package/dist/add-route.js +286 -0
- package/dist/apply-design-md.d.ts +7 -0
- package/dist/apply-design-md.js +50 -0
- package/dist/apply-design.d.ts +64 -0
- package/dist/apply-design.js +273 -0
- package/dist/claude-md.d.ts +111 -0
- package/dist/claude-md.js +334 -0
- package/dist/cli.js +104 -5
- package/dist/derive-architecture.js +41 -36
- package/dist/design-compile.d.ts +71 -0
- package/dist/design-compile.js +98 -0
- package/dist/design-package.d.ts +83 -0
- package/dist/design-package.js +468 -0
- package/dist/design-presets.d.ts +86 -0
- package/dist/design-presets.js +642 -0
- package/dist/design-scaffold.d.ts +76 -0
- package/dist/design-scaffold.js +220 -0
- package/dist/index.d.ts +2 -1
- package/dist/index.js +4 -1
- package/dist/legacy-nav-renderers.d.ts +45 -0
- package/dist/legacy-nav-renderers.js +545 -0
- package/dist/lib/auth-secret-file.d.ts +19 -0
- package/dist/lib/auth-secret-file.js +112 -0
- package/dist/lib/design-checks.d.ts +78 -0
- package/dist/lib/design-checks.js +174 -0
- package/dist/lib/license-key-files.d.ts +9 -0
- package/dist/lib/license-key-files.js +2 -2
- package/dist/lib/module-license-gate.d.ts +48 -32
- package/dist/lib/module-license-gate.js +117 -8
- package/dist/lib/render-verdict.d.ts +52 -0
- package/dist/lib/render-verdict.js +77 -0
- package/dist/lib/scaffold-render-sweep.d.ts +105 -0
- package/dist/lib/scaffold-render-sweep.js +236 -0
- package/dist/module-architecture.d.ts +19 -16
- package/dist/module-architecture.js +67 -23
- package/dist/parse-args.d.ts +12 -2
- package/dist/parse-args.js +74 -13
- package/dist/programmatic.d.ts +30 -6
- package/dist/programmatic.js +216 -19
- package/dist/site-chrome.d.ts +19 -9
- package/dist/site-chrome.js +23 -13
- package/dist/site-manifest.d.ts +25 -0
- package/dist/site-manifest.js +254 -0
- package/dist/site-roster.d.ts +41 -0
- package/dist/site-roster.js +141 -8
- package/dist/starter-grid.d.ts +16 -63
- package/dist/starter-grid.js +102 -84
- package/dist/surfaces.d.ts +41 -9
- package/dist/surfaces.js +200 -83
- package/dist/template-manifest.d.ts +30 -13
- package/dist/template-manifest.js +53 -28
- package/package.json +6 -3
- package/release-scope.json +25 -0
- package/site-templates/_base/content/en/UseCase/persona-1.mdx +7 -6
- package/site-templates/_base/content/en/UseCase/persona-2.mdx +7 -6
- package/site-templates/_base/content/en/UseCase/persona-3.mdx +7 -6
- package/site-templates/designs/minimalism/DESIGN.md +98 -6
- package/site-templates/designs/minimalism/sample/README.md +48 -0
- package/site-templates/{minimalism-site → designs/minimalism/sample}/content/en/HomePage/home.mdx +1 -1
- package/site-templates/designs/standard/DESIGN.md +98 -6
- package/site-templates/marketing-site/DESIGN.md +98 -6
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +60 -27
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +50 -30
- package/site-templates/marketing-site-free/DESIGN.md +98 -6
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +60 -24
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +44 -27
- package/site-templates/marketing-site-free/ailk-template.json +1 -1
- package/site-templates/saas-product/DESIGN.md +98 -6
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/local-business-service/TEMPLATE-MANIFEST.md +74 -20
- package/site-templates/shapes/local-business-service/ailk-template.json +1 -1
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/organization-service/TEMPLATE-MANIFEST.md +74 -20
- package/site-templates/shapes/organization-service/ailk-template.json +1 -1
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.json +127 -18
- package/site-templates/shapes/person-service/TEMPLATE-MANIFEST.md +75 -21
- package/site-templates/shapes/person-service/ailk-template.json +1 -1
- package/site-templates/shapes/person-service/content/en/AboutPage/about.mdx +1 -1
- package/site-templates/shapes/person-service/content/en/HomePage/home.mdx +2 -2
- package/site-templates/shapes/person-service/content/en/PortfolioList/portfolio.mdx +4 -2
- package/site-templates/shapes/person-service/content/en/ServicesList/services.mdx +1 -1
- package/templates/.claude/agents/web.md +10 -8
- package/templates/.claude/rules/architecture.md +17 -7
- package/templates/.claude/skills/README.md +3 -2
- package/templates/.claude/skills/add-auth/SKILL.md +142 -90
- package/templates/.claude/skills/add-auth/references/env-vars.md +32 -17
- package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +17 -8
- package/templates/.claude/skills/add-page/SKILL.md +241 -238
- package/templates/.claude/skills/add-page/references/page-types.md +94 -86
- package/templates/.claude/skills/add-page/scripts/site-pages.mjs +87 -0
- package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +99 -0
- package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +8 -18
- package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +43 -0
- package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +52 -0
- package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +38 -0
- package/templates/.claude/skills/check-site/SKILL.md +51 -18
- package/templates/.claude/skills/check-site/references/common-errors.md +12 -9
- package/templates/.claude/skills/check-site/references/findings-glossary.md +4 -4
- package/templates/.claude/skills/check-site/references/severity-levels.md +3 -3
- package/templates/.claude/skills/fill-page/SKILL.md +26 -7
- package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +1 -1
- package/templates/.claude/skills/setup-deploy/SKILL.md +75 -38
- package/templates/.claude/skills/update-page/SKILL.md +117 -0
- package/templates/.claude/skills/update-page/scripts/update-page.ts +640 -0
- package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +31 -0
- package/templates/.claude/skills/upgrade-plan/SKILL.md +12 -8
- package/templates/.env.example +23 -2
- package/templates/.github/workflows/ci.yml +4 -0
- package/templates/.prettierignore +1 -0
- package/templates/CLAUDE.md +146 -103
- package/templates/DESIGN.md +98 -6
- package/templates/README.md +50 -38
- package/templates/apps/api/.env.example +2 -1
- package/templates/apps/api/src/__tests__/commerce-claim-registration.test.ts +2 -0
- package/templates/apps/api/src/__tests__/server.test.ts +116 -0
- package/templates/apps/api/src/lib/stripe.ts +9 -0
- package/templates/apps/api/src/middleware/__tests__/auth.optional-cookie.test.ts +140 -0
- package/templates/apps/api/src/middleware/auth.ts +54 -0
- package/templates/apps/api/src/routes/checkout/__tests__/session.test.ts +5 -2
- package/templates/apps/api/src/routes/checkout/__tests__/sessions.test.ts +628 -0
- package/templates/apps/api/src/routes/checkout/sessions.ts +222 -24
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-flow-checkout.test.ts +1 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe-org-billing.test.ts +5 -1
- package/templates/apps/api/src/routes/webhooks/__tests__/stripe.test.ts +521 -20
- package/templates/apps/api/src/routes/webhooks/stripe.ts +124 -32
- package/templates/apps/api/src/server.ts +28 -0
- package/templates/apps/api/src/services/__tests__/revalidation.test.ts +90 -15
- package/templates/apps/api/src/services/checkout-buyer.ts +72 -0
- package/templates/apps/api/src/services/revalidation.ts +60 -15
- package/templates/apps/mcp/__tests__/tools/create_project.test.ts +30 -24
- package/templates/apps/mcp/src/tools/purchase.ts +4 -2
- package/templates/apps/web/.env.example +13 -0
- package/templates/apps/web/CLAUDE.md +22 -28
- package/templates/apps/web/app/[locale]/(auth)/layout.tsx +1 -1
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +24 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +17 -6
- package/templates/apps/web/app/[locale]/[slug]/[detail]/__tests__/page.test.tsx +110 -0
- package/templates/apps/web/app/[locale]/[slug]/[detail]/page.tsx +60 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/alternatives/__tests__/page.test.tsx +161 -0
- package/templates/apps/web/app/[locale]/alternatives/page.tsx +104 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/[slug]/page.tsx +4 -3
- package/templates/apps/web/app/[locale]/for/__tests__/page-renderer-migration.test.tsx +73 -0
- package/templates/apps/web/app/[locale]/{use-cases → for}/page.tsx +8 -7
- package/templates/apps/web/app/[locale]/glossary/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +35 -19
- package/templates/apps/web/app/[locale]/newsletter/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/portfolio/page.tsx +1 -1
- package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +112 -0
- package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +70 -0
- package/templates/apps/web/app/api/revalidate/__tests__/route.test.ts +236 -44
- package/templates/apps/web/app/api/revalidate/route.ts +78 -36
- package/templates/apps/web/lib/__tests__/site-brand.test.ts +79 -0
- package/templates/apps/web/lib/__tests__/site-theme.test.ts +104 -11
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +21 -4
- package/templates/apps/web/lib/locale-guard.ts +18 -0
- package/templates/apps/web/lib/meet-placeholder.ts +5 -0
- package/templates/apps/web/lib/nav-config.ts +14 -13
- package/templates/apps/web/lib/site-brand.tsx +13 -9
- package/templates/apps/web/lib/site-logo.tsx +36 -0
- package/templates/apps/web/lib/site-theme.ts +46 -26
- package/templates/apps/web/messages/en.json +23 -9
- package/templates/apps/web/middleware.ts +28 -4
- package/templates/content/en/BookCall/book-a-call.mdx +80 -0
- package/templates/content/en/BookCall/onsite-estimate.mdx +56 -0
- package/templates/content/en/BookCall/onsite-service.mdx +56 -0
- package/templates/content/en/BookCall/start-project.mdx +56 -0
- package/templates/content/en/ContactPage/contact.mdx +40 -1
- package/templates/content/en/HomePage/home.mdx +2 -6
- package/templates/content/en/LandingPage/meet.mdx +59 -0
- package/templates/content/en/UseCasesList/{use-cases.mdx → for.mdx} +19 -18
- package/templates/database/CHANGELOG.md +7 -0
- package/templates/database/package.json +1 -1
- package/templates/package.json +4 -1
- package/templates/tools/check-claude-md.ts +128 -0
- package/versions.json +33 -33
- package/dist/modules/commerce/0.6.0.tar.gz +0 -0
- package/dist/modules/commerce/0.6.1.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.0.tar.gz +0 -0
- package/dist/modules/docs-blog/0.6.1.tar.gz +0 -0
- package/dist/modules/marketing-site/0.6.1.tar.gz +0 -0
- package/dist/modules/minimalism-site/0.6.1.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.0.tar.gz +0 -0
- package/dist/modules/multi-tenant/0.6.1.tar.gz +0 -0
- package/dist/modules/saas-product/0.6.1.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.0.tar.gz +0 -0
- package/dist/modules/scheduling/0.6.1.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.0.tar.gz +0 -0
- package/dist/modules/signal-collectors/0.6.1.tar.gz +0 -0
- package/dist/modules/simple-service/0.6.1.tar.gz +0 -0
- package/dist/modules/workspace/0.6.0.tar.gz +0 -0
- package/dist/modules/workspace/0.6.1.tar.gz +0 -0
- package/site-templates/_base/content/en/BookCall/book-call.mdx +0 -52
- package/site-templates/minimalism-site/DESIGN.md +0 -162
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +0 -506
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +0 -458
- package/site-templates/minimalism-site/ailk-template.json +0 -23
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +0 -110
- package/site-templates/minimalism-site/content/en/BookCall/book-call.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +0 -34
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +0 -57
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +0 -77
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +0 -73
- package/site-templates/minimalism-site/content/en/PurchasePolicyPage/purchase-policy.mdx +0 -123
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +0 -52
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +0 -52
- package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +0 -38
- package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +0 -73
- package/site-templates/minimalism-site/flows/referral.flow.json +0 -71
- package/site-templates/minimalism-site/provenance.json +0 -4
- package/templates/.claude/skills/add-page/templates/route.tsx.tmpl +0 -28
- package/templates/.claude/skills/setup-deploy/references/env-vars-template.md +0 -175
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-31.552Z-fallback-1789916251590-037e9005.json +0 -8
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.840Z-fallback-1789916253842-b52659e9.json +0 -12
- package/templates/apps/api/.ailk/inbox/2026-09-20T14-57-33.844Z-fallback-1789916253845-6b266f8c.json +0 -12
- package/templates/apps/web/app/[locale]/book-a-call/page.tsx +0 -50
- package/templates/apps/web/app/[locale]/use-cases/__tests__/page-renderer-migration.test.tsx +0 -72
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-4.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-5.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/avatar-placeholder-6.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/hero-backdrop.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-1.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-2.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/logo-placeholder-3.svg +0 -0
- /package/site-templates/{minimalism-site/assets → designs/minimalism/sample/public}/wordmark-placeholder.svg +0 -0
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"categories": ["consulting"],
|
|
5
5
|
"shape": "person-service",
|
|
6
6
|
"design": "standard",
|
|
7
|
-
"generatedHash": "
|
|
7
|
+
"generatedHash": "a763acef14c0c36649ad99dd4a4fea566ebdf64257bddb2f553ab8823349c309",
|
|
8
8
|
"layout": {
|
|
9
9
|
"nav": "full",
|
|
10
10
|
"footer": "columns",
|
|
@@ -111,6 +111,61 @@
|
|
|
111
111
|
"chrome": "on",
|
|
112
112
|
"sections": []
|
|
113
113
|
},
|
|
114
|
+
{
|
|
115
|
+
"route": "/for",
|
|
116
|
+
"kind": "page",
|
|
117
|
+
"pageType": "UseCasesList",
|
|
118
|
+
"schema": "UseCasesList",
|
|
119
|
+
"shell": "MarketingShell",
|
|
120
|
+
"chrome": "on",
|
|
121
|
+
"sections": [
|
|
122
|
+
{
|
|
123
|
+
"type": "hero",
|
|
124
|
+
"component": "Hero"
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"type": "items",
|
|
128
|
+
"component": "Items",
|
|
129
|
+
"options": {
|
|
130
|
+
"columns": 3
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
"type": "logoCloud",
|
|
135
|
+
"component": "LogoCloud",
|
|
136
|
+
"options": {
|
|
137
|
+
"layout": "inline"
|
|
138
|
+
}
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"type": "testimonials",
|
|
142
|
+
"component": "Testimonials"
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
"type": "cta",
|
|
146
|
+
"component": "CTA"
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
"type": "faq",
|
|
150
|
+
"component": "FAQ"
|
|
151
|
+
}
|
|
152
|
+
]
|
|
153
|
+
},
|
|
154
|
+
{
|
|
155
|
+
"route": "/for/[slug]",
|
|
156
|
+
"kind": "page",
|
|
157
|
+
"contentDir": "content/en/UseCase",
|
|
158
|
+
"seeds": [
|
|
159
|
+
"content/en/UseCase/persona-1.mdx",
|
|
160
|
+
"content/en/UseCase/persona-2.mdx",
|
|
161
|
+
"content/en/UseCase/persona-3.mdx"
|
|
162
|
+
],
|
|
163
|
+
"pageType": "UseCase",
|
|
164
|
+
"schema": "UseCase",
|
|
165
|
+
"shell": "MarketingShell",
|
|
166
|
+
"chrome": "on",
|
|
167
|
+
"sections": []
|
|
168
|
+
},
|
|
114
169
|
{
|
|
115
170
|
"route": "/about",
|
|
116
171
|
"kind": "page",
|
|
@@ -143,6 +198,13 @@
|
|
|
143
198
|
{
|
|
144
199
|
"type": "hero",
|
|
145
200
|
"component": "Hero"
|
|
201
|
+
},
|
|
202
|
+
{
|
|
203
|
+
"type": "items",
|
|
204
|
+
"component": "Items",
|
|
205
|
+
"options": {
|
|
206
|
+
"columns": 2
|
|
207
|
+
}
|
|
146
208
|
}
|
|
147
209
|
]
|
|
148
210
|
},
|
|
@@ -208,25 +270,22 @@
|
|
|
208
270
|
]
|
|
209
271
|
},
|
|
210
272
|
{
|
|
211
|
-
"route": "/
|
|
212
|
-
"kind": "
|
|
213
|
-
"pageType":
|
|
214
|
-
"schema":
|
|
273
|
+
"route": "/sign-in",
|
|
274
|
+
"kind": "route",
|
|
275
|
+
"pageType": null,
|
|
276
|
+
"schema": null,
|
|
215
277
|
"shell": "MarketingShell",
|
|
216
278
|
"chrome": "on",
|
|
217
|
-
"sections": [
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
]
|
|
279
|
+
"sections": []
|
|
280
|
+
},
|
|
281
|
+
{
|
|
282
|
+
"route": "/sign-up",
|
|
283
|
+
"kind": "route",
|
|
284
|
+
"pageType": null,
|
|
285
|
+
"schema": null,
|
|
286
|
+
"shell": "MarketingShell",
|
|
287
|
+
"chrome": "on",
|
|
288
|
+
"sections": []
|
|
230
289
|
},
|
|
231
290
|
{
|
|
232
291
|
"route": "/purchase-policy",
|
|
@@ -311,6 +370,56 @@
|
|
|
311
370
|
}
|
|
312
371
|
]
|
|
313
372
|
},
|
|
373
|
+
{
|
|
374
|
+
"route": "/meet",
|
|
375
|
+
"kind": "page",
|
|
376
|
+
"pageType": "LandingPage",
|
|
377
|
+
"schema": "WebPage",
|
|
378
|
+
"shell": "MarketingShell",
|
|
379
|
+
"chrome": "on",
|
|
380
|
+
"sections": [
|
|
381
|
+
{
|
|
382
|
+
"type": "hero",
|
|
383
|
+
"component": "Hero"
|
|
384
|
+
},
|
|
385
|
+
{
|
|
386
|
+
"type": "items",
|
|
387
|
+
"component": "Items",
|
|
388
|
+
"options": {
|
|
389
|
+
"columns": 2
|
|
390
|
+
}
|
|
391
|
+
}
|
|
392
|
+
]
|
|
393
|
+
},
|
|
394
|
+
{
|
|
395
|
+
"route": "/meet/[slug]",
|
|
396
|
+
"kind": "page",
|
|
397
|
+
"pageType": "BookCall",
|
|
398
|
+
"schema": "BookCall",
|
|
399
|
+
"shell": "MarketingShell",
|
|
400
|
+
"chrome": "on",
|
|
401
|
+
"sections": [
|
|
402
|
+
{
|
|
403
|
+
"type": "hero",
|
|
404
|
+
"component": "Hero"
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
"type": "cta",
|
|
408
|
+
"component": "CTA"
|
|
409
|
+
},
|
|
410
|
+
{
|
|
411
|
+
"type": "items",
|
|
412
|
+
"component": "Items",
|
|
413
|
+
"options": {
|
|
414
|
+
"columns": 3
|
|
415
|
+
}
|
|
416
|
+
},
|
|
417
|
+
{
|
|
418
|
+
"type": "content-block",
|
|
419
|
+
"component": "ContentBlock"
|
|
420
|
+
}
|
|
421
|
+
]
|
|
422
|
+
},
|
|
314
423
|
{
|
|
315
424
|
"route": "/portfolio",
|
|
316
425
|
"kind": "page",
|
|
@@ -96,6 +96,28 @@ One `page=<route>` region per roster row, generated from the seed file the compo
|
|
|
96
96
|
_Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx`, `second-engagement.mdx`, `third-engagement.mdx`._
|
|
97
97
|
<!-- generated:end -->
|
|
98
98
|
|
|
99
|
+
`/for` (the persona hub — every shape carries the family now, #6878 D7):
|
|
100
|
+
|
|
101
|
+
<!-- generated:begin page=/for -->
|
|
102
|
+
|
|
103
|
+
| # | Section | Component | Copy (first line) |
|
|
104
|
+
| --- | -------------------------------------------------------- | -------------- | ----------------------------------------------------------------- |
|
|
105
|
+
| 1 | `hero` (eyebrow "Customers" · 2 CTAs) | `Hero` | {Customers: who your product or service is for} |
|
|
106
|
+
| 2 | `items` (columns=3 · items ×3) | `Items` | {The jobs customers hire your product or service to do} |
|
|
107
|
+
| 3 | `logoCloud` (layout=inline · logos ×6) | `LogoCloud` | Don’t just take our word for it |
|
|
108
|
+
| 4 | `testimonials` (quote · items ×1) | `Testimonials` | {A customer quote, in their own words, about the result they got} |
|
|
109
|
+
| 5 | `cta` (box · checklist ×3 · 2 CTAs · closingLine) | `CTA` | {Switch to your product or service in time amount or less} |
|
|
110
|
+
| 6 | `faq` (accordion · items ×5 · 1 CTA · initialOpen first) | `FAQ` | FAQs |
|
|
111
|
+
|
|
112
|
+
<!-- generated:end -->
|
|
113
|
+
|
|
114
|
+
`/for/[slug]`:
|
|
115
|
+
|
|
116
|
+
<!-- generated:begin page=/for/[slug] -->
|
|
117
|
+
|
|
118
|
+
_Detail route over `content/en/UseCase/` — 3 seed pages: `persona-1.mdx`, `persona-2.mdx`, `persona-3.mdx`._
|
|
119
|
+
<!-- generated:end -->
|
|
120
|
+
|
|
99
121
|
`/about`:
|
|
100
122
|
|
|
101
123
|
<!-- generated:begin page=/about -->
|
|
@@ -111,9 +133,10 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx
|
|
|
111
133
|
|
|
112
134
|
<!-- generated:begin page=/contact -->
|
|
113
135
|
|
|
114
|
-
| # | Section | Component | Copy (first line)
|
|
115
|
-
| --- | --------------------------------------------------------- | --------- |
|
|
116
|
-
| 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free
|
|
136
|
+
| # | Section | Component | Copy (first line) |
|
|
137
|
+
| --- | --------------------------------------------------------- | --------- | ----------------------------------------- |
|
|
138
|
+
| 1 | `hero` (split · eyebrow "Contact" · checklist ×3 · 1 CTA) | `Hero` | Get every message in your email, free |
|
|
139
|
+
| 2 | `items` (tiles · columns=2 · items ×4) | `Items` | {Add appointment scheduling to your site} |
|
|
117
140
|
|
|
118
141
|
<!-- generated:end -->
|
|
119
142
|
|
|
@@ -129,7 +152,7 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx
|
|
|
129
152
|
|
|
130
153
|
<!-- generated:end -->
|
|
131
154
|
|
|
132
|
-
`/glossary`, `/newsletter
|
|
155
|
+
`/glossary`, `/newsletter` (base-layer seeds every starter carries, #6658 D5 — `/newsletter` is this tree's own byte copy of the Free newsletter, D4/D9), plus the always-copied overlay's `/meet` hub and `/meet/[slug]` BookCall detail seeds (#6897 D3-D5):
|
|
133
156
|
|
|
134
157
|
<!-- generated:begin page=/glossary -->
|
|
135
158
|
|
|
@@ -149,15 +172,38 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx
|
|
|
149
172
|
|
|
150
173
|
<!-- generated:end -->
|
|
151
174
|
|
|
152
|
-
<!-- generated:begin page=/
|
|
175
|
+
<!-- generated:begin page=/meet -->
|
|
153
176
|
|
|
154
|
-
| # | Section | Component | Copy (first line)
|
|
155
|
-
| --- | -------------------------------------- | --------- |
|
|
156
|
-
| 1 | `hero` (eyebrow "
|
|
157
|
-
| 2 | `items` (columns=
|
|
177
|
+
| # | Section | Component | Copy (first line) |
|
|
178
|
+
| --- | -------------------------------------- | --------- | --------------------- |
|
|
179
|
+
| 1 | `hero` (eyebrow "Meet") | `Hero` | {Book a time with us} |
|
|
180
|
+
| 2 | `items` (tiles · columns=2 · items ×4) | `Items` | |
|
|
158
181
|
|
|
159
182
|
<!-- generated:end -->
|
|
160
183
|
|
|
184
|
+
<!-- generated:begin page=/meet/[slug] -->
|
|
185
|
+
|
|
186
|
+
| # | Section | Component | Copy (first line) |
|
|
187
|
+
| --- | -------------------------------------- | -------------- | ------------------------------------------------ |
|
|
188
|
+
| 1 | `hero` (eyebrow "Book a Call" · 1 CTA) | `Hero` | Book a Call |
|
|
189
|
+
| 2 | `cta` (box · 1 CTA) | `CTA` | {What booking a call would do for your visitors} |
|
|
190
|
+
| 3 | `items` (columns=3 · items ×3) | `Items` | What happens on the call? |
|
|
191
|
+
| 4 | `content-block` (1 CTA) | `ContentBlock` | |
|
|
192
|
+
|
|
193
|
+
<!-- generated:end -->
|
|
194
|
+
|
|
195
|
+
`/sign-in`, `/sign-up` (code routes — the `SignInCard` island and the sign-up form inside the locale layout, whose header links both; listed so the manifest is a complete install record, #6797):
|
|
196
|
+
|
|
197
|
+
<!-- generated:begin page=/sign-in -->
|
|
198
|
+
|
|
199
|
+
_Code route — no content, no sections._
|
|
200
|
+
<!-- generated:end -->
|
|
201
|
+
|
|
202
|
+
<!-- generated:begin page=/sign-up -->
|
|
203
|
+
|
|
204
|
+
_Code route — no content, no sections._
|
|
205
|
+
<!-- generated:end -->
|
|
206
|
+
|
|
161
207
|
`/purchase-policy` (this tree's own service-shape override — cancellation and refunds, D4):
|
|
162
208
|
|
|
163
209
|
<!-- generated:begin page=/purchase-policy -->
|
|
@@ -199,7 +245,7 @@ _Detail route over `content/en/Service/` — 3 seed pages: `first-engagement.mdx
|
|
|
199
245
|
|
|
200
246
|
<!-- generated:end -->
|
|
201
247
|
|
|
202
|
-
`/portfolio` (this tree's own override of the `_base` seed — re-voiced for one person, both CTAs `/book-a-call` and `/contact`, D4):
|
|
248
|
+
`/portfolio` (this tree's own override of the `_base` seed — re-voiced for one person, both CTAs `/meet/book-a-call` and `/contact`, D4):
|
|
203
249
|
|
|
204
250
|
<!-- generated:begin page=/portfolio -->
|
|
205
251
|
|
|
@@ -230,19 +276,21 @@ The standard page set for this shape (`derive-roster.py --shape person-service -
|
|
|
230
276
|
| `ProjectsList` · `Project` | the portfolio pair (`/portfolio`) is the proof of past work; `/projects` is the paid signal-collectors sample listing |
|
|
231
277
|
| `Pricing` | a consultant sells named engagements, each priced on its own `Service` page or quoted on a call — not a pricing table |
|
|
232
278
|
| `CaseStudiesList` · `CaseStudy` · `TestimonialsList` · `ClientsList` | proof pages need real clients (#6658's reason for Free, unchanged); the portfolio pages carry placeholder before/after proof |
|
|
233
|
-
| `UseCasesList` · `UseCase` | each `Service` page names who it is for; the `_base` persona seeds are product copy that links `/pricing` |
|
|
234
279
|
| `EventsList` · `Event` · `DownloadsList` | a placeholder starter has no events or downloads |
|
|
235
280
|
| `ResourcesHub` · `ResourceDetail` · `HowTo` · `Whitepaper` | the Resources content system is the goal-driven default a site grows into, not a starter page |
|
|
236
281
|
|
|
237
282
|
**Rows added:**
|
|
238
283
|
|
|
239
|
-
| Row added | Reason
|
|
240
|
-
| --------------------------------- |
|
|
241
|
-
| `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3, contract R2.3)
|
|
242
|
-
| `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4)
|
|
243
|
-
| `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (#6753 D3)
|
|
284
|
+
| Row added | Reason |
|
|
285
|
+
| --------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
286
|
+
| `PurchasePolicyPage` | every shape carries one purchase policy with its shape's sections — service: cancellation and refunds (#6646 D3, contract R2.3) |
|
|
287
|
+
| `PortfolioList` · `PortfolioItem` | the portfolio pair belongs to every shape's standard roster (operator, 2026-09-25; roadmap § 4) |
|
|
288
|
+
| `BlogList` | every Free scaffold's nav links `/blog` unconditionally (`renderNavConfig`, operator ruling 2026-09-23); the Free teaser serves it, as on organization-product (#6753 D3) |
|
|
289
|
+
| `LandingPage` | the Free `/meet` meeting-types hub is a LandingPage seed, the same generic `[slug]` route serves it through (#6897 D3); the four `/meet/[slug]` BookCall detail seeds ride the `BookCall` type already in the standard roster |
|
|
290
|
+
|
|
291
|
+
`|S − D| = 13` and `|R| = 18`.
|
|
244
292
|
|
|
245
|
-
|
|
293
|
+
`/sign-in` and `/sign-up` are also rostered (#6797) — code routes (`kind: route`) with no page type, so they sit outside this set equation: the locale layout's header links both, and the roster of record lists every page the scaffold serves.
|
|
246
294
|
|
|
247
295
|
## 4. Roster, as the registry declares it
|
|
248
296
|
|
|
@@ -260,16 +308,21 @@ person-service:
|
|
|
260
308
|
- { route: "/", kind: page, content: ["content/en/HomePage/home.mdx"] }
|
|
261
309
|
- { route: "/services", kind: page, content: ["content/en/ServicesList/services.mdx"] }
|
|
262
310
|
- { route: "/services/[slug]", kind: page, contentDir: "content/en/Service" }
|
|
311
|
+
- { route: "/for", kind: page, content: ["content/en/UseCasesList/for.mdx"] }
|
|
312
|
+
- { route: "/for/[slug]", kind: page, contentDir: "content/en/UseCase" }
|
|
263
313
|
- { route: "/about", kind: page, content: ["content/en/AboutPage/about.mdx"] }
|
|
264
314
|
- { route: "/contact", kind: page, content: ["content/en/ContactPage/contact.mdx"] }
|
|
265
315
|
- { route: "/faq", kind: page, content: ["content/en/FAQPage/faq.mdx"] }
|
|
266
316
|
- { route: "/glossary", kind: page, content: ["content/en/GlossaryList/glossary.mdx"] }
|
|
267
317
|
- { route: "/newsletter", kind: page, content: ["content/en/NewsletterSignup/newsletter.mdx"] }
|
|
268
|
-
- { route: "/
|
|
318
|
+
- { route: "/sign-in", kind: route }
|
|
319
|
+
- { route: "/sign-up", kind: route }
|
|
269
320
|
- { route: "/purchase-policy", kind: page, content: ["content/en/PurchasePolicyPage/purchase-policy.mdx"] }
|
|
270
321
|
- { route: "/privacy", kind: page, content: ["content/en/PrivacyPage/privacy.mdx"] }
|
|
271
322
|
- { route: "/terms", kind: page, content: ["content/en/TermsPage/terms.mdx"] }
|
|
272
323
|
- { route: "/blog", kind: page, content: ["content/en/BlogList/blog.mdx"] }
|
|
324
|
+
- { route: "/meet", kind: page, content: ["content/en/LandingPage/meet.mdx"] }
|
|
325
|
+
- { route: "/meet/[slug]", kind: page, content: ["content/en/BookCall/book-a-call.mdx", "content/en/BookCall/onsite-estimate.mdx", "content/en/BookCall/start-project.mdx", "content/en/BookCall/onsite-service.mdx"] }
|
|
273
326
|
- { route: "/portfolio", kind: page, content: ["content/en/PortfolioList/portfolio.mdx"] }
|
|
274
327
|
- { route: "/portfolio/[slug]", kind: page, contentDir: "content/en/PortfolioItem" }
|
|
275
328
|
```
|
|
@@ -280,11 +333,12 @@ By source:
|
|
|
280
333
|
|
|
281
334
|
```
|
|
282
335
|
starter: / · /services · /services/<slug> · /about · /contact · /faq
|
|
283
|
-
/glossary · /newsletter · /
|
|
284
|
-
/privacy · /terms · /blog · /
|
|
336
|
+
/glossary · /newsletter · /sign-in · /sign-up
|
|
337
|
+
/purchase-policy · /privacy · /terms · /blog · /meet · /meet/<slug>
|
|
338
|
+
/portfolio · /portfolio/<slug>
|
|
285
339
|
```
|
|
286
340
|
|
|
287
|
-
Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own
|
|
341
|
+
Every row is module-less: `requires` is `[marketing]` alone, so `mergeRoster` contributes nothing beyond this tree's own seventeen rows.
|
|
288
342
|
|
|
289
343
|
## 5. Component inventory
|
|
290
344
|
|
|
@@ -6,5 +6,5 @@
|
|
|
6
6
|
"provenance.json": ".ailk-template.json",
|
|
7
7
|
"TEMPLATE-MANIFEST.json": ".ailk-site-manifest.json"
|
|
8
8
|
},
|
|
9
|
-
"postInstall": "Starter person-service installed. Its /faq, /contact and /
|
|
9
|
+
"postInstall": "Starter person-service installed. Its /faq, /contact, /blog, /meet and its four /meet/<slug> seed pages came with the always-copied overlay; /glossary, /newsletter, /privacy and /terms with the base layer it extends (content/en/). This tree's own /, /about, /services (+ three engagements), /purchase-policy and /portfolio pages are its own compositions, written for one person. Every line of copy is a placeholder \u2014 replace it before you launch."
|
|
10
10
|
}
|
|
@@ -24,7 +24,7 @@ sections:
|
|
|
24
24
|
{
|
|
25
25
|
"variant": "minimal",
|
|
26
26
|
"headline": "Work with me",
|
|
27
|
-
"primaryCta": { "label": "Book a call", "href": "/book-a-call" },
|
|
27
|
+
"primaryCta": { "label": "Book a call", "href": "/meet/book-a-call" },
|
|
28
28
|
"secondaryCta":
|
|
29
29
|
{
|
|
30
30
|
"label": "Get in touch",
|
|
@@ -14,7 +14,7 @@ sections:
|
|
|
14
14
|
"eyebrow": "{Your Name}",
|
|
15
15
|
"headline": "{One line on the outcome you deliver for clients}",
|
|
16
16
|
"subheadline": "{One line on who you work with and what makes working with you different.}",
|
|
17
|
-
"primaryCta": { "label": "Book a call", "href": "/book-a-call" },
|
|
17
|
+
"primaryCta": { "label": "Book a call", "href": "/meet/book-a-call" },
|
|
18
18
|
"secondaryCta":
|
|
19
19
|
{
|
|
20
20
|
"label": "Get in touch",
|
|
@@ -82,7 +82,7 @@ sections:
|
|
|
82
82
|
"variant": "minimal",
|
|
83
83
|
"headline": "Ready to talk about your project?",
|
|
84
84
|
"description": "{One line inviting the reader to start the conversation.}",
|
|
85
|
-
"primaryCta": { "label": "Book a call", "href": "/book-a-call" },
|
|
85
|
+
"primaryCta": { "label": "Book a call", "href": "/meet/book-a-call" },
|
|
86
86
|
"secondaryCta":
|
|
87
87
|
{
|
|
88
88
|
"label": "Get in touch",
|
|
@@ -20,7 +20,8 @@ sections:
|
|
|
20
20
|
"subheadline": "{Two or three sentences on why the comparison is the honest proof — what the before cost the client, what the after changed, and how a reader can check it.}",
|
|
21
21
|
"subtitleSize": "lead",
|
|
22
22
|
"ctaSize": "xl",
|
|
23
|
-
"primaryCta":
|
|
23
|
+
"primaryCta":
|
|
24
|
+
{ "label": "{Book a call}", "href": "/meet/book-a-call" },
|
|
24
25
|
"secondaryCta": { "label": "{Get in touch}", "href": "/contact" },
|
|
25
26
|
},
|
|
26
27
|
},
|
|
@@ -126,7 +127,8 @@ sections:
|
|
|
126
127
|
"variant": "beam",
|
|
127
128
|
"headline": "{Is your project the before or the after?}",
|
|
128
129
|
"description": "{One line offering the reader the same comparison for their own project.}",
|
|
129
|
-
"primaryCta":
|
|
130
|
+
"primaryCta":
|
|
131
|
+
{ "label": "{Book a call}", "href": "/meet/book-a-call" },
|
|
130
132
|
"secondaryCta": { "label": "{Get in touch}", "href": "/contact" },
|
|
131
133
|
"chips":
|
|
132
134
|
[
|
|
@@ -63,7 +63,7 @@ sections:
|
|
|
63
63
|
"variant": "minimal",
|
|
64
64
|
"headline": "Not sure which one?",
|
|
65
65
|
"description": "{One line inviting the reader to ask instead of guessing.}",
|
|
66
|
-
"primaryCta": { "label": "Book a call", "href": "/book-a-call" },
|
|
66
|
+
"primaryCta": { "label": "Book a call", "href": "/meet/book-a-call" },
|
|
67
67
|
},
|
|
68
68
|
},
|
|
69
69
|
]
|
|
@@ -22,8 +22,8 @@ upstream packages; don't try to edit them locally.
|
|
|
22
22
|
## Read before edit
|
|
23
23
|
|
|
24
24
|
1. `.claude/rules/architecture.md` — confirm what `apps/web` may
|
|
25
|
-
import
|
|
26
|
-
|
|
25
|
+
import, including its one database exception (the Better Auth
|
|
26
|
+
adapter). Everything else server-side goes through `apps/api`.
|
|
27
27
|
2. The page or component you're modifying, plus any sibling files in
|
|
28
28
|
the same directory.
|
|
29
29
|
3. Any project-local theme override file before touching styles —
|
|
@@ -46,7 +46,8 @@ Run `pnpm preflight` before opening a PR.
|
|
|
46
46
|
- Need a new content type? Add it under `content/<TypeName>/` and
|
|
47
47
|
reference the schema from `@working-theory/schema`.
|
|
48
48
|
- Need a database read? Wrong layer — `apps/web` does not read the
|
|
49
|
-
database
|
|
49
|
+
database outside the one exception `.claude/rules/architecture.md`
|
|
50
|
+
names. Route through `apps/api`.
|
|
50
51
|
|
|
51
52
|
## Domain conventions
|
|
52
53
|
|
|
@@ -55,23 +56,24 @@ Run `pnpm preflight` before opening a PR.
|
|
|
55
56
|
Adding `'use client'` to a file that just renders JSX is the
|
|
56
57
|
default failure mode — resist it.
|
|
57
58
|
- **Tailwind tokens only.** No raw hex, rgb, or arbitrary colors.
|
|
58
|
-
Use semantic tokens from `@working-theory/theme` (`bg-
|
|
59
|
+
Use semantic tokens from `@working-theory/theme` (`bg-surface`, `text-fg`,
|
|
59
60
|
`border-border`, etc.). If a token doesn't exist, extend the theme;
|
|
60
61
|
don't bypass.
|
|
61
62
|
- **Mobile-first responsive.** Default styles target mobile;
|
|
62
63
|
`md:`/`lg:` modifiers for larger viewports.
|
|
63
64
|
- **MDX rendering** uses `next-mdx-remote/rsc`, never `@next/mdx`
|
|
64
65
|
(the latter requires runtime config that fights Server Components).
|
|
65
|
-
- **
|
|
66
|
-
—
|
|
66
|
+
- **Better Auth's route handler** is the only API-shaped code in
|
|
67
|
+
`apps/web` — it lives at `apps/web/app/api/auth/[...all]/route.ts`.
|
|
67
68
|
Everything else goes to `apps/api`.
|
|
68
69
|
|
|
69
70
|
## Forbidden
|
|
70
71
|
|
|
71
72
|
- Importing from `apps/api` or `apps/mcp` — these are peer apps;
|
|
72
73
|
speak to the API via `@working-theory/api-client`.
|
|
73
|
-
- Importing `@working-theory/database`
|
|
74
|
-
route through
|
|
74
|
+
- Importing `@working-theory/database` outside the Better Auth adapter
|
|
75
|
+
(the exception `.claude/rules/architecture.md` names) — route through
|
|
76
|
+
`apps/api`.
|
|
75
77
|
- Importing `resend`, `@react-email/*` directly — wrap through
|
|
76
78
|
`@working-theory/email`, server-side via `apps/api`.
|
|
77
79
|
- Adding a `utils.ts`, `helpers.ts`, `common.ts`, or `misc.ts` file
|
|
@@ -25,13 +25,16 @@ other.
|
|
|
25
25
|
or `@working-theory/schema` (schema.org types).
|
|
26
26
|
- Need an HTTP call from `apps/web` to `apps/api`? Use
|
|
27
27
|
`@working-theory/api-client`. Don't import API route handlers directly.
|
|
28
|
-
- Need database access?
|
|
29
|
-
`@working-theory/database`. `apps/web`
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
- Need database access? `apps/api` and `apps/mcp` import
|
|
29
|
+
`@working-theory/database`. `apps/web` does not read the database — it goes
|
|
30
|
+
through `apps/api` via the published HTTP client. The one exception is the
|
|
31
|
+
Better Auth adapter (`apps/web/lib/prisma-for-auth.ts`, typed in
|
|
32
|
+
`apps/web/auth.ts`).
|
|
33
|
+
- Cross-cutting integrations (email, analytics) go through their
|
|
34
|
+
wrapper packages: `@working-theory/email`, `@working-theory/analytics`.
|
|
35
|
+
Never import `resend`, etc. directly. Auth has no wrapper package: it is
|
|
36
|
+
Better Auth, configured in `apps/web/auth.ts` and mounted at
|
|
37
|
+
`apps/web/app/api/auth/[...all]/route.ts`.
|
|
35
38
|
|
|
36
39
|
## What you can verify, what you can't
|
|
37
40
|
|
|
@@ -61,6 +64,13 @@ These never appear in source code:
|
|
|
61
64
|
and future prefixes included, by being absent from the list rather than
|
|
62
65
|
by being named on a ban-list. Live keys live in your deployment
|
|
63
66
|
platform's secrets store, never in source files or `.env`.
|
|
67
|
+
`@working-theory/stripe-client` does export one opt-in,
|
|
68
|
+
`admitLiveRestrictedKey()`: a server process that calls it once at
|
|
69
|
+
startup lets `getStripeClient()` accept a restricted live key
|
|
70
|
+
(`rk_live_`) — never `sk_live_` or `pk_live_`. Nothing in this site
|
|
71
|
+
calls it, so the default refusal stands; calling it is a deliberate
|
|
72
|
+
go-live decision, and `assertSandboxKey()` stays sandbox-only even
|
|
73
|
+
then.
|
|
64
74
|
- Direct vendor SDK imports outside the wrapper packages
|
|
65
75
|
(`import 'resend'` outside `@working-theory/email`, etc.).
|
|
66
76
|
- Hardcoded production database URLs in committed files.
|
|
@@ -4,14 +4,15 @@ Skills are reusable Claude Code workflows scoped to this project. Each
|
|
|
4
4
|
lives in its own subdirectory with a `SKILL.md` describing when to use
|
|
5
5
|
it and how it works.
|
|
6
6
|
|
|
7
|
-
The
|
|
7
|
+
The eight skills below ship with this project. Claude Code discovers
|
|
8
8
|
them automatically at session start — nothing to install or enable.
|
|
9
9
|
|
|
10
10
|
## Available skills
|
|
11
11
|
|
|
12
12
|
| Skill | Purpose |
|
|
13
13
|
| -------------- | -------------------------------------------------------------------------------------------------------------- |
|
|
14
|
-
| `add-page` |
|
|
14
|
+
| `add-page` | Add a page this site can serve — its content file, structured data and nav link — adding a missing route with `create-ailk add-route` first. Also documents the `schema:` frontmatter override for any page. |
|
|
15
|
+
| `update-page` | Rename a page — give it a new URL and/or a new title — in one plan-then-confirm pass: its content files, its own route folder, exact internal links and the manifest row move together, and the old URL gets a permanent redirect. |
|
|
15
16
|
| `add-auth` | Activate auth providers — magic-link via Resend, Google OAuth, GitHub OAuth. |
|
|
16
17
|
| `setup-deploy` | Emit deploy configuration — `vercel.json`, `.env.example`, and `RUNBOOK.md` — for a Vercel deploy. Asks where leads go (email or a database) and warns when neither is set. |
|
|
17
18
|
| `setup-database` | Take the site from no database to a working lead inbox: provision Postgres, create the tables, pin the owner, and verify one test message lands in `/leads`. |
|