자동 Changelog 추가
Post-Tool고급Hook 타입: post-tool-use
자동 Changelog 추가는 git commit 명령 이후에 트리거되어 CHANGELOG.md를 자동으로 관리합니다. commit 메시지를 추출하고, Conventional Commits 접두사로 변경 유형(feat, fix, refactor, docs 등)을 분류하며, 현재 버전의 Unreleased 섹션에 포맷된 항목을 추가합니다. Keep a Changelog 규칙에 따라 유형별(Added, Fixed, Changed 등)로 항목을 그룹화합니다. CHANGELOG.md가 없으면 올바른 포맷으로 자동 생성합니다. 이를 통해 모든 commit이 문서화되면서도 수동으로 changelog를 관리하는 번거로움을 제거합니다.
changelog문서화gitConventional Commits자동화
Hook 코드
#!/bin/bash
# Auto Changelog Appender Hook
# Maintains CHANGELOG.md from commit messages
# Only trigger on Bash tool with git commit
if [[ "$TOOL_NAME" != "Bash" ]] || ! echo "$TOOL_INPUT" | grep -q "git commit"; then
exit 0
fi
# Verify commit actually happened
LAST_COMMIT=$(git log -1 --format="%H %s" 2>/dev/null)
if [ -z "$LAST_COMMIT" ]; then
exit 0
fi
COMMIT_MSG=$(echo "$LAST_COMMIT" | cut -d' ' -f2-)
COMMIT_HASH=$(echo "$LAST_COMMIT" | cut -d' ' -f1 | cut -c1-7)
TODAY=$(date +%Y-%m-%d)
CHANGELOG="CHANGELOG.md"
# Classify commit type
classify_commit() {
local msg="$1"
case "$msg" in
feat:*|feat(*) echo "Added" ;;
fix:*|fix(*) echo "Fixed" ;;
docs:*|docs(*) echo "Documentation" ;;
refactor:*|refactor(*) echo "Changed" ;;
perf:*|perf(*) echo "Performance" ;;
test:*|test(*) echo "Testing" ;;
chore:*|chore(*) echo "Maintenance" ;;
BREAKING*|!:*) echo "Breaking Changes" ;;
*) echo "Changed" ;;
esac
}
# Strip conventional commit prefix
clean_message() {
echo "$1" | sed -E 's/^(feat|fix|docs|refactor|perf|test|chore)(\([^)]*\))?!?:\s*//'
}
CATEGORY=$(classify_commit "$COMMIT_MSG")
CLEAN_MSG=$(clean_message "$COMMIT_MSG")
# Create CHANGELOG if it doesn't exist
if [ ! -f "$CHANGELOG" ]; then
cat > "$CHANGELOG" << 'TMPL'
# Changelog
All notable changes to this project will be documented in this file.
## [Unreleased]
TMPL
fi
# Check if Unreleased section exists
if ! grep -q "## \[Unreleased\]" "$CHANGELOG"; then
sed -i.bak '3a\n## [Unreleased]\n' "$CHANGELOG"
rm -f "$CHANGELOG.bak"
fi
# Check if category subsection exists under Unreleased
UNRELEASED_LINE=$(grep -n "## \[Unreleased\]" "$CHANGELOG" | head -1 | cut -d: -f1)
NEXT_VERSION_LINE=$(awk "NR>$UNRELEASED_LINE && /^## \[/{print NR; exit}" "$CHANGELOG")
NEXT_VERSION_LINE=${NEXT_VERSION_LINE:-$(wc -l < "$CHANGELOG")}
ENTRY="- $CLEAN_MSG (\`$COMMIT_HASH\`)"
# Insert entry under the appropriate category
if grep -q "### $CATEGORY" "$CHANGELOG"; then
CATEGORY_LINE=$(grep -n "### $CATEGORY" "$CHANGELOG" | head -1 | cut -d: -f1)
sed -i.bak "${CATEGORY_LINE}a\
$ENTRY" "$CHANGELOG"
else
sed -i.bak "/## \[Unreleased\]/a\
\\n### $CATEGORY\
$ENTRY" "$CHANGELOG"
fi
rm -f "$CHANGELOG.bak"
echo "Changelog updated: [$CATEGORY] $CLEAN_MSG"
exit 0
이 Hook을 Claude Code 설정 또는 .claude/settings.json에 추가하면 활성화됩니다.
실행 미리보기
자동 Changelog 추가
자동 Changelog 추가에 대해
Claude Code Hooks는 Claude 작업 중 특정 이벤트에 반응하여 커스텀 셸 명령을 자동으로 실행합니다. 자동 Changelog 추가은(는) 고급 수준의 Post-Tool Hook으로, 개발 워크플로우의 핵심 시점에서 작업을 자동화하여 수동 단계를 줄이고 팀 전체의 일관성을 유지합니다.