fix: require explicit workspace group close - #3206
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
Included review availability: Your plan provides up to 10 included reviews per hour; 9 remain after this review. 📝 WalkthroughWalkthroughThe ChangesWorkspace group closure
Application event compatibility
Estimated code review effort: 4 (Complex) | ~45 minutes Merge Risk: ⚪ Minimal · up to The PR changes workspace group-close behavior and the protocol contract, but no actionable merge-blocking risk remains at the current head. It is merge-ready after normal checks and review. Sequence Diagram(s)sequenceDiagram
participant CLI
participant Runtime
participant WorkspaceAPI
participant WorkspaceState
participant EventStream
CLI->>Runtime: workspace ID and optional --group
Runtime->>WorkspaceAPI: WorkspaceCloseParams
WorkspaceAPI->>WorkspaceState: validate and select worktree group
WorkspaceState-->>WorkspaceAPI: selected workspace snapshots
WorkspaceAPI->>WorkspaceState: remove group workspaces
WorkspaceAPI->>EventStream: emit WorkspaceClosed for each workspace
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: c8acc22e-5a53-4cb7-a917-45f0cb4db9b5
📒 Files selected for processing (23)
docs/next/CHANGELOG.mddocs/next/api/herdr-api.schema.jsondocs/next/website/src/content/docs/cli-reference.mdxdocs/next/website/src/content/docs/ja/cli-reference.mdxdocs/next/website/src/content/docs/ja/socket-api.mdxdocs/next/website/src/content/docs/socket-api.mdxdocs/next/website/src/content/docs/zh-cn/cli-reference.mdxdocs/next/website/src/content/docs/zh-cn/socket-api.mdxsrc/api/schema.rssrc/api/schema/tests.rssrc/api/schema/workspaces.rssrc/app/actions.rssrc/app/api/workspaces.rssrc/app/input/modal.rssrc/app/input/navigate.rssrc/app/runtime_mutations.rssrc/cli/runtime.rssrc/cli/workspace.rssrc/protocol/wire.rstests/api_ping.rstests/cli/sessions.rstests/cli/workspace.rstests/support/mod.rs
Included review availability: Your plan provides up to 10 included reviews per hour; 7 remain after this review.
812c14a to
abcf10b
Compare
There was a problem hiding this comment.
Actionable comments posted: 1
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: ed68b7c9-d22b-4096-8aac-58096bc86312
📒 Files selected for processing (3)
docs/next/website/src/content/docs/ja/socket-api.mdxdocs/next/website/src/content/docs/socket-api.mdxdocs/next/website/src/content/docs/zh-cn/socket-api.mdx
Included review availability: Your plan provides up to 10 included reviews per hour; 6 remain after this review.
Greptile SummaryThis PR makes closure of a primary workspace with open linked-worktree workspaces require explicit group intent.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains.
|
| Filename | Overview |
|---|---|
| src/app/api/workspaces.rs | Enforces explicit group-close intent, snapshots group members before mutation, performs cleanup, and publishes final closure events. |
| src/app/actions.rs | Centralizes group membership selection and safely removes potentially noncontiguous members in descending index order. |
| src/app/input/modal.rs | Routes confirmed context-menu and modal group closures through the public API mutation path. |
| src/app/input/navigate.rs | Preserves confirmation behavior for workspace and last-tab actions while explicitly requesting group closure when appropriate. |
| src/api/schema/workspaces.rs | Adds the backward-decodable close_group request field with an omitted-value default of false. |
| src/cli/workspace.rs | Adds the documented workspace close <id> --group command form and forwards explicit group intent. |
| src/protocol/wire.rs | Increments the exact-match client/server protocol constant from 20 to 21. |
| docs/next/api/herdr-api.schema.json | Publishes the protocol increment and updated workspace.close request schema. |
Flowchart
%%{init: {'theme': 'neutral'}}%%
flowchart TD
A[workspace.close request] --> B{Primary with linked workspaces?}
B -->|No| C[Close target workspace]
B -->|Yes| D{Explicit close_group?}
D -->|No| E[Return workspace_group_close_required]
D -->|Yes| F[Snapshot every group member]
F --> G[Remove group members in reverse index order]
G --> H[Shut down detached terminal runtimes]
H --> I[Emit one workspace.closed event per removed workspace]
Reviews (3): Last reviewed commit: "fix: require explicit workspace group cl..." | Re-trigger Greptile
abcf10b to
7ad6f56
Compare
7ad6f56 to
f90311f
Compare
refs herdrdev#2874 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com>
One Mode::ConfirmClose modal is now driven by three independent tokens: the fork's confirm_close_pane and confirm_respawn_pane, and upstream's confirm_close_workspace_id from the explicit workspace-group close (herdrdev#3206). Each opener cleared at most one of the others: the fork's two cleared each other but not the workspace id, and begin_workspace_close_confirmation cleared neither fork token. A workspace confirmation the user dismissed by opening a pane confirmation therefore stayed pending, and the next accept consumed it through take_confirmed_workspace_close_index and closed a workspace nobody had confirmed. Each of the three now clears the other two.
Upstream took protocol 21 for the explicit workspace-group-close fix (herdrdev#3206); the animated-indicator frame-patch change stacks on top as protocol 22.
* fix: preserve claude settings formatting (herdrdev#2089) refs herdrdev#2066 Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix(client): query host cell size when the ioctl reports no pixels (herdrdev#2160) * fix(cli): report non-UTF-8 arguments instead of panicking (herdrdev#2207) * fix(cli): report non-UTF-8 arguments instead of panicking * fix(cli): avoid echoing malformed arguments --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix: avoid blocking on foreground cwd checks (herdrdev#2213) refs herdrdev#2206 * fix(docs): publish only released documentation * fix(docs): support older git in snapshot checks * fix(input): preserve hover during extended-button drags * fix: propagate host color scheme to pane apps (herdrdev#2214) refs herdrdev#714 * fix(pi): restrict state reporting to tui sessions (herdrdev#2159) Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix: page keys scroll pane scrollback at zsh and REPL prompts (herdrdev#2191) * fix: page keys scroll pane scrollback at zsh and REPL prompts PageUp/PageDown were forwarded to the pane whenever DECCKM (application cursor) was on, assuming only primary-screen pagers enable it, but zsh's line editor also enables DECCKM, as do REPLs such as python3. The result was PageUp scrolling shell history instead of Herdr scrollback. Bracketed paste discriminates the two: it means the app accepts typed or pasted text at a prompt, so line editors enable it and pagers do not. * test: update page key state fixture --------- Co-authored-by: Can Celik <ogulcancelik@gmail.com> * feat(website): rebuild marketing pages on new brand chassis * docs: finalize 0.8.0 release documentation * release: v0.8.0 * docs: update website manifest for v0.8.0 * docs: refine cpu optimization blog post * fix(ui): keep collapsed workspace status visible (herdrdev#2239) refs herdrdev#2216 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * docs: publish preview documentation * feat(plugins): index marketplace manifests * fix(docs): allow corrections to published versions refs herdrdev#916 * fix(input): preserve shift-tab in pane automation (herdrdev#2259) refs herdrdev#1561 * fix(ui): preserve sidebar scroll across clients (herdrdev#2280) refs herdrdev#2255 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix(website): copy heading links to clipboard * fix: detect claude confirmation prompts refs herdrdev#2268 * feat(ui): add distinct status indicators (herdrdev#2282) refs herdrdev#2260 * fix(input): keep pending url clicks across host focus loss (herdrdev#2291) Opening a URL raises the browser, which takes focus away from the host terminal before the mouse release arrives. release_input_source(_headless) cleared pending_url_click_sources on that focus loss, so the release was forwarded to the pane and the agent opened the same URL again. Clear the set in clear_input_source instead, whose only production caller is remove_client. refs herdrdev#2290 Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com> * fix(cli): resolve pane query --current from caller (herdrdev#2298) refs herdrdev#2297 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix(input): parse default mouse reports (herdrdev#2312) * fix(input): parse default mouse reports refs herdrdev#2309 * fix(input): preserve split default mouse reports refs herdrdev#2309 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(ui): search single-tab names in navigator (herdrdev#2320) * fix(layout): return focus to the pane a split was opened from (herdrdev#2266) Closing a focused pane handed focus to the next pane in tree order. For a pane opened beside another one -- a plugin split, a file viewer, any transient tool pane -- that is rarely where the user was: it lands on some unrelated neighbour rather than the pane that opened it. Track the pane focus came from in TileLayout and prefer it when the focused pane closes, falling back to tree order when there is no history, when it points at the pane being closed, or when it points at a pane that has since gone away. The history lives in the layout, so it can only ever name a pane in the same tab. A one-slot history is only sound if internal focus excursions never write it, so the tree edits that used to bounce focus around now go through target-taking primitives instead. close_pane removes a background pane directly, so detach_pane and take_pane_for_move stop focus-close-refocusing. split_pane splits a target without moving focus: the runtime split path only focuses the new pane once the spawn succeeds, which makes a failed split a pure rollback, and the targeted and unfocused workspace split paths stop fabricating history. insert_pane_near now takes the focus intent, so an unfocused pane move leaves the target tab's history alone. The layout-level focused-split helpers become test-only; production splits all flow through the target-taking path. Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(terminal): render halfwidth katakana voiced marks (herdrdev#2257) Co-authored-by: oyoguhito <oyoguhito@kamatanoMacBook-Pro.local> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(ci): make issue gate structural * fix(input): preserve modifyOtherKeys key releases (herdrdev#2303) refs herdrdev#2302 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(config): accept retired agent panel scope (herdrdev#2295) refs herdrdev#2292 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * feat(theme): add optional sidebar background * docs: refresh readme and sponsors * chore: remove project-local worktree extension refs herdrdev#2325 * fix(website): update author X profile * feat(windows): support remote attach to unix hosts (herdrdev#2329) * feat(windows): support remote attach to unix hosts * fix(remote): preserve unix bridge behavior * fix(sidebar): highlight active agent in collapsed sidebar (herdrdev#2382) The collapsed sidebar renders agent rows with an unconditional Style::default().fg(p.overlay0), so the active agent is indistinguishable from the others. The workspace list directly above it, and render_agent_detail in the expanded sidebar, both mark the active entry. Reuse the existing active treatment: resolve the active entry with the same is_active_pane call the expanded agent panel uses, then paint the row background with surface_dim and the position number with text, the same tokens the collapsed workspace rows already use. Assisted-By: devx/717e5259-915f-4a7b-af07-6abe46da5b90 * ci: restore approved contributor gate * chore: update canonical repository references * fix(ci): repair contributor gate handling * fix: avoid ctrl-tab escape sequences in legacy panes refs herdrdev#2296 * fix: render OSC 4 palette overrides instead of forwarding the index (herdrdev#2162) Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix: keep plugin marketplace counts current * fix(cli): accept --flag=value and reordered options in pane read/wait-output (herdrdev#2183) * fix(cli): accept --flag=value and reordered options in pane read/wait-output * test(cli): trim redundant pane parser coverage --------- Co-authored-by: Can Celik <ogulcancelik@gmail.com> * docs: document custom agent integrations * fix(detect): recognize versioned Python agent wrappers (herdrdev#2188) Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(terminal): restore keyboard reporting on detach (herdrdev#2395) refs herdrdev#2393 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * feat(copy-mode): add big-word motions (herdrdev#2270) Co-authored-by: Ubuntu <ubuntu@ip-172-31-252-234.ca-west-1.compute.internal> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix: add positive idle detection for kiro-cli prompt (herdrdev#2301) * fix: add positive idle detection for kiro-cli prompt refs discussion herdrdev#982 * fix: remove manifest integration tests per reviewer request --------- Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(detect): ignore Cursor Run Everything status (herdrdev#2220) * fix(detect): ignore Cursor Run Everything status refs herdrdev#1763 * fix(detect): constrain Cursor approval controls refs herdrdev#1763 * test(detect): remove cursor manifest behavior fixture --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix(theme): refresh host appearance on focus (herdrdev#2417) * fix(theme): refresh host appearance on focus refs herdrdev#2416 * fix(input): preserve split appearance replies refs herdrdev#2416 * fix(input): retain fragmented appearance reports refs herdrdev#2416 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * feat(marketplace): track star history for trending and new plugin surfaces * chore: update website * fix: publish stable release checksums * fix: verify stable release checksums * feat(website): rebuild compare page in new design with runtime positioning * fix(remote): restore blocking bridge streams (herdrdev#2485) refs herdrdev#2478 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix(input): preserve shift in kitty alternate reports (herdrdev#2479) refs herdrdev#2435 * fix: avoid redundant Windows recent-history snapshots (herdrdev#2474) refs herdrdev#962 Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(config): report unknown theme names (herdrdev#2488) refs herdrdev#2452 * fix(windows): share Git Bash agent candidate scans (herdrdev#2494) refs herdrdev#2459 * feat: support all agent integrations on windows (herdrdev#2496) * fix: forward pane terminal bells (herdrdev#2498) refs herdrdev#2453 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * chore: approve dhh as contributor * feat(input): add per-pane right-click routing (herdrdev#2504) * fix: make windows installer swaps atomic (herdrdev#2530) refs herdrdev#2356 * feat: make outer pane borders configurable (herdrdev#2535) * feat(graphics): add direct pane frame streaming (herdrdev#2523) * feat(graphics): add direct pane frame streaming * feat(graphics): expose pane visibility * test(graphics): preserve legacy terminal image output * fix(graphics): harden streaming lifecycle * fix(input): preserve mouse releases outside panes * fix(ui): reclaim scrollbar gutter in alternate screen (herdrdev#2538) * fix(website): improve plugins page readability on dark ground * fix(input): preserve alt-prefixed control keys (herdrdev#2543) refs herdrdev#2514 * perf(ui): avoid full pane mode reads for scrollbars (herdrdev#2554) * fix(client): avoid abort on terminal hangup (herdrdev#2427) * fix(client): avoid abort on terminal hangup refs herdrdev#2424 * test(client): gate PTY integration on unix refs herdrdev#2424 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * feat: add direct pane resize keybindings (herdrdev#2558) * test: guard pane-scaled render performance refs herdrdev#2550 * feat: add configurable tab bar status (herdrdev#2586) * feat: show a zoom indicator in the desktop tab bar Reserve the right edge of the tab row for a ZOOM pill while the focused pane is zoomed, matching the accent style of the mode bars. The per-tab Z suffix stays; the pill makes the zoomed state visible at a glance like tmux's status-right flag. * feat: optionally show the hostname in the desktop tab bar Add ui.tab_bar_hostname to display the machine's hostname at the right edge of the tab row, like tmux's #h in status-right. The value resolves where the server renders, so remote sessions show the remote host. Off by default. * fix: strip control characters from the tab bar hostname * fix: hide the hostname when it would squeeze out the tab strip * feat: add configurable tab bar status * fix: harden tab bar status updates * fix: terminate tab bar status process trees * fix: disable status commands on unsupported platforms * fix: skip unchanged status command renders * fix: keep tab bar status opt-in by default --------- Co-authored-by: David Heinemeier Hansson <david@hey.com> * feat: add move tab keybind actions (herdrdev#2561) * feat: add move tab keybind actions Add optional keys.move_tab_previous/move_tab_next actions that reorder the active tab one position, wrapping at either end. Reuses the existing tab.move runtime path that mouse drag reordering already drives. * fix: exit navigate mode on single-tab move attempts * fix: center tab labels for symmetric highlight padding (herdrdev#2570) * fix: center tab labels for symmetric highlight padding * docs: note centered tab labels in the changelog * fix: center tab labels by display width, not char count * fix(ui): anchor the host cursor to modal name inputs (herdrdev#2569) * fix(ui): anchor the host cursor to modal name inputs IMEs draw their composition preview at the host terminal cursor. The rename and new-worktree dialogs drew a block glyph instead of setting one, so the frame carried no cursor and the client kept the position the focused pane last reported. Japanese composition appeared behind the dialog and only reached the field on Enter. Set the cursor to the caret column instead, counting wide characters as two cells. refs herdrdev#1755 * fix(ui): keep the clamped caret cell blank A name that fills the field left the clamped caret sitting on the last rendered glyph. A terminal inverts the cell under its cursor and an IME composes there, so the glyph was hidden and composition overlapped it. Render the text one column short of the field. The field is still cleared in full, so the clamped caret always lands on a blank cell. refs herdrdev#1755 --------- Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix: track opencode tui session selection (herdrdev#2455) refs herdrdev#2450 Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * test(windows): serialize media player environment access (herdrdev#2619) * fix(server): prioritize shutdown requests (herdrdev#2624) refs herdrdev#2612 * fix(windows): strip elevated terminal title decoration (herdrdev#2632) * ci: remove automatic issue gate * fix(input): ignore modified j/k/up/down in session navigator (herdrdev#2377) The Char('j')/Char('k')/Down/Up match arms in handle_navigator_key had no modifier guard, unlike every sibling arm in the same match block, so Ctrl+K, Alt+J, etc. also moved the navigator selection. refs herdrdev#1981 Co-authored-by: Can Celik <ogulcancelik@gmail.com> * refactor(website): clean up homepage * feat: keep the outer terminal window title in sync with the session (herdrdev#2627) * feat: keep the outer terminal window title in sync with the session Herdr emulates the terminals in its panes, so an OSC 0/OSC 2 title written inside a pane stops at Herdr and never reaches the terminal Herdr itself runs in. That outer title is what window managers read for title bars, tab bars, and group bars, so it kept showing whatever the shell or ssh happened to leave behind. Add `ui.window_title`, rendered from {hostname}, {workspace}, {tab}, {pane}, and {terminal_title}, and push it to the foreground client whenever it changes. It renders on the server, so {hostname} names the machine the panes actually run on rather than the machine a thin remote client runs on, and it is gated on a pending render so an idle loop never pays for it. A title is only remembered as delivered once a foreground client takes it, so the first client to attach is written to rather than skipped. `client.window_title.set` still wins over the configured title, and clearing it now hands the title back to `ui.window_title` instead of only "herdr". * fix: deliver the outer window title to a newly attached client ClientConnected assigns the foreground client directly rather than going through promote_client_to_foreground, so clearing the sent-title cache there missed the case that matters most: attaching a second terminal to a running session. The title was usually unchanged, so the sync returned early and the new terminal kept whatever its shell or ssh had left. Key the cache on the client that received the title instead of relying on every foreground assignment to invalidate it. * perf: keep hidden pane output off the window title path Output from a hidden or background pane sets needs_render without setting needs_full_render, and the retained render plan then skips presentation for it entirely. Syncing the title on needs_render meant every coalesced hidden-output tick still formatted, sanitized, and allocated a title that could not have changed, against the hidden-source early exit AGENTS.md requires. Every input to the title is app state, which always requests a full render, so gate on that instead. The one exception is the focused pane's own terminal title, which arrives through PTY parsing, so ask for a full render when that changes and the configured title uses it. * fix: only cache a window title a client writer received * fix: carry an api set window title across a live handoff * fix: make outer window title updates event-driven --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix: wait for agent prompt readiness (herdrdev#2537) * fix: wait for agent prompt readiness refs herdrdev#2410 * fix: return pane updates after tab bar command refs herdrdev#2410 --------- Co-authored-by: Can Celik <ogulcancelik@gmail.com> * chore: refresh english documentation * fix: derive repo name for embedded bare layouts (herdrdev#2660) refs herdrdev#2657 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: make just build cross-platform (herdrdev#2647) Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(windows): reduce idle agent detection CPU (herdrdev#2651) * fix(windows): reduce idle agent detection CPU refs herdrdev#2642 * fix(windows): gate agent process discovery refs herdrdev#2642 --------- Co-authored-by: Jonathan Liebig <jonathan.liebig@gmail.com> * fix(render): compact large terminal redraws (herdrdev#2675) refs herdrdev#2670 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: disambiguate shifted punctuation keybinds (herdrdev#2676) refs herdrdev#2674 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix: detect claude 2.1.228 half-circle busy spinner * fix: synchronously terminate cancelled status commands * perf: avoid repeated Git config reads (herdrdev#2688) refs herdrdev#2643 Co-authored-by: Can Celik <ogulcancelik@gmail.com> * chore: update contributor list * fix: preserve workspace labels for root repositories (herdrdev#2727) refs herdrdev#2594 * fix: use the running binary in agent hooks (herdrdev#2722) * fix: strip claude title spinner frames (herdrdev#2709) * fix: source title activity glyphs from manifests refs herdrdev#2707 * fix: simplify manifest-driven title stripping refs herdrdev#2707 * fix: reconcile handoff title policies refs herdrdev#2707 * fix: strip claude title spinner frames refs herdrdev#2707 * fix: keep claude detection manifest unchanged --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix(agent): focus Copilot before prompting (herdrdev#2734) * fix(agent): focus Copilot before prompting refs herdrdev#1698 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * test(agent): cover stale focus-reporting state refs herdrdev#1698 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> --------- Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> * feat: add qwen code detection and restore (herdrdev#2743) refs herdrdev#2730 * fix: preserve logical lines in scrollback editor (herdrdev#2735) refs herdrdev#2733 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix(graphics): support high-dpi direct file frames (herdrdev#2680) * fix: keep tab and sidebar clicks when the terminal reports a stray drag (herdrdev#2736) * fix: keep tab and sidebar clicks when the terminal reports a stray drag This works around a Ghostty bug that causes herdr tabs to be unclickable in fullscreen mode. Ghostty on macOS in native fullscreen emits one motion report after a fresh press in the strip where the menu bar reveals, with the row shifted to near the bottom of the grid. The cause is upstream: macOS delivers one mouse event whose y is nearly a window height away from the real pointer, and Ghostty reports it as it arrives (iTerm2 and Terminal.app report the same clicks correctly). Herdr treated the stray report as a real drag and lost the click two ways: it opened a tab reorder with no drop target, making the release a no-op, and it handed the release to the pane under the bogus coordinates. Now, a press on the tab bar or sidebar owns the gesture until release, and a tab drag only starts once the pointer is over a real drop target. refs herdrdev#796 * fix: scope chrome mouse gestures to their input source * fix: preserve chrome drag input source * fix: preserve concurrent chrome presses --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix: wait for new pane shell readiness (herdrdev#2774) * fix: wait for new pane shell readiness refs herdrdev#2773 * refactor: share agent startup bounds refs herdrdev#2773 * fix: reconcile agent names after startup timeout refs herdrdev#2773 * fix: cover agent cleanup scheduling skew refs herdrdev#2773 * fix: bound pane shell readiness retries refs herdrdev#2773 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix: detect all claude half-circle spinner frames (herdrdev#2762) refs herdrdev#2760 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: reject prompts to blocked agents (herdrdev#2790) * fix: reject prompts to blocked agents refs herdrdev#2788 * docs: clarify agent prompt timing refs herdrdev#2788 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * feat(docs): publish agent-readable documentation * fix(docs): apply llms patch during website builds * fix(docs): publish channel-aware documentation indexes * feat(cli): guide agents to Herdr resources * fix: keep active sidebar rows visible (herdrdev#2794) refs herdrdev#2792 * fix: speed up alternate-screen history reads (herdrdev#2426) refs herdrdev#2387 * fix: use verified local packages for windows updates (herdrdev#2816) refs herdrdev#2751 * fix: detect qwen localized active states (herdrdev#2818) refs herdrdev#2756 * fix(client): handle remote terminal hangup (herdrdev#2827) refs herdrdev#2424 * feat: make headless terminal size configurable (herdrdev#2829) refs herdrdev#2828 * fix(theme): keep default active rows subtle and add navigate cursor color (herdrdev#2838) refs herdrdev#2792 * fix(theme): skip host palette queries under wsl (herdrdev#2852) refs herdrdev#2440 * fix: keep agent skill aligned with stable releases refs herdrdev#2847 * docs: sync localized configuration updates * docs: publish preview documentation * fix: match Windows Ctrl+digit keybindings (herdrdev#2913) refs herdrdev#2910 * fix: sync powershell process working directory (herdrdev#2879) * fix: reap ctrl-click url openers (herdrdev#2906) * fix: reap ctrl-click url openers refs herdrdev#2903 * fix: scope linux opener test import refs herdrdev#2903 * test: isolate url opener regression refs herdrdev#2903 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix(docs): link agents to config reference data * feat(website): plugin marketplace discovery shelves — trending and new arrivals * fix(website): raise timeout on docs release integration test for slow builders * fix: retry Windows installer activation after transient locks (herdrdev#2921) refs herdrdev#2916 * fix: isolate hidden pane render cadence (herdrdev#2892) refs herdrdev#2890 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: preserve macOS IME commits in report-all mode (herdrdev#2947) * feat: make Windows generally available * docs: publish preview documentation * docs: finalize 0.8.1 release notes * release: v0.8.1 * fix(ci): publish v0.8.1 documentation * fix: restore v0.8.0 as stable release * fix(perf): eliminate redundant terminal wake work (herdrdev#2962) * fix(perf): eliminate redundant terminal wake work * fix(perf): harden release benchmark gate * test(perf): strengthen performance guardrails * fix(theme): keep active terminal row visible under cursor (herdrdev#2989) refs herdrdev#2987 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix(cli): exit quietly when output pipes close (herdrdev#2996) refs herdrdev#2994 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * docs: finalize 0.8.2 release notes * release: v0.8.2 * docs: update website manifest for v0.8.2 * docs: publish preview documentation * fix: strip ansi sequences from tab bar status (herdrdev#3003) * fix: strip ansi sequences from tab bar status refs herdrdev#3001 * docs: clarify tab bar escape sequence scope refs herdrdev#3001 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix(input): preserve mouse forwarding through handoff (herdrdev#3002) refs herdrdev#3000 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: honor mouse capture config in terminal attach (herdrdev#2995) refs herdrdev#2992 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: synchronize plugin pane pwd (herdrdev#2985) * fix: synchronize plugin pane pwd refs herdrdev#2984 * refactor: isolate plugin pwd platform policy refs herdrdev#2984 * docs: fix changelog conflict resolution --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Can Celik <ogulcancelik@gmail.com> * fix: add claude screen activity fallbacks refs herdrdev#1630 refs herdrdev#2241 * fix(windows): detect cursor bundled node process (herdrdev#3034) * fix(windows): detect cursor bundled node process refs herdrdev#3032 * docs: clarify cursor detection scope * fix(windows): constrain cursor runtime detection refs herdrdev#3032 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * ci: support immutable preview releases * chore: remove akbash maintainer authority * test: use native path in docs parity assertion (herdrdev#3043) * chore: pin kennel maintainer identities * chore: keep kennel authority private * fix(graphics): isolate oversized kitty images (herdrdev#3035) * fix(graphics): isolate oversized kitty images refs herdrdev#3033 * fix(graphics): budget pane image cleanup refs herdrdev#3033 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: preserve multiline paste in terminal attach (herdrdev#3056) refs herdrdev#3054 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: keep background Claude MCP tasks working (herdrdev#3094) * fix: match generated characters in prefix bindings (herdrdev#3085) refs herdrdev#3079 * fix: publish Claude MCP detection manifest * docs: document macos keychain launch context refs herdrdev#966 * fix: preserve focus after background worktree removal (herdrdev#3099) * fix: copy selections before delayed mouse release (herdrdev#3102) refs herdrdev#3100 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: clear Windows Terminal identity in panes (herdrdev#3127) * fix(windows): preserve non-us shifted text (herdrdev#3055) * fix(windows): preserve non-us shifted text refs herdrdev#3045 * fix(windows): retain shifted key repeat lifecycle refs herdrdev#3045 * feat: add per-mode theme overrides (herdrdev#2324) * feat: add per-mode theme overrides allow [theme.custom.light] and [theme.custom.dark] blocks so custom overrides can differ per resolved appearance when auto_switch flips. precedence: theme defaults, then [theme.custom], then the block for the active mode. configs without the new blocks resolve unchanged. refs herdrdev#837 * docs: complete per-mode theme documentation --------- Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix(windows): add local cmd installer bootstrap (herdrdev#3133) * fix(windows): add local cmd installer bootstrap refs herdrdev#2751 * fix(windows): bound installer downloads refs herdrdev#2751 * fix(api): start lifecycle subscriptions from live events (herdrdev#3134) refs herdrdev#1270 * fix: keep omp panes working through scheduled continuations (herdrdev#3122) refs herdrdev#2851 * fix: serve a google-eligible favicon * fix(graphics): batch kitty image row lifecycle (herdrdev#3166) * fix(graphics): coalesce terminal kitty placements A Unicode-placeholder image arrives as one placement per viewport row it covers, and after 624dfd4 the budgeted encoder emitted one placement per frame, so every redraw painted images one row per frame. * fix(graphics): coalesce only pure kitty re-displays Keep pixel uploads and superseded-image deletes in a transaction of their own: a placement joins the coalesced transaction only when its image is uploaded and its source already maps to that image, and nothing joins after an upload or a delete. * fix(graphics): batch kitty image row lifecycle --------- Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com> * fix: refresh shared agent manifest caches (herdrdev#3204) refs herdrdev#2711 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: report agent explain file errors as json (herdrdev#3023) refs herdrdev#3022 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: keep wayland clipboard copies responsive (herdrdev#3015) * fix: keep wayland clipboard copies responsive refs herdrdev#3014 * fix: preserve clipboard fallback after wl-copy failure refs herdrdev#3014 --------- Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix: route osc 8 file links to plugin handlers (herdrdev#2942) refs herdrdev#2941 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * docs: move changelog curation to release prep * fix(cli): accept reordered agent report arguments (herdrdev#2928) refs herdrdev#2926 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * fix: require explicit workspace group close (herdrdev#3206) refs herdrdev#2874 Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> * feat(detect): add muse agent with generic Pick blocked detection (herdrdev#2489) * feat(detect): add muse agent with generic Pick blocked detection Add Muse agent manifests and runtime detection for idle/working/blocked states. Blocked Pick is generic on footer 'Enter to select' so any question title/message triggers, fixing missed waiting answer where previous AND-gated rule required specific hint combos. Cover process names muse, muse-bin, muse-code variants and YOLO footer. refs #herdr * fix(detect): tighten muse manifest and agent lookup - manifests: change working_esc_interrupt and blocked_approval from whole_recent to bottom_non_empty_lines(8) to use captured bottom-buffer controls instead of incidental whole-pane text - manifests: anchor idle_prompt line_regex to ^\s*⟩\s*$ so working chrome "⟩ ..." does not match idle - runtime: restrict muse lookup to explicit aliases (muse|muse-bin|muse-code|muse-cli), remove starts_with("muse") fallback that misclassified museum/muse-helper/muser; add positive/negative identification tests - keep website mirror identical; verified with agent_detection manifest check --require-website refs herdrdev#2489 refs herdrdev#2456 * fix(detect): address mjdouglas vendor findings for muse - manifests: widen pick_request_blocked to bottom_non_empty_lines(8) and add Enter to toggle for multi-select; add menu_request_blocked for user-opened pickers (enter confirm/esc go back/esc close/space toggle); add workspace_trust_blocked for Do you trust dialog; tighten blocked_approval to footer chrome Allow once/Always allow/Yes proceed; split idle_prompt into any gate for empty and typed draft and not-gate pick/menu anchors; change idle_status_fallback from YOLO to model \u00b7 effort \u00b7 cwd shape - runtime: replace bare muse-bin alias with muse-bin-<version> digit check to match versioned launcher binary and avoid museum/muse-binary false positives - cross-checked with vendor-side captures reported on PR herdrdev#2489 against strings in shipped muse-bin binary refs herdrdev#2489 * fix(detect): handle path-qualified muse-bin versioned binary lookup_agent now uses path_basename before matching so a launcher exec with absolute argv0 like /usr/local/lib/muse/muse-bin-0.1.0-R708.1 is correctly identified. is_muse_versioned_binary also checks basename so direct path-qualified names succeed without relying on the argv0_argv fallback path. Prevents missed Muse detection when screen state and sound overrides are not applied. refs herdrdev#2489 * fix(detect): add enter save to muse menu detection Evidence documents /theme with enter save footer which was not matched. Add enter save to menu_request_blocked any list and to idle_prompt not-gate (highlighted row ⟩ <choice> shares glyph) and keep website mirror in sync. Update evidence comment counts from four to five. refs herdrdev#2489 * docs: add Muse to supported agents table Muse detection (manifest, process identification, sound) was added earlier but docs/next agents table omitted the row. Add Muse as screen manifest / none (no integration hook, consistent with Amp/Kiro/Maki) to en/ja/zh-cn translations. * fix(detect): resize agent arrays for new upstream variant Agent::ALL and SCREEN_MANIFEST_AGENTS gained an entry from master but kept stale size annotations, breaking compilation after rebase. refs herdrdev#2489 * docs: add muse detection entry to next changelog refs herdrdev#2489 * docs: add muse sound override to config reference refs herdrdev#2489 * fix(detect): prevent false muse blocked states refs herdrdev#2489 --------- Co-authored-by: Omer Hamid Kamisli <ohkamisli@poikus.com> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> * fix: complete docs snapshot and asset conflict resolution Resolve leftover merge artifacts in CI-owned trees missed by the initial conflict pass: - docs/preview/website ja+zh-cn socket-api.mdx: de-duplicate workspace.move_block paragraph auto-merged from both sides; snapshot must match the preview commit exactly. - website/assets/ram.svg + favicon.svg: clear stale rename conflict markers; ram.svg is unchanged vs the fork's previous state and favicon.svg is a new upstream asset. These files are validated by website/scripts/docs-preview.mjs check and docs-versions.mjs check, which the Website workflow runs on PRs. --------- Co-authored-by: akbash <akbash@herdr.dev> Co-authored-by: Ogulcan Celik <ogulcancelik@gmail.com> Co-authored-by: WakaTaira <50697207+WakaTaira@users.noreply.github.com> Co-authored-by: Florian <13469873+VialFlorian@users.noreply.github.com> Co-authored-by: Rhys <105699450+rhjoh@users.noreply.github.com> Co-authored-by: Michael Hackner <mhackner@gmail.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: akbash-bot <300245827+akbash-bot@users.noreply.github.com> Co-authored-by: kangal-bot <285672167+kangal-bot@users.noreply.github.com> Co-authored-by: Kataoka Katsuki <49934462+kataokatsuki@users.noreply.github.com> Co-authored-by: kataokatsuki <kataokatsuki@users.noreply.github.com> Co-authored-by: Jon Kinney <jonkinney@gmail.com> Co-authored-by: Kazunari Kamata <14287197+kazunari-kamata@users.noreply.github.com> Co-authored-by: oyoguhito <oyoguhito@kamatanoMacBook-Pro.local> Co-authored-by: Ian Ker-Seymer <i.kerseymer@gmail.com> Co-authored-by: Mo <77584024+hamidi-dev@users.noreply.github.com> Co-authored-by: Kyle Corbeille <kcorbeille76@gmail.com> Co-authored-by: Phil Larson <hello@phillarson.xyz> Co-authored-by: JP Lew <462836+jplew@users.noreply.github.com> Co-authored-by: Ubuntu <ubuntu@ip-172-31-252-234.ca-west-1.compute.internal> Co-authored-by: Sam Biggins <sambiggins@gmail.com> Co-authored-by: Jesse Zhang <j3ssezhang102@gmail.com> Co-authored-by: JJ Liebig <jonathan.liebig@gmail.com> Co-authored-by: David Heinemeier Hansson <david@hey.com> Co-authored-by: PISIT KOOLPLUKPOL <pisit.koolplukpol@outlook.com> Co-authored-by: Erik Krogen <erikkrogen@gmail.com> Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com> Co-authored-by: Alex <a.neyman17@gmail.com> Co-authored-by: caner-akca <94343893+caner-akca@users.noreply.github.com> Co-authored-by: Ömer Hamid Kamışlı <hamidkamisli@icloud.com> Co-authored-by: Omer Hamid Kamisli <ohkamisli@poikus.com>
Summary
workspace.closeof a primary checkout while linked-worktree workspaces remain open--groupand raw APIclose_group: truefor explicit group closureworkspace.closedevent per workspace removed by a group closeSupersedes #2876 after rebasing onto current
master; that PR's canonical head branch is no longer writable byakbash-bot.Checks
cargo test api_workspace_close_noncontiguous_group_preserves_adversarial_identity_state -- --nocapturejust ci 'all() - test(live_server_holds_one_pty_master_fd_per_pane)'(3522 passed; excluded test has a checkout-localtarget/debug/herdrPID-discovery assumption incompatible with Kennel's required externalCARGO_TARGET_DIR)just windows-lintrefs #2874