fix: remove redundant "None" skip option from module selection
The "None - Skip module installation" option was unnecessary since core is always locked/selected, satisfying the required constraint. Users can simply press Enter with only core selected to skip modules. Also removes dead code: selectModules(), getExternalModuleChoices(), and selectExternalModules() methods that were never called. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
b1bfce9aa7
commit
bf8d1e8022
|
|
@ -274,7 +274,6 @@ class UI {
|
||||||
await prompts.log.info(`Using modules from command-line: ${selectedModules.join(', ')}`);
|
await prompts.log.info(`Using modules from command-line: ${selectedModules.join(', ')}`);
|
||||||
} else {
|
} else {
|
||||||
selectedModules = await this.selectAllModules(installedModuleIds);
|
selectedModules = await this.selectAllModules(installedModuleIds);
|
||||||
selectedModules = selectedModules.filter((m) => m !== 'core');
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// After module selection, ask about custom modules
|
// After module selection, ask about custom modules
|
||||||
|
|
@ -898,104 +897,6 @@ class UI {
|
||||||
return moduleChoices;
|
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
|
* Select all modules (core + official + community) using grouped multiselect
|
||||||
* @param {Set} installedModuleIds - Currently installed module IDs
|
* @param {Set} installedModuleIds - Currently installed module IDs
|
||||||
|
|
@ -1068,11 +969,7 @@ class UI {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
allOptions.push(...communityModules.map(({ label, value, hint }) => ({ label, value, hint })), {
|
allOptions.push(...communityModules.map(({ label, value, hint }) => ({ label, value, hint })));
|
||||||
// "None" option at the end
|
|
||||||
label: '\u26A0 None - Skip module installation',
|
|
||||||
value: '__NONE__',
|
|
||||||
});
|
|
||||||
|
|
||||||
const selected = await prompts.autocompleteMultiselect({
|
const selected = await prompts.autocompleteMultiselect({
|
||||||
message: 'Select modules to install:',
|
message: 'Select modules to install:',
|
||||||
|
|
@ -1083,14 +980,7 @@ class UI {
|
||||||
maxItems: allOptions.length,
|
maxItems: allOptions.length,
|
||||||
});
|
});
|
||||||
|
|
||||||
// If user selected both "__NONE__" and other items, honor the "None" choice
|
const result = selected ? selected.filter((m) => m !== 'core') : [];
|
||||||
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__') : [];
|
|
||||||
|
|
||||||
// Display selected modules as bulleted list
|
// Display selected modules as bulleted list
|
||||||
if (result.length > 0) {
|
if (result.length > 0) {
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue