diff --git a/tools/cli/commands/install.js b/tools/cli/commands/install.js index ede133a8..9e4de16b 100644 --- a/tools/cli/commands/install.js +++ b/tools/cli/commands/install.js @@ -9,7 +9,10 @@ const ui = new UI(); module.exports = { command: 'install', description: 'Install BMAD Core agents and tools', - options: [['-d, --debug', 'Enable debug output for manifest generation']], + options: [ + ['-d, --debug', 'Enable debug output for manifest generation'], + ['-D, --directory ', 'Target project directory (skips interactive prompt)'], + ], action: async (options) => { try { // Set debug flag as environment variable for all components @@ -18,7 +21,7 @@ module.exports = { console.log(chalk.cyan('Debug mode enabled\n')); } - const config = await ui.promptInstall(); + const config = await ui.promptInstall(options); // Handle cancel if (config.actionType === 'cancel') { diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index cc135fea..e4230c31 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -26,9 +26,10 @@ const choiceUtils = { Separator }; class UI { /** * Prompt for installation configuration + * @param {Object} options - CLI options object (may contain directory property) * @returns {Object} Installation configuration */ - async promptInstall() { + async promptInstall(options = {}) { CLIUtils.displayLogo(); // Display version-specific start message from install-messages.yaml @@ -36,7 +37,7 @@ class UI { const messageLoader = new MessageLoader(); messageLoader.displayStartMessage(); - const confirmedDirectory = await this.getConfirmedDirectory(); + const confirmedDirectory = await this.getConfirmedDirectory(options); // Preflight: Check for legacy BMAD v4 footprints immediately after getting directory const { Detector } = require('../installers/lib/core/detector'); @@ -537,9 +538,23 @@ class UI { /** * Get confirmed directory from user + * @param {Object} options - CLI options object (may contain directory property) * @returns {string} Confirmed directory path */ - async getConfirmedDirectory() { + async getConfirmedDirectory(options = {}) { + // If directory provided via CLI, validate and return it + if (options.directory) { + const expandedPath = this.expandUserPath(options.directory); + const validationError = this.validateDirectorySync(expandedPath); + if (validationError) { + throw new Error(`Invalid directory: ${validationError}`); + } + await this.displayDirectoryInfo(expandedPath); + // Skip confirmation for CLI-provided directories + return expandedPath; + } + + // Existing interactive prompt logic let confirmedDirectory = null; while (!confirmedDirectory) { const directoryAnswer = await this.promptForDirectory();