عندما تتوقف إشعارات Claude Code عن العمل، يعود السبب غالبًا إلى واحد من أربعة: الـ hook غير محمَّل، أو يعمل لكنه يفشل، أو الحدث الذي تعتمد عليه لا يقع في الوقت الذي تتوقعه، أو نظام التشغيل يُخفي التنبيه. نفّذ /hooks داخل Claude Code لترى ما هو محمَّل، وابدأ جلسة باستخدام claude --debug لترى ما فعله كل hook فعليًا، ثم راجع إعدادات الإشعارات على الحاسوب أو الهاتف. إن كنت تستخدم Claude Code Notifier، فإن الأمرين ccn doctor وccn test يغطيان معظم ذلك.
تبدأ قائمة التحقق أدناه بالسبب الأكثر شيوعًا وتنتهي بالأقل شيوعًا، وهي تصلح لأنظمة Mac وWindows وLinux.
011. تأكد من أن Claude Code حمّل الـ hook
اكتب /hooks في prompt الخاص بـ Claude Code. ستظهر لك قائمة للقراءة فقط بكل الـ hooks التي حمّلها Claude Code، مع مصدر كل منها: إعدادات المستخدم، أو إعدادات المشروع، أو الإعدادات المحلية، أو إضافة (plugin)، أو الجلسة الحالية. اختر أي hook لترى الأمر الدقيق والملف المعرَّف فيه.
إن لم يظهر الـ hook في القائمة:
- ملف JSON غير صالح. ملفات الإعدادات تتبع صيغة JSON الصارمة؛ فاصلة زائدة في النهاية أو تعليق
//كفيلان بإفساد الملف، وسيعرض Claude Code خطأ Settings Error عند التشغيل التالي. نفّذclaude doctorلترى الإدخالات التي رفضها Claude Code. - الملف في مكان خاطئ. توضع الـ hooks الشخصية في
~/.claude/settings.json(وعلى Windows في%USERPROFILE%\.claude\settings.json)، أما hooks المشروع ففي.claude/settings.jsonداخل المشروع. نفّذ/statusواقرأ سطرSetting sourcesلترى الملفات التي حُمِّلت. - اسم الحدث خاطئ. أسماء الأحداث حساسة لحالة الأحرف:
NotificationوStopوPermissionRequest. أي اسم حدث غير معروف يظهر كتحذير Settings Warning ويُتجاهَل. - الـ hooks معطَّلة. وجود
"disableAllHooks": trueفي أي ملف إعدادات يعطّل كل الـ hooks. وإن ظهرت في/hooksالرسالةOnly hooks from managed settings run here، فهذا يعني أن مؤسستك فعّلتallowManagedHooksOnlyولن تعمل الـ hooks الخاصة بك. - لم يُلتقَط التعديل. يعيد Claude Code عادةً تحميل الإعدادات تلقائيًا. إن لم يظهر الـ hook بعد بضع ثوانٍ، فأعد تشغيل الجلسة.
022. وافق على الثقة بمساحة العمل
في الجلسة التفاعلية، يحجب Claude Code الـ hooks من جميع ملفات الإعدادات، بما فيها ملفك ~/.claude/settings.json، إلى أن توافق على نافذة الثقة بمساحة العمل لذلك المجلد. فإن أغلقت تلك النافذة دون موافقة، أو كنت في مجلد لم تفتح فيه Claude Code من قبل، فلن تعمل الـ hooks هناك. شغّل claude في ذلك المجلد ووافق على النافذة.
033. تأكد من أن الحدث يقع في الوقت الذي تظنه
كثير من الإشعارات "المعطّلة" مسألة توقيت في الحقيقة. وفقًا لمرجع الـ hooks من Anthropic:
Notification مع permission_promptانتظر طلب الإذن نحو ست ثوانٍ دون أن تكتب شيئًا. كل ضغطة مفتاح تعيد ضبط المؤقت.Notification مع idle_promptبعد نحو 60 ثانية من انتهاء Claude، إن لم تكتب شيئًا ولم يكن هناك وكيل يعمل في الخلفية.Stopفي كل مرة ينتهي فيها Claude من الرد، لكن ليس عند المقاطعة. أما أخطاء API فتُطلق StopFailure بدلًا منه.PermissionRequestلحظة أن يوشك Claude Code على طلب إذنك.لذا إن اختبرت hook من نوع Notification وأنت تكتب في الـ terminal، فقد لا يُطلق أبدًا. انتقل إلى نافذة أخرى وانتظر. وإن أردت تنبيهًا فور انتهاء الدور، فاستخدم Stop؛ ويشرحه دليل Stop hook.
تحقق أيضًا من وضع الأذونات. تبدأ الإصدارات الحديثة من Claude Code الجلسات التفاعلية في الوضع التلقائي، حيث يوافق مصنِّف على معظم الإجراءات دون سؤالك. وغياب طلب الإذن يعني غياب إشعار permission_prompt وعدم تنفيذ hook PermissionRequest. لاختبار تنبيهات الأذونات، اضغط Shift+Tab حتى يعرض شريط الحالة الوضع اليدوي، ثم اطلب من Claude تنفيذ شيء يحتاج إلى موافقة. تجد التفاصيل في شرح أوضاع الأذونات.
الـ matchers حساسة لحالة الأحرف كذلك؛ فالـ matcher bash في PermissionRequest لن يطابق الأداة Bash.
044. نفّذ أمر الـ hook بنفسك
انسخ الأمر من /hooks ونفّذه في terminal مع مدخلات تجريبية:
echo '{"hook_event_name":"Stop","cwd":"/tmp","last_assistant_message":"done"}' | ./my-hook.sh
echo $?
أخطاء شائعة:
command not found: استخدم مسارًا مطلقًا للسكربت، أو${CLAUDE_PROJECT_DIR}للسكربتات الموجودة في المشروع.- السكربت لا يفعل شيئًا إطلاقًا: اجعله قابلًا للتنفيذ باستخدام
chmod +x ./my-hook.sh. jq: command not found: ثبّتjq، أو حلّل JSON باستخدام Python أو Node.js.
055. اقرأ سجل التصحيح
شغّل Claude Code باستخدام claude --debug. لن يظهر شيء إضافي في الـ terminal؛ إذ يُكتب السجل في ~/.claude/debug/<session-id>.txt. ولتحديد المسار بنفسك، استخدم claude --debug-file /tmp/claude.log ونفّذ tail -f /tmp/claude.log في terminal آخر. وإن كانت الجلسة قيد التشغيل بالفعل، فإن /debug يفعّل التسجيل ويخبرك بمكان السجل.
ابحث عن الأسطر التي تبدأ بـ Hooks:. يذكر كل منها الحدث والأمر وكيف انتهى (finished with status 0 أو timed out أو failed to start) والمدة التي استغرقها. ولمزيد من التفاصيل حول المطابقة، اضبط CLAUDE_CODE_DEBUG_LOG_LEVEL=verbose.
هناك مشكلتان لا تظهران إلا هنا:
- ملف تعريف الـ shell يطبع شيئًا. إن كان
~/.bashrcأو~/.zshrcينفّذechoويحمّله الـ shell، فسيظهر ذلك النص قبل مخرجات JSON الخاصة بالـ hook، فيعاملها Claude Code كنص عادي. ابحث في السجل عنHook output does not start with {. وغلِّف مخرجات ملف التعريف بـif [[ $- == *i* ]]; then ... fiكي لا تُنفَّذ إلا في الـ shells التفاعلية. - لا يوجد terminal للكتابة إليه. على Mac وLinux، تعمل hooks الأوامر دون terminal متحكِّم، لذا يفشل بصمت أي hook يحاول قرع الجرس أو كتابة رموز escape إلى
/dev/tty. استخدم بدلًا من ذلك أمر إشعارات سطح المكتب، أو الإعدادpreferredNotifChannelالمدمج في Claude Code، والمشروح في دليل جرس الـ terminal.
066. تحقق من نظام التشغيل
إذا أظهر سجل التصحيح أن الـ hook انتهى بالحالة 0 ولم يظهر لك شيء، فهذا يعني أن نظام التشغيل أخفى الإشعار. تأكد من أن التطبيق الذي يرسل التنبيه مسموح له بعرض الإشعارات، وأن وضع التركيز Focus (على Mac) أو عدم الإزعاج (Windows) أو مفتاح عدم الإزعاج في سطح مكتب Linux متوقف. وعلى Linux، يجب أن تكون خدمة إشعارات (notification daemon) قيد التشغيل.
07إذا كنت تستخدم Claude Code Notifier
Claude Code Notifier أداة مستقلة (ليست من إنتاج Anthropic) تثبّت برنامجًا صغيرًا هو ccn على هيئة hooks في Claude Code. كل ما سبق ينطبق عليها أيضًا، لأن ccn مجرد hook كغيره. ابدأ بفحوصاته الخاصة:
ccn doctorيفحص الـ hooks وبيانات الاعتماد والاتصال بالخادم واكتشاف وجودك. أصلح أي مشكلة يبلّغ عنها أولًا.ccn testيرسل إشعارًا تجريبيًا. إذا وصل، فالمشكلة في الحدث أو في أحد الإعدادات، لا في مسار الإرسال.ccn devicesيعرض الهواتف المقترنة بهذا الكمبيوتر. إذا لم يظهر أي هاتف، فأعد الاقتران باستخدامccn pair؛ ويشرح دليل الاقتران الخطوات.ccn config showيعرض الإعدادات الفعلية. تأكد من تفعيلnotify_on_doneوnotify_on_permissionوnotify_on_question، ومن أنquiet_hoursلا تشمل الوقت الحالي. وتصل الإعدادات التي تغيّرها على الهاتف إلى الكمبيوتر عبرccn sync.
بعض السلوكيات تبدو أعطالًا لكنها مقصودة:
- أنت أمام لوحة المفاتيح. إذا كتبت شيئًا خلال آخر 30 ثانية، فلا يُنتظر رد من الهاتف ويسألك الـ terminal كالمعتاد. ومع تفعيل
quiet_when_present(الوضع الافتراضي)، لا يتلقى الهاتف شيئًا ما دمت في الـ terminal الذي يعمل فيه Claude، ويتلقى بطاقة معلومات إذا كنت نشطًا في تطبيق آخر. - تنبيهات مكررة أو مفقودة على Mac. لا تشغّل تطبيق شريط القوائم القديم لـ Mac مع
ccnعلى الجهاز نفسه. - انقطاع طويل. إذا لم يُستخدم هاتف أو كمبيوتر لمدة 60 يومًا، يحذف الخادم اقترانه، فتحتاج إلى الاقتران من جديد.
على الهاتف نفسه، تأكد من السماح بإشعارات التطبيق، ومن أن وضع التركيز Focus (iPhone) أو عدم الإزعاج (Android) لا يكتمها. على Android، قد يؤخر تحسين البطارية إشعارات بعض التطبيقات؛ فإذا وصلت التنبيهات متأخرة، اسمح للتطبيق بالعمل دون قيود من إعدادات البطارية. وإذا عدّلت settings.json يدويًا، فسيخبرك ccn doctor هل لا تزال الـ hooks الخاصة به موجودة. ويحدّث ccn upgrade الأداة إلى أحدث إصدار.
08الأسئلة الشائعة
لماذا لا يعمل Notification hook إلا أحيانًا؟
النوعان permission_prompt وidle_prompt مضبوطان على توقيت يبدو فيه أنك غائب. ينتظر permission_prompt نحو ست ثوانٍ دون كتابة، وينتظر idle_prompt نحو 60 ثانية بعد أن ينتهي Claude. وإذا كنت تكتب، يتأجلان. استخدم PermissionRequest أو Stop للحصول على إشارة فورية.
أين أجد سجل التصحيح في Claude Code؟
شغّل claude --debug وسيُكتب السجل في ~/.claude/debug/<session-id>.txt. استخدم claude --debug-file <path> لاختيار المكان، أو /debug داخل جلسة قيد التشغيل.
الأمر ccn test يعمل لكن الإشعارات الفعلية لا تصل. لماذا؟
مسار الإرسال سليم، فابحث في الإعدادات والتوقيت. راجع notify_on_* وquiet_hours في ccn config show، وتذكّر أنه لا يُرسل شيء ما دمت في الـ terminal مع تفعيل quiet_when_present، وتحقق من وضع الأذونات في Claude Code.