Conversation
A module is now one inert skill folder, bmod-<code>, whose bmod.toml holds a [bmod] table: the module's code, version, update source, skills, required and recommended skills, and config questions. Each member skill carries a bmod.toml with a [skill] table naming its module. A file with both tables is a single-skill module. This replaces module-manifest.toml and the bmad-meta/ copies every skill carried, along with tools/sync_knowledge.py and its hook. Standard files in a module folder are found by name: help/help.md is always read and routes to small help/<topic>.md files that bmad opens only when a question needs them, and roster.toml supplies agents, guests and parties. bmad setup is an upsert that reports as JSON, and bmad status is read-only. Team answers go to _bmad/config.toml and user answers to _bmad/custom/config.user.toml. The roster is the one source of agents. The [agents.bmad-agent-*] tables are gone from the config template, a roster agent's name, title, icon and module come from its skill and customization, and bmad-forge-idea reads roster.py as bmad-party-mode does. Skills that handed off to the removed bmad-help skill now hand off to bmad. Adds bmod-method and bmod-core-tools with rewritten help, including topics on prototyping, existing codebases, organizations, poly repos, preparing a repo for agents, artifact lifetime, unattended builds, review, ticketing, customization, party mode, research and modules. BREAKING CHANGE: module-manifest.toml and bmad-meta/ are removed, and setup.py no longer accepts --doctor or --update. Install bmod-method and bmod-core-tools beside the skills, then run bmad setup.
|
| installed = skill_module_version(skills_dir, requirement.skill) | ||
| if installed is None: | ||
| return None, None | ||
| return requirement_state(installed, requirement.version), installed |
There was a problem hiding this comment.
Unknown Versions Pass Requirements
When a required skill’s directory exists but its bmod.toml is missing or unusable, skill_module_version() returns None and this branch treats the versioned requirement as satisfied. A partial or stale install can therefore report no unmet requirement and current: true, even though the required skill has no usable module metadata and cannot establish the required version.
Prompt To Fix With AI
This is a comment left during a code review.
Path: skills/bmad/scripts/setup.py
Line: 616-619
Comment:
**Unknown Versions Pass Requirements**
When a required skill’s directory exists but its `bmod.toml` is missing or unusable, `skill_module_version()` returns `None` and this branch treats the versioned requirement as satisfied. A partial or stale install can therefore report no unmet requirement and `current: true`, even though the required skill has no usable module metadata and cannot establish the required version.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Fixed in 4fe048f. A required skill with a minimum version and no bmod.toml of its own is now unmet with state unknown-version and npx skills update as the fix. A skill that names an absent module record is still left to the missing module record report, so it is not reported twice.
| "missing_module_records": list(installation.missing_records), | ||
| "problems": problems, | ||
| "legacy_leftovers": legacy_leftovers(project_root), | ||
| "current": next_command is None and not unmet and not problems, |
There was a problem hiding this comment.
Missing Records Report Current
Missing module records only influence next when an install command can be generated. If a skill from a local, plugin, or other non-GitHub source lacks its module record, setup and status can still report current: true. The missing record remains in the JSON, but the top-level state contradicts the installation contract and gives callers no required next action.
Prompt To Fix With AI
This is a comment left during a code review.
Path: skills/bmad/scripts/setup.py
Line: 293
Comment:
**Missing Records Report Current**
Missing module records only influence `next` when an install command can be generated. If a skill from a local, plugin, or other non-GitHub source lacks its module record, setup and status can still report `current: true`. The missing record remains in the JSON, but the top-level state contradicts the installation contract and gives callers no required next action.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Fixed in 4fe048f. A missing module record now makes current false in both setup and status, including when no install command can be built for it.
| def collect(roots: list[Path], project_root: Path | None = None) -> dict[str, object]: | ||
| problems: list[dict[str, str]] = [] | ||
| skills: dict[str, Path] = {} | ||
| found = scan(roots) | ||
| problems = found.problems | ||
| skills = found.folders |
There was a problem hiding this comment.
Roster installation status is computed from every directory under the skill roots rather than from successfully parsed [skill] records. If an agent folder remains after a partial update, has a broken bmod.toml, or contains no skill metadata, it is still placed in agents and therefore the default party even though the agent is unusable. Knowledge discovery uses the same folder-presence test for installed_skills.
Prompt To Fix With AI
This is a comment left during a code review.
Path: skills/bmad/scripts/roster.py
Line: 56-59
Comment:
**Invalid Folders Become Agents**
Roster installation status is computed from every directory under the skill roots rather than from successfully parsed `[skill]` records. If an agent folder remains after a partial update, has a broken `bmod.toml`, or contains no skill metadata, it is still placed in `agents` and therefore the default party even though the agent is unusable. Knowledge discovery uses the same folder-presence test for `installed_skills`.
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.There was a problem hiding this comment.
Leaving this as is. Installed means the skill folder exists, which is what the host lists and can invoke; scan applies the same rule so a project copy shadows a user copy even without a bmod.toml. A broken bmod.toml does not stop the agent skill from running, and knowledge.py already reports that file as a problem.
There was a problem hiding this comment.
Understood. Given that the host treats an existing skill folder as installed and invocable, and scan intentionally preserves that folder-based shadowing behavior, a malformed or missing bmod.toml should not remove the skill from the roster. Reporting the metadata issue through knowledge.py while keeping the folder installed is consistent with the intended model. No change needed.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: bmad-code-org/BMAD-METHOD/.coderabbit.yaml Review profile: CHILL Plan: Advanced Run ID: 📒 Files selected for processing (206)
💤 Files with no reviewable changes (111)
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthroughThe pull request migrates BMad from per-skill ChangesBmod metadata migration
Priority: ➖ Normal Estimated code review effort: 5 (Critical) | ~90 minutes 🚥 Pre-merge checks | ✅ 4✅ Passed checks (4 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
… as not current A required skill with a minimum version and no bmod.toml of its own is a copy from before module records, so its version cannot be read. It was counted as met. It is now unmet with state unknown-version and npx skills update as the fix. A skill that names an absent module record is still left to the missing module record report. Setup and status also reported current while listing a missing module record whenever no install command could be built for it, as with a local or plugin source. A missing record now makes current false.
What
Replaces the per-skill module metadata with one module record per module, and rebuilds help around it.
bmod-<code>, whosebmod.tomlholds a[bmod]table: code, version, update source, skills, required and recommended skills, config questions. Each member skill carries abmod.tomlwith a[skill]table naming its module. A file with both tables is a single-skill module.module-manifest.tomlfiles, the rootbmad-meta/folder and the 74 per-skill copies of it,tools/sync_knowledge.py, and its pre-commit hook.help/help.mdis always read and routes to smallhelp/<topic>.mdfiles thatbmadopens only when a question needs them.roster.tomlsupplies agents, guests and parties.bmod-methodandbmod-core-tools.Behaviour
bmad setup [code]is an upsert and reports as JSON.bmad status [code]is read-only and ends with the one command to run next. Team answers go to_bmad/config.toml, user answers to_bmad/custom/config.user.toml, and_bmad/custom/.gitignoreis written once.knowledge.pyreportsskills,documents,topics(path only, never text) andproblems. A file it cannot use becomes a problem, never an exception.[agents.bmad-agent-*]tables are gone from the config template. For a roster agent, name, title, icon and module come from its skill and customization, so an old recorded table no longer undoes a custom name.bmad-forge-ideareadsroster.pyasbmad-party-modedoes, with the config table as fallback.bmad: the module'shelp/help.md, then the topic file, then the one skill's own files as a last resort, then the docs site.bmad-helpskill. They now hand off tobmad.help/help.mdin everybmod-*folder, every topic file to be named in it, and everyhelp/<name>.mdreference to exist. It also carries the roster content checks thatsync_knowledge.pyhad.Help content
help.mdfor each module holds what is needed to route a user and say what to do next: a decision tree, a situation table, a one-line index of every skill with what it writes, and what to offer after each skill. Topic files go deeper on one subject each:Several statements in the old help were checked against the skills and corrected: what
bmad-buildrequires of tests, how to get another review pass, whenbmad-build-autoneeds a clean tree, and whatbmad-correct-coursewrites.Breaking
module-manifest.tomlandbmad-meta/are removed.setup.pyno longer accepts--doctoror--update.bmod-methodandbmod-core-toolsbeside the skills, then runbmad setup. A skill whose module record is absent reports the install command.Verification
uv sync --frozen && (cd docs-site && npm ci) && uv run --frozen tools/quality.pypasses on this commit.bmad setupandbmad status;resolve_party.pydefault,--list-groups,--party product-team, an unknown party, withbmod-methodremoved, and with one agent skill removed; theroster.pycallbmad-advanced-elicitationmakes;resolve_personas.pyinbmad-forge-idea; a custom agent name surviving.help/folder orroster.toml, and.., absolute or URL paths, all become problems and nothing outside the folder is read.Follow-ups, not in this PR
docs/pages and the translated READMEs still describe the 6.12 installer and namebmad-help.