Skip to content

Releases: stbenjam/arbor

Arbor v0.4.1 (Alpha) — Names for SSH hosts, and ignored files grouped by whether they need a look

Choose a tag to compare

@not-stbenjam not-stbenjam released this 07 Oct 01:13

Two small things asked for after 0.4.0.

Hosts

  • An SSH host can have a name of your own. Adding one has an optional Display name; leave it blank and the SSH address is used, as before. In Manage hosts… a name can be changed or cleared, and the new name shows at once without anything being scanned again. Only what is shown changes: the address is still what SSH connects to. Statistics and Recently deleted show the name too.

Ignored files considered safe to delete

  • The setting is named for what it does, and folds away like Folders to skip, with a count of its rules.
  • In the list of what a deletion discards, ignored files are in two groups: Needs review for those no rule covers, and Considered safe by your settings after everything else. The mark on each entry is gone.

Arbor v0.4.0 (Alpha) — Short questions, files one click away, safe ignored files, and a tidier window

Choose a tag to compare

@not-stbenjam not-stbenjam released this 06 Oct 17:09

This release is a round of polish from daily use: far fewer words when deleting, the files a deletion discards one click away, ignored files that are safe to lose no longer in the way, and a tidier window.

Heads-up: what arbor clean --yes deletes has changed

Ignored files that any install or build would make again (node_modules, .venv, __pycache__, tool caches, dist, build, target and the like) no longer keep a merged worktree from being recommended, in the app and on the command line alike. So arbor clean --yes now deletes merged worktrees whose only ignored files are covered by those rules, without --force. Pass --no-default-safe-ignored for the old behaviour. These files are deleted for good; Undo and arbor restore do not bring them back.

Ignored files that are safe to delete

  • A list of rules, in Settings under Ignored files considered safe and with --safe-ignored RULE on the command line, names ignored files that are safe to lose. A worktree whose ignored files are all covered is treated as clean: it is not asked about, and when merged it is recommended, marked Merged · Ignored files marked safe.
  • The defaults are dependencies, caches and build output. Nothing that commonly holds secrets or hand-made work is in them: no .env, editor folders, databases or key files.
  • Only ignored files are waived. A Git repository inside a covered folder still counts as one, and uncommitted changes still count.
  • The files list marks each ignored entry as marked safe or not, so it is plain what is keeping a worktree out of Recommended.

Deleting

  • The questions are a fraction of their length. Deleting a worktree with ignored files used to take about seventy words to ask; it now asks "Delete “old-build” and its ignored files?" and says its branch and commits are kept. Anything that truly cannot be recovered, such as a repository inside the folder, still has a line of its own.
  • A question agrees to what it names and nothing else. If a worktree turns out to hold something the question did not mention, a file made since the list was read for instance, it is left alone, its row is brought up to date, and the next question names it.
  • The files are one click away. A row's state ("Ignored files", "3 changed files") is a link to the list of what deleting would discard. The question has a Show Files… button, the list opened from it has Delete… to carry on, and the review of several worktrees has Show files beside each loss.
  • The list shows its progress while it loads: what it is doing and how far along, with a bar that fills only where there is a real total. Closing it stops the work.

The window

  • A list more than an hour old says so above its rows and offers Refresh, when the app is opened, when the window comes back to the front, and while it sits open. It was a day.
  • Sort, State and Last active are boxed, so they read as menus.
  • The hosts control in the sidebar is a dropdown: All hosts, This computer and each SSH host, with Manage hosts… below. "Folders on all hosts" is gone from the bar above the list.
  • The theme button switches between light and dark. System is still a choice in Settings.
  • The sidebar can be resized by dragging its edge (double-click to reset) and hidden with its button, the View menu or Ctrl/Cmd+B. Both are remembered.
  • Clicking outside any dialog closes it, as Escape does.
  • Every icon is now from Lucide, in place of ones drawn by hand. The scan options button is a gear.

Also

  • The review of several worktrees no longer says a deleted worktree cannot be brought back, which stopped being true with Undo in 0.3.0.

Arbor v0.3.0 (Alpha) — Homebrew, Undo for deletions, what a worktree holds, and filters

Choose a tag to compare

@not-stbenjam not-stbenjam released this 06 Oct 12:30

