Skill Tracer
Skills › BMAD Method › bmod-core-tools › customization.md

customization.md

64 lines · skills/bmod-core-tools/help/customization.md at bd70c64

Open on GitHub

Most marks come from matching words in the file, so treat them as pointers.

1# How customization works
2
3Open this when the user asks where an override goes, how it merges, why it is not applied, or how to change central config. To change one skill or agent, recommend `bmad-customize`. For team-wide rules see `help/team-adoption.md`.
4

How customization works

Open this when the user asks where an override goes, how it merges, why it is not applied, or how to change central config. To change one skill or agent, recommend bmad-customize. For team-wide rules see help/team-adoption.md.

Raw lines 1 to 4
Names a skill bmad-customize :3
5## The layers for one skill
6
7A skill is customizable only if its folder holds a `customize.toml`, which lists every field that can change. Updates overwrite it, so nobody edits it. Overrides live in `{project-root}/_bmad/custom/`, named after the skill folder.
8
9| Priority | File | For | Committed |
10|---|---|---|---|
11| 1 (wins) | `<skill>.user.toml` | One person: tone, private facts | No |
12| 2 | `<skill>.toml` | The team: policy, conventions | Yes |
13| 3 | the skill's `customize.toml` | Shipped defaults | With the skill |
15`bmad setup` writes `_bmad/custom/.gitignore` with `*.user.toml` when none exists.

The layers for one skill

A skill is customizable only if its folder holds a customize.toml, which lists every field that can change. Updates overwrite it, so nobody edits it. Overrides live in {project-root}/_bmad/custom/, named after the skill folder.

PriorityFileForCommitted
1 (wins)<skill>.user.tomlOne person: tone, private factsNo
2<skill>.tomlThe team: policy, conventionsYes
3the skill's customize.tomlShipped defaultsWith the skill

bmad setup writes _bmad/custom/.gitignore with *.user.toml when none exists.

Raw lines 5 to 16
17## Merge rules
19The value's shape decides the merge. The field name does not.
21| Shape | Rule |
22|---|---|
23| Scalar | The override wins. |
24| Table | Merged key by key, by these same rules. |
25| Array of tables where every item has `code`, or every item has `id` | A matching key replaces that item. A new key appends. |
26| Any other array | Appended: shipped, then team, then user. |

Merge rules

The value's shape decides the merge. The field name does not.

ShapeRule
ScalarThe override wins.
TableMerged key by key, by these same rules.
Array of tables where every item has code, or every item has idA matching key replaces that item. A new key appends.
Any other arrayAppended: shipped, then team, then user.
Raw lines 17 to 27
28## Limits
30- An override cannot remove a shipped item. Replace a keyed item with one that does nothing.
31- It cannot change step logic or any field `customize.toml` does not list. Never invent a field. Offer `activation_steps_prepend`, `activation_steps_append` or `persistent_facts` instead, or a feature request.
32- On an agent skill, `agent.name` and `agent.title` are metadata. Overriding them does nothing.
33- Write only the changed fields. A full copy of `customize.toml` blocks later shipped defaults.

Limits

  • An override cannot remove a shipped item. Replace a keyed item with one that does nothing.
  • It cannot change step logic or any field customize.toml does not list. Never invent a field. Offer activation_steps_prepend, activation_steps_append or persistent_facts instead, or a feature request.
  • On an agent skill, agent.name and agent.title are metadata. Overriding them does nothing.
  • Write only the changed fields. A full copy of customize.toml blocks later shipped defaults.
Raw lines 28 to 34
35## Agent or workflow
37The top table in `customize.toml` is `[agent]` or `[workflow]`. Override fields go under the same table. A rule for every workflow an agent runs goes on the agent skill: persona, style, principles, facts, menu. A rule for one workflow goes on that workflow skill: templates, output paths, `on_complete`, step hooks.

Agent or workflow

The top table in customize.toml is [agent] or [workflow]. Override fields go under the same table. A rule for every workflow an agent runs goes on the agent skill: persona, style, principles, facts, menu. A rule for one workflow goes on that workflow skill: templates, output paths, on_complete, step hooks.

Raw lines 35 to 38
39## Central config
41It holds `[core]` values such as `output_folder`, module answers under `[modules.<code>]`, and optional `[agents.<code>]` tables that add an agent of the user's own or add details such as `team` to an installed one. An installed agent's name, title, and icon come from its own skill and its override file, not from here. Three files merge by the same rules, highest first:
431. `_bmad/custom/config.user.toml`: personal. `bmad setup` writes user answers here. Not committed.
442. `_bmad/custom/config.toml`: team pins. Written by hand only. Committed.
453. `_bmad/config.toml`: created by `bmad setup`, which writes team answers here.
47All three may be hand-edited. `bmad setup` never changes an existing value, so to change an answer, edit its key in the file `bmad setup` reports for it. `bmad-customize` does not write central config: help the user edit the TOML.

Central config

It holds [core] values such as output_folder, module answers under [modules.<code>], and optional [agents.<code>] tables that add an agent of the user's own or add details such as team to an installed one. An installed agent's name, title, and icon come from its own skill and its override file, not from here. Three files merge by the same rules, highest first:

  1. _bmad/custom/config.user.toml: personal. bmad setup writes user answers here. Not committed.
  2. _bmad/custom/config.toml: team pins. Written by hand only. Committed.
  3. _bmad/config.toml: created by bmad setup, which writes team answers here.

All three may be hand-edited. bmad setup never changes an existing value, so to change an answer, edit its key in the file bmad setup reports for it. bmad-customize does not write central config: help the user edit the TOML.

Raw lines 39 to 48
Names a skill bmad-customize :47
49## Check the merged result
51`bmad-customize` shows the merged result after it writes. `_bmad/scripts/resolve_customization.py` (one skill) and `resolve_config.py` (central config) print the merged values as JSON. If a script is missing, recommend `bmad setup`.

Check the merged result

bmad-customize shows the merged result after it writes. _bmad/scripts/resolve_customization.py (one skill) and resolve_config.py (central config) print the merged values as JSON. If a script is missing, recommend bmad setup.

Raw lines 49 to 52
Names a skill bmad-customize :51
Runs code scripts/resolve_customization.py :51
53## An override is not applied
551. The file is in `_bmad/custom/` and named exactly after the skill folder.
562. The TOML parses. The resolver errors and names a broken file.
573. Fields sit under `[agent]` or `[workflow]` and exist in `customize.toml`.
584. The shape matches, and a replaced item uses the same `code` or `id`.
595. No user file overrides the team value.
606. `uv` runs. Without the resolver, many skills use shipped defaults.

An override is not applied

  1. The file is in _bmad/custom/ and named exactly after the skill folder.
  2. The TOML parses. The resolver errors and names a broken file.
  3. Fields sit under [agent] or [workflow] and exist in customize.toml.
  4. The shape matches, and a replaced item uses the same code or id.
  5. No user file overrides the team value.
  6. uv runs. Without the resolver, many skills use shipped defaults.
Raw lines 53 to 61
62## Reset
64Delete the override file, or the one field. The skill uses shipped defaults on its next run.

Reset

Delete the override file, or the one field. The skill uses shipped defaults on its next run.

Raw lines 62 to 64