runpane cli
에이전트가 pane을 쓰게 해주는 cli
runpane은 Pane을 설치하고 에이전트에 pane 생성, 터미널 출력 확인, 입력 전송 명령을 제공합니다. Windows, WSL, macOS, Linux, 로컬 머신, 원격 호스트에서 작동합니다.
모든 os를 제대로 지원합니다
Windows와 WSL도 나중에 덧붙인 지원이 아닙니다. macOS, Linux, VM, 원격 호스트에서도 같은 흐름으로 작동합니다.
npm, pnpm, pypi
npx, pnpm dlx, pipx로 시작하세요. 에이전트가 PATH에서 runpane을 찾아야 한다면 전역으로 설치하세요.
에이전트가 pane을 제어합니다
shell 명령을 실행할 수 있는 에이전트라면 저장소 추가, pane 생성, 터미널 출력 확인, 입력 전송을 할 수 있습니다.
에이전트 루프에 맞춰 만들었습니다
에이전트는 Pane을 자신이 관리하는 워크스페이스로 쓸 수 있습니다. 호스팅 scheduler도, 전용 SDK도 없습니다. 터미널 명령이면 됩니다.
설치
한 번 설치하거나 업데이트할 때는 runner를 쓰세요. CLI를 전역으로 설치하지 않고 최신 CLI를 실행합니다. 터미널에서 이 명령을 실행하면 설정 마법사가 열립니다. 설정 후에도 Pane은 설치된 상태로 유지됩니다:
npx --yes runpane@latest
pnpm dlx runpane@latest
pipx run runpanePane 터미널의 에이전트는 이미 PATH에 runpane이 있습니다. Pane 밖에서 반복해서 호출하는 에이전트나 스크립트라면 전역으로 설치하세요.
npm i -g runpane
runpane setup
python -m pip install runpane
python -m runpane setupcli 우선, mcp도 지원
MCP도 있습니다. Pane은 같은 명령어 위에 만든 MCP 서버를 제공하고, 실행될 때 Claude Code, Codex, Cursor에 등록합니다. GitHub, Linear, Slack용으로 에이전트가 쓰던 MCP 서버도 계속 작동합니다.
하지만 모든 에이전트에는 이미 터미널이 있습니다. CLI는 Codex, Claude Code, Aider, Goose, OpenCode, shell 스크립트, cron, CI에서 작동합니다. 추가 server 설치도, 에이전트별 설정도 필요 없습니다.
기본부터 가볍습니다. runpane agent-context는 짧은 요약만 출력합니다. 에이전트는 실제로 필요할 때만 전체 명령 세부 정보를 불러옵니다.
설치 전에 에이전트가 읽을 수 있습니다. 전체 명령 목록은 /runpane-cli-contract.json에 공개되어 있습니다.
전체 작업 흐름이 Pane에 들어 있습니다. Session이 이 명령어로 이슈에서 PR까지의 루프를 대신 실행합니다.
사람과 에이전트가 같은 CLI를 씁니다. 설치, 업데이트, 진단, pane 생성, 출력 확인, 입력 전송까지 모두 같은 runpane 명령입니다.
핵심 루프 명령
runpane doctor --json
runpane agent-context
runpane agent-context --command "panels wait" --json
runpane repos list --json
runpane repos add --path "$PWD" --yes --json
runpane agents doctor --agent codex --repo active --json
runpane panes create --repo active --name "issue-252" --agent codex --prompt "Plan this issue" --source agent --wait-ready --yes --json
runpane panes list --repo active --json
runpane panels list --pane <pane-id> --json
runpane panels wait --panel <panel-id> --for ready --json
runpane panels screen --panel <panel-id> --limit 80 --json
runpane panels output --panel <panel-id> --limit 200 --json
runpane panels submit --panel <panel-id> --text "Continue" --yes --jsonwsl과 windows
에이전트는 WSL에서 실행되고 Pane은 Windows에 설치되어 있다면 PowerShell로 Windows wrapper를 호출하세요:
powershell.exe -NoProfile -Command \
'Set-Location $env:TEMP; runpane repos list --json'다음 단계
전체 CLI 명령 목록 보기
Open a command to see its usage and flags. This English reference comes straight from Pane's CLI. For a guided walkthrough, start with the CLI docs.
greenfield-inc/Pane @dd9bd5e2a92f
runpane help
Show help for runpane or a specific command.
runpane help [command]command <command>- Optional command topic such as "panes create".
runpane helprunpane help panes createrunpane setup
Open the guided setup wizard for install, remote host setup, update, and diagnostics.
runpane setuprunpane setuprunpane install
Install Pane on this machine or configure this machine as a remote daemon host.
runpane install [client|daemon] [options]target <client|daemon>- Install the desktop client or configure a remote daemon host.
--version <latest|vX.Y.Z>- Pane release to install.
--format <auto|appimage|deb|dmg|zip|exe>- Release artifact format.
--yes- Skip interactive prompts where possible.
runpane install clientrunpane install daemon --label "My Server"runpane update
Update the Pane desktop app using the same artifact path as install client.
runpane update [options]--version <latest|vX.Y.Z>- Pane release to update to.
--format <auto|appimage|deb|dmg|zip|exe>- Release artifact format.
--dry-run- Print the update plan without downloading.
runpane updaterunpane update --version latestrunpane version
Print the runpane wrapper version without contacting, launching, or focusing Pane.
runpane version [--pane-dir <path>]
runpane --version--pane-path <path>- Ignored for version; retained only for parser compatibility.
--pane-dir <path>- Accepted and ignored, so one --pane-dir can be passed to every runpane command.
runpane versionrunpane --versionrunpane doctor
Run platform, release, installed Pane, daemon reachability, and remote setup diagnostics.
runpane doctor [--json] [--pane-dir <path>] [--pane-path <path>] [--format <format>] [--verbose]
runpane doctor --report [--title <text>] --body-file <path|-> [--yes] [--json]--json- Print a machine-readable environment report.
--pane-dir <path>- Connect to a specific Pane data directory.
--pane-path <path>- Inspect a specific Pane executable.
--format <format>- Release artifact format to inspect.
--verbose- Print extra diagnostics.
--report- Prepare a redacted, inspectable diagnostic report.
--body-file <path|->- Read report evidence from a file or stdin.
--title <text>- Report title.
--yes- Confirm creating exactly one greenfield-inc/Pane issue.
runpane doctor --jsonrunpane doctorrunpane doctor --report --title "runpane watch failed" --body-file ./watch.txt --jsonrunpane daemon repair
Repair and restart the managed remote-daemon launcher without changing pairing or tunnel configuration.
runpane daemon repair [--pane-dir <path>] [--pane-path <path>] [--yes] [--json]--pane-dir <path>- Remote daemon data directory; defaults to ~/.pane_remote.
--pane-path <path>- Existing Pane executable used to perform repair.
--yes- Skip the service restart confirmation.
--json- Print one machine-readable repair result.
runpane daemon repair --pane-dir ~/.pane_remote --yes --jsonrunpane agents doctor
Diagnose whether a built-in agent command is available in a Pane repository environment.
runpane agents doctor --agent <codex|claude|cursor> [--repo <selector>] [--json] [--pane-dir <path>]--agent <codex|claude|cursor>- Built-in agent command to diagnose.
--repo <selector>- Repository selector; defaults to the active Pane repo.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane agents doctor --agent <agent> --repo active --jsonrunpane agent-context
Print token-efficient Pane command context for coding agents.
runpane agent-context [--json]
runpane agent-context --command <command> [--json]--command <command>- Print the detailed definition for one command, for example "panes create".
--json- Print machine-readable output.
runpane agent-contextrunpane agent-context --command "panes create" --jsonrunpane mcp
Run the Pane MCP server over stdio so coding agents can call runpane commands as tools.
runpane mcp [--toolsets <name,...>] [--read-only]--toolsets <name,...>- Comma-separated toolsets to serve: core (default), all, read, repos, panes, panels, agents, sessions, git, docs, links, admin.
--read-only- Serve only read-only tools.
claude mcp add --scope user pane -- npx --yes runpane@latest mcpcodex mcp add pane -- npx --yes runpane@latest mcprunpane repos list
List repositories saved in the running Pane app.
runpane repos list [--json] [--pane-dir <path>]--json- Print machine-readable repository records.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane repos list --jsonrunpane repos add
Register an existing git repository with the running Pane app.
runpane repos add --path <path> [--name <name>] [--json] [--yes] [--pane-dir <path>]--path <path>- Existing git repository path to register with Pane.
--name <name>- Saved repository name; defaults to the directory name.
--yes- Skip confirmation for mutating commands.
--json- Print machine-readable output.
--dry-run- Validate and preview without adding the repo.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane repos add --path /path/to/repo --yes --jsonrunpane panes list
List Pane sessions in a saved repository.
runpane panes list [--repo <selector>] [--json] [--pane-dir <path>]--repo <selector>- Optional repository selector: active, id, exact path, or saved repository name.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes list --repo active --jsonrunpane panes cost
Report estimated token cost per Pane, with per-model breakdown and cache efficiency.
runpane panes cost [--repo <selector>] [--pane <pane-id>] [--json] [--pane-dir <path>]--repo <selector>- Optional repository selector: active, id, exact path, or saved repository name.
--pane <pane-id>- Return only the selected Pane.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes cost --pane <pane-id> --jsonrunpane workspace state
Read one workspace snapshot of every Pane and CLI panel.
runpane workspace state [--repo <selector>] [--json] [--pane-dir <path>]--repo <selector>- Optionally limit the snapshot to one saved repository.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane workspace state --jsonrunpane workspace list
List your machines on Tailscale and whether each has joined workspaces.
runpane workspace list [--json] [--pane-dir <path>]--json- Print machine-readable output.
runpane workspace list --jsonrunpane workspace enable
Put this machine's Pane on your tailnet for runpane workspace (the default when Tailscale is signed in).
runpane workspace enable [--json] [--pane-dir <path>]--json- Print machine-readable output.
runpane workspace enablerunpane workspace disable
Take this machine off runpane workspace and remove its tailscale serve handler on port 8443.
runpane workspace disable [--json] [--pane-dir <path>]--json- Print machine-readable output.
runpane workspace disablerunpane workspace read
Print a file from one of your machines; any path form works (C:\..., /mnt/c/..., /home/..., ~/...).
runpane workspace [<machine>] read <path> [--json]<machine>- Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits.
<path>- Absolute path in any form; ~ is that machine's home.
--json- Print machine-readable output.
runpane workspace parsa-devbox read 'C:\Users\me\.pane\plans\topic\index.html'runpane workspace read /mnt/c/Users/me/notes.mdrunpane workspace write
Write stdin to a file on one of your machines, creating parent folders.
runpane workspace [<machine>] write <path> [--json]<machine>- Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits.
<path>- Absolute path in any form.
--json- Print machine-readable output.
echo done | runpane workspace parsa-devbox write '~/notes/status.md'runpane workspace exec
Run a command in another machine's shell and return stdout, stderr, the exit code, OS, and shell.
runpane workspace <machine> exec [--cwd <path>] [--timeout-ms <ms>] [--json] -- <command><machine>- Tailscale machine name, unique prefix, MagicDNS name, or Tailscale IP. Omit it to route a path that cannot exist here to the one joined machine it fits.
--cwd <path>- Working directory on that machine, in any path form; defaults to its home.
--timeout-ms <milliseconds>- Stop the command after this long (default 120000, at most 540000).
--json- Print machine-readable output.
-- <command>- The command line, run by that machine's shell.
runpane workspace parsa-devbox exec --json -- git -C C:\src\app status --shortrunpane handoff
Hand your task to a fresh agent on this or another machine: check your handoff note, make the branch reachable, send the note, and start the agent on it.
runpane handoff --template
runpane handoff "<destination>" --note-file <path|-> [--machine <name>] [--agent <codex|claude|cursor>] [--model <model>] [--effort <level>] [--repo <selector>] [--push] [--dry-run] [--json]<destination>- Freeform text naming the agent (claude, codex, cursor), and optionally the model, the effort, and the machine: a Tailscale machine name or unique prefix (list them with
runpane workspace list), or "this machine". Required unless --agent is given. Examples: "codex gpt-5 high on parsas-macbook-pro", "claude opus on parsa-devbox", "cursor on this machine". --template- Print the note template, with this checkout's origin and git state in its front matter, and exit.
--note-file <path|->- The note to check and send; required unless --template or --dry-run. Without it, --dry-run checks only the destination and git state.
--machine <name>- Destination machine; overrides the text.
--agent <codex|claude|cursor>- Receiving agent; overrides the text.
--model <model>- Model for the receiving agent, such as opus, sonnet, gpt-5, or claude-opus-5-5; overrides the text.
--effort <level>- minimal, low, medium, high, xhigh, or max; supported for Claude and Codex only; overrides the text. Cursor effort is rejected.
--repo <selector>- Saved repository on the destination. Defaults to the one with a remote for this repository.
--push- Commit uncommitted work (except the note) as WIP and push the branch before sending; never forces. Without it, an unpushed branch stops the handoff.
--dry-run- Check destination daemon reachability and resolve its saved repository name, path, environment and OS; print the note check and git state without committing, pushing, fetching, writing notes or creating a Pane.
--json- Print machine-readable output.
runpane handoff --template > ~/handoff.mdrunpane handoff "claude opus on parsas-macbook-pro" --note-file ~/handoff.md --pushrunpane handoff "codex gpt-5 high on parsa-devbox" --note-file ~/handoff.md --dry-run --jsonrunpane handoff --machine build-server --agent cursor --note-file ~/handoff.mdrunpane watch
Wait for workspace agent and Pane transitions using a daemon-held cursor.
runpane watch [--as <name>|--since <generation>] [--follow] [--format <lines|json>] [--heartbeat <seconds>] [--idle-after <ms>] [--settle <ms>] [--blocked-settle <ms>] [--min-interval <ms>] [--idle-backoff] [--all-managed|--pane <id>|--session <id|name>] [--include-shells] [--self-test] [--quiet] [--kinds <kind,...>] [--repo <selector>] [--name-contains <text>] [--timeout-ms <ms>] [--from <now|earliest>] [--json] [--pane-dir <path>]You can watch agent terminals in visible, unarchived panes. Ordinary shell tabs are excluded by default when you follow events.
READY means the agent looks idle. BLOCKED means it needs attention. UNKNOWN means Pane can't tell its state. STUCK means there's text waiting in its input box. Check the terminal before acting on a state.
A named cursor saves your place in the event stream. The next request with that name acknowledges the previous batch. A following watcher makes those requests automatically; it doesn't wait for your script to finish its work. Make your actions safe to repeat. For processing you need to resume reliably, save your own progress after each batch.
runpane watch --follow is the responsive monitor: lines, 60-second heartbeats, IDLE every 10 minutes, managed-agent scope, redacted STUCK detection, no settle, no batching, all kinds. Expensive consumers (one wake-up per line) opt into the cadence flags. Pane Chat arms them automatically through its pane-orchestrator skill; only your own scripts need to pass them. Named cursors persist in the Pane data directory.
--as <consumer-name>- Use a persisted named cursor (at-least-once delivery): 1-128 letters, numbers, dots, underscores, or hyphens (daemons before this release accept 64). Default under --follow: session-<uuid> with --session (session-<name> for a name; shortened to session-<sha256 prefix> when longer than 64 characters), else PANE_PANEL_ID when set, shortened to panel-<sha256 prefix> when it is longer than 64 characters; otherwise anonymous.
--since <generation>- Use an explicit generation cursor instead of a name. Cannot be combined with --as, or with --settle, --blocked-settle, --min-interval.
--from <now|earliest>- Starting point for a new named cursor. Default now (silent baseline); earliest replays the journal.
--follow- Continue waiting until interrupted. Required by every cadence flag.
--format <lines|json>- Output format. Default lines in every mode; --json selects json.
--heartbeat <seconds>- Healthy-silence bound; a HEARTBEAT line proves the watcher is alive. Default 60 under --follow, 0 otherwise. Any monitor that wakes an agent should pass --quiet, which drops it.
--idle-after <milliseconds>- IDLE fires after a READY panel has stayed idle this long, then re-fires every multiple. Default 600000 under --follow, 0 otherwise.
--settle <milliseconds>- Opt-in (follow only): emit READY only after the panel stays idle this long; a BUSY, BLOCKED, UNKNOWN, EXIT, or GONE inside the window cancels it silently. Default 0. Use when a pane flips idle/working while it waits on subagents; the unattended orchestrator value is 180000, the user-present value 60000.
--blocked-settle <milliseconds>- Opt-in (follow only): emit BLOCKED only after this window; an in-pane answer inside it cancels the line. Default 0. The unattended orchestrator value is 30000, the user-present value 15000.
--min-interval <milliseconds>- Opt-in (follow only): hold READY, IDLE, NEW, GONE, EXIT, and UNKNOWN lines and flush them together at most once per interval; BLOCKED, REPORT, pr.conflicted, and failed pr.checks bypass it and carry the held lines with them. Default 0. The unattended orchestrator value is 600000, the user-present value 120000.
--idle-backoff- Opt-in (follow only): IDLE fires at --idle-after, then 30m, 1h, 3h, then daily per panel; any activity resets the schedule. Default off (fixed multiples of --idle-after).
--kinds <kind,...>- Limit event kinds: agent.ready, agent.busy, agent.blocked, agent.unknown, agent.idle, pane.created, pane.gone, panel.exited, agent.report, pane.associated, pane.detached, pr.conflicted, pr.checks, pr.merged. agent.report arrives only when listed explicitly. Default all, except that pane.associated, pane.detached, and the pr.* kinds arrive only when listed here or implied by --session. Drop agent.busy for any consumer that acts on lines; BUSY carries no action.
--pane <pane-id>- Limit to a Pane; repeatable. Default all managed panes. Cannot be combined with --session.
--session <id|name>- Follow every Pane associated with a named Session (id or exact name). The daemon re-reads membership on every read, so a Pane associated after arming is included and a detached or archived Pane drops out without a re-arm. The Session's own orchestrator panels are never reported. Cannot be combined with --pane or --all-managed; an unknown Session fails.
--exclude-pane <pane-id>- Exclude a Pane; repeatable.
--repo <selector>- Limit to a saved repository (active, id, path, or name). Default all repositories.
--name-contains <text>- Limit by Pane name substring.
--agents-only- Limit to CLI agent panels. Default on under --follow.
--all-managed- Explicit spelling of the default scope: every non-archived, non-hidden managed Pane. Cannot be combined with --pane.
--include-shells- Include ordinary shell panels.
--timeout-ms <milliseconds>- Wait timeout per request; 0 polls once. Default 60000, capped at 120000 (the follow loop re-issues requests).
--limit <count>- Maximum entries per response. Default 256.
--ack-now- At-most-once named-cursor delivery (advance before you act). Default at-least-once.
--include-held-input- Include up to 120 characters of unsubmitted composer text in JSON entries. Default off: under --follow, JSON entries carry only heldInputPresent: true.
--no-held-input- Disable redacted held-input detection under --follow: no STUCK lines, and no heldInputPresent in JSON.
--self-test- Probe the watch path anonymously without advancing a named cursor; run it before arming --follow.
--quiet- Drop the control lines that only prove liveness: WATCH OK, HEARTBEAT, and WATCH RECONNECTED (_ok, _heartbeat, _reconnected in JSON). WATCH ERROR/_error, RESET/_reset, and DROPPED/_dropped always print, and --self-test still prints its WATCH OK result. Alias: --no-control-lines.
--json- Emit structured NDJSON; held-input content remains opt-in.
--pane-dir <path>- Connect to a specific Pane data directory.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane watch --self-testrunpane watch --followrunpane watch --as monitor --follow --quiet --jsonrunpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoffrunpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 60000 --blocked-settle 15000 --min-interval 120000runpane watch --session <id|name> --follow --quiet --json --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoffrunpane watch --session <id|name> --follow --quiet --json --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone,pane.associated,pane.detached,pr.conflicted,pr.checks,pr.merged --settle 60000 --blocked-settle 15000 --min-interval 120000Defaults stay responsive: no settle, no batching, all kinds, IDLE every --idle-after. Cadence flags are opt-in for expensive consumers and require --follow.
Unattended profile (what Pane Chat arms automatically, for overnight or background runs): runpane watch --self-test, then runpane watch --follow --quiet --kinds agent.ready,agent.blocked,agent.idle,panel.exited,pane.gone --settle 180000 --blocked-settle 30000 --min-interval 600000 --idle-backoff. Budget: about 6 wake-ups per active pane per hour worst case, usually 1-3; READY can arrive up to about 13 minutes after the turn ended.
User-present profile (a person is waiting on the result): the same command with --settle 60000 --blocked-settle 15000 --min-interval 120000 and no --idle-backoff. READY arrives within about 3 minutes of the turn ending.
BUSY carries no action; drop it with --kinds. HEARTBEAT is client-side proof of life and is never shaped by cadence flags; pass --quiet for any monitor that wakes an agent.
STUCK means real unsubmitted composer text. An agent prompt suggestion (for example a grey Try "..." hint) never counts.
Dead watch: judge death by a non-zero exit or a WATCH ERROR line, not by silence. If the message says the cursor was superseded, keep the replacement monitor and do not re-arm the old one. Otherwise re-arm once; if it dies again, file runpane doctor --report. Stop the previous monitor before switching profiles.
Cadence state is held per named consumer; an anonymous --follow with a cadence flag names itself follow-<pid>. Held lines survive a reconnect of the same consumer; a changed filter re-delivers them under the new filter.
Journal loss is surfaced through reset and dropped metadata.
The daemon treats omitted idleAfterMs as disabled so older clients never receive agent.idle unexpectedly.
Control lines are not journal entries. JSON kinds and their lines-format text: _ok (WATCH OK, once when armed), _heartbeat (HEARTBEAT, every --heartbeat seconds), _reconnected (WATCH RECONNECTED, after a retried daemon error), _error (WATCH ERROR, a daemon error; the process exits 2 unless --follow retries it), _reset (RESET, the journal restarted or the cursor fell behind; a fresh baseline follows), and _dropped (DROPPED, entries lost to journal truncation). --quiet drops _ok, _heartbeat, and _reconnected; _error, _reset, and _dropped always print.
Under --follow, JSON entries for panels holding unsubmitted composer text carry heldInputPresent: true, the JSON equivalent of the STUCK line. --no-held-input turns this off.
--session <id|name> scopes the watch to a named Session. The daemon resolves the Session once per request and its associated Panes on every read, so sessions associate and sessions detach take effect without a re-arm; archived and detached Panes drop out, and the Session's own orchestrator panels are excluded. Cadence state is keyed by the Session, not its current Panes, so membership changes keep held lines. A detached Pane's held lines are dropped.
Under --session, pane.associated (JOINED <pane-name> pane <pane-id> session <session-id>) and pane.detached (LEFT ...) report membership changes; list them in --kinds next to the agent kinds. Other consumers receive them only when --kinds lists them, so older clients never see an unknown kind.
PR events (decision D7): about every 3 minutes (jittered) the daemon visits each Pane associated with a live Session (none: no gh at all), finds its PR by branch when no open PR is known yet (gh pr list --head, so unwatched workers' new and reopened PRs are found), runs gh pr view on an open PR, and appends pr.conflicted (PR <pane-name> pane <pane-id> #<number> CONFLICTED: the PR now conflicts with its base), pr.checks (... CHECKS PASSED, or CHECKS FAILED <up to five names>: every check on the head commit finished), and pr.merged (... MERGED). Entries carry pr: {number, url, headOid}, plus checks and failingChecks for pr.checks. They fire on transitions only: the first poll of a PR after the daemon starts only records its state, so re-check conflicts after a restart with gh pr view. pr.conflicted and failed pr.checks bypass --min-interval like BLOCKED. Like JOINED/LEFT, they reach a consumer only under --session or when --kinds lists them. Without gh, or while it is signed out or rate limited, polling backs off (up to an hour) and no PR entries arrive.
A daemon that predates --session returns no session field; runpane then fails with WATCH ERROR instead of watching every Pane.
Replay: after a reset (RESET/_reset), the baseline restates current state. In JSON, those entries carry replay: true (and changedWhileAway: true after an epoch change). A replayed agent.ready is never READY: re-read runpane sessions overview instead of acting on it. Lines mode prints only CHANGED for them.
agent.report (REPORT <pane-name> pane <pane-id> panel <panel-id> <state> [pr#<n>] [<head>][: <question>]) is a worker's runpane report. It is opt-in: only a consumer that lists it in --kinds receives it. It bypasses --min-interval, and orchestrators treat it as the completion signal; a READY without a report means look, and maybe nudge.
runpane panes create
1 feature = 1 worktree = 1 branch = 1 Pane; reviews, audits, fixes and QA for it are tabs in that Pane. Create a Pane (a new worktree) only when the work's branch has no Pane yet; for review, audit, fix or QA on existing work use `panels create --pane <id>`.
runpane panes create --repo <selector> --name <name> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options] [--pane-dir <path>]
runpane panes create --repo <selector> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--source user|agent] [--focus|--no-focus] [--base <ref>] [--branch <name>] [--prompt-file <path|->] [options] [--pane-dir <path>]
runpane panes create --from-json <path|-> [--yes] [--json] [--pane-dir <path>]--repo <selector>- Repository selector: active, id, exact path, or saved repository name.
--name <name>- Pane/session name.
--base-branch <branch>- Branch the new worktree from this ref (for example origin/main or release/2.4) instead of the repository default.
--worktree-name <name>- Worktree and branch name; defaults to --name. Characters outside [a-z0-9-] are removed.
--agent <codex|claude|cursor>- Built-in agent terminal template to open. With --tool-command, the agent that command runs.
--tool-command <command>- Custom terminal command to run instead of a built-in agent.
--base-branch <ref>- Ref to branch from, such as origin/main or release/foo. --base is an alias.
--branch <name>- Exact new branch name, slashes included (for example agents/w5a). Fails if the branch exists; never renamed to be unique. Defaults to the worktree name.
--worktree-name <name>- Worktree directory name; defaults to --name.
--prompt <text>- Alias for --initial-input; sends text after the command is ready.
--initial-input-file <path|->- Read initial input from a file or stdin. --prompt-file is an alias.
--as-file-pointer- Write the prompt or text to a private file under the Pane directory and send the one line
Read and follow <path>instead. --from-json <path|->- Read a full panes.create request JSON payload.
--source <user|agent>- Mutation source; agent implies background/no-focus creation.
--no-focus- Create the pane in the background without stealing focus.
--focus- Explicitly focus the created pane.
--pinned- Accepted for backward compatibility and now a no-op;
panes createalready pins by default. --no-pinned- Create the pane unpinned instead of the default pinned (the Pane UI's favorite/pin star). Pinning never implies focus.
--no-associate- Inside a Session orchestrator, do not associate the created pane with that Session (associated automatically by default).
--yes- Skip confirmation for mutating commands.
--dry-run- Validate and preview without mutating.
--json- Print machine-readable output.
--wait-ready- Wait for each created terminal panel to be ready before returning.
--ready-timeout-ms <ms>- Readiness timeout per pane; defaults to 30000.
--concurrency <count>- Accepted for compatibility. Pane currently serializes multi-pane session creation so queued jobs do not time out before starting.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes create --repo active --name issue-257 --agent <agent> --prompt "Plan this issue" --source agent --no-focus --wait-ready --yes --jsonrunpane panes create --repo active --name w5a --base origin/main --branch agents/w5a --agent <agent> --prompt-file prompt.md --source agent --no-focus --wait-ready --yes --jsonrunpane panes create --from-json panes.json --yes --jsonrunpane panes create --repo active --name issue-123 --agent <agent> --prompt "Plan this issue" --source agent --no-focus --wait-ready --yes --jsonrunpane panes create --repo active --name issue-123 --agent claude --initial-input-file brief.md --as-file-pointer --source agent --no-focus --wait-ready --yes --jsonrunpane panes adopt
Adopt an existing externally managed git worktree as a Pane without changing the worktree.
runpane panes adopt --repo <selector> --path <dir> --name <name> --agent <codex|claude|cursor> [--resume <id>] [--folder <name>] [--launch [--prompt <text>|--prompt-file <path|->] [--wait-ready] [--ready-timeout-ms <ms>]] [--no-pinned] [--no-associate] [--dry-run] [--yes] [--json] [--pane-dir <path>]
runpane panes adopt --repo <selector> --path <dir> --name <name> --tool-command <command> [--agent <codex|claude|cursor>] [--folder <name>] [--launch [--prompt <text>|--prompt-file <path|->] [--wait-ready] [--ready-timeout-ms <ms>]] [--no-pinned] [--no-associate] [--dry-run] [--yes] [--json] [--pane-dir <path>]--repo <selector>- Saved repository selector.
--path <dir>- Existing git worktree path.
--name <name>- Pane name.
--agent <codex|claude|cursor>- Agent whose terminal to create; with --tool-command, the agent that command runs.
--tool-command <command>- Custom command to stage or launch instead of a built-in agent, such as a wrapper that runs one.
--resume <id>- Persist this agent session id and stage its resume command.
--folder <name>- Top-level sidebar folder.
--launch- Run the agent (or its resume command) immediately.
--prompt <text>- Alias for --initial-input; sent once the launched agent is ready. Requires --launch.
--prompt-file <path|->- Alias for --initial-input-file; read the prompt from a file or stdin. Requires --launch.
--wait-ready- Wait for the launched agent to be ready and the prompt submitted before returning. Requires --launch.
--ready-timeout-ms <ms>- Readiness timeout; defaults to 30000.
--no-pinned- Do not pin the adopted pane.
--no-associate- Inside a Session orchestrator, do not associate the adopted pane with that Session (associated automatically by default).
--dry-run- Validate and preview only.
--yes- Skip confirmation.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes adopt --repo active --path /path/to/worktree --name imported --agent codex --resume <id> --yes --jsonrunpane panes adopt --repo active --path /path/to/worktree --name imported --tool-command "agent-farm run free-range" --agent claude --launch --yes --jsonrunpane panes adopt --repo active --path /path/to/worktree --name imported --agent claude --launch --prompt-file prompt.md --wait-ready --yes --jsonrunpane panes archive
Archive a Pane (session) exactly like the UI Archive action, including safe removal of its Pane-managed git worktree, or archive every merged Pane in a Session.
runpane panes archive --pane <pane-id> [--source user|agent] [--force] [--remove-worktree] [--dry-run] --yes [--json] [--pane-dir <path>]
runpane panes archive --session <id|name> --merged [--remove-worktree] [--source user|agent] [--dry-run] --yes [--json] [--pane-dir <path>]If you adopted an existing worktree, archiving its pane leaves that directory in place by default. Add --remove-worktree only when you want Pane to remove it too. The same safety checks apply.
--pane <pane-id>- Pane/session id to archive. Required unless --session is used.
--source <user|agent>- Mutation source; does not change archive safety behavior.
--force- Archive even if the pane's branch has uncommitted, untracked, or unpushed changes.
--remove-worktree- Also check and remove an adopted Pane's worktree. Pane-managed worktrees are always removed; the local branch is always kept.
--session <id|name>- Archive the Panes associated with this named Session instead of one Pane. Requires --merged.
--merged- With --session, archive only Panes that are clean and pushed, or merged via a pull request; skip the rest with a reason.
--yes- Skip confirmation for mutating commands.
--dry-run- Refresh and print archive safety evidence without archiving.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes archive --pane <pane-id> --source agent --yes --jsonrunpane panes archive --pane <pane-id> --dry-run --jsonrunpane panes archive --pane <pane-id> --remove-worktree --yes --jsonrunpane panes archive --session <id|name> --merged --dry-run --jsonrunpane panes archive --session <id|name> --merged --remove-worktree --yes --jsonrunpane panes archive --pane <pane-id> --force --yes --jsonrunpane panes pin
Declaratively pin a Pane; pinned is the Pane UI's favorite/pin star and repeated requests are idempotent.
runpane panes pin --pane <pane-id> --yes [--dry-run] [--json] [--pane-dir <path>]--pane <pane-id>- Pane/session id to pin.
--yes- Skip confirmation for mutating commands.
--dry-run- Validate and preview without mutating.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes pin --pane <pane-id> --yes --jsonrunpane panes pin --pane <pane-id> --dry-run --jsonrunpane panes unpin
Declaratively unpin a Pane; pinned is the Pane UI's favorite/pin star and repeated requests are idempotent.
runpane panes unpin --pane <pane-id> --yes [--dry-run] [--json] [--pane-dir <path>]--pane <pane-id>- Pane/session id to unpin.
--yes- Skip confirmation for mutating commands.
--dry-run- Validate and preview without mutating.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes unpin --pane <pane-id> --yes --jsonrunpane panes unpin --pane <pane-id> --dry-run --jsonrunpane panes rename
Rename a Pane without changing its worktree, branch, panels, or focus.
runpane panes rename --pane <pane-id> --name <new-name> --yes [--dry-run] [--json] [--pane-dir <path>]--pane <pane-id>- Pane/session id to rename.
--name <new-name>- New non-empty Pane/session name; surrounding whitespace is trimmed.
--yes- Skip confirmation for mutating commands.
--dry-run- Validate and return the projected updated pane without mutating.
--json- Print machine-readable output including the updated pane.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes rename --pane <pane-id> --name issue-393 --yes --jsonrunpane panes rename --pane <pane-id> --name issue-393 --dry-run --jsonrunpane panes focus
Raise the Pane window and select a Pane (and optionally one of its panels) on explicit user request.
runpane panes focus --pane <pane-id> [--panel <panel-id>] --source user|agent --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane/session id to focus. Must be an active (non-archived) Pane.
--panel <panel-id>- Optional panel/tab id inside the Pane to select; must belong to the focused Pane.
--source <user|agent>- Mutation source; does not change focus behavior.
--yes- Skip confirmation for mutating commands; required in non-interactive contexts because focusing steals window focus.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes focus --pane <pane-id> --source user --yes --jsonrunpane panes focus --pane <pane-id> --panel <panel-id> --source user --yes --jsonrunpane panels create
Open a new agent or terminal tab inside an existing Pane, sharing its worktree. The default for review, QA, fixes and any other agent on work that already has a Pane.
runpane panels create --pane <pane-id> --agent <codex|claude|cursor> [--source user|agent] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]
runpane panels create --pane <pane-id> --tool-command <command> [--agent <codex|claude|cursor>] [--title <title>] [--focus|--no-focus] [--wait-ready] --yes [--json] [--pane-dir <path>]--pane <pane-id>- Existing Pane session id to add the panel to.
--agent <codex|claude|cursor>- Built-in agent command template to launch. With --tool-command, the agent that command runs.
--tool-command <command>- Custom terminal command to launch instead of a built-in agent.
--title <title>- Panel title override.
--initial-input <text>- Initial input to send after the tool starts.
--initial-input-file <path|->- Read initial input from a file or stdin.
--as-file-pointer- Write the prompt or text to a private file under the Pane directory and send the one line
Read and follow <path>instead. --source <user|agent>- Mutation source; agent implies background creation.
--no-focus- Create the panel in the background without changing active panel.
--focus- Explicitly focus the created panel.
--wait-ready- Wait until the terminal tool is ready.
--ready-timeout-ms <ms>- Readiness wait timeout.
--yes- Skip confirmation for this mutating command.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels create --pane <pane-id> --agent <agent> --source agent --no-focus --wait-ready --yes --jsonrunpane panels create --pane <pane-id> --tool-command <command> --title <title> --source agent --no-focus --wait-ready --yes --jsonrunpane panels create --pane <pane-id> --tool-command "agent-farm run free-range" --agent claude --source agent --no-focus --wait-ready --yes --jsonrunpane panels open
Open a URL or file as a browser/editor tab in a Pane, in split view beside the agent by default.
runpane panels open [--pane <pane-id>] (--url <url>|--file <path>) [--title <title>] [--split|--tab] [--focus|--no-focus] [--source user|agent] --yes [--json]--pane <pane-id>- Pane to open the tab in; defaults to PANE_SESSION_ID (the calling panel's Pane, including a Session orchestrator's).
--url <url>- http(s) or file URL to open in a browser tab. WSL file URLs use the same automatic path conversion as --file. Pass exactly one of --url or --file.
--file <path>- File inside the Pane worktree, relative or absolute. WSL panes accept Linux, Windows drive, and WSL UNC paths without manual conversion. Files open in an editor tab; supported formats have read-only previews, including HTML source.
--title <title>- Tab title override.
--split- Open in split view beside the primary tab group (default).
--tab- Open in the current tab group instead of split view.
--no-focus- Open the tab without selecting it.
--focus- Select the tab (default). Never raises or focuses the Pane window.
--source <user|agent>- Mutation source.
--yes- Skip confirmation for this mutating command.
--json- Print machine-readable output.
runpane panels open --file plan.html --source agent --yes --jsonrunpane panels open --url http://localhost:3000 --source agent --yes --jsonrunpane panels open --pane <pane-id> --file src/app.ts --tab --source agent --yes --jsonrunpane panels list
List tool panels inside a Pane session.
runpane panels list --pane <pane-id> [--json] [--pane-dir <path>]--pane <pane-id>- Pane/session id.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels list --pane <pane-id> --jsonrunpane panels output
Read recent terminal output from a panel.
runpane panels output --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]--panel <panel-id>- Tool panel id.
--limit <count>- Maximum recent output lines or records to read. Defaults to 200.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels output --panel <panel-id> --limit 200 --jsonrunpane panels screen
Read a compact current-screen view from a terminal panel.
runpane panels screen --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]--panel <panel-id>- Terminal panel id.
--limit <count>- Maximum lines to return; defaults to 80.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels screen --panel <panel-id> --limit 80 --jsonrunpane panels input
Send input bytes to a terminal panel.
runpane panels input --panel <panel-id> (--text <text>|--keys <name,...>|--input-file <path|->) [--source user|agent] --yes [--json] [--pane-dir <path>]--panel <panel-id>- Terminal panel id.
--text <text>- Text bytes to send.
--keys <name,...>- Comma-separated key names to press in order: enter, escape, tab, backspace, space, up, down, left, right, ctrl-c, ctrl-d, or any single character.
--input-file <path|->- Read input from a file or stdin.
--yes- Skip confirmation for this mutating command.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
printf 'Continue\n' | runpane panels input --panel <panel-id> --input-file - --yesprintf '\003' | runpane panels input --panel <panel-id> --input-file - --yesrunpane panels input --panel <panel-id> --text "simple text" --yes --jsonrunpane panels input --panel <panel-id> --keys down,enter --yes --jsonrunpane panels submit
Send and submit text to a terminal panel, including idle agent composers.
runpane panels submit --panel <panel-id> (--text <text>|--input-file <path|->) [--as-file-pointer] [--interrupt] [--source user|agent] --yes [--json] [--pane-dir <path>]--panel <panel-id>- Terminal panel id.
--text <text>- Text to submit before Enter.
--input-file <path|->- Read text from a file or stdin before Enter.
--as-file-pointer- Write the prompt or text to a private file under the Pane directory and send the one line
Read and follow <path>instead. --interrupt- Interrupt the current turn and wait up to 30 seconds for an empty idle composer before delivering. Escape for Codex/Claude; Ctrl+C for Cursor.
--yes- Skip confirmation for this mutating command.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels submit --panel <panel-id> --text "2" --yes --jsonprintf "echo hello" | runpane panels submit --panel <panel-id> --input-file - --yes --jsonrunpane panels submit --panel <panel-id> --input-file brief.md --as-file-pointer --yes --jsonrunpane panels submit --panel <panel-id> --text "Stop that approach and follow this correction" --interrupt --yes --jsonrunpane panels submit-composer
Submit an agent composer using the panel-appropriate key sequence.
runpane panels submit-composer --panel <panel-id> [--strategy auto|codex-ctrl-enter|enter|tab] --yes [--json] [--pane-dir <path>]--panel <panel-id>- Terminal panel id.
--strategy <auto|codex-ctrl-enter|enter|tab>- Composer submit key sequence strategy.
--yes- Skip confirmation for this mutating command.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels submit-composer --panel <codex-panel-id> --strategy auto --yes --jsonrunpane panels submit-composer --panel <panel-id> --strategy enter --yes --jsonrunpane panels wait
Wait for a terminal panel to initialize, become ready/idle, or contain text.
runpane panels wait --panel <panel-id> [--for initialized|ready|idle|text] [--contains <text>] [--timeout-ms <ms>] [--interval-ms <ms>] [--json] [--pane-dir <path>]--panel <panel-id>- Terminal panel id.
--for <initialized|ready|idle|text>- Condition to wait for. Defaults to ready for CLI panels and idle otherwise.
--contains <text>- Text required for --for text; implies --for text when --for is omitted.
--timeout-ms <ms>- Wait timeout; defaults to 30000.
--interval-ms <ms>- Polling interval; defaults to 500.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels wait --panel <panel-id> --for ready --timeout-ms 30000 --jsonrunpane panels wait --panel <panel-id> --contains "Ready" --jsonrunpane panels last-message
Read an agent's last reply from its transcript, without scraping the screen.
runpane panels last-message --panel <panel-id> [--limit <count>] [--json] [--pane-dir <path>]--panel <panel-id>- Agent panel id.
--limit <count>- Maximum characters to return; defaults to 20000. The end of the reply is kept.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panels last-message --panel <panel-id> --jsonrunpane panes git-status
Read the git status of a Pane worktree: uncommitted, unpushed, and behind-main counts.
runpane panes git-status --pane <pane-id> [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes git-status --pane <pane-id> --jsonrunpane panes commit
Stage all changes in a Pane worktree and commit them.
runpane panes commit --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--message <message>- Commit message; the first line is the title.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes commit --pane <pane-id> --message <message> --yes --jsonrunpane panes push
Push a Pane branch to its remote.
runpane panes push --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes push --pane <pane-id> --yes --jsonrunpane panes pull
Pull the remote branch into a Pane worktree.
runpane panes pull --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes pull --pane <pane-id> --yes --jsonrunpane panes rebase-main
Rebase a Pane branch onto the latest main branch.
runpane panes rebase-main --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes rebase-main --pane <pane-id> --yes --jsonrunpane panes restore
Restore an archived Pane, recreating its worktree.
runpane panes restore --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes restore --pane <pane-id> --yes --jsonrunpane panes squash-rebase
Squash a Pane branch into one commit and rebase it onto main.
runpane panes squash-rebase --pane <pane-id> --message <message> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--message <message>- Commit message; the first line is the title.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes squash-rebase --pane <pane-id> --message <message> --yes --jsonrunpane panes stash
Stash uncommitted changes in a Pane worktree.
runpane panes stash --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes stash --pane <pane-id> --yes --jsonrunpane panes stash-pop
Apply and drop the latest stash in a Pane worktree.
runpane panes stash-pop --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes stash-pop --pane <pane-id> --yes --jsonrunpane panes soft-reset
Undo the last commit in a Pane, keeping its changes staged.
runpane panes soft-reset --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes soft-reset --pane <pane-id> --yes --jsonrunpane panes fetch
Fetch the remote for a Pane worktree.
runpane panes fetch --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes fetch --pane <pane-id> --yes --jsonrunpane panes run-script
Run the repository's run script in a Pane.
runpane panes run-script --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes run-script --pane <pane-id> --yes --jsonrunpane panes stop-script
Stop the run script running in a Pane.
runpane panes stop-script --pane <pane-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes stop-script --pane <pane-id> --yes --jsonrunpane panes move
Move a Pane into a sidebar folder.
runpane panes move --pane <pane-id> --folder <folder-id> --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id from panes list or agents start.
--folder <folder-id>- Folder id from folders list.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane panes move --pane <pane-id> --folder <folder-id> --yes --jsonrunpane folders list
List the sidebar folders of a repository.
runpane folders list --repo <repo-id> [--json] [--pane-dir <path>]--repo <repo-id>- Numeric repository id from repos list.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane folders list --repo <repo-id> --jsonrunpane folders create
Create a sidebar folder in a repository.
runpane folders create --repo <repo-id> --name <name> --yes [--json] [--pane-dir <path>]--repo <repo-id>- Numeric repository id from repos list.
--name <name>- Folder name.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane folders create --repo <repo-id> --name <name> --yes --jsonrunpane links create
Build a pane:// link that opens a Pane, panel, repository, or Session in the Pane app.
runpane links create --pane <pane-id> [--panel <panel-id>] [--json]
runpane links create --repo <repo-id> [--json]
runpane links create --session <session-id> [--json]--pane <pane-id>- Pane to open.
--panel <panel-id>- Panel inside the Pane to select.
--repo <repo-id>- Repository id from repos list.
--session <session-id>- Session id or name from sessions list.
--json- Print machine-readable output.
runpane links create --pane <pane-id> --jsonrunpane links open
Open a pane:// link in the running Pane app.
runpane links open --url <pane-url> --yes [--json] [--pane-dir <path>]--url <pane-url>- A pane://open link from links create.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane links open --url "pane://open?pane=<pane-id>" --yes --jsonrunpane docs search
Search Pane's docs, runpane help, and the Pane Chat skills.
runpane docs search --query <text> [--limit <count>] [--json]--query <text>- Words to search for.
--limit <count>- Maximum results; defaults to 5.
--json- Print machine-readable output.
runpane docs search --query "archive a pane" --jsonrunpane docs read
Read one Pane doc, help topic, or skill in full.
runpane docs read --doc <path> [--json]--doc <path>- Path from docs search, such as docs/PANE_MCP.md.
--json- Print machine-readable output.
runpane docs read --doc docs/PANE_MCP.md --jsonrunpane agents start
Start an agent on a task: create a Pane in a repository, launch the agent with the prompt, and wait until it is ready.
runpane agents start --repo <selector> --name <name> (--agent <codex|claude|cursor>|--tool-command <command>) --prompt <task> [--base-branch <branch>] --yes [--json] [--pane-dir <path>]--repo <selector>- Repository: active, id, exact path, or saved name.
--name <name>- Name for the new Pane.
--agent <codex|claude|cursor>- Built-in agent to launch.
--tool-command <command>- Custom terminal command instead of a built-in agent.
--prompt <task>- The task to send once the agent is ready.
--base-branch <branch>- Branch to start the worktree from.
--yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane agents start --repo active --name fix-login --agent claude --prompt "Fix the login redirect" --yes --jsonrunpane agents status
Check on an agent: whether it is working, ready, blocked, or idle, plus its current screen.
runpane agents status (--pane <pane-id>|--panel <panel-id>) [--limit <count>] [--json] [--pane-dir <path>]--pane <pane-id>- Pane id; its agent panel is used.
--panel <panel-id>- Panel id.
--limit <count>- Screen lines to return; defaults to 40.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane agents status --pane <pane-id> --jsonrunpane agents send
Send a follow-up message to an agent and confirm it was submitted.
runpane agents send (--pane <pane-id>|--panel <panel-id>) --text <message> [--as-file-pointer] --yes [--json] [--pane-dir <path>]--pane <pane-id>- Pane id; its agent panel is used.
--panel <panel-id>- Panel id.
--text <message>- The message to submit.
--as-file-pointer- Write the prompt or text to a private file under the Pane directory and send the one line
Read and follow <path>instead. --yes- Confirm this change; required in non-interactive shells.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane agents send --pane <pane-id> --text "Also add a test" --yes --jsonrunpane agents send --pane <pane-id> --text "$(cat review-notes.md)" --as-file-pointer --yes --jsonrunpane report
Hand back a worker's structured report: state, PR, head commit, summary, and the question when blocked.
runpane report --state <ready|blocked|failed|done> [--pr <number>] [--head <sha>] [--summary <text>|--summary-file <path|->] [--question <text>] [--pane <pane-id> --panel <panel-id>] [--json] [--pane-dir <path>]--state <ready|blocked|failed|done>- ready: work is ready for review; done: finished with nothing to review; blocked: needs an answer; failed: could not finish.
--pr <number>- Pull request number.
--head <sha>- Head commit the report is about, 7-40 hex characters.
--summary <text>- Summary text; up to 16,000 characters are kept.
--summary-file <path|->- Read the summary from a file or stdin; the absolute path is kept as summaryPath.
--question <text>- What you need answered; required with --state blocked.
--pane <pane-id>- Pane id when not running inside a Pane terminal (PANE_SESSION_ID).
--panel <panel-id>- Panel id when not running inside a Pane terminal (PANE_PANEL_ID).
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane report --state ready --pr 747 --head fc5dce9 --summary-file /tmp/report.md --jsonrunpane report --state blocked --question "Should the migration drop the old column?"runpane sessions list
List durable named orchestration Sessions.
runpane sessions list [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions list [--json] [--pane-dir <path>]runpane sessions create
Create a durable named orchestration Session and its hidden terminal owner; JSON isPinned sets the pin star (default false).
runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions create --from-json <path|-> [--json] [--pane-dir <path>]runpane sessions get
Read one durable named orchestration Session.
runpane sessions get --session <id|name> [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions get --session <id|name> [--json] [--pane-dir <path>]runpane sessions update
Update a Session overview from structured JSON; isPinned sets the UI pin star.
runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions update --session <id|name> --from-json <path|-> [--json] [--pane-dir <path>]runpane sessions set-agent
Switch the durable terminal agent for a named Session.
runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions set-agent --session <id|name> --agent <codex|claude|cursor> [--json] [--pane-dir <path>]runpane sessions associate
Associate a user-visible Pane with a named Session.
runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions associate --session <id|name> --pane <pane-id> [--json] [--pane-dir <path>]runpane sessions detach
Detach a Pane from a named Session.
runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions detach --session <id|name> [--pane <pane-id>] [--json] [--pane-dir <path>]runpane sessions overview
Read a live status, activity, git, and pull request overview for a named Session.
runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions overview --session <id|name> [--json] [--pane-dir <path>]runpane lock acquire
Acquire a named lock on a resource shared between agents, such as one test account, optionally waiting for it.
runpane lock acquire --name <name> --ttl <duration> [--wait <milliseconds>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]--name <name>- Lock name: 1-128 letters, digits, ".", "_", or "-".
--ttl <duration>- How long the lock is held before it expires, such as 90s, 30m, or 2h; at most 24h. Acquire again before it runs out to renew.
--wait <milliseconds>- Wait this long for the lock to come free. The CLI waits in daemon calls of up to 120 seconds each.
--note <text>- What the lock is for, shown to other agents. Required outside a Pane terminal, where it also names the owner.
--pane <pane-id>- Act for this Pane instead of $PANE_SESSION_ID.
--panel <panel-id>- Act for this panel instead of $PANE_PANEL_ID.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane lock acquire --name testing-account --ttl 30m --wait 1800000 --note "call QA" --jsonrunpane lock acquire --name staging-db --ttl 10m --jsonrunpane lock release
Release a named lock you hold, or force-release another owner's lock.
runpane lock release --name <name> [--force] [--session <id|name>] [--note <text>] [--pane <pane-id>] [--panel <panel-id>] [--json] [--pane-dir <path>]--name <name>- Lock name.
--force- Release the lock even though another owner holds it.
--session <id|name>- Session whose lock to release; defaults to the caller's Session, or global.
--note <text>- Outside a Pane terminal, the note the lock was acquired with.
--pane <pane-id>- Act for this Pane instead of $PANE_SESSION_ID.
--panel <panel-id>- Act for this panel instead of $PANE_PANEL_ID.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane lock release --name testing-account --jsonrunpane lock release --name testing-account --session "<session-id-or-name>" --force --jsonrunpane lock list
List held named locks, optionally only one Session's.
runpane lock list [--session <id|name>] [--json] [--pane-dir <path>]--session <id|name>- Named Session id or exact name.
--json- Print machine-readable output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane lock list --jsonrunpane lock list --session "<session-id-or-name>" --jsonrunpane sessions unpin
Declaratively unpin a named Session using the UI pin state; repeated requests keep the requested state.
runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]--session <id|name>- Named Session id or exact name.
--json- Print JSON output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions unpin --session <id|name> [--json] [--pane-dir <path>]runpane sessions pin
Declaratively pin a named Session using the UI pin state; repeated requests keep the requested state.
runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]--session <id|name>- Named Session id or exact name.
--json- Print JSON output.
--pane-dir <path>- Connect to a specific Pane data directory.
runpane sessions pin --session <id|name> [--json] [--pane-dir <path>]