This release adds the four things most missed in 0.2.0: installing with Homebrew, seeing what a worktree would lose before deleting it, getting a deleted worktree back, and narrowing the list by state and age. Each was reviewed again before it went out, and what the reviews found is fixed here.

Install with Homebrew

brew install stbenjam/arbor/arbor          # command line: macOS and Linux
brew install --cask stbenjam/arbor/arbor   # desktop app: macOS 13 or newer

The tap is stbenjam/homebrew-arbor. It follows new releases on its own, and both recipes are installed and tested in CI on every change. The app is still not signed with an Apple Developer ID, so macOS asks before opening it the first time.

Putting a deleted worktree back

Deleting a worktree has always kept its branch, so every commit is still there. Arbor now puts the worktree back for you.

  • Undo on the notice that follows a deletion, for 12 seconds, puts each worktree back where it was, on its branch.
  • Recently deleted, in the sidebar and the File menu, lists what the app deleted in the last 30 days, on this computer and on SSH hosts, with a Restore for each. It is kept across restarts.
  • arbor restore PATH --repo REPOSITORY --branch BRANCH from the terminal, and remove and clean print that command for what they just deleted.
  • Files that were never committed do not come back, and Arbor says so when it restores a worktree that had some.
  • Nothing is overwritten: the path must not exist. Hooks are not run, nothing is fetched, and a repository that names its own filter programs is not restored; the Git command to run yourself is given instead.

What a worktree holds

  • Show what it holds… in a row's menu, and Show files in a deletion review, list what deleting that worktree would discard: uncommitted changes, ignored files, repositories inside it, and what Git keeps for that worktree alone, largest first under a heading for each. It works over SSH.
  • arbor files PATH gives the same list in the terminal, and --json for scripts.
  • An ignored folder is one line with its size and file count. A size is marked "at least" when adding it up took too long or a folder could not be read, and the list says when it could not look through everything.

Filters

  • State and Last active, beside Sort, narrow the list to one state (Merged, Changed files, Ignored files, Locked, Not merged and the rest, each with its count) and to worktrees not used for a week, a month, three months or a year.
  • They work together with the search and the Recommended view, and keep what is ticked.

Also

  • The command printed for putting a worktree back, and the one for cleaning a folder, are now exact for paths with a line break or other unprintable character in them.

Tests

  • 91 scenarios drive the real application, and CI now also installs Arbor with Homebrew on macOS and Linux.

Arbor v0.2.0 (Alpha) — Squash merges recognised, every deletion shown first, and a stress-tested core

Choose a tag to compare

@not-stbenjam not-stbenjam released this 06 Oct 03:37

This release comes out of a round of stress testing: the real application driven with mouse and keyboard through every feature on real Git repositories, the command line interrupted, raced and misused, and the result reviewed twice more before it went out. It fixes what that found, and adds what was most missed.

Recommendations

  • A squashed or rebased branch counts as merged without asking GitHub. Until now a branch was merged only when the default branch had its very commits, so most pull requests, which are squashed, were never recommended unless the GitHub check was on. Arbor now finds the commit a branch was squashed into, or the copies of its commits, and says which. A match has to be exact: Git's own comparison passes over white space, so each is confirmed by one that does not. Nothing is written to the repository. It needs Git 2.39 on the machine being scanned.
  • A worktree with refs of its own (refs/worktree), with a path that is not valid text, or whose repository names a filter program Arbor will not run, is never a clean delete.

Deleting

  • Deleting several worktrees shows every one of them first, with its full path, size and what deleting it means. The native dialog it replaces had room for five and said "and 25 more". Where nothing would be discarded that review is the only question; where something would, the question about discarding is still asked by name.
  • Ticks survive a search, another view or a closed folder, so a selection can be gathered over several searches. The selection bar says how many are not shown, and anything out of view is always listed before it is deleted.
  • A long deletion can be stopped. Arbor finishes the worktree it is on and leaves the rest.
  • The Git command that deletes is no longer limited to thirty seconds and is no longer interrupted, by Stop, by quitting or by Ctrl-C. Either one could leave a worktree half deleted.
  • A worktree with a read-only folder in it, or inside one, is refused whole before anything is touched. Git would otherwise delete what it could and forget the worktree.
  • A clean worktree that is only locked or detached is no longer asked about as "Discard local files".
  • What a deletion reports is more exact: a folder that had already gone is not counted as space recovered, and the branch a detached worktree's commits were kept on is named.

