Commit Graph
219 Commits
Author SHA1 Message Date
Jinjing e0e01cd687 feat: configurable worktree cards with property toggles (#232)
- fix: stay under max-lines lint limit after merge with main

Extract restoreScrollbackBuffers into layout-serialization.ts to reduce
use-terminal-pane-lifecycle.ts below the 300-line limit. Also filter
stale leaf IDs from persisted scrollback buffers and remove design doc.

- fix: polish worktree card controls

- feat: configurable worktree cards with property toggles
2026-03-31 08:49:00 -07:00
Jinjing f2eb119c62 feat: display CI conflict details and improve merge-conflict UX (#234)
- 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
2026-03-31 01:27:39 -07:00
Jinjing 86ea7ad719 feat: improve updater flow with auto-restart after download (#231)
* improve the updater

* fix: extract restoreScrollbackBuffers to fix max-lines lint error
2026-03-30 22:58:17 -07:00
Yax Patel c6481d8b64 feat: improve terminal font settings with weight control and keyboard navigation (#228) 2026-03-30 20:47:21 -07:00
Jinwoo HongandClaude Opus 4.6 831b65fe65 feat: restore terminal scrollback on app restart (#224)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-30 20:11:35 -07:00
Jinjing 240df66365 fix: display image files in editor instead of "Binary file — cannot display" (#222)
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).
2026-03-30 00:00:32 -07:00
Jinjing f7eaf2e5e0 fix: restore markdown preview list markers (#223)
* fix: restore list markers in markdown preview

The app-wide CSS reset removes list-style from all elements, which
strips bullet points and numbers from markdown preview content.
Add scoped overrides for .markdown-body to restore disc/circle/square
markers for unordered lists and decimal markers for ordered lists.

* fix: restore markdown preview list markers
2026-03-30 00:00:03 -07:00
Jinjing 414b7e8cd5 fix: restore list markers in markdown preview (#221)
The app-wide CSS reset removes list-style from all elements, which
strips bullet points and numbers from markdown preview content.
Add scoped overrides for .markdown-body to restore disc/circle/square
markers for unordered lists and decimal markers for ordered lists.
2026-03-29 23:55:08 -07:00
Jinjing d45ead3682 fix: use inline-flex to stabilize find widget buttons (#220) 2026-03-29 23:14:42 -07:00
Jinjing affa73bcd3 fix: Windows compatibility — CRLF line endings and cross-drive path traversal (#217)
* 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.
2026-03-29 22:06:59 -07:00
Jinjing c625ce882e fix(updater): show feedback when check-for-update hits a mid-release draft (#215)
During a mid-release (draft version on GitHub), clicking "Check for Updates"
would silently return to idle with no user feedback. Now shows "You're on the
latest version" when the fallback confirms no published update is available.
2026-03-29 20:26:06 -07:00
Jinjing 91cf221786 fix(ui): prevent sidebar reordering on click (#214) 2026-03-29 20:05:36 -07:00
Neil 4c9ce5d230 Add View Changes action to update notifications (#210) 2026-03-29 19:54:48 -07:00
Jinjing aaece3483b fix: quick-open file search returns no results (#213)
The ripgrep command used --hidden with positive re-inclusion globs
('.github', '.github/**') to keep .github files visible.  However,
positive globs in ripgrep act as a whitelist — once present, only files
matching those positive patterns are returned, which excluded every
non-dotfile (including CLAUDE.md and all source files).

Drop --hidden entirely so rg uses its default behavior: skip hidden
dirs, respect .gitignore, and return all normal files.
2026-03-29 19:09:33 -07:00
Jinjing 774a405e58 fix(ui): show initial file list in quick-open and reduce empty padding (#212)
The conditional render guard hid the results container when there was
no query and loading was complete, which prevented the default 50-file
list from appearing.  Include filtered.length > 0 in the condition so
the initial results are visible.

Also removes the outer pb-2 so there is no empty space below the input
when no results are present, and reduces inner padding to pb-1.
2026-03-29 19:03:47 -07:00
Jinjing 2ea48cd96b fix(ui): allow Cmd/Ctrl+P when terminal is focused (#211)
* fix(ui): allow Cmd/Ctrl+P when terminal is focused

xterm.js uses a hidden <textarea class="xterm-helper-textarea"> for
keyboard capture.  isEditableTarget() was treating it as a real editable
field, which suppressed all global shortcuts (Cmd+P, Cmd+N, etc.) when
the terminal had focus.

Exclude that element so app-level keybindings remain reachable.

* fix(ui): hide empty quick-open results area and reduce bottom padding

The results container was always rendered with pb-2, leaving visible
empty space below the search input when there were no results.
Conditionally render the results div only when there is content, and
reduce padding from pb-2 to pb-1.
2026-03-29 19:02:19 -07:00
Jinjing b70ab2c4f7 fix(ui): prevent sidebar reordering on click and mark timed-out searches as truncated (#209)
Introduce sortEpoch to decouple sort recomputation from click-triggered
state changes (clearing isUnread, GitHub refresh). Use synchronous useMemo
instead of useEffect so the sort order is available before the first render.

Also fix timeout-killed ripgrep searches resolving with truncated: false,
which misled the UI into showing partial results as complete.
2026-03-29 18:14:14 -07:00
Neil efd9c72a76 fix: speed up sidebar file search (#208) 2026-03-29 17:21:06 -07:00
Jinjing 818a315bc9 fix(ui): increase active worktree card background contrast (#207)
The previous bg-accent/80 was too subtle to distinguish the active
worktree at a glance. Use bg-black/[0.06] (light) and bg-white/[0.10]
(dark) for a more obvious selection highlight.
2026-03-29 16:37:16 -07:00
Jinjing e2bb60339f feat: surface merge conflict warning in checks panel (#206) 2026-03-29 16:27:18 -07:00
Jinjing 193c6b96d1 fix(ui): fix scrolling in markdown preview and use editor scrollbar (#205)
- Update flex and height classes in MarkdownPreview, EditorContent, DiffViewer, and CombinedDiffViewer to ensure min-h-0 and flex-1 bubble down properly.
- Apply `scrollbar-editor` class to MarkdownPreview to match Monaco's scrollbar style.
2026-03-29 16:21:43 -07:00
Jinjing 333023fb67 feat: show merge conflicts in source control sidebar (#204)
* 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
2026-03-29 15:40:23 -07:00
Jinjing ba7634ed0a fix: reduce Gemini terminal flashing (#203) 2026-03-29 15:26:09 -07:00
Jinjing ca1d9c5779 feat: extract file explorer entry filter logic (#200)
- feat: extract file explorer entry filter logic
2026-03-29 13:16:43 -07:00
Jinjing 1ba8cda4d9 fix: prevent stale PR cache overwrites on force refresh (#198) 2026-03-29 12:55:14 -07:00
Jinjing 7b69790311 style: make squash and merge button smaller with xs size (#199) 2026-03-29 12:54:36 -07:00
Jinjing a7ae905a97 fix: add updater fallback for GitHub release transitions (#197) 2026-03-29 12:50:36 -07:00
Jinjing 2840ff98c1 feat: allow deleting files and folders from file explorer (#196)
Add file/folder deletion via right-click context menu using Electron's
shell.trashItem (moves to OS trash, not permanent delete). Includes a
confirmation dialog, reveal-in-explorer support, and refactors the file
explorer into smaller composable modules.
2026-03-29 12:44:11 -07:00
Jinjing 98cbfcabfa fix: hide branch empty state on Uncommitted tab to avoid duplicate (#195)
The generic "No changes on this branch" empty state was showing on both
tabs. Scope it to the All tab so only "No uncommitted changes" shows on
the Uncommitted tab.
2026-03-29 09:56:46 -07:00
Jinjing 94fbbdbbd2 style: remove PR title from source control tab switcher (#192) 2026-03-29 09:44:01 -07:00
Jinjing 6622dfac11 style: use PR icon+link style matching WorktreeCard (#191)
Replace the colored badge with the same PR display style used in
WorktreeCard: state-colored PullRequestIcon, clickable PR number link,
and truncated title text.
2026-03-29 09:42:06 -07:00
Jinjing 86c64e9005 feat: move PR badge to tab switcher and make it clickable (#190)
Move the PR badge from CompareSummary into the tab switcher bar so it's
always visible. Clicking it opens the PR on GitHub.
2026-03-29 09:40:13 -07:00
Jinjing 24fdd2d862 style: improve PR badge display in source control tab (#189)
Use state-colored styling for the PR badge (matching checks panel)
and remove redundant "files changed" count from compare summary header.
2026-03-29 09:35:45 -07:00
Jinjing 9be4b6e33e fix: restore explorer scrolling (#186) 2026-03-29 00:27:38 -07:00
Jinjing 666c2906d0 fix: improve scrollbar styling and fix file explorer scroll-vs-drag conflict (#185)
- Switch scrollbar to VS Code-like always-visible style with proper
  hover/active states using color-mix
- Use background-color instead of background shorthand in scrollbar
  pseudo-states to preserve background-clip: padding-box
- Add wheel capture handler to prevent draggable items from eating
  scroll events in file explorer
- Fix flex overflow with h-full min-h-0 on scroll container
- Only allow file items (not directories) to be draggable
2026-03-29 00:19:17 -07:00
Jinjing 3945726a43 style: top-align empty state in checks tab (#184) 2026-03-28 22:25:42 -07:00
Jinjing 165e2dda90 style: reduce file & icon display size in sidebar views (#183)
Shrink file entry rows in Source Control and File Explorer for a more
compact sidebar: smaller icons, tighter gaps, reduced font sizes, and
less left padding.
2026-03-28 17:09:41 -07:00
Jinjing 3644aa8f29 Show committed files in the "source control" tab (#181)
* 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
2026-03-28 17:00:40 -07:00
Jinjing dbab855611 fix: guard against empty branch names in PR check status lookups (#182)
During a rebase with detached HEAD, the branch name can be empty or
resolve to empty after stripping refs/heads/. This caused gh to return
arbitrary PRs and created invalid cache keys like "path::".

Guard all branch-to-cache-key paths: getPRForBranch bails before
acquiring the semaphore, renderer components skip cache lookups,
and syncPRChecksStatus validates the normalized branch.
2026-03-28 16:10:56 -07:00
NeilandClaude Opus 4.6 5e4e4ea1db feat: detect agent idle via terminal title for unread notifications (#178)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-28 15:40:20 -07:00
Jinjing a43568247c feat: add quick open file navigation (#177) 2026-03-28 14:42:19 -07:00
Jinjing b8d6331220 feat: preview image files in editor diffs (#176) 2026-03-28 14:38:08 -07:00
Jinjing d78fcaa9b7 feat: show diff indicator in editor header and file tabs (#175)
Extract shared getEditorDisplayLabel() so both the tab bar and editor
header display "(diff)" / "(diff staged)" suffixes consistently.
2026-03-28 14:18:10 -07:00
Jinjing bbbe378467 feat: display hot key mappings in settings (#173) 2026-03-28 13:55:06 -07:00
Jinjing d4fc4bef19 Support dragging source control files into terminals (#172) 2026-03-28 13:37:52 -07:00
Jinjing 4669fa814e feat: show git status across file navigation (#170) 2026-03-28 12:30:04 -07:00
Jinjing 081410d113 feat: add release notes links to update UI (#169) 2026-03-28 12:01:23 -07:00
Jinjing e699bec46e WIP: uncommitted changes before rebase (#168) 2026-03-28 11:59:55 -07:00
Jinjing cf0565ab97 Harden external navigation and cross-platform path handling (#167) 2026-03-28 11:42:13 -07:00
Jinjing 1fae5bc000 Add checks status indicator dot to activity bar (#166)
Show a colored dot (success/failure/pending) on the Checks tab in the
right sidebar activity bar. Extracts check status derivation into a
dedicated github-checks module and syncs the computed status back into
the PR cache. Also reorders Search tab before Source Control.
2026-03-28 11:17:00 -07:00