Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
293 commits
Select commit Hold shift + click to select a range
04870c7
fix: show markdown copy check indicator
austinywang May 26, 2026
38c6c66
merge: resolve conflicts with main
austinywang May 26, 2026
136ceb6
Add customizable tab bar more menu
lawrencecchen May 31, 2026
44aebed
Refine pane tab bar more customization
lawrencecchen May 31, 2026
7d13f37
Add pane tab bar settings section
lawrencecchen Jun 1, 2026
139f91a
Index pane tab bar settings aliases
lawrencecchen Jun 1, 2026
c22f6ae
feat(notes): file icon, always-create, context resolution, overflow menu
austinywang Jun 1, 2026
6113627
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 1, 2026
958561b
fix: wire CMUXAgentLaunch Codex/SessionResolver files into cmux-cli a…
austinywang Jun 1, 2026
93b5dd4
fix: resolve note panel before XCTUnwrap in async regression test
austinywang Jun 1, 2026
6027d44
feat(tabbar): add Diff to the surface tab-bar overflow menu
austinywang Jun 1, 2026
59c8eb1
feat(notes): auto-save note edits; simplify markdown panel header
austinywang Jun 3, 2026
422209a
Merge PR #5041 (customizable tab bar more menu) into issue-4331 notes
austinywang Jun 3, 2026
a09f54a
Merge origin/main into issue-4331-note-surface-type
austinywang Jun 3, 2026
d582cc3
merge: sync origin/main (6 commits: APNs push, guarded working dirs)
austinywang Jun 3, 2026
ea36258
fix: address Codex review findings (menu test, note path safety, auto…
austinywang Jun 3, 2026
d4db143
fix: address Codex round-2 findings (note CLI routing, diff cwd, logg…
austinywang Jun 3, 2026
9a10f91
fix: surface corrupt note index instead of an empty list
austinywang Jun 3, 2026
b3fc3b2
fix(xcodeproj): de-duplicate corrupted project.pbxproj entries
austinywang Jun 4, 2026
c0d89d0
Merge origin/main into issue-4331-note-surface-type
austinywang Jun 4, 2026
978b096
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jun 5, 2026
66ff8a3
feat(notes): per-workspace Notes sidebar tree + sessions-as-folders +…
austinywang Jun 5, 2026
aa62355
merge: resolve conflicts with main (note v2 commands + pbxproj entries)
austinywang Jun 5, 2026
7e13cef
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 5, 2026
8451f4e
fix(notes): resolve CMUX_WORKSPACE_NOTES_DIR across all windows
austinywang Jun 5, 2026
fa2ef17
feat(notes): vault-style session rows, cwd-keyed folders, non-draggab…
austinywang Jun 6, 2026
27ec550
fix(notes): de-lag Notes tab, expand-by-default, all agents, draggabl…
austinywang Jun 8, 2026
23a8c45
merge: resolve conflicts with main (settings sections, v2 dispatch po…
austinywang Jun 8, 2026
f3b1741
feat(notes): Files-style Notes tab with live workspace sessions
austinywang Jun 10, 2026
3a73cd9
feat(notes): scope Notes tab per workspace; nest pane notes under ses…
austinywang Jun 10, 2026
9738e0d
merge: resolve conflicts with main (sidebar shortcut loop, pbxproj en…
austinywang Jun 10, 2026
1024f77
feat(notes): vault-parity session rows, observation retries, markdown…
austinywang Jun 10, 2026
8e2cdcc
fix(notes): strict workspace session scoping + review feedback
austinywang Jun 10, 2026
ef82ecb
fix: normalize pbxproj after hand-wired test entries
austinywang Jun 10, 2026
317a100
chore: refresh Swift file length budget for notes feature growth
austinywang Jun 10, 2026
1fbe7a9
fix(notes): attribute sessions by pane TTY + harden session/move boun…
austinywang Jun 10, 2026
ce67df3
fix(tests): update RightSidebarPanelView fixture for two-arg onOpenNote
austinywang Jun 10, 2026
50719e7
ci: retrigger after dropped webhook delivery
austinywang Jun 10, 2026
8313309
fix(uitests): restore ensureForegroundAfterLaunch lost in merge
austinywang Jun 10, 2026
caef874
fix(notes): resolve symlinks in confinement checks; refresh note CLI …
austinywang Jun 10, 2026
f8f2db9
fix(notes): restore claude resume hook wrapper; delete flat notes via…
austinywang Jun 10, 2026
54960b0
chore: refresh Swift file length budget for restored AgentResumeArgv
austinywang Jun 10, 2026
e80cf70
fix: wire claude restore through hook wrapper; close-time note flush;…
austinywang Jun 10, 2026
905ee41
feat(notes): hookless agent attribution, visible-tab refresh, title s…
austinywang Jun 10, 2026
f1be6e8
feat(notes): split-right surface notes, index-aware flat-note moves, …
austinywang Jun 10, 2026
1ce19c8
fix(notes): feedback round — cancellable retry, localized tab-bar docs
austinywang Jun 10, 2026
a510ec3
fix(notes): retarget drops on note rows to their parent; dedupe in-ro…
austinywang Jun 10, 2026
6492bd3
fix(notes): make in-sidebar note drags move-only
austinywang Jun 10, 2026
7e4e5b4
fix(notes): stop per-pass lastSeen churn from reloading the tree; dra…
austinywang Jun 10, 2026
eb3612a
fix(notes): drop .fileURL from note drags so the sidebar outline rece…
austinywang Jun 10, 2026
949e8a0
fix(notes): open markdown panels follow note moves instead of going u…
austinywang Jun 10, 2026
8352140
feat(notes): note drags open on panes again while staying sidebar-mov…
austinywang Jun 10, 2026
1fe89d1
feat(notes): move Notes tab right of Vault behind a beta switch
austinywang Jun 10, 2026
158bf63
fix(notes): route file-bearing drags to the Notes tree through the fi…
austinywang Jun 10, 2026
eb44593
feat(notes): indent guides in the Notes tree
austinywang Jun 10, 2026
b654a30
merge: resolve origin/main (regenerated budget TSV; bonsplit pointer …
austinywang Jun 10, 2026
2a90a3f
chore(notes): strip temporary drag-initiation probes; refresh length …
austinywang Jun 10, 2026
e0fe3a4
fix(notes): anchor indent guides to the outline's real cell geometry
austinywang Jun 10, 2026
0fe0ca6
fix(notes): keep the note index and restore paths correct across tree…
austinywang Jun 10, 2026
2b211b7
fix(merge): restore main features dropped across historical merge res…
austinywang Jun 11, 2026
f48d23c
fix(notes): case-only renames stay in place instead of self-colliding
austinywang Jun 11, 2026
f75366b
fix(notes): never traverse symlinks in the tree; fix palette tests fo…
austinywang Jun 11, 2026
2f2e2bf
fix(notes): body-path confinement can no longer hand back the escapin…
austinywang Jun 11, 2026
6b390bc
chore: refresh swift file length budget for notes fixes
austinywang Jun 11, 2026
83cabf9
fix(docs): localize the surface tab-bar section heading and copy
austinywang Jun 11, 2026
a1dff80
fix(notes): refuse a symlinked .cmux/notes as the containment root
austinywang Jun 11, 2026
a1e70c5
merge: resolve origin/main (CLI usage examples; respliced catalog key…
austinywang Jun 11, 2026
64b7388
chore: refresh swift file length budget after merge
austinywang Jun 11, 2026
a6895ad
fix(notes): reject symlinked per-workspace note roots everywhere they…
austinywang Jun 11, 2026
a13bea2
fix(shortcuts): give the Notes sidebar shortcut priority routing and …
austinywang Jun 11, 2026
111040b
merge: resolve origin/main (cloexec, sidebar pixel-align, sidebar cap…
austinywang Jun 11, 2026
537b517
fix(notes): scrub generated SVG output; gate Notes binding behind the…
austinywang Jun 11, 2026
6992210
fix(cli): stop compiling CMUXAgentLaunch sources into the CLI target
austinywang Jun 11, 2026
762a4b6
perf(notes): bound the live-refresh session-folder walk
austinywang Jun 11, 2026
75c440f
fix(notes): note classification requires a trusted, canonical, non-sy…
austinywang Jun 11, 2026
25003a8
perf(notes): bound the live-session scan fan-out per refresh tick
austinywang Jun 11, 2026
2f6ddf3
fix(notes): keep index records when trashing a note fails
austinywang Jun 11, 2026
cc75dd1
fix(notes): gate Notes-tree mode shortcuts through configured when cl…
austinywang Jun 11, 2026
d7663a9
fix(notes): only prune session folders containing exactly the marker
austinywang Jun 11, 2026
ab928f2
style(notes): drop the indent guides; match the Files tree look
austinywang Jun 11, 2026
a30375c
feat(notes): rename index-owned flat notes by retitling their record
austinywang Jun 11, 2026
9f0dd8d
docs(skills): teach cmux-notes scope order and the flat-note boundary
austinywang Jun 11, 2026
73728e2
docs(skills): zsh-safe discovery and home-store fallback in cmux-notes
austinywang Jun 12, 2026
9246d1d
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jun 12, 2026
5c15007
feat(notes): gate all note entrypoints behind the beta flag; inline t…
austinywang Jun 12, 2026
3d18bf3
feat(notes): every terminal is a Notes-tree folder with a pointer to …
austinywang Jun 13, 2026
6dc398f
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 13, 2026
babecaa
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 13, 2026
d5f6eca
fix(notes): adopt two-parameter onChange for the notes beta toggle
austinywang Jun 13, 2026
bc1c87b
Update notes surface pane behavior
austinywang Jun 14, 2026
fad1e0b
Merge origin/main into notes surface PR
austinywang Jun 14, 2026
561852d
Keep note RPCs independent of sidebar beta
austinywang Jun 14, 2026
c40ea5b
Merge origin/main into notes surface PR
austinywang Jun 14, 2026
5372ff0
Notes surface PR review fixes: index-first FS ordering, list error sh…
austinywang Jun 14, 2026
c827498
Merge origin/main into notes surface PR
austinywang Jun 14, 2026
50d8d2f
Merge origin/main (fc9104e88) into notes surface PR
austinywang Jun 14, 2026
a40a8c7
Notes review fixes: cancel visibilityRefreshTask in clear(); drop red…
austinywang Jun 14, 2026
51a04c0
Merge origin/main (baec5256c) into notes surface PR
austinywang Jun 14, 2026
2748fde
Merge origin/main into issue-4331-note-surface-type
austinywang Jun 14, 2026
d01cbc4
fix: build notes tree off main thread
austinywang Jun 14, 2026
d8924a2
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 14, 2026
9d3cb66
fix: avoid detached blocking pane process lookup
austinywang Jun 14, 2026
b76c0ad
chore: refresh Swift file length budget
austinywang Jun 14, 2026
93abe8f
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 15, 2026
729db74
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 15, 2026
d9fe230
fix: reject duplicate surface tab bar menu ids
austinywang Jun 15, 2026
1c170cd
fix: avoid stale notes scans and blocking diff preflight
austinywang Jun 15, 2026
6cf35ab
fix: limit sidebar drop deferral to visible bounds
austinywang Jun 15, 2026
b936a93
fix: keep remote process pipe readers isolated
austinywang Jun 15, 2026
fd2ba86
merge: sync with origin main
austinywang Jun 15, 2026
d871baa
fix: address note restore and delete review findings
austinywang Jun 15, 2026
2d4ce39
merge: sync with origin main
austinywang Jun 15, 2026
619b315
fix: bound markdown math delimiter scans
austinywang Jun 15, 2026
74ad6b9
fix: harden notes restore and drag trust
austinywang Jun 15, 2026
eacbb55
fix: keep note delete transactional
austinywang Jun 15, 2026
4f7cbde
fix: key note sessions by agent and id
austinywang Jun 15, 2026
4b55daa
fix: align notes skill fallback root
austinywang Jun 15, 2026
1f4642f
fix: preserve note autosave after relocation
austinywang Jun 15, 2026
aee1598
test: update surface tab bar more expectation
austinywang Jun 15, 2026
e163cb3
test: await pipe read before assertion
austinywang Jun 15, 2026
9ae4a40
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 15, 2026
f2f7402
fix: harden note autosave and creation reveal
austinywang Jun 15, 2026
b5ba427
fix: preserve placeholder on note layout failure
austinywang Jun 15, 2026
36c306f
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 15, 2026
cd7ebe4
fix: conform FakeSpawnPolicyProvider to workspaceNotesDirectory after…
austinywang Jun 15, 2026
735908a
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 15, 2026
d02b734
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 16, 2026
8f9b657
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 16, 2026
443ba8c
ci(perf-activation): dump startup breadcrumbs + app stdout for diagno…
austinywang Jun 16, 2026
5f29429
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 16, 2026
2a531c6
fix(lint): allow ComposerDictationTextMerge namespace-enum
austinywang Jun 16, 2026
6f07f5d
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jun 16, 2026
b947d0e
ci(perf-activation): remove temporary breadcrumb-dump diagnostic
austinywang Jun 16, 2026
a31eac9
merge: resolve conflicts with main
austinywang Jun 18, 2026
c7211fb
fix: update agent launch project paths
austinywang Jun 18, 2026
645743b
fix: bound note index reads
austinywang Jun 18, 2026
80f1b9d
fix: use unique note reader project ids
austinywang Jun 18, 2026
376fb88
merge: resolve conflicts with main
austinywang Jun 18, 2026
bbc619d
fix: bound notes marker reads
austinywang Jun 18, 2026
22639e4
fix: atomically save trusted notes
austinywang Jun 18, 2026
4da4715
fix: link settings in cmux cli target
austinywang Jun 18, 2026
a0346ee
merge: resolve conflicts with main
austinywang Jun 18, 2026
7f6bab6
fix: update note imports after package consolidation
austinywang Jun 18, 2026
217666a
merge: sync with main
austinywang Jun 18, 2026
f5a04c8
fix: harden notes session markers
austinywang Jun 19, 2026
c05e7fe
fix: handle duplicate note index paths
austinywang Jun 19, 2026
9428ed3
merge: sync latest main
austinywang Jun 19, 2026
0f20ee7
merge: sync latest main
austinywang Jun 19, 2026
3a37e56
fix: address note sidebar review findings
austinywang Jun 19, 2026
c6033bc
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 1, 2026
9aa1f44
fix: clear cmux-policy P2 findings in Swift package sources
austinywang Jul 1, 2026
ca1c396
refactor: clear cmux policy findings across the notes feature branch
austinywang Jul 1, 2026
bc82f6c
fix: drop @ObservedObject from @Observable notes store view; determin…
austinywang Jul 1, 2026
7cf7b66
fix: bridge notes tree revision through SwiftUI; keep config test bud…
austinywang Jul 1, 2026
e46bd50
docs: record that newNote ships ungated by the Notes sidebar beta
austinywang Jul 1, 2026
232ba59
fix(cli): resolve note --surface inside the requested workspace/window
austinywang Jul 1, 2026
514c7e1
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 1, 2026
3cf1b90
fix: cap notes directory scans at the remaining node budget
austinywang Jul 1, 2026
e04d13d
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 1, 2026
b0ca1df
fix: carry the surface note anchor across detach/attach moves
austinywang Jul 2, 2026
6bd9ed9
fix: bound the session-folder refresh listing; wire noteAnchorId into…
austinywang Jul 2, 2026
c0a848c
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 2, 2026
4fb7a4e
fix: stream notes directory listings so the entry cap bounds real work
austinywang Jul 2, 2026
64cf3d9
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 2, 2026
fd8e3a7
fix: address cubic review feedback on rename rollback and test skip r…
austinywang Jul 2, 2026
5048c28
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 2, 2026
c68c8ba
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 2, 2026
99b92af
fix: route every Diff Viewer entrypoint through the shared agent-awar…
austinywang Jul 2, 2026
bfcf0df
docs: correct the cmux-notes skill's beta-gate contract
austinywang Jul 2, 2026
4139939
fix: bound the flat-note scan behind every note-store read
austinywang Jul 2, 2026
0ea756e
fix: tear down note relocation/retitle observers on markdown panel close
austinywang Jul 2, 2026
76127e7
fix: honor root cmux.json when resolving the notes project root
austinywang Jul 2, 2026
8551bca
fix: reject note body paths that alias cmux notes metadata
austinywang Jul 2, 2026
ee42ea3
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 4, 2026
6770c28
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 4, 2026
77837e6
fix: sort flat-note listings by mtime before applying the entry cap
austinywang Jul 4, 2026
72982a4
fix: reject Notes tree mutation destinations outside the workspace root
austinywang Jul 4, 2026
e6edadf
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 8, 2026
9ff079d
Add notes menu action and markdown editor line numbers
austinywang Jul 8, 2026
f149d4e
Fix surface tab bar more menu resolution
austinywang Jul 8, 2026
7fb0629
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 8, 2026
2107798
Fix right sidebar beta CLI gating
austinywang Jul 8, 2026
ce42679
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 8, 2026
a099e14
Add surface tab bar hide-more regression
austinywang Jul 8, 2026
1287e46
Respect hidden surface tab bar more button
austinywang Jul 8, 2026
f455b8d
Remove blocking diff availability probes
austinywang Jul 8, 2026
e64875f
Avoid markdown editor line number rescans
austinywang Jul 8, 2026
00a1ea3
Clarify notes menu create action
austinywang Jul 8, 2026
f8e1ef8
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 8, 2026
ee2581a
Remove duplicate note action from default more menu
austinywang Jul 8, 2026
464a68e
Show Note action in default more menu
austinywang Jul 8, 2026
7451f9c
Limit default more menu to diff and note
austinywang Jul 8, 2026
9ed8741
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 8, 2026
4e851f1
fix: restore surface tab bar duplicate menu id validation lost in merge
austinywang Jul 8, 2026
6b0d9a3
feat: Zed-style note editor with line numbers and current-line highlight
austinywang Jul 8, 2026
2d3946b
feat: expand surface tab bar more menu and refine diff icon
austinywang Jul 8, 2026
d24b10d
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Jul 8, 2026
d57e4a5
fix: scope surface tab bar Diff visibility to the pane it opens for
austinywang Jul 8, 2026
8493bfe
fix: restore menu resolution behaviors lost in merges from main
austinywang Jul 8, 2026
f4b8bac
test: window-host the wrap-vs-gutter test and cover More-id collision
austinywang Jul 8, 2026
0a63538
feat: minimalist note header and reliable title-click rename
austinywang Jul 8, 2026
4150cc6
fix: CLI right-sidebar beta gating falls back to the app defaults suite
austinywang Jul 8, 2026
24537b4
feat: drop the file icon from the note title header
austinywang Jul 8, 2026
5358725
fix: fail closed on ambiguous hookless sessions and non-note paths
austinywang Jul 8, 2026
8452c50
fix: never create a new note through a planted symlink
austinywang Jul 8, 2026
2a61801
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 8, 2026
c48566e
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 8, 2026
7592e60
fix: complete merge integration for tab agent icons
austinywang Jul 8, 2026
39e2e21
fix: note title caret no longer appears without a click
austinywang Jul 9, 2026
42e4cff
feat: Zed-style note header — static title, regular weight, find bar
austinywang Jul 9, 2026
fd47ebe
refactor: split branch additions into sub-500-line files for the budg…
Jul 9, 2026
27be0d8
Merge branch 'budget-split-4331' of /Users/austinwang/manaflow/cmuxte…
austinywang Jul 9, 2026
840d9e4
Merge origin/main into issue-4331-note-surface-type
austinywang Jul 9, 2026
184cf44
fix: address final notes review feedback
austinywang Jul 9, 2026
4045572
fix: keep file drop overlay within length budget
austinywang Jul 9, 2026
60d4993
fix: address notes autoreview findings
austinywang Jul 9, 2026
33c7ddf
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 14, 2026
af7c230
fix: advance ghostty submodule to main's pointer
austinywang Jul 14, 2026
846f349
fix: advance bonsplit submodule to main's pointer
austinywang Jul 14, 2026
81ac2fa
fix: post-merge integration — test call, focus latch, budget rows
austinywang Jul 14, 2026
80b8bfa
fix: accent-colored insertion carets in note title and body
austinywang Jul 14, 2026
791d37e
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 14, 2026
d5cad83
fix: standardize legacy-adoption workspace root paths
austinywang Jul 14, 2026
014a9c2
fix: stuck focus-flash ring and rename flicker
austinywang Jul 14, 2026
399b926
test: await the reload coalesce stage in the notes test hook
austinywang Jul 14, 2026
400b33c
fix: bump bonsplit to the tabbar-relayout-loop fix (#180)
austinywang Jul 14, 2026
5c21daa
feat: rebuild the note viewer header as a Notion-style page
austinywang Jul 14, 2026
6f35f1e
feat: one viewer for notes and markdown, with a formatting toolbar
austinywang Jul 15, 2026
952a8cf
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 15, 2026
92d1bf5
fix: keep FilePreviewTextEditor under the 500-line threshold
austinywang Jul 15, 2026
5808417
fix: rebuild project.pbxproj from main plus branch entries
austinywang Jul 15, 2026
34aef6d
fix: advance ghostty submodule to main's pointer
austinywang Jul 15, 2026
a85ef37
fix: restore notesRow closing braces lost in the settings merge
austinywang Jul 15, 2026
6016143
fix: drop pbxproj entries for files main deleted
austinywang Jul 15, 2026
edcd27c
fix: merge the duplicated dismantleNSView bodies
austinywang Jul 15, 2026
6b3f80a
fix: rewire FilePreviewTextEditor+Theme.swift after pbxproj rebuild
austinywang Jul 15, 2026
430a4fa
fix: quote the + path in the theme extension's project entry
austinywang Jul 15, 2026
aadce43
fix: adopt main's session-based text editor wholesale
austinywang Jul 15, 2026
e6ef04e
fix: drop the factory split duplicated by main's editor file
austinywang Jul 15, 2026
503f713
fix: restore SavingTextView stored state dropped with the class body
austinywang Jul 15, 2026
8164e3b
fix: clamp bonsplit tab separators to the tab height
austinywang Jul 15, 2026
c4d538b
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 15, 2026
92fe8de
fix: advance ghostty to main's pointer; restore bonsplit clamp pin
austinywang Jul 15, 2026
fab6a60
fix: remove bonsplit per-tab separators (the faint vertical line)
austinywang Jul 15, 2026
8c7c374
fix: fixed-size toolbar group dividers, clipped row
austinywang Jul 15, 2026
c70daf3
fix: no vertical marks in the formatting toolbar
austinywang Jul 15, 2026
db26b51
Merge remote-tracking branch 'origin/main' into issue-4331-note-surfa…
austinywang Jul 15, 2026
94f2197
fix: advance ghostty submodule to main's pointer
austinywang Jul 15, 2026
e9ba902
revert: markdown viewer top bar back to the original component
austinywang Jul 15, 2026
e0aeb8d
fix: notes use the same markdown icon as any .md file
austinywang Jul 15, 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
1 change: 1 addition & 0 deletions CLI/CMUXCLI+CommandSuggestions.swift
Original file line number Diff line number Diff line change
Expand Up @@ -137,6 +137,7 @@ extension CMUXCLI {
"new-window",
"new-workspace",
"next-window",
"note",
"notify",
"omc",
"omo",
Expand Down
2 changes: 1 addition & 1 deletion CLI/CMUXCLI+HermesAgentHooks.swift
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import Foundation
import CMUXAgentLaunch
import Foundation

extension CMUXCLI {
func hermesAgentShellCommand(_ script: String) -> String {
Expand Down
16 changes: 4 additions & 12 deletions CLI/CMUXCLI+ThemeSupport.swift
Original file line number Diff line number Diff line change
Expand Up @@ -431,20 +431,12 @@ extension CMUXCLI {
}

func isRightSidebarCLIMode(_ value: String) -> Bool {
switch value.lowercased() {
case "files", "find", "vault", "sessions", "feed", "dock":
return true
default:
return false
}
let normalized = value.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
return Self.availableRightSidebarModeTokens().contains(normalized)
}

func normalizedRightSidebarCLIArgument(_ value: String) -> String {
switch value.lowercased() {
case "files", "find", "vault", "sessions", "feed", "dock":
return value.lowercased()
default:
return value
}
let normalized = value.trimmingCharacters(in: .whitespacesAndNewlines).lowercased()
return isRightSidebarCLIMode(normalized) ? normalized : value
}
}
111 changes: 111 additions & 0 deletions CLI/cmux+MarkdownCommand.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
import Foundation

extension CMUXCLI {
func runMarkdownCommand(
commandArgs: [String],
client: SocketClient,
jsonOutput: Bool,
idFormat: CLIIDFormat
) throws {
var args = commandArgs

// Parse routing flags
let (workspaceOpt, argsAfterWorkspace) = parseOption(args, name: "--workspace")
let (windowOpt, argsAfterWindow) = parseOption(argsAfterWorkspace, name: "--window")
let (surfaceOpt, argsAfterSurface) = parseOption(argsAfterWindow, name: "--surface")
let (directionOpt, argsAfterDirection) = parseOption(argsAfterSurface, name: "--direction")
let (focusOpt, argsAfterFocus) = parseOption(argsAfterDirection, name: "--focus")
let (fontSizeOpt, argsAfterFontSize) = parseOption(argsAfterFocus, name: "--font-size")
args = argsAfterFontSize

let fontSize = try fontSizeOpt.map(parseMarkdownViewerFontSize)

// Determine subcommand. Explicit "open" is supported, otherwise treat
// a single positional argument as shorthand path.
let subArgs: [String]
if let first = args.first, first.lowercased() == "open" {
subArgs = Array(args.dropFirst())
} else if args.count == 1, let first = args.first, !first.hasPrefix("-") {
subArgs = [first]
} else {
// Allow path-like first tokens (e.g. plan.md) with trailing args
// so we can surface specific trailing-arg/flag errors below.
if let first = args.first, first.hasPrefix("-") {
throw CLIError(
message:
"markdown open: unknown flag '\(first)'. Usage: cmux markdown open <path> [--workspace <id|ref|index>] [--surface <id|ref|index>] [--window <id|ref|index>] [--direction right|down|left|up] [--focus <true|false>] [--font-size <points>]"
)
} else if let first = args.first, looksLikePath(first) || first.contains(".") {
subArgs = args
} else if let first = args.first {
throw CLIError(message: "Unknown markdown subcommand: \(first). Usage: cmux markdown open <path>")
} else {
subArgs = []
}
}

guard let rawPath = subArgs.first, !rawPath.isEmpty else {
throw CLIError(message: "markdown open requires a file path. Usage: cmux markdown open <path>")
}
let trailingArgs = Array(subArgs.dropFirst())
if let unknownFlag = trailingArgs.first(where: { $0.hasPrefix("-") }) {
throw CLIError(
message:
"markdown open: unknown flag '\(unknownFlag)'. Usage: cmux markdown open <path> [--workspace <id|ref|index>] [--surface <id|ref|index>] [--window <id|ref|index>] [--direction right|down|left|up] [--focus <true|false>] [--font-size <points>]"
)
}
if let extraArg = trailingArgs.first {
throw CLIError(
message:
"markdown open: unexpected argument '\(extraArg)'. Usage: cmux markdown open <path> [--workspace <id|ref|index>] [--surface <id|ref|index>] [--window <id|ref|index>] [--direction right|down|left|up] [--focus <true|false>] [--font-size <points>]"
)
}

let absolutePath = resolvePath(rawPath)

// Build params
let direction = directionOpt ?? "right"
var params: [String: Any] = ["path": absolutePath, "direction": direction]
if let fontSize {
params["font_size"] = fontSize
}
if let surfaceRaw = surfaceOpt {
if let surface = try normalizeSurfaceHandle(surfaceRaw, client: client) {
params["surface_id"] = surface
}
}
let workspaceRaw = workspaceOpt ?? (windowOpt == nil ? ProcessInfo.processInfo.environment["CMUX_WORKSPACE_ID"] : nil)
if let workspaceRaw {
if let workspace = try normalizeWorkspaceHandle(workspaceRaw, client: client) {
params["workspace_id"] = workspace
}
}
if let windowRaw = windowOpt {
if let window = try normalizeWindowHandle(windowRaw, client: client) {
params["window_id"] = window
}
}
try applyFocusOption(focusOpt, defaultValue: false, to: &params)

let payload = try client.sendV2(method: "markdown.open", params: params)

if jsonOutput {
print(jsonString(formatIDs(payload, mode: idFormat)))
} else {
let surfaceText = formatHandle(payload, kind: "surface", idFormat: idFormat) ?? "unknown"
let paneText = formatHandle(payload, kind: "pane", idFormat: idFormat) ?? "unknown"
let filePath = (payload["path"] as? String) ?? absolutePath
print("OK surface=\(surfaceText) pane=\(paneText) path=\(filePath)")
}
}

// MARK: - Note Commands

/// Subcommand dispatcher for `cmux note <verb>`. Verbs:
/// new — create (if missing), optionally attach, and open a project note
/// open — open an existing slug (error if missing)
/// list — list all notes in the project
/// path — print the absolute path for a slug
/// read — print note content
/// write — replace note content
}
119 changes: 119 additions & 0 deletions CLI/cmux+RightSidebarAvailability.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,119 @@
import Foundation

extension CMUXCLI {
private static func appDefaultsCandidates(environment: [String: String] = ProcessInfo.processInfo.environment) -> [UserDefaults] {
var candidates: [UserDefaults] = []
if let bundleId = normalizedEnvValue(environment["CMUX_BUNDLE_ID"]),
let defaults = UserDefaults(suiteName: bundleId) {
candidates.append(defaults)
}
if let bundleId = containingAppBundleIdentifier(),
let defaults = UserDefaults(suiteName: bundleId) {
candidates.append(defaults)
}
// A CLI launched from PATH or automation has no CMUX_BUNDLE_ID and is
// not inside the .app bundle; without the release app's suite it would
// fall through to the CLI's own empty `.standard` domain and report
// app-enabled beta modes as unavailable (mirrors browserSettingsDomain).
if let defaults = UserDefaults(suiteName: defaultBrowserSettingsDomain) {
candidates.append(defaults)
}
candidates.append(.standard)
return candidates
}

private static func betaFeatureEnabled(
key: String,
defaultValue: Bool = false,
environment: [String: String] = ProcessInfo.processInfo.environment
) -> Bool {
for defaults in appDefaultsCandidates(environment: environment) {
if defaults.object(forKey: key) != nil {
return defaults.bool(forKey: key)
}
}
return defaultValue
}

static func availableRightSidebarModeTokens(
environment: [String: String] = ProcessInfo.processInfo.environment
) -> [String] {
var tokens = ["files", "find", "vault", "sessions"]
if betaFeatureEnabled(key: rightSidebarNotesEnabledDefaultsKey, environment: environment) {
tokens.append("notes")
}
if betaFeatureEnabled(key: rightSidebarFeedEnabledDefaultsKey, environment: environment) {
tokens.append("feed")
}
if betaFeatureEnabled(key: rightSidebarDockEnabledDefaultsKey, environment: environment) {
tokens.append("dock")
}
return tokens
}

static func rightSidebarUsage(environment: [String: String] = ProcessInfo.processInfo.environment) -> String {
let modes = availableRightSidebarModeTokens(environment: environment).joined(separator: "|")
let template = String(localized: "cli.rightSidebar.usage.template", 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 <%@>
Show, switch mode, and focus
mode Print {"visible":bool,"mode":string}
%@
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(format: template, modes, modes)
}

static func noteGlobalUsage(environment: [String: String] = ProcessInfo.processInfo.environment) -> String {
guard betaFeatureEnabled(key: rightSidebarNotesEnabledDefaultsKey, environment: environment) else {
return ""
}
let usage = String(localized: "cli.note.globalUsage", defaultValue: """
note new [--slug <name>] [--attach <none|workspace|surface|terminal>] [--title <text>] [--direction <dir>] [--focus <true|false>]
note open <slug> [--attach <none|workspace|surface|terminal>] [--direction <dir>] [--focus <true|false>]
note list [--json] (list notes in the project)
note here [--json] (print the note resolved for the calling surface)
note path <slug> (print absolute path for a note slug)
note read <slug> (print note content)
note write <slug> [--text <text>|--stdin|<text...>] [--create <true|false>]
note append <slug> [--text <text>|--stdin|<text...>] [--create <true|false>]
note rm <slug> (delete a note file)
""")
return "\n\(usage)\n"
}

// Presentation flags are global, but command option values can also look like flags.
static let commandOptionsWithValues: Set<String> = [
"--action", "--after-workspace", "--agent", "--amount", "--arch",
"--attr", "--before-workspace", "--body", "--color", "--command",
"--config", "--create", "--cwd", "--description", "--direction", "--domain",
"--dx", "--dy", "--email", "--event", "--expires", "--focus",
"--function", "--id", "--image", "--index", "--key", "--kind",
"--label", "--layout", "--lines", "--load-state", "--max-depth", "--name", "--os",
"--order", "--out", "--pane", "--panel", "--path", "--profile", "--property",
"--provider", "--relay-port", "--script", "--selector", "--session",
"--shell", "--source", "--subtitle", "--surface", "--tab", "--target-pane", "--team",
"--text", "--timeout", "--timeout-ms", "--title", "--transcript",
"--turn", "--type", "--url", "--url-contains", "--value", "--window",
"--workspace", "--checkpoint", "--checkpoint-id",
]
}
Loading