monty-autonomous-fullstack-dev-multillm 1.0.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 (186) hide show
  1. package/LICENSE +81 -0
  2. package/README.md +608 -0
  3. package/bin/cli.js +448 -0
  4. package/dist/agents/coding.d.ts +15 -0
  5. package/dist/agents/coding.d.ts.map +1 -0
  6. package/dist/agents/coding.js +189 -0
  7. package/dist/agents/coding.js.map +1 -0
  8. package/dist/agents/initializer.d.ts +15 -0
  9. package/dist/agents/initializer.d.ts.map +1 -0
  10. package/dist/agents/initializer.js +87 -0
  11. package/dist/agents/initializer.js.map +1 -0
  12. package/dist/agents/prompts/arbitrator.md +143 -0
  13. package/dist/agents/prompts/coding.md +247 -0
  14. package/dist/agents/prompts/initializer.md +98 -0
  15. package/dist/config/agent-config.d.ts +103 -0
  16. package/dist/config/agent-config.d.ts.map +1 -0
  17. package/dist/config/agent-config.js +138 -0
  18. package/dist/config/agent-config.js.map +1 -0
  19. package/dist/config/auth-config.d.ts +152 -0
  20. package/dist/config/auth-config.d.ts.map +1 -0
  21. package/dist/config/auth-config.js +139 -0
  22. package/dist/config/auth-config.js.map +1 -0
  23. package/dist/config/mcp-config.d.ts +109 -0
  24. package/dist/config/mcp-config.d.ts.map +1 -0
  25. package/dist/config/mcp-config.js +234 -0
  26. package/dist/config/mcp-config.js.map +1 -0
  27. package/dist/config/provider-config.d.ts +139 -0
  28. package/dist/config/provider-config.d.ts.map +1 -0
  29. package/dist/config/provider-config.js +344 -0
  30. package/dist/config/provider-config.js.map +1 -0
  31. package/dist/config/subagents-config.d.ts +85 -0
  32. package/dist/config/subagents-config.d.ts.map +1 -0
  33. package/dist/config/subagents-config.js +430 -0
  34. package/dist/config/subagents-config.js.map +1 -0
  35. package/dist/index.d.ts +14 -0
  36. package/dist/index.d.ts.map +1 -0
  37. package/dist/index.js +385 -0
  38. package/dist/index.js.map +1 -0
  39. package/dist/orchestrator/arbitrator.d.ts +93 -0
  40. package/dist/orchestrator/arbitrator.d.ts.map +1 -0
  41. package/dist/orchestrator/arbitrator.js +330 -0
  42. package/dist/orchestrator/arbitrator.js.map +1 -0
  43. package/dist/orchestrator/index.d.ts +113 -0
  44. package/dist/orchestrator/index.d.ts.map +1 -0
  45. package/dist/orchestrator/index.js +217 -0
  46. package/dist/orchestrator/index.js.map +1 -0
  47. package/dist/orchestrator/review-coordinator.d.ts +143 -0
  48. package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
  49. package/dist/orchestrator/review-coordinator.js +401 -0
  50. package/dist/orchestrator/review-coordinator.js.map +1 -0
  51. package/dist/orchestrator/task-classifier.d.ts +87 -0
  52. package/dist/orchestrator/task-classifier.d.ts.map +1 -0
  53. package/dist/orchestrator/task-classifier.js +250 -0
  54. package/dist/orchestrator/task-classifier.js.map +1 -0
  55. package/dist/providers/anthropic-provider.d.ts +64 -0
  56. package/dist/providers/anthropic-provider.d.ts.map +1 -0
  57. package/dist/providers/anthropic-provider.js +264 -0
  58. package/dist/providers/anthropic-provider.js.map +1 -0
  59. package/dist/providers/base-provider.d.ts +219 -0
  60. package/dist/providers/base-provider.d.ts.map +1 -0
  61. package/dist/providers/base-provider.js +143 -0
  62. package/dist/providers/base-provider.js.map +1 -0
  63. package/dist/providers/cursor-provider.d.ts +82 -0
  64. package/dist/providers/cursor-provider.d.ts.map +1 -0
  65. package/dist/providers/cursor-provider.js +321 -0
  66. package/dist/providers/cursor-provider.js.map +1 -0
  67. package/dist/providers/google-provider.d.ts +75 -0
  68. package/dist/providers/google-provider.d.ts.map +1 -0
  69. package/dist/providers/google-provider.js +274 -0
  70. package/dist/providers/google-provider.js.map +1 -0
  71. package/dist/providers/index.d.ts +92 -0
  72. package/dist/providers/index.d.ts.map +1 -0
  73. package/dist/providers/index.js +233 -0
  74. package/dist/providers/index.js.map +1 -0
  75. package/dist/providers/openai-provider.d.ts +83 -0
  76. package/dist/providers/openai-provider.d.ts.map +1 -0
  77. package/dist/providers/openai-provider.js +295 -0
  78. package/dist/providers/openai-provider.js.map +1 -0
  79. package/dist/templates/feature_list.template.json +66 -0
  80. package/dist/templates/progress.template.txt +51 -0
  81. package/dist/utils/auth-manager.d.ts +121 -0
  82. package/dist/utils/auth-manager.d.ts.map +1 -0
  83. package/dist/utils/auth-manager.js +560 -0
  84. package/dist/utils/auth-manager.js.map +1 -0
  85. package/dist/utils/budget-enforcer.d.ts +181 -0
  86. package/dist/utils/budget-enforcer.d.ts.map +1 -0
  87. package/dist/utils/budget-enforcer.js +386 -0
  88. package/dist/utils/budget-enforcer.js.map +1 -0
  89. package/dist/utils/chatgpt-detector.d.ts +51 -0
  90. package/dist/utils/chatgpt-detector.d.ts.map +1 -0
  91. package/dist/utils/chatgpt-detector.js +274 -0
  92. package/dist/utils/chatgpt-detector.js.map +1 -0
  93. package/dist/utils/claude-code-detector.d.ts +39 -0
  94. package/dist/utils/claude-code-detector.d.ts.map +1 -0
  95. package/dist/utils/claude-code-detector.js +153 -0
  96. package/dist/utils/claude-code-detector.js.map +1 -0
  97. package/dist/utils/code-quality.d.ts +58 -0
  98. package/dist/utils/code-quality.d.ts.map +1 -0
  99. package/dist/utils/code-quality.js +258 -0
  100. package/dist/utils/code-quality.js.map +1 -0
  101. package/dist/utils/context-primer.d.ts +50 -0
  102. package/dist/utils/context-primer.d.ts.map +1 -0
  103. package/dist/utils/context-primer.js +429 -0
  104. package/dist/utils/context-primer.js.map +1 -0
  105. package/dist/utils/dependency-management.d.ts +40 -0
  106. package/dist/utils/dependency-management.d.ts.map +1 -0
  107. package/dist/utils/dependency-management.js +123 -0
  108. package/dist/utils/dependency-management.js.map +1 -0
  109. package/dist/utils/environment-validation.d.ts +33 -0
  110. package/dist/utils/environment-validation.d.ts.map +1 -0
  111. package/dist/utils/environment-validation.js +136 -0
  112. package/dist/utils/environment-validation.js.map +1 -0
  113. package/dist/utils/error-recovery.d.ts +60 -0
  114. package/dist/utils/error-recovery.d.ts.map +1 -0
  115. package/dist/utils/error-recovery.js +183 -0
  116. package/dist/utils/error-recovery.js.map +1 -0
  117. package/dist/utils/feature-list.d.ts +102 -0
  118. package/dist/utils/feature-list.d.ts.map +1 -0
  119. package/dist/utils/feature-list.js +191 -0
  120. package/dist/utils/feature-list.js.map +1 -0
  121. package/dist/utils/gemini-detector.d.ts +65 -0
  122. package/dist/utils/gemini-detector.d.ts.map +1 -0
  123. package/dist/utils/gemini-detector.js +340 -0
  124. package/dist/utils/gemini-detector.js.map +1 -0
  125. package/dist/utils/git-utils.d.ts +48 -0
  126. package/dist/utils/git-utils.d.ts.map +1 -0
  127. package/dist/utils/git-utils.js +110 -0
  128. package/dist/utils/git-utils.js.map +1 -0
  129. package/dist/utils/health-check.d.ts +32 -0
  130. package/dist/utils/health-check.d.ts.map +1 -0
  131. package/dist/utils/health-check.js +152 -0
  132. package/dist/utils/health-check.js.map +1 -0
  133. package/dist/utils/hooks-manager.d.ts +154 -0
  134. package/dist/utils/hooks-manager.d.ts.map +1 -0
  135. package/dist/utils/hooks-manager.js +359 -0
  136. package/dist/utils/hooks-manager.js.map +1 -0
  137. package/dist/utils/multi-auth-manager.d.ts +144 -0
  138. package/dist/utils/multi-auth-manager.d.ts.map +1 -0
  139. package/dist/utils/multi-auth-manager.js +588 -0
  140. package/dist/utils/multi-auth-manager.js.map +1 -0
  141. package/dist/utils/progress.d.ts +49 -0
  142. package/dist/utils/progress.d.ts.map +1 -0
  143. package/dist/utils/progress.js +209 -0
  144. package/dist/utils/progress.js.map +1 -0
  145. package/dist/utils/project-detection.d.ts +40 -0
  146. package/dist/utils/project-detection.d.ts.map +1 -0
  147. package/dist/utils/project-detection.js +230 -0
  148. package/dist/utils/project-detection.js.map +1 -0
  149. package/dist/utils/session-manager.d.ts +119 -0
  150. package/dist/utils/session-manager.d.ts.map +1 -0
  151. package/dist/utils/session-manager.js +389 -0
  152. package/dist/utils/session-manager.js.map +1 -0
  153. package/dist/utils/skills-manager.d.ts +113 -0
  154. package/dist/utils/skills-manager.d.ts.map +1 -0
  155. package/dist/utils/skills-manager.js +332 -0
  156. package/dist/utils/skills-manager.js.map +1 -0
  157. package/dist/utils/structured-output.d.ts +117 -0
  158. package/dist/utils/structured-output.d.ts.map +1 -0
  159. package/dist/utils/structured-output.js +191 -0
  160. package/dist/utils/structured-output.js.map +1 -0
  161. package/dist/utils/subagent-manager.d.ts +143 -0
  162. package/dist/utils/subagent-manager.d.ts.map +1 -0
  163. package/dist/utils/subagent-manager.js +326 -0
  164. package/dist/utils/subagent-manager.js.map +1 -0
  165. package/dist/utils/supabase-setup.d.ts +50 -0
  166. package/dist/utils/supabase-setup.d.ts.map +1 -0
  167. package/dist/utils/supabase-setup.js +151 -0
  168. package/dist/utils/supabase-setup.js.map +1 -0
  169. package/dist/utils/token-refresh.d.ts +21 -0
  170. package/dist/utils/token-refresh.d.ts.map +1 -0
  171. package/dist/utils/token-refresh.js +77 -0
  172. package/dist/utils/token-refresh.js.map +1 -0
  173. package/dist/utils/tos-warning.d.ts +115 -0
  174. package/dist/utils/tos-warning.d.ts.map +1 -0
  175. package/dist/utils/tos-warning.js +304 -0
  176. package/dist/utils/tos-warning.js.map +1 -0
  177. package/dist/utils/usage-monitor.d.ts +156 -0
  178. package/dist/utils/usage-monitor.d.ts.map +1 -0
  179. package/dist/utils/usage-monitor.js +296 -0
  180. package/dist/utils/usage-monitor.js.map +1 -0
  181. package/package.json +105 -0
  182. package/scripts/init.ps1 +73 -0
  183. package/scripts/init.sh +86 -0
  184. package/scripts/test-auth.sh +90 -0
  185. package/templates/feature_list.template.json +66 -0
  186. package/templates/progress.template.txt +51 -0