The window

  • With no SSH host added there is only This computer: no "All hosts", and no extra level in the list.
  • The sort order and the machine showing are remembered. Sorting by size or last activity orders the folders too, so the first row is the largest or the stalest there is.
  • A saved list from an earlier day says so above its rows, with Refresh beside it.
  • A narrow window keeps each row's age and size, on its second line.
  • A folder that does not exist is refused in Settings and in setup before it is saved. Settings has its own Stop for a scan that is in its way.
  • The menu bar's commands are disabled when the buttons that do the same are.
  • Keyboard: Page Up and Page Down, Down from the search into its results, a Keyboard Shortcuts page in the Help menu, and the keyboard is no longer left on nothing after setup, after the last row is deleted, or on Stop.
  • Screen readers: each row has one short name, a search says how many rows it left, and an error is not read out again each time the list is sorted.
  • Names with characters that hide or reverse text are shown with a mark in the list, as they already were in the review.
  • The list is several times faster with a thousand worktrees and more.

The command line

  • --older-than 30d for list and clean, checked again at the moment of removal, for unattended use.
  • --sort name|size|activity, and --strict to fail when a scan was incomplete.
  • The table fits the terminal, sizes are aligned and written as the app writes them, a clean worktree that is not merged is called "not merged", and the last line says what can be done next.
  • Usage errors exit with status 2; failures while working stay 1.
  • arbor remove PATH refuses a path that is itself a symbolic link. A malformed --exclude is an error, not a crash. --head given empty is refused.

Scanning

  • Looking at a worktree runs nothing that its repository names: filter programs in a repository's own configuration are now switched off for Arbor's Git commands, as hooks and the file-system monitor already were. Git LFS still runs.

Tests

  • 87 scenarios drive the real application on real repositories (npm run test:e2e), a stress suite does the same for the command line (npm run test:stress), and both run in CI.

Arbor v0.1.19 (Alpha) — A new home, charts with a scale, and tidier SSH hosts

Choose a tag to compare

@not-stbenjam not-stbenjam released this 05 Oct 19:16

Arbor is alpha software: it deletes folders and is still changing between releases.

Arbor has moved

  • The project's home is now github.com/stbenjam/arbor. Downloads, issues and the source are here, and SSH hosts fetch their matching build from here. Releases up to v0.1.18 remain where they were published.
  • The desktop application's identifier changed with the move, so macOS treats this as a new application and may ask for first-launch approval again. Your settings and statistics are kept: they are stored under the application's name, which has not changed.

New and improved

  • The statistics charts have a scale. Each chart labels its top and middle line with round figures. Point at a day to read its figure, or move to a chart with Tab and use the arrow keys, which also read each day to a screen reader.
  • Settings stays open until its scan has been taken up. A scan that is refused, for a folder that does not exist, say, is put right where it was typed instead of in the window behind a closed dialog.
  • SSH hosts are tidied. Installing a newer release on a host removes the builds of earlier releases that nothing has used for two weeks. They used to stay for good.
  • The Recommended view in the sidebar shows its count in the green that marks its rows, so what Delete recommended acts on is easy to find before pressing it.

Reliability

  • An answer to a scan asked for from Settings belongs to the sitting that asked. It no longer closes or relabels Settings if that was reopened or turned to another host in the meantime, and edits made while waiting are kept.
  • Clearing earlier releases from a host touches only real folders named as a release, never a file or a link, and never a release another computer has used lately.
  • A chart keeps the day chosen with the keyboard apart from the day under the pointer.
  • The build and release workflows use versions of their actions that run on the current Node runtime.
  • Reviewed adversarially by GPT-6.1-Sol and corrected until it said ship. 230 desktop tests, the Go race suite and four Electron end-to-end suites pass on macOS and Linux.

Known limits

  • macOS builds are still ad-hoc signed, not notarized.
  • Arbor does not lock other programs out of a worktree in the last moments before a deletion, and does not search for commits that only a worktree's own reflog or private refs still point to.

Downloads

Desktop apps and standalone CLI archives for macOS and Linux, each in ARM64 and x86-64, attach automatically when native build and test jobs finish. SHA-256 checksums are included.

macOS apps are ad-hoc signed, not Apple-notarized. After attempting to open a trusted download, macOS may require System Settings → Privacy & Security → Open Anyway.