Skip to content

Add configurable sidebar workspace font size#4798

Merged
austinywang merged 30 commits into
mainfrom
issue-2643-allow-customizing-sidebar-workspace-tab
Jun 1, 2026
Merged

Add configurable sidebar workspace font size#4798
austinywang merged 30 commits into
mainfrom
issue-2643-allow-customizing-sidebar-workspace-tab

Conversation

@austinywang
Copy link
Copy Markdown
Contributor

@austinywang austinywang commented May 26, 2026

Summary

  • Add sidebar-font-size to Ghostty config with a 12.5pt default and 10-20pt clamp.
  • Thread the derived scale through SidebarTabItemSettingsSnapshot so TabItemView.equatable() continues to protect the typing-sensitive sidebar row path.
  • Scale sidebar workspace title, secondary metadata text, branch/path rows, PR rows/icons, ports, shortcut hint, unread badge, and close target from the same value snapshot.
  • Document the key in the configuration example.

Closes #2643.

Architecture

The config file remains the source of truth. SidebarTabItemSettingsStore is the single MainActor owner that observes user-default and Ghostty config reload notifications, computes an immutable SidebarTabItemSettingsSnapshot, and passes only value data below the sidebar list boundary. No new store references, body-time config reads, or timing repair hooks were added under TabItemView.

Tests

Not run locally per task instruction. Added runtime behavior coverage in already-wired test files:

  • SidebarFontSizeConfigTests for default, parse, fractional value, clamping, invalid/non-finite input, and injected load path.
  • SidebarTabItemSettingsSnapshotFontScaleTests for default scale, proportional scale, clamping, and snapshot equality changes.

HQ build command

CMUX_SKIP_ZIG_BUILD=1 ./scripts/reload.sh --tag issue-2643-allow-customizing-sidebar-workspace-tab --launch


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


Note

Medium Risk
Touches Ghostty config persistence, live reload, and a large sidebar rendering path in ContentView; behavior is bounded by clamps and tests but regressions could affect layout or typing-sensitive sidebar performance.

Overview
Adds Ghostty-backed font sizing for the left sidebar (sidebar-font-size, 10–20 pt, default 12.5) and workspace tab bar (surface-tab-bar-font-size, clamped in app), with shared CmuxGhosttyConfigSettingEditor read/write/parse logic (BOM-safe, symlink-aware).

Settings get sliders in Sidebar and Terminal sections via new SettingsFontSize / SettingsHostActions; the host persists off the main actor, reloads config, and shows save failures.

Sidebar rows scale titles, metadata, badges, PR/port rows, shortcut hints, and close targets from a reload-aware SidebarTabItemSettingsSnapshot / store (no extra per-row config reads).

CLI: cmux config get|set and shorthand commands for both keys, optional live reload when a socket is available.

Also updates docs/localization/search, unit tests for parse/clamp/editor round-trips, CI (CMUX_SKIP_ZIG_BUILD on Release universal build, Mach-O Zig stub + Zig selection fixes), and a small web config example.

Reviewed by Cursor Bugbot for commit 04f275f. Bugbot is set up for automated code reviews on this repo. Configure here.

Summary by CodeRabbit

  • New Features

    • Sidebar and tab‑bar font sizes are configurable via settings sliders and applied across the sidebar UI (labels, badges, icons, hints). CLI gain get/set commands for both font sizes.
  • Documentation

    • Configuration docs updated with examples; localization added for font‑size controls (English/Japanese).
  • Bug Fixes

    • Settings UI shows save‑failure feedback when persisting font changes.
  • Tests

    • New tests covering font‑size parsing, clamping, formatting, and scale behavior.

@vercel
Copy link
Copy Markdown

vercel Bot commented May 26, 2026

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

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

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 26, 2026

Review Change Stack

Note

Reviews paused

It 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 reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds configurable sidebar-font-size and surface-tab-bar-font-size end-to-end: parsing/editor, CLI get/set, host persistence and reload, settings UI sliders, async load/store and snapshot, proportional sidebar UI scaling, tests, docs, and CI/build script updates.

Changes

Sidebar and Tab Bar Font Sizing Feature

