fix: unblock main CI (settings compile, bonsplit tests) - #16408
Conversation
#15931 called NotificationCenter.post(name:) without the required object argument, which breaks macOS compile admission on main. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
|
All contributors have signed the CLA ✍️ ✅ |
#15445 and #15154 each added the same @Environment(\.cmuxAccentColor) property to TitlebarNotificationBadge, so main redeclares it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository: manaflow-ai/cmux/.coderabbit.yaml Review profile: ASSERTIVE Plan: Advanced Run ID: 📒 Files selected for processing (5)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 6 remain after this review. 📝 WalkthroughWalkthroughThis change updates sidebar template filtering and tests, sets an explicit nil object for a gallery notification, updates the bonsplit subproject reference, and expands script stub setup in a static-preflight test. ChangesSidebar template handling
Gallery request notification
Bonsplit subproject reference
Static-preflight test setup
Priority: ⬇️ Low Estimated code review effort: 2 (Simple) | ~10 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to The PR’s template filtering and validation remain aligned, and its other changes do not establish a production regression. No actionable merge-blocking risk remains; the change is mergeable subject to normal CI checks. 🚥 Pre-merge checks | ✅ 24 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (24 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
#16319 squash-merged a stale vendor/bonsplit gitlink, moving it back from f33c31c (#16261) to 351bfa7 and reintroducing the four narrow-pane action-lane BonsplitTests failures. Point at bonsplit main 64ac6d4, whose tree matches f33c31c. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
|
Subagent review at 2e29c7f: approve. No correctness issues found.
|
#15931 added an all-static public enum that the iOS package-conventions lint rejects as a namespace type. Record it as a reviewed exception so the lint passes; it is a candidate to become an injected SettingsRuntime value. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
CI failure attributionCI passes on Written by |
Dogfood tours of
|
There was a problem hiding this comment.
1 issue found across 1 file (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swift">
<violation number="1" location="Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swift:13">
P3: This plain `//` comment between the enum's `///` doc block and the declaration detaches the doc comment: Swift associates a doc comment only with the declaration it immediately precedes, so `CustomSidebarTemplateGalleryRequest` loses "Holds a gallery request until the progressively mounted Custom Sidebars section…" in Xcode quick help / DocC. Convert the line to a `///` doc line so it stays part of the doc block; the namespace scanner matches the marker against raw text regardless, so the suppression still works (verified: the rule fires without the marker and is silenced with it).</violation>
</file>
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
|
|
||
| /// Holds a gallery request until the progressively mounted Custom Sidebars | ||
| /// section is ready to present it. | ||
| // lint:allow namespace-type — one-shot, main-actor handoff from a host menu to the lazily mounted Custom Sidebars section (#15931); candidate to become an injected SettingsRuntime value. |
There was a problem hiding this comment.
P3: This plain // comment between the enum's /// doc block and the declaration detaches the doc comment: Swift associates a doc comment only with the declaration it immediately precedes, so CustomSidebarTemplateGalleryRequest loses "Holds a gallery request until the progressively mounted Custom Sidebars section…" in Xcode quick help / DocC. Convert the line to a /// doc line so it stays part of the doc block; the namespace scanner matches the marker against raw text regardless, so the suppression still works (verified: the rule fires without the marker and is silenced with it).
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxSettingsUI/Sources/CmuxSettingsUI/Environment/SettingsHostActions.swift, line 13:
<comment>This plain `//` comment between the enum's `///` doc block and the declaration detaches the doc comment: Swift associates a doc comment only with the declaration it immediately precedes, so `CustomSidebarTemplateGalleryRequest` loses "Holds a gallery request until the progressively mounted Custom Sidebars section…" in Xcode quick help / DocC. Convert the line to a `///` doc line so it stays part of the doc block; the namespace scanner matches the marker against raw text regardless, so the suppression still works (verified: the rule fires without the marker and is silenced with it).</comment>
<file context>
@@ -10,6 +10,7 @@ public extension Notification.Name {
/// Holds a gallery request until the progressively mounted Custom Sidebars
/// section is ready to present it.
+// lint:allow namespace-type — one-shot, main-actor handoff from a host menu to the lazily mounted Custom Sidebars section (#15931); candidate to become an injected SettingsRuntime value.
@MainActor
public enum CustomSidebarTemplateGalleryRequest {
</file context>
| // lint:allow namespace-type — one-shot, main-actor handoff from a host menu to the lazily mounted Custom Sidebars section (#15931); candidate to become an injected SettingsRuntime value. | |
| /// lint:allow namespace-type — one-shot, main-actor handoff from a host menu to the lazily mounted Custom Sidebars section (#15931); candidate to become an injected SettingsRuntime value. |
#15931 left two more breaks behind the compile error: the app's sidebar menu calls CustomSidebarTemplateGalleryRequest without importing CmuxSettingsUI, and the template catalog only stripped '// cp Examples/' install lines, so workspaces.js kept its '// Install: cp Examples/...' line and CustomSidebarOnboardingAssetsTests failed. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
|
|
#15673 added a check-agent-hook-docs.py step to static-preflight, and test_static_preflight_rejects_stale_embedded_schema_before_native_work replays every step in a stub repo that lacked that script. Stub any script the steps reference. #15931 added Examples/CustomSidebars/manifest.json, the template catalog index, which the downloadable-examples validation test counted as a broken sidebar. Exclude it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
Bugbot is paused — on-demand spend limit reachedBugbot uses usage-based billing for this team and has hit its on-demand spend limit. A team admin can raise the spend limit in the Cursor dashboard, or wait for the next billing cycle to continue. |
|
Subagent review at e6ba67d (net diff vs main): approve.
|
There was a problem hiding this comment.
1 issue found across 2 files (changes from recent commits).
Prompt for AI agents (unresolved issues)
Check if these issues are valid — if so, understand the root cause of each and fix them. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. If appropriate, use sub-agents to investigate and fix each issue separately.
<file name="Packages/macOS/CmuxSwiftRenderUI/Tests/CmuxSwiftRenderUITests/CustomSidebarValidationTests.swift">
<violation number="1" location="Packages/macOS/CmuxSwiftRenderUI/Tests/CmuxSwiftRenderUITests/CustomSidebarValidationTests.swift:105">
P3: `sidebars.filter(\.isValid).count == 19` and `sidebars.allSatisfy(\.isValid)` assert the same property: the name comparison above pins `sidebars` to exactly these 19 names, so "19 of them valid" is the same statement as "all valid". Keep only one — `allSatisfy` gives better failure diagnostics.</violation>
</file>
Tip: Review your code locally with the cubic CLI to iterate faster.
Re-trigger cubic
| #expect(sidebars.filter(\.isValid).count == 19) | ||
| #expect(sidebars.allSatisfy(\.isValid)) |
There was a problem hiding this comment.
P3: sidebars.filter(\.isValid).count == 19 and sidebars.allSatisfy(\.isValid) assert the same property: the name comparison above pins sidebars to exactly these 19 names, so "19 of them valid" is the same statement as "all valid". Keep only one — allSatisfy gives better failure diagnostics.
Prompt for AI agents
Check if this issue is valid — if so, understand the root cause and fix it. When an issue isn't valid or won't be fixed in this PR, reply in its thread with the reason and then resolve the thread. At Packages/macOS/CmuxSwiftRenderUI/Tests/CmuxSwiftRenderUITests/CustomSidebarValidationTests.swift, line 105:
<comment>`sidebars.filter(\.isValid).count == 19` and `sidebars.allSatisfy(\.isValid)` assert the same property: the name comparison above pins `sidebars` to exactly these 19 names, so "19 of them valid" is the same statement as "all valid". Keep only one — `allSatisfy` gives better failure diagnostics.</comment>
<file context>
@@ -98,10 +98,12 @@ struct CustomSidebarValidationTests {
- #expect(report.validCount == 19)
- #expect(report.errorCount == 0)
+ #expect(sidebars.map(\.name).sorted() == ["activity", "agents-board", "agents-cards", "agents-dense", "agents-focus", "agents-timeline", "btop-agents", "clock", "compact", "finder", "focus", "kitchen-sink", "panel-info", "panel-sessions", "panel-subagents", "panel-todo", "ports", "status-board", "workspaces"])
+ #expect(sidebars.filter(\.isValid).count == 19)
+ #expect(sidebars.allSatisfy(\.isValid))
}
</file context>
| #expect(sidebars.filter(\.isValid).count == 19) | |
| #expect(sidebars.allSatisfy(\.isValid)) | |
| #expect(sidebars.allSatisfy(\.isValid)) |
#15931 narrowed the bundled templates to six curated ids, so exampleTemplate(id: "focus") now returns nil and customSidebarOnboardingCopiesBundledExampleWithoutOverwriting fails its #require. Use agents-board, which stays in the catalog. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK
|
Merge receipt for |
59af434 fix: unblock main CI (settings compile, bonsplit tests) (manaflow-ai#16408)
* test: repair four package test targets that main stopped compiling or passing - CmuxAgentJournal: #15279 called draft(to:senderSurfaceId:body:) after #15863 put body before senderSurfaceId. - CmuxFoundation: #16378's Codex TOML tests expected an appended [features] table, but the editor rewrites an existing hooks = false in place inside its marker block. Assert that block instead. - CmuxSwiftRenderUI: #16408's allSatisfy(\.isValid) inside #expect does not compile (the macro makes the key path a throwing argument). - CmuxUpdaterUI: #16357 reverted UpdateBadge.hostedIconRequest and the CmuxAppKitSupportUI dependency but left #15756's UpdateBadgeTests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * ci: let consumer app-host tests find the source tree again #16116 dropped the /private/tmp/cmux-ci/src alias in favor of CMUX_CI_RUNTIME_SOURCE_ROOT, but xcodebuild only forwards TEST_RUNNER_ variables to the test host, so SwiftTestingAssertions.sourceURL() fell back to the producer's #filePath. On a consumer runner that never compiled, dozens of source-backed tests (shell integration, wrappers, source scans) then fail with file-not-found. Forward the root as TEST_RUNNER_CMUX_CI_RUNTIME_SOURCE_ROOT, and alias the producer's canonical src to this checkout when nothing is there, for raw #filePath users (cmuxCLITests, CLI dev-resource fallbacks). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * test: repair two agent notification tests main never ran green - AgentSemanticNotificationDeliveryTests (#15974): enqueue a session- scoped prompt only after binding that session to the surface, which notificationRequestIsCurrent has required since #11976. The PR merged with its app-host shards cancelled. - testCodexStopWithMissedPromptSubmitClearsTerminalStaleTurn: since 2f574d6 (#15345) turn_aborted is terminal for the transcript monitor, so its Stop replay may retire the aborted turn before the next Stop does. Accept either retirement and wait for it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * ci: drop the producer-root alias; resolve CLI test sources through the runtime root Review of 69a68d6: the restore-time alias at the producer's canonical src breaks #16116's rule that restore never touches the producer root (two wiring tests encode it) and can race a producer's rm/clone on shared Macs. Instead, the two raw #filePath sites in cmuxCLITests read CMUX_CI_RUNTIME_SOURCE_ROOT like SwiftTestingAssertions.sourceURL(), and the CLI product step forwards it as TEST_RUNNER_. The Codex aborted-turn test now captures from before the old prompt (a fast monitor replay was missed) and asserts silence only on the transcript-terminal path: the monitor replay settles the aborted turn as a completed Stop, which notifies (#15345's behavior). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * ci: forward the runtime source root into the console-session test runner The app-host shards run run-app-host-xcodebuild.sh through run-in-console-session.sh, which forwards only an allowlist of variables. CMUX_CI_RUNTIME_SOURCE_ROOT was not on it, so the TEST_RUNNER_ forwarding never fired and sourceURL() kept falling back to the producer's #filePath (run 36903763717 still showed /tmp/cmux-ci/src). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * ci: give the standalone CLI under test its bundled opencode plugin The CLI product job tests Build/Products/Debug/cmux, where none of the CLI's resource candidates exist, so 'hooks opencode install' only found the plugin through its #filePath fallback into the source tree. Place it beside the executable, one of the paths the CLI already searches. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * test: rename the older of two same-named Claude NODE_OPTIONS resume tests #16031 added testClaudeResumeCommandStripsQuotedCmuxNodeOptionsRestoreModuleInHomeWithSpace next to an existing test of the same name, so cmuxTests no longer compiles and the shard planner rejects the duplicate selector. The older one keeps a user --require, so name it for that. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK * Revert "test: rename the older of two same-named Claude NODE_OPTIONS resume tests" This reverts commit 852333a. --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Summary
main CI was red from several merges that crossed or went in with red checks. This PR fixes them forward:
SettingsHostActions.swiftcalledNotificationCenter.default.post(name:)without the requiredobject:argument (Add built-in custom sidebar templates #15931). It now passesobject: nil.CmuxExtensionSidebarSelection.swiftusesCustomSidebarTemplateGalleryRequestwithout importingCmuxSettingsUI(Add built-in custom sidebar templates #15931).namespace-type. Recorded as a reviewedlint:allowexception.// cp Examples/…, soworkspaces.jskept its// Install: cp Examples/…line andCustomSidebarOnboardingAssetsTestsfailed. The filter now drops any comment line that contains the copy command.vendor/bonsplitgitlink, which moved the pin back from f33c31c (Bump Bonsplit: fix narrow-pane rendering test assumptions #16261) to 351bfa7. The pin now points at bonsplit main 64ac6d4, whose tree is identical to f33c31c (a forward move).check-agent-hook-docs.pystep to static-preflight. The fixture intest_static_preflight_rejects_stale_embedded_schema_before_native_workreplays every step and now stubs any script they call. The test fails locally without the change and passes with it.Examples/CustomSidebars/manifest.json(Add built-in custom sidebar templates #15931's catalog index) is excluded from the downloadable-examples validation. The onboarding copy test now uses curatedagents-boardinstead offocus, which Add built-in custom sidebar templates #15931 dropped from the bundled templates.The duplicate
cmuxAccentreported against #16230 was also real. It was fixed independently on main by #15345, so this diff doesn't include it.Verification
CI on 8ec30fb: 67/67 checks pass, including macOS compile admission, swift-package-tests, app-host unit tests, CLI product tests and guards. I did not build the app locally. The first CLI product test run failed because the runner had nothing at
/tmp/cmux-ci/src; it passed on rerun.Changelog
none
🤖 Generated with Claude Code
https://claude.ai/code/session_01FrR7YbsQtGw2eFtDeyiTcK