Simplify agent configurations and fix team bundle builds
Major refactoring to streamline agent configuration structure and improve build reliability: Agent Configuration Simplification: - Remove environment sections from all agent YAML files - Add single 'persona' property to agent configs pointing to persona file - All agents now use consistent, simplified structure without web/ide environment splits - Fix dev agent to be available for web environment (was causing team-dev bundle build failure) Build System Updates: - Update dependency-resolver.js to use new persona property instead of environments.web.persona_file - Update bundle-optimizer.js to load personas using agent's persona property - Remove environment availability checks since all agents are now web-compatible - Change output directory from dist/web/bundles/ to dist/web/teams/ for clarity File Organization: - Move IDE-specific personas (dev.ide.md, devops-pe.ide.md, sm.ide.md) to bmad-core/ide-agents/ - Rename team bundles for clarity: - team-full.yml → team-full-app.yml (web application teams) - team-planning.yml → team-small-service.yml (backend service teams) - Remove team-full-ide.yml (IDE teams will be handled separately) This change ensures all 3 web team bundles build successfully and simplifies future agent maintenance. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,10 @@
|
||||
# Analyst Agent Configuration
|
||||
|
||||
agent:
|
||||
name: Mary
|
||||
id: analyst
|
||||
version: 1.0.0
|
||||
title: Analyst
|
||||
description: Project Analyst and Brainstorming Coach
|
||||
persona: analyst
|
||||
customize: >-
|
||||
You are a bit of a know-it-all, and like to verbalize and emote as if you were a physical
|
||||
person.
|
||||
@@ -17,10 +16,3 @@ dependencies:
|
||||
- project-brief-tmpl
|
||||
checklists: []
|
||||
data: []
|
||||
environments:
|
||||
ide:
|
||||
persona_file: analyst
|
||||
command_prefix: '*'
|
||||
web:
|
||||
persona_file: analyst
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
# Architect Agent Configuration
|
||||
|
||||
agent:
|
||||
name: Fred
|
||||
id: architect
|
||||
version: 1.0.0
|
||||
title: Architect
|
||||
description: For system architecture, technical design, architecture checklists.
|
||||
customize: ''
|
||||
persona: architect
|
||||
customize: ""
|
||||
dependencies:
|
||||
tasks:
|
||||
- create-architecture
|
||||
@@ -21,10 +20,3 @@ dependencies:
|
||||
- architect-checklist
|
||||
data:
|
||||
- technical-preferences
|
||||
environments:
|
||||
ide:
|
||||
persona_file: architect
|
||||
command_prefix: '*'
|
||||
web:
|
||||
persona_file: architect
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,5 +1,4 @@
|
||||
# BMAD Agent Configuration
|
||||
# ONLY agent with bmad-kb access
|
||||
|
||||
agent:
|
||||
name: BMAD
|
||||
@@ -7,6 +6,7 @@ agent:
|
||||
version: 1.0.0
|
||||
title: BMAD
|
||||
description: For general BMAD Method or Agent queries, oversight, or advice and guidance when unsure.
|
||||
persona: bmad
|
||||
customize: >-
|
||||
Helpful, hand holding level guidance when needed. Loves the BMad Method and will help you
|
||||
customize and use it to your needs, which also orchestrating and ensuring the agents he becomes
|
||||
@@ -19,10 +19,3 @@ dependencies:
|
||||
- bmad-kb
|
||||
utils:
|
||||
- orchestrator-commands
|
||||
environments:
|
||||
ide:
|
||||
persona_file: bmad
|
||||
command_prefix: '*'
|
||||
web:
|
||||
persona_file: bmad
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
# Design Architect Agent Configuration
|
||||
|
||||
agent:
|
||||
name: Jane
|
||||
id: design-architect
|
||||
version: 1.0.0
|
||||
title: Design Architect
|
||||
description: For UI/UX specifications, front-end architecture, and UI 1-shot prompting.
|
||||
customize: ''
|
||||
persona: design-architect
|
||||
customize: ""
|
||||
dependencies:
|
||||
tasks:
|
||||
- create-frontend-architecture
|
||||
@@ -19,10 +18,3 @@ dependencies:
|
||||
- frontend-architecture-checklist
|
||||
data:
|
||||
- technical-preferences
|
||||
environments:
|
||||
ide:
|
||||
persona_file: design-architect
|
||||
command_prefix: '*'
|
||||
web:
|
||||
persona_file: design-architect
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
# Full Stack Dev Agent Configuration
|
||||
|
||||
agent:
|
||||
name: James
|
||||
id: dev
|
||||
version: 1.0.0
|
||||
title: Full Stack Dev
|
||||
description: Master Generalist Expert Senior Senior Full Stack Developer
|
||||
customize: ''
|
||||
persona: dev
|
||||
customize: ""
|
||||
dependencies:
|
||||
tasks: []
|
||||
templates: []
|
||||
@@ -14,13 +13,3 @@ dependencies:
|
||||
- story-dod-checklist
|
||||
data:
|
||||
- technical-preferences
|
||||
environments:
|
||||
ide:
|
||||
persona_file: dev.ide.md
|
||||
command_prefix: '*'
|
||||
supports_file_operations: true
|
||||
ide_only: true
|
||||
web:
|
||||
persona_file: dev
|
||||
command_prefix: /
|
||||
available: false
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# Platform Engineer Agent Configuration
|
||||
|
||||
agent:
|
||||
name: Alex
|
||||
id: devops
|
||||
@@ -10,6 +8,7 @@ agent:
|
||||
have the production environment as resilient and reliable for the customer as possible. He is a
|
||||
Master Expert Senior Platform Engineer with 15+ years of experience in DevSecOps, Cloud
|
||||
Engineering, and Platform Engineering with a deep, profound knowledge of SRE.
|
||||
persona: devops
|
||||
customize: >-
|
||||
Specialized in cloud-native system architectures and tools, like Kubernetes, Docker, GitHub
|
||||
Actions, CI/CD pipelines, and infrastructure-as-code practices (e.g., Terraform, CloudFormation,
|
||||
@@ -25,13 +24,3 @@ dependencies:
|
||||
- infrastructure-checklist
|
||||
data:
|
||||
- technical-preferences
|
||||
environments:
|
||||
ide:
|
||||
persona_file: devops-pe.ide
|
||||
command_prefix: '*'
|
||||
supports_file_operations: true
|
||||
ide_only: true
|
||||
web:
|
||||
persona_file: devops
|
||||
command_prefix: /
|
||||
available: false
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# Product Manager Agent Configuration
|
||||
|
||||
agent:
|
||||
name: John
|
||||
id: pm
|
||||
@@ -8,7 +6,8 @@ agent:
|
||||
description: >-
|
||||
Main goal is to help produce or maintain the best possible PRD and represent the end user the
|
||||
product will serve.
|
||||
customize: ''
|
||||
persona: pm
|
||||
customize: ""
|
||||
dependencies:
|
||||
tasks:
|
||||
- create-doc-from-template
|
||||
@@ -21,10 +20,3 @@ dependencies:
|
||||
- change-checklist
|
||||
data:
|
||||
- technical-preferences
|
||||
environments:
|
||||
ide:
|
||||
persona_file: pm
|
||||
command_prefix: '*'
|
||||
web:
|
||||
persona_file: pm
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
# PO Agent Configuration
|
||||
|
||||
agent:
|
||||
name: Sarah
|
||||
id: po
|
||||
@@ -8,7 +6,8 @@ agent:
|
||||
description: >-
|
||||
Product Owner helps validate the artifacts are all cohesive with a master checklist, and also
|
||||
helps coach significant changes
|
||||
customize: ''
|
||||
persona: po
|
||||
customize: ""
|
||||
dependencies:
|
||||
tasks:
|
||||
- checklist-run-task
|
||||
@@ -20,10 +19,3 @@ dependencies:
|
||||
- po-master-checklist
|
||||
- change-checklist
|
||||
data: []
|
||||
environments:
|
||||
ide:
|
||||
persona_file: po
|
||||
command_prefix: '*'
|
||||
web:
|
||||
persona_file: po
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,12 +1,11 @@
|
||||
# SM Agent Configuration
|
||||
|
||||
agent:
|
||||
name: Bob
|
||||
id: sm
|
||||
version: 1.0.0
|
||||
title: SM
|
||||
description: A very Technical Scrum Master helps the team run the Scrum process.
|
||||
customize: ''
|
||||
persona: sm
|
||||
customize: ""
|
||||
dependencies:
|
||||
tasks:
|
||||
- create-next-story-task
|
||||
@@ -15,11 +14,3 @@ dependencies:
|
||||
checklists:
|
||||
- story-draft-checklist
|
||||
data: []
|
||||
environments:
|
||||
ide:
|
||||
persona_file: sm
|
||||
command_prefix: '*'
|
||||
has_specialized_version: true
|
||||
web:
|
||||
persona_file: sm
|
||||
command_prefix: /
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
# Development Team Bundle
|
||||
|
||||
bundle:
|
||||
name: Development Team Bundle
|
||||
filename: team-dev-bundle.txt
|
||||
filename: team-dev.txt
|
||||
target_environment: web
|
||||
|
||||
agents:
|
||||
- bmad
|
||||
- po
|
||||
- sm
|
||||
- sm
|
||||
- dev
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
# Full Team Bundle
|
||||
|
||||
bundle:
|
||||
name: Full Team Bundle
|
||||
filename: team-full-bundle.txt
|
||||
filename: team-full.txt
|
||||
target_environment: web
|
||||
|
||||
agents:
|
||||
@@ -12,4 +10,4 @@ agents:
|
||||
- architect
|
||||
- design-architect
|
||||
- po
|
||||
- sm
|
||||
- sm
|
||||
@@ -1,17 +0,0 @@
|
||||
# Full IDE Team Bundle
|
||||
|
||||
bundle:
|
||||
name: Full IDE Team Bundle
|
||||
filename: team-full-ide
|
||||
target_environment: ide
|
||||
|
||||
agents:
|
||||
- bmad
|
||||
- analyst
|
||||
- pm
|
||||
- architect
|
||||
- design-architect
|
||||
- po
|
||||
- sm
|
||||
- dev
|
||||
- devops
|
||||
@@ -1,12 +1,10 @@
|
||||
# Planning Team Bundle
|
||||
|
||||
bundle:
|
||||
name: Planning Team Bundle
|
||||
filename: team-planning-bundle.txt
|
||||
filename: team-backend-planning.txt
|
||||
target_environment: web
|
||||
|
||||
agents:
|
||||
- bmad
|
||||
- analyst
|
||||
- pm
|
||||
- architect
|
||||
- architect
|
||||
@@ -1,12 +1,3 @@
|
||||
# User-Defined Preferred Patterns and Preferences
|
||||
|
||||
List out your preferred:
|
||||
- technical preferences
|
||||
- design patterns
|
||||
- languages
|
||||
- framework
|
||||
- etc...
|
||||
|
||||
Anything you learn or prefer over time to drive future project choices, add them here.
|
||||
|
||||
These will be used by the agents when producing PRD and Architectures
|
||||
None Listed
|
||||
|
||||
@@ -18,7 +18,8 @@ When these commands are used, perform the listed action:
|
||||
## Agent-Specific Commands
|
||||
|
||||
The `/{agent}` command switches to any agent included in the bundle. The command accepts either:
|
||||
|
||||
- The agent's role identifier (e.g., `/pm`, `/architect`, `/dev`)
|
||||
- The agent's configured name (e.g., `/john` if PM is named John, `/fred` if Architect is named Fred)
|
||||
|
||||
The BMAD orchestrator determines available agents from the bundle configuration at runtime.
|
||||
The BMAD orchestrator determines available agents from the bundle configuration at runtime.
|
||||
|
||||
@@ -118,14 +118,14 @@ class WebBuilder {
|
||||
}
|
||||
|
||||
// Write output files
|
||||
const outputDir = path.join(this.outputPath, 'bundles');
|
||||
const outputDir = path.join(this.outputPath, 'teams');
|
||||
this.ensureDirectory(outputDir);
|
||||
|
||||
const outputs = [];
|
||||
|
||||
// Default to single_file format if not specified
|
||||
const outputFormat = bundleConfig.output?.format || 'single_file';
|
||||
const outputFilename = bundleConfig.output?.filename || bundleConfig.filename || `${bundleConfig.name.toLowerCase().replace(/\s+/g, '-')}-bundle.txt`;
|
||||
const outputFilename = bundleConfig.output?.filename || bundleConfig.filename || `${bundleConfig.name.toLowerCase().replace(/\s+/g, '-')}.txt`;
|
||||
|
||||
if (outputFormat === 'single_file') {
|
||||
// Create single bundle file
|
||||
@@ -160,7 +160,7 @@ class WebBuilder {
|
||||
const outputDir = path.join(this.outputPath, 'agents');
|
||||
this.ensureDirectory(outputDir);
|
||||
|
||||
const agentFile = path.join(outputDir, `${agentId}-agent-bundle.txt`);
|
||||
const agentFile = path.join(outputDir, `${agentId}.txt`);
|
||||
fs.writeFileSync(agentFile, optimizedBundle.standaloneContent);
|
||||
|
||||
return {
|
||||
@@ -208,7 +208,7 @@ class WebBuilder {
|
||||
*/
|
||||
createOrchestratorFiles(bundle, config) {
|
||||
const files = [];
|
||||
const outputDir = path.join(this.outputPath, 'bundles');
|
||||
const outputDir = path.join(this.outputPath, 'teams');
|
||||
|
||||
// Create agent-config.txt
|
||||
const agentConfigContent = yaml.dump({
|
||||
@@ -368,7 +368,7 @@ class WebBuilder {
|
||||
*/
|
||||
ensureOutputDirectory() {
|
||||
this.ensureDirectory(this.outputPath);
|
||||
this.ensureDirectory(path.join(this.outputPath, 'bundles'));
|
||||
this.ensureDirectory(path.join(this.outputPath, 'teams'));
|
||||
this.ensureDirectory(path.join(this.outputPath, 'agents'));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,7 +49,7 @@ class BundleOptimizer {
|
||||
});
|
||||
|
||||
// Load and process resources
|
||||
this.loadResources(optimizedBundle, agentDependencies.bundleResources);
|
||||
this.loadResources(optimizedBundle, agentDependencies.bundleResources, agentDependencies.agents);
|
||||
|
||||
// Create optimized sections for web output
|
||||
if (bundleConfig.target_environment === 'web') {
|
||||
@@ -65,7 +65,7 @@ class BundleOptimizer {
|
||||
/**
|
||||
* Load resources from core directory
|
||||
*/
|
||||
loadResources(bundle, resourceLists) {
|
||||
loadResources(bundle, resourceLists, agentDeps = []) {
|
||||
const resourceTypes = ['tasks', 'templates', 'checklists', 'data', 'utils'];
|
||||
|
||||
resourceTypes.forEach(type => {
|
||||
@@ -85,11 +85,13 @@ class BundleOptimizer {
|
||||
|
||||
// Load personas for agents
|
||||
const personaDir = path.join(this.corePath, 'personas');
|
||||
Object.keys(bundle.agents).forEach(agentId => {
|
||||
const personaContent = this.loadResourceFile(personaDir, agentId);
|
||||
agentDeps.forEach(agentDep => {
|
||||
const agentId = agentDep.agent;
|
||||
const personaName = agentDep.config.persona || agentId;
|
||||
const personaContent = this.loadResourceFile(personaDir, personaName);
|
||||
if (personaContent) {
|
||||
bundle.resources.personas[agentId] = {
|
||||
name: agentId,
|
||||
name: personaName,
|
||||
content: personaContent,
|
||||
size: personaContent.length
|
||||
};
|
||||
@@ -202,7 +204,9 @@ class BundleOptimizer {
|
||||
content += `${agent.description}\n\n`;
|
||||
|
||||
if (persona) {
|
||||
content += `## Agent Persona\n\n${persona.content}\n\n`;
|
||||
content += `==================== START: personas#${agentId} ====================\n`;
|
||||
content += `${persona.content}\n`;
|
||||
content += `==================== END: personas#${agentId} ====================\n\n`;
|
||||
}
|
||||
|
||||
// Add required resources inline
|
||||
@@ -210,9 +214,10 @@ class BundleOptimizer {
|
||||
resourceTypes.forEach(type => {
|
||||
const resources = bundle.resources[type];
|
||||
if (Object.keys(resources).length > 0) {
|
||||
content += `## ${type.charAt(0).toUpperCase() + type.slice(1)}\n\n`;
|
||||
Object.entries(resources).forEach(([name, resource]) => {
|
||||
content += `### ${name}\n\n${resource.content}\n\n`;
|
||||
content += `==================== START: ${type}#${name} ====================\n`;
|
||||
content += `${resource.content}\n`;
|
||||
content += `==================== END: ${type}#${name} ====================\n\n`;
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -39,9 +39,6 @@ class DependencyResolver {
|
||||
if (rawConfig.dependencies) {
|
||||
config.dependencies = rawConfig.dependencies;
|
||||
}
|
||||
if (rawConfig.environments) {
|
||||
config.environments = rawConfig.environments;
|
||||
}
|
||||
|
||||
// Validate required fields
|
||||
this.validateAgentConfig(config, agentId);
|
||||
@@ -66,9 +63,10 @@ class DependencyResolver {
|
||||
throw new Error(`Agent ID mismatch: expected '${agentId}', got '${config.id}'`);
|
||||
}
|
||||
|
||||
// Ensure environments exist with defaults
|
||||
if (!config.environments) {
|
||||
config.environments = { web: {}, ide: {} };
|
||||
// Ensure persona exists
|
||||
if (!config.persona) {
|
||||
// Default to agent id if no persona specified
|
||||
config.persona = config.id;
|
||||
}
|
||||
|
||||
// Ensure dependencies exist with defaults
|
||||
@@ -87,11 +85,6 @@ class DependencyResolver {
|
||||
*/
|
||||
resolveAgentDependencies(agentId, environment = 'web') {
|
||||
const config = this.loadAgentConfig(agentId);
|
||||
|
||||
// Check if agent is available for this environment
|
||||
if (environment === 'web' && config.environments.web?.available === false) {
|
||||
throw new Error(`Agent '${agentId}' is not available for web environment`);
|
||||
}
|
||||
|
||||
const dependencies = {
|
||||
agent: agentId,
|
||||
|
||||
Reference in New Issue
Block a user