UNPKG

@bestdefense/bd-agent

Version:

An AI-powered coding assistant CLI that connects to AWS Bedrock

138 lines 5.83 kB
#!/usr/bin/env node "use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const chalk_1 = __importDefault(require("chalk")); const inquirer_1 = __importDefault(require("inquirer")); const config_1 = require("./utils/config"); const chat_1 = require("./commands/chat"); const claude_md_1 = require("./utils/claude-md"); const package_json_1 = require("../package.json"); const program = new commander_1.Command(); program .name('bd-agent') .description('AI-powered coding assistant CLI connected to AWS Bedrock') .version(package_json_1.version); program .command('chat') .description('Start an interactive chat session') .option('-m, --model <model>', 'Bedrock model ID to use') .action(async (options) => { try { if (!(0, config_1.validateConfig)()) { console.log(chalk_1.default.yellow('AWS credentials not configured. Running setup...')); await runSetup(); } await (0, chat_1.startChat)(options); } catch (error) { console.error(chalk_1.default.red(`\nUnexpected error: ${error.message}`)); console.error(chalk_1.default.gray(error.stack)); process.exit(1); } }); program .command('setup') .description('Configure AWS credentials and settings') .action(runSetup); program .command('init') .description('Create a CLAUDE.md template for project-specific instructions') .action(() => { try { claude_md_1.ClaudeMdManager.createTemplate(process.cwd()); } catch (error) { console.error(chalk_1.default.red(`Error: ${error.message}`)); process.exit(1); } }); async function runSetup() { console.log(chalk_1.default.blue('BD Agent Setup')); console.log(chalk_1.default.gray('Configure your AWS credentials for Bedrock access\n')); const answers = await inquirer_1.default.prompt([ { type: 'input', name: 'AWS_ACCESS_KEY_ID', message: 'AWS Access Key ID:', validate: (input) => input.length > 0 || 'Access Key ID is required' }, { type: 'password', name: 'AWS_SECRET_ACCESS_KEY', message: 'AWS Secret Access Key:', validate: (input) => input.length > 0 || 'Secret Access Key is required' }, { type: 'editor', name: 'AWS_SESSION_TOKEN', message: 'AWS Session Token (optional - press Enter to open editor for long tokens):' }, { type: 'input', name: 'AWS_REGION', message: 'AWS Region:', default: 'us-east-1' }, { type: 'list', name: 'BEDROCK_MODEL_ID', message: 'Bedrock Model ID:', choices: [ { name: 'Claude 3.5 Sonnet v2 (Latest)', value: 'anthropic.claude-3-5-sonnet-20241022-v2:0' }, { name: 'Claude 3.5 Sonnet v1', value: 'anthropic.claude-3-5-sonnet-20240620-v1:0' }, { name: 'Claude 3 Sonnet', value: 'anthropic.claude-3-sonnet-20240229-v1:0' }, { name: 'Claude 3 Haiku', value: 'anthropic.claude-3-haiku-20240307-v1:0' }, { name: 'Claude Instant', value: 'anthropic.claude-instant-v1' }, { name: '--- Inference Profile Required ---', value: 'divider', disabled: true }, { name: 'Claude Opus 4 (requires setup)', value: 'opus-setup' }, { name: 'Custom Model/Profile (enter manually)', value: 'custom' } ], default: 'us.anthropic.claude-opus-4-20250514-v1:0' }, { type: 'input', name: 'CUSTOM_MODEL_ID', message: 'Enter custom model ID:', when: (answers) => answers.BEDROCK_MODEL_ID === 'custom' } ]); // Handle special cases if (answers.BEDROCK_MODEL_ID === 'opus-setup') { console.log(chalk_1.default.yellow('\n⚠️ Claude Opus 4 requires an inference profile.')); console.log(chalk_1.default.blue('\nOption 1: Try region-prefixed model ID')); console.log(chalk_1.default.gray(`Example: ${answers.AWS_REGION}.anthropic.claude-opus-4-20250514-v1:0`)); const useRegionPrefix = await inquirer_1.default.prompt([{ type: 'confirm', name: 'usePrefix', message: 'Try using region-prefixed model ID?', default: true }]); if (useRegionPrefix.usePrefix) { answers.BEDROCK_MODEL_ID = `${answers.AWS_REGION}.anthropic.claude-opus-4-20250514-v1:0`; } else { console.log(chalk_1.default.blue('\nOption 2: Create an inference profile')); console.log('1. Go to: https://console.aws.amazon.com/bedrock/'); console.log('2. Create an inference profile for Claude Opus 4'); console.log('3. Copy the ARN and run bd-agent setup again'); console.log('\nFor now, using Claude 3.5 Sonnet as fallback.'); answers.BEDROCK_MODEL_ID = 'anthropic.claude-3-5-sonnet-20241022-v2:0'; } } else if (answers.BEDROCK_MODEL_ID === 'custom' && answers.CUSTOM_MODEL_ID) { answers.BEDROCK_MODEL_ID = answers.CUSTOM_MODEL_ID; delete answers.CUSTOM_MODEL_ID; } (0, config_1.saveConfig)(answers); console.log(chalk_1.default.green('\n✓ Configuration saved successfully!')); console.log(chalk_1.default.gray('You can now use: bd-agent chat')); } program.parse(process.argv); if (!process.argv.slice(2).length) { program.outputHelp(); } //# sourceMappingURL=cli.js.map