@tuannvm/ccodex 0.1.1 → 0.2.9
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/README.md +35 -0
- package/dist/aliases.js +2 -2
- package/dist/aliases.js.map +1 -1
- package/dist/claude.d.ts +5 -1
- package/dist/claude.d.ts.map +1 -1
- package/dist/claude.js +136 -37
- package/dist/claude.js.map +1 -1
- package/dist/cli.js +149 -6
- package/dist/cli.js.map +1 -1
- package/dist/powershell.js +2 -2
- package/dist/powershell.js.map +1 -1
- package/dist/proxy.d.ts +7 -1
- package/dist/proxy.d.ts.map +1 -1
- package/dist/proxy.js +737 -62
- package/dist/proxy.js.map +1 -1
- package/dist/status.js +4 -4
- package/dist/status.js.map +1 -1
- package/dist/utils.d.ts +28 -4
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +210 -28
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -45,6 +45,41 @@ Every time you run `ccodex`, it:
|
|
|
45
45
|
|
|
46
46
|
This makes it "just work" without manual setup steps.
|
|
47
47
|
|
|
48
|
+
## Production Readiness (v0.2.6)
|
|
49
|
+
|
|
50
|
+
`ccodex` v0.2.6 is production-ready for:
|
|
51
|
+
- ✅ **macOS** (arm64, x64)
|
|
52
|
+
- ✅ **Linux** (arm64, x64)
|
|
53
|
+
|
|
54
|
+
### Windows Status (Known Limitations)
|
|
55
|
+
|
|
56
|
+
Windows support is currently partial and is not yet production-ready.
|
|
57
|
+
|
|
58
|
+
Current Windows limitations:
|
|
59
|
+
- `CLIProxyAPI` auto-install is not fully automated; manual proxy setup is required.
|
|
60
|
+
- Shell/profile integration differs across `PowerShell`, `Windows PowerShell`, and `cmd`, and may need manual adjustment.
|
|
61
|
+
- Path and wrapper differences (`.cmd`/`.exe`) are handled in detection, but end-to-end setup remains less reliable than macOS/Linux.
|
|
62
|
+
|
|
63
|
+
Recommended Windows flow for now:
|
|
64
|
+
1. Install Claude Code CLI manually and verify `claude` is on `PATH`.
|
|
65
|
+
2. Install and run proxy components manually.
|
|
66
|
+
3. Use `ccodex --status` to verify runtime before interactive use.
|
|
67
|
+
|
|
68
|
+
For team rollouts, treat Windows as "best effort" until full installer parity lands.
|
|
69
|
+
|
|
70
|
+
### Security Features
|
|
71
|
+
|
|
72
|
+
- **Allowlist environment passing**: Only essential environment variables are passed to Claude subprocess (PATH, HOME, TMP, etc.)
|
|
73
|
+
- **Mandatory checksum verification**: Downloaded binaries are verified against SHA-256 checksums before installation
|
|
74
|
+
- **Fail-closed policy**: Installation fails hard if checksums cannot be verified
|
|
75
|
+
- **No API key leakage**: All Anthropic/OpenAI variables are explicitly excluded from subprocess environment
|
|
76
|
+
|
|
77
|
+
### Known Limitations
|
|
78
|
+
|
|
79
|
+
- **Checksum trust model**: Binary and checksum are both fetched from the same GitHub release. If the release account is compromised, both could be malicious. Future versions may add signature verification.
|
|
80
|
+
- **Concurrency**: No install lock file; concurrent installations may race (low frequency issue).
|
|
81
|
+
- **Platform support**: Only arm64 and x64 architectures are supported.
|
|
82
|
+
|
|
48
83
|
## Model Mapping
|
|
49
84
|
|
|
50
85
|
| Claude Tier | GPT Model |
|
package/dist/aliases.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { join } from 'path';
|
|
1
|
+
import { join, dirname } from 'path';
|
|
2
2
|
import { getShellRcFile, ensureDir, appendFile, readFile, fileExists, detectPlatform, isInteractive, } from './utils.js';
|
|
3
3
|
import { installPowerShellAliases, isPowerShellIntegrationConfigured } from './powershell.js';
|
|
4
4
|
// Use npx directly - no local bin installation
|
|
@@ -57,7 +57,7 @@ function removeCcodexBlock(content) {
|
|
|
57
57
|
*/
|
|
58
58
|
async function addAliasesToRc(rcFile) {
|
|
59
59
|
// Ensure rc file directory exists
|
|
60
|
-
await ensureDir(
|
|
60
|
+
await ensureDir(dirname(rcFile));
|
|
61
61
|
// Create rc file if it doesn't exist
|
|
62
62
|
const fs = await import('fs/promises');
|
|
63
63
|
try {
|
package/dist/aliases.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"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"}
|
package/dist/claude.d.ts
CHANGED
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Detect Claude Code installation
|
|
3
|
+
* Checks multiple sources in priority order:
|
|
4
|
+
* 1. Process-local path (fast path for current process)
|
|
5
|
+
* 2. Persistent local fallback path (for previously-installed local CLI)
|
|
6
|
+
* 3. System PATH (for globally-installed CLI)
|
|
3
7
|
*/
|
|
4
8
|
export declare function detectClaudeCommand(): Promise<{
|
|
5
9
|
cmd: string | null;
|
|
6
10
|
path: string | null;
|
|
7
11
|
}>;
|
|
8
12
|
/**
|
|
9
|
-
* Install Claude Code via npm
|
|
13
|
+
* Install Claude Code via npm with fallback to local prefix
|
|
10
14
|
*/
|
|
11
15
|
export declare function installClaudeCode(): Promise<void>;
|
|
12
16
|
/**
|
package/dist/claude.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AA6BA;;;;;;GAMG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAoBhG;AAqBD;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAuCvD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAyI7D"}
|
package/dist/claude.js
CHANGED
|
@@ -1,25 +1,73 @@
|
|
|
1
1
|
import spawnCmd from 'cross-spawn';
|
|
2
2
|
import { join } from 'path';
|
|
3
|
-
import {
|
|
3
|
+
import { homedir } from 'os';
|
|
4
|
+
import { hasCommand, getCommandPath, ensureDir, getUid, fileExists, requireTrustedCommand } from './utils.js';
|
|
4
5
|
import { startProxy, checkAuthConfigured, launchLogin, waitForAuth } from './proxy.js';
|
|
6
|
+
// Track locally installed Claude CLI path for this process
|
|
7
|
+
let installedClaudePath = null;
|
|
8
|
+
/**
|
|
9
|
+
* Get the deterministic persistent path for local Claude CLI installation
|
|
10
|
+
* This path is used across process invocations to persistently discover
|
|
11
|
+
* locally-installed Claude CLI when global install fails
|
|
12
|
+
* Handles platform differences (Unix vs Windows)
|
|
13
|
+
*/
|
|
14
|
+
function getPersistentLocalClaudePath() {
|
|
15
|
+
const home = homedir();
|
|
16
|
+
if (process.platform === 'win32') {
|
|
17
|
+
// Windows: npm installs to AppData/local/prefix, with .cmd wrappers
|
|
18
|
+
// Try claude.cmd first (npm wrapper), then claude.exe (actual binary)
|
|
19
|
+
const localPrefix = join(home, 'AppData', 'Local', 'ccodex', 'npm');
|
|
20
|
+
return join(localPrefix, 'node_modules', '.bin', 'claude.cmd');
|
|
21
|
+
}
|
|
22
|
+
// Unix/macOS: ~/.local/ccodex/npm/node_modules/.bin/claude
|
|
23
|
+
return join(home, '.local', 'ccodex', 'npm', 'node_modules', '.bin', 'claude');
|
|
24
|
+
}
|
|
5
25
|
/**
|
|
6
26
|
* Detect Claude Code installation
|
|
27
|
+
* Checks multiple sources in priority order:
|
|
28
|
+
* 1. Process-local path (fast path for current process)
|
|
29
|
+
* 2. Persistent local fallback path (for previously-installed local CLI)
|
|
30
|
+
* 3. System PATH (for globally-installed CLI)
|
|
7
31
|
*/
|
|
8
32
|
export async function detectClaudeCommand() {
|
|
33
|
+
// 1. Prefer locally installed binary from this process (fast path)
|
|
34
|
+
if (installedClaudePath && fileExists(installedClaudePath)) {
|
|
35
|
+
return { cmd: installedClaudePath, path: installedClaudePath };
|
|
36
|
+
}
|
|
37
|
+
// 2. Check persistent local fallback path (for previously-installed CLI)
|
|
38
|
+
const persistentLocal = getPersistentLocalClaudePath();
|
|
39
|
+
if (fileExists(persistentLocal)) {
|
|
40
|
+
// Update process-local cache for faster subsequent checks
|
|
41
|
+
installedClaudePath = persistentLocal;
|
|
42
|
+
return { cmd: persistentLocal, path: persistentLocal };
|
|
43
|
+
}
|
|
44
|
+
// 3. Check system PATH for global installation
|
|
9
45
|
if (await hasCommand('claude')) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
const path = await execCommand('which', ['claude']);
|
|
13
|
-
return { cmd: 'claude', path };
|
|
14
|
-
}
|
|
15
|
-
catch {
|
|
16
|
-
return { cmd: 'claude', path: null };
|
|
17
|
-
}
|
|
46
|
+
const resolved = await getCommandPath('claude');
|
|
47
|
+
return { cmd: 'claude', path: resolved };
|
|
18
48
|
}
|
|
19
49
|
return { cmd: null, path: null };
|
|
20
50
|
}
|
|
21
51
|
/**
|
|
22
|
-
*
|
|
52
|
+
* Helper to run npm install and capture stderr
|
|
53
|
+
*/
|
|
54
|
+
async function runNpmInstall(args) {
|
|
55
|
+
const npmPath = await requireTrustedCommand('npm');
|
|
56
|
+
const spawn = (await import('cross-spawn')).default;
|
|
57
|
+
return new Promise((resolve, reject) => {
|
|
58
|
+
const child = spawn(npmPath, args, { stdio: ['ignore', 'inherit', 'pipe'] });
|
|
59
|
+
let stderr = '';
|
|
60
|
+
child.stderr?.on('data', (d) => {
|
|
61
|
+
const s = d.toString();
|
|
62
|
+
stderr += s;
|
|
63
|
+
process.stderr.write(s);
|
|
64
|
+
});
|
|
65
|
+
child.on('error', reject);
|
|
66
|
+
child.on('close', code => resolve({ ok: code === 0, stderr }));
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Install Claude Code via npm with fallback to local prefix
|
|
23
71
|
*/
|
|
24
72
|
export async function installClaudeCode() {
|
|
25
73
|
// Check if npm is available
|
|
@@ -27,30 +75,46 @@ export async function installClaudeCode() {
|
|
|
27
75
|
throw new Error('npm not found. Install Node.js with npm first.');
|
|
28
76
|
}
|
|
29
77
|
console.log('Installing Claude Code CLI via npm...');
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
78
|
+
// Try global install first
|
|
79
|
+
const global = await runNpmInstall(['install', '-g', '@anthropic-ai/claude-code']);
|
|
80
|
+
if (global.ok) {
|
|
81
|
+
console.log('Claude Code CLI installed successfully via npm global');
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
// Check if it was a permission error
|
|
85
|
+
const permissionDenied = /EACCES|permission denied/i.test(global.stderr);
|
|
86
|
+
if (!permissionDenied) {
|
|
87
|
+
throw new Error('Failed to install Claude Code CLI');
|
|
88
|
+
}
|
|
89
|
+
// Fallback to local install
|
|
90
|
+
// Use platform-specific local prefix path
|
|
91
|
+
let localPrefix;
|
|
92
|
+
if (process.platform === 'win32') {
|
|
93
|
+
localPrefix = join(homedir(), 'AppData', 'Local', 'ccodex', 'npm');
|
|
94
|
+
}
|
|
95
|
+
else {
|
|
96
|
+
localPrefix = join(homedir(), '.local', 'ccodex', 'npm');
|
|
97
|
+
}
|
|
98
|
+
console.log(`Global install denied. Falling back to local prefix: ${localPrefix}`);
|
|
99
|
+
const local = await runNpmInstall(['install', '--prefix', localPrefix, '@anthropic-ai/claude-code']);
|
|
100
|
+
if (!local.ok) {
|
|
101
|
+
throw new Error('Failed to install Claude Code CLI (global + local fallback both failed)');
|
|
102
|
+
}
|
|
103
|
+
// Store the installed path using the persistent path function
|
|
104
|
+
installedClaudePath = getPersistentLocalClaudePath();
|
|
105
|
+
console.log(`Claude Code CLI installed locally: ${installedClaudePath}`);
|
|
46
106
|
}
|
|
47
107
|
/**
|
|
48
108
|
* Run Claude Code CLI with proxy environment
|
|
49
109
|
*/
|
|
50
110
|
export async function runClaude(args) {
|
|
51
|
-
|
|
111
|
+
// Detect Claude CLI using comprehensive detection (process-local, persistent local, system PATH)
|
|
112
|
+
const claudeCmd = await detectClaudeCommand();
|
|
113
|
+
if (!claudeCmd.cmd) {
|
|
52
114
|
throw new Error('claude CLI not found in PATH\nInstall Claude Code CLI first, then rerun: npx -y @tuannvm/ccodex');
|
|
53
115
|
}
|
|
116
|
+
// Use detected command (absolute path or command name)
|
|
117
|
+
const claudeExe = claudeCmd.cmd;
|
|
54
118
|
// Ensure proxy is running
|
|
55
119
|
await startProxy();
|
|
56
120
|
// Check auth, launch login if needed
|
|
@@ -75,15 +139,50 @@ export async function runClaude(args) {
|
|
|
75
139
|
const { homedir } = await import('os');
|
|
76
140
|
const userHome = homedir();
|
|
77
141
|
// Environment for Claude with proxy
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
142
|
+
// Minimal allowlist for subprocess environment.
|
|
143
|
+
// Default-deny: only pass values required for process execution and terminal UX.
|
|
144
|
+
const allowedEnvKeys = new Set([
|
|
145
|
+
'PATH',
|
|
146
|
+
'HOME',
|
|
147
|
+
'USERPROFILE',
|
|
148
|
+
'SYSTEMROOT',
|
|
149
|
+
'WINDIR',
|
|
150
|
+
'COMSPEC',
|
|
151
|
+
'PATHEXT',
|
|
152
|
+
'TMPDIR',
|
|
153
|
+
'TMP',
|
|
154
|
+
'TEMP',
|
|
155
|
+
'LANG',
|
|
156
|
+
'LC_ALL',
|
|
157
|
+
'LC_CTYPE',
|
|
158
|
+
'TERM',
|
|
159
|
+
'COLORTERM',
|
|
160
|
+
'NO_COLOR',
|
|
161
|
+
'FORCE_COLOR',
|
|
162
|
+
'CI',
|
|
163
|
+
'SHELL',
|
|
164
|
+
'PWD',
|
|
165
|
+
'OLDPWD',
|
|
166
|
+
'XDG_CONFIG_HOME',
|
|
167
|
+
'XDG_CACHE_HOME',
|
|
168
|
+
'XDG_DATA_HOME',
|
|
169
|
+
// TLS/certificate support for enterprise environments
|
|
170
|
+
'SSL_CERT_FILE',
|
|
171
|
+
'SSL_CERT_DIR',
|
|
172
|
+
'NODE_EXTRA_CA_CERTS',
|
|
173
|
+
'NODE_TLS_REJECT_UNAUTHORIZED',
|
|
174
|
+
]);
|
|
175
|
+
const env = {};
|
|
176
|
+
for (const [key, value] of Object.entries(process.env)) {
|
|
177
|
+
if (value === undefined)
|
|
178
|
+
continue;
|
|
179
|
+
// On Windows env keys are case-insensitive; normalize for allowlist matching.
|
|
180
|
+
const normalized = process.platform === 'win32' ? key.toUpperCase() : key;
|
|
181
|
+
const allowed = allowedEnvKeys.has(normalized);
|
|
182
|
+
if (allowed) {
|
|
183
|
+
env[key] = value;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
87
186
|
// Set proxy config - dummy token is replaced by CLIProxyAPI's OAuth credentials
|
|
88
187
|
// The proxy handles ChatGPT authentication, this is just a format placeholder
|
|
89
188
|
env.ANTHROPIC_AUTH_TOKEN = 'sk-dummy';
|
|
@@ -108,7 +207,7 @@ export async function runClaude(args) {
|
|
|
108
207
|
env.DISABLE_ERROR_REPORTING = '1';
|
|
109
208
|
env.CLAUDE_CONFIG_DIR = join(userHome, '.claude-openai');
|
|
110
209
|
// Spawn Claude with modified environment
|
|
111
|
-
const child = spawnCmd(
|
|
210
|
+
const child = spawnCmd(claudeExe, args, {
|
|
112
211
|
stdio: 'inherit',
|
|
113
212
|
env,
|
|
114
213
|
});
|
package/dist/claude.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAAA,OAAO,QAAQ,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
|
package/dist/cli.js
CHANGED
|
@@ -1,10 +1,108 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { Command } from 'commander';
|
|
3
3
|
import chalk from 'chalk';
|
|
4
|
+
import { dirname, join } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
import { readFileSync } from 'fs';
|
|
4
7
|
import { detectProxyCommand, installProxyApi, startProxy, launchLogin, waitForAuth, checkAuthConfigured } from './proxy.js';
|
|
5
|
-
import { configureShellIntegration } from './aliases.js';
|
|
8
|
+
import { configureShellIntegration, isShellIntegrationConfigured } from './aliases.js';
|
|
6
9
|
import { printStatus, readyCheck } from './status.js';
|
|
7
10
|
import { runClaude, detectClaudeCommand, installClaudeCode } from './claude.js';
|
|
11
|
+
/**
|
|
12
|
+
* Get version from package.json
|
|
13
|
+
* Reads version dynamically to avoid hardcoded version mismatch
|
|
14
|
+
*/
|
|
15
|
+
function getVersion() {
|
|
16
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
17
|
+
const __dirname = dirname(__filename);
|
|
18
|
+
const pkgPath = join(__dirname, '..', 'package.json');
|
|
19
|
+
try {
|
|
20
|
+
const pkg = JSON.parse(readFileSync(pkgPath, 'utf-8'));
|
|
21
|
+
return pkg.version || '0.0.0';
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return '0.0.0';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Show proxy and auth diagnostic information
|
|
29
|
+
*/
|
|
30
|
+
async function showProxyDiagnostics() {
|
|
31
|
+
const { isProxyRunning, checkAuthConfigured, detectProxyCommand } = await import('./proxy.js');
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log(chalk.bold('Proxy & Auth Diagnostics'));
|
|
34
|
+
console.log('');
|
|
35
|
+
// Check proxy command
|
|
36
|
+
const proxyCmd = await detectProxyCommand();
|
|
37
|
+
if (proxyCmd.cmd) {
|
|
38
|
+
console.log(chalk.green(`✓ Proxy command found:`), proxyCmd.cmd);
|
|
39
|
+
if (proxyCmd.path) {
|
|
40
|
+
console.log(chalk.gray(` Path: ${proxyCmd.path}`));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
console.log(chalk.red('✗ Proxy command NOT found'));
|
|
45
|
+
}
|
|
46
|
+
// Check if proxy is running
|
|
47
|
+
const proxyRunning = await isProxyRunning();
|
|
48
|
+
if (proxyRunning) {
|
|
49
|
+
console.log(chalk.green('✓ Proxy is running'), chalk.gray('(127.0.0.1:8317)'));
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
console.log(chalk.red('✗ Proxy is NOT running'));
|
|
53
|
+
}
|
|
54
|
+
// Check auth status
|
|
55
|
+
const auth = await checkAuthConfigured();
|
|
56
|
+
console.log('');
|
|
57
|
+
if (auth.hasModels) {
|
|
58
|
+
console.log(chalk.green('✓ Auth: Models accessible (proxy has valid credentials)'));
|
|
59
|
+
}
|
|
60
|
+
else if (auth.hasAuthEntries) {
|
|
61
|
+
console.log(chalk.yellow('⚠ Auth: Entries exist but models not accessible'));
|
|
62
|
+
}
|
|
63
|
+
else if (auth.hasAuthFiles) {
|
|
64
|
+
console.log(chalk.yellow('⚠ Auth: Files exist but not loaded'));
|
|
65
|
+
}
|
|
66
|
+
else {
|
|
67
|
+
console.log(chalk.red('✗ Auth: No credentials found'));
|
|
68
|
+
}
|
|
69
|
+
console.log('');
|
|
70
|
+
console.log(chalk.gray('If you see errors above, try: npx -y @tuannvm/ccodex --login'));
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Preflight check - validate platform and capabilities before main operations
|
|
74
|
+
* Only runs for non-status commands to allow read-only diagnostics anywhere
|
|
75
|
+
*/
|
|
76
|
+
function preflightOrThrow() {
|
|
77
|
+
const platform = process.platform;
|
|
78
|
+
const arch = process.arch;
|
|
79
|
+
// Check Node.js version
|
|
80
|
+
const nodeMajorVersion = Number(process.versions.node.split('.')[0]);
|
|
81
|
+
if (nodeMajorVersion < 18) {
|
|
82
|
+
throw new Error(`Node.js ${process.versions.node} detected.\n` +
|
|
83
|
+
`Please use Node.js >= 18. You have ${process.versions.node}.`);
|
|
84
|
+
}
|
|
85
|
+
// Check OS support
|
|
86
|
+
const supportedPlatforms = ['darwin', 'linux', 'win32'];
|
|
87
|
+
if (!supportedPlatforms.includes(platform)) {
|
|
88
|
+
throw new Error(`Unsupported OS: ${platform}\n` +
|
|
89
|
+
`Supported platforms: ${supportedPlatforms.join(', ')}`);
|
|
90
|
+
}
|
|
91
|
+
// Check architecture for proxy auto-install (Unix/Linux only)
|
|
92
|
+
if (platform === 'darwin' || platform === 'linux') {
|
|
93
|
+
const supportedArches = ['arm64', 'x64'];
|
|
94
|
+
if (!supportedArches.includes(arch)) {
|
|
95
|
+
throw new Error(`Unsupported architecture for CLIProxyAPI auto-install: ${arch}\n` +
|
|
96
|
+
`Supported architectures: ${supportedArches.join(', ')}\n` +
|
|
97
|
+
`CLIProxyAPI must be installed manually for your architecture.`);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
// Windows warning
|
|
101
|
+
if (platform === 'win32') {
|
|
102
|
+
console.log(chalk.yellow('Windows detected: CLIProxyAPI requires manual installation.\n' +
|
|
103
|
+
'Install from: https://github.com/router-for-me/CLIProxyAPI/releases'));
|
|
104
|
+
}
|
|
105
|
+
}
|
|
8
106
|
/**
|
|
9
107
|
* Ensure everything is set up (idempotent)
|
|
10
108
|
* Implements steps 1-5 of the ccodex workflow:
|
|
@@ -32,7 +130,12 @@ async function ensureSetup() {
|
|
|
32
130
|
needsSetup = true;
|
|
33
131
|
}
|
|
34
132
|
// 3. Configure shell integration (adds aliases directly to rc files)
|
|
35
|
-
|
|
133
|
+
// Only run if not already configured for true idempotency
|
|
134
|
+
const shellConfigured = await isShellIntegrationConfigured();
|
|
135
|
+
if (!shellConfigured) {
|
|
136
|
+
await configureShellIntegration();
|
|
137
|
+
needsSetup = true;
|
|
138
|
+
}
|
|
36
139
|
// 5. Start proxy
|
|
37
140
|
await startProxy();
|
|
38
141
|
// 6. Check auth, launch login if needed
|
|
@@ -54,13 +157,18 @@ async function main() {
|
|
|
54
157
|
program
|
|
55
158
|
.name('ccodex')
|
|
56
159
|
.description('TypeScript reimplementation of ccodex - run Claude Code with OpenAI GPT models')
|
|
57
|
-
.version(
|
|
160
|
+
.version(getVersion())
|
|
58
161
|
.option('--login', 'Run ChatGPT/Codex OAuth login')
|
|
59
162
|
.option('--status', 'Show setup status')
|
|
163
|
+
.option('--diagnose', 'Show proxy and auth diagnostics')
|
|
60
164
|
.allowUnknownOption(true)
|
|
61
165
|
.allowExcessArguments(true)
|
|
62
166
|
.parse(process.argv);
|
|
63
167
|
const options = program.opts();
|
|
168
|
+
// Preflight check for all operations except read-only diagnostics (--status, --diagnose)
|
|
169
|
+
if (!options.status && !options.diagnose) {
|
|
170
|
+
preflightOrThrow();
|
|
171
|
+
}
|
|
64
172
|
// Handle --login
|
|
65
173
|
if (options.login) {
|
|
66
174
|
// Ensure setup (installs dependencies, configures shell, starts proxy)
|
|
@@ -74,11 +182,36 @@ async function main() {
|
|
|
74
182
|
if (!proxyCmd.cmd) {
|
|
75
183
|
await installProxyApi();
|
|
76
184
|
}
|
|
77
|
-
|
|
185
|
+
// Only configure shell integration if not already configured
|
|
186
|
+
const shellConfigured = await isShellIntegrationConfigured();
|
|
187
|
+
if (!shellConfigured) {
|
|
188
|
+
await configureShellIntegration();
|
|
189
|
+
}
|
|
78
190
|
await startProxy();
|
|
79
|
-
//
|
|
80
|
-
|
|
191
|
+
// Check current auth status
|
|
192
|
+
const authBefore = await checkAuthConfigured();
|
|
193
|
+
if (authBefore.configured) {
|
|
194
|
+
console.log(chalk.green('✓ Already authenticated. Launching login to re-authorize...'));
|
|
195
|
+
}
|
|
196
|
+
else {
|
|
197
|
+
console.log(chalk.yellow('Not authenticated. Starting OAuth login flow...'));
|
|
198
|
+
}
|
|
199
|
+
// Launch login
|
|
81
200
|
await launchLogin();
|
|
201
|
+
// Wait for authentication to complete
|
|
202
|
+
console.log('Waiting for OAuth authentication to complete...');
|
|
203
|
+
await waitForAuth();
|
|
204
|
+
// Verify auth worked
|
|
205
|
+
const authAfter = await checkAuthConfigured();
|
|
206
|
+
if (!authAfter.configured) {
|
|
207
|
+
console.log(chalk.yellow('Authentication may not have completed. Please try:'));
|
|
208
|
+
console.log(' 1. Check if browser login completed');
|
|
209
|
+
console.log(' 2. Run: npx -y @tuannvm/ccodex --login');
|
|
210
|
+
console.log(' 3. Or restart the proxy and try again');
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
console.log(chalk.green('✓ Authentication successful! You can now use ccodex.'));
|
|
214
|
+
}
|
|
82
215
|
return;
|
|
83
216
|
}
|
|
84
217
|
// Handle --status (read-only, no side effects)
|
|
@@ -86,6 +219,11 @@ async function main() {
|
|
|
86
219
|
await printStatus();
|
|
87
220
|
return;
|
|
88
221
|
}
|
|
222
|
+
// Handle --diagnose (show detailed diagnostics)
|
|
223
|
+
if (options.diagnose) {
|
|
224
|
+
await showProxyDiagnostics();
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
89
227
|
// Default: ensure setup and run Claude Code
|
|
90
228
|
await ensureSetup();
|
|
91
229
|
// Get remaining args for Claude Code
|
|
@@ -96,6 +234,11 @@ main().catch((error) => {
|
|
|
96
234
|
// Normalize error to Error instance
|
|
97
235
|
const err = error instanceof Error ? error : new Error(String(error));
|
|
98
236
|
console.error(chalk.red('Error:'), err.message);
|
|
237
|
+
// Suggest diagnostics for auth errors
|
|
238
|
+
if (err.message.includes('401') || err.message.includes('Invalid API key') || err.message.includes('authentication')) {
|
|
239
|
+
console.error('');
|
|
240
|
+
console.error(chalk.yellow('For troubleshooting, run:'), chalk.bold('npx -y @tuannvm/ccodex --diagnose'));
|
|
241
|
+
}
|
|
99
242
|
// Print stack trace in debug mode
|
|
100
243
|
if (process.env.DEBUG || process.env.CCODEX_DEBUG) {
|
|
101
244
|
console.error(chalk.gray(err.stack));
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAC5H,OAAO,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
package/dist/powershell.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* PowerShell-specific utilities for Windows support
|
|
3
3
|
*/
|
|
4
|
-
import { join } from 'path';
|
|
4
|
+
import { join, dirname } from 'path';
|
|
5
5
|
import { homedir } from 'os';
|
|
6
6
|
import { fileExists, ensureDir, appendFile, debugLog } from './utils.js';
|
|
7
7
|
// Use npx directly - no local bin installation
|
|
@@ -62,7 +62,7 @@ export async function installPowerShellAliases() {
|
|
|
62
62
|
return false;
|
|
63
63
|
}
|
|
64
64
|
// Ensure profile directory exists
|
|
65
|
-
await ensureDir(
|
|
65
|
+
await ensureDir(dirname(profilePath));
|
|
66
66
|
// Check if already configured with our aliases
|
|
67
67
|
if (fileExists(profilePath)) {
|
|
68
68
|
const content = await readFile(profilePath);
|
package/dist/powershell.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"powershell.js","sourceRoot":"","sources":["../src/powershell.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"powershell.js","sourceRoot":"","sources":["../src/powershell.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { ProxyCommand, AuthStatus } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Get trusted proxy command path
|
|
4
|
+
* Validates that the proxy binary is from a trusted location before execution
|
|
5
|
+
*/
|
|
6
|
+
export declare function requireTrustedProxyCommand(): Promise<string>;
|
|
2
7
|
/**
|
|
3
8
|
* Detect CLIProxyAPI command
|
|
9
|
+
* Prefers locally installed binary from this process if available
|
|
4
10
|
*/
|
|
5
11
|
export declare function detectProxyCommand(): Promise<ProxyCommand>;
|
|
6
12
|
/**
|
|
@@ -12,7 +18,7 @@ export declare function isProxyRunning(): Promise<boolean>;
|
|
|
12
18
|
*/
|
|
13
19
|
export declare function checkAuthConfigured(): Promise<AuthStatus>;
|
|
14
20
|
/**
|
|
15
|
-
* Install CLIProxyAPI via Homebrew
|
|
21
|
+
* Install CLIProxyAPI via Homebrew or Go binary fallback
|
|
16
22
|
*/
|
|
17
23
|
export declare function installProxyApi(): Promise<void>;
|
|
18
24
|
/**
|