* 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.
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
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.
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.
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.
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.
* 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.
* 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>
* 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.
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>
* 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>
* 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.