Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
61 commits
Select commit Hold shift + click to select a range
4b31ff4
Add macOS localization parity tooling
austinywang Sep 7, 2026
21e682b
Preserve catalog formatting and record translation metadata
austinywang Sep 8, 2026
2a17daf
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 8, 2026
4235c7c
Add failing regression coverage for catalog plural validation
austinywang Sep 8, 2026
fd3af76
Validate source arguments and every translated plural leaf
austinywang Sep 8, 2026
5633d55
Cover ignored catalog records and locale-specific shared spellings
austinywang Sep 8, 2026
ef9ff8f
Restore ignored catalog records and reuse verified locale data
austinywang Sep 8, 2026
a7894fe
Cover lost line breaks in translated format strings
austinywang Sep 8, 2026
5ff19f2
Preserve translation line breaks and require feature locale parity
austinywang Sep 8, 2026
ac4cf24
Cover legitimate todo wording and package invariant policy
austinywang Sep 8, 2026
0fb3997
Cover parity and lossless merging of duplicate catalog records
austinywang Sep 8, 2026
66b6905
Limit shared-spelling plural exceptions to approved leaf text
austinywang Sep 8, 2026
27ce912
Validate duplicate records and narrowly scoped plural spellings
austinywang Sep 8, 2026
1bf8039
Complete English macOS catalog entries and plural forms
austinywang Sep 8, 2026
8ab8cc3
Complete German macOS catalog entries and plural forms
austinywang Sep 8, 2026
0f3d5fa
Complete French macOS catalog entries and plural forms
austinywang Sep 8, 2026
3b11677
Complete Arabic macOS catalog entries and plural forms
austinywang Sep 8, 2026
4162d01
Complete Spanish macOS catalog entries and plural forms
austinywang Sep 8, 2026
77de0b5
Complete Traditional Chinese macOS catalog entries and plural forms
austinywang Sep 8, 2026
7f6715e
Complete Simplified Chinese macOS catalog entries and plural forms
austinywang Sep 8, 2026
8ec2cab
Complete Korean macOS catalog entries and plural forms
austinywang Sep 8, 2026
c5cd281
Complete Japanese macOS catalog entries and plural forms
austinywang Sep 8, 2026
b47a52e
Document locale terminology, count arguments and reviewed literals
austinywang Sep 8, 2026
1b1989f
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 8, 2026
0760be5
Translate the cloud networking strings added on main
austinywang Sep 8, 2026
2902a3d
Fix the macOS warnings blocking localization CI
austinywang Sep 8, 2026
0f2372f
Cover nested duplicate locale and substitution members
austinywang Sep 8, 2026
21de28b
Address localization review wording and nested duplicate validation
austinywang Sep 8, 2026
e477a1c
Align moved-pane notification regressions with journal ownership
austinywang Sep 8, 2026
26f0fd1
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 8, 2026
de8de17
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 8, 2026
0bc9ada
Use product-focused diff viewer errors in every macOS locale
austinywang Sep 8, 2026
f896caa
Clarify localized agent errors without internal implementation wording
austinywang Sep 8, 2026
b28794e
Normalize Xcode project entries brought in by main
austinywang Sep 8, 2026
d892121
Merge main and preserve complete macOS locale coverage
austinywang Sep 9, 2026
a89413c
Address diagnostic copy and keep the master PR focused on localization
austinywang Sep 9, 2026
7e29b67
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 9, 2026
124b1d0
Make lane selection deterministic and refresh SSH startup test behavior
austinywang Sep 9, 2026
1638e74
fix: keep SSH startup payload within argv limit
lawrencecchen Aug 7, 2026
151d594
Preserve startup exit status and update SSH integration fixtures
austinywang Sep 9, 2026
ae380a1
Share SSH artifact decoding and correct Arabic completion labels
austinywang Sep 9, 2026
0f753a4
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 9, 2026
00d507b
Join push cleanup before asserting durable store removal
austinywang Sep 9, 2026
ab2f0db
Use formal German feedback send action
austinywang Sep 9, 2026
78ab24c
Use natural German feedback button label
austinywang Sep 9, 2026
52fa5c1
Merge remote-tracking branch 'origin/main' into issue-12075-complete-…
austinywang Sep 9, 2026
022b8a8
Translate new terminal creation messages across locales
austinywang Sep 9, 2026
7f3de1c
Make retry policy chunk assertions deterministic
austinywang Sep 9, 2026
e3a5ee2
Keep retry cooldown assertion outside sleep callback
austinywang Sep 9, 2026
cac6b21
Merge origin/main and preserve complete macOS locale coverage
austinywang Sep 10, 2026
f4afe57
Fix web test typings and respect the PTY harness deadline
austinywang Sep 10, 2026
7a0ceb4
Consolidate catalog duplicates and refresh translated plan limits
austinywang Sep 10, 2026
7c3a2ee
Remove ambiguous duplicate permission catalog records
austinywang Sep 10, 2026
bcc820f
Merge branch 'main' of https://github.com/manaflow-ai/cmux into issue…
austinywang Sep 10, 2026
5144d58
Preserve cloud workspace guidance and Bun mock overload after merge
austinywang Sep 10, 2026
f62994c
Merge main and complete new macOS translations and plural forms
austinywang Sep 10, 2026
9816964
Test localized Settings navigation and search in German and Arabic
austinywang Sep 11, 2026
bad1b13
Test stderr preservation during marked SSH authentication
austinywang Sep 11, 2026
d763299
Localize Settings navigation and fix SSH retry and reconnect regressions
austinywang Sep 11, 2026
e623cbb
Align hosted regression harnesses with control types and cleanup cont…
austinywang Sep 11, 2026
73a4954
Correct shortcut hints search alias and localized Settings test focus
austinywang Sep 11, 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
6 changes: 6 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,12 @@ jobs:
- name: Validate Python test harness syntax
run: git ls-files 'tests/*.py' 'tests_v2/*.py' 'scripts/*.py' | xargs python3 -m py_compile

