Lanzar `fleetclaude` estando ya dentro de una flota tmux viva abría una ventana kitty nueva (y creaba un perfil/socket nuevo fleetN+1) en vez de mostrar la flota en el pane actual. Causa: con $TMUX definido el launcher saltaba el `exec tmux attach` y caía a la rama `setsid kitty`. Cambio: cuando se invoca sin --new desde dentro de una flota fleetview viva (el socket actual, derivado de $TMUX, tiene una sesión homónima con window 'console'), se trae la TUI al contexto/pane actual (`fleetview show`, o `tmux select-window` de la window console como fallback sin binario) y se retorna 0 antes de las ramas kitty/wt.exe. Nuevo flag --new para forzar el comportamiento clásico (flota+ventana nueva) aun dentro de tmux; pasar --session con un nombre distinto al perfil actual equivale a --new implícito. Fuera de tmux el comportamiento es intacto (exec tmux attach reutiliza la terminal). Fix incidental: `local left_pane="" right_pane=""` (antes `local left_pane right_pane` reventaba con "unbound variable" bajo `set -u` al reutilizar una sesión existente, p. ej. con --reuse/--session sobre una flota viva). Verificación e2e con sockets aislados fctest* (sin tocar la flota del humano): golden (reuse, exit 0, kitty invariante), --new y --session-distinto (no reuse, ruta ventana-nueva), fuera de tmux (salta reuse, ruta attach). bash -n limpio. Docs: launch_fleetclaude.md (signature, params --new, ejemplo, cuando usarla, gotchas, growth log v1.7.0) + /fleet show en .claude/commands/fleet.md. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
16 KiB
name, kind, lang, domain, version, purity, signature, description, tags, params, output, uses_functions, uses_types, returns, returns_optional, error_type, imports, tested, tests, test_file_path, file_path
| name | kind | lang | domain | version | purity | signature | description | tags | params | output | uses_functions | uses_types | returns | returns_optional | error_type | imports | tested | tests | test_file_path | file_path | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| launch_fleetclaude | function | bash | infra | 1.7.0 | impure | launch_fleetclaude [--cwd <dir>] [--bin <path>] [--session <name>] [--reuse] [--new] [--cols <n>] | Entrypoint de FleetView: abre una ventana de terminal con una sesion tmux (socket aislado por perfil) de dos panes (TUI fleetview a la izquierda, claude --dangerously-skip-permissions a la derecha) para centralizar la flota de Claudes. REUSO DE CONTEXTO: si se invoca DENTRO de una flota tmux viva (su window 'console') sin --new, NO abre ventana ni crea un perfil nuevo; trae la TUI al pane/contexto actual (equivale a 'fleetview show'). El flag --new fuerza una flota+ventana nueva aunque estes en tmux. La terminal se AUTO-DETECTA sin config por PC: kitty si esta instalado y hay display ($DISPLAY/$WAYLAND_DISPLAY), si no Windows Terminal (wt.exe) en WSL adjuntando via wsl.exe. El pane de la TUI corre dentro del bucle supervisor supervise_fleetview_tui, que la relanza si muere (crash/panic/kill), asi el panel de control NUNCA se pierde. Soporta PERFILES multiples: fuera de tmux, o con --new, cada invocacion abre un perfil nuevo (fleet, fleet2, fleet3, ...) con su propia flota; inyecta FLEET_SOCKET/FLEET_SESSION a la TUI para que cada panel vea solo sus Claudes. Instala atajos alt+flechas/alt+enter/alt+n que controlan la TUI desde cualquier pane, y fija el ancho del sidebar con hooks. |
|
|
Caso reuse de contexto (dentro de una flota tmux viva, sin --new): trae la TUI al pane/contexto actual con select-window de la window 'console' (o 'fleetview show' si el binario existe) y retorna 0, sin abrir nada. Caso ventana-nueva (fuera de tmux, o con --new): crea/reutiliza una sesion tmux detached con dos panes y lanza una ventana de terminal 'FleetView' adjunta (kitty o Windows Terminal segun auto-deteccion), desacoplada del shell padre. Imprime el estado por stdout. Sin valor de retorno; exit 0 en exito, !=0 con mensaje claro si no hay terminal ni contexto que reusar. |
|
false | error_go_core | false | bash/functions/infra/launch_fleetclaude.sh |
Ejemplo
# DENTRO de una flota tmux viva (p. ej. en el pane del orquestador): reusa el
# contexto, trae la TUI al pane actual. NO abre ventana ni crea perfil nuevo.
fleetclaude
# FUERA de tmux: perfil nuevo automatico (fleet la 1a vez; fleet2, ... si ya hay
# uno) en una ventana de terminal nueva, reutilizando la terminal actual (attach):
fleetclaude
# Forzar una flota+ventana NUEVA aunque estes dentro de una flota tmux:
fleetclaude --new
# Reattach a la flota principal 'fleet' (comportamiento idempotente clasico):
fleetclaude --reuse
# Perfil con nombre fijo y ancho de pane personalizado:
fleetclaude --session trabajo --cols 50
# Via fn run (resuelve por nombre o ID):
fn run launch_fleetclaude
Dentro de una flota viva, fleetclaude sin args reusa el contexto (la window
console pasa al frente). Fuera de tmux (o con --new) aparece una ventana de
terminal titulada FleetView (<perfil>) con dos panes lado a lado: a la izquierda
la TUI fleetview, a la derecha una sesion de claude --dangerously-skip-permissions.
Cada perfil es un socket+sesion tmux aislados con su propia flota: puedes tener
varias FleetView abiertas a la vez con --new.
Cuando usarla
Usala cuando quieras un unico punto de entrada a la flota de Claudes en vez de
N ventanas kitty sueltas: lanzas fleetclaude y tienes la TUI de control y un
Claude listo para trabajar en la misma ventana. Tipico al empezar la jornada o
al retomar el trabajo en el repo fn_registry. Si ya estas dentro de una
flota (en el pane del orquestador) y solo quieres volver a ver la TUI, lanza
fleetclaude sin args: trae el panel al contexto actual sin abrir otra ventana
ni arrancar una flota duplicada. Usa --new solo cuando quieras DELIBERADAMENTE
una segunda flota aparte.
Gotchas
- Perfiles multiples (default = perfil nuevo): sin
--sessionni--reuse, cada invocacion abre un perfil NUEVO usando el primer nombre libre de la secuenciafleet,fleet2,fleet3, ... (socket+sesion tmux comparten el nombre del perfil). Asi puedes tener varias FleetView abiertas a la vez, cada una con su flota independiente. Un perfil cerrado libera su nombre: tras matarfleet, el siguiente lanzamiento vuelve afleet. Para reattach a una flota concreta:--reuse(principalfleet) o--session <nombre>(idempotente sobre ese nombre, reusa el layout si ya vive). - Perfil ↔ TUI por entorno: el launcher inyecta
FLEET_SOCKET/FLEET_SESSIONal pane de la TUI (y los fija en el server conset-environment -g, para querespawn-panede alt+R y los Claude nuevos hereden el socket).main.golos lee con fallback afleet. Por eso cada panel ve SOLO los Claude de su perfil (cruza la lista del sistema con los panes de su socket). - Auto-deteccion de terminal (sin config por PC): en la ruta ventana-nueva el
launcher elige terminal solo. (1)
kittyinstalado y display usable ($DISPLAY/$WAYLAND_DISPLAY) → kitty (escritorio Linux nativo o WSLg con kitty). (2) Si no, WSL conwt.exeen el PATH → Windows Terminal ejecutandowsl.exe [-d $WSL_DISTRO_NAME] -- bash -lic 'tmux -L <perfil> attach ...'. (3) Ninguna → error con las salidas posibles. Asi el MISMOfleetclaudefunciona en un PC con kitty y en otro WSL sin kitty, cada uno elige su terminal. Causa raiz del sintoma "se lanza la flota pero no se ve": kitty no instalado en WSL hacia que la sesion tmux se creara sin ventana que la mostrara. - Dentro de una flota tmux viva: reuse de contexto (no ventana nueva): si
invocas
fleetclaudesin--newdesde dentro de una flota fleetview viva ($TMUXdefinido y el socket actual tiene una sesion homonima con windowconsole), NO abre ventana ni crea un perfilfleetN+1: trae la TUI al pane actual (fleetview show, otmux -L <perfil> select-window -t <perfil>:consolesi el binario no esta compilado) y retorna 0. El perfil de la flota actual se deriva de$TMUX(basename del socket = nombre-L), senal fiable aunque$FLEET_SOCKETvenga vacio (verdetect_fleet_context).--newfuerza el comportamiento clasico (flota+ventana nueva); pasar--session <otro>distinto al perfil actual equivale a--newimplicito. Fuera de tmux y con TTY, reutiliza la terminal actual conexec tmux attach(nuncaattachanidado dentro de tmux). Sin TTY ni contexto que reusar (atajo de escritorio/cron) cae a la ruta ventana-nueva. Antes de este fix (v1.6.0 y anteriores) cualquierfleetclaudedentro de tmux abria una kitty nueva y un socketfleetN+1— el sintoma que acumulaba 6+ socketsfleet*. local xunbound bajoset -u: el archivo corre conset -euo pipefail.local left_pane right_panedejaba esas vars unbound (no vacias), asi que la rama "reutilizar sesion existente" (--reuse/--session <vivo>) reventaba conleft_pane: unbound variableal evaluar[[ -z "$left_pane" ]]. Se inicializan explicitamente a""(local left_pane="" right_pane=""). Si tocas estas vars, no vuelvas a declararlas sin valor.- kitty detached (setsid): la ventana kitty se lanza con
setsid ... ¶ sobrevivir al cierre de la terminal que la invoco. La ventana de Windows Terminal (wt.exe) ya es un proceso Windows independiente del arbol Linux, asi que sobrevive sola (se lanza con&+disowndesde un subshell con cwd/mnt/cpara evitar el warning de wt.exe por cwd UNC\\wsl.localhost\...). - TUI bajo supervisor (auto-respawn): el pane izquierdo NO corre un
exec fleetviewde una sola vida, sinosupervise_fleetview_tui(bucle que relanza la TUI si muere por crash/panic/kill). Asi el panel de control nunca se pierde por un fallo puntual. El supervisor para limpio con su sentinel (touch ~/.claude/fleet/tui_stop_<perfil>y deja salir la TUI) o se rinde si la TUI entra en crash-loop; en ambos casos el pane cae a una shell viva (no se cierra solo) para inspeccionar. Es la mitad "auto-recuperacion" del par de fixes que blindan FleetView; la otra es el Guard 3 anti-TUI/console dekill_fleet_agent(la causa raiz del cierre accidental). Si el script del supervisor no estuviera en disco, cae alexec fleetviewclasico. execen los demas panes:claude(orquestador e idle) se lanza conexec, asi que al terminar el proceso el pane se cierra en vez de dejar una shell zombie. Excepcion: el fallback cuandofleetviewno esta compilado deja una shell interactiva a proposito (para que veas el mensaje y puedas compilar).- Requiere fleetview compilado: el default
--binapunta a<repo>/apps/fleetview/fleetview. Si ese binario no existe, el pane izquierdo muestracd apps/fleetview && go build -o fleetview .en lugar de fallar en silencio. Compila la TUI antes para el flujo completo. - Socket tmux aislado por perfil (
-L <perfil>): cada perfil vive en su propio server tmux (socket = nombre del perfil), separado del tmux por defecto del usuario y de los demas perfiles. Asi los atajosbind -nNO afectan otras sesiones (ej. una sesionmobile-1del movil) y matar un perfil no toca los otros:tmux -L <perfil> kill-server(oalt+qdentro de la TUI). - Atajos en el socket, NO en kitty.conf: instala
bind -nparaalt+flechas(mover el cursor de la TUI),alt+enter(conmutar al Claude seleccionado) yalt+n(abrir Claude nuevo). Son bindings de tmux que redirigen la tecla al pane de la TUI (send-keys -t console.0), asi funcionan ESTES DONDE ESTES (incluido escribiendo en el pane de Claude). No modifican la configuracion de kitty ni los atajos globales del escritorio. - Ancho del sidebar via hooks:
client-resizedywindow-layout-changedre-fijan el pane 0 (TUI) a--colscolumnas, porque elattachde kitty y el conmutar de Claude redistribuyen el espacio. - tmux siempre; terminal (kitty/wt.exe) solo en la ruta ventana-nueva:
tmuxes obligatorio (aborta != 0 si falta). Una terminal nueva (kitty o Windows Terminal) solo se necesita en la ruta ventana-nueva:--new, o sin TTY ni flota viva que reusar (atajo de escritorio, cron, script). Dentro de una flota viva sin--newse reusa el contexto (ni kitty ni wt.exe). Invocado desde una terminal interactiva fuera de tmux (el caso normal del aliasfleetclaude), reutiliza la terminal actual conexec tmux attachy tampoco necesita kitty ni wt.exe.
Capability growth log
- v1.7.0 (2026-06-30) — reuse de contexto dentro de la flota + flag
--new. Invocado sin--newdesde dentro de una flota tmux viva (su windowconsole),fleetclaudeya NO abre una kitty nueva ni crea un perfilfleetN+1: trae la TUI al pane/contexto actual (fleetview show, otmux -L <perfil> select-window -t <perfil>:consolecomo fallback sin binario) y retorna 0. El perfil actual se deriva de$TMUX(basename del socket); pasar--session <otro>distinto al actual equivale a--newimplicito. Nuevo flag--newpara forzar la ruta clasica (flota+ventana nueva) aun dentro de tmux. Fuera de tmux el comportamiento es intacto (exec tmux attachreutiliza la terminal). Arregla el sintoma de que lanzarfleetclaudedentro de una flota abria ventana kitty + socket nuevo (fleet7,fleet8, ...). Fix incidental:local left_pane="" right_pane=""(anteslocal left_pane right_panereventaba conunbound variablebajoset -ual reutilizar una sesion existente). - v1.6.0 (2026-06-29) — auto-deteccion de terminal (kitty ↔ Windows Terminal).
La ruta ventana-nueva ya no asume kitty: elige terminal segun el host. kitty si
esta instalado y hay display (
$DISPLAY/$WAYLAND_DISPLAY); si no, en WSL abre Windows Terminal (wt.exe) ejecutandowsl.exe [-d $WSL_DISTRO_NAME] -- bash -lic 'tmux ... attach'. Mismofleetclaudeen un PC con kitty y en otro WSL sin kitty. Arregla el sintoma "se lanza la flota pero no se ve": en WSL sin kitty la sesion tmux se creaba pero ninguna ventana la mostraba. wt.exe se lanza desde un subshell con cwd/mnt/cpara evitar el warning por cwd UNC. - v1.5.0 (2026-06-24) — auto-respawn de la TUI. El pane izquierdo ya no corre
exec fleetview(una sola vida), sino el bucle supervisorsupervise_fleetview_tui, que relanza la TUI si muere (crash/panic/kill de su proceso o pane). Asi el panel de control NUNCA se pierde por un fallo puntual. Parada voluntaria via sentinel; crash-loop guard para no relanzar en bucle cerrado. Complementa el Guard 3 anti-TUI/console dekill_fleet_agent(causa raiz del cierre accidental). Nueva dependencia:supervise_fleetview_tui_bash_infra. - v1.4.0 (2026-06-18) — perfiles multiples. Socket+sesion tmux ya no son el
fijo
fleet: cada perfil tiene los suyos (mismo nombre). Sin--session/--reuse, cada invocacion abre el primer perfil libre (fleet,fleet2, ...), asi abrir FleetView con uno ya abierto arranca otra flota en vez de reusarla. Nuevo flag--reusepara el reattach idempotente clasico. El launcher inyectaFLEET_SOCKET/FLEET_SESSION(env +set-environment -g) ymain.godefleetviewlos lee (fallbackfleet), de modo que cada panel ve solo su flota. Titulo de kittyFleetView (<perfil>). Guard anti-nesting: invocado dentro de tmux abre ventana kitty nueva en vez deattachanidado. - v1.3.2 (2026-06-17) — targeting de panes por pane ID (
%0/%1) en vez de por indice (console.0). Antes fallaba concan't find pane: 0en hosts cuyo~/.tmux.confdefinebase-index 1/pane-base-index 1(el socket-L fleethereda 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
kittyse movio a la rama sin-TTY. La ruta interactiva (exec tmux attach) ya no exige kitty, asi quefleetclaudefunciona en hosts sin kitty (p.ej. WSL) reutilizando la terminal actual. - v1.3.0 (2026-06-17) — renombrada de
launch_kittyclaudealaunch_fleetclaude(comandofleetclaude). Atajos:alt+0(= alt+n, abrir Claude nuevo),alt+k(kill con confirmacion),alt+r(picker de reanudar sesiones cerradas) yalt+flecha-izquierda(volver atras desde el picker). Cierra la window al salir el Claude (remain-on-exit off). - v1.2.0 (2026-06-16) — ancho del sidebar por defecto 47 columnas;
ctrl+0como atajo alterno para abrir Claude nuevo;mouse on(clic/rueda enrutados a la TUI) yextended-keys on(para quectrl+0llegue distinguible por el protocolo de teclado de kitty). - v1.1.0 (2026-06-16) — socket tmux aislado
-L fleet; instala atajosalt+flechas/alt+enter/alt+nque controlan la TUI desde cualquier pane; hooks que mantienen fijo el ancho del sidebar tras attach/conmutar.