Skip to content

Fix theme picker chrome preview sync - #4652

Merged
lawrencecchen merged 15 commits into
mainfrom
task-theme-chrome-sync-debug
May 23, 2026
Merged

lawrencecchen merged 15 commits into
mainfrom
task-theme-chrome-sync-debug

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented May 23, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Resolve cmux chrome appearance from the same disk-loaded Ghostty theme config used by the picker.
  • Stop Ghostty config-change callbacks from overwriting chrome defaults with stale runtime payloads.

Testing

  • CMUX_SKIP_ZIG_BUILD=1 xcodebuild -project cmux.xcodeproj -scheme cmux-unit -configuration Debug -destination 'platform=macOS' -derivedDataPath /tmp/cmux-theme-unit-merge -only-testing:cmuxTests/GhosttyConfigTests test
  • ./scripts/reload.sh --tag themefix2, with local helper copied from installed cmux because local Zig/macOS 26 helper linking is broken
  • Dogfood: confirmed theme previews update terminal and surrounding UI chrome together

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


Note

Medium Risk
Touches config loading/parsing and default appearance resolution, which can affect startup theming and how user configs are discovered/applied. Risk is mitigated by extensive new unit coverage, but regressions could impact theme/chrome colors for edge-case configs.

Overview
Unifies chrome appearance with on-disk-resolved Ghostty config. GhosttyTerminalView now computes default background/foreground/cursor/selection colors by re-loading GhosttyConfig from disk (no cache) and merging it with the baseline runtime config so theme picker previews keep terminal + window chrome in sync.

Hardens config discovery and parsing. GhosttyConfig adds recursive config-file include loading with cycle-safe dedup, supports optional/quoted include paths, allows absolute theme file paths, clamps background-opacity, and tracks directive present vs Swift-parsed flags so unparseable directives don’t accidentally fall back to stale baselines. Legacy config is now only considered when config.ghostty is missing/empty, and app/surface config-change callbacks no longer drive chrome updates.

Tests. Expands GhosttyConfigTests to cover include recursion, cycles, quoted/optional paths, legacy fallback rules, absolute theme paths, opacity clamping, and parsed-vs-directive tracking.

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


Summary by cubic

Fixes the theme picker so window chrome previews update with the terminal by resolving chrome from the same on‑disk GhosttyConfig. Aligns recursive include handling and legacy macOS config fallback so previews don’t use stale defaults.

  • Bug Fixes
    • Derive app chrome (background/opacity/blur and colors) from the disk‑resolved GhosttyConfig at init and reload; fallback chrome keeps its own config; ignore app/surface config-change payloads for chrome ownership.
    • Invalidate the config load cache before reload; clamp background opacity; track per‑field “directive” vs “parsed” to keep baseline values when a directive exists but can’t be parsed.
    • Support recursive config-file includes with cycle‑safe dedup; parse relative/absolute paths, ~, optional ?, and quoted paths (including optional‑quoted); allow absolute theme file paths.
    • macOS discovery: prefer config.ghostty; include legacy config only when the new file is missing or empty; ignore legacy baselines when a non‑empty config.ghostty exists.
    • Align legacy fallback between config scanning and resolved loads so both follow the same rules.

Written for commit e3cb183. Summary will update on new commits. Review in cubic

Summary by CodeRabbit

  • New Features

    • Recursive config inclusion via config-file directives with path expansion, deduplication, and support for loading absolute theme files.
  • Bug Fixes

    • Resolved-config is now the source of truth for default background/theme; startup and reload apply background and appearance more consistently.
    • Scoped config-change handling and stricter optional/quoted include-path handling.
  • Tests

    • Added regression tests for recursive includes, include-path edge cases, parsed-color tracking, and absolute theme loading.

Review Change Stack

@vercel

vercel Bot commented May 23, 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 May 23, 2026 11:07am
cmux-staging Building Building Preview, Comment May 23, 2026 11:07am

@chatgpt-codex-connector

Copy link
Copy Markdown

You have reached your Codex usage limits for code reviews. You can see your limits in the Codex usage dashboard.
To continue using code reviews, add credits to your account and enable them for code reviews in your settings.

@coderabbitai

coderabbitai Bot commented May 23, 2026 •

Copy link
Copy Markdown

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

