5.2 KiB
APP-3830: Worktree Sidecar Selection Semantics
Linear: APP-3830 (inferred from the branch name)
Related spec: specs/moirahuang/APP-3743/PRODUCT.md
Summary
Polish the New worktree config sidecar so the repo that looks active is always the repo that executes. Mouse hover should take precedence over stale keyboard selection, repo clicks should consistently open a worktree, and keyboard confirmation from the search field should use the same visible selection model.
Problem
The worktree sidecar currently mixes two concepts of "active repo":
- keyboard selection, which is initialized so the search field can drive arrow-key navigation
- hover state, which can move to a different repo row without updating the underlying actionable selection
This creates confusing behavior:
- two different repo rows can appear active at once
- clicking a hovered repo can no-op or execute from stale state
Enterfrom the search field and mouse click do not reliably resolve the same repo
The sidecar is intended to be a fast path for worktree creation, so ambiguity in selection makes the feature feel flaky and untrustworthy.
Goals
- The hovered repo row becomes the active selection as soon as the user moves the mouse over it.
- Mouse click and keyboard confirmation resolve the same repo the user sees as active.
- The search field remains keyboard-focused without becoming an actionable repo selection.
+ Add new repodoes not accidentally execute a previously selected repo.- Closing behavior remains predictable: selecting a repo closes both the sidecar and the parent menu.
Non-goals
- Redesigning the unified new-session menu layout.
- Changing how the default worktree tab config is authored or executed.
- Reworking all Warp menus to use a new selection model.
- Removing the search field or the pinned
+ Add new repofooter.
Figma / design references
Figma: none provided
User experience
Opening the sidecar
When the user opens the New worktree config sidecar:
- the search field is focused
- the first actionable repo row is selected if at least one repo is available
- if no repos are available, the search field and
+ Add new repofooter still render and no repo row is selected
Keyboard behavior
While the search field is focused:
Downmoves selection to the next actionable repo rowUpmoves selection to the previous actionable repo rowEnteropens a worktree for the currently selected repo- if no repo is selected but actionable repo rows exist,
Enterfirst resolves the first actionable repo and opens it - if no actionable repo rows exist,
Enterdoes nothing Escapecloses the sidecar and parent menu as it does today
Hover precedence
If the user moves the mouse over a repo row:
- that hovered repo row becomes the active selection immediately
- any previously selected repo row stops being the effective active selection
- subsequent click or keyboard confirmation uses the hovered repo row unless the user changes selection again
Hover precedence only applies to actionable rows. Non-actionable rows such as the search row do not replace the current repo selection.
Mouse click behavior
Clicking a repo row:
- opens a worktree for that repo using the default worktree tab config
- closes the sidecar
- closes the parent new-session menu
The clicked row should never no-op because of responder-chain routing or stale sidecar state.
Search behavior
Typing in the search field filters repo rows live.
When filtering changes the available repo list:
- the filtered repo list updates immediately
- if actionable rows remain, the first actionable repo row becomes selected
- if no actionable rows remain, repo selection is cleared
Add new repo footer
The pinned + Add new repo footer remains visible while the repo list scrolls.
Clicking it:
- opens the folder picker
- does not open a worktree for any repo
- does not reuse stale repo selection as part of the click handling
Success criteria
- At most one actionable repo row is treated as active at a time.
- Hovering a repo row updates the underlying actionable selection, not just the visual hover state.
- Clicking a repo row consistently opens a worktree for that repo.
Enterfrom the search field opens the same repo the UI currently presents as active.- The search field does not steal actionable selection when hovered.
+ Add new repoopens the picker without also opening a repo.- The sidecar closes cleanly after repo selection and leaves no stale selection state behind.
Validation
- Unit-test hover precedence by starting with one selected repo, hovering a different repo row, and asserting the selected row changes to the hovered row.
- Unit-test the close-via-select path to verify sidecar repo selection executes from
Workspace. - Unit-test keyboard confirmation from the search editor to verify
Enteropens the selected repo and closes the menu. - Manual validation:
- open
New worktree config - move selection with arrow keys
- hover a different repo row and confirm the active row updates
- click the hovered repo and verify the correct worktree tab opens
- click
+ Add new repoand verify only the picker opens
- open
Open questions
None currently.