herdr
Control Herdr, a terminal multiplexer for coding agents. Use only when the user explicitly mentions Herdr or asks to use Herdr to inspect or control panes, tabs, workspaces, commands, or another agent. Do not use merely because a task could benefit from a background terminal, delegation, or parallel
By herdrdev · 46,263 installs
npx skills add herdrdev/herdr --skill herdr
Source repository · Upstream listing
Herdr
Herdr organizes terminals into workspaces, tabs, and panes, recognizes coding agents running inside panes, and exposes the current session through the herdr CLI.
Before issuing any control command, verify that this agent is running inside a Herdr managed pane:
If the check fails, say that you are not running inside Herdr and stop. Do not inspect or control the focused Herdr session from outside Herdr.
When the check passes, the herdr binary in PATH talks to the current session. Use it to inspect neighboring work, create terminal layout, start agents and commands, read output, and wait for state changes.
Learn the current CLI
The installed binary is the authority for command syntax. Start with:
Then print the relevant command group by running the group without a subcommand:
Do not run bare herdr for discovery; it launches or attaches the TUI. Do not probe a mutating nested command by omitting arguments. Commands such as herdr workspace create are valid with defaults and will execute.
Most control commands return JSON. Read identifiers and state from those responses instead of predicting them.
Understand layout, panes, and agents
Choose the primitive that matches the job:
Workspace, tab, and pane topology organize terminal locations.
Pane commands control raw terminals, shells, tests, servers, input, and output.
Agent commands control the recognized coding agent currently occupying a pane.
A pane exists whether or not it contains an agent. agent start requires an existing available shell pane and never creates, splits, or moves layout. Use pane commands for ordinary processes. Use agent commands when Herdr must validate agent identity or interpret idle , working , blocked , done , and unknown lifecycle states.
Agent commands accept either a unique live agent name or the pane ID currently hosting that agent. They do not accept terminal IDs or bare agent kind labels. Names must match [a z][a z0 9 ]{0,31} and be unique among live agents. A name follows the current pane occupant and is cleared when that agent exits, is released, or is replaced. Suspending an agent with Ctrl+Z and running a non agent command preserves its identity while the exact process remains alive. This does not preserve the original identity across another recognized agent taking over. A retained identity does not mean the agent is in the foreground; inspect the pane before sending input.
idle and done normally indicate the agent is ready for input; neither guarantees that an unfamiliar approval dialog was recognized or that a retained agent is in the foreground. The CLI/API uses the server's seen state to distinguish them; explicit focus commands mark the target seen, while reads do not. Each TUI client tracks viewed completions independently, so its Done badge can differ from the CLI or another client's badge. Antigravity and Grok can be idle while background tasks or subagents keep running, so a settled state wait is not proof those jobs have finished. blocked means Herdr recognized an approval or question UI. unknown means an agent is present but Herdr cannot classify it confidently; it does not prove completion.
Use IDs and caller context
Public IDs are opaque stable handles:
workspace: w1
tab: w1:t1
pane: w1:p1
Closed tab and pane IDs are not reused. A pane moved into another workspace receives a new workspace qualified pane ID. After pane move , continue with .result.move result.pane.pane id or the live agent name. The old value is reported as .result.move result.previous pane id ; only the moved process's inherited caller context keeps resolving that old ID, so do not use it as a general agent target.
Herdr injects the caller's context into each managed pane:
Prefer current when a pane command should target the calling pane. An omitted pane split target uses the calling pane when HERDR PANE ID is available, otherwise the focused pane. Other commands may use the UI focused pane, which can belong to the user or another client.
Discover live state with:
Creation responses expose the IDs to use next. workspace create returns .result.workspace , .result.tab , and .result.root pane . tab create returns .result.tab and .result.root pane . pane split returns the new pane as .result.pane .
IDs and live agent names are scoped to one server. Two saved SSH machines can both have w1:p1 or an agent named reviewer . Selecting a machine in the TUI does not retarget commands running in your pane: without machine , they still use the inherited session and socket context.
To control a saved SSH machine, use the same global prefix for discovery and every later command:
The selector must be an enabled saved profile ID or a unique, case sensitive label, not an arbitrary SSH hostname. Commands use that profile's remote session without an open TUI. Do not combine machine with session or remote . Discover IDs on that machine; inherited local IDs and current do not identify remote panes.
Both installations must support machine API forwarding, and the remote server must already be running and API compatible. Forwarding never installs, starts, or restarts a server and never falls back to Local. Local configuration, session management, installation commands, and interactive attachment are not forwarded. Remote worktree paths must be absolute, ~ , or start with ~/ ; plugin link paths must be absolute. A connection failure does not prove a mutation was not applied: inspect remote state before retrying.
herdr machine list lists saved connection profiles, not a cross machine pane inventory; add json for scripts. Only add, remove, enable, or disable profiles when the user asks. Removing a profile disconnects the client but does not stop remote sessions. Interactive machine add discovers running remote sessions and may ask the user to pick one; non interactive setup uses the remote default session unless remote session is explicitly supplied. Use herdr machine status [<label or id ] json to diagnose a failing machine. herdr machine reconnect needs the user to complete SSH authentication in their terminal; do not run it for them. Setup asks before stopping an incompatible server and defaults to No; do not approve replacement without the user's consent. Experimental handoff is not part of machine add .
Start and coordinate an agent
Default to a sibling pane in the current tab and the current working directory. Do not create a workspace, tab, worktree, or different cwd unless the user explicitly requests that topology or location.
Honor a direction requested by the user. Otherwise inspect the caller pane:
Split a wide pane to the right and a narrow or tall pane down. Avoid repeated same direction splits that create unusably narrow columns or short rows. Keep the user's focus in the calling pane and explicitly preserve the caller's working directory:
Replace right with down when appropriate. Read the new pane ID from .result.pane.pane id .
An available shell pane must be at its interactive prompt, with the shell itself in the foreground and no foreground command, editor, or agent running. Start a supported agent in that pane with a useful unique name:
Use the kind requested by the user. Run herdr agent to inspect the installed kind list and options. Pass native agent arguments only after :
A successful agent start returns only after Herdr detects the expected agent in the same pane and considers it ready for interactive input. If the agent is blocked during startup, the command returns agent not ready immediately but keeps the name available for agent read and agent send keys . Wait until the agent becomes idle before prompting it. Startup defaults to a 30 second timeout.
Submit work through the agent surface:
agent prompt honors the pane's live bracketed paste mode and sends text followed by encoded Enter as one ordered submission. It reports successful submission only after both have been written; that alone does not prove the agent started a turn. For Codex on Windows, Herdr sends a paste boundary before Enter so submission does not depend on prompt size. It rejects an agent already waiting at an approval or question dialog with agent blocked before sending any input. Inspect the blocked UI and ask the user before answering it. For normal agent work, wait is enough: it waits for the first settled idle , done , or blocked state. Do not repeat those defaults with until .
With wait , a prompt sent from a non working state must produce observed working or blocked activity. After submission, Herdr waits up to five seconds for that activity; unrelated idle , done , or session changes do not satisfy this gate. It returns agent prompt stalled if no activity is observed, or timeout if the caller's timeout expires first. The caller timeout includes submission time. Without a timeout, the settled state wait is indefinite after activity is observed. This wait tracks lifecycle state, not an individual turn; if the agent is already working, completion of the active turn may satisfy it.
Use until only for a state specific workflow, such as waiting for an already running agent to request input:
Without until , standalone agent wait uses the same settled state defaults as agent prompt wait .
Use logical keys for interactive agent UI controls:
Herdr validates all keys before writing any bytes. Read the result through the resolved agent:
If a wait fails or returns blocked , inspect agent get and agent read before deciding what input to send. A timeout or stalled response does not prove the prompt was never delivered; do not blindly submit it again. Use the pane surface only when raw terminal control is intentional.
Run an ordinary command in another pane
Create a sibling pane with the same geometry rule, preserve the caller's working directory, and keep user focus unchanged:
Read the new pane ID from .result.pane.pane id , then run and inspect the command:
pane run queues command text and Enter together; success acknowledges admission, not command execution. On macOS, pane run and agent start reject a command that exceeds the terminal's current canonical line input limit before queuing it. Wait for the interactive shell prompt before retrying. The check covers this submission, not an earlier incomplete line or a later terminal mode change. pane wait output searches the selected snapshot immediately, so output that already exists can match. Use match <text for a literal substring or regex <pattern for a Rust regular expression. Omitting timeout allows an indefinite wait.
Use the read source that matches the task:
visible : the currently rendered viewport.
recent : recent rendered output, including soft wraps.
recent unwrapped : recent output with soft wraps joined; prefer it for logs and transcripts.
detection : the plain text bottom buffer snapshot used for agent detection.
Use format ansi when colors and terminal styling are evidence. Otherwise use text.
lines asks Herdr for more rows from the pane's available screen and host scrollback. Alternate screen rows do not enter ordinary host scrollback. For supported idle agents, Herdr can collect application owned history and restore the viewport afterward, but not every application or response can be recovered this way.
If a larger recent read still does not reveal the completed response, ask the agent to write it as Markdown in a temporary directory and reply only with the file path, then read that file on the same machine. Use this only as a fallback; do not request file output in the initial prompt.
Safety and coordination rules
Use no focus for background work unless the user asked to switch context.
Use current , an explicit pane ID, or a unique agent name. Do not rely on another client's focused p