Skip to content

Add reversible Zen Mode - #8249

Closed
lawrencecchen wants to merge 8 commits into
mainfrom
feat-zen-mode
Closed

lawrencecchen wants to merge 8 commits into
mainfrom
feat-zen-mode

Conversation

@lawrencecchen

@lawrencecchen lawrencecchen commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • add VS Code-compatible ⌘K Z Zen Mode across shortcuts, Settings, View menu, and command palette
  • hide the left sidebar, enable Minimal Mode and the remembered session width cap, then enter native full screen
  • restore only state changed by Zen Mode, including interrupted-session recovery
  • document the configurable shortcut and localize English and Japanese UI

Depends on and includes #8222.

Verification

UI preflight is UNVERIFIED. Launching the final zenmd build with session restore disabled reproduces Combine/Publisher+AsyncSequence.swift:112: Received an output without requesting demand before the Zen shortcut can run. The merged dependency tag swcap reproduces it, and the fix is tracked in #8231.

The required Vercel preview remains queued with no reported build error.


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


Summary by cubic

Adds a reversible Zen Mode matching VS Code’s ⌘K, Z. It hides the left sidebar, enables Minimal Mode and a content width cap, and enters full screen; on toggle, quit, or relaunch it restores only what Zen changed, with durable crash recovery that restores the sidebar when the original window returns.

  • New Features
    • Adds ZenModeController to toggle Zen Mode and track only the state it changes; restores on quit/window close and before termination/relaunch; durably captures sidebar recovery across restarts until the target window is recreated.
    • Adds “Toggle Zen Mode” in the Command Palette and View menu; default shortcut is ⌘K, Z and is configurable in Settings.
    • Improves chorded shortcut lifecycle: 1s timeout; mismatched or expired chords replay the prefix to the original window; supports shared prefixes across built‑in and custom chords; keeps Quit responsive.
    • Adds English and Japanese labels, plus web shortcut docs and cmux.schema.json updates.

Written for commit 188ff44. Summary will update on new commits.

Review in cubic

Summary by CodeRabbit

  • New Features
    • Added Zen Mode with reversible “focus” presentation, restoring full-screen/sidebar state and editor/content width when applicable.
    • Added “Toggle Zen Mode” to the app menu and Command Palette, including Settings support and a default two-step shortcut (Cmd+K, then Z).
  • Bug Fixes
    • Improved two-stroke shortcut chord handling: on mismatch or timeout, the app now replays the correct prefix event to the intended window.
  • Documentation
    • Added English/Japanese localized command and shortcut labels, plus restore-behavior guidance.
  • Tests
    • Added Zen Mode and shortcut-routing test coverage.

@coderabbitai

coderabbitai Bot commented Jul 16, 2026 •

Copy link
Copy Markdown

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 app-wide Zen Mode session management with reversible workspace settings, lifecycle recovery, command-palette and menu actions, a Cmd+K then Z shortcut, localization, configuration support, and tests.

Changes

Zen Mode

