diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index 9134b4e28..4beaf41ab 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -274,7 +274,6 @@ class UI { await prompts.log.info(`Using modules from command-line: ${selectedModules.join(', ')}`); } else { selectedModules = await this.selectAllModules(installedModuleIds); - selectedModules = selectedModules.filter((m) => m !== 'core'); } // After module selection, ask about custom modules @@ -898,104 +897,6 @@ class UI { return moduleChoices; } - /** - * Prompt for module selection - * @param {Array} moduleChoices - Available module choices - * @returns {Array} Selected module IDs - */ - async selectModules(moduleChoices, defaultSelections = null) { - // If defaultSelections is provided, use it to override checked state - // Otherwise preserve the checked state from moduleChoices (set by getModuleChoices) - const choicesWithDefaults = moduleChoices.map((choice) => ({ - ...choice, - ...(defaultSelections === null ? {} : { checked: defaultSelections.includes(choice.value) }), - })); - - // Add a "None" option at the end for users who changed their mind - const choicesWithSkipOption = [ - ...choicesWithDefaults, - { - value: '__NONE__', - label: '\u26A0 None / I changed my mind - skip module installation', - checked: false, - }, - ]; - - const selected = await prompts.multiselect({ - message: 'Select modules to install (use arrow keys, space to toggle):', - choices: choicesWithSkipOption, - required: true, - }); - - // If user selected both "__NONE__" and other items, honor the "None" choice - if (selected && selected.includes('__NONE__') && selected.length > 1) { - await prompts.log.warn('"None / I changed my mind" was selected, so no modules will be installed.'); - return []; - } - - // Filter out the special '__NONE__' value - return selected ? selected.filter((m) => m !== '__NONE__') : []; - } - - /** - * Get external module choices for selection - * @returns {Array} External module choices for prompt - */ - async getExternalModuleChoices() { - const externalManager = new ExternalModuleManager(); - const modules = await externalManager.listAvailable(); - - return modules.map((mod) => ({ - name: mod.name, - value: mod.code, // Use the code (e.g., 'cis') as the value - checked: mod.defaultSelected || false, - hint: mod.description || undefined, // Show description as hint - module: mod, // Store full module info for later use - })); - } - - /** - * Prompt for external module selection - * @param {Array} externalModuleChoices - Available external module choices - * @param {Array} defaultSelections - Module codes to pre-select - * @returns {Array} Selected external module codes - */ - async selectExternalModules(externalModuleChoices, defaultSelections = []) { - // Build a message showing available modules - const message = 'Select official BMad modules to install (use arrow keys, space to toggle):'; - - // Mark choices as checked based on defaultSelections - const choicesWithDefaults = externalModuleChoices.map((choice) => ({ - ...choice, - checked: defaultSelections.includes(choice.value), - })); - - // Add a "None" option at the end for users who changed their mind - const choicesWithSkipOption = [ - ...choicesWithDefaults, - { - name: '⚠ None / I changed my mind - skip external module installation', - value: '__NONE__', - checked: false, - }, - ]; - - const selected = await prompts.multiselect({ - message, - choices: choicesWithSkipOption, - required: true, - }); - - // If user selected both "__NONE__" and other items, honor the "None" choice - if (selected && selected.includes('__NONE__') && selected.length > 1) { - await prompts.log.warn('"None / I changed my mind" was selected, so no external modules will be installed.'); - return []; - } - - // Filter out the special '__NONE__' value - return selected ? selected.filter((m) => m !== '__NONE__') : []; - } - /** * Select all modules (core + official + community) using grouped multiselect * @param {Set} installedModuleIds - Currently installed module IDs @@ -1068,11 +969,7 @@ class UI { } } } - allOptions.push(...communityModules.map(({ label, value, hint }) => ({ label, value, hint })), { - // "None" option at the end - label: '\u26A0 None - Skip module installation', - value: '__NONE__', - }); + allOptions.push(...communityModules.map(({ label, value, hint }) => ({ label, value, hint }))); const selected = await prompts.autocompleteMultiselect({ message: 'Select modules to install:', @@ -1083,14 +980,7 @@ class UI { maxItems: allOptions.length, }); - // If user selected both "__NONE__" and other items, honor the "None" choice - if (selected && selected.includes('__NONE__') && selected.length > 1) { - await prompts.log.warn('"None" was selected, so no modules will be installed.'); - return []; - } - - // Filter out the special '__NONE__' value - const result = selected ? selected.filter((m) => m !== '__NONE__') : []; + const result = selected ? selected.filter((m) => m !== 'core') : []; // Display selected modules as bulleted list if (result.length > 0) {