create-ailk 0.10.0 → 0.11.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/README.md +7 -2
  2. package/dist/cli.js +5 -1
  3. package/dist/content-payloads.d.ts +37 -0
  4. package/dist/content-payloads.js +64 -0
  5. package/dist/lib/fetch-module.d.ts +3 -3
  6. package/dist/lib/fetch-module.js +11 -5
  7. package/dist/lib/fetch-template.d.ts +1 -1
  8. package/dist/lib/fetch-template.js +7 -4
  9. package/dist/lib/scaffold-render-sweep.d.ts +16 -0
  10. package/dist/lib/scaffold-render-sweep.js +52 -3
  11. package/dist/module-architecture.d.ts +9 -0
  12. package/dist/module-architecture.js +43 -12
  13. package/dist/parse-args.d.ts +2 -0
  14. package/dist/parse-args.js +7 -0
  15. package/dist/surfaces.js +2 -3
  16. package/package.json +3 -3
  17. package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +4 -3
  18. package/site-templates/shapes/local-business-service/content/en/Service/first-job.mdx +8 -8
  19. package/site-templates/shapes/local-business-service/content/en/Service/second-job.mdx +8 -8
  20. package/site-templates/shapes/local-business-service/content/en/Service/third-job.mdx +8 -8
  21. package/site-templates/shapes/organization-service/content/en/Service/first-engagement.mdx +8 -8
  22. package/site-templates/shapes/organization-service/content/en/Service/second-engagement.mdx +8 -8
  23. package/site-templates/shapes/organization-service/content/en/Service/third-engagement.mdx +8 -8
  24. package/site-templates/shapes/person-service/content/en/Service/first-engagement.mdx +8 -8
  25. package/site-templates/shapes/person-service/content/en/Service/second-engagement.mdx +8 -8
  26. package/site-templates/shapes/person-service/content/en/Service/third-engagement.mdx +8 -8
  27. package/templates/.claude/settings.json +12 -0
  28. package/templates/.env.example +1 -5
  29. package/templates/CLAUDE.md +38 -22
  30. package/templates/README.md +12 -12
  31. package/templates/apps/api/jest.config.cjs +1 -0
  32. package/templates/apps/api/package.json +2 -1
  33. package/templates/apps/mcp/CLAUDE.md +23 -10
  34. package/templates/apps/mcp/__tests__/catalog-drift.test.ts +160 -17
  35. package/templates/apps/mcp/__tests__/index.test.ts +118 -1
  36. package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +425 -5
  37. package/templates/apps/mcp/__tests__/module-exclusion.test.ts +67 -3
  38. package/templates/apps/mcp/__tests__/server.test.ts +162 -1
  39. package/templates/apps/mcp/package.json +1 -1
  40. package/templates/apps/mcp/src/index.ts +35 -3
  41. package/templates/apps/mcp/src/lib/commerce-claim.ts +193 -24
  42. package/templates/apps/mcp/src/server.ts +77 -5
  43. package/templates/apps/mcp/src/tools/purchase.ts +1 -1
  44. package/templates/apps/web/CLAUDE.md +1 -1
  45. package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +15 -0
  46. package/templates/apps/web/app/.well-known/mcp.json/route.ts +10 -3
  47. package/templates/apps/web/app/[locale]/careers/[slug]/page.tsx +0 -10
  48. package/templates/apps/web/app/[locale]/case-studies/[slug]/page.tsx +0 -10
  49. package/templates/apps/web/app/[locale]/courses/[slug]/page.tsx +1 -14
  50. package/templates/apps/web/app/[locale]/events/[slug]/page.tsx +0 -10
  51. package/templates/apps/web/app/[locale]/features/[slug]/page.tsx +0 -10
  52. package/templates/apps/web/app/[locale]/for/[slug]/page.tsx +0 -10
  53. package/templates/apps/web/app/[locale]/how-to/[slug]/page.tsx +1 -14
  54. package/templates/apps/web/app/[locale]/integrations/[slug]/page.tsx +0 -10
  55. package/templates/apps/web/app/[locale]/partners/[slug]/page.tsx +0 -10
  56. package/templates/apps/web/app/[locale]/portfolio/[slug]/page.tsx +0 -10
  57. package/templates/apps/web/app/[locale]/products/[slug]/page.tsx +0 -10
  58. package/templates/apps/web/app/[locale]/projects/[slug]/page.tsx +1 -15
  59. package/templates/apps/web/app/[locale]/resources/[slug]/page.tsx +0 -10
  60. package/templates/apps/web/app/[locale]/services/[slug]/page.tsx +0 -10
  61. package/templates/apps/web/app/[locale]/software/[slug]/page.tsx +0 -10
  62. package/templates/apps/web/app/[locale]/tech-articles/[slug]/page.tsx +1 -14
  63. package/templates/apps/web/app/[locale]/thanks/[slug]/page.tsx +4 -16
  64. package/templates/apps/web/app/[locale]/vs/[slug]/__tests__/page.test.tsx +3 -15
  65. package/templates/apps/web/app/[locale]/vs/[slug]/page.tsx +0 -10
  66. package/templates/apps/web/app/[locale]/whitepapers/[slug]/page.tsx +1 -14
  67. package/templates/apps/web/src/lib/commerce-claim.ts +15 -6
  68. package/templates/content/_site.mdx +23 -4
  69. package/templates/database/CHANGELOG.md +7 -0
  70. package/templates/database/package.json +1 -1
  71. package/versions.json +34 -34
  72. package/templates/.claude/skills/README.md +0 -37
  73. package/templates/.claude/skills/add-auth/SKILL.md +0 -313
  74. package/templates/.claude/skills/add-auth/references/env-vars.md +0 -106
  75. package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +0 -180
  76. package/templates/.claude/skills/add-page/SKILL.md +0 -260
  77. package/templates/.claude/skills/add-page/references/page-types.md +0 -123
  78. package/templates/.claude/skills/add-page/scripts/site-pages.mjs +0 -87
  79. package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +0 -99
  80. package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +0 -18
  81. package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +0 -43
  82. package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +0 -52
  83. package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +0 -38
  84. package/templates/.claude/skills/check-site/SKILL.md +0 -245
  85. package/templates/.claude/skills/check-site/references/common-errors.md +0 -116
  86. package/templates/.claude/skills/check-site/references/findings-glossary.md +0 -140
  87. package/templates/.claude/skills/check-site/references/severity-levels.md +0 -114
  88. package/templates/.claude/skills/fill-page/SKILL.md +0 -199
  89. package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +0 -80
  90. package/templates/.claude/skills/fill-page/references/section-sources.md +0 -41
  91. package/templates/.claude/skills/setup-database/SKILL.md +0 -156
  92. package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +0 -154
  93. package/templates/.claude/skills/setup-deploy/SKILL.md +0 -312
  94. package/templates/.claude/skills/setup-deploy/references/runbook-template.md +0 -204
  95. package/templates/.claude/skills/setup-deploy/references/vercel-json-template.md +0 -98
  96. package/templates/.claude/skills/update-page/SKILL.md +0 -117
  97. package/templates/.claude/skills/update-page/scripts/update-page.ts +0 -640
  98. package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +0 -31
  99. package/templates/.claude/skills/upgrade-plan/SKILL.md +0 -121
  100. package/templates/.claude/skills/upgrade-plan/references/options.md +0 -24
  101. package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +0 -527
  102. package/templates/apps/mcp/__tests__/lib/require-paid-tier.test.ts +0 -75
  103. package/templates/apps/mcp/src/lib/require-paid-tier.ts +0 -44
