feat(browser): auto-commit con 178 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-20 18:22:23 +02:00
parent 7d100e7f3e
commit 763e06c127
178 changed files with 19917 additions and 317 deletions
+71 -17
View File
@@ -21,7 +21,9 @@ launch_fleetclaude() {
local bin=""
local session="fleet"
local cols=52
local T="tmux -L fleet" # socket tmux aislado: no toca el tmux normal del usuario
local explicit_session=0 # 1 si el usuario pasó --session <name> a mano
local reuse=0 # 1 si el usuario pidió --reuse (reattach al perfil principal)
local T="" # socket tmux aislado; se fija al resolver el perfil
# -----------------------------------------------------------------------
# Parseo de argumentos
@@ -39,6 +41,10 @@ launch_fleetclaude() {
--session)
shift
session="${1:-}"
explicit_session=1
;;
--reuse)
reuse=1
;;
--cols)
shift
@@ -51,19 +57,28 @@ Uso: launch_fleetclaude [opciones]
Abre una ventana kitty con una sesion tmux de dos panes: la TUI fleetview a la
izquierda y 'claude --dangerously-skip-permissions' a la derecha.
Cada PERFIL de FleetView es un socket+sesion tmux aislados (su propia flota de
Claudes). Sin --session ni --reuse, cada invocacion abre un perfil NUEVO: usa
el primer nombre libre de la secuencia fleet, fleet2, fleet3, ... Asi puedes
tener varias FleetView abiertas a la vez, cada una con su flota independiente.
Opciones:
--cwd <dir> Directorio de trabajo de los panes.
Default: raiz del repo fn_registry (derivada dinamicamente).
--bin <path> Ruta al binario de la TUI fleetview.
Default: <repo>/apps/fleetview/fleetview
--session <name> Nombre de la sesion tmux. Default: fleet.
--session <name> Fija el perfil (socket+sesion) por nombre exacto; reutiliza
el existente si ya esta vivo. Sin esta opcion, perfil auto.
--reuse Reattach al perfil principal 'fleet' en vez de abrir uno
nuevo (vuelve al comportamiento idempotente clasico).
--cols <n> Ancho (columnas) del pane izquierdo. Default: 40.
-h, --help Muestra esta ayuda.
Ejemplos:
launch_fleetclaude
launch_fleetclaude --cwd ~/fn_registry
launch_fleetclaude --session fleet --cols 50
launch_fleetclaude # perfil nuevo (fleet, luego fleet2, ...)
launch_fleetclaude --reuse # reattach a la flota principal 'fleet'
launch_fleetclaude --session trabajo # perfil con nombre fijo 'trabajo'
launch_fleetclaude --cwd ~/fn_registry --cols 50
USAGE
return 0
;;
@@ -111,6 +126,34 @@ USAGE
echo "launch_fleetclaude: tmux no esta instalado." >&2
return 1
fi
# -----------------------------------------------------------------------
# Resolver el PERFIL (socket+sesion tmux comparten nombre).
#
# - --session <name> -> usa ese nombre exacto (reutiliza si ya vive).
# - --reuse -> usa 'fleet' (el perfil principal), idempotente.
# - sin nada -> perfil NUEVO: primer nombre libre de la secuencia
# fleet, fleet2, fleet3, ... Asi abrir FleetView con
# uno ya abierto arranca otra flota, no la reusa.
#
# "Libre" = no hay un server tmux con esa sesion (has-session falla). Un
# perfil cerrado libera su nombre, asi que tras cerrar 'fleet' el siguiente
# lanzamiento vuelve a 'fleet'.
# -----------------------------------------------------------------------
if [[ "$explicit_session" -eq 0 && "$reuse" -eq 0 ]]; then
local base="$session" n=1 cand
while :; do
if [[ "$n" -eq 1 ]]; then cand="$base"; else cand="${base}${n}"; fi
if ! tmux -L "$cand" has-session -t "$cand" 2>/dev/null; then
session="$cand"
break
fi
n=$((n + 1))
done
echo "launch_fleetclaude: perfil nuevo '$session'."
fi
# A partir de aqui el socket aislado es el del perfil resuelto.
T="tmux -L $session"
# 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
@@ -121,9 +164,13 @@ USAGE
# - Si el binario fleetview existe -> ejecutarlo (exec, sin shell colgado).
# - Si NO existe -> mensaje claro + shell interactiva (no falla en silencio).
# -----------------------------------------------------------------------
# La TUI necesita saber a qué perfil pertenece: se lo pasamos por entorno
# (FLEET_SOCKET/FLEET_SESSION), que main.go lee con fallback a "fleet".
local envpfx
envpfx="FLEET_SOCKET=$(printf '%q' "$session") FLEET_SESSION=$(printf '%q' "$session")"
local left_cmd
if [[ -x "$bin" ]]; then
left_cmd="exec $(printf '%q' "$bin")"
left_cmd="$envpfx exec $(printf '%q' "$bin")"
else
# Fallback claro: instruye como compilar la TUI y deja una shell viva.
left_cmd="echo 'fleetview no compilado: cd apps/fleetview && go build -o fleetview .'; exec \"\$SHELL\""
@@ -181,8 +228,14 @@ USAGE
$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-R send-keys -t "$left_pane" R
$T bind -n M-Left send-keys -t "$left_pane" Escape
$T bind -n M-q send-keys -t "$left_pane" Q
# Entorno del perfil en el server tmux: respawn-pane (alt+R, recompila la TUI)
# y los Claude nuevos heredan FLEET_SOCKET/FLEET_SESSION para apuntar al
# socket correcto aunque no sea el default "fleet".
$T set-environment -g FLEET_SOCKET "$session"
$T set-environment -g FLEET_SESSION "$session"
# 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
@@ -207,24 +260,25 @@ USAGE
# (Mismo patron que reboot_all_claudes para relanzar terminales.)
# -----------------------------------------------------------------------
# Adjuntar la sesion:
# - Si se invoca desde una terminal interactiva, convertir ESA terminal en
# el panel FleetView (exec reemplaza el proceso; al hacer detach vuelve la
# - Terminal interactiva y FUERA de tmux: convertir ESA terminal en el
# panel FleetView (exec reemplaza el proceso; al hacer detach vuelve la
# shell). Asi `fleetclaude` no abre otra ventana: usa la actual.
# - Si NO hay TTY (atajo de escritorio, cron, script), abrir una ventana
# kitty nueva desacoplada (setsid) como antes.
if [ -t 0 ] && [ -t 1 ]; then
exec tmux -L fleet attach -t "$session"
# - DENTRO de tmux (o sin TTY: atajo de escritorio, cron, script): abrir
# una ventana kitty nueva desacoplada (setsid). No hacemos `attach`
# anidado dentro de otra sesion tmux (rompe / da el warning de nesting).
if [ -t 0 ] && [ -t 1 ] && [ -z "${TMUX:-}" ]; then
exec tmux -L "$session" attach -t "$session"
fi
# Ruta sin-TTY: necesitamos kitty para abrir la ventana nueva.
# Ruta ventana-nueva: necesitamos kitty para abrirla.
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
echo "launch_fleetclaude: kitty no esta instalado (necesario para abrir ventana nueva)." >&2
echo "launch_fleetclaude: lanzalo desde una terminal interactiva fuera de tmux, 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 ($session)" -e tmux -L "$session" attach -t "$session" </dev/null >/dev/null 2>&1 &
disown 2>/dev/null || true
echo "launch_fleetclaude: ventana kitty 'FleetView' adjunta a la sesion tmux '$session'."
echo "launch_fleetclaude: ventana kitty 'FleetView ($session)' adjunta al perfil '$session'."
return 0
}