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,274 @@
1
+ /**
2
+ * ChatGPT Subscription Detector
3
+ * Detects ChatGPT Plus/Team/Enterprise subscription credentials from local system.
4
+ * Similar to Claude Code detector for Anthropic subscriptions.
5
+ *
6
+ * Copyright (c) 2025 Dobeu Tech Solutions LLC
7
+ * Licensed under CC BY-NC 4.0
8
+ */
9
+ import { existsSync, readFileSync } from 'fs';
10
+ import { join } from 'path';
11
+ import { homedir } from 'os';
12
+ import { exec } from 'child_process';
13
+ import { promisify } from 'util';
14
+ const execAsync = promisify(exec);
15
+ /**
16
+ * Possible paths where ChatGPT credentials might be stored
17
+ */
18
+ export function getChatGPTPaths() {
19
+ const home = homedir();
20
+ return [
21
+ // Codex CLI paths
22
+ join(home, '.codex', 'credentials.json'),
23
+ join(home, '.codex', 'auth.json'),
24
+ join(home, '.config', 'codex', 'credentials.json'),
25
+ join(home, '.config', 'codex', 'auth.json'),
26
+ // ChatGPT CLI paths (hypothetical)
27
+ join(home, '.chatgpt', 'credentials.json'),
28
+ join(home, '.chatgpt', 'auth.json'),
29
+ join(home, '.config', 'chatgpt', 'credentials.json'),
30
+ // OpenAI CLI paths
31
+ join(home, '.openai', 'credentials.json'),
32
+ join(home, '.openai', 'auth.json'),
33
+ join(home, '.config', 'openai', 'credentials.json'),
34
+ // Windows-specific paths
35
+ join(process.env.APPDATA || '', 'codex', 'credentials.json'),
36
+ join(process.env.APPDATA || '', 'openai', 'credentials.json'),
37
+ join(process.env.LOCALAPPDATA || '', 'codex', 'credentials.json'),
38
+ join(process.env.LOCALAPPDATA || '', 'openai', 'credentials.json'),
39
+ ].filter(p => p && !p.startsWith(join(''))); // Filter out paths starting with just separator
40
+ }
41
+ /**
42
+ * Try to detect credentials using the codex CLI
43
+ */
44
+ async function detectFromCodexCLI() {
45
+ try {
46
+ // Try using codex CLI to get auth info
47
+ const { stdout } = await execAsync('codex auth show --format json', {
48
+ timeout: 5000,
49
+ });
50
+ const config = JSON.parse(stdout);
51
+ if (config.accessToken || config.access_token) {
52
+ const credentials = {
53
+ accessToken: config.accessToken || config.access_token,
54
+ refreshToken: config.refreshToken || config.refresh_token,
55
+ expiresAt: config.expiresAt || config.expires_at,
56
+ tokenType: config.tokenType || config.token_type || 'bearer',
57
+ organizationId: config.organizationId || config.organization_id,
58
+ email: config.email,
59
+ };
60
+ // Infer tier from token or organization
61
+ if (config.tier) {
62
+ credentials.tier = config.tier;
63
+ }
64
+ else if (credentials.organizationId) {
65
+ credentials.tier = 'team';
66
+ }
67
+ else if (credentials.accessToken) {
68
+ credentials.tier = 'plus';
69
+ }
70
+ return credentials;
71
+ }
72
+ return null;
73
+ }
74
+ catch {
75
+ // CLI not available or command failed
76
+ return null;
77
+ }
78
+ }
79
+ /**
80
+ * Try to detect credentials from file system
81
+ */
82
+ async function detectFromFiles() {
83
+ const paths = getChatGPTPaths();
84
+ for (const path of paths) {
85
+ try {
86
+ if (!existsSync(path)) {
87
+ continue;
88
+ }
89
+ const content = readFileSync(path, 'utf-8');
90
+ const data = JSON.parse(content);
91
+ // Check for various credential field names
92
+ const accessToken = data.accessToken ||
93
+ data.access_token ||
94
+ data.token ||
95
+ data.sessionToken ||
96
+ data.session_token;
97
+ if (accessToken) {
98
+ const credentials = {
99
+ accessToken,
100
+ refreshToken: data.refreshToken ||
101
+ data.refresh_token,
102
+ expiresAt: data.expiresAt ||
103
+ data.expires_at ||
104
+ data.exp,
105
+ tokenType: data.tokenType ||
106
+ data.token_type ||
107
+ 'bearer',
108
+ organizationId: data.organizationId ||
109
+ data.organization_id ||
110
+ data.org_id,
111
+ email: data.email,
112
+ };
113
+ // Determine tier
114
+ if (data.tier || data.subscription) {
115
+ credentials.tier = (data.tier || data.subscription).toLowerCase();
116
+ }
117
+ else if (credentials.organizationId) {
118
+ credentials.tier = 'team';
119
+ }
120
+ else {
121
+ credentials.tier = 'plus';
122
+ }
123
+ return credentials;
124
+ }
125
+ }
126
+ catch {
127
+ // Failed to read or parse this file, try next
128
+ continue;
129
+ }
130
+ }
131
+ return null;
132
+ }
133
+ /**
134
+ * Check if token is expired
135
+ */
136
+ export function isTokenExpired(credentials) {
137
+ if (!credentials.expiresAt) {
138
+ return false; // No expiration = assume valid
139
+ }
140
+ // Handle both seconds and milliseconds
141
+ let expiresAt = credentials.expiresAt;
142
+ if (expiresAt < 1e12) {
143
+ expiresAt *= 1000; // Convert seconds to milliseconds
144
+ }
145
+ // Add 5-minute grace period
146
+ const graceMs = 5 * 60 * 1000;
147
+ return expiresAt - graceMs < Date.now();
148
+ }
149
+ /**
150
+ * Get days until expiration
151
+ */
152
+ export function getDaysUntilExpiration(credentials) {
153
+ if (!credentials.expiresAt) {
154
+ return null;
155
+ }
156
+ let expiresAt = credentials.expiresAt;
157
+ if (expiresAt < 1e12) {
158
+ expiresAt *= 1000;
159
+ }
160
+ const msUntil = expiresAt - Date.now();
161
+ if (msUntil <= 0) {
162
+ return 0;
163
+ }
164
+ return Math.ceil(msUntil / (24 * 60 * 60 * 1000));
165
+ }
166
+ /**
167
+ * Attempt to refresh the access token
168
+ */
169
+ export async function refreshChatGPTToken(refreshToken) {
170
+ try {
171
+ // Try using codex CLI to refresh
172
+ const { stdout } = await execAsync('codex auth refresh --format json', {
173
+ timeout: 10000,
174
+ });
175
+ const config = JSON.parse(stdout);
176
+ if (config.accessToken || config.access_token) {
177
+ return {
178
+ accessToken: config.accessToken || config.access_token,
179
+ refreshToken: config.refreshToken || config.refresh_token || refreshToken,
180
+ expiresAt: config.expiresAt || config.expires_at,
181
+ tokenType: config.tokenType || config.token_type || 'bearer',
182
+ };
183
+ }
184
+ return null;
185
+ }
186
+ catch {
187
+ // CLI refresh failed
188
+ return null;
189
+ }
190
+ }
191
+ /**
192
+ * Main detection function
193
+ * Attempts to find ChatGPT/OpenAI subscription credentials from the local system
194
+ */
195
+ export async function detectChatGPTCredentials() {
196
+ // First, try using the CLI
197
+ const cliCredentials = await detectFromCodexCLI();
198
+ if (cliCredentials) {
199
+ if (!isTokenExpired(cliCredentials)) {
200
+ return cliCredentials;
201
+ }
202
+ // Try to refresh expired token
203
+ if (cliCredentials.refreshToken) {
204
+ const refreshed = await refreshChatGPTToken(cliCredentials.refreshToken);
205
+ if (refreshed && !isTokenExpired(refreshed)) {
206
+ return refreshed;
207
+ }
208
+ }
209
+ }
210
+ // Fall back to file-based detection
211
+ const fileCredentials = await detectFromFiles();
212
+ if (fileCredentials) {
213
+ if (!isTokenExpired(fileCredentials)) {
214
+ return fileCredentials;
215
+ }
216
+ // Try to refresh
217
+ if (fileCredentials.refreshToken) {
218
+ const refreshed = await refreshChatGPTToken(fileCredentials.refreshToken);
219
+ if (refreshed && !isTokenExpired(refreshed)) {
220
+ return refreshed;
221
+ }
222
+ }
223
+ }
224
+ return null;
225
+ }
226
+ /**
227
+ * Validate ChatGPT credentials against the API
228
+ */
229
+ export async function validateChatGPTCredentials(credentials) {
230
+ try {
231
+ const response = await fetch('https://api.openai.com/v1/models', {
232
+ method: 'GET',
233
+ headers: {
234
+ Authorization: `Bearer ${credentials.accessToken}`,
235
+ },
236
+ });
237
+ return response.status === 200;
238
+ }
239
+ catch {
240
+ // Network error, assume valid
241
+ return true;
242
+ }
243
+ }
244
+ /**
245
+ * Get credential status string
246
+ */
247
+ export function getCredentialStatus(credentials) {
248
+ const parts = [];
249
+ parts.push(`Tier: ${credentials.tier || 'unknown'}`);
250
+ if (credentials.email) {
251
+ parts.push(`Email: ${credentials.email}`);
252
+ }
253
+ if (credentials.organizationId) {
254
+ parts.push(`Org: ${credentials.organizationId}`);
255
+ }
256
+ const daysUntil = getDaysUntilExpiration(credentials);
257
+ if (daysUntil !== null) {
258
+ if (daysUntil === 0) {
259
+ parts.push('Status: Expired');
260
+ }
261
+ else if (daysUntil <= 7) {
262
+ parts.push(`Expires in: ${daysUntil} days ⚠️`);
263
+ }
264
+ else {
265
+ parts.push(`Expires in: ${daysUntil} days`);
266
+ }
267
+ }
268
+ else {
269
+ parts.push('Status: Valid (no expiration)');
270
+ }
271
+ return parts.join(' | ');
272
+ }
273
+ export default detectChatGPTCredentials;
274
+ //# sourceMappingURL=chatgpt-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chatgpt-detector.js","sourceRoot":"","sources":["../../src/utils/chatgpt-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Claude Code Credential Detector
3
+ * Detects existing Claude Code subscription credentials from the local system.
4
+ *
5
+ * Claude Code stores credentials in different locations depending on OS:
6
+ * - Linux/Windows: ~/.config/claude-code/auth.json
7
+ * - macOS: Uses Keychain (encrypted) - we check file fallbacks
8
+ * - Alternative: ~/.claude/credentials.json or ~/.claude/auth.json
9
+ */
10
+ export interface ClaudeCredentials {
11
+ accessToken: string;
12
+ refreshToken?: string;
13
+ expiresAt?: number;
14
+ tokenType?: string;
15
+ scope?: string;
16
+ tier?: string;
17
+ }
18
+ /**
19
+ * Detects existing Claude Code subscription credentials from the local system
20
+ * Priority:
21
+ * 1. Use `claude config show` command (handles Keychain/Credential Manager/files automatically)
22
+ * 2. Fall back to file-based detection
23
+ */
24
+ export declare function detectClaudeCodeCredentials(): Promise<ClaudeCredentials | null>;
25
+ /**
26
+ * Checks if a token is expired
27
+ */
28
+ export declare function isTokenExpired(tokenData: {
29
+ expiresAt?: number;
30
+ }): boolean;
31
+ /**
32
+ * Get days remaining until token expiration
33
+ */
34
+ export declare function getDaysUntilExpiration(expiresAt?: number): number | null;
35
+ /**
36
+ * Get all paths that are checked for Claude Code credentials
37
+ */
38
+ export declare function getClaudeCodePaths(): string[];
39
+ //# sourceMappingURL=claude-code-detector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-detector.d.ts","sourceRoot":"","sources":["../../src/utils/claude-code-detector.ts"],"names":[],"mappings":"AASA;;;;;;;;GAQG;AAEH,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAwED;;;;;GAKG;AACH,wBAAsB,2BAA2B,IAAI,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC,CA4BrF;AAyBD;;GAEG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAYzE;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CASxE;AAED;;GAEG;AACH,wBAAgB,kBAAkB,IAAI,MAAM,EAAE,CAE7C"}
@@ -0,0 +1,153 @@
1
+ import { join } from 'path';
2
+ import { homedir } from 'os';
3
+ import { existsSync, readFileSync } from 'fs';
4
+ import { exec } from 'child_process';
5
+ import { promisify } from 'util';
6
+ import { authConfig } from '../config/auth-config.js';
7
+ const execAsync = promisify(exec);
8
+ /**
9
+ * Get all possible paths where Claude Code might store credentials
10
+ */
11
+ function getCredentialPaths() {
12
+ // Use paths from config, plus some additional fallbacks
13
+ const paths = [
14
+ ...authConfig.claudeCodePaths,
15
+ join(homedir(), '.claude', 'token.json'), // Legacy location
16
+ join(homedir(), '.config', 'claude', 'auth.json'), // Alternative config location
17
+ ];
18
+ // Remove duplicates
19
+ return [...new Set(paths)];
20
+ }
21
+ /**
22
+ * Try to parse credentials from a file
23
+ */
24
+ function tryParseCredentials(filePath) {
25
+ try {
26
+ if (!existsSync(filePath)) {
27
+ return null;
28
+ }
29
+ const fileContent = readFileSync(filePath, 'utf-8');
30
+ const data = JSON.parse(fileContent);
31
+ // Handle different credential file formats
32
+ // Format 1: Direct token format
33
+ if (data.accessToken || data.access_token) {
34
+ return {
35
+ accessToken: data.accessToken || data.access_token,
36
+ refreshToken: data.refreshToken || data.refresh_token,
37
+ expiresAt: data.expiresAt || data.expires_at,
38
+ tokenType: data.tokenType || data.token_type || 'Bearer',
39
+ scope: data.scope,
40
+ tier: data.tier || data.subscription_tier,
41
+ };
42
+ }
43
+ // Format 2: Nested under 'credentials' key
44
+ if (data.credentials) {
45
+ return {
46
+ accessToken: data.credentials.accessToken || data.credentials.access_token,
47
+ refreshToken: data.credentials.refreshToken || data.credentials.refresh_token,
48
+ expiresAt: data.credentials.expiresAt || data.credentials.expires_at,
49
+ tokenType: data.credentials.tokenType || data.credentials.token_type || 'Bearer',
50
+ scope: data.credentials.scope,
51
+ tier: data.credentials.tier || data.credentials.subscription_tier,
52
+ };
53
+ }
54
+ // Format 3: OAuth token format
55
+ if (data.token) {
56
+ return {
57
+ accessToken: data.token,
58
+ refreshToken: data.refresh_token,
59
+ expiresAt: data.expires_at,
60
+ tokenType: 'Bearer',
61
+ tier: data.tier,
62
+ };
63
+ }
64
+ return null;
65
+ }
66
+ catch (error) {
67
+ // File exists but couldn't be parsed
68
+ return null;
69
+ }
70
+ }
71
+ /**
72
+ * Detects existing Claude Code subscription credentials from the local system
73
+ * Priority:
74
+ * 1. Use `claude config show` command (handles Keychain/Credential Manager/files automatically)
75
+ * 2. Fall back to file-based detection
76
+ */
77
+ export async function detectClaudeCodeCredentials() {
78
+ // Try to use Claude CLI directly - it handles all platform-specific storage (Keychain, etc.)
79
+ try {
80
+ const { stdout } = await execAsync('claude config show --format json', {
81
+ timeout: 5000, // 5 second timeout
82
+ });
83
+ const config = JSON.parse(stdout);
84
+ if (config.accessToken || config.access_token) {
85
+ const credentials = {
86
+ accessToken: config.accessToken || config.access_token,
87
+ refreshToken: config.refreshToken || config.refresh_token,
88
+ expiresAt: config.expiresAt || config.expires_at,
89
+ tier: config.tier || config.subscription_tier,
90
+ };
91
+ // Check if token is expired
92
+ if (!isTokenExpired(credentials)) {
93
+ return credentials;
94
+ }
95
+ }
96
+ }
97
+ catch (error) {
98
+ // Claude CLI not installed, not authenticated, or command failed - try file-based detection
99
+ }
100
+ // Fallback: Try file-based detection for users without Claude CLI or using file storage
101
+ return await detectFromFiles();
102
+ }
103
+ /**
104
+ * Legacy file-based credential detection (fallback)
105
+ */
106
+ async function detectFromFiles() {
107
+ const paths = getCredentialPaths();
108
+ for (const path of paths) {
109
+ const credentials = tryParseCredentials(path);
110
+ if (credentials && credentials.accessToken) {
111
+ // Check if token is expired
112
+ if (credentials.expiresAt && isTokenExpired(credentials)) {
113
+ console.log(` Found credentials at ${path} but token is expired`);
114
+ continue;
115
+ }
116
+ return credentials;
117
+ }
118
+ }
119
+ return null;
120
+ }
121
+ /**
122
+ * Checks if a token is expired
123
+ */
124
+ export function isTokenExpired(tokenData) {
125
+ if (!tokenData.expiresAt) {
126
+ return false; // Assume valid if no expiry
127
+ }
128
+ // Check if expiresAt is in seconds or milliseconds
129
+ const expiresAtMs = tokenData.expiresAt > 1e12
130
+ ? tokenData.expiresAt
131
+ : tokenData.expiresAt * 1000;
132
+ // Add 5 minute buffer
133
+ return Date.now() >= expiresAtMs - (5 * 60 * 1000);
134
+ }
135
+ /**
136
+ * Get days remaining until token expiration
137
+ */
138
+ export function getDaysUntilExpiration(expiresAt) {
139
+ if (!expiresAt)
140
+ return null;
141
+ const expiresAtMs = expiresAt > 1e12 ? expiresAt : expiresAt * 1000;
142
+ const msRemaining = expiresAtMs - Date.now();
143
+ if (msRemaining <= 0)
144
+ return 0;
145
+ return Math.floor(msRemaining / (1000 * 60 * 60 * 24));
146
+ }
147
+ /**
148
+ * Get all paths that are checked for Claude Code credentials
149
+ */
150
+ export function getClaudeCodePaths() {
151
+ return getCredentialPaths();
152
+ }
153
+ //# sourceMappingURL=claude-code-detector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-code-detector.js","sourceRoot":"","sources":["../../src/utils/claude-code-detector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Code Quality Utilities
3
+ * Provides automated code quality checks, linting, and formatting validation.
4
+ * Helps maintain consistent code quality across sessions.
5
+ */
6
+ /**
7
+ * Code quality check results
8
+ */
9
+ export interface QualityCheckResult {
10
+ passed: boolean;
11
+ checks: {
12
+ typeChecking: CheckResult;
13
+ linting: CheckResult;
14
+ formatting: CheckResult;
15
+ build: CheckResult;
16
+ };
17
+ errors: string[];
18
+ warnings: string[];
19
+ }
20
+ export interface CheckResult {
21
+ status: "pass" | "fail" | "skip" | "unknown";
22
+ message: string;
23
+ command?: string;
24
+ }
25
+ /**
26
+ * Check if TypeScript type checking passes
27
+ */
28
+ export declare function checkTypeScript(): CheckResult;
29
+ /**
30
+ * Check if linting is configured
31
+ */
32
+ export declare function checkLinting(): CheckResult;
33
+ /**
34
+ * Check if code formatting is configured
35
+ */
36
+ export declare function checkFormatting(): CheckResult;
37
+ /**
38
+ * Check if project builds successfully
39
+ */
40
+ export declare function checkBuild(): CheckResult;
41
+ /**
42
+ * Run all code quality checks
43
+ */
44
+ export declare function runQualityChecks(): QualityCheckResult;
45
+ /**
46
+ * Generate quality check summary for agent prompts
47
+ */
48
+ export declare function generateQualitySummary(): string;
49
+ declare const _default: {
50
+ checkTypeScript: typeof checkTypeScript;
51
+ checkLinting: typeof checkLinting;
52
+ checkFormatting: typeof checkFormatting;
53
+ checkBuild: typeof checkBuild;
54
+ runQualityChecks: typeof runQualityChecks;
55
+ generateQualitySummary: typeof generateQualitySummary;
56
+ };
57
+ export default _default;
58
+ //# sourceMappingURL=code-quality.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-quality.d.ts","sourceRoot":"","sources":["../../src/utils/code-quality.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE;QACN,YAAY,EAAE,WAAW,CAAC;QAC1B,OAAO,EAAE,WAAW,CAAC;QACrB,UAAU,EAAE,WAAW,CAAC;QACxB,KAAK,EAAE,WAAW,CAAC;KACpB,CAAC;IACF,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;IAC7C,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAkC7C;AAED;;GAEG;AACH,wBAAgB,YAAY,IAAI,WAAW,CAgD1C;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,WAAW,CAqD7C;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,WAAW,CAyBxC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,kBAAkB,CAoCrD;AAED;;GAEG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAoD/C;;;;;;;;;AAED,wBAOE"}