@@ -0,0 +1,560 @@
1
+ /**
2
+ * Authentication Manager
3
+ * Handles user authentication, credential storage, and subscription validation.
4
+ *
5
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
6
+ * Licensed under CC BY-NC 4.0
7
+ */
8
+ import { existsSync, mkdirSync, readFileSync, writeFileSync, unlinkSync } from 'fs';
9
+ import { createInterface } from 'readline';
10
+ import open from 'open';
11
+ import { authConfig, AUTH_ENV_VARS, } from '../config/auth-config.js';
12
+ import { detectClaudeCodeCredentials, getDaysUntilExpiration, getClaudeCodePaths } from './claude-code-detector.js';
13
+ import { isTokenExpired, refreshSubscriptionToken } from './token-refresh.js';
14
+ /**
15
+ * AuthManager - Singleton for managing authentication state
16
+ */
17
+ export class AuthManager {
18
+ static instance;
19
+ session;
20
+ constructor() {
21
+ this.session = {
22
+ isAuthenticated: false,
23
+ credentials: null,
24
+ lastValidated: null,
25
+ };
26
+ }
27
+ /**
28
+ * Get the singleton instance
29
+ */
30
+ static getInstance() {
31
+ if (!AuthManager.instance) {
32
+ AuthManager.instance = new AuthManager();
33
+ }
34
+ return AuthManager.instance;
35
+ }
36
+ /**
37
+ * Ensure the config directory exists
38
+ */
39
+ ensureConfigDir() {
40
+ if (!existsSync(authConfig.configDir)) {
41
+ mkdirSync(authConfig.configDir, { recursive: true });
42
+ }
43
+ }
44
+ /**
45
+ * Load credentials from file
46
+ */
47
+ loadCredentials() {
48
+ try {
49
+ if (existsSync(authConfig.credentialsPath)) {
50
+ const data = readFileSync(authConfig.credentialsPath, 'utf-8');
51
+ return JSON.parse(data);
52
+ }
53
+ }
54
+ catch (error) {
55
+ console.error('Failed to load credentials:', error);
56
+ }
57
+ return null;
58
+ }
59
+ /**
60
+ * Save credentials to file
61
+ */
62
+ saveCredentials(credentials) {
63
+ this.ensureConfigDir();
64
+ // Store credentials with restricted permissions (0600)
65
+ writeFileSync(authConfig.credentialsPath, JSON.stringify(credentials, null, 2), {
66
+ mode: 0o600,
67
+ });
68
+ // CRITICAL: On Windows, mode parameter is ignored. Set permissions explicitly.
69
+ if (process.platform === 'win32') {
70
+ try {
71
+ const { execSync } = require('child_process');
72
+ // Remove inheritance and grant full control to current user only
73
+ execSync(`icacls "${authConfig.credentialsPath}" /inheritance:r /grant:r "%USERNAME%:F"`, {
74
+ stdio: 'ignore',
75
+ });
76
+ }
77
+ catch (error) {
78
+ console.warn('Warning: Could not set Windows file permissions for credentials file');
79
+ }
80
+ }
81
+ this.session.credentials = credentials;
82
+ this.session.isAuthenticated = true;
83
+ this.session.lastValidated = Date.now();
84
+ }
85
+ /**
86
+ * Clear stored credentials (logout)
87
+ */
88
+ clearCredentials() {
89
+ try {
90
+ if (existsSync(authConfig.credentialsPath)) {
91
+ unlinkSync(authConfig.credentialsPath);
92
+ }
93
+ if (existsSync(authConfig.sessionPath)) {
94
+ unlinkSync(authConfig.sessionPath);
95
+ }
96
+ }
97
+ catch (error) {
98
+ // Ignore errors during cleanup
99
+ }
100
+ this.session = {
101
+ isAuthenticated: false,
102
+ credentials: null,
103
+ lastValidated: null,
104
+ };
105
+ }
106
+ /**
107
+ * Check if user is authenticated (from file or environment)
108
+ */
109
+ isAuthenticated() {
110
+ // Check environment variables first
111
+ if (process.env[AUTH_ENV_VARS.API_KEY] || process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY]) {
112
+ return true;
113
+ }
114
+ // Check stored credentials
115
+ const credentials = this.loadCredentials();
116
+ if (credentials) {
117
+ // Check if token is expired
118
+ if (credentials.expiresAt && credentials.expiresAt < Date.now()) {
119
+ return false;
120
+ }
121
+ this.session.credentials = credentials;
122
+ this.session.isAuthenticated = true;
123
+ return true;
124
+ }
125
+ return false;
126
+ }
127
+ /**
128
+ * Get the API key synchronously (without token refresh)
129
+ * Used for display and environment setting where refresh isn't needed
130
+ */
131
+ getApiKeySync() {
132
+ // Priority: env var > stored subscription key > stored API key
133
+ const subscriptionKey = process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY];
134
+ if (subscriptionKey) {
135
+ return subscriptionKey;
136
+ }
137
+ const apiKey = process.env[AUTH_ENV_VARS.API_KEY];
138
+ if (apiKey) {
139
+ return apiKey;
140
+ }
141
+ const credentials = this.loadCredentials();
142
+ if (credentials) {
143
+ return credentials.subscriptionKey || credentials.apiKey || null;
144
+ }
145
+ return null;
146
+ }
147
+ /**
148
+ * Get the API key to use (from stored credentials or environment)
149
+ * Automatically attempts to refresh expired tokens
150
+ */
151
+ async getApiKey() {
152
+ // Priority: env var > stored subscription key > stored API key
153
+ const subscriptionKey = process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY];
154
+ if (subscriptionKey) {
155
+ return subscriptionKey;
156
+ }
157
+ const apiKey = process.env[AUTH_ENV_VARS.API_KEY];
158
+ if (apiKey) {
159
+ return apiKey;
160
+ }
161
+ const credentials = this.loadCredentials();
162
+ if (credentials) {
163
+ // Check if token is expired
164
+ if (isTokenExpired(credentials.expiresAt)) {
165
+ console.log('Token expired, attempting refresh...');
166
+ if (credentials.refreshToken && credentials.method === 'subscription') {
167
+ // Attempt to refresh the token
168
+ const refreshed = await refreshSubscriptionToken(credentials.refreshToken);
169
+ if (refreshed) {
170
+ this.saveCredentials(refreshed);
171
+ console.log('✓ Token refreshed successfully');
172
+ return refreshed.subscriptionKey || refreshed.apiKey || null;
173
+ }
174
+ else {
175
+ console.error('✗ Token refresh failed');
176
+ }
177
+ }
178
+ // If we reach here, refresh failed or not possible
179
+ console.error('Token expired and could not be refreshed. Please run: monty login');
180
+ return null;
181
+ }
182
+ return credentials.subscriptionKey || credentials.apiKey || null;
183
+ }
184
+ return null;
185
+ }
186
+ /**
187
+ * Get current auth method
188
+ */
189
+ getAuthMethod() {
190
+ if (process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY]) {
191
+ return 'subscription';
192
+ }
193
+ if (process.env[AUTH_ENV_VARS.API_KEY]) {
194
+ return 'api_key';
195
+ }
196
+ const credentials = this.loadCredentials();
197
+ return credentials?.method || null;
198
+ }
199
+ /**
200
+ * Get user info for display
201
+ */
202
+ getUserInfo() {
203
+ const credentials = this.loadCredentials();
204
+ const apiKey = this.getApiKeySync();
205
+ return {
206
+ authenticated: this.isAuthenticated(),
207
+ method: this.getAuthMethod(),
208
+ email: credentials?.email || null,
209
+ tier: credentials?.tier || null,
210
+ keyPreview: apiKey ? `${apiKey.slice(0, 8)}...${apiKey.slice(-4)}` : null,
211
+ };
212
+ }
213
+ /**
214
+ * Attempt to auto-detect Claude Code subscription credentials
215
+ * Checks paths defined in authConfig.claudeCodePaths
216
+ */
217
+ async autoDetectClaudeCode() {
218
+ console.log('Checking for existing Claude Code subscription credentials...');
219
+ console.log(' Checking paths:', getClaudeCodePaths().join(', '));
220
+ try {
221
+ const claudeCreds = await detectClaudeCodeCredentials();
222
+ if (claudeCreds) {
223
+ console.log('✓ Found Claude Code subscription credentials!');
224
+ const daysRemaining = getDaysUntilExpiration(claudeCreds.expiresAt);
225
+ if (daysRemaining !== null) {
226
+ console.log(`✓ Token is valid (expires in ${daysRemaining} days)`);
227
+ }
228
+ else {
229
+ console.log('✓ Token is valid');
230
+ }
231
+ // Determine tier from credentials if available
232
+ const tier = claudeCreds.tier || 'pro';
233
+ const credentials = {
234
+ method: 'subscription',
235
+ source: 'auto-detect',
236
+ subscriptionKey: claudeCreds.accessToken,
237
+ refreshToken: claudeCreds.refreshToken,
238
+ tier,
239
+ userId: `user_${Date.now()}`,
240
+ // Normalize expiresAt to milliseconds
241
+ expiresAt: claudeCreds.expiresAt
242
+ ? (claudeCreds.expiresAt > 1e12 ? claudeCreds.expiresAt : claudeCreds.expiresAt * 1000)
243
+ : undefined,
244
+ };
245
+ this.saveCredentials(credentials);
246
+ console.log('✓ Imported successfully');
247
+ return true;
248
+ }
249
+ console.log('No Claude Code subscription credentials found.');
250
+ return false;
251
+ }
252
+ catch (error) {
253
+ console.error('Error detecting Claude Code credentials:', error);
254
+ return false;
255
+ }
256
+ }
257
+ /**
258
+ * Interactive login flow
259
+ * Supports:
260
+ * 1. Auto-detection of Claude Code subscription credentials
261
+ * 2. OAuth login via claude.ai (for Pro/Max/Team/Enterprise subscribers)
262
+ * 3. Manual Anthropic API key entry
263
+ */
264
+ async login(options) {
265
+ const rl = createInterface({
266
+ input: process.stdin,
267
+ output: process.stdout,
268
+ });
269
+ const question = (prompt) => {
270
+ return new Promise((resolve) => {
271
+ rl.question(prompt, (answer) => {
272
+ resolve(answer.trim());
273
+ });
274
+ });
275
+ };
276
+ try {
277
+ // Auto-detect first if no specific method requested
278
+ if (!options?.method && !options?.key) {
279
+ const autoDetected = await this.autoDetectClaudeCode();
280
+ if (autoDetected) {
281
+ rl.close();
282
+ return true;
283
+ }
284
+ }
285
+ console.log('\n╔══════════════════════════════════════════════════════════════╗');
286
+ console.log('║ Monty Agent Authentication ║');
287
+ console.log('╚══════════════════════════════════════════════════════════════╝\n');
288
+ let method = options?.method || 'subscription';
289
+ let key = options?.key || '';
290
+ let email = options?.email || '';
291
+ let source = 'manual';
292
+ // If method not provided, ask user
293
+ if (!options?.method) {
294
+ console.log('Select authentication method:\n');
295
+ console.log(' 1. Login with Claude Subscription (Pro/Max/Team/Enterprise) - Recommended');
296
+ console.log(' Uses Claude Code CLI to authenticate with your claude.ai account\n');
297
+ console.log(' 2. Use Anthropic API Key (from console.anthropic.com)');
298
+ console.log(' For developers with API access\n');
299
+ const choice = await question('Enter choice (1 or 2): ');
300
+ if (choice === '2') {
301
+ method = 'api_key';
302
+ }
303
+ else {
304
+ method = 'subscription';
305
+ }
306
+ }
307
+ // Handle subscription login via Claude Code CLI
308
+ if (!key && method === 'subscription') {
309
+ console.log('\n─────────────────────────────────────────────────────────────');
310
+ console.log(' Claude Subscription Login');
311
+ console.log('─────────────────────────────────────────────────────────────\n');
312
+ console.log('To authenticate with your Claude subscription:\n');
313
+ console.log(' Step 1: Run "claude login" in your terminal');
314
+ console.log(' This will open a browser to authenticate with claude.ai\n');
315
+ console.log(' Step 2: After authenticating, run "monty login" again');
316
+ console.log(' Monty will automatically detect your credentials\n');
317
+ const proceed = await question('Have you already run "claude login"? (y/N): ');
318
+ if (proceed.toLowerCase() === 'y') {
319
+ // Try auto-detection again
320
+ console.log('\nRe-checking for Claude Code credentials...');
321
+ const detected = await this.autoDetectClaudeCode();
322
+ if (detected) {
323
+ rl.close();
324
+ return true;
325
+ }
326
+ console.log('\nStill no credentials found. Please ensure "claude login" completed successfully.\n');
327
+ }
328
+ const openClaude = await question('Would you like to open Claude Code installation page? (y/N): ');
329
+ if (openClaude.toLowerCase() === 'y') {
330
+ try {
331
+ await open('https://docs.anthropic.com/en/docs/claude-code/getting-started');
332
+ console.log('✓ Browser opened to Claude Code documentation\n');
333
+ }
334
+ catch {
335
+ console.log('Could not open browser. Visit: https://docs.anthropic.com/en/docs/claude-code/getting-started\n');
336
+ }
337
+ }
338
+ const useApiKey = await question('Would you like to use an Anthropic API key instead? (y/N): ');
339
+ if (useApiKey.toLowerCase() === 'y') {
340
+ method = 'api_key';
341
+ }
342
+ else {
343
+ console.log('\nPlease run "claude login" first, then try "monty login" again.\n');
344
+ rl.close();
345
+ return false;
346
+ }
347
+ }
348
+ // Get API key manually
349
+ if (!key && method === 'api_key') {
350
+ console.log('\n─────────────────────────────────────────────────────────────');
351
+ console.log(' Anthropic API Key Entry');
352
+ console.log('─────────────────────────────────────────────────────────────\n');
353
+ console.log('To get your Anthropic API key:');
354
+ console.log(' 1. Go to https://console.anthropic.com/settings/keys');
355
+ console.log(' 2. Create a new key or copy an existing one\n');
356
+ const openBrowser = await question('Open browser to get API key? (y/N): ');
357
+ if (openBrowser.toLowerCase() === 'y') {
358
+ try {
359
+ await open('https://console.anthropic.com/settings/keys');
360
+ console.log('✓ Browser opened to Anthropic Console\n');
361
+ }
362
+ catch {
363
+ console.log('Could not open browser. Please visit the URL manually.\n');
364
+ }
365
+ }
366
+ key = await question('API key (sk-ant-...): ');
367
+ source = 'manual';
368
+ }
369
+ // Validate key format
370
+ if (!key || key.length < 20) {
371
+ console.log('\n✗ Error: Invalid key format. Key appears too short.');
372
+ rl.close();
373
+ return false;
374
+ }
375
+ // Optional: get email for display purposes
376
+ if (!email) {
377
+ email = await question('\nEmail (optional, press Enter to skip): ');
378
+ }
379
+ // Validate the key by making a test API call
380
+ console.log('\nValidating credentials...');
381
+ const isValid = await this.validateKey(key);
382
+ if (!isValid) {
383
+ console.log('\n✗ Error: Could not validate credentials. Please check your key and try again.');
384
+ rl.close();
385
+ return false;
386
+ }
387
+ console.log('✓ Credentials validated');
388
+ // Save credentials
389
+ const credentials = {
390
+ method,
391
+ source,
392
+ ...(method === 'subscription' ? { subscriptionKey: key } : { apiKey: key }),
393
+ email: email || undefined,
394
+ tier: 'pro', // Default, would be fetched from API in production
395
+ userId: `user_${Date.now()}`,
396
+ };
397
+ this.saveCredentials(credentials);
398
+ console.log('\n═══════════════════════════════════════════════════════════════');
399
+ console.log(' ✓ Login Successful!');
400
+ console.log('═══════════════════════════════════════════════════════════════\n');
401
+ console.log(` Method: ${method === 'subscription' ? 'Claude Subscription' : 'Anthropic API Key'}`);
402
+ console.log(` Source: ${source}`);
403
+ if (email) {
404
+ console.log(` Email: ${email}`);
405
+ }
406
+ console.log(` Key: ${key.slice(0, 8)}...${key.slice(-4)}`);
407
+ console.log('\n Credentials saved to: ~/.monty/credentials.json');
408
+ console.log('\n You can now run "monty init" or "monty code" to start.\n');
409
+ rl.close();
410
+ return true;
411
+ }
412
+ catch (error) {
413
+ console.error('Login failed:', error);
414
+ rl.close();
415
+ return false;
416
+ }
417
+ }
418
+ /**
419
+ * Validate an API key by making a test request
420
+ */
421
+ async validateKey(key) {
422
+ try {
423
+ // Make a minimal API request to validate the key
424
+ const response = await fetch('https://api.anthropic.com/v1/messages', {
425
+ method: 'POST',
426
+ headers: {
427
+ 'Content-Type': 'application/json',
428
+ 'x-api-key': key,
429
+ 'anthropic-version': '2023-06-01',
430
+ },
431
+ body: JSON.stringify({
432
+ model: 'claude-3-haiku-20240307',
433
+ max_tokens: 1,
434
+ messages: [{ role: 'user', content: 'hi' }],
435
+ }),
436
+ });
437
+ // 200 = valid, 401 = invalid key, 400 = valid key but bad request (still valid)
438
+ return response.status === 200 || response.status === 400;
439
+ }
440
+ catch (error) {
441
+ // Network error - assume key might be valid, let actual usage fail if not
442
+ console.warn('Could not validate key online, proceeding anyway...');
443
+ return true;
444
+ }
445
+ }
446
+ /**
447
+ * Logout - clear credentials
448
+ */
449
+ logout() {
450
+ const wasAuthenticated = this.isAuthenticated();
451
+ this.clearCredentials();
452
+ if (wasAuthenticated) {
453
+ console.log('\nYou have been logged out.');
454
+ console.log('Your credentials have been removed from ~/.monty/credentials.json\n');
455
+ }
456
+ else {
457
+ console.log('\nYou were not logged in.\n');
458
+ }
459
+ }
460
+ /**
461
+ * Display current auth status (whoami)
462
+ */
463
+ whoami() {
464
+ const info = this.getUserInfo();
465
+ const credentials = this.loadCredentials();
466
+ console.log('\n╔══════════════════════════════════════════════════════════════╗');
467
+ console.log('║ Monty Agent - Current User ║');
468
+ console.log('╚══════════════════════════════════════════════════════════════╝\n');
469
+ if (!info.authenticated) {
470
+ console.log(' Status: Not authenticated\n');
471
+ console.log(' Run "monty login" to authenticate.\n');
472
+ return;
473
+ }
474
+ console.log(' Status: ✓ Authenticated');
475
+ console.log(` Method: ${info.method === 'subscription' ? 'Claude Subscription' : 'Anthropic API Key'}`);
476
+ if (credentials?.source) {
477
+ console.log(` Source: ${credentials.source}`);
478
+ }
479
+ if (info.email) {
480
+ console.log(` Email: ${info.email}`);
481
+ }
482
+ if (info.tier) {
483
+ const tierDisplay = info.tier.charAt(0).toUpperCase() + info.tier.slice(1);
484
+ console.log(` Tier: ${tierDisplay}`);
485
+ }
486
+ if (info.keyPreview) {
487
+ console.log(` Key: ${info.keyPreview}`);
488
+ }
489
+ // Check if using environment variable
490
+ if (process.env[AUTH_ENV_VARS.SUBSCRIPTION_KEY] || process.env[AUTH_ENV_VARS.API_KEY]) {
491
+ console.log('\n Note: Using credentials from environment variable');
492
+ }
493
+ else {
494
+ console.log('\n Credentials: ~/.monty/credentials.json');
495
+ }
496
+ console.log('');
497
+ }
498
+ /**
499
+ * Set environment variable for child processes
500
+ */
501
+ setEnvForChildProcess() {
502
+ const apiKey = this.getApiKeySync();
503
+ if (apiKey) {
504
+ // SDK only reads ANTHROPIC_API_KEY, so just set that one variable
505
+ process.env[AUTH_ENV_VARS.API_KEY] = apiKey;
506
+ // Log which authentication method is being used (for debugging)
507
+ const method = this.getAuthMethod();
508
+ if (method === 'subscription') {
509
+ console.log('✓ Authentication configured: Claude subscription');
510
+ }
511
+ else if (method === 'api_key') {
512
+ console.log('✓ Authentication configured: API key');
513
+ }
514
+ else {
515
+ console.log('✓ Authentication configured');
516
+ }
517
+ }
518
+ }
519
+ /**
520
+ * Check authentication and return status for CLI
521
+ */
522
+ checkAuth() {
523
+ if (this.isAuthenticated()) {
524
+ return {
525
+ authenticated: true,
526
+ message: 'Authenticated',
527
+ };
528
+ }
529
+ return {
530
+ authenticated: false,
531
+ message: `Not authenticated. Run "monty login" to sign in, or set ${AUTH_ENV_VARS.API_KEY} environment variable.`,
532
+ };
533
+ }
534
+ }
535
+ // Export singleton instance
536
+ export const authManager = AuthManager.getInstance();
537
+ // Export convenience functions
538
+ export function isAuthenticated() {
539
+ return authManager.isAuthenticated();
540
+ }
541
+ export function getApiKey() {
542
+ return authManager.getApiKeySync();
543
+ }
544
+ export function login(options) {
545
+ return authManager.login(options);
546
+ }
547
+ export function logout() {
548
+ authManager.logout();
549
+ }
550
+ export function whoami() {
551
+ authManager.whoami();
552
+ }
553
+ export function checkAuth() {
554
+ return authManager.checkAuth();
555
+ }
556
+ export function setEnvForChildProcess() {
557
+ authManager.setEnvForChildProcess();
558
+ }
559
+ export default authManager;
560
+ //# sourceMappingURL=auth-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-manager.js","sourceRoot":"","sources":["../../src/utils/auth-manager.ts"],"names":[],"mappings":"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"}