BMAD-METHOD/tools/cli/commands/install.js

88 lines
3.2 KiB
JavaScript

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 <path>', 'Installation directory (default: current directory)'],
['--modules <modules>', 'Comma-separated list of module IDs to install (e.g., "bmm,bmb")'],
[
'--tools <tools>',
'Comma-separated list of tool/IDE IDs to configure (e.g., "claude-code,cursor"). Use "none" to skip tool configuration.',
],
['--custom-content <paths>', 'Comma-separated list of paths to custom modules/agents/workflows'],
['--action <type>', 'Action type for existing installations: install, update, quick-update, or compile-agents'],
['--user-name <name>', 'Name for agents to use (default: system username)'],
['--communication-language <lang>', 'Language for agent communication (default: English)'],
['--document-output-language <lang>', 'Language for document output (default: English)'],
['--output-folder <path>', '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);
}
// Handle compile agents separately
if (config.actionType === 'compile-agents') {
const result = await installer.compileAgents(config);
await prompts.log.info(`Recompiled ${result.agentCount} agents with customizations applied`);
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);
}
},
};