--- name: tmux_new_claude_window kind: function lang: go domain: infra version: "1.0.0" purity: impure signature: "func TmuxNewClaudeWindow(socket, session, cwd string) (string, error)" description: "Crea una window detached nueva en una sesion tmux de un socket aislado (tmux -L ) que corre `claude --dangerously-skip-permissions` en el cwd dado, y devuelve su window_id (ej @7). No cambia el foco. Capa de control tmux de la app TUI fleetview para arrancar un Claude nuevo dentro de la sesion fleet. Como el pane corre claude via exec, el #{pane_pid} del pane resultante es el PID del proceso claude." tags: [claude-fleet, infra, tmux, claude, fleet, tui] uses_functions: [] uses_types: [] returns: [] returns_optional: false error_type: "error_go_core" imports: [] params: - name: "socket" desc: "Nombre del socket tmux aislado (se invoca tmux -L ). En fleetview es 'fleet'. Nunca opera sobre el servidor tmux por defecto del usuario." - name: "session" desc: "Nombre de la sesion tmux donde crear la window (ej 'fleet'). Debe existir." - name: "cwd" desc: "Working directory del nuevo pane/Claude (-c). Ruta absoluta del proyecto donde arrancar el Claude." output: "window_id de la window creada (string con la forma @N, ej '@7'), tal cual lo imprime `tmux new-window -P -F '#{window_id}'`. Error si socket/session/cwd vienen vacios o si tmux falla (sesion inexistente, socket no accesible)." tested: true tests: ["TestTmuxNewClaudeWindow", "TestTmuxNewClaudeWindowEmptyArgs"] test_file_path: "functions/infra/tmux_new_claude_window_test.go" file_path: "functions/infra/tmux_new_claude_window.go" notes: "Build tag //go:build !windows (capa tmux de fleetview, no portable a Windows). Comparte el helper runTmux con tmux_swap_window_into_console y tmux_map_claude_panes (mismo paquete infra). El comando que corre el pane es literalmente 'claude --dangerously-skip-permissions'; tmux lo arranca via su shell pero claude reemplaza al proceso, asi que pane_pid == claude PID." --- ## Ejemplo ```go package main import ( "fmt" "fn-registry/functions/infra" ) func main() { // Arranca un Claude nuevo en /home/enmanuel/fn_registry dentro de la // sesion 'fleet' del socket aislado 'fleet'. No roba el foco. windowID, err := infra.TmuxNewClaudeWindow("fleet", "fleet", "/home/enmanuel/fn_registry") if err != nil { panic(err) } fmt.Println("Claude nuevo en window", windowID) // ej: @7 } ``` ## Cuando usarla Cuando la TUI fleetview necesita arrancar un Claude nuevo dentro de la sesion `fleet` sin sacar al usuario de la consola actual. El Claude nace parkeado en su propia window (detached); luego `TmuxSwapWindowIntoConsole` lo trae a la derecha de la TUI cuando el usuario lo selecciona. ## Gotchas - Opera SIEMPRE sobre el socket aislado (`tmux -L `). Nunca toca el servidor tmux por defecto del usuario. - La sesion `session` debe existir antes de llamar; la funcion crea la window, no la sesion. - Devuelve el `window_id` (`@N`), no el `window_index`. El swap posterior usa este id. - `-d` garantiza que no cambia el foco: el Claude nuevo queda parkeado, no se muestra solo. - Build tag `//go:build !windows`: no compila ni corre en Windows.