Feature request: built-in completion notifications for VS Code extension
Problem
There's no reliable built-in way to know when Claude Code finishes working — in either the VS Code extension or the terminal CLI. The Notification hook with idle_prompt matcher — which should be the canonical "done and waiting" signal — does not fire in VS Code (documented in #8985, #11156, #16114, #28774) and has been reported as unreliable in the terminal CLI as well (#8320, closed as NOT_PLANNED). This forces users to build fragile notification systems on top of the Stop hook, which fires on every response turn, not just genuine completions.
What users are building (and why it's painful)
The community has converged on increasingly complex workarounds:
- Time-based debouncing (sleep 3s, check if another Stop fires) — arbitrary, unreliable
- Transcript JSONL parsing in Stop hooks to find recent
tool_usetimestamps and suppress mid-loop notifications - Shared cooldown files between
StopandTaskCompletedhooks to prevent double-tap notifications during agent team runs - Regex content filters on
last_assistant_message— fragile, can't anticipate every mid-workflow message - LLM-as-classifier via
type: "prompt"Stop hooks — adds latency and API cost per turn
Multiple repos exist just to solve this: ADAPT-Chase/claude-stop-hook, felipeelias/claude-notifier, dazuiba/CCNotify, wyattjoh/claude-code-notification. The OpenCode ecosystem has 3+ competing notification plugins. This is a gap in the core product.
Terminal CLI — additional pain points
For terminal users (our primary environment), the problems are compounded:
- No
AskUserQuestiontool in CLI mode. When Claude has a question, it just outputs text ending with?and the Stop hook fires. There's no distinct signal — you have to regex-match the last line to guess if it's a question vs a statement. The VS Code extension has theAskUserQuestionPreToolUse hook for this, but terminal users get nothing. Notification:idle_promptwas closed as NOT_PLANNED (#8320) for the terminal CLI. The 60-second idle timeout never fires. This means terminal users have zero first-class "Claude is done" signals — only the noisyStophook.- No native terminal notification integration. Users must install third-party tools (
terminal-notifier,notify-send) and wire them up manually. Other CLI tools like Aider have--notificationsas a built-in flag that auto-detects the platform and sends native notifications. Claude Code could do the same. - Agent team runs are especially noisy in terminal. With
TaskCompletedandStopboth firing in rapid succession, and no visual distinction between a teammate status update and a genuine "I need your input" moment, terminal users end up building dedup logic with cooldown files just to avoid notification spam. - Bell character (
\a) would be a zero-dependency option. Many terminal emulators (iTerm2, kitty, WezTerm, Windows Terminal) can be configured to show a notification or bounce the dock icon on bell. Emitting\awhen Claude genuinely finishes would require zero user setup and work across all platforms.
Proposed solution
- Fix
Notification:idle_prompteverywhere. Make it fire reliably in both the VS Code extension and the terminal CLI. This is the most impactful single change — the hook exists, the payload is designed, it just doesn't fire. If it worked, most of the workaround ecosystem would be unnecessary.
- Add a
completion_typefield to the Stop hook payload that distinguishes:
"end_turn"— Claude finished and is waiting for user input (genuine idle)"tool_pause"— Claude paused between tool calls in an agentic loop"agent_update"— a teammate/subagent sent a status update
This single field would eliminate the need for transcript parsing, debouncing, and cooldown files.
- Built-in
--notifyflag for the CLI (like Aider's--notifications). Auto-detect platform, send native notification when Claude finishes or needs input. No hooks, no third-party tools. For terminal users this would be the simplest path.
- Emit bell character (
\a) on genuine completion. Zero-dependency, works with existing terminal emulator notification features (iTerm2 dock bounce, tmuxmonitor-bell, etc.). Could be behind a--bellflag or a setting.
- Built-in notification support in the VS Code extension — a simple toggle in settings that sends a native VS Code notification when Claude finishes or needs input. No hooks, no scripts, no terminal-notifier. Cursor's community has been requesting this too (forum threads #32835, #56793, #100843).
- Give terminal CLI a distinct signal for questions. Either fire a specific hook event when Claude's response ends with a question/prompt for the user, or add a
needs_inputboolean to the Stop hook payload. Currently terminal users have to regex-guess fromlast_assistant_message.
Environment
- Claude Code terminal CLI (primary) and VS Code extension
- macOS (but the
Notificationhook bug also affects Linux per #8320) - Using agent teams (
CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1)
11 Comments
Found 3 possible duplicate issues:
This issue will be automatically closed as a duplicate in 3 days.
🤖 Generated with Claude Code
Adding a JetBrains/IntelliJ IDEA perspective to this, since the issue covers VS Code but the same problem applies to the JetBrains plugin.
Environment: Claude Code [Beta] JetBrains plugin, IntelliJ IDEA, macOS
Problem: When Claude is waiting for user input/tool approval in IntelliJ's embedded terminal, no notification is delivered. Root cause: macOS only delivers the OS-level
notification when the terminal loses focus, but in an embedded terminal the IDE (IntelliJ IDEA) remains the foreground app — so the focus-loss trigger never fires.
This can be confirmed by manually cmd+Tab away from IntelliJ after Claude starts waiting — the notification then arrives. The OS notification channel itself works fine
(osascript test passes, Focus mode is off).
What would help: Either of the proposals in this issue would solve it for JetBrains users too — particularly the Notification:idle_prompt hook fix, the bell character option
(\a), or IDE-native notifications via the JetBrains plugin API (equivalent to what's proposed for VS Code). The bell character approach is especially appealing since IntelliJ
can be configured to respond to terminal bell with a visual/audio signal.
+1 — I’m mainly on the VS Code extension (macOS) and the lack of basic “task finished / needs input” signals is rough, especially when the extension already trails the CLI in features. Without a proper notifier or richer hooks I’m stuck babysitting runs and hacking together scripts just to stay in sync. Would love to see the extension catch up here.
For terminal CLI users on Ghostty/macOS: I built haunt, which sidesteps the hook reliability problem entirely. It detects Claude Code's working/idle state from the terminal title prefixes (✳ for idle, braille spinner for working) and tracks the transitions — so when Claude goes from working→idle on a background tab, it highlights that tab as needing attention. There's a
--nexthotkey to jump straight to whichever session needs your input.It's not a general solution (Ghostty + macOS only), but for that setup it works reliably without any hook configuration.
A
Stophook can send desktop/VS Code notifications when Claude finishes:For VS Code, you can also use the terminal bell approach combined with a VS Code setting:
The
printf '\a'in the Stop hook will then trigger a visual or audio notification in VS Code's terminal whenever Claude finishes.A Stop hook can send completion notifications:
Works across macOS (notification center), Linux (notify-send), WSL (Windows message box), and any platform (terminal bell). Add ntfy.sh for phone notifications.
Great writeup on the notification gaps. For the SSH-specific part of this problem, I've been working on a notification bridge in cc-clip that uses Claude Code's hook system to forward events through an SSH reverse tunnel to a local daemon.
It covers the
Stop(task complete) andNotification(permission prompt, idle) hooks — the events that matter most when you step away from the terminal. Delivery goes through macOS Notification Center or cmux if available.Not a replacement for proper built-in notification support, but it works as a stopgap for remote/SSH sessions where OSC and terminal bell aren't reliable.
Claude Code in VSCode asked me to open a ticket but looks like this is the ticket already opened, looking forward to having this feature, would be big time saver for me
Another external workaround for macOS users who want a persistent visual signal rather than one-shot notifications: I built Agent Island as a small notch-level status layer for Claude/Codex sessions.
It tries to make the distinction this issue is asking for visible at a glance:
It can also auto-resume a selected long-running session when it is able to continue again. Not a replacement for proper built-in Claude Code hooks/notifications, but useful if the main pain is babysitting long sessions on macOS.
https://github.com/tristan666666/agent-island
@saurabhav88
Would it be worth updating the OP given there's no reliable built-in mechanism to signal that Claude Code needs any user input (e.g. tool permissions, AskUserQuestion, exceeding quota), not just having finished working?
More quasi-duplicate issues:
Any update on this?