@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 +21 -0
- package/README.md +98 -0
- package/dist/aliases.d.ts +17 -0
- package/dist/aliases.d.ts.map +1 -0
- package/dist/aliases.js +175 -0
- package/dist/aliases.js.map +1 -0
- package/dist/claude.d.ts +16 -0
- package/dist/claude.d.ts.map +1 -0
- package/dist/claude.js +133 -0
- package/dist/claude.js.map +1 -0
- package/dist/cli.d.ts +3 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +109 -0
- package/dist/cli.js.map +1 -0
- package/dist/config.d.ts +40 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +55 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -0
- package/dist/powershell.d.ts +21 -0
- package/dist/powershell.d.ts.map +1 -0
- package/dist/powershell.js +106 -0
- package/dist/powershell.js.map +1 -0
- package/dist/proxy.d.ts +30 -0
- package/dist/proxy.d.ts.map +1 -0
- package/dist/proxy.js +231 -0
- package/dist/proxy.js.map +1 -0
- package/dist/status.d.ts +14 -0
- package/dist/status.d.ts.map +1 -0
- package/dist/status.js +73 -0
- package/dist/status.js.map +1 -0
- package/dist/types.d.ts +52 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +83 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +278 -0
- package/dist/utils.js.map +1 -0
- package/package.json +44 -0
package/dist/config.js
ADDED
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime configuration constants
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
export const CONFIG = {
|
|
7
|
+
// Proxy configuration
|
|
8
|
+
PROXY_HOST: '127.0.0.1',
|
|
9
|
+
PROXY_PORT: 8317,
|
|
10
|
+
PROXY_STARTUP_MAX_RETRIES: 10,
|
|
11
|
+
PROXY_STARTUP_RETRY_DELAY_MS: 1000,
|
|
12
|
+
AUTH_WAIT_MAX_RETRIES: 30,
|
|
13
|
+
AUTH_WAIT_RETRY_DELAY_MS: 1000,
|
|
14
|
+
// Paths
|
|
15
|
+
AUTH_DIR_NAME: '.cli-proxy-api',
|
|
16
|
+
CACHE_DIR_NAME: '.cache',
|
|
17
|
+
LOG_FILE_NAME: 'ccodex-cliproxy.log',
|
|
18
|
+
ALIAS_FILE_NAME: 'ccodex-alias.zsh',
|
|
19
|
+
ALIAS_DIR: '.oh-my-zsh/custom',
|
|
20
|
+
LOCAL_BIN_DIR: '.local/bin',
|
|
21
|
+
CLAUDE_CONFIG_DIR: '.claude-openai',
|
|
22
|
+
// Timeouts (in milliseconds)
|
|
23
|
+
API_TIMEOUT_MS: 120000,
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* Get proxy URL
|
|
27
|
+
*/
|
|
28
|
+
export function getProxyUrl() {
|
|
29
|
+
return `http://${CONFIG.PROXY_HOST}:${CONFIG.PROXY_PORT}`;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Get auth directory path
|
|
33
|
+
*/
|
|
34
|
+
export function getAuthDir() {
|
|
35
|
+
return join(homedir(), CONFIG.AUTH_DIR_NAME);
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Get log file path
|
|
39
|
+
*/
|
|
40
|
+
export function getLogFilePath() {
|
|
41
|
+
return join(homedir(), CONFIG.CACHE_DIR_NAME, CONFIG.LOG_FILE_NAME);
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Get alias file path
|
|
45
|
+
*/
|
|
46
|
+
export function getAliasFilePath() {
|
|
47
|
+
return join(homedir(), CONFIG.ALIAS_DIR, CONFIG.ALIAS_FILE_NAME);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Get local bin path
|
|
51
|
+
*/
|
|
52
|
+
export function getLocalBinPath() {
|
|
53
|
+
return join(homedir(), CONFIG.LOCAL_BIN_DIR);
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=config.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAE7B,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,sBAAsB;IACtB,UAAU,EAAE,WAAW;IACvB,UAAU,EAAE,IAAI;IAChB,yBAAyB,EAAE,EAAE;IAC7B,4BAA4B,EAAE,IAAI;IAClC,qBAAqB,EAAE,EAAE;IACzB,wBAAwB,EAAE,IAAI;IAE9B,QAAQ;IACR,aAAa,EAAE,gBAAgB;IAC/B,cAAc,EAAE,QAAQ;IACxB,aAAa,EAAE,qBAAqB;IACpC,eAAe,EAAE,kBAAkB;IACnC,SAAS,EAAE,mBAAmB;IAC9B,aAAa,EAAE,YAAY;IAC3B,iBAAiB,EAAE,gBAAgB;IAEnC,6BAA6B;IAC7B,cAAc,EAAE,MAAM;CACd,CAAC;AAEX;;GAEG;AACH,MAAM,UAAU,WAAW;IACzB,OAAO,UAAU,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;AAC5D,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,UAAU;IACxB,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc;IAC5B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,cAAc,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AACtE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,eAAe,CAAC,CAAC;AACnE,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe;IAC7B,OAAO,IAAI,CAAC,OAAO,EAAE,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;AAC/C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claudex - TypeScript reimplementation of ccodex
|
|
3
|
+
*
|
|
4
|
+
* Drop-in replacement for ccodex that runs Claude Code CLI with
|
|
5
|
+
* OpenAI GPT models via CLIProxyAPI.
|
|
6
|
+
*/
|
|
7
|
+
export { runClaude } from './claude.js';
|
|
8
|
+
export { detectProxyCommand, isProxyRunning, checkAuthConfigured, installProxyApi, startProxy, launchLogin, waitForAuth } from './proxy.js';
|
|
9
|
+
export { installAliases, configureShellIntegration, hasAliasFile, isShellIntegrationConfigured } from './aliases.js';
|
|
10
|
+
export { printStatus, readyCheck, getStatus } from './status.js';
|
|
11
|
+
export type { Platform, ProxyCommand, AuthStatus, StatusResult, CliOptions, ShellConfig } from './types.js';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAGjE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claudex - TypeScript reimplementation of ccodex
|
|
3
|
+
*
|
|
4
|
+
* Drop-in replacement for ccodex that runs Claude Code CLI with
|
|
5
|
+
* OpenAI GPT models via CLIProxyAPI.
|
|
6
|
+
*/
|
|
7
|
+
// Re-export main functions
|
|
8
|
+
export { runClaude } from './claude.js';
|
|
9
|
+
export { detectProxyCommand, isProxyRunning, checkAuthConfigured, installProxyApi, startProxy, launchLogin, waitForAuth } from './proxy.js';
|
|
10
|
+
export { installAliases, configureShellIntegration, hasAliasFile, isShellIntegrationConfigured } from './aliases.js';
|
|
11
|
+
export { printStatus, readyCheck, getStatus } from './status.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,2BAA2B;AAC3B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,eAAe,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,yBAAyB,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AACrH,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PowerShell-specific utilities for Windows support
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Get PowerShell profile path
|
|
6
|
+
* Prefers PowerShell 7 (pwsh) profile, falls back to WindowsPowerShell
|
|
7
|
+
*/
|
|
8
|
+
export declare function getPowerShellProfilePath(): string | null;
|
|
9
|
+
/**
|
|
10
|
+
* Generate PowerShell alias content
|
|
11
|
+
*/
|
|
12
|
+
export declare function generatePowerShellAlias(): Promise<string>;
|
|
13
|
+
/**
|
|
14
|
+
* Install PowerShell aliases
|
|
15
|
+
*/
|
|
16
|
+
export declare function installPowerShellAliases(): Promise<boolean>;
|
|
17
|
+
/**
|
|
18
|
+
* Check if PowerShell integration is configured
|
|
19
|
+
*/
|
|
20
|
+
export declare function isPowerShellIntegrationConfigured(): Promise<boolean>;
|
|
21
|
+
//# sourceMappingURL=powershell.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powershell.d.ts","sourceRoot":"","sources":["../src/powershell.ts"],"names":[],"mappings":"AAAA;;GAEG;AASH;;;GAGG;AACH,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,IAAI,CA4BxD;AAED;;GAEG;AACH,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAc/D;AAED;;GAEG;AACH,wBAAsB,wBAAwB,IAAI,OAAO,CAAC,OAAO,CAAC,CA6BjE;AAUD;;GAEG;AACH,wBAAsB,iCAAiC,IAAI,OAAO,CAAC,OAAO,CAAC,CAY1E"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PowerShell-specific utilities for Windows support
|
|
3
|
+
*/
|
|
4
|
+
import { join } from 'path';
|
|
5
|
+
import { homedir } from 'os';
|
|
6
|
+
import { fileExists, ensureDir, appendFile, debugLog } from './utils.js';
|
|
7
|
+
// Use npx directly - no local bin installation
|
|
8
|
+
const CCODEX_NPX_CMD = 'npx -y ccodex';
|
|
9
|
+
/**
|
|
10
|
+
* Get PowerShell profile path
|
|
11
|
+
* Prefers PowerShell 7 (pwsh) profile, falls back to WindowsPowerShell
|
|
12
|
+
*/
|
|
13
|
+
export function getPowerShellProfilePath() {
|
|
14
|
+
const home = homedir();
|
|
15
|
+
// Try different PowerShell profile locations
|
|
16
|
+
// Prefer PowerShell 7 profile, fall back to WindowsPowerShell
|
|
17
|
+
const candidates = [
|
|
18
|
+
join(home, 'Documents', 'PowerShell', 'Microsoft.PowerShell_profile.ps1'), // PowerShell 7 (pwsh)
|
|
19
|
+
join(home, 'Documents', 'WindowsPowerShell', 'Microsoft.PowerShell_profile.ps1'), // WindowsPowerShell 5.x
|
|
20
|
+
];
|
|
21
|
+
// If a profile file exists, use it
|
|
22
|
+
for (const candidate of candidates) {
|
|
23
|
+
if (fileExists(candidate)) {
|
|
24
|
+
return candidate;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// If using pwsh (PowerShell 7), default to its profile location
|
|
28
|
+
// Check for pwsh by looking for the executable or PSModulePath pattern
|
|
29
|
+
const isPwsh = process.env.PSModulePath?.includes('PowerShell') &&
|
|
30
|
+
!process.env.PSModulePath?.includes('WindowsPowerShell');
|
|
31
|
+
if (isPwsh) {
|
|
32
|
+
return candidates[0]; // PowerShell 7 profile
|
|
33
|
+
}
|
|
34
|
+
// Default to WindowsPowerShell path
|
|
35
|
+
return candidates[1];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Generate PowerShell alias content
|
|
39
|
+
*/
|
|
40
|
+
export async function generatePowerShellAlias() {
|
|
41
|
+
return `# ccodex aliases - generated by npx ccodex
|
|
42
|
+
function ccodex {
|
|
43
|
+
npx -y ccodex $args
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function co {
|
|
47
|
+
npx -y ccodex $args
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function claude-openai {
|
|
51
|
+
npx -y ccodex $args
|
|
52
|
+
}
|
|
53
|
+
`;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Install PowerShell aliases
|
|
57
|
+
*/
|
|
58
|
+
export async function installPowerShellAliases() {
|
|
59
|
+
const profilePath = getPowerShellProfilePath();
|
|
60
|
+
if (!profilePath) {
|
|
61
|
+
debugLog('Could not determine PowerShell profile path');
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
// Ensure profile directory exists
|
|
65
|
+
await ensureDir(join(profilePath, '..'));
|
|
66
|
+
// Check if already configured with our aliases
|
|
67
|
+
if (fileExists(profilePath)) {
|
|
68
|
+
const content = await readFile(profilePath);
|
|
69
|
+
// Check for all three expected functions to be present
|
|
70
|
+
const hasCcodex = /\bccodex\s*\{[\s\S]*?npx -y ccodex/.test(content);
|
|
71
|
+
const hasCo = /\bco\s*\{[\s\S]*?npx -y ccodex/.test(content);
|
|
72
|
+
const hasClaudeOpenai = /\bclaude-openai\s*\{[\s\S]*?npx -y ccodex/.test(content);
|
|
73
|
+
if (hasCcodex && hasCo && hasClaudeOpenai) {
|
|
74
|
+
console.log('PowerShell aliases already installed');
|
|
75
|
+
return true;
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
// Append aliases to profile
|
|
79
|
+
const aliasContent = await generatePowerShellAlias();
|
|
80
|
+
await appendFile(profilePath, aliasContent);
|
|
81
|
+
console.log(`Installed PowerShell aliases: ${profilePath}`);
|
|
82
|
+
return true;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Read file content (internal helper)
|
|
86
|
+
*/
|
|
87
|
+
async function readFile(path) {
|
|
88
|
+
const fs = await import('fs/promises');
|
|
89
|
+
return await fs.readFile(path, 'utf-8');
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Check if PowerShell integration is configured
|
|
93
|
+
*/
|
|
94
|
+
export async function isPowerShellIntegrationConfigured() {
|
|
95
|
+
const profilePath = getPowerShellProfilePath();
|
|
96
|
+
if (!profilePath || !fileExists(profilePath)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
const content = await readFile(profilePath);
|
|
100
|
+
// Check for all three expected functions with proper syntax
|
|
101
|
+
const hasCcodex = /\bccodex\s*\{[\s\S]*?npx -y ccodex/.test(content);
|
|
102
|
+
const hasCo = /\bco\s*\{[\s\S]*?npx -y ccodex/.test(content);
|
|
103
|
+
const hasClaudeOpenai = /\bclaude-openai\s*\{[\s\S]*?npx -y ccodex/.test(content);
|
|
104
|
+
return hasCcodex && hasCo && hasClaudeOpenai;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=powershell.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"powershell.js","sourceRoot":"","sources":["../src/powershell.ts"],"names":[],"mappings":"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"}
|
package/dist/proxy.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { ProxyCommand, AuthStatus } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Detect CLIProxyAPI command
|
|
4
|
+
*/
|
|
5
|
+
export declare function detectProxyCommand(): Promise<ProxyCommand>;
|
|
6
|
+
/**
|
|
7
|
+
* Check if proxy is running
|
|
8
|
+
*/
|
|
9
|
+
export declare function isProxyRunning(): Promise<boolean>;
|
|
10
|
+
/**
|
|
11
|
+
* Check auth configuration
|
|
12
|
+
*/
|
|
13
|
+
export declare function checkAuthConfigured(): Promise<AuthStatus>;
|
|
14
|
+
/**
|
|
15
|
+
* Install CLIProxyAPI via Homebrew (macOS/Linux only)
|
|
16
|
+
*/
|
|
17
|
+
export declare function installProxyApi(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Start proxy in background
|
|
20
|
+
*/
|
|
21
|
+
export declare function startProxy(): Promise<void>;
|
|
22
|
+
/**
|
|
23
|
+
* Launch OAuth login
|
|
24
|
+
*/
|
|
25
|
+
export declare function launchLogin(): Promise<void>;
|
|
26
|
+
/**
|
|
27
|
+
* Wait for auth to be configured after login
|
|
28
|
+
*/
|
|
29
|
+
export declare function waitForAuth(): Promise<void>;
|
|
30
|
+
//# sourceMappingURL=proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAE3D;;GAEG;AACH,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,YAAY,CAAC,CAmBhE;AAED;;GAEG;AACH,wBAAsB,cAAc,IAAI,OAAO,CAAC,OAAO,CAAC,CAQvD;AAED;;GAEG;AACH,wBAAsB,mBAAmB,IAAI,OAAO,CAAC,UAAU,CAAC,CAqD/D;AAED;;GAEG;AACH,wBAAsB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC,CAsCrD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAgEhD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBjD;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAajD"}
|
package/dist/proxy.js
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { join } from 'path';
|
|
2
|
+
import { hasCommand, execCommand, httpGet, sleep, ensureDir, safeJsonParse, debugLog } from './utils.js';
|
|
3
|
+
import { CONFIG, getProxyUrl, getAuthDir, getLogFilePath } from './config.js';
|
|
4
|
+
/**
|
|
5
|
+
* Detect CLIProxyAPI command
|
|
6
|
+
*/
|
|
7
|
+
export async function detectProxyCommand() {
|
|
8
|
+
if (await hasCommand('cliproxyapi')) {
|
|
9
|
+
try {
|
|
10
|
+
const path = await execCommand('which', ['cliproxyapi']);
|
|
11
|
+
return { cmd: 'cliproxyapi', path };
|
|
12
|
+
}
|
|
13
|
+
catch {
|
|
14
|
+
// which might fail, continue anyway
|
|
15
|
+
return { cmd: 'cliproxyapi', path: null };
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
if (await hasCommand('cliproxy')) {
|
|
19
|
+
try {
|
|
20
|
+
const path = await execCommand('which', ['cliproxy']);
|
|
21
|
+
return { cmd: 'cliproxy', path };
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return { cmd: 'cliproxy', path: null };
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
return { cmd: null, path: null };
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Check if proxy is running
|
|
31
|
+
*/
|
|
32
|
+
export async function isProxyRunning() {
|
|
33
|
+
try {
|
|
34
|
+
const proxyUrl = getProxyUrl();
|
|
35
|
+
const { status } = await httpGet(`${proxyUrl}/v1/models`);
|
|
36
|
+
return status === 200 || status === 401;
|
|
37
|
+
}
|
|
38
|
+
catch {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Check auth configuration
|
|
44
|
+
*/
|
|
45
|
+
export async function checkAuthConfigured() {
|
|
46
|
+
const authDir = getAuthDir();
|
|
47
|
+
// Check for auth files
|
|
48
|
+
const fs = await import('fs/promises');
|
|
49
|
+
let hasAuthFiles = false;
|
|
50
|
+
try {
|
|
51
|
+
const files = await fs.readdir(authDir);
|
|
52
|
+
hasAuthFiles = files.some(f => f.startsWith('codex-') && f.endsWith('.json'));
|
|
53
|
+
}
|
|
54
|
+
catch {
|
|
55
|
+
// Directory doesn't exist
|
|
56
|
+
debugLog('Auth directory does not exist:', authDir);
|
|
57
|
+
}
|
|
58
|
+
// Check auth via proxy status
|
|
59
|
+
let hasAuthEntries = false;
|
|
60
|
+
const cmdResult = await detectProxyCommand();
|
|
61
|
+
if (cmdResult.cmd) {
|
|
62
|
+
try {
|
|
63
|
+
const output = await execCommand(cmdResult.cmd, ['status']);
|
|
64
|
+
// Match "N auth entries" or "N auth files" where N > 0
|
|
65
|
+
const match = output.match(/(\d+)\s+(auth entries|auth files)/);
|
|
66
|
+
if (match) {
|
|
67
|
+
const count = parseInt(match[1], 10);
|
|
68
|
+
hasAuthEntries = count > 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
debugLog('Failed to check proxy status:', error);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
// Check via API
|
|
76
|
+
let hasModels = false;
|
|
77
|
+
try {
|
|
78
|
+
const proxyUrl = getProxyUrl();
|
|
79
|
+
const response = await httpGet(`${proxyUrl}/v1/models`);
|
|
80
|
+
if (response.status === 200) {
|
|
81
|
+
const data = safeJsonParse(response.body);
|
|
82
|
+
hasModels = data?.object === 'list' && Array.isArray(data.data) && data.data.length > 0;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch {
|
|
86
|
+
// Proxy not running or not authenticated
|
|
87
|
+
debugLog('Failed to check models via API');
|
|
88
|
+
}
|
|
89
|
+
return {
|
|
90
|
+
hasAuthFiles,
|
|
91
|
+
hasAuthEntries,
|
|
92
|
+
hasModels,
|
|
93
|
+
// Prioritize live API checks over cached files
|
|
94
|
+
// Only consider configured if we can actually list models OR have confirmed auth entries
|
|
95
|
+
configured: hasModels || (hasAuthEntries && hasAuthFiles),
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Install CLIProxyAPI via Homebrew (macOS/Linux only)
|
|
100
|
+
*/
|
|
101
|
+
export async function installProxyApi() {
|
|
102
|
+
// Check platform
|
|
103
|
+
const platform = process.platform;
|
|
104
|
+
if (platform === 'win32') {
|
|
105
|
+
throw new Error('CLIProxyAPI installation on Windows requires manual setup.\n' +
|
|
106
|
+
'Please install CLIProxyAPI manually and ensure it\'s in your PATH.\n' +
|
|
107
|
+
'See CLIProxyAPI documentation for Windows installation instructions.');
|
|
108
|
+
}
|
|
109
|
+
if (!(await hasCommand('brew'))) {
|
|
110
|
+
throw new Error('Homebrew not found. CLIProxyAPI requires Homebrew for installation on macOS/Linux.\n' +
|
|
111
|
+
'Install Homebrew from https://brew.sh/ or install CLIProxyAPI manually.');
|
|
112
|
+
}
|
|
113
|
+
console.log('Installing CLIProxyAPI via Homebrew...');
|
|
114
|
+
const spawnCmd = (await import('cross-spawn')).default;
|
|
115
|
+
return new Promise((resolve, reject) => {
|
|
116
|
+
const child = spawnCmd('brew', ['install', 'cliproxyapi'], {
|
|
117
|
+
stdio: 'inherit',
|
|
118
|
+
});
|
|
119
|
+
child.on('close', (code) => {
|
|
120
|
+
if (code === 0) {
|
|
121
|
+
console.log('CLIProxyAPI installed successfully');
|
|
122
|
+
resolve();
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
reject(new Error('Failed to install CLIProxyAPI via Homebrew'));
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
child.on('error', (error) => reject(error));
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Start proxy in background
|
|
133
|
+
*/
|
|
134
|
+
export async function startProxy() {
|
|
135
|
+
if (await isProxyRunning()) {
|
|
136
|
+
return;
|
|
137
|
+
}
|
|
138
|
+
const cmdResult = await detectProxyCommand();
|
|
139
|
+
const proxyCmd = cmdResult.cmd;
|
|
140
|
+
if (!proxyCmd) {
|
|
141
|
+
throw new Error('CLIProxyAPI not found. Run: npx -y ccodex');
|
|
142
|
+
}
|
|
143
|
+
console.log('Starting CLIProxyAPI in background...');
|
|
144
|
+
const logFile = getLogFilePath();
|
|
145
|
+
await ensureDir(join(logFile, '..'));
|
|
146
|
+
const { spawn } = await import('child_process');
|
|
147
|
+
const fs = await import('fs/promises');
|
|
148
|
+
let out = null;
|
|
149
|
+
try {
|
|
150
|
+
// Create log with restrictive permissions (user read/write only)
|
|
151
|
+
out = await fs.open(logFile, 'a');
|
|
152
|
+
// Set restrictive permissions on Unix/macOS (0600 = user read/write only)
|
|
153
|
+
if (process.platform !== 'win32') {
|
|
154
|
+
try {
|
|
155
|
+
await fs.chmod(logFile, 0o600);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
// If chmod fails, continue anyway - the file was created successfully
|
|
159
|
+
debugLog('Warning: Could not set restrictive permissions on log file');
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
const child = spawn(proxyCmd, [], {
|
|
163
|
+
detached: true,
|
|
164
|
+
stdio: ['ignore', out.fd, out.fd],
|
|
165
|
+
});
|
|
166
|
+
// Handle spawn errors immediately (fail-fast)
|
|
167
|
+
await new Promise((resolve, reject) => {
|
|
168
|
+
child.once('error', (error) => {
|
|
169
|
+
reject(new Error(`Failed to start CLIProxyAPI: ${error.message}`));
|
|
170
|
+
});
|
|
171
|
+
child.once('spawn', () => resolve());
|
|
172
|
+
});
|
|
173
|
+
child.unref();
|
|
174
|
+
// Wait for proxy to be ready
|
|
175
|
+
for (let i = 0; i < CONFIG.PROXY_STARTUP_MAX_RETRIES; i++) {
|
|
176
|
+
await sleep(CONFIG.PROXY_STARTUP_RETRY_DELAY_MS);
|
|
177
|
+
if (await isProxyRunning()) {
|
|
178
|
+
console.log('CLIProxyAPI is running.');
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
throw new Error(`CLIProxyAPI did not become ready. Check logs: ${logFile}`);
|
|
183
|
+
}
|
|
184
|
+
finally {
|
|
185
|
+
if (out) {
|
|
186
|
+
await out.close();
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Launch OAuth login
|
|
192
|
+
*/
|
|
193
|
+
export async function launchLogin() {
|
|
194
|
+
const cmdResult = await detectProxyCommand();
|
|
195
|
+
const proxyCmd = cmdResult.cmd;
|
|
196
|
+
if (!proxyCmd) {
|
|
197
|
+
throw new Error('CLIProxyAPI not found. Run: npx -y ccodex');
|
|
198
|
+
}
|
|
199
|
+
console.log('Launching ChatGPT/Codex OAuth login in browser...');
|
|
200
|
+
const spawnCmd = (await import('cross-spawn')).default;
|
|
201
|
+
return new Promise((resolve, reject) => {
|
|
202
|
+
const child = spawnCmd(proxyCmd, ['-codex-login'], {
|
|
203
|
+
stdio: 'inherit',
|
|
204
|
+
});
|
|
205
|
+
child.on('close', (code) => {
|
|
206
|
+
if (code === 0) {
|
|
207
|
+
resolve();
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
reject(new Error('Login failed'));
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
child.on('error', (error) => reject(error));
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* Wait for auth to be configured after login
|
|
218
|
+
*/
|
|
219
|
+
export async function waitForAuth() {
|
|
220
|
+
console.log('Waiting for authentication...');
|
|
221
|
+
for (let i = 0; i < CONFIG.AUTH_WAIT_MAX_RETRIES; i++) {
|
|
222
|
+
await sleep(CONFIG.AUTH_WAIT_RETRY_DELAY_MS);
|
|
223
|
+
const auth = await checkAuthConfigured();
|
|
224
|
+
if (auth.configured) {
|
|
225
|
+
console.log('Authentication configured.');
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
throw new Error('Authentication still not configured after login.');
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"proxy.js","sourceRoot":"","sources":["../src/proxy.ts"],"names":[],"mappings":"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"}
|
package/dist/status.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { StatusResult } from './types.js';
|
|
2
|
+
/**
|
|
3
|
+
* Print full status
|
|
4
|
+
*/
|
|
5
|
+
export declare function printStatus(): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* Get status result
|
|
8
|
+
*/
|
|
9
|
+
export declare function getStatus(): Promise<StatusResult>;
|
|
10
|
+
/**
|
|
11
|
+
* Ready check with exit code
|
|
12
|
+
*/
|
|
13
|
+
export declare function readyCheck(): Promise<boolean>;
|
|
14
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAa/C;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAYjD;AAED;;GAEG;AACH,wBAAsB,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAuBvD;AAED;;GAEG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC,CAmBnD"}
|
package/dist/status.js
ADDED
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { hasCommand } from './utils.js';
|
|
3
|
+
import { detectProxyCommand, isProxyRunning, checkAuthConfigured } from './proxy.js';
|
|
4
|
+
import { hasAliasFile, isShellIntegrationConfigured } from './aliases.js';
|
|
5
|
+
/**
|
|
6
|
+
* Print status line
|
|
7
|
+
*/
|
|
8
|
+
function statusLine(label, ok) {
|
|
9
|
+
if (ok) {
|
|
10
|
+
console.log(chalk.green(' [OK]') + ' ' + label);
|
|
11
|
+
}
|
|
12
|
+
else {
|
|
13
|
+
console.log(chalk.red(' [MISSING]') + ' ' + label);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Print full status
|
|
18
|
+
*/
|
|
19
|
+
export async function printStatus() {
|
|
20
|
+
console.log('');
|
|
21
|
+
console.log(chalk.bold('ccodex status'));
|
|
22
|
+
const result = await getStatus();
|
|
23
|
+
statusLine('CLIProxyAPI command available', result.proxyCommand);
|
|
24
|
+
statusLine('CLIProxyAPI running on 127.0.0.1:8317', result.proxyRunning);
|
|
25
|
+
statusLine('ChatGPT/Codex auth configured', result.authConfigured);
|
|
26
|
+
statusLine('ccodex/co/claude-openai aliases installed', result.aliasesInstalled);
|
|
27
|
+
statusLine('Shell rc integration configured', result.shellIntegration);
|
|
28
|
+
statusLine('Claude CLI available', result.claudeCliAvailable);
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get status result
|
|
32
|
+
*/
|
|
33
|
+
export async function getStatus() {
|
|
34
|
+
const proxyCmd = await detectProxyCommand();
|
|
35
|
+
const proxyRunning = await isProxyRunning();
|
|
36
|
+
const auth = await checkAuthConfigured();
|
|
37
|
+
const aliasFile = await hasAliasFile();
|
|
38
|
+
const shellIntegration = await isShellIntegrationConfigured();
|
|
39
|
+
const claudeCli = await hasCommand('claude');
|
|
40
|
+
return {
|
|
41
|
+
proxyCommand: proxyCmd.cmd !== null,
|
|
42
|
+
proxyRunning,
|
|
43
|
+
authConfigured: auth.configured,
|
|
44
|
+
aliasesInstalled: aliasFile,
|
|
45
|
+
shellIntegration,
|
|
46
|
+
claudeCliAvailable: claudeCli,
|
|
47
|
+
ready: proxyCmd.cmd !== null &&
|
|
48
|
+
proxyRunning &&
|
|
49
|
+
auth.configured &&
|
|
50
|
+
aliasFile &&
|
|
51
|
+
shellIntegration &&
|
|
52
|
+
claudeCli,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Ready check with exit code
|
|
57
|
+
*/
|
|
58
|
+
export async function readyCheck() {
|
|
59
|
+
await printStatus();
|
|
60
|
+
const result = await getStatus();
|
|
61
|
+
if (result.ready) {
|
|
62
|
+
console.log('');
|
|
63
|
+
console.log(chalk.green('Ready: run') + ' ' + chalk.bold('ccodex') + ', ' + chalk.bold('co') + ', or ' + chalk.bold('claude-openai') + '.');
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
console.log('');
|
|
67
|
+
console.log(chalk.yellow('Not ready: run') +
|
|
68
|
+
' ' +
|
|
69
|
+
chalk.bold('npx -y ccodex') +
|
|
70
|
+
' again to complete setup.');
|
|
71
|
+
return false;
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,MAAM,cAAc,CAAC;AAG1E;;GAEG;AACH,SAAS,UAAU,CAAC,KAAa,EAAE,EAAW;IAC5C,IAAI,EAAE,EAAE,CAAC;QACP,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,QAAQ,GAAG,KAAK,CAAC,CAAC;IACxD,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,CAAC;IACtD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC;IAEzC,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,UAAU,CAAC,+BAA+B,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACjE,UAAU,CAAC,uCAAuC,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC;IACzE,UAAU,CAAC,+BAA+B,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC;IACnE,UAAU,CAAC,2CAA2C,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACjF,UAAU,CAAC,iCAAiC,EAAE,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACvE,UAAU,CAAC,sBAAsB,EAAE,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAChE,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS;IAC7B,MAAM,QAAQ,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC5C,MAAM,YAAY,GAAG,MAAM,cAAc,EAAE,CAAC;IAC5C,MAAM,IAAI,GAAG,MAAM,mBAAmB,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,MAAM,YAAY,EAAE,CAAC;IACvC,MAAM,gBAAgB,GAAG,MAAM,4BAA4B,EAAE,CAAC;IAC9D,MAAM,SAAS,GAAG,MAAM,UAAU,CAAC,QAAQ,CAAC,CAAC;IAE7C,OAAO;QACL,YAAY,EAAE,QAAQ,CAAC,GAAG,KAAK,IAAI;QACnC,YAAY;QACZ,cAAc,EAAE,IAAI,CAAC,UAAU;QAC/B,gBAAgB,EAAE,SAAS;QAC3B,gBAAgB;QAChB,kBAAkB,EAAE,SAAS;QAC7B,KAAK,EACH,QAAQ,CAAC,GAAG,KAAK,IAAI;YACrB,YAAY;YACZ,IAAI,CAAC,UAAU;YACf,SAAS;YACT,gBAAgB;YAChB,SAAS;KACZ,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU;IAC9B,MAAM,WAAW,EAAE,CAAC;IAEpB,MAAM,MAAM,GAAG,MAAM,SAAS,EAAE,CAAC;IAEjC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,GAAG,CAAC,CAAC;QAC5I,OAAO,IAAI,CAAC;IACd,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAChB,OAAO,CAAC,GAAG,CACT,KAAK,CAAC,MAAM,CAAC,gBAAgB,CAAC;QAC5B,GAAG;QACH,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC;QAC3B,2BAA2B,CAC9B,CAAC;IACF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Platform detection results
|
|
3
|
+
*/
|
|
4
|
+
export interface Platform {
|
|
5
|
+
os: 'darwin' | 'linux' | 'windows';
|
|
6
|
+
shell: 'zsh' | 'bash' | 'cmd' | 'powershell' | null;
|
|
7
|
+
home: string;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* CLIProxyAPI command detection
|
|
11
|
+
*/
|
|
12
|
+
export interface ProxyCommand {
|
|
13
|
+
cmd: 'cliproxyapi' | 'cliproxy' | null;
|
|
14
|
+
path: string | null;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Auth configuration status
|
|
18
|
+
*/
|
|
19
|
+
export interface AuthStatus {
|
|
20
|
+
hasAuthFiles: boolean;
|
|
21
|
+
hasAuthEntries: boolean;
|
|
22
|
+
hasModels: boolean;
|
|
23
|
+
configured: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Status check results
|
|
27
|
+
*/
|
|
28
|
+
export interface StatusResult {
|
|
29
|
+
proxyCommand: boolean;
|
|
30
|
+
proxyRunning: boolean;
|
|
31
|
+
authConfigured: boolean;
|
|
32
|
+
aliasesInstalled: boolean;
|
|
33
|
+
shellIntegration: boolean;
|
|
34
|
+
claudeCliAvailable: boolean;
|
|
35
|
+
ready: boolean;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* CLI options
|
|
39
|
+
*/
|
|
40
|
+
export interface CliOptions {
|
|
41
|
+
login?: boolean;
|
|
42
|
+
status?: boolean;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Shell configuration
|
|
46
|
+
*/
|
|
47
|
+
export interface ShellConfig {
|
|
48
|
+
rcFile: string;
|
|
49
|
+
aliasFile: string;
|
|
50
|
+
sourceLine: string;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=types.d.ts.map
|