orca/docs/experimental-compact-worktr...

137 lines
7.3 KiB
Markdown

# Experimental Compact Worktree Cards
## Problem
PR #2843 made compact one-line worktree cards the default in
`src/renderer/src/components/sidebar/WorktreeCard.tsx:183` and
`src/renderer/src/components/sidebar/WorktreeCard.tsx:557`. The behavior is useful for dense
sidebars, but it is visually different enough that it should be trialed behind Experimental first.
Users also cannot infer why some cards remain two-line: the hidden row only disappears when it
would carry no distinct visible metadata.
## Goal
Add an Experimental setting, off by default, that controls the compact-card behavior. When disabled,
workspace cards use the pre-compact layout: branch line stays visible, unread remains in the left
status column, PR/issue/comment/port badges stay in the metadata row, and the primary worktree uses
the pre-compact `primary` badge instead of the compact star. When enabled, keep the current compact
behavior from PR #2843.
## Non-goals
- Do not redesign worktree card metadata.
- Do not remove card property settings such as PR, ports, issue, comment, unread, or status.
- Do not change SSH, GitLab/GitHub provider lookup, prompt-cache timer, or workspace port logic.
- Do not add per-repo or per-worktree compact preferences.
## Design
1. Add `experimentalCompactWorktreeCards: boolean` to `GlobalSettings`, defaulting to `false`.
2. Add an Experimental pane toggle titled `Compact worktree cards`.
Copy must explain the rule: cards collapse only when the second line would be redundant or empty;
real metadata such as a different branch, repo badge, conflict/cache state, or folder badge keeps
the card taller.
3. In `WorktreeCard`, derive `const compactCards =
settings?.experimentalCompactWorktreeCards === true` from the existing settings read and branch
layout:
- Disabled: show branch row for non-folder worktrees, keep unread in the left column, keep
PR/issue/comment/port details in the metadata row, and show the pre-compact `primary` badge.
- Enabled: use PR #2843 compact behavior, including title-row unread, details/ports cluster, and
primary star.
4. Preserve the accessible title tooltip in `WorktreeTitleInlineRename`; it is useful in both modes
and replaces the native `title` attribute.
5. Keep `CacheTimer` presentational. The card can still derive cache state, but the metadata-row gate
must only use compact gating when the experimental flag is enabled. In disabled mode, render the
metadata row even when the cache timer is inactive.
## Data Flow
- Main process persistence loads settings via `getDefaultSettings()`.
- Renderer settings pane toggles `experimentalCompactWorktreeCards` through `updateSettings`.
- `WorktreeCard` reads `settings?.experimentalCompactWorktreeCards === true`; missing/null settings
must behave as disabled so existing server-render tests and old profiles do not compact.
- Card layout branches locally; no IPC, SSH, or provider data path changes.
## Edge Cases
- Missing legacy setting hydrates to `false`, so existing users get the less-surprising two-line
default after upgrade.
- Folder repos keep their folder badge in the metadata row in both modes.
- Custom display names keep branch metadata in compact mode because the branch differs.
- Repo-grouped cards with `hideRepoBadge` can become one-line only when compact mode is enabled and
no other metadata is visible.
- Active prompt-cache timer and conflict state keep the metadata row visible in compact mode.
- SSH cards keep the SSH icon on the title row in both modes.
- Sparse checkout badges, remote-branch conflict warnings, inline agents, and lineage child chips
are independent rows/badges and must not be hidden by the compact toggle.
## Test Plan
- Unit/render tests:
- default settings value is `false`;
- Experimental pane renders the toggle and explanatory copy;
- compact disabled renders a metadata row and branch when title equals branch;
- compact disabled keeps unread in the left status column, details/ports in the metadata row, and
the `primary` badge for the main worktree;
- compact enabled hides the redundant metadata row;
- compact enabled moves unread/details/ports to the title row and uses the primary star;
- compact enabled preserves branch row when title differs from branch;
- title tooltip remains focusable and does not use native `title`.
- Validation:
- Electron screenshot with compact disabled: repeated branch cards are two-line.
- Electron screenshot with compact enabled: repeated branch cards collapse to one-line.
- Electron screenshot of Experimental setting showing explanatory copy.
## UI Quality Bar
- Toggle follows existing Experimental pane layout, spacing, typography, and switch style.
- Copy is concise and explains what counts as metadata without teaching implementation details.
- Sidebar cards do not overlap, clip icons, or jump unexpectedly when the setting changes.
- Compact-disabled mode should look understandable rather than like an accidental regression.
## Review Screenshots
1. Experimental pane with `Compact worktree cards` toggle off.
2. Sidebar card list with compact disabled: repeated branch cards show the second line.
3. Sidebar card list with compact enabled: repeated branch cards collapse to one line.
## Rollout
1. Add setting type/default/search entry/persistence tests.
2. Add Experimental pane UI.
3. Branch `WorktreeCard` layout behind the setting.
4. Update focused render tests.
5. Validate with Electron screenshots.
## Lightweight Eng Review
- Scope: Keep the PR to one persisted Experimental flag, one settings row, and local card layout
branching. No new metadata model or card explanation surface.
- Architecture/data flow: Settings persistence already merges defaults with parsed settings; adding
a default-off boolean is enough for old profiles and SSH/web clients because renderer state is
hydrated from the same settings object.
- Failure modes covered:
- Old profiles unexpectedly compacting: default false.
- Toggle copy failing to explain mixed one-line/two-line cards: explicit description.
- Tests only checking branch text instead of row presence: use `data-worktree-card-meta-row`.
- Shipping a half-compact default: assert unread placement, details/ports placement, and
primary badge/star per mode.
- Prompt-cache/conflict metadata disappearing: metadata-row gate keeps these rows in compact mode.
- Test coverage required:
- `src/shared/constants.test.ts` for default value.
- `src/renderer/src/components/settings/ExperimentalPane.test.tsx` or adjacent render test for
settings copy/toggle behavior.
- `src/renderer/src/components/sidebar/WorktreeCard.quick-actions.test.tsx` for enabled/disabled
layout behavior.
- Existing `WorktreeTitleInlineRename.test.tsx` remains relevant for tooltip behavior.
- Performance/blast radius: Reuse the existing settings read in `WorktreeCard`; no new polling, IPC,
file watching, or provider calls.
- UI quality bar: Settings row should match existing Experimental rows; sidebar must remain dense
but mixed-height behavior should be explainable from the toggle copy.
- Required review screenshots:
1. Experimental setting off.
2. Sidebar compact disabled.
3. Sidebar compact enabled.
- Residual risks: The mixed card heights are still inherently subtle; this PR explains the rule in
settings but does not add per-card visible reasons.