Repository navigation
cmux NEXT: connect the GitHub App from Settings Accounts - #26770
Conversation
|
cmux status (one comment, edited in place; each line is updated by the job that owns it) Review App of this head (app.zip, kept 1 day)
Gallery before/after for
States
Pick other states with a Passes: CI passes on CI passes on Written by web and size checks: green Default changesThis pull request changes 3 defaults at
Signed off on this commit by Merge receipt: merged as Regenerate the snapshot with Shipped in:
|
|
Found 2 test failures on Blacksmith runners: Failures
|
|
Bead |
e138320 to
67e4654
Compare
…-connect-settings # Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextActions/ActionSurfaceCatalog+Exemptions.swift
|
Review (codex gpt-6.1-sol high, review-router): SHIP at 097e4f7 No new P1/P2. The regenerated exports, counts, settings schema, MDM files and fingerprints match their sources. |
|
Review (codex gpt-6.1-sol high, review-router): SHIP at d6bea6c No P1/P2. The P1 reported at f63c16f ( |
# Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextActions/ActionSurfaceCatalog+Exemptions.swift
# Conflicts: # Packages/macOS/CmuxNext/Sources/CmuxNextActions/ActionSurfaceCatalog+Exemptions.swift
|
Review (codex gpt-6-astra high fast, review-router): BLOCK at 37196f6
VERDICT: BLOCK Lander note: these are the findings already filed as #28716 and #28717. |
|
Orphaned: no activity for 18 h, and no lane holds a lease on it. The orphan sweep could not merge |
Generated exports (action surfaces, settings schema, MDM docs) are taken from the base; the PR autofix regenerates the ones this PR owns.
|
Review (codex gpt-6-astra high, next-review): BLOCK at c826899 BLOCK at c826899 Visual verdict: The new GitHub rows have large blank vertical gaps in both themes, pushing existing provider controls off-screen in the exact-head gallery.
Follow-ups:
|
|
Review (codex gpt-6-astra high, sweep, via the review router; full diff from merge base 80d716d to this head): SHIP at c826899 [P2] [follow-up] |
|
Review (next-review patch-id; carried): SHIP at 5468259 The independent SHIP at c826899 carries to this head: the PR's own change ( |
|
Swift-logic note (REWRITE R-SWIFT-MIRRORS): this PR added Why this matters: the tip's Nothing to change in this merged PR. REWRITE R-SWIFT-MIRRORS tracks the move (design: https://cmux-orchestrator-1.tail137216.ts.net/resize-videos/rewrites/R-SWIFT-MIRRORS/DESIGN.md, section 11). |
|
Swift logic follow-up (tip watcher swift-logic row, STATUS 13027 "SWIFT LOGIC CULPRITS"; lead order). This PR raised
plans/cmux-next/layer-ownership.md says Rust owns every state, list and rule and Swift is the platform shell. Please move the new logic of this PR in a follow-up: to Rust (the crate that owns the area; the owner lists in STATUS 12147-12165 name the target per area), or at least out of the app into its package. If a declaration above is platform code (AppKit, Core Animation, OS calls, strings, tokens, DEBUG tooling), reply here and the table gets a PLATFORM row with your reason instead. The swift-logic row is a report, not a gate: nothing blocks on this comment. |
![Fix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/fix-with-codesmith-light-3x.png)
Settings → Accounts gains one Connect GitHub action backed by the existing GitHub App connection API. A user chooses repositories and permissions in GitHub, then returns to Settings to see the connection, its granted permissions, and Disconnect. Pending browser authorization stays pending until the API confirms completion.
Depends on #26795 for typed result effects. The dashboard callback preserves the originating team through completion in merged #26804 (
04f80b97).Settings and onboarding share
accounts.githubConnect(cmux accounts github-connect), which reportsconnected,pending,needs-action, orfailedwith localized recovery text. The Setup Guide button is carried by #26780. The Inbox preference is relabeled GitHub Inbox because it controls notifications, with its behavior and default preserved.The native account/team scope binds every request and discards responses after switching accounts. Existing owner-session HTTPS transport is used; no credential-relay permission or backend behavior changes. Only a connection's creator sees an enabled Disconnect action. Connect retries retain the same idempotency key after a lost response; cached browser URLs expire with their signed authorization state, and a failed request returns a failed CLI action; repeated setup does not create another active connection. Showcase and isolated Accounts fixtures disable the live transport. Browser completion uses the existing dashboard callback; this does not claim access from other machines.
Validation at
b497fafd2aa0df3e8f129a478eb9fd0793a14fcb: static pre-push checks passed. Fleet job0a87afee31dec79469dc2d73compiled the test targets and passedGitHubConnectionsTests(16 tests),ActionSurfaceParityTests(two skips), andActionEffectTests. The same new regression cases on pre-fixb09afc6004cb715653a298dc21874cca00ef13c0failed in fleet job38662545ac0188fa553ba756: the policy retry reused its refused key, and the restored pending connection allowed two duplicate attempts. No test crash or incomplete run is counted as a pass.Definitive connection refusals now discard their mutation key; a lost response or indeterminate transport/server failure keeps it for safe retry. A pending flow restored without its browser URL disables Connect; locally cached flows remain resumable, including renewal after state expiry. The GitHub App connection still uses the existing integration API; the daemon lease is not managed by Settings.
The current review repair at
e004e898c1ebc879332acf9dbf483fe2d2670e75isolates retry-key changes to the current account generation and refuses personal-team fallback under a managed-team restriction. Regression tests exercise an obsolete refusal arriving while a newer attempt is in flight, and missing/wrong managed teams making zero API calls. Exact-head focused verification and independent review are in progress.Earlier focused web run 40652260308 passed types and rendered the fixture treatments. Its image-log transport lost bytes, so those renders are not claimed as retained screenshots; the fleet captures below replace them.
Size: this remains one Accounts connection state machine, its actions, localized copy, and regression/gallery coverage (about 880 changed lines). Splitting the state from its UI and behavior tests would leave an incomplete connection flow.
No new timer or observer is introduced; the existing Settings subscription and focus lifecycle refresh the connection state. HTTP requests use the existing 15-second bounded transport.
Design: existing Accounts rows and glass, secondary descriptions, and quiet actions. Three gallery treatments (balanced, compact, inline) plus pending, empty, and disconnect-confirmation states use synthetic data. Reference: Claude's Settings session-workflow rows; no private reference screenshot is published.
Captures
Settings > Accounts opened with
accounts.show, signed out, on a fleet capture mini. Before is the merge base, after is the head build: the new GitHub group appears under the cmux account with Connect GitHub disabled until sign-in.Before (
9f6a7512cc7c, see marker below for the exact commit):Capture
steps-c31ce0cf51at940e57433514(fleet build, capture mini, text checked for private data)After:
Capture
steps-c31ce0cf51atc93b079685ba(fleet build, capture mini, text checked for private data)Viewed after image: yes
Visual verdict: The new GitHub group sits under the cmux account in Settings Accounts with the same card, spacing and button style as its neighbours in light and dark, and Connect GitHub reads as disabled until sign-in.
Verification
6a1f1cb5(fleet):GitHubConnectionsTests(with the new lost-connect pending regression),ActionEffectTests,ActionSurfaceParityTestspass.6976e112mergesfeat-cmux-nextintof218b875, resolving one conflict inActionSurfaceCatalog+MenuExemptions.swiftby keeping bothaccounts.githubConnectandsettings.customizeMenus. CI at this head and the base-red classifier decide its reds.6976e112(Sol): no blocking finding. Its two P2s land as follow-ups under the 2026-10-30 severity rule: GitHub connect: reopen a cached authorization URL when the refresh fails #28716 (reopen a cached authorization URL when the refresh fails) and GitHub connect: discard a response after an A→B→A account switch #28717 (discard a response after an A→B→A account switch).Agent session: agent session