Claude Code 자동 리마인드 시스템
한국어 | English
Hooks는 Claude Code가 특정 순간에 자동으로 실행하는 셸 명령어입니다.
"트리거"라고 생각하면 됩니다 - 특정 이벤트가 발생하면 (세션 시작, 컨텍스트 압축 등) 설정한 명령어가 자동 실행됩니다.
┌─────────────────────────────────────┐
│ Claude Code 이벤트 │
│ (예: 세션 시작) │
└─────────────────┬───────────────────┘
▼
┌─────────────────────────────────────┐
│ Hook 실행 │
│ echo "[CodeSyncer] 규칙 기억..." │
└─────────────────┬───────────────────┘
▼
┌─────────────────────────────────────┐
│ AI가 메시지 확인 → 규칙 준수 │
└─────────────────────────────────────┘
CodeSyncer는 가장 효율적인 Hook 타이밍을 사용합니다.
| Hook | 실행 빈도 | 적합성 |
|---|---|---|
| SessionStart | 세션당 1회 | ✅ 최적 |
| PreCompact | 압축 시 1회 | ✅ 최적 |
| Stop | 매 응답마다 | ❌ 과도함 |
| PreToolUse | 매 도구마다 | ❌ 과도함 |
- SessionStart: 세션 시작 시 규칙 주입
- PreCompact: 컨텍스트 압축 후에도 규칙 유지
codesyncer init에서 hooks "Yes" 선택 시:
{
"hooks": {
"SessionStart": [{
"hooks": [{
"type": "command",
"command": "echo '[CodeSyncer] 규칙: 1) 추론→@codesyncer-inference 2) 결정→@codesyncer-decision 3) 결제/보안/API는 반드시 질문'"
}]
}],
"PreCompact": [{
"hooks": [{
"type": "command",
"command": "echo '[CodeSyncer] 압축 후 기억: @codesyncer-* 태그 필수, 결제/보안/API는 사용자에게 질문'"
}]
}]
}
}파일 위치: .claude/settings.json
Claude Code가 지원하는 Hook 이벤트:
| 이벤트 | 트리거 시점 | 예시 용도 |
|---|---|---|
| SessionStart | 새 세션 시작 | 프로젝트 규칙 주입 |
| PreCompact | 컨텍스트 압축 전 | 중요 규칙 보존 |
| PreToolUse | 도구 실행 전 | 특정 파일 수정 차단 |
| PostToolUse | 도구 완료 후 | 파일 자동 포맷팅 |
| Stop | AI 응답 완료 | 최종 체크리스트 |
| UserPromptSubmit | 프롬프트 제출 | 입력 검증 |
| PermissionRequest | 권한 대화창 | 자동 승인/거부 |
{
"hooks": {
"이벤트명": [
{
"matcher": "도구패턴", // PreToolUse, PostToolUse만
"hooks": [
{
"type": "command", // 또는 "prompt"
"command": "실행할-명령어",
"timeout": 60 // 초 (기본값: 60)
}
]
}
]
}
}1. Command - 셸 명령 실행
{"type": "command", "command": "echo 'hello'"}2. Prompt - LLM 평가 (Stop, SubagentStop만)
{"type": "prompt", "prompt": "모든 작업이 완료됐는지 확인"}| 코드 | 의미 |
|---|---|
| 0 | 성공 (계속 진행) |
| 2 | 차단 (도구 실행 중단) |
| 기타 | 경고 (메시지와 함께 진행) |
{
"hooks": {
"PreToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.file_path' | grep -q '\\.env' && echo '.env 파일 수정 불가' && exit 2 || exit 0"
}]
}]
}
}{
"hooks": {
"PostToolUse": [{
"matcher": "Edit|Write",
"hooks": [{
"type": "command",
"command": "file=$(jq -r '.tool_input.file_path'); [[ $file == *.ts ]] && npx prettier --write \"$file\""
}]
}]
}
}{
"hooks": {
"PreToolUse": [{
"matcher": "Bash",
"hooks": [{
"type": "command",
"command": "jq -r '.tool_input.command' >> ~/.claude/bash-log.txt"
}]
}]
}
}# 활성화 (init 중)
codesyncer init # Hooks에서 "Yes" 선택
# 비활성화
rm .claude/settings.json
# 커스터마이징
# .claude/settings.json 직접 편집
# 디버그
claude --debug # hook 실행 로그 확인
# 인터랙티브 설정
claude
/hooks| 위치 | 적용 범위 |
|---|---|
~/.claude/settings.json |
모든 프로젝트 (사용자 레벨) |
.claude/settings.json |
현재 프로젝트 (git 커밋) |
.claude/settings.local.json |
현재 프로젝트 (gitignore) |
Hook이 실행 안 됨?
- 파일 위치 확인
claude --debug로 로그 확인- JSON 문법 검증
Hook이 예상치 못하게 차단?
- exit code 확인 (2 = 차단)
- matcher 패턴 검토
- 터미널에서 명령어 직접 테스트