#!/usr/bin/env bash # dtach-router — au login SSH : s'il existe des sessions claude/dtach, affiche # le dashboard et propose d'en rejoindre une (fzf). Sinon, shell normal direct. # NE CREE PLUS de session (la creation se fait via l'alias `cc`). # À SOURCER depuis ~/.bashrc. Pas de set -e/-u (fuiraient dans le shell hote). set -o pipefail # SSH interactif uniquement ; sinon on ne fait rien. case $- in *i*) ;; *) return 0 2>/dev/null ;; esac DT="${DT_BIN:-dt}" raw=$("$DT" --raw 2>/dev/null) # Aucune session : shell normal, zero friction. [ -z "$raw" ] && return 0 2>/dev/null # Des sessions existent : dashboard + menu de selection. "$DT" ls || true out=$(printf '%s\n' "$raw" | \ fzf --with-nth=2,3 --delimiter='\t' \ --header=$'ENTER=rejoindre une session ESC=shell normal' \ --preview 'echo "Dossier : {2}"; echo "Age : {3}"' \ --preview-window=down,15% ) # ESC / selection vide : shell normal. [ -z "$out" ] && return 0 2>/dev/null name=$(printf '%s' "$out" | cut -f1) dt at "$name" /dev/tty 2>&1 return 0 2>/dev/null # ───────────────────────────────────────────────────────────── # INSTALLATION (~/.bashrc serveur), a la fin : # # # creation de session claude-dans-dtach # dtach_claude() { dtach -c "$HOME/.dtach/${1:-claude-$(date +%H%M%S)}" -e '^\' claude; } # alias cc='dtach_claude' # # # dashboard + reprise au login # [ -x "$HOME/.local/bin/dtach-router" ] && source "$HOME/.local/bin/dtach-router" # # # rappeler le menu depuis un shell : # alias d='source ~/.local/bin/dtach-router' # # chmod +x ~/.local/bin/dt ~/.local/bin/dtach-router # # USAGE : # cd ~/projets/seo && cc seo -> claude dans dtach, session "seo" # Ctrl-\ -> detache, retour au shell # (au prochain login) -> dashboard propose "seo", ENTER pour reprendre # ─────────────────────────────────────────────────────────────