#!/usr/bin/env node 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('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 ', '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:') agents.forEach(agent => console.log(` - ${agent}`)) }) 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:') expansions.forEach(expansion => console.log(` - ${expansion}`)) }) 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 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()