Published on

Claude Code ํ›…(Hooks) ๊ณ ๋„ํ™” โ€” ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •ยท๋…ธ๋ ฅ ๊ฐ์ง€ยทCI ์ž๋™ ๋ฆฌ๋ทฐ๊นŒ์ง€

ํ›…(Hook)์€ Claude Code์—์„œ ๊ฐ€์žฅ ์กฐ์šฉํ•˜๊ฒŒ, ํ•˜์ง€๋งŒ ๊ฐ€์žฅ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

ํ›…์€ Claude Code๊ฐ€ ์–ด๋–ค ๋„๊ตฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „/ํ›„์— ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ์‰˜ ๋ช…๋ น์–ด๋ฅผ ์ž๋™์œผ๋กœ ์‹คํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ €์žฅํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ๋ฆฐํ„ฐ๋ฅผ ๋Œ๋ฆฌ๊ฑฐ๋‚˜, ํŒŒ์ผ์„ ์ˆ˜์ •ํ•  ๋•Œ ๋กœ๊ทธ๋ฅผ ๊ธฐ๋กํ•˜๊ฑฐ๋‚˜, ํŠน์ • ์กฐ๊ฑด์—์„œ ์•Œ๋ฆผ์„ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ๋ชจ๋‘ ํ›…์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

2026๋…„ 5์›” Claude Code๊ฐ€ ์—…๋ฐ์ดํŠธํ•˜๋ฉด์„œ ์ด ํ›… ์‹œ์Šคํ…œ์— ์„ธ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋๋‹ค.


ํ›…์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€ โ€” 30์ดˆ ์ดํ•ด

ํ›… ํƒ€์ž…์‹คํ–‰ ์‹œ์ 
PreToolUse๋„๊ตฌ ์‹คํ–‰ ์ง์ „
PostToolUse๋„๊ตฌ ์‹คํ–‰ ์งํ›„ (์„ฑ๊ณต ์‹œ)
PostToolUseFailure๋„๊ตฌ ์‹คํ–‰ ์งํ›„ (์‹คํŒจ ์‹œ)
StopClaude๊ฐ€ ์‘๋‹ต์„ ๋งˆ์นœ ๋’ค

PostToolUse ์ถœ๋ ฅ ๊ต์ฒด โ€” ์–ด๋–ค ๋„๊ตฌ๋“  ๊ฐ€๋กœ์ฑŒ ์ˆ˜ ์žˆ๋‹ค

์ด์ „์—๋Š” MCP ๋„๊ตฌ์— ํ•œํ•ด์„œ๋งŒ hookSpecificOutput.updatedToolOutput์„ ํ†ตํ•ด ๋„๊ตฌ์˜ ์ถœ๋ ฅ ๊ฒฐ๊ณผ๋ฅผ ํ›…์ด ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋ฒˆ ์—…๋ฐ์ดํŠธ๋กœ ๋ชจ๋“  ๋„๊ตฌ์—์„œ ๊ฐ€๋Šฅํ•ด์กŒ๋‹ค.

{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Bash",
        "hooks": [
          {
            "type": "command",
            "command": "python3 sanitize_output.py",
            "hookSpecificOutput": {
              "updatedToolOutput": true
            }
          }
        ]
      }
    ]
  }
}

๋ฏผ๊ฐํ•œ ์ •๋ณด(API ํ‚ค, ๋น„๋ฐ€๋ฒˆํ˜ธ)๋ฅผ ์ž๋™์œผ๋กœ ๋งˆ์Šคํ‚นํ•˜๊ฑฐ๋‚˜, ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ์‚ฌ๋žŒ์ด ์ฝ๊ธฐ ์ข‹์€ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์“ธ ์ˆ˜ ์žˆ๋‹ค.


effort.level โ€” ๋…ธ๋ ฅ ๋ ˆ๋ฒจ์„ ํ›…์ด ์ฝ๋Š”๋‹ค

ํ›… ๋‚ด๋ถ€์—์„œ ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ํ˜„์žฌ ๋…ธ๋ ฅ ๋ ˆ๋ฒจ์„ ์ฝ์„ ์ˆ˜ ์žˆ๋‹ค.

  • ํ›… ์ž…๋ ฅ JSON: effort.level ํ•„๋“œ
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜: $CLAUDE_EFFORT
#!/bin/bash
if [ "$CLAUDE_EFFORT" = "high" ] || [ "$CLAUDE_EFFORT" = "xhigh" ]; then
  npm run test:full
else
  npm run test:smoke
fi

duration_ms โ€” ๋„๊ตฌ ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •

PostToolUse์™€ PostToolUseFailure ํ›… ์ž…๋ ฅ์— duration_ms ํ•„๋“œ๊ฐ€ ์ถ”๊ฐ€๋๋‹ค. ์ˆœ์ˆ˜ํ•œ ๋„๊ตฌ ์‹คํ–‰ ์‹œ๊ฐ„(๋ฐ€๋ฆฌ์ดˆ)๋งŒ ์ธก์ •๋œ๋‹ค.

#!/bin/bash
DURATION=$1
if [ "$DURATION" -gt 5000 ]; then
  echo "[SLOW] $(date): ${DURATION}ms - $TOOL_NAME" >> slow-tools.log
fi

claude ultrareview โ€” CI์—์„œ ์ฝ”๋“œ ๋ฆฌ๋ทฐ ์ž๋™ํ™”

๊ธฐ์กด์˜ /ultrareview๋Š” ๋Œ€ํ™”์‹์œผ๋กœ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด์ œ๋Š” ๋น„๋Œ€ํ™”ํ˜• ๋ฐฉ์‹์œผ๋กœ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

claude ultrareview src/
claude ultrareview src/ --json
claude ultrareview --diff origin/main...HEAD

์ข…๋ฃŒ ์ฝ”๋“œ: 0 (์™„๋ฃŒ) / 1 (์‹คํŒจ)


auto mode ํ•˜๋“œ ๊ฑฐ๋ถ€ ๊ทœ์น™

ํ•˜๋“œ ๊ฑฐ๋ถ€ ๊ทœ์น™์œผ๋กœ ์ง€์ •ํ•œ ๋™์ž‘์€ allow ์˜ˆ์™ธ์™€ ๊ด€๊ณ„์—†์ด ๋ฌด์กฐ๊ฑด ์ฐจ๋‹จ๋œ๋‹ค.


ํ™œ์šฉ ํŒ

1. duration_ms๋กœ ๋А๋ฆฐ ์ž‘์—…๋ถ€ํ„ฐ ํŒŒ์•…ํ•˜๋ผ 2. effort.level์„ ํ™œ์šฉํ•ด ๋ฆฌ์†Œ์Šค๋ฅผ ์•„๊ปด๋ผ 3. PostToolUse ์ถœ๋ ฅ ๊ต์ฒด๋Š” ๋ณด์•ˆ ๋ ˆ์ด์–ด๋กœ ์“ฐ๋ผ 4. claude ultrareview๋ฅผ PR ์ฒดํฌ๋ฆฌ์ŠคํŠธ ์ฒซ ๋ฒˆ์งธ๋กœ


์ถœ์ฒ˜ (Sources)

Claude Code ํ›…(Hooks) ๊ณ ๋„ํ™” โ€” ์‹คํ–‰ ์‹œ๊ฐ„ ์ธก์ •ยท๋…ธ๋ ฅ ๊ฐ์ง€ยทCI ์ž๋™ ๋ฆฌ๋ทฐ๊นŒ์ง€ | MINSSAM.COM