feat: launcher arranca orquestador + idle, pin por role (flow 0012, fase 3b)
- mark_claude_role (python/functions/infra): resuelve PID->sessionId esperando sessions/<PID>.json y escribe role en el goal.json sin pisar el resto. 4 tests. - launch_fleetclaude: el pane derecho arranca el ORQUESTADOR con el skill /orquestador embebido como primer prompt; tras arrancar, mark_claude_role le pone role=orchestrator (en background, no-fatal) para que la TUI lo pinee arriba; ademas siembra 1 ejecutor idle inicial en su propia window. - skill /orquestador: regla 'no te vigiles a ti mismo' (ignora en la cola su propia sesion y cualquier role=orchestrator). Validado en vivo (perfil aislado): claude /orquestador entra en modo, role marcado, idle sembrado, pin correcto, fleet2 intacto. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -196,15 +196,39 @@ USAGE
|
||||
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 derecho = claude, dividiendo horizontalmente (split lado a lado).
|
||||
# pane derecho = el ORQUESTADOR de la flota: un Claude que arranca ya en
|
||||
# modo orquestador invocando el skill /orquestador como primer prompt. Es
|
||||
# el Claude con el que el humano habla; vigila la flota por su DoD.
|
||||
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
|
||||
$T send-keys -t "$right_pane" "exec claude --dangerously-skip-permissions '/orquestador'" C-m
|
||||
|
||||
# Fijar el ancho del pane izquierdo en columnas.
|
||||
$T resize-pane -t "$left_pane" -x "$cols"
|
||||
|
||||
# Foco inicial en el pane de claude (derecha).
|
||||
# Foco inicial en el pane del orquestador (derecha).
|
||||
$T select-pane -t "$right_pane"
|
||||
|
||||
# Marcar el orquestador con role=orchestrator en su goal.json para que la
|
||||
# TUI lo pinee arriba (estrella). El sessionId no se conoce hasta que
|
||||
# Claude escribe sessions/<PID>.json; mark_claude_role resuelve
|
||||
# PID->sessionId esperando ese archivo. En background (no bloquea el
|
||||
# arranque) y con sleep para que el `exec claude` reemplace al shell antes
|
||||
# de leer el pane_pid. Fallo = no-fatal (el orquestador no se pinea).
|
||||
if [[ -x "$repo_root/fn" ]]; then
|
||||
( sleep 1
|
||||
orch_pid=$($T display-message -p -t "$right_pane" '#{pane_pid}' 2>/dev/null || true)
|
||||
[[ -n "$orch_pid" ]] && "$repo_root/fn" run mark_claude_role "$orch_pid" orchestrator >/dev/null 2>&1
|
||||
) >/dev/null 2>&1 &
|
||||
disown 2>/dev/null || true
|
||||
fi
|
||||
|
||||
# Sembrar 1 ejecutor idle: una window detached con un claude normal,
|
||||
# listo para recibir tarea del orquestador. Aparece en la TUI bajo el
|
||||
# orquestador (role executor por defecto). Hereda FLEET_SOCKET/SESSION
|
||||
# del server (set-environment), asi apunta a este perfil.
|
||||
local idle_pane
|
||||
idle_pane=$($T new-window -d -t "$session" -n claude -c "$cwd" -P -F '#{pane_id}')
|
||||
$T send-keys -t "$idle_pane" "exec claude --dangerously-skip-permissions" C-m
|
||||
fi
|
||||
|
||||
# Si reutilizamos sesion (o por seguridad), derivar el pane ID de la TUI:
|
||||
|
||||
Reference in New Issue
Block a user