// ZVCS — VERB REFERENCE

zvcs v0.22.5 · 119 superset verbs · generated from src/extensions/src/superset/manpage.rs, the same table git help <verb> renders

Hub Report GitHub
// Color scheme

>_SUPERSET VERBS

The 119 z* verbs — the coordination layer stock git has no equivalent for. Every entry is the verb's man page: git help <verb> shows the same text in a terminal.

Index

  • zsync reconcile every submodule to its tracked mainline, attached
  • zbump forward-only submodule gitlink bumps, then commit them
  • zdaemon control the singleton machine-wide coordinator
  • zconfig inspect and toggle the daemon's [zvcs] feature switches
  • zrepos list indexed git repositories
  • zreindex (re)crawl for git repositories and refresh the index
  • zjobs list recent async jobs
  • zjob show or control an async job
  • zcommit queue an atomic staged-commit job
  • zpush queue an async push job with a fast-forward pre-flight
  • zsubmit run an arbitrary command as an async daemon job
  • zrepl interactive console over every zvcs command
  • zbanner reprint the zrepl startup banner
  • zclaim lease a repository for this session
  • zunclaim release a repository lease
  • zwho list active claims
  • zstatus working-tree status of indexed repositories
  • zlog machine-wide reflog timeline across indexed repositories
  • zundo rewind a repository one reflog step
  • zsnapshot record the tree's HEADs as a restore point
  • zrestore reset the whole tree back to a snapshot
  • zsnapshots list snapshots
  • zworktree tree-wide private worktrees
  • zstash stash every dirty repo in the tree as one unit
  • zunstash pop the tree-wide stash back
  • zstashes list tree-wide stashes
  • zup reconcile the tree at cwd to latest origin/main
  • zforeach run a command across all or a subset of indexed repos
  • zselectors the shared selector grammar the parallel verbs accept
  • zhook manage the current repo's ref-change hook
  • ztrigger arm any directory to run a command on every ref-change
  • zwatch watch a directory's status without running a command
  • zshadow install the ~/.zvcs shadow and print the shell lines for it
  • zdashed install git-<verb> symlinks and man pages
  • zverbs list every zvcs extension verb and its usage
  • zcd change the working directory (for the zrepl console)
  • zpwd print the working directory
  • zls git-aware directory listing
  • zenv print, set, or query environment variables
  • zunset remove environment variables
  • zecho print arguments joined by a space
  • zdoctor health check of the zvcs environment
  • zmkdir create directories
  • ztouch create files or update their mtime
  • zrm remove files and directories
  • zcp copy files and directories
  • zmv move or rename files and directories
  • zcat print file contents
  • zln create a hard link or symlink
  • zheads HEAD of every indexed repo, in parallel
  • zdirty list indexed repos with tracked changes
  • zbranches local branches of every indexed repo
  • ztags tag count of every indexed repo
  • zremotes remotes and URLs of every indexed repo
  • zsize on-disk .git size of every indexed repo
  • zage HEAD commit age of every indexed repo
  • zpull parallel fetch + fast-forward of every indexed repo
  • zattach re-attach every detached-HEAD indexed repo to its mainline
  • zgrep parallel content search across indexed repos
  • zahead indexed repos ahead of their upstream
  • zbehind indexed repos behind their upstream
  • zunpushed per-repo unpushed commits (the detailed zahead)
  • zunpulled per-repo commits the upstream has that local lacks
  • zauthors commit counts by author across indexed repos
  • zhot indexed repos ranked by recent activity
  • zconflicts indexed repos mid-operation or conflicted
  • zfetch parallel git fetch across indexed repos
  • zgc parallel git gc across indexed repos
  • zfsck parallel git fsck across indexed repos
  • zprune parallel git prune across indexed repos
  • zreset parallel git reset across indexed repos
  • zabort abort an in-progress operation across mid-op repos
  • zcheckout check out a branch in every repo that has it
  • ztagall create a tag at HEAD in every indexed repo
  • zcommitall commit tracked changes across every dirty repo
  • zpushall push every indexed repo that is ahead
  • zclean remove untracked files across indexed repos
  • zwait block until a repo's async jobs drain
  • zqueue list queued and running async jobs
  • zbarrier block until the async queue is idle
  • zstale indexed repos not committed to in a while
  • zlast indexed repos by most recent commit
  • zbig largest tracked files across indexed repos
  • zfiles tracked file count per indexed repo
  • zcommits HEAD-history commit count per indexed repo
  • zpristine indexed repos that are clean and in sync
  • zdivergent indexed repos diverged from upstream
  • zorphans indexed repos with no remote
  • zsessions active sessions ranked by repos held
  • zidle indexed repos with no active claim
  • zdashboard live tiled TUI: fleet, events, and commands on one screen
  • ztop live htop-style fleet monitor, most churn on top
  • zevents one live feed of commits/reconciles/status-changes across the tree
  • ztail alias of git zevents
  • znative the plugin package manager: install and load native and script plugins
  • zintercept AOP hooks that run advice around matching git commands
  • zcommands live feed of every git command run across the fleet
  • zaudit queryable audit trail over the fleet command log
  • zscan parallel secret scan of tracked content across the fleet
  • zsigs fleet commit-signature check (verify-sigs)
  • zreview aggregate the pending uncommitted change across the fleet
  • zremote fleet-wide remote-URL rewrite
  • zrollback fleet-wide undo of the last mutating operation
  • zsched daemon-hosted scheduled fleet commands (a built-in cron)
  • zpin freeze a repo from daemon autonomy
  • zunpin unfreeze repos pinned from autonomy
  • zbroadcast post and read inter-agent messages
  • zhandoff hand a repo's claim to another agent session
  • zon run a command on a semantic feed event
  • zsince what happened across the tree since a time
  • zcontend live agent-vs-agent contention across the tree
  • zwaitfor block until a tree-wide state holds
  • zgraph fleet topology of duplicate checkouts
  • zrewind restore the whole tree to a wall-clock time
  • zguard declarative fleet-wide command policy (refuse or warn)
  • zpolicy alias of git zguard (command policy)
  • zppid per-process commit tally, attributed to the durable process
  • zprocs per-process breakdown of mutating commands
  • zprecache precompute the log caches for recent commits

Manual

git zsync reconcile every submodule to its tracked mainline, attached

git zsync [<path>...]

Fetches and fast-forwards every submodule to its tracked mainline (origin/main, else origin/master), leaving HEAD attached to that branch — detached HEAD never happens.

Fast-forward only; a submodule whose worktree is dirty or whose history has diverged is skipped rather than forced. Optional paths limit the operation to the named submodules.

↑ index

git zbump forward-only submodule gitlink bumps, then commit them

git zbump [<submodule-path>...]

Advances the parent repository's recorded gitlink for each submodule to that submodule's current HEAD, but only when the new commit is a descendant of the recorded one — a forward-only bump that can never regress a pointer.

The coalesced bumps are then committed, clearing git's "(new commits)" status marker. Paths limit the set of submodules considered.

↑ index

git zdaemon control the singleton machine-wide coordinator

git zdaemon <start|stop|restart|reload|status|info|ping|log>

Controls the one machine-wide daemon (state under ~/.zvcs, socket ~/.zvcs/zvcs.sock) that replaces git's index.lock with a fair per-repo queue and hosts the async job queue, the SQLite ledger, and reactive autonomy.

