Skip to content

cmux NEXT composer: a short + menu, a few recent commands and one Commands and skills… row - #30230

Merged
teamleaderleo merged 2 commits into
feat-cmux-nextfrom
lane/composer-plus-menu-short
Nov 1, 2026
Merged

teamleaderleo merged 2 commits into
feat-cmux-nextfrom
lane/composer-plus-menu-short

Conversation

@teamleaderleo

Copy link
Copy Markdown
Collaborator

Leo (2026-11-01): "our + button results are still really bad". His + listed Attach, Plan, Goal and then every skill and slash command (/aws-, /cloudflare-, /cmux:* …) running off the screen, with "PlanPlan" (title and description run together in the native escape panel).

Builds on #28798 ("one + menu for chat and New Tab, ChatGPT's shape, skills under /"), which already took the skill rows out of the web + menu and fixed "PlanPlan" (popupHost draws "title — description"). His screenshot shows the menu from before that change. This PR finishes the short menu the coordinator specified, without removing anything:

What changed

    • is: attach (files, screenshot, window) | Plan, Goal, Mention (Choose project on a new chat) | at most three recent commands, then one "Commands and skills…" row | Search files, chats, pages. No other skill or command is a + row, however many the agent advertises; all of them stay under / (the searchable slash list), which "Commands and skills…" opens with the draft kept.
  • Recents (recentCommands.ts): the commands the person picked last (from / or from +) that this chat's agent still lists; Goal is never one (it has its own row). Local UI memory in localStorage, never sent to the host. The menu reads them again as it opens (Picker onOpen), so a command used in another pane shows up.
  • "Skills…" is now "Commands and skills…" (the list it opens holds both), in every shipped language; its redundant description is gone (the row shows its / hint).
  • Height: still 340 px wide, at most 360 px tall, scrolls inside (cmux NEXT composer: one + menu for chat and New Tab, ChatGPT's shape, skills under / #28798); opens on the click with no fade.

Gallery

Entry agent-pane.composer-plus (ComposerPlusMenu.gallery.ts), variants recent-commands, one-recent, no-recents; experiment composer-plus-commands with arms recents-then-row (shipped), row-then-recents, row-only. Picked recents-then-row: the recents are what a person picks most, and the row closes the group like ChatGPT's "More".

Design spec: leo-workspace design/composer.md rule 19 (new, the short + menu), with rule 17 (the + menu's glass, unchanged).

Tests

  • bun test src/agent-session/acpmux/composerPlusRegistry.test.ts (12 pass): at most PLUS_RECENT_COMMANDS command rows with 40 skills, the row opens / (composer.commands), a recent row writes its command, the three arms, the store.
  • bun test test/composer-suggested-prompt.test.tsx (19 pass): the rendered commands group is /skill3, /skill1, /skill9, Commands and skills…; clicking a recent writes /skill9 and moves it first; "Commands and skills…" opens the slash list.
  • bun test test/new-tab-gallery-reached.test.ts src/agent-session/acpmux/newtab/NewTabScreen.test.tsx pass.
  • scripts/web-lint.sh passed; bun run typecheck no type errors.
  • Gallery stills taken locally (Chromium, 2x, light and dark) for every variant and arm.

Observed / Not run

  • test/gallery-coverage.test.ts: 3 failures, all from entries this PR does not touch (red on base); this PR adds no line to them.
  • test/composer-plus-menu-shape.browser.test.ts (labels updated) not run here.

Changelog

Changed: the composer's + menu lists a few recent commands and one "Commands and skills…" row instead of every skill.

Follow-up (not built): pinned commands in +.

Agent session: agent session

🤖 Generated with Claude Code

…skills… row

Leo (2026-11-01): "our + button results are still really bad" (his + listed every
skill and slash command, off the screen).

- + lists attach, Plan, Goal and Mention, then a commands group: at most three
  recent commands (the ones picked last that this chat's agent still lists;
  recentCommands.ts, local UI memory) and one "Commands and skills…" row (was
  Skills…) that opens the searchable slash list. Every other skill stays under /.
- The menu reads its recents again as it opens (Picker onOpen), so a command
  used in another pane shows.
- Experiment composer-plus-commands (recents-then-row ships; row-then-recents,
  row-only) and gallery agent-pane.composer-plus (recent-commands, one-recent,
  no-recents).
- Tests: composerPlusRegistry.test.ts (at most PLUS_RECENT_COMMANDS rows, the
  row opens /, arms, the store) and composer-suggested-prompt.test.tsx (the
  rendered group, a recent row writes its command; the row opens the slash list).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Agent-Session: https://cmux.com/deeplink/agent?id=aid-fc8c533338a49a862576
@github-actions

github-actions Bot commented Nov 1, 2026 •

Copy link
Copy Markdown
Contributor

cmux status (one comment, edited in place; each line is updated by the job that owns it)

Review d01bca0: HQ feed card · gallery before/after runs · checks

App of this head (app.zip, kept 1 day)

gh workflow run reload-build.yml -R manaflow-ai/cmux --ref feat-cmux-next -f tag=pr30230 -f ref=lane/composer-plus-menu-short -f platform=macos -f backend_mode=local

Gallery before/after for d01bca0: 16 states rendered, 0 images differ, 1262 more touched states not rendered. Images are in the run's artifact, not on this public PR; the independent review of this head reads them on its own, so the PR needs no hand-made screenshots of these states.

gh run download 41282238166 -R manaflow-ai/cmux -n gallery-advisory-30230-d01bca07450aa8023e4ffc310aebdd98c8a75275 (then read gallery-review.json)

States
State Theme Status Diff Picked by
agent-pane.composer/font-size-chat-14 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-chat-14 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-chat-14 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-chat-14 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-tab-14 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-tab-14 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-chat-21 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-chat-21 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-chat-21 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-chat-21 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-tab-21 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-tab-21 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-chat-28 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-chat-28 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-chat-28 Apple System Colors Light unchanged 0% own Composer.tsx
agent-pane.composer/font-size-new-chat-28 Apple System Colors unchanged 0% own Composer.tsx
agent-pane.composer-pickers/closed Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/closed Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/pill-rail Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/pill-rail Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-menu Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-menu Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-more Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-more Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-focus Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-focus Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-press-drag-release Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/model-press-drag-release Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/effort-menu Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/effort-menu Apple System Colors unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/effort-focus Apple System Colors Light unchanged 0% own ComposerPickers.tsx
agent-pane.composer-pickers/effort-focus Apple System Colors unchanged 0% own ComposerPickers.tsx

Pick other states with a Gallery: entry.id, entry.id/variant line in the PR body.

red: cmux-next checks (god files, concurrency, crash safety, l10n); base red: the same failure on the base 350dd62; does not block

Shipped in:

@github-actions github-actions Bot added the risk:normal Risk tier (docs/ci/risk-tiers.md) label Nov 1, 2026
@blacksmith-sh

blacksmith-sh Bot commented Nov 1, 2026 •

Copy link
Copy Markdown

Found 5 test failures on Blacksmith runners:

Failures

Test View Logs
nightly must build and hand off the macOS 26 helper and Xcode 26.5 app before publishin
g/
nightly must build and hand off the macOS 26 helper and Xcode 26.5 app before publishin
g
View Logs
test_helper_never_takes_a_hosted_mac_and_skips_compile_on_hit (main.WorkflowTests.t
est_helper_never_takes_a_hosted_mac_and_skips_compile_on_hit)/
test_helper_never_takes_a_hosted_mac_and_skips_compile_on_hit (main.WorkflowTests.t
est_helper_never_takes_a_hosted_mac_and_skips_compile_on_hit)
View Logs
test_the_nightly_is_covered (main.NightlyStepCoverageTests.test_the_nightly_is_cove
red)/
test_the_nightly_is_covered (main.NightlyStepCoverageTests.test_the_nightly_is_cove
red)
View Logs
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)/
test_the_repository_highlights_validate (main.DigestTests.test_the_repository_highl
ights_validate)
View Logs
test_under_githubs_limit_with_headroom (main.NightlyWorkflowSize.test_under_githubs
_limit_with_headroom)/
test_under_githubs_limit_with_headroom (main.NightlyWorkflowSize.test_under_githubs
_limit_with_headroom)
View Logs

Fix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need.

@cursor

cursor Bot commented Nov 1, 2026

Copy link
Copy Markdown

Bugbot needs on-demand usage enabled

Bugbot 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.

@cubic-dev-ai cubic-dev-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

No issues found across 13 files

View guided diff | Turn on auto-fix | Re-trigger cubic

@teamleaderleo
teamleaderleo merged commit 0c0340d into feat-cmux-next Nov 1, 2026
175 of 178 checks passed
@teamleaderleo
teamleaderleo deleted the lane/composer-plus-menu-short branch November 1, 2026 09:56

Copy link
Copy Markdown
Collaborator Author

W2-09 follow-up — the short + menu hands the full skill catalog to an eager / list

Independent source review for HQ W2-09. This is a follow-up to the UX boundary in #30230, not a claim that #30230 introduced the underlying slash-picker cost. Current feat-cmux-next checked again at full SHA c7c9a16c05e6868b78ae17e8dcececa7bad16218 (2026-11-01 10:32 UTC).

Trace, current source:

  1. composerPlusRegistry.ts:163-191 caps recents at three and has a single add.commands row. Composer.tsx:2423 opens the slash picker, preserving the user's draft.
  2. slashCommands.ts:78-92 filters and sorts all matching commands. An empty query (/) matches the entire advertised list; skill- also matches every entry with that prefix. No result/window bound.
  3. Composer.tsx:1163-1167 passes that complete array to the locally declared SlashMenu, :2465-2560; :2518 calls matches.map to make one DOM role=option per hit. CSS scroll height can be bounded while DOM work remains proportional to the full list.
  4. Composer.tsx:2255-2265 points aria-activedescendant at acpmux-slash-${selected}; the keyboard moves the full-list index (:1772-1790). A fix must keep the active option mounted and selectable when crossing a result-window boundary.

Deterministic negative fixture run (source-equivalent JS port of matchCommands, 5,000 synthetic skill-0000…skill-4999 commands): / → 5,000 matches → 5,000 option render iterations; /skill- → 5,000; /skill-4999 → 1; /nonsense → 0. Keyboard index 49 → 50 remains a valid selection. All model assertions passed; React DOM timing, app FPS and screen-reader behavior were not measured. The existing composerPlusRegistry.test.ts covers 30/40 skills in the + menu but leaves the handoff-to-slash list outside its assertion.

Recommended first slice (for the composer owner): one bounded/windowed command-result presenter shared by the current HTML slash picker and the pending native-popup consumer; e.g. at most 40 mounted/sent rows while retaining the full filtered/ranked catalog and its selected index. Keep the active row in view and its stable aria-activedescendant target mounted. Preserve mouse wheel, arrow wrap, Ctrl-J/K, Tab/Return, Esc restoration of the original + draft, IME composition, slash source labels and the state-dependent /fast row. A simple slice(0, 40) without navigation/paging is insufficient.

Repro/acceptance: a browser/gallery test with 5,000 advertised skills, open + → Commands and skills… (/), assert ≤40 option rows after each key, ArrowDown 39→40 and later entries remain reachable, active-descendant always exists in DOM, filter /skill-4999 selects exact command, Escape restores previous typed draft; repeat 0, 1 and 5,000 items, under a narrow pane and during a running turn. Measure input→menu frame p95/p99 before/after (no invented budget). The native-popup owner must separately bound rows over the host protocol.

Ownership/overlap: #30230 is merged (UX choice stays); #27144 is an open draft/HOLD native-composer-menu migration dependent on #27142 and #27140. The current #27144 diff has no replacement for this slash matching/window contract; coordinate with its owner before changing DOM menu code. A separate SlashMenu.tsx also implements matches.map; audit call sites before retiring that duplicate.

Evidence level: source + source-equivalent deterministic fixture. No production edit, live app run, native build, CI run, or claimed performance measurement. This is a specific follow-up for the current owner, without a coordinator dispatch request.

Copy link
Copy Markdown
Collaborator Author

W2-09 owner follow-up: the code implementation for the earlier 5,000-skill source finding is now a real cmux draft PR #31293, based on current feat-cmux-next. It retains the merged short + menu, changes the actual slash picker to mount bounded rows, includes six viewport regressions, and coordinates with the pending native popup #27144. The HQ-only draft #5954 was closed as superseded. PR #31293 is HOLD pending full integrated web/native checks and owner review.

This branch was previously deployed

1 inactive deployment
ci-routing-agent — d01bca07 Deployed Nov 1, 2026 by teamleaderleo via cmux-tui tree preflight #94377
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

risk:normal Risk tier (docs/ci/risk-tiers.md)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant