legionai 1.0.0-beta.7 → 1.0.0-beta.9

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/dist/auth/claude-cli.d.ts +68 -0
  2. package/dist/auth/claude-cli.d.ts.map +1 -0
  3. package/dist/auth/claude-cli.js +283 -0
  4. package/dist/auth/claude-cli.js.map +1 -0
  5. package/dist/auth/index.d.ts +2 -0
  6. package/dist/auth/index.d.ts.map +1 -0
  7. package/dist/auth/index.js +2 -0
  8. package/dist/auth/index.js.map +1 -0
  9. package/dist/auth/license.d.ts +41 -0
  10. package/dist/auth/license.d.ts.map +1 -0
  11. package/dist/auth/license.js +202 -0
  12. package/dist/auth/license.js.map +1 -0
  13. package/dist/commands/activate.d.ts +3 -0
  14. package/dist/commands/activate.d.ts.map +1 -0
  15. package/dist/commands/activate.js +129 -0
  16. package/dist/commands/activate.js.map +1 -0
  17. package/dist/commands/config.d.ts +3 -0
  18. package/dist/commands/config.d.ts.map +1 -0
  19. package/dist/commands/config.js +278 -0
  20. package/dist/commands/config.js.map +1 -0
  21. package/dist/commands/deploy.d.ts +3 -0
  22. package/dist/commands/deploy.d.ts.map +1 -0
  23. package/dist/commands/deploy.js +430 -0
  24. package/dist/commands/deploy.js.map +1 -0
  25. package/dist/commands/init.d.ts +3 -0
  26. package/dist/commands/init.d.ts.map +1 -0
  27. package/dist/commands/init.js +306 -0
  28. package/dist/commands/init.js.map +1 -0
  29. package/dist/commands/recruit.d.ts +3 -0
  30. package/dist/commands/recruit.d.ts.map +1 -0
  31. package/dist/commands/recruit.js +136 -0
  32. package/dist/commands/recruit.js.map +1 -0
  33. package/dist/commands/status.d.ts +3 -0
  34. package/dist/commands/status.d.ts.map +1 -0
  35. package/dist/commands/status.js +130 -0
  36. package/dist/commands/status.js.map +1 -0
  37. package/dist/commands/wizard.d.ts +9 -0
  38. package/dist/commands/wizard.d.ts.map +1 -0
  39. package/dist/commands/wizard.js +737 -0
  40. package/dist/commands/wizard.js.map +1 -0
  41. package/dist/config/index.d.ts +2 -0
  42. package/dist/config/index.d.ts.map +1 -0
  43. package/dist/config/index.js +2 -0
  44. package/dist/config/index.js.map +1 -0
  45. package/dist/config/store.d.ts +24 -0
  46. package/dist/config/store.d.ts.map +1 -0
  47. package/dist/config/store.js +95 -0
  48. package/dist/config/store.js.map +1 -0
  49. package/dist/index.d.ts +3 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +59 -0
  52. package/dist/index.js.map +1 -0
  53. package/dist/legion.mjs +1360 -0
  54. package/dist/ui/animations.d.ts +162 -0
  55. package/dist/ui/animations.d.ts.map +1 -0
  56. package/dist/ui/animations.js +734 -0
  57. package/dist/ui/animations.js.map +1 -0
  58. package/dist/ui/theme.d.ts +164 -0
  59. package/dist/ui/theme.d.ts.map +1 -0
  60. package/dist/ui/theme.js +324 -0
  61. package/dist/ui/theme.js.map +1 -0
  62. package/dist/wizard/agent-setup.d.ts +15 -0
  63. package/dist/wizard/agent-setup.d.ts.map +1 -0
  64. package/dist/wizard/agent-setup.js +654 -0
  65. package/dist/wizard/agent-setup.js.map +1 -0
  66. package/dist/wizard/claude-code-integration.d.ts +20 -0
  67. package/dist/wizard/claude-code-integration.d.ts.map +1 -0
  68. package/dist/wizard/claude-code-integration.js +374 -0
  69. package/dist/wizard/claude-code-integration.js.map +1 -0
  70. package/dist/wizard/existing-project.d.ts +50 -0
  71. package/dist/wizard/existing-project.d.ts.map +1 -0
  72. package/dist/wizard/existing-project.js +700 -0
  73. package/dist/wizard/existing-project.js.map +1 -0
  74. package/dist/wizard/index.d.ts +10 -0
  75. package/dist/wizard/index.d.ts.map +1 -0
  76. package/dist/wizard/index.js +13 -0
  77. package/dist/wizard/index.js.map +1 -0
  78. package/dist/wizard/llm-phases.d.ts +77 -0
  79. package/dist/wizard/llm-phases.d.ts.map +1 -0
  80. package/dist/wizard/llm-phases.js +922 -0
  81. package/dist/wizard/llm-phases.js.map +1 -0
  82. package/dist/wizard/mcp-config.d.ts +14 -0
  83. package/dist/wizard/mcp-config.d.ts.map +1 -0
  84. package/dist/wizard/mcp-config.js +410 -0
  85. package/dist/wizard/mcp-config.js.map +1 -0
  86. package/dist/wizard/post-setup.d.ts +10 -0
  87. package/dist/wizard/post-setup.d.ts.map +1 -0
  88. package/dist/wizard/post-setup.js +288 -0
  89. package/dist/wizard/post-setup.js.map +1 -0
  90. package/dist/wizard/questions.d.ts +18 -0
  91. package/dist/wizard/questions.d.ts.map +1 -0
  92. package/dist/wizard/questions.js +473 -0
  93. package/dist/wizard/questions.js.map +1 -0
  94. package/dist/wizard/strategic-phase.d.ts +58 -0
  95. package/dist/wizard/strategic-phase.d.ts.map +1 -0
  96. package/dist/wizard/strategic-phase.js +896 -0
  97. package/dist/wizard/strategic-phase.js.map +1 -0
  98. package/dist/wizard/wizard-animations.d.ts +42 -0
  99. package/dist/wizard/wizard-animations.d.ts.map +1 -0
  100. package/dist/wizard/wizard-animations.js +662 -0
  101. package/dist/wizard/wizard-animations.js.map +1 -0
  102. package/package.json +10 -8
  103. package/dist/legion.cjs +0 -1409
