v1.5.0 — forge restore, and uninstall stops deleting your config
🧪 ForgeDesktop (beta) — read before opening
The attached build is unsigned (no Apple Developer ID yet), so macOS Gatekeeper blocks it after download. Right-click → Open does not work on macOS 15 or later. To run it:
# move ForgeDesktop.app to /Applications first, then: xattr -dr com.apple.quarantine /Applications/ForgeDesktop.appIt is a menu bar app — look for the anvil icon in the status bar, not the Dock.
Signing and notarization are still tracked for a future release.
Protects the config file forge shares with you, and gives you a way back.
Uninstall could delete hooks and plugins you added yourself
This is the one to know about.
forge worked out which entries in settings.json were its own by comparing against a backup — but that backup is taken once, at first install, and never refreshed. So anything you added afterwards looked exactly like a forge addition. forge claimed it, and uninstall deleted it.
forge update re-triggered this on every run.
Ownership is now derived from what forge actually ships, rather than from "anything that wasn't there at the beginning". Entries you added are neither claimed nor removed. If forge shipped something in an older version and no longer ships it, that entry is now left in place rather than deleted — forge doctor can report it, and deleting something forge is no longer sure it owns is the more dangerous mistake.
Added
forge restore
There used to be exactly one restore point, ever: the backup from your first install. Installed for a year meant a single snapshot from a year ago, and no way to undo one bad operation.
Every operation that rewrites settings.json now takes its own snapshot first — labelled and timestamped, keeping the 20 most recent.
forge restore --list # what's available, with readable timestamps
forge restore --latest # undo the last operation
forge restore 20260726T101500Z # or pick one
forge restore --pre-install # your settings from before forge existedIt snapshots the current state before restoring, so a restore is itself undoable. It refuses to install invalid JSON over working settings, and refuses an ambiguous match rather than guessing.
Shell completions
analyze, permissions, restore and statusline now complete. The first three were missing entirely.
Fixed
forge restoreand its history are reachable from the CLI, not only when a library happens to be pre-loaded. The command resolved its history directory from an unset variable and silently found nothing — caught by running the real binary rather than the unit tests, which had pre-loaded that library and masked it- A test that pinned a literal version number, so it broke on this release rather than on a real regression. Third instance of that pattern; it now derives from the single source of truth
Tests: 943 — 754 CLI (bats-core, macOS/Linux/Windows) + 189 desktop (XCTest).