Layer / File(s) Summary
Config editor, parsing & on-disk write
Sources/CmuxApplicationSupportDirectories.swift, Sources/Settings/ConfigSource.swift
CmuxGhosttyConfigSettingEditor parses/clamps/formats sidebar-font-size and surface-tab-bar-font-size, updates/rewrites config contents, and writes atomically; ConfigSourceEnvironment.writeCmuxConfigSetting persists a single key/value.
GhosttyConfig model
Sources/GhosttyConfig.swift
Adds defaults/min/max constants, stored sidebarFontSize, BOM-tolerant directive parsing, and clamped helper functions delegating to the editor.
CLI config get/set
CLI/CMUXCLI+Config.swift, docs/cli-contract.md
Adds cmux config get/set routing, per-key fontSizeConfig helpers, get/set handlers that parse/format/clamp, resolve config URL, optionally reload via socket, and document the new commands.
Host persistence and reload
Sources/HostSettingsActions.swift
Host exposes sidebar/surface font-size getters and async setters that clamp/format and persist via ConfigSourceEnvironment, serialize writes with a FontConfigWriter actor, log failures, and trigger configuration reload on success.
Settings UI protocol & types
Packages/CmuxSettingsUI/.../SettingsFontSize.swift, .../SettingsHostActions.swift
Adds SettingsFontSize slider descriptor and extends SettingsHostActions with sidebar/surface getters, async setters, and formattedFontSize(_:) plus default implementations.
Settings sections
Packages/CmuxSettingsUI/.../SidebarSection.swift, .../TerminalSection.swift, .../SettingsWindowScene.swift
Adds Sidebar and Terminal font-size sliders with Reset, cancelable async save tasks via hostActions.set*, and save-failure UI; SettingsWindowScene passes hostActions into sections.
Localization & search index
Resources/Localizable.xcstrings, Sources/SettingsNavigation.swift, Sources/SettingsSearchAliases.swift
Adds localized labels/points formatters, search-alias entries, and navigation anchor IDs for the new settings.
Async settings store & snapshot
Sources/ContentView.swift
Adds SidebarFontSizeProvider, SidebarTabItemSettingsSnapshot.sidebarFontScale, and refactors SidebarTabItemSettingsStore to load sidebar font size asynchronously, observe reload/Defaults notifications, refresh snapshots, and cancel tasks on deinit.
TabItemView & UI scaling
Sources/ContentView.swift (TabItemView, PullRequestStatusIcon, metadata/markdown subviews)
Computes fontScale and applies scaled fonts/sizes across workspace rows: titles, subtitles, badges, logs, progress, branch/directory rows, PR icons, metadata, markdown blocks, shortcut overlay, and close-button sizing.
Sidebar directory & helpers
Sources/Sidebar/SidebarDirectoryText.swift, Sources/Sidebar/SidebarAppearanceSupport.swift, Sources/ShortcutHintPill.swift
SidebarDirectoryText uses 10 * fontScale; adds SidebarTabItemFontScale.scale(for:); sidebarShortcutHintOverlay accepts dynamic fontSize.
Tests & docs
cmuxTests/GhosttyConfigTests.swift, cmuxTests/SidebarOrderingTests.swift, web/app/.../configuration/page.tsx
Adds suites validating parsing/clamping/formatting and scale computation; updates example config to include sidebar-font-size = 14.

Build Script and CI Improvements

Layer / File(s) Summary
Zig detection and host arch
scripts/build-ghostty-cli-helper.sh
Detects host architecture, prefers Homebrew arm64 Zig, and selects Zig binary by architecture precedence.
CI Mach-O stubs & build env
scripts/build-ghostty-cli-helper.sh
Generates Mach-O stub binaries via clang/lipo when skipping Zig build and unsets SDKROOT for Zig build invocation.
CI workflow
.github/workflows/ci.yml
Release build step sets CMUX_SKIP_ZIG_BUILD=1 for xcodebuild to skip Zig build in CI job.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

"🐰 I tuned the fonts with care,
A scaled sidebar, neat and fair.
Sliders hum, configs write,
Tabs now match terminal sight —
Fonts grow comfy everywhere."


Caution

Pre-merge checks failed

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

  • Ignore

❌ Failed checks (3 errors, 1 warning)

