mirror of
https://github.com/anthropics/claude-plugins-official.git
synced 2026-03-16 22:23:07 +00:00
Claude Code writes each assistant content block (text/tool_use/thinking) as its own JSONL line. The hook's `grep role:assistant | tail -1` would grab whichever block happened to be last — often tool_use — then jq's text filter returned empty string, triggering the 'no text content' path which deletes the state file and exits without blocking. Net effect: the loop silently never fires. In one observed session, 62% of assistant lines were tool_use-only; the hook deleted state on the very first Stop event every time. Fix: slurp all assistant lines with jq -rs, flatten to text blocks only, take the last. Empty result is now non-fatal — no text means no <promise> tag, so the loop continues. Also absorbs jq parse errors (control chars in text) via || fallback instead of aborting under set -e.