Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
7ad5721
feat: add diff review sidebar panel
austinywang May 12, 2026
b2c36eb
merge: sync with main
austinywang May 12, 2026
a394dd5
fix: compile diff review parser
austinywang May 12, 2026
9a76641
fix: address diff review feedback
austinywang May 12, 2026
fa1baba
fix: map diff review git root errors
austinywang May 12, 2026
a893414
fix: clean up diff review observation lifecycle
austinywang May 12, 2026
81f78b8
test: cover diff review load cancellation
austinywang May 24, 2026
74831f9
fix: harden diff review refresh lifecycle
austinywang May 24, 2026
53114c9
fix: tighten diff review visibility refresh
austinywang May 24, 2026
e86b0fe
Merge remote-tracking branch 'origin/main' into issue-609-diff-review…
austinywang May 24, 2026
9d4b236
fix: localize right sidebar CLI help
austinywang May 24, 2026
10bbd40
fix: address diff review follow-up feedback
austinywang May 24, 2026
1785656
fix: address diff review bot feedback
austinywang May 24, 2026
e28f5d0
fix: close git pipe writers after launch
austinywang May 24, 2026
2a6a53b
fix: track cancellable diff review reverts
austinywang May 24, 2026
8449ad4
fix: localize diff review panel strings
austinywang May 24, 2026
b2efef6
test: cover branch diff working tree changes
austinywang May 24, 2026
a6e73f4
fix: include working tree in branch review diff
austinywang May 24, 2026
d8a3f7e
fix: compile branch diff regression test
austinywang May 24, 2026
72de5f6
fix: use diff review line text in regression
austinywang May 24, 2026
39fd20d
fix: preserve diff review during transient failures
austinywang May 24, 2026
679af0d
test: cover staged hunk revert
austinywang May 24, 2026
63692bf
fix: revert staged diff review hunks
austinywang May 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 39 additions & 37 deletions CLI/cmux.swift
Original file line number Diff line number Diff line change
Expand Up @@ -13150,33 +13150,33 @@ struct CMUXCLI {
cmux sidebar-state --workspace workspace:2
"""
case "right-sidebar":
return String(localized: "cli.rightSidebar.usage", defaultValue: """
Usage: cmux right-sidebar <command> [flags]

Control the right sidebar from the CLI.

Commands:
toggle Toggle right sidebar visibility
show Show the right sidebar
hide Hide the right sidebar
focus Focus the current right sidebar mode
set <files|find|vault|sessions|feed|dock>
Show, switch mode, and focus
mode Print {"visible":bool,"mode":string}
files|find|vault|sessions|feed|dock
Alias for show + set + focus

Flags:
--workspace <id|ref|index> Target the window containing a workspace
--window <id|ref|index> Target a window
--no-focus With set, switch mode without moving focus

Examples:
cmux right-sidebar toggle
cmux right-sidebar set find
cmux right-sidebar set vault --no-focus
cmux right-sidebar mode
""")
return [
String(localized: "cli.rightSidebar.usage.header", defaultValue: "Usage: cmux right-sidebar <command> [flags]"),
"",
String(localized: "cli.rightSidebar.usage.description", defaultValue: "Control the right sidebar from the CLI."),
"",
String(localized: "cli.rightSidebar.usage.commandsHeader", defaultValue: "Commands:"),
String(localized: "cli.rightSidebar.usage.command.toggle", defaultValue: " toggle Toggle right sidebar visibility"),
String(localized: "cli.rightSidebar.usage.command.show", defaultValue: " show Show the right sidebar"),
String(localized: "cli.rightSidebar.usage.command.hide", defaultValue: " hide Hide the right sidebar"),
String(localized: "cli.rightSidebar.usage.command.focus", defaultValue: " focus Focus the current right sidebar mode"),
String(localized: "cli.rightSidebar.usage.command.set", defaultValue: " set <files|find|vault|sessions|review|diff|feed|dock>"),
String(localized: "cli.rightSidebar.usage.command.set.description", defaultValue: " Show, switch mode, and focus"),
String(localized: "cli.rightSidebar.usage.command.mode", defaultValue: #" mode Print {"visible":bool,"mode":string}"#),
String(localized: "cli.rightSidebar.usage.command.alias", defaultValue: " files|find|vault|sessions|review|diff|feed|dock"),
String(localized: "cli.rightSidebar.usage.command.alias.description", defaultValue: " Alias for show + set + focus"),
"",
String(localized: "cli.rightSidebar.usage.flagsHeader", defaultValue: "Flags:"),
String(localized: "cli.rightSidebar.usage.flag.workspace", defaultValue: " --workspace <id|ref|index> Target the window containing a workspace"),
String(localized: "cli.rightSidebar.usage.flag.window", defaultValue: " --window <id|ref|index> Target a window"),
String(localized: "cli.rightSidebar.usage.flag.noFocus", defaultValue: " --no-focus With set, switch mode without moving focus"),
"",
String(localized: "cli.rightSidebar.usage.examplesHeader", defaultValue: "Examples:"),
String(localized: "cli.rightSidebar.usage.example.toggle", defaultValue: " cmux right-sidebar toggle"),
String(localized: "cli.rightSidebar.usage.example.setReview", defaultValue: " cmux right-sidebar set review"),
String(localized: "cli.rightSidebar.usage.example.setVaultNoFocus", defaultValue: " cmux right-sidebar set vault --no-focus"),
String(localized: "cli.rightSidebar.usage.example.mode", defaultValue: " cmux right-sidebar mode"),
].joined(separator: "\n")
Comment thread
austinywang marked this conversation as resolved.
case "set-app-focus":
return """
Usage: cmux set-app-focus <active|inactive|clear>
Expand Down Expand Up @@ -13669,38 +13669,40 @@ struct CMUXCLI {

case "set":
guard parsed.positional.count == 2 else {
throw CLIError(message: String(localized: "cli.rightSidebar.error.setRequiresMode", defaultValue: "right-sidebar set requires a mode: files, find, vault, sessions, feed, or dock"))
throw CLIError(message: String(localized: "cli.rightSidebar.error.setRequiresMode", defaultValue: "right-sidebar set requires a mode: files, find, vault, sessions, review, diff, feed, or dock"))
}
let mode = parsed.positional[1].trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
guard isRightSidebarCLIMode(mode) else {
guard let canonicalMode = canonicalRightSidebarCLIMode(mode) else {
throw CLIError(message: String(localized: "cli.rightSidebar.error.unknownMode", defaultValue: "Unknown right-sidebar mode '\(parsed.positional[1])'"))
}
var args = ["set", mode]
var args = ["set", canonicalMode]
if parsed.noFocus {
args.append("--no-focus")
}
return args

case "files", "find", "vault", "sessions", "feed", "dock":
case "files", "find", "vault", "sessions", "review", "diff", "code-review", "code_review", "feed", "dock":
guard parsed.positional.count == 1 else {
throw CLIError(message: String(localized: "cli.rightSidebar.error.unexpectedArguments", defaultValue: "right-sidebar \(action) received unexpected arguments"))
}
guard !parsed.noFocus else {
throw CLIError(message: String(localized: "cli.rightSidebar.error.noFocusOnlySet", defaultValue: "right-sidebar: --no-focus is only valid with set"))
}
return ["set", action]
return ["set", canonicalRightSidebarCLIMode(action) ?? action]

default:
throw CLIError(message: String(localized: "cli.rightSidebar.error.unknownCommand", defaultValue: "Unknown right-sidebar command '\(action)'"))
}
}

private func isRightSidebarCLIMode(_ value: String) -> Bool {
private func canonicalRightSidebarCLIMode(_ value: String) -> String? {
switch value {
case "files", "find", "vault", "sessions", "feed", "dock":
return true
case "files", "find", "vault", "sessions", "review", "diff", "feed", "dock":
Comment thread
cursor[bot] marked this conversation as resolved.
return value
case "code-review", "code_review":
return "review"
default:
return false
return nil
}
}

Expand Down Expand Up @@ -29559,7 +29561,7 @@ export default function cmuxPiSessionExtension(pi: ExtensionAPI) {
open-notification --id <uuid>
jump-to-unread
clear-notifications [--workspace <id|ref|index>] [--window <id|ref|index>]
right-sidebar <toggle|show|hide|focus|set|mode|files|find|vault|sessions|feed|dock> [--workspace <id|ref|index>] [--window <id|ref|index>] [--no-focus]
right-sidebar <toggle|show|hide|focus|set|mode|files|find|vault|sessions|review|diff|feed|dock> [--workspace <id|ref|index>] [--window <id|ref|index>] [--no-focus]
set-status <key> <value> [--workspace <id|ref|index>] [--window <id|ref|index>] [--icon <name>] [--color <#hex>] [--priority <n>]
clear-status <key> [--workspace <id|ref|index>] [--window <id|ref|index>]
list-status [--workspace <id|ref|index>] [--window <id|ref|index>]
Expand Down
Loading
Loading