137 lines
7.3 KiB
Markdown
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.
|