* Fix CI test timeout: stream xcodebuild output and bump timeout to 30m
The test split PR (#1717) applied output streaming (tee) and timeout bump
only to ci-macos-compat.yml, not ci.yml. The main CI tests job was still
capturing all xcodebuild output in a $() subshell (making logs blank) and
using a 20 minute timeout (too tight after the test file split).
Port the same fixes from ci-macos-compat.yml:
- Stream xcodebuild output via tee so CI logs show progress in real time
- Bump timeout-minutes from 20 to 30
- Update the SPM retry guard test for the new tee pattern
* Fix hanging test: auto-confirm window close in last-surface Cmd+W test
testCmdWClosesWindowWhenClosingLastSurfaceInLastWorkspace hung for 26+
minutes on CI because it sent Cmd+W to close the last surface without
setting debugCloseMainWindowConfirmationHandler. The window close path
shows a modal confirmation dialog that blocks the RunLoop indefinitely
on headless runners.
Set the handler to auto-confirm, matching the pattern used by
testCmdCtrlWClosesWindowAfterConfirmation.
* Skip last-surface close test on CI: PTY teardown blocks on headless runners
The confirmation handler fix wasn't sufficient. The hang is in Ghostty
surface/PTY teardown when closing the last terminal surface, not the
window close confirmation. Shell process termination blocks indefinitely
on headless CI runners without a TTY.
Skip with XCTSkip when CI env var is set. The test still runs locally
and can be covered via E2E on runners with virtual displays.
* Skip hanging test via -skip-testing flag in xcodebuild
The CI env var isn't visible inside xcodebuild's test host process, so
the XCTSkip approach didn't work. Use -skip-testing on the xcodebuild
command line instead.
---------
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
* Show update-available banner automatically on launch
Probe for updates immediately on launch via Sparkle's
checkForUpdateInformation() so the sidebar surfaces a passive update
indicator without waiting for the 24h scheduler. When Sparkle detects
an available update in the background, the pill now shows
"Update Available: X.Y.Z" with accent styling while the updater is
idle. Clicking it triggers the full interactive update flow.
Also fixes thread safety in delegate callbacks by dispatching
@Published mutations to the main queue.
Closes#1643
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Add periodic background update probe every 15 minutes
The launch-only probe wouldn't catch updates published while the app
is already running. Add a repeating 15-minute timer that calls
checkForUpdateInformation() so the sidebar banner appears within a
reasonable window after a new version is published.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Change background update probe interval to 30 minutes
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
* Change update check interval to 1 hour and migrate existing users
Reduce Sparkle's scheduled check interval from 24h to 1h so update
banners appear sooner. Migrate users stuck on the old 24h default by
bumping the migration key to v2. Align background probe interval with
the Sparkle check interval instead of hardcoding 30 minutes.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
The privacy policy previously only mentioned Sentry, Sparkle, and
Ghostty. Added PostHog (website analytics, cookies) and Resend
(transactional email for feedback) to both the data collection
section and the third-party services list.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
The previous PR (#1717) added 15 test files to the pbxproj PBXBuildFile and
PBXGroup sections but missed adding them to the cmuxTests Sources build phase
(F1000005), so they were never compiled in CI.
Also add executionTimeAllowance = 30s to AppDelegateShortcutRoutingTests to
prevent testCmdWClosesWindowWhenClosingLastSurfaceInLastWorkspace from hanging
indefinitely on CI (the actual root cause of the timeout).
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
- Add canonical tags to community, nightly, wall-of-love, and all
legal pages (prevents duplicate content with trailing slashes)
- Add x-default hreflang to sitemap for all entries
- Add legal pages (privacy-policy, terms-of-service, eula) to sitemap
- Stabilize sitemap lastModified to fixed dates instead of new Date()
(avoids noisy lastmod changes on every deploy)
- Update legal page dates to March 18, 2026 (domain migration is a
material change to the "Site" definition)
- Update copyright year to 2026
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
Add .textSelection(.enabled) to the success body text so users can
select and copy the founders@manaflow.com email address.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
Add chip (e.g. Apple M1 Pro), RAM, hardware model, architecture
(arm64/x86_64), and display info to feedback metadata. All fields are
non-sensitive system properties collected via sysctlbyname, ProcessInfo,
and NSScreen. Server-side route accepts and renders the new fields in
both plain text and HTML email bodies.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
These are user-generated quotes that should preserve the original
wording. The domain migration should not rewrite what users said.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
- Swift app: feedback API endpoint, docs URLs, changelog URL, CLI help
- PostHog proxy: r.cmux.dev -> r.cmux.com
- All 20 README files: docs and blog links
- Homebrew cask: homepage URL in update-homebrew workflow
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
CmuxWebViewKeyEquivalentTests.swift grew to 15,907 lines with 100+ test classes.
Swift compiles per-file, so this single file serialized all type-checking onto one
compiler process, pushing CI past the 20-minute timeout after core-file changes.
Split into 10 domain-based files (1k-3k lines each) so Xcode can compile them in
parallel. Also bump timeout-minutes from 20 to 30 for headroom, stream xcodebuild
output via tee instead of capturing to a variable (makes CI logs debuggable), and
add 5 test files that were missing from the pbxproj Sources build phase.
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>
* test(terminal): cover Return after Korean IME commit
* fix(terminal): execute Return after Korean IME commit
---------
Co-authored-by: Lawrence Chen <lawrencecchen@users.noreply.github.com>