const path = require('node:path'); const prompts = require('../lib/prompts'); const { Installer } = require('../installers/lib/core/installer'); const { UI } = require('../lib/ui'); const installer = new Installer(); const ui = new UI(); module.exports = { command: 'install', description: 'Install BMAD Core agents and tools', options: [ ['-d, --debug', 'Enable debug output for manifest generation'], ['--directory ', 'Installation directory (default: current directory)'], ['--modules ', 'Comma-separated list of module IDs to install (e.g., "bmm,bmb")'], [ '--tools ', 'Comma-separated list of tool/IDE IDs to configure (e.g., "claude-code,cursor"). Use "none" to skip tool configuration.', ], ['--custom-content ', 'Comma-separated list of paths to custom modules/agents/workflows'], ['--action ', 'Action type for existing installations: install, update, or quick-update'], ['--user-name ', 'Name for agents to use (default: system username)'], ['--communication-language ', 'Language for agent communication (default: English)'], ['--document-output-language ', 'Language for document output (default: English)'], ['--output-folder ', 'Output folder path relative to project root (default: _bmad-output)'], ['-y, --yes', 'Accept all defaults and skip prompts where possible'], ], action: async (options) => { try { // Set debug flag as environment variable for all components if (options.debug) { process.env.BMAD_DEBUG_MANIFEST = 'true'; await prompts.log.info('Debug mode enabled'); } const config = await ui.promptInstall(options); // Handle cancel if (config.actionType === 'cancel') { await prompts.log.warn('Installation cancelled.'); process.exit(0); } // Handle quick update separately if (config.actionType === 'quick-update') { const result = await installer.quickUpdate(config); await prompts.log.success('Quick update complete!'); await prompts.log.info(`Updated ${result.moduleCount} modules with preserved settings (${result.modules.join(', ')})`); process.exit(0); } // Regular install/update flow const result = await installer.install(config); // Check if installation was cancelled if (result && result.cancelled) { process.exit(0); } // Check if installation succeeded if (result && result.success) { process.exit(0); } } catch (error) { try { if (error.fullMessage) { await prompts.log.error(error.fullMessage); } else { await prompts.log.error(`Installation failed: ${error.message}`); } if (error.stack) { await prompts.log.message(error.stack); } } catch { console.error(error.fullMessage || error.message || error); } process.exit(1); } }, };