@bestdefense/bd-agent
Version:
An AI-powered coding assistant CLI that connects to AWS Bedrock
138 lines • 5.83 kB
JavaScript
;
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