e7a8edfed8
La funcion direccionaba panes por indice literal ("console.0",
"windowID.0", filtro pane_index != "0"). El socket aislado de fleetview
(tmux -L fleet) hereda ~/.tmux.conf, asi que con `pane-base-index 1`
(config muy comun) el primer pane es el indice 1 y no existe el 0:
join-pane fallaba con "can't find pane: 0" tras haber hecho ya el
break-pane, dejando la sesion fleet con las windows desperdigadas y sin
el sidebar de la TUI.
Ahora resuelve el pane sidebar como el de MENOR pane_index y opera
siempre por pane_id (estable e inmune al base-index). Helpers nuevos:
tmuxConsolePanes, tmuxFirstPaneID, tmuxPanesSorted, tmuxSidebarWidth.
Tests actualizados a base-index-agnostico (localizan el sidebar por
menor indice, no por "0") y el default de ancho del sidebar pasa de 47
a 52 para coincidir con launch_fleetclaude.
Bump v1.0.0 -> v1.0.1 + Capability growth log.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
5.2 KiB
5.2 KiB
name, kind, lang, domain, version, purity, signature, description, tags, uses_functions, uses_types, returns, returns_optional, error_type, imports, params, output, tested, tests, test_file_path, file_path, notes
| name | kind | lang | domain | version | purity | signature | description | tags | uses_functions | uses_types | returns | returns_optional | error_type | imports | params | output | tested | tests | test_file_path | file_path | notes | ||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| tmux_swap_window_into_console | function | go | infra | 1.0.1 | impure | func TmuxSwapWindowIntoConsole(socket, session, windowID string) error | Conmuta que Claude esta a la derecha de la TUI fleetview en una sesion tmux de un socket aislado (tmux -L <socket>). Trae el primer pane de <windowID> al pane derecho de la window 'console' (al lado del pane sidebar = la TUI), parkea en su propia window el Claude que estuviera a la derecha (detached, sin robar foco) y re-fija el ancho del sidebar al que tuviera antes (default 52 col). El sidebar se resuelve como el pane de MENOR pane_index y se opera por pane_id, NO por indice literal 0: inmune a `pane-base-index 1` del ~/.tmux.conf del usuario. Idempotente: si el objetivo ya es la window console solo re-aplica el ancho. Capa de control tmux de la app TUI fleetview. |
|
false | error_go_core |
|
nil en exito. Error si socket/session/windowID vienen vacios, si la window 'console' no existe en la sesion, o si alguno de los comandos tmux (list-panes, break-pane, join-pane, resize-pane) falla. El estado final de console: pane sidebar (menor indice) = TUI (52 col por default) + pane derecho = el Claude de windowID. | true |
|
functions/infra/tmux_swap_window_into_console_test.go | functions/infra/tmux_swap_window_into_console.go | Build tag //go:build !windows. Comparte runTmux con tmux_new_claude_window y tmux_map_claude_panes (mismo paquete infra). Secuencia interna: (1) list-panes de console ordenados por pane_index, sidebar = menor indice (TUI), right = primer pane no-sidebar; (2) break-pane -d del right si existe (parking); (3) join-pane -h del primer pane de windowID a la derecha del sidebar (por pane_id); (4) resize-pane -x <ancho> del sidebar por pane_id. Caso borde: si windowID ya ES la window console, solo re-aplica el resize. TODO targeting es por pane_id, NUNCA por indice literal 0 (rompia con 'can't find pane: 0' bajo pane-base-index 1 que el socket aislado hereda de ~/.tmux.conf). break-pane requiere que la window destino sea distinta del origen, garantizado por la comprobacion consoleID != windowID. |
Ejemplo
package main
import "fn-registry/functions/infra"
func main() {
// El usuario selecciona en fleetview el Claude que vive en la window @7.
// Lo trae a la derecha de la TUI (pane 1 de console), parkeando el que
// estuviera ahi. La TUI (pane 0) queda re-fijada a 40 columnas.
if err := infra.TmuxSwapWindowIntoConsole("fleet", "fleet", "@7"); err != nil {
panic(err)
}
}
Cuando usarla
Cada vez que el usuario conmuta en fleetview que Claude quiere ver a la derecha. Llamala con el window_id del Claude destino (de tmux_map_claude_panes para los ya vivos en la sesion, o de tmux_new_claude_window para uno recien arrancado). Encadena de forma natural tras tmux_new_claude_window para mostrar inmediatamente el Claude nuevo.
Gotchas
- Idempotente: si el Claude objetivo ya es la window console, solo re-aplica el ancho del sidebar; no rompe nada.
- El pane sidebar de console (el de MENOR pane_index) es SIEMPRE la TUI y nunca se mueve ni se parkea: la funcion solo toca el pane derecho (cualquier otro pane).
- NO asume que el sidebar es el indice 0. El socket aislado (
tmux -L <socket>) hereda~/.tmux.conf, asi que conpane-base-index 1(muy comun) el primer pane es el indice 1. Targetearconsole.0rompia concan't find pane: 0y dejaba console a medias (break ya hecho, join fallido). Por eso todo el targeting es porpane_id. join-paneexige que la window origen sea distinta de console; la funcion lo comprueba (consoleID != windowID) y si coinciden no hace el join.break-pane -dsaca el Claude anterior a su propia window detached: sigue vivo y parkeado, no se mata.- El ancho del sidebar se re-fija SIEMPRE al final (incluso en el caso borde) para que la TUI no se reduzca tras el reflow del split.
- Opera SIEMPRE sobre el socket aislado (
tmux -L <socket>). Build tag//go:build !windows.
Capability growth log
- v1.0.1 (2026-06-17) — fix: resuelve el pane sidebar por menor
pane_indexy opera porpane_iden vez deconsole.0/indice 0. Antes rompia concan't find pane: 0bajopane-base-index 1(el socket aislado hereda ~/.tmux.conf), dejando la sesion fleet con las windows desperdigadas y sin sidebar. Tests actualizados a base-index-agnostico; default de ancho del sidebar 47 -> 52 (coincide con launch_fleetclaude).