#Сповіщення

cmux підтримує сповіщення на робочому столі, що дозволяє AI-агентам та скриптам повідомляти вас, коли вони потребують уваги.

#Життєвий цикл

  1. Отримано: сповіщення з'являється в панелі, спрацьовує сповіщення на робочому столі (якщо не придушено)
  2. Непрочитано: значок показується на вкладці робочого простору
  3. Прочитано: очищується, коли ви переглядаєте цей робочий простір
  4. Видалено: прибрано з панелі

#Придушення

Сповіщення на робочому столі придушуються, коли:

  • Вікно cmux у фокусі
  • Конкретний робочий простір, що надсилає сповіщення, активний
  • Панель сповіщень відкрита

#Панель сповіщень

Натисніть ⌘⇧I, щоб відкрити панель сповіщень. Натисніть на сповіщення, щоб перейти до цього робочого простору. Натисніть ⌘⇧U, щоб перейти безпосередньо до робочого простору з найновішим непрочитаним сповіщенням.

#Користувацька команда

Виконувати shell-команду щоразу при плануванні сповіщення. Встановіть її в Параметри > Застосунок > Команда сповіщення. Команда виконується через /bin/sh -c з такими змінними середовища:

ЗміннаОпис
CMUX_NOTIFICATION_TITLEЗаголовок сповіщення (назва робочого простору або назва застосунку)
CMUX_NOTIFICATION_SUBTITLEПідзаголовок сповіщення
CMUX_NOTIFICATION_BODYТекст тіла сповіщення
Examples
# 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 застосовує повернений текст і ефекти, тому хуки можуть фільтрувати банери, зберігати або пропускати історію бічної панелі, запускати звуки чи зупиняти наступні хуки.

cmux.json
{
  "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 від батьківських каталогів до поточного workspace. Проєктні хуки перед запуском використовують той самий запит довіри, що й інші проєктні команди 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'
Shell function
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 99OSC 777
Заголовок + тілоТакТак
ПідзаголовокТакНі
ID сповіщенняТакНі
СкладністьВищаНижча
Використовуйте OSC 777 для простих сповіщень. Використовуйте OSC 99, коли потрібні підзаголовки або ідентифікатори сповіщень. Використовуйте CLI (cmux notify) для найпростішої інтеграції.

#Хуки Claude Code

cmux інтегрується з Claude Code через хуки для сповіщення, коли завдання завершено.

#1. Створіть скрипт хука

~/.claude/hooks/cmux-notify.sh
#!/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"
        ;;
esac
chmod +x ~/.claude/hooks/cmux-notify.sh

#2. Налаштуйте Claude Code

~/.claude/settings.json
{
  "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-команди під час подій життєвого циклу, таких як подання промпту, зупинка агента та помилки.

~/.copilot/config.json
{
  "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 з такою ж структурою:

.github/hooks/notify.json
{
  "version": 1,
  "hooks": {
    "userPromptSubmitted": [ ... ],
    "agentStop": [ ... ]
  }
}

#Приклади інтеграції

#Сповіщення після довгої команди

~/.zshrc
# 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

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

node
function notify(title, body) {
  process.stdout.write(`\x1b]777;notify;${title};${body}\x07`);
}

notify('Build Done', 'webpack finished');

#Прохідний режим tmux

Якщо ви використовуєте tmux всередині cmux, увімкніть прохідний режим:

.tmux.conf
set -g allow-passthrough on
printf '\ePtmux;\e\e]777;notify;Title;Body\a\e\\'