* feat: add copy remote URL to line number context menu
Add 'Copy Remote URL' option to the line number gutter right-click menu,
allowing users to quickly copy a shareable link to a file and line on
GitHub, GitLab, Bitbucket, or other hosted git providers.
- Install hosted-git-info to parse remote URLs and generate browse URLs
- Add getRemoteFileUrl() to resolve file URLs using default branch
- Wire up IPC handler, preload bridge, and renderer UI
- Use ExternalLink icon to distinguish from path copy options
* refactor: use @types/hosted-git-info instead of custom type declarations
Replace the custom hosted-git-info.d.ts with the @types package from
DefinitelyTyped. Use a targeted cast for browseFile() which the @types
package doesn't include yet (stuck on v3 API).
* refactor: revert to local type declarations for hosted-git-info
The @types/hosted-git-info package is stuck on the v3 API and lacks
browseFile(). A local .d.ts is cleaner than casting around stale types.
* fix: address review findings
- Add sandbox="allow-same-origin" to PDF iframes to prevent script execution
- Wrap atob() in try/catch to gracefully handle corrupt base64 data
- Reset imageError state on content change to allow re-rendering
- Add click overlay on PDF iframe so popup open works correctly
- Compact test mock resets to stay within max-lines lint rule
* fix: consolidate binary preview tests to stay within max-lines limit
- Reject worktree creation if the computed branch name already exists locally, on a remote, or in PR history. This prevents a fresh worktree from inheriting a stale/merged PR immediately after creation.
- Wrap getPRForBranch in try/catch so GitHub API failures don't block worktree creation
- Fix remote branch matching to compare full branch name after refs/remotes/<remote>/ prefix, preventing false positives
- Wrap updateWorktreeMeta in try/catch so meta-update failures don't leave the dialog in an error state for an already-created worktree
* feat: show ShieldAlert icon for conflict-review tabs
Display a distinct orange ShieldAlert icon for tabs opened in
conflict-review mode, differentiating them from regular diff tabs.
* fix: clear stale Rebasing/Merging badge on non-active worktrees
The git status polling only runs for the active worktree. When a
non-active worktree finishes rebasing, its conflict operation was
never updated to 'unknown', leaving the badge stuck.
Add a lightweight git:conflictOperation IPC (fs-only, no git subprocess)
and poll it for non-active worktrees that have a non-unknown operation.
Once the operation clears, the worktree drops out of the poll list.
Expose whether a worktree is the repo's main working tree (the first
entry from `git worktree list`). This lets consumers distinguish the
main worktree from linked worktrees created via `git worktree add`.
- Add PRConflictSummary type and derive conflict metadata (base ref,
commits behind, conflicting files) via local git merge-tree
- Fix parseUnmergedEntry to use space-separated parsing (porcelain v2
unmerged entries are not tab-separated)
- Enhance rebase detection by checking rebase-merge/ and rebase-apply/
directories in addition to REBASE_HEAD
- Show conflicting files list and commits-behind count in ChecksPanel
- Disable merge button with tooltip when PR has conflicts
- Add operation banners (merge/rebase/cherry-pick) in SourceControl
and WorktreeCard
- Reorder section list so unstaged changes appear above staged
- Extract conflict-summary, issues, and gh-utils into separate modules
- Add 10s timeout to git fetch in conflict summary derivation
- Fix test fixtures to match real porcelain v2 format
Wire up ImageViewer and ImageDiffViewer components by passing file path
through bufferToBlob/buildDiffResult and returning base64 content + MIME
type for recognized image formats (PNG, JPG, GIF, SVG, WebP, BMP, ICO).
* fix: Windows compatibility — handle CRLF line endings and cross-drive path traversal
- Replace literal '\n' splits with /\r?\n/ regex across git output parsers
(status, worktree, hooks, file listing) to handle Windows CRLF line endings
- Fix path traversal security check in isDescendantOrEqual using isAbsolute()
instead of sep+sep prefix check, preventing cross-drive bypasses on Windows
- Strip trailing \r from ripgrep output in quick-open file listing
* fix(test): align updater test with user-initiated not-available behavior
The test expected 'idle' for a user-initiated check hitting a missing
latest-mac.yml, but the code correctly sends 'not-available' to give
the user explicit feedback that they're on the latest version.
* Squashed commits
- refactor
- commit design doc
* docs: add why-comments to conflict resolution code and track conflicts on open
- Add explanatory comments throughout conflict resolution code covering
safety constraints, architectural boundaries, and compatibility choices
- Track unresolved conflicts in openConflictFile so Resolved locally
state works for conflict-safe entry point
- Add CLAUDE.md/AGENTS.md guideline for documenting the "why"
- Add test for conflict tracking through openConflictFile
* refactor: auto-review fixes and UI improvements
- Remove dead code and fix type assertion in getBranchDiff
- Tighten GitDiffBinaryResult type constraint
- Fix race condition in CombinedDiffViewer with generationRef
- Fix reference stability in setGitBranchCompareResult
- Extract LazySection component to fix max-lines lint
- Update filesystem IPC to match updated signatures
- Adjust file explorer item spacing and font size
* fix: correct test expectation for staged diff header label
- Enhance discardChanges to handle untracked files by deleting them instead of git checkout
- Add path traversal protection to prevent discarding files outside the worktree
- Extract source control action logic into getSourceControlActions helper
- Show revert button for untracked files with confirmation dialog
- Add tests for both backend and frontend logic
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Fix ChecksPanel memory leak: add cancelled flag to prevent schedulePoll after unmount
- Include status in check signature for proper backoff reset on state transitions
- ChecksPanel lint: use ternary instead of if/else
- Don't cache empty string on gh CLI failure so login detection retries
- Clear checksCache on refreshAllGitHub to ensure fresh data
- Remove dead fetchIssueList code and supporting infrastructure
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>
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>