Repository navigation
v0.28.0
A release about safety and speed: abort and undo now protect your uncommitted work, and the Git layer was rebuilt around batched reads and writes so most commands spawn far fewer git processes.
Highlights
abortrestores uncommitted work and only undoes its own command. When a haltedmodify,create,absorb, orsplitis aborted, the work it consumed comes back with the original staged/unstaged split, and abort now rolls back only that command's own snapshot, never an unrelated newer one.undorestores your working tree too. Undo now brings back captured uncommitted and untracked changes along with refs and metadata, and undo history is kept per worktree.- Batched Git layer. Revisions, commits, diffs, metadata reads/writes, restack planning, and worktree ownership lookups now go through batched APIs, and the quadratic stack-graph traversal is gone. Large stacks see noticeably fewer
gitsubprocesses; benchmarks are indocs/benchmarks*.md. - Dashboard search. The web dashboard header can now search stacks by title, scope, branch name, PR title, and more, with a streamlined layout.
getrespects other worktrees.getskips branches checked out in another worktree (and reports them) and never rebases a re-anchored branch whose landed-parent anchor is unknown.
Behavior changes
stackit abortonly rolls back the halted command's own snapshot. A conflict paused by v0.27.1 (or a merge conflict) carries no bound snapshot, so abort unwinds Git but leaves branches as they are; usestackit undoto roll back further. Finish or abort any in-flight conflict before upgrading to avoid this.stackit undorefuses to run while you have tracked uncommitted changes; commit or stash them first.- Remote metadata updates for multiple branches are now applied atomically. A single corrupt local metadata record fails the batch (for example,
submitreports "failed to update metadata") instead of being silently replaced with empty metadata.
Features
- Added dashboard search and refined the dashboard layout, including repository search in the header (#1735, #1736).
Fixes
- Restored uncommitted work on abort and bound abort to the command that halted (#1674).
- Kept stale continuation state from hijacking abort (#1800).
getnow skips branches held by another worktree and never rebases an unanchored branch (#1730).- Never reused a stale metadata compare-and-swap expectation, and dropped stale expectations after in-process ref moves (#1812, #1802).
- Failed closed on malformed worktree registrations (#1801).
- Ignored
log.showSignaturewhen parsing Git output (#1799). - Gated
info --patchon its own revision error (#1803). - Preserved explicit zero hunk counts when parsing diff headers (#1807).
- Made PR merge/CI polling loops respect context cancellation (#1795).
- Closed the editor temp file on write error to avoid an fd leak (#1787).
- Corrected benchmark timing and exercised real mutations (#1783).
Performance
- Removed quadratic work from stack graph traversal (#1744).
- Batched worktree ownership lookups instead of per-branch Git reads (#1754).
- Batched rebase replay metadata reads (#1769).
- Batched revision lookups for
tree --short --shas(#1781). - Batched commit history and restack planning reads (#1784).
- Batched metadata writes in remote sync into a single commit, and loaded the remote metadata cache with one batched object read (#1791).
- Captured untracked files only when a command stages them (#1797).
- Avoided duplicate commit reads when generating the default PR title and body (#1798).
Refactors
- Consolidated the internal Git API around batched, plural operations: one revision read API, batched commit author/date and metadata reads, plural blob writes and ref mutations, consolidated fetch-merge and remote deletion, and one push API with per-branch lease policies (#1771, #1772, #1773, #1774, #1775, #1776, #1777, #1778).
- Batched metadata transactions through a dedicated store (#1780).
- Modeled batched reads and restack decisions with types (#1785).
- Batched PR info upserts during PR cleanup (#1767).
- Replaced boolean parameters with typed modes across engine, submit, worktree, and freeze code (#1761, #1764, #1765, #1766, #1806).
- Dropped unused context parameters from rerere (#1762, #1768).
Docs
- Updated rules and help text for the internal Git API refactor (#1796).
Chore
- Added a CLI benchmark suite (#1782).
- Removed dead code in the combiner and metadata store (#1790).
- Updated Go and web dependencies, including go-github v92 (#1763, #1788, #1808, #1809).
- Added test coverage for
/viewremote status and forgetacross both worktree kinds and all merge methods (#1690, #1810).
What's Changed
- perf: remove quadratic work from stack graph traversal by @jonnii in #1744
- perf: batch worktree ownership lookups instead of per-branch git reads by @jonnii in #1754
- test(api): pin /view remote status to one ls-remote across stacks by @jonnii in #1690
- fix(get): skip branches held elsewhere, never rebase an unanchored one by @jonnii in #1730
- feat: add dashboard search and refine the layout by @jonnii in #1735
- feat: streamline dashboard layout and repository search by @jonnii in #1736
- refactor(engine): replace rebuildInternal bool with typed refresh mode by @jonnii in #1761
- chore: update frontend and backend dependencies to latest by @jonnii in #1763
- refactor(rerere): drop unused ctx parameter from ensureEnabled by @jonnii in #1762
- refactor(worktree): replace unclear rollback bool with ChildRestoreMode by @jonnii in #1766
- refactor(rerere): drop unused ctx parameter from public EnsureEnabled by @jonnii in #1768
- refactor: batch PR info upserts during PR cleanup by @jonnii in #1767
- perf: keep missing revision lookups batched by @jonnii in #1770
- perf: batch rebase replay metadata reads by @jonnii in #1769
- refactor: define consistent batched revision reads by @jonnii in #1771
- Merging 7 PRs by @jonnii in #1779
- refactor: use one Git revision read API by @jonnii in #1772
- refactor: batch commit author and date reads by default by @jonnii in #1773
- refactor: use batched metadata reads for every caller by @jonnii in #1774
- refactor: expose only plural blob writes by @jonnii in #1775
- refactor: consolidate Git ref mutations into plural APIs by @jonnii in #1776
- refactor: consolidate fetch merge and remote deletion APIs by @jonnii in #1777
- refactor: use one plural push API with per-branch lease policies by @jonnii in #1778
- refactor: batch metadata transactions through a dedicated store by @jonnii in #1780
- chore: add CLI benchmark suite by @jonnii in #1782
- chore: update backend and frontend dependencies to latest by @jonnii in #1788
- fix(editor): close temp file on write error to avoid fd leak by @jonnii in #1787
- Merging 3 PRs by @jonnii in #1789
- fix: correct benchmark timing and exercise real mutations by @jonnii in #1783
- perf: batch commit history and restack planning reads by @jonnii in #1784
- refactor: model batched reads and restack decisions with types by @jonnii in #1785
- refactor(submit): replace bool params on pad with typed nameStyle by @jonnii in #1764
- chore: remove dead code in combiner and metadata store by @jonnii in #1790
- refactor(worktree): replace bool param on ensureWarmStartParents with typed mode by @jonnii in #1765
- fix: restore uncommitted work and bind abort to its command by @jonnii in #1674
- perf: batch revision lookups for tree --short --shas by @jonnii in #1781
- docs: update rules and help text for the internal/git API refactor by @jonnii in #1796
- perf: capture untracked files only when a command stages them by @jonnii in #1797
- Merging 5 PRs by @jonnii in #1804
- fix: ignore log.showSignature when parsing git output by @jonnii in #1799
- fix: keep stale continuation state from hijacking abort by @jonnii in #1800
- fix: fail closed on malformed worktree registrations by @jonnii in #1801
- fix: drop stale CAS expectation after in-process ref moves by @jonnii in #1802
- fix: gate info --patch on its own revision error by @jonnii in #1803
- chore: update web app dependencies to latest by @jonnii in #1809
- fix: preserve explicit zero hunk counts in diff header parsing by @jonnii in #1807
- refactor: replace SetFrozen bool parameter with typed FreezeState by @jonnii in #1806
- perf: avoid duplicate commit reads when generating default PR title and body by @jonnii in #1798
- chore: update Go dependencies to latest by @jonnii in #1808
- fix: make PR merge/CI polling loops respect context cancellation by @jonnii in #1795
- fix: never reuse a stale metadata CAS expectation by @jonnii in #1812
- test: cover both worktree kinds and all merge methods in get by @jonnii in #1810
- perf: batch metadata writes in remote sync into a single commit by @jonnii in #1791
Full Changelog: v0.27.1...v0.28.0