Check name Status Explanation Resolution
Cmux Swift Actor Isolation ❌ Error File-scoped Logger in HostSettingsActions.swift (line 7) lacks required nonisolated marking per swift-actor-isolation.md rules. Mark the logger as nonisolated: change private let hostSettingsLogger = Logger(...) to nonisolated private let hostSettingsLogger = Logger(...).
Cmux Swift Logging ❌ Error File-scoped Logger in Sources/HostSettingsActions.swift line 7 must be declared as nonisolated private let since the @MainActor class uses it; currently declared as private let. Change line 7 from private let hostSettingsLogger = ... to nonisolated private let hostSettingsLogger = ... to comply with the MainActor isolation rules.
Cmux Full Internationalization ❌ Error 13 new Localizable.xcstrings keys have English and Japanese translations only, missing required translations for 18 other supported app locales. Complete translations for all 20 app locales in each new font-size and search-alias xcstrings entry.
Docstring Coverage ⚠️ Warning Docstring coverage is 8.25% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (14 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding configurable sidebar workspace font size, which is the primary objective of the PR.
Description check ✅ Passed The PR description covers all key sections: Summary (what changed and why), Architecture (design rationale), Tests (coverage), and HQ build command. All required information is present.
Linked Issues check ✅ Passed The PR successfully addresses all primary coding objectives from issue #2643: adds sidebar-font-size config key (10-20pt, default 12.5), parses it in GhosttyConfig, threads it through SidebarTabItemSettingsSnapshot, and scales secondary sidebar text (titles, metadata, branch/path, PR rows, badges, hints) proportionally.
Out of Scope Changes check ✅ Passed Changes are appropriately scoped: configuration system (sidebar + surface tab bar font sizes), sidebar rendering (font scale application), settings UI (sliders with persistence), CLI commands, tests, and documentation updates. All are directly related to the configurable sidebar font size feature.
Cmux Swift Blocking Runtime ✅ Passed No blocking synchronization patterns found. Properly uses @MainActor, async/await, and FontConfigWriter actor instead of semaphores, locks, or blocking waits.
Cmux No Hacky Sleeps ✅ Passed No hacky sleeps found. PR adds font-size config with no sleep/poll/retry timing patterns in runtime code or build scripts.
Cmux Algorithmic Complexity ✅ Passed All loops operate on fixed-size collections (config lines, app directories, Zig candidates) not scalable with workspaces. No nested scans, per-target rescans, or unbounded algorithms on user data.
Cmux Swift Concurrency ✅ Passed PR uses modern async/await patterns with FontConfigWriter actor, Tasks in @State with cancellation, and @MainActor isolation. No legacy DispatchQueue, Combine, or completion-handler APIs detected.
Cmux Swift @Concurrent ✅ Passed All async methods are @MainActor-isolated, not nonisolated, so @concurrent is not required. File I/O properly coordinates through FontConfigWriter actor.
Cmux Swift File And Package Boundaries ✅ Passed ContentView +95 lines, GhosttyConfig +26 lines below 250-line threshold for oversized files. HostSettingsActions (253 lines) is legitimate settings bridge. No mixed UI/persistence violations.
Cmux User-Facing Error Privacy ✅ Passed New font-size errors are safe: generic "Couldn't save" UI text, "Unknown key" and "numeric required" CLI messages. No credentials, paths, or implementation details exposed.
Cmux Swiftui State Layout ✅ Passed LazyVStack rows receive immutable snapshots (not store refs), no GeometryReader layout violations, state mutations in event handlers only, fontScale used for typography not layout.
Cmux Architecture Rethink ✅ Passed Uses actors for serialization, single mutable owner per layer, immutable snapshots, proper task cleanup, standard notifications. No locks, sleep, polling, or split lifecycle issues.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR does not introduce new standalone cmux-owned windows; all changes are UI scaling in sidebar views and settings UI additions to existing registered windows.
✨ 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-2643-allow-customizing-sidebar-workspace-tab

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.

@greptile-apps
Copy link
Copy Markdown
Contributor

greptile-apps Bot commented May 26, 2026

Greptile Summary

Adds configurable font sizes for the left sidebar (sidebar-font-size, 10–20 pt, default 12.5) and workspace tab bar (surface-tab-bar-font-size, 8–14 pt, default 11), backed by the Ghostty config file with settings UI sliders, CLI get/set subcommands, and full en/ja localization.

  • Font scale is derived from sidebarFontSize in an immutable SidebarTabItemSettingsSnapshot and threaded through every sidebar row sub-view; config reads happen off the main actor via Task.detached and writes are serialized through a FontConfigWriter actor.
  • The configUsage() help string documents surface-tab-bar-font-size (8-24 pt) but maxSurfaceTabBarFontSize is 14.0, so any value a user sets between 15 and 24 will be silently clamped with no indication the range was wrong.
  • scripts/build-ghostty-cli-helper.sh now generates a real Mach-O stub (via xcrun clang) instead of a shell-script placeholder, and selects the Apple Silicon Zig binary first to avoid Rosetta linker failures on CI.

Confidence Score: 4/5

Safe to merge after correcting the surface-tab-bar-font-size range claim in configUsage(); all other paths are well-isolated and the font-scale threading is correct.

The configUsage() help string advertises 8–24 pt for surface-tab-bar-font-size but the clamp ceiling is 14 pt. A user who reads the help, sets 20, and observes 14 in the reload message has no explanation. Everything else — the async refresh pipeline, FontConfigWriter actor, snapshot equatable guard, BOM handling, and localization — looks correct.

CLI/CMUXCLI+Config.swift — configUsage() range for surface-tab-bar-font-size needs to read 8–14 pt, not 8–24 pt.

Important Files Changed

Filename Overview
CLI/CMUXCLI+Config.swift Adds config get/set and shorthand subcommands for both font-size keys; contains a range mismatch in configUsage() — the surface-tab-bar help text says 8-24 pt but the actual clamp ceiling is 14 pt.
docs/cli-contract.md Adds CLI contract rows for the new get/set subcommands; no range values mentioned so no mismatch here.
Sources/ContentView.swift Adds SidebarFontSizeProvider with Task.detached, sidebarFontScale to the snapshot, and async refresh in SidebarTabItemSettingsStore; font scale is threaded through every sidebar row sub-view.
Sources/HostSettingsActions.swift Adds sidebarFontSize/surfaceTabBarFontSize reads from in-memory cache, async persistFontSize routed through FontConfigWriter actor, and unified logging — all correctly isolated off the main actor.
Sources/CmuxApplicationSupportDirectories.swift Adds CmuxGhosttyConfigSettingEditor with parse/clamp/format/write helpers, BOM stripping, and symlink-aware write path; logic is sound and well-tested.
Sources/GhosttyConfig.swift Adds sidebarFontSize field with clamped parse, BOM-stripped first-line handling, and static range constants mirroring CmuxGhosttyConfigSettingEditor.
Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/SidebarSection.swift Adds font-size slider with task-cancellation on rapid saves and save-failed error message; state management is clean.
Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift Adds tab-bar font-size slider with the same cancellable-save pattern as SidebarSection; no issues found.
Resources/Localizable.xcstrings Adds en/ja translations for all new font-size UI strings including labels, subtitles, reset buttons, and save-failed messages.
scripts/build-ghostty-cli-helper.sh Replaces the shell-script stub with a real Mach-O binary (xcrun clang), adds Rosetta detection, and prefers Apple Silicon Zig to avoid x86_64 linker failures on macOS CI.

Sequence Diagram

sequenceDiagram
    participant Slider as Settings Slider
    participant Section as SidebarSection / TerminalSection
    participant Host as HostSettingsActions
    participant Writer as FontConfigWriter (actor)
    participant Disk as Ghostty config file
    participant App as GhosttyApp.reloadConfiguration
    participant Store as SidebarTabItemSettingsStore
    participant Provider as SidebarFontSizeProvider (Task.detached)

    Slider->>Section: "editing = false"
    Section->>Section: saveSidebarFontSize(points)
    Section->>Host: await setSidebarFontSize(points)
    Host->>Writer: await write(key:value:)
    Writer->>Disk: ConfigSourceEnvironment.writeCmuxConfigSetting
    Disk-->>Writer: ok / error
    Writer-->>Host: Bool
    Host->>App: reloadConfiguration(source:) [main actor]
    App--)Store: ghosttyConfigDidReload notification
    Store->>Provider: await sidebarFontSizeProvider()
    Provider->>Provider: "Task.detached { GhosttyConfig.load().sidebarFontSize }"
    Provider-->>Store: CGFloat
    Store->>Store: "refreshSnapshot() → @Published snapshot"
