🪕

Claude Code Sub Agent に Hooks (Stop) でレビュー依頼すると便利

に公開

仕組みは以下の応用です。
(これの応用でワークフローを作ったので、仕組みの詳説も入れて今後記事にします)
https://zenn.dev/kazuph/articles/483d6cf5f3798c

以下を Stop hook に設定するだけでいけるので、気軽です。
Sub Agent を使うことで Stop Hook 自体の無限ループを防ぎます。
レビュー後の REVIEW_COMPLETED を終了条件とすることで、フローのループを防ぎます。

#!/bin/bash

set -euo pipefail

INPUT=$(cat)

PRINCIPLES=$(
    cat <<'EOF'
## 原則
- SubAgent に Task として作業内容の厳正なレビューを行わせ,
  その結果をもとに、必要な修正を行え
- 自ら git diff やコミット確認を行なって把握せよ
- レビュー結果に問題がなければ、REVIEW_COMPLETED とだけ発言せよ
----
EOF
)

ESCAPED_PRINCIPLES=$(echo "$PRINCIPLES" | jq -Rs .)

TRANSCRIPT_PATH=$(echo "$INPUT" | jq -r '.transcript_path')
if [ -f "$TRANSCRIPT_PATH" ]; then
    LAST_MESSAGES=$(tail -n 100 "$TRANSCRIPT_PATH" | \
        jq -r 'select(.type == "assistant") | .message.content[]? | select(.type == "text") | .text' 2>/dev/null | tail -n 1)

    # REVIEW_COMPLETED が含まれているときはレビューせず終了
    if [ -n "$LAST_MESSAGES" ] && echo "$LAST_MESSAGES" | grep -q "REVIEW_COMPLETED"; then
        exit 0
    fi

    cat <<EOF
{
  "decision": "block",
  "reason": $ESCAPED_PRINCIPLES
}
EOF

else
    exit 0
fi

* 一応 hooks 設定

{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks":[
          {
            "type": "command",
            "command": "/path/to/hooks/self-review.sh"
          }
        ]
      }
    ]
  }
}

Discussion