داخل tmux، لا تصل إشعارات سطح المكتب من Claude Code إلى الـ terminal الخارجي أبدًا حتى تضيف set -g allow-passthrough on إلى ~/.tmux.conf. هذا يحل المشكلة ما دمت متصلًا بالجلسة. أما بعد الانفصال، فلا يوجد terminal يعرض الجلسة، فلا شيء على الشاشة يمكنه تنبيهك، لكن Claude Code يستمر في العمل والـ hooks تستمر في التنفيذ. لتصلك أخبار جلسة منفصلة، استخدم hook يرسل push عبر الشبكة إلى هاتفك أو تطبيق دردشة، بدلًا من hook يعتمد على terminal.
01أثناء الاتصال: اسمح للإشعارات بالمرور عبر tmux
يقع tmux بين Claude Code والـ terminal، ويبتلع افتراضيًا الـ escape sequences التي يستخدمها Claude Code لإشعارات سطح المكتب. يقدّم دليل الـ terminal من Anthropic هذا المقطع لملف ~/.tmux.conf:
set -g allow-passthrough on
set -g focus-events on
set -s extended-keys on
set -as terminal-features 'xterm*:extkeys'
طبّقه على الخادم قيد التشغيل:
tmux source-file ~/.tmux.conf
يتيح allow-passthrough للإشعارات وتحديثات التقدم الوصول إلى الـ terminal الخارجي. أما الأسطر الأخرى فتصلح Shift+Enter لإدراج أسطر جديدة. بعد ذلك، ستعرض الـ terminals التي تُظهر إشعارات Claude Code خارج tmux (Ghostty وKitty وiTerm2 مع تفعيل التنبيهات) هذه الإشعارات داخل tmux أيضًا.
ينطبق الأمر نفسه على الـ hooks التي تُرجع terminalSequence. يذكر مرجع الـ hooks من Anthropic أن Claude Code يكتب هذه السلاسل بنفسه، وهذا يعمل داخل tmux وGNU screen. تحتوي أدلة macOS وLinux وSSH على أمثلة.
02متصل، لكن في نافذة أخرى: استخدم الجرس
إذا كان Claude Code يعمل في نافذة tmux وأنت تعمل في أخرى، فالجرس إشارة بسيطة. اطلب من Claude Code أن يرسله دائمًا:
{
"preferredNotifChannel": "terminal_bell"
}
ثم اجعل tmux يتفاعل معه، في ~/.tmux.conf:
setw -g monitor-bell on
set -g bell-action other
set -g visual-bell off
يميّز monitor-bell (مفعّل افتراضيًا) النافذة التي رنّ جرسها، ويضع tmux عليها العلامة ! في شريط الحالة. ويمرّر bell-action other الأجراس الصادرة من النوافذ غير التي تنظر إليها إلى الـ terminal، ليصدر صوتًا أو يهتز. استخدم any لتشمل النافذة الحالية أيضًا. أما ضبط visual-bell على on فيعرض رسالة داخل tmux بدلًا من تمرير الجرس.
03حدّد الجلسة التي تحتاج إليك
عند تشغيل عدة جلسات، لا يفيد كثيرًا إشعار يقول فقط "Claude يحتاج إليك". يعمل الـ hook داخل بيئة الـ pane، لذا يمكنه أن يسأل tmux عن اسم الجلسة والنافذة. يعرضهما مثال Linux هذا في إشعار سطح المكتب:
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
where=""
if [ -n "$TMUX_PANE" ]; then
where=$(tmux display-message -p -t "$TMUX_PANE" '#S:#W')
fi
notify-send "Claude Code ${where}" "$msg"
احفظه باسم ~/.claude/hooks/notify-tmux.sh، ونفّذ عليه chmod +x، واستخدمه أمرًا لـ hook من نوع Notification أو Stop. يمثّل #S اسم الجلسة و#W اسم النافذة؛ سمِّ جلساتك بـ tmux new -s api-refactor وسيخبرك الإشعار إلى أين تذهب. استبدل notify-send بالأمر المناسب لنظامك، أو بـ push. يقدّم دليل الجلسات المتعددة طرقًا أخرى للتمييز بين الجلسات.
04منفصل: تحتاج إلى push
الانفصال هو جوهر tmux: تبدأ مهمة طويلة، وتنفصل، وتمضي. يواصل Claude Code العمل في الجلسة المنفصلة. لكن لم يعد هناك terminal يعرض escape sequence أو جرسًا، وإذا كان خادم tmux قد بدأ عبر SSH، فقد لا يجد أمر إشعار سطح المكتب وجهة يذهب إليها أيضًا.
الـ hook الذي يرسل طلبًا عبر الشبكة لا يهمه إن كان أحد متصلًا أم لا، وأي خدمة push تفي بالغرض. يحتوي دليل ntfy ودليل Telegram وSlack وDiscord على hooks جاهزة للصق. تخبرك هذه بأن شيئًا ما حدث، لكنها لا تستطيع الرد على Claude، لذا يظل طلب الإذن منتظرًا حتى تعيد الاتصال بـ tmux attach -t api-refactor.
05أين يأتي دور Claude Code Notifier
Claude Code Notifier أداة مستقلة (من صنع TouchTap، وليست من Anthropic) مبنية على hooks الخاصة بـ Claude Code. تعمل أداة سطر الأوامر المجانية ccn على Mac وWindows وLinux. ولأنها ترتبط بـ Claude Code وليس بالـ terminal، فهي تعمل بالطريقة نفسها في tmux أو screen أو صدفة عادية، متصلًا كنت أم منفصلًا:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
على جهاز سطح المكتب، تعرض إشعار سطح مكتب عندما ينتهي Claude أو يحتاج إلى إذن أو يطرح سؤالًا. اقرن هاتفًا وستصلك الأحداث نفسها كإشعارات push عبر خادم الترحيل المشفّر من TouchTap، من أي جهاز يعمل عليه ccn، بما في ذلك خادم تتصل به عبر SSH.
يسدّ الهاتف الفجوة التي تتركها الجلسة المنفصلة. عند ظهور طلب إذن، يمكنك من الهاتف السماح مرة واحدة أو السماح طوال الجلسة أو الرفض، ويواصل Claude العمل دون أن تعيد الاتصال. ويمكنك اختيار إجابة عندما يطرح Claude سؤالًا، وإرسال التعليمة التالية فور انتهاء Claude. إذا كتبت شيئًا خلال آخر 30 ثانية، فلا شيء ينتظر الهاتف ويسألك الـ terminal كالمعتاد. وإذا كنت بعيدًا، ينتظر الـ terminal إجابة الهاتف حتى حدٍّ أقصى تختاره (hold_ceiling_seconds)، ويتوقف عن الانتظار لحظة لمسك لوحة المفاتيح.
راجع إقران الهاتف والابتعاد أثناء المهام الطويلة وصفحة ccn. تتطلب تطبيقات الهاتف اشتراكًا أو شراءً مدى الحياة؛ راجع الأسعار.
06GNU screen
يعمل screen في هذا السياق بشكل مشابه جدًا لـ tmux. يذكر مرجع الـ hooks من Anthropic أن مخرجات terminalSequence من الـ hooks تعمل داخل screen، ويعرض screen رسالة عندما يرنّ جرس نافذة لا تنظر إليها. وتعاني جلسات screen المنفصلة من المشكلة نفسها التي تعانيها جلسات tmux المنفصلة: لا شيء على الشاشة، لذا استخدم push.
07الأسئلة الشائعة
لماذا لا تظهر إشعارات Claude Code داخل tmux؟
يحجب tmux الـ escape sequences التي يستخدمها Claude Code ما لم يكن passthrough مفعّلًا. أضف set -g allow-passthrough on إلى ~/.tmux.conf ثم شغّل tmux source-file ~/.tmux.conf.
هل يستمر Claude Code في العمل عند فصل الجلسة عن tmux؟
نعم. تظل العملية قيد التشغيل على خادم tmux، وتستمر الـ hooks الخاصة بها في العمل. الإشعارات الوحيدة التي لن تصلك هي تلك التي تتطلب terminal متصلًا.
كيف أتلقى إشعارات من جلسة tmux مفصولة؟
استخدم hook يرسل push عبر الشبكة، مثل ntfy أو webhook لتطبيق محادثة أو تطبيق الهاتف الخاص بـ Claude Code Notifier. أما تسلسلات الهروب (escape sequences) في الـ terminal والتنبيهات الصوتية فتحتاج إلى عميل متصل.
هل يمكنني الموافقة على طلب إذن دون إعادة الاتصال بالجلسة؟
ليس باستخدام خدمة push عادية. أما مع Claude Code Notifier وهاتف مقترن، فيمكنك قبول الطلب أو رفضه من الهاتف لتواصل الجلسة المفصولة عملها.
كيف أعرف أي جلسة tmux تحتاج إلى تدخلي؟
أعطِ جلساتك أسماء وأدرج الاسم في الإشعار. يمكن للـ hook قراءته باستخدام tmux display-message -p -t "$TMUX_PANE" '#S:#W'.