Getting it into your agent
This one installs as part of its plugin. Adding the marketplace and installing the plugin brings it with everything else the plugin ships.
/plugin marketplace add etr/bells-and-whistles/plugin install bells-and-whistlesWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/commands/etr/bells-and-whistles/unmute)<a href="https://agentmods.dev/commands/etr/bells-and-whistles/unmute"><img src="https://agentmods.dev/badge/commands/etr/bells-and-whistles/unmute/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/commands/etr/bells-and-whistles/unmute"><img src="https://agentmods.dev/badge/commands/etr/bells-and-whistles/unmute.svg" alt="Reviewed on agentmods" width="80" height="20"></a>What it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5.1 | $0.00011 | $0.01198 |
| Opus 5 | $0.00005 | $0.00599 |
| Sonnet 5 | $0.00002 | $0.00240 |
| Haiku 4.5 | $0.00001 | $0.00120 |
Grade A, and why
unmute scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 11d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 100 lines — stays where its author put it; the contents beside it link to each section on GitHub.
You are the bells-and-whistles unmute command. Unmute notification sounds globally or for the current session/tmux tab.
Steps
1. Detect environment
Run these bash commands to gather state:
# Mute state lives one level above the versioned plugin root so it survives upgrades
MUTE_DIR="${CLAUDE_PLUGIN_ROOT}/.."
# Get TTY for this session
MY_TTY=""
if [ -n "$TMUX_PANE" ]; then
MY_TTY=$(tmux display-message -t "$TMUX_PANE" -p '#{pane_tty}' 2>/dev/null)
else
_pid=$$
while [ "$_pid" -gt 1 ]; do
_raw=$(ps -o tty= -p "$_pid" 2>/dev/null | tr -d ' ')
if [ -n "$_raw" ] && [ "$_raw" != "?" ]; then
MY_TTY="/dev/$_raw"
break
fi
_new_pid=$(ps -o ppid= -p "$_pid" 2>/dev/null | tr -d ' ')
[ "$_new_pid" = "$_pid" ] && break
_pid="$_new_pid"
done
fi
TTY_ID=""
[ -n "$MY_TTY" ] && TTY_ID=$(echo "$MY_TTY" | sed 's|^/dev/||; s|/|_|g')
# Check if in tmux and get window index (for display only)
WIN=""
IN_TMUX=no
if [ -n "$TMUX_PANE" ]; then
IN_TMUX=yes
WIN=$(tmux display-message -t "$TMUX_PANE" -p '#{window_index}' 2>/dev/null)
fi
echo "MY_TTY=$MY_TTY TTY_ID=$TTY_ID WIN=$WIN IN_TMUX=$IN_TMUX"
# Check current mute state
echo "GLOBAL_MUTED=$([ -f "$MUTE_DIR/.mute_all" ] && echo yes || echo no)"
if [ -n "$TTY_ID" ]; then
echo "SESSION_MUTED=$([ -f "$MUTE_DIR/.mute_tty_${TTY_ID}" ] && echo yes || echo no)"
fi
# List all per-session mute files
ls "$MUTE_DIR"/.mute_tty_* 2>/dev/null || echo "No per-session mutes"
2. Check if anything is muted
If nothing is muted at all, tell the user "Notifications are not muted." and stop — do not prompt or take any action.
3. Handle arguments or prompt
Check the user's argument (the text after /unmute):
- Argument is
all→ unmute everything (remove.mute_allAND all.mute_tty_*files) - Argument is
tab N(where N is a number, e.g.tab 3) → requires tmux. Resolve the TTY of tab N:
RemoveTARGET_TTY=$(tmux display-message -t ":$N" -p '#{pane_tty}' 2>/dev/null) TARGET_TTY_ID=$(echo "$TARGET_TTY" | sed 's|^/dev/||; s|/|_|g')$MUTE_DIR/.mute_tty_${TARGET_TTY_ID}. If not in tmux, inform the user thatunmute tab Nrequires tmux. If global mute is active, offer to unmute globally instead using AskUserQuestion with options: ["Unmute globally", "Cancel"] - Argument is
tab(no number) → unmute current session via its TTY- If TTY detection failed, inform the user and offer to unmute globally if global mute is active
- No argument + only one type of mute active → unmute that directly (no prompt needed):
- Only global mute → remove
.mute_all - Only current session muted → remove
.mute_tty_${TTY_ID}
- Only global mute → remove
- No argument + multiple mute types active → use AskUserQuestion:
- Question: "What would you like to unmute?"
- Options: ["Everything (global + all sessions)", "This tab only (tab N)"] (replace N with window index if in tmux, otherwise use "This session only")
- Map: "Everything ..." → remove all mute files, "This tab/session only ..." → remove current session mute file
- No argument + NOT in tmux + global mute active → unmute globally (no prompt needed)
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 11d ago First seen · 100 lines · 11 tokens per session scan A 2157d1fa76e5
unmute is a command published in the GitHub repository etr/bells-and-whistles (7 stars, last pushed 5mo ago), licensed MIT. It adds 11 tokens to every session and 1,198 once invoked, about $0.0001 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other commands, from other repositories
cancel-ralph
Cancel active Ralph Loop.
obsidian-recap
Summarize a time period from the vault - today, week, or month.
setup-pm-skills
Onboard a new user — find out what they do, recommend the right bundles & top skills, and set up a project CONTEXT.md so every skill is tailored to them.
statusbar-style
Switch the status-bar style (classic / capsule / hairline).
engage.actions
Execute Phase 7 - Actions on Objectives and Goal Achievement.
superpowers-execute
Execute the current GSD phase plan with Superpowers instead of gsd-execute-phase.