Commit Graph
16002 Commits
Author SHA1 Message Date
Brennan Benson 033b8bcc31 fix: snapshot uncommitted entries in combined diff to survive commits (#652) 2026-04-14 14:11:05 -07:00
Jinwoo Hong 8f8cbf1497 fix: skip Windows code signing verification for unsigned builds (#651) 2026-04-14 16:10:55 -04:00
Jinwoo Hong 0186891bf2 perf: keep right sidebar mounted when closed to avoid remount freeze (#640) 2026-04-14 16:06:39 -04:00
Jinwoo Hong a913d7f939 fix: add pnpm/yarn/bun global bin paths and resolve claude CLI for GUI-launched apps (#649) 2026-04-14 12:32:29 -07:00
Jinjing 4479e4c0eb fix: use >= in compareVersions fallback to handle equal/unparseable versions (#635)
compareVersions returns 0 for both genuinely equal versions and
unparseable strings. In the localIndex === -1 fallback path, skipping
on >= 0 (instead of just > 0) avoids showing stale rich cards when
the version relationship is ambiguous.
2026-04-14 10:33:25 -07:00
Jinjing bc20035652 fix: improve rich card display logic for current and unlisted versions (#634)
Show rich changelog entries at the user's current version (they may not
have seen the card yet). When the local version isn't in the changelog
JSON, use semver comparison instead of assuming the user is very old —
this avoids showing stale cards to users on newer patch releases.
2026-04-14 10:25:55 -07:00
50d372c385 fix: copy-on-selection for right-click paste in terminal (#632)
Co-authored-by: theofbonin <theo@frizzarin.com.br>
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-14 10:07:30 -07:00
Jinjing 6f89c89075 fix: worktree list right-side padding and hidden scrollbar (#629)
Hide the sidebar scrollbar and add right padding to prevent cards
from touching the sidebar edge.
2026-04-14 01:26:46 -07:00
Jinwoo Hong 170610d1b2 fix: resolve Windows freeze when switching worktrees with right sidebar open (#628) 2026-04-14 00:45:04 -07:00
Jinjing ed981ad4d8 Fix sidebar virtualizer layout after worktree deletes (#627) 2026-04-14 00:30:34 -07:00
Jinwoo Hong 60a092686b perf: systematic performance optimizations (#623) 2026-04-14 00:28:56 -07:00
Jinjing ef75e8d0c2 fix: avoid stale worktree card remeasurement (#626)
* fix: guard WorktreeList getItemKey against stale virtualizer cache entries

When rows shrink (group collapse, worktree removal) while PR/issue data
arrives asynchronously, the virtualizer's elementsCache can hold stale
entries whose data-index exceeds the new rows length. measureElement
calls getItemKey for those stale indices, causing "Cannot read properties
of undefined (reading 'type')". Add a null guard matching the pattern
already used by FileExplorer and Search virtualizers.

* fix: avoid stale worktree card remeasurement
2026-04-13 23:57:48 -07:00
Jinjing 5bb03eb8f4 fix: guard WorktreeList getItemKey against stale virtualizer cache entries (#625)
When rows shrink (group collapse, worktree removal) while PR/issue data
arrives asynchronously, the virtualizer's elementsCache can hold stale
entries whose data-index exceeds the new rows length. measureElement
calls getItemKey for those stale indices, causing "Cannot read properties
of undefined (reading 'type')". Add a null guard matching the pattern
already used by FileExplorer and Search virtualizers.
2026-04-13 23:31:50 -07:00
Jinjing 2b5ac7239f fix: improve cmd+j palette search stability and selection behavior (#622)
- Snap selection to first result when search query changes instead of
  keeping a stale mid-list selection
- Add 150ms debounce on search to reduce result list reshuffling
- Scroll list to top on query change
- Remove green highlight on current worktree row (Current badge remains)
- Remove primary-branch promotion sort that caused jumpy reordering
2026-04-13 22:51:12 -07:00
Jinjing 0ad3fda397 fix: harden active agent hovercard (#621) 2026-04-13 22:49:15 -07:00
Jinjing 130c3e9697 feat: scope terminal shell history per worktree (#620)
* feat: scope terminal shell history per worktree

Each worktree gets its own HISTFILE so ArrowUp only surfaces commands
from the current worktree. Integrates with the new LocalPtyProvider
architecture: history env injection runs after buildSpawnEnv but before
spawnShellWithFallback, and onBeforeFallbackSpawn keeps HISTFILE in
sync when the shell falls back.

* fix: align preload type declaration with implementation

Add missing command field to PtyApi.spawn in index.d.ts to match
the runtime index.ts signature, fixing TS2769 overload conflict.

* chore: remove terminal-history-scope-design.md from tracked files

* fix: mock terminal-history in worktrees test

The deleteWorktreeHistoryDir import pulls in electron's app module.
Add a vi.mock so the test doesn't hit the real electron export.
2026-04-13 22:42:53 -07:00
Jinjing 28a1c93c8c feat: allow dropping external files into the file explorer (#618)
Add support for dragging files from the OS into the file explorer sidebar.
Files are copied (not moved) into the target directory within the worktree.

- Preload detects native file drops via capture-phase listener and resolves
  the drop target (editor, terminal, or file-explorer) from DOM attributes
- New IPC handler `fs:importExternalPaths` copies files/directories with
  symlink pre-scanning, path-traversal protection, and dedup on conflict
- FileExplorer tracks native drag state separately from internal drag state
  to show correct drop highlights without interfering with tree reordering
- FileExplorerRow expands directories on hover during native drags
- useFileExplorerImport hook subscribes to preload IPC events and drives
  the import → refresh → reveal pipeline

Includes review fixes:
- Clear nativeDropTargetDir on row drag-leave to prevent stale highlights
- Clear native drag state on early return in useFileExplorerImport
- Extract row drag logic to useFileExplorerRowDrag hook
- Split import tests into dedicated filesystem-import.test.ts
- Use T[] syntax instead of Array<T> per lint rules
- Use ternary expressions for simple if/else per lint rules
2026-04-13 22:04:49 -07:00
975328e258 fix: show platform-correct modifier keys on homepage shortcut hints (#613)
Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-authored-by: Manish Reddy <hello@nmreddy.me>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-04-13 22:00:07 -07:00
Jinwoo Hong 379835468f feat: add New Markdown shortcut to tab bar dropdown (#614) 2026-04-13 21:31:48 -07:00
75ce59c3c9 fix: paste on right-click in Windows terminals (#571)
Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Neil <4138956+nwparker@users.noreply.github.com>
Co-authored-by: Jinwoo Hong <73622457+Jinwoo-H@users.noreply.github.com>
2026-04-13 22:24:28 -04:00
Jinwoo Hong cc66e120eb feat: Add SSH remote support (beta) (#590) 2026-04-13 19:23:09 -07:00
Jinjing 8d6caa1f11 fix: show create-worktree action in jump palette only on empty results (#611)
The "Create worktree" item in Cmd+J now only appears when the search
query produces no matching worktrees, keeping the list uncluttered when
existing worktrees already satisfy the search.
2026-04-13 19:08:10 -07:00
Jinjing 117d100019 feat: add Reveal in Finder to editor header and tab context menus (#603) (#609)
Add a right-click context menu to the editor header file path button
with Copy Path, Copy Relative Path, and platform-aware Reveal in
Finder/File Explorer. Also add the same reveal action to the editor
tab context menu, and reorder tab close actions so Close All appears
above Close Tabs To The Right.
2026-04-13 18:51:59 -07:00
Jinjing 2d9e40e12b feat: add file filter to source control panel (#607)
Adds a search input that filters changed files across all sections
(Changes, Staged, Untracked, Committed on Branch) via case-insensitive
path substring match. Section counts and empty states update to reflect
filtered results.
2026-04-13 18:40:37 -07:00
Jinjing 60a72f2b29 fix: re-measure virtualizer items when async card content loads (#605)
PR/issue data arrives after worktree cards mount, changing their height.
The virtualizer's ResizeObserver can miss the resize during React's
batched rendering, leaving stale measurements and overlapping cards.

Add a useLayoutEffect that re-measures all cached elements when the
PR or issue cache grows, ensuring positions are corrected before paint.
2026-04-13 18:36:01 -07:00
Jinwoo HongandClaude Opus 4.6 d418841cab fix: set UTF-8 console code page on Windows to prevent garbled CJK characters (#601)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 21:27:19 -04:00
Jinwoo HongandClaude Opus 4.6 4321138de3 feat: native file watching for WSL repos via inotifywait (#602)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 20:21:28 -04:00
Brennan Benson f22f36b284 fix: make PDF preview fill available vertical space (#600) 2026-04-13 17:08:04 -07:00
Jinwoo HongandClaude Opus 4.6 48c67ca6f4 fix: resolve right sidebar freeze on Windows (#598)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:40:10 -04:00
Jinwoo HongandClaude Opus 4.6 b1a10c7ef2 fix: let Ctrl+D pass through as EOF on Windows/Linux (#599)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 19:38:37 -04:00
Brennan Benson 7cdc866f96 Run long GitHub issue commands reliably (#583) 2026-04-13 16:05:48 -07:00
Jinwoo HongandClaude Opus 4.6 3793125319 fix: resolve Codex spawn failures on Windows (#562)
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-13 15:49:44 -07:00
Brennan Benson 114c0d1b69 feat: preserve scroll, cursor, and undo across tab switches (#421) 2026-04-13 15:23:08 -07:00
Jinjing de128728d6 fix: remove bottom gap in active agent hovercard (#596)
* fix: remove bottom gap in active agent hovercard

Move the container's bottom padding into the hide button itself
so it sits flush at the card edge with no visible gap.

* fix: switch agent activity badge from hover to click popover

Hover was unpredictable — replace HoverCard with Popover so the
active-agent list opens on click instead.
2026-04-13 15:20:33 -07:00
Brennan Benson b7c77826d5 fix: keep monaco diagnostics config type-safe (#594) 2026-04-13 14:06:57 -07:00
c9ca2baa77 fix: disable false "Cannot find module" diagnostics in editor (#588)
* fix: disable false "Cannot find module" diagnostics in editor

Monaco's TypeScript worker runs in isolation without filesystem access,
so it cannot resolve imports to project files that aren't open as editor
models. This produces false "Cannot find module" diagnostics for every
import in TS/JS files, which is misleading noise.

Disable semantic validation for both TypeScript and JavaScript defaults.
Syntax highlighting and basic validation remain intact.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix(monaco): surgically disable TS diagnostics 2307, 2792 instead of all semantic validation

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-authored-by: Jinjing <6427696+AmethystLiang@users.noreply.github.com>
2026-04-13 11:04:13 -07:00
Jinwoo Hong e7f6344e89 Browser v2: workspace model, session profiles, and cookie import (#577) 2026-04-13 10:03:32 -07:00
Neil d7e045b19a fix: prevent Create button stuck disabled on repo re-select (#580) 2026-04-12 23:31:18 -07:00
Neil 4a526c0d7d Rename WORKTREES to WORKSPACES in sidebar (#576)
* chore: rename worktrees to workspaces in sidebar

* test: document max-lines exception for worktree slice tests
2026-04-12 23:01:41 -07:00
Jinjing be5f0c3cee fix: improve title bar agent label spacing (#575)
* wip

* fix: improve title bar agent label spacing when sidebar collapsed

- Move overflow-hidden to only apply when sidebar is open
- Apply shrink-0 and mr-2 in collapsed state to prevent squeezing and add gap
- Remove "active" label from agent badge for cleaner appearance
- Update comment explaining collapsed sidebar behavior

* fix: add max-lines disable to worktrees.test.ts

Pre-existing lint issue — file grew past 300-line limit on main.
2026-04-12 22:54:41 -07:00
Neil f7185e036c fix: remove stale worktree layout cleanup 2026-04-12 22:40:11 -07:00
1038295960 fix: clean up editor/terminal state when removing a worktree (#532)
removeWorktree already cleaned up openFiles, terminal layouts, browser
tabs, and several worktree-keyed maps, but four state properties leaked
indefinitely after a worktree was deleted:

- editorDrafts — unsaved draft content keyed by file ID
- markdownViewMode — rich/source toggle keyed by file ID
- expandedDirs — file explorer expansion state keyed by worktree ID
- activeTabIdByWorktree — remembered terminal tab keyed by worktree ID

Over a long session with many worktree create/delete cycles these
accumulated entries consume memory and can never be reclaimed because the
corresponding file and worktree IDs no longer exist in openFiles or
worktreesByRepo.

The fix collects the file IDs of the removed worktree's open files and
deletes their editorDrafts and markdownViewMode entries, then removes the
worktree's expandedDirs and activeTabIdByWorktree entries. A shallow copy
is only created when there are actually entries to remove, preserving the
no-op identity check that existing tests rely on.

Co-authored-by: Test User <test@example.com>
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-12 22:31:48 -07:00
RamziandClaude Opus 4.6 f7e89c6c8b fix: dispose PTY event listeners before kill to prevent SIGABRT crash (#534)
* fix: dispose PTY event listeners before kill to prevent SIGABRT crash

node-pty's onData/onExit callbacks register native NAPI ThreadSafeFunction
objects. When a PTY process is killed without deregistering these callbacks,
the stale ThreadSafeFunction references survive into the Node environment
cleanup phase (node::FreeEnvironment). NAPI then attempts to invoke CallJS
on the destroyed environment, causing Napi::Error::ThrowAsJavaScriptException
to throw a C++ exception that terminates the process with SIGABRT.

Store the IDisposable handles returned by proc.onData() and proc.onExit(),
and dispose them in clearPtyState() before the process is killed. This
covers all teardown paths: explicit pty:kill IPC, runtime controller kill,
page-reload orphan cleanup, and app-quit killAllPty.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

* fix: use T[] array syntax instead of Array<T> to satisfy oxlint

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-12 22:31:31 -07:00
Jinjing fa41047197 fix: stop worktree cards from overlapping in sidebar (#573)
* wip

* fix: replace fragile worktree card height estimation with constant

The virtualizer's estimateSize tried to predict exact pixel heights from
Tailwind class constants, which drifted from actual rendered sizes and
caused overlapping cards. Replace with a generous constant (120px) —
measureElement/ResizeObserver already corrects to real heights, so the
estimate just needs to overshoot. Delete the now-dead estimate module.
2026-04-12 22:29:24 -07:00
Jinjing 0e7d17870f Revert "feat: add quick-delete worktree shortcut" (#572) 2026-04-12 22:19:59 -07:00
Neil 91c88fad6b fix: suppress unread signals during PTY replay (#569) 2026-04-12 21:49:34 -07:00
Jinjing f9e803082c feat: implement on-demand update notification nudge (#570)
* wip

* feat: implement on-demand update notification nudge

* fix: address CI lint failures
2026-04-12 21:30:15 -07:00
Brennan Benson 8ef3139529 fix: improve settings page visual separation (#561) 2026-04-12 21:15:50 -07:00
Neil 735697dc1d Add VS Code-style search details toggle (#567) 2026-04-12 21:12:57 -07:00
Jinjing e130feedaa feat: enable drag-and-drop for committed file entries (#566) 2026-04-12 21:07:27 -07:00