magus-affected
Run a target for VCS-diff affected projects
Synopsis
magus affected <target> [flags]
Description
Run a named target for every project that is affected by changes in version control. The active VCS adapter is picked by autodetect from .git, .hg, or .jj at the workspace root, or pinned with MAGUS_VCS_NAME / vcs.name. When MAGUS_VCS_ENABLED=false (or vcs.enabled: false) affected detection short-circuits and falls back to the full project set with the source label "vcs disabled".
A project is affected if any of its source files changed directly, or if a project it depends on is affected (transitive closure over the dependency graph).
Use --stdin to read changed paths from a pipe instead of running a VCS diff. This pairs with magus watch for continuous-build workflows:
magus watch | magus affected --stdin build
Forensic modes reason about the affected set instead of executing a target. --explain shows why a project is in the set. --plan emits a provider-neutral JSON shard plan for the named target. Combine --plan with --stdin for a one-shot plan of proposed paths before editing. --bisect drives VCS bisect using run history to find the commit that introduced a regression.
--preflight works as it does for magus run: the named targets run first across the affected set, a failure stops everything with exit 3 (MGS3020), and a name outside the invoked target's ctx.needs closure is refused (MGS3021). With --plan it gates the plan itself: the pass runs across the planned projects under the charms the invoked target would run with, and the plan prints only when it is green, so a CI workflow that fans shards out from the plan starts none.
Options
- -b string
- Short for --base
- --base string
- Override base ref for the VCS diff (default: MAGUS_VCS_BASE_REF or per-VCS built-in)
- --bisect string
- Drive VCS bisect to find the commit that broke <project>
- --depth int
- With --graph: cap displayed depth (0 = unlimited)
- --detach
- Hand the run to the server and return immediately; follow it with magus status --watch
- --detail
- With --plan: add per-shard detail - the invocation, its spells, the files it declares it writes, and the skills its work routes to
- --explain string
- Show why <project> is in the affected set instead of executing
- --good string
- With --bisect: known-good commit SHA (auto-detected from history when empty)
- --graph
- Render the dependency graph for the affected scope instead of executing
- --impact
- Report the blast radius of the changeset (read-only; runs nothing)
- --max-parallel-budget int
- With --plan: cross-shard concurrency cap; 0 = unlimited
- --max-shards int (default: 8)
- With --plan: maximum CI shards (-1 = unlimited)
- --no-cache
- Force a fresh run even on a cache hit; still refreshes the entry
- --no-default-charms
- Ignore magus.yaml default_charms for this run; with --plan, for its --preflight pass
- --no-redundancy-check
- Run the ci gate even when an identical-or-equivalent gate already passed for this branch on this machine (MGS3010); ci target only
- --null
- With --stdin: expect NUL-separated paths and double-NUL between batches
- --open
- Open this run in the browser log viewer and stream to it as it goes (loopback; never leaves your machine)
- --plan string
- Emit a provider-neutral JSON CI shard plan for the affected set
- --preflight string
- Comma-separated targets to run first across every affected project; each must be in the invoked target's ctx.needs closure (MGS3021), and a failure stops the run before it starts (exit 3, MGS3020). With --plan the pass runs across the planned projects and the plan prints only if it is green
- --race string
- Race-condition diagnostics (watch|replay, comma-combinable); omit to disable. watch: attribution-gated fsnotify detection (MGS4001/4002/4004), emitting only when >=2 projects' output snapshots confirm a shared write. replay: re-runs cacheable output-declaring projects sequentially to content-hash outputs for non-determinism (MGS4003); roughly doubles wall-clock.
- --stdin
- Read changed file paths from stdin instead of running a VCS diff
- --step
- Pause before each subprocess for interactive stepping (needs a TTY; implies --concurrency=1)
- --target string (default: test)
- With --bisect: magus target to bisect
- --timeout duration
- Abort if the run has not finished within this duration (e.g. 5m, 1h30m)
- --upstream
- With --graph: show dependents instead of dependencies
- --wait
- With --detach, block until the run finishes and exit with its status
Targets
- ls
- Print selected projects without executing anything
- build
- Build selected projects
- test
- Test selected projects
- lint
- Lint selected projects (read-only)
- format
- Format source files in selected projects
- clean
- Remove declared outputs from selected projects
- generate
- Run code generation for selected projects
- ci
- Run the magusfile's ci target read-only (affected-set anchor)
Exit status
- 0
- Every affected project's target succeeded. An empty affected set is also 0: nothing changed is a pass, not a fault, so a CI job gating on this stays green on a docs-only commit.
- 1
- At least one target failed, already reported with the path to its captured log.
- 2
- Misuse: no target named, --step without an interactive terminal, or a --preflight target the invoked target never reaches (MGS3021).
- 3
- A --preflight target failed, so nothing of the invoked target ran (MGS3020). The first line names the target, the failing projects and the command that fixes them.
- 75
- Nothing ran, and trying again later would succeed; 75 is EX_TEMPFAIL, the transient-failure convention. A selected project's workspace lock or the machine's build budget was held by another magus invocation (magus never queues behind one; the error names the holder's pid, command and directory), or a ci gate was deferred as redundant under load (MGS3010; the error names the green gate it found and --no-redundancy-check overrides).
Examples
Build projects changed since the default base ref
magus affected build
Use a different base ref
magus affected build --base main
Pipe from watch for continuous builds
magus watch | magus affected --stdin build
List affected projects without building
magus affected list
Show dependency graph for the affected scope
magus affected build --graph
Graph as DOT for piping to Graphviz
magus affected build --graph -o dot | dot -Tsvg > graph.svg
Emit a CI shard plan for the affected set
magus affected ci --plan
Fail fast on drift before the affected set runs ci
magus affected ci --preflight generate
Gate a CI shard plan on drift: no plan, and no shards, unless generate passes
magus affected ci --plan --preflight generate
Shard a test plan across at most four workers
magus affected test --plan --max-shards 4
Bisect a regression in myapp
magus affected --bisect ./apps/myapp
See Also
magus(1), magus-ls(1), magus-describe(1), magus-run(1), magus-x(1), magus-where(1), magus-graph(1), magus-query(1), magus-explain(1), magus-path(1), magus-refs(1), magus-watch(1), magus-events(1), magus-status(1), magus-clean(1), magus-shell(1), magus-vcs(1), magus-queue(1), magus-doctor(1), magus-config(1), magus-session(1), magus-memory(1), magus-job(1), magus-notes(1), magus-diff(1), magus-server(1), magus-broker(1), magus-mcp(1), magus-buzz(1), magus-completion(1), magus-man(1), magus-init(1), magus-spell(1), magus-agent(1), magus-self(1), magus-version(1)