From devstefancho-skills
Installs macOS TTS voice cues and clickable dialogs for Claude Code Stop and Notification events. Run once to wire up the hooks; afterward you'll hear "Task completed" or "Permission needed" and see a dialog with a Go button that refocuses your terminal.
How this skill is triggered — by the user, by Claude, or both
Slash command
/devstefancho-skills:setup-notificationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
This is a **setup skill**: it does not run on events itself. It installs hook scripts (shipped alongside this skill) into the user's Claude Code `settings.json` so the harness fires them on `Stop` and `Notification` events.
This is a setup skill: it does not run on events itself. It installs hook scripts (shipped alongside this skill) into the user's Claude Code settings.json so the harness fires them on Stop and Notification events.
scripts/stop-speak.sh: speaks "Task completed" and shows a macOS dialog (session / window / dir / branch). Clicking Go refocuses the originating terminal (tmux-aware).permission_prompt, idle_prompt) → scripts/notification-hook.sh: speaks "Permission needed" / "Waiting for input" and shows a warning alert with the same Go behavior.edge-tts (voice en-US-AriaNeural) when available, falling back to macOS say.osascript, say, afplay)jq (scripts parse hook stdin JSON)edge-tts for nicer TTS (pipx install edge-tts); without it, say is used.The hook scripts live in scripts/ next to this SKILL.md. Hooks in settings.json need an absolute command path, so resolve it now:
SKILL_DIR="$(cd "$(dirname "<path to this SKILL.md>")" && pwd)"
SCRIPTS="$SKILL_DIR/scripts"
chmod +x "$SCRIPTS"/*.sh
echo "$SCRIPTS"
Use the printed absolute $SCRIPTS path in the next step.
~/.claude/settings.json.claude/settings.jsonAsk the user which scope they want if it is not obvious; default to user-wide.
Add (merge, do not clobber existing hooks) these entries, replacing ABS_SCRIPTS with the absolute path from step 1. The shape mirrors hooks.reference.json in this skill:
{
"hooks": {
"Stop": [
{ "hooks": [ { "type": "command", "command": "ABS_SCRIPTS/stop-speak.sh", "timeout": 15 } ] }
],
"Notification": [
{ "matcher": "permission_prompt", "hooks": [ { "type": "command", "command": "ABS_SCRIPTS/notification-hook.sh" } ] },
{ "matcher": "idle_prompt", "hooks": [ { "type": "command", "command": "ABS_SCRIPTS/notification-hook.sh" } ] }
]
}
}
If settings.json already has a hooks block, deep-merge: append to the Stop / Notification arrays rather than overwriting them. Use jq to merge safely, e.g.:
jq --arg s "$SCRIPTS" '
.hooks.Stop += [ { hooks: [ { type:"command", command:($s+"/stop-speak.sh"), timeout:15 } ] } ] |
.hooks.Notification += [
{ matcher:"permission_prompt", hooks:[ { type:"command", command:($s+"/notification-hook.sh") } ] },
{ matcher:"idle_prompt", hooks:[ { type:"command", command:($s+"/notification-hook.sh") } ] }
]' ~/.claude/settings.json > /tmp/settings.merged.json && mv /tmp/settings.merged.json ~/.claude/settings.json
~/.claude/settings.json (or project) has the Stop and Notification hooks pointing at the absolute scripts pathscripts/*.sh are executablejq is installed; on macOS confirm say workssetup-pre-commit.Stop/Notification entries from settings.json.osascript/say calls.npx claudepluginhub devstefancho/skillsSets up tmux notification system for Claude Code sessions with macOS native alerts, click-to-navigate panes, and auto-start webhook service.
Manages echook audio notifications for Claude Code, Cursor, and Codex: installs, configures, snoozes, mutes, tests, troubleshoots, and monitors context window usage.
Configures Bark push, WeChat, and system notifications for Claude Code via .claude/claude-notification.local.md. Provides bash scripts for proactive task alerts.