Browse the documentation

Project layout

Every folder and file BMAD+ creates in a project and on your machine, which command creates it, and whether it is yours to edit, BMAD+’s to manage, or state to leave alone.

On this page
  1. The map
  2. Who owns what
  3. What to put under version control
  4. What uninstall removes and keeps
  5. Example

BMAD+ writes into a handful of well-named places, and nothing else. Knowing which is which answers the three practical questions: what can I edit, what should I commit, and what is removed if I uninstall. This page maps them all.

The map

A project with several packs after some use (folders appear as the commands that create them are run)
your-project/
├── AGENTS.md                      common spine for every assistant
├── CLAUDE.md, GEMINI.md, ...      one adapter per selected tool
├── .agents/
│   ├── skills/                    agents, packs and skills (agent-*, pack-*, bmad-plus-*, ...)
│   ├── data/role-triggers.yaml    auto-activation rules
│   └── memory/                    project memory (Memory pack)
├── _bmad/
│   ├── config.yaml                your settings
│   ├── module.yaml, module-help.csv
│   ├── .bmad-plus-install.json    install manifest (ownership hashes)
│   └── update-policy.json         only after update-policy
├── _bmad-output/                  deliverables written by agents and commands
│   ├── discovery/  build/         created by install
│   └── uat/  review/  assurance/  design/  dev-studio/  osint-reports/  ready-to-integrate/
├── .bmad/                         local state: caches, locks, receipts, journals, Python environments
├── .bmad-plus/                    durable run state: swarm/ and nexus/
├── docs/                          created empty by install
└── backups/                       only with the Backup pack

Who owns what

Ownership is recorded, not guessed. At install, BMAD+ stores a content hash for every file it copies under .agents/ and for _bmad/module.yaml and _bmad/module-help.csv: that list is the file inventory in the manifest. A file whose hash still matches is BMAD+’s and is refreshed by update and removed by uninstall. A file you changed, or one BMAD+ never shipped, is yours: update preserves it and reports a conflict, and uninstall keeps it. Your settings, your memory and the deliverables in _bmad-output/ are never in the inventory.

Every location, who creates it, and whether you edit it
PathCreated byYours to edit?Notes
AGENTS.md, CLAUDE.md, GEMINI.md, CONVENTIONS.md, .cursor/rules/bmad-plus.mdc, .codex/AGENTS.md, .opencode/AGENTS.mdinstall, refreshed by updateNot by designGenerated from the registry. If you edit one, BMAD+ keeps your version and stops refreshing it. See the adapters page.
.agents/skills/install, updateNo: BMAD+ owns itOne folder per agent (agent-*), per pack (pack-<name>) and per skill (bmad-plus-*, dev-studio, design, ...). Edited files are preserved as conflicts.
.agents/data/role-triggers.yamlinstall, updateNo: BMAD+ owns itThe auto-activation rules for agent roles.
.agents/memory/install with the Memory pack; agents write into itYesdecisions.md, lessons.md, patterns.md, context.md, a sessions/ folder and a .brain-link pointer to the brain in use. Existing files are never overwritten, and uninstall keeps the folder.
_bmad/config.yamlinstallYesYour settings; see the configuration page. Kept by uninstall.
_bmad/module.yaml, _bmad/module-help.csvinstall, updateNo: BMAD+ owns itModule description and help index, tracked in the inventory.
_bmad/.bmad-plus-install.jsoninstall, updateNever by handThe manifest: version, packs, tools, language, execution mode, adapter fingerprints and the file inventory. If it cannot be read, install copies it to .bmad-plus-install.json.corrupt.bak before repairing it.
_bmad/update-policy.jsonupdate-policy (when you save a policy)Through the commandAbsent means the default policy: notify. An invalid file makes the update commands refuse to run.
_bmad/review-rules.yaml, _bmad/assurance/, _bmad/ai-processing-register.yamlYou, or assurance init and ai-register initYesYour project’s own review rules, assurance cases and AI integration register. None exists until you create it.
_bmad-output/discovery/, _bmad-output/build/install (empty)YesWhere the product brief, PRD, architecture and stories go. Never in the inventory, so never removed.
_bmad-output/uat/uat commands, agentsSpecs and triage: yes. Pages: regeneratespecs/, pages/, results/, triage/, checks/ and ORDER.md. Results are what testers produce; do not edit them.
_bmad-output/review/<id>/review commandsNo: evidencescope.json, checklist.md, findings.json, findings.anchored.json, coverage.json, continue.json, compare.json for one review.
_bmad-output/assurance/assurance commandsNo: evidenceThe hash-chained ledger (runs.jsonl) of an assurance case.
_bmad-output/design/, _bmad-output/dev-studio/, _bmad-output/osint-reports/, _bmad-output/ready-to-integrate/Atelier and intake, Dev Studio, Shadow, MakerYesDesign briefs and reviews, Dev Studio reports (<workflow-id>.md), OSINT dossiers, and packaged agents. A brief written by intake render carries an ownership line and is rewritten by the command: edit the answers, not the brief.
.bmad/update-check.jsonupdate-checkNever by handA 24-hour cache of the last registry answer, with a retry delay after a failure. Safe to delete: it is rebuilt.
.bmad/update.lockinstall, update (while running)Only when stalePrevents two installs or updates at once. doctor says when it is stale (owner gone, or older than 60 minutes) and the message names the file to delete.
.bmad/updates/<receipt-id>/updateNever by handreceipt.json and backups/ of one update. They are what update --restore <receipt-id> reads, so keep them as long as you may want to go back.
.bmad/venv/<pack>/install --provision-pythonNever by handThe isolated Python environment of a pack that needs one (SEO).
.bmad/memory/mem commandsNever by handjournal.ndjson, pattern-scores.json and the promotion and outcome logs: the memory journal.
.bmad-plus/swarm/runs/<run-id>/, .bmad-plus/swarm/reports/swarm commandsNever by handOne folder per swarm run (definition, cards, briefs, answers, tally). The command writes only under this tree. Add replies with swarm save.
.bmad-plus/nexus/runs/nexus commandsNever by handThe authoritative state of durable task runs. A .bmad-plus/orchestrator-state.yaml may sit beside it as a navigation summary only.
backups/Backup Manager (Backup pack)YesTimestamped ZIP archives of the project. The Backup pack excludes this folder from its own archives.
~/.bmad-plus/brain/install with the Memory pack (when no other brain is found), scanYesOutside the project, in your home folder: the global brain shared by all your projects. Never touched by uninstall.

