المستوى الجاي · فصل ١٧

Hooks

PreToolUse · PostToolUse · Stop · matcher · exit 2
🎯 الهدف: تخلي حاجات معينة تحصل كل مرة أوتوماتيك، من غير ما تعتمد إن Claude يفتكر.

في CLAUDE.md كتبنا “شغّل prettier بعد ما تعدّل” و “متعدّلش ملفات الـ migration بإيدك”. Claude غالبًا هيلتزم، بس “غالبًا” مش كفاية لحاجات لازم تحصل كل مرة.

الـ hook أمر إنت كاتبه، و Claude Code بيشغّله بنفسه كل مرة يحصل event معين. ده مش طلب من الموديل، ده كود بيتنفذ.

أهم الـ events

  • PreToolUse: قبل ما Claude يستخدم أداة. تقدر هنا تمنع الأداة.
  • PostToolUse: بعد ما الأداة تخلص. مناسب للـ format أو الـ lint بعد كل تعديل.
  • UserPromptSubmit: لما تبعت رسالة، قبل ما Claude يشتغل عليها.
  • Stop: لما Claude يخلص رده.
  • SessionStart: أول ما الجلسة تبدأ.
  • Notification: لما Claude يكون مستني موافقتك.

فيه events تانية، والقايمة بتزيد. راجع الـ docs.

مثال ١: format بعد كل تعديل

الـ hooks بتتكتب في .claude/settings.json، جنب الـ permissions:

.claude/settings.json
{  "hooks": {    "PostToolUse": [      {        "matcher": "Edit|Write",        "hooks": [          { "type": "command", "command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/format.sh" }        ]      }    ]  }}

الـ matcher بيقول الـ hook ده لأنهي أدوات. هنا: بعد أي Edit أو Write. و Claude Code بيبعت للـ script تفاصيل اللي حصل كـ JSON على الـ stdin، ومنها مسار الملف:

.claude/hooks/format.sh
#!/usr/bin/env bash# بنقرا مسار الملف اللي اتعدّل من الـ JSONfile=$(jq -r '.tool_input.file_path // empty')[ -z "$file" ] && exit 0pnpm exec prettier --write "$file" >/dev/null 2>&1exit 0

متنساش chmod +x .claude/hooks/format.sh.

مثال ٢: امنع تعديل ملفات الـ migration

هنا بنستخدم PreToolUse، عشان نوقف التعديل قبل ما يحصل:

.claude/hooks/protect-migrations.sh
#!/usr/bin/env bashfile=$(jq -r '.tool_input.file_path // empty')if [[ "$file" == *"/drizzle/"* ]]; then  # الكلام اللي على stderr بيرجع لـ Claude فيفهم ليه اتمنع  echo "ممنوع تعدّل ملفات الـ migration بإيدك. عدّل الـ schema وشغّل pnpm db:generate" >&2  exit 2fiexit 0

وتسجّله في نفس الملف تحت "PreToolUse" بـ "matcher": "Edit|Write".

لاحظ الفرق: الـ deny rule بتمنع أداة على مسار. الـ hook يقدر يعمل منطق أعقد، ويقول لـ Claude يعمل إيه بدل كده.

أفكار تانية للمتجر

  • Stop: شغّل pnpm typecheck لما Claude يخلص، ولو فيه أخطاء خلّيه يكمّل يصلّحها.
  • Notification: إشعار على الديسكتوب لما Claude يستناك، عشان متقعدش تبص على الشاشة.
  • SessionStart: اطبع git status وآخر commits عشان Claude يبدأ عارف الوضع.
  • PreToolUse على Bash: امنع أوامر خطيرة زي rm -rf أو git push --force.

/hooks جوه Claude بيوريك الـ hooks المتسجلة.

خلّي بالك

خلّصت الفصل لما

🧠 اختبر نفسك
١) عايز format بعد كل تعديل ملف. أنهي event؟
PostToolUse بـ matcher على Edit و Write.
٢) الـ hook عايز يمنع التعديل ويقول لـ Claude السبب. يعمل إيه؟
يكتب السبب على الـ stderr ويخرج بـ exit 2.
٣) ليه الـ hook أقوى من سطر في CLAUDE.md؟
لأن Claude Code بيشغّله كل مرة كـ كود، مش طلب من الموديل ممكن ينساه.