Feature: multi-git / polyrepo workspace support (project root is not a git repo)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 5/5
- Tempo stimato
- Più di una settimana
- Idoneità per principianti
- 30/100
Direzione di ricerca
Inizia leggendo src/bmad_loop/workspace.py e src/bmad_loop/bmadconfig.py, quindi segui i risultati della validazione di git.probe, git.worktree-clean e policy.isolation-repo-root. Confronta il lavoro correlato a #414 e #443 prima di decidere dove debbano risiedere lo stato multi-root e il coordinamento dei commit. Il lavoro è concluso quando sono stati concordati l’ambito e il design, con fixture o casi di test che coprano un workspace non-git e più repository fratelli.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
Request first-class support for polyrepo / multi-git workspaces: a BMAD project whose workspace root is not a git repository, with several sibling git repos under it that a single story may touch and that must be committed separately (per repo, with path allowlists).
Today bmad-loop appears to assume one git root (Workspace.root / repo_root: Path). That model fits monorepos and single-repo projects, but blocks using bmad-loop as the unattended orchestrator for multi-repo product workspaces.
Context / motivation
We run a multi-product workspace roughly like:
quest/ # workspace root — NOT a git repo
├── _bmad/ # BMAD install + custom (shared)
├── AGENTS.md
├── quest-api/ # git repo (.NET / ABP backend)
├── quest-admin/ # git repo (Vue admin monorepo)
├── quest-mobile/ # git repo (Taro + Vue mobile)
└── docs/ # git repo (product docs + BMAD artifacts:
# sprint-status, stories, specs under docs/_bmad-output/)
Realities that matter for orchestration:
- Agents and humans work from the workspace root (shared
_bmad/, shared sprint board, cross-repo stories), not from a single child repo. - One story often spans 2–3 repos (e.g. API + OpenAPI client regen in admin + story/sprint updates in
docs). - Commits must be split by host repo with strict stage allowlists (never
git add .at workspace root; no mixing unrelated dirty trees). - Sprint / implementation artifacts live in
docs/, while code lives in other repos — not under a single git tree that also holds the code.
We already use BMAD Method (planning + implementation skills) and maintain a custom unattended Goal orchestrator for multi-repo serial story execution. We want to align with official bmad-build-auto + bmad-loop where possible, but today the loop’s SCM model does not match this layout.
What we understand works today (and what does not)
Supported (as documented / implemented on main)
- Single git repository as project (or project == git root).
- Monorepo path split via optional
repo_rootin_bmad/bmm/config.yaml: one git root, project dir may differ (e.g. package subdirectory). Documented as monorepo / “git root differs from project dir”. repo_rootis a singlePath(ProjectPaths.repo_root), not a list.- Worktree isolation, baseline match, squash-to-one-story-commit, and
git.worktree-clean/git.probeall operate on that one repo. repo_root ≠ projectis incompatible withisolation = "worktree"(#414 / #443 track plumbing for monorepo+worktree, not multi-git).
Not supported (gap for us)
| Need | Current bmad-loop model |
|---|---|
Workspace root with no .git |
Preflight expects a git worktree (git.probe, clean check) |
| Multiple sibling git repos | Single Workspace.root / repo_root |
| One story → N commits (one per touched repo) | Squash / story commit against one repo |
| Per-repo stage allowlists | Single-tree git add / commit semantics |
| Sprint board in repo A, code in repos B/C | Artifacts can sit outside the tree, but code+commit still one root |
Workarounds we considered and rejected as primary path:
- Point
--projectatquest-apionly → loses admin/mobile/docs in the same loop. - Four independent loop installs → four boards, no cross-repo hard gates.
- Collapse into one monorepo → incompatible with our release/ownership model.
Desired outcomes (product)
Minimal viable multi-git support would let us:
- Set project = workspace root (may have no git).
- Declare one or more git roots (sibling repos) that the orchestrator may touch.
- Run the usual pick story → build-auto → verify → review → commit loop with sessions still cwd’d at the workspace root (so agents see all trees +
_bmad). - On commit boundary:
- detect which configured roots have changes for this story,
- commit per root (optional message template still OK),
- never require the workspace root itself to be a git repo,
- optionally enforce per-root path allowlists / ignore patterns.
- Preflight:
- each configured root is a git repo and (policy-dependent) clean enough to start,
- missing root or non-git path is a clear validate finding.
Nice-to-have (later):
- Per-story or per-epic primary repo + optional secondary roots.
- Worktree isolation per root (or only for roots that are dirty / opted in).
- Verify commands with cwd per root (e.g.
dotnet testin api,pnpm testin admin). - Documented guidance for “BMAD artifacts in a docs-only repo”.
Non-goals (for this request)
- Replacing multi-package monorepos (already covered by
repo_root). - Automatic PR creation across remotes.
- Parallel multi-root fan-out (serial per story is fine).
Suggested design sketch (for discussion, not a demand)
Something like (names illustrative only):
# .bmad-loop/policy.toml or _bmad/bmm/config.yaml
[scm]
# project may be a non-git workspace root
mode = "polyrepo" # or isolation remains "none"|"worktree" per root later
[[scm.repos]]
id = "api"
path = "quest-api" # relative to project
# optional: verify_commands, commit_message_template, path_allowlist
[[scm.repos]]
id = "admin"
path = "quest-admin"
[[scm.repos]]
id = "docs"
path = "docs"
Engine changes (high level):
Workspace/ commit / baseline APIs become multi-root-aware (or a thin coordinator over N single-root workspaces).git.probe/ clean checks iterate configured roots.- Story completion records N SHAs (or a map id→sha) instead of one
commit_sha. bmad-build-autocan keep writing specs underimplementation_artifacts(often in the docs repo); the loop only needs to accept multi-root dirty trees without treating “workspace root is not git” as fatal.
Happy to adjust this to whatever fits the existing Workspace seam better.
Environment
- BMAD-METHOD: planning upgrade to ≥ 6.11 (
bmad-build-auto); currently on 6.10 withbmad-dev-auto. - bmad-loop: module present in project (
bmad-loop-setup/ skills); not adopted as main orchestrator because of multi-git gap. - Host OS: macOS.
- Coding agents: Grok Build CLI / Claude / Codex as available.
References (upstream)
- README: Worktree isolation +
repo_rootmonorepo note (“decouples where git/code work happens from where run state lives”) src/bmad_loop/workspace.py: singleroot/repo_rootsrc/bmad_loop/bmadconfig.py:repo_root: Path; worktree+repo_rootrefusal- Validate findings:
git.probe,git.worktree-clean,policy.isolation-repo-root - Issues #414 / #443 (monorepo + worktree plumbing) — related but not multi-git
Ask
- Is multi-git / polyrepo on the roadmap, or intentionally out of scope?
- If in scope, would you prefer a policy-driven
[[scm.repos]]model vs requiring a synthetic parent git (submodules/subtree) that we do not want? - Any recommended interim pattern for “artifacts in docs repo + code in sibling repos” that still uses official build-auto under a thin external orchestrator?
Thanks — happy to supply a minimal public fixture layout or test cases if useful.
- Lingua principale
- Python
- Stelle
- 174
- Fork
- 72
- Merge medio
- 19h 25m
- PR unite (30g)
- 84
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di bmad-code-org/bmad-loop
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 69/100
bmad-code-org/bmad-loop#973 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
bmad-code-org/bmad-loop#965 ·
I maintainer di solito rispondono entro 1 giorno
-
[BUG] diagnose/probe-adapter leak guard misses Stripe, Slack app-level, SendGrid and PyPI keys, and non-http URL credentialsForse già presa @CloneOfAlex l’ha presa oggi. Apertabug
Difficoltà 3/5 Mezza giornata Idoneità per principianti 25/100
bmad-code-org/bmad-loop#1026 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 72/100
bmad-code-org/bmad-loop#1004 ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 49/100
bmad-code-org/bmad-loop#1002 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di bmad-code-org/bmad-loop
Issue simili
-
ci-rerun: collect.py fails a whole pr-babysit cycle on one transient GitHub 5xx and never retriesApertafollow-up
Difficoltà 2/5 1-3 ore Idoneità per principianti 62/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 2/5 1-3 ore Idoneità per principianti 70/100
-
Built-in QUBO fallback applies bitwise xor to floating binary statesForse già presa @iloveeyjafjalla l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
qboson/kaiwu-pytorch-plugin#1702 ·
I maintainer di solito rispondono entro 3 giorni
-
bug v2
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
modelcontextprotocol/python-sdk#3811 ·
I maintainer di solito rispondono entro 1 giorno
-
cost:cheap practicality:seen-in-the-wild severity:medium
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
fairagro/m4.2_advanced_middleware_api#620 ·
I maintainer di solito rispondono entro 1 giorno