You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This commit was created on GitHub.com and signed with GitHub’s verified signature.
Changed
BREAKING: the project is renamed bmad-auto → bmad-loop. The distribution, console script,
and CLI are now bmad-loop; the Python package is bmad_loop (was automator); the BMAD module
code and marketplace plugin are bmad-loop (was bauto); per-project state moves from .automator/ to .bmad-loop/. The GitHub repo is now bmad-code-org/bmad-loop — old web and git URLs
redirect. Clean break: no compatibility shims.
BREAKING: renamed public identifiers. Env vars BMAD_AUTO_* → BMAD_LOOP_*; plugin
entry-point group bmad_auto.plugins → bmad_loop.plugins; hook relays bmad_auto_hook.py / bmad_auto_probe_hook.py → bmad_loop_hook.py / bmad_loop_probe_hook.py; skills /bmad-auto-{setup,sweep,resolve} → /bmad-loop-{setup,sweep,resolve}; tmux session/window
prefixes bmad-auto-* → bmad-loop-*; worktree branches automator/<run-id> → bmad-loop/<run-id>; TUI class BmadAutoApp → BmadLoopApp. Custom plugins, CLI profiles, and
policy files that reference any of these must be updated.
Added
New pre_commit_gate plugin workflow-injection stage. Gate workflows can bind to pre_commit_gate, which fires unconditionally just before every commit — on the review-converged,
review-skipped, and review-budget-rescue paths alike — while the phase can still legally defer.
TEA's trace/nfr/review gates rebind to it, fixing blocking gates that were previously inert
whenever a dev session recommended no review follow-up (so on_pre_commit fail-opened on the
missing artifacts).
Fixed
A workflow session that finishes its work but never writes a completion marker no longer
livelocks the run. Each result-less Stop used to refill the stall-nudge budget, re-nudging a
responsive-but-signal-less session until session_timeout_min. The engine now appends an explicit
completion contract (absolute marker path + frontmatter shape) to every workflow-session prompt,
and a new limits.workflow_stall_nudges_cap (default 3) caps the total nudges a workflow session
may receive — degrading a still-missing marker to "stalled" in ~30 min instead of hours. Dev/review
session nudging is unchanged.
On Windows, a live engine whose process identity can't be read now shows UNKNOWN instead of a
false INTERRUPTED. psutil raises ERROR_ACCESS_DENIED for a process in another session or
elevation, which the identity-aware liveness read had surfaced as dead — mislabeling running runs
and weakening the resume/delete guards. Liveness is now tri-state (alive/dead/unknown) and
biased away from false-dead; resume, resolve, delete, archive, and cleanup all surface and
warn on unknown without ever letting an unverifiable pid block cleanup forever, and resolve
gains --force to override a squatted-pid block.
A review session that appends to the deferred-work ledger no longer leaves a sweep bundle
unclosed. The bundle ledger is reclosed after review (journaled distinctly as sweep-bundle-reclosed), and the review prompt now states the ledger is append-only for sessions.
Worktree git-exclude patterns now anchor correctly on native Windows.install.py normalizes
backslashes in the per-worktree exclude paths so the ignore rules match (a no-op on POSIX).
Migration
Reinstall the tool under its new name — uv can't rename a package in place: uv tool uninstall bmad-auto, then uv tool install "bmad-loop[tui] @ git+https://github.com/bmad-code-org/bmad-loop.git".
Re-run /bmad-loop-setup (or bmad-loop init directly). init migrates a project in place:
it strips the old .automator/ Stop hook from each CLI's settings, removes the bmad-auto-*
skill dirs, and carries .automator/policy.toml over to .bmad-loop/policy.toml. Setup folds the
old bauto config into bmad-loop and clears the leftover bauto config section, stale BMAD Automator Skills help rows, and the _bmad/bauto/ installer dir.
Legacy .automator/ is left in place (runs, archives, profiles, plugins) and can be deleted
or hand-moved once the migration is confirmed; stale .automator/* gitignore lines are left
untouched.