@tuannvm/ccodex 0.1.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 ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 tuannvm
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,98 @@
1
+ # ccodex
2
+
3
+ TypeScript reimplementation of `ccodex` — run Claude Code CLI with OpenAI GPT models via CLIProxyAPI.
4
+
5
+ ## Quick Start
6
+
7
+ ```bash
8
+ npx -y ccodex
9
+ ```
10
+
11
+ That's it. `ccodex` will automatically:
12
+ 1. Check/install Claude Code CLI (via npm)
13
+ 2. Check/install CLIProxyAPI (via Homebrew)
14
+ 3. Set up shell aliases (`ccodex`, `co`, `claude-openai`)
15
+ 4. Configure shell integration
16
+ 5. Start the proxy in background
17
+ 6. Launch OAuth login if needed
18
+ 7. Run Claude Code with GPT-5.3 Codex models
19
+
20
+ ## Usage
21
+
22
+ ```bash
23
+ # First run - sets everything up automatically
24
+ npx -y ccodex
25
+
26
+ # After setup - use aliases
27
+ ccodex
28
+ co
29
+ claude-openai
30
+
31
+ # Check setup status
32
+ ccodex --status
33
+
34
+ # Launch OAuth login manually
35
+ ccodex --login
36
+ ```
37
+
38
+ ## How It Works
39
+
40
+ Every time you run `ccodex`, it:
41
+ 1. Ensures all dependencies are installed
42
+ 2. Starts the proxy if not running
43
+ 3. Checks authentication, launches login if needed
44
+ 4. Runs Claude Code with the proxy configuration
45
+
46
+ This makes it "just work" without manual setup steps.
47
+
48
+ ## Model Mapping
49
+
50
+ | Claude Tier | GPT Model |
51
+ |-------------|-----------|
52
+ | Opus | `gpt-5.3-codex(xhigh)` |
53
+ | Sonnet | `gpt-5.3-codex(high)` |
54
+ | Default | `gpt-5.3-codex(medium)` |
55
+ | Haiku | `gpt-5.3-codex(low)` |
56
+
57
+ ## Architecture
58
+
59
+ ```
60
+ ┌─────────────┐
61
+ │ ccodex │ ← TypeScript CLI (this package)
62
+ └──────┬──────┘
63
+
64
+
65
+ ┌─────────────┐
66
+ │CLIProxyAPI │ ← Local proxy (cliproxyapi/cliproxy)
67
+ │ :8317 │
68
+ └──────┬──────┘
69
+
70
+
71
+ ┌─────────────┐
72
+ │ Claude Code │ ← Anthropic's claude CLI
73
+ │ CLI │
74
+ └─────────────┘
75
+ ```
76
+
77
+ ## Requirements
78
+
79
+ - Node.js >= 18
80
+ - Homebrew (for CLIProxyAPI installation)
81
+ - Claude Code CLI (`claude`)
82
+
83
+ ## Development
84
+
85
+ ```bash
86
+ # Install dependencies
87
+ npm install
88
+
89
+ # Build
90
+ npm run build
91
+
92
+ # Run locally
93
+ node dist/cli.js --status
94
+ ```
95
+
96
+ ## License
97
+
98
+ MIT
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Install alias file (Unix/macOS only)
3
+ */
4
+ export declare function installAliases(): Promise<void>;
5
+ /**
6
+ * Check if alias file exists and is valid
7
+ */
8
+ export declare function hasAliasFile(): Promise<boolean>;
9
+ /**
10
+ * Configure shell integration
11
+ */
12
+ export declare function configureShellIntegration(): Promise<void>;
13
+ /**
14
+ * Check if shell integration is configured
15
+ */
16
+ export declare function isShellIntegrationConfigured(): Promise<boolean>;
17
+ //# sourceMappingURL=aliases.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.d.ts","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"AAsCA;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAcpD;AAED;;GAEG;AACH,wBAAsB,YAAY,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBrD;AAuCD;;GAEG;AACH,wBAAsB,yBAAyB,IAAI,OAAO,CAAC,IAAI,CAAC,CA6E/D;AAED;;GAEG;AACH,wBAAsB,4BAA4B,IAAI,OAAO,CAAC,OAAO,CAAC,CAiBrE"}
@@ -0,0 +1,175 @@
1
+ import { join } from 'path';
2
+ import { getShellRcFile, getAliasFile, ensureDir, writeFile, appendFile, readFile, fileExists, detectPlatform, isInteractive, } from './utils.js';
3
+ import { installPowerShellAliases, isPowerShellIntegrationConfigured } from './powershell.js';
4
+ // Use npx directly - no local bin installation
5
+ const CCODEX_NPX_CMD = 'npx -y ccodex';
6
+ /**
7
+ * Generate alias file content for Unix shells
8
+ */
9
+ function generateAliasContent() {
10
+ return `# ccodex aliases - generated by npx ccodex
11
+ ccodex() {
12
+ command ${CCODEX_NPX_CMD} "$@"
13
+ }
14
+
15
+ if ! typeset -f co >/dev/null 2>&1; then
16
+ co() {
17
+ command ${CCODEX_NPX_CMD} "$@"
18
+ }
19
+ fi
20
+
21
+ claude-openai() {
22
+ command ${CCODEX_NPX_CMD} "$@"
23
+ }
24
+ `;
25
+ }
26
+ /**
27
+ * Install alias file (Unix/macOS only)
28
+ */
29
+ export async function installAliases() {
30
+ const platform = detectPlatform();
31
+ // On Windows, use PowerShell aliases instead
32
+ if (platform.os === 'windows') {
33
+ await installPowerShellAliases();
34
+ return;
35
+ }
36
+ const aliasFile = getAliasFile();
37
+ await ensureDir(join(aliasFile, '..'));
38
+ await writeFile(aliasFile, generateAliasContent());
39
+ console.log(`Installed alias file: ${aliasFile}`);
40
+ }
41
+ /**
42
+ * Check if alias file exists and is valid
43
+ */
44
+ export async function hasAliasFile() {
45
+ const platform = detectPlatform();
46
+ // On Windows, check PowerShell integration
47
+ if (platform.os === 'windows') {
48
+ return await isPowerShellIntegrationConfigured();
49
+ }
50
+ const aliasFile = getAliasFile();
51
+ if (!fileExists(aliasFile)) {
52
+ return false;
53
+ }
54
+ const content = await readFile(aliasFile);
55
+ return (content.includes('ccodex()') &&
56
+ content.includes('co()') &&
57
+ content.includes('claude-openai()'));
58
+ }
59
+ /**
60
+ * Generate source line for shell rc
61
+ */
62
+ function generateSourceLine(aliasFile) {
63
+ return `[ -f "${aliasFile}" ] && source "${aliasFile}"`;
64
+ }
65
+ /**
66
+ * Add source line to shell rc file
67
+ */
68
+ async function addSourceToRc(rcFile) {
69
+ const aliasFile = getAliasFile();
70
+ // Create rc file if it doesn't exist
71
+ const fs = await import('fs/promises');
72
+ try {
73
+ await fs.writeFile(rcFile, '', { flag: 'wx' });
74
+ }
75
+ catch {
76
+ // File exists, that's fine
77
+ }
78
+ const content = await readFile(rcFile);
79
+ // Check if already sourced
80
+ if (content.includes(aliasFile)) {
81
+ console.log(`Shell integration already present: ${rcFile}`);
82
+ return;
83
+ }
84
+ const sourceLine = generateSourceLine(aliasFile);
85
+ await appendFile(rcFile, `\n\n# ccodex aliases\n${sourceLine}\n`);
86
+ console.log(`Added shell integration to: ${rcFile}`);
87
+ }
88
+ /**
89
+ * Configure shell integration
90
+ */
91
+ export async function configureShellIntegration() {
92
+ const platform = detectPlatform();
93
+ // On Windows, use PowerShell
94
+ if (platform.os === 'windows') {
95
+ console.log('\nConfiguring PowerShell integration...');
96
+ await installPowerShellAliases();
97
+ console.log('PowerShell aliases installed. Restart PowerShell to use them.');
98
+ return;
99
+ }
100
+ // Unix/macOS: use zsh/bash
101
+ // Check if already configured (non-interactive check)
102
+ const rcFile = getShellRcFile(platform);
103
+ const aliasFile = getAliasFile();
104
+ if (fileExists(rcFile)) {
105
+ const content = await readFile(rcFile);
106
+ if (content.includes(aliasFile)) {
107
+ // Already configured, skip
108
+ return;
109
+ }
110
+ }
111
+ // Not configured, proceed with setup
112
+ if (!isInteractive()) {
113
+ // Non-interactive: auto-detect
114
+ await addSourceToRc(rcFile);
115
+ return;
116
+ }
117
+ // Interactive: ask user
118
+ // Determine default based on current shell
119
+ const defaultChoice = platform.shell === 'bash' ? '2' : '1';
120
+ const defaultName = platform.shell === 'bash' ? '~/.bashrc' : '~/.zshrc';
121
+ console.log('\nChoose shell rc file for ccodex aliases:');
122
+ console.log(' 1) ~/.zshrc');
123
+ console.log(' 2) ~/.bashrc');
124
+ console.log(' 3) Both');
125
+ console.log(' 4) Skip (manual source)');
126
+ const readline = await import('readline');
127
+ const rl = readline.createInterface({
128
+ input: process.stdin,
129
+ output: process.stdout,
130
+ });
131
+ const choice = await new Promise((resolve) => {
132
+ rl.question(`Select [1-4] (default: ${defaultChoice}, detected: ${defaultName}): `, (answer) => {
133
+ rl.close();
134
+ resolve(answer || defaultChoice);
135
+ });
136
+ });
137
+ const zshrc = join(platform.home, '.zshrc');
138
+ const bashrc = join(platform.home, '.bashrc');
139
+ switch (choice) {
140
+ case '1':
141
+ await addSourceToRc(zshrc);
142
+ break;
143
+ case '2':
144
+ await addSourceToRc(bashrc);
145
+ break;
146
+ case '3':
147
+ await addSourceToRc(zshrc);
148
+ await addSourceToRc(bashrc);
149
+ break;
150
+ case '4':
151
+ console.log('Skipped rc integration.');
152
+ break;
153
+ default:
154
+ console.log('Invalid choice. Using ~/.zshrc');
155
+ await addSourceToRc(zshrc);
156
+ }
157
+ }
158
+ /**
159
+ * Check if shell integration is configured
160
+ */
161
+ export async function isShellIntegrationConfigured() {
162
+ const platform = detectPlatform();
163
+ // On Windows, check PowerShell integration
164
+ if (platform.os === 'windows') {
165
+ return await isPowerShellIntegrationConfigured();
166
+ }
167
+ const rcFile = getShellRcFile(platform);
168
+ if (!fileExists(rcFile)) {
169
+ return false;
170
+ }
171
+ const content = await readFile(rcFile);
172
+ const aliasFile = getAliasFile();
173
+ return content.includes(aliasFile);
174
+ }
175
+ //# sourceMappingURL=aliases.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aliases.js","sourceRoot":"","sources":["../src/aliases.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Detect Claude Code installation
3
+ */
4
+ export declare function detectClaudeCommand(): Promise<{
5
+ cmd: string | null;
6
+ path: string | null;
7
+ }>;
8
+ /**
9
+ * Install Claude Code via npm
10
+ */
11
+ export declare function installClaudeCode(): Promise<void>;
12
+ /**
13
+ * Run Claude Code CLI with proxy environment
14
+ */
15
+ export declare function runClaude(args: string[]): Promise<void>;
16
+ //# sourceMappingURL=claude.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.d.ts","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC,CAWhG;AAED;;GAEG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBvD;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CA6F7D"}
package/dist/claude.js ADDED
@@ -0,0 +1,133 @@
1
+ import spawnCmd from 'cross-spawn';
2
+ import { join } from 'path';
3
+ import { hasCommand, ensureDir, getUid } from './utils.js';
4
+ import { startProxy, checkAuthConfigured, launchLogin, waitForAuth } from './proxy.js';
5
+ /**
6
+ * Detect Claude Code installation
7
+ */
8
+ export async function detectClaudeCommand() {
9
+ if (await hasCommand('claude')) {
10
+ try {
11
+ const { execCommand } = await import('./utils.js');
12
+ const path = await execCommand('which', ['claude']);
13
+ return { cmd: 'claude', path };
14
+ }
15
+ catch {
16
+ return { cmd: 'claude', path: null };
17
+ }
18
+ }
19
+ return { cmd: null, path: null };
20
+ }
21
+ /**
22
+ * Install Claude Code via npm
23
+ */
24
+ export async function installClaudeCode() {
25
+ // Check if npm is available
26
+ if (!(await hasCommand('npm'))) {
27
+ throw new Error('npm not found. Install Node.js with npm first.');
28
+ }
29
+ console.log('Installing Claude Code CLI via npm...');
30
+ const spawnCmd = (await import('cross-spawn')).default;
31
+ return new Promise((resolve, reject) => {
32
+ const child = spawnCmd('npm', ['install', '-g', '@anthropic-ai/claude-code'], {
33
+ stdio: 'inherit',
34
+ });
35
+ child.on('close', (code) => {
36
+ if (code === 0) {
37
+ console.log('Claude Code CLI installed successfully');
38
+ resolve();
39
+ }
40
+ else {
41
+ reject(new Error('Failed to install Claude Code CLI'));
42
+ }
43
+ });
44
+ child.on('error', (error) => reject(error));
45
+ });
46
+ }
47
+ /**
48
+ * Run Claude Code CLI with proxy environment
49
+ */
50
+ export async function runClaude(args) {
51
+ if (!(await hasCommand('claude'))) {
52
+ throw new Error('claude CLI not found in PATH\nInstall Claude Code CLI first, then rerun ccodex.');
53
+ }
54
+ // Ensure proxy is running
55
+ await startProxy();
56
+ // Check auth, launch login if needed
57
+ const auth = await checkAuthConfigured();
58
+ if (!auth.configured) {
59
+ console.log('ChatGPT/Codex auth not configured. Starting login...');
60
+ await launchLogin();
61
+ await waitForAuth();
62
+ }
63
+ // Set up temp directory (cross-platform)
64
+ const uid = getUid();
65
+ let tmpBase;
66
+ if (process.platform === 'win32') {
67
+ tmpBase = process.env.TEMP || process.env.TMP || `C:\\Temp\\claude-${uid}`;
68
+ }
69
+ else {
70
+ tmpBase = process.env.TMPDIR || `/tmp/claude-${uid}`;
71
+ }
72
+ const tmpDir = join(tmpBase, '');
73
+ await ensureDir(tmpDir);
74
+ // Get user home directory (cross-platform)
75
+ const { homedir } = await import('os');
76
+ const userHome = homedir();
77
+ // Environment for Claude with proxy
78
+ // Start from process.env but explicitly exclude Anthropic keys
79
+ const env = {
80
+ ...process.env,
81
+ };
82
+ // Explicitly unset Anthropic keys to force use of proxy
83
+ delete env.ANTHROPIC_API_KEY;
84
+ delete env.CLAUDE_API_KEY;
85
+ // Set proxy config
86
+ env.ANTHROPIC_AUTH_TOKEN = 'sk-dummy';
87
+ env.ANTHROPIC_BASE_URL = 'http://127.0.0.1:8317';
88
+ env.API_TIMEOUT_MS = '120000';
89
+ // Model mappings to GPT-5.3 Codex
90
+ env.ANTHROPIC_DEFAULT_OPUS_MODEL = 'gpt-5.3-codex(xhigh)';
91
+ env.ANTHROPIC_MODEL = 'gpt-5.3-codex(medium)';
92
+ env.ANTHROPIC_DEFAULT_SONNET_MODEL = 'gpt-5.3-codex(high)';
93
+ env.ANTHROPIC_DEFAULT_HAIKU_MODEL = 'gpt-5.3-codex(low)';
94
+ env.CLAUDE_CODE_SUBAGENT_MODEL = 'gpt-5.3-codex(medium)';
95
+ // Other settings
96
+ env.TMPDIR = tmpDir;
97
+ // On Windows, also set TEMP and TMP for compatibility
98
+ if (process.platform === 'win32') {
99
+ env.TEMP = tmpDir;
100
+ env.TMP = tmpDir;
101
+ }
102
+ env.CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC = '1';
103
+ env.DISABLE_COST_WARNINGS = '1';
104
+ env.DISABLE_TELEMETRY = '1';
105
+ env.DISABLE_ERROR_REPORTING = '1';
106
+ env.CLAUDE_CONFIG_DIR = join(userHome, '.claude-openai');
107
+ // Spawn Claude with modified environment
108
+ const child = spawnCmd('claude', args, {
109
+ stdio: 'inherit',
110
+ env,
111
+ });
112
+ return new Promise((resolve, reject) => {
113
+ child.on('close', (code, signal) => {
114
+ // Exit code 0 means success
115
+ // SIGINT (Ctrl+C) or SIGTERM are user-initiated, treat as success
116
+ if (code === 0 || signal === 'SIGINT' || signal === 'SIGTERM') {
117
+ resolve();
118
+ }
119
+ else if (code === 130) {
120
+ // Exit code 130 is also typically from SIGINT (128 + 2)
121
+ resolve();
122
+ }
123
+ else {
124
+ // Non-zero exit with no signal indicates an error
125
+ reject(new Error(`Claude CLI exited with code ${code}`));
126
+ }
127
+ });
128
+ child.on('error', (error) => {
129
+ reject(error);
130
+ });
131
+ });
132
+ }
133
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../src/claude.ts"],"names":[],"mappings":"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"}
package/dist/cli.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":""}
package/dist/cli.js ADDED
@@ -0,0 +1,109 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import chalk from 'chalk';
4
+ import { detectProxyCommand, installProxyApi, startProxy, launchLogin, waitForAuth, checkAuthConfigured } from './proxy.js';
5
+ import { installAliases, configureShellIntegration } from './aliases.js';
6
+ import { printStatus, readyCheck } from './status.js';
7
+ import { runClaude, detectClaudeCommand, installClaudeCode } from './claude.js';
8
+ /**
9
+ * Ensure everything is set up (idempotent)
10
+ * Implements steps 1-6 of the ccodex workflow:
11
+ * 1. Check/install Claude Code CLI
12
+ * 2. Check/install CLIProxyAPI
13
+ * 3. Install aliases (claude-openai, ccodex)
14
+ * 4. Configure shell integration
15
+ * 5. Start proxy
16
+ * 6. Launch OAuth login if needed
17
+ *
18
+ * Step 7 (Run Claude Code) is handled by main() after setup completes.
19
+ */
20
+ async function ensureSetup() {
21
+ let needsSetup = false;
22
+ // 1. Check/install Claude Code CLI
23
+ const claudeCmd = await detectClaudeCommand();
24
+ if (!claudeCmd.cmd) {
25
+ console.log(chalk.yellow('Claude Code CLI not found. Installing...'));
26
+ await installClaudeCode();
27
+ needsSetup = true;
28
+ }
29
+ // 2. Check/install CLIProxyAPI
30
+ const proxyCmd = await detectProxyCommand();
31
+ if (!proxyCmd.cmd) {
32
+ await installProxyApi();
33
+ needsSetup = true;
34
+ }
35
+ // 3. Install aliases (claude-openai, ccodex)
36
+ await installAliases();
37
+ // 4. Configure shell integration
38
+ await configureShellIntegration();
39
+ // 5. Start proxy
40
+ await startProxy();
41
+ // 6. Check auth, launch login if needed
42
+ const auth = await checkAuthConfigured();
43
+ if (!auth.configured) {
44
+ console.log(chalk.yellow('ChatGPT/Codex auth not configured. Starting login...'));
45
+ await launchLogin();
46
+ await waitForAuth();
47
+ needsSetup = true;
48
+ }
49
+ if (needsSetup) {
50
+ console.log('');
51
+ await readyCheck();
52
+ console.log('');
53
+ }
54
+ }
55
+ async function main() {
56
+ const program = new Command();
57
+ program
58
+ .name('ccodex')
59
+ .description('TypeScript reimplementation of ccodex - run Claude Code with OpenAI GPT models')
60
+ .version('0.1.0')
61
+ .option('--login', 'Run ChatGPT/Codex OAuth login')
62
+ .option('--status', 'Show setup status')
63
+ .allowUnknownOption(true)
64
+ .allowExcessArguments(true)
65
+ .parse(process.argv);
66
+ const options = program.opts();
67
+ // Handle --login
68
+ if (options.login) {
69
+ // Ensure setup (installs dependencies, starts proxy)
70
+ // Skip the auth part of ensureSetup by checking first
71
+ const claudeCmd = await detectClaudeCommand();
72
+ if (!claudeCmd.cmd) {
73
+ console.log(chalk.yellow('Claude Code CLI not found. Installing...'));
74
+ await installClaudeCode();
75
+ }
76
+ const proxyCmd = await detectProxyCommand();
77
+ if (!proxyCmd.cmd) {
78
+ await installProxyApi();
79
+ }
80
+ await installAliases();
81
+ await configureShellIntegration();
82
+ await startProxy();
83
+ // Always launch login flow for --login, even if already authenticated
84
+ // This allows users to switch accounts or refresh their session
85
+ await launchLogin();
86
+ return;
87
+ }
88
+ // Handle --status (read-only, no side effects)
89
+ if (options.status) {
90
+ await printStatus();
91
+ return;
92
+ }
93
+ // Default: ensure setup and run Claude Code
94
+ await ensureSetup();
95
+ // Get remaining args for Claude Code
96
+ const args = program.args;
97
+ await runClaude(args);
98
+ }
99
+ main().catch((error) => {
100
+ // Normalize error to Error instance
101
+ const err = error instanceof Error ? error : new Error(String(error));
102
+ console.error(chalk.red('Error:'), err.message);
103
+ // Print stack trace in debug mode
104
+ if (process.env.DEBUG || process.env.CCODEX_DEBUG) {
105
+ console.error(chalk.gray(err.stack));
106
+ }
107
+ process.exit(1);
108
+ });
109
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +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,cAAc,EAAE,yBAAyB,EAAE,MAAM,cAAc,CAAC;AACzE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhF;;;;;;;;;;;GAWG;AACH,KAAK,UAAU,WAAW;IACxB,IAAI,UAAU,GAAG,KAAK,CAAC;IAEvB,mCAAmC;IACnC,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;IAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;QACtE,MAAM,iBAAiB,EAAE,CAAC;QAC1B,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAClB,MAAM,eAAe,EAAE,CAAC;QACxB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,6CAA6C;IAC7C,MAAM,cAAc,EAAE,CAAC;IAEvB,iCAAiC;IACjC,MAAM,yBAAyB,EAAE,CAAC;IAElC,iBAAiB;IACjB,MAAM,UAAU,EAAE,CAAC;IAEnB,wCAAwC;IACxC,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,sDAAsD,CAAC,CAAC,CAAC;QAClF,MAAM,WAAW,EAAE,CAAC;QACpB,MAAM,WAAW,EAAE,CAAC;QACpB,UAAU,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,MAAM,UAAU,EAAE,CAAC;QACnB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,IAAI;IACjB,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;IAE9B,OAAO;SACJ,IAAI,CAAC,QAAQ,CAAC;SACd,WAAW,CAAC,gFAAgF,CAAC;SAC7F,OAAO,CAAC,OAAO,CAAC;SAChB,MAAM,CAAC,SAAS,EAAE,+BAA+B,CAAC;SAClD,MAAM,CAAC,UAAU,EAAE,mBAAmB,CAAC;SACvC,kBAAkB,CAAC,IAAI,CAAC;SACxB,oBAAoB,CAAC,IAAI,CAAC;SAC1B,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAEvB,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAE/B,iBAAiB;IACjB,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAClB,qDAAqD;QACrD,sDAAsD;QACtD,MAAM,SAAS,GAAG,MAAM,mBAAmB,EAAE,CAAC;QAC9C,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC;YACnB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,CAAC,0CAA0C,CAAC,CAAC,CAAC;YACtE,MAAM,iBAAiB,EAAE,CAAC;QAC5B,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;QAC5C,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,eAAe,EAAE,CAAC;QAC1B,CAAC;QAED,MAAM,cAAc,EAAE,CAAC;QACvB,MAAM,yBAAyB,EAAE,CAAC;QAClC,MAAM,UAAU,EAAE,CAAC;QAEnB,sEAAsE;QACtE,gEAAgE;QAChE,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,+CAA+C;IAC/C,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,WAAW,EAAE,CAAC;QACpB,OAAO;IACT,CAAC;IAED,4CAA4C;IAC5C,MAAM,WAAW,EAAE,CAAC;IAEpB,qCAAqC;IACrC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAC1B,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;AACxB,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IACrB,oCAAoC;IACpC,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAEtE,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IAEhD,kCAAkC;IAClC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,CAAC;QAClD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC;IACvC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * Runtime configuration constants
3
+ */
4
+ export declare const CONFIG: {
5
+ readonly PROXY_HOST: "127.0.0.1";
6
+ readonly PROXY_PORT: 8317;
7
+ readonly PROXY_STARTUP_MAX_RETRIES: 10;
8
+ readonly PROXY_STARTUP_RETRY_DELAY_MS: 1000;
9
+ readonly AUTH_WAIT_MAX_RETRIES: 30;
10
+ readonly AUTH_WAIT_RETRY_DELAY_MS: 1000;
11
+ readonly AUTH_DIR_NAME: ".cli-proxy-api";
12
+ readonly CACHE_DIR_NAME: ".cache";
13
+ readonly LOG_FILE_NAME: "ccodex-cliproxy.log";
14
+ readonly ALIAS_FILE_NAME: "ccodex-alias.zsh";
15
+ readonly ALIAS_DIR: ".oh-my-zsh/custom";
16
+ readonly LOCAL_BIN_DIR: ".local/bin";
17
+ readonly CLAUDE_CONFIG_DIR: ".claude-openai";
18
+ readonly API_TIMEOUT_MS: 120000;
19
+ };
20
+ /**
21
+ * Get proxy URL
22
+ */
23
+ export declare function getProxyUrl(): string;
24
+ /**
25
+ * Get auth directory path
26
+ */
27
+ export declare function getAuthDir(): string;
28
+ /**
29
+ * Get log file path
30
+ */
31
+ export declare function getLogFilePath(): string;
32
+ /**
33
+ * Get alias file path
34
+ */
35
+ export declare function getAliasFilePath(): string;
36
+ /**
37
+ * Get local bin path
38
+ */
39
+ export declare function getLocalBinPath(): string;
40
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;CAoBT,CAAC;AAEX;;GAEG;AACH,wBAAgB,WAAW,IAAI,MAAM,CAEpC;AAED;;GAEG;AACH,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,MAAM,CAEzC;AAED;;GAEG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC"}