Long branch names and workspace titles were getting truncated, hiding
important identity context from developers.
* Add a dynamic `TruncatedSidebarLabel` component that measures text
overflow and renders a tooltip only when the text is actually truncated.
* Use the new label for branch names in `WorktreeCard`, disabling its
nested tooltip when parent hover details are active to prevent conflict.
* Update `WorktreeCardDetailsHover` to use `break-words` instead of
truncating, ensuring full branch and workspace identities wrap and remain
fully readable in the details panel.
Track the specific key and modifier identities from the initial keydown
to construct a robust release matcher. This ensures hold dictation stops
reliably on keyup, even if modifier state flags have already dropped
or if keys are released in a different order.
Enable `experimentalNewWorktreeCardStyle` by default on new profiles where
onboarding is open, or when creating a brand-new config file.
- Avoids visual disruption for existing users who already completed
onboarding by keeping the old style active for them.
- Preserves explicit user opt-outs during migrations and CLI updates.
- Ensures the offline CLI handler mirrors this logic when creating the
initial configuration file before the desktop client loads.
Reduce WorktreeCard top padding 6px→5px and bottom 8px→6px so more
cards fit on screen. Uses Tailwind v4 dynamic spacing (pt-1.25).
Co-authored-by: brennanb2025 <brennankbenson@gmail.com>
Determine the correct SSH connection ID for a file by matching its path
against the child repositories inside a folder workspace. This allows
reading files in mixed local and SSH folder workspaces, where a single
global connection ID cannot be resolved.
* Add overlay unread badge to status glyphs in new card style
Overlay an amber dot badge on status indicators, branch icons, and
review status glyphs when the new card style and unread state are active.
This avoids widening the status lane or relying on a separate bell icon,
keeping the design compact and preserving title row alignment.
* Remove duplicate shrink-0 class in WorktreeCard
The outer container already applies 'shrink-0', making the duplicate
class inside the conditional branch redundant.
* Avoid auto-reloading single-file diff tabs if their status row has
moved to a different area (e.g. from unstaged to staged).
* Prevent auto-reloading combined uncommitted diffs when they are
backed by an uncommitted entries snapshot.
* This preserves the open tab's original diff context as staging and
commit status changes, preventing useful context from being lost.
Extract title resolution into a dedicated helper to ensure both inline
and dialog pull request creation flows consistently fall back to
a normalized and humanized branch slug when no eligibility title is
available.
- Normalize remote refs before humanizing branch slugs
- Pre-populate dialog titles when eligibility title is missing
- Update E2E tests to expect pre-populated draft titles
Connect the ChecksPanel PR draft generation to the global generation
slice, aligning its behavior with SourceControl. This allows detail
generation to continue in the background when navigating away or
switching worktrees, and guarantees that generated fields, terminal seeds,
and branch-preparation push requirements are restored on remount.
Move the "Update" and "Move to Status" options under a new "Workspace"
section header at the very top of the worktree context menu. This
improves usability and groups workspace-management actions together.
When the hosting provider (GitHub) reports conflicts but a local merge
simulation is clean, we now mark the conflict summary as locally clean.
This state is surfaced in both the desktop and mobile sidebars with a
clear explanation and a copyable set of commands to trigger a remote
mergeability recalculation via an empty commit and push.
* Track update check attempts to prevent stale races and handle stalls
- Sequence each update check with an attempt ID to prevent stale event handlers (like async changelog fetches) from overwriting newer check states.
- Introduce a 45-second timeout to gracefully fail or retry hung update checks that stall before reaching updater events.
- Settle checks with a brief grace period when the updater promise resolves without firing a terminal event.
* Ignore update-available events when no active check attempt exists
Prevents processing stale events from the auto-updater after a silent
background check has already settled, which could otherwise overwrite
more recent check states or trigger unexpected status transitions.
* Ignore stale electron-updater events from previous check attempts
Introduce attempt tracking to bind emitted updater events to the active
update check. This prevents stale events (such as checking, available,
not available, or errors) from previous checks or preflight stages
from triggering false state transitions or duplicate status updates.
- Track the launched and active attempt IDs during update preflight
- Ignore events if their attempt ID does not match the active check
- Allow error events to propagate during active download/install phases
- Clear pending nudge campaigns on silent follow-up checks settling to not-available