feat(fleet-tui-poc): full iOS design (Spotlight + context menu + action sheet + session switcher)#8
Merged
Conversation
…xt menu, action sheet, session switcher)
Implements the design at api.anthropic.com/v1/design/h/MnT9tqrbyJornGQ6jFA3mA
(README in /tmp/design/terminal-ios-style/), extending the bare-bones POC
into a full ratatui mockup of all four iOS surfaces:
* Spotlight palette — search-first, Top Hit pill (IOS_TINT #0a84ff bg,
white bold, tmux·h badge), grouped sections (PANE / SESSION / FLEET)
with 30×30 icon tiles, footer `↵ open · ⌥↵ in all panes · esc cancel`
* iOS context menu — pinned long-press menu, sectioned with hairlines,
destructive-red Kill row, ▭ pane / %id title bar with green live dot
* Action sheet — bottom-anchored grouped sheet with iOS Cancel hallmark
* Session switcher — app-switcher cards (one per codex worker) with
Focus/Queue/Pause/Kill action row
Press 1/2/3/4 to switch overlays, q to quit.
Palette: iOS dark UIKit values match the design's GLASS object —
IOS_TINT = Rgb(10,132,255), IOS_DESTRUCTIVE = Rgb(255,69,58),
IOS_GREEN = Rgb(48,209,88), IOS_ORANGE = Rgb(255,159,10),
IOS_FG = Rgb(242,242,247). Fonts default to terminal monospace.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Adds App.card_buttons hit-test registry. render_session_card pushes a
Rect for each Focus / Queue / Pause / Kill button per card; the New
worker pill registers as a NewWorker action. On MouseDown(Left) inside
SessionSwitcher the App.dispatch_card_click walks the registry and
sets App.last_action with a human-readable line ("✓ Focus → pane 1
(would: tmux select-pane -t codex-fleet:overview.1)") that flashes in
the footer area until the next click.
Card sizing also tightened: strip height now caps at 70% of the
available vertical space and centers between header and footer,
matching artboard D in /tmp/design/terminal-ios-style/project/
palettes.jsx (artboard shows ~78%; we leave 8% for the flash row).
card_w 30→28 + gap 2→1 so a wider set of cards fits in modest kitty
sizes.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
NagyVikt
pushed a commit
that referenced
this pull request
May 14, 2026
…gration)
Lands sub-6 through sub-13 of fleet-tui-ratatui-port-2026-05-14 in
one squashable PR. The four bin crates use fleet-ui (Wave 2) + the
new fleet-data layer to render their dashboards; full-bringup.sh
now launches them by default and falls back to the bash *-anim.sh
when FLEET_DASHBOARD_RENDERER=bash.
WAVE 3 — fleet-data (sub-6/7/8):
* plan.rs — serde Plan + Subtask structs + load() + newest_plan()
+ parse_trailing_date(). Tests: deserialise minimum-schema +
trailing-date math + missing-plans-dir gracefully None.
* accounts.rs — codex-auth list parser → Vec<Account>. Tests:
real-world block + drops without-email + drops missing-percent.
* panes.rs — tmux list-panes + capture-pane wrapper + PaneState
classifier with explicit ordering (cap > approval > boot >
working > polling > idle). 7 classifier tests.
* thiserror added as fleet-data dep for PlanError.
WAVE 4 — bin crates (sub-9/10/11/12):
* fleet-watcher — header banner + 4 stat cards (PANES/CAPPED/
SWAPPED/RANKED) via fleet-ui::card + chip + per-pane table
placeholder.
* fleet-state — iOS cockpit; ACTIVE table composes status_chip +
progress_rail for 5h% and weekly% per account.
* fleet-plan-tree — Kahn topological levels (waves()) over Subtask
depends_on; renders W1..Wn rows of chips.
* fleet-waves — vertical wave flow, sub-task chips per line.
* Each bin renders an in-binary tab strip at the top and handles
its own MouseDown(Left) → tmux select-window dispatch. This is
the canonical click-routing fix referenced in acceptance #8 of
the plan — every tab click works regardless of tmux's
MouseDown1Status state.
WAVE 5 — bringup + docs (sub-13):
* full-bringup.sh: FLEET_DASHBOARD_RENDERER env (default 'rust')
routes window creation to Rust binaries when built, falls back
to bash automatically if the bins are missing. open_window
helper auto-detects .sh-vs-executable launch shape.
* skills/codex-fleet/SKILL.md: Canonical visual design table
extended with the Rust renderer column. Palette table updated
to the iOS dark UIKit hex set (was the light variants).
* Image-2 overlays (context menu / spotlight / action sheet /
session switcher) remain in fleet-tui-poc — the bins consume
them via fleet-ui::overlay once we lift the renders out of
main.rs in a follow-up (covered by openspec out-of-scope).
cargo test --workspace: 29/29 pass (13 fleet-data + 16 fleet-ui).
cargo build --release: clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
4 tasks
NagyVikt
added a commit
that referenced
this pull request
May 14, 2026
…gration) (#11) Lands sub-6 through sub-13 of fleet-tui-ratatui-port-2026-05-14 in one squashable PR. The four bin crates use fleet-ui (Wave 2) + the new fleet-data layer to render their dashboards; full-bringup.sh now launches them by default and falls back to the bash *-anim.sh when FLEET_DASHBOARD_RENDERER=bash. WAVE 3 — fleet-data (sub-6/7/8): * plan.rs — serde Plan + Subtask structs + load() + newest_plan() + parse_trailing_date(). Tests: deserialise minimum-schema + trailing-date math + missing-plans-dir gracefully None. * accounts.rs — codex-auth list parser → Vec<Account>. Tests: real-world block + drops without-email + drops missing-percent. * panes.rs — tmux list-panes + capture-pane wrapper + PaneState classifier with explicit ordering (cap > approval > boot > working > polling > idle). 7 classifier tests. * thiserror added as fleet-data dep for PlanError. WAVE 4 — bin crates (sub-9/10/11/12): * fleet-watcher — header banner + 4 stat cards (PANES/CAPPED/ SWAPPED/RANKED) via fleet-ui::card + chip + per-pane table placeholder. * fleet-state — iOS cockpit; ACTIVE table composes status_chip + progress_rail for 5h% and weekly% per account. * fleet-plan-tree — Kahn topological levels (waves()) over Subtask depends_on; renders W1..Wn rows of chips. * fleet-waves — vertical wave flow, sub-task chips per line. * Each bin renders an in-binary tab strip at the top and handles its own MouseDown(Left) → tmux select-window dispatch. This is the canonical click-routing fix referenced in acceptance #8 of the plan — every tab click works regardless of tmux's MouseDown1Status state. WAVE 5 — bringup + docs (sub-13): * full-bringup.sh: FLEET_DASHBOARD_RENDERER env (default 'rust') routes window creation to Rust binaries when built, falls back to bash automatically if the bins are missing. open_window helper auto-detects .sh-vs-executable launch shape. * skills/codex-fleet/SKILL.md: Canonical visual design table extended with the Rust renderer column. Palette table updated to the iOS dark UIKit hex set (was the light variants). * Image-2 overlays (context menu / spotlight / action sheet / session switcher) remain in fleet-tui-poc — the bins consume them via fleet-ui::overlay once we lift the renders out of main.rs in a follow-up (covered by openspec out-of-scope). cargo test --workspace: 29/29 pass (13 fleet-data + 16 fleet-ui). cargo build --release: clean. Co-authored-by: NagyVikt <nagy.viktordp@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Implements the four iOS surfaces from the design at https://api.anthropic.com/v1/design/h/MnT9tqrbyJornGQ6jFA3mA — the user's exact
Implement: index.html i want this style eactlyrequest. Extends the bare-bones POC from PR #4 into a full ratatui mockup.What's in
Press 1 / 2 / 3 / 4 in the running POC to switch overlays. q to quit.
PaletteContextMenu— long-press style, hairlines, ▭ pane title bar, destructive red KillPaletteSpotlight— search bar w/ ⌘K chip, Top Hit pill on IOS_TINT, grouped PANE/SESSION/FLEET, footer↵ open · ⌥↵ in all panes · esc cancelPaletteActionSheet— bottom sheet, grouped, iOS Cancel hallmarkPaletteSessionSwitcher— app-switcher cards w/ Focus/Queue/Pause/KillPalette parity
Uses the exact iOS dark UIKit values from the design's
GLASSobject:IOS_TINTRgb(10,132,255)#0a84ffIOS_DESTRUCTIVERgb(255,69,58)#ff453aIOS_GREENRgb(48,209,88)#30d158IOS_ORANGERgb(255,159,10)#ff9f0aIOS_FGRgb(242,242,247)#f2f2f7Test plan
cargo build --release -p fleet-tui-poccleancargo run --release -p fleet-tui-pocrenders all four overlays/tmp/design/terminal-ios-style/project/palettes.jsx)style-tabs.shFollow-ups
fleet-tui-ratatui-port-2026-05-14— they move out offleet-tui-pocinto the productionfleet-ui::overlaymodule with real keypress wiring insidefleet-watcher/fleet-state/fleet-plan-tree/fleet-wavesbinaries.🤖 Generated with Claude Code