Skip to content

Extract custom-sidebar data-context projection from ContentView into CmuxSidebarLayout - #6167

Closed
azooz2003-bit wants to merge 1 commit into
mainfrom
feat-sidebar-layout-composition
Closed

azooz2003-bit wants to merge 1 commit into
mainfrom
feat-sidebar-layout-composition

Conversation

@azooz2003-bit

@azooz2003-bit azooz2003-bit commented Jun 15, 2026 •

Copy link
Copy Markdown
Collaborator

Extracts the custom-sidebar interpreter data-context projection out of the giant VerticalTabsSidebar view in Sources/ContentView.swift into a new leaf package, CmuxSidebarLayout, as a pure value-typed builder with the live god-types inverted behind Sendable input snapshots.

This is the clean, latency-insensitive subset of the sidebar-layout-composition domain. The rest of that domain (VerticalTabsSidebar body, the .equatable TabItemView row, the frame-anchor preference plumbing, the markdown renderer and the shortcut/accessory policies) is either latency-critical-per-keystroke or already extracted into CmuxFoundation / CmuxSidebar, so this PR takes the genuinely clean piece rather than forcing the hot views into a package.

What moved

  • CustomSidebarDataContextBuilder (the major type): owns all SwiftValue assembly, default values, and optional-field omission rules for the top-level context, per-workspace, and per-surface value objects. This was the inline bodies of customSidebarDataContext(now:) / customSidebarWorkspaceValue(_:index:selectedId:) / customSidebarSurfaceValues(_:focusedPanelId:).
  • CustomSidebarContextSnapshot, CustomSidebarWorkspaceSnapshot (+ nested Progress / Remote), CustomSidebarSurfaceSnapshot: Sendable, Equatable value-typed inputs.

The seam (dependency inversion)

The app still reads live Workspace / TabManager / SidebarUnreadModel state, but only to project it into the snapshot value types; the package never names a god type. ContentView keeps three thin private projection methods that build the snapshots and call CustomSidebarDataContextBuilder().dataContext(for:). The Calendar is constructor-injected (defaults to .current) for testability. The package depends only on CmuxSwiftRender (for SwiftValue).

Byte-identical

The produced [String: SwiftValue] tree is unchanged. Preserved exactly: every field name, the nil-or-empty-string omission rules (description / color / latestMessage / latestPrompt / surface directory), the git / PR / progress / remote field sets, the clock %02d:%02d:%02d formatting and components, and the surface pane-walk ordering (surfaces without a panel id are still skipped at projection time). SwiftValue is a dict-backed object so key ordering never affected output (displayString sorts keys; the interpreter looks up by key). The PR value objects are passed through already-projected by the existing Workspace.customSidebarPullRequestValues() extension, so display ordering is unchanged.

Tests

8 Testing-framework cases for the builder using fixed-calendar fakes and known snapshots: always-present top-level keys, empty-selection selectedId, clock-component derivation, always-present + optional workspace fields, empty-string omission, progress-without-label, and surface enrichment presence/omission.

Stats

est lines removed from ContentView.swift: 20 net (86 deleted, 66 thinner projection added). File-length budget ratcheted 16674 -> 16654. scripts/lint-ios-package-conventions.sh prints OK with zero new lint:allow. swift build and swift test pass in Packages/CmuxSidebarLayout.

NOTE: the full app build is validated by CI (not run locally, per the 22-parallel-agent constraint).

🤖 Generated with Claude Code


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


Summary by cubic

Extracted the custom sidebar data-context projection from VerticalTabsSidebar into a new leaf package, CmuxSidebarLayout. Behavior is unchanged, but the logic is now decoupled, value-typed, and testable.

  • Refactors

    • Added CmuxSidebarLayout with CustomSidebarDataContextBuilder and snapshot types (CustomSidebarContextSnapshot, CustomSidebarWorkspaceSnapshot with Progress/Remote, CustomSidebarSurfaceSnapshot).
    • ContentView now builds snapshots and calls CustomSidebarDataContextBuilder().dataContext(for:).
    • Package depends only on CmuxSwiftRender; no app “god types” referenced.
    • Calendar is injectable (defaults to .current) for consistent clock derivation.
    • Output [String: SwiftValue] is byte-identical: same fields, omission rules (empty/nil), clock format/components, PR/git/progress/remote sets, and surface walk/ordering.
  • Tests

    • Added 8 tests covering top-level keys, empty selection, clock components, optional field omission, progress without label, and surface enrichment.

