installer for bmm includes option to include game assets or not when adding to a project.
This commit is contained in:
parent
f55e822338
commit
7ad841964d
|
|
@ -97,10 +97,10 @@ The BMad Method (BMM) is a complete AI-driven agile development framework that r
|
||||||
- **PM** - Product planning and requirements
|
- **PM** - Product planning and requirements
|
||||||
- **Analyst** - Research and business analysis
|
- **Analyst** - Research and business analysis
|
||||||
- **Architect** - Technical architecture and design
|
- **Architect** - Technical architecture and design
|
||||||
- **Game Designer** - Game-specific design and documentation
|
|
||||||
- **Scrum Master** - Sprint planning and story management
|
- **Scrum Master** - Sprint planning and story management
|
||||||
- **Developer** - Implementation with senior dev review
|
- **Developer** - Implementation with senior dev review
|
||||||
- **And more** - UX, Test Architect, specialized game roles
|
- **Game Development** (Optional) - Game Designer, Game Developer, Game Architect
|
||||||
|
- **And more** - UX, Test Architect, and other specialized roles
|
||||||
|
|
||||||
### Documentation
|
### Documentation
|
||||||
|
|
||||||
|
|
@ -168,6 +168,7 @@ The interactive installer will guide you through:
|
||||||
1. **Project location** - Where to install BMad
|
1. **Project location** - Where to install BMad
|
||||||
2. **Module selection** - Choose which modules you need (BMM, BMB, CIS)
|
2. **Module selection** - Choose which modules you need (BMM, BMB, CIS)
|
||||||
3. **Configuration** - Set your name, language preferences, and module options
|
3. **Configuration** - Set your name, language preferences, and module options
|
||||||
|
- **Game Development (Optional)**: When installing BMM, you can optionally include game development agents and workflow!
|
||||||
4. **IDE integration** - Configure your development environment
|
4. **IDE integration** - Configure your development environment
|
||||||
|
|
||||||
### What Gets Installed
|
### What Gets Installed
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ Bad: ../../../relative/paths/
|
||||||
```xml
|
```xml
|
||||||
<item cmd="*standup"
|
<item cmd="*standup"
|
||||||
exec="{project-root}/bmad/bmm/tasks/daily-standup.xml"
|
exec="{project-root}/bmad/bmm/tasks/daily-standup.xml"
|
||||||
data="{project-root}/bmad/_cfg/agent-party.xml">
|
data="{project-root}/bmad/_cfg/agent-manifest.csv">
|
||||||
Run daily standup
|
Run daily standup
|
||||||
</item>
|
</item>
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ Execute single operations
|
||||||
<!-- Task with data -->
|
<!-- Task with data -->
|
||||||
<item cmd="*standup"
|
<item cmd="*standup"
|
||||||
exec="{project-root}/bmad/mmm/tasks/daily-standup.xml"
|
exec="{project-root}/bmad/mmm/tasks/daily-standup.xml"
|
||||||
data="{project-root}/bmad/_cfg/agent-party.xml">
|
data="{project-root}/bmad/_cfg/agent-manifest.csv">
|
||||||
Run agile team standup
|
Run agile team standup
|
||||||
</item>
|
</item>
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -230,7 +230,7 @@ Bad: ../../../relative/paths/
|
||||||
```xml
|
```xml
|
||||||
<item cmd="*standup"
|
<item cmd="*standup"
|
||||||
exec="{project-root}/bmad/bmm/tasks/daily-standup.xml"
|
exec="{project-root}/bmad/bmm/tasks/daily-standup.xml"
|
||||||
data="{project-root}/bmad/_cfg/agent-party.xml">
|
data="{project-root}/bmad/_cfg/agent-manifest.csv">
|
||||||
Run daily standup
|
Run daily standup
|
||||||
</item>
|
</item>
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -119,7 +119,7 @@ Execute single operations
|
||||||
<!-- Task with data -->
|
<!-- Task with data -->
|
||||||
<item cmd="*standup"
|
<item cmd="*standup"
|
||||||
exec="{project-root}/bmad/mmm/tasks/daily-standup.xml"
|
exec="{project-root}/bmad/mmm/tasks/daily-standup.xml"
|
||||||
data="{project-root}/bmad/_cfg/agent-party.xml">
|
data="{project-root}/bmad/_cfg/agent-manifest.csv">
|
||||||
Run agile team standup
|
Run agile team standup
|
||||||
</item>
|
</item>
|
||||||
```
|
```
|
||||||
|
|
|
||||||
|
|
@ -21,6 +21,15 @@ Specialized AI agents for different development roles:
|
||||||
- **UX** - User experience design
|
- **UX** - User experience design
|
||||||
- And more specialized roles
|
- And more specialized roles
|
||||||
|
|
||||||
|
**Game Development Agents** (Optional):
|
||||||
|
During installation, you can optionally include game development specialists:
|
||||||
|
|
||||||
|
- **Game Designer** - Creative vision and game design documents (GDD)
|
||||||
|
- **Game Developer** - Game-specific implementation
|
||||||
|
- **Game Architect** - Game systems and technical infrastructure
|
||||||
|
|
||||||
|
These agents come with specialized workflows (`brainstorm-game`, `game-brief`, `gdd`) and are only installed if you select "Include Game Planning Agents and Workflows" during BMM installation.
|
||||||
|
|
||||||
### 📋 `/workflows`
|
### 📋 `/workflows`
|
||||||
|
|
||||||
The heart of BMM - structured workflows for the four development phases:
|
The heart of BMM - structured workflows for the four development phases:
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,11 @@ project_name:
|
||||||
default: "{directory_name}"
|
default: "{directory_name}"
|
||||||
result: "{value}"
|
result: "{value}"
|
||||||
|
|
||||||
|
include_game_planning:
|
||||||
|
prompt: "Include Game Planning Agents and Workflows?"
|
||||||
|
default: false
|
||||||
|
result: "{value}"
|
||||||
|
|
||||||
user_skill_level:
|
user_skill_level:
|
||||||
prompt:
|
prompt:
|
||||||
- "What is your technical experience level?"
|
- "What is your technical experience level?"
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,7 @@ agent:
|
||||||
|
|
||||||
- trigger: retrospective
|
- trigger: retrospective
|
||||||
workflow: "{project-root}/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml"
|
workflow: "{project-root}/bmad/bmm/workflows/4-implementation/retrospective/workflow.yaml"
|
||||||
data: "{project-root}/bmad/_cfg/agent-party.xml"
|
data: "{project-root}/bmad/_cfg/agent-manifest.csv"
|
||||||
description: Facilitate team retrospective after epic/sprint
|
description: Facilitate team retrospective after epic/sprint
|
||||||
|
|
||||||
- trigger: correct-course
|
- trigger: correct-course
|
||||||
|
|
|
||||||
|
|
@ -26,7 +26,7 @@
|
||||||
- Blockers: {{blockers-from-story}}
|
- Blockers: {{blockers-from-story}}
|
||||||
|
|
||||||
Team assembled based on story participants:
|
Team assembled based on story participants:
|
||||||
{{ List Agents from {project-root}/bmad/_cfg/agent-party.xml }}
|
{{ List Agents from {project-root}/bmad/_cfg/agent-manifest.csv }}
|
||||||
</output>
|
</output>
|
||||||
</step>
|
</step>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,3 +7,8 @@ agents:
|
||||||
- game-designer
|
- game-designer
|
||||||
- game-dev
|
- game-dev
|
||||||
- game-architect
|
- game-architect
|
||||||
|
|
||||||
|
workflows:
|
||||||
|
- brainstorm-game
|
||||||
|
- game-brief
|
||||||
|
- gdd
|
||||||
|
|
|
||||||
|
|
@ -66,7 +66,7 @@ node tools/cli/bundlers/bundle-web.js agent bmm pm # One agent
|
||||||
```bash
|
```bash
|
||||||
npm run bmad:status # Installation status
|
npm run bmad:status # Installation status
|
||||||
npm run validate:bundles # Validate web bundles
|
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
|
### Regenerating Manifests
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Regenerate agent-party.xml for all modules
|
# Regenerate agent-manifest.csv for all modules
|
||||||
node tools/cli/regenerate-manifests.js
|
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 hasPersona = content.includes('<persona>');
|
||||||
const activationBeforePersona = content.indexOf('<activation') < content.indexOf('<persona>');
|
const activationBeforePersona = content.indexOf('<activation') < content.indexOf('<persona>');
|
||||||
const hasManifests =
|
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>');
|
const hasDependencies = content.includes('<dependencies>');
|
||||||
|
|
||||||
console.log(chalk.green('✓ Analyst bundle created successfully'));
|
console.log(chalk.green('✓ Analyst bundle created successfully'));
|
||||||
|
|
|
||||||
|
|
@ -620,8 +620,8 @@ class WebBundler {
|
||||||
}
|
}
|
||||||
processed.add(filePath);
|
processed.add(filePath);
|
||||||
|
|
||||||
// Skip agent-party.xml manifest for web bundles (agents are already bundled)
|
// Skip agent-manifest.csv manifest for web bundles (agents are already bundled)
|
||||||
if (filePath === 'bmad/_cfg/agent-party.xml' || filePath.endsWith('/agent-party.xml')) {
|
if (filePath === 'bmad/_cfg/agent-manifest.csv' || filePath.endsWith('/agent-manifest.csv')) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -1393,8 +1393,8 @@ class WebBundler {
|
||||||
// Ensure temp directory exists
|
// Ensure temp directory exists
|
||||||
await fs.ensureDir(this.tempManifestDir);
|
await fs.ensureDir(this.tempManifestDir);
|
||||||
|
|
||||||
// Generate agent-party.xml using shared generator
|
// Generate agent-manifest.csv using shared generator
|
||||||
const agentPartyPath = path.join(this.tempManifestDir, 'agent-party.xml');
|
const agentPartyPath = path.join(this.tempManifestDir, 'agent-manifest.csv');
|
||||||
await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
|
await AgentPartyGenerator.writeAgentParty(agentPartyPath, this.discoveredAgents, { forWeb: true });
|
||||||
|
|
||||||
console.log(chalk.dim(' ✓ Created temporary manifest files'));
|
console.log(chalk.dim(' ✓ Created temporary manifest files'));
|
||||||
|
|
|
||||||
|
|
@ -912,6 +912,9 @@ class Installer {
|
||||||
* @param {Object} moduleFiles - Module files to install
|
* @param {Object} moduleFiles - Module files to install
|
||||||
*/
|
*/
|
||||||
async installModuleWithDependencies(moduleName, bmadDir, moduleFiles) {
|
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
|
// Use existing module manager for full installation with file tracking
|
||||||
// Note: Module-specific installers are called separately after IDE setup
|
// Note: Module-specific installers are called separately after IDE setup
|
||||||
await this.moduleManager.install(
|
await this.moduleManager.install(
|
||||||
|
|
@ -922,6 +925,7 @@ class Installer {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
skipModuleInstaller: true, // We'll run it later after IDE setup
|
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
|
* @param {Array} agentDetails - Array of agent details
|
||||||
*/
|
*/
|
||||||
async generateAgentManifest(bmadDir, agentDetails) {
|
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 });
|
await AgentPartyGenerator.writeAgentParty(manifestPath, agentDetails, { forWeb: false });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -113,7 +113,7 @@ class ModuleManager {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy module files with filtering
|
// 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
|
// Process agent files to inject activation block
|
||||||
await this.processAgentFiles(targetPath, moduleName);
|
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} sourcePath - Source module path
|
||||||
* @param {string} targetPath - Target 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
|
// Get all files in source
|
||||||
const sourceFiles = await this.getFileList(sourcePath);
|
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) {
|
for (const file of sourceFiles) {
|
||||||
// Skip sub-modules directory - these are IDE-specific and handled separately
|
// Skip sub-modules directory - these are IDE-specific and handled separately
|
||||||
if (file.startsWith('sub-modules/')) {
|
if (file.startsWith('sub-modules/')) {
|
||||||
|
|
@ -255,6 +267,19 @@ class ModuleManager {
|
||||||
continue;
|
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 sourceFile = path.join(sourcePath, file);
|
||||||
const targetFile = path.join(targetPath, file);
|
const targetFile = path.join(targetPath, file);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,7 @@ const fs = require('fs-extra');
|
||||||
|
|
||||||
const AgentPartyGenerator = {
|
const AgentPartyGenerator = {
|
||||||
/**
|
/**
|
||||||
* Generate agent-party.xml content
|
* Generate agent-manifest.csv content
|
||||||
* @param {Array} agentDetails - Array of agent details
|
* @param {Array} agentDetails - Array of agent details
|
||||||
* @param {Object} options - Generation options
|
* @param {Object} options - Generation options
|
||||||
* @returns {string} XML content
|
* @returns {string} XML content
|
||||||
|
|
@ -28,7 +28,7 @@ const AgentPartyGenerator = {
|
||||||
let xmlContent = `<!-- Powered by BMAD-CORE™ -->
|
let xmlContent = `<!-- Powered by BMAD-CORE™ -->
|
||||||
<!-- Agent Manifest - Generated during BMAD ${forWeb ? 'bundling' : 'installation'} -->
|
<!-- Agent Manifest - Generated during BMAD ${forWeb ? 'bundling' : 'installation'} -->
|
||||||
<!-- This file contains a summary of all ${forWeb ? 'bundled' : 'installed'} agents for quick reference -->
|
<!-- 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>
|
<description>
|
||||||
Complete roster of ${forWeb ? 'bundled' : 'installed'} BMAD agents with summarized personas for efficient multi-agent orchestration.
|
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.
|
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 = {}) {
|
async writeAgentParty(filePath, agentDetails, options = {}) {
|
||||||
const content = this.generateAgentParty(agentDetails, options);
|
const content = this.generateAgentParty(agentDetails, options);
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue