claudegem
Version:
Seamless integration of Claude Code CLI + Gemini CLI for context-aware code reasoning
74 lines (61 loc) • 3.12 kB
JavaScript
import { program } from 'commander';
import chalk from 'chalk';
import Orchestrator from '../lib/orchestrator.js';
program
.version('1.0.19')
.description('Seamless integration of Claude Code CLI + Gemini CLI for context-aware code reasoning')
.argument('[query]', 'The query to process (optional when using --mcp)')
.option('--claude-flags <flags>', 'Additional flags to pass to Claude CLI (e.g., "--interactive --tools")')
.option('--skip-gemini', 'Skip Gemini context gathering and use Claude directly')
.option('--gemini-model <model>', 'Gemini model to use (default: gemini-2.5-pro)')
.option('--fallback <models>', 'Fallback models when Gemini quota exhausted (default: llama,mistral)')
.option('--mcp', 'Start Claude Code with ClaudeGem MCP server for multiple queries')
.action(async (query, options) => {
try {
if (options.mcp) {
// Start Claude Code with MCP server
console.log(chalk.blue('Starting Claude Code with ClaudeGem MCP server...'));
const mcpConfigPath = new URL('../claudegem-mcp-config.json', import.meta.url).pathname;
const { spawn } = await import('child_process');
const claudeArgs = ['claude', '--mcp-config', mcpConfigPath];
if (options.claudeFlags) {
claudeArgs.push(...options.claudeFlags.split(' ').filter(Boolean));
}
console.log(chalk.green('Claude Code will have access to:'));
console.log(chalk.yellow(' • bash_with_gemini - Execute bash commands via Gemini'));
console.log(chalk.yellow(' • analyze_with_gemini - Analyze code using Gemini'));
console.log(chalk.yellow(' • search_internet - Search the internet for information'));
console.log(chalk.yellow(' • Automatic fallback to Llama & Mistral when Gemini quota exhausted'));
console.log(chalk.blue('Starting Claude Code with MCP tools...'));
const claudeProcess = spawn(claudeArgs[0], claudeArgs.slice(1), {
stdio: 'inherit',
shell: true
});
claudeProcess.on('close', (code) => {
console.log(chalk.blue(`Claude Code session ended with code ${code}`));
});
return;
}
// Regular single query mode
if (!query) {
console.error(chalk.red('Error: Query is required when not using --mcp mode'));
console.log(chalk.yellow('Use --mcp for interactive mode or provide a query'));
process.exit(1);
}
const orchestrator = new Orchestrator();
console.log(chalk.blue('Processing query:', query));
const config = {
claudeFlags: options.claudeFlags || '',
skipGemini: options.skipGemini || false,
geminiModel: options.geminiModel || 'gemini-2.5-pro'
};
const result = await orchestrator.process(query, config);
console.log(chalk.green('\nResult:'));
console.log(result);
} catch (error) {
console.error(chalk.red('Error:'), error.message);
process.exit(1);
}
});
program.parse(process.argv);