start/stop bring it up and down; restart and reload respawn it, re-reading config; status and info report liveness and pid/socket/paths/config; ping is a scriptable liveness check; log [-n N] [-f] shows or tails ~/.zvcs/zvcs.log, whose every line opens with a local RFC-3339 stamp (2026-08-20T14:03:11-07:00) ahead of its [zvcs ...] tag.

↑ index

git zconfig inspect and toggle the daemon's [zvcs] feature switches

git zconfig [<name> [on|off|<count>|default]]

Turns the daemon's autonomy features on and off from the CLI instead of hand-editing ~/.gitconfig. With no argument it lists every setting, its effective value, and whether it is set in your config (marked *) or showing the built-in default.

The boolean switches are autoreconcile (auto-sync submodules to origin/main on change), autobump (forward-only gitlink bumps + commit), autocrawl (crawl zvcs.crawlroots into the index on daemon start), autostatus (recompute a repo's status cache when it changes), autohook (fire each repo's zvcs.hook on change), and autodups (fan a commit out to local duplicate checkouts) — all off by default. Set them with git zconfig <name> on|off.

The numeric knobs are statusinterval (status-cache backstop sweep in seconds, default 10, 0 disables), watchmru (file-watch the N most-recently-used repos, default 512, 0 disables), and interval (autonomy debounce in seconds, default 30). Set them with git zconfig <name> <count>.

git zconfig <name> shows a single setting; git zconfig <name> default reverts it to the built-in default; git zconfig all on|off flips every autonomy switch at once (off also zeroes the two background loops so the daemon idles).

Writes go to the global config (~/.gitconfig), the file the daemon reads. A change reloads a running daemon automatically so it takes effect at once; if no daemon is running the new value applies on its next start (toggling never spawns one).

↑ index

git zrepos list indexed git repositories

git zrepos [<pattern>...] [--json]

Lists every git repository in the machine-wide index, one path per line (pipe-clean), a drop-in for a shell repo-list.

Patterns filter the output by case-insensitive substring match.

↑ index

git zreindex (re)crawl for git repositories and refresh the index

git zreindex [--sync|--async] [<path>...]

Crawls for git repositories and records them in the ledger, pruning ones deleted from disk. The walk is parallel and skips mounts that would hang a whole-device scan (kernel pseudo-filesystems, network volumes, the macOS data-volume firmlink).

At a terminal it runs async by default — the crawl detaches and results go to zvcs.log; piped or scripted it runs inline so "indexed N, pruned M" stays on stdout. --sync and --async override the default.

↑ index

git zjobs list recent async jobs

git zjobs [-n <count>] [--json]

Lists recent jobs from the ledger, newest first. -n limits the count.

↑ index

git zjob show or control an async job

git zjob <id> | git zjob <stop|restart> <id>

Shows one job's ledger record, or stops (cancels) / restarts (re-enqueues) a running or queued job by id.

↑ index

git zcommit queue an atomic staged-commit job

git zcommit [<path>...] -m <msg> [--push]

Submits a fire-and-forget staged-commit job to the daemon and returns a job number; --push chains a push after the commit.

Falls back to synchronous execution when no daemon is running.

↑ index

git zpush queue an async push job with a fast-forward pre-flight

git zpush [<refspec>]

Submits a fire-and-forget push job to the daemon. A network-free / live ls-refs pre-flight refuses a non-fast-forward before the job is enqueued. Falls back to synchronous execution when no daemon is running.

↑ index

git zsubmit run an arbitrary command as an async daemon job

git zsubmit [--] <command> [args...]

Ships an arbitrary command to the daemon's worker pool as an async job and prints the job id. Track it with git zjobs and git zjob <id> (which shows its state and captured output), and cancel it with git zjob stop <id> — the same ledger and controls as zcommit/zpush.

The command runs in the current directory (a git repository is not required — a repo-less job simply records with no repo) with no shell, so submit sh -c "..." when you need pipes, redirects, or globbing. It runs with the submitter's carried git-identity environment; otherwise it inherits the daemon's. With no daemon running, it executes inline.

↑ index

git zrepl interactive console over every zvcs command

git zrepl

Opens an interactive line console. Each line is run exactly as git <line> would be, so it drives every dispatchable command — the z* superset verbs and every git-compat porcelain command alike (the latter operating on the current repository), doubling as a live daemon/ledger console.

A line is word-split the way git splits an alias value: single and double quotes group their contents and a backslash escapes the next character, so commit -m "two words" reaches the verb as one argument. Nothing else is expanded — no variables, no globs — and an unclosed quote is reported without ending the session.

On a terminal it opens with a stats banner and full line editing: Tab completes the command word against every verb (superset + porcelain), with command history persisted across sessions. Piped stdin falls back to a raw line reader so scripts and heredocs stay usable. Type exit or quit, or press Ctrl-D, to leave.

↑ index

git zbanner reprint the zrepl startup banner

git zbanner [--color|--no-color]

Prints the banner git zrepl shows at startup: the zvcs logo, then a box of live stats — os/arch/pid, core count, indexed repository count, and the superset/git-compat/total verb counts.

