state_root="${XDG_STATE_HOME:-$HOME/.local/state}/tmux-panes" snapshot_root="${XDG_DATA_HOME:-$HOME/.local/share}/tmux/resurrect/panes" pane_state() { echo "$state_root/${1#%}" } pane_snapshot() { echo "$snapshot_root/${1//\//_}" } case "${1:-}" in claude-session) [ -n "${TMUX_PANE:-}" ] || exit 0 session_id="$(jq -r '.session_id')" dir="$(pane_state "$TMUX_PANE")" mkdir -p "$dir" printf '%s\n%s\n' "${CLAUDE_CONFIG_DIR:-}" "$session_id" > "$dir/claude" ;; save) mkdir -p "$(dirname "$snapshot_root")" "$state_root" snapshot="$(mktemp -d "$snapshot_root.XXXXXX")" live=() while IFS=$'\t' read -r id pos cmd; do live+=("${id#%}") case "$cmd" in claude | emacs) ;; *) continue ;; esac src="$(pane_state "$id")/$cmd" [ -f "$src" ] || continue dst="$snapshot/${pos//\//_}" mkdir -p "$dst" cp "$src" "$dst/$cmd" done < <(tmux list-panes -a -F '#{pane_id} #S:#I.#P #{pane_current_command}') rm -rf "$snapshot_root" mv "$snapshot" "$snapshot_root" for dir in "$state_root"/*/; do [ -d "$dir" ] || continue name="$(basename "$dir")" [[ " ${live[*]} " == *" $name "* ]] || rm -rf "$dir" done ;; restore) pos="$(tmux display-message -p -t "$TMUX_PANE" '#S:#I.#P')" file="$(pane_snapshot "$pos")/${2:-}" case "${2:-}" in claude) if [ ! -f "$file" ]; then echo "tmux-panes: no saved claude session for $pos" >&2 exit 1 fi { read -r config_dir; read -r session_id; } < "$file" CLAUDE_CONFIG_DIR="$config_dir" exec claude --resume "$session_id" ;; emacs) if [ -f "$file" ]; then buffers="$(mktemp)" cp "$file" "$buffers" TMUX_PANES_RESTORE="$buffers" exec e fi exec e ;; *) echo "usage: tmux-panes restore claude|emacs" >&2 exit 1 ;; esac ;; *) echo "usage: tmux-panes claude-session|save|restore " >&2 exit 1 ;; esac