v1.36.0
feat(ws): redraw the dashboard, give each repo its session rows, and make delete safe
dg ws is cleaner to read, remembers how you left it, shows each repo's tmux
sessions as rows you can switch to, rename and close, and can no longer delete
a worktree's unsaved work by accident.
Dashboard look
- A flatter layout: repo headers are just the bold name, worktree rows drop
the branch glyph and tree connectors, and standalone sessions sit under a
dim "sessions" header. - Every worktree row shows its changes as a green/red
+A −Ron the right,
computed on the 30-second refresh (ADR-0051). - The selected row gets a soft background and a yellow
▌edge instead of a
solid block, and keeps its own glyph and diffstat colors. - The hint bar is down to five keys; everything else is under
?.
Sessions
- Each repo's tmux sessions are rows under the repo, showing the session's
name (ADR-0052). A session holding nothing but worktree windows gets no row,
since each of those windows already has its own. enteron a session row switches to its plain window. This used to fail
with "can't find pane" when the window's name had a dot, such as the
"2.1.282" that Claude Code's version puts in a window title.$renames a session. New worktree windows follow the renamed session
instead of starting a second one under the old name.d don a repo's session row closes only that session's plain windows; the
repo's worktree windows and the session stay. On a standalone session it
kills the session, as before.hfolds the repo group from a session row too.
Opening and reopening
- Folds and the left-pane width are saved across reopens (ADR-0050).
- The dashboard opens on the row you came from: the worktree row from a
worktree window, the session row from a plain window. Pressingj/kwhile
it is still loading is no longer undone a moment later.
Deleting a worktree never loses work unless forced (ADR-0053)
A dashboard d d could delete a worktree with uncommitted changes: the
dashboard always removed with force, and every removal ran git branch -D.
d dandD Drefuse when the worktree has uncommitted changes (untracked
files included) or commits that no remote branch and no local default
branch contain, and say what is at risk.F Fis the one forced delete, and
its confirmation names what will be lost.dg wt removewithout--forcegets the same check.- A removal deletes the branch git reports for the worktree. It used to pass
the flattened folder name, so a branch likefeat/loginwas never deleted
(git looked forfeat-login), or the wrong branch could be.
Fixes
- The cursor no longer jumps to another row when the list refreshes, a filter
changes, or a fold happens. - Folding one worktree no longer folds another whose tmux window name happens
to collide. zno longer needs two presses after folding repos by hand.- The diff pane no longer shows the previous row's diff, or its scroll
position, after moving to a new row. Long diffs are cut at a line boundary.
Behavior changes: dg wt remove without --force now refuses a worktree
whose branch has unpushed commits, where it used to delete the branch
silently. In dg ws, d d and D D refuse in the same cases, and F F is
the new forced delete.
Full Changelog: v1.35.3...v1.36.0