antrophiclove
← Kütüphaneye dön
0

Commit'ten önce testleri çalıştıran hook

git commit çağrısını yakalayıp testleri çalıştırır; testler düşerse commit'i engeller. Claude'un 'testleri sonra çalıştırırım' deme ihtimalini ortadan kaldırır.

yazan kuscubasiece·8 Eylül 2026

Kaynak: Claude Code dokümantasyonu

Kurulum
curl -sL https://www.antrophiclove.com/api/kaynak/commit-ten-once-testleri-calistiran-hook/raw

Bu içerik mevcut dosyaya elle harmanlanmalı: .claude/settings.json

.claude/settings.json

{ "hooks": { "PreToolUse": [ { "matcher": "Bash", "hooks": [ { "type": "command", "if": "Bash(git commit *)", "command": "${CLAUDE_PROJECT_DIR}/.claude/hooks/pre-commit-test.sh", "timeout": 300, "statusMessage": "Testler çalışıyor..." } ] } ] } }

.claude/hooks/pre-commit-test.sh (chmod +x)

#!/bin/bash cd "$CLAUDE_PROJECT_DIR" || exit 0

Yalnızca değişen alanların testini çalıştırmak istersen:

CHANGED=$(git diff --cached --name-only | grep -E '^src/' | head -20)

OUT=$(npm test --silent 2>&1) if [ $? -ne 0 ]; then echo "Testler düştü, commit engellendi:" >&2 echo "$OUT" | tail -40 >&2 exit 2 fi

exit 0

Neden hook, neden CLAUDE.md değil

CLAUDE.md bir talimattır; Claude uyabilir de uymayabilir de. Hook, Claude ne karar verirse versin çalışır. "Her seferinde şu olsun" diyorsan doğru yer hook'tur.

if alanı

"if": "Bash(git commit *)" ile hook yalnızca commit çağrılarında çalışır; matcher "Bash" olsa bile diğer komutlarda testi boşuna çalıştırmaz.