From b6a926d4136ba8ac97f2b548f0e3c484ba664eed Mon Sep 17 00:00:00 2001 From: Victor Irzak Date: Mon, 5 Oct 2026 20:16:20 -0400 Subject: [PATCH] Add a wt-tab-status plugin to the marketplace Hooks mark Windows Terminal tabs with a progress ring while Claude works and ring the bell when it finishes, so a tab with finished work shows a bell icon until it is focused. Both survive renamed tabs, and Windows Terminal combines the progress of every pane in a split tab. Generated with Claude Code --- .claude-plugin/marketplace.json | 8 +++- plugins/wt-tab-status/README.md | 37 ++++++++++++++++++ plugins/wt-tab-status/hooks/hooks.json | 52 ++++++++++++++++++++++++++ plugins/wt-tab-status/plugin.json | 12 ++++++ 4 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 plugins/wt-tab-status/README.md create mode 100644 plugins/wt-tab-status/hooks/hooks.json create mode 100644 plugins/wt-tab-status/plugin.json diff --git a/.claude-plugin/marketplace.json b/.claude-plugin/marketplace.json index 20c0459..39150f5 100644 --- a/.claude-plugin/marketplace.json +++ b/.claude-plugin/marketplace.json @@ -1,6 +1,6 @@ { "name": "zomp", - "description": "Zomp's Claude Code plugins. Currently skills for Zomp.SyncMethodGenerator, the .NET source generator which writes the sync half of a sync/async method pair", + "description": "Zomp's Claude Code plugins: skills for Zomp.SyncMethodGenerator, the .NET source generator which writes the sync half of a sync/async method pair, and Windows Terminal tab status", "owner": { "name": "Zomp" }, @@ -10,6 +10,12 @@ "source": "./plugins/sync-method-generator", "description": "Generate the sync half of a C# sync/async method pair with Zomp.SyncMethodGenerator instead of hand-maintaining both", "version": "0.1.0" + }, + { + "name": "wt-tab-status", + "source": "./plugins/wt-tab-status", + "description": "Show which Windows Terminal tabs have Claude working (progress ring) and which finished while you were away (bell), even on renamed tabs and split panes", + "version": "0.1.0" } ] } diff --git a/plugins/wt-tab-status/README.md b/plugins/wt-tab-status/README.md new file mode 100644 index 0000000..1d69c14 --- /dev/null +++ b/plugins/wt-tab-status/README.md @@ -0,0 +1,37 @@ +# wt-tab-status + +Shows the state of every Claude Code session on its Windows Terminal tab, so you can tell at a glance which tabs need you. + +| Tab icon | Meaning | +| ------------- | -------------------------------------------------------------------------------- | +| Spinning ring | Claude is working in at least one pane of the tab | +| Bell | Claude finished while you were looking elsewhere; cleared when you focus the tab | +| Normal icon | Nothing new | + +It works on renamed tabs, where a renamed title hides the spinner Claude Code writes into the window title, and on tabs split into several panes, where Windows Terminal combines the progress of all of them. + +## Install + +```sh +claude plugin marketplace add zompinc/sync-method-generator --sparse .claude-plugin plugins +claude plugin install wt-tab-status@zomp +``` + +Sessions already running pick it up after a restart. + +## How it works + +Four hooks write terminal sequences through the hook output's `terminalSequence` field: + +- `UserPromptSubmit` starts an indeterminate progress ring (`OSC 9;4;3`). +- `Stop` and `StopFailure` clear the ring (`OSC 9;4;0`) and ring the bell (`BEL`). Windows Terminal marks an unfocused tab with a bell icon until it is focused. +- `SessionEnd` clears the ring. + +The hooks run through `bash`, which on Windows means Git Bash. + +## Notes + +- With Windows Terminal's default `bellStyle` the bell is also audible. For a silent marker, set `"bellStyle": "taskbar"` under `profiles.defaults`, which flashes the taskbar instead. +- The ring keeps spinning while Claude waits on a permission prompt. +- Claude Code's own progress sequences (`terminalProgressBarEnabled`) can clear the ring partway through a turn. Turn that setting off if the ring stops early. +- Other terminals may ignore the progress sequence; the bell then beeps or flashes as that terminal does. diff --git a/plugins/wt-tab-status/hooks/hooks.json b/plugins/wt-tab-status/hooks/hooks.json new file mode 100644 index 0000000..0eee5e1 --- /dev/null +++ b/plugins/wt-tab-status/hooks/hooks.json @@ -0,0 +1,52 @@ +{ + "hooks": { + "UserPromptSubmit": [ + { + "hooks": [ + { + "type": "command", + "shell": "bash", + "command": "echo '{\"terminalSequence\": \"\\u001b]9;4;3;\\u0007\"}'", + "timeout": 5 + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "shell": "bash", + "command": "echo '{\"terminalSequence\": \"\\u001b]9;4;0;\\u0007\\u0007\"}'", + "timeout": 5 + } + ] + } + ], + "StopFailure": [ + { + "hooks": [ + { + "type": "command", + "shell": "bash", + "command": "echo '{\"terminalSequence\": \"\\u001b]9;4;0;\\u0007\\u0007\"}'", + "timeout": 5 + } + ] + } + ], + "SessionEnd": [ + { + "hooks": [ + { + "type": "command", + "shell": "bash", + "command": "echo '{\"terminalSequence\": \"\\u001b]9;4;0;\\u0007\"}'", + "timeout": 5 + } + ] + } + ] + } +} diff --git a/plugins/wt-tab-status/plugin.json b/plugins/wt-tab-status/plugin.json new file mode 100644 index 0000000..f33bba1 --- /dev/null +++ b/plugins/wt-tab-status/plugin.json @@ -0,0 +1,12 @@ +{ + "name": "wt-tab-status", + "version": "0.1.0", + "description": "Show which Windows Terminal tabs have Claude working (progress ring) and which finished while you were away (bell), even on renamed tabs and split panes", + "author": { + "name": "Zomp" + }, + "homepage": "https://github.com/zompinc/sync-method-generator", + "license": "MIT", + "keywords": ["windows-terminal", "terminal", "notifications", "hooks"], + "hooks": "./hooks/hooks.json" +}