Notifiche
cmux supporta le notifiche desktop, permettendo agli agenti IA e agli script di avvisarti quando hanno bisogno di attenzione.
Ciclo di vita
- Ricevuta: la notifica appare nel pannello, l'avviso desktop si attiva (se non soppresso)
- Non letta: badge mostrato sul tab del workspace
- Letta: cancellata quando visualizzi quel workspace
- Cancellata: rimossa dal pannello
Soppressione
Gli avvisi desktop vengono soppressi quando:
- La finestra cmux è attiva
- Il workspace specifico che invia la notifica è attivo
- Il pannello notifiche è aperto
Pannello notifiche
Premi ⌘⇧I per aprire il pannello notifiche. Clicca su una notifica per andare a quel workspace. Premi ⌘⇧U per andare direttamente al workspace con la notifica non letta più recente.
Comando personalizzato
Esegui un comando shell ogni volta che una notifica è pianificata. Impostalo in Impostazioni > App > Comando di notifica. Il comando viene eseguito tramite /bin/sh -c con queste variabili d'ambiente:
| Variabile | Descrizione |
|---|---|
CMUX_NOTIFICATION_TITLE | Titolo della notifica (nome del workspace o dell'app) |
CMUX_NOTIFICATION_SUBTITLE | Sottotitolo della notifica |
CMUX_NOTIFICATION_BODY | Testo del corpo della notifica |
# 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.logIl comando viene eseguito indipendentemente dal selettore di suoni di sistema. Imposta il selettore su "Nessuno" per usare solo il comando personalizzato, o mantieni entrambi per un suono di sistema più un'azione personalizzata.
Invio di notifiche
CLI
cmux notify --title "Task Complete" --body "Your build finished"
cmux notify --title "Claude Code" --subtitle "Waiting" --body "Agent needs input"OSC 777 (semplice)
Il protocollo RXVT usa un formato fisso con titolo e corpo:
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 (ricco)
Il protocollo Kitty supporta sottotitoli e ID di notifica:
# 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\\'| Funzionalità | OSC 99 | OSC 777 |
|---|---|---|
| Titolo + corpo | Sì | Sì |
| Sottotitolo | Sì | No |
| ID notifica | Sì | No |
| Complessità | Maggiore | Minore |
Hook di Claude Code
cmux si integra con Claude Code tramite hook per notificarti quando le attività sono completate.
1. Crea lo script hook
#!/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.sh2. Configura 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"
}
]
}
]
}
}Riavvia Claude Code per applicare gli hook.
GitHub Copilot CLI
Copilot CLI supporta gli hook che eseguono comandi shell in eventi del ciclo di vita come l'invio di prompt, l'arresto dell'agente e gli errori.
{
"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
}
]
}
}Per gli hook a livello di repository, crea un file .github/hooks/notify.json con la stessa struttura:
{
"version": 1,
"hooks": {
"userPromptSubmitted": [ ... ],
"agentStop": [ ... ]
}
}Esempi di integrazione
Notifica dopo un comando lungo
# 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 buildPython
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');Passthrough tmux
Se usi tmux all'interno di cmux, abilita il passthrough:
set -g allow-passthrough onprintf '\ePtmux;\e\e]777;notify;Title;Body\a\e\\'