Commit Graph
136 Commits
Author SHA1 Message Date
NeilandClaude Opus 4.6 f5f125e7db fix: prevent macOS auto-update from appearing to fail silently
Two issues caused "Restart to Update" to not apply the update on macOS:

1. Premature window destruction: quitAndInstall() destroyed all windows
   before calling autoUpdater.quitAndInstall(). On macOS, MacUpdater
   delegates to Squirrel.Mac which may not be ready yet — it registers
   a listener and returns. With zero windows, the dock "activate" handler
   would re-open the old version, making it appear the update failed.
   Fix: remove close listeners (so windows don't block quit) but don't
   destroy them. Let Squirrel.Mac handle the actual quit.

2. Premature "ready to install" status: electron-updater fires its
   'update-downloaded' event after downloading the ZIP from GitHub, but
   BEFORE Squirrel.Mac finishes downloading from the localhost proxy.
   The UI showed "ready to install" when the update wasn't actually
   installable yet. Fix: on macOS, defer the 'downloaded' status until
   Electron's native autoUpdater confirms Squirrel has the update.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 14:47:47 -07:00
Jinwoo HongandClaude Opus 4.6 4d4d1ad2a6 fix: preserve 'show active only' filter when creating a worktree (#117)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 13:04:41 -07:00
NeilandClaude Opus 4.6 38c5b6b970 fix: stabilize active worktree order in 'recent' sort (#116)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 12:51:05 -07:00
JinjingandClaude Opus 4.6 406f95b072 style: adjust worktree card comment styling and status indicator padding (#115)
Remove italic from comment text and tweak status indicator top padding from 3px to 2px.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 08:21:39 -07:00
JinjingandClaude Opus 4.6 149acf26bb fix: address review findings in updater flow (#114)
- Add console.error logging to startup update check catch block
- Add state guard to downloadUpdate() to prevent calls outside 'available' state
- Track and dismiss 'available' toast when download starts or completes
- Include version number in downloading status text

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 07:35:52 -07:00
JinjingandClaude Opus 4.6 d127b2cfb3 feat: polish UI with softer borders, smaller labels, and PR state colors (#113)
Soften border opacity across UI components, move label default to text-xs,
simplify worktree group tones, and color PR icons by state.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-26 00:20:58 -07:00
NeilandClaude Opus 4.6 f473e3f53e fix: exclude xterm helper textarea from editable target check (#111)
PR #103 added a blanket isEditableTarget() guard that inadvertently
matched xterm.js's internal <textarea class="xterm-helper-textarea">,
blocking Cmd+D (split pane), Shift+Enter (newline), and all other
terminal shortcuts whenever the terminal was focused.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 23:44:30 -07:00
JinjingandClaude Opus 4.6 8adecbecce feat: replace monospace body font with Geist Sans (#110)
Switch the app-wide font from SF Mono/monospace to Geist Sans for a
more polished, modern UI. Bundle the variable woff2 font in assets for
cross-platform support. Remove font-mono from sidebar and settings
components while keeping monospace in terminal/editor contexts.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 23:16:22 -07:00
JinjingandClaude Opus 4.6 902e2271b9 fix: handle orphaned worktree deletion with disk cleanup (#109)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 23:14:48 -07:00
JinjingandClaude Opus 4.6 69978c93f5 test: expand test coverage and extract worktree logic into testable module (#108)
Add comprehensive tests for worktree parsing, GitHub check status derivation,
hooks YAML parsing, persistence store, layout serialization, store cascades,
and terminal helpers. Extract pure functions from worktrees.ts into
worktree-logic.ts for better testability.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 22:34:20 -07:00
NeilandClaude Opus 4.6 3d4ed411c5 feat: editable diff views for unstaged changes (#107)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 22:25:36 -07:00
Neil 0bea9aa4ff Clickable Claude Code #PR (#106) 2026-03-25 22:24:19 -07:00
NeilandClaude Opus 4.6 0785dd7b7b fix: fetch latest remote before worktree creation & improve settings spacing (#105)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 22:16:11 -07:00
JinjingandClaude Opus 4.6 4c0eee235b fix: extract path-security helpers, add tests, and improve type safety (#102)
* fix: extract path-security helpers and refactor IPC modules

- Extracted path-security helpers from filesystem.ts into filesystem-auth.ts to fix max-lines lint error (402 -> 293 lines)
- Extracted duplicated ENOENT detection into isENOENT() helper to eliminate code duplication
- Fixed missing curly braces on single-line if-return in isDescendantOrEqual (lint violation)
- Replaced any with unknown in test files to satisfy lint rules
- All tests passing (29/29)
- Lint clean (0 errors, 0 warnings)

* fix: bundle preload deps for sandbox mode and fix editor test types

The sandbox: true change in createMainWindow broke the app because
electron-vite was externalizing @electron-toolkit/preload, producing
a require() call that fails in sandboxed preload scripts. Exclude it
from externalization so it gets bundled inline.

Also fix type errors in editor.test.ts from the partial store setup.

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 09:59:19 -07:00
JinjingandClaude Opus 4.6 6aab126edb fix: prevent terminal shortcuts from intercepting keystrokes in editable elements (#103)
Replace fragile tagName checks with a robust isEditableTarget() helper that
covers input, textarea, select, and contenteditable elements. Also add
Cmd/Ctrl+Enter support and stopPropagation to the WorktreeMetaDialog comment
textarea so Enter doesn't trigger terminal handlers.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-25 09:52:46 -07:00
Jinjing ddc8a78744 Display PR checks and title updates (#101)
- Add PR checks panel to right sidebar
- Stream checks from GitHub API
- Update PR title real-time with loading state
- Add error logging and dependency fixes
- Fix linting issues (curly braces, exhaustive deps)
2026-03-25 09:29:39 -07:00
NeilandClaude Opus 4.6 0b9624ec70 feat: linux-friendly keyboard shortcuts (#93)
* feat: make keyboard shortcuts work with Ctrl on Linux/Windows

All Cmd+X shortcuts now also respond to Ctrl+X on non-Mac platforms.
Tooltip hints show platform-appropriate modifier symbols.

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

* docs: add cross-platform guidelines to AGENTS.md

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 22:21:14 -07:00
JinjingandClaude Opus 4.6 bcf134c19f fix: clear stale agent working indicators when title stops updating (#100)
Adds clearWorkingIndicators to strip spinner/prefix/keyword markers from
terminal titles after 3s of data flow without a title update, preventing
the UI from showing a stuck "working" status after an agent exits.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 21:43:19 -07:00
Jinjing 624786d4cd fix: stream file search results and cancel stale searches (#99) 2026-03-24 21:30:35 -07:00
Jinjing 9c5a1f48bb Add PR checks workflow and Vitest coverage (#97) 2026-03-24 20:53:38 -07:00
JinjingandClaude Opus 4.6 bd78551935 refactor: modularize main process and Terminal component (#96)
Extract main process into focused modules (startup, window, menu, IPC
registration) and decompose the monolithic Terminal component into
TerminalShell, useTerminalTabs, useTerminalShortcuts, and
useTerminalSaveDialog hooks.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 20:17:34 -07:00
Jinjing 2b9e5d7486 fix: persist repo sidebar filters (#94) 2026-03-24 20:05:44 -07:00
Jinjing f5dc4de2a8 fix: sync pty size after terminal appearance changes (#95) 2026-03-24 19:52:56 -07:00
NeilandClaude Opus 4.6 c7eeef4e8c feat: add worktree rename (display name) (#90)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 19:03:15 -07:00
NeilandClaude Opus 4.6 556f31abcd feat: drag-and-drop reordering for editor file tabs (#86)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 19:03:13 -07:00
NeilandClaude Opus 4.6 04e85504bb fix: allow Option+Backspace word-delete in input fields (#89)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 19:02:57 -07:00
Jinjing 53ce1c06b0 fix: refresh GitHub status on active worktree reselect (#92) 2026-03-24 19:01:20 -07:00
JinjingandClaude Opus 4.6 524b815e35 fix: stop sending cursor style escape sequences to PTY as input (#91)
The cursor style sequence (e.g. \e[5 q) was being sent to the shell via
sendInput(), causing literal "[5 q" text to appear in the terminal. The
shell doesn't interpret DECSCUSR sequences. Cursor style is already
correctly applied via xterm.js terminal options.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 18:29:54 -07:00
Jinjing 9f35358d1c feat: support multi-repo sidebar filtering (#88) 2026-03-24 16:15:26 -07:00
JinjingandClaude Opus 4.6 083c272723 fix: restore sidebar text contrast and lowercase repo names (#87)
Revert low-contrast text styles from PR #85 (worktree name, branch, repo
badge, group headers) back to full contrast. Force repo names to lowercase.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 16:14:53 -07:00
JinjingandClaude Opus 4.6 4aef937358 feat: improve sidebar worktree card design and add EIO/EPIPE crash guard (#85)
Redesign worktree cards with cleaner layout, inline PR state/CI badges,
and refined group headers. Hide redundant repo badge when grouped by repo.
Add uncaughtException handler to prevent crash on IPC pipe errors during quit.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 14:50:43 -07:00
JinjingandClaude Opus 4.6 0eed79fd4a fix: update sortOrder on worktree activation for correct recent sorting (#84)
When a worktree is activated, update its sortOrder timestamp so that
the "recent" sort reflects the actual last-accessed time.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 09:17:31 -07:00
JinjingandClaude Opus 4.6 a0d8ba1e18 fix: route clipboard writes through Electron IPC to prevent NSPasteboard contention (#83)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 09:15:38 -07:00
NeilandClaude Opus 4.6 34c3fbe9e0 feat: drag files from explorer sidebar to terminal (#82)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-24 00:33:45 -07:00
NeilandClaude Opus 4.6 02b603b580 feat: copy path to line from editor tab and line number gutter (#79)
* feat: add copy path/relative path to line in editor tab context menu

Tracks cursor line position from Monaco editor and adds context menu
options to copy file path with line number anchor (e.g. path#L59).

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

* fix: add copy path to line in Monaco editor context menu

Adds "Copy Path to Line" and "Copy Relative Path to Line" as Monaco
editor context menu actions so they appear on right-click anywhere in
the editor. Also handles right-click on line number gutter to show
the context menu there too.

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

* fix: use Radix context menu for line number gutter right-click

Replaces Monaco's built-in context menu with a Radix DropdownMenu for
the line number gutter, matching the VSCode approach of intercepting
the gutter right-click and showing a custom menu. Shows the clicked
line number in the menu items.

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

* fix: simplify gutter context menu to just path-to-line options

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

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:49:37 -07:00
JinjingandClaude Opus 4.6 d9facf1b9c fix: prevent app crash on macOS reactivation by deduplicating IPC handlers (#81)
When macOS re-activates the app after all windows are closed, `createWindow()` is called
again but IPC handlers from the previous window were still registered, causing duplicate
handler errors and crashes. This fix removes stale handlers before re-registering them
in pty, repos, and worktrees modules, and ensures repo/worktree handlers + auto-updater
are also set up on activate. Includes minor lint/style cleanups across the codebase.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:44:12 -07:00
JinjingandClaude Opus 4.6 598f7c17fa feat: display CI build status on worktree cards (#80)
Show CI check status icons (success/failure/pending) next to the branch
name on worktree cards. Return 'neutral' instead of 'pending' when no
CI checks exist to avoid showing a misleading spinner. Fix lint errors
in client.ts (curly braces, array-type).

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:36:57 -07:00
NeilandClaude Opus 4.6 1dff41c6d7 feat: add VS Code-style file search and icon activity bar (#78)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:28:05 -07:00
JinjingandClaude Opus 4.6 20cfa1f279 feat: add clickable file path links in terminal (#77)
- Add terminal link detection that recognizes file paths with optional
  line:column suffixes and opens them in the editor or externally
- Split shell IPC into separate openUrl, openFilePath, openFileUri, and
  pathExists handlers with proper URL/path validation
- Register xterm link providers per pane with path existence caching
- Support OSC 8 hyperlinks for http(s) and file: protocols
- Add editor-reveal-location custom event for jumping to line/column

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:17:41 -07:00
JinjingandClaude Opus 4.6 417a49bc1b feat: unify worktree meta editing into single dialog with double-click support (#76)
Merge the separate "Link Issue" and "Edit Comment" modals into a single
"Edit Worktree Details" dialog. Add double-click on worktree cards to
open the unified editor. Context menu items now focus the relevant field.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 23:06:44 -07:00
JinjingandClaude Opus 4.6 810934ac65 fix: use generation tracking to prevent killing new PTYs on renderer reload (#74)
The did-finish-load handler was killing all PTY processes, including ones
spawned during the current page load. This caused blank terminals when a
race between renderer reload and PTY creation occurred. Now each PTY is
tagged with a load generation counter, and only PTYs from previous
generations are killed on reload.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 21:33:16 -07:00
JinjingandClaude Opus 4.6 82425df6ea fix: remount terminal panes after shutdown to restore PTY connections (#73)
When all PTYs are dead after shutdown, bump a generation counter on
terminal tabs so React remounts TerminalPane components with fresh
PTY connections instead of showing stale terminals.

Also converts interfaces to type aliases in types.ts to satisfy linter.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 17:10:28 -07:00
JinjingandClaude Opus 4.6 9853bba8ba fix: resolve TS build errors in EditorPanel and context menu (#72)
- Return empty fragment instead of null to satisfy JSX.Element return type
- Remove unused paneTransportsRef parameter and PtyTransport import

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 17:06:44 -07:00
JinjingandClaude Opus 4.6 29119e1d6d fix: resolve TypeScript build errors for unused variable and return type (#71)
Remove unused `paneTransportsRef` from context menu hook and fix
`EditorPanel` return type to allow `null`.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 16:56:57 -07:00
JinjingandClaude Opus 4.6 e0fc58cc56 fix: bundle Monaco workers locally and fix JSX/TSX language detection (#69)
Use Vite worker imports to bundle Monaco web workers instead of relying on CDN,
and correct language IDs for .tsx/.jsx files to typescriptreact/javascriptreact.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 16:47:13 -07:00
Jinjing 2163c67035 fix: scope editor files and tabs per worktree (#68) 2026-03-23 16:45:00 -07:00
NeilandClaude Opus 4.6 90d1da84fb fix: use autoUpdater.quitAndInstall() on macOS to actually apply updates (#62)
The previous approach used app.relaunch() + app.quit() to avoid a crash
dialog, but this created a race condition where the app relaunches the
old version before electron-updater's installer replaces the .app bundle.

Instead, use autoUpdater.quitAndInstall() on all platforms with proper
cleanup beforehand (kill PTY processes, flush store, destroy windows) to
ensure a clean exit without crash dialogs.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 16:39:16 -07:00
JinjingandClaude Opus 4.6 81d8a2c10c fix: improve text wrapping in delete worktree dialog (#67)
Add break-all to worktree name and use proper flex layout for error
messages to prevent long text from overflowing the dialog.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 16:38:08 -07:00
JinjingandClaude Opus 4.6 5765791bb9 refactor: extract TerminalPane hooks and modularize terminal themes (#66)
Split the monolithic TerminalPane component into focused custom hooks
(lifecycle, context menu, global effects, dark mode detection) and break
the large terminal-themes-data file into organized modules.

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-23 16:31:29 -07:00
Jinjing 3a650b4196 fix: route terminal paste through electron clipboard (#65) 2026-03-23 16:27:50 -07:00