all repos — dingger @ eed9c9c1141e118e43b0055f935dd891d89bebd6

Watches the AI coding agents in your tmux panes on macOS and tells you which need you, from the menu bar, a floating panel, the status line and notifications; jumps to them, and restores tmux sessions and agents after a crash

panel: readable everywhere, compact/full toggle, change-driven; jump shortcut

- contrast: the summary used attributed-string colors (never vibrant) and
  the subtitles a vibrant system color, so they blended differently over
  light and dark desktops. the panel now uses herdr's mocha colors
  explicitly over a dark tint, identical on any background.
- layout: compact in "when agents are waiting"; in "always" a show all /
  show less toggle switches to the full list (waiting, separator, rest).
- rows are single-line with a trailing ellipsis instead of wrapping.
- render only when the content changes, and log each render, instead of
  rebuilding every view every second.
- --snapshot-panel renders the real panel offscreen over white and black
  after a different first render (stale content would show).
- jump shortcut ctrl+opt+cmd+u (jump_hotkey) runs dingger focus; shortcuts
  are registered by id. an unedited first config file is upgraded.

selftest covers the layout rules and content; e2e step 13 checks the full
list, its separator, and the toggle labels.
Igor Soarez igor@soarez.org
Tue, 20 Oct 2026 14:51:07 +0300
commit

eed9c9c1141e118e43b0055f935dd891d89bebd6

parent

0f8438547e50e10b3c09f17356b1d88b93718b79

6 files changed, 478 insertions(+), 172 deletions(-)

jump to
M README.md → README.md

@@ -44,10 +44,14 @@ waiting for you (blocked, done) and summarizes the rest

(`◐ 2 working · ○ 15 idle`); click a row to jump there, drag to move it. **⌃⌥⌘E** shows or hides it from anywhere. Modes (menu bar, "Show Panel Automatically"): *When agents are waiting* (default; appears when - something is blocked or done, hides when you have attended to everything), - *Always*, *Off*. Hiding it with the shortcut lasts until another agent - starts waiting. Change the shortcut in `~/.config/dingger/config.toml` - (menu bar, Settings…); it reloads when you save. + something is blocked or done, hides when you have attended to everything; + compact), *Always* (with a "Show all / Show less" toggle for the full + list), *Off*. Hiding it with the shortcut lasts until another agent starts + waiting. The panel is always dark, in herdr's palette, so it reads the same + over any desktop. +- **Jump shortcut**: **⌃⌥⌘U** jumps to the top waiting agent from anywhere, + like clicking the tmux status line. Both shortcuts live in + `~/.config/dingger/config.toml` (menu bar, Settings…), reloaded on save. - **tmux status line** (`packaging/tmux/dingger.tmux`): the same summary after the clock. Clicking it jumps to the top waiting agent (the menu's top row), skipping the window you already look at.

@@ -104,8 +108,8 @@ `tests/e2e.sh` starts its own tmux server, its own daemon (polling only every

30 s, so everything asserted must arrive through events), fake agents driven over the hook protocol, and a real tmux client whose focus it controls. It asserts every status transition, attendance by navigation, both click paths -(including the real menu bar binary), the floating panel's visibility rules -and content, the status-line segment, latency with a +(including the real menu bar binary), the floating panel's visibility and +layout rules and content (compact, full, toggle), the status-line segment, latency with a deliberately slow notifier, and state surviving a daemon restart. It never touches your tmux server.
M tests/e2e.sh → tests/e2e.sh

@@ -292,6 +292,13 @@ expect "panel summarizes the rest" "mb --print-panel | tail -1" "○ 3 idle"

DINGGER_TMUX_SOCKET="$SOCK" "$DINGGER" focus --client "$CLIENT" --pane "$A2" expect "A2 idle after the jump" "opt $A2 @agent_state" idle expect "panel with nothing waiting" "mb --print-panel" "Nothing waiting · ○ 4 idle" + expect "full list: every agent, then the summary with the toggle" \ + "mb --print-panel --full | cut -f1,2 | tr '\t\n' '|;'" \ + "○ idle|Deploy the widget;○ idle|pi;○ idle|Review PR 42;○ idle|pi;Nothing waiting · ○ 4 idle|[Show less ▴];" + expect "compact in Always mode offers 'Show all'" "mb --print-panel --toggle" "Nothing waiting · ○ 4 idle [Show all ▾]" + hook "$A1" working; hook "$A1" idle + expect "A1 done" "opt $A1 @agent_state" done + expect "full list separates waiting from the rest" "mb --print-panel --full | sed -n 2p" "---" else fail "menu bar binary not found at $MENUBAR" fi