- name: Test macOS localization catalog tooling
run: python3 tests/test_localization_catalog.py

- name: Validate macOS localization parity
run: python3 scripts/localization_catalog.py check

- name: Validate cmux-cloud-vm skill covers the vm CLI
run: python3 tests/test_cloud_vm_skill_coverage.py

Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ Each of these has full detail in the skill named in parentheses.
- **Terminal find layering** (`cmux-debugging`): `SurfaceSearchOverlay` mounts from `GhosttySurfaceScrollView` in `Sources/GhosttyTerminalView.swift` (AppKit portal layer), never from SwiftUI panel containers such as `Sources/Panels/TerminalPanelView.swift`. Portal-hosted terminal views can sit above SwiftUI during split/workspace churn.
- **Custom UTTypes** for drag-and-drop must be declared in `Resources/Info.plist` under `UTExportedTypeDeclarations` (e.g. `com.splittabbar.tabtransfer`, `com.cmux.sidebar-tab-reorder`).
- **Submodule safety** (`cmux-ghostty`): push the submodule commit to its remote `main` before committing the pointer in the parent repo. Never commit on a detached HEAD. Verify with `git merge-base --is-ancestor HEAD origin/main`.
- **Localize every user-facing string** (`cmux-localization`): `String(localized:)` with keys in `Resources/Localizable.xcstrings`, plus every web message catalog (`web/messages/en.json`, `web/messages/ja.json`). A localization audit is required for any UI, Settings, menu, schema, docs, or help-text change, and the handoff must state what was audited.
- **Localize every user-facing string** (`cmux-localization`): `String(localized:)` with keys in `Resources/Localizable.xcstrings`, plus every web message catalog (`web/messages/en.json`, `web/messages/ja.json`). The supported macOS app locales are English, German, French, Arabic, Spanish, Traditional Chinese, Simplified Chinese, Korean, and Japanese (`en`, `de`, `fr`, `ar`, `es`, `zh-Hant`, `zh-Hans`, `ko`, `ja`). A localization audit is required for any UI, Settings, menu, schema, docs, or help-text change, and the handoff must state what was audited.
- **Shortcut policy** (`cmux-keyboard-shortcuts`): every new cmux-owned shortcut goes in `KeyboardShortcutSettings`, is editable in Settings, is supported in `~/.config/cmux/cmux.json`, and is documented.
- **Test wiring** (`cmux-testing`): a `.swift` file in `cmuxTests/` without a `PBXFileReference` + `PBXSourcesBuildPhase` entry is silently skipped, and both `xcodebuild test` and bot reviews pass with "Executed 0 tests". `workflow-guard-tests` runs `./scripts/lint-pbxproj-test-wiring.sh` to catch it.
- **SPM package groups** (`cmux-architecture`): packages live under `Packages/{Shared,iOS,macOS}/<pkg>` and the workspace mirrors that folder shape. To move one, `git mv` the directory then `python3 scripts/check-workspace-package-groups.py --write`. Never hand-edit workspace group membership.
Expand Down
2 changes: 1 addition & 1 deletion CLI/CMUXCLI+CoderouterPassthrough.swift
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ extension CMUXCLI {
throw Self.coderouterUnavailable(String(
format: Self.localizedPassthroughString(
"cli.coderouter.bootstrap.installedNotFound",
defaultValue: "The CodeRouter installer finished, but no CodeRouter CLI was found in %@. Add its bin directory to PATH and retry."
defaultValue: "The CodeRouter installer finished, but its command could not be found in %@. Check the installation and try again."
),
binDirectory.path
))
Expand Down
2 changes: 1 addition & 1 deletion CLI/CMUXCLI+ExecutableResolution.swift
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ extension CMUXCLI {
func missingProviderExecutableMessage(displayName: String, executableName: String) -> String {
let format = String(
localized: "agentSession.error.missingProviderExecutable",
defaultValue: "%@ was not found. Install it and make sure \"%@\" is available on PATH."
defaultValue: "%@ was not found. Install it and make sure \"%@\" can be run from your terminal."
)
return String(format: format, displayName, executableName)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1632,15 +1632,11 @@ actor RetryDelayRecorder {
await PushRegistrationURLProtocol.script.requests.map(\.httpMethod)
== ["DELETE"]
)
// Join the service's disable reconciliation task. Request observation
// only proves that DELETE started; the actor may still be committing
// the durable tombstone removal when the URL protocol records it.
await service.applyEnabledIntent(false, generation: 1)
Comment thread
cursor[bot] marked this conversation as resolved.
let reopenedStore = try PendingUnregisterStore(databaseURL: storeURL)
// A request being recorded precedes URLSession completion and the
// durable DELETE commit; scheduler turns are not a completion signal.
let clock = ContinuousClock()
let deadline = clock.now.advanced(by: .seconds(1))
while !reopenedStore.batch(accountID: "account-a", limit: 2).isEmpty,
clock.now < deadline {
try await clock.sleep(for: .milliseconds(1))
}
#expect(reopenedStore.batch(accountID: "account-a", limit: 2).isEmpty)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ public enum CmuxDiffViewerSessionError: Int, Equatable, Error, LocalizedError, S
case .invalidToken:
String(
localized: "diffViewer.error.invalidToken",
defaultValue: "Invalid diff viewer token",
defaultValue: "Could not open the diff viewer. Try again.",
bundle: .module
)
case .emptyAllowlist:
Expand Down Expand Up @@ -71,13 +71,13 @@ public enum CmuxDiffViewerSessionError: Int, Equatable, Error, LocalizedError, S
case .invalidManifest:
String(
localized: "diffViewer.error.invalidManifest",
defaultValue: "Invalid diff viewer manifest",
defaultValue: "Could not load the diff viewer. Try again.",
bundle: .module
)
case .manifestTooLarge:
String(
localized: "diffViewer.error.manifestTooLarge",
defaultValue: "Diff viewer manifest is too large",
defaultValue: "The diff is too large to display. Try opening fewer files.",
bundle: .module
)
case .unsafeTrustedRoot:
Expand Down
Loading
Loading