aboutsummaryrefslogtreecommitdiff
path: root/ROADMAP.md
AgeCommit message (Collapse)Author
47 hoursreadme: lead with what dingger shows, with real renders of made-up agents; ↵HEADmasterIgor Soarez
move the details to docs/reference.md; dingger status: fit the agent column to its longest name
7 dayspi: a failed run says so: a 'failed' alert with the error, and the error in ↵Igor Soarez
red until seen
7 dayspi: a dialog during a run is blocked, and a cancelled run is idle, not doneIgor Soarez
11 daysshow what pi agents cost today, this week and this month, counting forked ↵Igor Soarez
replies once
13 daysmark forgotten drafts in pi agents' input boxes, and keep them across a ↵Igor Soarez
crash or restore
13 daysreload pi agents on an old extension: versioned extension, control socket, ↵Igor Soarez
menu item and reload-agents
13 daysroadmap: cost, extension version, conversation search, uncommitted work, draftsIgor Soarez
13 daysroadmap: park 'say what happened' with its mockup's designIgor Soarez
14 daysroadmap: ideas beyond the current listIgor Soarez
2026-10-27docs: mark as unread does not work from inside claude codeIgor Soarez
2026-10-27roadmap: the extended-keys warning is goneIgor Soarez
2026-10-25roadmap: pi's status reports, dialogs, cancelled and failed runs, extended-keysIgor Soarez
items from pi 1.0.4 to 1.4.0 worth using, and from testing pi 1.4. preview in agent search moves last.
2026-10-23raise the terminal window that holds the tmux clientIgor Soarez
a jump (any click, a shortcut, search) activated the terminal app, which raised whichever window was used last. now: - the client: the named one (a status-line click), else one already on a session holding the agent's window (several terminal windows can show one session; it shows the agent without switching, and keeps its own session in a session group), else any; the focused one first, then the one used last (its last input or focus). - Ghostty (1.3+, scriptable by terminal id, not by tty): dingger learns which terminal holds each client when it gains focus. tmux's client-focus-in hook runs `dingger terminal focused`, which asks Ghostty for its focused terminal and records it in @dingger_terminal_<tty>, but only if the client is still focused once Ghostty answered (a fast switch must not pair the wrong terminal); a terminal holds one client, so an older pairing with it is dropped. `focus` raises the exact terminal (window, tab, split) through `tmux run-shell`: Apple Events from the tmux server count as Ghostty's own, so no permission prompt. a terminal that is gone is forgotten and the app activated, as without a pairing. - in a hook, #{client_name} can be another client (the previous event's); the snippet's hook uses #{hook_client}. e2e step 20: two nested clients on one session, focused by typing focus reports into their outer panes, a fake osascript as Ghostty, a fake open (tests never activate a real app); it loads the snippet's own hook line. each rule has a negative control that fails.
2026-10-23restore Claude Code agents in their own sessionsIgor Soarez
`dingger install claude` adds a SessionStart hook to Claude's settings (every other key and hook kept, in order; the original backed up; written through a symlink; installing again changes nothing). The hook is `dingger hook claude`: it reports the session's transcript for its tmux pane, prints nothing (Claude adds SessionStart output to the conversation) and always exits 0. Claude's state still comes from its screen. restore types `claude --resume <id>` in the directory the session ran in (elsewhere, Claude moves the conversation there). it resumes an agent only when its session file exists: a Claude session that never got a message has no transcript, and `--resume` fails ("No conversation found"). the snapshot now keeps an agent's command line too, so such a pane gets it retyped instead of nothing. - the hook receiver takes a report without a state: only the session. - a report that arrives after the watcher listed the panes is not dropped as "agent gone": Claude reports once, as it starts. - serde_json preserve_order (indexmap is already a dependency, via toml). e2e step 18: install against a settings file like a real one, a fake claude running the exact installed hook command, resume by id, retype without a transcript, the resumed agent reporting again. a server that restore starts now gets the test's plain shells: it got the user's login shell, whose profile put the real claude first, which started (stuck at its trust dialog) during development. every test restore now checks that no real pi or claude runs in a test pane.
2026-10-23restore, step 3: offer it in the panel, menu, and status lineIgor Soarez
when tmux stops (and its sessions are missing from the running server, or no server runs), the daemon publishes the restore offer: offer.json for the menu bar app and @dingger_restore for the status line, withdrawn once restored or dismissed. - panel: a first row "↺ Restore 9 sessions · 22 agents" with when it was saved and how many agents were mid-turn; clicking restores, "Not now" dismisses. an offer shows the panel like a waiting agent; off stays off. - menu: the offer on top; restore all, one session, or not now. - status line: a clickable blue ↺N before the clock. - restore runs through the user's login shell, as a terminal starts tmux, so restored panes get a real environment, not launchd's; --report writes restore.log and notifies a summary. restore --dismiss. - commands log only warnings by default; SIGPIPE ends them quietly. e2e: the offer through the real menu bar binary, the summary notification, the offer clearing, a restore with no tmux running, and not now staying dismissed when a terminal starts tmux. the second test daemon is started directly (it leaked through a function's $! before, and dozens of leaked daemons fought over the test socket and loaded the machine); each run uses its own socket and checks its daemons stop.
2026-10-23roadmap: restore, raise the right window, search previewIgor Soarez