mirror of
https://github.com/bmad-code-org/BMAD-METHOD.git
synced 2026-09-19 08:11:52 +08:00
513f440a23
* refactor(installer): restructure installer with clean separation of concerns Move tools/cli/ to tools/installer/ with major structural cleanup: - InstallPaths async factory for path resolution and directory creation - Config value object (frozen) replaces mutable config bag - ExistingInstall value object replaces stateful Detector class - OfficialModules + CustomModules + ExternalModuleManager replace monolithic ModuleManager - install() is prompt-free; all user interaction in ui.js - Update state returned explicitly instead of mutating customConfig - Delete dead code: dependency-resolver, _base-ide, IdeConfigManager, platform-codes helpers, npx wrapper, xml-utils - Flatten directory structure: custom/handler → custom-handler, tools/cli/ → tools/installer/, lib/ directories removed - Update all path references in package.json, tests, CI, and docs * fix(installer): guard ExistingInstall.version and surface module.yaml errors Guard ExistingInstall.version access with .installed check in uninstall.js, ui.js, and installer.js to prevent throwing on empty/partial _bmad dirs. Surface invalid module.yaml parse errors as warnings instead of silently returning empty results.
53 lines
1.5 KiB
JavaScript
53 lines
1.5 KiB
JavaScript
/**
|
|
* Clean install configuration built from user input.
|
|
* User input comes from either UI answers or headless CLI flags.
|
|
*/
|
|
class Config {
|
|
constructor({ directory, modules, ides, skipPrompts, verbose, actionType, coreConfig, moduleConfigs, quickUpdate }) {
|
|
this.directory = directory;
|
|
this.modules = Object.freeze([...modules]);
|
|
this.ides = Object.freeze([...ides]);
|
|
this.skipPrompts = skipPrompts;
|
|
this.verbose = verbose;
|
|
this.actionType = actionType;
|
|
this.coreConfig = coreConfig;
|
|
this.moduleConfigs = moduleConfigs;
|
|
this._quickUpdate = quickUpdate;
|
|
Object.freeze(this);
|
|
}
|
|
|
|
/**
|
|
* Build a clean install config from raw user input.
|
|
* @param {Object} userInput - UI answers or CLI flags
|
|
* @returns {Config}
|
|
*/
|
|
static build(userInput) {
|
|
const modules = [...(userInput.modules || [])];
|
|
if (userInput.installCore && !modules.includes('core')) {
|
|
modules.unshift('core');
|
|
}
|
|
|
|
return new Config({
|
|
directory: userInput.directory,
|
|
modules,
|
|
ides: userInput.skipIde ? [] : [...(userInput.ides || [])],
|
|
skipPrompts: userInput.skipPrompts || false,
|
|
verbose: userInput.verbose || false,
|
|
actionType: userInput.actionType,
|
|
coreConfig: userInput.coreConfig || {},
|
|
moduleConfigs: userInput.moduleConfigs || null,
|
|
quickUpdate: userInput._quickUpdate || false,
|
|
});
|
|
}
|
|
|
|
hasCoreConfig() {
|
|
return this.coreConfig && Object.keys(this.coreConfig).length > 0;
|
|
}
|
|
|
|
isQuickUpdate() {
|
|
return this._quickUpdate;
|
|
}
|
|
}
|
|
|
|
module.exports = { Config };
|