Oleks 1e60bcd53b move hooks.json to plugin-root/hooks/, not under .claude-plugin/
Per https://code.claude.com/docs/en/plugins.md "Convert existing
configurations": the hooks config file goes at
`<plugin-root>/hooks/hooks.json` — sibling to the script files
under hooks/, NOT inside `.claude-plugin/`. v1.0.2 had it at
`.claude-plugin/hooks/hooks.json` (still 0 hooks loaded). v1.0.3
puts it at the actually-documented path.

Final layout:
  .claude-plugin/plugin.json
  hooks/hooks.json            ← event → command map
  hooks/hyprpanel-state.sh    ← the script

`${CLAUDE_PLUGIN_ROOT}` in `command` strings is case-sensitive and
correct.
2026-05-10 22:12:16 +03:00

hyprpanel-state

Claude Code plugin that surfaces per-window claude state in the HyprPanel workspaces bar.

What it does

Wires Claude Code hooks (UserPromptSubmit / PreToolUse / PostToolUse / Notification / Stop / SessionEnd) to a shell script that walks the parent PID chain from itself up through claude → shell → kitty until it finds a PID owned by a Hyprland kitty client, then writes a state token to /tmp/hyprpanel-claude/<address>. The patched HyprPanel bar reads those tokens and tints each kitty's app icon by what claude is doing.

State Color (in bar) Pip indicator Triggered by
active blue UserPromptSubmit / PreToolUse / PostToolUse
waiting orange Notification (suppressed when state is done/scheduled)
done green Stop (no ScheduleWakeup in last assistant turn)
scheduled cyan Stop (last turn used ScheduleWakeup / CronCreate)
(cleared) default SessionEnd

A blink-decay opacity animation fires on (re-)assignment of waiting, scheduled, done — and on the agent-idle "remember me" Notification while already done. Sticky-done means the green check survives idle pings.

Sidecar files

  • /tmp/hyprpanel-claude/<addr> — current state token
  • /tmp/hyprpanel-claude/.<addr>.tools — tool-in-flight counter (incremented on PreToolUse, decremented on PostToolUse, flock-protected for parallel tool fan-outs)
  • /tmp/hyprpanel-claude/.<addr>.ping — touch-only sidecar; mtime advance triggers the bar's blink animation

Bar side

The visuals live in HyprPanel and are not owned by this plugin. Install / patch HyprPanel separately — see ~/projects/hyprpanel-dev/PROMPT.md for the workspaces module changes that read these state files.

Dependencies

  • hyprctl (Hyprland)
  • jq
  • flock

All standard on a NixOS desktop.

Install

claude plugin add https://claude-plugins.oleks.space/plugins/hyprpanel-state.git

Once enabled, the hook chain wires itself up — no ~/.claude/settings.json edits required. Claude sessions started after the install will fire hooks into the script; pre-existing sessions need to restart to pick them up.

License

MIT

S
Description
Claude Code plugin: surfaces per-window claude state in the HyprPanel workspaces bar via lifecycle hooks. Each kitty's icon is tinted by what claude is doing — active (blue), waiting (orange ●), done (green ✔), scheduled for /loop wakeup (cyan ⧗). Hooks-only; bar visuals live in the patched HyprPanel.
Readme
47 KiB
Languages
Shell 100%