feat(infra): auto-commit con 2 cambios
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -3,7 +3,7 @@ name: launch_fleetclaude
|
|||||||
kind: function
|
kind: function
|
||||||
lang: bash
|
lang: bash
|
||||||
domain: infra
|
domain: infra
|
||||||
version: "1.1.0"
|
version: "1.3.2"
|
||||||
purity: impure
|
purity: impure
|
||||||
signature: "launch_fleetclaude [--cwd <dir>] [--bin <path>] [--session <name>] [--cols <n>]"
|
signature: "launch_fleetclaude [--cwd <dir>] [--bin <path>] [--session <name>] [--cols <n>]"
|
||||||
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."
|
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`
|
- **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
|
re-fijan el pane 0 (TUI) a `--cols` columnas, porque el `attach` de kitty y el
|
||||||
conmutar de Claude redistribuyen el espacio.
|
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
|
## 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`
|
- 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`
|
(comando `fleetclaude`). Atajos: `alt+0` (= alt+n, abrir Claude nuevo), `alt+k`
|
||||||
(kill con confirmacion), `alt+r` (picker de reanudar sesiones cerradas) y
|
(kill con confirmacion), `alt+r` (picker de reanudar sesiones cerradas) y
|
||||||
|
|||||||
@@ -111,10 +111,10 @@ USAGE
|
|||||||
echo "launch_fleetclaude: tmux no esta instalado." >&2
|
echo "launch_fleetclaude: tmux no esta instalado." >&2
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
if ! command -v kitty >/dev/null 2>&1; then
|
# Nota: kitty NO se exige aqui. La ruta interactiva (TTY) reutiliza la
|
||||||
echo "launch_fleetclaude: kitty no esta instalado." >&2
|
# terminal actual con `exec tmux attach` y no necesita kitty. Solo la
|
||||||
return 1
|
# ruta sin-TTY (abrir ventana nueva con setsid kitty) lo requiere, y ahi
|
||||||
fi
|
# se comprueba justo antes de usarlo.
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
# Comando para el pane izquierdo:
|
# Comando para el pane izquierdo:
|
||||||
@@ -131,27 +131,39 @@ USAGE
|
|||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
# Montar la sesion tmux SOLO si no existe (idempotencia). Socket aislado $T.
|
# 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
|
if $T has-session -t "$session" 2>/dev/null; then
|
||||||
echo "launch_fleetclaude: la sesion tmux '$session' ya existe; reutilizandola."
|
echo "launch_fleetclaude: la sesion tmux '$session' ya existe; reutilizandola."
|
||||||
else
|
else
|
||||||
echo "launch_fleetclaude: creando sesion tmux '$session' en '$cwd'."
|
echo "launch_fleetclaude: creando sesion tmux '$session' en '$cwd'."
|
||||||
|
|
||||||
# Sesion detached con ventana 'console', pane 0 en el cwd objetivo.
|
# Sesion detached con ventana 'console'. Capturamos el pane ID del pane
|
||||||
$T new-session -d -s "$session" -n console -c "$cwd"
|
# 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).
|
# pane derecho = claude, dividiendo horizontalmente (split lado a lado).
|
||||||
$T send-keys -t "$session":console.0 "$left_cmd" C-m
|
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
|
||||||
# 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
|
|
||||||
|
|
||||||
# Fijar el ancho del pane izquierdo en columnas.
|
# 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).
|
# 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
|
fi
|
||||||
|
|
||||||
# -----------------------------------------------------------------------
|
# -----------------------------------------------------------------------
|
||||||
@@ -160,17 +172,17 @@ USAGE
|
|||||||
# del pane de Claude. La TUI (fleetview) es quien interpreta Up/Down/Enter/n.
|
# 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.
|
# `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-Up send-keys -t "$left_pane" Up
|
||||||
$T bind -n M-Down send-keys -t "$session":console.0 Down
|
$T bind -n M-Down send-keys -t "$left_pane" Down
|
||||||
$T bind -n M-Enter send-keys -t "$session":console.0 Enter
|
$T bind -n M-Enter send-keys -t "$left_pane" Enter
|
||||||
$T bind -n M-n send-keys -t "$session":console.0 n
|
$T bind -n M-n send-keys -t "$left_pane" n
|
||||||
$T bind -n M-0 send-keys -t "$session":console.0 n
|
$T bind -n M-0 send-keys -t "$left_pane" n
|
||||||
$T bind -n M-k send-keys -t "$session":console.0 k
|
$T bind -n M-k send-keys -t "$left_pane" k
|
||||||
$T bind -n M-r send-keys -t "$session":console.0 r
|
$T bind -n M-r send-keys -t "$left_pane" r
|
||||||
$T bind -n M-u send-keys -t "$session":console.0 u
|
$T bind -n M-u send-keys -t "$left_pane" u
|
||||||
$T bind -n M-h send-keys -t "$session":console.0 h
|
$T bind -n M-h send-keys -t "$left_pane" h
|
||||||
$T bind -n M-Left send-keys -t "$session":console.0 Escape
|
$T bind -n M-Left send-keys -t "$left_pane" Escape
|
||||||
$T bind -n M-q send-keys -t "$session":console.0 Q
|
$T bind -n M-q send-keys -t "$left_pane" Q
|
||||||
# Raton: enruta clicks/rueda al pane bajo el cursor; la TUI los interpreta.
|
# Raton: enruta clicks/rueda al pane bajo el cursor; la TUI los interpreta.
|
||||||
$T set -g mouse on
|
$T set -g mouse on
|
||||||
# Al salir un Claude (exit / Ctrl-D / kill), cerrar su window en vez de
|
# 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
|
# 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).
|
# 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 client-resized "resize-pane -t $left_pane -x $cols"
|
||||||
$T set-hook -g window-layout-changed "resize-pane -t $session:console.0 -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
|
# Lanzar kitty adjuntando la sesion, DESACOPLADA del shell padre con
|
||||||
@@ -203,6 +215,12 @@ USAGE
|
|||||||
if [ -t 0 ] && [ -t 1 ]; then
|
if [ -t 0 ] && [ -t 1 ]; then
|
||||||
exec tmux -L fleet attach -t "$session"
|
exec tmux -L fleet attach -t "$session"
|
||||||
fi
|
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 >/dev/null 2>&1 &
|
setsid kitty --title "FleetView" -e tmux -L fleet attach -t "$session" </dev/null >/dev/null 2>&1 &
|
||||||
disown 2>/dev/null || true
|
disown 2>/dev/null || true
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user