自動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で、開発ワークフローの重要なタイミングでタスクを自動化し、手動ステップを削減してチーム全体の一貫性を維持します。