GhosttyConfig gains recursive config-file include resolution with tilde/relative-path expansion, deduplication, and parsed-field flags; loadTheme fast-paths absolute theme files. GhosttyTerminalView applies backgrounds from a fully resolved GhosttyConfig during initialization and full reloads; config-change handlers now only sync runtime color scheme and reapply appearance.

Changes

Recursive Config Loading and Background Application

Layer / File(s) Summary
Recursive config file loading infrastructure
Sources/GhosttyConfig.swift
Queue-based recursive include resolution (loadConfigFiles, loadConfigFile, collectRecursiveConfigPaths, parsedConfigEntry, applyConfigFileDirective) with BOM/=-less parsing, ? optional-include handling (including quote stripping), ~ expansion, relative-to-parent resolution, and deduplication by standardized absolute paths. Adds hasParsed* booleans for theme/color fields and updates parsing to set them.
Config loading integration and tests
Sources/GhosttyConfig.swift, cmuxTests/GhosttyConfigTests.swift
GhosttyConfig.loadFromDisk delegates to loadConfigFiles in DEBUG startup-preview and regular load paths. New tests cover recursive includes, self-referential cycles avoiding reparsing, optional/quoted config-file paths, and loading absolute theme file paths.
Theme absolute-path fast-path
Sources/GhosttyConfig.swift
loadTheme tilde-expands the resolved theme name and, if it becomes an absolute readable path, loads/parses that file immediately and returns early.
Background resolution via resolved config
Sources/GhosttyTerminalView.swift
Introduces updateDefaultBackgroundFromResolvedGhosttyConfig(...) which loads GhosttyConfig with useCache: false, conditionally applies resolved background/opacity/blur/foreground/cursor/selection, and appends ".resolvedGhosttyConfig" to the source. Refactors default-background computation through defaultBackgroundValues/DefaultBackgroundValues and removes redundant cache invalidation in reload paths.
App initialization & reload using resolved config
Sources/GhosttyTerminalView.swift
initializeGhostty and the full non-soft reloadConfiguration now apply primary and fallback backgrounds via the resolved-config helper. GHOSTTY_ACTION_CONFIG_CHANGE handlers for app/surface scopes no longer directly call updateDefaultBackground(... scope: ...); they synchronize runtime color-scheme and reapply appearance.
Config-file include string handling
Sources/GhosttyTerminalView.swift
applyConfigFileDirective now strips surrounding double-quotes from an unquoted config-file directive value that begins with ? after removing the leading marker.

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Possibly related PRs

  • manaflow-ai/cmux#4278: Overlaps in Sources/GhosttyTerminalView.swift appearance/config reload flow and runtime color-scheme synchronization.

Poem

A rabbit hops through config files in the night,
Unwinds config-file threads till paths are right—
Tildes expand, includes dedupe, themes come clear,
Backgrounds settle softly, colors reappear. 🐰


Caution

Pre-merge checks failed

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

  • Ignore

❌ Failed checks (3 errors, 2 warnings, 1 inconclusive)