Layer / File(s) Summary
Zen Mode session and recovery controller
Sources/ZenModeController.swift
Manages Zen sessions, applies presentation and content-width settings, and restores persisted values after ending or interruption.
Application lifecycle, toggle integration, and chord routing
Sources/AppDelegate.swift
Connects Zen Mode to window targeting, termination, sidebar/fullscreen state, shortcut dispatch, chord expiration, and fallback event delivery.
Commands, shortcuts, and configuration surfaces
Sources/KeyboardShortcutSettings.swift, Sources/ContentView.swift, Sources/cmuxApp.swift, Packages/macOS/CmuxSettings/..., Resources/Localizable.xcstrings, web/data/*
Adds localized commands, menu actions, default shortcut metadata, shortcut documentation, and schema support.
Controller validation and project wiring
cmuxTests/*, cmux.xcodeproj/project.pbxproj
Registers implementation and test files and validates recovery, shortcut configuration, and chord fallback behavior.

Estimated code review effort: 4 (Complex) | ~45 minutes

Sequence Diagram(s)

sequenceDiagram
  participant ShortcutOrCommand
  participant AppDelegate
  participant ZenModeController
  participant UserDefaults
  participant WindowUI
  ShortcutOrCommand->>AppDelegate: toggleZenMode(preferredWindow)
  AppDelegate->>ZenModeController: begin or end session
  ZenModeController->>UserDefaults: persist or restore settings
  AppDelegate->>WindowUI: update sidebar and fullscreen state
Loading

Possibly related PRs

  • manaflow-ai/cmux#4442: Both modify shortcut-routing state and chord lifecycle handling in Sources/AppDelegate.swift.

Suggested reviewers: austinywang

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 5.71% 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 description covers summary and verification, but it is missing required template sections like Testing, Demo Video, Review Trigger, and Checklist. Add the missing template sections: Testing, Demo Video URL or attachment, Review Trigger block, and the Checklist items while keeping the current summary and verification details.
✅ Passed checks (3 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.
Title check ✅ Passed The title is concise and accurately captures the main change: adding reversible Zen Mode.
✨ 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-zen-mode

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.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 353c5a5d85

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/KeyboardShortcutSettings.swift
Comment thread Sources/KeyboardShortcutSettings.swift
Comment thread Sources/ZenModeController.swift Outdated

@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: 3

🤖 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 `@cmux.xcodeproj/project.pbxproj`:
- Line 4324: Correct the PBXBuildFile references in
cmux.xcodeproj/project.pbxproj: at lines 4324 and 5742, update the Sources-phase
entries to use C71600010000000000000001 and C71610010000000000000001
respectively instead of the corresponding PBXFileReference IDs.

In `@cmuxTests/ZenModeControllerTests.swift`:
- Around line 127-133: Convert ZenModeControllerTests to a final class with
stored defaultsSuiteName and defaults properties, initializing the unique
UserDefaults suite in init and removing the makeDefaults helper and per-test
makeDefaults calls. Add deinit cleanup for the same suite using the appropriate
UserDefaults instance, while preserving the existing test behavior and allowing
tests to use self.defaults directly.

In `@Sources/KeyboardShortcutSettings.swift`:
- Line 208: Add translations for command.toggleZenMode.title in
Resources/Localizable.xcstrings for every supported locale currently missing a
localized value, preserving the existing en and ja translations and the default
English fallback.
🪄 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: 9d918d8a-1208-4324-91d3-cdf08aadf969

📥 Commits

Reviewing files that changed from the base of the PR and between 14effdc and 353c5a5.

📒 Files selected for processing (10)
  • Resources/Localizable.xcstrings
  • Sources/AppDelegate.swift
  • Sources/ContentView.swift
  • Sources/KeyboardShortcutSettings.swift
  • Sources/ZenModeController.swift
  • Sources/cmuxApp.swift
  • cmux.xcodeproj/project.pbxproj
  • cmuxTests/ZenModeControllerTests.swift
  • web/data/cmux-shortcuts.ts
  • web/data/cmux.schema.json

Comment thread cmux.xcodeproj/project.pbxproj
Comment thread cmuxTests/ZenModeControllerTests.swift Outdated
Comment thread Sources/KeyboardShortcutSettings.swift
@greptile-apps

greptile-apps Bot commented Jul 16, 2026 •

Copy link
Copy Markdown
Contributor

Greptile Summary

Adds reversible Zen Mode with VS Code-compatible ⌘K Z across shortcuts, the View menu, Command Palette, and Settings. Entry hides the left sidebar, enables Minimal Mode and the content width cap, then enters native full screen; exit and crash-recovery paths restore only the state Zen Mode changed. The PR also refactors chorded shortcut handling to support shared prefixes between built-in and custom chords and adds a 1-second timeout that replays the prefix to the origin window on expiry or mismatch.

  • ZenModeController: new @MainActor class that owns the settings ledger; records UserDefaults recovery keys on begin() and restores only still-Zen values on end() or crash replay, with a separate sidebar-visibility ledger for interrupted-session recovery.
  • Chord handling refactor: armConfiguredShortcutChordIfNeeded now coalesces built-in and custom chord actions in one pass, tracks all valid second strokes for a shared prefix, and replays the prefix via NSWindow.sendEvent (bypassing local monitors) on timeout or mismatch.
  • Web/schema: cmux-shortcuts.ts documents the new two-stroke shortcut with en/ja descriptions and a restore-behavior note; cmux.schema.json adds "toggleZenMode" to the action enum.

Confidence Score: 5/5

Safe to merge; the Zen Mode state machine, recovery ledger, and chord-timeout refactor are all correct and well-tested.

ZenModeController correctly uses guard-let local-copy semantics so end() returns the pre-nil session, guards restoration with current-value equality checks to avoid overwriting user changes made while Zen is active, and separates sidebar crash-recovery from global-settings recovery. The chord-expiry refactor avoids double-delivery via a UUID-based guard between the RunLoop timer and the inline key-event check, and uses NSWindow.sendEvent to replay the prefix so local event monitors are not re-triggered. All termination paths are wired to restoreForTermination(), and window-close hooks call endIfTargeting to clean up the session when the target window disappears.

No files require special attention.

Important Files Changed

Filename Overview
Sources/ZenModeController.swift New @mainactor class owning the Zen Mode settings ledger; correctly uses guard-let local-copy semantics in end(), guards restoration with current-value checks to avoid overwriting user changes, and separates sidebar crash-recovery from global-settings recovery.
Sources/AppDelegate.swift Adds zenModeController as a private stored property, wires begin/end into the shortcut handler and window-close/termination paths, and refactors armConfiguredShortcutChordIfNeeded to unify built-in + custom chord actions with a UUID-guarded RunLoop.main timer for expiry replay.
cmuxTests/ZenModeControllerTests.swift Comprehensive Swift Testing suite covering normal entry/exit, preservation of already-matching state, user-change non-overwrite, two-stage crash recovery, termination ledger, and shortcut registration; uses isolated UserDefaults suite per test.
cmuxTests/AppDelegateShortcutRoutingTests.swift Adds three new chord-routing tests (mismatch replay, timeout replay, shared-prefix acceptance) using a recording NSWindow subclass; real 1.5-second waitFor is appropriate since it tests a production 1-second timer.
Sources/ContentView.swift Registers palette.toggleZenMode in the Command Palette with correct localized title, subtitle, and keywords; falls back to NSSound.beep() when no eligible window is found.
Sources/cmuxApp.swift Adds Toggle Zen Mode to the View menu via splitCommandButton with the configured shortcut display; consistent with the existing fullscreen entry pattern.
Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/ShortcutAction.swift Adds toggleZenMode case to the app group, settings-visible actions, and the localized display name via String(localized:defaultValue:).
Resources/Localizable.xcstrings Adds command.toggleZenMode.title with en and ja translations; per team convention only English and Japanese are supported locales.
web/data/cmux-shortcuts.ts Documents the two-stroke Zen Mode shortcut with en/ja description, a restore-behavior note, and configValue; consistent with adjacent entries.

Sequence Diagram

%%{init: {'theme': 'neutral'}}%%
sequenceDiagram
    participant User
    participant EventMonitor as AppDelegate (Event Monitor)
    participant Chord as Chord Handler
    participant ZMC as ZenModeController
    participant UD as UserDefaults
    participant Win as NSWindow

    User->>EventMonitor: Cmd+K (prefix)
    EventMonitor->>Chord: armConfiguredShortcutChordIfNeeded
    Chord->>Chord: Set pendingChord + start 1s Timer
    Chord-->>EventMonitor: true (consumed)

    alt Within 1s: correct suffix Z arrives
        User->>EventMonitor: Z (suffix)
        EventMonitor->>Chord: resolvePendingConfiguredShortcutChord
        Chord->>Chord: cancel timer, clear pending
        Chord-->>EventMonitor: activeChordPrefix set
        EventMonitor->>ZMC: begin(windowID, isSidebarVisible, isFullScreen)
        ZMC->>UD: write recovery keys
        ZMC-->>EventMonitor: Session
        EventMonitor->>Win: toggleFullScreen(nil)
    else Timeout or mismatch
        Chord->>Win: sendEvent(prefixEvent)
    end

    User->>EventMonitor: Cmd+K Z (toggle off)
    EventMonitor->>ZMC: end()
    ZMC->>UD: restore settings if unchanged
    ZMC->>UD: clearRecoveryState
    ZMC-->>EventMonitor: Session
    EventMonitor->>Win: restore sidebar and fullscreen
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
sequenceDiagram
    participant User
    participant EventMonitor as AppDelegate (Event Monitor)
    participant Chord as Chord Handler
    participant ZMC as ZenModeController
    participant UD as UserDefaults
    participant Win as NSWindow

    User->>EventMonitor: Cmd+K (prefix)
    EventMonitor->>Chord: armConfiguredShortcutChordIfNeeded
    Chord->>Chord: Set pendingChord + start 1s Timer
    Chord-->>EventMonitor: true (consumed)

    alt Within 1s: correct suffix Z arrives
        User->>EventMonitor: Z (suffix)
        EventMonitor->>Chord: resolvePendingConfiguredShortcutChord
        Chord->>Chord: cancel timer, clear pending
        Chord-->>EventMonitor: activeChordPrefix set
        EventMonitor->>ZMC: begin(windowID, isSidebarVisible, isFullScreen)
        ZMC->>UD: write recovery keys
        ZMC-->>EventMonitor: Session
        EventMonitor->>Win: toggleFullScreen(nil)
    else Timeout or mismatch
        Chord->>Win: sendEvent(prefixEvent)
    end

    User->>EventMonitor: Cmd+K Z (toggle off)
    EventMonitor->>ZMC: end()
    ZMC->>UD: restore settings if unchanged
    ZMC->>UD: clearRecoveryState
    ZMC-->>EventMonitor: Session
    EventMonitor->>Win: restore sidebar and fullscreen
Loading

Reviews (5): Last reviewed commit: "Keep interrupted Zen sidebar recovery du..." | Re-trigger Greptile

Comment thread Sources/ZenModeController.swift
Comment thread Resources/Localizable.xcstrings

@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

Caution

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

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

6538-6577: 🎯 Functional Correctness | 🟠 Major | 🏗️ Heavy lift

Own fullscreen transitions explicitly before clearing Zen recovery state.

toggleFullScreen is asynchronous, but restoration trusts the current style mask. A rapid second toggle can end Zen before fullscreen entry completes, and termination can save the snapshot before fullscreen exit completes, leaving the window or next-launch snapshot in Zen fullscreen state.

  • Sources/AppDelegate.swift#L6538-L6577: track the desired fullscreen state and reconcile it from window fullscreen lifecycle callbacks rather than conditionally toggling from the instantaneous style mask.
  • Sources/AppDelegate.swift#L1985-L1987: do not clear the recovery ledger or persist the termination snapshot until the same owner has produced the canonical non-Zen window snapshot.

Based on coding guidelines, “Keep SwiftUI or AppKit bridge UI lifecycle under one explicit MainActor owner” and do not patch lifecycle races with delays or side channels.

🤖 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/AppDelegate.swift` around lines 6538 - 6577, Update toggleZenMode and
restoreZenModeWindowState to let one explicit MainActor owner track the desired
fullscreen state and reconcile transitions through window fullscreen lifecycle
callbacks, rather than relying on the instantaneous styleMask or delayed
toggles. At Sources/AppDelegate.swift lines 6538-6577, ensure rapid enter/exit
operations converge to the canonical non-Zen state; at lines 1985-1987, retain
the recovery ledger and termination snapshot until that same owner has produced
and persisted the canonical non-Zen window snapshot.

Source: Coding guidelines

🤖 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/AppDelegate.swift`:
- Around line 15250-15257: Update the configured shortcut chord expiration flow
around configuredShortcutChordTimeoutTask to remove the Task.sleep-based delay
and rely on the shortcut router’s explicit deadline or expiration signal
instead. Have the router own chord lifecycle and invoke
expireConfiguredShortcutChord for the matching pending chord, preserving
cancellation and weak-self behavior without adding another timer or polling
loop.

---

Outside diff comments:
In `@Sources/AppDelegate.swift`:
- Around line 6538-6577: Update toggleZenMode and restoreZenModeWindowState to
let one explicit MainActor owner track the desired fullscreen state and
reconcile transitions through window fullscreen lifecycle callbacks, rather than
relying on the instantaneous styleMask or delayed toggles. At
Sources/AppDelegate.swift lines 6538-6577, ensure rapid enter/exit operations
converge to the canonical non-Zen state; at lines 1985-1987, retain the recovery
ledger and termination snapshot until that same owner has produced and persisted
the canonical non-Zen window snapshot.
🪄 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: 8488344b-1e06-458f-93a8-2c445ee2cee6

📥 Commits

Reviewing files that changed from the base of the PR and between 353c5a5 and 94c97e8.

📒 Files selected for processing (6)
  • Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/ShortcutAction+Defaults.swift
  • Packages/macOS/CmuxSettings/Sources/CmuxSettings/Values/ShortcutAction.swift
  • Sources/AppDelegate.swift
  • Sources/ZenModeController.swift
  • cmuxTests/AppDelegateShortcutRoutingTests.swift
  • cmuxTests/ZenModeControllerTests.swift

Comment thread Sources/AppDelegate.swift Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 94c97e827a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/AppDelegate.swift Outdated

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 57dbb07515

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/AppDelegate.swift
Comment thread Sources/AppDelegate.swift
@cursor

cursor Bot commented Jul 16, 2026

Copy link
Copy Markdown

Bugbot is paused — on-demand spend limit reached

Bugbot 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.

@chatgpt-codex-connector chatgpt-codex-connector 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.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3e202b49f6

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread Sources/ZenModeController.swift Outdated
@lawrencecchen lawrencecchen added the stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening. label Sep 23, 2026
@github-project-automation github-project-automation Bot moved this from Todo to Done in cmux backlog Sep 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

stale-revisit Closed after 30+ days without activity; preserved for possible revisit or reopening.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants