심화 8단계 커스텀 명령어와 훅(Hook)
"부를 때 실행되는 단축 버튼"과 "그 순간이 오면 무조건 실행되는 규칙" 만들기
/pr-summary 같은 한 단어로 만들기 (요즘은 스킬로 통합)1 명령어 vs 훅 — "부탁"과 "규칙"
둘 다 "자동화"처럼 보이지만 성격이 완전히 다릅니다.
회사로 비유하면, 명령어는 "김 대리, 주간보고 양식대로 정리해 줘"라고 내가 부를 때만 움직이는 부탁입니다. 훅은 "퇴근 전에는 반드시 문단속" 같은 사내 규칙입니다. 누가 부르지 않아도, 그 순간이 오면 무조건 실행됩니다.
/이름 을 입력할 때 실행. 내용은 Claude에게 주는 지시문(프롬프트)이라 Claude가 판단해서 수행합니다.2 커스텀 명령어 만들기 — 이제는 스킬로
예전에는 .claude/commands/ 폴더에 md 파일을 두는 방식이었습니다. 지금은 명령어가 스킬로 통합되었습니다.
.claude/commands/deploy.md.claude/skills/deploy/SKILL.md/deploy 를 만듭니다. 참고 파일·스크립트를 함께 둘 수 있어 새로 만들 땐 스킬을 권장합니다.따라해 보기: /pr-summary 명령어 만들기
.claude/skills/pr-summary/ 폴더를 만듭니다. (모든 프로젝트에서 쓰려면 ~/.claude/skills/)---
name: pr-summary
description: 현재 브랜치의 변경 사항으로 PR 설명 초안을 만든다
argument-hint: [관련 이슈 번호]
disable-model-invocation: true
---
## 현재 변경 사항
!`git diff HEAD`
## 할 일
위 변경 사항을 보고 PR 설명을 한국어로 작성해 줘.
- 제목 한 줄
- 변경 요약 (3~5줄 불릿)
- 테스트 방법
- 관련 이슈: $ARGUMENTS
/pr-summary 142 라고 입력합니다.여기 쓰인 문법 정리
!`git diff HEAD`$ARGUMENTS/pr-summary 142 면 "142". 개별 인자는 $0 $1.disable-model-invocation: truedisable-model-invocation 으로 "내가 부를 때만"으로 묶어 둔다는 것뿐입니다.3 훅의 기본 개념 — 어떤 "순간"에 걸 수 있나
훅은 이벤트(순간) + 조건(matcher) + 실행할 명령 세 가지로 이루어집니다. 자주 쓰는 이벤트는 아래와 같습니다(이 밖에도 더 있습니다).
SessionStartUserPromptSubmitPreToolUsePermissionRequestPostToolUseNotificationStopPreCompactSessionEnd// 훅 설정의 기본 뼈대
{
"hooks": {
"PreToolUse": [ // ① 이벤트
{
"matcher": "Bash", // ② 어떤 도구일 때? (Bash, Edit|Write, * ...)
"hooks": [
{ "type": "command", // ③ 실행할 것
"command": "실행할 셸 명령",
"timeout": 600 }
]
}
]
}
}
위 뼈대의 // 뒷부분은 이해를 돕기 위한 설명입니다. JSON 파일에는 주석을 넣을 수 없으니 실제 설정에는 빼고 쓰세요.
"*" 또는 빈 값 = 전부, "Edit|Write" = 둘 중 하나, 그 밖엔 정규식. 대소문자를 구분합니다(bash 는 안 걸림).tool_name, tool_input(실행하려는 명령·파일 경로), cwd, session_id 등.4 설정 파일은 어디에? — 위치와 우선순위
훅은 별도 파일이 아니라 settings.json 안의 "hooks" 항목에 적습니다. 어느 파일에 적느냐에 따라 적용 범위가 달라집니다.
~/.claude/settings.json.claude/settings.json.claude/settings.local.json5 실습 ① 파일을 고치면 자동 포맷 PostToolUse
Claude가 파일을 수정(Edit)하거나 새로 쓸(Write) 때마다 포매터가 자동으로 돌게 합니다. 프론트엔드 프로젝트라면 prettier를 예로 들 수 있습니다.
.claude/settings.json 을 엽니다(없으면 만듭니다)."hooks" 부분만 합칩니다.{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}
전체 폴더를 포맷하는 npx prettier --write . 보다, 위처럼 stdin JSON에서 방금 고친 파일 경로만 꺼내(jq) 그 파일만 포맷하면 훨씬 빠릅니다. jq 가 없다면 먼저 설치하세요.
command 부분만 팀에서 쓰는 포매터로 바꾸면 됩니다. 예를 들어 빌드 도구에 포매터 플러그인이 설정되어 있다면 그 실행 명령을 넣거나, 포매터 CLI를 호출하는 작은 스크립트를 만들어 연결하세요. 빌드 전체를 돌리는 명령은 느리니 고친 파일만 처리하는 방식을 권합니다. 무엇을 넣을지 모르겠다면 Claude에게 "우리 프로젝트 빌드 설정을 보고 PostToolUse 포맷 훅 명령을 만들어줘"라고 물어보세요.6 ★ 실습 ② 위험한 명령 차단 PreToolUse
Claude가 셸 명령을 실행하기 직전에 검사해서, 위험한 명령이면 막습니다. Oracle 같은 DB를 다루는 분이라면 특히 추천합니다.
.claude/hooks/block.sh 파일을 만들고 아래 내용을 넣습니다.#!/bin/bash
INPUT=$(cat)
COMMAND=$(echo "$INPUT" | jq -r '.tool_input.command')
if echo "$COMMAND" | grep -q "drop table"; then
echo "Blocked: dropping tables is not allowed" >&2
exit 2
fi
exit 0
chmod +x .claude/hooks/block.sh
.claude/settings.json 에 추가합니다. $CLAUDE_PROJECT_DIR 은 프로젝트 루트 경로로 바뀌므로 어느 폴더에서 실행해도 스크립트를 찾습니다.{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block.sh"
}
]
}
]
}
}
테스트용이야. 셸에서 echo "drop table users" 를 실행해 봐.
막히면 어떤 메시지를 받았는지 알려줘.
종료 코드(exit code)의 의미
exit 0exit 2>&2)로 쓴 메시지를 Claude에게 "이유"로 전달합니다. Claude는 그걸 보고 다른 방법을 찾습니다.grep -qi(대소문자 무시)로 바꾸고 truncate, rm -rf 등 막을 단어를 늘리세요. 종료 코드 대신 JSON으로 permissionDecision 을 allow·deny·ask 중 하나로 돌려주는 방법도 있습니다(ask 는 나에게 확인을 받게 함).7 실습 ③ 작업이 끝나면 알림 받기 Notification · Stop
긴 작업을 맡기고 다른 창에서 일하다 보면, Claude가 승인을 기다리는지 모를 때가 많습니다. 알림 훅을 걸어 둡니다. 개인 취향이니 user 설정(~/.claude/settings.json)에 넣는 것을 추천합니다.
예시 (Linux) — notify-send 사용
{
"hooks": {
"Notification": [
{ "matcher": "",
"hooks": [ { "type": "command",
"command": "notify-send 'Claude Code' 'Claude가 확인을 기다리고 있어요'" } ] }
],
"Stop": [
{ "hooks": [ { "type": "command",
"command": "notify-send 'Claude Code' '작업이 끝났어요'" } ] }
]
}
}
# 예시 (macOS) — command 부분만 바꿔 넣기
osascript -e 'display notification "작업이 끝났어요" with title "Claude Code"'
8 확인하기와 주의사항
/hooks"disableAllHooks": true꼭 기억할 3가지
Stop 훅이 매번 "아직 끝내지 마"라고 막으면 Claude가 멈추지 못하고 계속 돕니다. 훅이 또 다른 훅을 부르는 구조도 피하세요. 이상하면 disableAllHooks 로 바로 끄기.9 정리 & 체크리스트
명령어는 "부를 때", 훅은 "그 순간 무조건". 아래를 모두 해봤다면 8단계 완료입니다.
.claude/skills/pr-summary/SKILL.md 를 만들어 /pr-summary 를 실행해 봤다exit 2 의 의미를 이해했다/hooks 로 적용 상태를 보고, 문제 시 disableAllHooks 로 끄는 법을 안다skills/ 와 hooks/hooks.json 에 넣어 팀에 그대로 배포할 수 있습니다. 다음 단계에서는 플러그인의 마지막 부품, 서브에이전트를 만듭니다.'AI Claude > Part 2. 심화과정' 카테고리의 다른 글
| Claude 심화 10단계 자동화 — 내가 없어도 일하는 Claude (0) | 2026.09.24 |
|---|---|
| Claude 심화 9단계 서브에이전트 — AI 팀 꾸리기 (0) | 2026.09.24 |
| Claude 심화 7단계 플러그인과 마켓플레이스 (0) | 2026.09.24 |
| Claude 심화 6단계 ★ 나만의 스킬 만들기 (0) | 2026.09.24 |
| Claude 심화 5단계 스킬(Skill) 이해하기 (0) | 2026.09.24 |