Written for commit 2e871c9. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • Refactor
    • Restructured sidebar data modeling and context building for improved maintainability and extensibility.

Pulls the interpreter data-context projection out of the VerticalTabsSidebar
view in ContentView.swift into a new leaf package, CmuxSidebarLayout, as a
pure value-typed builder with the live god-types inverted behind Sendable
input snapshots.

What moved:
- CustomSidebarDataContextBuilder: owns all SwiftValue assembly, default
  values, and optional-field omission rules for the top-level context,
  per-workspace, and per-surface value objects (was the inline bodies of
  customSidebarDataContext / customSidebarWorkspaceValue /
  customSidebarSurfaceValues).
- CustomSidebarContextSnapshot / CustomSidebarWorkspaceSnapshot
  (+ Progress / Remote) / CustomSidebarSurfaceSnapshot: Sendable, Equatable
  value-typed inputs.

The seam: the app still reads live Workspace / TabManager / SidebarUnreadModel
state, but only to project it into the snapshot value types; every SwiftValue
field name, default, and omit-when-nil/empty rule now lives in the package, so
no package type ever names a god type. The Calendar is constructor-injected
(defaults to .current) for testability.

Byte-identical: the produced [String: SwiftValue] tree is unchanged. Field
names, the nil-or-empty-string omission rules (description/color/messages/
directory), the git/PR/progress/remote field sets, the clock formatting, and
the surface pane-walk ordering are all preserved; surfaces without a panel id
are still skipped at projection time. SwiftValue dict ordering never affected
output (rendering sorts keys / looks up by key).

Tests: 8 Testing-framework cases for the builder using fixed-calendar fakes
and known snapshots (clock components, optional presence/omission, empty-string
omission, progress-without-label, surface enrichment).

est lines removed from ContentView.swift: 20 net (86 deleted, 66 thinner
projection added); budget ratcheted 16674 -> 16654.

NOTE: app build validated by CI. The new package builds and its tests pass
locally (swift build / swift test in Packages/CmuxSidebarLayout).

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

vercel Bot commented Jun 15, 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 15, 2026 7:35pm
cmux-staging Building Building Preview, Comment Jun 15, 2026 7:35pm

@coderabbitai

coderabbitai Bot commented Jun 15, 2026 •

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

A new local Swift package CmuxSidebarLayout is introduced, defining three snapshot value types (CustomSidebarContextSnapshot, CustomSidebarWorkspaceSnapshot, CustomSidebarSurfaceSnapshot) and a CustomSidebarDataContextBuilder that projects snapshots into a [String: SwiftValue] interpreter dictionary. ContentView.swift is refactored to populate these snapshots and delegate SwiftValue assembly to the builder.

Changes

CmuxSidebarLayout Package and ContentView Integration

Layer / File(s) Summary
Package manifest, lockfile, and Xcode project wiring
Packages/CmuxSidebarLayout/Package.swift, Packages/CmuxSidebarLayout/Package.resolved, cmux.xcodeproj/project.pbxproj
Package.swift defines the CmuxSidebarLayout library (macOS 14+, Swift 6, local dep on ../CmuxSwiftRender); Package.resolved pins swift-syntax; the Xcode project file adds the PBXBuildFile, frameworks build phase entry, package product dependency, and local package reference.
Snapshot value types
Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarContextSnapshot.swift, .../CustomSidebarWorkspaceSnapshot.swift, .../CustomSidebarSurfaceSnapshot.swift
Three new Sendable+Equatable public structs model the complete sidebar interpreter input: CustomSidebarContextSnapshot holds workspace list, selection, unread count, and clock instant; CustomSidebarWorkspaceSnapshot (with nested Progress and Remote) covers identity, git/PR/message state; CustomSidebarSurfaceSnapshot covers surface identity, focus/pin, git, and ports.
CustomSidebarDataContextBuilder
Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarDataContextBuilder.swift
Accepts an injectable Calendar; dataContext(for:) produces the top-level [String: SwiftValue] dictionary including clock, workspaceCount, and workspaces; workspaceValue(_:) conditionally includes optional fields (description, color, git, PR, progress, messages, remote); surfaceValue(_:) conditionally includes directory, git, and ports.
Builder tests
Packages/CmuxSidebarLayout/Tests/CmuxSidebarLayoutTests/CustomSidebarDataContextBuilderTests.swift
Suite of 8 test cases covering top-level key presence, empty selection, clock field derivation from an injected calendar, workspace always-present and optional field mapping, empty-string omission, progress label omission, and surface enrichment key presence/absence.
ContentView.swift integration
Sources/ContentView.swift
Imports CmuxSidebarLayout; customSidebarDataContext(now:) now builds a CustomSidebarContextSnapshot via new customSidebarWorkspaceSnapshot/customSidebarSurfaceSnapshots projectors and delegates to CustomSidebarDataContextBuilder().dataContext(for:), removing the prior direct SwiftValue builders.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Possibly related PRs

  • manaflow-ai/cmux#5823: Introduced Workspace.customSidebarPullRequestValues() whose output shape is directly consumed by the new CustomSidebarWorkspaceSnapshot.pullRequestValues field and projected through workspaceValue(_:).

