claudmax 3.0.1 → 3.0.4
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/index.js +192 -116
- package/package.json +1 -1
package/index.js
CHANGED
|
@@ -10,12 +10,20 @@ const https = require('https');
|
|
|
10
10
|
const { execSync } = require('child_process');
|
|
11
11
|
|
|
12
12
|
// ── Constants ──────────────────────────────────────────────────────────────
|
|
13
|
-
const MCP_PKG = 'claudmax-mcp
|
|
14
|
-
const API_BASE =
|
|
13
|
+
const MCP_PKG = 'claudmax-mcp';
|
|
14
|
+
const API_BASE = 'https://api.claudmax.pro';
|
|
15
15
|
const HOME = os.homedir();
|
|
16
16
|
|
|
17
17
|
// ── CLI args ──────────────────────────────────────────────────────────────
|
|
18
18
|
const args = process.argv.slice(2);
|
|
19
|
+
|
|
20
|
+
// --version / -v — must be FIRST, before anything interactive
|
|
21
|
+
if (args.includes('--version') || args.includes('-v')) {
|
|
22
|
+
const pkg = require('./package.json');
|
|
23
|
+
console.log(pkg.version);
|
|
24
|
+
process.exit(0);
|
|
25
|
+
}
|
|
26
|
+
|
|
19
27
|
const flags = {};
|
|
20
28
|
for (let i = 0; i < args.length; i++) {
|
|
21
29
|
if (args[i].startsWith('--')) {
|
|
@@ -43,6 +51,12 @@ const WARN = C.yellow('\u26A0');
|
|
|
43
51
|
const INFO = C.cyan('\u2139');
|
|
44
52
|
const ARROW = C.cyan('\u25b6');
|
|
45
53
|
|
|
54
|
+
// --help / -h — before any interactive prompts
|
|
55
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
56
|
+
printHelp();
|
|
57
|
+
process.exit(0);
|
|
58
|
+
}
|
|
59
|
+
|
|
46
60
|
// ── Readline helper ────────────────────────────────────────────────────────
|
|
47
61
|
function createRL() {
|
|
48
62
|
return readline.createInterface({ input: process.stdin, output: process.stdout });
|
|
@@ -64,18 +78,6 @@ function writeJson(filePath, data) {
|
|
|
64
78
|
fs.writeFileSync(filePath, JSON.stringify(data, null, 2) + '\n');
|
|
65
79
|
}
|
|
66
80
|
|
|
67
|
-
function deepMerge(target, source) {
|
|
68
|
-
for (const key of Object.keys(source)) {
|
|
69
|
-
if (source[key] && typeof source[key] === 'object' && !Array.isArray(source[key])) {
|
|
70
|
-
if (!target[key] || typeof target[key] !== 'object') target[key] = {};
|
|
71
|
-
deepMerge(target[key], source[key]);
|
|
72
|
-
} else {
|
|
73
|
-
target[key] = source[key];
|
|
74
|
-
}
|
|
75
|
-
}
|
|
76
|
-
return target;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
81
|
function ensureDir(dir) {
|
|
80
82
|
if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
|
|
81
83
|
}
|
|
@@ -84,50 +86,94 @@ function fileExists(filePath) {
|
|
|
84
86
|
try { return fs.existsSync(filePath); } catch { return false; }
|
|
85
87
|
}
|
|
86
88
|
|
|
89
|
+
// ── Platform-aware path helpers ──────────────────────────────────────────
|
|
90
|
+
function getVSCodeSettingsPath() {
|
|
91
|
+
if (process.platform === 'win32') {
|
|
92
|
+
return path.join(process.env.APPDATA || '', 'Code', 'User', 'settings.json');
|
|
93
|
+
} else if (process.platform === 'darwin') {
|
|
94
|
+
return path.join(HOME, 'Library', 'Application Support', 'Code', 'User', 'settings.json');
|
|
95
|
+
} else {
|
|
96
|
+
return path.join(HOME, '.config', 'Code', 'User', 'settings.json');
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
function getCursorSettingsPath() {
|
|
101
|
+
if (process.platform === 'win32') {
|
|
102
|
+
return path.join(process.env.APPDATA || '', 'Cursor', 'User', 'settings.json');
|
|
103
|
+
} else if (process.platform === 'darwin') {
|
|
104
|
+
return path.join(HOME, 'Library', 'Application Support', 'Cursor', 'User', 'settings.json');
|
|
105
|
+
} else {
|
|
106
|
+
return path.join(HOME, '.config', 'Cursor', 'User', 'settings.json');
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function getWindsurfSettingsPath() {
|
|
111
|
+
if (process.platform === 'win32') {
|
|
112
|
+
return path.join(process.env.APPDATA || '', 'Windsurf', 'User', 'settings.json');
|
|
113
|
+
} else if (process.platform === 'darwin') {
|
|
114
|
+
return path.join(HOME, 'Library', 'Application Support', 'Windsurf', 'User', 'settings.json');
|
|
115
|
+
} else {
|
|
116
|
+
return path.join(HOME, '.config', 'Windsurf', 'User', 'settings.json');
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function getVSCodeExtensionsPath() {
|
|
121
|
+
if (process.platform === 'win32') {
|
|
122
|
+
return path.join(process.env.USERPROFILE || HOME, '.vscode', 'extensions');
|
|
123
|
+
} else if (process.platform === 'darwin') {
|
|
124
|
+
return path.join(HOME, '.vscode', 'extensions');
|
|
125
|
+
} else {
|
|
126
|
+
return path.join(HOME, '.vscode', 'extensions');
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
87
130
|
// ── IDE auto-detector ─────────────────────────────────────────────────────
|
|
88
131
|
function detectIDESilent() {
|
|
89
132
|
const detected = [];
|
|
90
133
|
|
|
134
|
+
// Claude Code CLI
|
|
91
135
|
if (fileExists(path.join(HOME, '.claude', 'settings.json')) ||
|
|
92
136
|
fileExists(path.join(HOME, '.claude.json'))) {
|
|
93
137
|
detected.push('claude-code');
|
|
94
138
|
}
|
|
95
139
|
|
|
96
|
-
|
|
97
|
-
if (fileExists(
|
|
140
|
+
// VS Code (Claude extension)
|
|
141
|
+
if (fileExists(getVSCodeSettingsPath())) {
|
|
142
|
+
detected.push('vscode');
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
// Cursor
|
|
146
|
+
if (fileExists(path.join(HOME, '.cursor', 'mcp.json')) ||
|
|
98
147
|
fileExists(path.join(HOME, 'Library', 'Application Support', 'Cursor'))) {
|
|
99
148
|
detected.push('cursor');
|
|
100
149
|
}
|
|
101
150
|
|
|
102
|
-
|
|
151
|
+
// Windsurf
|
|
152
|
+
if (fileExists(path.join(HOME, '.windsurf', 'mcp.json')) ||
|
|
153
|
+
fileExists(path.join(HOME, '.config', 'Windsurf'))) {
|
|
103
154
|
detected.push('windsurf');
|
|
104
155
|
}
|
|
105
156
|
|
|
106
|
-
// VS Code
|
|
107
|
-
const
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
path.join(process.env.APPDATA || '', 'Code', 'User', 'settings.json'),
|
|
111
|
-
];
|
|
112
|
-
for (const p of vscodePaths) {
|
|
113
|
-
if (fileExists(p)) { detected.push('vscode'); break; }
|
|
157
|
+
// Cline — check VS Code extensions folder
|
|
158
|
+
const vscodeExtPath = getVSCodeExtensionsPath();
|
|
159
|
+
if (fileExists(path.join(vscodeExtPath, 'saoudrizwan.claude-dev'))) {
|
|
160
|
+
detected.push('cline');
|
|
114
161
|
}
|
|
115
162
|
|
|
116
|
-
|
|
117
|
-
|
|
163
|
+
// Roo Code — check VS Code extensions folder
|
|
164
|
+
if (fileExists(path.join(vscodeExtPath, 'RooVeterinaryInc.roo-cline'))) {
|
|
165
|
+
detected.push('roo');
|
|
166
|
+
}
|
|
118
167
|
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
return path.join(HOME, 'Library', 'Application Support', 'Code', 'User', 'settings.json');
|
|
123
|
-
case 'win32':
|
|
124
|
-
return path.join(process.env.APPDATA || '', 'Code', 'User', 'settings.json');
|
|
125
|
-
default:
|
|
126
|
-
return path.join(HOME, '.config', 'Code', 'User', 'settings.json');
|
|
168
|
+
// Antigravity
|
|
169
|
+
if (fileExists(path.join(HOME, '.config', 'antigravity', 'config.json'))) {
|
|
170
|
+
detected.push('antigravity');
|
|
127
171
|
}
|
|
172
|
+
|
|
173
|
+
return [...new Set(detected)];
|
|
128
174
|
}
|
|
129
175
|
|
|
130
|
-
// ── API verification
|
|
176
|
+
// ── API verification ──────────────────────────────────────────────────────
|
|
131
177
|
function verifyConnection(apiKey) {
|
|
132
178
|
return new Promise((resolve) => {
|
|
133
179
|
const url = new URL(`${API_BASE}/v1/models`);
|
|
@@ -138,7 +184,7 @@ function verifyConnection(apiKey) {
|
|
|
138
184
|
method: 'GET',
|
|
139
185
|
headers: {
|
|
140
186
|
'x-api-key': apiKey,
|
|
141
|
-
'User-Agent': 'ClaudMax-CLI/3.0.
|
|
187
|
+
'User-Agent': 'ClaudMax-CLI/3.0.2',
|
|
142
188
|
},
|
|
143
189
|
timeout: 15000,
|
|
144
190
|
};
|
|
@@ -159,32 +205,28 @@ function verifyConnection(apiKey) {
|
|
|
159
205
|
});
|
|
160
206
|
}
|
|
161
207
|
|
|
162
|
-
// ── IDE configurators
|
|
208
|
+
// ── IDE configurators ─────────────────────────────────────────────────────
|
|
209
|
+
|
|
210
|
+
// 1. Claude Code CLI
|
|
163
211
|
function configureClaudeCode(apiKey) {
|
|
164
212
|
process.stdout.write(` ${ARROW} Claude Code CLI...`);
|
|
165
213
|
|
|
214
|
+
// Write billing bypass + API key to ~/.claude/settings.json
|
|
166
215
|
const settingsPath = path.join(HOME, '.claude', 'settings.json');
|
|
167
216
|
ensureDir(path.dirname(settingsPath));
|
|
168
217
|
const settings = readJson(settingsPath) || {};
|
|
169
|
-
|
|
170
|
-
env
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
// Billing bypass: disable non-essential API traffic
|
|
179
|
-
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
|
|
180
|
-
CLAUDE_CODE_SKIP_VERSION_CHECK: '1',
|
|
181
|
-
},
|
|
182
|
-
hasCompletedOnboarding: true,
|
|
183
|
-
telemetryEnabled: false,
|
|
184
|
-
collectAnalytics: false,
|
|
185
|
-
});
|
|
218
|
+
settings.env = {
|
|
219
|
+
...(settings.env || {}),
|
|
220
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
221
|
+
ANTHROPIC_BASE_URL: API_BASE,
|
|
222
|
+
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
|
|
223
|
+
};
|
|
224
|
+
settings.telemetryEnabled = false;
|
|
225
|
+
settings.autoUpdates = false;
|
|
226
|
+
settings.disableTelemetry = true;
|
|
186
227
|
writeJson(settingsPath, settings);
|
|
187
228
|
|
|
229
|
+
// Write MCP server to ~/.claude.json
|
|
188
230
|
const dotClaudePath = path.join(HOME, '.claude.json');
|
|
189
231
|
const dotClaude = readJson(dotClaudePath) || {};
|
|
190
232
|
if (!dotClaude.mcpServers) dotClaude.mcpServers = {};
|
|
@@ -192,8 +234,8 @@ function configureClaudeCode(apiKey) {
|
|
|
192
234
|
command: 'npx',
|
|
193
235
|
args: ['-y', MCP_PKG],
|
|
194
236
|
env: {
|
|
195
|
-
|
|
196
|
-
|
|
237
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
238
|
+
ANTHROPIC_BASE_URL: API_BASE,
|
|
197
239
|
},
|
|
198
240
|
};
|
|
199
241
|
writeJson(dotClaudePath, dotClaude);
|
|
@@ -203,120 +245,158 @@ function configureClaudeCode(apiKey) {
|
|
|
203
245
|
process.stdout.write(` ${C.dim(dotClaudePath)}\n`);
|
|
204
246
|
}
|
|
205
247
|
|
|
248
|
+
// 2. VS Code Claude Extension
|
|
206
249
|
function configureVSCodeClaude(apiKey) {
|
|
207
250
|
process.stdout.write(` ${ARROW} VS Code Claude Extension...`);
|
|
208
251
|
|
|
209
|
-
// Claude Code settings (extension auto-detects)
|
|
210
|
-
const settingsPath = path.join(HOME, '.claude', 'settings.json');
|
|
211
|
-
ensureDir(path.dirname(settingsPath));
|
|
212
|
-
const settings = readJson(settingsPath) || {};
|
|
213
|
-
deepMerge(settings, {
|
|
214
|
-
env: {
|
|
215
|
-
ANTHROPIC_AUTH_TOKEN: apiKey,
|
|
216
|
-
ANTHROPIC_BASE_URL: `${API_BASE}/v1`,
|
|
217
|
-
CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: '1',
|
|
218
|
-
},
|
|
219
|
-
});
|
|
220
|
-
writeJson(settingsPath, settings);
|
|
221
|
-
|
|
222
|
-
// VS Code extension settings
|
|
223
252
|
const vsSettingsPath = getVSCodeSettingsPath();
|
|
224
253
|
ensureDir(path.dirname(vsSettingsPath));
|
|
225
254
|
const vsSettings = readJson(vsSettingsPath) || {};
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
});
|
|
255
|
+
vsSettings['claude.apiBaseUrl'] = API_BASE;
|
|
256
|
+
vsSettings['claude.apiKey'] = apiKey;
|
|
257
|
+
vsSettings['claude.telemetry.enabled'] = false;
|
|
258
|
+
vsSettings['workbench.enableExperiments'] = false;
|
|
231
259
|
writeJson(vsSettingsPath, vsSettings);
|
|
232
260
|
|
|
233
261
|
process.stdout.write(`${CHECK}\n`);
|
|
234
|
-
process.stdout.write(` ${C.dim(settingsPath)}\n`);
|
|
235
262
|
process.stdout.write(` ${C.dim(vsSettingsPath)}\n`);
|
|
236
263
|
}
|
|
237
264
|
|
|
265
|
+
// 3. Cursor
|
|
238
266
|
function configureCursor(apiKey) {
|
|
239
267
|
process.stdout.write(` ${ARROW} Cursor...`);
|
|
240
268
|
|
|
269
|
+
// Write MCP server to ~/.cursor/mcp.json
|
|
241
270
|
const mcpPath = path.join(HOME, '.cursor', 'mcp.json');
|
|
242
271
|
ensureDir(path.dirname(mcpPath));
|
|
243
|
-
const
|
|
244
|
-
if (!
|
|
245
|
-
|
|
272
|
+
const mcp = readJson(mcpPath) || {};
|
|
273
|
+
if (!mcp.mcpServers) mcp.mcpServers = {};
|
|
274
|
+
mcp.mcpServers['claudmax'] = {
|
|
246
275
|
command: 'npx',
|
|
247
276
|
args: ['-y', MCP_PKG],
|
|
248
|
-
env: {
|
|
277
|
+
env: {
|
|
278
|
+
ANTHROPIC_BASE_URL: API_BASE,
|
|
279
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
280
|
+
},
|
|
249
281
|
};
|
|
250
|
-
writeJson(mcpPath,
|
|
282
|
+
writeJson(mcpPath, mcp);
|
|
283
|
+
|
|
284
|
+
// Merge Cursor settings.json
|
|
285
|
+
const settingsPath = getCursorSettingsPath();
|
|
286
|
+
ensureDir(path.dirname(settingsPath));
|
|
287
|
+
const settings = readJson(settingsPath) || {};
|
|
288
|
+
settings['cursor.general.apiBaseUrl'] = API_BASE;
|
|
289
|
+
settings['cursor.general.apiKey'] = apiKey;
|
|
290
|
+
settings['cursor.telemetry.enabled'] = false;
|
|
291
|
+
writeJson(settingsPath, settings);
|
|
251
292
|
|
|
252
293
|
process.stdout.write(`${CHECK}\n`);
|
|
253
294
|
process.stdout.write(` ${C.dim(mcpPath)}\n`);
|
|
295
|
+
process.stdout.write(` ${C.dim(settingsPath)}\n`);
|
|
254
296
|
}
|
|
255
297
|
|
|
298
|
+
// 4. Windsurf
|
|
256
299
|
function configureWindsurf(apiKey) {
|
|
257
300
|
process.stdout.write(` ${ARROW} Windsurf...`);
|
|
258
301
|
|
|
302
|
+
// Write MCP server to ~/.windsurf/mcp.json
|
|
259
303
|
const mcpPath = path.join(HOME, '.windsurf', 'mcp.json');
|
|
260
304
|
ensureDir(path.dirname(mcpPath));
|
|
261
|
-
const
|
|
262
|
-
if (!
|
|
263
|
-
|
|
305
|
+
const mcp = readJson(mcpPath) || {};
|
|
306
|
+
if (!mcp.mcpServers) mcp.mcpServers = {};
|
|
307
|
+
mcp.mcpServers['claudmax'] = {
|
|
264
308
|
command: 'npx',
|
|
265
309
|
args: ['-y', MCP_PKG],
|
|
266
|
-
env: {
|
|
310
|
+
env: {
|
|
311
|
+
ANTHROPIC_BASE_URL: API_BASE,
|
|
312
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
313
|
+
},
|
|
267
314
|
};
|
|
268
|
-
writeJson(mcpPath,
|
|
315
|
+
writeJson(mcpPath, mcp);
|
|
316
|
+
|
|
317
|
+
// Merge Windsurf settings.json
|
|
318
|
+
const settingsPath = getWindsurfSettingsPath();
|
|
319
|
+
ensureDir(path.dirname(settingsPath));
|
|
320
|
+
const settings = readJson(settingsPath) || {};
|
|
321
|
+
settings['windsurf.apiBaseUrl'] = API_BASE;
|
|
322
|
+
settings['windsurf.apiKey'] = apiKey;
|
|
323
|
+
settings['windsurf.telemetry.enabled'] = false;
|
|
324
|
+
writeJson(settingsPath, settings);
|
|
269
325
|
|
|
270
326
|
process.stdout.write(`${CHECK}\n`);
|
|
271
327
|
process.stdout.write(` ${C.dim(mcpPath)}\n`);
|
|
328
|
+
process.stdout.write(` ${C.dim(settingsPath)}\n`);
|
|
272
329
|
}
|
|
273
330
|
|
|
331
|
+
// 5. Cline (VS Code extension — reads VS Code settings.json)
|
|
274
332
|
function configureCline(apiKey) {
|
|
275
333
|
process.stdout.write(` ${ARROW} Cline...`);
|
|
334
|
+
|
|
276
335
|
const settingsPath = getVSCodeSettingsPath();
|
|
277
336
|
ensureDir(path.dirname(settingsPath));
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
337
|
+
const settings = readJson(settingsPath) || {};
|
|
338
|
+
settings['cline.apiProvider'] = 'anthropic';
|
|
339
|
+
settings['cline.apiBaseUrl'] = API_BASE;
|
|
340
|
+
settings['cline.apiKey'] = apiKey;
|
|
341
|
+
settings['cline.telemetry.enabled'] = false;
|
|
342
|
+
writeJson(settingsPath, settings);
|
|
343
|
+
|
|
285
344
|
process.stdout.write(`${CHECK}\n`);
|
|
286
345
|
process.stdout.write(` ${C.dim(settingsPath)}\n`);
|
|
287
346
|
}
|
|
288
347
|
|
|
348
|
+
// 6. Roo Code (VS Code extension — reads VS Code settings.json)
|
|
289
349
|
function configureRooCode(apiKey) {
|
|
290
350
|
process.stdout.write(` ${ARROW} Roo Code...`);
|
|
351
|
+
|
|
291
352
|
const settingsPath = getVSCodeSettingsPath();
|
|
292
353
|
ensureDir(path.dirname(settingsPath));
|
|
293
|
-
const
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
354
|
+
const settings = readJson(settingsPath) || {};
|
|
355
|
+
settings['roo-cline.apiProvider'] = 'anthropic';
|
|
356
|
+
settings['roo-cline.apiBaseUrl'] = API_BASE;
|
|
357
|
+
settings['roo-cline.apiKey'] = apiKey;
|
|
358
|
+
settings['roo-cline.telemetry.enabled'] = false;
|
|
359
|
+
writeJson(settingsPath, settings);
|
|
360
|
+
|
|
300
361
|
process.stdout.write(`${CHECK}\n`);
|
|
301
362
|
process.stdout.write(` ${C.dim(settingsPath)}\n`);
|
|
302
363
|
}
|
|
303
364
|
|
|
365
|
+
// 7. Antigravity
|
|
366
|
+
function configureAntigravity(apiKey) {
|
|
367
|
+
process.stdout.write(` ${ARROW} Antigravity...`);
|
|
368
|
+
|
|
369
|
+
const configDir = path.join(HOME, '.config', 'antigravity');
|
|
370
|
+
ensureDir(configDir);
|
|
371
|
+
const configPath = path.join(configDir, 'config.json');
|
|
372
|
+
writeJson(configPath, {
|
|
373
|
+
apiBaseUrl: API_BASE,
|
|
374
|
+
apiKey: apiKey,
|
|
375
|
+
provider: 'anthropic',
|
|
376
|
+
telemetry: false,
|
|
377
|
+
});
|
|
378
|
+
|
|
379
|
+
process.stdout.write(`${CHECK}\n`);
|
|
380
|
+
process.stdout.write(` ${C.dim(configPath)}\n`);
|
|
381
|
+
}
|
|
382
|
+
|
|
304
383
|
// ── IDE registry ────────────────────────────────────────────────────────────
|
|
305
384
|
const IDES = [
|
|
306
|
-
{ id: 'claude-code', name: 'Claude Code (CLI)',
|
|
307
|
-
{ id: 'vscode', name: 'VS Code (Claude Extension)',
|
|
308
|
-
{ id: 'cursor', name: 'Cursor',
|
|
309
|
-
{ id: 'windsurf', name: 'Windsurf',
|
|
310
|
-
{ id: 'cline', name: 'Cline (VS Code Extension)',
|
|
311
|
-
{ id: 'roo',
|
|
385
|
+
{ id: 'claude-code', name: 'Claude Code (CLI)', configure: configureClaudeCode },
|
|
386
|
+
{ id: 'vscode', name: 'VS Code (Claude Extension)', configure: configureVSCodeClaude },
|
|
387
|
+
{ id: 'cursor', name: 'Cursor', configure: configureCursor },
|
|
388
|
+
{ id: 'windsurf', name: 'Windsurf', configure: configureWindsurf },
|
|
389
|
+
{ id: 'cline', name: 'Cline (VS Code Extension)', configure: configureCline },
|
|
390
|
+
{ id: 'roo', name: 'Roo Code (VS Code Extension)', configure: configureRooCode },
|
|
391
|
+
{ id: 'antigravity', name: 'Antigravity (VS Code Extension)', configure: configureAntigravity },
|
|
312
392
|
];
|
|
313
393
|
|
|
314
394
|
// ── Banner ────────────────────────────────────────────────────────────────
|
|
315
395
|
function printBanner() {
|
|
316
396
|
console.log('');
|
|
317
|
-
console.log(C.magenta(' \u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\
|
|
397
|
+
console.log(C.magenta(' \u256d\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e'));
|
|
318
398
|
console.log(C.magenta(' \u2502') + C.bold(' \u2726 ClaudMax Setup ') + C.magenta('\u2502'));
|
|
319
|
-
console.log(C.magenta(' \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\
|
|
399
|
+
console.log(C.magenta(' \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510'));
|
|
320
400
|
console.log('');
|
|
321
401
|
}
|
|
322
402
|
|
|
@@ -326,7 +406,7 @@ ${C.bold('Usage:')} npx claudmax [options]
|
|
|
326
406
|
|
|
327
407
|
${C.bold('Options:')}
|
|
328
408
|
--api-key <key> Your ClaudMax API key (required in non-interactive mode)
|
|
329
|
-
--ide <ides> Comma-separated IDEs: claude-code,vscode,cursor,windsurf,cline,roo
|
|
409
|
+
--ide <ides> Comma-separated IDEs: claude-code,vscode,cursor,windsurf,cline,roo,antigravity
|
|
330
410
|
Or "all" to configure every supported IDE
|
|
331
411
|
Or "auto" to auto-detect installed IDEs (default)
|
|
332
412
|
--skip-mcp Skip MCP server installation
|
|
@@ -347,6 +427,7 @@ ${C.bold('Supported IDEs:')}
|
|
|
347
427
|
windsrf - Windsurf AI editor
|
|
348
428
|
cline - Cline VS Code extension
|
|
349
429
|
roo - Roo Code VS Code extension
|
|
430
|
+
antigravity - Antigravity VS Code extension
|
|
350
431
|
`);
|
|
351
432
|
}
|
|
352
433
|
|
|
@@ -369,11 +450,6 @@ function installMCP() {
|
|
|
369
450
|
|
|
370
451
|
// ── Main ──────────────────────────────────────────────────────────────────
|
|
371
452
|
async function main() {
|
|
372
|
-
if (flags.help || flags.h || args.includes('-h')) {
|
|
373
|
-
printHelp();
|
|
374
|
-
process.exit(0);
|
|
375
|
-
}
|
|
376
|
-
|
|
377
453
|
printBanner();
|
|
378
454
|
|
|
379
455
|
const rl = createRL();
|
|
@@ -421,7 +497,7 @@ async function main() {
|
|
|
421
497
|
apiKey = apiKey.trim();
|
|
422
498
|
process.stdout.write(` ${CHECK} API key set: ${C.dim(apiKey.slice(0, 10) + '...' + apiKey.slice(-4))}\n\n`);
|
|
423
499
|
|
|
424
|
-
// ── Configure IDEs
|
|
500
|
+
// ── Configure IDEs ──────────────────────────────────────────────────
|
|
425
501
|
if (selectedIds.length > 0) {
|
|
426
502
|
process.stdout.write(` ${C.bold('Configuring:')} ${selectedIds.map(id => {
|
|
427
503
|
const ide = IDES.find(i => i.id === id);
|
package/package.json
CHANGED