Loading

Reviews (25): Last reviewed commit: "test: use in-range 14 for tab-bar font l..." | Re-trigger Greptile

Comment thread Sources/ContentView.swift
Comment thread Sources/ContentView.swift
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@cmuxTests/GhosttyConfigTests.swift`:
- Around line 4296-4364: The test suite SidebarFontSizeConfigTests currently
uses XCTestCase and XCTAssert* assertions; change it to Swift Testing style by
replacing the XCTest import and class SidebarFontSizeConfigTests: XCTestCase
with a `@Suite-annotated` type (e.g., `@Suite` struct SidebarFontSizeConfigTests)
and convert each test method
(testDefaultSidebarFontSizeMatchesSidebarTitleBaseline,
testParseSidebarFontSizeIntegerValue, testParseSidebarFontSizeFractionalValue,
testParseSidebarFontSizeClampsBelowMinimum,
testParseSidebarFontSizeClampsAboveMaximum,
testParseSidebarFontSizeIgnoresInvalidAndNonFiniteValues,
testLoadUsesParsedSidebarFontSizeFromInjectedLoader) into `@Test` functions,
replacing XCTAssertEqual calls with Swift Testing assertions (use `#expect` for
value checks with appropriate tolerance or try `#require` where setup can throw)
and adjust the GhosttyConfig usage and load helper accordingly so the logic
remains identical but follows the repo policy of using `@Suite/`@Test and
`#expect/`#require instead of XCTestCase/XCTAssert.

In `@cmuxTests/SidebarOrderingTests.swift`:
- Around line 118-160: Replace the XCTestCase-based test suite with a Swift
Testing suite: remove import XCTest and the final class
SidebarTabItemFontScaleTests : XCTestCase, add import Testing and declare a
`@Suite` (e.g., struct SidebarTabItemFontScaleTests) containing `@Test` functions
mirroring the existing test names (testDefaultSidebarFontScaleIsUnitScale,
testSidebarFontScaleIsProportionalToDefaultSidebarSize,
testSidebarFontScaleClampsSmallSizes, testSidebarFontScaleClampsLargeSizes,
testSidebarFontScaleFallsBackToDefaultForNonFiniteValue) and call
SidebarTabItemFontScale.scale(for: ...) and assert expected values using Swift
Testing assertions (e.g., Assertions.assertEqual with accuracy), keeping
references to GhosttyConfig.defaultSidebarFontSize,
GhosttyConfig.minSidebarFontSize, and GhosttyConfig.maxSidebarFontSize.

In `@Sources/ContentView.swift`:
- Around line 9747-9760: Move the pure font-scale logic out of ContentView by
creating a new Swift file (e.g., Sources/Sidebar/SidebarTabItemFontScale.swift)
and relocate the SidebarTabItemFontScale enum (and optionally
SidebarFontSizeProvider if you want the provider alongside it) there; ensure
SidebarTabItemFontScale.scale(for:) remains unchanged and references
GhosttyConfig as before, update any imports if needed, and adjust call sites in
ContentView to reference the extracted type so tests (e.g.,
SidebarOrderingTests) and consumers continue to compile and run.
- Around line 14487-14491: The badge size is being clamped by
scaledAccessorySize so it never shrinks below 16pt; split the logic so the
unread badge can use an unclamped scaled value while the close-button hit target
keeps a minimum. Replace the single scaledAccessorySize with two values (e.g.,
badgeSize = 16 * fontScale and accessoryHitSize =
max(SidebarTrailingAccessoryWidthPolicy.closeButtonWidth, max(16, 16 *
fontScale)) or apply the max only when computing scaledCloseButtonWidth) and use
badgeSize for the unread badge frame and accessoryHitSize /
scaledCloseButtonWidth for the close-button sizing/hit target.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 208d20fa-c2a4-4810-ac95-ac4c6475e7d7

📥 Commits

Reviewing files that changed from the base of the PR and between 7264d29 and 96530e3.

📒 Files selected for processing (7)
  • Sources/ContentView.swift
  • Sources/GhosttyConfig.swift
  • Sources/ShortcutHintPill.swift
  • Sources/Sidebar/SidebarDirectoryText.swift
  • cmuxTests/GhosttyConfigTests.swift
  • cmuxTests/SidebarOrderingTests.swift
  • web/app/[locale]/docs/configuration/page.tsx

