create-ailk 0.10.0 → 0.11.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 +7 -2
- package/dist/cli.js +5 -1
- package/dist/content-payloads.d.ts +37 -0
- package/dist/content-payloads.js +64 -0
- package/dist/lib/fetch-module.d.ts +3 -3
- package/dist/lib/fetch-module.js +11 -5
- package/dist/lib/fetch-template.d.ts +1 -1
- package/dist/lib/fetch-template.js +7 -4
- package/dist/module-architecture.d.ts +9 -0
- package/dist/module-architecture.js +43 -12
- package/dist/parse-args.d.ts +2 -0
- package/dist/parse-args.js +7 -0
- package/dist/surfaces.js +2 -3
- package/package.json +3 -3
- package/site-templates/marketing-site-free/TEMPLATE-MANIFEST.md +4 -3
- package/templates/.claude/settings.json +12 -0
- package/templates/.env.example +1 -1
- package/templates/CLAUDE.md +38 -22
- package/templates/README.md +12 -12
- package/templates/apps/api/jest.config.cjs +1 -0
- package/templates/apps/api/package.json +1 -0
- package/templates/apps/mcp/CLAUDE.md +23 -10
- package/templates/apps/mcp/__tests__/catalog-drift.test.ts +160 -17
- package/templates/apps/mcp/__tests__/index.test.ts +118 -1
- package/templates/apps/mcp/__tests__/lib/commerce-claim.test.ts +425 -5
- package/templates/apps/mcp/__tests__/module-exclusion.test.ts +67 -3
- package/templates/apps/mcp/__tests__/server.test.ts +162 -1
- package/templates/apps/mcp/src/index.ts +35 -3
- package/templates/apps/mcp/src/lib/commerce-claim.ts +193 -24
- package/templates/apps/mcp/src/server.ts +77 -5
- package/templates/apps/mcp/src/tools/purchase.ts +1 -1
- package/templates/apps/web/app/.well-known/mcp.json/build-manifest.ts +15 -0
- package/templates/apps/web/app/.well-known/mcp.json/route.ts +10 -3
- package/templates/apps/web/src/lib/commerce-claim.ts +15 -6
- package/templates/content/_site.mdx +23 -4
- package/templates/database/CHANGELOG.md +7 -0
- package/templates/database/package.json +1 -1
- package/versions.json +34 -33
- package/templates/.claude/skills/README.md +0 -37
- package/templates/.claude/skills/add-auth/SKILL.md +0 -313
- package/templates/.claude/skills/add-auth/references/env-vars.md +0 -106
- package/templates/.claude/skills/add-auth/references/oauth-app-setup.md +0 -180
- package/templates/.claude/skills/add-page/SKILL.md +0 -260
- package/templates/.claude/skills/add-page/references/page-types.md +0 -123
- package/templates/.claude/skills/add-page/scripts/site-pages.mjs +0 -87
- package/templates/.claude/skills/add-page/templates/comparison-page.mdx.tmpl +0 -99
- package/templates/.claude/skills/add-page/templates/content.mdx.tmpl +0 -18
- package/templates/.claude/skills/add-page/templates/flow-landing-page.mdx.tmpl +0 -43
- package/templates/.claude/skills/add-page/templates/report-page.mdx.tmpl +0 -52
- package/templates/.claude/skills/add-page/templates/reports-list.mdx.tmpl +0 -38
- package/templates/.claude/skills/check-site/SKILL.md +0 -245
- package/templates/.claude/skills/check-site/references/common-errors.md +0 -116
- package/templates/.claude/skills/check-site/references/findings-glossary.md +0 -140
- package/templates/.claude/skills/check-site/references/severity-levels.md +0 -114
- package/templates/.claude/skills/fill-page/SKILL.md +0 -199
- package/templates/.claude/skills/fill-page/profiles/plumbing.yaml +0 -80
- package/templates/.claude/skills/fill-page/references/section-sources.md +0 -41
- package/templates/.claude/skills/setup-database/SKILL.md +0 -156
- package/templates/.claude/skills/setup-database/scripts/verify-inbox.ts +0 -154
- package/templates/.claude/skills/setup-deploy/SKILL.md +0 -312
- package/templates/.claude/skills/setup-deploy/references/runbook-template.md +0 -204
- package/templates/.claude/skills/setup-deploy/references/vercel-json-template.md +0 -98
- package/templates/.claude/skills/update-page/SKILL.md +0 -117
- package/templates/.claude/skills/update-page/scripts/update-page.ts +0 -640
- package/templates/.claude/skills/update-page/templates/redirects.mjs.tmpl +0 -31
- package/templates/.claude/skills/upgrade-plan/SKILL.md +0 -121
- package/templates/.claude/skills/upgrade-plan/references/options.md +0 -24
- package/templates/.claude/skills/upgrade-plan/scripts/upgrade-plan.ts +0 -527
- package/templates/apps/mcp/__tests__/lib/require-paid-tier.test.ts +0 -75
- package/templates/apps/mcp/src/lib/require-paid-tier.ts +0 -44
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Unit tests for the MCP-side require-paid-tier guard.
|
|
3
|
-
*
|
|
4
|
-
* Mocks @working-theory/license `checkLicense` and asserts:
|
|
5
|
-
* - free tier → returns canonical payment_required body
|
|
6
|
-
* - pro tier → returns null (caller proceeds)
|
|
7
|
-
* - checkLicense throws → safe-by-default, returns payment_required
|
|
8
|
-
*/
|
|
9
|
-
|
|
10
|
-
const mockCheckLicense = jest.fn();
|
|
11
|
-
|
|
12
|
-
jest.mock("@working-theory/license", () => ({
|
|
13
|
-
checkLicense: (...args: unknown[]) => mockCheckLicense(...args),
|
|
14
|
-
}));
|
|
15
|
-
|
|
16
|
-
import { requirePaidTier } from "../../src/lib/require-paid-tier.js";
|
|
17
|
-
|
|
18
|
-
describe("requirePaidTier (mcp)", () => {
|
|
19
|
-
beforeEach(() => {
|
|
20
|
-
mockCheckLicense.mockReset();
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
it("free tier — returns canonical payment_required body", async () => {
|
|
24
|
-
mockCheckLicense.mockResolvedValue({
|
|
25
|
-
tier: "free",
|
|
26
|
-
plan: null,
|
|
27
|
-
features: [],
|
|
28
|
-
expiresAt: null,
|
|
29
|
-
revoked: false,
|
|
30
|
-
});
|
|
31
|
-
|
|
32
|
-
const guard = await requirePaidTier();
|
|
33
|
-
|
|
34
|
-
expect(guard).toEqual({
|
|
35
|
-
error: "payment_required",
|
|
36
|
-
message: expect.stringContaining("paid license"),
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
it("pro tier — returns null (caller proceeds)", async () => {
|
|
41
|
-
mockCheckLicense.mockResolvedValue({
|
|
42
|
-
tier: "pro",
|
|
43
|
-
plan: "pro",
|
|
44
|
-
features: [],
|
|
45
|
-
expiresAt: null,
|
|
46
|
-
revoked: false,
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
const guard = await requirePaidTier();
|
|
50
|
-
expect(guard).toBeNull();
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
it("checkLicense throws — degrades to payment_required (safe default)", async () => {
|
|
54
|
-
mockCheckLicense.mockRejectedValue(new Error("boom"));
|
|
55
|
-
|
|
56
|
-
const guard = await requirePaidTier();
|
|
57
|
-
expect(guard).toMatchObject({ error: "payment_required" });
|
|
58
|
-
});
|
|
59
|
-
|
|
60
|
-
it("revoked paid license — returns payment_required even though tier is pro (issue #398)", async () => {
|
|
61
|
-
// After a 403/revoked refresh, checkLicense() returns tier:'pro' until
|
|
62
|
-
// the existing JWT exp (up to 24h). The revoked flag is the early
|
|
63
|
-
// signal — we must close the gate now, not wait for exp.
|
|
64
|
-
mockCheckLicense.mockResolvedValue({
|
|
65
|
-
tier: "pro",
|
|
66
|
-
plan: "pro",
|
|
67
|
-
features: [],
|
|
68
|
-
expiresAt: null,
|
|
69
|
-
revoked: true,
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
const guard = await requirePaidTier();
|
|
73
|
-
expect(guard).toMatchObject({ error: "payment_required" });
|
|
74
|
-
});
|
|
75
|
-
});
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Paid-tier license guard for apps/mcp content-write tools (D14a Stage 0).
|
|
3
|
-
*
|
|
4
|
-
* Calls `checkLicense()` from @working-theory/license and returns a canonical
|
|
5
|
-
* `payment_required` error body for free tier; returns `null` to signal the
|
|
6
|
-
* caller may proceed.
|
|
7
|
-
*
|
|
8
|
-
* Usage in a tool handler:
|
|
9
|
-
*
|
|
10
|
-
* const guard = await requirePaidTier();
|
|
11
|
-
* if (guard) return guard; // free tier — return canonical error body
|
|
12
|
-
* // paid tier — proceed
|
|
13
|
-
*
|
|
14
|
-
* Pattern intentionally returns the error body directly (vs. throwing) — MCP
|
|
15
|
-
* tools surface errors as their result body, not via thrown exceptions.
|
|
16
|
-
*/
|
|
17
|
-
|
|
18
|
-
import { checkLicense } from "@working-theory/license";
|
|
19
|
-
|
|
20
|
-
import { paymentRequiredError, type ErrorBody } from "./errors.js";
|
|
21
|
-
|
|
22
|
-
const FREE_TIER_MESSAGE =
|
|
23
|
-
"This tool requires a paid license. Visit https://ailaunchkit.ai to upgrade.";
|
|
24
|
-
|
|
25
|
-
export async function requirePaidTier(): Promise<ErrorBody | null> {
|
|
26
|
-
let result;
|
|
27
|
-
try {
|
|
28
|
-
result = await checkLicense();
|
|
29
|
-
} catch {
|
|
30
|
-
// Per ADR 0014 — local-verify license; an exception is a bug, not a
|
|
31
|
-
// network failure. Treat as free for safe-by-default gating.
|
|
32
|
-
return paymentRequiredError(FREE_TIER_MESSAGE);
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
// Revoked paid licenses keep verifying until JWT exp (up to 24h after the
|
|
36
|
-
// server reports `revoked`). Closing the gate when `revoked === true`
|
|
37
|
-
// shrinks that window to "next request" without waiting for exp. See
|
|
38
|
-
// packages/license/src/types.ts § LicenseResult and ADR 0014.
|
|
39
|
-
if (result.revoked === true || result.tier === "free") {
|
|
40
|
-
return paymentRequiredError(FREE_TIER_MESSAGE);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
return null;
|
|
44
|
-
}
|