Poem

🐰 A package is born, all snapshots and types,
No more raw SwiftValues tangled in pipes.
The builder now maps every branch, port, and clock,
Each workspace a struct — neat, testable, in stock.
The rabbit hops forward, the diff clean and bright,
A sidebar refactor done perfectly right! ✨

🚥 Pre-merge checks | ✅ 20 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 35.29% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (20 passed)
Check name Status Explanation
Title check ✅ Passed Title clearly and concisely describes the main change: extracting custom-sidebar data-context projection from ContentView into a new CmuxSidebarLayout package.
Description check ✅ Passed Description is comprehensive and well-structured, covering what moved, dependency inversion approach, byte-identical output preservation, testing strategy, and metrics. However, the Testing section lacks specific testing details and the Demo Video section is empty.
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 All new types in CmuxSidebarLayout are value types (structs), explicitly Sendable where appropriate, immutable with let properties, with no implicit MainActor issues, implicit MainActor service pro...
Cmux Swift Blocking Runtime ✅ Passed No blocking/timing-based synchronization detected. PR adds pure value-typed Sendable structs and a deterministic builder with no I/O, no locks, no Task.sleep, no blocking waits—only pure functional...
Cmux Expensive Synchronous Load ✅ Passed PR adds no expensive synchronous loaders (disk I/O, sysctl, .load() calls) to main-actor or interactive paths. The new CustomSidebarDataContextBuilder performs pure value transformations from snaps...
Cmux Cache Substitution Correctness ✅ Passed PR extracts sidebar data-context projection into transient value-typed snapshots built fresh each render, never replacing an authoritative read with cached/persisted values; snapshots are non-persi...
Cmux No Hacky Sleeps ✅ Passed PR modifies only Swift files and package manifests; check applies only to TypeScript/JavaScript/shell scripts, explicitly excluding Swift (covered separately).
Cmux Algorithmic Complexity ✅ Passed PR extracts sidebar context building into pure value transformations with no algorithmic complexity violations. All operations are single-pass mappings (O(n) over workspaces/surfaces/ports), no nes...
Cmux Swift Concurrency ✅ Passed PR introduces no legacy async patterns. New CmuxSidebarLayout package contains only Sendable/Equatable value types and a pure synchronous builder. ContentView refactoring adds three thin synchronou...
Cmux Swift @Concurrent ✅ Passed PR adds only synchronous pure helper functions with no async work, I/O, or actor isolation concerns. CustomSidebarDataContextBuilder functions perform lightweight value projection (UUID conversion,...
Cmux Swift File And Package Boundaries ✅ Passed PR extracts custom-sidebar data projection into new CmuxSidebarLayout package: all new source files under 400 lines with clear single responsibilities, ContentView.swift adds only 66 lines (well un...
Cmux Swift Logging ✅ Passed No logging violations found in the PR. All new package source files and tests contain no print, debugPrint, dump, NSLog calls, Logger instantiations, or logging framework imports. The PR is complia...
Cmux User-Facing Error Privacy ✅ Passed PR contains no user-facing error messages, alerts, or sensitive data exposure. All new code is pure data-structure definitions and a builder that projects snapshots into interpreter dictionaries. T...
Cmux Full Internationalization ✅ Passed PR adds no new user-facing Swift UI text, web UI changes, string catalog entries, or i18n-related modifications. Changes are pure value-typed refactoring with internal interpreter keys and pass-thr...
Cmux Swiftui State Layout ✅ Passed PR introduces only pure value types (Sendable/Equatable structs) with no ObservableObject, @Published, @StateObject, @EnvironmentObject, GeometryReader, lazy containers with store refs, or render-t...
Cmux Architecture Rethink ✅ Passed PR extracts sidebar projection into pure value-typed builder with immutable Sendable snapshots; zero timing/blocking patterns, no mutable shared state, single clear owner (ContentView), byte-identi...
Cmux Swift Auxiliary Window Close Shortcuts ✅ Passed PR extracts custom-sidebar data-context projection to CmuxSidebarLayout package; no NSWindow, NSPanel, NSWindowController, SwiftUI Window/WindowGroup code added or materially changed. New code cons...
Cmux Source Artifacts ✅ Passed All changed paths comply with source-control-artifacts.md: hand-written sources, configs, tests, and Package.resolved (intentionally tracked per repo convention with 8 other packages); no caches, s...

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 feat-sidebar-layout-composition

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 Jun 15, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR extracts the custom-sidebar interpreter data-context projection from VerticalTabsSidebar in ContentView.swift into a new CmuxSidebarLayout leaf package, inverting the live god-type dependencies behind Sendable/Equatable snapshot value types and a pure CustomSidebarDataContextBuilder struct.

  • Extraction: CustomSidebarDataContextBuilder and three snapshot types (CustomSidebarContextSnapshot, CustomSidebarWorkspaceSnapshot, CustomSidebarSurfaceSnapshot) replace the former 86-line inline projection in ContentView; all field names, nil/empty-string omission rules, clock formatting, and pane-walk ordering are byte-identical to the original.
  • Seam: ContentView retains three thin private methods that project live Workspace/TabManager/SidebarUnreadModel state into snapshots, then pass them to the builder; the package never names a god type and depends only on CmuxSwiftRender.
  • Testing: 8 Testing-framework cases cover always-present keys, clock derivation, optional field presence/omission, and empty-string elision using a fixed-timezone calendar fake.

Confidence Score: 4/5

The extraction is mechanically faithful — all field names, omission rules, and pane-walk ordering are preserved. The only issues are API surface design choices that don't affect runtime behavior.

All production logic is byte-identical to the original inline code and is backed by 8 targeted tests. The two findings are non-blocking design notes: workspaceValue/surfaceValue are wider than necessary given @testable import covers tests, and the surfaceCount/surfaces.count divergence invariant is real but undocumented in the public type.

CustomSidebarWorkspaceSnapshot.swift — the surfaceCount docstring should explain that it intentionally counts panel-less tabs skipped by the surfaces array.

Important Files Changed

Filename Overview
Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarDataContextBuilder.swift New pure-value builder that projects snapshot types into SwiftValue trees; workspaceValue and surfaceValue are unnecessarily public (tests use @testable import).
Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarWorkspaceSnapshot.swift Sendable/Equatable workspace snapshot type with correct public API. The surfaceCount field intentionally diverges from surfaces.count but lacks a docstring explaining the invariant.
Sources/ContentView.swift Three thin projection methods correctly replace the former inline god-view logic; all field mappings, empty-string omission rules, and nil handling are faithfully preserved.
Packages/CmuxSidebarLayout/Tests/CmuxSidebarLayoutTests/CustomSidebarDataContextBuilderTests.swift 8 well-scoped Testing-framework cases covering always-present keys, clock derivation, optional field presence/omission, and empty-string elision. Two tests create a workspace via minimalWorkspace then immediately overwrite it (dead assignment) but this doesn't affect correctness.
Packages/CmuxSidebarLayout/Package.swift Swift 6 package manifest with a single local dependency on CmuxSwiftRender; strict concurrency, ExistentialAny, and InternalImportsByDefault enabled for both targets.
Packages/CmuxSidebarLayout/Package.resolved Resolved file pins swift-syntax 600.0.1 as a transitive dependency pulled in by CmuxSwiftRender; consistent with how other packages in the repo track their resolved files.
cmux.xcodeproj/project.pbxproj CmuxSidebarLayout package reference and product dependency correctly wired into the main app target only; consistent with the existing pattern for other sidebar sub-packages.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[VerticalTabsSidebar\nContentView.swift] -->|customSidebarDataContext| B[customSidebarContextSnapshot]
    B -->|tabManager.tabs.enumerated| C[customSidebarWorkspaceSnapshot\nper workspace]
    C -->|bonsplitController pane walk| D[customSidebarSurfaceSnapshots\nfiltered by panelId]
    D --> E[CustomSidebarSurfaceSnapshot\nSendable / Equatable]
    C --> F[CustomSidebarWorkspaceSnapshot\nSendable / Equatable\nnote: surfaceCount ≠ surfaces.count]
    B --> G[CustomSidebarContextSnapshot\nSendable / Equatable]
    F --> G
    E --> F
    G -->|CustomSidebarDataContextBuilder\n.dataContext| H["[String: SwiftValue] tree"]
    H -->|workspaces, workspaceCount,\nselectedTitle, selectedId,\nunreadTotal, clock| I[Custom Sidebar Interpreter]
Loading

Comments Outside Diff (1)

  1. Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarDataContextBuilder.swift, line 193 (link)

    P2 workspaceValue and surfaceValue are public but used only internally and via @testable import

    Both methods are called solely from dataContext(for:) inside the same struct and from tests that already use @testable import CmuxSidebarLayout, which grants access to internal members. Marking them public adds them to the package's stable API contract without a current consumer requiring it. If the field set or assembly logic changes, removing or renaming them becomes a breaking change.

    Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Reviews (1): Last reviewed commit: "Extract custom-sidebar data-context proj..." | Re-trigger Greptile

Comment on lines +61 to +62
/// Total surface count across panes (`workspaces[i].tabCount`).
public let surfaceCount: Int

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.

P2 surfaceCount / surfaces.count divergence is undocumented

In ContentView.swift, surfaceCount is set to the full bonsplit pane walk (allPaneIds.reduce(0) { $0 + tabs(inPane:) }), while surfaces is built with a guard let panelId = workspace.panelIdFromSurfaceId(tab.id) else { continue } filter — so surfaceCount intentionally exceeds surfaces.count when any tab lacks a panel ID. The builder maps surfaceCount to tabCount and surfaces to tabs, meaning tabs.count and tabCount will diverge in the interpreter context. This is preserved byte-identical from the original, but the public API docstring gives no hint of the split invariant. A future snapshot constructor that sets surfaceCount: surfaces.count (the natural default) would silently change tabCount for any workspace that has panel-less tabs.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

@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
`@Packages/CmuxSidebarLayout/Tests/CmuxSidebarLayoutTests/CustomSidebarDataContextBuilderTests.swift`:
- Line 218: The customColor fixture value uses a 3-digit hex format (`#fff`) which
violates the workspace color contract that requires 6-digit hex values in
`#RRGGBB` format. Replace the "customColor: "`#fff`"" assignment with a 6-digit hex
color value (for example, "`#ffffff`") to ensure the test fixture enforces the
same color format constraint that production code expects.
🪄 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: b40cdae8-4c29-4760-851b-2fc64ae91ac8

📥 Commits

Reviewing files that changed from the base of the PR and between 5321bec and 2e871c9.

⛔ Files ignored due to path filters (1)
  • .github/swift-file-length-budget.tsv is excluded by !**/*.tsv
📒 Files selected for processing (9)
  • Packages/CmuxSidebarLayout/Package.resolved
  • Packages/CmuxSidebarLayout/Package.swift
  • Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarContextSnapshot.swift
  • Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarDataContextBuilder.swift
  • Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarSurfaceSnapshot.swift
  • Packages/CmuxSidebarLayout/Sources/CmuxSidebarLayout/CustomSidebarWorkspaceSnapshot.swift
  • Packages/CmuxSidebarLayout/Tests/CmuxSidebarLayoutTests/CustomSidebarDataContextBuilderTests.swift
  • Sources/ContentView.swift
  • cmux.xcodeproj/project.pbxproj

surfaces: [],
surfaceCount: 0,
customDescription: "desc",
customColor: "#fff",

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Use a 6-digit workspace color in this fixture.

"#fff" conflicts with the repo’s workspace color contract (#RRGGBB). Use a 6-digit value so tests reinforce the same invariant production code expects.

Suggested patch
-            customColor: "`#fff`",
+            customColor: "`#FFFFFF`",

Based on learnings, workspace/tab colors in this repo should use only 6-digit #RRGGBB values.

📝 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
customColor: "#fff",
customColor: "`#FFFFFF`",
🤖 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
`@Packages/CmuxSidebarLayout/Tests/CmuxSidebarLayoutTests/CustomSidebarDataContextBuilderTests.swift`
at line 218, The customColor fixture value uses a 3-digit hex format (`#fff`)
which violates the workspace color contract that requires 6-digit hex values in
`#RRGGBB` format. Replace the "customColor: "`#fff`"" assignment with a 6-digit hex
color value (for example, "`#ffffff`") to ensure the test fixture enforces the
same color format constraint that production code expects.

Source: Learnings

@azooz2003-bit

Copy link
Copy Markdown
Collaborator Author

Superseded by #6226 — consolidated into the existing CmuxSidebar package (no new micro-package) per over-engineering review. The extraction is preserved there.

This branch was successfully deployed

1 active deployment
Preview – cmux — 2e871c97 Deployed Jun 15, 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