Git status
doma status [<tag>]
status is the read-only twin of run: where run executes a command across a tagged set, status reports each directory's git state — branch, ahead/behind vs upstream, and a dirty-file count — in one table.
$ doma status work
/Users/me/work/api ✔ clean main ↑2
/Users/me/work/web ● 3 dirty feat/x ↓1 ↑4
/Users/me/work/docs ✗ not a git repo
/Users/me/work/legacy ✗ gone
4 repos · 1 dirty · 1 ahead · 1 gone
With no tag, every tracked directory is scanned. Pass a tag (positionally or with -t) to narrow; tag globs work the same as run/list (doma status 'work/*').
What each column means
| Column | Meaning |
|---|---|
✔ clean |
git repo, nothing uncommitted |
● N dirty |
N changed paths (modified + untracked + conflicts) |
✗ not a git repo |
tracked, on disk, but no git working tree |
✗ gone |
path no longer exists — run doma prune --gone |
| branch | current branch, or (detached) for a detached HEAD |
↓N ↑M |
N commits behind / M ahead of upstream (omitted when in sync or no upstream) |
Just the dirty ones
doma status work --dirty
--dirty hides everything clean, leaving only repos with uncommitted work — the fast answer to "what did I leave unfinished across all my work repos?"
Speed
Each directory is probed with one git status call, run in parallel (CPU-count workers by default). Tune with --jobs N on slow disks or very large sets:
doma status --jobs 4
status shells out to your installed git; if git isn't on PATH it stops with a single clear error rather than reporting every repo as a non-repo.
Scripting
doma status work --json | jq -r '.[] | select(.dirty > 0) | .path'
The JSON form carries the full breakdown per entry — branch, upstream, ahead, behind, modified, staged, unstaged, untracked, conflicts, dirty, clean, plus exists/git flags for non-repo and missing paths.