Check name Status Explanation Resolution
Cmux Swift Blocking Runtime ❌ Error PR introduces NSLock (loadCacheLock) protecting shared config cache state, violating blocking-runtime rule without documented actor-pattern justification. Replace NSLock-protected static cache with actor-isolated cache or document why actor pattern is unsuitable.
Cmux Swift @Concurrent ❌ Error updateDefaultBackgroundFromResolvedGhosttyConfig performs file I/O-heavy work via GhosttyConfig.load (readConfigFile, parsing) on main thread without background dispatch or @concurrent boundary. Dispatch GhosttyConfig.load to background queue via DispatchQueue.global() or make the work @concurrent, as file I/O and parsing should not block the main UI thread.
Cmux Swift Logging ❌ Error GhosttyTerminalView.swift (new file) contains 6 unguarded print() statements in app/runtime code violating swift-logging.md: lines 1985, 1991, 2129, 2176, 5745, 5993. Wrap print statements with #if DEBUG guards or replace with Logger/cmux debug logging for initialization and error diagnostics.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Description check ⚠️ Warning The PR description covers the main changes (config loading, theme resolution, chrome defaults) and testing approach, but is missing several sections from the template. Add missing sections: Demo Video (required for UI/behavior changes), Review Trigger comment block, and complete the Checklist with checkmarks for the items completed.
Title check ❓ Inconclusive The title 'Fix theme picker chrome preview sync' partially describes the changeset but does not capture the main scope: it mentions the theme picker issue but omits the broader config loading enhancements (recursive includes, absolute theme paths, parse-flag tracking) and the refactored background resolution logic that are central to the PR. Consider expanding the title to better reflect the main changes: e.g., 'Support recursive config-file includes and resolve chrome from on-disk config' or similar.
✅ Passed checks (11 passed)
Check name Status Explanation
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Cmux Swift Actor Isolation ✅ Passed PR adds struct properties and methods to GhosttyConfig; no new reference types, implicit MainActor issues, or shared mutable Sendable refs without isolation.
Cmux No Hacky Sleeps ✅ Passed This rule covers TypeScript, JavaScript, shell, and build scripts only. The PR exclusively modifies Swift files, which are explicitly out of scope per the rule.
Cmux Swift Concurrency ✅ Passed New functions are synchronous with no async/await, fire-and-forget Tasks, DispatchQueue.global(), Combine, or completion-handlers introduced in production code.
Cmux Swift File And Package Boundaries ✅ Passed PR adds 180 lines to GhosttyConfig and 116 to GhosttyTerminalView, within the 250-line limit for >800 line files. All additions coherently extend existing parsing and UI responsibilities.
Cmux User-Facing Error Privacy ✅ Passed PR adds no user-facing errors, alerts, or messages. All new strings are internal (config keys, debug tags). No vendor names, environment variables, or sensitive data exposed.
Cmux Full Internationalization ✅ Passed All PR user-facing strings use String(localized:defaultValue:) with matching Localizable.xcstrings entries. Backend logic has no UI strings. Tests properly exempted.
Cmux Swiftui State Layout ✅ Passed PR adds Bool properties to non-SwiftUI struct GhosttyConfig and refactors AppKit background logic. No new ObservableObject/@published state or other SwiftUI violations detected.
Cmux Architecture Rethink ✅ Passed Queue-based config deduplication (not polling). Clear hasParsed flag ownership. Config-change scoped to surface. Main thread async calls justified, not timing patches.
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR only modifies config loading and background synchronization via private functions; no new or changed standalone cmux windows, panels, or window controllers.
✨ 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 task-theme-chrome-sync-debug

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

greptile-apps Bot commented May 23, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Fixes the theme picker chrome preview by making window chrome derive from the same disk-resolved GhosttyConfig used by the picker, and stops Ghostty config-change callbacks from overwriting chrome with potentially stale Ghostty-C runtime payloads.

  • Extends GhosttyConfig loading with recursive config-file include support (cycle-safe dedup, optional ? and quoted paths, absolute theme file paths) and adds per-field hasDirective/hasParsed tracking flags so unparseable Swift directives fall back to the C-runtime baseline instead of being silently ignored.
  • In GhosttyTerminalView, updateDefaultBackgroundFromResolvedGhosttyConfig is inserted after the existing updateDefaultBackground call at init and reload, and the GHOSTTY_ACTION_CONFIG_CHANGE handler no longer mutates app-level chrome; cache invalidation is moved to just before the resolved-config disk read.
  • GhosttyConfigTests adds regression tests for all new load paths, flag semantics, and legacy-fallback predicates.

Confidence Score: 5/5

Safe to merge; the chrome resolution rerouting and recursive include loading are well-tested and the logic is sound.

The core changes — disk-resolved chrome values, per-field parsed/directive tracking, recursive config-file includes with cycle detection, and legacy fallback rules — are all covered by new unit tests and the logic is consistent. The only new code introduced without a corresponding shared abstraction is two pairs of identical helper functions duplicated between GhosttyConfig and GhosttyTerminalView, which creates a maintenance drift risk but has no runtime impact on this change.

Sources/GhosttyConfig.swift and Sources/GhosttyTerminalView.swift share duplicate applyConfigFileDirective and shouldIncludeLegacy… implementations that will need to be kept in sync manually.

Important Files Changed

Filename Overview
Sources/GhosttyConfig.swift Adds per-field directive/parsed tracking flags, recursive config-file include loading with cycle detection, legacy macOS config discovery rules, and absolute theme path support. New applyConfigFileDirective and shouldIncludeLegacyGhosttyConfigInResolvedLoad are byte-for-byte duplicates of identically-named helpers already in GhosttyTerminalView.swift.
Sources/GhosttyTerminalView.swift Chrome resolution is rerouted through disk-resolved GhosttyConfig at init and reload; config-change callbacks no longer own app-level chrome; cache invalidated before the resolved-config load. Contains duplicated applyConfigFileDirective and shouldIncludeLegacyGhosttyConfigInScanPaths bodies relative to GhosttyConfig.swift additions.
cmuxTests/GhosttyConfigTests.swift Adds comprehensive regression tests covering recursive includes, optional/quoted include paths, parsed-color flag tracking, absolute theme loading, legacy config fallback rules, and the new scan-path and baseline-ignore predicates.