What to put under version control

install does not edit .gitignore: whatever you do not ignore will show in git status. The choice is yours; the table above gives the facts to decide with. In the recorded acceptance run, the demo project already ignored the installed paths, and git status --short stayed empty after the install.

  • Worth sharing with the team: _bmad/config.yaml (shared behaviour), .agents/memory/ (shared decisions and lessons), the deliverables in _bmad-output/, and _bmad/update-policy.json if the policy is a team rule.
  • Reproducible from the package, so a team may prefer to ignore them: .agents/skills/, .agents/data/, the generated adapter files. Whoever clones the project then runs install once.
  • Local state that means nothing on another machine: .bmad/ and .bmad-plus/.

Note This is a suggestion

The split above follows how each location is produced and used; BMAD+ itself imposes no version-control policy.

What uninstall removes and keeps

Effect of uninstall
RemovedKept
Files byte-identical to what BMAD+ ships under .agents/skills/ and .agents/data/, including skills copied from the Design package.agents/memory/, _bmad/config.yaml, _bmad-output/, any file you edited, any file BMAD+ did not ship
The module files, the install manifest, and the adapters that still carry the install marker and a matching fingerprint (AGENTS.md, CLAUDE.md, ...).bmad/, .bmad-plus/ (run state and receipts), and ~/.bmad-plus/brain
Folders that end up empty are removed; nothing is deleted recursivelyAnything under a symbolic link or junction: uninstall refuses to touch linked paths
Uninstall in practice
npx bmad-plus uninstall --yes --directory .\demo-app
T   BMAD+ Uninstaller
•  BMAD+ v0.23.0 (installé le 2026-10-18)
•  Packs sélectionnés: core, design
—  La mémoire, les réglages et les fichiers inconnus ou modifiés ont été conservés.
The line giving the number of removed items is left out on purpose: the first recorded run, which exposed a bug that left the Design skills behind, printed a count that no longer applies after the fix.

Output captured from a real run. Source: Captured during two 0.23.0 acceptance runs, 2026-10-18 (header lines, then the expectation of step 7); the installer ran in French

Example

Clearing local state without losing anything that matters

The project folder is cluttered after months of updates and swarm runs, and you want to know what is safe to delete.

In your AI assistant
List what is under .bmad and .bmad-plus in this project, say what each item is, and tell me which of them I can delete without losing project memory, settings or the ability to restore an update.

What you should get A faithful answer separates three groups. update-check.json is a cache and is rebuilt on the next check. updates/<receipt-id>/ holds the backups that update --restore needs, so delete only receipts you will never roll back to. update.lock is deleted only when doctor reports it as stale. .bmad/memory/ holds the event journal and the outcome records that mem recall and mem observe read, and swarm/runs/ and nexus/runs/ are the evidence of past runs: delete them only if you no longer need that history or that evidence. The Markdown project memory lives in .agents/memory/ and the settings in _bmad/config.yaml, neither of which is touched.

See also