트랙 B · 개발자

훅 — 코드로 강제하기

지침은 확률입니다. 반드시 지켜야 할 것은 코드로 막습니다.

  • 1지침과 통제의 차이를 안다
  • 2훅을 설정하고 차단한다
  • 3네 자리 중 어디에 담을지 고른다
읽는 시간 9분실습 20분선수 B-6
자세히 보기
도구 호출가로챈다PreToolUse검사내 스크립트exit 2 = 차단결정통과 · 차단100% 확정지침이 아니라 코드입니다 — 확률에 기대지 않습니다
개념확정 통제

확률이 아니라 코드로

LLM은 확률적입니다. CLAUDE.md에 "절대 하지 마라"라고 적어도 100% 보장되지 않습니다. 훅은 도구 호출을 코드로 검사하고 차단합니다.

비유자판기에 500원을 넣으면 100% 커피가 나옵니다. 훅은 확률에 의존하지 않는 통제입니다.
기준 하나"반드시"는 훅, "이렇게 하는 게 좋다"는 스킬·CLAUDE.md.
설정두 파일

언제 · 무엇을

먼저 .claude/settings.json언제 실행할지 등록합니다.

{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          { "type": "command", "command": ".claude/hooks/guard.sh" }
        ]
      }
    ]
  }
}

그리고 .claude/hooks/guard.sh가 실제로 검사합니다. 훅에는 표준입력으로 JSON이 들어옵니다.

#!/bin/bash
cmd=$(jq -r '.tool_input.command')

if echo "$cmd" | grep -qE 'git push .*(main|master)|rm -rf /'; then
  echo "차단: main 직접 push 금지. 브랜치를 만들어 작업하세요." >&2
  exit 2      # exit 2 = 도구 호출 차단 + 사유를 Claude에게 전달
fi
exit 0
핵심exit 2가 차단입니다. Claude는 stderr에 적힌 사유를 읽고 다른 방법을 찾습니다.
이벤트언제 걸 것인가

자주 쓰는 다섯 가지

이벤트시점쓰는 예
PreToolUse도구 실행 직전위험 명령 · 민감 파일 차단
PostToolUse도구 실행 직후자동 포맷 · 테스트
UserPromptSubmit내가 입력한 직후공통 지침 주입
SessionStart세션 시작 시브랜치 · 미커밋 현황 알려주기
Stop답변이 끝날 때완료 검사 — B-9/goal이 이 방식입니다

편집할 때마다 자동으로 포맷하려면 PostToolUse를 씁니다.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Edit|Write",
        "hooks": [
          { "type": "command", "command": ".claude/hooks/format.sh" }
        ]
      }
    ]
  }
}
확인이벤트 이름과 형식은 버전에 따라 달라질 수 있습니다. /hooks로 현재 등록 상태를 확인하세요.
정리네 가지

무엇을 어디에 담나

여기까지가 확장 3종입니다. 이제 규칙을 담을 자리가 넷이 됐습니다.

도구담는 것로드 시점강제력
CLAUDE.md항상 알아야 할 사실세션 시작 시 항상맥락 — 확률적
MCP외부 시스템 연결서버가 붙어 있는 동안도구 — 실제 동작
스킬절차적 작업호출될 때만맥락 — 확률적
반드시 지킬 통제도구 호출 시 자동코드 — 100% 확정
성능 주의훅은 해당 이벤트가 일어날 때마다 실행됩니다. 무분별하게 추가하면 느려집니다 — 꼭 필요한 곳에만.
더 보기플러그인까지 포함한 선택 기준은 B-11에서 정리합니다.
클로드코드 시작하기트랙 B · 개발자