14 Commits
Author SHA1 Message Date
Murat K Ozcan 423690c3d7 docs: describe v7 module install and the three-file config model (#3156)
* fix(skills): activation preflight checks required skills only against roots the caller names

resolve_customization.py accepts repeated --root, in precedence order, and passes
them to setup_check. Without roots, setup_check no longer claims a required skill
or the module record is missing or outdated, since it cannot see the host's other
active roots. Notes that need no root order stay.

* fix(skills): report a tag-pinned install as pinned with the re-add command

A module whose skills-lock entry carries a ref was reported newer-available, but
npx skills update keeps the pin and cannot apply the newer version. Status now
reports pinned with the command that adds the module again at the newer tag.

* fix(skills): tickets find rejects a bare number that would fall back to the backlog

With no folder, a bare number the initiative does not resolve was taken from
the backlog file carrying that id. It now errors as ambiguous and lists the
candidates.

* fix(skills): preflight reads the record that wins the ordered roots and survives an unreadable file

render_skill.py takes --root like the resolver.

* fix(skills): only a version-tag ref counts as a pin

A branch or commit ref is followed by npx skills update, so it stays newer-available.

* fix(skills): a numeric tracker id still finds its backlog ticket and the bare-number error names the real case

* fix(skills): pinned re-add command covers one scope; test the renderer preflight and pinned status

The re-add command lists only the skills in the module record's scope. The renderer
tests install setup_check and cover --root forwarding. Status tests cover pinned as a
settled state.

* fix(skills): a numeric tracker id wins over a backlog ticket's local id

* feat(skills): build loads any run folder that names its ticket and container

step-01 of bmad-build and bmad-build-auto reads the main document of any <type>-*/ run
folder in the initiative or the ticket's epic folder whose ticket and container match.
A document without container keeps the research rule. A loaded document that lists test
files makes the plan include the work that turns them green.

* feat(skills): retrospective gathers the epic's run folders and companions

* fix(skills): migration rewrites a module config path that moves with the planning folder

* fix(skills): match a run's container by the folder find names, carry test work into oneshot plans, align companions and the migration check

* fix(skills): mirror leaves a bare number out of the backlog, and a pin needs the lock entry to name the module's repository

* fix(skills): match a run's container by its last folder name and have the build run the listed tests

* docs: describe v7 module install and the three-file config model

* docs: mark the plugin marketplace route not v7-ready

* docs(skills): core-tools help names how to add the Test Architect

* docs: list external modules that restate the ticket tree rules

* fix(skills): bmad-customize points to bmad-toolsmith for custom skills

* docs: align the config and module pages with setup behavior

* docs: call team settings defaults a personal file can override, and note single-skill modules

* fix(skills): no re-add command for an untagged pre-release, and the backlog help names the tracker id exception

* fix(skills): listed tests get a Verification command that blocks completion, and the migration rewrites each layer that holds the moved path

* fix(skills): a released pinned module from a non-GitHub source says to re-add it from its source

* fix(skills): bmad-build runs the plan's Verification commands before review

* fix(skills): bmad-customize recommends bmad-toolsmith only when installed
2026-10-31 11:49:27 -05:00
Murat K Ozcan ecfde2a980 docs: name current TEA skills and its v7 install (#3152)
* docs: name current TEA skills and its v7 install

* docs: use clear noun phrases and define ATDD
2026-10-31 07:06:41 -05:00
Brian Madison 4a0dbc336a chore: remove web bundles
Gemini Gems and ChatGPT Custom GPTs are deprecated and are being replaced by skills on both platforms. Removes the web-bundles folder, its packager, its docs pages and the links to them.
2026-10-01 20:04:59 -05:00
Alex Verkhovsky 10d3802700 docs(review): explain the quick default and when thorough review must still run (#2982) 2026-09-28 10:28:44 -06:00
Brian 0d499b9b82 feat(bmad): setup cleans up renamed and removed skills; help loads only for help requests (#2981)
* feat(bmad): setup cleans up renamed and removed skills, updates and migrates in one flow

Modules list renamed and removed skills in a retired.toml beside bmod.toml,
replacing removals.txt. Setup moves _bmad/custom files of renamed skills,
offers to delete retired skills in project and global folders and drop them
from the skills CLI lock, and offers the new name's install. It reads every
active skills root, reports duplicates and skills a module ships that are
not installed.

Setup, status, update, repair and doctor are one flow in setup.md: check and
report, then update the skills, answer new config questions, refresh _bmad,
clean up, and run a detected migration on request. bmad-preview-ticketing's
forwarder is removed.

* refactor: make active_initiative a core setting

Initiatives are not specific to the method: core skills such as
brainstorming, research and party mode write into the initiative folder
too. The key moves from [modules.bmm] to [core], and core help now explains
initiatives for any module; method help keeps only what the method puts in
the folder.

* refactor(bmad): split help out of SKILL.md and load module help only for help requests

SKILL.md keeps the persona and routes setup, migrate and initiative actions
to their references without loading module help. Help and conversation load
every installed module's help with knowledge.py first, then follow the new
references/help.md: see where the project stands, answer only from module
help, and run skills or a sequence of them on request.

* fix(bmad): skip tool skills folders linked outside the project; setup-run migrations verify

* test(bmad): point USERPROFILE at the test home so the global cleanup test runs on Windows
2026-09-28 23:33:29 +08:00
Brian 561eeedf38 feat(skills): retire planning and implementation artifact folders for the initiative store (#2968)
* feat(skills): retire planning and implementation artifact folders for the initiative store

Every document skill now writes into the active initiative under `output_folder`, as `<type>-<slug>/<type>-<slug>.md`, where the slug is what the document is about. `planning_artifacts` and `implementation_artifacts` are no longer read or seeded; a v6 project moves its files with `bmad migrate method`. The `bmad` skill gains `references/initiative.md` to show, switch, create, or clear the active initiative, and its help view reads the initiative folder instead of the retired paths. The repo's `CLAUDE.md` shim is removed, since Claude Code reads `AGENTS.md` natively.

* fix(ticketing): tickets live in output_folder, help runs the resolver, linter names the spine

Drops the ticketing store's separate root: the ticket tree is always {output_folder}/{active_initiative}, beside the documents, so an initiative created by the bmad skill is the one ticketing finds. The bmad help view now runs resolve_config.py when _bmad/config.toml exists instead of reading the user file alone. lint_spine.py reports the spine file, not the dependency name, for an unpinned Stack row.

* fix(docs): name the loose-work location where only the initiative folder was given

The brainstorming headless return reports the configured intent document name. The party-mode help row and four build docs say where files land when no initiative is active.

* docs: bring the English docs onto the initiative layout

The planning-skills diagram names the <type>-<slug>.md files. Planning pages state the output-folder fallback. The bmad skill replaces bmad-help everywhere, and the reference page says it also runs setup, status, migrate, and the active initiative. The v6 preview page leads with bmad migrate method. Tutorials install with the skills CLI and bmad setup. Config pages say where active_initiative lives and that output_folder carries the ticket tree. Loose path slips fixed, and an Unreleased changelog entry added.
2026-09-26 22:19:52 +08:00
Alex VerkhovskyandBrian Madison 5e33d3c03b feat(ticketing): build from the ticket tree without ticket files (#2944)
* docs(ticketing): shared rules for skills that use the ticket tree

Plan file name and place, status carried by the plan and who writes each value, how skills find the tree and run tickets.py, the baseline revision, and where code review and the retrospective write.

* docs(ticketing): backlog plans join by file stem, and a leaf file's status is read when there is no plan

* feat(ticketing): entries start without a file and take their state from the plan

* chore(tools): treat _bmad/method/scripts/ as install-only in the file reference check

* feat(ticketing): tickets.py is installed for every skill and finds the active initiative

* feat(ticketing): find and mark work on an entry that has only a plan

* docs(ticketing): board rules say who moves a ticket

* docs(ticketing): drop pull-to-start and the plan section

An entry is ready to start with no file, and the build's plan is its own file beside the leaf, so the ticketing skill stops describing a ## Plan section, a to_pull group, and publishing on pull. pull is only for refining, or for writing the file a tracker receives. On the repo store the committed tickets.toml is the publish; on a tracker publication is on_start or at_inception and the whole file is sent. spec_checkpoint becomes plan_checkpoint.

* docs(ticketing): method help and docs describe the ticket tree without ticket files

* refactor(ticketing): share tickets.py checks and test setup, and fix stale tree wording

* test(ticketing): decode tickets.py output as UTF-8, and skip the undecodable-argument test on Windows

* refactor(build): the build skills call their output a plan

Rename the build's output from spec to plan in bmad-build and bmad-build-auto with no change in behavior: plan-template.md, {plan_file}, [workflow] open_plan (no alias), bad_plan, Plan Change Log, plan-{slug}.md, source_plan, and the halt strings that name it. bmad-build records baseline_revision in place of baseline_commit. bmad-spec's spec_folder and SPEC.md keep their names. The renderer's open_plan label and the render tests follow, and a test renders both build skills with each pinned route.

* feat(build): bmad-build builds the next ready entry from the ticket tree

With no argument, bmad-build takes the first ready entry from tickets.py next,
reads it through find, and plans beside tickets.toml with the entry's ticket id.
Builds now stop at a new status, built, and never write done. tickets.py rows
carry a ref that find resolves, and a prerequisite in review counts as met.

* feat(build): bmad-build takes a named ticket and offers started plans from the tree

* refactor(build): bmad-build stops reading the old files

Drop the stories.yaml route, story_key and the sprint-status sync, and the
epic context compiled from the epics file. A tree ticket reads its epic file
and References, and takes continuity from its prerequisites' plans.

* feat(build): bmad-build-auto builds one ticket from the tree

With no work named, bmad-build-auto takes the active initiative's next
ready entry through tickets.py next and find; a named ref, ticket file,
or title resolves through find. Its plan lands at find's path with
ticket and baseline_revision, continuity comes from the plans of the
entry's prerequisites, and the run ends at built, never done. The
epic-story path no longer halts on an earlier plan in review.

* refactor(build): bmad-build-auto halts into the plan and stops reading the old files

A halt on a tree ticket runs tickets.py mark, which records the blocked
status and reason in the plan and creates it when there is none. Drop the
stories.yaml folder+id dispatch and the epic context compiled from the
epics file. bmad-build shows a blocked plan's reason and halts.

* docs(build): the loop contract describes bmad-build-auto on the ticket tree

* docs(build): the build docs and diagrams name the plan and take a ticket from the tree

* refactor(build): sweep stale story wording from the build skills and drop the dead open_plan clause

* fix(build): bmad-build-auto builds only what it is dispatched

An unattended worker must not choose its own work. Given no work it now
halts unclear intent instead of taking the first ready ticket from
tickets.py next; the orchestrator names each ticket.

* fix(build): bmad-build-auto takes a ticket only when the prompt names one

A bare ref, path, or title matched by shape could be something other
than a ticket, and was sent to find. A ticket is now a reference the
prompt calls a ticket, or a file whose frontmatter type is a ticket
type; find then resolves its plan, entry, and prerequisites.

* refactor(build): bmad-build names a ticket, then resolves it with find

Separate what counts as a ticket from the find call that resolves its
plan, entry, and prerequisites, as bmad-build-auto now does. No change
in which prompts count as a ticket.

* feat: review and retrospective from the ticket tree (#2954)

* feat(code-review): find the ticket in review through the tree and write to its plan

With no argument and nothing in the conversation, bmad-code-review runs
tickets.py status, offers the tickets in review, resolves the chosen one
through find to its plan, diffs from the plan's baseline_revision with
untracked files, and takes the claims from the commits since it. Findings
go into a dated block under the plan's Code Review section, deferred
findings included. The sprint-status tier, story_key, and the status and
sprint-status update are gone: the skill never changes a ticket's status.

* refactor(code-review): call the review's input a plan and drop the story-file route

Rename {spec_file} to {plan_file} with no alias across the steps, the
customize.toml lens and comment, and the render test. Findings go to the
plan's Code Review section whenever a plan is set and to the chat
otherwise; the baseline_revision detection, the Tasks/Subtasks condition,
and the Review Findings route are gone. The no-spec review mode becomes
no-plan, and the rule in step-04 names built as the status the build
leaves.

* feat(retrospective): read an epic folder from the ticket tree and write its retrospective there

* refactor(code-review): shorten the plan-file and ticket-tree tiers

* refactor(retrospective): drop the sprint status route, its script, and its tests

* refactor(correct-course): stop reading the epics file and writing sprint status

* docs(review,retrospective): describe code review, retrospective, and correct-course on the ticket tree

* refactor(review,retrospective): sweep duplicate rules and stale references from the epic

Say the retrospective's file name, only-write rule, and unfinished-ticket
verdict once each; describe git_evidence.py's output as the range's commits;
fix cross-references that named a missing workflow.md, a Close phase, a
Document Project input, and a step where a section or item was meant; and
align the finish-an-epic doc and help row with the plan as the status record.

* fix(retrospective): end the last plan's range at the epic's own work

A retrospective run after later work has landed counted those commits as
the epic's, since the last range ran to HEAD. When later work has landed,
the range now ends at the last commit belonging to this epic's tickets,
and the cut is recorded.

* feat: retire the legacy planning route and migrate ticket state (#2955)

* feat: retire the legacy planning route and migrate ticket state

* docs: drop the ticket-tree upgrade guide and changelog entry

Remove docs/start/upgrade-to-ticket-tree.md, its inbound links, and its
locale-coverage baseline entries. Revert the Unreleased CHANGELOG section.

* docs: keep the translated workflow map diagram unchanged

Only the vi-vn, cs, and zh-cn workflow-map pages embed this diagram, and
their text still describes the previous route.

* fix(ticketing): move a leaf's plan with it, say epic tickets need no file, write test files as UTF-8

---------

Co-authored-by: Brian Madison <bmadcode@gmail.com>
2026-09-25 22:17:11 +08:00
Alex Verkhovsky 23f134e2e5 feat(review): add the review lever and lens sets to build-auto and code-review (#2861)
Both skills gain a `workflow.review` selector. bmad-build-auto accepts
`none`, `quick`, `thorough`, and `auto`, where `auto` follows the
resolved route (oneshot selects quick, full selects thorough) and is the
default. bmad-code-review accepts `quick` and `thorough`, defaulting to
`thorough`; a review skill with review turned off has nothing to do, so
it offers no `none`. An invocation naming a selection passes it as
`--set workflow.review=<value>`, and any other value halts the render.

`review_layers` retires in both skills in favour of two configured, ordered
lens sets. `quick_lenses` holds the new Quick lens, an informed review of
acceptance criteria, applicable rules, and bugs that reads the spec, its
context files, and the repository's agent instructions. `thorough_lenses`
holds Blind Hunter, Edge Case Hunter, Verification Gap Reviewer, and Intent
Alignment Auditor, identical in both skills; bmad-code-review's Acceptance
Auditor is removed.

Templates render only the selected set. Under `auto` route with `auto`
review, bmad-build-auto renders both sets and the session launches the one
the fixed mapping selects. Under `none`, bmad-build-auto's step-04 drops
its staging, review, and classify sections. The bmad-build-auto story
frontmatter gains `review`, `review_source`, and `lenses_ran`.

The review docs describe the two review depths and point to
bmad-customize for the rest; the customize doc's example sets the default
depth.
2026-09-12 11:23:39 -06:00
Alex Verkhovsky 94b6727b00 refactor(renderer): render skill sources as Jinja2 templates (#2857)
Replace the regex token substitution and the line-parsed bmad-if
directives in render_skill.py with Jinja2. Templates see config,
workflow, and snapshot(); undefined names, empty entry files, and
links to omitted sources halt; every value a render reaches and the
Jinja2 version key the generation. Migrate the five rendered skills'
sources to the new forms, keep their shipped output byte-identical,
and update the validator rule and the authoring docs.
2026-09-11 16:45:10 -06:00
Alex Verkhovsky d7d4cfffbb feat(renderer): add invocation overrides and conditional sections (#2844)
Add repeatable --set key=value arguments and an --overrides <file.toml>
file to render_skill.py. Shipped defaults, project TOML, user TOML, the
invocation file, and command-line assignments resolve into one effective
customization using the existing structural merge; persistent files are
never written.

Two --set paths that are equal or nested halt as a caller error. The
renderer keeps no separate schema of customization keys: a --set path
must exist in customize.toml, and any invocation override that reaches
no token or condition halts. Values are validated where consumed.

Standalone [[bmad-if:path == literal]] / [[bmad-else]] / [[bmad-endif]]
lines select sections before token and link resolution. A secondary
file that filters to nothing is omitted from the snapshot; workflow.md
filtering to nothing is an error. Condition inputs join the generation
identity so identical output from different inputs still yields
distinct snapshots.

Document both interfaces, ignore the per-machine skills-lock.json, and
cover precedence, equivalent forms, isolation, conflicts, unused
overrides, malformed input, nested conditions, and snapshot reuse.
2026-09-07 19:33:19 -06:00
Alex Verkhovsky 78ffe4031f docs(customize): match the TEA catalog entry to Test Completed Work (#2839)
The modules page said TEA adds risk-based prioritization and
traceability over the built-in QA skill. The page it links to compares
the two generate skills instead. Say what that page says.
2026-09-06 02:33:39 -06:00
BrianandClaude Opus 5 3aa110dfd3 fix(customization): resolve the project root from the working directory (#2802)
* fix(customization): resolve the project root from the working directory

resolve_customization.py inferred the project root by walking up from the
skill's installed directory. For a skill installed under the user's home,
that walk reaches ~ — and when a user-level install has put a ~/_bmad
there, the resolver treats home as the project, finds no override, and
returns shipped defaults. The real project's _bmad/custom/ file is never
opened, with no error and no warning.

Whether an override takes effect therefore depended on where its skill
happened to be installed, which the override's author cannot see from the
override. Every harness installs global skills under ~/<tool>/skills, so
this hits all of them identically.

Resolve from an ordered candidate list instead: the working directory
first (the project is where the user works, not where the skill lives),
then the script's own install path (skills invoke it as
{project-root}/_bmad/scripts/..., so its grandparent is a root the caller
already resolved), then the skill directory as a last resort.

Rank _bmad/ above .git at every depth while walking. A submodule or
nested repo carries .git without being the BMad project, so treating the
two as equal stopped the walk short of the root owning _bmad/custom/ —
the same silent failure, reachable by project-installed skills too.

Break the silence: when the chosen root has no override for the skill but
a rejected candidate does, write a note to stderr naming both roots.
stdout stays pure JSON.

Pass --project-root from all 44 skill and doc invocation sites, matching
resolve_config.py, which already requires it. That asymmetry was the root
cause; with the flag passed there is nothing left to infer.

Fixes #2796

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8Hyqmp2giAVgEAnB49zEQ

* fix(customization): pass --project-root from the party and forge wrappers

resolve_party.py and resolve_personas.py shell out to the customization
resolver with --skill only, though both already hold the project root and
both pass it to resolve_config.py two functions earlier. The resolver
therefore had to infer a root, and since these wrappers capture stderr
and discard it, the note about a masked override went nowhere.

Under the old skill-directory-first inference this happened to land on
the right root for a project-installed skill; under working-directory
-first it takes the ambient root instead, which is wrong whenever the
party runs from a nested project or an unrelated worktree. Passing the
flag removes the inference for both paths rather than trading one wrong
guess for another.

Cover each wrapper with a test that captures the resolver command and
asserts the flag carries the project root it was given.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01L8Hyqmp2giAVgEAnB49zEQ

---------

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-30 23:01:32 -05:00
Alex Verkhovsky a0d04f7e34 docs: consolidate Reference and retire the Diátaxis groups (#2798)
Move Get Answers About BMad under Start and Autonomous Development Loops
under Build. Split the Workflow Map into a planning-skills section on
Choose a Planning Path (with a new planning-skills.svg) and an
implementation-skills section on Build a Change. Consolidate Agents,
Skills, Core Tools, and Advanced Elicitation into one Skills and Agents
page whose agent codes and skill list match the shipped sources. Retire
the v4 upgrade guide and the external-modules prompt, remove the How-To
Guides and Explanation sidebar groups, and redirect every retired route.
2026-08-30 14:57:25 -06:00
Alex Verkhovsky 3bc2271260 docs: add Customize and Extend chapter (#2797)
Create the Customize and Extend chapter after Existing Codebases with five
pages under docs/customize/: Customize BMad, Adopt BMad Across a Team,
Add Modules, Use Web Bundles, Run Multi-Agent Discussions.

Retire eight English pages with redirects: how-to/customize-bmad,
explanation/named-agents, how-to/expand-bmad-for-your-org,
how-to/install-custom-modules, reference/modules, how-to/use-web-bundles,
explanation/web-bundles, explanation/party-mode.

Corrections against shipped sources: the installer has no community
catalog browser (one custom/community prompt with an unverified-module
warning); bmad-prd's checklist key is validation_checklist_template; the
brief template ships under assets/; doc_standards passes run in declared
order; the web-bundle shelf personas now match web-bundles/bundles.json.
2026-08-30 04:22:29 -06:00