Files
Brian fc6a41c673 feat(toolsmith): default to a single-skill module and start prose from one sentence (#3158)
* feat(toolsmith): make a single-skill module the default for one skill

Registration is settled from the registry and shown in the read-back
instead of asked. A skill joins a module only when the user is working on
that module, named it, or chose its prefix. A bmod-<code> record folder is
never written for one skill.

* fix(toolsmith): ask whether a skill is part of a module

Single-skill module stays the offered guess, but discovery now asks whether
the skill joins a module or more skills are planned. A planned module settles
its code and prefix on the first skill, so nothing is renamed later.

* feat(toolsmith): read any agent's session logs and offer customization in from-logs

The agent finds its own logs and confirms the location instead of assuming
Claude Code. A corrected installed skill can be offered as a bmad-customize
change instead of a new skill.

* refactor(toolsmith): split discover into short sections and cut what a model infers

Registration gets its own section, the five things and other enumerable
items become lists, and the read-back carries the consumer and bar.

* feat(toolsmith): start prose from one sentence and hold one topic to a paragraph

The canon, leanness lens and cut roles now default to the one-sentence
version of a passage and split mixed topics. The pre-pass reports long
paragraphs and sentences.

* refactor(toolsmith): cut prompt files to one topic per paragraph and inline ecosystem into ship

Every route, mode and shape file is split into short paragraphs, bullets
and cases, with what a model would infer removed. ecosystem.md only ever
loaded from ship.md, so its content now lives there.

* feat(toolsmith): let a memory agent add its name to its description at First Breath

* fix(toolsmith): close a Markdown fence only on its own marker in the pre-pass

* fix(toolsmith): let a single-skill module grow into a multi-skill module

* fix(toolsmith): write dependencies to the table the module shape uses

* feat(toolsmith): restore a memory agent's name after an update and skip global installs

* docs(toolsmith): bring the help up to date and route to cut mode

* refactor(toolsmith): call the read-back the Smithy execution plan and add help on sharing and subagents

* docs(toolsmith): write the Toolsmith docs to replace the builder site
2026-10-31 19:01:43 -05:00

182 lines
6.7 KiB
Markdown

---
title: Module Files
description: 'The files that make a BMad module: bmod.toml, roster.toml, retired.toml, migration files, and help, with every key and rule.'
sidebar:
order: 2
---
Use this page for the exact keys in a module's files. For what a module is and how to choose a registration, see [Modules and Registration](../toolsmith/modules.md). Smithy writes these files for you, and `validate_manifests.py` checks them.
## Where the Files Live
| File | Multi-skill module | Single-skill module |
| --- | --- | --- |
| `bmod.toml` with `[bmod]` | In the `bmod-<code>` record folder | In the skill's folder |
| `bmod.toml` with `[skill]` | In each member's folder | The same file, with `[skill]` empty |
| `help/help.md` | In the record folder | In the skill's folder |
| `SKILL.md` | The record has one that only redirects to `bmad setup <code>` | The skill's own |
| `roster.toml`, `retired.toml`, `migration-<n>.toml` | In the record folder | Beside `bmod.toml` |
`bmad` finds a module by its `[bmod]` table. Validation requires a multi-skill record folder to be named `bmod-<code>`, and a single-skill module's folder keeps the skill's name.
## `bmod.toml`
A file holds a `[bmod]` table, a `[skill]` table, or both.
### `[bmod]`
| Key | Required | Meaning |
| --- | --- | --- |
| `code` | Yes | Configuration namespace and the name in `bmad setup <code>`. Cannot be `_config`, `custom`, `modules`, or `scripts` |
| `version` | Yes | The module's version, compared with its source to offer updates |
| `update_source` | Yes | Where updates come from. Starts with `github:`, `https://`, `file:`, or `plugin:` |
| `skills` | Multi-skill | Every member skill |
| `required_skills` | No | Skills the module needs, see [Dependencies](#dependencies) |
| `recommended_skills` | No | Skills that help beside it. Setup reports them and does not insist |
| `pre_install_message` | For validation | Shown before an update, or before `bmad` installs the record itself |
| `post_install_message` | For validation | Shown after installing |
Setup accepts a record without the install messages, but `validate_manifests.py` requires both keys, empty if unused.
A `github:` source is `github:<owner>/<repo>/<path>`, where `<path>` is the folder holding the skill folders, such as `skills`. With no path, the repository root is the skill. Update checks read `bmod.toml` from the `main` branch.
### `[[bmod.config_questions]]`
Each entry is one question for `bmad setup <code>`, asked in file order.
| Key | Required | Meaning |
| --- | --- | --- |
| `key` | Yes | Dotted key, read as `modules.<code>.<key>`. Must not be the code or start with `<code>.` |
| `prompt` | Yes | The question text |
| `default` | Yes | The default answer, with `{project-root}` kept literal |
| `scope` | No | `team`, the default, or `user` for a personal answer that is not committed |
No other keys are allowed.
### `[[bmod.knowledge]]`
Optional. Lists extra help documents inside the record folder, with `path` and `skills`. `skills` is `"*"`, the default, or a list of skill names.
### `[skill]`
| Key | Required | Meaning |
| --- | --- | --- |
| `bmod` | In a member file | The record folder, such as `bmod-acme` |
| `source` | In a member file | Must equal the record's `update_source` |
| `required_skills` | No | What this skill alone requires |
| `recommended_skills` | No | What helps beside this skill |
| `scripts` | No | Paths written like `scripts/foo.py` that setup installs to `_bmad/<code>/scripts/` |
In a single-skill module, leave `[skill]` empty unless it declares `scripts`, because the record in the same file already names the module's one skill.
### Dependencies
A plain name is a skill from the same source. A table names a skill from elsewhere.
```toml
required_skills = [
"acme-release-notes",
{ skill = "bmad", version = "6.13.0", source = "github:bmad-code-org/BMAD-METHOD/skills" },
]
```
`version` is optional. Module-wide needs go in `[bmod]`, including all of a single-skill module's needs. One member's needs go in its `[skill]` table.
### Examples
A record:
```toml
[bmod]
code = "acme"
version = "1.0.0"
update_source = "github:acme/skills/skills"
skills = ["acme-release-notes", "acme-agent-scout"]
required_skills = [{ skill = "bmad", version = "6.13.0", source = "github:bmad-code-org/BMAD-METHOD/skills" }]
pre_install_message = ""
post_install_message = ""
[[bmod.config_questions]]
key = "release_folder"
prompt = "Where should release notes go?"
default = "{project-root}/docs/releases"
```
A member:
```toml
[skill]
bmod = "bmod-acme"
source = "github:acme/skills/skills"
```
A single-skill module:
```toml
[bmod]
code = "acme"
version = "0.1.0"
update_source = "github:acme/acme-release-notes/skills"
required_skills = [{ skill = "bmad", version = "6.13.0", source = "github:bmad-code-org/BMAD-METHOD/skills" }]
pre_install_message = ""
post_install_message = ""
[skill]
```
## Reading Answers
A skill reads a setup answer with one call, listing every key it needs.
```bash
uv run {project-root}/_bmad/scripts/resolve_config.py --project-root {project-root} --key modules.acme.release_folder
```
## `roster.toml`
Required when a member is an agent. It is how `bmad` and party mode know who is available. A member with `skill` is an agent, present only while that skill is installed. A member without `skill` is a guest who exists only in groups.
```toml
[[members]]
code = "acme-agent-scout"
skill = "acme-agent-scout"
name = "Scout"
icon = "🔭"
title = "Release Scout"
persona = "Two sentences on who this agent is."
[[groups]]
id = "release-team"
name = "Release Team"
scene = "A release readiness meeting."
members = ["acme-agent-scout"]
memory = false
```
## `retired.toml`
Lists skills the module no longer ships. `bmad setup` offers to delete any still installed, and moves a renamed skill's `_bmad/custom/` files to the new name. A retired name is never reused, and a name can appear only once.
```toml
renamed = [{ from = "acme-notes", to = "acme-release-notes" }]
removed = ["acme-old-check"]
```
## `migration-<n>.toml`
A module ships a migration beside its `bmod.toml`, and `bmad migrate` runs them in `<n>` order. The file has a `[migration]` table with `module`, `from`, `to`, `title`, `summary`, `detect`, `guide`, and a `checklist` array. A file missing any of these is not listed. The file holds the rules, and `bmad` follows them.
## Help Files
`help/help.md` covers the whole module and is read by the `bmad` skill. Every other `help/*.md` is a topic file, read only when `help.md` names it. See [Write the Help](../toolsmith/modules.md#write-the-help).
## Validate
In a repository with `skills/*/bmod.toml`:
```bash
uv run {project-root}/_bmad/scripts/validate_manifests.py --project-root <repo>
```
It covers manifests, membership, versions, retired names, help topics, and the roster.