AI 도서관 · Claude · 하네스 설정 · Hooks

작업 완료 후 테스트 자동 실행 Hook

응답을 마칠 때 테스트를 돌립니다. 실패하면 멈추지 않고 계속 고치게 만들 수 있습니다

내용

⚠️ 흔한 실수 두 가지
① 테스트 결과를 파이프(| tail)로 넘기면 종료코드가 tail 것이 됩니다.
   실패해도 성공으로 보입니다. 출력은 변수에 담고 종료코드를 따로 받으세요.
② Stop 이벤트에서 exit 2 는 '멈추지 말고 계속하라'는 뜻입니다.
   테스트가 실패했을 때 Claude가 이어서 고치게 하려면 이걸 씁니다.

# .claude/settings.local.json
{
  "hooks": {
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "bash -c 'cd \"$CLAUDE_PROJECT_DIR\" || exit 0; if [ -f package.json ]; then out=$(npm test --silent 2>&1); rc=$?; elif [ -f pytest.ini ] || [ -f pyproject.toml ]; then out=$(pytest -q 2>&1); rc=$?; else exit 0; fi; if [ $rc -ne 0 ]; then printf \"%s\\n\" \"$out\" | tail -30 >&2; exit 2; fi'"
          }
        ]
      }
    ]
  }
}

📌 핵심
• out=$(...) 로 출력을 담고 rc=$? 로 종료코드를 따로 받습니다
• 실패했을 때만 stderr로 요약을 보내고 exit 2
• 테스트가 없는 프로젝트면 exit 0 으로 조용히 넘어갑니다
• $CLAUDE_PROJECT_DIR 는 Claude Code가 넣어주는 환경변수입니다

🚧 주의 — 무한 반복 위험
exit 2 는 계속 작업하게 만듭니다. 테스트가 영영 통과하지 못하는 상태라면
같은 시도를 반복할 수 있습니다. 처음에는 exit 2 대신 exit 0 으로 두고
결과만 보다가, 동작을 확인한 뒤에 바꾸는 편이 안전합니다.

프로젝트 경로나 테스트 명령을 바꾸려면: {{INPUT}}

{{INPUT}} 자리에 내 내용을 넣어 쓰는 프롬프트입니다. 아래 버튼으로 열면 넣는 칸이 나옵니다.

근거

유형
설정 가이드 — 지정된 파일이나 설정에 적용합니다
사용 환경
Claude Code (터미널) 전용
주의
Stop 이벤트의 exit 2 는 '멈추지 말고 계속하라'는 뜻이라 반복 위험이 있습니다.
공식 출처
https://code.claude.com/docs/en/hooks
확인일
2026-09-08 — 이후 바뀌었을 수 있습니다
도서관에서 열기 — 내 내용 넣고 복사하기