Commit Graph
523 Commits
Author SHA1 Message Date
Jinjing cd86a49ea4 feat(cli): run setup commands in right-side split pane (#409)
* 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
2026-04-08 21:45:27 -07:00
Jinjing 92a8726046 feat: run setup script in split pane so main terminal stays interactive (#407)
* 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
2026-04-08 21:42:23 -07:00
Jinjing abadf5a2a8 fix: address review findings (#406) 2026-04-08 21:41:10 -07:00
Jinjing 90d3fd37a2 Improve orca.yaml invalid-state UI with repair guidance (#405)
* check in

* fix: address review findings
2026-04-08 21:38:45 -07:00
Jinjing 265c2ddd68 Remove macOS notification permission checking (#404)
* fix: address review findings

* fix: mock process.platform as darwin in system-denied test

The test exercises the macOS notification permission gate, which only
checks systemPreferences.getNotificationSettings on darwin. Without
mocking the platform, Linux CI takes the non-darwin path and the
assertion fails.

* chore: remove stale test files

* refactor: remove macOS notification permission checking

The systemPreferences.getNotificationSettings() check added friction
without meaningful benefit — macOS handles permission prompting natively
when a notification is posted, making the manual check redundant.
Removes getPermissionStatus(), the system-denied dispatch reason,
the IPC handler, the renderer permission-blocked banner, and all
related tests.
2026-04-08 20:59:49 -07:00
Neil f86e41f06f 1.1.5 v1.1.5 2026-04-08 20:46:41 -07:00
Neil b60341ff0c Revert "fix: prevent terminal reset when splitting tab groups" (#403) 2026-04-08 20:45:23 -07:00
Jinjing 02a092b52f fix: address review findings (#402)
- Fix ZoomOverlay to fully unmount after fade-out so the fixed overlay
  doesn't linger and interfere with Radix portal layering, click-outside
  detection, or focus management (fixes broken file switching)
- Lower z-index from 9999 to z-50 to match app conventions
- Fix editor zoom percent to use actual base font size from settings
  and computeEditorFontSize for clamping instead of hardcoded 14
- Extract useTerminalFontZoom to own file to keep keyboard-handlers
  under the 300-line lint limit
2026-04-08 20:43:50 -07:00
Jinjing 01f3483b21 feat: structured notification dispatch results and startup permission registration (#400)
* fix: address review findings

* fix: mock process.platform as darwin in system-denied test

The test exercises the macOS notification permission gate, which only
checks systemPreferences.getNotificationSettings on darwin. Without
mocking the platform, Linux CI takes the non-darwin path and the
assertion fails.

* chore: remove stale test files
2026-04-08 20:36:01 -07:00
Jinjing 8836bc5a6d fix: prevent terminal scroll position corruption during resize (#398)
Patch @xterm/addon-fit to refresh the full viewport and restore scroll
position after reflow, batch ResizeObserver through requestAnimationFrame
to coalesce rapid-fire reflows, and recover terminal rendering after
WebGL context loss.
2026-04-08 20:17:02 -07:00
Jinjing 08e7274d31 feat: improve markdown file typing speed (#396)
* fix: address review findings

- Add try/catch to debounced serialization timer callback for consistency
  with flushPendingSerialization (prevents crash if editor is destroyed
  during the 300ms debounce window)
- Use TextEncoder.encodeInto() with pre-allocated buffer instead of
  encode() to avoid allocating a new Uint8Array on every render
- Extract keyboard handler to rich-markdown-key-handler.ts to stay under
  the 400-line file limit

* feat: improve markdown file typing speed

- Debounce ProseMirror getMarkdown() serialization (300ms) to eliminate
  the dominant typing-speed bottleneck on large markdown files
- Add 300KB size limit that falls back to Monaco source mode for files
  too large for ProseMirror's in-memory document tree
- Expose flushPendingEditorChange() bridge so autosave, quiesce, and
  restart flows capture debounced edits without data loss
- Signal dirty state immediately via onDirtyStateHint so close prompts
  and beforeunload guards don't miss edits during the debounce window
2026-04-08 20:04:21 -07:00
Brennan Benson 04b4ab053c v1.1.4 (#395) 2026-04-08 19:18:32 -07:00
Matheus Nogueira da7ddb0792 fix: prevent terminal reset when splitting tab groups (#393)
- Always render through TabGroupSplitLayout (even single groups) to prevent TerminalPane unmounts that kill PTY processes
- CSS Grid flat rendering keeps TabGroupPanels as stable keyed siblings across layout changes
- Use effectiveVisibleRef in pty-connection so split-but-visible terminals receive PTY output
- Eagerly initialize layout in createUnifiedTab before first split
- Keep layout leaf when collapsing to single group (prevent unmount)
- Prevent Monaco model disposal with keepCurrentModel so split editors share models safely
- Keep titlebar spacer visible in split mode for right sidebar toggle positioning
2026-04-08 22:40:37 -03:00
Brennan BensonandClaude Opus 4.6 a8e6b31f91 feat: Cmd+1–9 worktree switching with hint overlay (#394)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 18:12:52 -07:00
Jinwoo Hong d38d240e86 feat: persist last-active terminal tab per worktree (#392)
When switching between worktrees, the active terminal tab was reset to
the first tab because activeTabId was global. This adds a per-worktree
map (activeTabIdByWorktree) mirroring the existing pattern used for
editor files, so users return to the same terminal tab they left.
2026-04-08 15:18:42 -07:00
Brennan BensonandClaude Opus 4.6 ee9bb15b54 fix: fast-forward local base branch when creating worktrees (#374)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 13:57:01 -07:00
Jinwoo-H 35dd7fe2d2 1.1.3 v1.1.3 2026-04-08 16:25:08 -04:00
Jinwoo Hong 9f317e9870 feat: prompt cache timer for Claude agents (#390) 2026-04-08 12:49:38 -07:00
Matheus Nogueira 82941850b6 Reapply "feat: unified tabs system with titlebar integration (#371)" (#384)
This reverts commit 72890a3c89.
2026-04-08 15:58:32 -03:00
Jinjing 42e6aef006 1.1.2 v1.1.2 v1.1.1-rc.2 2026-04-08 00:42:27 -07:00
Jinjing 94ac8058aa Revert "fix: keep-alive editor panes to preserve scroll position" (#385) 2026-04-08 00:41:08 -07:00
Jinjing 9180fd3118 fix: reduce worktree card gap from 8px to 6px (#386) 2026-04-08 00:39:33 -07:00
Jinjing 60353a4c9c 1.1.1 v1.1.1 2026-04-08 00:07:14 -07:00
Jinjing b287091af2 1.1.1-rc.1 2026-04-08 00:04:22 -07:00
Brennan BensonandClaude Opus 4.6 c533784d65 feat: add custom title support for terminal panes (#382)
* WIP: Changes before auto-review fixes

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: add custom title support for terminal panes

Users can set a custom title on individual terminal panes via the
right-click context menu ("Set Title...") or by clicking an existing
title. Titles display as a minimal floating label at the top of each
pane with inline editing (Enter to save, Escape to cancel). An X
button on hover removes the title.

Titles persist across restarts via titlesByLeafId in
TerminalLayoutSnapshot, piggybacking on the existing session:set flow.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: address review findings for pane title feature

- Guard rename input against double-submit on Enter/Escape + blur race
- Memoize persistLayoutSnapshot with useCallback to prevent keyboard
  listener re-registration on every render
- Eagerly update paneTitlesRef in onPaneClosed so persistLayoutSnapshot
  sees correct data before React flushes state
- Document portal rendering's implicit dependency on paneTitles state

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: write pane titles in shutdown snapshot even when buffers are empty

captureBuffers had an early return when no terminal scrollback content
existed, which skipped writing titlesByLeafId to the layout snapshot.
This caused titles to be lost on restart for fresh or cleared panes.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* chore: remove design doc from PR

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-08 00:02:12 -07:00
Jinjing 72890a3c89 Revert "feat: unified tabs system with titlebar integration (#371)" (#384) 2026-04-07 23:56:17 -07:00
Jinjing d46ed1282e feat: add consistent gaps between worktree cards (#383)
* feat: add consistent gaps between worktree cards

Use TanStack Virtual's built-in `gap` option (8px) instead of padding
on the wrapper div. The virtualizer accounts for the gap directly in
its position calculations, guaranteeing consistent spacing between
cards regardless of estimation/measurement mismatches.

* test: update estimate tests for virtualizer gap change
2026-04-07 23:32:55 -07:00
Jinjing 5d8e69a235 feat: auto-reveal active file in explorer on tab switch (#380)
* feat: auto-reveal active file in explorer on tab switch

Adds useFileExplorerAutoReveal hook that scrolls the file explorer to
show the active editor file when switching tabs, mirroring VS Code's
explorer.autoReveal behavior. Files already visible in the tree get
scrolled to directly; files with collapsed ancestors trigger the reveal
machinery with flash disabled to avoid visual noise.

* refactor: extract file explorer handlers to fix max-lines lint rule

Move handleClick, handleDoubleClick, and handleWheelCapture into a
dedicated useFileExplorerHandlers hook to bring FileExplorer.tsx under
the 400-line limit.
2026-04-07 22:09:50 -07:00
Jinjing f61ef05866 1.1.1-rc.0 v1.1.1-rc.0 2026-04-07 20:35:33 -07:00
Jinwoo HongandClaude Opus 4.6 f6ec69c969 feat: add WSL support for repos on WSL filesystems (#375)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 21:02:36 -04:00
Jinwoo Hong beb62ff580 feat: add PR comments to checks panel (#376) 2026-04-07 17:58:40 -07:00
Brennan BensonandClaude Opus 4.6 755690b5a2 fix: keep-alive editor panes to preserve scroll position (#373)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 17:28:22 -07:00
Jinwoo HongandClaude Opus 4.6 dd4e7b8497 feat: enhance Add Repo with modal flow and clone from URL (#372)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 13:31:18 -07:00
Neil 2ff0f107e8 1.1.0 v1.1.0 2026-04-07 13:26:45 -07:00
NeilandClaude Opus 4.6 165502121b feat: polish markdown preview and rich editor (#369)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 13:03:43 -07:00
Matheus NogueiraandClaude Opus 4.6 9e431e6ca7 feat: unified tabs system with titlebar integration (#371)
* feat: add unified TabsSlice and tab bar UX improvements

Introduce content-agnostic Tab/TabGroup model (Step 1 of unified tabs
migration). TabsSlice coexists alongside legacy TerminalSlice/EditorSlice
and provides unified CRUD, neighbor selection, preview replacement, pin
support, and session hydration from both legacy and unified formats.

Also fixes several tab bar UX issues:
- Tab bar always visible (even with 1 tab)
- New terminal tabs appear at end of tab bar, not index 0
- Closing last terminal with editor files open switches to editor view
  instead of deactivating the worktree
- New terminal tabs receive focus immediately

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: extract tabs-helpers, tabs-hydration, and reconcile-order modules

Split tabs.ts (503 countable lines) and useTerminalTabs.ts (325 countable
lines) to stay under the max-lines lint limit without eslint-disable:

- tabs-helpers.ts: pure lookup/update functions + generic patchTab helper
- tabs-hydration.ts: session hydration for unified and legacy formats
- reconcile-order.ts: shared tab order reconciliation (was duplicated in
  TabBar.tsx, useTerminalTabs unifiedTabs memo, handleNewTab, and
  handleCloseTabsToRight)

Includes tests for all three extracted modules (29 new tests).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* feat: move tab bar into the titlebar row

Render the TabBar inside the titlebar via a React portal, sharing the
same row as the "Orca" title. The left section of the titlebar matches
the sidebar width so tabs start exactly where the sidebar ends.

This saves ~36px of vertical space by eliminating the separate tab bar
row. Empty space after tabs remains window-draggable; individual tabs
and the "+" button opt out with -webkit-app-region: no-drag.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* fix: prevent middle-click paste when closing tabs

Close tabs on auxclick instead of mousedown for middle-click. Closing on
mousedown removed the tab element before mouseup fired, causing the
mouseup to fall through to the terminal canvas and trigger an X11
primary selection paste on Linux.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* refactor: extract terminal tab actions to fix lint errors

Memoize `tabs` and `worktreeFiles` to fix useMemo unstable dependency
warnings. Extract action callbacks (close, activate, create, etc.) into
terminal-tab-actions.ts to bring useTerminalTabs.ts under the 300-line
max-lines limit.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-07 16:33:25 -03:00
Neil 019fb5fc50 1.0.100 v1.0.100 2026-04-07 01:35:43 -07:00
Neil 900adb16c7 1.0.99 v1.0.99 2026-04-07 01:35:38 -07:00
Neil 09c5e76694 fix: exit expanded mode before splitting pane (#368) 2026-04-07 01:00:19 -07:00
Neil 0f65b11962 fix: terminal content not resizing on pane expand (#367) 2026-04-07 00:48:29 -07:00
Jinjing cb8da71749 1.0.98 v1.0.98 2026-04-07 00:22:15 -07:00
Jinjing d7633c9875 move GitHub star button to bottom of landing page and auto-hide (#366)
Reposition the star button below the shortcuts section at the page
bottom. Hide it entirely once the user has both added a repo and
starred the project, so it doesn't distract returning users.
2026-04-07 00:21:56 -07:00
Jinjing d652a6c30a 1.0.97 v1.0.97 2026-04-07 00:17:28 -07:00
Jinjing c652990bb5 refactor: replace allowPrerelease workaround with generic feed URL (#365)
* fix(renderer): fix unescaped quote lint error in GeneralPane

* refactor: replace allowPrerelease workaround with generic feed URL

Use electron-updater's generic provider pointed at GitHub's
/releases/latest/download/ so the manifest always comes from the latest
stable release. This eliminates the client-side RC filtering, the GitHub
releases API fallback, and the manual-download path entirely.
2026-04-07 00:16:19 -07:00
Neil 4de80194c7 fix: resolve posix_spawnp failure on macOS Intel (#364) 2026-04-07 00:13:51 -07:00
Neil 0f1a2b4892 1.0.96 v1.0.96 2026-04-06 23:32:51 -07:00
Neil f787d675c4 min release age = 1 day 2026-04-06 23:32:45 -07:00
Neil f305bc6279 1.0.95 2026-04-06 23:30:52 -07:00
NeilandClaude Opus 4.6 03a7077597 feat: add pn tc command using typescript-native (tsgo) (#363)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 23:27:29 -07:00
NeilandClaude Opus 4.6 c0b6687e13 feat: add native desktop notifications (#180)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-06 23:24:02 -07:00