공식 문서엔 '어떻게 쓰나'가 있어요. 이 키트는 그 다음 단계예요.
ZIP 받아서 .claude 폴더에 넣으면 됩니다. 언제·왜 쓰는지는 파일 안에 주석으로 달아뒀어요.
파일 하나하나가 독립적으로 작동해요. 전부 넣어도 되고, 필요한 것만 골라도 돼요.
/commit 슬래시로 호출. 컨벤셔널 커밋 메시지 자동 생성 · .env 커밋 차단./code-review 슬래시로 호출. 정확성·보안·유지보수성 3축 리뷰./refactor 슬래시로 호출. 범위 합의 → 테스트 고정 → 단계별 리팩터링.starter-kit/ ├── CLAUDE.md ← 프로젝트 컨텍스트 템플릿 ├── README.md └── .claude/ ├── settings.json ← 모델·권한·Hook 연결 ├── hooks/ │ ├── pre-commit.sh ← 위험 명령 차단 │ ├── format.sh ← 저장 시 자동 포맷 │ └── watch.sh ← 변경 감지 → 테스트 자동 실행 ├── rules/ │ └── testing.md ← 테스트 파일 전용 규칙 └── skills/ ├── commit/SKILL.md ← /commit 슬래시 커맨드 ├── code-review/SKILL.md ← /code-review 슬래시 커맨드 └── refactor/SKILL.md ← /refactor 슬래시 커맨드
설치 스크립트 없어요. 명령어 외울 필요 없어요. 폴더 복사가 전부예요.
.claude/ 폴더가 나와요.파일을 넣고 나서 "이 파일, 언제·왜 쓰는 거지?" 라는 질문이 생길 거예요.
9종 파일 하나하나를 깊이 풀었어요. 직접 겪은 함정 10가지까지.
파일 내부와 가이드 한 조각을 미리 볼 수 있어요.
#!/usr/bin/env bash
# PreToolUse(Bash) 훅 — Claude가 Bash를 실행하기 직전에 위험 패턴 차단
# exit 2 → 차단 exit 0 → 통과
#
# 커스터마이징: DANGER_LABELS 배열에 패턴·설명 추가
set -euo pipefail
input=$(cat)
# stdin JSON 에서 command 추출 (python3 → jq 폴백)
cmd=$(printf '%s' "$input" | python3 -c \
'import sys,json; print(json.load(sys.stdin).get("tool_input",{}).get("command",""))' \
2>/dev/null || true)
declare -A DANGER_LABELS=(
['rm[[:space:]]+-rf[[:space:]]+(/|~|\$HOME)']="루트·홈 디렉토리 강제 삭제"
['git[[:space:]]+push[[:space:]].*--force']="강제 푸시 (--force)"
['--no-verify']="훅 우회 (--no-verify)"
['DROP[[:space:]]+(TABLE|DATABASE)']="DB 스키마 삭제"
)
for pattern in "${!DANGER_LABELS[@]}"; do
if printf '%s\n' "$cmd" | grep -qE "$pattern"; then
echo "🛑 차단: ${DANGER_LABELS[$pattern]}" >&2
echo " 명령: $cmd" >&2
exit 2
fi
done
exit 0
자동화엔 3층이 있어요. 1층 CLAUDE.md — "이렇게 해줘" (항상 읽는 약속) 2층 Skill — "필요하면 써" (부탁 · 모델이 판단) 3층 Hook — "무조건 실행" (강제 · 코드가 판단) 핵심 질문 하나: "이건 가끔 깜빡해도 괜찮아?" → 예 → Skill (부탁) "이건 절대 빠지면 안 돼?" → 예 → Hook (강제) 위험 명령 차단·저장 시 포맷처럼 '사람의 의지'에 맡기면 안 되는 건 → Hook. → pre-commit.sh / format.sh가 바로 이 용도예요.
chmod +x 한 번만 실행하면 되고, 그 방법도 파일 주석에 적어뒀어요.