Browser tabs are factored into getWorktreeStatus, so leaving them
behind after shutdown keeps the sidebar dot green even though all
terminals are dead. Clear browserTabsByWorktree and
activeBrowserTabIdByWorktree during shutdown so the status indicator
transitions to inactive.
The old code used a hardcoded PRIMARY_BRANCHES set (main, master, develop,
dev) to decide badge styling, which was misleading — a non-primary worktree
on "main" got a badge nearly identical to the actual primary worktree.
Now we use the authoritative `isMainWorktree` flag from git, show a
"primary" badge next to the display name, and always show the branch name
in the subtitle row regardless of branch naming conventions.
The tab-type restoration logic in setActiveWorktree fell through to the
editor branch when a worktree had open files, even if the user was last
on the terminal surface. Add an explicit 'terminal' case so switching
back lands on the terminal tab as expected.
* feat: add shared issue command config and worktree automation
- Add shared top-level issue command support in orca.yaml with per-user .orca override read/write paths
- Surface the issue command in repository settings and the create-worktree dialog
- Queue issue-command terminal splits independently from setup-runner splits
- Preserve user checkbox state and repo-switch draft saves for issue command configuration
- Add parser, activation, and terminal-state test coverage for the new flow
* fix: clarify custom issue command settings label
* docs: clarify issue command effect behavior
* docs: unify issue command examples
* fix: keep issue command examples on one line
* style: use direct useEffect import in add worktree dialog
measure() resets all cached DOM measurements back to estimateSize()
predictions. When clicking a card triggers a prCache refresh, the
effect fires, discarding accurate measurements and replacing them with
imprecise estimates — causing visible card overlap. The measureElement
ref already uses a ResizeObserver to auto-update sizes when card
content changes, making the manual measure() calls unnecessary.
Recalibrate virtualizer row height constants: base 52→55 (accounts for
2px border + 15px title), meta rows 22→16 (py-0.5 + icon size-3),
meta section spacing uses gap-1.5 + mt-0.5 + gap-[3px] between rows.
Add +1px when both status and unread indicators are visible.
Keep existing children visible in dirCache during force-reload instead
of clearing to [], preventing the virtualizer from losing scroll
position and jumping to the top when files are created, duplicated, or
deleted.
Sort-epoch changes are now debounced by 3 seconds before triggering a
re-sort, preventing jarring position shifts when background events (AI
starting work, terminal title changes) recalculate time-decay scores.
Structural changes (worktree added/removed) bypass the debounce and
apply immediately.
Comment edits now bump lastActivityAt so the worktree holds its ranking
instead of dropping due to decayed recency.
Replace the HoverCard tooltip with inline whitespace-pre-wrap rendering
so multi-line comments are visible at a glance. Update estimateRowHeight
to dynamically calculate comment height based on content length and
newline count.
When removing an orphaned worktree, `git worktree remove` fails but the
directory is cleaned up via `rm`. Without a subsequent `git worktree prune`,
git's internal tracking remains stale — `git worktree list` continues to
show the entry and the branch stays locked. Add `git worktree prune` after
the rm in both the IPC handler and OrcaRuntimeService to fix this.
Move dirty-dot indicator and close button into a shared fixed-width
container so toggling between dirty/clean states during auto-save
does not cause the tab to resize.
* fix: address review findings
* fix: improve error handling in terminal e2e helper JSON parsing
* fix: remove unused catch parameter in terminal e2e helper
* fix: use nullish coalescing assignment for LANG default in PTY spawn
The object spread approach ({LANG: default, ...process.env}) produced
undefined on CI (Ubuntu/Node 22) despite working locally. Switch to
explicit ??= assignment after the spread for reliable cross-platform
behavior.
Move build resources to resources/build/, icon source files to
resources/icon-source/, scripts to config/scripts/, and patches
to config/patches/ for a cleaner top-level directory layout.
- Make the "+" new tab button a compact rounded icon button instead of
a full-height rectangle
- Increase titlebar height from 38px to 42px for better proportions
- Remove font-medium from active tabs to prevent layout shift when
switching between tabs
* chore: clean up repo root for faster README visibility
- Delete unused images (debug_orca.png, orca_3d.jpg, screenshot.png)
- Delete stale design docs from docs/
- Move tsconfig sub-configs, electron-builder config, and vitest config to config/
- Move file-drag.gif to docs/assets/ and design doc to docs/
- Update all path references in package.json, tsconfig.json, and moved configs
* fix: remove stale worktree dialog callback dependency
Adds a platform-aware context menu option to reveal files/folders in the
system file manager (Finder on macOS, File Explorer on Windows, Files on Linux).
- Move xterm FitAddon refresh() outside the resize conditional so
sub-cell-width container shrinks don't leave blank content
- Defer startup notification to window 'show' event so the macOS
permission dialog appears after the window is visible
- Add click handler on startup notification to open System Preferences
- Prevent GC of startup notification via activeNotifications set
- Fix lint-staged config: remove yaml/html/md from oxfmt pattern
since oxfmt only supports json and css beyond JS/TS
* feat: run setup script in split pane so main terminal stays interactive (#381)
Instead of running the worktree setup script in the main terminal pane
(blocking user interaction), queue a setup-split signal that TerminalPane
consumes on mount — creating the initial pane clean, then splitting right
and injecting the command into the new pane's PTY.
* fix: address review findings
* fix(terminal): run context menu Close Pane through request-close lifecycle
* feat: run setup script in split pane so main terminal stays interactive (#381)
Instead of running the worktree setup script in the main terminal pane
(blocking user interaction), queue a setup-split signal that TerminalPane
consumes on mount — creating the initial pane clean, then splitting right
and injecting the command into the new pane's PTY.
* fix: address review findings