agents/skills/tmux/SKILL.md
Remote control tmux sessions for interactive CLIs by sending keystrokes and scraping pane output.
npx skillsauth add dpaluy/dotfiles tmuxInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use tmux as a programmable terminal multiplexer for interactive work. Works on Linux and macOS with stock tmux; avoid custom config by using a private socket.
SOCKET_DIR=${TMPDIR:-/tmp}/agent-tmux-sockets # well-known dir for all agent sockets
mkdir -p "$SOCKET_DIR"
SOCKET="$SOCKET_DIR/agent.sock" # keep agent sessions separate from your personal tmux
SESSION=app-name-command # slug-like names; avoid spaces
tmux -S "$SOCKET" new -d -s "$SESSION" -n shell
TARGET=$(tmux -S "$SOCKET" list-panes -t "$SESSION" -F '#S:#I.#P' | head -n1)
tmux -S "$SOCKET" send-keys -t "$TARGET" -- 'pnpm run dev' Enter
tmux -S "$SOCKET" capture-pane -p -J -t "$TARGET" -S -200 # watch output
tmux -S "$SOCKET" kill-session -t "$SESSION" # clean up
After starting a session ALWAYS tell the user how to monitor the session by giving them a command to copy paste:
To monitor this session yourself:
tmux -S "$SOCKET" attach -t $SESSION
Or to capture the output once:
TARGET=$(tmux -S "$SOCKET" list-panes -t $SESSION -F '#S:#I.#P' | head -n1)
tmux -S "$SOCKET" capture-pane -p -J -t "$TARGET" -S -200
This must ALWAYS be printed right after a session was started and once again at the end of the tool loop. But the earlier you send it, the happier the user will be.
AGENT_TMUX_SOCKET_DIR (defaults to ${TMPDIR:-/tmp}/agent-tmux-sockets) and use tmux -S "$SOCKET" so we can enumerate/clean them. Create the dir first: mkdir -p "$AGENT_TMUX_SOCKET_DIR".SOCKET="$AGENT_TMUX_SOCKET_DIR/agent.sock".base-index/pane-base-index) stay in effect even if the user's config is different now.-f /dev/null only when you explicitly want stock tmux behavior.{session}:{window}.{pane}. Examples like :0.0 and :1.1 are both valid depending on tmux server options.TARGET=$(tmux -S "$SOCKET" list-panes -t "$SESSION" -F '#S:#I.#P' | head -n1).base-index and pane-base-index, but only for freshly started servers. Reused sockets may still be using older/default numbering.-S "$SOCKET" consistently to stay on the private socket path.tmux -S "$SOCKET" list-sessions, tmux -S "$SOCKET" list-panes -a, tmux -S "$SOCKET" show-options -g | rg '^base-index', tmux -S "$SOCKET" show-window-options -g | rg '^pane-base-index'../scripts/find-sessions.sh -S "$SOCKET"; add -q partial-name to filter../scripts/find-sessions.sh --all (uses AGENT_TMUX_SOCKET_DIR or ${TMPDIR:-/tmp}/agent-tmux-sockets).tmux -S "$SOCKET" send-keys -t target -l -- "$cmd".tmux ... send-keys -t target -- $'python3 -m http.server 8000'.tmux ... send-keys -t target C-c, C-d, C-z, Escape, etc.tmux -S "$SOCKET" capture-pane -p -J -t target -S -200.tmux wait-for (which does not watch pane output).tmux -S "$SOCKET" attach -t "$SESSION"; detach with Ctrl+b d.Some special rules for processes:
PYTHON_BASIC_REPL=1 environment variable. This is very important as the non-basic console interferes with your send-keys.TARGET=$(tmux -S "$SOCKET" list-panes -t "$SESSION" -F '#S:#I.#P' | head -n1)
./scripts/wait-for-text.sh -S "$SOCKET" -t "$TARGET" -p '^>>>' -T 15 -l 4000
"Type quit to exit", "Program exited", etc.) before proceeding.tmux ... send-keys -- 'python3 -q' Enter; wait for ^>>>; send code with -l; interrupt with C-c. Always with PYTHON_BASIC_REPL.tmux ... send-keys -- 'gdb --quiet ./a.out' Enter; disable paging tmux ... send-keys -- 'set pagination off' Enter; break with C-c; issue bt, info locals, etc.; exit via quit then confirm y.tmux -S "$SOCKET" kill-session -t "$SESSION".tmux -S "$SOCKET" list-sessions -F '#{session_name}' | xargs -r -n1 tmux -S "$SOCKET" kill-session -t.tmux -S "$SOCKET" kill-server../scripts/wait-for-text.sh polls a pane for a regex (or fixed string) with a timeout. Works on Linux/macOS with bash + tmux + grep.
./scripts/wait-for-text.sh [-L socket-name|-S socket-path] -t session:window.pane -p 'pattern' [-F] [-T 20] [-i 0.5] [-l 2000]
-L/--socket tmux socket name passed to tmux -L-S/--socket-path tmux socket path passed to tmux -S-t/--target pane target (required)-p/--pattern regex to match (required); add -F for fixed string-T timeout seconds (integer, default 15)-i poll interval seconds (default 0.5)-l history lines to search from the pane (integer, default 1000)development
Analyze a project's past Codex sessions, memory files, and existing local skills to recommend the highest-value skills to create or update. Use when a user asks what skills a project needs, wants skill ideas grounded in real project history, wants an audit of current project-local skills, or wants recommendations for updating stale or incomplete skills instead of creating duplicates.
tools
Google Workspace CLI (gws) for Drive, Gmail, Calendar, Sheets, Docs, Chat, and Admin APIs. Use when the user wants to interact with Google Workspace: list/upload/download Drive files, send/read Gmail, manage Calendar events, read/write Sheets, create Docs, send Chat messages, or administer Google Workspace. Triggers: "google drive", "gmail", "google calendar", "google sheets", "google docs", "google chat", "gws", "workspace", or any Google Workspace action.
tools
Fizzy project management CLI for boards, cards, columns, steps, comments, and notifications. Use when the user wants to manage tasks, track work, create/update cards, organize boards, or interact with Fizzy (fizzy.do). Triggers: "create a card", "list my boards", "move card", "check notifications", "update task", "fizzy", "board", "card", or any project management action.
tools
Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to "open a website", "fill out a form", "click a button", "take a screenshot", "scrape data from a page", "test this web app", "login to a site", "automate browser actions", or any task requiring programmatic web interaction.