Skip to content

fix(desktop): align the git, memory and driver labels with the phone - #1579

Merged
janicduplessis merged 3 commits into
feat/1554-desktop-viewsfrom
feat/1571-desktop-labels
Sep 26, 2026
Merged

janicduplessis merged 3 commits into
feat/1554-desktop-viewsfrom
feat/1571-desktop-labels

Conversation

@janicduplessis

@janicduplessis janicduplessis commented Sep 26, 2026 •

Copy link
Copy Markdown
Collaborator

Description

The phone app clarified three workspace labels (#1563, #1565). Desktop still showed the old forms: bare ↑4 ↓3 arrows in the workspace header, an unlabeled 3.6 GB memory estimate that reads like disk, and a "Driven by · " pill on every driven device tile, which repeats the driver on the wall when an agent drives several devices of one workspace.

Depends on #1570 (stacked on feat/1554-desktop-views). Polish only: no change to the commands Desktop runs or the data it reads.

Solution

One commit per change:

  • Git. The inspector's header shows "↑4 unpushed" and "↓3 behind" as separate pills, each with a tooltip and spoken label such as "4 commits not pushed to origin/feat/x" and "3 commits behind origin/feat/x". The uncommitted and merged chips get their own tooltips too, replacing the one summary tooltip that covered the whole chip group. WorktreeGit.summary, which the sidebar's compact arrows use for their tooltip and accessibility label, uses the same wording. The sidebar keeps its compact arrows, like the phone's home row.
  • Memory. The committed-memory estimate from stim status gets the memory-chip icon and the spoken label "Estimated to use about 3.6 GB of memory", on the wall and in the inspector.
  • Driver. A workspace's header on the wall and in the inspector shows one "Driven by maestro, agent-device · 12m" pill: each tool once and the time since the most recent driver started (ActivityBadge.driversSummary, the same rule as the phone's driversSummary), counting running devices only, like the phone's row. On the wall, a driven tile shows a compact "Driven" pill with a dot, with the full text in its tooltip and accessibility label. The workspace view's single device tile keeps the full "Driven by maestro · 40m", because its header may be hidden with the inspector. Idle and "Activity unknown" pills are unchanged.

Test plan

  • driversSummaryNamesEachToolOnceWithTheLatestStart covers distinct tools, the latest start, a driver without a start time, and no driven device; decodesAWorktreeGitSummary covers the new git wording.
  • On the Mac mini, a test copy whose stimExecutable served an edited stim status payload (two devices driven by maestro and agent-device, a branch 4 ahead and 3 behind, a 3.6 GB estimate) and forwarded every other command to the real CLI. refactor(desktop): move view fonts, spacing and radii onto the design tokens #1570's build (left) and this branch (right):

Wall before and after
Workspace view before and after

This branch with the inspector open, and the wall and workspace in dark:

Inspector
Dark

Fixes #1571

@janicduplessis
janicduplessis added this pull request to stack #1569 September 26, 2026 19:44

@janicduplessis janicduplessis left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fresh review of the diff against feat/1554-desktop-views (3 commits). swift build, swift build -c release and swift test (169 swift-testing tests + XCTest) pass locally.

Nothing blocking. ActivityBadge.driversSummary matches the phone's driversSummary: it keeps only driven activities, lists each tool once in first-seen order, takes the latest parseable since, clamps at 0, and falls back to the tools alone. The only difference is "an unknown tool" against the phone's "unknown tool", which matches the desktop tile's existing wording. The test covers real failure modes: a repeated tool, and choosing the latest start over the first. namesDriver: false is passed only on the wall, where WorkspaceHeader always renders above the tiles. The workspace view keeps the full text, as the PR describes. Each commit holds one change.

Should fix

  1. README is stale for device tile activity. apps/desktop/README.md:147-150 still says every device tile shows "Driven by · 12m". On the wall, a driven tile now shows "Driven" with a dot, and the workspace header and inspector name the tools once with the time since the latest driver started. The workspace view's tile keeps the full text. Fix: update that paragraph to say this. The git paragraph at README.md:76-80 ("The workspace header shows the same as chips") could also say that the inspector spells out "↑N unpushed" and "↓N behind".

  2. The inspector's outer .help covers the new per-pill help. WorkspaceDetail.swift:318 still has GitIndicator(git:, chips: true).help(env.worktree?.git?.summary ?? ""). With chips: true, the body is a flat group of pills inside the FlowLayout, so the outer .help reaches each pill, including the "unpushed" and "behind" pills that now carry their own .help. .help also becomes the VoiceOver hint, so VoiceOver reads "4 commits not pushed to origin/feat/x" and then the whole summary again. I did not check on hardware which tooltip macOS shows when both are set. Fix: remove the outer .help at :318, and give the uncommitted and merged chips inside GitIndicator their own .help (for example git.summary, or "N uncommitted changes" and "merged into X"). Each pill then has exactly one tooltip.

Minor

  1. The drivers pill counts devices the wall does not show. WallView.swift:110-111 and WorkspaceDetail.swift:315-316 pass env.orderedDevices.map(\.activity), which includes devices that are not running. The phone passes only running devices (workspace-row.tsx:41). The wall shows tiles only for isRunning || runningBuild. The CLI can attach activity to an Android device whose state is not "detected", because status.ts:526 checks only serial. In that case the header says "Driven by …" and no tile on the wall has the dot. Fix: use env.devices.filter(\.isRunning).map(\.activity) for both the contains guard and the pill.

  2. DriversPill (Components.swift:78) has no tooltip or accessibility label. VoiceOver reads the raw text, including the middle dot. The phone speaks a per-device drivenLabel, such as "iOS, driven by maestro for 12 minutes". Optional: add .accessibilityElement(children: .ignore) and a spoken label, for example "Driven by maestro and agent-device, latest started 12 minutes ago", plus a .help.

  3. Comment policy. Status.swift:157 and :162 (/// "3 commits not pushed to origin/feat/x"., /// "1 commit behind origin/feat/x".) only restate the string the function builds. Delete them.

@janicduplessis
janicduplessis force-pushed the feat/1571-desktop-labels branch from a6af656 to 93dd090 Compare September 26, 2026 19:50
@janicduplessis
janicduplessis marked this pull request as ready for review September 26, 2026 19:56
@janicduplessis
janicduplessis merged commit 99e0907 into main Sep 26, 2026
1 check passed
@janicduplessis
janicduplessis deleted the feat/1571-desktop-labels branch September 26, 2026 19:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

desktop: align the git, memory and driver labels with the phone

1 participant