Powiadomienia

cmux obsługuje powiadomienia na pulpicie, pozwalając agentom AI i skryptom alarmować Cię gdy potrzebują uwagi.

Cykl życia

  1. Odebrane: powiadomienie pojawia się w panelu, alert na pulpicie się uruchamia (jeśli nie jest wytłumiony)
  2. Nieprzeczytane: odznaka wyświetlana na karcie workspace'a
  3. Przeczytane: usunięte gdy wyświetlisz ten workspace
  4. Wyczyszczone: usunięte z panelu

Wyciszanie

Alerty na pulpicie są wyciszane gdy:

  • Okno cmux jest sfokusowane
  • Konkretny workspace wysyłający powiadomienie jest aktywny
  • Panel powiadomień jest otwarty

Panel powiadomień

Naciśnij ⌘⇧I aby otworzyć panel powiadomień. Kliknij powiadomienie aby przejść do tego workspace'a. Naciśnij ⌘⇧U aby przejść bezpośrednio do workspace'a z najnowszym nieprzeczytanym powiadomieniem.

Niestandardowe polecenie

Uruchom polecenie powłoki za każdym razem gdy powiadomienie jest zaplanowane. Ustaw to w Ustawieniach > Aplikacja > Polecenie powiadomienia. Polecenie uruchamia się przez /bin/sh -c z tymi zmiennymi środowiskowymi:

ZmiennaOpis
CMUX_NOTIFICATION_TITLETytuł powiadomienia (nazwa workspace'a lub aplikacji)
CMUX_NOTIFICATION_SUBTITLEPodtytuł powiadomienia
CMUX_NOTIFICATION_BODYTreść powiadomienia
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

Polecenie działa niezależnie od wybieraka dźwięku systemowego. Ustaw wybierak na "Brak" aby używać tylko niestandardowego polecenia, lub zachowaj oba dla dźwięku systemowego plus niestandardowa akcja.

Wysyłanie powiadomień

CLI

cmux notify --title "Task Complete" --body "Your build finished"
cmux notify --title "Claude Code" --subtitle "Waiting" --body "Agent needs input"

OSC 777 (prosty)

Protokół RXVT używa stałego formatu z tytułem i treścią:

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 (zaawansowany)

Protokół Kitty obsługuje podtytuły i identyfikatory powiadomień:

# 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\\'
FunkcjaOSC 99OSC 777
Tytuł + treśćTakTak
PodtytułTakNie
ID powiadomieniaTakNie
ZłożonośćWyższaNiższa
Użyj OSC 777 do prostych powiadomień. Użyj OSC 99 gdy potrzebujesz podtytułów lub identyfikatorów powiadomień. Użyj CLI (cmux notify) dla najłatwiejszej integracji.

Hooki Claude Code

cmux integruje się z Claude Code przez hooki aby powiadamiać Cię gdy zadania się zakończą.

1. Utwórz skrypt hooka

~/.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. Skonfiguruj 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"
          }
        ]
      }
    ]
  }
}

Zrestartuj Claude Code aby zastosować hooki.

GitHub Copilot CLI

Copilot CLI obsługuje hooki, które uruchamiają polecenia shell przy zdarzeniach cyklu życia, takich jak wysłanie promptu, zatrzymanie agenta i błędy.

~/.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
      }
    ]
  }
}

Dla hooków na poziomie repozytorium utwórz plik .github/hooks/notify.json o tej samej strukturze:

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

Przykłady integracji

Powiadom po długim poleceniu

~/.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 passthrough

Jeśli używasz tmux wewnątrz cmux, włącz passthrough:

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