Comment thread cmuxTests/GhosttyConfigTests.swift Outdated
Comment thread cmuxTests/SidebarOrderingTests.swift Outdated
Comment thread Sources/ContentView.swift Outdated
Comment thread Sources/ContentView.swift Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Sources/cmuxApp.swift`:
- Around line 6300-6303: The user-facing Settings message assigns
sidebarFontSizeErrorMessage using error.localizedDescription which exposes raw
internal error text; change this to a generic recovery message (e.g., "Couldn't
save sidebar font size. Please try again.") and remove interpolation of
error.localizedDescription from the string assigned to
sidebarFontSizeErrorMessage; instead, log the full error details to an internal
logger (e.g., use your existing Logger/os_log or a function near where
sidebarFontSizeErrorMessage is set) so the raw error is recorded for debugging
while the UI only shows the sanitized message.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 74a9bdbe-3d3c-40cf-817c-9a7fdb24d710

📥 Commits

Reviewing files that changed from the base of the PR and between b29ab4a and 3e9fab6.

📒 Files selected for processing (8)
  • CLI/CMUXCLI+Config.swift
  • Resources/Localizable.xcstrings
  • Sources/CmuxApplicationSupportDirectories.swift
  • Sources/GhosttyConfig.swift
  • Sources/Settings/ConfigSource.swift
  • Sources/SettingsNavigation.swift
  • Sources/SettingsSearchAliases.swift
  • Sources/cmuxApp.swift

Comment thread Sources/cmuxApp.swift Outdated
Comment thread Sources/cmuxApp.swift Outdated
Comment thread Sources/CmuxApplicationSupportDirectories.swift
Comment thread Sources/CmuxApplicationSupportDirectories.swift
Comment thread CLI/CMUXCLI+Config.swift Outdated
Comment thread Sources/cmuxApp.swift Outdated
Comment thread Sources/cmuxApp.swift Outdated
Comment thread CLI/CMUXCLI+Config.swift Outdated
Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

1 issue found across 4 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread CLI/CMUXCLI+Config.swift
GhosttyConfig.parse ignored a BOM-prefixed first line, so a BOM-encoded
sidebar-font-size/surface-tab-bar-font-size setting would be dropped at
runtime (defaulting) even though the CLI/Settings editor reads + writes
it correctly. Strip the leading BOM to match parsedSetting/parsedConfigEntry.

Addresses Cursor Bugbot finding on PR #4798.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread Sources/HostSettingsActions.swift
@austinywang
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

All actionable findings are addressed as of d397be5 (CI is now green). Since the last review:

  • Font-size writes are serialized through a FontConfigWriter actor (no out-of-order saves); disk I/O is off the main actor.
  • BOM stripping added to both the editor (parsedSetting) and runtime parser (GhosttyConfig.parse).
  • Rosetta-aware host-arch detection for the default Ghostty CLI stub.
  • CLI config resolution now scans all Application Support roots to match the app's config load.
  • The remaining cubic/Greptile/Cursor threads are either fixed or answered inline (e.g. en+ja is the project's supported-locale set per CLAUDE.md; the package's default formattedFontSize is a preview-only fallback that can't import the app-target editor).

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 1, 2026

@austinywang Thanks for the thorough summary of all the follow-up fixes! The FontConfigWriter actor for serialized writes, BOM stripping in both the editor and runtime parser, Rosetta-aware host-arch detection, and multi-root Application Support scanning are solid improvements. Triggering a fresh full review of the latest commits now.

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
Sources/GhosttyConfig.swift (1)

404-414: 🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Consider adding finite-number validation to font-size for consistency.

The updated surface-tab-bar-font-size parsing (line 408) and new sidebar-font-size parsing (line 412) both validate size.isFinite before clamping. The existing font-size parsing (line 404) does not. Adding the same finite check to font-size would prevent edge cases (e.g., font-size = inf in config) and keep all three font-size parsings consistent.

Proposed consistency fix
 case "font-size":
-    if let size = Double(value) {
+    if let size = Double(value), size.isFinite {
         fontSize = CGFloat(size)
     }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Sources/GhosttyConfig.swift` around lines 404 - 414, In the "font-size" case,
