Commit Graph
289 Commits
Author SHA1 Message Date
NeilandClaude Opus 4.6 93de627208 fix: show error toast when adding non-git folder (#321)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 23:36:30 -07:00
Jingyue Wu 77f6021aff fix: titlebar alignment in fullscreen and on windows (#277) 2026-04-05 23:34:12 -07:00
NeilandClaude Opus 4.6 7c7ec172e0 feat: check git and gh availability on landing page (#322)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 23:34:00 -07:00
Jinwoo HongandClaude Opus 4.6 4dec80386a feat: search by comment, PR number/title, and issue number/title (#320)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 22:48:46 -07:00
Jinjing b82a8a62dc fix: improve delete worktree failure toast messages (#319)
- Show user-friendly guidance instead of raw git stderr when worktree
  deletion fails due to changed files, directing users to Force Delete.
- Extract toast message logic to reusable getDeleteWorktreeToastCopy
  function with comprehensive test coverage.
2026-04-05 17:59:09 -07:00
Ruan Gustavo a4ac7db972 fix: remove macOS traffic light padding on Windows (#317) 2026-04-05 17:49:29 -07:00
Jinjing b8b2654dda fix: resolve local images via IPC blob URLs in markdown editor (#318)
Local images referenced in markdown (both preview and rich editor) failed
to display in dev mode because file:// URLs are blocked by cross-origin
restrictions when the renderer is served from localhost.

- Load local images via IPC readFile → blob URL conversion
- Add useLocalImageSrc hook for react-markdown preview
- Add loadLocalImageSrc for ProseMirror nodeView in rich editor
- Snapshot cursor position before native file picker to fix insertion point
- Add blob URL cache with LRU eviction (max 100) and revokeObjectURL cleanup
- Add resolveImageAbsolutePath helper with tests
2026-04-05 17:42:09 -07:00
Jinjing b532df4650 feat: make inline diff display default and add setting (#316)
- chore: update screenshot

- fix: address review findings

- feat: make inline diff display default and add setting
2026-04-05 16:44:52 -07:00
Jinjing 171a2052df fix: address review findings (#315) 2026-04-05 16:17:07 -07:00
NeilandClaude Opus 4.6 3ec7fcb05e fix: new worktree not sorting to top with sort=recent (#314)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-05 14:47:41 -07:00
Jinjing 6b18a1ce28 fix: centralize updater restart deferral in main process (#313)
* fix: defer updater quitAndInstall to allow React/UI state to settle

PR #299 introduced a regression where the one-click auto-update flow
would synchronously invoke `quitAndInstall` immediately upon receiving
the `downloaded` state transition. This triggered a synthetic `beforeunload`
event (to capture terminal buffers) and an IPC call to quit in the exact
same event loop tick that React and the Toast library were processing
state updates. This disrupted the renderer's synchronous shutdown and flush
logic, causing the app to fail to quit and install properly.

This adds a `setTimeout` to defer `quitAndInstall`, pushing it to the
bottom of the event queue. This allows the UI state to settle and ensures
the `beforeunload` flush sequence executes cleanly.
Test cases have also been updated to use fake timers.

* fix: centralize updater restart deferral in main process
2026-04-05 13:34:25 -07:00
Jinjing 8e77aca170 fix: fetch PR checks by head sha (#312) 2026-04-05 11:54:53 -07:00
Jinjing b4e3dfa0b7 fix: add catch handlers for unhandled promise rejections in delete worktree (#311) 2026-04-05 11:49:00 -07:00
Jinjing f387dfa993 fix: remove freeze-on-select mechanism for sidebar sort stability (#310)
Replace the activeWorktreeSelectionNonce / frozen-sort-override approach
with the simpler sortEpoch-only strategy.  Selection side-effects
(clearing isUnread, PR cache refresh) no longer participate in sort
ordering, so clicking a card never reshuffles the sidebar.

- Remove activeWorktreeSelectionNonce from store
- Remove RecentSortOverride refs and secondary sort memo
- Swap prCache → repos in sortedIds deps (prCache changes are consumed
  inside the memo via direct store access when sortEpoch increments)
2026-04-05 11:47:44 -07:00
Jinjing a4481a7ebb fix: improve combined diff header interactions (#309) 2026-04-05 11:37:18 -07:00
Jinjing 3e51000bc5 fix: bypass gh CLI HTTP cache on manual PR checks refresh (#308)
The `gh api --cache 60s` flag caused stale check-run data even when
the user explicitly clicked refresh. Thread a `noCache` flag through
IPC so manual refreshes skip the gh CLI cache while polling still
benefits from it.
2026-04-05 11:26:32 -07:00
Jinjing 8a8826b2d6 Cache worktree roots for filesystem auth and UI improvements (#306)
* clean-up-repo-local-setup-script

- Add authorization cache for worktree roots to improve filesystem read performance
- Use ensureAuthorizedRootsCache instead of rebuilding on every list operation
- Fix useMemo side effect in WorktreeList by returning sorted IDs directly
- Add error display in QuickOpen and FileExplorer for unauthorized paths
- Improve section order in SourceControl (unstaged, staged, untracked)
- Add keyboard shortcut guard in WorktreeList for arrow keys
- Address review findings from code quality checks

* fix: update test mocks for filesystem-auth cache integration

- filesystem.test.ts: invalidate auth roots cache in beforeEach to
  prevent stale cache state from leaking between tests
- worktrees.test.ts / worktrees-windows.test.ts: add store.getRepos
  mock return value so rebuildAuthorizedRootsCache can iterate repos
- worktrees-windows.test.ts: add third listWorktrees mock for the
  cache rebuild call consumed during worktrees:create

* fix: resolve oxlint errors for max-lines and missing useEffect dependency

- Extract repeated worktree mock data into shared variable to reduce
  worktrees.test.ts below the 300-line limit
- Add missing 'toggleSidebar' to useEffect dependency array in App.tsx
2026-04-05 11:19:15 -07:00
Jinjing 399af41312 Ensure setup commands run only once per tab (#307)
- Capture startup reference synchronously at function entry
- Clear deps.startup to prevent re-execution by split panes
- Use captured local copy in onConnect callback
- Add documentation for intentional mutation side effect
2026-04-05 11:17:35 -07:00
Jinjing d8536b89ff fix: address review findings (#305) 2026-04-05 10:58:02 -07:00
Yax Patel 0cf0bbaab4 feat: add autosaving (#300) 2026-04-05 10:29:29 -07:00
Jinjing 357d2c31c5 Add keyboard shortcuts and fix review issues (#303)
- Add Cmd/Ctrl+B: toggle left sidebar
- Add Cmd/Ctrl+Shift+↑: move up worktree (with cycling)
- Add Cmd/Ctrl+Shift+↓: move down worktree (with cycling)
- Add Cmd/Ctrl+0: focus worktree list (with arrow keys for navigation)
- Fix buildWorktreeComparator call: pass prCache instead of activeWorktreeId
- Restore prCache subscription for sortBy === 'recent'
- Remove activeWorktreeId from useMemo deps to prevent list reordering
- Remove dead sortBy === 'smart' check
- Extract buildRows into worktree-list-groups to reduce file size
- Deduplicate worktree navigation logic
- Fix curly brace lint violations
2026-04-04 22:41:50 -07:00
Jinjing 6caa08fc79 fix: address review findings (#302)
- Rename worktreePath prop to worktreeRoot for clarity (it's a directory, not a file)
- Remove unused imports (cn, basename, dirname, Layers)
- Remove unused variables (fileName, dirPath)
2026-04-04 22:19:51 -07:00
Jinwoo Hong abe54ea84d Add current worktree shortcuts to Orca CLI (#301) 2026-04-04 18:33:58 -07:00
Jinjing 8e9b505073 restore single update toast and cover updater transitions (#299)
* fix: restore update toast flow and cover updater transitions

* fix: resolve oxlint errors in test file and FileExplorer

- Replace smart quote (U+2019) with ASCII apostrophe in update toast test
- Use .at(-1) instead of array[length - 1] per prefer-at rule
- Extract background context menu into FileExplorerBgMenu to fix max-lines

* fix: restore dismissed update version check in toast controller

The old UpdateReminder component checked dismissedUpdateVersion before
showing the update prompt. This logic was missing from the new
createUpdateToastController, causing the toast to reappear even after
the user dismissed it. Now the controller skips the available toast when
the version matches the dismissed one and persists the dismissal when
the user closes the toast without clicking Update.
2026-04-04 15:15:46 -07:00
Jinjing ea5a989edf Improve file content search result layout (#298)
* wip

* fix: use shared tooltip wrapper for search results
2026-04-04 15:01:25 -07:00
Jinjing c40cfb2cc2 fix: improve file path display truncation (#297)
* fix: tighten file path display rows

* fix: extract file explorer background menu
2026-04-04 14:37:28 -07:00
Jingyue Wu e6435f1d61 feat: drag and drop within file explorer (#293)
* feat: file explorer drag and drop

* fix: git status label margin

* feat: smooth autoscroll with larger zone when dragging
2026-04-04 13:52:03 -07:00
Jinjing db1bab5a05 fix: delete local branch when removing worktree (#296) 2026-04-04 13:35:36 -07:00
Jinjing 2f1108719c Fix file content search reset per worktree (#294)
* fix: scope file search state to each worktree

* refactor: extract search filters component
2026-04-04 13:14:53 -07:00
Jinjing e053b4f606 feat: add local image insertion with file picker, toolbar button, and hardened safety checks (#291)
- Add local image insertion support with file picker and toolbar button
- Harden image copy with COPYFILE_EXCL flag to prevent overwrites
- Add deconfliction loop limit (1000 iterations) to prevent hangs
- Force image re-render on filePath change for correct URL resolution
- Extract toolbar button into reusable RichMarkdownToolbarButton component
- Use setHeading (not toggleHeading) for idempotent slash commands
- Add path utilities (dirname, joinPath) with comprehensive tests
- Add image utility functions for safe copy destination handling
2026-04-04 00:31:03 -07:00
Jinwoo Hong c03145514e Persist active worktree filter (#290) 2026-04-04 00:15:16 -07:00
Jinjing 386fd0395e route native file drops to editor vs terminal based on drop surface (#289)
* fix: address review findings

- Default to 'editor' target when drop lands outside tagged zones,
  preserving the prior open-in-editor behavior for sidebar/editor body drops
- Add trailing space after each terminal-dropped path so multi-file drops
  are properly separated in terminal input

* feat: route native file drops to editor vs terminal by drop surface

Add data-native-file-drop-target markers and IPC target field so the
preload can classify OS drops before forwarding to the renderer.
2026-04-04 00:08:33 -07:00
Jinwoo Hong 2f6d96b346 Keep Orca runtime metadata owned by the active process (#288) 2026-04-04 00:01:19 -07:00
Jinjing 90d0fae8f5 feat: add explicit worktree setup flow (#286)
* feat: add explicit worktree setup flow

- Centralize worktree activation setup flow

- fix: render orca.yaml file contents in settings repo pane instead of tags when using config file

- fix: command preview title for yaml configs

- fix: update UI copy and styling to better reflect yaml setup hooks

- fix: run setup hook in background if CLI worktree is created while GUI is closed

- fix: prevent duplicate terminal tab creation when creating worktrees from the UI

- fix: ensure CLI worktree create returns correct payload type and hooks up UI setup flow

- Squashed commits

- fix minor regression

- fix: close worktree context menu when deleting

- fix: keep delete dialog open while archive hook runs and support inline yaml scripts

- chore: fix lint, typecheck and react state mutations during render for setup script feature

* fix(lint): split worktrees.test.ts to stay under max-lines limit

Extract Windows path-handling tests into worktrees-windows.test.ts
to bring the original file under the 300-line oxlint max-lines rule.

* fix(test): set up path mocks for setup launch payload test

The computeWorktreePathMock and ensurePathWithinWorkspaceMock were
cleared by afterEach but not re-established in the test, causing
areWorktreePathsEqual to receive undefined and crash.
2026-04-03 23:44:23 -07:00
Jinjing bbc85505c5 fix: improve error messages and focus handling for new file/folder creation (#285) 2026-04-03 23:13:28 -07:00
Jinjing 2bbf3ac59d Remove delete confirmation for untracked files in Source Control (#283)
The window.confirm dialog for discarding untracked files is unnecessary
friction — just discard immediately like tracked file changes.
2026-04-03 22:32:59 -07:00
Jinwoo Hong 46070d8f27 Fix Windows packaged Orca CLI launcher path resolution (#282) 2026-04-03 22:20:09 -07:00
Jinwoo Hong 1c6d5a1fa0 Fix Windows worktree create path matching (#280) 2026-04-03 22:09:07 -07:00
Jinwoo Hong b3494b63b4 Normalize Orca worktree branch selectors (#281) 2026-04-03 22:08:59 -07:00
Jinjing 6c78908a7c fix: refresh worktree branch metadata for PR sorting (#278)
* fix: refresh worktree branch metadata for PR sorting

- refresh active worktree metadata when terminal branch changes occur
- keep recent sorting aligned with current-branch PR state while preserving cold-cache fallback
- avoid no-op worktree polling updates that still notify Zustand subscribers

* test: fix isolated worktree slice harness typing

* test: model resolved PR cache misses in smart sort coverage
2026-04-03 20:59:16 -07:00
Jinjing 653575e506 fix: open external files in Orca editor (#276)
* feat: allow opening files outside the worktree in the editor

Fixes an issue where prompting Claude Code to open a file outside the worktree
would fall back to opening the default system viewer, and dragging external files
into Orca wouldn't work.

- Replaced `shell.openFilePath` fallback with internal `store.openFile` for
  external files clicked in the terminal.
- Added a global drag-and-drop handler (`useGlobalFileDrop`) that resolves
  external file paths and opens them natively in Orca.
- Used `window.api.fs.stat` to prevent opening directories directly in the editor,
  falling back to the OS system viewer.

Closes stablyai/orca#271

* fix: authorize external editor file opens
2026-04-03 18:56:37 -07:00
Jinwoo Hong 44af290fed Update Orca skill install command (#274) 2026-04-03 16:57:40 -07:00
Jinwoo Hong 182ba156dd Add Orca runtime CLI and bundled install support (#273) 2026-04-03 16:50:28 -07:00
Jinjing ccc1fa7b8b fix: improve contextual copy affordance in monaco (#272) 2026-04-03 14:37:40 -07:00
Yax Patel 1cabc35e45 fix: make sidebar resizing responsive (#270)
* feat: add field to edit terminal font weight

* fix: allow scrolling in terminal font menu dropdown

* feat: scroll through fonts with arrow keys

* fix: keep terminal font picker keyboard-focused after button clicks

* fix: let keyboard users close terminal font picker from toggle button

* fix: responsive resize behavior

* chore: add tests

* fix: clamp hydrated sidebar widths
2026-04-03 14:14:37 -07:00
Jinjing 51e9a8fafe fix: restore markdown source editor layout (#269) 2026-04-03 11:35:30 -07:00
Jinjing 2d6fbec929 feat: auto updater background polling and persistent reminder UI (#266)
* feat: add update reminder component and background polling

* refactor: replace update reminder banner with subtle bottom-right toast

Swap the full-width top banner for a compact fixed-position toast in the
bottom-right corner, matching the existing Sonner toast styling. Also
extract pure functions (statusesEqual, isBenignCheckFailure) from
updater.ts into updater-fallback.ts to fix max-lines lint error.

* fix: mock checkForUpdates to return a promise so .catch() works in tests
2026-04-03 10:02:44 -07:00
Jinjing a3a0ba24d2 fix: preserve rich markdown round-trips (#267) 2026-04-03 09:57:54 -07:00
Jinjing 1b91904af4 fix: defer mac auto-update install until ShipIt is ready (#265)
* fix: defer mac auto-update install until ShipIt is ready

* fix: import missing deferMacQuitUntilInstallerReady
2026-04-03 00:42:44 -07:00
Jinjing 22f916e421 feat: add rich markdown editor mode (#264)
* feat: add rich markdown editor mode

* fix: preserve rich search navigation focus
2026-04-02 22:53:47 -07:00