#!/bin/bash # PostToolUse hook: marca el estado ACTIVO de la tarea segun la herramienta que # el asistente acaba de usar. Determinista, sin LLM, en tiempo real. Solo actua # si la terminal tiene un objetivo fijado. # # El estado de REPOSO (al parar: hecho/pendiente_revision/bloqueado/en_pausa) lo # pone el Stop hook (goal_phase_eval.sh + goal_phase_worker.sh). INPUT=$(cat) SID=$(printf '%s' "$INPUT" | jq -r '.session_id // empty' 2>/dev/null) [ -z "$SID" ] && exit 0 F="$HOME/.claude/goals/${SID}.json" [ -f "$F" ] || exit 0 GOAL=$(jq -r '.goal // ""' "$F" 2>/dev/null) [ -z "$GOAL" ] && exit 0 CUR=$(jq -r '.phase // ""' "$F" 2>/dev/null) TOOL=$(printf '%s' "$INPUT" | jq -r '.tool_name // empty' 2>/dev/null) [ -z "$TOOL" ] && exit 0 PHASE="" case "$TOOL" in Read|Grep|Glob|NotebookRead|WebFetch|WebSearch|ToolSearch) PHASE=investigando ;; Edit|Write|MultiEdit|NotebookEdit) # Editar tras haber testeado = retoques finales -> puliendo. Si no, es # implementacion normal -> haciendo. case "$CUR" in testeando|puliendo) PHASE=puliendo ;; *) PHASE=haciendo ;; esac ;; Task|Agent|Workflow) PHASE=haciendo ;; Bash) CMD=$(printf '%s' "$INPUT" | jq -r '.tool_input.command // ""' 2>/dev/null | tr '[:upper:]' '[:lower:]') case "$CMD" in *pytest*|*"go test"*|*ctest*|*jest*|*vitest*|*"npm test"*|*"npm run test"*|*"cargo test"*|*unittest*|*" test "*|*"./fn run"*test*) PHASE=testeando ;; ls|ls\ *|cat\ *|*grep*|find\ *|head\ *|tail\ *|stat\ *|tree*|rg\ *|fd\ *|*"git status"*|*"git log"*|*"git diff"*|*"git show"*|*"git branch"*) PHASE=investigando ;; *) PHASE=haciendo ;; esac ;; mcp__registry__fn_search|mcp__registry__fn_show|mcp__registry__fn_code|mcp__registry__fn_uses|mcp__registry__fn_list_domains|mcp__registry__fn_doctor|mcp__registry__fn_proposal) PHASE=investigando ;; mcp__registry__fn_run) PHASE=haciendo ;; TodoWrite|ExitPlanMode|EnterPlanMode|Plan) PHASE=planificando ;; *) # Herramientas que no representan un cambio de actividad (AskUserQuestion, # etc.): no tocar la fase. exit 0 ;; esac [ -z "$PHASE" ] && exit 0 # Escribir la fase + mantener historial (append solo si cambia respecto al # ultimo; se conservan los ultimos 12 estados). TMP="${F}.tmp.$$" if jq --arg p "$PHASE" ' .phase = $p | .history = ( ( .history // [] ) as $h | ( if ($h | length) > 0 and ($h[-1] == $p) then $h else ($h + [$p]) end ) | .[-12:] ) ' "$F" > "$TMP" 2>/dev/null; then mv "$TMP" "$F" else rm -f "$TMP" fi exit 0