@@ -11,29 +11,29 @@ schema:
11
11
  name: "Your Company"
12
12
  ---
13
13
 
14
- # {Second job}
14
+ # \{Second job}
15
15
 
16
- {Open with the situation a reader is in when they come looking for this. Two or
16
+ \{Open with the situation a reader is in when they come looking for this. Two or
17
17
  three sentences, no more — the detail belongs under the headings below.}
18
18
 
19
19
  ## What it covers
20
20
 
21
- - {The first thing you actually do}
22
- - {The second thing you actually do}
23
- - {The third thing you actually do}
21
+ - \{The first thing you actually do}
22
+ - \{The second thing you actually do}
23
+ - \{The third thing you actually do}
24
24
 
25
25
  ## How it runs
26
26
 
27
- {One paragraph on the shape of the visit: how it is scheduled, how long it
27
+ \{One paragraph on the shape of the visit: how it is scheduled, how long it
28
28
  takes, who turns up, and what you need from the customer beforehand.}
29
29
 
30
30
  ## What you end up with
31
31
 
32
- {One paragraph on the result. Be concrete — describe the property when the
32
+ \{One paragraph on the result. Be concrete — describe the property when the
33
33
  crew drives away.}
34
34
 
35
35
  ## What it costs
36
36
 
37
- {One line on the pricing shape — flat rate, hourly, or by the job — and what it
37
+ \{One line on the pricing shape — flat rate, hourly, or by the job — and what it
38
38
  excludes. Replace with your real numbers, or delete this section and let a
39
39
  call do it.}
@@ -11,29 +11,29 @@ schema:
11
11
  name: "Your Company"
12
12
  ---
13
13
 
14
- # {Third job}
14
+ # \{Third job}
15
15
 
16
- {Open with the situation a reader is in when they come looking for this. Two or
16
+ \{Open with the situation a reader is in when they come looking for this. Two or
17
17
  three sentences, no more — the detail belongs under the headings below.}
18
18
 
19
19
  ## What it covers
20
20
 
21
- - {The first thing you actually do}
22
- - {The second thing you actually do}
23
- - {The third thing you actually do}
21
+ - \{The first thing you actually do}
22
+ - \{The second thing you actually do}
23
+ - \{The third thing you actually do}
24
24
 
25
25
  ## How it runs
26
26
 
27
- {One paragraph on the shape of the visit: how it is scheduled, how long it
27
+ \{One paragraph on the shape of the visit: how it is scheduled, how long it
28
28
  takes, who turns up, and what you need from the customer beforehand.}
29
29
 
30
30
  ## What you end up with
31
31
 
32
- {One paragraph on the result. Be concrete — describe the property when the
32
+ \{One paragraph on the result. Be concrete — describe the property when the
33
33
  crew drives away.}
34
34
 
35
35
  ## What it costs
36
36
 
37
- {One line on the pricing shape — flat rate, hourly, or by the job — and what it
37
+ \{One line on the pricing shape — flat rate, hourly, or by the job — and what it
38
38
  excludes. Replace with your real numbers, or delete this section and let a
39
39
  call do it.}
@@ -10,29 +10,29 @@ schema:
10
10
  name: "Your Company"
11
11
  ---
12
12
 
13
- # {First engagement}
13
+ # \{First engagement}
14
14
 
15
- {Open with the situation a reader is in when they come looking for this. Two or
15
+ \{Open with the situation a reader is in when they come looking for this. Two or
16
16
  three sentences, no more — the detail belongs under the headings below.}
17
17
 
18
18
  ## What it covers
19
19
 
20
- - {The first thing you actually do}
21
- - {The second thing you actually do}
22
- - {The third thing you actually do}
20
+ - \{The first thing you actually do}
21
+ - \{The second thing you actually do}
22
+ - \{The third thing you actually do}
23
23
 
24
24
  ## How it runs
25
25
 
26
- {One paragraph on the shape of the engagement: how it starts, how long it runs,
26
+ \{One paragraph on the shape of the engagement: how it starts, how long it runs,
27
27
  who is involved on both sides, and what a week looks like.}
28
28
 
29
29
  ## What you end up with
30
30
 
31
- {One paragraph on the deliverable. Be concrete — name the artefact, not the
31
+ \{One paragraph on the deliverable. Be concrete — name the artefact, not the
32
32
  feeling.}
33
33
 
34
34
  ## What it costs
35
35
 
36
- {One line on the pricing shape — fixed fee, retainer, day rate — and what it
36
+ \{One line on the pricing shape — fixed fee, retainer, day rate — and what it
37
37
  excludes. Replace with your real numbers, or delete this section and let the
38
38
  call do it.}
@@ -10,29 +10,29 @@ schema:
10
10
  name: "Your Company"
11
11
  ---
12
12
 
13
- # {Second engagement}
13
+ # \{Second engagement}
14
14
 
15
- {Open with the situation a reader is in when they come looking for this. Two or
15
+ \{Open with the situation a reader is in when they come looking for this. Two or
16
16
  three sentences, no more — the detail belongs under the headings below.}
17
17
 
18
18
  ## What it covers
19
19
 
20
- - {The first thing you actually do}
21
- - {The second thing you actually do}
22
- - {The third thing you actually do}
20
+ - \{The first thing you actually do}
21
+ - \{The second thing you actually do}
22
+ - \{The third thing you actually do}
23
23
 
24
24
  ## How it runs
25
25
 
26
- {One paragraph on the shape of the engagement: how it starts, how long it runs,
26
+ \{One paragraph on the shape of the engagement: how it starts, how long it runs,
27
27
  who is involved on both sides, and what a week looks like.}
28
28
 
29
29
  ## What you end up with
30
30
 
31
- {One paragraph on the deliverable. Be concrete — name the artefact, not the
31
+ \{One paragraph on the deliverable. Be concrete — name the artefact, not the
32
32
  feeling.}
33
33
 
34
34
  ## What it costs
35
35
 
36
- {One line on the pricing shape — fixed fee, retainer, day rate — and what it
36
+ \{One line on the pricing shape — fixed fee, retainer, day rate — and what it
37
37
  excludes. Replace with your real numbers, or delete this section and let the
38
38
  call do it.}
@@ -10,29 +10,29 @@ schema:
10
10
  name: "Your Company"
11
11
  ---
12
12
 
13
- # {Third engagement}
13
+ # \{Third engagement}
14
14
 
15
- {Open with the situation a reader is in when they come looking for this. Two or
15
+ \{Open with the situation a reader is in when they come looking for this. Two or
16
16
  three sentences, no more — the detail belongs under the headings below.}
17
17
 
18
18
  ## What it covers
19
19
 
20
- - {The first thing you actually do}
21
- - {The second thing you actually do}
22
- - {The third thing you actually do}
20
+ - \{The first thing you actually do}
21
+ - \{The second thing you actually do}
22
+ - \{The third thing you actually do}
23
23
 
24
24
  ## How it runs
25
25
 
26
- {One paragraph on the shape of the engagement: how it starts, how long it runs,
26
+ \{One paragraph on the shape of the engagement: how it starts, how long it runs,
27
27
  who is involved on both sides, and what a week looks like.}
28
28
 
29
29
  ## What you end up with
30
30
 
31
- {One paragraph on the deliverable. Be concrete — name the artefact, not the
31
+ \{One paragraph on the deliverable. Be concrete — name the artefact, not the
32
32
  feeling.}
33
33
 
34
34
  ## What it costs
35
35
 
36
- {One line on the pricing shape — fixed fee, retainer, day rate — and what it
36
+ \{One line on the pricing shape — fixed fee, retainer, day rate — and what it
37
37
  excludes. Replace with your real numbers, or delete this section and let the
38
38
  call do it.}
@@ -10,29 +10,29 @@ schema:
10
10
  name: "Your Name"
11
11
  ---
12
12
 
13
- # {First engagement}
13
+ # \{First engagement}
14
14
 
15
- {Open with the situation a reader is in when they come looking for this. Two or
15
+ \{Open with the situation a reader is in when they come looking for this. Two or
16
16
  three sentences, no more — the detail belongs under the headings below.}
17
17
 
18
18
  ## What it covers
19
19
 
20
- - {The first thing you actually do}
21
- - {The second thing you actually do}
22
- - {The third thing you actually do}
20
+ - \{The first thing you actually do}
21
+ - \{The second thing you actually do}
22
+ - \{The third thing you actually do}
23
23
 
24
24
  ## How it runs
25
25
 
26
- {One paragraph on the shape of the engagement: how it starts, how long it runs,
26
+ \{One paragraph on the shape of the engagement: how it starts, how long it runs,
27
27
  who is involved, and what a week looks like.}
28
28
 
29
29
  ## What you end up with
30
30
 
31
- {One paragraph on the deliverable. Be concrete — name the artefact, not the
31
+ \{One paragraph on the deliverable. Be concrete — name the artefact, not the
32
32
  feeling.}
33
33
 
34
34
  ## What it costs
35
35
 
36
- {One line on the pricing shape — fixed fee, retainer, day rate — and what it
36
+ \{One line on the pricing shape — fixed fee, retainer, day rate — and what it
37
37
  excludes. Replace with your real numbers, or delete this section and let the
38
38
  call do it.}
@@ -10,29 +10,29 @@ schema:
10
10
  name: "Your Name"
11
11
  ---
12
12
 
13
- # {Second engagement}
13
+ # \{Second engagement}
14
14
 
15
- {Open with the situation a reader is in when they come looking for this. Two or
15
+ \{Open with the situation a reader is in when they come looking for this. Two or
16
16
  three sentences, no more — the detail belongs under the headings below.}
17
17
 
18
18
  ## What it covers
19
19
 
20
- - {The first thing you actually do}
21
- - {The second thing you actually do}
22
- - {The third thing you actually do}
20
+ - \{The first thing you actually do}
21
+ - \{The second thing you actually do}
22
+ - \{The third thing you actually do}
23
23
 
24
24
  ## How it runs
25
25
 
26
- {One paragraph on the shape of the engagement: how it starts, how long it runs,
26
+ \{One paragraph on the shape of the engagement: how it starts, how long it runs,
27
27
  who is involved, and what a week looks like.}
28
28
 
29
29
  ## What you end up with
30
30
 
31
- {One paragraph on the deliverable. Be concrete — name the artefact, not the
31
+ \{One paragraph on the deliverable. Be concrete — name the artefact, not the
32
32
  feeling.}
33
33
 
34
34
  ## What it costs
35
35
 
36
- {One line on the pricing shape — fixed fee, retainer, day rate — and what it
36
+ \{One line on the pricing shape — fixed fee, retainer, day rate — and what it
37
37
  excludes. Replace with your real numbers, or delete this section and let the
38
38
  call do it.}
@@ -10,29 +10,29 @@ schema:
10
10
  name: "Your Name"
11
11
  ---
12
12
 
13
- # {Third engagement}
13
+ # \{Third engagement}
14
14
 
15
- {Open with the situation a reader is in when they come looking for this. Two or
15
+ \{Open with the situation a reader is in when they come looking for this. Two or
16
16
  three sentences, no more — the detail belongs under the headings below.}
17
17
 
18
18
  ## What it covers
19
19
 
20
- - {The first thing you actually do}
21
- - {The second thing you actually do}
22
- - {The third thing you actually do}
20
+ - \{The first thing you actually do}
21
+ - \{The second thing you actually do}
22
+ - \{The third thing you actually do}
23
23
 
24
24
  ## How it runs
25
25
 
26
- {One paragraph on the shape of the engagement: how it starts, how long it runs,
26
+ \{One paragraph on the shape of the engagement: how it starts, how long it runs,
27
27
  who is involved, and what a week looks like.}
28
28
 
29
29
  ## What you end up with
30
30
 
31
- {One paragraph on the deliverable. Be concrete — name the artefact, not the
31
+ \{One paragraph on the deliverable. Be concrete — name the artefact, not the
32
32
  feeling.}
33
33
 
34
34
  ## What it costs
35
35
 
36
- {One line on the pricing shape — fixed fee, retainer, day rate — and what it
36
+ \{One line on the pricing shape — fixed fee, retainer, day rate — and what it
37
37
  excludes. Replace with your real numbers, or delete this section and let the
38
38
  call do it.}
@@ -11,5 +11,17 @@
11
11
  ]
12
12
  }
13
13
  ]
14
+ },
15
+ "extraKnownMarketplaces": {
16
+ "working-theory": {
17
+ "source": {
18
+ "source": "github",
19
+ "repo": "working-theory-labs/claude-plugins"
20
+ },
21
+ "autoUpdate": true
22
+ }
23
+ },
24
+ "enabledPlugins": {
25
+ "ailk@working-theory": true
14
26
  }
15
27
  }
@@ -50,10 +50,6 @@ CONTENT_ADAPTER=mdx
50
50
  # Developers → Webhooks → <your endpoint> → Signing secret.
51
51
  # Format: whsec_*. Server-only — must NOT be prefixed with NEXT_PUBLIC_.
52
52
  # STRIPE_WEBHOOK_SECRET=
53
- # Internal URL of the billing service — used by marketing-api's webhook
54
- # proxy (POST /v1/webhooks/stripe) to forward verified deliveries. Format:
55
- # https://<vercel-deployment>.vercel.app (no trailing slash, no path).
56
- # BILLING_SERVICE_URL=
57
53
 
58
54
  # ── Auth (Better Auth — apps/web only) ───────────────────────────────────────
59
55
  # BETTER_AUTH_URL=http://localhost:3000
@@ -314,7 +310,7 @@ CONTENT_ADAPTER=mdx
314
310
  # AILK_LICENSE_KEY=
315
311
  # Override the daily refresh upstream (self-hosters point at their own server
316
312
  # implementing the @working-theory/validation refresh contract).
317
- # Default: https://ailaunchkit.ai/api/license/refresh
313
+ # Default: https://api.ailaunchkit.ai/v1/licenses/refresh
318
314
  # AILK_LICENSE_REFRESH_URL=
319
315
  # Self-host override — replaces the bundled public key with a PEM-encoded one.
320
316
  # Only set this if you operate your own license-signing infrastructure.
@@ -21,7 +21,7 @@ apps/api/ Fastify HTTP API — lead capture, checkout, webhooks
21
21
  apps/mcp/ MCP server — agent-callable tools
22
22
  database/ Prisma schema + migrations
23
23
  content/ Site settings (_site.mdx) and MDX pages (en/<TypeName>/)
24
- .claude/ Rules, skills and agent definitions for Claude Code
24
+ .claude/ Rules, the agent definition and settings for Claude Code
25
25
  tools/ This repo's own checks (architecture, CLAUDE.md drift)
26
26
  ```
27
27
 
@@ -67,7 +67,7 @@ your module set; `pnpm architecture` enforces it, and a hook in
67
67
  | Diff hygiene when editing existing files | `.claude/rules/preserve-existing-style.md` |
68
68
  | Code style, testing, security | `CONVENTIONS.md` |
69
69
  | Environment variables and what they unlock | `.env.example` |
70
- | Deploy configuration | `apps/api/vercel.json`; the `setup-deploy` skill |
70
+ | Deploy configuration | `apps/api/vercel.json`; the `/ailk:setup-deploy` skill |
71
71
  | Verification before push | `pnpm preflight` (see § Checks) |
72
72
 
73
73
  <!-- /ailk:template id="resource-map" -->
@@ -76,18 +76,34 @@ your module set; `pnpm architecture` enforces it, and a hook in
76
76
 
77
77
  ## Skills
78
78
 
79
- In `.claude/skills/`; Claude Code finds them at session start.
79
+ The AI Launch Kit skills come from the `ailk` Claude Code plugin, not from
80
+ this repo. `.claude/settings.json` names its marketplace and enables it, so
81
+ Claude Code loads it once you trust this folder. To install it by hand, run
82
+ these two lines in a Claude Code session:
80
83
 
81
- | Skill | Use when |
82
- | ---------------- | ----------------------------------------------------------------- |
83
- | `add-page` | You need a new page, or extra JSON-LD on an existing one |
84
- | `update-page` | A page should live at a different URL, or needs a new title |
85
- | `fill-page` | A page still carries `{placeholder}` copy |
86
- | `check-site` | You want the site's citation-readiness score and findings |
87
- | `setup-database` | Leads should land in a database inbox at `/leads` |
88
- | `setup-deploy` | You are ready to deploy to Vercel |
89
- | `add-auth` | Visitors need to sign in (email, Google, GitHub) |
90
- | `upgrade-plan` | You are weighing Free against a paid level or the commerce add-on |
84
+ ```
85
+ /plugin marketplace add working-theory-labs/claude-plugins
86
+ /plugin install ailk@working-theory
87
+ ```
88
+
89
+ | Skill | Use when |
90
+ | ---------------------- | ----------------------------------------------------------------- |
91
+ | `/ailk:add-page` | You need a new page, or extra JSON-LD on an existing one |
92
+ | `/ailk:update-page` | A page should live at a different URL, or needs a new title |
93
+ | `/ailk:fill-page` | A page still carries `{placeholder}` copy |
94
+ | `/ailk:check-site` | You want the site's citation-readiness score and findings |
95
+ | `/ailk:setup-database` | Leads should land in a database inbox at `/leads` |
96
+ | `/ailk:setup-deploy` | You are ready to deploy to Vercel |
97
+ | `/ailk:add-auth` | Visitors need to sign in (email, Google, GitHub) |
98
+ | `/ailk:upgrade-plan` | You are weighing Free against a paid level or the commerce add-on |
99
+
100
+ A repo scaffolded by an earlier create-ailk also carries its own older
101
+ copies of these skills. Once the plugin is installed, delete those copies;
102
+ keep scaffold-commerce, which the commerce module delivers.
103
+
104
+ For design work, the third-party impeccable plugin is optional:
105
+ `/plugin marketplace add pbakaus/impeccable`, then
106
+ `/plugin install impeccable@impeccable`.
91
107
 
92
108
  <!-- /ailk:template id="skills" -->
93
109
 
@@ -95,15 +111,15 @@ In `.claude/skills/`; Claude Code finds them at session start.
95
111
 
96
112
  ## Checks
97
113
 
98
- | Command | Catches |
99
- | ---------------------- | -------------------------------------------------------- |
100
- | `pnpm preflight` | The next four and `build`, not `test`. Run before a push |
101
- | `pnpm architecture` | An import that crosses a boundary in `architecture.yaml` |
102
- | `pnpm claude-md:check` | A hand-edit inside a template-owned section of this file |
103
- | `pnpm type-check` | Type errors in every workspace |
104
- | `pnpm lint` | Lint errors in every workspace |
105
- | `pnpm test` | Failing unit tests |
106
- | `check-site` skill | Missing or invalid JSON-LD, weak citation-readiness |
114
+ | Command | Catches |
115
+ | ------------------------ | -------------------------------------------------------- |
116
+ | `pnpm preflight` | The next four and `build`, not `test`. Run before a push |
117
+ | `pnpm architecture` | An import that crosses a boundary in `architecture.yaml` |
118
+ | `pnpm claude-md:check` | A hand-edit inside a template-owned section of this file |
119
+ | `pnpm type-check` | Type errors in every workspace |
120
+ | `pnpm lint` | Lint errors in every workspace |
121
+ | `pnpm test` | Failing unit tests |
122
+ | `/ailk:check-site` skill | Missing or invalid JSON-LD, weak citation-readiness |
107
123
 
108
124
  <!-- /ailk:template id="checks" -->
109
125
 
@@ -73,7 +73,7 @@ A page marked `--shape organization-product` is in your site when you scaffolded
73
73
 
74
74
  To customize the home page, edit [`content/en/HomePage/home.mdx`](./content/en/HomePage/home.mdx). Save and reload the dev server. No build step.
75
75
 
76
- To add a new page, ask Claude Code to run the `add-page` skill — it writes the page's content file and nav link in one confirm-before-write pass, and adds a missing route with `create-ailk add-route` first. See [Skills](#skills).
76
+ To add a new page, ask Claude Code to run the `/ailk:add-page` skill — it writes the page's content file and nav link in one confirm-before-write pass, and adds a missing route with `create-ailk add-route` first. See [Skills](#skills).
77
77
 
78
78
  > `content/_site.mdx` stays at the top level (not under `content/en/`) — site identity is locale-blind.
79
79
 
@@ -200,20 +200,20 @@ Change the ranges by hand. Below 1.0 a caret range (`^0.26.0`) never crosses a m
200
200
 
201
201
  ## Skills
202
202
 
203
- This project ships Claude Code skills in `.claude/skills/`. Claude Code discovers them at session start — ask for one by name.
203
+ The AI Launch Kit skills come from the `ailk` Claude Code plugin; `.claude/settings.json` names it, and CLAUDE.md § Skills has the two install lines.
204
204
 
205
205
  <!-- generated:begin skills -->
206
206
 
207
- | Skill | What it does |
208
- | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
209
- | `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. |
210
- | `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. |
211
- | `add-auth` | Activate auth providers — magic-link via Resend, Google OAuth, GitHub OAuth. |
212
- | `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. |
213
- | `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`. |
214
- | `check-site` | Run `ailk-audit --json` and explain the score and findings in plain language. |
215
- | `fill-page` | Fill one page's section content from a category profile: labelled sample content (tier 1) or your own first draft from a short intake (tier 2). |
216
- | `upgrade-plan` | Compare Free, Pro, Pro Plus, Agency and the commerce add-on side by side, with the prices the public pricing page publishes right now, and recommend one option for this site with a reason. |
207
+ | Skill | What it does |
208
+ | ---------------------- | --------------------------------------------------------------------------------------------------------------------------------------- |
209
+ | `/ailk:add-auth` | Activate the site's sign-in providers (email-and-password, Google OAuth, GitHub OAuth) and write the env vars for the ones you pick. |
210
+ | `/ailk:add-page` | Add a new page — its content file, its structured data and its nav link — in one confirm-before-write pass. |
211
+ | `/ailk:check-site` | Run `ailk-audit` on the site and explain the score and findings in plain language. It never edits files. |
212
+ | `/ailk:fill-page` | Fill one existing page's section content from a category profile: labelled sample content, or your own first draft from a short intake. |
213
+ | `/ailk:setup-database` | Take the site from no database to a working lead inbox, and prove it with one test message that must appear in the inbox. |
214
+ | `/ailk:setup-deploy` | Emit deploy configuration — `vercel.json` and `RUNBOOK.md`, plus an env checklist read from the site's own `.env.example`. |
215
+ | `/ailk:update-page` | Rename a page — its URL, its title, or both — in one plan-then-confirm pass, with a permanent redirect from the old URL. |
216
+ | `/ailk:upgrade-plan` | Explain the AI Launch Kit options side by side, recommend one option for this site, and link the public pricing page for prices. |
217
217
 
218
218
  <!-- generated:end -->
219
219
 
@@ -64,6 +64,7 @@ module.exports = {
64
64
  '^@working-theory/schema-pack-registry$': '<rootDir>/../../packages/schema-pack-registry/src/index.ts',
65
65
  '^@working-theory/schema-validator$': '<rootDir>/../../packages/schema-validator/src/index.ts',
66
66
  '^@working-theory/stripe-client$': '<rootDir>/../../packages/stripe-client/src/index.ts',
67
+ '^@working-theory/metadata$': '<rootDir>/../../packages/metadata/src/index.ts',
67
68
  '^@working-theory/validation$': '<rootDir>/../../packages/validation/src/index.ts',
68
69
  '^(\\.{1,2}/.*)\\.js$': '$1',
69
70
  },
@@ -49,7 +49,7 @@
49
49
  "@working-theory/stripe-client": "workspace:*",
50
50
  "@working-theory/validation": "workspace:*",
51
51
  "dotenv": "^17.4.2",
52
- "fastify": "^5.12.1",
52
+ "fastify": "^5.12.5",
53
53
  "pdf-lib": "^1.17.1",
54
54
  "pg": "^8.22.0",
55
55
  "yaml": "^2.9.0",
@@ -60,6 +60,7 @@
60
60
  "@types/node": "^22.20.0",
61
61
  "@types/pg": "^8.20.0",
62
62
  "@vercel/node": "^5.8.22",
63
+ "@working-theory/metadata": "workspace:*",
63
64
  "jest": "^30.4.2",
64
65
  "pdfjs-dist": "^6.3.289",
65
66
  "prisma": "^7.8.0",
@@ -25,8 +25,8 @@ Every tool maps 1:1 to an `apps/api` endpoint. When you change a tool, change th
25
25
  **Read (9):** `list_pages`, `read_content`, `search_content`, `get_site_info`, `get_business_hours`, `get_locations`, `get_offerings`, `get_pricing`, `get_faq`
26
26
  **Conversion-write (3):** `capture_lead`, `subscribe_newsletter`, `request_callback`
27
27
  **Maintenance (2):** `audit`, `create_project`
28
- **Flow (2):** `get_flow`, `submit_flow_step` — module-gated (`module: "signal-collectors"`, D-48, #5366): identity-blind and free of any `requirePaidTier()` call like every tool in this list, but registered only when the signal-collectors module is present, the same shape Booking below already has
29
- **Booking (3):** `list_availability`, `get_event_meta`, `create_booking` — module-gated (`module: "scheduling"`)
28
+ **Flow (2):** `get_flow`, `submit_flow_step` — module-gated (`module: "signal-collectors"`, D-48, #5366) and licence-feature-tagged (`feature: "flows-deliverables"`, #7136): identity-blind like every tool in this list, registered only when the signal-collectors module is present, and gated on the deployment's `flows-deliverables` licence feature under `MCP_FEATURE_GATE_MODE`, the same shape Booking below has
29
+ **Booking (3):** `list_availability`, `get_event_meta`, `create_booking` — module-gated (`module: "scheduling"`) and licence-feature-tagged (`feature: "scheduling"`, #7136), gated on the deployment's `scheduling` licence feature under `MCP_FEATURE_GATE_MODE`
30
30
 
31
31
  ### Why the parity test counts 20 and a keyless server registers 19
32
32
 
@@ -41,11 +41,21 @@ Every tool maps 1:1 to an `apps/api` endpoint. When you change a tool, change th
41
41
  `addon: "commerce"`, so it is the one entry whose presence depends on the
42
42
  licence — 19 without the claim, 20 with it.
43
43
  - **19 free anonymous tools**: since #5853 retired the three content-write
44
- tools, NO registered tool is gated at call time by `requirePaidTier()`, so
45
- every registered tool is free and anonymous. The five carrying `tier: "pro"`
44
+ tools, every registered tool remains anonymous — call-time gating checks a
45
+ licence claim, never an identity. The five carrying `tier: "pro"`
46
46
  (`get_flow`, `submit_flow_step`, `list_availability`, `get_event_meta`,
47
- `create_booking`) are MODULE-gated at registration, not payment-gated at
48
- call time — the shape the Flow and Booking rows above describe.
47
+ `create_booking`) are gated at REGISTRATION **and at call time** (#7315):
48
+ each needs its module, and each catalog row names the licence `feature:`
49
+ that entitles it. `start_purchase` is gated at call time by both this
50
+ server-wide gate and its own Gate 2 in `tools/purchase.ts`.
51
+ `MCP_FEATURE_GATE_MODE` (`packages/metadata`) decides what an unheld
52
+ feature does. In `"warn"` mode (this release) the five register on module
53
+ presence alone, and `index.ts` logs one boot warning (stderr) per tool
54
+ served without its feature. In `"refuse"` mode (the next release) they
55
+ also need the deployment's licence to hold the feature, and
56
+ `/.well-known/mcp.json` drops them in step. The claim is resolved at boot
57
+ and re-read every `MCP_CLAIM_REFRESH_MS` through `checkLicense()`
58
+ (`lib/commerce-claim.ts`) and fails closed.
49
59
  `index.ts` is the transport entry point and exports no tools — registration
50
60
  is entirely via `createMcpServer`.
51
61
 
@@ -69,7 +79,8 @@ Every tool maps 1:1 to an `apps/api` endpoint. When you change a tool, change th
69
79
  `commerce` licence claim, per its `addon: "commerce"` catalog marker. A
70
80
  keyless site advertises it in neither the discovery manifest nor the running
71
81
  server's tool list, and calling it by name there returns the module-disabled
72
- `not_found` body. The claim is resolved once at boot
82
+ `not_found` body. The claim is resolved at boot and re-read every
83
+ `MCP_CLAIM_REFRESH_MS`
73
84
  (`src/lib/commerce-claim.ts`, awaited in `src/index.ts`) and read
74
85
  synchronously by both the registration filter and the handler's own
75
86
  re-check. Calls are rate-limited per IP by the AbuseGuard
@@ -111,14 +122,16 @@ Example (lead routing):
111
122
  ## What NOT to do
112
123
 
113
124
  - Don't add identity arguments to OSS tools.
114
- - Don't expose a Pro tool without its `requirePaidTier()` gate.
125
+ - Don't add a paid tool without a `feature:` marker on its catalog row — registration and the manifest gate on the deployment's claim, never on a caller-supplied key or argument.
115
126
  - Don't import `@working-theory/*` from `apps/mcp`.
116
127
  - Don't add a tool without the matching `apps/api` endpoint.
117
128
  - Don't put business logic in tool handlers — they're adapters.
118
129
 
119
- Last updated: 2026-09-17 — #5971: `start_purchase` re-enabled behind the `commerce` licence claim. `OSS_DISABLED_TOOLS` is now empty; the registered count is 19 on a keyless deployment and 20 on a commerce-claimed one; the tool's input field is `productCode` (was `priceId`), matching its HTTP twin; a per-IP daily cap (`MCP_ABUSE_START_PURCHASE_DAILY_CAP`) covers it.
130
+ Last updated: 2026-09-29 — #7136: the five `tier: "pro"` tools name their licence `feature:` (`scheduling`, `flows-deliverables`) and gate on the deployment's own claim under `MCP_FEATURE_GATE_MODE` — `"warn"` this release (served, one boot warning each), `"refuse"` the next. The unused call-time paid-tier guard is deleted.
120
131
 
121
- Prior: 2026-07-09 — corrected the tool-count explanation (18 catalog → 17 registered → 14 free anonymous) and the Pro-tool gating (registered + `requirePaidTier()`-gated, not `OSS_DISABLED_TOOLS`-disabled).
132
+ Prior: 2026-09-17 — #5971: `start_purchase` re-enabled behind the `commerce` licence claim. `OSS_DISABLED_TOOLS` is now empty; the registered count is 19 on a keyless deployment and 20 on a commerce-claimed one; the tool's input field is `productCode` (was `priceId`), matching its HTTP twin; a per-IP daily cap (`MCP_ABUSE_START_PURCHASE_DAILY_CAP`) covers it.
133
+
134
+ Prior: 2026-07-09 — corrected the tool-count explanation (18 catalog → 17 registered → 14 free anonymous) and the Pro-tool gating (registered + gated by the call-time paid-tier guard, not `OSS_DISABLED_TOOLS`-disabled).
122
135
 
123
136
  Last updated: 2026-09-17 — doc-sync: tool counts "23 catalog → 22 registered → 19 free anonymous" → "20 in TOOLS → 19 registered → 19 free anonymous", and the Pro-tools section rewritten to record that `create_page`/`update_page`/`delete_page` were RETIRED by #5853 rather than disabled (D7) — derived from `packages/metadata/src/mcp-tool-catalog.ts` and verified against `apps/mcp/src/server.ts`.
124
137