Commit graph

264 commits

Author SHA1 Message Date
Austin Wang
23db0a3fa2
maximize-sidebar (#50) 2026-02-17 16:11:00 -08:00
Lawrence Chen
4bf968fd68
Bump version to 1.37.0 (#49) 2026-02-17 15:17:18 -08:00
Austin Wang
addb99ed50
Add "+" menu button to horizontal tab bar for new terminal/browser tabs (#48)
Adds a "+" button to the tab bar (next to split buttons) that shows a
dropdown menu with "New Terminal ⌘T" and "New Browser ⌘⇧L" options.

- Uses native NSButton + NSMenu so the icon matches the split buttons
- Menu appears below the button
- Routes tab creation through new didRequestNewTab delegate method

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-17 14:59:24 -08:00
Lawrence Chen
c2fdd48290
Release v1.36.0 (#47)
* Fix multi-workspace drag/drop, WebView click focus, and add regression tests

- Wire bonsplit isInteractive to workspace active state so inactive
  workspace NSViews are hidden from AppKit event routing
- Add CmuxWebView.mouseDown notification for browser panel focus
  tracking (AppKit delivers clicks to WKWebView, not SwiftUI overlays)
- Add multi-workspace focus regression test covering isHidden fix,
  rapid workspace switching, and browser panel focus routing

* Bump version to 1.36.0
2026-02-17 04:04:29 -08:00
Lawrence Chen
2678606a20
Fix omnibar tracking timeout using background queue (#46)
The 3-second safety net that posts a synthetic mouseUp to break out of
NSTextView's stuck tracking loop was dispatched on the main queue. Since
super.mouseDown blocks the main thread in the tracking loop, the timeout
could never fire. Use a background queue instead (NSApp.postEvent is
thread-safe). Use DispatchWorkItem.isCancelled for atomic cancellation.
2026-02-17 03:35:49 -08:00
Lawrence Chen
100575a63e Release v1.35.0 (#45) 2026-02-17 03:21:49 -08:00
Lawrence Chen
484b66c8ac
Fix terminal keys swallowed after opening browser (#45)
* Fix terminal keys (arrows, Ctrl+N/P) swallowed after opening browser

After a browser panel is shown, SwiftUI's internal focus system activates
and its _NSHostingView starts consuming arrow keys and other non-Command
key events via performKeyEquivalent, preventing them from reaching the
terminal's keyDown handler.

Fix: In the NSWindow performKeyEquivalent swizzle, when GhosttyNSView is
the first responder and the event has no Command modifier, route directly
to the terminal's performKeyEquivalent — bypassing SwiftUI's view hierarchy
walk entirely.

Also clear stale browserAddressBarFocusedPanelId when a terminal surface
has focus, preventing Cmd+N from being eaten by omnibar selection logic
after focus transitions away from a browser.

Adds DEBUG-only keyboard event ring buffer (KeyDebugLog) that dumps to
/tmp/cmux-key-debug.log for diagnosing future key routing issues.

* Fix split focus and Cmd+Shift+N swallowed after opening browser

Split focus: capture the source terminal's hostedView before bonsplit
mutates focusedPaneId, so focusPanel moves focus FROM the old pane
instead of from the new pane to itself. Also retry ensureFocus when the
new terminal's view has no window yet (matching the existing retry
pattern for isVisibleInUI).

Cmd+Shift+N: after WKWebView has been in the responder chain, SwiftUI's
internal focus system can intercept Command-key events in the content
view hierarchy (returning true) without firing the CommandGroup action
closure. Fix by dispatching Command-key events directly to NSApp.mainMenu
when the terminal is first responder, bypassing the broken SwiftUI path.
Also add Cmd+Shift+N to handleCustomShortcut so it's customizable and
doesn't depend on SwiftUI menu dispatch at all.

* Unified debug event log: merge key/mouse/focus into /tmp/cmux-debug.log

- Delete KeyDebugLog, MouseDebugLog, klog(), mlog() from AppDelegate
- Replace all klog/mlog calls with dlog() (provided by bonsplit)
- Remove debugLogCallback wiring from Workspace
- Add focus change logging: focus.panel, focus.firstResponder,
  split.created, focus.moveFocus
- Add import Bonsplit where needed for dlog access
- Fix stale drag state on cancelled tab drags (bonsplit submodule)

* Fix split focus stolen by re-entrant becomeFirstResponder during reparenting

During programmatic splits (Cmd+D / Cmd+Shift+D), SwiftUI reparents the old
terminal view, which fires becomeFirstResponder → onFocus → focusPanel for the
OLD panel, stealing focus from the newly created pane.

Add programmaticFocusTargetPanelId guard to suppress re-entrant focusPanel
calls for non-target panels during split creation.

Also document the unified debug event log in CLAUDE.md.

* Clear stale title/favicon when browser navigation fails

When a page fails to load (e.g. connection refused), the tab was still
showing the previous page's title and favicon. Now didFailProvisionalNavigation
resets pageTitle to the failed URL and clears faviconPNGData.

* Fix Cmd+N swallowed by browser omnibar and improve split focus suppression

- Only Ctrl+N/P trigger omnibar navigation, not Cmd+N/P (Cmd+N should
  always create new workspace regardless of address bar focus)
- Move split focus suppression from workspace-level guard to source:
  suppress becomeFirstResponder side-effects (onFocus + ghostty_surface_set_focus)
  directly on the old GhosttyNSView during reparenting, preventing both
  model-level and libghostty-level focus divergence
- Remove programmaticFocusTargetPanelId from Workspace.focusPanel

* Fix omnibar hang, WebView white flash, drag-over-browser, and idle CPU spin

- Omnibar: first click selects all without entering NSTextView tracking loop;
  subsequent clicks have 3s synthetic mouseUp safety net to prevent hang
- WebView: set underPageBackgroundColor to match window so new browsers don't
  flash white before content loads
- Drag/drop: register custom UTType (com.splittabbar.tabtransfer) in Info.plist
  so WKWebView doesn't intercept tab drags; override registerForDraggedTypes
  on CmuxWebView as belt-and-suspenders
- CPU: fix infinite makeFirstResponder loop in controlTextDidEndEditing by
  checking both the text field and its field editor (the actual first responder)
2026-02-17 03:21:08 -08:00
Austin Wang
0a2ef499b5
Release v1.34.0 (#43)
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-16 16:39:34 -08:00
Austin Wang
16e8329af5
Merge pull request #42 from manaflow-ai/cmux/browser-improve
Fixes issue with browser on non-running localhost urls
2026-02-16 16:28:51 -08:00
austinpower1258
bd54d06213 fixes browser issue with localhost 2026-02-16 16:21:31 -08:00
Lawrence Chen
f78cdcf425 Merge branch 'main' of https://github.com/manaflow-ai/cmux 2026-02-16 03:30:25 -08:00
Lawrence Chen
c876a7689e
Release v1.33.0 (#41)
* Fix menubar lag in production builds caused by hardened runtime

Hardened runtime's library validation was verifying every dylib on load,
causing noticeable UI lag. Add entitlements file with
disable-library-validation to fix while keeping notarization support.

* Bump version to 1.33.0
2026-02-16 03:30:17 -08:00
Lawrence Chen
a2457f1d5e Fix menubar lag in production builds caused by hardened runtime
Hardened runtime's library validation was verifying every dylib on load,
causing noticeable UI lag. Add entitlements file with
disable-library-validation to fix while keeping notarization support.
2026-02-16 03:26:33 -08:00
Lawrence Chen
c0f7a07a7b Fix sidebar tabs getting extra left padding when update pill is visible
Move GeometryReader from wrapping the entire VStack to wrapping only the
ScrollView so proxy.size.height reflects available height (minus pill),
preventing unnecessary scrollability that triggered macOS horizontal insets.

Also clamp update pill text width with maxWidth instead of fixed width so
it truncates gracefully at narrow sidebar widths and grows when wider, add
horizontal padding, left-align truncated text, and add debug menu item for
testing with long nightly version strings.
2026-02-16 03:20:51 -08:00
Lawrence Chen
b3945bdc7f Fix memory leak: retain cycle in bonsplit middle-click monitor 2026-02-16 03:05:40 -08:00
Lawrence Chen
9067089e61
Bump version to 1.32.0 (#40) 2026-02-16 02:49:10 -08:00
Lawrence Chen
3fa72a0b0b Add sidebar metadata (git branch, ports, logs, progress), fix localhost URL resolution, simplify analytics
- Sidebar now shows git branch, listening ports, log entries, progress bars, and status pills with expand/collapse
- Fix localhost/127.0.0.1 URL parsing by checking before generic URL(string:) which misinterprets the scheme
- Remove custom Keychain distinct ID in favor of PostHog SDK's built-in anonymous ID
- browser open now defaults to caller's workspace via CMUX_WORKSPACE_ID env var
- Improve CLI help text for environment variables
2026-02-16 02:46:39 -08:00
Lawrence Chen
b41331b43d
Release v1.31.0 (#39)
* Bump version to 1.31.0

* remove sidebar-hidden pill test (pill is now sidebar-only)
2026-02-15 21:56:41 -08:00
Lawrence Chen
8f399d1a82 add Claude hook session mapping test 2026-02-15 21:50:06 -08:00
Lawrence Chen
4312f917f0 update docs-site keyboard shortcuts and browser docs 2026-02-15 21:50:00 -08:00
Lawrence Chen
1963762df8 update keyboard shortcuts in README and translations 2026-02-15 21:49:54 -08:00
Lawrence Chen
08cbabf955 add arrow nav and zoom shortcut tests, fix omnibar UI test flakiness 2026-02-15 21:49:49 -08:00
Lawrence Chen
957178d03e tag PostHog events with platform: cmuxterm 2026-02-15 21:49:44 -08:00
Lawrence Chen
b351277063 add arrow key omnibar navigation, browser zoom shortcuts, and history flush on quit 2026-02-15 21:49:38 -08:00
Lawrence Chen
4af05b63d6 remap browser shortcut to Cmd+Shift+L, flash to Cmd+Shift+H 2026-02-15 21:49:33 -08:00
Lawrence Chen
ac4b49d7a4 move update pill to sidebar only, add Install Update menu item 2026-02-15 21:17:33 -08:00
Lawrence Chen
de6cfededa Fix inline completion showing "news." instead of "news.ycombinator.com"
Reject URLs whose host lacks a TLD (no internal dot) from autocompletion
candidates, history recording, and clean up existing bogus entries on load.
2026-02-15 21:13:31 -08:00
Lawrence Chen
7d290a1c24 add regression test: UpdatePill must not be gated behind #if DEBUG 2026-02-15 20:40:40 -08:00
Lawrence Chen
80cf9f7d21
Bump version to 1.30.0 (#38) 2026-02-15 20:03:36 -08:00
Lawrence Chen
430e86909f show update pill in sidebar for Release builds 2026-02-15 19:59:55 -08:00
Lawrence Chen
2080a8ea5c
Release v1.29.0 (#37)
* Bump version to 1.29.0

* Include uncommitted TabManager changes needed for build
2026-02-15 18:41:13 -08:00
Lawrence Chen
ad4409c55e Cmd+[/] browser back/forward, cmd+click open in new tab, right-click open in new tab
- Change Cmd+[/] from workspace history navigation to browser back/forward
  (only when focused surface is a browser, no-op on terminal)
- Add WKUIDelegate with createWebViewWith to handle target=_blank links
- Add decidePolicyFor check for targetFrame==nil and cmd+click modifier
  to open links in new browser surface in the same pane
- Override willOpenMenu in CmuxWebView to rename "Open Link in New Window"
  to "Open Link in New Tab"
- Add E2E test for browser back/forward via socket and Cmd+[/] shortcuts
2026-02-15 18:35:58 -08:00
Lawrence Chen
777d6b048e Replace CLAUDE_CONFIG_DIR with claude wrapper + richer notifications
Instead of creating a merged config directory and injecting
CLAUDE_CONFIG_DIR on every terminal spawn, place a thin wrapper
script at Resources/bin/claude that intercepts claude invocations
to inject --session-id and --settings flags. This eliminates
blocking I/O on terminal creation and removes config management
complexity.

- Add Resources/bin/claude wrapper script with hook injection
- Add shell integration PATH fix (re-prepend after .zshrc/.bashrc)
- Add transcript reading for richer stop notifications
- Add set_status/clear_status to notifications socket allowlist
- Add Settings toggle to disable Claude Code integration
- Update docs to reflect automatic integration approach
- Unset CLAUDECODE env var to avoid nested session detection
2026-02-15 18:33:36 -08:00
Lawrence Chen
f789306a97 enable update pill in Release builds 2026-02-15 18:08:32 -08:00
Lawrence Chen
5e62a9eca7 Fix nightly: delete existing CMUXCommit plist key before adding 2026-02-15 17:14:35 -08:00
Lawrence Chen
a01e7483d6 Improve nightly version numbers
- Marketing version: append -nightly.YYYYMMDD (e.g. 1.28.2-nightly.20260215)
- Build number: monotonic YYYYMMDDNN integer for clean Sparkle comparisons
- Embed commit SHA via CMUXCommit plist key (already shown in About panel)
2026-02-15 17:10:10 -08:00
Lawrence Chen
2c205893fb Change reload configuration shortcut to Cmd+Shift+, 2026-02-15 17:04:45 -08:00
Lawrence Chen
fb2236cb3d Translate disclaimer lines to each target language 2026-02-14 21:55:38 -08:00
Lawrence Chen
1dab023f96 Move language selector bar above screenshot 2026-02-14 21:53:54 -08:00
Lawrence Chen
10ee9f4f5d Add README translations for 17 languages
Added language selector bar to README and translated READMEs for:
zh-CN, zh-TW, ko, de, es, fr, it, da, ja, pl, ru, bs, ar, no, pt-BR, th, tr
2026-02-14 21:51:52 -08:00
Lawrence Chen
e3fb4fbb25 add PostHog public project API key for production analytics 2026-02-14 21:44:45 -08:00
Lawrence Chen
6d68cd2f08 Polish browser suggestions, focus, and tagged reload flow 2026-02-14 21:33:28 -08:00
Lawrence Chen
5a1cc7bc8d bundle third-party licenses in app and add Licenses button to About
Add THIRD_PARTY_LICENSES.md as a bundled resource so it ships inside
the .app bundle. Add a "Licenses" button to the About panel that opens
a scrollable window displaying the file contents.
2026-02-14 21:15:35 -08:00
Lawrence Chen
e2b8f824b3 readme: reorder features, lead with vertical tabs and notifications 2026-02-14 20:34:32 -08:00
Lawrence Chen
56f912a7b7 add third-party licenses and update bonsplit submodule
Add THIRD_PARTY_LICENSES.md with attribution notices for all
dependencies (Ghostty, Bonsplit, SwiftTerm, Sparkle, Swift Argument
Parser, PostHog, Sentry) to satisfy MIT license requirements.

Update bonsplit submodule to include upstream MIT LICENSE file.
2026-02-14 20:33:40 -08:00
Lawrence Chen
aa0d46c5f7 readme: update features list and fix agent-browser URL 2026-02-14 20:27:13 -08:00
Lawrence Chen
3faffadca4 readme: rewrite Why section with personal motivation 2026-02-14 20:23:13 -08:00
Lawrence Chen
7d5b7b927b readme: use consistent download badge for both buttons 2026-02-14 04:02:13 -08:00
Lawrence Chen
f303d4e845 update: include Sparkle public key in dev builds 2026-02-14 03:27:57 -08:00
Lawrence Chen
faf1bd44c2 release: fix Sparkle upgrade path for 1.27.0 users 2026-02-14 03:26:42 -08:00