feat(statusline): refresco idle via refreshInterval + cache de git
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>
This commit is contained in:
@@ -32,6 +32,7 @@ esac
|
||||
[ -z "$TRANSCRIPT" ] && exit 0
|
||||
[ -f "$TRANSCRIPT" ] || exit 0
|
||||
|
||||
# Afinar el reposo en background; el hook retorna de inmediato.
|
||||
# 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
|
||||
|
||||
@@ -39,7 +39,8 @@
|
||||
"statusLine": {
|
||||
"type": "command",
|
||||
"command": "~/.claude/statusline.sh",
|
||||
"padding": 1
|
||||
"padding": 1,
|
||||
"refreshInterval": 2
|
||||
},
|
||||
"enabledPlugins": {
|
||||
"gopls-lsp@claude-plugins-official": true,
|
||||
|
||||
+13
-2
@@ -63,10 +63,18 @@ RESET_7D=""
|
||||
[ "$RESET_5H_EPOCH" -gt 0 ] && RESET_5H=$(date -d "@$RESET_5H_EPOCH" +"%H:%M" 2>/dev/null)
|
||||
[ "$RESET_7D_EPOCH" -gt 0 ] && RESET_7D=$(date -d "@$RESET_7D_EPOCH" +"%a %H:%M" 2>/dev/null)
|
||||
|
||||
# Git info (si estamos en un repo)
|
||||
# Git info (si estamos en un repo). Con cache de TTL corto: como el statusline
|
||||
# se re-ejecuta cada pocos segundos (refreshInterval), recomputar git en cada
|
||||
# tick es caro en repos grandes y el estado git no cambia estando idle. Se cachea
|
||||
# por directorio y se recomputa solo si el cache tiene mas de 6s.
|
||||
GIT_BRANCH=""
|
||||
GIT_STATUS=""
|
||||
if git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
GIT_CACHE="/tmp/fn_sl_git_$(printf '%s' "$CURRENT_DIR" | cksum | cut -d' ' -f1).cache"
|
||||
GIT_CACHE_AGE=999
|
||||
[ -f "$GIT_CACHE" ] && GIT_CACHE_AGE=$(( $(date +%s) - $(stat -c %Y "$GIT_CACHE" 2>/dev/null || echo 0) ))
|
||||
if [ "$GIT_CACHE_AGE" -lt 6 ]; then
|
||||
. "$GIT_CACHE"
|
||||
elif git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
GIT_BRANCH=$(git branch --show-current 2>/dev/null || echo "detached")
|
||||
|
||||
# Obtener archivos staged, modified, untracked
|
||||
@@ -94,6 +102,9 @@ if git rev-parse --git-dir > /dev/null 2>&1; then
|
||||
|
||||
# Trim trailing space
|
||||
GIT_STATUS=$(echo "$GIT_STATUS" | sed 's/ $//')
|
||||
|
||||
# Guardar en cache (quoting seguro para re-source).
|
||||
printf 'GIT_BRANCH=%q\nGIT_STATUS=%q\n' "$GIT_BRANCH" "$GIT_STATUS" > "$GIT_CACHE" 2>/dev/null
|
||||
fi
|
||||
|
||||
# Color estable por sesión (hash del session_id → paleta ANSI 256 legible).
|
||||
|
||||
Reference in New Issue
Block a user