installer updates, bmd module added and moved out of src, created a plan for module installation tool for custom modules, minor flow improvements

This commit is contained in:
Brian Madison
2025-10-19 11:59:27 -05:00
parent eb9a214115
commit 0a048f2ccc
69 changed files with 5244 additions and 617 deletions

View File

@@ -80,7 +80,7 @@ The installer is a multi-stage system that handles agent compilation, IDE integr
```
1. Collect User Input
- Target directory, modules, IDEs
- Custom module configuration (via install-menu-config.yaml)
- Custom module configuration (via install-config.yaml)
2. Pre-Installation
- Validate target, check conflicts, backup existing installations
@@ -163,12 +163,12 @@ The installer supports **14 IDE environments** through a base-derived architectu
### Custom Module Configuration
Modules define interactive configuration menus via `install-menu-config.yaml` files in their `_module-installer/` directories.
Modules define interactive configuration menus via `install-config.yaml` files in their `_module-installer/` directories.
**Config File Location**:
- Core: `src/core/_module-installer/install-menu-config.yaml`
- Modules: `src/modules/{module}/_module-installer/install-menu-config.yaml`
- Core: `src/core/_module-installer/install-config.yaml`
- Modules: `src/modules/{module}/_module-installer/install-config.yaml`
**Configuration Types**:

View File

@@ -105,7 +105,7 @@ class ConfigCollector {
this.allAnswers = {};
}
// Load module's config.yaml (check new location first, then fallback)
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-menu-config.yaml');
const installerConfigPath = path.join(getModulePath(moduleName), '_module-installer', 'install-config.yaml');
const legacyConfigPath = path.join(getModulePath(moduleName), 'config.yaml');
let configPath = null;

View File

@@ -46,7 +46,7 @@ class ModuleManager {
if (entry.isDirectory()) {
const modulePath = path.join(this.modulesSourcePath, entry.name);
// Check for new structure first
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-menu-config.yaml');
const installerConfigPath = path.join(modulePath, '_module-installer', 'install-config.yaml');
// Fallback to old structure
const configPath = path.join(modulePath, 'config.yaml');

View File

@@ -155,8 +155,27 @@ class YamlXmlBuilder {
}
// Start building XML
let xml = '<!-- Powered by BMAD-CORE™ -->\n\n';
xml += `# ${metadata.title || 'Agent'}\n\n`;
let xml = '';
if (buildMetadata.forWebBundle) {
// Web bundle: keep existing format
xml += '<!-- Powered by BMAD-CORE™ -->\n\n';
xml += `# ${metadata.title || 'Agent'}\n\n`;
} else {
// Installation: use YAML frontmatter + instruction
// Extract name from filename: "cli-chief.yaml" or "pm.agent.yaml" -> "cli chief" or "pm"
const filename = buildMetadata.sourceFile || 'agent.yaml';
let nameFromFile = path.basename(filename, path.extname(filename)); // Remove .yaml/.md extension
nameFromFile = nameFromFile.replace(/\.agent$/, ''); // Remove .agent suffix if present
nameFromFile = nameFromFile.replaceAll('-', ' '); // Replace dashes with spaces
xml += '---\n';
xml += `name: "${nameFromFile}"\n`;
xml += `description: "${metadata.title || 'BMAD Agent'}"\n`;
xml += '---\n\n';
xml +=
"You must fully embody this agent's persona and follow all activation instructions exactly as specified. NEVER break character until given an exit command.\n\n";
}
xml += '```xml\n';