Skip to content

v1.4.0 — Desktop Overhaul, Honest Tests, Working Preset Switching

Choose a tag to compare

@nickt92 nickt92 released this 26 Jul 09:00
· 18 commits to main since this release
71fed2c

🧪 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.app

It then launches normally. It is a menu bar app — look for the anvil icon in the status bar, not the Dock.

Signing and notarization are tracked for the next release. Until then, the CLI is the supported path and the desktop app is genuinely beta.

Forge Desktop gets a full UI overhaul, plugin installation works again, and the test suite starts telling the truth.

This release also carries everything from 1.3.1, which was never tagged.

Added

Desktop App (Beta)

  • Design system v2 — spacing and typography scales, dark-mode-aware elevation, semantic colours, AA text-grade brand orange, and motion tokens that honour Reduce Motion
  • Component library: cards, four button styles with hover states, unified sheet chrome, skeleton loading, branded empty states, status badges
  • Instant launch — the dashboard renders from the last successful scan immediately and refreshes in the background. A failed refresh keeps the usable data on screen instead of replacing it with an error
  • Permission preset picker in Settings and the setup wizard, driven by the CLI so labels, tiers, rule counts and inheritance all come from one source
  • Status card showing installed vs source version, persona, plugin and hook counts, with a one-click confirmed in-app update
  • "Update ready to install" indicators in the dashboard and menu bar, replacing the terminal nag loop
  • Native persona builder — a three-step wizard for creating custom personas
  • Menu bar deep links: repos needing attention open the dashboard with that repo selected
  • Brand accent throughout, so stock controls render in forge ember rather than system blue

CLI

  • Non-interactive forge build flags for scripted persona creation
  • forge permissions --list --json

Infrastructure

  • CI runs on release and hotfix branches, and runs the Swift suite. Release branches previously ran nothing, and the 189 desktop tests had never run in CI at all
  • A guard that fails the build if shipped code defines a function name owned by the bats test helpers

Changed

  • Every desktop screen rebuilt on the design system
  • VoiceOver labels on all icon-only controls; decorative elements hidden from assistive tech
  • Plugin installation confirms each marketplace registered under its expected name before installing, so a mismatched source gives one clear error instead of a string of confusing per-plugin failures

Fixed

Plugin installation was silently doing nothing

forge install relied on a plugin command that newer Claude Code removed. It installed zero plugins and reported success. It now uses the current command and surfaces the real reason when a plugin can't be installed. (from 1.3.1)

Test assertions were silently disabled

lib/ui.sh defined fail(), which is also the function bats-support uses to fail a test. In the 24 of 44 test files that source it, every assertion reported success regardless of outcome. The suite claimed 722 passing while 13 were broken. Renamed to forge_fail(), and the collision class is now checked automatically.

Three of those 13 were real bugs, listed below.

Switching permission presets could stop working

forge update reinstalls without --permissions, and the manifest rewrite dropped the record of what forge had added. After that the removal step no-ops and merging can only add — presets became one-way and rules forge had added could never be withdrawn. The record now survives reinstall.

Windows stored mangled paths

forge config set dashboard.scan_path /home/user/repos stored C:/Program Files/Git/home/user/repos. Git Bash rewrites both arguments and environment values that look like absolute POSIX paths before a native binary sees them. Values now reach jq as file content, which is never rewritten. The manifest recorded source_dir the same way.

Windows CI has passed for the first time. It had been reporting success for months while its assertions were inert.

Other

  • forge stats --session exited 1 on success whenever a session had no overrides, which is the normal case
  • forge stats --hooks and --session crashed with "integer expression expected" — grep -c prints 0 and exits non-zero when nothing matches, so the fallback appended a second 0
  • Intermittent test failures from three suites sharing one temp directory
  • Desktop app version drift, and CLI errors reaching the app as an empty string
  • forge build with a value flag missing its value failed silently

Known issues

  • The if: filter on the commit-validator and db-guard hooks has never taken effect. It sits on the hook group object, but Claude Code only accepts it on individual hook entries, so it is silently dropped. The v1.3.0 notes claimed a 95-99% reduction in process spawns from this; that reduction never happened. Fixing it properly requires the settings-merge rewrite, since the current merge cannot update an existing install's hook entries.

Tests: 919 total — 730 CLI (bats-core, macOS/Linux/Windows) + 189 desktop (XCTest).