diff --git a/.claude/hooks/attention-bell.sh b/.claude/hooks/attention-bell.sh new file mode 100755 index 0000000..0b83487 --- /dev/null +++ b/.claude/hooks/attention-bell.sh @@ -0,0 +1,21 @@ +#!/bin/sh +# attention-bell.sh — ring the terminal bell in this Claude session's tmux pane +# so tmux's monitor-bell flags the (background) window red in the status bar. +# +# Claude Code runs hooks as detached subprocesses: they have no controlling +# terminal, so /dev/tty is unavailable here. But the parent-process chain up to +# the `claude` process stays intact, and `claude` itself holds the pane's pty. +# So we walk ancestry to find it and write the bell straight to that tty. +# (Writing a bare BEL to an explicit /dev/pts/N works even from a detached +# process — verified against tmux's window_bell_flag.) + +pid=$PPID +while [ "$pid" -gt 1 ] 2>/dev/null; do + if [ "$(ps -o comm= -p "$pid" 2>/dev/null)" = claude ]; then + tty=$(ps -o tty= -p "$pid" 2>/dev/null | tr -d ' ') + [ -n "$tty" ] && [ "$tty" != '?' ] && printf '\a' > "/dev/$tty" + exit 0 + fi + pid=$(ps -o ppid= -p "$pid" 2>/dev/null | tr -d ' ') + [ -z "$pid" ] && break +done diff --git a/.claude/settings.json b/.claude/settings.json deleted file mode 120000 index b029f31..0000000 --- a/.claude/settings.json +++ /dev/null @@ -1 +0,0 @@ -/home/alexion/wrk/claude/settings.json \ No newline at end of file diff --git a/.claude/settings.json b/.claude/settings.json new file mode 100644 index 0000000..a35212a --- /dev/null +++ b/.claude/settings.json @@ -0,0 +1,18 @@ +{ + "hooks": { + "Stop": [ + { + "hooks": [ + { "type": "command", "command": "~/.claude/hooks/attention-bell.sh" } + ] + } + ], + "Notification": [ + { + "hooks": [ + { "type": "command", "command": "~/.claude/hooks/attention-bell.sh" } + ] + } + ] + } +}