@@ -0,0 +1,68 @@
1
+ export interface ClaudeCLIAuth {
2
+ isLoggedIn: boolean;
3
+ email?: string;
4
+ tier?: 'Solo' | 'Pro' | 'Team' | 'Enterprise';
5
+ cliVersion?: string;
6
+ cliAvailable?: boolean;
7
+ }
8
+ export interface Context7Status {
9
+ isInstalled: boolean;
10
+ isConfigured: boolean;
11
+ }
12
+ /**
13
+ * Check if Claude CLI is installed and user is logged in
14
+ */
15
+ export declare function detectClaudeCLI(): ClaudeCLIAuth;
16
+ /**
17
+ * Check if Claude CLI command is available for execution
18
+ */
19
+ export declare function isClaudeCLIAvailable(): boolean;
20
+ /**
21
+ * Get Claude CLI version
22
+ */
23
+ export declare function getClaudeCLIVersion(): string | undefined;
24
+ /**
25
+ * Execute a prompt using Claude CLI and return the response
26
+ * Uses `claude -p "prompt" --print` for non-interactive execution
27
+ */
28
+ export declare function executeWithClaudeCLI(prompt: string, options?: {
29
+ maxTokens?: number;
30
+ systemPrompt?: string;
31
+ workingDir?: string;
32
+ }): Promise<string>;
33
+ /**
34
+ * Check if we can use Claude CLI for LLM inference
35
+ *
36
+ * Note: Claude CLI handles auth interactively if needed.
37
+ * If the CLI is available and responds to --version, we can use it.
38
+ * The CLI will prompt for login if the user isn't authenticated.
39
+ */
40
+ export declare function canUseClaudeCLI(): boolean;
41
+ /**
42
+ * Display Claude CLI auth status
43
+ */
44
+ export declare function displayClaudeCLIStatus(auth: ClaudeCLIAuth): void;
45
+ /**
46
+ * Check if Context7 MCP server is installed
47
+ */
48
+ export declare function detectContext7(): Context7Status;
49
+ /**
50
+ * Display Context7 status and recommendation
51
+ */
52
+ export declare function displayContext7Status(status: Context7Status): void;
53
+ /**
54
+ * Get Context7 MCP server configuration
55
+ */
56
+ export declare function getContext7MCPConfig(): Record<string, unknown>;
57
+ /**
58
+ * Run full auth check and display status
59
+ */
60
+ export declare function runAuthCheck(): Promise<{
61
+ claudeCLI: ClaudeCLIAuth;
62
+ context7: Context7Status;
63
+ }>;
64
+ /**
65
+ * Show auth prompt if not logged in
66
+ */
67
+ export declare function showAuthPrompt(): void;
68
+ //# sourceMappingURL=claude-cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-cli.d.ts","sourceRoot":"","sources":["../../src/auth/claude-cli.ts"],"names":[],"mappings":"AAoBA,MAAM,WAAW,aAAa;IAC5B,UAAU,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,YAAY,CAAC;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,OAAO,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;CACvB;AAMD;;GAEG;AACH,wBAAgB,eAAe,IAAI,aAAa,CA+C/C;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,OAAO,CAY9C;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,MAAM,GAAG,SAAS,CAYxD;AAED;;;GAGG;AACH,wBAAsB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;IAClE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyCvB;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,IAAI,OAAO,CAGzC;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,aAAa,GAAG,IAAI,CA0ChE;AAMD;;GAEG;AACH,wBAAgB,cAAc,IAAI,cAAc,CA+B/C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,cAAc,GAAG,IAAI,CAQlE;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAQ9D;AAMD;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC;IAC5C,SAAS,EAAE,aAAa,CAAC;IACzB,QAAQ,EAAE,cAAc,CAAC;CAC1B,CAAC,CAWD;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAmBrC"}
@@ -0,0 +1,283 @@
1
+ // ============================================
2
+ // LegionAI Claude CLI Detection
3
+ // ============================================
4
+ //
5
+ // Detects if user is logged into Claude CLI and
6
+ // uses that authentication for native integration.
7
+ //
8
+ import { existsSync, readFileSync } from 'fs';
9
+ import { join } from 'path';
10
+ import { homedir } from 'os';
11
+ import { execSync, spawn } from 'child_process';
12
+ import chalk from 'chalk';
13
+ import boxen from 'boxen';
14
+ import { COLORS } from '../ui/theme.js';
15
+ // ============================================
16
+ // Claude CLI Detection
17
+ // ============================================
18
+ /**
19
+ * Check if Claude CLI is installed and user is logged in
20
+ */
21
+ export function detectClaudeCLI() {
22
+ const homeDir = homedir();
23
+ // Possible Claude CLI config locations
24
+ const configPaths = [
25
+ join(homeDir, '.claude', 'config.json'),
26
+ join(homeDir, '.config', 'claude', 'config.json'),
27
+ join(homeDir, '.claude.json'),
28
+ ];
29
+ for (const configPath of configPaths) {
30
+ if (existsSync(configPath)) {
31
+ try {
32
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
33
+ // Check for auth tokens or user info
34
+ if (config.auth || config.user || config.email || config.apiKey) {
35
+ return {
36
+ isLoggedIn: true,
37
+ email: config.email || config.user?.email,
38
+ tier: config.tier || config.plan || 'Solo',
39
+ cliVersion: config.version,
40
+ };
41
+ }
42
+ }
43
+ catch {
44
+ // Config exists but couldn't parse
45
+ }
46
+ }
47
+ }
48
+ // Check for Claude environment variables
49
+ if (process.env.CLAUDE_API_KEY || process.env.ANTHROPIC_API_KEY) {
50
+ return {
51
+ isLoggedIn: true,
52
+ tier: 'Solo',
53
+ };
54
+ }
55
+ // Check if running inside Claude Code
56
+ if (process.env.CLAUDE_CODE || process.env.ANTHROPIC_SESSION) {
57
+ return {
58
+ isLoggedIn: true,
59
+ tier: 'Solo',
60
+ };
61
+ }
62
+ return { isLoggedIn: false };
63
+ }
64
+ /**
65
+ * Check if Claude CLI command is available for execution
66
+ */
67
+ export function isClaudeCLIAvailable() {
68
+ try {
69
+ // Try to get Claude CLI version
70
+ const result = execSync('claude --version 2>/dev/null || claude -V 2>/dev/null', {
71
+ encoding: 'utf-8',
72
+ timeout: 5000,
73
+ stdio: ['pipe', 'pipe', 'pipe'],
74
+ });
75
+ return result.includes('claude') || result.includes('Claude') || /\d+\.\d+/.test(result);
76
+ }
77
+ catch {
78
+ return false;
79
+ }
80
+ }
81
+ /**
82
+ * Get Claude CLI version
83
+ */
84
+ export function getClaudeCLIVersion() {
85
+ try {
86
+ const result = execSync('claude --version 2>/dev/null || claude -V 2>/dev/null', {
87
+ encoding: 'utf-8',
88
+ timeout: 5000,
89
+ stdio: ['pipe', 'pipe', 'pipe'],
90
+ });
91
+ const match = result.match(/v?(\d+\.\d+\.\d+)/);
92
+ return match ? match[1] : undefined;
93
+ }
94
+ catch {
95
+ return undefined;
96
+ }
97
+ }
98
+ /**
99
+ * Execute a prompt using Claude CLI and return the response
100
+ * Uses `claude -p "prompt" --print` for non-interactive execution
101
+ */
102
+ export async function executeWithClaudeCLI(prompt, options = {}) {
103
+ return new Promise((resolve, reject) => {
104
+ const args = ['-p', prompt, '--print'];
105
+ if (options.systemPrompt) {
106
+ args.push('--system', options.systemPrompt);
107
+ }
108
+ if (options.maxTokens) {
109
+ args.push('--max-tokens', String(options.maxTokens));
110
+ }
111
+ const child = spawn('claude', args, {
112
+ cwd: options.workingDir || process.cwd(),
113
+ stdio: ['pipe', 'pipe', 'pipe'],
114
+ timeout: 120000, // 2 minute timeout
115
+ });
116
+ let stdout = '';
117
+ let stderr = '';
118
+ child.stdout.on('data', (data) => {
119
+ stdout += data.toString();
120
+ });
121
+ child.stderr.on('data', (data) => {
122
+ stderr += data.toString();
123
+ });
124
+ child.on('close', (code) => {
125
+ if (code === 0) {
126
+ resolve(stdout.trim());
127
+ }
128
+ else {
129
+ reject(new Error(`Claude CLI exited with code ${code}: ${stderr}`));
130
+ }
131
+ });
132
+ child.on('error', (err) => {
133
+ reject(new Error(`Failed to execute Claude CLI: ${err.message}`));
134
+ });
135
+ });
136
+ }
137
+ /**
138
+ * Check if we can use Claude CLI for LLM inference
139
+ *
140
+ * Note: Claude CLI handles auth interactively if needed.
141
+ * If the CLI is available and responds to --version, we can use it.
142
+ * The CLI will prompt for login if the user isn't authenticated.
143
+ */
144
+ export function canUseClaudeCLI() {
145
+ // If CLI is available, we can use it (it handles auth interactively)
146
+ return isClaudeCLIAvailable();
147
+ }
148
+ /**
149
+ * Display Claude CLI auth status
150
+ */
151
+ export function displayClaudeCLIStatus(auth) {
152
+ const cliAvailable = isClaudeCLIAvailable();
153
+ const cliVersion = getClaudeCLIVersion();
154
+ if (cliAvailable) {
155
+ // CLI is available - show version and any auth info we have
156
+ const versionStr = cliVersion ? `v${cliVersion}` : '';
157
+ const authInfo = auth.email
158
+ ? `Logged in as ${chalk.hex(COLORS.primary.gold)(auth.email)}`
159
+ : '';
160
+ const tierInfo = auth.tier
161
+ ? chalk.hex(COLORS.primary.orange)(auth.tier)
162
+ : '';
163
+ const parts = [
164
+ chalk.hex(COLORS.status.success)('✓ ') + chalk.white(`Claude CLI ${versionStr} detected`),
165
+ ];
166
+ if (authInfo) {
167
+ parts.push(authInfo);
168
+ }
169
+ if (tierInfo) {
170
+ parts.push(tierInfo);
171
+ }
172
+ console.log(parts.join(' • '));
173
+ console.log(chalk.hex(COLORS.text.muted)(' Ready for AI-powered analysis'));
174
+ }
175
+ else if (auth.isLoggedIn) {
176
+ // No CLI but have auth (e.g., running inside Claude Code environment)
177
+ const authLine = auth.email
178
+ ? `Logged in as ${chalk.hex(COLORS.primary.gold)(auth.email)}`
179
+ : 'Claude authentication detected';
180
+ const tierLine = auth.tier
181
+ ? ` • ${chalk.hex(COLORS.primary.orange)(auth.tier)}`
182
+ : '';
183
+ console.log(chalk.hex(COLORS.text.secondary)(`${authLine}${tierLine}`));
184
+ }
185
+ else {
186
+ console.log(chalk.hex(COLORS.status.warning)('Claude CLI not detected'));
187
+ console.log(chalk.hex(COLORS.text.muted)('For best experience, install Claude Code: https://claude.ai/code'));
188
+ }
189
+ }
190
+ // ============================================
191
+ // Context7 MCP Detection
192
+ // ============================================
193
+ /**
194
+ * Check if Context7 MCP server is installed
195
+ */
196
+ export function detectContext7() {
197
+ const homeDir = homedir();
198
+ // Check MCP config locations
199
+ const mcpConfigPaths = [
200
+ join(homeDir, '.claude', 'mcp.json'),
201
+ join(homeDir, '.config', 'claude', 'mcp.json'),
202
+ join(process.cwd(), '.claude', 'mcp.json'),
203
+ ];
204
+ for (const configPath of mcpConfigPaths) {
205
+ if (existsSync(configPath)) {
206
+ try {
207
+ const config = JSON.parse(readFileSync(configPath, 'utf-8'));
208
+ // Check if context7 is in the servers list
209
+ if (config.servers && (config.servers.context7 || config.servers['context-7'])) {
210
+ return { isInstalled: true, isConfigured: true };
211
+ }
212
+ // Check mcpServers format
213
+ if (config.mcpServers && (config.mcpServers.context7 || config.mcpServers['context-7'])) {
214
+ return { isInstalled: true, isConfigured: true };
215
+ }
216
+ }
217
+ catch {
218
+ // Config exists but couldn't parse
219
+ }
220
+ }
221
+ }
222
+ return { isInstalled: false, isConfigured: false };
223
+ }
224
+ /**
225
+ * Display Context7 status and recommendation
226
+ */
227
+ export function displayContext7Status(status) {
228
+ if (status.isConfigured) {
229
+ console.log(chalk.hex(COLORS.status.success)('✓ ') + chalk.hex(COLORS.text.primary)('Context7 MCP detected'));
230
+ }
231
+ else {
232
+ console.log(chalk.hex(COLORS.status.warning)('⚠ ') + chalk.hex(COLORS.text.secondary)('Context7 MCP not detected.'));
233
+ console.log(chalk.hex(COLORS.text.muted)(' For better documentation lookups, install it: ') +
234
+ chalk.hex(COLORS.primary.orange)('https://context7.com/'));
235
+ }
236
+ }
237
+ /**
238
+ * Get Context7 MCP server configuration
239
+ */
240
+ export function getContext7MCPConfig() {
241
+ return {
242
+ context7: {
243
+ command: 'npx',
244
+ args: ['-y', '@context7/mcp-server'],
245
+ description: 'Context7 - Better documentation lookups for Claude Code',
246
+ },
247
+ };
248
+ }
249
+ // ============================================
250
+ // Combined Auth Check
251
+ // ============================================
252
+ /**
253
+ * Run full auth check and display status
254
+ */
255
+ export async function runAuthCheck() {
256
+ const claudeCLI = detectClaudeCLI();
257
+ const context7 = detectContext7();
258
+ console.log('');
259
+ displayClaudeCLIStatus(claudeCLI);
260
+ console.log('');
261
+ displayContext7Status(context7);
262
+ console.log('');
263
+ return { claudeCLI, context7 };
264
+ }
265
+ /**
266
+ * Show auth prompt if not logged in
267
+ */
268
+ export function showAuthPrompt() {
269
+ console.log('');
270
+ console.log(boxen(chalk.hex(COLORS.primary.gold).bold('🔐 Authentication\n\n') +
271
+ chalk.white('LegionAI works best with Claude Code.\n\n') +
272
+ chalk.hex(COLORS.text.muted)('To get started:\n') +
273
+ chalk.hex(COLORS.primary.orange)('1. Install Claude Code: ') + chalk.white('https://claude.ai/code\n') +
274
+ chalk.hex(COLORS.primary.orange)('2. Log in with your Anthropic account\n') +
275
+ chalk.hex(COLORS.primary.orange)('3. Run ') + chalk.white('legion wizard') + chalk.hex(COLORS.primary.orange)(' again\n\n') +
276
+ chalk.hex(COLORS.text.muted)('Or set ANTHROPIC_API_KEY for API access.'), {
277
+ padding: 1,
278
+ borderStyle: 'round',
279
+ borderColor: '#FF6B00',
280
+ }));
281
+ console.log('');
282
+ }
283
+ //# sourceMappingURL=claude-cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-cli.js","sourceRoot":"","sources":["../../src/auth/claude-cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export * from './license.js';
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,2 @@
1
+ export * from './license.js';
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/auth/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,41 @@
1
+ export interface LicenseInfo {
2
+ isValid: boolean;
3
+ tier: 'beta' | 'standard' | 'pro' | null;
4
+ expiresAt: Date | null;
5
+ message: string;
6
+ }
7
+ /**
8
+ * Validate a license key
9
+ * In production, this would call your license server
10
+ */
11
+ export declare function validateLicense(key: string): Promise<LicenseInfo>;
12
+ /**
13
+ * Activate a license key
14
+ */
15
+ export declare function activateLicense(key: string): Promise<LicenseInfo>;
16
+ /**
17
+ * Check if there's a valid active license
18
+ */
19
+ export declare function checkLicense(): LicenseInfo;
20
+ /**
21
+ * Deactivate the current license
22
+ */
23
+ export declare function deactivateLicense(): void;
24
+ /**
25
+ * Get stored license info (for display)
26
+ */
27
+ export declare function getLicenseInfo(): {
28
+ key: string | null;
29
+ tier: string | null;
30
+ activatedAt: string | null;
31
+ expiresAt: string | null;
32
+ };
33
+ /**
34
+ * Require valid license - throws if not valid
35
+ */
36
+ export declare function requireLicense(): void;
37
+ /**
38
+ * Display license status
39
+ */
40
+ export declare function displayLicenseStatus(): void;
41
+ //# sourceMappingURL=license.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.d.ts","sourceRoot":"","sources":["../../src/auth/license.ts"],"names":[],"mappings":"AA8CA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,OAAO,CAAC;IACjB,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,KAAK,GAAG,IAAI,CAAC;IACzC,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAyCvE;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAavE;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,WAAW,CAoD1C;AAED;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,IAAI,CAExC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI;IAChC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B,CAOA;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,IAAI,CAgBrC;AAED;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAqB3C"}
@@ -0,0 +1,202 @@
1
+ // ============================================
2
+ // LegionAI License Validation
3
+ // Protects IP by requiring valid license
4
+ // ============================================
5
+ import Conf from 'conf';
6
+ import chalk from 'chalk';
7
+ import crypto from 'crypto';
8
+ import os from 'os';
9
+ // License store (separate from project config)
10
+ const licenseStore = new Conf({
11
+ projectName: 'legionai-license',
12
+ encryptionKey: 'legion-ai-2024-secure-key', // In production, use env var
13
+ defaults: {
14
+ licenseKey: null,
15
+ activatedAt: null,
16
+ expiresAt: null,
17
+ tier: null,
18
+ machineId: null,
19
+ },
20
+ });
21
+ // Generate machine-specific ID for license binding
22
+ function getMachineId() {
23
+ const data = `${os.hostname()}-${os.platform()}-${os.arch()}-${os.cpus()[0]?.model || 'unknown'}`;
24
+ return crypto.createHash('sha256').update(data).digest('hex').substring(0, 16);
25
+ }
26
+ // Beta license keys (in production, these would be validated server-side)
27
+ // Format: LEGION-BETA-XXXX-XXXX-XXXX
28
+ const BETA_KEYS = new Set([
29
+ 'LEGION-BETA-2024-ALPHA-0001',
30
+ 'LEGION-BETA-2024-ALPHA-0002',
31
+ 'LEGION-BETA-2024-ALPHA-0003',
32
+ 'LEGION-BETA-2024-EARLY-0001',
33
+ 'LEGION-BETA-2024-EARLY-0002',
34
+ // Add more beta keys as needed
35
+ ]);
36
+ /**
37
+ * Validate a license key
38
+ * In production, this would call your license server
39
+ */
40
+ export async function validateLicense(key) {
41
+ // Normalize key
42
+ const normalizedKey = key.trim().toUpperCase();
43
+ // Check format
44
+ if (!normalizedKey.startsWith('LEGION-')) {
45
+ return {
46
+ isValid: false,
47
+ tier: null,
48
+ expiresAt: null,
49
+ message: 'Invalid license key format',
50
+ };
51
+ }
52
+ // Beta key validation (local for now)
53
+ if (BETA_KEYS.has(normalizedKey)) {
54
+ const expiresAt = new Date();
55
+ expiresAt.setMonth(expiresAt.getMonth() + 3); // Beta expires in 3 months
56
+ return {
57
+ isValid: true,
58
+ tier: 'beta',
59
+ expiresAt,
60
+ message: 'Beta license activated',
61
+ };
62
+ }
63
+ // TODO: In production, call license server
64
+ // const response = await fetch('https://api.legionai.dev/validate', {
65
+ // method: 'POST',
66
+ // headers: { 'Content-Type': 'application/json' },
67
+ // body: JSON.stringify({ key: normalizedKey, machineId: getMachineId() }),
68
+ // });
69
+ // return await response.json();
70
+ return {
71
+ isValid: false,
72
+ tier: null,
73
+ expiresAt: null,
74
+ message: 'Invalid or expired license key',
75
+ };
76
+ }
77
+ /**
78
+ * Activate a license key
79
+ */
80
+ export async function activateLicense(key) {
81
+ const validation = await validateLicense(key);
82
+ if (validation.isValid) {
83
+ // Store the license
84
+ licenseStore.set('licenseKey', key.trim().toUpperCase());
85
+ licenseStore.set('activatedAt', new Date().toISOString());
86
+ licenseStore.set('expiresAt', validation.expiresAt?.toISOString() || null);
87
+ licenseStore.set('tier', validation.tier);
88
+ licenseStore.set('machineId', getMachineId());
89
+ }
90
+ return validation;
91
+ }
92
+ /**
93
+ * Check if there's a valid active license
94
+ */
95
+ export function checkLicense() {
96
+ const licenseKey = licenseStore.get('licenseKey');
97
+ const expiresAt = licenseStore.get('expiresAt');
98
+ const tier = licenseStore.get('tier');
99
+ const storedMachineId = licenseStore.get('machineId');
100
+ // No license stored
101
+ if (!licenseKey) {
102
+ return {
103
+ isValid: false,
104
+ tier: null,
105
+ expiresAt: null,
106
+ message: 'No license activated',
107
+ };
108
+ }
109
+ // Check machine binding
110
+ if (storedMachineId && storedMachineId !== getMachineId()) {
111
+ return {
112
+ isValid: false,
113
+ tier: null,
114
+ expiresAt: null,
115
+ message: 'License is bound to a different machine',
116
+ };
117
+ }
118
+ // Check expiration
119
+ if (expiresAt) {
120
+ const expDate = new Date(expiresAt);
121
+ if (expDate < new Date()) {
122
+ return {
123
+ isValid: false,
124
+ tier: null,
125
+ expiresAt: expDate,
126
+ message: 'License has expired',
127
+ };
128
+ }
129
+ return {
130
+ isValid: true,
131
+ tier,
132
+ expiresAt: expDate,
133
+ message: `${tier} license active`,
134
+ };
135
+ }
136
+ return {
137
+ isValid: true,
138
+ tier,
139
+ expiresAt: null,
140
+ message: `${tier} license active (no expiration)`,
141
+ };
142
+ }
143
+ /**
144
+ * Deactivate the current license
145
+ */
146
+ export function deactivateLicense() {
147
+ licenseStore.clear();
148
+ }
149
+ /**
150
+ * Get stored license info (for display)
151
+ */
152
+ export function getLicenseInfo() {
153
+ return {
154
+ key: licenseStore.get('licenseKey'),
155
+ tier: licenseStore.get('tier'),
156
+ activatedAt: licenseStore.get('activatedAt'),
157
+ expiresAt: licenseStore.get('expiresAt'),
158
+ };
159
+ }
160
+ /**
161
+ * Require valid license - throws if not valid
162
+ */
163
+ export function requireLicense() {
164
+ const license = checkLicense();
165
+ if (!license.isValid) {
166
+ console.log('');
167
+ console.log(chalk.red('⚔️ License Required'));
168
+ console.log('');
169
+ console.log(chalk.dim('LegionAI requires a valid license to operate.'));
170
+ console.log('');
171
+ console.log(chalk.white('To activate your license:'));
172
+ console.log(chalk.hex('#FF6B00')(' legionai activate <LICENSE-KEY>'));
173
+ console.log('');
174
+ console.log(chalk.dim('Get a license at: https://legionai.dev/pricing'));
175
+ console.log('');
176
+ process.exit(1);
177
+ }
178
+ }
179
+ /**
180
+ * Display license status
181
+ */
182
+ export function displayLicenseStatus() {
183
+ const license = checkLicense();
184
+ const info = getLicenseInfo();
185
+ console.log('');
186
+ if (license.isValid) {
187
+ console.log(chalk.green(`✓ License: ${license.tier?.toUpperCase()} (Active)`));
188
+ if (license.expiresAt) {
189
+ const daysLeft = Math.ceil((license.expiresAt.getTime() - Date.now()) / (1000 * 60 * 60 * 24));
190
+ console.log(chalk.dim(` Expires: ${license.expiresAt.toLocaleDateString()} (${daysLeft} days)`));
191
+ }
192
+ if (info.key) {
193
+ console.log(chalk.dim(` Key: ${info.key.substring(0, 15)}...`));
194
+ }
195
+ }
196
+ else {
197
+ console.log(chalk.red(`✗ License: ${license.message}`));
198
+ console.log(chalk.dim(' Run: legionai activate <LICENSE-KEY>'));
199
+ }
200
+ console.log('');
201
+ }
202
+ //# sourceMappingURL=license.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"license.js","sourceRoot":"","sources":["../../src/auth/license.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Command } from 'commander';
2
+ export declare const activateCommand: Command;
3
+ //# sourceMappingURL=activate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activate.d.ts","sourceRoot":"","sources":["../../src/commands/activate.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAapC,eAAO,MAAM,eAAe,SAoIxB,CAAC"}