cmux-next: Status Indicators setting, Animated or Static (cx-sya4n)
cmux NEXT gets a Status indicators setting under Settings > Appearance > Loading Indicator, with the choices Animated (the default) and Static. In cmux.json it's appearance.statusIndicator.animation. Static stills every status indicator and draws a distinct shape for each state, which is the static look from #21659. Reduce Motion always uses Static (cx-sya4n: blinking lights give a teammate headaches).
StatusIndicatorConfigParserreadsanimation, and a bad value keepsanimatedand reports a diagnostic. The schema descriptor gives the row a choice and search keywords, and the key is agent-settable like itsappearance.statusIndicator.*neighbours.- Strings: four new keys in the CmuxNextSettings catalog:
settings.statusIndicator.animation,settings.choice.animatedandsettings.choice.static, translated in all 21 catalog locales and taken from #20511.settings.statusIndicator.animation.help: "Static draws a still, distinct shape for each state. Reduce Motion always uses Static." This is new text, translated for the nine required macOS locales and using each locale's system name for Reduce Motion.
- The help text is translated in all 21 catalog locales:
check-l10ncounts every catalog locale. - Settings exports:
settings-schema.json(the row, its page slot andschema_hash), the mdm JSON, plist and table, the source stamp, the defaults snapshot andsettings/generated/strings.json.- They're written on Linux, with the exporter's rules ported to Python:
DeterministicJSON, anddefaults_guard.py's stamp and snapshot. - The port reproduces the checked-in
settings-schema.jsonbyte for byte, including its hash, before this row is added. defaults_guard.py check-freshpasses.SettingsSchemaExportTestsandManagedPreferencesManifestTestscompare the files with the Swift exporter in CI.
- They're written on Linux, with the exporter's rules ported to Python:
Stacked on #21659. This branch contains #21659's two commits, so review the top two: 32c6f732e9c (test) and 60c5e765745. Once #21659 merges, the diff shrinks to those.
Freeze WINDOW areas: the CmuxNext settings schema (CmuxNextSettings/Schema/SettingsSchema+StatusIndicator.swift, SettingsSchema+AgentPolicy.swift, StatusIndicatorConfigParser.swift) and its string catalog (CmuxNextSettings/Localizable.xcstrings), plus the regenerated exports and the defaults snapshot (a new default: animated). No Package.swift or Cargo changes.
Testing
-
StatusIndicatorAnimationSettingTests(CmuxNextSettingsTests) covers:- unset means
animated - both values parse
- a bad value keeps the default and reports a diagnostic
- the row offers exactly
StatusIndicatorAnimation's cases, defaults toanimated, and is agent-settable
The test is committed first (32c6f732e9c) and the change after it (60c5e765745). Neither has run yet: this host is Linux, so this PR's macOS CI lane is the first run.
- unset means
-
Localization audit:
localization_catalog.py checkon the Settings catalog reports nothing for the four new keys. The catalog's existingneeds_reviewentries are what it does flag.- The four keys have
translatedentries foren,de,fr,ar,es,zh-Hant,zh-Hans,koandja. - The changed Swift has no new bare English: the row's texts go through
SettingsText.keyed. scripts/localize-changescouldn't run here because this sparse checkout has noweb/.
-
lint-swift-post-edit.shis clean on the changed Swift.
Changelog
Added: in cmux NEXT, Settings > Appearance > Loading Indicator > Status Indicators (Animated / Static); Static stills every status indicator.
🤖 Generated with Claude Code