Sequence Diagram

sequenceDiagram
    participant App as GhosttyApp
    participant CRT as Ghostty C Runtime
    participant DC as Disk Config (GhosttyConfig.load)
    participant UI as Chrome/Window

    Note over App: reloadConfiguration()
    App->>CRT: loadDefaultConfigFilesWithLegacyFallback(newConfig)
    CRT-->>App: newConfig (ghostty_config_t)
    App->>UI: updateDefaultBackground(from: newConfig) [existing, fires notify]
    App->>DC: invalidateLoadCache()
    App->>DC: GhosttyConfig.load(useCache: false)
    Note over DC: reads config.ghostty → recursive config-file includes → legacy fallback
    DC-->>App: "resolved GhosttyConfig (with hasParsed* flags)"
    App->>App: resolvedAppearanceValue() merges disk values with C-runtime baseline
    App->>UI: applyDefaultBackground(resolved colors) [fires notify again]
    App->>CRT: synchronizeGhosttyRuntimeColorScheme()
    App->>CRT: ghostty_app_update_config(app, newConfig)

    Note over App: config-change callback (GHOSTTY_ACTION_CONFIG_CHANGE)
    App->>App: synchronizeGhosttyRuntimeColorScheme() only
    Note over App: chrome NOT updated from stale config-change payload
Loading

Reviews (8): Last reviewed commit: "fix: align recursive and legacy config l..." | Re-trigger Greptile

Comment thread Sources/GhosttyConfig.swift
Comment on lines +454 to +478
var recursiveConfigPaths: [String] = []

for path in paths.map({ NSString(string: $0).expandingTildeInPath }) {
loadConfigFile(
at: path,
into: &config,
preferredColorScheme: preferredColorScheme,
recursiveConfigPaths: &recursiveConfigPaths
)
}

