UNPKG

bmad-method

Version:

Breakthrough Method of Agile AI-driven Development

153 lines (133 loc) 4.92 kB
const { Command } = require('commander'); const WebBuilder = require('./builders/web-builder'); const V3ToV4Upgrader = require('./upgraders/v3-to-v4-upgrader'); const IdeSetup = require('./installer/lib/ide-setup'); const path = require('node:path'); const program = new Command(); program .name('bmad-build') .description('BMAD-METHOD™ build tool for creating web bundles') .version('4.0.0'); program .command('build') .description('Build web bundles for agents and teams') .option('-a, --agents-only', 'Build only agent bundles') .option('-t, --teams-only', 'Build only team bundles') .option('-e, --expansions-only', 'Build only expansion pack bundles') .option('--no-expansions', 'Skip building expansion packs') .option('--no-clean', 'Skip cleaning output directories') .action(async (options) => { const builder = new WebBuilder({ rootDir: process.cwd(), }); try { if (options.clean) { console.log('Cleaning output directories...'); await builder.cleanOutputDirs(); } if (options.expansionsOnly) { console.log('Building expansion pack bundles...'); await builder.buildAllExpansionPacks({ clean: false }); } else { if (!options.teamsOnly) { console.log('Building agent bundles...'); await builder.buildAgents(); } if (!options.agentsOnly) { console.log('Building team bundles...'); await builder.buildTeams(); } if (!options.noExpansions) { console.log('Building expansion pack bundles...'); await builder.buildAllExpansionPacks({ clean: false }); } } console.log('Build completed successfully!'); } catch (error) { console.error('Build failed:', error.message); process.exit(1); } }); program .command('build:expansions') .description('Build web bundles for all expansion packs') .option('--expansion <name>', 'Build specific expansion pack only') .option('--no-clean', 'Skip cleaning output directories') .action(async (options) => { const builder = new WebBuilder({ rootDir: process.cwd(), }); try { if (options.expansion) { console.log(`Building expansion pack: ${options.expansion}`); await builder.buildExpansionPack(options.expansion, { clean: options.clean }); } else { console.log('Building all expansion packs...'); await builder.buildAllExpansionPacks({ clean: options.clean }); } console.log('Expansion pack build completed successfully!'); } catch (error) { console.error('Expansion pack build failed:', error.message); process.exit(1); } }); program .command('list:agents') .description('List all available agents') .action(async () => { const builder = new WebBuilder({ rootDir: process.cwd() }); const agents = await builder.resolver.listAgents(); console.log('Available agents:'); for (const agent of agents) console.log(` - ${agent}`); process.exit(0); }); program .command('list:expansions') .description('List all available expansion packs') .action(async () => { const builder = new WebBuilder({ rootDir: process.cwd() }); const expansions = await builder.listExpansionPacks(); console.log('Available expansion packs:'); for (const expansion of expansions) console.log(` - ${expansion}`); process.exit(0); }); program .command('validate') .description('Validate agent and team configurations') .action(async () => { const builder = new WebBuilder({ rootDir: process.cwd() }); try { // Validate by attempting to build all agents and teams const agents = await builder.resolver.listAgents(); const teams = await builder.resolver.listTeams(); console.log('Validating agents...'); for (const agent of agents) { await builder.resolver.resolveAgentDependencies(agent); console.log(` ✓ ${agent}`); } console.log('\nValidating teams...'); for (const team of teams) { await builder.resolver.resolveTeamDependencies(team); console.log(` ✓ ${team}`); } console.log('\nAll configurations are valid!'); } catch (error) { console.error('Validation failed:', error.message); process.exit(1); } }); program .command('upgrade') .description('Upgrade a BMAD-METHOD™ V3 project to V4') .option('-p, --project <path>', 'Path to V3 project (defaults to current directory)') .option('--dry-run', 'Show what would be changed without making changes') .option('--no-backup', 'Skip creating backup (not recommended)') .action(async (options) => { const upgrader = new V3ToV4Upgrader(); await upgrader.upgrade({ projectPath: options.project, dryRun: options.dryRun, backup: options.backup, }); }); program.parse();