v0.9.155
Patch Changes
-
#914
9111485Treat a blankROVE_*environment variable as unset instead of as a value.
VAR=is how a shell says "unset", butreadRoveEnvresolved the two
namespaces with??, so a defined-but-emptyROVE_*shadowed the real
KOBE_*beside it — and the mirror step copied the blank over it as well.
ForHOME_DIRthat produced""as the home and then state paths relative
to the process's cwd (the user's repository, for the TUI), in a module that
renameSyncs the plugin tree; for the daemon/PTY socket and pid overrides it
dropped an isolated run back onto the production daemon.An engine switched off in Settings → Engines is now also skipped by
rove api add's repo default, and aui-prefspayload from an older daemon
no longer turns remote panes opaque. — @Sma1lboy -
#918
a59eea2Five probes that reported a neutral answer when they had actually failed.delete --delete-branchdiscardedgit branch -d's exit code, so a branch git
refused to delete (the ordinary case for work that never landed) left the
daemon log confirmingremoved … branch=<name>. The refusal is now carried out
of the removal and logged as its ownbranch kept …line, with git's reason.
The delete itself is unchanged — still best-effort, still never fails the
removal."Fix failing checks" told users the checks were probably no longer red whenever
ghcould not answer at all. A missinggh, an expiredgh auth login, and a
genuinely green PR were one empty list; the read now reports which, and the
toast quotesgh's own stderr.Three probes stopped encoding "could not look" as "nothing there": the
non-force delete gate now refuses whengit status --ignoredfails instead of
reading the empty result as permission;rove doctorsays
could not read process environmentsinstead oforphans: ✓ nonewhen the
environment probe never ran; and the three copies of the dirty-worktree check
share one definition, so agit statusoutput of just a newline no longer
reads dirty to the delete gate and clean to landing. — @Sma1lboy -
#920
3356c76Stop one plugin's failure from abandoning every other plugin's shutdown hook.
runPluginHookdocumented itself as never rejecting, but two paths broke that:
themkdirSynccalls that create a hook's config/state dirs sat outside any
try, and a manifest may write a TOML\u0000escape into its argv, which makes
spawnthrow synchronously. Either one escaped intoPluginHost.stop(), where
Promise.allshort-circuited and returned while the other plugins' hooks were
still running — unawaited, so the daemon'sprocess.exitdestroyed their grace
timers and left the orphaned children the method exists to prevent. The dir
failure is now recorded as aspawnErrorin that plugin's ownrove plugin log, the contract is enforced where every hook call site goes through, and the
reap usesallSettled. Event dispatch is likewise isolated per plugin rather
than per batch, and the registry-reload timer — the last dispatch path with no
guard above it — no longer turns a throw into an uncaught daemon exception.Docs:
[[engines]]needs a Rove restart (only daemon-run hooks hot-reload);
turn.interruptedis TUI-emulated on Claude and Codex, so it never fires with
no TUI attached;RoveRunOptions/RoveRunResultare documented; the SDK's
socket table no longer presents instance methods as named exports;
delivery.composerGateno longer claims that turning it off removes all
typing protection; andexperimental.remoteProjectssays that it gates
rove add --remotealone. — @Sma1lboy -
#921
e29c08fThe sidebar spoke twenty glyphs; now it speaks four. Every tab row is one of: spinner (working),!(needs you — permission, rate limit, error, dead engine, failed deletion, in one red mark),●(finished, unread),○(quiet — idle, unobserved, shell tab, untracked engine). The right-edge cluster keeps↑ + − ↓and one PR mark (≠conflict,✗failing,✓passing, in that priority); the review-state, pending, merged, and board-status chips are gone, since none of them changed what you did next. — @Sma1lboy -
#915
b7d44acClear terminal search and selection when switching sessions so a previous tab's query cannot capture input intended for the new tab. Keep the original terminal process and buffered output when returning to a tab. Route pasted text into the focused scrollback query while search is open, and restore normal terminal paste when it closes. — @Sma1lboy -
#917
cad0194Keep file previews tied to the selected path. Filenames containing brackets, wildcards, or leading pathspec syntax now open only their own diff, including after a rename.Show pure renames and empty-file additions or deletions in both single-file and combined diffs. Missing or unreadable text files report an error with the existing retry action, while valid empty files say so. Switching previews shows loading until that path's result arrives instead of displaying the previous file under the new title. — @Sma1lboy