Commit 88e7325
Small UX tweaks and a PTY resume fix (#6)
* Make new worktree form more visible
Accent-colored top border, bg-panel-raised container, label, and
primary-styled Create button so cmd+N isn't easy to miss.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add Open link to PR status header
Surfaces the PR URL directly so users don't need to remember the
open-PR hotkey.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add working/branch toggle to Changed Files panel
New segmented icon toggle switches between uncommitted working-tree
changes and the base...HEAD branch diff (same files a PR would show).
Base branch is auto-detected from origin/HEAD with fallbacks to
origin/main, origin/master, main, master.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Bump package-lock.json version during release
Keeps the lockfile's root version in sync with package.json so each
release commit doesn't leave a dangling lockfile drift.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add tooltips to close-tab and group-collapse buttons
The only two icon-only buttons in the app that were missing titles.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Stop focus reports from leaking into resumed PTYs
Saved scrollback can contain CSI ?1004h (enable focus reporting). When
that history was replayed on session resume, xterm would enable focus
reporting and then emit focus-out (ESC [ O) / focus-in (ESC [ I)
sequences into the freshly spawned Claude process, leaving a stray "O"
in Claude's input.
Fix: use the callback form of terminal.write so onData / PTY spawn are
deferred until history parsing finishes, then explicitly reset focus,
mouse, and bracketed-paste reporting modes before starting the new
process.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Surface merge conflicts in PR status panel
Fetch PR detail alongside check runs to pick up mergeable /
mergeable_state, then render a danger-colored "Merge conflict" line
above the checks row when GitHub reports mergeable_state: dirty (or
mergeable === false). Also promote conflicted PRs into the "Needs
Attention" sidebar group.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Tint worktree PR icon red on merge conflict
Conflicted PRs already land in Needs Attention, but the inline PR
icon in the worktree row was still colored by check status. Treat a
merge conflict as an error so the icon turns red too, and mention it
in the tooltip.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Surface check failure details in PR status panel
Expose output.summary and details_url/target_url from GitHub's check
runs and statuses, then use them to cut clicks when a check fails:
- Auto-expand the check list when checksOverall is 'failure' so the
user sees which check broke without expanding manually.
- Show a one-line failure reason (output.title, falling back to the
first meaningful line of output.summary) under each failed check.
- Clicking any check row with a details URL opens the CI log page in
the browser via openExternal, with an ExternalLink icon on hover.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Add Open in Editor feature
New Editor section in Settings lets the user pick a preferred GUI
editor (VS Code, Cursor, Windsurf, Zed, Sublime, and the JetBrains
lineup). The editor's CLI is spawned via a login shell so homebrew
paths are picked up.
Triggers:
- Code2 icon pinned to the far right of the terminal tab bar opens
the active worktree in the configured editor.
- Per-file Code2 icon on hover in the Changed Files panel opens a
specific file in the worktree context.
- Cmd+Shift+E hotkey (rebindable) opens the active worktree.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Fix status dot stuck on needs-approval after tool use
The hook script wrote status via 'echo {...} > file', which truncates
then writes. fs.watch on macOS can fire the callback during the tiny
window when the file is truncated but the new content hasn't landed,
causing JSON.parse to throw on an empty file. The dropped read meant
the needs-approval -> processing transition after a user approved a
tool use sometimes never reached the renderer and the dot stayed red.
Fix: make the hook write atomically — printf into a temp file, then
mv -f into place. The watcher only ever sees a fully-formed target
file. Bumped HARNESS_HOOK_VERSION so installed worktrees get the new
script. Added a small retry-on-parse-error in the watcher as defense
in depth, and a guard so the temp files we create don't trigger the
watcher themselves.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Make Shift+Enter insert a newline in Claude terminals
xterm.js sends bare \r for both Enter and Shift+Enter, so Claude
Code could not distinguish them and treated every Shift+Enter as
submit. Intercept Shift+Enter in the custom key event handler and
write '\\\r' (backslash + CR) directly to the PTY — this matches
Claude Code's documented line-continuation pattern and inserts a
newline regardless of cursor position.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Replace native title tooltips with Radix tooltips + hotkey hints
Native title tooltips have a ~500ms delay, can't be styled, and give
no way to teach the user the keyboard shortcut that drives the same
button. Swap them out for @radix-ui/react-tooltip wrapped in a thin
Tooltip component with a matching API (label, side, optional action).
- Radix handles collision detection, auto-flipping at viewport edges,
and sideOffset so tooltips don't appear on top of the target.
- delayDuration=0 for instant show, skipDelayDuration=0 so moving
between adjacent buttons stays snappy.
- A HotkeysProvider context wraps the app and the Settings screen,
exposing the resolved hotkey map (defaults + user overrides). When
a Tooltip is given an action prop it renders the current binding
in a mono chip with mac glyphs (⌘⇧⌥⌃) so users discover shortcuts
without opening Settings.
- Swept every icon button across Sidebar, TerminalPanel,
ChangedFilesPanel, PRStatusPanel, WorktreeTab, and the Settings
hotkey reset button.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Branch new worktrees off the latest remote main
Previously 'git worktree add -b <name>' with no explicit base used
whatever was checked out in the main repo, which meant new worktrees
inherited stale local main or whatever branch happened to be checked
out. Now the default is to fetch origin and branch from
origin/<default>, falling back to local HEAD if the fetch fails
(offline, no remote, etc.).
Added a worktreeBase setting ('remote' | 'local', default 'remote')
with a new Worktrees section in Settings explaining the tradeoff:
remote is always up-to-date but costs a fetch, local is faster but
inherits whatever is locally checked out.
getDefaultBaseRef is now exported from worktree.ts and reused for
both the Changed Files branch-diff mode and worktree creation.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
* Auto-focus the active terminal when switching worktrees
Switching worktrees previously dropped keyboard focus into nothing,
so the first keystroke after a switch would get lost. Add a useEffect
that runs on activeWorktreeId / activeTabId changes and schedules a
focusTerminalById on the next frame (so the TerminalPanel's
display:none → display:block swap has already happened). Skips diff
tabs since those are read-only.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>1 parent 7796043 commit 88e7325
23 files changed
Lines changed: 1458 additions & 172 deletions
File tree
- scripts
- src
- main
- preload
- renderer
- components
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
| 93 | + | |
93 | 94 | | |
94 | 95 | | |
95 | 96 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
107 | | - | |
| 107 | + | |
108 | 108 | | |
109 | 109 | | |
| 110 | + | |
110 | 111 | | |
111 | | - | |
| 112 | + | |
112 | 113 | | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
113 | 120 | | |
114 | | - | |
| 121 | + | |
115 | 122 | | |
116 | 123 | | |
117 | 124 | | |
| |||
130 | 137 | | |
131 | 138 | | |
132 | 139 | | |
133 | | - | |
| 140 | + | |
134 | 141 | | |
135 | 142 | | |
136 | 143 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
12 | 16 | | |
13 | 17 | | |
14 | 18 | | |
| |||
19 | 23 | | |
20 | 24 | | |
21 | 25 | | |
| 26 | + | |
| 27 | + | |
22 | 28 | | |
23 | 29 | | |
24 | 30 | | |
| |||
92 | 98 | | |
93 | 99 | | |
94 | 100 | | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
95 | 106 | | |
96 | 107 | | |
97 | 108 | | |
98 | 109 | | |
99 | | - | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
100 | 113 | | |
101 | 114 | | |
102 | 115 | | |
| |||
108 | 121 | | |
109 | 122 | | |
110 | 123 | | |
| 124 | + | |
111 | 125 | | |
112 | 126 | | |
113 | 127 | | |
| |||
185 | 199 | | |
186 | 200 | | |
187 | 201 | | |
188 | | - | |
189 | | - | |
| 202 | + | |
| 203 | + | |
| 204 | + | |
| 205 | + | |
190 | 206 | | |
191 | | - | |
| 207 | + | |
| 208 | + | |
192 | 209 | | |
193 | 210 | | |
| 211 | + | |
| 212 | + | |
| 213 | + | |
| 214 | + | |
| 215 | + | |
| 216 | + | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
194 | 220 | | |
195 | 221 | | |
196 | 222 | | |
197 | 223 | | |
198 | 224 | | |
199 | | - | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
200 | 228 | | |
201 | 229 | | |
202 | 230 | | |
203 | 231 | | |
204 | 232 | | |
205 | 233 | | |
206 | | - | |
| 234 | + | |
| 235 | + | |
207 | 236 | | |
208 | 237 | | |
209 | 238 | | |
| |||
221 | 250 | | |
222 | 251 | | |
223 | 252 | | |
224 | | - | |
| 253 | + | |
| 254 | + | |
225 | 255 | | |
226 | 256 | | |
227 | 257 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
7 | 7 | | |
8 | 8 | | |
9 | 9 | | |
10 | | - | |
| 10 | + | |
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
16 | 22 | | |
17 | | - | |
18 | | - | |
19 | | - | |
20 | | - | |
21 | | - | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
22 | 33 | | |
23 | 34 | | |
24 | 35 | | |
| |||
141 | 152 | | |
142 | 153 | | |
143 | 154 | | |
| 155 | + | |
| 156 | + | |
144 | 157 | | |
145 | 158 | | |
146 | 159 | | |
147 | 160 | | |
148 | 161 | | |
149 | 162 | | |
150 | 163 | | |
151 | | - | |
152 | | - | |
153 | | - | |
154 | | - | |
155 | | - | |
156 | | - | |
157 | | - | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
158 | 182 | | |
159 | | - | |
160 | | - | |
161 | 183 | | |
| 184 | + | |
162 | 185 | | |
163 | 186 | | |
164 | 187 | | |
| |||
0 commit comments