🪕
Claude Code Sub Agent に Hooks (Stop) でレビュー依頼すると便利
仕組みは以下の応用です。
(これの応用でワークフローを作ったので、仕組みの詳説も入れて今後記事にします)
以下を 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