Skip to content

v0.22.0

Choose a tag to compare

0.22.0 (2026-10-19)

Features

  • actions: the robot, the pull request and the review writes run as operations: once, the other one waits (1df098e)
  • bd: bd lease adopt --move moves the adopted worktrees into the pool directory with git worktree move (c2a305b)
  • bd: bd lease checks out a slot with one worker per core, unless the repository sets checkout.workers (43a428e)
  • bd: bd lease keeps a pool of worktrees whose state is the authority, so a get reuses a free slot whatever master did (64e0f9c)
  • bd: bd lease return stops the Bazel servers of the slot, which serve only it, and keeps their output bases (9f242da)
  • bd: bd sync, bd status and bd commits say which commits resolved a conflict of git by words (90cf21c)
  • bd: bd update names the commits that resolved by words, and every round names the rounds that resolved themselves (2bb64a4)
  • bd: on macOS bd lease adds a new slot as an APFS clone of a free slot or of the source, then checks out the diff (d1922ec)
  • diff: each inner range of a 2-way block has the kind of its change and marks its empty side, as IntelliJ types a fragment (a109564)
  • diff: git-ops resolves a conflicting cherry-pick by its words, all or nothing, and gives the files and the tree (27d0139)
  • diff: Inline strikes its deleted parts through, so they read as deleted without their colour (c0ea327)
  • diff: text-diff composes the result of a merge on the bytes of its texts, with the line ends kept (68aab7e)
  • diff: the commit row says "Resolved N conflicts by words" and shows what the sync committed (4d9e108)
  • diff: the diff looks as IntelliJ's in Islands Light and Islands Dark, with ligatures on by default (628c74b)
  • diff: the divider of Split drags, as IntelliJ's DiffSplitter, and a double click makes the sides equal (693f908)
  • diff: the merges of a resolved copy name the blob that the sync committed for each file (bf6afdc)
  • diff: the setting branchdeck.resolveByWords, the word_resolution store, and the resolve mode in the conflict keys (5a1a60c)
  • diff: the sync commits a conflict of git that its words resolve, and the note and the event say so (8897d50)
  • diff: Update Project and the rounds of bd update resolve a conflict of git by words, as the sync does (3c7e7b7)
  • diff: Update Project applies an update whose conflicts resolve by words and says so in the tooltip and the toast (3386854)
  • keys: P, D, O and M run the item of the branch menu they are the hints of, a disabled one says why (b0a1f6d)
  • review: each file of a review is a card, as in IntelliJ's combined diff, its sticky header the top of the card (01b6c9a)
  • review: the sidebar of a review starts at 19rem, and F or its button hides it so the diffs take the window (c372bbd)
  • settings: Diffs & Merge turns the resolve by words on and off for every repository, in the global git config (449da7f)
  • settings: set_repository_config writes a key to the global git config too, for the Diffs & Merge page (5afdde8)
  • settings: the diffs get a page of their own, Diffs & Merge, with a row and a description for each setting (28b3ebf)
  • update: Update Project is a rewrite of the repository: it waits for a running regroup, and the rewrites for it (b863f6c)

Bug Fixes

  • bd: a resolve session is state version 2, and bd reads the version before the other fields (e6be824)
  • bd: bd lease return decides unlanded work by a dry run of the pick onto the source branch, not by reachability alone (4e98d11)
  • bd: bd lease return signals a Bazel server only while its pid still has the start time of the scan (e461b59)
  • bd: the lease code and its tests build on Windows and the pool checkout test expects a worktree add where no clone is (bcadc73)
  • check: a restack of the fix keeps the parent of a stacked leaf and replaces the parent its plan gives (6e22cbd)
  • check: bd check --fix tries the direct restack first, stops at its budget and prints each trial (d9f52f9)
  • diff: the diffs that mount take no focus from the trigger of an open menu, so the "⋯" of the commit heading stays open (36cbe14)
  • e2e: a merge test merges only once the page has the pull requests the merge reads (e876fc3)
  • e2e: a test merges a running robot only once the page shows it running (2852e23)
  • e2e: the menu test of the review window opens the next menu once the one before is gone (1dc0053)
  • e2e: the strikethrough test of Inline reads the styles of the rows in one call (7bf03fb)
  • e2e: the sync of a test waits for the unassigned commits card, which moves the table down (164905e)
  • lock: the locked error names the holder of the repository lock, its command, pid and how long it holds it (f9db549)
  • menu: the branch menu follows its stores while it is mounted; a disabled submenu and a busy "⋯" say why (a4f776e)
  • pick: a commit with the patch id of a branch commit is left out before the replay, the rest replays in segments (fff38e4)
  • pick: a picked commit whose branch is not built on what it needs is named, with the plan that moves it (1820b71)
  • review: Request Review… checks the code owners of a readiness that comes after it opened (a04b0a1)
  • safe-push: --check holds the repository lock for its sync only and builds only what lands (3ca1df1)
  • stack: a (parent/leaf) prefix that stacks a root group is reported as reparented, conflicting parents name the restack (6ce0ba3)
  • stack: the "⋯" of an island follows its stores while it is open, the pull requests that load after the sync too (6216b03)
  • symbols: a Rust .collect() is no use of a removed fn collect, and a crate uses another's items only through its name (82a43cb)
  • symbols: the crate of an item a commit deletes with its module is known, so another crate's record::collect is no use of it (5fc0980)
  • sync: each commit chain writes on a temporary ref of its own and deletes it after a checkpoint (d743156)
  • update: the bd conflict prompt leaves the protocol to bd: hint, session.next and retryable instead of restated exit codes (7685542)