#!/bin/bash # Stop hook: 文脈が閾値を超えて引き継ぎメモが書かれたら、herdr 経由で自動の /clear → 再開を仕掛ける # 閾値を超えた最初の Stop ではまだメモがないので何もしない。stop-bye-trigger.sh の指示でメモが # 書かれ、もう一度ターンを終えようとしたときに worker を起動する。 # 止めるとき: メモの .md を .noauto に替えた名前のファイルを置く(次の /clear か compact まで)、 # または CLAUDE_AUTO_RESUME=0(戻すまでずっと)。 THRESHOLD_TOKENS=${CLAUDE_CHECKPOINT_TOKENS:-200000} WORKER=${AUTO_RESUME_WORKER:-"$(dirname "$0")/auto-resume-worker.sh"} input=$(cat) [ "${CLAUDE_AUTO_RESUME:-1}" = 0 ] && exit 0 [ "${HERDR_ENV:-}" = 1 ] && [ -n "${HERDR_PANE_ID:-}" ] || exit 0 session_id=$(echo "$input" | jq -r '.session_id // empty' 2>/dev/null) [ -z "$session_id" ] && exit 0 cwd=$(echo "$input" | jq -r '.cwd // empty' 2>/dev/null) # Bash で cd すると cwd は起動ディレクトリからずれる。/clear 後の SessionStart は起動ディレクトリで探すので、そちらに揃える key=${CLAUDE_PROJECT_DIR:-$cwd} handoff="$HOME/.claude/handoff/${key//\//-}.md" tokens=$(cat "/tmp/claude-context-tokens-${session_id}" 2>/dev/null) [ -z "$tokens" ] && exit 0 [ "$tokens" -lt "$THRESHOLD_TOKENS" ] && exit 0 [ -f "$handoff" ] || exit 0 # 区切りが悪い時はモデルがメモの横に .noauto を置いて止める [ -f "${handoff%.md}.noauto" ] && exit 0 # セッションごとに 1 回だけ(/clear 後は session_id が変わる) mkdir "/tmp/claude-auto-resume-${session_id}" 2>/dev/null || exit 0 # worker は agent が待機状態になるのを待つので、hook からは切り離して起動する(テストでは同期実行) if [ "${AUTO_RESUME_FOREGROUND:-0}" = 1 ]; then "$WORKER" "$HERDR_PANE_ID" "$handoff" else nohup "$WORKER" "$HERDR_PANE_ID" "$handoff" /dev/null 2>&1 & fi exit 0