xa.tmux¶
Pure tmux wrappers.
No Claude Code knowledge lives here. Every public function takes a
binary keyword so callers can override the tmux executable (tests,
cross-platform installs, remote-host bridges).
Key gotchas encoded below:
session_target(name)returnsf"{name}:"— the trailing colon is essential. A bare session name can be silently resolved as a window or pane spec and mis-target a different session.list_sessionsreturns an empty list (not raises) when the tmux server isn’t running; tmux exits non-zero in that case and we absorb it.
Functions
|
Return the last |
|
All transitive descendant PIDs of |
|
|
|
Every pane on the server, or |
|
Return all live tmux sessions; empty list if server isn't running. |
|
Create a detached tmux session running |
|
Number of panes (across all windows) in the session; 0 if gone. |
|
Working directory of the targeted pane's program, or None. |
|
Return the pid of the first pane's program, or None if the session is gone. |
|
PIDs of every pane program in the session (all windows, all panes). |
|
Target string for pane-scoped commands (capture, send-keys). |
|
Start streaming the pane's output to |
|
Return the |
|
Rename a live tmux session. |
|
Send one or more keys/strings to the targeted pane. |
|
Return the canonical target string for a session. |
Classes
|
Minimal view of one tmux pane, from |
|
Minimal view of one tmux session, from |
- class xa.tmux.TmuxPane(target, pid, current_command, current_path)[source]¶
Bases:
objectMinimal view of one tmux pane, from
list-panes -a.
- class xa.tmux.TmuxSession(name, created, activity, attached)[source]¶
Bases:
objectMinimal view of one tmux session, from
list-sessions.
- xa.tmux.capture_pane(name, *, lines=200, binary='tmux')[source]¶
Return the last
linesof the targeted pane, or ‘’ on failure.namemay be a session name (targets its active pane) or a full pane ref (session:@w.%p) for an exact pane.- Return type:
- xa.tmux.descendants(pid)[source]¶
All transitive descendant PIDs of
pid.Uses
/proc/*/statuswhere available andpselsewhere (macOS), so the process-tree walk behaves the same on every platform xa runs on. Silently tolerates races (processes dying mid-scan) and returns[]when neither source can be read.
- xa.tmux.list_panes(*, binary='tmux')[source]¶
Every pane on the server, or
[]when no server is running.targetis the full pane ref, the same shape claude records in its ephemeral session file, so the two views join without parsing.
- xa.tmux.list_sessions(*, binary='tmux')[source]¶
Return all live tmux sessions; empty list if server isn’t running.
- Return type:
- xa.tmux.new_session(name, *, command, binary='tmux')[source]¶
Create a detached tmux session running
commandas its pane’s program.commandis passed to a shell: the caller is responsible for quoting. Useshlex.quotefor untrusted parts.- Return type:
- xa.tmux.pane_count(name, *, binary='tmux')[source]¶
Number of panes (across all windows) in the session; 0 if gone.
- Return type:
- xa.tmux.pane_current_path(name, *, binary='tmux')[source]¶
Working directory of the targeted pane’s program, or None.
This is where a pane’s shell would run a command, which is what
claude remote-control -ckeys its per-directory record on.
- xa.tmux.pane_pid(name, *, binary='tmux')[source]¶
Return the pid of the first pane’s program, or None if the session is gone.
- xa.tmux.pane_pids(name, *, binary='tmux')[source]¶
PIDs of every pane program in the session (all windows, all panes).
Empty list when the session is gone.
namemay be a session name or a full pane ref —-sscopes to the containing session either way.
- xa.tmux.pane_target(ref)[source]¶
Target string for pane-scoped commands (capture, send-keys).
Accepts either a bare session name or a full tmux pane ref (
session:@window.%pane— the shape claude records in its ephemeral session file). A bare name targets the session’s active pane, which may not be the claude pane in a multi-window session — pass the full ref whenever you have one. Session names in xa match[A-Za-z0-9_.-]so they can never contain a:.- Return type:
>>> pane_target('foo') 'foo:' >>> pane_target('foo:@1.%2') 'foo:@1.%2'
- xa.tmux.pipe_pane_to_file(name, *, path, binary='tmux')[source]¶
Start streaming the pane’s output to
path(append mode).Uses
-oso a duplicate call toggles the pipe off, matching edualc’s behavior. tmux stops piping automatically when the pane dies.- Return type:
- xa.tmux.proc_comm(pid)[source]¶
Return the
commname of a pid (kernel-level process name), ‘’ if unreadable.Linux reads
/proc/<pid>/comm, which is a bare name (claude).ps -o comm=on macOS reports a path (/usr/local/bin/claude), so the fallback takes the basename — callers compare against bare names (seexa.claude_fs._looks_like_claude()) and must not have to care which platform answered.- Return type:
- xa.tmux.rename_session(old_name, new_name, *, binary='tmux')[source]¶
Rename a live tmux session.
Both names must match the strict
[A-Za-z0-9_.-]{1,48}pattern used elsewhere inxa; callers should validate before calling.- Return type: