Use Claude to automatically generate a commit message

My Git commits will never have "WIP" message again. Loving this simple-but-effective use-case for Claude:

function commit() {
commitMessage="$*"

git add .

if [ "$commitMessage" = "" ]; then
# Start spinner in background (suppress job control messages)
{
spinner="⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏"
while true; do
for (( i=0; i<${#spinner}; i++ )); do
printf "\r${spinner:$i:1} Generating commit message..."
sleep 0.1
done
done
} &!
spinner_pid=$!

# Cleanup function for interrupt
cleanup() {
{ kill $spinner_pid; wait $spinner_pid; } 2>/dev/null
printf "\r\033[K"
trap - INT
return 1
}
trap cleanup INT

# Get diff with size limit, include stat summary for context
diff_input=$(echo "=== Summary ===" && git diff --cached --stat && echo -e "\n=== Diff (truncated if large) ===" && git diff --cached | head -c 50000)
commitMessage=$(echo "$diff_input" | claude --model haiku -p "Write a single-line commit message for this diff. Output ONLY the message, no quotes, no explanation, no markdown.")

# Stop spinner and clear line
trap - INT
{ kill $spinner_pid; wait $spinner_pid; } 2>/dev/null
printf "\r\033[K"

git commit -m "$commitMessage"
return
fi

eval "git commit -a -m '${commitMessage}'"
}

Your mileage may vary depending on which model you use - I seem to get good enough results with Haiku 4.5, but feel free to change to sonnet or opus depending on your needs.

All credit goes to Freek Van der Herten - check out his post for a full breakdown of how it works.