add the same finite-number check used by the other cases and clamp before
assigning: when parsing "font-size" (the branch that sets fontSize), validate
with if let size = Double(value), size.isFinite then assign via the existing
clamping helper (e.g. fontSize = Self.clampedFontSize(CGFloat(size))) instead of
directly doing fontSize = CGFloat(size) so it matches the
"surface-tab-bar-font-size" and "sidebar-font-size" behavior.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/SidebarSection.swift`:
- Line 104: Replace the use of String(format:) with a locale-aware approach:
either call String.localizedStringWithFormat using the localized key (currently
passed as String(localized: "settings.fontSize.valuePoints", defaultValue: "%@
pt")) and hostActions.formattedFontSize(sidebarFont.points) as arguments, or use
the modern String(localized:defaultValue:) with direct interpolation of
hostActions.formattedFontSize(sidebarFont.points); update the Text initializer
in SidebarSection (the line constructing the font size display) to use one of
these patterns so formatting is locale-aware.

In `@scripts/build-ghostty-cli-helper.sh`:
- Around line 61-68: The host-arch detection block duplicates the Rosetta-aware
logic; replace it by invoking the existing helper detected_host_arch() and
assign its result to the local host_arch instead of repeating the case/sysctl
logic. Update the snippet that currently defines local host_arch and runs the
case/sysctl checks to simply call detected_host_arch() (ensuring
detected_host_arch() is declared earlier in the script) and export/assign that
return value to host_arch so behavior remains identical but the logic is
centralized.

---

Outside diff comments:
In `@Sources/GhosttyConfig.swift`:
- Around line 404-414: In the "font-size" case, add the same finite-number check
used by the other cases and clamp before assigning: when parsing "font-size"
(the branch that sets fontSize), validate with if let size = Double(value),
size.isFinite then assign via the existing clamping helper (e.g. fontSize =
Self.clampedFontSize(CGFloat(size))) instead of directly doing fontSize =
CGFloat(size) so it matches the "surface-tab-bar-font-size" and
"sidebar-font-size" behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: d6ccb919-54ed-4c0a-b802-3ef2034674ed

📥 Commits

Reviewing files that changed from the base of the PR and between 0df4653 and d397be5.

📒 Files selected for processing (23)
  • .github/workflows/ci.yml
  • CLI/CMUXCLI+Config.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsFontSize.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Scene/SettingsWindowScene.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/SidebarSection.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift
  • Resources/Localizable.xcstrings
  • Sources/CmuxApplicationSupportDirectories.swift
  • Sources/ContentView.swift
  • Sources/GhosttyConfig.swift
  • Sources/HostSettingsActions.swift
  • Sources/Settings/ConfigSource.swift
  • Sources/SettingsNavigation.swift
  • Sources/SettingsSearchAliases.swift
  • Sources/ShortcutHintPill.swift
  • Sources/Sidebar/SidebarAppearanceSupport.swift
  • Sources/Sidebar/SidebarDirectoryText.swift
  • cmuxTests/GhosttyConfigTests.swift
  • cmuxTests/SidebarOrderingTests.swift
  • docs/cli-contract.md
  • scripts/build-ghostty-cli-helper.sh
  • web/app/[locale]/docs/configuration/page.tsx

Comment thread Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/SidebarSection.swift Outdated
Comment thread scripts/build-ghostty-cli-helper.sh Outdated
- select_zig_for_target now calls detected_host_arch() instead of an
  inline copy of the Rosetta-aware host-arch logic (single source).
- font-size value label uses modern localized interpolation
  String(localized:defaultValue:) instead of String(format:).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/SidebarSection.swift Outdated
The String(localized:defaultValue:"\(value) pt") interpolation could
render the literal "%@ pt" from the catalog instead of substituting the
value. Use String.localizedStringWithFormat with the localized "%@ pt"
format so the point size is always substituted (locale-aware).

Addresses Cursor Bugbot finding on PR #4798.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread CLI/CMUXCLI+Config.swift
Bumps bonsplit to ddb46fe (manaflow-ai/bonsplit#140): the per-tab leading
icon, close/pin glyphs, and the trailing split/new-terminal/new-browser
control icons now scale with surface-tab-bar-font-size, so the tab bar
icons grow with the text instead of staying fixed.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Lower the surface-tab-bar-font-size maximum from 24 to 14 so the tab bar
text and icons stay within the bar chrome. Updates the single source of
truth (CmuxGhosttyConfigSettingEditor.maxSurfaceTabBarFontSize) and the
package preview fallback; clamping, the slider range, and tests all
derive from it.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Copy link
Copy Markdown

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

Choose a reason for hiding this comment

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

1 issue found across 2 files (changes from recent commits).

Tip: Review your code locally with the cubic CLI to iterate faster.

Re-trigger cubic

Comment thread Sources/CmuxApplicationSupportDirectories.swift
Slider release / Reset now route through saveSidebar/SurfaceTabBarFontSize,
which cancels any pending save Task before starting the next one. Combined
with the serial FontConfigWriter actor on the host side, rapid adjustments
no longer leave a stale value reflected in the UI, and the save tasks are
structured rather than fire-and-forget.

Addresses cubic/Cursor concurrency feedback on PR #4798.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Comment thread cmuxTests/GhosttyConfigTests.swift
loadUsesParsedSurfaceTabBarFontSizeFromInjectedLoader parsed
surface-tab-bar-font-size = 16 and expected 16, but with the new 14pt
maximum that value clamps to 14, so the test would fail. Use 14 (the max)
so it exercises a valid in-range value.

Addresses Cursor Bugbot finding on PR #4798.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@cubic-dev-ai
Copy link
Copy Markdown

cubic-dev-ai Bot commented Jun 1, 2026

You're iterating quickly on this pull request. To help protect your rate limits, cubic has paused automatic reviews on new pushes for now—when you're ready for another review, comment @cubic-dev-ai review.

Copy link
Copy Markdown

@cursor cursor Bot left a comment

Choose a reason for hiding this comment

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

Cursor Bugbot has reviewed your changes and found 1 potential issue.

Fix All in Cursor

❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, enable autofix in the Cursor dashboard.

Reviewed by Cursor Bugbot for commit 04f275f. Configure here.

@austinywang
Copy link
Copy Markdown
Contributor Author

@coderabbitai review

All inline review threads are now resolved as of 04f275f:

  • Tab-bar font max capped at 14pt; the loader test updated from 16→14 (it would have clamped).
  • Font-size writes serialized via FontConfigWriter actor + UI save-task cancellation (no out-of-order saves); config disk I/O moved off the main actor.
  • BOM stripping in both the editor and the runtime parser; Rosetta-aware host-arch detection (deduped); CLI resolves config across all Application Support roots.
  • Tab-bar/per-tab icons + control buttons now scale with the font size (bonsplit#140 merged + pointer bumped).

Please re-review so the prior changes-requested can be cleared.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Jun 1, 2026

@austinywang Thanks for the comprehensive update! The tab-bar font max cap at 14pt, FontConfigWriter actor serialization with UI save-task cancellation, BOM stripping in both paths, Rosetta-aware host-arch detection, multi-root Application Support scanning, and the tab-bar/per-tab icon scaling from the bonsplit#140 bump all look like solid completions. Triggering a fresh full review now.

✅ Actions performed

Full review triggered.

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 2

♻️ Duplicate comments (1)
Sources/CmuxApplicationSupportDirectories.swift (1)

300-313: ⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Trim newlines in the config-line parser.

CRLF files leave a trailing \r on each line after the "\n" split, and this helper currently preserves it in setting.value. That makes parsedFontSize fail to parse otherwise valid existing settings, so Windows-authored configs fall back to defaults until rewritten.

Proposed fix
     private static func parsedSetting(in line: String) -> (key: String, value: String)? {
-        var trimmed = line.trimmingCharacters(in: .whitespaces)
+        var trimmed = line.trimmingCharacters(in: .whitespacesAndNewlines)
         // Strip a leading UTF-8 BOM so a BOM-encoded first line still matches its
         // key (otherwise the setting reads as absent and a duplicate is appended).
         if trimmed.hasPrefix("\u{FEFF}") {
             trimmed.removeFirst()
-            trimmed = trimmed.trimmingCharacters(in: .whitespaces)
+            trimmed = trimmed.trimmingCharacters(in: .whitespacesAndNewlines)
         }
         guard !trimmed.isEmpty, !trimmed.hasPrefix("#"), let separator = trimmed.firstIndex(of: "=") else {
             return nil
         }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Sources/CmuxApplicationSupportDirectories.swift` around lines 300 - 313, The