var loadedRecursivePaths = Set<String>()
while !recursiveConfigPaths.isEmpty {
let path = recursiveConfigPaths.removeFirst()
let resolved = (path as NSString).standardizingPath
guard !loadedRecursivePaths.contains(resolved) else { continue }
loadedRecursivePaths.insert(resolved)

loadConfigFile(
at: path,
into: &config,
preferredColorScheme: preferredColorScheme,
recursiveConfigPaths: &recursiveConfigPaths
)
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

P1 Top-level config paths are absent from the cycle-detection set

loadedRecursivePaths is initialized after the top-level paths in paths are already loaded. If any top-level config file contains config-file = config.ghostty (self-inclusion) or a chain that circles back to one of the original paths, that top-level file is loaded a second time — the set only guards recursive-to-recursive cycles, not recursive-to-top-level ones. Concretely, if a user has config-file = ~/.config/ghostty/config in their config, the file is parsed twice, so any accumulated settings (e.g. a background color being overridden later in the same file) are applied in the wrong order. Seeding loadedRecursivePaths with the standardized forms of all entries in paths before entering the while loop would close this gap.

coderabbitai[bot]
coderabbitai Bot previously requested changes May 23, 2026

@coderabbitai coderabbitai 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.

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/GhosttyConfig.swift`:
- Around line 465-477: The loop only dedupes entries already seen in
loadedRecursivePaths, so files that were parsed from the initial paths list can
be re-parsed when encountered via a config-file include; to fix, compute a
resolved-set of the initially loaded paths (e.g., resolve each entry in paths
into a Set<String> before entering the while) and check that set when deciding
to skip a recursive path (i.e., guard !loadedRecursivePaths.contains(resolved)
&& !initialResolvedPaths.contains(resolved)), and when you do load a file via
loadConfigFile(at:into:preferredColorScheme:recursiveConfigPaths:), insert its
resolved path into the same dedupe set(s) so subsequent includes are skipped;
reference loadedRecursivePaths, recursiveConfigPaths, paths and loadConfigFile
to locate where to add this logic.
🪄 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: 4b90eb94-b6cc-40f9-b654-0203e21f4fc4

📥 Commits

Reviewing files that changed from the base of the PR and between 2647b9b and 6c4638a.

📒 Files selected for processing (3)
  • Sources/GhosttyConfig.swift
  • Sources/GhosttyTerminalView.swift
  • cmuxTests/GhosttyConfigTests.swift

Comment thread Sources/GhosttyConfig.swift Outdated
Comment thread Sources/GhosttyConfig.swift
Comment thread Sources/GhosttyConfig.swift
coderabbitai[bot]
coderabbitai Bot previously requested changes May 23, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 2

🤖 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 236-249: Update the background-hex test case in
testColorParseFlagsOnlyTrackValuesResolvedBySwiftParser to use a hex value that
includes letters (for example "`#aabbcc`") so the test exercises
case-normalization; change the hexColorConfig.parse call (GhosttyConfig.parse)
to "background = `#aabbcc`\n" and update the assertion to expect the normalized
uppercase string via backgroundColor.hexString() == "`#AABBCC`" while keeping the
hasParsedBackgroundColor check unchanged.

In `@Sources/GhosttyTerminalView.swift`:
- Around line 3589-3606: The helper
updateDefaultBackgroundFromResolvedGhosttyConfig currently always calls
GhosttyConfig.load(...) and prefers on-disk values over baselineConfig; change
it so callers can avoid reloading disk config when recovering to fallbackConfig:
add a boolean parameter (e.g. useOnDiskResolved: Bool = true) to
updateDefaultBackgroundFromResolvedGhosttyConfig and, when false, set resolved
to a GhosttyConfig-like value derived from baselineConfig (or skip load and use
baseline fields directly) so initialize.fallbackConfig can call it with
useOnDiskResolved: false to short-circuit the on-disk load and preserve baseline
colors/opacity/cursor/selection values. Ensure you update any callers (notably
initialize.fallbackConfig) to pass the flag.
🪄 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: c739530b-b0ad-4ea4-bad5-5d9cb9a4d9c6

📥 Commits

Reviewing files that changed from the base of the PR and between a0c4af5 and b4d3627.

📒 Files selected for processing (3)
  • Sources/GhosttyConfig.swift
  • Sources/GhosttyTerminalView.swift
  • cmuxTests/GhosttyConfigTests.swift

Comment thread cmuxTests/GhosttyConfigTests.swift
Comment thread Sources/GhosttyTerminalView.swift Outdated
coderabbitai[bot]
coderabbitai Bot previously requested changes May 23, 2026

@coderabbitai coderabbitai 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.

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/GhosttyConfig.swift`:
- Around line 396-447: Summary: The parser currently resets hasParsed* flags to
false on invalid later entries, causing desynchronization between flags (e.g.,
hasParsedBackgroundColor) and retained values (e.g., backgroundColor) across
recursive parse() calls. Fix: remove the else branches that set the per-field
hasParsed* flags to false in the parse() switch cases (examples:
hasParsedBackgroundColor, hasParsedBackgroundOpacity, hasParsedBackgroundBlur,
hasParsedForegroundColor, hasParsedCursorColor, hasParsedCursorTextColor,
hasParsedSelectionBackground, hasParsedSelectionForeground) so that once a flag
is set true by a successful NSColor(hex:) or parseBackgroundBlur() or
Double(value) parse, it is not cleared by later invalid entries; apply this same
change consistently across all similar cases in parse().
🪄 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: 8894814c-a715-4cf6-a04b-163fe589f903

📥 Commits

Reviewing files that changed from the base of the PR and between b4d3627 and dd912ac.

📒 Files selected for processing (2)
  • Sources/GhosttyConfig.swift
  • cmuxTests/GhosttyConfigTests.swift

Comment thread Sources/GhosttyConfig.swift

@cursor cursor 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.

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 d7ac24f. Configure here.

Comment thread Sources/GhosttyTerminalView.swift
@lawrencecchen
lawrencecchen dismissed stale reviews from coderabbitai[bot], coderabbitai[bot], and coderabbitai[bot] May 23, 2026 11:09

Stale automated review on older commits. The actionable inline threads were resolved or superseded by current tests and the latest Codex review is clean.

@lawrencecchen
lawrencecchen merged commit ddd647d into main May 23, 2026
19 checks passed
@lawrencecchen
lawrencecchen deleted the task-theme-chrome-sync-debug branch May 23, 2026 11:20

This branch was successfully deployed

1 active deployment
Preview – cmux — e3cb1834 Deployed May 23, 2026 by vercel[bot]
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.

1 participant