Repository navigation
cmux NEXT: Chief view gallery, five experimental views beside the Chief - #22683
Conversation
webviews/src/pages/chief-views (cmux-page://cmux.chief-views/): a page tab in Home's right column with a dots switcher and a gallery of views, each named by intent with a one-line description, a switch and "Open as" Pane, Split or Sidebar. Only the first view is on by default. Views register through one registry (registry.ts: id, title, description, component, default placement, what data it needs), shaped like the AppPlatform manifest. - Where is everybody: every agent by machine (name, folder, state, task, time since last output, PR), what needs you first. - Agent board: Working, Needs you, Ready to land, Landed today. - Fleet: the CI dashboard's data.json (machines, load per core, runners, queue); says when it is unset or unreachable and takes an address. - Landing: open, ready to land, CI red and merged-today PRs with owner chips. - Timeline: today's events across agents and PRs. Revives the lanes view of #20363 (lanes.ts order and durations, the AgentLaneStore feed). AgentActivityLane also keeps the summary's cwd, updatedAt and createdAt. The app answers cmux.chief_views.* (ChiefViewsPageProvider): agents from AgentLaneStore and terminal hook agents on every machine, with an Observation stream; fleet from the address the person sets (CMUX_CHIEF_VIEWS_FLEET_URL or the view's field); landing from GitHub search, kept 90 s; open, open_url and set_fleet_url need a click. Action chief.openViews (palette). Debug Settings > Home > "Chief view gallery", on by default; DEV and NIGHTLY only. Tests: webviews/test/chief-views-page.test.tsx, CmuxNextAppTests/ChiefViewsPageTests.swift. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Not verified: macOS jobs did not run: compile and app tests were skipped on CI passes on Written by web and size checks: green
Tour of Path-selected interactions
Core UI (before): DEGRADED — 19 ok, 1 unavailable
Screenshots (15)1. Launch
Screenshots (15)1. Launch Tours are data in |
|
Found 3 test failures on Blacksmith runners: Failures
|
Move the gallery's Swift (page, provider, feeds, agent rows, strings) out of CmuxNextApp into a new CmuxNextChiefViews target so the app does not grow. The app keeps a 20-line tab glue; a generic WebPageTab replaces the one-off page-tab classes for Stats, Chief Usage, channels and CodeRouter, which offsets it. Review fixes: - AgentActivityLane equality ignores updatedAt, so output alone does not re-rank and animate the lanes view. - The dashboard address must be https; http only for localhost and tailnet names. Pull request links reject dot segments. - Remote terminals group under the machine's name, so they sit with the same machine's acpmux chats. - Fleet's address form says when an address is refused. - An unavailable read keeps its last reply. - Tests record through a main-actor class instead of captured vars. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
…the bot regenerates the graph The CI target graph is bot-only, so a pull request that adds a SwiftPM target cannot carry it and the coverage test failed on every such PR. A directory the graph lacks now passes when Package.swift declares that target; a stray source directory still fails. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
- Lanes keep their synthesized equality, so the store still records each new updatedAt; the lanes view compares lanes without it (AgentActivityLane.ranked) before it re-ranks. - ChiefViewsPage imports Foundation publicly (URL in its public API). - The tunables list is nonisolated, like the others; the refused-address message says https. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=e8f63fd9-94e8-4878-bcd4-704659aba1f2&host=cosmic-gray
|
|
Bugbot needs on-demand usage enabledBugbot uses usage-based billing for this team and requires on-demand usage to be enabled. A team admin can enable on-demand usage in the Cursor dashboard. |
|
Owned by orphan-sweep on cosmic-gray · session |
Base removed AgentActivityModel.lanes and the Agent Activity lanes view (859e5cb), so the model takes base's version and the lane's `ranked` copy (only that view used it) goes. AgentActivityLane keeps base's new fields (unread, project, spawnedBy, cwd, pullRequests) and adds the gallery's updatedAt and createdAt. Package.swift keeps the CmuxNextChiefViews targets beside base's CmuxNextAgentLanes comment. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray
Base removed webviews/src/agent-activity/lanes.ts with the Agent Activity lanes view (859e5cb), so the gallery's bundle failed to resolve it. The page now keeps the two pieces it used, in model.ts: the same order (failed, waiting, idle longest first, working newest first) over its own AgentState, and shortDuration. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray
…ion scale subtle-elevation.test.ts allows a blurred drop shadow only through --elevation-1/2; the current-view dot and the switch knob had their own. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15cfc-663f-7650-b9f7-64d198c6b88b&host=cosmic-gray
…view-gallery # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextApp/Settings/DebugSettingsService.swift
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39647136624 at 106b611 failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
|
base-red-watch: |
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39647231050 at 6b26794 failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
|
The feat-cmux-next push run https://github.com/manaflow-ai/cmux/actions/runs/39647649905 at d881a7e failed: cmux-next checks (god files, concurrency, crash safety, l10n). |
From CI's cmux-next-generated-patch artifact (run 39646893133, merge ref faf4d3a). It also carries chief.openViews, which base #22683 added without regenerating these files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray
…atchet base red) (#23629) #22683 added chiefViews.terminal.untitled with "Terminal" in de, es and fr, which the parity check reads as copied English. It is the standard word in all three, so it is documented as an invariant beside argument.appStore.tab instead of raising the debt baseline (#23463), which only goes down. Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15d72-348e-7bd1-9c4e-4c3519d0f0fc&host=huge-blue Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
|
Shipped in:
|
…uting base red) (#23668) * test(next): every graph target routes to the tests that reach it, from the graph The Tier routing step is red on feat-cmux-next: test_a_shared_module_selects_its_dependents and test_a_file_a_test_reads_selects_that_test compare the router's swift_targets with hard-coded lists, and #22683's new CmuxNextChiefViewsTests (graph regenerated in ef427b7) depends on CmuxNextSidebar, CmuxNextPages and CmuxNextSettings, so the router now selects it and the lists are stale. Those two failing tests are the red. This adds the oracle they will use: the test targets that are, depend on, or read a changed target's file, computed straight from ci-target-graph.json. A new test routes a probe file in every target with a path and checks the router selects exactly that set, so any target is checked, not only the two hand-picked ones. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c31-89b3-7d62-8e8c-b116a23ae693&host=cosmic-gray * test(next): the two route snapshot tests read their expected targets from the graph (Tier routing base red) test_a_shared_module_selects_its_dependents and test_a_file_a_test_reads_selects_that_test listed the selected test targets by hand, so each new dependent target (#23260 for CmuxNextHomeEngineTests, now #22683's CmuxNextChiefViewsTests) turned Tier routing red on every pull request until someone edited the list. The router was right both times. They now expect the graph's dependents of the changed target (or of the bundle-shipping targets, for the schema) plus its readers, and keep a few fixed anchors: the app and settings tests are in, the daemon tests are out. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c31-89b3-7d62-8e8c-b116a23ae693&host=cosmic-gray * test(next): pin the bundle targets and the targets behind this red in the route tests Review follow-up. The schema test pins the four bundle-shipping targets and CmuxNextPaletteTests, so dropping one from BUNDLE_TARGETS fails it instead of moving the derived expectation with it. The sidebar test pins CmuxNextChiefViewsTests (this red), CmuxNextKeepAwakeTests and CmuxNextWorkspaceNamingTests. Each test also pins one more target that must not be selected (CmuxNextDesignTests, CmuxNextMobileTests), checked against the graph. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15c31-89b3-7d62-8e8c-b116a23ae693&host=cosmic-gray --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…use non-text, and Clear Space Terminal Defaults… asks first (#23461) * test(cmux-next): space terminal defaults keep the other field, refuse non-text, and Clear asks first Failing tests for the #23385 follow-ups: - a cwd or env that is not text (an in-app bool, or the "true" the socket makes of a bare --cwd) is refused and sends nothing; - --cwd alone keeps the space's env and --env alone keeps its cwd (real daemon); - Clear Space Terminal Defaults… (space.clearDefaults) asks from the palette and needs confirm from automation. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray * fix(cmux-next): space terminal defaults merge named fields, refuse non-text, add Clear Space Terminal Defaults… Follows #23385. - space.setDefaults changes only the fields a run names: --cwd X keeps the space's env, --env alone keeps its cwd, an empty one clears that field, both empty clear. The palette's directory ask no longer copies env into the rerun; the merge keeps it. - A cwd or env that is not text is refused (rooms.refusal.defaultsMustBeText), and so is a relative cwd (rooms.refusal.cwdMustBeAbsolute): the socket turns a bare --cwd into the string "true", which used to become a directory named "true". - New destructive action space.clearDefaults ("Clear Space Terminal Defaults…", CLI `space clear-defaults`): the palette asks with the standard confirmation dialog while the space has defaults; CLI and MCP pass confirm, as for every destructive action. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray * test(cmux-tui): an action's --cwd reaches the app absolute, ~ and empty untouched `cmux space set-defaults --cwd .` sends "." today, which the app now refuses (a space's directory must be absolute). Also states the Default-space assumption in the Swift clearDefaults "nothing at stake" test (review nit). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray * fix(cmux-tui): resolve an action's --cwd against the caller's directory `cwd` joins `path` and `out` in the caller-path rewrite, so `cmux space set-defaults --cwd .` (and --cwd on tab new, split, workspace new) reaches the app as an absolute directory instead of one the app resolves against its own working directory or refuses. `~/…`, an empty `--cwd=` and a bare `--cwd` are sent unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray * Regenerate action surfaces for space.clearDefaults From CI's cmux-next-generated-patch artifact (run 39646893133, merge ref faf4d3a). It also carries chief.openViews, which base #22683 added without regenerating these files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray * Regenerate action surfaces for space.clearDefaults From CI's cmux-next-generated-patch artifact (run 39656807210, merge ref 63c8844). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?harness=claude&session=01a15bf1-fdc6-7623-8ee3-fa94b3900ccd&host=cosmic-gray * cmux NEXT spaces: terminal defaults updates run in order against the daemon's defaults Review finding: a partial Set Space Terminal Defaults run merged into the app's mirrored room.defaults and sent the whole object, so two quick runs (--cwd /a, then --env) both read the old mirror and the second dropped the first's field. Set and Clear Space Terminal Defaults now run one at a time per space, each merging its named fields into what list-personal returns when it runs. The live test sends --cwd and --env back to back. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f68ebdd9a3c1704ffb42 * cmux NEXT spaces: nonisolated deinit and a bounded stream for defaults runs The crash-class gate flagged RoomDefaultsUpdates.Finish's plain deinit (main-actor isolated in this target, cx-t7hu) and its unbounded AsyncStream. Finish only finishes a Sendable continuation, so its deinit is nonisolated; the stream never yields, so it buffers at most one element. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f68ebdd9a3c1704ffb42 * cmux NEXT spaces: Clear asks by the daemon's defaults; remote --cwd is sent as typed Review findings on c3b37ee: - Clear Space Terminal Defaults… skipped its question when the app's mirror showed no defaults, but the mirror lags a reply: set-then-clear could clear unasked. It now also asks while a defaults run for the space is in flight, and otherwise asks the daemon (listPersonal); a daemon that does not answer asks. - The CLI resolved every action's --cwd against the caller's directory, including remote, cloud and agent actions whose cwd names a folder on another machine (`cmux open-remote HOST --cwd .`). Those now send --cwd as typed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f68ebdd9a3c1704ffb42 * cmux NEXT spaces: the defaults patch is nonisolated, so the daemon-side run can apply it The Release compile refused RoomDefaultsUpdates' send body calling the main-actor Patch.applied(to:) off the main actor. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Agent-Session: https://cmux.com/deeplink/agent?id=aid-f68ebdd9a3c1704ffb42 --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
































Summary
Leo asked (10-20): "where is everybody? … add a sort of plausible glossary of views … We can see what we like". This PR adds the Chief view gallery: a page tab beside the Chief in Home's right column. A dots switcher moves between the views that are turned on. Gallery lists every view with its one-line description, an on/off switch, and Open as Pane, Split or Sidebar. Only the first view is on by default; the others are a click away in the gallery.
The five starter views all read live data:
data.json. When it is unset or doesn't answer, the view says "unavailable" and shows a field to enter the addressready-to-land), CI red, merged today, with chips for the agents working on each PRrepo:manaflow-ai/cmux base:feat-cmux-next), cached 90 sRevived from #20363 (the cx-v9k2f lanes view on Agent Activity, with #21422, #21727 and #21794):
AgentLaneStorefeed andlanes.tsorder and durations: failed, then waiting, then the longest idle, then working.stepfrom Mask secrets in the lane's title, step and error before they leave the daemon #21794, never a raw prompt.AgentActivityLanenow also keeps the summary'scwd,updatedAtandcreatedAt. (The Agent Activity lanes view these fields once fed is gone from the base; the gallery reads them fromAgentLaneStore.)Registry.
webviews/src/pages/chief-views/registry.tsis one list of manifests (id, title, description, glyph, component, default placement,defaultOn, which data it needs). It is shaped like the AppPlatform manifest. Adding a view is one entry.Gating. Debug Settings > Home > Chief view gallery (
home.chiefViewGallery) is on by default in DEV and NIGHTLY and never offered in Release or RC. When it is on, the palette offers Chief View Gallery (chief.openViews).Fleet address. No address is built in: the internal dashboard host stays out of the source. Set one from the Fleet view's field (stored in the app's defaults) or with
CMUX_CHIEF_VIEWS_FLEET_URL. It must be https; plain http is accepted only for localhost and tailnet (*.ts.net) names. The field says when an address is refused.Clicks only.
open,open_urlandset_fleet_urlrun only from a person's click:openreveals a chat with the session deep link, or a terminal tab.open_urlopens only this repo's github.com pages (dot segments refused), and opens them in Home's right side.Code layout. The Swift side is its own target,
CmuxNextChiefViews(page, provider, feeds, agent rows, native strings), so CmuxNextApp does not grow: the app keeps a 20-line tab glue (Pages/ChiefViewsPageTab.swift). To offset that glue, a genericPages/WebPageTab.swift(one React page per tab, closed with its tab) replaces the one-off page-tab classes of Stats, Chief Usage, channels and CodeRouter, with no behavior change. App source lines: +0 against the base.Honest limits.
Testing
webviews/test/chief-views-page.test.tsx(12 tests, passed locally with bun before the fleet rule stopped local bun runs) covers:#N,pull/N,pr-N)CmuxNextChiefViewsTests/ChiefViewsPageTests.swift(Swift Testing) covers:lost→ failed, the new summary fields, and a laterupdatedAtalone comparing equaldata.jsontrimmingThey run in this PR's CI (
cmux-next swift test); nothing compiles on the laptop.I checked the gallery entry
pages.chief-views(10 variants) in the local gallery dev server in light and dark at 420, 760 and 1180 px. That pass caught and fixed:python3 scripts/cmux-next/prepush-gate.py: no new violations.Not run here: a Mac build or a live tagged app. Nothing has been checked in a running app yet.
Changelog
Added: Chief View Gallery (command palette, nightly) opens views beside the Chief: where every agent is, an agent board, the CI fleet, landing PRs and today's timeline
Proof
Before: none (a new page). After: the gallery advisory run's captures of
pages.chief-viewsat headaf3ce0cd(run 39524300829), 420 px wide. The page code is unchanged since. These are Linux Chromium story renders with a fallback font, not the macOS system font; nothing has been captured in a running app yet.Checklist
ChiefViews.xcstringshas 7 keys in 21 localesaction.chief.openViewsis in ActionCatalog.xcstrings in 21 localesNo capture: the gallery is a React page (webviews/src/pages/chief-views), shown in the Proof stills above from the Linux gallery run; the Swift files are its data provider, the page-tab glue and a no-behavior-change WebPageTab refactor, with no native drawing of their own, and no tour scene opens this nightly-only page yet.
Originally written by the session above (cosmic-gray, e8f63fd9); adopted by orphan-sweep, which merged feat-cmux-next in at 36ee174 (base had removed the Agent Activity lanes view, so the lane's
rankedcopy went with it).Agent session: cosmic-gray