على macOS، يرسل Claude Code إشعارًا على سطح المكتب تلقائيًا في Ghostty وKitty وiTerm2 (يتطلب iTerm2 تفعيل إعدادات التنبيه)، لكن Apple Terminal ومعظم الـ terminals الأخرى لا تحصل على شيء. للحصول على إشعار في أي terminal، أضف hook من نوع Notification يشغّل osascript -e 'display notification ...' إلى ~/.claude/settings.json، وhook من نوع Stop إن أردت أيضًا أن تعرف لحظة انتهاء Claude. اسمح بالإشعارات لتطبيق Script Editor في إعدادات النظام، وإلا سيفشل أمر osascript دون أي رسالة.
01ما يفعله Claude Code تلقائيًا
يطلق Claude Code حدث إشعار عندما ينهي مهمة أو ينتظر إذنًا ويبدو أنك بعيد عن الـ terminal. ما تراه يعتمد على الـ terminal، وفقًا لـدليل الـ terminal من Anthropic:
في iTerm2، افتح Settings > Profiles > Terminal، وفعّل Notification Center Alerts، ثم انقر Filter Alerts وشغّل Send escape sequence-generated alerts. تحقق أيضًا من أن iTerm2 مسموح له بإرسال الإشعارات في System Settings > Notifications.
في Apple Terminal يمكنك على الأقل الحصول على صوت. اضبط "preferredNotifChannel": "terminal_bell" في ~/.claude/settings.json وفعّل Audible bell ضمن Settings > Profiles > Advanced. يشرح دليل جرس الـ terminal هذا الخيار بالتفصيل.
للتنبيه المدمج حدود: لا يعمل إلا عندما يظن Claude Code أنك بعيد، ولا يخبرك إلا بأن شيئًا ما حدث، ولا يصل أبدًا إلى خارج الحاسوب.
02hook للإشعارات باستخدام osascript
يعمل الـ hook في كل terminal، بما فيها terminals بيئات التطوير. هذا مثال macOS من دليل الـ hooks لدى Anthropic. أضفه إلى ~/.claude/settings.json مع الإبقاء على أي مفاتيح موجودة لديك:
{
"hooks": {
"Notification": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude Code needs your attention\" with title \"Claude Code\"'"
}
]
}
]
}
}
اكتب /hooks في Claude Code لتتأكد من ظهوره ضمن Notification.
إذن Script Editor
ينشر osascript الإشعارات باسم Script Editor. إن لم يكن لدى Script Editor إذن بالإشعارات، يفشل الأمر بصمت ولا يطلب macOS الإذن. شغّل هذا مرة واحدة في Terminal:
osascript -e 'display notification "test"'
لن يظهر شيء في المرة الأولى. افتح System Settings > Notifications، وابحث عن Script Editor، وفعّل Allow Notifications. شغّل الأمر مجددًا وسيظهر الإشعار التجريبي.
متى يُطلَق
الـ matcher الفارغ يعمل مع كل أنواع الإشعارات. أهم نوعين هما permission_prompt (انتظر Claude نحو ست ثوانٍ موافقتك ولم تكتب شيئًا) وidle_prompt (انتهى Claude منذ نحو 60 ثانية ولم تكتب شيئًا بعدها). يسرد دليل Notification hook كل الأنواع وتوقيتها.
03اعرف لحظة انتهاء Claude
ينتظر idle_prompt دقيقة. لتُبلَّغ فورًا، أضف hook من نوع Stop، يعمل عندما ينهي Claude دوره. لا يقبل Stop أي matcher:
{
"hooks": {
"Stop": [
{
"hooks": [
{
"type": "command",
"command": "osascript -e 'display notification \"Claude has finished\" with title \"Claude Code\" sound name \"Glass\"'"
}
]
}
]
}
}
يقبل sound name أي صوت في /System/Library/Sounds، مثل Glass أو Ping أو Hero. إن أردت صوتًا فقط، فاستخدم afplay /System/Library/Sounds/Glass.aiff كأمر. المزيد عن هذا الحدث في دليل Stop hook.
04اعرض الرسالة الفعلية
تستقبل الـ hooks بيانات JSON عبر الإدخال القياسي. يحتوي إدخال Notification على حقل message، مثل "Claude needs your permission". يمكن لسكربت صغير وضع هذا النص في الإشعار. احفظ هذا باسم ~/.claude/hooks/notify-mac.sh:
#!/bin/bash
msg=$(jq -r '.message // "Claude Code needs your attention"')
osascript -e 'on run argv' \
-e 'display notification (item 1 of argv) with title "Claude Code"' \
-e 'end run' "$msg"
تمرير النص كوسيط بدلًا من وضعه داخل نص AppleScript يعني أن علامات الاقتباس في الرسالة لا يمكنها كسر الأمر. اجعله قابلًا للتنفيذ بـ chmod +x ~/.claude/hooks/notify-mac.sh واضبط أمر الـ hook على ~/.claude/hooks/notify-mac.sh. يحتاج السكربت إلى jq (استخدم brew install jq إن فشل jq --version).
05terminal-notifier: انقر للعودة إلى الـ terminal
النقر على إشعار osascript يفتح Script Editor، وهو ليس المكان الذي تريده. يتيح لك terminal-notifier اختيار التطبيق الذي يظهر في المقدمة:
brew install terminal-notifier
terminal-notifier -title "Claude Code" -message "Claude has finished" -sound default -activate com.googlecode.iterm2
استخدم com.apple.Terminal لـ Apple Terminal، أو bundle ID الخاص بمحررك. يوضع الأمر نفسه في حقل command للـ hook. اسمح بالإشعارات لـ terminal-notifier في إعدادات النظام في المرة الأولى.
06Focus وعدم الإزعاج
كل هذه إشعارات macOS عادية، لذا قد يخفيها وضع Focus. إن اختفت في أوقات معينة، فتحقق من System Settings > Focus واسمح للتطبيق الذي ينشرها (Script Editor أو terminal-notifier أو الـ terminal). ولإشعارات تحترم ساعاتك الخاصة بدلًا من ذلك، راجع ساعات الهدوء وعدم الإزعاج.
07أين يأتي دور Claude Code Notifier
الـ hooks أعلاه حل جيد إن كنت جالسًا أمام جهاز Mac وتريد تنبيهًا بسيطًا فقط. لكنها لا تكفي عندما تبتعد، لأن إشعار Mac لا يصل إليك في المطبخ ولا يمكنه الرد على Claude.
Claude Code Notifier أداة مستقلة (من صنع TouchTap، وليس Anthropic) مبنية على الـ hooks نفسها. تعمل أداة سطر الأوامر المجانية ccn على Mac وWindows وLinux. ثبّتها على جهاز Mac بالأمر:
curl -fsSL https://claudecodenotifier.com/install.sh | sh
أو باستخدام Homebrew: brew trust --formula touch-tap/tap/ccn && brew install touch-tap/tap/ccn. تضيف الأداة مدخلات الـ hook الخاصة بها إلى ~/.claude/settings.json، دون المساس ببقية الملف، مع الاحتفاظ بنسخة احتياطية. بعدها تعرض إشعار macOS عندما ينتهي Claude أو يحتاج إذنًا أو يطرح سؤالًا، دون الحاجة إلى شبكة أو هاتف.
إن ربطت هاتف iPhone أو Android، تصلك الأحداث نفسها كإشعارات push، ويمكنك السماح بإذن أو رفضه، أو اختيار إجابة لسؤال Claude، أو إرسال التعليمة التالية من الهاتف. إن كتبت شيئًا خلال آخر 30 ثانية، يسألك الـ terminal كالمعتاد ولا ينتظر شيء على الهاتف. راجع ربط الهاتف وصفحة ccn. تتطلب تطبيقات الهاتف اشتراكًا أو شراءً مدى الحياة؛ راجع الأسعار.
إن أضفت ccn، فاحذف hooks الـ osascript الخاصة بك وإلا سترى إشعارين لكل حدث. يوجد أيضًا تطبيق أقدم لشريط القوائم في Mac؛ لا تشغّله مع ccn على جهاز Mac نفسه.
08الأسئلة الشائعة
لماذا لا يُظهر hook الخاص بـ osascript أي شيء؟
في أغلب الأحيان لا يملك Script Editor إذنًا بإرسال الإشعارات، فيتجاهل macOS الإشعار دون أي رسالة خطأ. شغّل osascript -e 'display notification "test"' مرة واحدة، ثم اسمح لـ Script Editor من System Settings > Notifications. إذا استمرت المشكلة، فتأكد من أن وضع Focus غير مفعّل وأن /hooks يعرض الـ hook الخاص بك.
هل يرسل Claude Code إشعارات macOS دون أي إعداد؟
نعم، في Ghostty وKitty، وفي iTerm2 بعد تفعيل تنبيهات Notification Center فيه. أما Apple Terminal والـ terminal المدمج في بيئات التطوير فلا تصلها إشعارات سطح المكتب افتراضيًا، لذا استخدم hook أو ccn فيها.
كيف أتلقى إشعارًا فور انتهاء Claude، لا بعد دقيقة؟
استخدم hook من نوع Stop. فإشعار idle_prompt لا يُطلق إلا بعد نحو 60 ثانية من انتهاء Claude، وبشرط ألا تكون قد كتبت شيئًا، بينما يعمل Stop في نهاية كل دور.
هل يمكنني سماع صوت بدلًا من رؤية لافتة إشعار؟
نعم. استخدم afplay /System/Library/Sounds/Glass.aiff أمرًا للـ hook، أو أضف sound name "Glass" إلى أمر osascript لتحصل على الاثنين معًا.
هل يمكنني الموافقة على طلب إذن من إشعار macOS؟
ليس باستخدام osascript أو terminal-notifier، فهما يعرضان نصًا فقط. الرد على طلب إذن من خلال hook يتطلب الحدث PermissionRequest؛ راجع الرد على طلبات الإذن من hook أو وافق من هاتفك باستخدام Claude Code Notifier.