create-ailk 0.3.0 → 0.5.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/component-catalog.json +11939 -0
- package/component-catalog.md +176 -64
- package/dist/cli.js +48 -10
- package/dist/derive-architecture.js +5 -2
- package/dist/lib/extract-module-bundle.d.ts +88 -1
- package/dist/lib/extract-module-bundle.js +375 -80
- package/dist/lib/fetch-guard.d.ts +28 -0
- package/dist/lib/fetch-guard.js +101 -0
- package/dist/lib/fetch-module.js +4 -0
- package/dist/lib/fetch-template.d.ts +20 -0
- package/dist/lib/fetch-template.js +133 -0
- package/dist/lib/module-license-gate.d.ts +8 -0
- package/dist/lib/module-license-gate.js +12 -4
- package/dist/module-architecture.d.ts +116 -7
- package/dist/module-architecture.js +465 -94
- package/dist/parse-args.d.ts +8 -1
- package/dist/parse-args.js +49 -2
- package/dist/programmatic.d.ts +36 -1
- package/dist/programmatic.js +216 -5
- package/dist/site-chrome.d.ts +80 -0
- package/dist/site-chrome.js +135 -0
- package/dist/surfaces.d.ts +21 -6
- package/dist/surfaces.js +140 -23
- package/dist/template-manifest.d.ts +144 -0
- package/dist/template-manifest.js +337 -0
- package/dist/template-names.d.ts +41 -0
- package/dist/template-names.js +45 -0
- package/package.json +10 -2
- package/site-templates/_base/ailk-template.json +6 -0
- package/site-templates/_base/content/en/Pricing/pricing.mdx +169 -0
- package/site-templates/_base/content/en/PrivacyPage/privacy.mdx +79 -0
- package/site-templates/_base/content/en/TermsPage/terms.mdx +80 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.json +331 -0
- package/site-templates/marketing-site/TEMPLATE-MANIFEST.md +393 -0
- package/site-templates/marketing-site/ailk-template.json +11 -0
- package/site-templates/marketing-site/content/en/blog/05-this-vc-morning-routine-will-make-you-super-annoying.mdx +36 -0
- package/site-templates/marketing-site/provenance.json +4 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.json +288 -0
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +285 -0
- package/site-templates/marketing-site-free/ailk-template.json +9 -0
- package/site-templates/marketing-site-free/provenance.json +4 -0
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.json +271 -0
- package/site-templates/minimalism-site/TEMPLATE-MANIFEST.md +324 -0
- package/site-templates/minimalism-site/ailk-template.json +21 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-1.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-2.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-3.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-4.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-5.svg +7 -0
- package/site-templates/minimalism-site/assets/avatar-placeholder-6.svg +7 -0
- package/site-templates/minimalism-site/assets/hero-backdrop.svg +17 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-1.svg +6 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-2.svg +6 -0
- package/site-templates/minimalism-site/assets/logo-placeholder-3.svg +6 -0
- package/site-templates/minimalism-site/content/en/AboutPage/about.mdx +110 -0
- package/site-templates/minimalism-site/content/en/ContactPage/contact.mdx +68 -0
- package/site-templates/minimalism-site/content/en/FAQPage/faq.mdx +57 -0
- package/site-templates/minimalism-site/content/en/HomePage/home.mdx +214 -0
- package/site-templates/minimalism-site/content/en/LandingPage/referral.mdx +77 -0
- package/site-templates/minimalism-site/content/en/LandingPage/reports.mdx +73 -0
- package/site-templates/minimalism-site/content/en/ReportPage/annual-letter-2024.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/field-notes-2023.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/platform-shift-2025.mdx +52 -0
- package/site-templates/minimalism-site/content/en/ReportPage/state-of-the-market-2026.mdx +52 -0
- package/site-templates/minimalism-site/content/en/Service/first-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/Service/second-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/Service/third-engagement.mdx +38 -0
- package/site-templates/minimalism-site/content/en/ServicesList/services.mdx +73 -0
- package/site-templates/minimalism-site/flows/referral.flow.json +71 -0
- package/site-templates/minimalism-site/provenance.json +4 -0
- package/site-templates/saas-product/TEMPLATE-MANIFEST.md +61 -0
- package/site-templates/saas-product/ailk-template.json +16 -0
- package/site-templates/saas-product/provenance.json +10 -0
- package/templates/.claude/skills/README.md +16 -25
- package/templates/.env.example +32 -7
- package/templates/.github/workflows/ci.yml +48 -0
- package/templates/README.md +3 -1
- package/templates/apps/api/CLAUDE.md +4 -1
- package/templates/apps/api/eslint.config.mjs +69 -0
- package/templates/apps/api/package.json +6 -2
- package/templates/apps/api/src/__tests__/module-exclusion.test.ts +6 -2
- package/templates/apps/api/src/__tests__/review-surface-registration.test.ts +167 -0
- package/templates/apps/api/src/__tests__/workspace-module-registration.test.ts +173 -0
- package/templates/apps/api/src/config/modules.ts +1 -1
- package/templates/apps/api/src/lib/__mocks__/prisma.ts +3 -0
- package/templates/apps/api/src/middleware/__tests__/default-tenant.test.ts +339 -0
- package/templates/apps/api/src/middleware/__tests__/rate-limit.test.ts +108 -0
- package/templates/apps/api/src/middleware/default-tenant.ts +136 -0
- package/templates/apps/api/src/routes/leads/__tests__/list.test.ts +171 -0
- package/templates/apps/api/src/routes/leads/list.ts +104 -0
- package/templates/apps/api/src/server.ts +122 -3
- package/templates/apps/api/src/services/__tests__/lead-promotion.test.ts +408 -0
- package/templates/apps/api/src/services/__tests__/leads-inbox.test.ts +329 -0
- package/templates/apps/api/src/services/default-tenant.ts +261 -0
- package/templates/apps/api/src/services/lead-promotion.ts +161 -0
- package/templates/apps/api/src/services/leads-inbox.ts +263 -0
- package/templates/apps/api/src/services/owner-workspaces.ts +132 -0
- package/templates/apps/mcp/CLAUDE.md +1 -1
- package/templates/apps/mcp/__tests__/parity.test.ts +2 -2
- package/templates/apps/mcp/__tests__/tools/{scaffold.test.ts → create_project.test.ts} +23 -23
- package/templates/apps/mcp/eslint.config.mjs +69 -0
- package/templates/apps/mcp/package.json +6 -2
- package/templates/apps/mcp/src/server.ts +2 -2
- package/templates/apps/mcp/src/tools/{scaffold.ts → create_project.ts} +3 -3
- package/templates/apps/mcp/src/tools/index.ts +2 -2
- package/templates/apps/web/.env.example +3 -3
- package/templates/apps/web/CLAUDE.md +2 -0
- package/templates/apps/web/app/[locale]/(authed)/account/page.tsx +4 -6
- package/templates/apps/web/app/[locale]/(authed)/layout.tsx +1 -1
- package/templates/apps/web/app/[locale]/(authed)/leads/__tests__/page.test.tsx +181 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/components/LeadsTable.tsx +137 -0
- package/templates/apps/web/app/[locale]/(authed)/leads/page.tsx +111 -0
- package/templates/apps/web/app/[locale]/(authed)/sign-in-gate.tsx +1 -1
- package/templates/apps/web/app/[locale]/[slug]/__tests__/page.test.tsx +111 -0
- package/templates/apps/web/app/[locale]/[slug]/page.tsx +65 -0
- package/templates/apps/web/app/[locale]/flows/[slug]/FlowStepperClient.tsx +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.permalink.test.tsx +1 -1
- package/templates/apps/web/app/[locale]/flows/[slug]/__tests__/FlowStepperClient.test.tsx +6 -5
- package/templates/apps/web/app/[locale]/flows/[slug]/flow.actions.ts +1 -1
- package/templates/apps/web/app/[locale]/layout.tsx +214 -17
- package/templates/apps/web/app/[locale]/pricing/page.tsx +40 -0
- package/templates/apps/web/app/[locale]/privacy/page.tsx +40 -0
- package/templates/apps/web/app/[locale]/terms/page.tsx +40 -0
- package/templates/apps/web/components/google-analytics.tsx +18 -1
- package/templates/apps/web/eslint.config.mjs +69 -0
- package/templates/apps/web/jest.config.cjs +12 -15
- package/templates/apps/web/lib/__tests__/server-api.test.ts +61 -0
- package/templates/apps/web/lib/__tests__/structured-data.test.tsx +32 -5
- package/templates/apps/web/lib/nav-config.ts +27 -7
- package/templates/apps/web/lib/server-api.ts +29 -13
- package/templates/apps/web/lib/site-chrome.ts +29 -0
- package/templates/apps/web/lib/telemetry-scrub.ts +46 -0
- package/templates/apps/web/messages/en.json +86 -1
- package/templates/apps/web/next.config.mjs +20 -0
- package/templates/apps/web/package.json +6 -2
- package/templates/apps/web/sentry.client.config.ts +131 -0
- package/templates/apps/web/sentry.edge.config.ts +72 -0
- package/templates/apps/web/sentry.server.config.ts +72 -0
- package/templates/apps/web/src/lib/routes.ts +13 -18
- package/templates/brand_assets/README.md +24 -0
- package/templates/content/en/AboutPage/about.mdx +160 -15
- package/templates/content/en/ContactPage/contact.mdx +90 -13
- package/templates/content/en/FAQPage/faq.mdx +62 -22
- package/templates/content/en/HomePage/home.mdx +244 -20
- package/templates/content/en/LandingPage/blog.mdx +83 -0
- package/templates/content/en/LandingPage/features.mdx +103 -0
- package/templates/content/en/LandingPage/how-it-works.mdx +143 -0
- package/templates/database/CHANGELOG.md +21 -0
- package/templates/database/__tests__/seed.test.ts +1 -1
- package/templates/database/eslint.config.mjs +69 -0
- package/templates/database/package.json +7 -3
- package/templates/database/seed.ts +1 -1
- package/templates/package.json +1 -14
- package/versions.json +52 -0
- /package/templates/apps/web/{src/components → components}/SiteNav.tsx +0 -0
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "ReportPage"
|
|
3
|
+
slug: "annual-letter-2024"
|
|
4
|
+
title: "Annual Letter"
|
|
5
|
+
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
datePublished: "2024-12-09"
|
|
8
|
+
author:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
sections:
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
"id": "header",
|
|
15
|
+
"type": "report-header",
|
|
16
|
+
"data":
|
|
17
|
+
{
|
|
18
|
+
"title": "Annual Letter",
|
|
19
|
+
"eyebrow": "December 2024",
|
|
20
|
+
"backHref": "/reports",
|
|
21
|
+
"backLabel": "All reports",
|
|
22
|
+
"tone": "on-dark",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "document",
|
|
27
|
+
"type": "document-viewer",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"src": "/reports/sample-report.pdf",
|
|
31
|
+
"geometry": "16:9",
|
|
32
|
+
"pages": 8,
|
|
33
|
+
"downloadFilename": "annual-letter-2024.pdf",
|
|
34
|
+
"outline":
|
|
35
|
+
[
|
|
36
|
+
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
+
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
+
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
]
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
{/_
|
|
46
|
+
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
+
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
+
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
+
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
+
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
+
a wrong number shows as a jump.
|
|
52
|
+
_/}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "ReportPage"
|
|
3
|
+
slug: "field-notes-2023"
|
|
4
|
+
title: "Field Notes"
|
|
5
|
+
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
datePublished: "2023-09-19"
|
|
8
|
+
author:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
sections:
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
"id": "header",
|
|
15
|
+
"type": "report-header",
|
|
16
|
+
"data":
|
|
17
|
+
{
|
|
18
|
+
"title": "Field Notes",
|
|
19
|
+
"eyebrow": "2023",
|
|
20
|
+
"backHref": "/reports",
|
|
21
|
+
"backLabel": "All reports",
|
|
22
|
+
"tone": "on-dark",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "document",
|
|
27
|
+
"type": "document-viewer",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"src": "/reports/sample-report.pdf",
|
|
31
|
+
"geometry": "16:9",
|
|
32
|
+
"pages": 8,
|
|
33
|
+
"downloadFilename": "field-notes-2023.pdf",
|
|
34
|
+
"outline":
|
|
35
|
+
[
|
|
36
|
+
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
+
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
+
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
]
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
{/_
|
|
46
|
+
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
+
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
+
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
+
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
+
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
+
a wrong number shows as a jump.
|
|
52
|
+
_/}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "ReportPage"
|
|
3
|
+
slug: "platform-shift-2025"
|
|
4
|
+
title: "The {Platform Shift} Report"
|
|
5
|
+
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
datePublished: "2025-03-11"
|
|
8
|
+
author:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
sections:
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
"id": "header",
|
|
15
|
+
"type": "report-header",
|
|
16
|
+
"data":
|
|
17
|
+
{
|
|
18
|
+
"title": "The {Platform Shift} Report",
|
|
19
|
+
"eyebrow": "March 2025",
|
|
20
|
+
"backHref": "/reports",
|
|
21
|
+
"backLabel": "All reports",
|
|
22
|
+
"tone": "on-dark",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "document",
|
|
27
|
+
"type": "document-viewer",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"src": "/reports/sample-report.pdf",
|
|
31
|
+
"geometry": "16:9",
|
|
32
|
+
"pages": 8,
|
|
33
|
+
"downloadFilename": "platform-shift-2025.pdf",
|
|
34
|
+
"outline":
|
|
35
|
+
[
|
|
36
|
+
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
+
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
+
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
]
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
{/_
|
|
46
|
+
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
+
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
+
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
+
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
+
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
+
a wrong number shows as a jump.
|
|
52
|
+
_/}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "ReportPage"
|
|
3
|
+
slug: "state-of-the-market-2026"
|
|
4
|
+
title: "State of {Your Market} 2026"
|
|
5
|
+
description: "{One line on the question this report answers. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
datePublished: "2026-05-14"
|
|
8
|
+
author:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
sections:
|
|
12
|
+
[
|
|
13
|
+
{
|
|
14
|
+
"id": "header",
|
|
15
|
+
"type": "report-header",
|
|
16
|
+
"data":
|
|
17
|
+
{
|
|
18
|
+
"title": "State of {Your Market} 2026",
|
|
19
|
+
"eyebrow": "May 2026",
|
|
20
|
+
"backHref": "/reports",
|
|
21
|
+
"backLabel": "All reports",
|
|
22
|
+
"tone": "on-dark",
|
|
23
|
+
},
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"id": "document",
|
|
27
|
+
"type": "document-viewer",
|
|
28
|
+
"data":
|
|
29
|
+
{
|
|
30
|
+
"src": "/reports/sample-report.pdf",
|
|
31
|
+
"geometry": "16:9",
|
|
32
|
+
"pages": 8,
|
|
33
|
+
"downloadFilename": "state-of-the-market-2026.pdf",
|
|
34
|
+
"outline":
|
|
35
|
+
[
|
|
36
|
+
{ "id": "opening", "label": "Opening", "startPage": 1 },
|
|
37
|
+
{ "id": "findings", "label": "Findings", "startPage": 3 },
|
|
38
|
+
{ "id": "outlook", "label": "Outlook", "startPage": 6 },
|
|
39
|
+
],
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
]
|
|
43
|
+
---
|
|
44
|
+
|
|
45
|
+
{/_
|
|
46
|
+
A PLACEHOLDER report. Its bytes are the signal-collectors module's own sample
|
|
47
|
+
PDF (`apps/web/public/reports/sample-report.pdf`, installed by that module's
|
|
48
|
+
bundle), shared by all four samples so the template ships no binary of its
|
|
49
|
+
own. Point `src` at your real document and set `pages` to its real page
|
|
50
|
+
count — the count reserves the reader's layout before the renderer loads, so
|
|
51
|
+
a wrong number shows as a jump.
|
|
52
|
+
_/}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Service"
|
|
3
|
+
slug: "first-engagement"
|
|
4
|
+
title: "{First engagement}"
|
|
5
|
+
description: "{One line on what this engagement is and who it suits. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
serviceType: "{First engagement}"
|
|
8
|
+
provider:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# {First engagement}
|
|
14
|
+
|
|
15
|
+
{Open with the situation a reader is in when they come looking for this. Two or
|
|
16
|
+
three sentences, no more — the detail belongs under the headings below.}
|
|
17
|
+
|
|
18
|
+
## What it covers
|
|
19
|
+
|
|
20
|
+
- {The first thing you actually do}
|
|
21
|
+
- {The second thing you actually do}
|
|
22
|
+
- {The third thing you actually do}
|
|
23
|
+
|
|
24
|
+
## How it runs
|
|
25
|
+
|
|
26
|
+
{One paragraph on the shape of the engagement: how it starts, how long it runs,
|
|
27
|
+
who is involved on both sides, and what a week looks like.}
|
|
28
|
+
|
|
29
|
+
## What you end up with
|
|
30
|
+
|
|
31
|
+
{One paragraph on the deliverable. Be concrete — name the artefact, not the
|
|
32
|
+
feeling.}
|
|
33
|
+
|
|
34
|
+
## What it costs
|
|
35
|
+
|
|
36
|
+
{One line on the pricing shape — fixed fee, retainer, day rate — and what it
|
|
37
|
+
excludes. Replace with your real numbers, or delete this section and let the
|
|
38
|
+
call do it.}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Service"
|
|
3
|
+
slug: "second-engagement"
|
|
4
|
+
title: "{Second engagement}"
|
|
5
|
+
description: "{One line on what this engagement is and who it suits. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
serviceType: "{Second engagement}"
|
|
8
|
+
provider:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# {Second engagement}
|
|
14
|
+
|
|
15
|
+
{Open with the situation a reader is in when they come looking for this. Two or
|
|
16
|
+
three sentences, no more — the detail belongs under the headings below.}
|
|
17
|
+
|
|
18
|
+
## What it covers
|
|
19
|
+
|
|
20
|
+
- {The first thing you actually do}
|
|
21
|
+
- {The second thing you actually do}
|
|
22
|
+
- {The third thing you actually do}
|
|
23
|
+
|
|
24
|
+
## How it runs
|
|
25
|
+
|
|
26
|
+
{One paragraph on the shape of the engagement: how it starts, how long it runs,
|
|
27
|
+
who is involved on both sides, and what a week looks like.}
|
|
28
|
+
|
|
29
|
+
## What you end up with
|
|
30
|
+
|
|
31
|
+
{One paragraph on the deliverable. Be concrete — name the artefact, not the
|
|
32
|
+
feeling.}
|
|
33
|
+
|
|
34
|
+
## What it costs
|
|
35
|
+
|
|
36
|
+
{One line on the pricing shape — fixed fee, retainer, day rate — and what it
|
|
37
|
+
excludes. Replace with your real numbers, or delete this section and let the
|
|
38
|
+
call do it.}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "Service"
|
|
3
|
+
slug: "third-engagement"
|
|
4
|
+
title: "{Third engagement}"
|
|
5
|
+
description: "{One line on what this engagement is and who it suits. Replace before you launch.}"
|
|
6
|
+
schema:
|
|
7
|
+
serviceType: "{Third engagement}"
|
|
8
|
+
provider:
|
|
9
|
+
"@type": Organization
|
|
10
|
+
name: "Your Company"
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# {Third engagement}
|
|
14
|
+
|
|
15
|
+
{Open with the situation a reader is in when they come looking for this. Two or
|
|
16
|
+
three sentences, no more — the detail belongs under the headings below.}
|
|
17
|
+
|
|
18
|
+
## What it covers
|
|
19
|
+
|
|
20
|
+
- {The first thing you actually do}
|
|
21
|
+
- {The second thing you actually do}
|
|
22
|
+
- {The third thing you actually do}
|
|
23
|
+
|
|
24
|
+
## How it runs
|
|
25
|
+
|
|
26
|
+
{One paragraph on the shape of the engagement: how it starts, how long it runs,
|
|
27
|
+
who is involved on both sides, and what a week looks like.}
|
|
28
|
+
|
|
29
|
+
## What you end up with
|
|
30
|
+
|
|
31
|
+
{One paragraph on the deliverable. Be concrete — name the artefact, not the
|
|
32
|
+
feeling.}
|
|
33
|
+
|
|
34
|
+
## What it costs
|
|
35
|
+
|
|
36
|
+
{One line on the pricing shape — fixed fee, retainer, day rate — and what it
|
|
37
|
+
excludes. Replace with your real numbers, or delete this section and let the
|
|
38
|
+
call do it.}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
---
|
|
2
|
+
type: "ServicesList"
|
|
3
|
+
slug: "services"
|
|
4
|
+
title: "Services"
|
|
5
|
+
description: "The three engagements {your company} offers. Placeholder copy — replace before you launch."
|
|
6
|
+
sections:
|
|
7
|
+
[
|
|
8
|
+
{
|
|
9
|
+
"id": "hero",
|
|
10
|
+
"type": "hero",
|
|
11
|
+
"data":
|
|
12
|
+
{
|
|
13
|
+
"variant": "centered",
|
|
14
|
+
"eyebrow": "Services",
|
|
15
|
+
"headline": "Three ways to work together",
|
|
16
|
+
"subheadline": "{One line on how to choose between them. Name the question a reader is actually asking.}",
|
|
17
|
+
},
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"id": "engagements",
|
|
21
|
+
"type": "items",
|
|
22
|
+
"data":
|
|
23
|
+
{
|
|
24
|
+
"headline": "Engagements",
|
|
25
|
+
"columns": 3,
|
|
26
|
+
"items":
|
|
27
|
+
[
|
|
28
|
+
{
|
|
29
|
+
"title": "{First engagement}",
|
|
30
|
+
"description": "{One line on what it is and who it suits.}",
|
|
31
|
+
"link":
|
|
32
|
+
{
|
|
33
|
+
"label": "Read more",
|
|
34
|
+
"href": "/services/first-engagement",
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"title": "{Second engagement}",
|
|
39
|
+
"description": "{One line on what it is and who it suits.}",
|
|
40
|
+
"link":
|
|
41
|
+
{
|
|
42
|
+
"label": "Read more",
|
|
43
|
+
"href": "/services/second-engagement",
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"title": "{Third engagement}",
|
|
48
|
+
"description": "{One line on what it is and who it suits.}",
|
|
49
|
+
"link":
|
|
50
|
+
{
|
|
51
|
+
"label": "Read more",
|
|
52
|
+
"href": "/services/third-engagement",
|
|
53
|
+
},
|
|
54
|
+
},
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"id": "closing",
|
|
60
|
+
"type": "cta",
|
|
61
|
+
"data":
|
|
62
|
+
{
|
|
63
|
+
"variant": "minimal",
|
|
64
|
+
"headline": "Not sure which one?",
|
|
65
|
+
"description": "{One line inviting the reader to book the call instead of guessing.}",
|
|
66
|
+
"primaryCta": { "label": "Hire me →", "href": "/meet" },
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
]
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
{/_ Placeholder copy. The three detail pages under `content/en/Service/` carry
|
|
73
|
+
the long form; this page is the chooser. _/}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
{
|
|
2
|
+
"slug": "referral",
|
|
3
|
+
"defaultLocale": "en",
|
|
4
|
+
"steps": [
|
|
5
|
+
{
|
|
6
|
+
"key": "introduction",
|
|
7
|
+
"type": "field",
|
|
8
|
+
"copy": {
|
|
9
|
+
"title": {
|
|
10
|
+
"en": "Who should we meet?"
|
|
11
|
+
}
|
|
12
|
+
},
|
|
13
|
+
"fields": [
|
|
14
|
+
{
|
|
15
|
+
"name": "referrer_name",
|
|
16
|
+
"inputType": "text",
|
|
17
|
+
"required": true,
|
|
18
|
+
"mapsTo": "name",
|
|
19
|
+
"copy": {
|
|
20
|
+
"label": {
|
|
21
|
+
"en": "Your name"
|
|
22
|
+
},
|
|
23
|
+
"help": {
|
|
24
|
+
"en": "So we can tell them who sent us."
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"name": "referrer_email",
|
|
30
|
+
"inputType": "email",
|
|
31
|
+
"required": true,
|
|
32
|
+
"mapsTo": "email",
|
|
33
|
+
"copy": {
|
|
34
|
+
"label": {
|
|
35
|
+
"en": "Your email"
|
|
36
|
+
},
|
|
37
|
+
"help": {
|
|
38
|
+
"en": "Where we tell you how it went."
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "referral_details",
|
|
44
|
+
"inputType": "textarea",
|
|
45
|
+
"required": true,
|
|
46
|
+
"minLength": 20,
|
|
47
|
+
"copy": {
|
|
48
|
+
"label": {
|
|
49
|
+
"en": "Who are they, and why them?"
|
|
50
|
+
},
|
|
51
|
+
"placeholder": {
|
|
52
|
+
"en": "Their name, a way to reach them, and one line on why you thought of them."
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
]
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"key": "sent",
|
|
60
|
+
"type": "message",
|
|
61
|
+
"copy": {
|
|
62
|
+
"title": {
|
|
63
|
+
"en": "Thank you — the introduction is in"
|
|
64
|
+
},
|
|
65
|
+
"body": {
|
|
66
|
+
"en": "We will reach out within a few days and let you know either way. Placeholder copy: replace it with what you actually do."
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
]
|
|
71
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# Template manifest — `saas-product`
|
|
2
|
+
|
|
3
|
+
> **Stub (#5626).** Sam split #5470 on 2026-09-15: this tree lands the registered template and the `multi-tenant` delivery fix it depends on; the designed template — compositions, copy, knobs, demo data — is **#5470**, after his design conversation and the composition model (#5618). Everything below § 2 is therefore a roster and a pointer, not a page design. Same generated-file rule as its siblings: once the compositions are approved this file is produced by the manifest generator from the roster (base + module `pageContributions`), each page's MDX `sections`, and `component-catalog.json`.
|
|
4
|
+
|
|
5
|
+
| Field | Value |
|
|
6
|
+
| ----------- | ---------------------------------------------------------------------------------------------------------- |
|
|
7
|
+
| Template | `saas-product` |
|
|
8
|
+
| Level | Pro Plus (`template-level.ts` derives it from `requires`) |
|
|
9
|
+
| `requires` | `[marketing, docs-blog, scheduling, signal-collectors, multi-tenant]` (spec 5462 D12, settled 2026-09-14) |
|
|
10
|
+
| Delivery | licence-checked template bundle (#5441), `installMap` for the provenance record; never in the Free tarball |
|
|
11
|
+
| Own content | **none** — see § 3 |
|
|
12
|
+
|
|
13
|
+
## 1. What this tree carries today
|
|
14
|
+
|
|
15
|
+
| File | Role |
|
|
16
|
+
| ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
|
|
17
|
+
| `ailk-template.json` | the committed `installMap` / `postInstall`; `name`, `version` and `requires` are producer-emitted from `TEMPLATE_MANIFESTS` (record D10) |
|
|
18
|
+
| `provenance.json` | lands at `.ailk-template.json` in the scaffold, naming the template and its `requires` |
|
|
19
|
+
| `TEMPLATE-MANIFEST.md` | this file |
|
|
20
|
+
|
|
21
|
+
`build-module-bundles.mjs --templates saas-product` lists exactly those three plus the emitted root `ailk-template.json` and the proprietary `LICENSE` (#5552 D1).
|
|
22
|
+
|
|
23
|
+
## 2. Roster — the base rows, as the registry declares them
|
|
24
|
+
|
|
25
|
+
`saas-product` reuses `TEMPLATE_BASE_ROSTER` (`template-manifest.ts`) and declares no rows of its own. The ten base routes:
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
/ · /how-it-works · /features · /pricing · /about
|
|
29
|
+
/faq · /contact · /sign-in · /privacy · /terms
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
Module-contributed rows arrive from `MODULE_SLICES[*].pageContributions` and are listed here so the page set reads as one:
|
|
33
|
+
|
|
34
|
+
```
|
|
35
|
+
docs-blog: /blog · /blog/<slug> · /docs · /docs/<slug>
|
|
36
|
+
scheduling: /meet · /meet/<slug> · /meet/confirmed (renamed from the schedule/ route by #5563)
|
|
37
|
+
signal-collectors: /flows/<slug> · /flows/<slug>/start · /flows/<slug>/results/<payload>
|
|
38
|
+
/projects · /projects/<slug> · /projects/apply · /waitlist/<experimentId>
|
|
39
|
+
/thanks/<slug> (per form)
|
|
40
|
+
multi-tenant: no roster row — its whole surface is the separate authed
|
|
41
|
+
`apps/workspace` Next.js app, delivered by the module bundle
|
|
42
|
+
rather than through the roster merge (spec 5470 § Clarifications, D2)
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
## 3. Compositions — pending (#5470)
|
|
46
|
+
|
|
47
|
+
This tree deliberately carries **no `content/`**. Two layers already own the pages a Pro Plus site renders, and duplicating either here would have to be undone when the designed template lands:
|
|
48
|
+
|
|
49
|
+
- the **base pages** (`/`, `/pricing`, `/privacy`, `/terms`, …) arrive with **#5618**'s base layer;
|
|
50
|
+
- the **module pages** (blog, docs, schedule, flows, projects, waitlist, and the whole `apps/workspace` app) arrive with each module's **own bundle**.
|
|
51
|
+
|
|
52
|
+
What **#5470** adds on top, once Sam's design conversation and the composition model (#5618) settle: the per-page section compositions and their order, the verbatim copy, the template knobs, and the demo data a Pro Plus site ships with. Until then a keyed `--template saas-product` install is honest — it delivers the provenance record, cross-checks `requires` against the installing client's registry, and lets every required module deliver its own surface.
|
|
53
|
+
|
|
54
|
+
## 4. Known gaps this manifest depends on
|
|
55
|
+
|
|
56
|
+
| Gap | Issue |
|
|
57
|
+
| --------------------------------------------------------------------------------------- | ----- |
|
|
58
|
+
| The designed template (compositions, copy, knobs, demo) | #5470 |
|
|
59
|
+
| The composition model the design is authored against | #5618 |
|
|
60
|
+
| The `/meet` composition per the Pro manifest (deferred by #5563, blocked on §7 Q1) | #5670 |
|
|
61
|
+
| A full-CLI keyed `--template` success test (the mock registry serves no template bytes) | #5467 |
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "saas-product",
|
|
3
|
+
"requires": [
|
|
4
|
+
"marketing",
|
|
5
|
+
"docs-blog",
|
|
6
|
+
"scheduling",
|
|
7
|
+
"signal-collectors",
|
|
8
|
+
"multi-tenant"
|
|
9
|
+
],
|
|
10
|
+
"extends": "_base",
|
|
11
|
+
"$comment": "Pro Plus template, STUB (#5626). name/version/requires are producer-emitted from TEMPLATE_MANIFESTS at build time and are never the authoritative value on disk (record D10); the committed copy agrees with the registry so the tree and the registry never read as disagreeing. installMap: bundle-relative source -> scaffold-relative destination; the stager reads only installMap/postInstall/patches. This tree carries NO content of its own: the base pages arrive with #5618's base layer and the module pages with each module's own bundle, so the designed template (#5470) drops in as content only, with nothing here to undo.",
|
|
12
|
+
"installMap": {
|
|
13
|
+
"provenance.json": ".ailk-template.json"
|
|
14
|
+
},
|
|
15
|
+
"postInstall": "Template saas-product installed. Its Pro Plus modules - docs-blog, scheduling, signal-collectors and multi-tenant (the authed apps/admin app) - are delivered by their own module bundles. This template's own page compositions, copy and demo data are pending under #5470; until they land it contributes the provenance record and its requires cross-check only, and the scaffold renders each module's own seed content."
|
|
16
|
+
}
|
|
@@ -4,41 +4,32 @@ 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
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
|
17
|
-
|
|
|
18
|
-
| `
|
|
19
|
-
| `
|
|
20
|
-
| `scaffold-auth` | Wire up an auth flow against `@working-theory/auth-client` | coming soon — issue #364 (working-theory-labs/ai-launch-kit) |
|
|
21
|
-
| `audit-site` | Run `ailk audit` and explain the results | coming soon — issue #365 (working-theory-labs/ai-launch-kit) |
|
|
22
|
-
| `add-schema` | Add Product / Service / FAQ schema to an existing page | coming soon — issue #366 (working-theory-labs/ai-launch-kit) |
|
|
23
|
-
| `provision-config` | Generate `vercel.json` and environment templates | coming soon — issue #367 (working-theory-labs/ai-launch-kit) |
|
|
7
|
+
The six skills below ship with this project. Claude Code discovers
|
|
8
|
+
them automatically at session start — nothing to install or enable.
|
|
9
|
+
|
|
10
|
+
## Available skills
|
|
11
|
+
|
|
12
|
+
| Skill | Purpose |
|
|
13
|
+
| ---------------------- | -------------------------------------------------------------------------------------------------------- |
|
|
14
|
+
| `suggest-site-pages` | Recommend a starter set of pages — each tagged with a schema.org type — from a free-text business description. |
|
|
15
|
+
| `scaffold-page` | Generate a new page: App Router route + MDX content stub + typed JSON-LD, in one confirm-before-write pass. |
|
|
16
|
+
| `add-schema` | Add or replace schema.org JSON-LD on a page that already exists. |
|
|
17
|
+
| `scaffold-auth` | Activate auth providers — magic-link via Resend, Google OAuth, GitHub OAuth. |
|
|
18
|
+
| `provision-config` | Emit deploy configuration — `vercel.json`, `.env.example`, and `RUNBOOK.md` — for a Vercel deploy. |
|
|
19
|
+
| `audit-site` | Run `ailk-audit --json` and explain the score and findings in plain language. |
|
|
24
20
|
|
|
25
21
|
`scaffold-commerce` is delivered with the commerce module (`--modules commerce`, licensed).
|
|
26
22
|
|
|
27
|
-
## How a skill
|
|
23
|
+
## How a skill works
|
|
28
24
|
|
|
29
|
-
|
|
30
|
-
subdirectory of the same name, each holding:
|
|
25
|
+
Each subdirectory holds:
|
|
31
26
|
|
|
32
27
|
- `SKILL.md` — when to invoke, what it produces, what it requires.
|
|
33
28
|
- Any supporting prompt fragments, code templates, or reference
|
|
34
29
|
files the skill loads at runtime.
|
|
35
30
|
|
|
36
|
-
Until then, the workflows the skills will perform can still be done
|
|
37
|
-
by hand or by asking Claude Code directly.
|
|
38
|
-
|
|
39
31
|
## Adding your own
|
|
40
32
|
|
|
41
33
|
To add a project-specific skill, create a folder here with a
|
|
42
34
|
`SKILL.md` describing it. Claude Code will discover it automatically
|
|
43
|
-
on session start. See the
|
|
44
|
-
of the format.
|
|
35
|
+
on session start. See the skills above for examples of the format.
|