mirror of
https://github.com/bmadcode/BMAD-METHOD.git
synced 2025-12-29 16:14:59 +00:00
installer for bmm includes option to include game assets or not when adding to a project.
This commit is contained in:
@@ -66,7 +66,7 @@ node tools/cli/bundlers/bundle-web.js agent bmm pm # One agent
|
||||
```bash
|
||||
npm run bmad:status # Installation status
|
||||
npm run validate:bundles # Validate web bundles
|
||||
node tools/cli/regenerate-manifests.js # Regenerate agent-party.xml files
|
||||
node tools/cli/regenerate-manifests.js # Regenerate agent-manifest.csv files
|
||||
```
|
||||
|
||||
---
|
||||
@@ -566,10 +566,10 @@ To add a new handler type (e.g., `validate-workflow`):
|
||||
### Regenerating Manifests
|
||||
|
||||
```bash
|
||||
# Regenerate agent-party.xml for all modules
|
||||
# Regenerate agent-manifest.csv for all modules
|
||||
node tools/cli/regenerate-manifests.js
|
||||
|
||||
# Location: src/modules/{module}/agents/agent-party.xml
|
||||
# Location: src/modules/{module}/agents/agent-manifest.csv
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
@@ -45,7 +45,7 @@ async function testWebBundler() {
|
||||
const hasPersona = content.includes('<persona>');
|
||||
const activationBeforePersona = content.indexOf('<activation') < content.indexOf('<persona>');
|
||||
const hasManifests =
|
||||
content.includes('<agent-party id="bmad/_cfg/agent-party.xml">') && content.includes('<manifest id="bmad/web-manifest.xml">');
|
||||
content.includes('<agent-party id="bmad/_cfg/agent-manifest.csv">') && content.includes('<manifest id="bmad/web-manifest.xml">');
|
||||
const hasDependencies = content.includes('<dependencies>');
|
||||
|
||||
console.log(chalk.green('✓ Analyst bundle created successfully'));
|
||||
|
||||
@@ -620,8 +620,8 @@ class WebBundler {
|
||||
}
|
||||
processed.add(filePath);
|
||||
|
||||
// Skip agent-party.xml manifest for web bundles (agents are already bundled)
|
||||
if (filePath === 'bmad/_cfg/agent-party.xml' || filePath.endsWith('/agent-party.xml')) {
|
||||
// Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
|
||||
if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -1393,8 +1393,8 @@ class WebBundler {
|
||||
// Ensure temp directory exists
|
||||
await fs.ensureDir(this.tempManifestDir);
|
||||
|
||||
// Generate agent-party.xml using shared generator
|
||||
const agentPartyPath = path.join(this.tempManifestDir, 'agent-party.xml');
|
||||
// Generate agent-manifest.csv using shared generator
|
||||
const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
|
||||
await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
|
||||
|
||||
console.log(chalk.dim(' ✓ Created temporary manifest files'));
|
||||
|
||||
@@ -912,6 +912,9 @@ class Installer {
|
||||
* @param {Object} moduleFiles - Module files to install
|
||||
*/
|
||||
async installModuleWithDependencies(moduleName, bmadDir, moduleFiles) {
|
||||
// Get module configuration for conditional installation
|
||||
const moduleConfig = this.configCollector.collectedConfig[moduleName] || {};
|
||||
|
||||
// Use existing module manager for full installation with file tracking
|
||||
// Note: Module-specific installers are called separately after IDE setup
|
||||
await this.moduleManager.install(
|
||||
@@ -922,6 +925,7 @@ class Installer {
|
||||
},
|
||||
{
|
||||
skipModuleInstaller: true, // We'll run it later after IDE setup
|
||||
moduleConfig: moduleConfig, // Pass module config for conditional filtering
|
||||
},
|
||||
);
|
||||
|
||||
@@ -1990,7 +1994,7 @@ class Installer {
|
||||
* @param {Array} agentDetails - Array of agent details
|
||||
*/
|
||||
async generateAgentManifest(bmadDir, agentDetails) {
|
||||
const manifestPath = path.join(bmadDir, '_cfg', 'agent-party.xml');
|
||||
const manifestPath = path.join(bmadDir, '_cfg', 'agent-manifest.csv');
|
||||
await AgentPartyGenerator.writeAgentParty(manifestPath, agentDetails, { forWeb: false });
|
||||
}
|
||||
|
||||
|
||||
@@ -113,7 +113,7 @@ class ModuleManager {
|
||||
}
|
||||
|
||||
// Copy module files with filtering
|
||||
await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback);
|
||||
await this.copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback, options.moduleConfig);
|
||||
|
||||
// Process agent files to inject activation block
|
||||
await this.processAgentFiles(targetPath, moduleName);
|
||||
@@ -231,14 +231,26 @@ class ModuleManager {
|
||||
}
|
||||
|
||||
/**
|
||||
* Copy module with filtering for localskip agents
|
||||
* Copy module with filtering for localskip agents and conditional content
|
||||
* @param {string} sourcePath - Source module path
|
||||
* @param {string} targetPath - Target module path
|
||||
* @param {Function} fileTrackingCallback - Optional callback to track installed files
|
||||
* @param {Object} moduleConfig - Module configuration with conditional flags
|
||||
*/
|
||||
async copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback = null) {
|
||||
async copyModuleWithFiltering(sourcePath, targetPath, fileTrackingCallback = null, moduleConfig = {}) {
|
||||
// Get all files in source
|
||||
const sourceFiles = await this.getFileList(sourcePath);
|
||||
|
||||
// Game development files to conditionally exclude
|
||||
const gameDevFiles = [
|
||||
'agents/game-architect.agent.yaml',
|
||||
'agents/game-designer.agent.yaml',
|
||||
'agents/game-dev.agent.yaml',
|
||||
'workflows/1-analysis/brainstorm-game',
|
||||
'workflows/1-analysis/game-brief',
|
||||
'workflows/2-plan-workflows/gdd',
|
||||
];
|
||||
|
||||
for (const file of sourceFiles) {
|
||||
// Skip sub-modules directory - these are IDE-specific and handled separately
|
||||
if (file.startsWith('sub-modules/')) {
|
||||
@@ -255,6 +267,19 @@ class ModuleManager {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip game development content if include_game_planning is false
|
||||
if (moduleConfig.include_game_planning === false) {
|
||||
const shouldSkipGameDev = gameDevFiles.some((gamePath) => {
|
||||
// Check if file path starts with or is within any game dev directory
|
||||
return file === gamePath || file.startsWith(gamePath + '/') || file.startsWith(gamePath + '\\');
|
||||
});
|
||||
|
||||
if (shouldSkipGameDev) {
|
||||
console.log(chalk.dim(` Skipping game dev content: ${file}`));
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
const sourceFile = path.join(sourcePath, file);
|
||||
const targetFile = path.join(targetPath, file);
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ const fs = require('fs-extra');
|
||||
|
||||
const AgentPartyGenerator = {
|
||||
/**
|
||||
* Generate agent-party.xml content
|
||||
* Generate agent-manifest.csv content
|
||||
* @param {Array} agentDetails - Array of agent details
|
||||
* @param {Object} options - Generation options
|
||||
* @returns {string} XML content
|
||||
@@ -28,7 +28,7 @@ const AgentPartyGenerator = {
|
||||
let xmlContent = `<!-- Powered by BMAD-CORE™ -->
|
||||
<!-- Agent Manifest - Generated during BMAD ${forWeb ? 'bundling' : 'installation'} -->
|
||||
<!-- This file contains a summary of all ${forWeb ? 'bundled' : 'installed'} agents for quick reference -->
|
||||
<manifest id="bmad/_cfg/agent-party.xml" version="1.0" generated="${new Date().toISOString()}">
|
||||
<manifest id="bmad/_cfg/agent-manifest.csv" version="1.0" generated="${new Date().toISOString()}">
|
||||
<description>
|
||||
Complete roster of ${forWeb ? 'bundled' : 'installed'} BMAD agents with summarized personas for efficient multi-agent orchestration.
|
||||
Used by party-mode and other multi-agent coordination features.
|
||||
@@ -193,7 +193,7 @@ const AgentPartyGenerator = {
|
||||
},
|
||||
|
||||
/**
|
||||
* Write agent-party.xml to file
|
||||
* Write agent-manifest.csv to file
|
||||
*/
|
||||
async writeAgentParty(filePath, agentDetails, options = {}) {
|
||||
const content = this.generateAgentParty(agentDetails, options);
|
||||
|
||||
Reference in New Issue
Block a user