Every number is read at call time, so re-running it inside a console reflects the tree as it is now (repos indexed since the console opened, a newer build's verb counts) rather than as it was at startup. The repository count comes from the ledger and reads as — when no index exists yet.

Color is on for a terminal unless NO_COLOR is set; --color and --no-color (alias --mono) force it either way, so the ANSI form can be redirected to a file and the plain form kept on a tty.

↑ index

git zclaim lease a repository for this session

git zclaim [<path>]

Takes an advisory per-repo lease for the current session (ZVCS_SESSION), refusing if another agent already holds it, so concurrent agents do not collide on the same repository.

↑ index

git zunclaim release a repository lease

git zunclaim [--force] [<path>]

Releases a lease held on a repository. --force releases a lease held by another session.

↑ index

git zwho list active claims

git zwho [--json]

Lists active claims — which session holds a lease on which repository.

↑ index

git zstatus working-tree status of indexed repositories

git zstatus [--all] [--json]

Reports the current repository's working-tree status live. --all reads every indexed repository's status from the daemon-maintained cache with no filesystem walk.

↑ index

git zlog machine-wide reflog timeline across indexed repositories

git zlog [-n <count>]

Merges every indexed repository's reflog into one machine-wide timeline, newest first. -n limits the count.

↑ index

git zundo rewind a repository one reflog step

git zundo [<path>]

Rewinds a repository one reflog step — a reset --hard to the previous HEAD. Refuses on a dirty worktree.

↑ index

git zsnapshot record the tree's HEADs as a restore point

git zsnapshot <name>

Records the HEAD of the repository and every nested submodule as one named restore point.

↑ index

git zrestore reset the whole tree back to a snapshot

git zrestore <name>

Resets the whole tree — the repository and every nested submodule — back to a named snapshot.

Each repository is reset hard to its recorded commit, so tracked changes are discarded and untracked files are left alone. A snapshot records commit ids, not branch names: the branch checked out at restore time is the one moved onto the recorded commit, and whatever it pointed at is reachable afterwards only through its reflog.

A repository that cannot be reset — moved, removed, or missing the recorded commit — is named on stdout and counted in the summary, and the run exits non-zero rather than reporting a half-restored tree as a success.

↑ index

git zsnapshots list snapshots

git zsnapshots

Lists snapshot names and their repository counts.

↑ index

git zworktree tree-wide private worktrees

git zworktree <add <name>|list|remove <name>>

add <name> provisions a complete, object-sharing, isolated worktree of the repository plus all nested submodules (each on a zwt/<name> branch) at ~/.zvcs/worktrees/<name>/, so each agent gets a private tree that cannot collide with any other — no re-clone.

list and remove <name> manage them.

remove tears down the worktree tree and, in each repository, the linked-worktree metadata it provisioned — identified by the round trip between the worktree's .git pointer and that metadata's own gitdir file. A pointer that is unreadable, malformed, symlinked, or names anything else is refused by name on stderr and left on disk, and the command exits non-zero rather than deleting a path it cannot prove it wrote.

↑ index

git zstash stash every dirty repo in the tree as one unit

git zstash [<name>]

Parks uncommitted work across every dirty repository in the tree as one named unit.

↑ index

git zunstash pop the tree-wide stash back

git zunstash [<name>]

Restores (pops) a tree-wide stash, last-in-first-out, applying onto the same commits it was stashed on. A repository whose HEAD has since moved is reported and its stash kept intact.

↑ index

git zstashes list tree-wide stashes

git zstashes

Lists tree-wide stashes and their repository counts.

↑ index

git zup reconcile the tree at cwd to latest origin/main

git zup [<path>]

Brings the whole tree — the top-level repository and every nested submodule — to latest origin/main (fetch, then fast-forward, staying attached). A dirty or diverged repository is skipped.

↑ index

git zforeach run a command across all or a subset of indexed repos

git zforeach [<selectors>] -- <command>...

Runs a command across all indexed repositories, or a subset, in parallel.

Selectors: a bare <pattern> (substring), --repo <p>, --dirty, --ahead, --behind, --claimed, and --session <s>. Everything after -- is the command to run in each selected repository. See git help zselectors for the full selector grammar.

↑ index

git zselectors the shared selector grammar the parallel verbs accept

git zselectors

Many superset verbs take an optional leading [selectors] argument that narrows which indexed repositories they act on — zforeach, zheads, zdirty, zpull, zgrep, zfetch, zgc, zcommitall, and the rest. This page documents that shared grammar; git zselectors prints a short version to the terminal.

With no selector a verb acts on EVERY indexed repository. The selectors are: a bare <pattern>, a case-insensitive substring matched against each repo's working-tree path (repeatable — all patterns must match); --repo <pattern>, the same thing spelled out; --dirty, repos with uncommitted tracked changes; --ahead and --behind, repos ahead of or behind their upstream; --claimed, repos with an active lease (git zclaim); and --session <s>, repos leased by session <s>.

Selectors COMPOSE with AND — a repo must match every selector given (so --ahead --behind is empty, since a repo is never both). --dirty, --ahead, and --behind read the daemon's status cache (kept warm by the status maintainer), so they reflect the last scan rather than a live check.

Examples: git zheads (all repos) vs git zheads cask (only repos whose path contains "cask"); git zforeach --dirty -- git status runs git status in every dirty repo; git zpull --behind fast-forwards only the repos behind their upstream; git zgrep --repo web TODO searches "TODO" in repos matching "web".

↑ index

git zhook manage the current repo's ref-change hook

git zhook <set <command>|unset|show|list|test>

Manages and tests the current repository's ref-change hook (zvcs.hook), which the daemon runs on every ref-change when zvcs.autohook is enabled. set installs a command, unset removes it, show/list display it, and test runs it once.

↑ index

git ztrigger arm any directory to run a command on every ref-change

git ztrigger <DIR> <command>... | git ztrigger <list|rm DIR|test DIR>

The directory-addressed front-end to the hook system: unlike zhook (current repo only) it takes an explicit path, so any repository on the machine can be wired without cd-ing into it, and it flips the master switches itself — no raw git config needed.

git ztrigger DIR CMD writes DIR's local zvcs.hook, indexes DIR, turns on the global zvcs.autohook switch, and reloads the daemon, so CMD runs on every ref-change in DIR. list, rm DIR, and test DIR manage armed triggers.

↑ index

git zwatch watch a directory's status without running a command

git zwatch <DIR> | git zwatch <list|rm DIR>

The command-less form of ztrigger: it indexes DIR and turns on zvcs.autostatus so the daemon maintains DIR's cached status on every ref-change, without running any command. list and rm DIR manage watches.

↑ index

git zshadow install the ~/.zvcs shadow and print the shell lines for it

git zshadow [<dir>] [-n|--print] [--all]

Sets up the whole shadow install in one command: a git symlink to this binary in <dir> (default ~/.zvcs/bin), a git-<verb> dashed link beside it for every verb the dispatcher serves, every superset man page under ~/.zvcs/man, the HTML documentation set under ~/.zvcs/share/doc/git-doc (what git help -w <cmd> opens for every page git's own installed HTML manual does not hold), and the zvcs-forked zsh completion as ~/.zvcs/completions/_git. Everything installed is compiled into the binary, so nothing is needed from the source tree.

stdout carries shell code only — the export PATH line for the bin directory, the export MANPATH line for the man directory, and the fpath line for the completion directory — so eval "$(git zshadow)" sets the current shell up and the same lines paste into ~/.zshrc. The install summary goes to stderr, where an eval leaves it alone.

A PATH or MANPATH line the environment already satisfies is printed commented out, so re-evaluating never duplicates an entry and the line is still visible to uncomment when pasting into an rc file; --all prints every line uncommented. fpath is a zsh variable rather than an exported one, so it cannot be inspected from here and its line is always live — put it before compinit, and typeset -U fpath keeps repeats harmless.

-n (--print) prints the lines without installing anything. Paths under $HOME are written as $HOME/... so the lines are portable across machines.

Homebrew installs this binary as zvcs rather than git, so the bootstrap there is zvcs zshadow — the same command under its other name. Once the printed PATH line is in effect, git is this binary and git zshadow is the way to re-run it, which a brew upgrade calls for: the shim points at the binary that installed it.

Idempotent: a correct symlink is left alone, a stale one is repointed, a real file of the same name is never clobbered, and the completion is rewritten only when its content differs.

↑ index

git zdashed install git-<verb> symlinks and man pages

git zdashed [<dir>]

Installs a git-<verb> symlink for every builtin and superset verb into <dir> (default ~/.zvcs/bin), so the dashed external forms resolve to this binary once stock git is removed.

It also writes every extension man page under ~/.zvcs/man, so man git-<verb> resolves when that directory is on MANPATH, and the HTML documentation set under ~/.zvcs/share/doc/git-doc, so git help -w <cmd> finds a page for every command without generating one first, on a host whose git installation ships no HTML manual of its own.

↑ index

git zverbs list every zvcs extension verb and its usage

git zverbs [--json]

Lists every zvcs extension (z*) verb with its one-line usage, sourced from each verb's own -h so the listing can never drift.

↑ index

git zcd change the working directory (for the zrepl console)

git zcd [<dir>|-]

Changes the process working directory: no argument goes to $HOME, - goes to the previous directory ($OLDPWD), and a leading ~ expands to $HOME. OLDPWD and PWD are updated so zcd - round-trips, exactly as a shell's cd does.

The zrepl console runs each line in one long-lived process, so a zcd persists across lines — it is what makes the console navigable like a shell. Run standalone it only moves this process's cwd (it cannot change the parent shell's), so it is aimed at the console.

↑ index

git zpwd print the working directory

git zpwd

Prints the current working directory. Paired with zcd for shell-like navigation inside the zrepl console.

↑ index

git zls git-aware directory listing

git zls [-alrt] [<path>]

Lists a directory with a two-column git status field per entry, like eza --git: the first column is the staged status (index vs HEAD), the second the unstaged status (worktree vs index). Letters follow eza: N new, M modified, D deleted, R renamed, C copied, T type-change, U conflicted, I ignored, and - unchanged. A directory folds the status of the paths under it, so a subtree with any change is flagged. Outside a git repository the column is omitted.

Flags: -a includes dotfiles, -l is a long listing (permissions, size, relative mtime), -t sorts by modification time (newest first), and -r reverses. The per-path status is the same walk git status performs.

On a terminal the output is colored from the same palette eza uses: LS_COLORS for file kinds and *.ext extensions, then EXA_COLORS/EZA_COLORS for the permission bits, size, date, git columns, and punctuation — so it matches the user's eza. NO_COLOR disables color.

↑ index

git zenv print, set, or query environment variables

git zenv [<NAME=VALUE>...|<NAME>...]

With no arguments, prints every environment variable as NAME=VALUE, sorted. A NAME=VALUE argument sets that variable; a bare NAME prints its value (nothing if unset).

In the zrepl console a variable set with zenv persists for every later git line — set GIT_AUTHOR_NAME, ZVCS_SESSION, and the like once and the whole session sees it.

↑ index

git zunset remove environment variables

git zunset <NAME>...

Removes one or more environment variables from the process, the complement of zenv NAME=VALUE. In the zrepl console the change persists for later git lines.

↑ index

git zecho print arguments joined by a space

git zecho [-n] [<arg>...]

Prints its arguments joined by a single space. A leading -n suppresses the trailing newline. Arguments are printed literally — there is no shell variable or glob expansion.

↑ index

git zdoctor health check of the zvcs environment

git zdoctor

Runs a set of environment checks and prints each as OK, WARN, or FAIL: whether this binary is the git on PATH, whether $ZVCS_HOME exists and can be written, whether the coordinator daemon is running, whether the ledger opens and answers a query, how many man pages are installed, whether ~/.zvcs/man is on MANPATH, and whether the dashed git-<verb> symlinks are installed.

The two states that stop zvcs working are FAIL: a home that exists but cannot be written, and a ledger that exists but cannot be read — a corrupt or unreadable store leaves the file in place while every verb that reads it exits non-zero, so a check that only looked for the path reported OK straight through it. Everything else is advisory and reports WARN, which keeps a non-zero exit meaningful.

The process exits non-zero only when a hard FAIL is found, so it is usable in scripts and CI.

↑ index

git zmkdir create directories

git zmkdir [-p] <dir>...

Creates each named directory. -p creates any missing parent directories and does not error if the directory already exists. A native filesystem convenience for the zrepl console.

↑ index

git ztouch create files or update their mtime

git ztouch <file>...

Creates each named file if it does not exist (leaving existing contents intact) and updates its modification time to now, like the shell's touch.

↑ index

git zrm remove files and directories

git zrm [-r] [-f] <path>...

Removes files from the filesystem — this is not git rm (which stages a removal in the index); it deletes on disk. -r removes directories recursively, -f ignores paths that do not exist. Symlinks are removed, never followed.

↑ index

git zcp copy files and directories

git zcp [-r] <src>... <dst>

Copies files; -r copies directories recursively. With several sources, <dst> must be an existing directory and each source is copied into it under its own name; with one source and a non-directory <dst>, <dst> is the copy's name.

↑ index

git zmv move or rename files and directories

git zmv <src>... <dst>

Moves or renames paths. With several sources, <dst> must be an existing directory. A rename is used when possible, falling back to copy-then-remove when the move crosses filesystems. This is not git mv (which also updates the index); it only moves on disk.

↑ index

git zcat print file contents

git zcat <file>...

Writes each named file's bytes to stdout, in order, like the shell's cat.

↑ index

git zln create a hard link or symlink

git zln [-s] <target> <link>

Creates <link> pointing at <target>: a hard link by default, or a symbolic link with -s.

↑ index

git zheads HEAD of every indexed repo, in parallel

git zheads [selectors] [--json]

Prints each indexed repository's checked-out branch (or (detached)/(unborn)), short HEAD id, and a * when the worktree has tracked changes — a one-glance view of where every repo in the machine sits.

Selectors are the same as zforeach: bare <pattern>, --repo <p>, --dirty, --ahead, --behind, --claimed, --session <s>. The probe is a native gix read run across all repos on a bounded worker pool.

↑ index

git zdirty list indexed repos with tracked changes

git zdirty [selectors] [--json]

Lists only the indexed repositories whose worktree has uncommitted tracked changes (the same "dirty" gix reports for zstatus; an untracked-only repo counts as clean). Scanned in parallel. Selectors narrow the set as in zforeach.

↑ index

git zbranches local branches of every indexed repo

git zbranches [selectors] [--json]

Prints each indexed repository's local branch names, grouped by repo, scanned in parallel.

↑ index

git ztags tag count of every indexed repo

git ztags [selectors] [--json]

Prints how many tags each indexed repository has, scanned in parallel.

↑ index

git zremotes remotes and URLs of every indexed repo

git zremotes [selectors] [--json]

Prints each indexed repository's remotes and their fetch URLs, grouped by repo, scanned in parallel.

↑ index

git zsize on-disk .git size of every indexed repo

git zsize [selectors] [--json]

Prints each indexed repository's on-disk .git size, largest first, with a total, so the heaviest repos in the tree are obvious. Sizes are summed with a native filesystem walk in parallel.

↑ index

git zage HEAD commit age of every indexed repo

git zage [selectors] [--json]

Prints how long ago each indexed repository's HEAD commit was made (a relative time like 3 days ago), scanned in parallel — a quick read of which repos are stale.

↑ index

git zpull parallel fetch + fast-forward of every indexed repo

git zpull [selectors]

Fetches and fast-forwards every selected indexed repository to its tracked mainline, in parallel, using the same native ff-only reconcile as zsync: a dirty or diverged repo is reported and skipped, never forced.

Where zsync/zup act on the current submodule tree, zpull acts on the machine-wide index, so selectors (--repo, --behind, …) scope which repos are pulled.

↑ index

git zattach re-attach every detached-HEAD indexed repo to its mainline

git zattach [selectors]

Re-attaches every selected indexed repository that is on a detached HEAD to its mainline branch (main, else master), fleet-wide — the kill-switch for the detached HEADs git submodule update leaves behind across the whole index.

It uses the same local, no-clobber attach zsync applies to submodules: it never contacts a remote, never moves the checked-out commit, and never touches the worktree or index — it only creates or fast-forwards the local mainline branch to the commit HEAD is already at and makes HEAD symbolic to it, so it is safe even on a dirty repo. A repo whose local mainline is ahead of or diverged from HEAD is refused rather than clobbered (catching the worktree up is zpull/zsync's clean-only job); a repo with no main or master anywhere is skipped. It reports how many were attached, already on a branch, had no mainline, or were refused.

↑ index

git zgrep parallel content search across indexed repos

git zgrep [selectors] [-i] <pattern> [--json]

Searches the tracked file content of every indexed repository for <pattern> (a regular expression) in parallel, printing path:line:text for each match. -i is case-insensitive; binary files are skipped, as git grep does.

Only tracked, non-conflicted worktree files are searched. Selectors narrow the repo set as in zforeach.

↑ index

git zahead indexed repos ahead of their upstream

git zahead [selectors] [--json]

Lists the indexed repositories that have commits not yet on their configured upstream, with the count, computed in parallel. Repos with no upstream are omitted.

↑ index

git zbehind indexed repos behind their upstream

git zbehind [selectors] [--json]

Lists the indexed repositories whose upstream has commits they lack, with the count, computed in parallel. Repos with no upstream are omitted.

↑ index

git zunpushed per-repo unpushed commits (the detailed zahead)

git zunpushed [selectors] [--json]

Lists, per indexed repository, the actual commits HEAD has that its upstream lacks — short id and summary line, grouped under the repo path — computed in parallel. Where zahead gives only a count, this shows what is unpushed. The list is capped per repo so a long divergence cannot flood the output; repos with no upstream or nothing unpushed are omitted.

↑ index

git zunpulled per-repo commits the upstream has that local lacks

git zunpulled [selectors] [--json]

Lists, per indexed repository, the commits on the configured upstream that the local branch lacks — short id and summary, grouped per repo. The detailed form of zbehind. A git zfetch first makes the upstream refs current. Repos with no upstream or nothing unpulled are omitted.

↑ index

git zauthors commit counts by author across indexed repos

git zauthors [selectors] [--json]

Walks every indexed repository's HEAD history in parallel, tallies commits by author Name <email>, aggregates across all repos, and prints them ranked by count — a machine-wide contribution summary.

↑ index

git zhot indexed repos ranked by recent activity

git zhot [selectors] [<days>] [--json]

Ranks indexed repositories by the number of commits made in the last <days> (default 30), most active first, counted in parallel — a quick read of where work is happening across the tree.

↑ index

git zconflicts indexed repos mid-operation or conflicted

git zconflicts [selectors] [--json]

Lists the indexed repositories that are in the middle of a merge, rebase, cherry-pick, revert, or bisect, or that have unmerged (conflicted) index entries, with the operation(s) named — so a stuck repo among many is found at a glance.

↑ index

git zfetch parallel git fetch across indexed repos

git zfetch [selectors]

Runs git fetch in every selected indexed repository concurrently, through this binary's own porcelain and fair per-repo lane. Output is grouped per repo and failures are recorded in the ledger.

↑ index

git zgc parallel git gc across indexed repos

git zgc [selectors]

Runs git gc in every selected indexed repository concurrently — machine-wide maintenance in one command.

↑ index

git zfsck parallel git fsck across indexed repos

git zfsck [selectors]

Runs git fsck in every selected indexed repository concurrently, to check object integrity across the whole tree at once.

↑ index

git zprune parallel git prune across indexed repos

git zprune [selectors]

Runs git prune in every selected indexed repository concurrently, removing unreachable objects tree-wide.

↑ index

git zreset parallel git reset across indexed repos

git zreset [selectors] [--soft|--mixed|--hard] [<ref>]

Runs git reset in every selected indexed repository concurrently. The mode flag and optional <ref> pass straight through to git, so the default (as git's) is --mixed HEAD, which unstages. --hard discards worktree changes across the whole selection — narrow it with selectors (e.g. --dirty) first.

↑ index

git zabort abort an in-progress operation across mid-op repos

git zabort [selectors]

Aborts an in-progress merge, rebase, cherry-pick, or revert in every selected indexed repository that is mid-operation — running the matching --abort — and skips repos with nothing in progress. Cleans up after a fan-out (or a many-agent session) that left repos stuck in a half-finished operation.

↑ index

git zcheckout check out a branch in every repo that has it

git zcheckout [selectors] <branch>

Checks out <branch> in every selected indexed repository that already has it, in parallel. A repo without the branch is skipped — the branch is never created — so this is a safe way to move a whole tree onto a shared branch name.

↑ index

git ztagall create a tag at HEAD in every indexed repo

git ztagall [selectors] <tag>

Creates tag <tag> at HEAD in every selected indexed repository, in parallel. A repo that already has the tag reports the failure rather than moving it.

↑ index

git zcommitall commit tracked changes across every dirty repo

git zcommitall [selectors] -m <msg>

Commits tracked changes (git commit -a) with message <msg> in every selected indexed repository whose worktree is dirty, in parallel. Clean repos are skipped. Untracked files are not staged (as with commit -a).

↑ index

git zpushall push every indexed repo that is ahead

git zpushall [selectors]

Runs git push in every selected indexed repository that is ahead of its upstream, in parallel. Repos that are not ahead (or have no upstream) are skipped, so no needless network calls are made.

↑ index

git zclean remove untracked files across indexed repos

git zclean -f [selectors]

Runs git clean -fd — remove untracked files and directories — in every selected indexed repository, in parallel. Because it deletes, the -f flag is required; ignored files are left (as git clean does without -x).

↑ index

git zwait block until a repo's async jobs drain

git zwait [<path>]

Blocks until the repository at <path> (or the current directory) has no queued or running async jobs (zcommit/zpush) left in the ledger — the join for that repo's fire-and-forget work. With no daemon there are no jobs, so it returns at once.

↑ index

git zqueue list queued and running async jobs

git zqueue

Lists the async jobs currently queued or running in the ledger (id, state, kind, repo) — what the daemon is working through right now.

↑ index

git zbarrier block until the async queue is idle

git zbarrier

Blocks until the entire async job queue is idle — every repository's queued and running jobs have drained — the global join after a burst of zcommit/zpush.

↑ index

git zstale indexed repos not committed to in a while

git zstale [selectors] [<days>] [--json]

Lists the indexed repositories whose HEAD commit is older than <days> (default 90), with how long ago — surfacing abandoned repos across the tree. Scanned in parallel.

↑ index

git zlast indexed repos by most recent commit

git zlast [selectors] [--json]

Lists indexed repositories ordered by HEAD commit time, most recently committed first, each with its relative age — where work happened most recently.

↑ index

git zbig largest tracked files across indexed repos

git zbig [selectors] [<n>] [--json]

Lists the largest tracked files across every indexed repository, top <n> (default 20), by on-disk size — bloat hunting tree-wide. Files are gathered in parallel.

↑ index

git zfiles tracked file count per indexed repo

git zfiles [selectors] [--json]

Prints the number of tracked files in each indexed repository, largest first, scanned in parallel.

↑ index

git zcommits HEAD-history commit count per indexed repo

git zcommits [selectors] [--json]

Counts the commits reachable from HEAD in each indexed repository — its history depth — and prints them deepest first, walked in parallel.

↑ index

git zpristine indexed repos that are clean and in sync

git zpristine [selectors] [--json]

Lists the indexed repositories that need nothing: no uncommitted changes, on a branch (not detached), and in sync with their upstream (or having none configured). The complement of zdirty/zahead/zbehind/zconflicts — the green set — computed in parallel.

↑ index

git zdivergent indexed repos diverged from upstream

git zdivergent [selectors] [--json]

Lists indexed repositories that are both ahead of and behind their upstream — history has forked, so a merge or rebase is needed. Computed in parallel.

↑ index

git zorphans indexed repos with no remote

git zorphans [selectors] [--json]

Lists indexed repositories with no remote configured — nothing to fetch from or push to. Scanned in parallel.

↑ index

git zsessions active sessions ranked by repos held

git zsessions [--json]

Lists the sessions that currently hold claims, ranked by how many repositories each holds — which agent is working the most of the tree.

↑ index

git zidle indexed repos with no active claim

git zidle [selectors]

Lists indexed repositories that no session has claimed — the ones free for an agent to pick up. Selectors narrow the candidate set as in zforeach.

↑ index

git zdashboard live tiled TUI: fleet, events, and commands on one screen

git zdashboard [--once] [--json]

A live, tiled dashboard of the whole indexed tree on one screen: a header of aggregate totals (dirty, ahead, behind, diverged, detached, clean, claims, sessions, queue, and whether the daemon is up) over four tiles — a FLEET table (every repo, most recently active first, with the on-screen rows' HEAD state live-refreshed so nothing is stale), a PROCESSES tile (each committing ppid with its command, cwd, commit tally, live/dead state and last-commit age, as zppid shows — live processes first, then most commits), an EVENTS feed (commits, reconciles, status changes, as zevents shows), and a COMMANDS feed (every git command run across the machine, with the agent that ran it, as zcommands shows). Press q or Esc to quit.

Every tile reads the daemon-maintained status cache and ledger, not a live per-repo walk, so the dashboard stays responsive across thousands of repos. The COMMANDS tile is populated once command logging is on (git zcommands enables it).

For scripting, --once or --json (or a non-terminal stdout) prints the instant text summary instead of the TUI — the same aggregate counts, one screen, no interaction.

↑ index

git ztop live htop-style fleet monitor, most churn on top

git ztop [selectors] [--interval <secs>] [--once] [--mono]

A full-screen, live monitor of the whole indexed tree — an htop for the fleet. A header shows the totals (dirty, ahead, behind, diverged, detached, clean, claims, sessions, queue depth, and whether the daemon is up); a table lists every repo with a churn bar, path, HEAD, state, and how long ago it last changed.

Repos are sorted with the most churn on top: when a repo's HEAD or dirty flag changes between frames (the daemon rewrote its status row), its churn score bumps and then decays, so whatever is moving right now rises to the top, like an htop CPU column. Press s to cycle the sort (churn / state / name), the arrows / PgUp / PgDn / g / G to scroll, and q (or Esc) to quit.

Each frame reads the daemon-maintained status cache, not a live per-repo scan, so it stays responsive across thousands of repos — start the daemon (git zdaemon start) so the cache stays warm and churn reflects real activity. Selectors narrow the view to a subset; --interval sets the refresh seconds, --mono (or NO_COLOR) drops color, and --once (or a non-terminal stdout) prints a single plain-text frame for scripts.

↑ index

git zevents one live feed of commits/reconciles/status-changes across the tree

git zevents [-n <count>] [--kind commit|stage|status|reconcile] [--repo <substr>] [--json] [--no-follow]

Prints a single structured, live feed of what is happening across the whole indexed tree: commits (a HEAD moved), status-changes (a dirty or sync transition), and reconciles (a fetch-free fast-forward the daemon applied). It shows a short backlog, then follows live.

Events come from the index's append-only events table, written by triggers on the status cache that both the whole-tree poller (statusd) and the instant file-watcher (watch) maintain, so activity anywhere is captured with no per-call plumbing. -n sets the backlog size, --no-follow prints the backlog and exits, --kind filters to one event kind, --repo filters by path substring, and --json emits NDJSON (one event per line) for tooling.

↑ index

git ztail alias of git zevents

git ztail [-n <count>] [--kind commit|stage|status|reconcile] [--repo <substr>] [--json] [--no-follow]

An alias for git zevents — the single live feed of commits, reconciles, and status-changes across the whole indexed tree. See git help zevents for the full description.

↑ index

git znative the plugin package manager: install and load native and script plugins

git znative load|add|remove|list|info|update|gc|clean [SOURCE|NAME]

Installs plugins that extend this binary with new subcommands, from one content-addressed global store under $ZVCS_HOME/pkg. Two kinds are served from that one store: a *native* plugin is a Rust cdylib compiled against the znative C ABI and loaded with dlopen, and a *script* plugin is a repository of git-<verb> executables. Ported from the zshrs package manager of the same name.

A source is owner/repo, github:owner/repo, git+URL, or a local path:DIR; any remote form may carry an @ref suffix to pin a tag, branch or commit (owner/repo@v1.2.0), and the pin is recorded so update re-fetches that exact ref. add resolves the source, builds the cdylib when the plugin ships source, copies the loadable subset into store/<name>@<version>/, SHA-256 pins it, and records what it provides in installed.toml. load is the idempotent form for a bootstrap script: it installs a source that is not in the store yet and otherwise just re-verifies, with no network.

A native plugin's verbs are discovered by loading it at install time, never declared: whatever it registers through the ABI is what gets recorded. A plugin may also *override* an existing verb, in which case its handler runs in place of the built-in one and calls back through the host to run the original. git znative itself can never be overridden, so a bad plugin cannot lock you out of removing it.

Nothing is loaded until a verb proves to belong to a plugin. The index's two derived tables, verbs.tsv and overrides.tsv, answer that question, and are deleted rather than written empty when there is nothing in them — so a machine with no plugin installed pays two failed stats per command and never opens a file. list, info and remove manage what is installed; gc reclaims store directories left by old versions plus the clone cache, and clean clears the scratch directories.

↑ index

git zintercept AOP hooks that run advice around matching git commands

git zintercept before|after|around <pattern> -- <cmd> | list | remove <id> | clear

Registers aspect-oriented advice that fires around git commands, ported from zshrs. A before hook runs a shell command before a matching git command; an after hook runs after it (with the command's exit status and timing available); an around hook replaces it, and runs the original itself when it chooses. <pattern> matches the git subcommand — commit, push, a glob like commit *, or * / all for everything.

The advice <cmd> is a shell command run via sh -c. It sees the intercepted command through the environment: INTERCEPT_NAME (the subcommand), INTERCEPT_ARGS, and INTERCEPT_CMD (the full git ... line); after-advice also gets INTERCEPT_STATUS, INTERCEPT_MS, and INTERCEPT_US. An around advice runs eval "$INTERCEPT_CMD" to proceed with the original (that child is not re-intercepted) — the eval is required, because INTERCEPT_CMD is a whole command line and the quoted-without-eval form makes the shell look for a single program by that name.

Registrations persist to $ZVCS_HOME/intercepts.tsv and load at dispatch; when none are registered the cost on every git command is a single stat. list shows all with their ids, remove <id> deletes one, and clear removes them all.

↑ index

git zcommands live feed of every git command run across the fleet

git zcommands [-n <count>] [--repo <substr>] [--json] [--no-follow] [--off] [--clear]

Streams every git command run anywhere on the machine, in real time. Because the zvcs git binary shadows real git on PATH, every invocation flows through one dispatcher; when logging is on, each records a line — time, pid, working directory, and the command — to its own log at $ZVCS_HOME/commands.log (separate from the daemon log). This verb prints a backlog and then follows the log live, so commands from every repo and every concurrent shell scroll past as they run.

Running it turns logging on (a marker file, so the cost on every other git command is a single stat when it is off) and notes where the log lives. -n sets the backlog size, --no-follow prints the backlog and exits, --repo filters to commands whose directory contains a substring, and --json emits NDJSON for tooling. --off stops logging; --clear truncates the log. The live viewers (zcommands, zevents, ztail, ztop) are excluded so watching does not feed itself.

↑ index

git zaudit queryable audit trail over the fleet command log

git zaudit [--agent <ppid>] [--repo <substr>] [--cmd <substr>] [--mutating] [--summary] [-n <count>] [--json]

The historical, accountable side of the same command log zcommands feeds — $ZVCS_HOME/commands.log. Where zcommands follows the live stream, zaudit queries the record: it answers "which agent ran which command against which repo, and when" across a fleet of concurrent agents. Each logged line carries the time, the command's pid, its parent pid (the agent that launched it), the working directory, and the git argv.

Filters compose: --agent <ppid> restricts to one agent, --repo <substr> to repos whose directory contains a substring, --cmd <substr> to commands whose argv contains a substring, and --mutating to state-changing subcommands only (commit, push, reset, rebase, merge, checkout, and the mutating z-verbs). -n limits how many matching records print (newest last); --json emits NDJSON.

--summary replaces the record list with tallies: how many commands each agent ran, and how many of each subcommand, ranked by count — an at-a-glance accountability view of who did what across the tree.

↑ index

git zscan parallel secret scan of tracked content across the fleet

git zscan [selectors]

Scans the tracked file content of every selected indexed repo, in parallel over the shared worker pool, for common credential patterns — AWS access keys, PEM private keys, GitHub/Slack/Google tokens, JWTs, and high-entropy key = "..." assignments — using the same native, fork-free content walk zgrep does. Each hit prints as path:line:pattern:snippet.

Binary files are skipped, output is capped per repo so one flooded tree cannot drown the rest, and the whole run exits non-zero when anything is found — so git zscan drops straight into a pre-push hook or CI gate. [selectors] narrows the set the same way every fleet verb does.

↑ index

git zsigs fleet commit-signature check (verify-sigs)

git zsigs [selectors] [-n <count>]

Checks commit signatures across the fleet and flags any that are not a good signature — unsigned (N), bad (B), or unverifiable (E/X/Y/R). By default it checks each selected repo's HEAD; -n walks the top N first-parent commits. Each offender prints as <code> <repo> <sha> <subject> (git's %G? codes), and the run exits non-zero if any are found — so it gates a push or CI under an all-commits-must-be-signed policy.

Verification is native where it can be and delegated where it must be: the signature and its signed payload are reconstructed from the commit object in-process (the gpgsig header removed and de-folded exactly as git does), then handed to gpg — the same tool git shells to; there is no in-process crypto in git either. A commit with no signature is N without running anything; a present signature that gpg cannot check (no public key, gpg absent) is E, never a fabricated good. SSH-format signatures report E in this pass (verifying them needs an allowed-signers file). The same machinery backs the %G? and %GK pretty-format placeholders in git log.

↑ index

git zreview aggregate the pending uncommitted change across the fleet

git zreview [selectors]

The read-side companion to zcommitall: for every selected repo with uncommitted work, it prints the repo's git status --short block grouped under its path, plus the summary line of its diffstat against HEAD, so you can review everything about to be committed across a whole tree of submodules on one screen.

Clean repos are omitted; a trailing line reports how many repos have pending change and how many total entries. The status probe runs through this binary over the shared worker pool, so it is fleet-parallel and reads consistently with every other z-verb.

↑ index

git zremote fleet-wide remote-URL rewrite

git zremote set <old> <new> [selectors] [-n|--dry-run]

Rewrites remote URLs across the fleet in one command: in every selected repo, any remote whose URL contains the substring <old> is rewritten with <old> replaced by <new>. This is the one-shot answer to moving an org, changing a host, or switching ssh↔https across a tree of submodules.

Each change prints as set <repo>::<remote> <from> → <to>; -n / --dry-run previews every change as would set without touching anything. Writes go through this binary's own remote set-url porcelain over the shared worker pool; the run exits non-zero if any set-url fails.

↑ index

git zrollback fleet-wide undo of the last mutating operation

git zrollback [selectors] [--steps <n>] [--apply] [--force]

The multi-repo evolution of zundo: across every selected repo it resolves HEAD@{n} from the reflog (n = --steps, default 1) and rewinds to it with reset --hard, undoing the last commit / merge / rebase / reset. The reset is itself reflogged, so a rollback is undoable.

It is **dry-run by default** — with no --apply it prints what each repo *would* do (<current> → <target>) and changes nothing. --apply executes the rollback on the repos that pass the guards.

The guards refuse to lose work: a repo is skipped, not rolled back, when its worktree is dirty, when it is mid-operation (merge/rebase/cherry-pick/revert), or when rolling back would diverge from its remote — the discarded commits are already pushed (sync is up-to-date, behind, or diverged). Rollback is allowed by default only when the commits are local-only (ahead or no-upstream). --force overrides every guard.

↑ index

git zsched daemon-hosted scheduled fleet commands (a built-in cron)

git zsched add <duration> -- <cmd> | list | rm <id> | clear | run <id>

Schedules a command to run on an interval, hosted by the daemon — a built-in cron for the whole tree. git zsched add 5m -- git zpull --dirty fast-forwards every dirty repo every five minutes; durations are 30s / 5m / 1h / 1h30m style. list shows every schedule with its id and interval, rm <id> removes one, clear removes them all, and run <id> fires one now (synchronously) for testing.

Schedules persist to $ZVCS_HOME/schedule.tsv as id\tinterval\tcommand. The CLI owns every write to that file; the daemon's scheduler thread only reads it (re-reading each tick, so add/rm take effect within one tick with no reload) and tracks each schedule's last-fire time in memory — so the CLI and daemon never contend on the file. A schedule fires one full interval after the daemon first sees it, not on daemon start.

↑ index

git zpin freeze a repo from daemon autonomy

git zpin [<path>...|list] [--json]

Pins one or more repositories so the daemon's autonomy leaves their pointer alone — a pinned repo is skipped by autobump and reconcile, so its gitlink and HEAD will not move on their own until it is unpinned. Detached-HEAD attach still runs, because re-attaching a detached HEAD heals it without moving the pointer.

With no path it pins the repository at the current directory; with paths it pins each named repository; git zpin list prints every pinned repo. The flag lives in the shared index (repos.pinned), so it survives daemon restarts and is visible to every session. Unfreeze with git zunpin.

↑ index

git zunpin unfreeze repos pinned from autonomy

git zunpin [<path>...|--all]

Clears the pin set by git zpin, so the daemon resumes autobump and reconcile for the repository. With no path it unpins the repo at the current directory; with paths it unpins each named one; --all unpins every pinned repository at once.

↑ index

git zbroadcast post and read inter-agent messages

git zbroadcast [--to <session>] [<msg>...]

Sends a message to the other agent sessions working the tree, over the shared index. With a message it broadcasts to every session, or to one with --to <session>; with no arguments it prints this session's unread messages and marks them read.

Read state is tracked per session, so a broadcast is delivered once to each recipient and a sender never sees its own message. It is a pull inbox — messages are read when you run the verb, adding no cost to any other command. Session identity comes from ZVCS_SESSION.

↑ index

git zhandoff hand a repo's claim to another agent session

git zhandoff <repo-path> <session>

Reassigns the advisory claim (lease) on a repository from the current holder to another session, and drops that session a message noting the handoff. Fails if the repository is not currently claimed.

Claims are the session-attributed "I'm working this repo" signal set by git zclaim; zhandoff transfers one without the receiver having to race for it, so work can be passed cleanly between agents.

↑ index

git zon run a command on a semantic feed event

git zon [--kind commit|stage|status|reconcile] [--repo <substr>] -- <cmd> | git zon list | git zon rm <id>

Registers a rule that runs a command when a matching event fires on the live feed. Where git ztrigger reacts to raw filesystem events under a directory, zon reacts to typed events — commit, stage, status, reconcile — from the same feed git zevents shows, optionally filtered to repos whose path contains a substring.

The command after -- runs via the shell with ZVCS_EVENT, ZVCS_REPO, ZVCS_DETAIL, and ZVCS_SHA set for the triggering event. git zon list shows every subscription; git zon rm <id> removes one. The daemon watches the feed and runs the matches. Caveat (shared with ztrigger): a command that itself commits or stages can match its own subscription and re-fire — scope it with --kind/--repo.

↑ index

git zsince what happened across the tree since a time

git zsince <duration|snapshot> [--kind K] [--repo R] [--json]

Prints every feed event — commits, stages, status changes, reconciles — recorded across the whole indexed tree since a point in time. A duration (90s, 45m, 2d, 1h30m, or a bare number of seconds) counts back from now; any other token is treated as a snapshot name and its creation time is the baseline.

This is the scoped "what did the fleet do since X" delta that git zlog's full timeline does not give. --kind and --repo narrow the result to one event kind or to repos matching a substring.

↑ index

git zcontend live agent-vs-agent contention across the tree

git zcontend [--json]

Shows who is stepping on whom: the session-attributed claims (advisory leases), the per-repo job backlog (how many jobs are queued or running behind each repository in the daemon's fair queue), and the intersection — repositories that are both claimed and have jobs stacked up, i.e. actively contested.

All three are read from the shared index; nothing is mutated. It is the multi-agent observability view git has no notion of, because git only ever sees one repository and one process.

↑ index

git zwaitfor block until a tree-wide state holds

git zwaitfor <clean|idle|synced|<repo> <sha>> [--timeout <secs>]

Blocks until a condition over the whole tree becomes true, then exits 0 (or 1 on timeout) — a cross-repo barrier on state, where git zbarrier and git zwait are job-scoped. clean waits until every indexed repo is clean; idle until no daemon jobs are queued or running; synced until every repo is up-to-date with its upstream; <substr> <sha> until the repo whose path contains the substring is at the given commit (prefix).

Conditions are read from the daemon's cached status, so the daemon must be maintaining status for the wait to observe changes. An indexed repository that has not been reported on yet is not counted as meeting the condition — a tree nothing is reporting waits and then times out, rather than passing on an empty cache. --timeout bounds the wait (default 60 seconds).

↑ index

git zgraph fleet topology of duplicate checkouts

git zgraph [--json]

Maps the cross-repository relationship git has no notion of: which local checkouts are the same upstream repository — a dup group, the same origin URL with more than one working tree on the machine. git can never show this, because git only ever sees one repository.

Reads every indexed repository's origin (on demand, so the per-repo config read is acceptable) and lists each dup group with its checkouts, then a summary of repos, distinct origins, dup groups, and repos with no origin.

↑ index

git zrewind restore the whole tree to a wall-clock time

git zrewind <duration> [--dry-run]

Rewinds the tree — the repository at the current directory and every nested submodule — to the state it was in a given duration ago (2h, 30m, 1d). For each repository it finds the HEAD the reflog shows it had at that time and resets hard to it, reusing the faithful porcelain reset (itself reflogged, so the rewind is undoable). Where git zsnapshot is a manual named restore point, this is any timestamp with no prior setup.

A repository holding uncommitted work of its own is refused so that work is never clobbered. A submodule pointer moved by a child is not such work — a superproject reads as modified the moment a submodule moves, which is the very state a tree-wide rewind undoes — so it does not stop the parent from being rewound; the child is rewound in the same pass. A repository whose reflog does not reach that far back is reported and skipped (the reflog's default 90-day expiry bounds how far back it can go). --dry-run shows exactly what would move without changing anything.

↑ index

git zguard declarative fleet-wide command policy (refuse or warn)

git zguard deny|warn <pattern> [--when <predicate>] [-m <msg>] | list | rm <id> | clear | test <cmd>...

Registers rules that refuse or warn on a git command before it runs — a pattern-based command policy applied at the shadow binary, so it covers every invocation through it. The veto evolution of zintercept's around-advice, promoted to a first-class policy layer no VCS has natively.

A rule is an action (deny or warn), a glob pattern matched against the whole command line (* and ?, same matcher as zintercept), an optional repo-state predicate, and an optional message. git zguard deny 'push*--force*' refuses a force-push; git zguard warn 'rm*-rf*' warns but allows.

The --when <predicate> conditions a rule on the current repository: detached (HEAD is detached), dirty (uncommitted changes), protected (HEAD is main or master), unsigned (a commit with no -S/--gpg-sign and commit.gpgsign unset). So git zguard deny 'commit*' --when detached blocks commits on a detached HEAD, and --when unsigned requires signed commits.

list shows the rules; rm <id> removes one; clear removes all; test <cmd>... reports the verdict (DENY/WARN/allow) for a command without running it. Rules are stored in $ZVCS_HOME/guards.tsv (machine-wide); the dispatch hot path is a single stat when no rule is set. The zguard/zpolicy verbs are exempt from their own rules, so a bad rule can never lock you out.

↑ index

git zpolicy alias of git zguard (command policy)

git zpolicy deny|warn <pattern> [--when <predicate>] [-m <msg>] | list | rm <id> | clear | test <cmd>...

An alias for git zguard — declarative fleet-wide command policy. See git help zguard for the full description.

↑ index

git zppid per-process commit tally, attributed to the durable process

git zppid [--json]

Reports which process is responsible for each recorded commit, found by walking up past the throwaway per-command shells to the durable agent, program, or login shell that drove them.

Each row carries the pid, its command and working directory, whether it is still alive, and how many commits it landed.

↑ index

git zprocs per-process breakdown of mutating commands

git zprocs [--json]

Reports how many of each mutating verb — commit, push, add, merge, rebase and the rest — every recorded process has run, attributed the same way as git zppid.

With --json the rows are emitted as NDJSON — one object per line — like every other machine-readable listing.

↑ index

git zprecache precompute the log caches for recent commits

git zprecache [-n <commits>] [-q]

Fills the ledger's log caches — commit abbreviations and the per-file line tallies that --stat, --numstat, --shortstat and --name-status need — for the newest commits, so those formats read the ledger instead of the object store.

Everything it stores is a pure function of immutable objects, so an entry never expires. -n sets how many commits to walk (default 200); -q suppresses the count.

The daemon does this on its own whenever a watched repository's refs move (zvcs.precache, on by default); this verb is the same pass on demand, for a fresh clone or a fetch that landed while the daemon was down.

↑ index