diff --git a/bash/functions/infra/launch_fleetclaude.md b/bash/functions/infra/launch_fleetclaude.md index 00641a99..cb5e931b 100644 --- a/bash/functions/infra/launch_fleetclaude.md +++ b/bash/functions/infra/launch_fleetclaude.md @@ -3,7 +3,7 @@ name: launch_fleetclaude kind: function lang: bash domain: infra -version: "1.1.0" +version: "1.3.2" purity: impure signature: "launch_fleetclaude [--cwd ] [--bin ] [--session ] [--cols ]" description: "Entrypoint de FleetView: abre una ventana kitty con una sesion tmux (socket aislado -L fleet) de dos panes (TUI fleetview a la izquierda, claude --dangerously-skip-permissions a la derecha) para centralizar la flota de Claudes. Instala atajos alt+flechas/alt+enter/alt+n que controlan la TUI desde cualquier pane, y fija el ancho del sidebar con hooks." @@ -83,10 +83,22 @@ al retomar el trabajo en el repo `fn_registry`. - **Ancho del sidebar via hooks**: `client-resized` y `window-layout-changed` re-fijan el pane 0 (TUI) a `--cols` columnas, porque el `attach` de kitty y el conmutar de Claude redistribuyen el espacio. -- **Necesita kitty y tmux en el PATH**: aborta con codigo != 0 si falta alguno. +- **tmux siempre, kitty solo sin TTY**: `tmux` es obligatorio (aborta != 0 si + falta). `kitty` solo se necesita en la ruta sin-TTY (atajo de escritorio, cron, + script), donde abre una ventana nueva. Invocado desde una terminal interactiva + (el caso normal del alias `fleetclaude`), reutiliza la terminal actual con + `exec tmux attach` y NO necesita kitty — util en WSL u hosts sin kitty. ## Capability growth log +- v1.3.2 (2026-06-17) — targeting de panes por **pane ID** (`%0`/`%1`) en vez de + por indice (`console.0`). Antes fallaba con `can't find pane: 0` en hosts cuyo + `~/.tmux.conf` define `base-index 1`/`pane-base-index 1` (el socket `-L fleet` + hereda esa config). Los pane ID son inmunes al base-index. Bug latente que el + fix de kitty (v1.3.1) destapo al dejar de abortar antes de montar la sesion. +- v1.3.1 (2026-06-17) — el guard de `kitty` se movio a la rama sin-TTY. La ruta + interactiva (`exec tmux attach`) ya no exige kitty, asi que `fleetclaude` + funciona en hosts sin kitty (p.ej. WSL) reutilizando la terminal actual. - v1.3.0 (2026-06-17) — renombrada de `launch_kittyclaude` a `launch_fleetclaude` (comando `fleetclaude`). Atajos: `alt+0` (= alt+n, abrir Claude nuevo), `alt+k` (kill con confirmacion), `alt+r` (picker de reanudar sesiones cerradas) y diff --git a/bash/functions/infra/launch_fleetclaude.sh b/bash/functions/infra/launch_fleetclaude.sh index 7b72a40e..6d5a96f1 100644 --- a/bash/functions/infra/launch_fleetclaude.sh +++ b/bash/functions/infra/launch_fleetclaude.sh @@ -111,10 +111,10 @@ USAGE echo "launch_fleetclaude: tmux no esta instalado." >&2 return 1 fi - if ! command -v kitty >/dev/null 2>&1; then - echo "launch_fleetclaude: kitty no esta instalado." >&2 - return 1 - fi + # Nota: kitty NO se exige aqui. La ruta interactiva (TTY) reutiliza la + # terminal actual con `exec tmux attach` y no necesita kitty. Solo la + # ruta sin-TTY (abrir ventana nueva con setsid kitty) lo requiere, y ahi + # se comprueba justo antes de usarlo. # ----------------------------------------------------------------------- # Comando para el pane izquierdo: @@ -131,27 +131,39 @@ USAGE # ----------------------------------------------------------------------- # Montar la sesion tmux SOLO si no existe (idempotencia). Socket aislado $T. + # + # Targeting por PANE ID (%0/%1), no por indice (console.0). El socket + # -L fleet sigue leyendo ~/.tmux.conf; si el usuario tiene + # `base-index 1` / `pane-base-index 1` (muy comun), el primer pane es el + # indice 1 y cualquier referencia a console.0 falla con + # "can't find pane: 0". Los pane ID son estables e inmunes al base-index. # ----------------------------------------------------------------------- + local left_pane right_pane if $T has-session -t "$session" 2>/dev/null; then echo "launch_fleetclaude: la sesion tmux '$session' ya existe; reutilizandola." else echo "launch_fleetclaude: creando sesion tmux '$session' en '$cwd'." - # Sesion detached con ventana 'console', pane 0 en el cwd objetivo. - $T new-session -d -s "$session" -n console -c "$cwd" + # Sesion detached con ventana 'console'. Capturamos el pane ID del pane + # izquierdo (la TUI fleetview, o el fallback claro). + left_pane=$($T new-session -d -s "$session" -n console -c "$cwd" -P -F '#{pane_id}') + $T send-keys -t "$left_pane" "$left_cmd" C-m - # pane 0 (izquierda) = la TUI fleetview (o el fallback claro). - $T send-keys -t "$session":console.0 "$left_cmd" C-m - - # pane 1 (derecha) = claude, dividiendo horizontalmente (split lado a lado). - $T split-window -h -t "$session":console -c "$cwd" - $T send-keys -t "$session":console.1 "exec claude --dangerously-skip-permissions" C-m + # pane derecho = claude, dividiendo horizontalmente (split lado a lado). + right_pane=$($T split-window -h -t "$left_pane" -c "$cwd" -P -F '#{pane_id}') + $T send-keys -t "$right_pane" "exec claude --dangerously-skip-permissions" C-m # Fijar el ancho del pane izquierdo en columnas. - $T resize-pane -t "$session":console.0 -x "$cols" + $T resize-pane -t "$left_pane" -x "$cols" # Foco inicial en el pane de claude (derecha). - $T select-pane -t "$session":console.1 + $T select-pane -t "$right_pane" + fi + + # Si reutilizamos sesion (o por seguridad), derivar el pane ID de la TUI: + # el primer pane de la ventana 'console' (orden por indice) es el izquierdo. + if [[ -z "$left_pane" ]]; then + left_pane=$($T list-panes -t "$session":console -F '#{pane_id}' 2>/dev/null | head -n1) fi # ----------------------------------------------------------------------- @@ -160,17 +172,17 @@ USAGE # del pane de Claude. La TUI (fleetview) es quien interpreta Up/Down/Enter/n. # `bind -n` = tabla root (sin prefijo). Idempotente: re-set en cada lanzamiento. # ----------------------------------------------------------------------- - $T bind -n M-Up send-keys -t "$session":console.0 Up - $T bind -n M-Down send-keys -t "$session":console.0 Down - $T bind -n M-Enter send-keys -t "$session":console.0 Enter - $T bind -n M-n send-keys -t "$session":console.0 n - $T bind -n M-0 send-keys -t "$session":console.0 n - $T bind -n M-k send-keys -t "$session":console.0 k - $T bind -n M-r send-keys -t "$session":console.0 r - $T bind -n M-u send-keys -t "$session":console.0 u - $T bind -n M-h send-keys -t "$session":console.0 h - $T bind -n M-Left send-keys -t "$session":console.0 Escape - $T bind -n M-q send-keys -t "$session":console.0 Q + $T bind -n M-Up send-keys -t "$left_pane" Up + $T bind -n M-Down send-keys -t "$left_pane" Down + $T bind -n M-Enter send-keys -t "$left_pane" Enter + $T bind -n M-n send-keys -t "$left_pane" n + $T bind -n M-0 send-keys -t "$left_pane" n + $T bind -n M-k send-keys -t "$left_pane" k + $T bind -n M-r send-keys -t "$left_pane" r + $T bind -n M-u send-keys -t "$left_pane" u + $T bind -n M-h send-keys -t "$left_pane" h + $T bind -n M-Left send-keys -t "$left_pane" Escape + $T bind -n M-q send-keys -t "$left_pane" Q # Raton: enruta clicks/rueda al pane bajo el cursor; la TUI los interpreta. $T set -g mouse on # Al salir un Claude (exit / Ctrl-D / kill), cerrar su window en vez de @@ -186,8 +198,8 @@ USAGE # Mantener el ancho del sidebar (pane 0) cuando kitty redimensiona la ventana # tras el attach, o cuando se conmuta de Claude (window-linked / layout change). - $T set-hook -g client-resized "resize-pane -t $session:console.0 -x $cols" - $T set-hook -g window-layout-changed "resize-pane -t $session:console.0 -x $cols" + $T set-hook -g client-resized "resize-pane -t $left_pane -x $cols" + $T set-hook -g window-layout-changed "resize-pane -t $left_pane -x $cols" # ----------------------------------------------------------------------- # Lanzar kitty adjuntando la sesion, DESACOPLADA del shell padre con @@ -203,6 +215,12 @@ USAGE if [ -t 0 ] && [ -t 1 ]; then exec tmux -L fleet attach -t "$session" fi + # Ruta sin-TTY: necesitamos kitty para abrir la ventana nueva. + if ! command -v kitty >/dev/null 2>&1; then + echo "launch_fleetclaude: kitty no esta instalado (necesario solo sin TTY)." >&2 + echo "launch_fleetclaude: lanzalo desde una terminal interactiva, o instala kitty." >&2 + return 1 + fi setsid kitty --title "FleetView" -e tmux -L fleet attach -t "$session" /dev/null 2>&1 & disown 2>/dev/null || true