aboutsummaryrefslogtreecommitdiff
path: root/tests
AgeCommit message (Collapse)Author
2026-10-22agent search: spotlight-style fuzzy finder on ctrl+opt+cmd+shift+uIgor Soarez
a centered, non-activating key panel that lists every agent and jumps to the chosen one through the same dingger focus path as a row click. - fzf-style matching: each word must match one of name, session, window, harness, status, or directory, letters in order; the best alignment wins (word starts and consecutive runs score higher), matched title letters are highlighted. - empty query keeps the menu's order, so enter jumps to the top waiting agent. - the selection follows the agent, not the position, as states change; the list scrolls to keep it visible. - keys: arrows, ctrl+n/p, ctrl+j/k, enter, esc, ctrl+u; the shortcut again or clicking elsewhere closes it. - search_hotkey setting; an unedited config file is upgraded. menu item "Search Agents...". rows carry the pane's directory. - --print-search and --snapshot-search debug flags; the panel's background and snapshot code are shared. selftest covers matching, ranking, highlighting, and selection; e2e step 15 checks queries through the real binary (fails when search only looks at titles). e2e resolves relative binary paths, which tmux hooks need.
2026-10-20fix clicks from the menu bar app: find tmux without homebrew on PATHIgor Soarez
launchd starts the menu bar app with PATH=/usr/bin:/bin:/usr/sbin:/sbin, so the `dingger focus` it runs for every click (panel rows, menu rows, the jump shortcut) could not find homebrew's tmux and failed with a misleading "no tmux client attached"; the app discarded the error. dingger now finds tmux on PATH or in the usual install locations (DINGGER_TMUX overrides), reports a missing tmux as such, and the app logs failed jumps. also: panel rows own every click inside them (labels took the clicks and counted as window-drag background). e2e step 14 repeats the menu bar row click and dingger focus under launchd's environment; both fail with the previous binaries.
2026-10-20panel: readable everywhere, compact/full toggle, change-driven; jump shortcutIgor Soarez
- 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.
2026-10-20floating panel: always-on-top agent HUD with a global shortcutIgor Soarez
a non-activating HUD panel (every Space, over full-screen apps, never takes focus) listing the agents waiting for you, with working and idle summarized on one line; rows jump to the agent, drag moves the panel and it remembers its place. modes: when agents are waiting (default), always, off; ctrl+opt+ cmd+e shows or hides it on top of the mode, and a manual hide lasts until another agent starts waiting. the shortcut is a carbon hotkey (no accessibility permission; clashes are reported in the menu) configured in ~/.config/dingger/config.toml, reloaded on save. the menu bar app is split into model, panel, hotkey and main. tested: --selftest checks the visibility rules (it fails if a newly waiting agent no longer re-shows a dismissed panel); e2e step 13 checks the panel content through the real binary.
2026-10-20menu rows lead with the agent's session name; harness and place move belowIgor Soarez
herdr's sidebar shows the session name in place of the harness label (via the user's herdr-session-name extension). dingger reads it from the title pi already sets ("π - <name> - <dir>"); other agents use herdr's terminal_title_stripped rule, and claude's default "Claude Code" title or tmux's host-name title count as no name. the daemon stores it as @agent_name for every surface. menu rows: colored status symbol + name as the title (the harness, dimmed, only when unnamed), and a native subtitle "session · window · harness", plus how long done/blocked agents have been waiting; one separator between agents waiting for you and the rest. dingger status shows the same.
2026-10-20pi extension: identify the pane from TMUX_PANEIgor Soarez
the extension asked tmux for "the current pane", which resolves to the session's active pane, not the pane pi runs in, so agents in background windows reported their state onto another pane. tmux sets TMUX_PANE for every process it starts in a pane; use it. e2e step 12 loads the shipped extension with a fake pi from a pane that is not its session's active pane and asserts the report lands there; it fails against the previous extension. hook reports log at info again.
2026-10-20rebuild the status model as herdr's state machine, event-driven and testedIgor Soarez
the seen logic was inverted: first observations were marked done and real completions idle, so the menu showed teal for agents that did nothing and green for agents that finished, and attending changed nothing visible. - watcher::advance is herdr's apply_pane_state_change + mark_active_tab_seen as a pure function, unit-tested against herdr's own cases; attendance is window-level like herdr's active tab - hook reports are events applied in order, so a turn shorter than a poll is still a completion - event-driven: hook reports, dingger focus, and tmux focus hooks wake the watcher; notifications are delivered off-thread (the macos call blocked ticks for 2+ seconds) after the pane options are written - all per-pane state persists in tmux pane options, so restarts and deploys lose nothing, including the authoritative hook state - every click goes through dingger focus: the menu bar shells out to it and the status-line binding runs it; it picks the right client, skips the window already shown, and activates the terminal app hosting the client - the ready queue is ordered like the menu (blocked first, then oldest done) - menu bar and tmux segment render herdr's symbols in herdr's palette - tests/e2e.sh: 60 assertions against an isolated tmux server with a real client, a 30s poll interval, and a slow fake notifier