@codemieai/code 0.0.4 → 0.0.6
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 +248 -25
- package/bin/agent-executor.js +43 -0
- package/dist/agents/codemie-code/agent.d.ts.map +1 -1
- package/dist/agents/codemie-code/agent.js +5 -3
- package/dist/agents/codemie-code/agent.js.map +1 -1
- package/dist/agents/codemie-code/tokenUtils.d.ts +2 -2
- package/dist/agents/codemie-code/tokenUtils.js +2 -2
- package/dist/agents/codemie-code/tokenUtils.js.map +1 -1
- package/dist/agents/codemie-code/ui.d.ts.map +1 -1
- package/dist/agents/codemie-code/ui.js +0 -7
- package/dist/agents/codemie-code/ui.js.map +1 -1
- package/dist/agents/core/AgentCLI.d.ts +44 -0
- package/dist/agents/core/AgentCLI.d.ts.map +1 -0
- package/dist/agents/core/AgentCLI.js +223 -0
- package/dist/agents/core/AgentCLI.js.map +1 -0
- package/dist/agents/core/BaseAgentAdapter.d.ts +48 -0
- package/dist/agents/core/BaseAgentAdapter.d.ts.map +1 -0
- package/dist/agents/core/BaseAgentAdapter.js +224 -0
- package/dist/agents/core/BaseAgentAdapter.js.map +1 -0
- package/dist/agents/core/types.d.ts +64 -0
- package/dist/agents/core/types.d.ts.map +1 -0
- package/dist/agents/core/types.js +5 -0
- package/dist/agents/core/types.js.map +1 -0
- package/dist/agents/plugins/claude.plugin.d.ts +13 -0
- package/dist/agents/plugins/claude.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/claude.plugin.js +35 -0
- package/dist/agents/plugins/claude.plugin.js.map +1 -0
- package/dist/agents/plugins/codemie-code.plugin.d.ts +20 -0
- package/dist/agents/plugins/codemie-code.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/codemie-code.plugin.js +137 -0
- package/dist/agents/plugins/codemie-code.plugin.js.map +1 -0
- package/dist/agents/plugins/codex.plugin.d.ts +13 -0
- package/dist/agents/plugins/codex.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/codex.plugin.js +43 -0
- package/dist/agents/plugins/codex.plugin.js.map +1 -0
- package/dist/agents/plugins/gemini.plugin.d.ts +13 -0
- package/dist/agents/plugins/gemini.plugin.d.ts.map +1 -0
- package/dist/agents/plugins/gemini.plugin.js +43 -0
- package/dist/agents/plugins/gemini.plugin.js.map +1 -0
- package/dist/agents/registry.d.ts +6 -10
- package/dist/agents/registry.d.ts.map +1 -1
- package/dist/agents/registry.js +13 -7
- package/dist/agents/registry.js.map +1 -1
- package/dist/cli/commands/config.d.ts.map +1 -1
- package/dist/cli/commands/config.js +14 -180
- package/dist/cli/commands/config.js.map +1 -1
- package/dist/cli/commands/profile.d.ts +3 -0
- package/dist/cli/commands/profile.d.ts.map +1 -0
- package/dist/cli/commands/profile.js +167 -0
- package/dist/cli/commands/profile.js.map +1 -0
- package/dist/cli/commands/setup.d.ts.map +1 -1
- package/dist/cli/commands/setup.js +226 -35
- package/dist/cli/commands/setup.js.map +1 -1
- package/dist/cli/index.js +2 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/env/types.d.ts +79 -0
- package/dist/env/types.d.ts.map +1 -0
- package/dist/env/types.js +16 -0
- package/dist/env/types.js.map +1 -0
- package/dist/utils/config-loader.d.ts +57 -34
- package/dist/utils/config-loader.d.ts.map +1 -1
- package/dist/utils/config-loader.js +200 -27
- package/dist/utils/config-loader.js.map +1 -1
- package/dist/utils/model-fetcher.d.ts.map +1 -1
- package/dist/utils/model-fetcher.js +1 -3
- package/dist/utils/model-fetcher.js.map +1 -1
- package/package.json +6 -4
- package/bin/codemie-claude.js +0 -145
- package/bin/codemie-code.js +0 -136
- package/bin/codemie-codex.js +0 -137
- package/dist/agents/adapters/claude-code.d.ts +0 -17
- package/dist/agents/adapters/claude-code.d.ts.map +0 -1
- package/dist/agents/adapters/claude-code.js +0 -134
- package/dist/agents/adapters/claude-code.js.map +0 -1
- package/dist/agents/adapters/codemie-code.d.ts +0 -21
- package/dist/agents/adapters/codemie-code.d.ts.map +0 -1
- package/dist/agents/adapters/codemie-code.js +0 -110
- package/dist/agents/adapters/codemie-code.js.map +0 -1
- package/dist/agents/adapters/codex.d.ts +0 -17
- package/dist/agents/adapters/codex.d.ts.map +0 -1
- package/dist/agents/adapters/codex.js +0 -145
- package/dist/agents/adapters/codex.js.map +0 -1
- package/dist/cli/commands/run.d.ts +0 -3
- package/dist/cli/commands/run.d.ts.map +0 -1
- package/dist/cli/commands/run.js +0 -333
- package/dist/cli/commands/run.js.map +0 -1
- package/dist/utils/agent-compatibility.d.ts +0 -32
- package/dist/utils/agent-compatibility.d.ts.map +0 -1
- package/dist/utils/agent-compatibility.js +0 -140
- package/dist/utils/agent-compatibility.js.map +0 -1
package/bin/codemie-claude.js
DELETED
|
@@ -1,145 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* CodeMie Claude Direct Agent
|
|
5
|
-
* Direct executable for the claude agent (bypasses registry)
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { ClaudeCodeAdapter } from '../dist/agents/adapters/claude-code.js';
|
|
9
|
-
import { ConfigLoader } from '../dist/utils/config-loader.js';
|
|
10
|
-
import { logger } from '../dist/utils/logger.js';
|
|
11
|
-
import { validateProviderCompatibility, validateModelCompatibility, displayCompatibilityError } from '../dist/utils/agent-compatibility.js';
|
|
12
|
-
import { Command } from 'commander';
|
|
13
|
-
import { readFileSync } from 'fs';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
import { getDirname } from '../dist/utils/dirname.js';
|
|
16
|
-
|
|
17
|
-
const program = new Command();
|
|
18
|
-
|
|
19
|
-
// Read version from package.json
|
|
20
|
-
let version = '1.0.0';
|
|
21
|
-
try {
|
|
22
|
-
const packageJsonPath = join(getDirname(import.meta.url), '../package.json');
|
|
23
|
-
const packageJsonContent = readFileSync(packageJsonPath, 'utf-8');
|
|
24
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
25
|
-
version = packageJson.version;
|
|
26
|
-
} catch {
|
|
27
|
-
// Use default version if unable to read
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
program
|
|
31
|
-
.name('codemie-claude')
|
|
32
|
-
.description('CodeMie Claude - Direct access to Claude Code agent')
|
|
33
|
-
.version(version)
|
|
34
|
-
.option('-m, --model <model>', 'Override model')
|
|
35
|
-
.option('-p, --provider <provider>', 'Override provider')
|
|
36
|
-
.option('--api-key <key>', 'Override API key')
|
|
37
|
-
.option('--base-url <url>', 'Override base URL')
|
|
38
|
-
.option('--timeout <seconds>', 'Override timeout (in seconds)', parseInt)
|
|
39
|
-
.allowUnknownOption() // Allow passing unknown options to Claude
|
|
40
|
-
.passThroughOptions() // Pass through options to Claude
|
|
41
|
-
.argument('[args...]', 'Arguments to pass to Claude Code')
|
|
42
|
-
.action(async (args, options) => {
|
|
43
|
-
try {
|
|
44
|
-
const adapter = new ClaudeCodeAdapter();
|
|
45
|
-
|
|
46
|
-
// Check if Claude Code is installed
|
|
47
|
-
if (!(await adapter.isInstalled())) {
|
|
48
|
-
logger.error('Claude Code is not installed. Install it first with: codemie install claude');
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Load configuration with CLI overrides
|
|
53
|
-
const config = await ConfigLoader.load(process.cwd(), {
|
|
54
|
-
model: options.model,
|
|
55
|
-
provider: options.provider,
|
|
56
|
-
apiKey: options.apiKey,
|
|
57
|
-
baseUrl: options.baseUrl,
|
|
58
|
-
timeout: options.timeout
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Handle SSO provider detection
|
|
62
|
-
if (config.provider === 'ai-run-sso' || (config.baseUrl && config.baseUrl.includes('codemie'))) {
|
|
63
|
-
// Update provider to ai-run-sso if detected from baseUrl
|
|
64
|
-
if (config.provider !== 'ai-run-sso') {
|
|
65
|
-
config.provider = 'ai-run-sso';
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
// Validate essential configuration
|
|
70
|
-
if (!config.baseUrl || !config.apiKey || !config.model) {
|
|
71
|
-
logger.error('Configuration incomplete. Run: codemie setup');
|
|
72
|
-
process.exit(1);
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
// Validate provider compatibility
|
|
76
|
-
const providerResult = validateProviderCompatibility('claude', config);
|
|
77
|
-
if (!providerResult.valid) {
|
|
78
|
-
displayCompatibilityError(providerResult, logger);
|
|
79
|
-
process.exit(1);
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
// Validate model compatibility
|
|
83
|
-
const modelResult = validateModelCompatibility('claude', config);
|
|
84
|
-
if (!modelResult.valid) {
|
|
85
|
-
displayCompatibilityError(modelResult, logger);
|
|
86
|
-
process.exit(1);
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
// Export provider-specific environment variables
|
|
90
|
-
const providerEnv = ConfigLoader.exportProviderEnvVars(config);
|
|
91
|
-
|
|
92
|
-
// Collect all arguments to pass to Claude
|
|
93
|
-
const claudeArgs = [...args];
|
|
94
|
-
|
|
95
|
-
// Add back unknown options that were parsed
|
|
96
|
-
const knownOptions = ['model', 'provider', 'apiKey', 'baseUrl', 'timeout'];
|
|
97
|
-
for (const [key, value] of Object.entries(options)) {
|
|
98
|
-
if (knownOptions.includes(key)) continue;
|
|
99
|
-
|
|
100
|
-
if (key.length === 1) {
|
|
101
|
-
claudeArgs.push(`-${key}`);
|
|
102
|
-
} else {
|
|
103
|
-
claudeArgs.push(`--${key}`);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
if (value !== true && value !== undefined) {
|
|
107
|
-
claudeArgs.push(String(value));
|
|
108
|
-
}
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
// Run Claude Code directly
|
|
112
|
-
logger.info(`Starting Claude Code with model ${config.model}...`);
|
|
113
|
-
await adapter.run(claudeArgs, providerEnv);
|
|
114
|
-
} catch (error) {
|
|
115
|
-
logger.error('Failed to run Claude Code:', error);
|
|
116
|
-
process.exit(1);
|
|
117
|
-
}
|
|
118
|
-
});
|
|
119
|
-
|
|
120
|
-
// Add health check command
|
|
121
|
-
program
|
|
122
|
-
.command('health')
|
|
123
|
-
.description('Check Claude Code health and installation')
|
|
124
|
-
.action(async () => {
|
|
125
|
-
try {
|
|
126
|
-
const adapter = new ClaudeCodeAdapter();
|
|
127
|
-
|
|
128
|
-
if (await adapter.isInstalled()) {
|
|
129
|
-
const version = await adapter.getVersion();
|
|
130
|
-
logger.success('Claude Code is installed and ready');
|
|
131
|
-
if (version) {
|
|
132
|
-
console.log(`Version: ${version}`);
|
|
133
|
-
}
|
|
134
|
-
} else {
|
|
135
|
-
logger.error('Claude Code is not installed');
|
|
136
|
-
console.log('Install with: codemie install claude');
|
|
137
|
-
process.exit(1);
|
|
138
|
-
}
|
|
139
|
-
} catch (error) {
|
|
140
|
-
logger.error('Health check failed:', error);
|
|
141
|
-
process.exit(1);
|
|
142
|
-
}
|
|
143
|
-
});
|
|
144
|
-
|
|
145
|
-
program.parse(process.argv);
|
package/bin/codemie-code.js
DELETED
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* CodeMie Native Agent
|
|
5
|
-
* Direct executable for the codemie-code agent
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { CodeMieCode } from '../dist/agents/codemie-code/index.js';
|
|
9
|
-
import { loadCodeMieConfig } from '../dist/agents/codemie-code/config.js';
|
|
10
|
-
import { logger } from '../dist/utils/logger.js';
|
|
11
|
-
import { Command } from 'commander';
|
|
12
|
-
import { readFileSync } from 'fs';
|
|
13
|
-
import { join } from 'path';
|
|
14
|
-
import { getDirname } from '../dist/utils/dirname.js';
|
|
15
|
-
import chalk from 'chalk';
|
|
16
|
-
|
|
17
|
-
const program = new Command();
|
|
18
|
-
|
|
19
|
-
// Read version from package.json
|
|
20
|
-
let version = '1.0.0';
|
|
21
|
-
try {
|
|
22
|
-
const packageJsonPath = join(getDirname(import.meta.url), '../package.json');
|
|
23
|
-
const packageJsonContent = readFileSync(packageJsonPath, 'utf-8');
|
|
24
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
25
|
-
version = packageJson.version;
|
|
26
|
-
} catch {
|
|
27
|
-
// Use default version if unable to read
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
program
|
|
31
|
-
.name('codemie-code')
|
|
32
|
-
.description('CodeMie Native Agent - Built-in LangGraph-based coding assistant')
|
|
33
|
-
.version(version)
|
|
34
|
-
.option('--task <task>', 'Execute a single task and exit')
|
|
35
|
-
.option('--debug', 'Enable debug logging')
|
|
36
|
-
.option('--plan', 'Enable structured planning mode with visual todo tracking')
|
|
37
|
-
.option('--plan-only', 'Generate plan without execution (planning phase only)')
|
|
38
|
-
.argument('[message...]', 'Initial message or conversation starter')
|
|
39
|
-
.action(async (message, options) => {
|
|
40
|
-
try {
|
|
41
|
-
const workingDir = process.cwd();
|
|
42
|
-
|
|
43
|
-
// Initialize the agent with debug flag
|
|
44
|
-
const codeMie = new CodeMieCode(workingDir);
|
|
45
|
-
|
|
46
|
-
try {
|
|
47
|
-
await codeMie.initialize({ debug: options.debug });
|
|
48
|
-
} catch (error) {
|
|
49
|
-
logger.error('CodeMie configuration required. Please run: codemie setup');
|
|
50
|
-
process.exit(1);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (options.task) {
|
|
54
|
-
// Single task execution with modern UI
|
|
55
|
-
const planOptions = {
|
|
56
|
-
planMode: options.plan || options.planOnly,
|
|
57
|
-
planOnly: options.planOnly
|
|
58
|
-
};
|
|
59
|
-
const result = await codeMie.executeTaskWithUI(options.task, planOptions);
|
|
60
|
-
console.log(result);
|
|
61
|
-
} else if (message.length > 0) {
|
|
62
|
-
// Execute initial message then continue interactively
|
|
63
|
-
const initialMessage = message.join(' ');
|
|
64
|
-
console.log(`> ${initialMessage}`);
|
|
65
|
-
|
|
66
|
-
const planOptions = {
|
|
67
|
-
planMode: options.plan || options.planOnly,
|
|
68
|
-
planOnly: options.planOnly
|
|
69
|
-
};
|
|
70
|
-
await codeMie.executeTaskWithUI(initialMessage, planOptions);
|
|
71
|
-
console.log(''); // Add spacing
|
|
72
|
-
|
|
73
|
-
// Start interactive session (with plan mode if enabled)
|
|
74
|
-
if (options.plan && !options.planOnly) {
|
|
75
|
-
// Enable plan mode for interactive session
|
|
76
|
-
const agent = codeMie.getAgent();
|
|
77
|
-
if (agent) {
|
|
78
|
-
const { CodeMieTerminalUI } = await import('../dist/agents/codemie-code/ui.js');
|
|
79
|
-
const ui = new CodeMieTerminalUI(agent);
|
|
80
|
-
ui.enablePlanMode();
|
|
81
|
-
await ui.startInteractive();
|
|
82
|
-
ui.dispose();
|
|
83
|
-
} else {
|
|
84
|
-
await codeMie.startInteractive();
|
|
85
|
-
}
|
|
86
|
-
} else if (!options.planOnly) {
|
|
87
|
-
await codeMie.startInteractive();
|
|
88
|
-
}
|
|
89
|
-
} else {
|
|
90
|
-
// Pure interactive mode
|
|
91
|
-
if (options.plan) {
|
|
92
|
-
// Enable plan mode for interactive session (no extra console message)
|
|
93
|
-
const agent = codeMie.getAgent();
|
|
94
|
-
if (agent) {
|
|
95
|
-
const { CodeMieTerminalUI } = await import('../dist/agents/codemie-code/ui.js');
|
|
96
|
-
const ui = new CodeMieTerminalUI(agent);
|
|
97
|
-
ui.enablePlanMode();
|
|
98
|
-
await ui.startInteractive();
|
|
99
|
-
ui.dispose();
|
|
100
|
-
} else {
|
|
101
|
-
await codeMie.startInteractive();
|
|
102
|
-
}
|
|
103
|
-
} else {
|
|
104
|
-
await codeMie.startInteractive();
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
} catch (error) {
|
|
108
|
-
logger.error('Failed to run CodeMie Native:', error);
|
|
109
|
-
process.exit(1);
|
|
110
|
-
}
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Add health check command
|
|
114
|
-
program
|
|
115
|
-
.command('health')
|
|
116
|
-
.description('Check CodeMie Native health and configuration')
|
|
117
|
-
.action(async () => {
|
|
118
|
-
try {
|
|
119
|
-
const result = await CodeMieCode.testConnection(process.cwd());
|
|
120
|
-
|
|
121
|
-
if (result.success) {
|
|
122
|
-
logger.success('CodeMie Native is healthy');
|
|
123
|
-
console.log(`Provider: ${result.provider}`);
|
|
124
|
-
console.log(`Model: ${result.model}`);
|
|
125
|
-
} else {
|
|
126
|
-
logger.error('CodeMie Native health check failed:');
|
|
127
|
-
console.log(result.error);
|
|
128
|
-
process.exit(1);
|
|
129
|
-
}
|
|
130
|
-
} catch (error) {
|
|
131
|
-
logger.error('Health check failed:', error);
|
|
132
|
-
process.exit(1);
|
|
133
|
-
}
|
|
134
|
-
});
|
|
135
|
-
|
|
136
|
-
program.parse(process.argv);
|
package/bin/codemie-codex.js
DELETED
|
@@ -1,137 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* CodeMie Codex Direct Agent
|
|
5
|
-
* Direct executable for the codex agent (bypasses registry)
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
import { CodexAdapter } from '../dist/agents/adapters/codex.js';
|
|
9
|
-
import { ConfigLoader } from '../dist/utils/config-loader.js';
|
|
10
|
-
import { logger } from '../dist/utils/logger.js';
|
|
11
|
-
import { validateProviderCompatibility, validateModelCompatibility, displayCompatibilityError } from '../dist/utils/agent-compatibility.js';
|
|
12
|
-
import { Command } from 'commander';
|
|
13
|
-
import { readFileSync } from 'fs';
|
|
14
|
-
import { join } from 'path';
|
|
15
|
-
import { getDirname } from '../dist/utils/dirname.js';
|
|
16
|
-
|
|
17
|
-
const program = new Command();
|
|
18
|
-
|
|
19
|
-
// Read version from package.json
|
|
20
|
-
let version = '1.0.0';
|
|
21
|
-
try {
|
|
22
|
-
const packageJsonPath = join(getDirname(import.meta.url), '../package.json');
|
|
23
|
-
const packageJsonContent = readFileSync(packageJsonPath, 'utf-8');
|
|
24
|
-
const packageJson = JSON.parse(packageJsonContent);
|
|
25
|
-
version = packageJson.version;
|
|
26
|
-
} catch {
|
|
27
|
-
// Use default version if unable to read
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
program
|
|
31
|
-
.name('codemie-codex')
|
|
32
|
-
.description('CodeMie Codex - Direct access to OpenAI Codex agent')
|
|
33
|
-
.version(version)
|
|
34
|
-
.option('-m, --model <model>', 'Override model (must be OpenAI-compatible)')
|
|
35
|
-
.option('-p, --provider <provider>', 'Override provider')
|
|
36
|
-
.option('--api-key <key>', 'Override API key')
|
|
37
|
-
.option('--base-url <url>', 'Override base URL')
|
|
38
|
-
.option('--timeout <seconds>', 'Override timeout (in seconds)', parseInt)
|
|
39
|
-
.allowUnknownOption() // Allow passing unknown options to Codex
|
|
40
|
-
.passThroughOptions() // Pass through options to Codex
|
|
41
|
-
.argument('[args...]', 'Arguments to pass to Codex')
|
|
42
|
-
.action(async (args, options) => {
|
|
43
|
-
try {
|
|
44
|
-
const adapter = new CodexAdapter();
|
|
45
|
-
|
|
46
|
-
// Check if Codex is installed
|
|
47
|
-
if (!(await adapter.isInstalled())) {
|
|
48
|
-
logger.error('Codex is not installed. Install it first with: codemie install codex');
|
|
49
|
-
process.exit(1);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
// Load configuration with CLI overrides
|
|
53
|
-
const config = await ConfigLoader.load(process.cwd(), {
|
|
54
|
-
model: options.model,
|
|
55
|
-
provider: options.provider,
|
|
56
|
-
apiKey: options.apiKey,
|
|
57
|
-
baseUrl: options.baseUrl,
|
|
58
|
-
timeout: options.timeout
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
// Validate essential configuration
|
|
62
|
-
if (!config.baseUrl || !config.apiKey || !config.model) {
|
|
63
|
-
logger.error('Configuration incomplete. Run: codemie setup');
|
|
64
|
-
process.exit(1);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
// Validate provider compatibility
|
|
68
|
-
const providerResult = validateProviderCompatibility('codex', config);
|
|
69
|
-
if (!providerResult.valid) {
|
|
70
|
-
displayCompatibilityError(providerResult, logger);
|
|
71
|
-
process.exit(1);
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
// Validate model compatibility
|
|
75
|
-
const modelResult = validateModelCompatibility('codex', config);
|
|
76
|
-
if (!modelResult.valid) {
|
|
77
|
-
displayCompatibilityError(modelResult, logger);
|
|
78
|
-
process.exit(1);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// Export provider-specific environment variables
|
|
82
|
-
const providerEnv = ConfigLoader.exportProviderEnvVars(config);
|
|
83
|
-
|
|
84
|
-
// Collect all arguments to pass to Codex
|
|
85
|
-
const codexArgs = [...args];
|
|
86
|
-
|
|
87
|
-
// Add back unknown options that were parsed
|
|
88
|
-
const knownOptions = ['model', 'provider', 'apiKey', 'baseUrl', 'timeout'];
|
|
89
|
-
for (const [key, value] of Object.entries(options)) {
|
|
90
|
-
if (knownOptions.includes(key)) continue;
|
|
91
|
-
|
|
92
|
-
if (key.length === 1) {
|
|
93
|
-
codexArgs.push(`-${key}`);
|
|
94
|
-
} else {
|
|
95
|
-
codexArgs.push(`--${key}`);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (value !== true && value !== undefined) {
|
|
99
|
-
codexArgs.push(String(value));
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// Run Codex directly
|
|
104
|
-
logger.info(`Starting Codex with model ${config.model}...`);
|
|
105
|
-
await adapter.run(codexArgs, providerEnv);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
logger.error('Failed to run Codex:', error);
|
|
108
|
-
process.exit(1);
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
// Add health check command
|
|
113
|
-
program
|
|
114
|
-
.command('health')
|
|
115
|
-
.description('Check Codex health and installation')
|
|
116
|
-
.action(async () => {
|
|
117
|
-
try {
|
|
118
|
-
const adapter = new CodexAdapter();
|
|
119
|
-
|
|
120
|
-
if (await adapter.isInstalled()) {
|
|
121
|
-
const version = await adapter.getVersion();
|
|
122
|
-
logger.success('Codex is installed and ready');
|
|
123
|
-
if (version) {
|
|
124
|
-
console.log(`Version: ${version}`);
|
|
125
|
-
}
|
|
126
|
-
} else {
|
|
127
|
-
logger.error('Codex is not installed');
|
|
128
|
-
console.log('Install with: codemie install codex');
|
|
129
|
-
process.exit(1);
|
|
130
|
-
}
|
|
131
|
-
} catch (error) {
|
|
132
|
-
logger.error('Health check failed:', error);
|
|
133
|
-
process.exit(1);
|
|
134
|
-
}
|
|
135
|
-
});
|
|
136
|
-
|
|
137
|
-
program.parse(process.argv);
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
import { AgentAdapter } from '../registry.js';
|
|
2
|
-
export declare class ClaudeCodeAdapter implements AgentAdapter {
|
|
3
|
-
name: string;
|
|
4
|
-
displayName: string;
|
|
5
|
-
description: string;
|
|
6
|
-
private ssoGateway;
|
|
7
|
-
install(): Promise<void>;
|
|
8
|
-
uninstall(): Promise<void>;
|
|
9
|
-
isInstalled(): Promise<boolean>;
|
|
10
|
-
run(args: string[], envOverrides?: Record<string, string>): Promise<void>;
|
|
11
|
-
getVersion(): Promise<string | null>;
|
|
12
|
-
/**
|
|
13
|
-
* Setup SSO authentication via local gateway if required
|
|
14
|
-
*/
|
|
15
|
-
private setupSSOGateway;
|
|
16
|
-
}
|
|
17
|
-
//# sourceMappingURL=claude-code.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.d.ts","sourceRoot":"","sources":["../../../src/agents/adapters/claude-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAM9C,qBAAa,iBAAkB,YAAW,YAAY;IACpD,IAAI,SAAY;IAChB,WAAW,SAAiB;IAC5B,WAAW,SAA+C;IAC1D,OAAO,CAAC,UAAU,CAA2B;IAEvC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAYxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAW1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAS/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAgDzE,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAS1C;;OAEG;YACW,eAAe;CA4C9B"}
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
import { exec } from '../../utils/exec.js';
|
|
2
|
-
import { logger } from '../../utils/logger.js';
|
|
3
|
-
import { spawn } from 'child_process';
|
|
4
|
-
import { SSOGateway } from '../../utils/sso-gateway.js';
|
|
5
|
-
export class ClaudeCodeAdapter {
|
|
6
|
-
name = 'claude';
|
|
7
|
-
displayName = 'Claude Code';
|
|
8
|
-
description = 'Claude Code - official Anthropic CLI tool';
|
|
9
|
-
ssoGateway = null;
|
|
10
|
-
async install() {
|
|
11
|
-
logger.info('Installing Claude Code...');
|
|
12
|
-
try {
|
|
13
|
-
// Install via npm
|
|
14
|
-
await exec('npm', ['install', '-g', '@anthropic-ai/claude-code'], { timeout: 120000 });
|
|
15
|
-
logger.success('Claude Code installed successfully');
|
|
16
|
-
}
|
|
17
|
-
catch (error) {
|
|
18
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
19
|
-
throw new Error(`Failed to install Claude Code: ${errorMessage}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
async uninstall() {
|
|
23
|
-
logger.info('Uninstalling Claude Code...');
|
|
24
|
-
try {
|
|
25
|
-
await exec('npm', ['uninstall', '-g', '@anthropic-ai/claude-code']);
|
|
26
|
-
logger.success('Claude Code uninstalled successfully');
|
|
27
|
-
}
|
|
28
|
-
catch (error) {
|
|
29
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
30
|
-
throw new Error(`Failed to uninstall Claude Code: ${errorMessage}`);
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
async isInstalled() {
|
|
34
|
-
try {
|
|
35
|
-
const result = await exec('which', ['claude']);
|
|
36
|
-
return result.code === 0;
|
|
37
|
-
}
|
|
38
|
-
catch {
|
|
39
|
-
return false;
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
async run(args, envOverrides) {
|
|
43
|
-
logger.info('Starting Claude Code...');
|
|
44
|
-
// Merge environment variables: process.env < envOverrides
|
|
45
|
-
let env = {
|
|
46
|
-
...process.env,
|
|
47
|
-
...envOverrides
|
|
48
|
-
};
|
|
49
|
-
// Handle SSO authentication via local gateway if configured
|
|
50
|
-
await this.setupSSOGateway(env);
|
|
51
|
-
try {
|
|
52
|
-
// Spawn Claude Code
|
|
53
|
-
const child = spawn('claude', args, {
|
|
54
|
-
stdio: 'inherit',
|
|
55
|
-
env
|
|
56
|
-
});
|
|
57
|
-
return new Promise((resolve, reject) => {
|
|
58
|
-
child.on('error', (error) => {
|
|
59
|
-
reject(new Error(`Failed to start Claude Code: ${error.message}`));
|
|
60
|
-
});
|
|
61
|
-
child.on('exit', async (code) => {
|
|
62
|
-
// Clean up gateway when claude exits
|
|
63
|
-
if (this.ssoGateway) {
|
|
64
|
-
await this.ssoGateway.stop();
|
|
65
|
-
this.ssoGateway = null;
|
|
66
|
-
}
|
|
67
|
-
if (code === 0) {
|
|
68
|
-
resolve();
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
reject(new Error(`Claude Code exited with code ${code}`));
|
|
72
|
-
}
|
|
73
|
-
});
|
|
74
|
-
});
|
|
75
|
-
}
|
|
76
|
-
catch (error) {
|
|
77
|
-
// Clean up gateway on error
|
|
78
|
-
if (this.ssoGateway) {
|
|
79
|
-
await this.ssoGateway.stop();
|
|
80
|
-
this.ssoGateway = null;
|
|
81
|
-
}
|
|
82
|
-
throw error;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
async getVersion() {
|
|
86
|
-
try {
|
|
87
|
-
const result = await exec('claude', ['--version']);
|
|
88
|
-
return result.stdout.trim();
|
|
89
|
-
}
|
|
90
|
-
catch {
|
|
91
|
-
return null;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Setup SSO authentication via local gateway if required
|
|
96
|
-
*/
|
|
97
|
-
async setupSSOGateway(env) {
|
|
98
|
-
// Check if we're using SSO provider
|
|
99
|
-
const isSSOProvider = env.CODEMIE_PROVIDER === 'ai-run-sso' ||
|
|
100
|
-
(env.CODEMIE_BASE_URL?.includes('codemie')) ||
|
|
101
|
-
(env.OPENAI_BASE_URL?.includes('codemie'));
|
|
102
|
-
if (!isSSOProvider) {
|
|
103
|
-
return null; // No SSO, use regular authentication
|
|
104
|
-
}
|
|
105
|
-
try {
|
|
106
|
-
// Get the target API URL from environment
|
|
107
|
-
const targetApiUrl = env.CODEMIE_BASE_URL || env.OPENAI_BASE_URL;
|
|
108
|
-
if (!targetApiUrl) {
|
|
109
|
-
throw new Error('No API URL found for SSO authentication');
|
|
110
|
-
}
|
|
111
|
-
// Create and start the SSO gateway
|
|
112
|
-
this.ssoGateway = new SSOGateway({
|
|
113
|
-
targetApiUrl,
|
|
114
|
-
debug: !!(env.DEBUG || env.CODEMIE_DEBUG),
|
|
115
|
-
clientType: 'codemie-claude'
|
|
116
|
-
});
|
|
117
|
-
const { port, url } = await this.ssoGateway.start();
|
|
118
|
-
// Point claude to use our local gateway
|
|
119
|
-
env.ANTHROPIC_BASE_URL = url;
|
|
120
|
-
env.ANTHROPIC_AUTH_TOKEN = 'gateway-handled'; // Placeholder since gateway handles auth
|
|
121
|
-
if (env.DEBUG || env.CODEMIE_DEBUG) {
|
|
122
|
-
logger.info('[DEBUG] SSO Gateway started for Claude Code');
|
|
123
|
-
logger.info(`[DEBUG] Gateway URL: ${url}`);
|
|
124
|
-
logger.info(`[DEBUG] Target API: ${targetApiUrl}`);
|
|
125
|
-
}
|
|
126
|
-
return { gatewayUrl: url, port };
|
|
127
|
-
}
|
|
128
|
-
catch (error) {
|
|
129
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
130
|
-
throw new Error(`SSO gateway setup failed: ${errorMessage}`);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}
|
|
134
|
-
//# sourceMappingURL=claude-code.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["../../../src/agents/adapters/claude-code.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import { AgentAdapter } from '../registry.js';
|
|
2
|
-
export declare class CodeMieCodeAdapter implements AgentAdapter {
|
|
3
|
-
name: string;
|
|
4
|
-
displayName: string;
|
|
5
|
-
description: string;
|
|
6
|
-
install(): Promise<void>;
|
|
7
|
-
uninstall(): Promise<void>;
|
|
8
|
-
isInstalled(): Promise<boolean>;
|
|
9
|
-
run(args: string[], envOverrides?: Record<string, string>): Promise<void>;
|
|
10
|
-
private runInteractive;
|
|
11
|
-
private runTask;
|
|
12
|
-
getVersion(): Promise<string | null>;
|
|
13
|
-
/**
|
|
14
|
-
* Test connection and configuration without starting interactive mode
|
|
15
|
-
*/
|
|
16
|
-
testConnection(): Promise<{
|
|
17
|
-
success: boolean;
|
|
18
|
-
error?: string;
|
|
19
|
-
}>;
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=codemie-code.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"codemie-code.d.ts","sourceRoot":"","sources":["../../../src/agents/adapters/codemie-code.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAQ9C,qBAAa,kBAAmB,YAAW,YAAY;IACrD,IAAI,SAAkB;IACtB,WAAW,SAAoB;IAC/B,WAAW,SAAsE;IAE3E,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAK1B,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAK/B,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;YAgCjE,cAAc;YAwBd,OAAO;IAkBf,UAAU,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAY1C;;OAEG;IACG,cAAc,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAWtE"}
|