#الإشعارات
يدعم cmux إشعارات سطح المكتب، مما يسمح لوكلاء الذكاء الاصطناعي والنصوص بتنبيهك عندما يحتاجون انتباهك.
#دورة الحياة
- مُستلم: يظهر الإشعار في اللوحة، يُطلق تنبيه سطح المكتب (إذا لم يكن مكتوماً)
- غير مقروء: تظهر شارة على علامة تبويب مساحة العمل
- مقروء: يُمسح عند عرض مساحة العمل تلك
- مُمسوح: يُزال من اللوحة
#الكتم
تُكتم تنبيهات سطح المكتب عندما:
- نافذة cmux مركزة
- مساحة العمل المحددة التي ترسل الإشعار نشطة
- لوحة الإشعارات مفتوحة
#لوحة الإشعارات
اضغط ⌘⇧I لفتح لوحة الإشعارات. انقر على إشعار للانتقال إلى مساحة العمل تلك. اضغط ⌘⇧U للانتقال مباشرة إلى مساحة العمل التي تحتوي على أحدث إشعار غير مقروء.
#أمر مخصص
تشغيل أمر shell في كل مرة يُجدول فيها إشعار. عيّنه في الإعدادات > التطبيق > أمر الإشعار. يُشغل الأمر عبر /bin/sh -c مع متغيرات البيئة هذه:
| المتغير | الوصف |
|---|---|
CMUX_NOTIFICATION_TITLE | عنوان الإشعار (اسم مساحة العمل أو التطبيق) |
CMUX_NOTIFICATION_SUBTITLE | العنوان الفرعي للإشعار |
CMUX_NOTIFICATION_BODY | نص محتوى الإشعار |
# Text-to-speech
say "$CMUX_NOTIFICATION_TITLE"
# Custom sound file
afplay /path/to/sound.aiff
# Log to file
echo "$CMUX_NOTIFICATION_TITLE: $CMUX_NOTIFICATION_BODY" >> ~/notifications.logيعمل الأمر بشكل مستقل عن منتقي صوت النظام. عيّن المنتقي إلى "لا شيء" لاستخدام الأمر المخصص فقط، أو احتفظ بكليهما لصوت نظام مع إجراء مخصص.
#خطافات الإشعارات
يمكن أن يعرّف cmux.json خطافات إشعارات تستقبل كل سياسة إشعار كـ JSON عبر stdin. يعيد كل خطاف JSON عبر stdout. تكون الخطافات متوقفة افتراضيًا؛ لا يشغّل cmux أي خطاف إلا عندما يحتوي notifications.hooks على خطاف مفعّل واحد على الأقل. يطبق cmux نص الإشعار والتأثيرات المعادة، لذلك يمكن للخطافات تصفية اللافتات، أو الاحتفاظ بسجل الشريط الجانبي أو تخطيه، أو تشغيل الأصوات، أو إيقاف الخطافات اللاحقة.
{
"notifications": {
"hooks": [
{
"id": "quiet-docs",
"command": "sed 's/"desktop":true/"desktop":false/'",
"timeoutSeconds": 20
}
]
}
}{
"version": 1,
"notification": {
"workspaceId": "3B3F0D83-...",
"surfaceId": "7E9C1A02-...",
"title": "Codex",
"subtitle": "Waiting",
"body": "Agent needs input"
},
"context": {
"cwd": "/path/to/project",
"configPath": "/path/to/project/.cmux/cmux.json",
"hookId": "quiet-docs",
"appFocused": false,
"focusedPanel": false
},
"effects": {
"record": true,
"markUnread": true,
"reorderWorkspace": true,
"desktop": true,
"sound": true,
"command": true,
"paneFlash": true
}
}تُورث الخطافات من الملف العام ~/.config/cmux/cmux.json وملفات المشروع .cmux/cmux.json من المجلدات الأصلية حتى مساحة العمل الحالية. تستخدم خطافات المشروع نفس مطالبة الثقة مثل أوامر المشروع الأخرى في cmux.json قبل تشغيلها. تمر لافتات موافقة Feed عبر هذه الخطافات أيضاً؛ يؤدي تعطيل desktop إلى منع اللافتة الأصلية مع إبقاء عنصر Feed متاحاً في cmux. اضبط notifications.hooksMode على replace في إعدادات المشروع لتجاهل الخطافات الموروثة. إذا فشل خطاف أو انتهت مهلته أو أعاد JSON غير صالح، يستخدم cmux سلوك الإشعارات الافتراضي ويعرض تنبيه فشل الخطاف.
#إرسال الإشعارات
#CLI
cmux notify --title "Task Complete" --body "Your build finished"
cmux notify --title "Claude Code" --subtitle "Waiting" --body "Agent needs input"#OSC 777 (بسيط)
يستخدم بروتوكول RXVT تنسيقاً ثابتاً مع عنوان ومحتوى:
printf '\e]777;notify;My Title;Message body here\a'notify_osc777() {
local title="$1"
local body="$2"
printf '\e]777;notify;%s;%s\a' "$title" "$body"
}
notify_osc777 "Build Complete" "All tests passed"#OSC 99 (غني)
يدعم بروتوكول Kitty عناوين فرعية ومعرفات إشعارات:
# Format: ESC ] 99 ; <params> ; <payload> ESC \
# Simple notification
printf '\e]99;i=1;e=1;d=0:Hello World\e\\'
# With title, subtitle, and body
printf '\e]99;i=1;e=1;d=0;p=title:Build Complete\e\\'
printf '\e]99;i=1;e=1;d=0;p=subtitle:Project X\e\\'
printf '\e]99;i=1;e=1;d=1;p=body:All tests passed\e\\'| الميزة | OSC 99 | OSC 777 |
|---|---|---|
| العنوان + المحتوى | نعم | نعم |
| العنوان الفرعي | نعم | لا |
| معرّف الإشعار | نعم | لا |
| التعقيد | أعلى | أقل |
#خطافات Claude Code
يتكامل cmux مع Claude Code عبر الخطافات لإعلامك عند اكتمال المهام.
#1. إنشاء نص الخطاف
#!/bin/bash
# Skip if not in cmux
[ -S /tmp/cmux.sock ] || exit 0
EVENT=$(cat)
EVENT_TYPE=$(echo "$EVENT" | jq -r '.hook_event_name // "unknown"')
TOOL=$(echo "$EVENT" | jq -r '.tool_name // ""')
case "$EVENT_TYPE" in
"Stop")
cmux notify --title "Claude Code" --body "Session complete"
;;
"PostToolUse")
[ "$TOOL" = "Task" ] && cmux notify --title "Claude Code" --body "Agent finished"
;;
esacchmod +x ~/.claude/hooks/cmux-notify.sh#2. إعداد Claude Code
{
"hooks": {
"Stop": [
{
"matcher": "",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/cmux-notify.sh"
}
]
}
],
"PostToolUse": [
{
"matcher": "Task",
"hooks": [
{
"type": "command",
"command": "~/.claude/hooks/cmux-notify.sh"
}
]
}
]
}
}أعد تشغيل Claude Code لتطبيق الخطافات.
#GitHub Copilot CLI
يدعم Copilot CLI الخطافات التي تنفذ أوامر shell عند أحداث دورة الحياة مثل إرسال الأوامر وتوقف الوكيل والأخطاء.
{
"hooks": {
"userPromptSubmitted": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux set-status copilot_cli Running; fi",
"timeoutSec": 3
}
],
"agentStop": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux notify --title 'Copilot CLI' --body 'Done'; cmux set-status copilot_cli Idle; fi",
"timeoutSec": 5
}
],
"errorOccurred": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux notify --title 'Copilot CLI' --subtitle 'Error' --body 'An error occurred'; cmux set-status copilot_cli Error; fi",
"timeoutSec": 5
}
],
"sessionEnd": [
{
"type": "command",
"bash": "if command -v cmux &>/dev/null; then cmux clear-status copilot_cli; fi",
"timeoutSec": 3
}
]
}
}لخطافات على مستوى المستودع، أنشئ ملف .github/hooks/notify.json بنفس الهيكل:
{
"version": 1,
"hooks": {
"userPromptSubmitted": [ ... ],
"agentStop": [ ... ]
}
}#أمثلة التكامل
#إشعار بعد أمر طويل
# Add to your shell config
notify-after() {
"$@"
local exit_code=$?
if [ $exit_code -eq 0 ]; then
cmux notify --title "✓ Command Complete" --body "$1"
else
cmux notify --title "✗ Command Failed" --body "$1 (exit $exit_code)"
fi
return $exit_code
}
# Usage: notify-after npm run build#Python
import sys
def notify(title: str, body: str):
"""Send OSC 777 notification."""
sys.stdout.write(f'\x1b]777;notify;{title};{body}\x07')
sys.stdout.flush()
notify("Script Complete", "Processing finished")#Node.js
function notify(title, body) {
process.stdout.write(`\x1b]777;notify;${title};${body}\x07`);
}
notify('Build Done', 'webpack finished');#تمرير tmux
إذا كنت تستخدم tmux داخل cmux، فعّل التمرير:
set -g allow-passthrough onprintf '\ePtmux;\e\e]777;notify;Title;Body\a\e\\'