@halilertekin/claude-code-router-config 1.2.3 → 1.3.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/NPM_README.md +10 -4
- package/README.md +14 -3
- package/cli/commands.js +148 -62
- package/package.json +3 -2
package/NPM_README.md
CHANGED
|
@@ -23,15 +23,21 @@ ccr-setup
|
|
|
23
23
|
|
|
24
24
|
## Installation
|
|
25
25
|
|
|
26
|
+
> [!IMPORTANT]
|
|
27
|
+
> Choose only ONE installation method (Homebrew OR NPM) to avoid conflicts.
|
|
28
|
+
|
|
29
|
+
### Option 1: Homebrew (Recommended for macOS)
|
|
30
|
+
|
|
26
31
|
```bash
|
|
27
|
-
|
|
28
|
-
ccr-setup
|
|
32
|
+
brew install halilertekin/tap/claude-code-router-config
|
|
29
33
|
```
|
|
30
34
|
|
|
31
|
-
### Option 2:
|
|
35
|
+
### Option 2: NPM / PNPM
|
|
32
36
|
|
|
33
37
|
```bash
|
|
34
|
-
|
|
38
|
+
npm install -g @halilertekin/claude-code-router-config
|
|
39
|
+
# or
|
|
40
|
+
pnpm add -g @halilertekin/claude-code-router-config
|
|
35
41
|
```
|
|
36
42
|
|
|
37
43
|
### Option 3: Manual
|
package/README.md
CHANGED
|
@@ -66,9 +66,15 @@ ccr config template balanced # Best of all worlds
|
|
|
66
66
|
|
|
67
67
|
## Installation
|
|
68
68
|
|
|
69
|
-
### Option 1: Homebrew (Recommended)
|
|
69
|
+
### Option 1: Homebrew (Recommended for macOS)
|
|
70
|
+
|
|
71
|
+
> [!CAUTION]
|
|
72
|
+
> **Conflict Warning**: Do NOT install using both Homebrew and PNPM/NPM simultaneously. Choose only ONE method to avoid command conflicts.
|
|
73
|
+
|
|
74
|
+
The easiest way to install and keep updated on macOS.
|
|
70
75
|
|
|
71
76
|
```bash
|
|
77
|
+
brew uninstall ccr # Remove old versions if present
|
|
72
78
|
brew install halilertekin/tap/claude-code-router-config
|
|
73
79
|
```
|
|
74
80
|
|
|
@@ -77,11 +83,16 @@ After installation, edit your API keys in `~/.env` and start the router:
|
|
|
77
83
|
ccr code
|
|
78
84
|
```
|
|
79
85
|
|
|
80
|
-
### PNPM
|
|
86
|
+
### Option 2: PNPM (Alternative)
|
|
87
|
+
|
|
88
|
+
Use this if you are on Linux or prefer using a Node package manager.
|
|
89
|
+
|
|
90
|
+
> [!WARNING]
|
|
91
|
+
> If you have previously installed via Homebrew, please uninstall it first: `brew uninstall claude-code-router-config`
|
|
81
92
|
|
|
82
93
|
```bash
|
|
83
94
|
pnpm add -g @halilertekin/claude-code-router-config
|
|
84
|
-
ccr
|
|
95
|
+
# System is ready! Run: ccr --help
|
|
85
96
|
```
|
|
86
97
|
|
|
87
98
|
### Option 3: Manual Setup
|
package/cli/commands.js
CHANGED
|
@@ -219,71 +219,157 @@ function backupConfig() {
|
|
|
219
219
|
}
|
|
220
220
|
}
|
|
221
221
|
|
|
222
|
+
// Helper to find original ccr binary
|
|
223
|
+
function getOriginalCcrPath() {
|
|
224
|
+
try {
|
|
225
|
+
// Try to find it in dependencies
|
|
226
|
+
return require.resolve('@musistudio/claude-code-router/dist/cli.js');
|
|
227
|
+
} catch (e) {
|
|
228
|
+
return null;
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Proxy command to original router
|
|
233
|
+
function proxyToOriginal(args) {
|
|
234
|
+
const originalPath = getOriginalCcrPath();
|
|
235
|
+
if (!originalPath) {
|
|
236
|
+
console.error(chalk.red('❌ Original @musistudio/claude-code-router not found.'));
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
const child = spawn('node', [originalPath, ...args], {
|
|
241
|
+
stdio: 'inherit',
|
|
242
|
+
env: process.env
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
child.on('exit', (code) => {
|
|
246
|
+
if (code !== 0) {
|
|
247
|
+
process.exit(code || 1);
|
|
248
|
+
}
|
|
249
|
+
});
|
|
250
|
+
}
|
|
251
|
+
|
|
222
252
|
// CLI command handler
|
|
223
253
|
async function main() {
|
|
224
254
|
const [command, ...args] = process.argv.slice(2);
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
console.
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
255
|
+
const advancedCommands = ['test', 'benchmark', 'analytics', 'status', 'config', 'health', 'update', 'help', 'version', '-v', '--version', '--help', '-h'];
|
|
256
|
+
|
|
257
|
+
// Check if it's an advanced command, help/version flag, or no command at all
|
|
258
|
+
const isAdvancedOrHelp = advancedCommands.includes(command) || !command;
|
|
259
|
+
|
|
260
|
+
if (isAdvancedOrHelp) {
|
|
261
|
+
switch (command) {
|
|
262
|
+
case 'update':
|
|
263
|
+
console.log(chalk.blue('🔄 Checking for updates and updating...'));
|
|
264
|
+
const updateProcess = spawn('pnpm', ['add', '-g', '@halilertekin/claude-code-router-config@latest'], {
|
|
265
|
+
stdio: 'inherit',
|
|
266
|
+
env: process.env
|
|
267
|
+
});
|
|
268
|
+
updateProcess.on('exit', (code) => {
|
|
269
|
+
if (code === 0) {
|
|
270
|
+
console.log(chalk.green('✅ Successfully updated to the latest version!'));
|
|
271
|
+
} else {
|
|
272
|
+
console.error(chalk.red(`❌ Update failed with code ${code}. Please try running manually: pnpm add -g @halilertekin/claude-code-router-config@latest`));
|
|
273
|
+
}
|
|
274
|
+
});
|
|
275
|
+
break;
|
|
276
|
+
|
|
277
|
+
case 'version':
|
|
278
|
+
case '-v':
|
|
279
|
+
case '--version':
|
|
280
|
+
const packageJson = require('../package.json');
|
|
281
|
+
console.log(chalk.blue(`v${packageJson.version}`));
|
|
282
|
+
break;
|
|
283
|
+
|
|
284
|
+
case 'test':
|
|
285
|
+
const provider = args[0];
|
|
286
|
+
const model = args[1];
|
|
287
|
+
if (provider) {
|
|
288
|
+
await testProvider(provider, model);
|
|
289
|
+
} else {
|
|
290
|
+
console.error(chalk.red('❌ Please specify a provider: ccr test <provider> [model]'));
|
|
291
|
+
}
|
|
292
|
+
break;
|
|
293
|
+
|
|
294
|
+
case 'benchmark':
|
|
295
|
+
const options = {
|
|
296
|
+
allProviders: args.includes('--all'),
|
|
297
|
+
compareSpeed: args.includes('--compare-speed')
|
|
298
|
+
};
|
|
299
|
+
await benchmarkProviders(options);
|
|
300
|
+
break;
|
|
301
|
+
|
|
302
|
+
case 'status':
|
|
303
|
+
if (args.includes('--detailed')) {
|
|
304
|
+
const statusOptions = {
|
|
305
|
+
detailed: true,
|
|
306
|
+
showCosts: args.includes('--show-costs')
|
|
307
|
+
};
|
|
308
|
+
await showDetailedStatus(statusOptions);
|
|
309
|
+
} else {
|
|
310
|
+
// Pass basic status to original router
|
|
311
|
+
proxyToOriginal(['status', ...args]);
|
|
312
|
+
}
|
|
313
|
+
break;
|
|
314
|
+
|
|
315
|
+
case 'analytics':
|
|
316
|
+
// Forward to analytics script
|
|
317
|
+
const analyticsPath = path.join(__dirname, 'analytics.js');
|
|
318
|
+
spawn('node', [analyticsPath, ...args], { stdio: 'inherit' });
|
|
319
|
+
break;
|
|
320
|
+
|
|
321
|
+
case 'health':
|
|
322
|
+
const healthPath = path.join(__dirname, '../logging/health-monitor.js');
|
|
323
|
+
spawn('node', [healthPath, ...args], { stdio: 'inherit' });
|
|
324
|
+
break;
|
|
325
|
+
|
|
326
|
+
case 'config':
|
|
327
|
+
const configCommand = args[0];
|
|
328
|
+
switch (configCommand) {
|
|
329
|
+
case 'validate':
|
|
330
|
+
validateConfig();
|
|
331
|
+
break;
|
|
332
|
+
case 'backup':
|
|
333
|
+
backupConfig();
|
|
334
|
+
break;
|
|
335
|
+
default:
|
|
336
|
+
console.log(chalk.yellow('Available config commands:'));
|
|
337
|
+
console.log(' validate - Check configuration validity');
|
|
338
|
+
console.log(' backup - Backup current configuration');
|
|
339
|
+
}
|
|
340
|
+
break;
|
|
341
|
+
|
|
342
|
+
default:
|
|
343
|
+
// Handles 'help', '--help', '-h' and empty command
|
|
344
|
+
console.log(chalk.blue('Claude Code Router - Advanced CLI (v1.3.4)'));
|
|
345
|
+
console.log(chalk.gray('─'.repeat(45)));
|
|
346
|
+
|
|
347
|
+
console.log(chalk.yellow('🚀 Advanced CLI Tools:'));
|
|
348
|
+
console.log(' test <provider> [model] - Test provider connection');
|
|
349
|
+
console.log(' benchmark [--all] [--compare-speed] - Benchmark providers');
|
|
350
|
+
console.log(' analytics [period] - View usage statistics');
|
|
351
|
+
console.log(' status --detailed [--show-costs] - Show detailed router status');
|
|
352
|
+
console.log(' config validate - Validate configuration');
|
|
353
|
+
console.log(' config backup - Backup configuration');
|
|
354
|
+
console.log(' health [--all-providers] - Check provider health');
|
|
355
|
+
console.log(' update - Update to the latest version');
|
|
356
|
+
|
|
357
|
+
console.log(chalk.yellow('\n📦 Core Router Commands (Proxy):'));
|
|
358
|
+
console.log(' start - Start router server (Backend only)');
|
|
359
|
+
console.log(' stop - Stop router server');
|
|
360
|
+
console.log(' restart - Restart router server');
|
|
361
|
+
console.log(' status - Show server status');
|
|
362
|
+
console.log(' code - Start Router + Claude Code (Recommended)');
|
|
363
|
+
console.log(' model - Switch models at runtime');
|
|
364
|
+
console.log(' activate - Export env variables');
|
|
365
|
+
|
|
366
|
+
console.log(chalk.yellow('\n💡 Tip:'));
|
|
367
|
+
console.log(' To start everything at once, run: ' + chalk.cyan('ccr code'));
|
|
368
|
+
console.log(' To only start the background server, run: ' + chalk.cyan('ccr start'));
|
|
369
|
+
}
|
|
370
|
+
} else {
|
|
371
|
+
// Forward unknown commands to the original router
|
|
372
|
+
proxyToOriginal([command, ...args]);
|
|
287
373
|
}
|
|
288
374
|
}
|
|
289
375
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@halilertekin/claude-code-router-config",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.4",
|
|
4
4
|
"description": "Multi-provider configuration for Claude Code Router with intent-based routing, advanced CLI tools, analytics, and smart routing. Setup OpenAI, Anthropic, Gemini, Qwen, GLM, OpenRouter, and GitHub Copilot with intelligent routing.",
|
|
5
5
|
"main": "install.js",
|
|
6
6
|
"bin": {
|
|
@@ -86,7 +86,8 @@
|
|
|
86
86
|
"fs-extra": "^11.1.1",
|
|
87
87
|
"dotenv": "^16.3.1",
|
|
88
88
|
"express": "^4.18.2",
|
|
89
|
-
"cors": "^2.8.5"
|
|
89
|
+
"cors": "^2.8.5",
|
|
90
|
+
"@musistudio/claude-code-router": "^1.0.73"
|
|
90
91
|
},
|
|
91
92
|
"devDependencies": {
|
|
92
93
|
"jest": "^29.7.0"
|