Skip to content

iOS: custom key combos / macros in the toolbar - #6108

Closed
austinywang wants to merge 21 commits into
mainfrom
issue-6087-ios-custom-key-combos
Closed

austinywang wants to merge 21 commits into
mainfrom
issue-6087-ios-custom-key-combos

Conversation

@austinywang

@austinywang austinywang commented Jun 14, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #6087

What & why

Users asked to bind their own key combos / macros to iOS terminal-toolbar buttons — e.g. a single button that rotates an agent's permission mode (⇧ Tab) or runs a short key/text sequence.

The model already had CustomToolbarAction with .text and .keyCombo payloads, but the editor only ever produced .text (key combos weren't user-creatable) and there was no macro (multi-step) support. This PR closes that gap.

Changes

Model — CmuxMobileTerminalKit

  • New ToolbarMacroStep (.text / .keyCombo) with byte encoding.
  • New .macro([ToolbarMacroStep]) case on ToolbarActionPayload. A tap sends the steps' bytes concatenated into one write — no inter-step delays (no sleeps).
  • CustomToolbarAction.output now resolves every payload kind through ToolbarMacroStep.output, so text/key-combo encoding lives in one place. .text / .keyCombo byte output is unchanged.
  • TerminalSpecialKey: CaseIterable for the editor's key picker.

Editor — CmuxMobileShellUI

  • CustomToolbarActionEditorView gains a Text vs Key Sequence type picker. Key Sequence is an ordered, reorderable list of steps; each step is either a key combo (⇧ ⌃ ⌥ chips + special-key picker) or a text snippet. Unsupported combos are flagged inline and block Save, so a saved macro never carries a dead step.
  • Pure CustomToolbarActionDraft (seed → build → validity) drives the view and is unit-tested without SwiftUI.
  • The shortcuts settings row icon now distinguishes a text snippet from a key-combo/macro.

The tap/send path is unchanged — it already sends custom.output as a single blob and clears armed modifiers first — so macros required no wiring change.

How to verify (iOS Simulator)

  1. Run the cmux-ios app, open a terminal, tap the customize control on the keyboard toolbar → Terminal Shortcuts → Add Custom Action.
  2. Set a label, choose Key Sequence, Add Step → Add Key Combo, toggle ⇧, pick Tab, Save.
  3. The new button appears on the toolbar; tapping it sends ESC [ Z (Shift+Tab) — e.g. rotates Claude's permission mode in a running agent.
  4. Try a multi-step macro (e.g. a ⇧ Tab key step + a text step ending in Return) and reorder/delete steps. Reopen the app to confirm it persists.

Tests

  • Kit suite (CmuxMobileTerminalKitTests): macro byte concatenation, skipping unresolvable steps, all-empty → nil, Codable round-trip, and the ⇧ Tab rotate-mode example. Run locally via swift test --package-path Packages/CmuxMobileTerminalKit (✅ 85 passing).
  • cmuxFeatureTests (runs in the iOS simulator test plan): CustomToolbarActionDraft seed/build/validity round-trips, the rotate-permission-mode scenario built end-to-end, and macro persistence through TerminalAccessoryConfiguration.

Localization

All new user-facing strings added to ios/cmux/Resources/Localizable.xcstrings with en + ja (25 keys; additive diff, no existing entries changed). Audit: no bare user-facing English in the changed Swift files (only SF Symbol names, key glyphs ⇧⌃⌥, and accessibility identifiers remain).

Scope note

Part of the iOS toolbar-customization cluster (#6086–#6091) being worked in parallel. Kept tightly scoped to #6087; expect to rebase against main / siblings on landing. Control-letter combos (Ctrl+R, etc.) are a deliberate follow-up — the built-in ^C/^D/^Z/^L buttons and text steps already cover the common cases.


View with Codesmith Autofix with Codesmith
Need help on this PR? Tag /codesmith with what you need. Autofix is disabled.


Summary by cubic

Adds custom key combos and multi-step macros to iOS terminal toolbar buttons so one tap can send ⇧Tab or run a short sequence. Fixes #6087. Steps send as one write with no delays; invalid steps are blocked in the editor.

  • New Features

    • CmuxMobileTerminalKit: ToolbarMacroStep (.text/.keyCombo) with encoding; ToolbarActionPayload.macro([ToolbarMacroStep]); unified bytes via ToolbarMacroStep.output; TerminalSpecialKey: CaseIterable.
    • CmuxMobileShellUI: Editor adds Text vs Key Sequence; reorderable steps with ⇧⌃⌥ chips and a special‑key picker; legacy .keyCombo opens as a one‑step sequence; settings list icon reflects payload via ToolbarActionPayload.settingsRowSystemImage. Pure CustomToolbarActionDraft (seed → build → validity) with a 50‑step cap.
    • Tests/Localization: concat/Codable and ⇧Tab example; draft seed/build/validity + persistence through TerminalAccessoryConfiguration; new strings (en, ja).
  • Bug Fixes

    • Own EditMode to avoid getting stuck; reset when steps empty or leaving Key Sequence; show reorder control whenever steps exist.
    • Inline hint for empty text steps; validation blocks unsupported combos and empty steps.
    • Exhaustive switch in macro‑step output to guard against missing cases.
    • Restored Debug Settings localizations.

Written for commit d390db1. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added Key Sequence mode for custom toolbar actions, allowing users to define ordered sequences of key combinations
    • Enhanced toolbar action editor with mode selection (Text vs. Key Sequence) and multi-step editor for macro sequences
    • Improved visual distinction in toolbar settings with context-specific icons for different action types

Lets users define custom key-combo and multi-step macro toolbar buttons
in the mobile terminal shortcut bar — e.g. a single button that rotates
an agent's permission mode (⇧ Tab), or a short sequence of keys and text.

Model (CmuxMobileTerminalKit):
- Add `ToolbarMacroStep` (.text / .keyCombo) with byte encoding.
- Add `.macro([ToolbarMacroStep])` to `ToolbarActionPayload`; a tap sends
  the steps' bytes concatenated into one write (no inter-step delays).
- `CustomToolbarAction.output` resolves every payload kind through
  `ToolbarMacroStep.output` so text/key-combo encoding lives in one place;
  `.text` / `.keyCombo` byte output is unchanged.
- `TerminalSpecialKey: CaseIterable` for the editor's key picker.

Editor (CmuxMobileShellUI):
- `CustomToolbarActionEditorView` gains a Text vs Key Sequence type picker.
  Key Sequence is an ordered, reorderable list of steps: each a key combo
  (⇧⌃⌥ chips + special-key picker) or a text snippet. Unsupported combos
  are flagged and block Save so a saved macro never carries a dead step.
- Pure `CustomToolbarActionDraft` (seed → build → validity) drives the
  view and is unit-tested without SwiftUI.
- Settings row icon now distinguishes a text snippet from a key-combo/macro.

The tap/send path is unchanged (it already sends `custom.output` as one
blob), so macros need no wiring change.

Tests: macro byte concatenation/codable + the ⇧Tab rotate-mode example
(Kit suite), and draft seed/build/validity round-trips plus macro
persistence through `TerminalAccessoryConfiguration` (cmuxFeatureTests,
which runs in the iOS simulator test plan).

All new user-facing strings localized (en + ja).

Fixes #6087

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@vercel

vercel Bot commented Jun 14, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
cmux Ready Ready Preview, Comment Jun 20, 2026 1:04am
cmux-staging Building Building Preview, Comment Jun 20, 2026 1:04am

@coderabbitai

coderabbitai Bot commented Jun 14, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

Adds custom key-combo and macro support to the iOS toolbar. A new ToolbarMacroStep enum encodes individual text or key-combination steps; ToolbarActionPayload gains a macro case. CustomToolbarAction.output is unified to resolve all payload types through ToolbarMacroStep. A CustomToolbarActionDraft model drives a redesigned two-mode editor view. Localized strings and comprehensive tests are included.

Changes

Custom Toolbar Key Combo / Macro Feature

Layer / File(s) Summary
Core macro data model and output resolution
Packages/CmuxMobileTerminalKit/Sources/CmuxMobileTerminalKit/TerminalSpecialKey.swift, ToolbarMacroStep.swift, ToolbarActionPayload.swift, CustomToolbarAction.swift
TerminalSpecialKey gains CaseIterable. New ToolbarMacroStep (text/keyCombo with output: Data?) is added. ToolbarActionPayload gets a macro([ToolbarMacroStep]) case. CustomToolbarAction.output is rewritten to delegate all payload resolution to ToolbarMacroStep, concatenating macro steps into one Data.
Draft model and editor support types
Packages/CmuxMobileShellUI/Sources/CmuxMobileShellUI/CustomToolbarActionDraft.swift
New CustomToolbarActionDraft holds mode/title/commandText/steps, seeds from an existing action, validates with isValid, and builds via build(id:). ToolbarEditorModifierOption, TerminalKeyModifier.editorModifierOptions, and TerminalSpecialKey.editorPickerOrder/editorDisplayName support the editor UI.
Draft-driven editor view, settings icon, and localization
Packages/CmuxMobileShellUI/Sources/CmuxMobileShellUI/CustomToolbarActionEditorView.swift, TerminalShortcutsSettingsView.swift, ios/cmux/Resources/Localizable.xcstrings
CustomToolbarActionEditorView is refactored into a two-mode (Text / Key Sequence) form with reorderable EditableMacroStep rows and a draft.isValid-gated Save button. TerminalShortcutsSettingsView gains a payload-aware customActionIcon(_:) helper. All mobile.toolbar.editor strings are added with English and Japanese translations.
Unit and integration tests
Packages/CmuxMobileTerminalKit/Tests/.../ToolbarCustomizationTests.swift, ios/cmuxPackage/Tests/cmuxFeatureTests/CustomToolbarMacroTests.swift
ToolbarMacroStepTests and CustomToolbarActionMacroTests cover newline normalization, key-combo encoding, byte concatenation, empty-step skipping, and Codable round-tripping. CustomToolbarActionDraftTests validates seed/build/round-trip. TerminalAccessoryConfigurationMacroTests verifies UserDefaults persistence and reload.

Sequence Diagram

sequenceDiagram
  actor User
  participant CustomToolbarActionEditorView
  participant CustomToolbarActionDraft
  participant ToolbarMacroStep
  participant CustomToolbarAction

  User->>CustomToolbarActionEditorView: Open editor (new or existing action)
  CustomToolbarActionEditorView->>CustomToolbarActionDraft: init(action:) — seed from payload
  User->>CustomToolbarActionEditorView: Switch mode to Key Sequence, add steps
  CustomToolbarActionEditorView->>CustomToolbarActionDraft: Update mode/steps via `@State` bindings
  User->>CustomToolbarActionEditorView: Tap Save (enabled when draft.isValid)
  CustomToolbarActionEditorView->>CustomToolbarActionDraft: build(id:)
  CustomToolbarActionDraft->>ToolbarMacroStep: Validate each step has output
  CustomToolbarActionDraft-->>CustomToolbarActionEditorView: CustomToolbarAction (macro payload)
  CustomToolbarActionEditorView->>CustomToolbarAction: onSave(action)
  CustomToolbarAction->>ToolbarMacroStep: Reduce steps[].output into Data
  ToolbarMacroStep-->>CustomToolbarAction: concatenated Data bytes
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • manaflow-ai/cmux#5510: Shares the same CustomToolbarAction, ToolbarActionPayload, and CustomToolbarActionEditorView files — this PR extends that custom-actions infrastructure with macro/key-sequence step support via ToolbarMacroStep and a reworked draft-driven editor.

Poem

🐇 Hippity-hop, the keys are in line,
A macro of steps, all yours to define!
Shift-Tab, Escape, or a combo you love,
The toolbar now sparkles — a tap is enough.
Each step clicks in order, the bytes neatly flow,
This bunny coded macros — it's quite a show! 🎉


Important

Pre-merge checks failed

Please resolve all errors before merging. Addressing warnings is optional.

❌ Failed checks (1 error, 1 warning)

Check name Status Explanation Resolution
Cmux Algorithmic Complexity ❌ Error CustomToolbarActionEditorView.swift line 71 violates the algorithmic complexity rule: draft.isValid performs an unbounded full-collection scan (steps.allSatisfy with string processing per step) in... Add explicit max step limit (e.g. max 50) with documentation, add performance measurement, or memoize/cache isValid to avoid rescanning on every keystroke.
Docstring Coverage ⚠️ Warning Docstring coverage is 28.57% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (19 passed)
Check name Status Explanation
Title check ✅ Passed The PR title accurately and concisely summarizes the main change: adding custom key combos and macros to the iOS toolbar, which is the primary objective.
Linked Issues check ✅ Passed The PR fully addresses issue #6087 by implementing the ability for users to define custom key-combo and multi-step macro buttons in the iOS mobile toolbar, including the specific Shift+Tab use case for permission rotation.
Out of Scope Changes check ✅ Passed All changes are directly scoped to implementing custom key combos and macros in the toolbar. No unrelated modifications or scope creep detected; control-letter combos are explicitly noted as a deliberate follow-up.
Cmux Swift Actor Isolation ✅ Passed New types fit allowed exception: CustomToolbarActionDraft and ToolbarEditorModifierOption are small, pure value structs used only in MainActor-only CustomToolbarActionEditorView View and never acce...
Cmux Swift Blocking Runtime ✅ Passed No blocking or timing-based synchronization constructs (semaphores, sleeps, locks, delayed dispatch, polling) introduced in production code. PR explicitly documents "no inter-step delays"; macro st...
Cmux Expensive Synchronous Load ✅ Passed PR adds no expensive synchronous loaders like RestorableAgentSessionIndex.load(). All new code (CustomToolbarActionDraft validation, ToolbarMacroStep encoding, CustomToolbarAction.output) uses only...
Cmux Cache Substitution Correctness ✅ Passed No cache substitution occurs. CustomToolbarAction.output remains fully computed from authoritative payload (stored in action); the refactoring delegates .text/.keyCombo encoding to ToolbarMacroStep...
Cmux No Hacky Sleeps ✅ Passed PR contains only Swift code and localization data. Custom check applies only to TypeScript, JavaScript, shell, and build/runtime scripts; Swift is explicitly out of scope per rule.
Cmux Swift Concurrency ✅ Passed PR introduces no legacy async patterns. The only @escaping closure is a SwiftUI View callback boundary (allowed), all model code is pure synchronous, and no DispatchQueue, Combine, or fire-and-forg...
Cmux Swift @Concurrent ✅ Passed PR introduces only synchronous, pure-data types; no async functions, @concurrent annotations, or isolation violations. All new enums (ToolbarMacroStep, ToolbarActionPayload) conform to Sendable. Pr...
Cmux Swift File And Package Boundaries ✅ Passed All Swift files comply with package boundary rules: new files under 400 lines with single coherent responsibility, no oversized additions, clear separation of domain (ToolbarMacroStep), state (Cust...
Cmux Swift Logging ✅ Passed PR-changed Swift production files contain no forbidden logging calls (print, debugPrint, dump, NSLog), improper Logger usage, or sensitive data exposure.
Cmux User-Facing Error Privacy ✅ Passed All user-facing text properly uses localization and avoids exposing sensitive information, vendor names, implementation details, or raw error messages. The unsupported-combo validation message is g...
Cmux Full Internationalization ✅ Passed All user-facing Swift text uses L10n.string() API with defaultValue; 34 new mobile.toolbar.editor keys have complete en+ja translations in Localizable.xcstrings; kit files contain no UI text; tests...
Cmux Swiftui State Layout ✅ Passed PR uses correct modern SwiftUI patterns: pure value-type CustomToolbarActionDraft (no ObservableObject/@published) with @State mirrors only for modal dialog; no GeometryReader, no store refs in For...
Cmux Architecture Rethink ✅ Passed PR avoids all architectural violations: no timing/dispatch/locks/observers, pure model layer with clear isValid invariant, single @State owner in EditorView, no split UI lifecycle, and improves enc...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR adds iOS-only toolbar editor views and data models; no NSWindow, NSPanel, NSWindowController, SwiftUI Window, or WindowGroup code added. Not applicable to auxiliary window rules.
Cmux Source Artifacts ✅ Passed All PR files are hand-written source, test, and localization catalog files; no local tool output, generated logs, screenshots, caches, build output, or artifact directories detected.
Description check ✅ Passed The PR description comprehensively addresses all required template sections: detailed What & Why, thorough Changes breakdown organized by module, step-by-step verification instructions, test coverage details, localization confirmation, and scope notes for parallel work.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch issue-6087-ios-custom-key-combos

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

…-key-combos

# Conflicts:
#	ios/cmux/Resources/Localizable.xcstrings
@greptile-apps

greptile-apps Bot commented Jun 14, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR adds user-configurable key combos and multi-step macros to the iOS terminal toolbar. The model gains ToolbarMacroStep and ToolbarActionPayload.macro, while the editor is refactored around a pure CustomToolbarActionDraft state model that separates UI logic from save/build/validity logic.

  • Model (CmuxMobileTerminalKit): New ToolbarMacroStep enum mirrors ToolbarActionPayload at the step level; CustomToolbarAction.output routes text and keyCombo through it for unified encoding; TerminalSpecialKey gains CaseIterable for the picker.
  • Editor (CmuxMobileShellUI): CustomToolbarActionEditorView gains a mode picker (Text / Key Sequence) and a reorderable step list; owned EditMode state prevents the previously-reported stuck-edit-mode regression; both previous thread issues (empty-text hint, stuck edit mode) are addressed in this diff.
  • Tests & i18n: Kit-level and feature-level tests cover byte concatenation, Codable round-trips, draft seed/build/validity, and persistence; all 25 new user-facing strings are translated in en + ja.

Confidence Score: 5/5

Safe to merge; the change is additive and the tap/send path is unchanged.

The new model types are pure value types with exhaustive switches and correct nil-propagation. The editor refactor centralises save/build/validity in a testable pure struct, the two previously-flagged regressions are both fixed in this diff, the 50-step cap bounds all iteration, and all 25 new user-facing strings are translated in every supported locale. Tests cover byte concatenation, Codable round-trips, draft validity, and persistence.

No files require special attention.

Important Files Changed

Filename Overview
Packages/iOS/CmuxMobileTerminalKit/Sources/CmuxMobileTerminalKit/ToolbarMacroStep.swift New type encoding one step of a macro; text/keyCombo output logic extracted here so encoding is in one place. Exhaustive switch, correct newline normalization, nil for empty/unencodable.
Packages/iOS/CmuxMobileTerminalKit/Sources/CmuxMobileTerminalKit/ToolbarActionPayload.swift Adds the .macro([ToolbarMacroStep]) case. Additive change; existing .text and .keyCombo cases unchanged.
Packages/iOS/CmuxMobileTerminalKit/Sources/CmuxMobileTerminalKit/CustomToolbarAction.swift .output now routes .text and .keyCombo through ToolbarMacroStep.output and concatenates macro steps; skips nil steps, returns nil for all-empty macro. Byte output for existing cases is unchanged.
Packages/iOS/CmuxMobileTerminalKit/Sources/CmuxMobileTerminalKit/TerminalSpecialKey.swift Adds CaseIterable conformance so the editor can enumerate all keys; no behavioral change.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/CustomToolbarActionDraft.swift Pure, SwiftUI-free state model for the editor. Seed/build/validity logic is well-factored and fully tested. 50-step cap bounds allSatisfy iteration. Legacy .keyCombo is intentionally folded into a one-step macro on save.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/CustomToolbarActionEditorView.swift Major redesign with mode picker, step list, and owned EditMode. Both previously-flagged regressions (stuck edit mode, unexplained grey Save) are addressed. Bindings into enum associated values are correctly structured.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/EditableMacroStep.swift Thin Identifiable wrapper giving each step a view-local stable identity for ForEach reorder/delete; identity is correctly never persisted.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/ToolbarEditorModifierOption.swift Modifier toggle-chip definitions and key picker order/display names for the editor. editorModifierOptions is a computed static var (calling L10n per access); correct for locale-switching, bounded to 3 items.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/ToolbarActionPayload+SettingsIcon.swift Small extension returning an SF Symbol name distinguishing text from key-combo/macro payloads. Exhaustive switch over all three cases.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/CustomToolbarActionDraftMode.swift Minimal two-case enum for the editor mode picker; clean.
Packages/iOS/CmuxMobileShellUI/Sources/CmuxMobileShellUI/TerminalShortcutsSettingsView.swift Row icon now reads custom.payload.settingsRowSystemImage instead of a hardcoded string, correctly distinguishing text/key-combo/macro items.
ios/cmux/Resources/Localizable.xcstrings 25 new string keys, all with en + ja translations, all additive. No existing keys modified.
Packages/iOS/CmuxMobileTerminalKit/Tests/CmuxMobileTerminalKitTests/CustomToolbarActionMacroTests.swift Tests macro byte concatenation, the motivating ⇧Tab example, skip-nil-steps, all-empty→nil, and Codable round-trip. Good coverage.
Packages/iOS/CmuxMobileTerminalKit/Tests/CmuxMobileTerminalKitTests/ToolbarMacroStepTests.swift Unit tests for ToolbarMacroStep.output: newline normalization, empty→nil, and the shift+tab encoding. Clean.
ios/cmuxPackage/Tests/cmuxFeatureTests/CustomToolbarMacroTests.swift Feature tests for CustomToolbarActionDraft seed/build/validity and TerminalAccessoryConfiguration macro persistence. The editorPickerOrder completeness check (Set(keys) == Set(TerminalSpecialKey.allCases)) is a good regression guard for future key additions.

Reviews (17): Last reviewed commit: "fix: restore debug settings localization..." | Re-trigger Greptile

austinywang and others added 2 commits June 14, 2026 00:47
Address autoreview/Aziz file-organization findings by splitting the
supporting types out of the editor files:
- EditableMacroStep → EditableMacroStep.swift
- ToolbarEditorModifierOption + the TerminalKeyModifier/TerminalSpecialKey
  editor presentation extensions → ToolbarEditorModifierOption.swift
- the settings-row icon helper → a ToolbarActionPayload.settingsRowSystemImage
  extension (ToolbarActionPayload+SettingsIcon.swift) instead of a private
  static func on the view (a file-scope free func would trip the iOS
  package-conventions lint, so an extension property is the compliant home)

No behavior change.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- P1: the step-list reorder control was shown only when steps.count > 1, so
  deleting from 2 steps to 1 hid it while edit mode stayed active, trapping
  the user. Own the EditMode state, show the control whenever the list is
  non-empty, and force edit mode inactive when the list empties or the editor
  leaves key-sequence mode.
- P2: an empty text step silently disabled Save with no cue. Add a symmetric
  inline caption (mirroring the unsupported-key-combo warning) so the greyed
  Save button is explained.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…-key-combos

Resolve swift-file-length-budget.tsv conflict by regenerating the budget
from the merged working tree (python3 scripts/swift_file_length_budget.py
--write-budget). Both sides edited ContentView.swift, TerminalController.swift,
WorkspaceUnitTests.swift, and WorkspaceRemoteConnectionTests.swift, so neither
side's recorded line count matched the merged result; the regenerated counts
match the actual merged files and the budget check passes.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026

This branch was successfully deployed

1 active deployment
Preview – cmux — d390db18 Deployed Jun 20, 2026 by vercel[bot]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

iOS: custom key combos / macros in the toolbar (e.g. rotate Claude permission-mode / effort)

3 participants