specforge-mcp 0.14.1 → 0.15.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.
Files changed (107) hide show
  1. package/dist/config/license-plans.json +86 -0
  2. package/dist/engine/license-validator/config-loader.d.ts +5 -0
  3. package/dist/engine/license-validator/config-loader.d.ts.map +1 -0
  4. package/dist/engine/license-validator/config-loader.js +16 -0
  5. package/dist/engine/license-validator/config-loader.js.map +1 -0
  6. package/dist/engine/license-validator/core.d.ts +9 -0
  7. package/dist/engine/license-validator/core.d.ts.map +1 -0
  8. package/dist/engine/license-validator/core.js +108 -0
  9. package/dist/engine/license-validator/core.js.map +1 -0
  10. package/dist/engine/license-validator/lemon-squeezy.d.ts +5 -0
  11. package/dist/engine/license-validator/lemon-squeezy.d.ts.map +1 -0
  12. package/dist/engine/license-validator/lemon-squeezy.js +51 -0
  13. package/dist/engine/license-validator/lemon-squeezy.js.map +1 -0
  14. package/dist/engine/license-validator.d.ts +4 -0
  15. package/dist/engine/license-validator.d.ts.map +1 -0
  16. package/dist/engine/license-validator.js +5 -0
  17. package/dist/engine/license-validator.js.map +1 -0
  18. package/dist/index.js +10 -0
  19. package/dist/index.js.map +1 -1
  20. package/dist/storage/index.d.ts +1 -0
  21. package/dist/storage/index.d.ts.map +1 -1
  22. package/dist/storage/index.js +1 -0
  23. package/dist/storage/index.js.map +1 -1
  24. package/dist/storage/license-store.d.ts +6 -0
  25. package/dist/storage/license-store.d.ts.map +1 -0
  26. package/dist/storage/license-store.js +49 -0
  27. package/dist/storage/license-store.js.map +1 -0
  28. package/dist/tools/activate-license.d.ts +6 -0
  29. package/dist/tools/activate-license.d.ts.map +1 -0
  30. package/dist/tools/activate-license.js +112 -0
  31. package/dist/tools/activate-license.js.map +1 -0
  32. package/dist/tools/create-spec.d.ts.map +1 -1
  33. package/dist/tools/create-spec.js +9 -0
  34. package/dist/tools/create-spec.js.map +1 -1
  35. package/dist/tools/init-project/handler.d.ts.map +1 -1
  36. package/dist/tools/init-project/handler.js +12 -1
  37. package/dist/tools/init-project/handler.js.map +1 -1
  38. package/dist/tools/license-gate.d.ts +5 -0
  39. package/dist/tools/license-gate.d.ts.map +1 -0
  40. package/dist/tools/license-gate.js +64 -0
  41. package/dist/tools/license-gate.js.map +1 -0
  42. package/dist/tools/license-status.d.ts +3 -0
  43. package/dist/tools/license-status.d.ts.map +1 -0
  44. package/dist/tools/license-status.js +39 -0
  45. package/dist/tools/license-status.js.map +1 -0
  46. package/dist/tools/register-agent-tools.d.ts.map +1 -1
  47. package/dist/tools/register-agent-tools.js +2 -1
  48. package/dist/tools/register-agent-tools.js.map +1 -1
  49. package/dist/tools/register-context-tools.d.ts.map +1 -1
  50. package/dist/tools/register-context-tools.js +3 -2
  51. package/dist/tools/register-context-tools.js.map +1 -1
  52. package/dist/tools/register-event-tools.d.ts.map +1 -1
  53. package/dist/tools/register-event-tools.js +2 -1
  54. package/dist/tools/register-event-tools.js.map +1 -1
  55. package/dist/tools/register-governance-tools.d.ts.map +1 -1
  56. package/dist/tools/register-governance-tools.js +2 -1
  57. package/dist/tools/register-governance-tools.js.map +1 -1
  58. package/dist/tools/register-learning-tools.js +2 -2
  59. package/dist/tools/register-learning-tools.js.map +1 -1
  60. package/dist/tools/register-license-tools.d.ts +3 -0
  61. package/dist/tools/register-license-tools.d.ts.map +1 -0
  62. package/dist/tools/register-license-tools.js +44 -0
  63. package/dist/tools/register-license-tools.js.map +1 -0
  64. package/dist/tools/register-memory-tools.d.ts.map +1 -1
  65. package/dist/tools/register-memory-tools.js +3 -2
  66. package/dist/tools/register-memory-tools.js.map +1 -1
  67. package/dist/tools/register-migration-tools.d.ts.map +1 -1
  68. package/dist/tools/register-migration-tools.js +2 -1
  69. package/dist/tools/register-migration-tools.js.map +1 -1
  70. package/dist/tools/register-platform-tools/design-stack-tools.d.ts.map +1 -1
  71. package/dist/tools/register-platform-tools/design-stack-tools.js +10 -10
  72. package/dist/tools/register-platform-tools/design-stack-tools.js.map +1 -1
  73. package/dist/tools/register-platform-tools/lifecycle-infra-tools.js +7 -7
  74. package/dist/tools/register-platform-tools/lifecycle-infra-tools.js.map +1 -1
  75. package/dist/tools/register-readiness-tools.d.ts.map +1 -1
  76. package/dist/tools/register-readiness-tools.js +3 -2
  77. package/dist/tools/register-readiness-tools.js.map +1 -1
  78. package/dist/tools/register-scope-tools.d.ts.map +1 -1
  79. package/dist/tools/register-scope-tools.js +3 -2
  80. package/dist/tools/register-scope-tools.js.map +1 -1
  81. package/dist/tools/register-security-tools.d.ts.map +1 -1
  82. package/dist/tools/register-security-tools.js +2 -1
  83. package/dist/tools/register-security-tools.js.map +1 -1
  84. package/dist/tools/register-spec-tools/analysis-tools.js +6 -6
  85. package/dist/tools/register-spec-tools/analysis-tools.js.map +1 -1
  86. package/dist/tools/register-spec-tools/core-spec-tools.js +2 -2
  87. package/dist/tools/register-spec-tools/core-spec-tools.js.map +1 -1
  88. package/dist/tools/register-stack-tools.d.ts.map +1 -1
  89. package/dist/tools/register-stack-tools.js +4 -3
  90. package/dist/tools/register-stack-tools.js.map +1 -1
  91. package/dist/tools/register-workflow-tools.d.ts.map +1 -1
  92. package/dist/tools/register-workflow-tools.js +2 -1
  93. package/dist/tools/register-workflow-tools.js.map +1 -1
  94. package/dist/tools/safe-handler.d.ts +8 -0
  95. package/dist/tools/safe-handler.d.ts.map +1 -1
  96. package/dist/tools/safe-handler.js +11 -0
  97. package/dist/tools/safe-handler.js.map +1 -1
  98. package/dist/types/index.d.ts +1 -0
  99. package/dist/types/index.d.ts.map +1 -1
  100. package/dist/types/index.js +1 -0
  101. package/dist/types/index.js.map +1 -1
  102. package/dist/types/licensing.d.ts +98 -0
  103. package/dist/types/licensing.d.ts.map +1 -0
  104. package/dist/types/licensing.js +4 -0
  105. package/dist/types/licensing.js.map +1 -0
  106. package/package.json +1 -1
  107. package/src/config/license-plans.json +86 -0
@@ -0,0 +1,86 @@
1
+ {
2
+ "tiers": {
3
+ "free": {
4
+ "maxProjects": 2,
5
+ "maxActiveSpecs": 5
6
+ },
7
+ "pro": {
8
+ "maxProjects": 10,
9
+ "maxActiveSpecs": 999999
10
+ },
11
+ "team": {
12
+ "maxProjects": 999999,
13
+ "maxActiveSpecs": 999999
14
+ },
15
+ "enterprise": {
16
+ "maxProjects": 999999,
17
+ "maxActiveSpecs": 999999
18
+ }
19
+ },
20
+ "freeTools": [
21
+ "set_locale",
22
+ "init_project",
23
+ "init_constitution",
24
+ "clarify_requirements",
25
+ "create_spec",
26
+ "list_specs",
27
+ "update_status",
28
+ "estimate",
29
+ "validate",
30
+ "detect_drift",
31
+ "summarize_spec",
32
+ "generate_execution_plan",
33
+ "generate_tests",
34
+ "generate_docs",
35
+ "suggest_stack",
36
+ "check_versions",
37
+ "manage_git",
38
+ "learn_pattern",
39
+ "consult_docs",
40
+ "facilitate",
41
+ "check_config_health"
42
+ ],
43
+ "proTools": [
44
+ "audit",
45
+ "audit_stack",
46
+ "capture_learning",
47
+ "challenge_spec",
48
+ "check_readiness",
49
+ "contribute_context",
50
+ "context_budget",
51
+ "data_governance",
52
+ "define_ui_contract",
53
+ "design_schema",
54
+ "detect_agent",
55
+ "detect_contradictions",
56
+ "detect_deprecations",
57
+ "discover_mcps",
58
+ "event_contracts",
59
+ "generate_adr",
60
+ "generate_checklist",
61
+ "generate_orchestration_script",
62
+ "generate_rules",
63
+ "generate_skill",
64
+ "generate_sub_agent",
65
+ "integrate_pm",
66
+ "log_decision",
67
+ "manage_context",
68
+ "manage_scope",
69
+ "migrate_tech",
70
+ "orchestrate",
71
+ "orchestrate_agents",
72
+ "package_handoff",
73
+ "paradigm_report",
74
+ "plan_upgrade",
75
+ "reality_check",
76
+ "reconcile_spec",
77
+ "request_context",
78
+ "reverse_engineer",
79
+ "security_check",
80
+ "suggest_mcps",
81
+ "suggest_tooling",
82
+ "validate_workflow"
83
+ ],
84
+ "alwaysAllowed": ["activate_license", "license_status"],
85
+ "upgradeUrl": "https://specforge.dev/pricing"
86
+ }
@@ -0,0 +1,5 @@
1
+ import type { LicensePlanConfig } from '../../types/index.js';
2
+ export declare function loadLicensePlans(): LicensePlanConfig;
3
+ /** Reset cache — used in tests. */
4
+ export declare function resetPlanCache(): void;
5
+ //# sourceMappingURL=config-loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.d.ts","sourceRoot":"","sources":["../../../src/engine/license-validator/config-loader.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAM9D,wBAAgB,gBAAgB,IAAI,iBAAiB,CAMpD;AAED,mCAAmC;AACnC,wBAAgB,cAAc,IAAI,IAAI,CAErC"}
@@ -0,0 +1,16 @@
1
+ // engine/license-validator/config-loader.ts — Loads and caches license-plans.json config.
2
+ import { createRequire } from 'node:module';
3
+ const require = createRequire(import.meta.url);
4
+ let cached = null;
5
+ export function loadLicensePlans() {
6
+ if (cached) {
7
+ return cached;
8
+ }
9
+ cached = require('../../config/license-plans.json');
10
+ return cached;
11
+ }
12
+ /** Reset cache — used in tests. */
13
+ export function resetPlanCache() {
14
+ cached = null;
15
+ }
16
+ //# sourceMappingURL=config-loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-loader.js","sourceRoot":"","sources":["../../../src/engine/license-validator/config-loader.ts"],"names":[],"mappings":"AAAA,0FAA0F;AAC1F,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAI5C,MAAM,OAAO,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAE/C,IAAI,MAAM,GAA6B,IAAI,CAAC;AAE5C,MAAM,UAAU,gBAAgB;IAC9B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,MAAM,GAAG,OAAO,CAAC,iCAAiC,CAAsB,CAAC;IACzE,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,mCAAmC;AACnC,MAAM,UAAU,cAAc;IAC5B,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { PricingTier, LicenseState, LicenseCheckResult, TierLimits } from '../../types/index.js';
2
+ export declare function resolveCurrentTier(state: LicenseState | null): PricingTier;
3
+ export declare function variantToTier(variantName: string): PricingTier;
4
+ export declare function isToolAllowed(toolName: string, tier: PricingTier): boolean;
5
+ export declare function checkToolAccess(toolName: string, tier: PricingTier): LicenseCheckResult;
6
+ export declare function getTierLimits(tier: PricingTier): TierLimits;
7
+ export declare function checkLimits(tier: PricingTier, currentCount: number, limitType: 'maxProjects' | 'maxActiveSpecs'): LicenseCheckResult;
8
+ export declare function isValidationFresh(state: LicenseState): boolean;
9
+ //# sourceMappingURL=core.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.d.ts","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,WAAW,EACX,YAAY,EACZ,kBAAkB,EAClB,UAAU,EACX,MAAM,sBAAsB,CAAC;AAa9B,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,YAAY,GAAG,IAAI,GAAG,WAAW,CAK1E;AAqBD,wBAAgB,aAAa,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAG9D;AAMD,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,OAAO,CAa1E;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,GAAG,kBAAkB,CAmBvF;AAMD,wBAAgB,aAAa,CAAC,IAAI,EAAE,WAAW,GAAG,UAAU,CAG3D;AAED,wBAAgB,WAAW,CACzB,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,aAAa,GAAG,gBAAgB,GAC1C,kBAAkB,CAkBpB;AAMD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAG9D"}
@@ -0,0 +1,108 @@
1
+ // engine/license-validator/core.ts — Offline-first license validation logic.
2
+ // Source of truth: local license state. Remote validation only on activation + every 30 days.
3
+ import { loadLicensePlans } from './config-loader.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Constants
6
+ // ---------------------------------------------------------------------------
7
+ const VALIDATION_TTL_MS = 30 * 24 * 60 * 60 * 1000; // 30 days
8
+ // ---------------------------------------------------------------------------
9
+ // Tier resolution
10
+ // ---------------------------------------------------------------------------
11
+ export function resolveCurrentTier(state) {
12
+ if (!state) {
13
+ return 'free';
14
+ }
15
+ return state.tier;
16
+ }
17
+ // ---------------------------------------------------------------------------
18
+ // Variant → tier mapping
19
+ // ---------------------------------------------------------------------------
20
+ const VARIANT_MAP = {
21
+ pro: 'pro',
22
+ 'specforge pro': 'pro',
23
+ 'specforge pro monthly': 'pro',
24
+ 'specforge pro yearly': 'pro',
25
+ team: 'team',
26
+ 'specforge team': 'team',
27
+ 'specforge team monthly': 'team',
28
+ 'specforge team yearly': 'team',
29
+ enterprise: 'enterprise',
30
+ 'specforge enterprise': 'enterprise',
31
+ 'specforge enterprise monthly': 'enterprise',
32
+ 'specforge enterprise yearly': 'enterprise',
33
+ };
34
+ export function variantToTier(variantName) {
35
+ const normalized = variantName.toLowerCase().trim();
36
+ return VARIANT_MAP[normalized] ?? 'pro';
37
+ }
38
+ // ---------------------------------------------------------------------------
39
+ // Tool access
40
+ // ---------------------------------------------------------------------------
41
+ export function isToolAllowed(toolName, tier) {
42
+ const config = loadLicensePlans();
43
+ if (config.alwaysAllowed.includes(toolName)) {
44
+ return true;
45
+ }
46
+ if (config.freeTools.includes(toolName)) {
47
+ return true;
48
+ }
49
+ if (tier === 'free') {
50
+ return false;
51
+ }
52
+ // Pro, team, enterprise have access to all tools
53
+ return true;
54
+ }
55
+ export function checkToolAccess(toolName, tier) {
56
+ const allowed = isToolAllowed(toolName, tier);
57
+ if (allowed) {
58
+ return { allowed: true, currentTier: tier, requiredTier: tier, message: 'Access granted.' };
59
+ }
60
+ const config = loadLicensePlans();
61
+ return {
62
+ allowed: false,
63
+ currentTier: tier,
64
+ requiredTier: 'pro',
65
+ message: [
66
+ `🔒 "${toolName}" requires a Pro or higher plan.`,
67
+ `You are currently on the Free plan (20 tools available).`,
68
+ `Upgrade at ${config.upgradeUrl} to unlock all 60+ tools.`,
69
+ '',
70
+ 'To activate a license key:',
71
+ ' → Use the activate_license tool with your license key.',
72
+ ].join('\n'),
73
+ };
74
+ }
75
+ // ---------------------------------------------------------------------------
76
+ // Limits
77
+ // ---------------------------------------------------------------------------
78
+ export function getTierLimits(tier) {
79
+ const config = loadLicensePlans();
80
+ return config.tiers[tier];
81
+ }
82
+ export function checkLimits(tier, currentCount, limitType) {
83
+ const limits = getTierLimits(tier);
84
+ const max = limits[limitType];
85
+ if (currentCount < max) {
86
+ return { allowed: true, currentTier: tier, requiredTier: tier, message: 'Within limits.' };
87
+ }
88
+ const config = loadLicensePlans();
89
+ const label = limitType === 'maxProjects' ? 'projects' : 'active specs';
90
+ return {
91
+ allowed: false,
92
+ currentTier: tier,
93
+ requiredTier: 'pro',
94
+ message: [
95
+ `🔒 You've reached the Free plan limit of ${String(max)} ${label}.`,
96
+ `Current usage: ${String(currentCount)}/${String(max)}.`,
97
+ `Upgrade at ${config.upgradeUrl} to increase your limits.`,
98
+ ].join('\n'),
99
+ };
100
+ }
101
+ // ---------------------------------------------------------------------------
102
+ // Validation freshness
103
+ // ---------------------------------------------------------------------------
104
+ export function isValidationFresh(state) {
105
+ const lastValidated = new Date(state.lastValidatedAt).getTime();
106
+ return Date.now() - lastValidated < VALIDATION_TTL_MS;
107
+ }
108
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../../../src/engine/license-validator/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { LemonSqueezyActivateResponse, LemonSqueezyValidateResponse, LemonSqueezyDeactivateResponse } from '../../types/index.js';
2
+ export declare function activateLicense(licenseKey: string, instanceName: string): Promise<LemonSqueezyActivateResponse>;
3
+ export declare function validateLicense(licenseKey: string, instanceId: string): Promise<LemonSqueezyValidateResponse>;
4
+ export declare function deactivateLicense(licenseKey: string, instanceId: string): Promise<LemonSqueezyDeactivateResponse>;
5
+ //# sourceMappingURL=lemon-squeezy.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lemon-squeezy.d.ts","sourceRoot":"","sources":["../../../src/engine/license-validator/lemon-squeezy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,4BAA4B,EAC5B,4BAA4B,EAC5B,8BAA8B,EAC/B,MAAM,sBAAsB,CAAC;AAoC9B,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,4BAA4B,CAAC,CAKvC;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,4BAA4B,CAAC,CAKvC;AAED,wBAAsB,iBAAiB,CACrC,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,8BAA8B,CAAC,CAKzC"}
@@ -0,0 +1,51 @@
1
+ // engine/license-validator/lemon-squeezy.ts — HTTP client for Lemon Squeezy license API.
2
+ // Uses native fetch() (Node 18+). No external dependencies.
3
+ const BASE_URL = 'https://api.lemonsqueezy.com/v1/licenses';
4
+ const TIMEOUT_MS = 10_000;
5
+ // ---------------------------------------------------------------------------
6
+ // Internal helpers
7
+ // ---------------------------------------------------------------------------
8
+ async function post(endpoint, body) {
9
+ const controller = new AbortController();
10
+ const timer = setTimeout(() => {
11
+ controller.abort();
12
+ }, TIMEOUT_MS);
13
+ try {
14
+ const res = await fetch(`${BASE_URL}/${endpoint}`, {
15
+ method: 'POST',
16
+ headers: { 'Content-Type': 'application/x-www-form-urlencoded', Accept: 'application/json' },
17
+ body: new URLSearchParams(body).toString(),
18
+ signal: controller.signal,
19
+ });
20
+ if (!res.ok) {
21
+ const text = await res.text();
22
+ throw new Error(`Lemon Squeezy ${endpoint} failed (${String(res.status)}): ${text}`);
23
+ }
24
+ return (await res.json());
25
+ }
26
+ finally {
27
+ clearTimeout(timer);
28
+ }
29
+ }
30
+ // ---------------------------------------------------------------------------
31
+ // Public API
32
+ // ---------------------------------------------------------------------------
33
+ export async function activateLicense(licenseKey, instanceName) {
34
+ return post('activate', {
35
+ license_key: licenseKey,
36
+ instance_name: instanceName,
37
+ });
38
+ }
39
+ export async function validateLicense(licenseKey, instanceId) {
40
+ return post('validate', {
41
+ license_key: licenseKey,
42
+ instance_id: instanceId,
43
+ });
44
+ }
45
+ export async function deactivateLicense(licenseKey, instanceId) {
46
+ return post('deactivate', {
47
+ license_key: licenseKey,
48
+ instance_id: instanceId,
49
+ });
50
+ }
51
+ //# sourceMappingURL=lemon-squeezy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lemon-squeezy.js","sourceRoot":"","sources":["../../../src/engine/license-validator/lemon-squeezy.ts"],"names":[],"mappings":"AAAA,yFAAyF;AACzF,4DAA4D;AAQ5D,MAAM,QAAQ,GAAG,0CAA0C,CAAC;AAC5D,MAAM,UAAU,GAAG,MAAM,CAAC;AAE1B,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,KAAK,UAAU,IAAI,CAAI,QAAgB,EAAE,IAA4B;IACnE,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;QAC5B,UAAU,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC,EAAE,UAAU,CAAC,CAAC;IAEf,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,QAAQ,IAAI,QAAQ,EAAE,EAAE;YACjD,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE,MAAM,EAAE,kBAAkB,EAAE;YAC5F,IAAI,EAAE,IAAI,eAAe,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE;YAC1C,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,iBAAiB,QAAQ,YAAY,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,CAAC;IACjC,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,YAAoB;IAEpB,OAAO,IAAI,CAA+B,UAAU,EAAE;QACpD,WAAW,EAAE,UAAU;QACvB,aAAa,EAAE,YAAY;KAC5B,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,UAAkB;IAElB,OAAO,IAAI,CAA+B,UAAU,EAAE;QACpD,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,UAAkB,EAClB,UAAkB;IAElB,OAAO,IAAI,CAAiC,YAAY,EAAE;QACxD,WAAW,EAAE,UAAU;QACvB,WAAW,EAAE,UAAU;KACxB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { resolveCurrentTier, variantToTier, isToolAllowed, checkToolAccess, getTierLimits, checkLimits, isValidationFresh, } from './license-validator/core.js';
2
+ export { loadLicensePlans, resetPlanCache } from './license-validator/config-loader.js';
3
+ export { activateLicense, validateLicense, deactivateLicense, } from './license-validator/lemon-squeezy.js';
4
+ //# sourceMappingURL=license-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-validator.d.ts","sourceRoot":"","sources":["../../src/engine/license-validator.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAExF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,sCAAsC,CAAC"}
@@ -0,0 +1,5 @@
1
+ // engine/license-validator.ts — Barrel re-export for the license validator module.
2
+ export { resolveCurrentTier, variantToTier, isToolAllowed, checkToolAccess, getTierLimits, checkLimits, isValidationFresh, } from './license-validator/core.js';
3
+ export { loadLicensePlans, resetPlanCache } from './license-validator/config-loader.js';
4
+ export { activateLicense, validateLicense, deactivateLicense, } from './license-validator/lemon-squeezy.js';
5
+ //# sourceMappingURL=license-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-validator.js","sourceRoot":"","sources":["../../src/engine/license-validator.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,aAAa,EACb,eAAe,EACf,aAAa,EACb,WAAW,EACX,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAExF,OAAO,EACL,eAAe,EACf,eAAe,EACf,iBAAiB,GAClB,MAAM,sCAAsC,CAAC"}
package/dist/index.js CHANGED
@@ -20,7 +20,9 @@ import { registerStackTools } from './tools/register-stack-tools.js';
20
20
  import { registerCheckConfigHealthTool } from './tools/check-config-health.js';