parsedSetting helper preserves trailing CR characters because it only trims
.whitespaces; update parsedSetting to trim .whitespacesAndNewlines (for the
initial trimmed var, the re-trim after BOM removal, and when computing key and
value) so CRLF-terminated lines lose trailing "\r" and parsedFontSize etc. can
parse Windows-authored config values correctly.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/cli-contract.md`:
- Around line 336-342: Update the CLI contract docs to state the default and
valid range for the font-size commands: document that sidebar-font-size defaults
to 12.5 pt and is clamped to 10–20 pt, and apply the same note for
surface-tab-bar-font-size (or indicate if different); add this as an inline note
in the contract table rows for `config get/set sidebar-font-size` and `config
get/set surface-tab-bar-font-size` or as a short paragraph immediately after the
block listing those commands so users see the default (12.5 pt) and valid range
(10–20 pt) when using `config sidebar-font-size` and `config
surface-tab-bar-font-size`.

In `@Resources/Localizable.xcstrings`:
- Around line 104895-104911: The three identical format strings should be
consolidated: remove the duplicate entries
settings.sidebarAppearance.fontSize.points and
settings.terminal.tabBarFontSize.points from Localizable.xcstrings and update
the code that currently looks up those keys to reference the shared key
settings.fontSize.valuePoints instead; ensure settings.fontSize.valuePoints
contains the required localizations (en/ja) and update any UI/lookup calls
(e.g., wherever sidebar or terminal tab bar font size formatting is performed)
to use the single key so future changes only need one translation to be updated.

---

Duplicate comments:
In `@Sources/CmuxApplicationSupportDirectories.swift`:
- Around line 300-313: The parsedSetting helper preserves trailing CR characters
because it only trims .whitespaces; update parsedSetting to trim
.whitespacesAndNewlines (for the initial trimmed var, the re-trim after BOM
removal, and when computing key and value) so CRLF-terminated lines lose
trailing "\r" and parsedFontSize etc. can parse Windows-authored config values
correctly.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: 6f0b49d1-bbe1-40a3-b074-5cd20520f5ef

📥 Commits

Reviewing files that changed from the base of the PR and between 0df4653 and 04f275f.

📒 Files selected for processing (24)
  • .github/workflows/ci.yml
  • CLI/CMUXCLI+Config.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsFontSize.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Scene/SettingsWindowScene.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/SidebarSection.swift
  • Packages/CmuxSettingsUI/Sources/CmuxSettingsUI/Sections/TerminalSection.swift
  • Resources/Localizable.xcstrings
  • Sources/CmuxApplicationSupportDirectories.swift
  • Sources/ContentView.swift
  • Sources/GhosttyConfig.swift
  • Sources/HostSettingsActions.swift
  • Sources/Settings/ConfigSource.swift
  • Sources/SettingsNavigation.swift
  • Sources/SettingsSearchAliases.swift
  • Sources/ShortcutHintPill.swift
  • Sources/Sidebar/SidebarAppearanceSupport.swift
  • Sources/Sidebar/SidebarDirectoryText.swift
  • cmuxTests/GhosttyConfigTests.swift
  • cmuxTests/SidebarOrderingTests.swift
  • docs/cli-contract.md
  • scripts/build-ghostty-cli-helper.sh
  • vendor/bonsplit
  • web/app/[locale]/docs/configuration/page.tsx

Comment thread docs/cli-contract.md
Comment on lines +336 to +342
| `config get sidebar-font-size` | Print the effective sidebar text size. |
| `config set sidebar-font-size <points>` | Write the sidebar text size to cmux's editable Ghostty config and reload the running app when available. |
| `config sidebar-font-size [points]` | Get the sidebar text size, or set it when a point size is provided. |
| `config get surface-tab-bar-font-size` | Print the effective workspace tab bar text size. |
| `config set surface-tab-bar-font-size <points>` | Write the workspace tab bar text size to cmux's editable Ghostty config and reload the running app when available. |
| `config surface-tab-bar-font-size [points]` | Get the workspace tab bar text size, or set it when a point size is provided. |
| `config get <key>`, `config set <key> <points>` | Generic get/set for `sidebar-font-size` and `surface-tab-bar-font-size`. |
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial | ⚡ Quick win

Document default values and valid ranges for font-size commands.

The new font-size config commands are documented, but users would benefit from knowing the default values and valid ranges. According to the PR objectives, sidebar-font-size defaults to 12.5 pt and is clamped to 10–20 pt.

Consider adding a note about defaults and valid ranges, either inline in the Contract column or in a new paragraph below line 342.

📝 Suggested documentation enhancement

Add after line 342:

 | `config get <key>`, `config set <key> <points>` | Generic get/set for `sidebar-font-size` and `surface-tab-bar-font-size`. |
+
+Font size values are clamped to the range 10.0–20.0 points. The default `sidebar-font-size` is 12.5 pt.
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
| `config get sidebar-font-size` | Print the effective sidebar text size. |
| `config set sidebar-font-size <points>` | Write the sidebar text size to cmux's editable Ghostty config and reload the running app when available. |
| `config sidebar-font-size [points]` | Get the sidebar text size, or set it when a point size is provided. |
| `config get surface-tab-bar-font-size` | Print the effective workspace tab bar text size. |
| `config set surface-tab-bar-font-size <points>` | Write the workspace tab bar text size to cmux's editable Ghostty config and reload the running app when available. |
| `config surface-tab-bar-font-size [points]` | Get the workspace tab bar text size, or set it when a point size is provided. |
| `config get <key>`, `config set <key> <points>` | Generic get/set for `sidebar-font-size` and `surface-tab-bar-font-size`. |
| `config get sidebar-font-size` | Print the effective sidebar text size. |
| `config set sidebar-font-size <points>` | Write the sidebar text size to cmux's editable Ghostty config and reload the running app when available. |
| `config sidebar-font-size [points]` | Get the sidebar text size, or set it when a point size is provided. |
| `config get surface-tab-bar-font-size` | Print the effective workspace tab bar text size. |
| `config set surface-tab-bar-font-size <points>` | Write the workspace tab bar text size to cmux's editable Ghostty config and reload the running app when available. |
| `config surface-tab-bar-font-size [points]` | Get the workspace tab bar text size, or set it when a point size is provided. |
| `config get <key>`, `config set <key> <points>` | Generic get/set for `sidebar-font-size` and `surface-tab-bar-font-size`. |
Font size values are clamped to the range 10.0–20.0 points. The default `sidebar-font-size` is 12.5 pt.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/cli-contract.md` around lines 336 - 342, Update the CLI contract docs to
state the default and valid range for the font-size commands: document that
sidebar-font-size defaults to 12.5 pt and is clamped to 10–20 pt, and apply the
same note for surface-tab-bar-font-size (or indicate if different); add this as
an inline note in the contract table rows for `config get/set sidebar-font-size`
and `config get/set surface-tab-bar-font-size` or as a short paragraph
immediately after the block listing those commands so users see the default
(12.5 pt) and valid range (10–20 pt) when using `config sidebar-font-size` and
`config surface-tab-bar-font-size`.

