fa2b2e16bc
El statusline solo se re-ejecutaba al cambiar los mensajes, asi que el estado de reposo que el Stop hook escribe ~2s despues (en background) no se reflejaba hasta que el usuario interactuaba. Se anade refreshInterval=2 para que el harness re- ejecute el statusline cada 2s tambien estando idle, mostrando el valor final sin necesidad de escribir y sin bloquear el turno. Para que el refresco continuo no sea caro en repos grandes, el bloque git se cachea por directorio con TTL de 6s (el estado git no cambia estando parado); los ticks idle reusan el cache (~0.1s vs ~0.33s recomputando). El goal file (la fase) se lee siempre fresco. Se revierte el intento previo de Stop sincrono (bloqueaba ~2s el control). Nota: Claude Code no soporta acotar el refresco a una ventana (p.ej. 10s y parar); refreshInterval es continuo. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
39 lines
1.5 KiB
Bash
Executable File
39 lines
1.5 KiB
Bash
Executable File
#!/bin/bash
|
|
# Stop hook: tras cada respuesta del asistente, dispara (en background) la
|
|
# clasificacion de la fase de la tarea. Lee la ultima respuesta del transcript,
|
|
# la clasifica con ask_llm (haiku) y escribe el resultado en el goal JSON de la
|
|
# sesion. El statusline lo pinta en el siguiente render.
|
|
#
|
|
# No bloquea el cierre del turno: el trabajo pesado va al worker en background.
|
|
|
|
INPUT=$(cat)
|
|
SID=$(printf '%s' "$INPUT" | jq -r '.session_id // empty' 2>/dev/null)
|
|
TRANSCRIPT=$(printf '%s' "$INPUT" | jq -r '.transcript_path // empty' 2>/dev/null)
|
|
|
|
[ -z "$SID" ] && exit 0
|
|
|
|
F="$HOME/.claude/goals/${SID}.json"
|
|
# Solo si esta terminal tiene un objetivo fijado.
|
|
[ -f "$F" ] || exit 0
|
|
GOAL=$(jq -r '.goal // ""' "$F" 2>/dev/null)
|
|
[ -z "$GOAL" ] && exit 0
|
|
|
|
# Salir del estado ACTIVO de inmediato (sincrono, instantaneo): al parar no debe
|
|
# quedarse mostrando investigando/haciendo/testeando mientras el worker (haiku,
|
|
# background) afina el reposo a hecho/pendiente_revision/bloqueado/en_pausa.
|
|
CUR=$(jq -r '.phase // ""' "$F" 2>/dev/null)
|
|
case "$CUR" in
|
|
investigando|planificando|haciendo|testeando|puliendo)
|
|
TMP="${F}.prov.$$"
|
|
if jq '.phase="en_pausa"' "$F" > "$TMP" 2>/dev/null; then mv "$TMP" "$F"; else rm -f "$TMP"; fi
|
|
;;
|
|
esac
|
|
|
|
[ -z "$TRANSCRIPT" ] && exit 0
|
|
[ -f "$TRANSCRIPT" ] || exit 0
|
|
|
|
# Afinar el reposo en background; el hook retorna de inmediato (no bloquea el
|
|
# turno). El statusline reflejara el valor final en el siguiente refresco.
|
|
nohup bash "$HOME/.claude/hooks/goal_phase_worker.sh" "$SID" "$TRANSCRIPT" "$F" >/dev/null 2>&1 &
|
|
exit 0
|