← Wiki

BMAD-METHOD v6 — Agents-as-Skills

Repo: bmad-code-org/BMAD-METHOD · npm bmad-method · MIT.

The Breakthrough Method for Agile AI-Driven Development. v6 is a full Claude Code plugin where everything is a skill — including agents. Worth studying as a more disciplined sibling of solo-factory and other executable skill systems.

The Core Insight

Most plugins keep agents and skills as two separate primitives (own .claude/agents/, own loading rules, own prompt format). BMAD collapses them: an agent is just a skill that activates a persona and presents a menu of other skills to dispatch into.

src/bmm-skills/4-implementation/
├── bmad-agent-dev/         ← agent-skill (persona + menu)
├── bmad-dev-story/         ← workflow-skill (one process)
├── bmad-code-review/
└── bmad-sprint-planning/

Both kinds share the same shape: SKILL.md + customize.toml + optional refs/checklists. The difference is which top-level block lives in TOML — [agent] vs [workflow].

Agent-Skill Anatomy

bmad-agent-dev/customize.toml (excerpt):

[agent]
name = "Amelia"
title = "Senior Software Engineer"
icon = "💻"
role = "Implement approved stories with test-first discipline..."
identity = "Disciplined in Kent Beck's TDD..."
communication_style = "Ultra-succinct. File paths and AC IDs only."
principles = [
  "No task complete without passing tests.",
  "Red, green, refactor — in that order.",
]
persistent_facts = ["file:{project-root}/**/project-context.md"]

[agent.menu](/wiki/agent.menu)
code = "DS"
description = "Write the next story's tests and code"
skill = "bmad-dev-story"

[agent.menu](/wiki/agent.menu)
code = "CR"
skill = "bmad-code-review"

On activation, SKILL.md greets with the icon, loads persistent facts, renders the menu as a numbered table, and dispatches on code/number/fuzzy match into the referenced skill. Persona survives the dispatch — Amelia’s icon and tone carry through bmad-dev-story execution.

This is menu-driven sub-skill orchestration without the framework boilerplate.

Three-Layer TOML Customization

Every skill resolves config through this chain:

  1. {skill-root}/customize.toml — defaults (overwritten on update; do not edit)
  2. {project-root}/_bmad/custom/{skill-name}.toml — team overrides
  3. {project-root}/_bmad/custom/{skill-name}.user.toml — personal overrides

Merge rules are explicit:

Resolved by python3 _bmad/scripts/resolve_customization.py --skill … --key agent. If the script fails, SKILL.md instructs the agent to merge by the same rules itself — graceful degradation built into the prompt.

This is what project-solo-factory is missing: a clean override layer so users can tweak principles or swap a menu item without forking the skill.

Persistent Facts with file: Prefix

persistent_facts = [
  "Our org is AWS-only — do not propose GCP or Azure.",
  "file:{project-root}/docs/standards.md",
  "file:{project-root}/**/project-context.md",
]

A clean way to inject static context at activation. Literals are loaded verbatim; file: entries (globs supported) get their contents inlined as facts. Distinct from runtime memory sidecar — these are loaded once per session.

Catalog-Driven Help Router

bmad-help skill is interesting on its own. It reads _bmad/_config/bmad-help.csv:

module,skill,display-name,menu-code,description,action,args,
phase,preceded-by,followed-by,required,output-location,outputs

Then it scans the resolved output-location paths with the outputs glob patterns to detect what artifacts already exist, and recommends the next step based on phase + preceded-by/followed-by chains + required gates.

Compared to project-solo-factory’s markdown routing.md (read by humans, not parsed), this is machine-readable navigation that grounds in actual filesystem state. The skill literally answers “where am I in the workflow?” by looking at what files exist.

Module System

Phases live as numbered folders inside a module:

src/bmm-skills/
├── module.yaml           ← agent roster (essence only) + config schema
├── module-help.csv       ← help router catalog
├── 1-analysis/
├── 2-plan-workflows/
├── 3-solutioning/
└── 4-implementation/

module.yaml keeps the agent roster (code, name, title, icon, one-line description) — read by bmad-help, party-mode, retrospective for routing and display. Full persona lives in each agent-skill’s customize.toml. Clean separation: roster = directory; behavior = skill.

Other modules (Test Architect, Game Dev Studio, Creative Intelligence Suite) plug in the same way.

Plugin Composition

.claude-plugin/marketplace.json ships two plugins from one repo:

Letting users adopt the toolkit progressively rather than all-or-nothing.

What’s Worth Stealing for solo-factory

BMAD pattern What project-solo-factory has now Gap
Agent = skill with [agent] block + menu Agents in .claude/agents/ separate from skills Two primitives, no menu dispatch
TOML 3-layer merge with explicit rules Single SKILL.md, no override surface Users fork to customize
persistent_facts with file: glob Ad-hoc context loading Inconsistent across skills
CSV catalog + filesystem scan for “where am I” Markdown rules/routing.md Routing isn’t grounded in actual state
Phase-numbered module folders Flat skills directory Order in docs only, not structure
module.yaml agent roster (essence only) No equivalent Persona/dispatch info scattered

The biggest concrete win would be adopting the TOML override layer — it’s a small change (skill stays a single file otherwise) that unlocks team/user customization without forking.

Related

Related