Comment on lines +104895 to +104911
"settings.fontSize.valuePoints": {
"extractionState": "manual",
"localizations": {
"en": {
"stringUnit": {
"state": "translated",
"value": "%@ pt"
}
},
"ja": {
"stringUnit": {
"state": "translated",
"value": "%@ pt"
}
}
}
},
Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🧹 Nitpick | 🔵 Trivial | 💤 Low value

Consider consolidating duplicate format strings.

The format string %@ pt is defined three times:

  • settings.fontSize.valuePoints (line 104895)
  • settings.sidebarAppearance.fontSize.points (line 138679)
  • settings.terminal.tabBarFontSize.points (line 142719)

Since settings.fontSize.valuePoints appears to be the shared/generic key, the code consuming these strings could reference that single key instead of duplicating it. This would simplify future maintenance if the format ever needs to change.

Also applies to: 138679-138695, 142719-142735

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Resources/Localizable.xcstrings` around lines 104895 - 104911, The three
identical format strings should be consolidated: remove the duplicate entries
settings.sidebarAppearance.fontSize.points and
settings.terminal.tabBarFontSize.points from Localizable.xcstrings and update
the code that currently looks up those keys to reference the shared key
settings.fontSize.valuePoints instead; ensure settings.fontSize.valuePoints
contains the required localizations (en/ja) and update any UI/lookup calls
(e.g., wherever sidebar or terminal tab bar font size formatting is performed)
to use the single key so future changes only need one translation to be updated.

@austinywang austinywang merged commit 1b34302 into main Jun 1, 2026
26 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Allow customizing sidebar workspace tab label font size

1 participant