Previously, the installer created empty tasks/ directories under
.claude/commands/bmad/{module}/ and attempted to copy task files.
Since getTasksFromDir() filters for .md files only and all actual
tasks are .xml files, these directories remained empty.
Tasks are utility files referenced by agents via exec attributes
(e.g., exec="{project-root}/bmad/core/tasks/workflow.xml") and
should remain in the bmad/ directory - they are not slash commands.
Changes:
- Removed tasks directory creation in module setup
- Removed tasks copying logic (15 lines)
- Removed taskCount from console output
- Removed tasks property from return value
- Removed unused getTasksFromBmad and getTasksFromDir imports
- Updated comment to clarify agents-only installation
Verified: No tasks/ directories created in .claude/commands/bmad/
while task files remain accessible in bmad/core/tasks/
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
BMad CLI Tool
The BMad CLI handles installation and web bundling for the BMAD-METHOD framework. It compiles YAML agents into two distinct formats: IDE-integrated agents (filesystem-aware, customizable) and web bundles (self-contained, dependency-embedded).
Table of Contents
- Overview
- Commands
- Installation System
- Bundling System
- Agent Compilation
- Architecture
- Key Differences: Installation vs Bundling
Overview
The CLI provides two primary functions:
- Installation: Compiles agents from YAML and installs to IDE environments with full customization support
- Bundling: Packages agents and dependencies into standalone web-ready XML files
Both use the same YAML→XML compilation engine but produce different outputs optimized for their environments.
Commands
Installation
# Interactive installation
npm run install:bmad
# Direct CLI usage
node tools/cli/bmad-cli.js install --target /path/to/project --modules bmm,bmb --ides codex
# Flags:
# --target <path> Target project directory
# --modules <list> Comma-separated: bmm, bmb, cis
# --ides <list> Comma-separated IDE codes (see IDE Support)
# --non-interactive Skip all prompts
Bundling
# Bundle all modules
npm run bundle
# Bundle specific items
node tools/cli/bundlers/bundle-web.js all # Everything
node tools/cli/bundlers/bundle-web.js module bmm # One module
node tools/cli/bundlers/bundle-web.js agent bmm pm # One agent
Utilities
npm run bmad:status # Installation status
npm run validate:bundles # Validate web bundles
node tools/cli/regenerate-manifests.js # Regenerate agent-party.xml files
Installation System
The installer is a multi-stage system that handles agent compilation, IDE integration, module configuration, platform-specific behaviors, and manifest generation.
Installation Flow
1. Collect User Input
- Target directory, modules, IDEs
- Custom module configuration (via install-config.yaml)
2. Pre-Installation
- Validate target, check conflicts, backup existing installations
- Resolve module dependencies (4-pass system)
3. Install Core + Modules
- Copy files to {target}/bmad/
- Compile agents: YAML → Markdown/XML (forWebBundle: false)
- Merge customize.yaml files if they exist
- Inject activation blocks based on agent capabilities
4. IDE Integration
- Initialize selected IDE handlers
- Generate IDE-specific artifacts (commands/rules/workflows)
- Execute platform-specific hooks (IDE+module combinations)
5. Generate Manifests
- manifest.yaml (installation metadata)
- workflow-manifest.csv (workflow catalog)
- agent-manifest.csv (agent metadata)
- task-manifest.csv (legacy)
- files-manifest.csv (all files with SHA256 hashes)
6. Validate & Finalize
- Verify file integrity, agent compilation, IDE artifacts
- Display summary and next steps
Output Structure:
{target}/
├── bmad/
│ ├── core/ # Always installed
│ ├── {module}/ # Selected modules
│ │ ├── agents/ # Compiled .md files
│ │ ├── workflows/
│ │ └── config.yaml
│ └── _cfg/ # Manifests
└── .{ide}/ # IDE-specific artifacts
└── ... # Format varies by IDE
IDE Support
The installer supports 14 IDE environments through a base-derived architecture. Each IDE handler extends BaseIDE and implements IDE-specific artifact generation.
Supported IDEs (as of v6-alpha):
| Code | Name | Artifact Location |
|---|---|---|
codex |
Claude Code | .claude/commands/ |
claude-code |
Claude Code (alt) | .claude/commands/ |
windsurf |
Windsurf | .windsurf/workflows/ |
cursor |
Cursor | .cursor/rules/ |
cline |
Cline | .clinerules/ |
github-copilot |
GitHub Copilot | .github/copilot/ |
crush |
Crush | .crush/ |
auggie |
Auggie | .auggie/ |
gemini |
Google Gemini | .gemini/ |
qwen |
Qwen | .qwen/ |
roo |
Roo | .roo/ |
trae |
Trae | .trae/ |
iflow |
iFlow | .iflow/ |
kilo |
Kilo | .kilo/ |
Handler Architecture:
- Base class:
tools/cli/installers/lib/ide/_base-ide.js - Handler implementations:
tools/cli/installers/lib/ide/{ide-code}.js - Dynamic discovery: IDE manager scans directory and auto-registers handlers
- Each handler implements:
setup(),createArtifacts(),cleanup(),getAgentsFromBmad()
Adding New IDE Support:
- Create handler file:
tools/cli/installers/lib/ide/your-ide.js - Extend
BaseIDE, setideCode,ideName,artifactType - Implement artifact generation methods
- IDE auto-discovered on next run
Custom Module Configuration
Modules define interactive configuration menus via install-config.yaml files in their _module-installer/ directories.
Config File Location:
- Core:
src/core/_module-installer/install-config.yaml - Modules:
src/modules/{module}/_module-installer/install-config.yaml
Configuration Types:
select: Radio button choicesmultiselect: Checkboxesinput: Text input with validationconfirm: Yes/no
Variable Substitution:
{project-root}→ Absolute target path{directory_name}→ Project directory basename{module}→ Current module name{value:config_id}→ Reference another config value
Config Persistence:
- Values saved to module's
config.yaml - Existing values detected on reinstall
- User prompted: "Use existing or change?"
Processor: tools/cli/installers/lib/core/config-collector.js
Platform Specifics
Platform specifics are IDE+module combination hooks that execute custom logic when specific IDE and module are installed together.
Two-Layer Architecture:
-
Module-Level:
src/modules/{module}/_module-installer/platform-specifics/{ide}.js- Module provides custom behavior for specific IDEs
- Example: BMM creates subagents when installed with Claude Code
-
IDE-Level: Embedded in IDE handler's
createArtifacts()method- IDE provides custom handling for specific modules
- Example: Windsurf configures cascade workflows for BMM
Execution Timing: After standard installation, before validation
Common Use Cases:
- Creating subagent variations (PM-technical, PM-market)
- Configuring IDE-specific workflow integrations
- Adding custom commands or rules based on module features
- Adjusting UI/UX for module-specific patterns
Platform Registry: tools/cli/installers/lib/ide/shared/platform-codes.js
Manifest System
The installer generates 5 manifest files in {target}/bmad/_cfg/:
1. Installation Manifest (manifest.yaml)
- Installation metadata: version, timestamps, target directory
- Installed modules and versions
- Integrated IDEs and their configurations
- User configuration values
2. Workflow Manifest (workflow-manifest.csv)
- Columns: module, workflow_path, workflow_name, description, scale_level
- Used by workflow command generators
- RFC 4180 compliant CSV format
3. Agent Manifest (agent-manifest.csv)
- Columns: module, agent_path, agent_name, role, identity_summary, communication_style, expertise, approach, responsibilities, workflows
- 10-column metadata for each agent
- Used by IDE integrations and documentation
4. Task Manifest (task-manifest.csv)
- Legacy compatibility (deprecated in v6)
- Columns: module, task_path, task_name, objective, agent
5. Files Manifest (files-manifest.csv)
- Complete file tracking with SHA256 hashes
- Columns: file_path, file_type, module, hash
- Enables integrity validation and change detection
Generator: tools/cli/installers/lib/core/manifest-generator.js
Use Cases:
- Update detection (compare current vs manifest hashes)
- Workflow command generation for IDEs
- Installation validation and integrity checks
- Rollback capability
Advanced Features
Dependency Resolution (4-Pass System):
- Pass 1: Explicit dependencies from module metadata
- Pass 2: Template references in workflows
- Pass 3: Cross-module workflow/agent references
- Pass 4: Transitive dependencies
Agent Activation Injection:
- Detects which handlers each agent uses (workflow, exec, tmpl, data, action)
- Injects only needed handler fragments from
src/utility/models/fragments/ - Keeps compiled agents lean and purpose-built
Module Injection System:
- Conditional content injection based on user config
- Can inject menu items, text blocks, workflow steps
- File:
tools/cli/installers/lib/ide/shared/module-injections.js
Conflict Resolution:
- Detects existing installations
- Options: Update (preserve customizations), Backup (timestamp), Cancel
- Auto-backup to
.bmad-backup-{timestamp}if selected
Workflow Command Auto-Generation:
- Reads workflow-manifest.csv
- Generates IDE commands for each workflow
- IDE-specific formatting (Claude Code .md, Windsurf YAML, etc.)
Validation & Integrity:
- Verifies all manifest files exist
- Validates file hashes against files-manifest.csv
- Checks agent compilation completeness
- Confirms IDE artifacts created
Bundling System
Web bundling creates self-contained XML packages with all dependencies embedded for web deployment.
Bundling Flow
1. Discover modules and agents from src/modules/
2. For each agent:
- Compile with YamlXmlBuilder (forWebBundle: true)
- Use web-bundle-activation-steps.xml fragment
- Resolve ALL dependencies recursively:
- Scan menu items for workflow references
- Load workflows → extract web_bundle section
- Find all file references (templates, data, sub-workflows)
- Wrap each in <file id="path"><![CDATA[...]]></file>
- Build consolidated bundle: agent + all deps
3. Output to: web-bundles/{module}/agents/{name}.xml
Key Differences from Installation:
- No customize.yaml merging (base agents only)
- No metadata (reduces file size)
- All dependencies bundled inline (no filesystem access)
- Uses web-specific activation fragment
- Output: Standalone XML files
Output Structure:
web-bundles/
├── bmm/
│ ├── agents/
│ │ ├── pm.xml
│ │ ├── architect.xml
│ │ ├── sm.xml
│ │ └── dev.xml
│ └── teams/
│ └── dev-team.xml
├── bmb/
│ └── agents/
│ └── bmad-builder.xml
└── cis/
└── agents/
└── creative-director.xml
Bundler: tools/cli/bundlers/web-bundler.js
Agent Compilation
Both installation and bundling use the same YAML→XML compiler with different configurations.
Compilation Engine
Core File: tools/cli/lib/yaml-xml-builder.js
Process:
- Load YAML agent definition
- Merge with customize.yaml (installation only)
- Analyze agent to detect required handlers
- Build activation block:
- IDE: Uses
activation-steps.xml(filesystem-aware) - Web: Uses
web-bundle-activation-steps.xml(bundled files)
- IDE: Uses
- Convert to XML structure
- Output as markdown (IDE) or standalone XML (web)
Key Option Flags:
forWebBundle: true- Use web activation, omit metadataincludeMetadata: true- Include build hash (IDE only)skipActivation: true- Omit activation (team bundles)
Fragment System
Reusable XML fragments in src/utility/models/fragments/:
activation-steps.xml- IDE activation (loads config.yaml at runtime)web-bundle-activation-steps.xml- Web activation (uses bundled files)activation-rules.xml- Validation rules (IDE only)menu-handlers.xml- Menu handler wrapperhandler-workflow.xml- Workflow handlerhandler-exec.xml- Exec command handlerhandler-tmpl.xml- Template handlerhandler-data.xml- Data handlerhandler-action.xml- Action handler
Dynamic Injection: Agent analyzer detects which handlers are used, activation builder injects only those fragments.
Input: Agent YAML
agent:
metadata:
id: 'bmad/bmm/agents/pm.md'
name: 'PM'
title: 'Product Manager'
persona:
role: 'Product Manager'
identity: 'You are an experienced PM...'
menu:
- trigger: '*create-brief'
workflow: '{project-root}/bmad/bmm/workflows/.../workflow.yaml'
Output: IDE (Markdown with XML)
<!-- Powered by BMAD-CORE™ -->
# Product Manager
```xml
<agent id="..." name="PM">
<activation critical="MANDATORY">
<step n="2">Load {project-root}/bmad/bmm/config.yaml at runtime</step>
...
</activation>
<persona>...</persona>
<menu>...</menu>
</agent>
```
### Output: Web (Standalone XML)
```xml
<agent id="..." name="PM">
<activation critical="MANDATORY">
<step n="2">All dependencies bundled inline below</step>
...
</activation>
<persona>...</persona>
<menu>...</menu>
<bundled-files>
<file id="bmad/bmm/config.yaml"><![CDATA[...]]></file>
<file id="bmad/bmm/workflows/.../workflow.yaml"><![CDATA[...]]></file>
...
</bundled-files>
</agent>
Architecture
Directory Structure
tools/cli/
├── bmad-cli.js # Main CLI entry
├── commands/ # CLI command handlers
│ ├── install.js
│ ├── status.js
│ ├── list.js
│ ├── update.js
│ └── uninstall.js
├── bundlers/ # Web bundling
│ ├── bundle-web.js # CLI entry
│ └── web-bundler.js # WebBundler class
├── installers/
│ └── lib/
│ ├── core/ # Core installer logic
│ │ ├── installer.js
│ │ ├── manifest-generator.js
│ │ ├── manifest.js
│ │ ├── dependency-resolver.js
│ │ ├── config-collector.js
│ │ └── csv-parser.js
│ ├── modules/ # Module processing
│ │ └── manager.js
│ └── ide/ # IDE integrations
│ ├── _base-ide.js
│ ├── {14 IDE handlers}.js
│ ├── manager.js
│ └── shared/
│ ├── bmad-artifacts.js
│ ├── platform-codes.js
│ ├── module-injections.js
│ └── workflow-command-generator.js
├── lib/ # Shared compilation
│ ├── yaml-xml-builder.js # YAML→XML compiler
│ ├── activation-builder.js # Activation generator
│ ├── agent-analyzer.js # Handler detection
│ ├── xml-handler.js # Builder wrapper
│ └── paths.js
├── regenerate-manifests.js
└── test-yaml-builder.js
Fragment Library
src/utility/models/fragments/
├── activation-steps.xml
├── web-bundle-activation-steps.xml
├── activation-rules.xml
├── menu-handlers.xml
└── handler-*.xml # 5 handler types
Key Differences: Installation vs Bundling
| Aspect | Installation (IDE) | Bundling (Web) |
|---|---|---|
| Trigger | npm run install:bmad |
npm run bundle |
| Entry Point | commands/install.js |
bundlers/bundle-web.js |
| Compiler Flag | forWebBundle: false |
forWebBundle: true |
| Output Format | Markdown .md |
Standalone XML .xml |
| Output Location | {target}/bmad/ + IDE dirs |
web-bundles/ |
| Customization | Merges customize.yaml |
Base agents only |
| Dependencies | Referenced by path | Bundled inline (CDATA) |
| Activation Fragment | activation-steps.xml |
web-bundle-activation-steps.xml |
| Filesystem Access | Required | Not needed |
| Build Metadata | Included (hash) | Excluded |
| Path Format | {project-root} placeholders |
Stripped, wrapped as <file> |
| Use Case | Local IDE development | Web deployment |
Activation Differences:
- IDE: Loads config.yaml at runtime from filesystem
- Web: Accesses bundled content via
<file id>references
Development Workflows
Testing Compilation
# Test YAML→XML compiler
node tools/cli/test-yaml-builder.js
# Test installation
node tools/cli/bmad-cli.js install --target ./test-project --modules bmm --ides codex
# Test bundling
node tools/cli/bundlers/bundle-web.js agent bmm pm
# Validate bundles
npm run validate:bundles
Adding New Menu Handlers
To add a new handler type (e.g., validate-workflow):
- Create fragment:
src/utility/models/fragments/handler-validate-workflow.xml - Update
agent-analyzer.jsto detect the new attribute - Update
activation-builder.jsto load/inject the fragment - Test with an agent using the handler
Regenerating Manifests
# Regenerate agent-party.xml for all modules
node tools/cli/regenerate-manifests.js
# Location: src/modules/{module}/agents/agent-party.xml
Related Documentation
- Project Guide:
CLAUDE.md - BMM Workflows:
src/modules/bmm/workflows/README.md - Module Structure:
src/modules/bmb/workflows/create-module/module-structure.md - Agent Creation:
src/modules/bmb/workflows/create-agent/README.md
Support
- Issues: https://github.com/bmad-code-org/BMAD-METHOD/issues
- Discord: https://discord.gg/gk8jAdXWmj (#general-dev, #bugs-issues)
- YouTube: https://www.youtube.com/@BMadCode