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.
Files changed (2) hide show
  1. package/index.js +192 -116
  2. 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-server';
14
- const API_BASE = process.env.CLAUDMAX_API_BASE || 'https://api.claudmax.pro';
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
- const cursorDir = path.join(HOME, '.cursor', 'mcp.json');
97
- if (fileExists(cursorDir) ||
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
- if (fileExists(path.join(HOME, '.windsurf', 'mcp.json'))) {
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 vscodePaths = [
108
- path.join(HOME, 'Library', 'Application Support', 'Code', 'User', 'settings.json'),
109
- path.join(HOME, '.config', 'Code', 'User', 'settings.json'),
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
- return [...new Set(detected)];
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
- function getVSCodeSettingsPath() {
120
- switch (process.platform) {
121
- case 'darwin':
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.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
- deepMerge(settings, {
170
- env: {
171
- ANTHROPIC_AUTH_TOKEN: apiKey,
172
- ANTHROPIC_BASE_URL: `${API_BASE}/v1`,
173
- ANTHROPIC_MODEL: 'claude-opus-4-6',
174
- ANTHROPIC_SMALL_FAST_MODEL: 'claude-haiku-4-5',
175
- ANTHROPIC_DEFAULT_SONNET_MODEL: 'claude-sonnet-4-6',
176
- ANTHROPIC_DEFAULT_OPUS_MODEL: 'claude-opus-4-6',
177
- ANTHROPIC_DEFAULT_HAIKU_MODEL: 'claude-haiku-4-5',
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
- CLAUDMAX_API_KEY: apiKey,
196
- CLAUDMAX_URL: API_BASE,
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
- deepMerge(vsSettings, {
227
- 'anthropic.authToken': apiKey,
228
- 'anthropic.baseUrl': `${API_BASE}/v1`,
229
- 'claude.codeDisableNonessentialTraffic': true,
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 existing = readJson(mcpPath) || {};
244
- if (!existing.mcpServers) existing.mcpServers = {};
245
- existing.mcpServers['ClaudMax'] = {
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: { CLAUDMAX_API_KEY: apiKey, CLAUDMAX_URL: API_BASE },
277
+ env: {
278
+ ANTHROPIC_BASE_URL: API_BASE,
279
+ ANTHROPIC_API_KEY: apiKey,
280
+ },
249
281
  };
250
- writeJson(mcpPath, existing);
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 existing = readJson(mcpPath) || {};
262
- if (!existing.mcpServers) existing.mcpServers = {};
263
- existing.mcpServers['ClaudMax'] = {
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: { CLAUDMAX_API_KEY: apiKey, CLAUDMAX_URL: API_BASE },
310
+ env: {
311
+ ANTHROPIC_BASE_URL: API_BASE,
312
+ ANTHROPIC_API_KEY: apiKey,
313
+ },
267
314
  };
268
- writeJson(mcpPath, existing);
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 existing = readJson(settingsPath) || {};
279
- deepMerge(existing, {
280
- 'cline.apiProvider': 'anthropic',
281
- 'cline.anthropicBaseUrl': `${API_BASE}/v1`,
282
- 'cline.apiKey': apiKey,
283
- });
284
- writeJson(settingsPath, existing);
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 existing = readJson(settingsPath) || {};
294
- deepMerge(existing, {
295
- 'roo-cline.apiProvider': 'anthropic',
296
- 'roo-cline.anthropicBaseUrl': `${API_BASE}/v1`,
297
- 'roo-cline.apiKey': apiKey,
298
- });
299
- writeJson(settingsPath, existing);
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)', configure: configureClaudeCode },
307
- { id: 'vscode', name: 'VS Code (Claude Extension)', configure: configureVSCodeClaude },
308
- { id: 'cursor', name: 'Cursor', configure: configureCursor },
309
- { id: 'windsurf', name: 'Windsurf', configure: configureWindsurf },
310
- { id: 'cline', name: 'Cline (VS Code Extension)', configure: configureCline },
311
- { id: 'roo', name: 'Roo Code (VS Code Extension)', configure: configureRooCode },
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\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256e'));
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\u2500\u2510'));
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "claudmax",
3
- "version": "3.0.1",
3
+ "version": "3.0.4",
4
4
  "description": "ClaudMax CLI — Configure Claude Code, Cursor, Windsurf, Cline, and Roo Code to use ClaudMax API gateway with one command",
5
5
  "main": "index.js",
6
6
  "bin": {