From 688f263323a6aaf0cf8576d9206bce0b32675fa2 Mon Sep 17 00:00:00 2001 From: "Kenneth Benzie (Benie)" Date: Mon, 2 Feb 2026 11:49:26 +0000 Subject: [PATCH] Auto-detach when all agents in window exit Add agent-cmd.sh wrapper that detaches the client when all panes in the current window have exited. This allows multiple agent windows (one per directory) while automatically returning to the shell when done with a particular window's agents. - remain-on-exit keeps panes alive after agent exits to check status - Wrapper counts running panes and detaches when it's the last one --- agent-cmd.sh | 15 +++++++++++++++ agent.sh | 11 +++++++---- 2 files changed, 22 insertions(+), 4 deletions(-) create mode 100755 agent-cmd.sh diff --git a/agent-cmd.sh b/agent-cmd.sh new file mode 100755 index 0000000..07365b2 --- /dev/null +++ b/agent-cmd.sh @@ -0,0 +1,15 @@ +#!/usr/bin/env bash +# Wrapper that runs an agent command, then detaches if all panes in window are dead + +# Run the agent command (don't use set -e, agent may exit non-zero) +"$@" || true + +# Brief delay to let tmux update pane status +sleep 0.1 + +# Count panes still running (pane_dead=0) +# Note: our own pane counts as running since this script is executing +running=$(tmux list-panes -F '#{pane_dead}' | grep -c '^0$' || true) + +# If we're the only pane still running, all others are dead - detach +[ "$running" -le 1 ] && tmux detach-client diff --git a/agent.sh b/agent.sh index 9112ac8..1c2fc54 100755 --- a/agent.sh +++ b/agent.sh @@ -2,6 +2,8 @@ set -e +script_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + # Check which agent commands are available agents=() command -v claude &>/dev/null && agents+=(claude) @@ -20,11 +22,12 @@ window_name=$dir # Create the agent session if it doesn't exist if ! tmux has-session -t agent; then - tmux new-session -ds agent -c "$dir" -n "$window_name" "${agents[0]}" - [ ${#agents[@]} -gt 1 ] && tmux split-window -h -t agent:0 "${agents[1]}" + tmux new-session -ds agent -c "$dir" -n "$window_name" "$script_dir/agent-cmd.sh" "${agents[0]}" + [ ${#agents[@]} -gt 1 ] && tmux split-window -h -t agent:0 "$script_dir/agent-cmd.sh" "${agents[1]}" # Store the directory in a window option for later matching tmux set-window-option -t agent @agent_dir "$dir" tmux set-option -t agent status off + tmux set-option -t agent remain-on-exit on tmux attach-session -t agent exit 0 fi @@ -44,8 +47,8 @@ if [ -n "$target_window" ]; then tmux select-window -t "$target_window" else # Create a new window with agents - tmux new-window -t agent -c "$dir" -n "$window_name" "${agents[0]}" - [ ${#agents[@]} -gt 1 ] && tmux split-window -h -t agent -c "$dir" "${agents[1]}" + tmux new-window -t agent -c "$dir" -n "$window_name" "$script_dir/agent-cmd.sh" "${agents[0]}" + [ ${#agents[@]} -gt 1 ] && tmux split-window -h -t agent -c "$dir" "$script_dir/agent-cmd.sh" "${agents[1]}" # Store the directory in a window option for later matching tmux set-window-option -t agent @agent_dir "$dir" fi