Commit graph

1965 commits

Author SHA1 Message Date
Lawrence Chen
5febb66873 Update landing page: switch to Bun, add view transitions and UI polish
- CI: replace Node/npm with Bun
- Add view-transition animations for theme toggle
- Set html background for flash-free theme switches
- UI refinements to download button, brew command, and layout
- Replace package-lock.json with bun.lock
2026-02-09 22:01:53 -08:00
Lawrence Chen
71ab1f8864 Update keyboard shortcuts for README and landing page
Reorganize into Workspaces, Surfaces, Split Panes, Browser,
Notifications, Find, Terminal, and Window sections.
2026-02-09 21:59:03 -08:00
Lawrence Chen
d25f14a79f Add landing page (web/) with Next.js + Tailwind
- Minimal centered layout with Geist sans font
- Typing animation cycling through agent names
- Light/dark mode toggle via next-themes
- Download for Mac button linking to latest DMG
- Feature list, GitHub + Docs footer links
- Meta tags and Open Graph for SEO
- CI: add web typecheck job (tsc --noEmit)
2026-02-09 20:51:27 -08:00
Lawrence Chen
897a79e052
Release v1.24.0 (#32) 2026-02-09 16:13:26 -08:00
Lawrence Chen
f9c8f9f55a Keep legacy bundle ID for Sparkle updates 2026-02-09 15:50:42 -08:00
Lawrence Chen
9817d131f8
Release v1.23.0 (#31)
* Rename cmuxterm to cmux across entire codebase

- Rename GitHub repos: manaflow-ai/cmuxterm -> manaflow-ai/cmux,
  manaflow-ai/homebrew-cmuxterm -> manaflow-ai/homebrew-cmux
- Rename bundle IDs: com.cmuxterm.app -> com.cmux.app
- Rename CLI: CLI/cmuxterm.swift -> CLI/cmux.swift
- Rename homebrew submodule: homebrew-cmuxterm -> homebrew-cmux
- Update all socket paths: /tmp/cmuxterm*.sock -> /tmp/cmux*.sock
- Update all GitHub URLs, DMG names, Sparkle URLs
- Update all source files, scripts, tests, docs, CI workflows

* Bump version to 1.23.0
2026-02-09 15:30:43 -08:00
Lawrence Chen
9ba1d02b2b scripts: don't inherit GIT_PAGER/GH_PAGER into app 2026-02-09 15:11:01 -08:00
Lawrence Chen
33b0c701e1 CLI: quote set-status value and preserve --tab routing 2026-02-09 15:10:58 -08:00
Lawrence Chen
3de18485e4 Update README: Ghostty-based subtitle, separate notification panel and rings 2026-02-09 14:57:42 -08:00
Lawrence Chen
7d6f33c143
Sidebar status as text + detect git HEAD changes instantly (#30)
* Sidebar status as text + detect git HEAD changes instantly

- Replace sidebar status pills with plain text + show more/less toggle
  for a cleaner, more readable sidebar layout
- Watch .git/HEAD mtime in zsh precmd to detect branch changes from
  aliases (gco), tools (gh pr checkout), etc. without waiting for the
  3s polling interval
- Fix NSImage shared instance mutation in DraggableFolderNSView by
  copying before resizing to prevent layout side-effects
- Fix set_status --tab flag being swallowed by -- stop token via
  new parseOptionsNoStop parser
- Update sidebar test to cover alias-based branch switching

* Append status text to notification body automatically

When creating notifications, include the tab's current status entries
in the notification body so users see context (e.g. git branch, ports)
alongside the notification message.

* Add screenshot to README
2026-02-09 14:18:33 -08:00
Lawrence Chen
119511f774
Bump version to 1.22.0 (#29) 2026-02-09 12:34:41 -08:00
Lawrence Chen
fd756dccce
Stop seeding shell env with full app environment (#28)
`surfaceConfig.env_vars` are overrides layered on top of Ghostty's
default subprocess environment. Starting the env map from
`ProcessInfo.processInfo.environment` re-introduced variables that
Ghostty intentionally strips (e.g. LANGUAGE, Xcode DYLD vars),
bypassing its env filtering.

Start with an empty map and add `getenv()` fallbacks for PATH, SHELL,
ZDOTDIR, and GHOSTTY_RESOURCES_DIR so critical values are still
resolved without leaking the full app environment.
2026-02-09 12:28:23 -08:00
Lawrence Chen
84f54e3181
Bump version to 1.21.0 (#27) 2026-02-09 02:50:28 -08:00
Lawrence Chen
e9c5917c66
Fix zsh autosuggestions shared history in cmuxterm (#26)
- Restore real ZDOTDIR early in zsh startup so HISTFILE uses user history\n- Preserve user ZDOTDIR without treating Ghostty injected ZDOTDIR as user\n- Add regression tests and terminfo overlay for bright colors
2026-02-09 02:35:20 -08:00
Lawrence Chen
9b938ef536
Bump version to 1.20.1 (#25) 2026-02-08 21:21:23 -08:00
Lawrence Chen
6866743519 Map Sparkle error 4005 to "Move to Applications" message
Error 4005 (updater permission) with underlying code 10 (cache
directory creation failure) has the same root cause as 1003/1005:
the app isn't in Applications.
2026-02-08 21:11:28 -08:00
Lawrence Chen
87e5ac02ad
Bump version to 1.20.0 (#24) 2026-02-08 20:44:47 -08:00
Lawrence Chen
679cafdc51 Fix update pill constraint feedback loop
The pill never appeared because:
1. SwiftUI .frame(width:0, height:0) when idle poisoned fittingSize
2. AppKit constraints locked at 0x0 prevented expansion on state change
3. fittingSize always returned 0 due to active 0x0 constraints

Fix: Remove zero-frame from SwiftUI (always render at natural size,
use opacity only). Deactivate constraints before measuring fittingSize
so they don't clamp the measurement. Pass visibility to sizeToolbarItem
to set constraints to zero when idle or natural size when active.
2026-02-08 20:21:27 -08:00
Lawrence Chen
e03fc1909b Bump version to 1.19.3 2026-02-08 19:24:54 -08:00
Lawrence Chen
59370115ce Fix pill visibility: always render, use opacity to hide
NSHostingView with frame (0,0) won't layout SwiftUI content, so
fittingSize always returns 0 when transitioning from EmptyView.
Instead, always render the pill button and use opacity/frame(0)
to hide when idle. This ensures the hosting view always has content
to measure.
2026-02-08 19:16:07 -08:00
Lawrence Chen
498cc6e4bc Fix update pill never appearing in toolbar
@Published fires on willSet, so the Combine sink measured fittingSize
while SwiftUI still saw the old state (idle/EmptyView), getting 0x0.
Defer measurement to next run loop cycle so SwiftUI processes the
new state before we read fittingSize.
2026-02-08 19:03:25 -08:00
Lawrence Chen
fc5d7eeb05 Bump version to 1.19.2 2026-02-08 18:50:46 -08:00
Lawrence Chen
dd11852ca3 Enable update pill in Release builds
The UpdatePill toolbar item was wrapped in #if DEBUG, making it
invisible in production builds. Users never saw checking/error
states in the titlebar.
2026-02-08 18:31:34 -08:00
Lawrence Chen
dc69451b29 Show checking spinner before update errors
Errors from Sparkle were bypassing the minimum check display duration,
causing the error to appear instantly (1ms) without the user ever
seeing the "Checking for updates" state. Use setStateAfterMinimumCheckDelay
for errors too so the checking spinner shows for at least 2 seconds.
2026-02-08 18:07:54 -08:00
Lawrence Chen
082aef6a53 Skip background glass effect on macOS 26 to fix blank window
The transparency setup (non-opaque window + clear subview backgrounds)
required for the glass effect breaks SwiftUI content rendering on
macOS 26. Disable background glass when NSGlassEffectView is available
until a proper macOS 26 implementation is found.
2026-02-08 17:40:10 -08:00
Lawrence Chen
09f27d91f1 Revert to npm create-dmg for styled DMG layout
hdiutil produces a basic layout. npm create-dmg (sindresorhus) gives
large centered icons with proper spacing. The blank Applications icon
is a macOS 26 rendering issue that affects both approaches.
2026-02-08 17:30:49 -08:00
Lawrence Chen
08a654882d Use hdiutil for DMG creation instead of create-dmg
create-dmg (brew) uses AppleScript/Finder for icon positioning which
times out on headless CI. Switch to hdiutil with Applications symlink
for reliable CI builds.
2026-02-08 17:20:49 -08:00
Lawrence Chen
b4c90a0912 Fix create-dmg PATH conflict on self-hosted runner
Remove npm create-dmg before installing brew version to avoid
the npm version taking precedence in PATH.
2026-02-08 17:14:58 -08:00
Lawrence Chen
cb4c87113b Fix blank Applications icon in DMG installer
Switch from npm create-dmg (sindresorhus) to brew create-dmg
(create-dmg/create-dmg) which properly renders the Applications
folder symlink icon with explicit layout control.
2026-02-08 17:11:19 -08:00
Lawrence Chen
d2ecfc4342
Bump version to 1.19.1 (#23) 2026-02-08 17:04:31 -08:00
Lawrence Chen
29658c18ae
Bump version to 1.19.0 (#22) 2026-02-08 16:34:08 -08:00
Lawrence Chen
c1d0610a2d Fix blank window with NSGlassEffectView on macOS 26
Avoid Auto Layout reparenting of SwiftUI hosting view when applying glass; force HFS+ DMG so volume name mounts as cmuxterm.
2026-02-08 15:59:38 -08:00
Lawrence Chen
0fca79e7dd Test CI concurrency serialization 2026-02-06 23:15:50 -08:00
Lawrence Chen
20c62b3b9a
Fix CI race condition on self-hosted runner (#19)
* Fix zsh ZDOTDIR wrapper + log parsing with -- messages

* Fix CI race condition: serialize self-hosted builds with concurrency group

Two workflows racing on the same self-hosted runner caused DerivedData
corruption (release's rm -rf nuked DerivedData while CI was building).
Add shared concurrency group and scope DerivedData cleanup to project.
2026-02-06 22:32:14 -08:00
Lawrence Chen
679f88f753
Bump version to 1.18.0 (#17) 2026-02-06 18:15:29 -08:00
Lawrence Chen
7e69751e1b
Sidebar metadata + tagged reload isolation (#16)
* Sidebar primitives + tagged dev isolation

* Allow wider sidebar resize

* Fix tagged socket selection + panel id errors

* Fix progress label quoting + bundle suffix sanitize

* Skip ctrl-enter keybind test when keystrokes blocked

* Fix shell nc hang + prune stale per-surface sidebar metadata
2026-02-06 18:09:56 -08:00
Lawrence Chen
b3c2a8c7c3 Document --tag flag for parallel builds in CLAUDE.md 2026-02-05 23:06:48 -08:00
Lawrence Chen
be9aa135cf Bump version to 1.17.3 2026-02-05 19:57:23 -08:00
Lawrence Chen
0340e794b8
Fix Sparkle auto-update: inject SUPublicEDKey into Info.plist via PlistBuddy (#15)
Root cause: INFOPLIST_KEY_ build setting prefix only works for Apple-recognized
keys (CF*, NS*, LS*), not custom keys like SUPublicEDKey. The key was never
being added to Info.plist, so generate_appcast silently skipped EdDSA signing
(no public key in app = nothing to match against).

Fix:
- Derive public key from private key at build time using CryptoKit
- Use PlistBuddy to inject SUPublicEDKey and SUFeedURL after build
- Add sign_update fallback in appcast script if generate_appcast skips signing
- Add base64 padding normalization for key handling
2026-02-05 19:57:01 -08:00
Lawrence Chen
1733f697a7 Bump version to 1.17.2 2026-02-05 19:38:50 -08:00
Lawrence Chen
6391300d52 Fix Sparkle appcast signing: write key to file instead of stdin
generate_appcast doesn't reliably read EdDSA key from stdin via
--ed-key-file -. Write key to a temp file instead.
2026-02-05 19:38:38 -08:00
Lawrence Chen
906186e190 Bump version to 1.17.1 2026-02-05 19:34:05 -08:00
Lawrence Chen
b56da22b43 Fix Sparkle public key not embedded in release builds
SPARKLE_PUBLIC_KEY was set as a shell env var but Xcode needs it passed
as a build setting argument. Without SUPublicEDKey in Info.plist, Sparkle
silently ignores updates.
2026-02-05 19:33:47 -08:00
Lawrence Chen
7e8de5ac9d
Bump version to 1.17.0 (#14) 2026-02-05 19:20:51 -08:00
Lawrence Chen
fe0b33f19b
Fix traffic lights and titlebar overlap on older macOS (#13)
WindowGlassEffect.apply() replaced the window's contentView with the
glass/blur view on all macOS versions. On macOS 13-15, swapping the
contentView on a window with fullSizeContentView + transparent titlebar
breaks the titlebar view hierarchy, causing traffic light buttons to
disappear behind the content.

Split into two paths:
- macOS 26+ (NSGlassEffectView): full contentView replacement (safe)
- macOS 13-15: insert NSVisualEffectView as a background subview of the
  existing contentView, preserving the titlebar hierarchy

Also fix the custom titlebar overlay overlapping the traffic lights and
left titlebar accessories (sidebar/bell/+ buttons) when the sidebar is
hidden. Use TitlebarLeadingInsetReader to dynamically measure the actual
width of traffic lights + left accessories and apply it as leading padding.
2026-02-05 19:16:38 -08:00
Lawrence Chen
36604ceb19
Bump version to 1.16.0 (#11) 2026-02-04 16:35:51 -08:00
Lawrence Chen
cc71e5797e
Add sidebar blur effect with withinWindow blending (#9)
* Add sidebar blur effect with withinWindow blending

- Add NSVisualEffectView-based blur backdrop for sidebar
- Support withinWindow blending mode to blur terminal content behind sidebar
- Auto-switch to overlay layout when withinWindow mode is selected
- Add sidebar debug panel with material, blending, tint, and opacity controls
- Add preset options (HUD Glass, Popover Glass, etc.)
- Default to HUD Glass preset with withinWindow blur

* Simplify tab close button visibility and remove hover background

Show close button only on hover instead of when active/multi-selected.
Remove the hover background color from tabs for cleaner appearance.

* Add config reload support with notification system

- Add reloadConfiguration() methods for app-wide and per-surface reload
- Handle GHOSTTY_ACTION_RELOAD_CONFIG action from Ghostty
- Add ghosttyConfigDidReload notification for views to react
- TerminalSplitTreeView reloads GhosttyConfig on notification
- Add openConfigurationInTextEdit() helper
- Fix activeMainWindow() to correctly find main window

* Add custom tab titles and pinned tabs support

- Add customTitle and isPinned properties to Tab
- Separate process title from custom title with applyProcessTitle()
- Add setCustomTitle()/clearCustomTitle() for user-defined tab names
- Add togglePin()/setPinned() with automatic reordering
- Pinned tabs stay at the top, new tabs insert after pinned section
- moveTabToTop/moveTabsToTop respect pinned tab ordering

* Add --panel option to new-split command

- CLI: Parse --panel <id|index> option for new-split
- Controller: Resolve panel argument to split specific surface
- Return new panel UUID on successful split creation

* Fix notifications popover positioning with layout-aware anchor

- Use AnchorNSView with layout callback for reliable positioning
- Force layout before showing popover to ensure current geometry
- Convert anchor bounds to window content view coordinates
- Add fallback positioning near top-left when anchor unavailable
- Fix button hit testing with explicit frame and contentShape

* Improve app termination in reload script

Use osascript to gracefully quit by bundle ID before pkill fallback.
Add more robust pkill patterns to catch instances from any DerivedData path.

* Add sidebar blur effect with live-adjustable glass settings

- Add WindowGlassEffect for window-level NSGlassEffectView (macOS 26+)
- Add SidebarBackdrop with configurable material, blend mode, tint, and opacity
- Add Sidebar Debug panel (Debug menu) for live adjustment of sidebar appearance
- Add Background Debug panel for window glass tint settings
- Support both behindWindow and withinWindow blur modes
- Live tint updates without requiring window reload

* Align titlebar text to left edge of content area
2026-02-04 03:04:45 -08:00
Lawrence Chen
600683cd7d
Add --panel flag to new-split command (#10)
* Add --panel flag to new-split command

Allows splitting a specific panel without changing focus first.

Usage: cmuxterm new-split <direction> [--panel <id|index>]

Example: cmuxterm new-split down --panel 1

* Return new panel ID from new-split command

new-split now returns the UUID of the newly created panel, enabling
reliable chaining of split operations without index drift issues.

Before: OK
After:  OK F2675177-3838-49AF-A1A0-1744C0048E99

Example workflow to create left + 2x2 grid on right:
  RIGHT=$(cmuxterm new-split right | awk '{print $2}')
  BOTTOM=$(cmuxterm new-split down --panel $RIGHT | awk '{print $2}')
  cmuxterm new-split right --panel $RIGHT
  cmuxterm new-split right --panel $BOTTOM
2026-02-03 21:37:49 -08:00
Lawrence Chen
7bae1216ff Fix race condition in reload.sh causing -600 error
Add delay after pkill to give Launch Services time to release the
old process handle before opening the new app.
2026-02-03 15:30:23 -08:00
Lawrence Chen
7d951a7f73
Add zig, node, and hypothesis to gitignore (#8) 2026-02-03 15:18:59 -08:00