Skip to content

v1.36.0

Choose a tag to compare

@github-actions github-actions released this 25 Sep 21:51
· 10 commits to main since this release

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 −R on 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.
  • enter on 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 d on 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.
  • h folds 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. Pressing j/k while
    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 d and D D refuse 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 F is the one forced delete, and
    its confirmation names what will be lost.
  • dg wt remove without --force gets the same check.
  • A removal deletes the branch git reports for the worktree. It used to pass
    the flattened folder name, so a branch like feat/login was never deleted
    (git looked for feat-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.
  • z no 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