Configurable tool call visibility (VS Code extension + terminal CLI)
Problem
Some tool calls are infrastructure — voice output, logging, background sync — not content the user needs to see. Currently every tool call renders in the conversation UI with full IN/OUT blocks, creating visual clutter when tool calls are used for side-effects rather than meaningful output.
This applies to both the VS Code extension and the terminal CLI — both render every tool call visually with no way to suppress it.
Current behavior
Every voice output creates a visible Bash block with the full command and output, even when using run_in_background: true. The actual response text is above it, but the Bash block dominates:
<img width="1048" height="233" alt="Image" src="https://github.com/user-attachments/assets/3debdc8a-fa07-4aaf-b7f0-654ed11efbeb" />
● Both approaches shown — user-level config for patterns,
and a per-call flag for one-offs.
● Bash Voice
IN while pgrep -x say >/dev/null; do sleep 0.3; done; bash ~/apps/cc/say-wrap.sh -r 200 "[[slnc 500]] I drafted two co...
OUT Command running in background with ID: bos325wx5. Output is being written to: /private/tmp/...
Standing by.
The Bash call is pure plumbing — the response text is already visible as a normal message above it.
Desired behavior
The tool call still executes (voice plays, file writes, etc.), but nothing renders in the UI:
● Both approaches shown — user-level config for patterns,
and a per-call flag for one-offs.
Standing by.
Just the clean text. The infrastructure tool call is invisible.
Proposed solutions
Option A: Settings-based pattern matching
// .claude/settings.json
{
"hiddenToolPatterns": [
{ "tool": "Bash", "descriptionMatch": "Voice" },
{ "tool": "Bash", "commandMatch": "say-wrap.sh" },
{ "tool": "Write", "pathMatch": "/tmp/claude-voice*" }
]
}
Option B: Per-call visibility parameter
{
"tool": "Bash",
"command": "bash ~/apps/cc/say-wrap.sh -r 200 'Hello'",
"description": "Voice",
"visible": false
}
Both approaches would be ideal — settings for recurring patterns, per-call flag for one-offs.
Use cases
- Voice/TTS output — speaking responses aloud via macOS
sayor a speech daemon. The text is already visible as a normal message; the Bash call is pure plumbing. - Auto-save/checkpointing — writing state, memory files, or session context to disk after every exchange
- Telemetry/analytics — tracking usage metrics, token counts, or session stats silently
- Git auto-commit — background commits to a working branch after code changes
- Notification dispatch — sending Slack, Discord, or webhook updates during long tasks
- Audit/compliance logging — security or compliance logs that shouldn't interrupt the user
- Health checks — pinging services or verifying server status as part of a workflow
Current workaround
run_in_background: true reduces prominence slightly, but the IN/OUT blocks still render in the conversation and generate task completion notifications that also clutter the UI.
This issue has 2 comments on GitHub. Read the full discussion on GitHub ↗