diff --git a/tools/cli/installers/lib/modules/manager.js b/tools/cli/installers/lib/modules/manager.js index 831b6e6f4..e079c831b 100644 --- a/tools/cli/installers/lib/modules/manager.js +++ b/tools/cli/installers/lib/modules/manager.js @@ -1299,8 +1299,8 @@ class ModuleManager { } else { const { pathToFileURL } = require('node:url'); const imported = await import(pathToFileURL(installerPath).href); - // CJS module.exports lands on .default, ESM named exports are top-level - moduleInstaller = imported.default && typeof imported.default === 'object' ? imported.default : imported; + // CJS module.exports lands on .default; ESM default can be object, function, or class + moduleInstaller = imported.default == null ? imported : imported.default; } if (typeof moduleInstaller.install === 'function') { diff --git a/tools/cli/lib/ui.js b/tools/cli/lib/ui.js index 4beaf41ab..622f5a1e6 100644 --- a/tools/cli/lib/ui.js +++ b/tools/cli/lib/ui.js @@ -361,6 +361,9 @@ class UI { selectedModules.push(...customModuleResult.selectedCustomModules); } + // Filter out core - it's always installed via installCore flag + selectedModules = selectedModules.filter((m) => m !== 'core'); + // Get tool selection const toolSelection = await this.promptToolSelection(confirmedDirectory, options); @@ -898,9 +901,10 @@ class UI { } /** - * Select all modules (core + official + community) using grouped multiselect + * Select all modules (official + community) using grouped multiselect. + * Core is shown as locked but filtered from the result since it's always installed separately. * @param {Set} installedModuleIds - Currently installed module IDs - * @returns {Array} Selected module codes + * @returns {Array} Selected module codes (excluding core) */ async selectAllModules(installedModuleIds = new Set()) { const { ModuleManager } = require('../installers/lib/modules/manager');