Repository navigation
Fix cmux themes single-sided Ghostty values (#10068) - #10358
austinywang wants to merge 59 commits into
Conversation
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
📝 WalkthroughWalkthroughcmux now writes symmetric Ghostty theme values, repairs legacy single-sided managed themes during loading, and selects both picker targets when a side is missing. Tests, fork metadata, checksums, and CI runner configuration cover the changes. ChangesConditional theme handling
CI runner configuration
Estimated code review effort: 3 (Moderate) | ~25 minutes Sequence Diagram(s)sequenceDiagram
participant ThemePicker
participant CmuxConfigFiles
participant GhosttyConfig
participant GhosttyApp
participant GhosttyRuntime
ThemePicker->>CmuxConfigFiles: write symmetric light/dark theme
GhosttyApp->>CmuxConfigFiles: read managed configuration
CmuxConfigFiles->>GhosttyConfig: normalize single-sided theme
GhosttyConfig-->>GhosttyApp: return repaired theme value
GhosttyApp->>GhosttyRuntime: load inline theme repair
GhosttyRuntime->>GhosttyRuntime: load recursive config files
Merge Risk: 🔵 Low · up to Theme updates generally produce valid two-sided values, but uncommon BOM-formatted managed files may remain unrepaired and an unmarked user theme matching an earlier managed value may be changed unexpectedly. These are bounded configuration edge cases that should be addressed before relying on repair behavior. 🚥 Pre-merge checks | ✅ 13 | ❌ 2❌ Failed checks (2 warnings)
✅ Passed checks (13 passed)
Full details: Out of Scope Changes checkExplanation Most changes support issue ✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
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. Comment |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
…ngle-sided # Conflicts: # Sources/GhosttyTerminalView.swift # docs/ghostty-fork.md # ghostty # scripts/ghosttykit-checksums.txt
Greptile SummaryThe PR makes cmux-generated Ghostty theme selections consistently use valid two-sided conditional values and repairs legacy single-sided managed values while preserving recursive-include precedence.
Confidence Score: 5/5The PR appears safe to merge. No blocking failure remains. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Load Ghostty default files] --> B[Load cmux-managed config]
B --> C{Managed theme is single-sided?}
C -- Yes --> D[Inject valid light/dark repair]
C -- No --> E[Keep parsed configuration]
D --> F[Load recursive includes]
E --> F
F --> G[Apply final conditional override]
Reviews (2): Last reviewed commit: "fix: preserve included theme precedence ..." | Re-trigger Greptile |
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
…ngle-sided # Conflicts: # cmux.xcodeproj/project.pbxproj # docs/ghostty-fork.md # ghostty # scripts/ghosttykit-checksums.txt
|
Deployment failed for project cmux166 with the following error: Learn More: https://vercel.com/manaflow?upgradeToPro=build-rate-limit |
|
Deployment failed for project cmux41 with the following error: Learn More: https://vercel.com/manaflow?upgradeToPro=build-rate-limit |
This comment has been minimized.
This comment has been minimized.
|
I have read the CLA Document and I hereby sign the CLA |
|
Re: Blacksmith report comment 5492325558 — fixed in 23e746b. The CLA policy guard intentionally remains on a GitHub-hosted runner because it executes the immutable base-controlled security validator; I documented it with the existing |
…ngle-sided # Conflicts: # .github/workflows/cla-policy-guard.yml
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes using default effort and found 1 potential issue.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit 482d75d. Configure here.
|
Mac fleet instructions for head JOB_JSON=$(~/.local/bin/cmux-ci submit --kind cmux --command 'CMUX_FLEET_BUILD_TAG=pr-10358-2ec1e0a8 /Users/Shared/cmux-build-fleet/recipes/cmux.sh https://github.com/manaflow-ai/cmux.git 2ec1e0a83a9f06f0ab16bc314e757162b1b54df1' --artifact artifacts/cmux.app.zip --workspace https://github.com/manaflow-ai/cmux/pull/10358 --source-digest 2ec1e0a83a9f06f0ab16bc314e757162b1b54df1 --cache-key cmux:pr-10358 --min-free-bytes 268435456000 --label cmux --label ram48)
JOB_ID=$(python3 -c 'import json,sys; print(json.load(sys.stdin)["id"])' <<<"$JOB_JSON")
~/.local/bin/cmux-ci wait "$JOB_ID" --receipt artifacts/fleet/$JOB_ID.json
~/.local/bin/cmux-ci publish-hq "$JOB_ID"Use an existing campaign job ID if one is already posted; do not submit a duplicate. A wait timeout leaves the remote job running. Published results will include an exact-head artifact link and timing/disk receipt. This recipe validates the macOS app only, not iOS or tests. Never use maclease or put credentials in a PR comment. |
|
Closing; reopen if you still want it. |

Closes #10068
Root cause
cmux themes set --light/--darkand the bundled Ghostty picker emitted single-sided conditional theme values (light:<name>ordark:<name>). Ghostty intentionally rejects those values because conditional syntax requires both sides, so the directive was dropped and terminals kept the default palette. The picker also chose a single-side target when the current value was unset or already single-sided.Fix
bothfor fresh or one-sided state so Enter repairs stale values.Verification
e49d4cdb44); the test-only hosted attempt reached setup and stopped only because that intermediate Ghostty SHA had no artifact pin.arch -arm64 swift testin an isolated package copy: all 5GhosttyConfigCmuxThemeRepairTestspassed; SwiftPM also reports its existingghostty-internal.abinary-name preflight warning for the downloaded artifact.987780a132is published and pinned inscripts/ghosttykit-checksums.txt; the submodule commit is merged intomanaflow-ai/ghosttymain (PR 201).Summary by CodeRabbit
Bug Fixes
Tests
Documentation
Note
Medium Risk
Changes theme encoding, config load semantics for cmux-managed blocks, and pins a new GhosttyKit build—user-facing appearance behavior with careful precedence tests but broad touch across CLI, config, and embedded Ghostty.
Overview
Fixes Ghostty rejecting cmux theme values when only
light:ordark:was written—conditional syntax requires both sides, so themes were dropped and terminals stayed on defaults.Encoding and picker behavior: Swift CLI
themes setand theme encoding now always emitlight:…,dark:…, duplicating the selected side when the opposite is unknown and keeping the other side when it is already set. The interactive picker defaults to both targets when the current selection is fresh or single-sided so Enter repairs stale config. The pinned Ghostty fork documents the matching Zig picker change.Load-time repair: New
GhosttyConfighelpers detect single-sidedthemelines inside# cmux themes start/endblocks and normalize them in memory during config load and appearance summary (unmarked userthemedirectives are unchanged). Theme parsing reuses a sharedconditionalThemeComponentshelper.Other:
cmux-skill-contractCI runs on GitHub-hostedubuntu-24.04for untrusted PRs; GhosttyKit checksum pins submodule987780a132; minor web test timeout style tweaks and a socketself.fix.Reviewed by Cursor Bugbot for commit 182a1f4. Bugbot is set up for automated code reviews on this repo. Configure here.