استخدم PostToolUse Hooks لتشغيل lint تلقائيًا بعد كل كتابة. كود الخروج 2 يعيد الأخطاء إلى Claude للتصحيح التلقائي.
يكتب Claude Code بسرعة، لكنه لا يتذكر دائمًا تشغيل lint. تطلب منه "التحقق أثناء الكتابة"، وأحيانًا يفعل وأحيانًا يفوته. تحل Hooks هذه المشكلة — تنقل مسؤولية فحص الكود من Claude إلى النظام.
تركز هذه المقالة على شيء واحد: استخدام PostToolUse Hooks لتشغيل الفحص تلقائيًا بعد أن يكتب Claude الكود، لضمان أن كل تغيير في الملفات يلتزم بمعاييرك.
منطق Hook فحص الكود بسيط:
Write أو Edit لكتابة ملفكود الخروج 2 هو المفتاح — يجعل Claude يتلقى الخطأ ويصلحه تلقائيًا، مشكّلًا دورة "اكتب→افحص→صحح".
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash -c 'file=$(echo \"$CLAUDE_TOOL_INPUT\" | jq -r .file_path 2>/dev/null); [[ \"$file\" == *.rb ]] && rubocop -A \"$file\" --no-color -q || true'"
}
]
}
]
}
}
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash -c 'file=$(echo \"$CLAUDE_TOOL_INPUT\" | jq -r .file_path 2>/dev/null); [[ \"$file\" =~ \\.(js|ts|jsx|tsx)$ ]] && npx eslint --fix \"$file\" || true'"
}
]
}
]
}
}
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [
{
"type": "command",
"command": "bash -c 'file=$(echo \"$CLAUDE_TOOL_INPUT\" | jq -r .file_path 2>/dev/null); [[ \"$file\" == *.py ]] && ruff check --fix \"$file\" && ruff format \"$file\" || true'"
}
]
}
]
}
}
نقل منطق الفحص إلى سكريبت مستقل أسهل في الصيانة.
إنشاء .claude/hooks/lint.sh:
#!/bin/bash
set -e
input=$(cat)
file=$(echo "$input" | jq -r '.tool_input.file_path // empty')
[[ -z "$file" ]] && exit 0
[[ ! -f "$file" ]] && exit 0
ext="${file##*.}"
case "$ext" in
rb) rubocop -A "$file" --no-color -q ;;
js|ts|jsx|tsx) npx eslint --fix "$file" --quiet ;;
py) ruff check --fix "$file"; ruff format "$file" ;;
go) gofmt -w "$file"; golangci-lint run "$file" 2>&1 ;;
*) exit 0 ;;
esac
الإشارة إلى السكريبت في settings.json:
{
"hooks": {
"PostToolUse": [
{
"matcher": "Write|Edit",
"hooks": [{ "type": "command", "command": "bash .claude/hooks/lint.sh" }]
}
]
}
}
كود الخروج 2 + stderr هو مفتاح التصحيح التلقائي لـ Claude:
run_lint() {
local output exit_code
output=$(rubocop "$file" --no-color 2>&1)
exit_code=$?
if [[ $exit_code -ne 0 ]]; then
echo "$output" >&2
exit 2
fi
rubocop -A "$file" --no-color -q
}
skip_patterns=("vendor/" "node_modules/" "db/schema.rb" ".min.js" "_test.go")
for pattern in "${skip_patterns[@]}"; do
[[ "$file" == *"$pattern"* ]] && exit 0
done
بعد الإعداد، يصبح سير العمل:
Writerubocop -A — يجد 3 مشاكللا تحتاج لتشغيل أي أمر فحص يدويًا.
عام (~/.claude/settings.json): مناسب عند استخدام نفس القواعد في جميع المشاريع.
مستوى المشروع (.claude/settings.json في git): موصى به للفرق. كل من يفتح المستودع يحصل على الإعداد الصحيح تلقائيًا.
يمكن التعايش بينهما؛ hooks المشروع تندمج مع العامة وتعمل معًا.
الفحص التلقائي للكود باستخدام Hooks يتلخص في ثلاث خطوات:
PostToolUse + matcher "Write|Edit" لاعتراض كتابة الملفاتابدأ بلغة واحدة. بمجرد أن تعمل، أضف المزيد. احفظ السكريبتات في .claude/hooks/ وشاركها مع الفريق.