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.
- package/LICENSE +81 -0
- package/README.md +608 -0
- package/bin/cli.js +448 -0
- package/dist/agents/coding.d.ts +15 -0
- package/dist/agents/coding.d.ts.map +1 -0
- package/dist/agents/coding.js +189 -0
- package/dist/agents/coding.js.map +1 -0
- package/dist/agents/initializer.d.ts +15 -0
- package/dist/agents/initializer.d.ts.map +1 -0
- package/dist/agents/initializer.js +87 -0
- package/dist/agents/initializer.js.map +1 -0
- package/dist/agents/prompts/arbitrator.md +143 -0
- package/dist/agents/prompts/coding.md +247 -0
- package/dist/agents/prompts/initializer.md +98 -0
- package/dist/config/agent-config.d.ts +103 -0
- package/dist/config/agent-config.d.ts.map +1 -0
- package/dist/config/agent-config.js +138 -0
- package/dist/config/agent-config.js.map +1 -0
- package/dist/config/auth-config.d.ts +152 -0
- package/dist/config/auth-config.d.ts.map +1 -0
- package/dist/config/auth-config.js +139 -0
- package/dist/config/auth-config.js.map +1 -0
- package/dist/config/mcp-config.d.ts +109 -0
- package/dist/config/mcp-config.d.ts.map +1 -0
- package/dist/config/mcp-config.js +234 -0
- package/dist/config/mcp-config.js.map +1 -0
- package/dist/config/provider-config.d.ts +139 -0
- package/dist/config/provider-config.d.ts.map +1 -0
- package/dist/config/provider-config.js +344 -0
- package/dist/config/provider-config.js.map +1 -0
- package/dist/config/subagents-config.d.ts +85 -0
- package/dist/config/subagents-config.d.ts.map +1 -0
- package/dist/config/subagents-config.js +430 -0
- package/dist/config/subagents-config.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +385 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/arbitrator.d.ts +93 -0
- package/dist/orchestrator/arbitrator.d.ts.map +1 -0
- package/dist/orchestrator/arbitrator.js +330 -0
- package/dist/orchestrator/arbitrator.js.map +1 -0
- package/dist/orchestrator/index.d.ts +113 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +217 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/review-coordinator.d.ts +143 -0
- package/dist/orchestrator/review-coordinator.d.ts.map +1 -0
- package/dist/orchestrator/review-coordinator.js +401 -0
- package/dist/orchestrator/review-coordinator.js.map +1 -0
- package/dist/orchestrator/task-classifier.d.ts +87 -0
- package/dist/orchestrator/task-classifier.d.ts.map +1 -0
- package/dist/orchestrator/task-classifier.js +250 -0
- package/dist/orchestrator/task-classifier.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +64 -0
- package/dist/providers/anthropic-provider.d.ts.map +1 -0
- package/dist/providers/anthropic-provider.js +264 -0
- package/dist/providers/anthropic-provider.js.map +1 -0
- package/dist/providers/base-provider.d.ts +219 -0
- package/dist/providers/base-provider.d.ts.map +1 -0
- package/dist/providers/base-provider.js +143 -0
- package/dist/providers/base-provider.js.map +1 -0
- package/dist/providers/cursor-provider.d.ts +82 -0
- package/dist/providers/cursor-provider.d.ts.map +1 -0
- package/dist/providers/cursor-provider.js +321 -0
- package/dist/providers/cursor-provider.js.map +1 -0
- package/dist/providers/google-provider.d.ts +75 -0
- package/dist/providers/google-provider.d.ts.map +1 -0
- package/dist/providers/google-provider.js +274 -0
- package/dist/providers/google-provider.js.map +1 -0
- package/dist/providers/index.d.ts +92 -0
- package/dist/providers/index.d.ts.map +1 -0
- package/dist/providers/index.js +233 -0
- package/dist/providers/index.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +83 -0
- package/dist/providers/openai-provider.d.ts.map +1 -0
- package/dist/providers/openai-provider.js +295 -0
- package/dist/providers/openai-provider.js.map +1 -0
- package/dist/templates/feature_list.template.json +66 -0
- package/dist/templates/progress.template.txt +51 -0
- package/dist/utils/auth-manager.d.ts +121 -0
- package/dist/utils/auth-manager.d.ts.map +1 -0
- package/dist/utils/auth-manager.js +560 -0
- package/dist/utils/auth-manager.js.map +1 -0
- package/dist/utils/budget-enforcer.d.ts +181 -0
- package/dist/utils/budget-enforcer.d.ts.map +1 -0
- package/dist/utils/budget-enforcer.js +386 -0
- package/dist/utils/budget-enforcer.js.map +1 -0
- package/dist/utils/chatgpt-detector.d.ts +51 -0
- package/dist/utils/chatgpt-detector.d.ts.map +1 -0
- package/dist/utils/chatgpt-detector.js +274 -0
- package/dist/utils/chatgpt-detector.js.map +1 -0
- package/dist/utils/claude-code-detector.d.ts +39 -0
- package/dist/utils/claude-code-detector.d.ts.map +1 -0
- package/dist/utils/claude-code-detector.js +153 -0
- package/dist/utils/claude-code-detector.js.map +1 -0
- package/dist/utils/code-quality.d.ts +58 -0
- package/dist/utils/code-quality.d.ts.map +1 -0
- package/dist/utils/code-quality.js +258 -0
- package/dist/utils/code-quality.js.map +1 -0
- package/dist/utils/context-primer.d.ts +50 -0
- package/dist/utils/context-primer.d.ts.map +1 -0
- package/dist/utils/context-primer.js +429 -0
- package/dist/utils/context-primer.js.map +1 -0
- package/dist/utils/dependency-management.d.ts +40 -0
- package/dist/utils/dependency-management.d.ts.map +1 -0
- package/dist/utils/dependency-management.js +123 -0
- package/dist/utils/dependency-management.js.map +1 -0
- package/dist/utils/environment-validation.d.ts +33 -0
- package/dist/utils/environment-validation.d.ts.map +1 -0
- package/dist/utils/environment-validation.js +136 -0
- package/dist/utils/environment-validation.js.map +1 -0
- package/dist/utils/error-recovery.d.ts +60 -0
- package/dist/utils/error-recovery.d.ts.map +1 -0
- package/dist/utils/error-recovery.js +183 -0
- package/dist/utils/error-recovery.js.map +1 -0
- package/dist/utils/feature-list.d.ts +102 -0
- package/dist/utils/feature-list.d.ts.map +1 -0
- package/dist/utils/feature-list.js +191 -0
- package/dist/utils/feature-list.js.map +1 -0
- package/dist/utils/gemini-detector.d.ts +65 -0
- package/dist/utils/gemini-detector.d.ts.map +1 -0
- package/dist/utils/gemini-detector.js +340 -0
- package/dist/utils/gemini-detector.js.map +1 -0
- package/dist/utils/git-utils.d.ts +48 -0
- package/dist/utils/git-utils.d.ts.map +1 -0
- package/dist/utils/git-utils.js +110 -0
- package/dist/utils/git-utils.js.map +1 -0
- package/dist/utils/health-check.d.ts +32 -0
- package/dist/utils/health-check.d.ts.map +1 -0
- package/dist/utils/health-check.js +152 -0
- package/dist/utils/health-check.js.map +1 -0
- package/dist/utils/hooks-manager.d.ts +154 -0
- package/dist/utils/hooks-manager.d.ts.map +1 -0
- package/dist/utils/hooks-manager.js +359 -0
- package/dist/utils/hooks-manager.js.map +1 -0
- package/dist/utils/multi-auth-manager.d.ts +144 -0
- package/dist/utils/multi-auth-manager.d.ts.map +1 -0
- package/dist/utils/multi-auth-manager.js +588 -0
- package/dist/utils/multi-auth-manager.js.map +1 -0
- package/dist/utils/progress.d.ts +49 -0
- package/dist/utils/progress.d.ts.map +1 -0
- package/dist/utils/progress.js +209 -0
- package/dist/utils/progress.js.map +1 -0
- package/dist/utils/project-detection.d.ts +40 -0
- package/dist/utils/project-detection.d.ts.map +1 -0
- package/dist/utils/project-detection.js +230 -0
- package/dist/utils/project-detection.js.map +1 -0
- package/dist/utils/session-manager.d.ts +119 -0
- package/dist/utils/session-manager.d.ts.map +1 -0
- package/dist/utils/session-manager.js +389 -0
- package/dist/utils/session-manager.js.map +1 -0
- package/dist/utils/skills-manager.d.ts +113 -0
- package/dist/utils/skills-manager.d.ts.map +1 -0
- package/dist/utils/skills-manager.js +332 -0
- package/dist/utils/skills-manager.js.map +1 -0
- package/dist/utils/structured-output.d.ts +117 -0
- package/dist/utils/structured-output.d.ts.map +1 -0
- package/dist/utils/structured-output.js +191 -0
- package/dist/utils/structured-output.js.map +1 -0
- package/dist/utils/subagent-manager.d.ts +143 -0
- package/dist/utils/subagent-manager.d.ts.map +1 -0
- package/dist/utils/subagent-manager.js +326 -0
- package/dist/utils/subagent-manager.js.map +1 -0
- package/dist/utils/supabase-setup.d.ts +50 -0
- package/dist/utils/supabase-setup.d.ts.map +1 -0
- package/dist/utils/supabase-setup.js +151 -0
- package/dist/utils/supabase-setup.js.map +1 -0
- package/dist/utils/token-refresh.d.ts +21 -0
- package/dist/utils/token-refresh.d.ts.map +1 -0
- package/dist/utils/token-refresh.js +77 -0
- package/dist/utils/token-refresh.js.map +1 -0
- package/dist/utils/tos-warning.d.ts +115 -0
- package/dist/utils/tos-warning.d.ts.map +1 -0
- package/dist/utils/tos-warning.js +304 -0
- package/dist/utils/tos-warning.js.map +1 -0
- package/dist/utils/usage-monitor.d.ts +156 -0
- package/dist/utils/usage-monitor.d.ts.map +1 -0
- package/dist/utils/usage-monitor.js +296 -0
- package/dist/utils/usage-monitor.js.map +1 -0
- package/package.json +105 -0
- package/scripts/init.ps1 +73 -0
- package/scripts/init.sh +86 -0
- package/scripts/test-auth.sh +90 -0
- package/templates/feature_list.template.json +66 -0
- 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"}
|