Hooks
문제
훅을 등록해도 걸리는지 바로 알 수 없습니다. 다음 프롬프트를 쳐야 발동하므로, 스크립트가 죽어 있으면 그때 사고로 알게 됩니다.
추천
등록하기 전에 Claude Code를 거치지 않고 stdin으로 직접 입력을 넣어 동작을 확인합니다. 파일 있음·없음·무관 입력 세 분기를 전부 확인한 다음에 등록합니다.
예시
등록 한 줄
섹션 제목: “등록 한 줄”가드를 포함한 형태입니다. 스크립트가 없는 머신에서도 죽지 않습니다. 가드가 왜 필수인지는 Hooks에 있습니다.
{ "hooks": { "UserPromptSubmit": [ { "hooks": [ { "type": "command", "command": "f=\"$HOME/<repo>/hooks/hint.py\"; [ -f \"$f\" ] && python3 \"$f\" || true", "timeout": 10 } ] } ] }}반복 주입이 노이즈라면 session_id별 상태 파일로 세션당 1회로 억제합니다.
파이프 테스트 명령
섹션 제목: “파이프 테스트 명령”Claude Code를 거치지 않고 훅 스크립트에 직접 입력을 넣어 확인합니다. 등록 전에도, 등록 후 수정할 때도 이 명령으로 먼저 확인합니다.
echo '{"prompt":"npm run build 에러났어","session_id":"t1"}' \ | sh -c 'f="$HOME/<repo>/hooks/hint.py"; [ -f "$f" ] && python3 "$f" || true'세 분기를 다 확인합니다.
- 파일이 있고 프롬프트가 매칭되면
additionalContext가 나와야 합니다. - 파일이 있고 프롬프트가 무관하면 아무 출력도 없어야 합니다. 0토큰입니다.
- 파일이 없으면 조용히 통과해야 합니다. exit 0입니다.
등록한 뒤에는 /hooks를 한 번 열거나 세션을 재시작해야 설정 워처가 읽습니다.
실패에서만 발동하는 훅
섹션 제목: “실패에서만 발동하는 훅”도구 실패에만 훅을 걸고 싶으면 PostToolUseFailure를 씁니다. 성공한 작업이나 일반
프롬프트에는 실행되지 않습니다.
{ "hooks": { "PostToolUseFailure": [ { "hooks": [ { "type": "command", "command": "f=\"$HOME/<repo>/hooks/hint.py\"; [ -f \"$f\" ] && python3 \"$f\" || true", "timeout": 2 } ] } ] }}