21
21
  import { registerAgentTools } from './tools/register-agent-tools.js';
22
22
  import { registerWorkflowTools } from './tools/register-workflow-tools.js';
23
+ import { registerLicenseTools } from './tools/register-license-tools.js';
23
24
  import { SPECFORGE_VERSION } from './config/version.js';
25
+ import { handleActivateLicense } from './tools/activate-license.js';
24
26
  // ---------------------------------------------------------------------------
25
27
  // Server setup
26
28
  // ---------------------------------------------------------------------------
@@ -90,10 +92,18 @@ registerStackTools(server);
90
92
  registerCheckConfigHealthTool(server);
91
93
  registerAgentTools(server);
92
94
  registerWorkflowTools(server);
95
+ registerLicenseTools(server);
93
96
  // ---------------------------------------------------------------------------
94
97
  // Start server
95
98
  // ---------------------------------------------------------------------------
96
99
  async function main() {
100
+ // Auto-activate license from environment variable if present
101
+ const envKey = process.env.SDD_LICENSE_KEY;
102
+ if (envKey) {
103
+ await handleActivateLicense({ licenseKey: envKey }).catch(() => {
104
+ // Silent failure: env-based activation is best-effort
105
+ });
106
+ }
97
107
  const transport = new StdioServerTransport();
98
108
  await server.connect(transport);
99
109
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -5,4 +5,5 @@ export * as patternStore from './pattern-store.js';
5
5
  export * as knowledgeStore from './knowledge-store.js';
6
6
  export * as globalStore from './global-store.js';
7
7
  export * as decisionStore from './decision-store.js';
8
+ export * as licenseStore from './license-store.js';
8
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC"}
@@ -6,4 +6,5 @@ export * as patternStore from './pattern-store.js';
6
6
  export * as knowledgeStore from './knowledge-store.js';
7
7
  export * as globalStore from './global-store.js';
8
8
  export * as decisionStore from './decision-store.js';
9
+ export * as licenseStore from './license-store.js';
9
10
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/storage/index.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,OAAO,EACL,eAAe,EACf,QAAQ,EACR,SAAS,EACT,cAAc,EACd,aAAa,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,KAAK,SAAS,MAAM,iBAAiB,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,KAAK,aAAa,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,YAAY,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { LicenseState } from '../types/index.js';
2
+ export declare function getLicenseState(): Promise<LicenseState | null>;
3
+ export declare function saveLicenseState(state: LicenseState): Promise<void>;
4
+ export declare function deleteLicenseState(): Promise<void>;
5
+ export declare function countActiveProjects(): Promise<number>;
6
+ //# sourceMappingURL=license-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-store.d.ts","sourceRoot":"","sources":["../../src/storage/license-store.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAa,MAAM,mBAAmB,CAAC;AAejE,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAEpE;AAED,wBAAsB,gBAAgB,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzE;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,CAUxD;AAED,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAU3D"}
@@ -0,0 +1,49 @@
1
+ // storage/license-store.ts — Persistence layer for license state (data/global/license.json).
2
+ import { readdir } from 'node:fs/promises';
3
+ import { readJson, writeJson, globalDataDir } from './base-store.js';
4
+ // ---------------------------------------------------------------------------
5
+ // Paths
6
+ // ---------------------------------------------------------------------------
7
+ function licenseFile() {
8
+ return `${globalDataDir()}/license.json`;
9
+ }
10
+ // ---------------------------------------------------------------------------
11
+ // Public API
12
+ // ---------------------------------------------------------------------------
13
+ export async function getLicenseState() {
14
+ return readJson(licenseFile(), null);
15
+ }
16
+ export async function saveLicenseState(state) {
17
+ await writeJson(licenseFile(), state);
18
+ }
19
+ export async function deleteLicenseState() {
20
+ const { unlink } = await import('node:fs/promises');
21
+ try {
22
+ await unlink(licenseFile());
23
+ }
24
+ catch (err) {
25
+ if (isNodeError(err) && err.code === 'ENOENT') {
26
+ return;
27
+ }
28
+ throw err;
29
+ }
30
+ }
31
+ export async function countActiveProjects() {
32
+ try {
33
+ const entries = await readdir('data/projects', { withFileTypes: true });
34
+ return entries.filter((e) => e.isDirectory()).length;
35
+ }
36
+ catch (err) {
37
+ if (isNodeError(err) && err.code === 'ENOENT') {
38
+ return 0;
39
+ }
40
+ throw err;
41
+ }
42
+ }
43
+ // ---------------------------------------------------------------------------
44
+ // Internal helpers
45
+ // ---------------------------------------------------------------------------
46
+ function isNodeError(err) {
47
+ return err instanceof Error && 'code' in err;
48
+ }
49
+ //# sourceMappingURL=license-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license-store.js","sourceRoot":"","sources":["../../src/storage/license-store.ts"],"names":[],"mappings":"AAAA,6FAA6F;AAC7F,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAG3C,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAErE,8EAA8E;AAC9E,QAAQ;AACR,8EAA8E;AAE9E,SAAS,WAAW;IAClB,OAAO,GAAG,aAAa,EAAE,eAAe,CAAC;AAC3C,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,MAAM,CAAC,KAAK,UAAU,eAAe;IACnC,OAAO,QAAQ,CAAsB,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,KAAmB;IACxD,MAAM,SAAS,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;AACxC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACpD,IAAI,CAAC;QACH,MAAM,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO;QACT,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB;IACvC,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QACxE,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,CAAC;IACvD,CAAC;IAAC,OAAO,GAAY,EAAE,CAAC;QACtB,IAAI,WAAW,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC9C,OAAO,CAAC,CAAC;QACX,CAAC;QACD,MAAM,GAAG,CAAC;IACZ,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,mBAAmB;AACnB,8EAA8E;AAE9E,SAAS,WAAW,CAAC,GAAY;IAC/B,OAAO,GAAG,YAAY,KAAK,IAAI,MAAM,IAAI,GAAG,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ActivateLicenseInput, ToolResult } from '../types/index.js';
2
+ export declare function handleActivateLicense(args: ActivateLicenseInput): Promise<ToolResult>;
3
+ export declare function handleDeactivateLicense(args: {
4
+ confirm: boolean;
5
+ }): Promise<ToolResult>;
6
+ //# sourceMappingURL=activate-license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate-license.d.ts","sourceRoot":"","sources":["../../src/tools/activate-license.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,oBAAoB,EAAgB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAKxF,wBAAsB,qBAAqB,CAAC,IAAI,EAAE,oBAAoB,GAAG,OAAO,CAAC,UAAU,CAAC,CA8E3F;AAED,wBAAsB,uBAAuB,CAAC,IAAI,EAAE;IAAE,OAAO,EAAE,OAAO,CAAA;CAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CAmC7F"}
@@ -0,0 +1,112 @@
1
+ // tools/activate-license.ts — Handler for activate_license MCP tool.
2
+ // Activates a license key via Lemon Squeezy API and persists the state locally.
3
+ import { hostname } from 'node:os';
4
+ import { licenseStore } from '../storage/index.js';
5
+ import { activateLicense, deactivateLicense, variantToTier } from '../engine/license-validator.js';
6
+ import { invalidateTierCache } from './license-gate.js';
7
+ export async function handleActivateLicense(args) {
8
+ const { licenseKey, instanceName } = args;
9
+ if (!licenseKey || licenseKey.trim().length === 0) {
10
+ return {
11
+ content: [{ type: 'text', text: 'Error: licenseKey is required.' }],
12
+ isError: true,
13
+ };
14
+ }
15
+ const name = instanceName ?? `specforge-${hostname()}`;
16
+ try {
17
+ const response = await activateLicense(licenseKey.trim(), name);
18
+ if (!response.activated) {
19
+ return {
20
+ content: [
21
+ { type: 'text', text: `License activation failed: ${response.error ?? 'Unknown error'}` },
22
+ ],
23
+ isError: true,
24
+ };
25
+ }
26
+ const tier = variantToTier(response.meta.variant_name);
27
+ const now = new Date().toISOString();
28
+ const state = {
29
+ licenseKey: response.license_key.key,
30
+ instanceId: response.instance.id,
31
+ tier,
32
+ activatedAt: now,
33
+ lastValidatedAt: now,
34
+ variantName: response.meta.variant_name,
35
+ customerName: response.meta.customer_name,
36
+ customerEmail: response.meta.customer_email,
37
+ };
38
+ await licenseStore.saveLicenseState(state);
39
+ invalidateTierCache();
40
+ return {
41
+ content: [
42
+ {
43
+ type: 'text',
44
+ text: [
45
+ `✅ License activated successfully!`,
46
+ '',
47
+ `Plan: ${tier.charAt(0).toUpperCase() + tier.slice(1)}`,
48
+ `Customer: ${response.meta.customer_name}`,
49
+ `Instance: ${name}`,
50
+ '',
51
+ tier === 'pro'
52
+ ? 'You now have access to all 60+ SpecForge tools and increased limits.'
53
+ : `You now have ${tier} access with all tools and unlimited projects/specs.`,
54
+ ].join('\n'),
55
+ },
56
+ ],
57
+ };
58
+ }
59
+ catch (error) {
60
+ const message = error instanceof Error ? error.message : String(error);
61
+ return {
62
+ content: [
63
+ {
64
+ type: 'text',
65
+ text: [
66
+ `License activation failed: ${message}`,
67
+ '',
68
+ 'Common causes:',
69
+ '• Invalid license key — check for typos',
70
+ '• License already activated on another machine — deactivate first',
71
+ '• Network issue — check your internet connection',
72
+ ].join('\n'),
73
+ },
74
+ ],
75
+ isError: true,
76
+ };
77
+ }
78
+ }
79
+ export async function handleDeactivateLicense(args) {
80
+ if (!args.confirm) {
81
+ return {
82
+ content: [{ type: 'text', text: 'Deactivation cancelled. Set confirm: true to proceed.' }],
83
+ };
84
+ }
85
+ const state = await licenseStore.getLicenseState();
86
+ if (!state) {
87
+ return {
88
+ content: [{ type: 'text', text: 'No active license found. You are on the Free plan.' }],
89
+ };
90
+ }
91
+ try {
92
+ await deactivateLicense(state.licenseKey, state.instanceId);
93
+ }
94
+ catch {
95
+ // Even if remote deactivation fails, we clear local state
96
+ }
97
+ await licenseStore.deleteLicenseState();
98
+ invalidateTierCache();
99
+ return {
100
+ content: [
101
+ {
102
+ type: 'text',
103
+ text: [
104
+ '✅ License deactivated successfully.',
105
+ 'You are now on the Free plan (20 tools, 2 projects, 5 active specs).',
106
+ 'Your license key can be activated on another machine.',
107
+ ].join('\n'),
108
+ },
109
+ ],
110
+ };
111
+ }
112
+ //# sourceMappingURL=activate-license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate-license.js","sourceRoot":"","sources":["../../src/tools/activate-license.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EAIf,UAAU,EAEX,MAAM,mBAAmB,CAAC;AAyD3B,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAiRnF"}
1
+ {"version":3,"file":"create-spec.d.ts","sourceRoot":"","sources":["../../src/tools/create-spec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,eAAe,EAIf,UAAU,EAEX,MAAM,mBAAmB,CAAC;AA2D3B,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,eAAe,GAAG,OAAO,CAAC,UAAU,CAAC,CAyRnF"}