cmux-next: Status Indicators setting, Animated or Static (cx-sya4n)

Merged
TE
19d ago
+942-9

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).

  • StatusIndicatorConfigParser reads animation, and a bad value keeps animated and reports a diagnostic. The schema descriptor gives the row a choice and search keywords, and the key is agent-settable like its appearance.statusIndicator.* neighbours.
  • Strings: four new keys in the CmuxNextSettings catalog:
    • settings.statusIndicator.animation, settings.choice.animated and settings.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-l10n counts every catalog locale.
  • Settings exports: settings-schema.json (the row, its page slot and schema_hash), the mdm JSON, plist and table, the source stamp, the defaults snapshot and settings/generated/strings.json.
    • They're written on Linux, with the exporter's rules ported to Python: DeterministicJSON, and defaults_guard.py's stamp and snapshot.
    • The port reproduces the checked-in settings-schema.json byte for byte, including its hash, before this row is added.
    • defaults_guard.py check-fresh passes. SettingsSchemaExportTests and ManagedPreferencesManifestTests compare the files with the Swift exporter in CI.

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 to animated, 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.

  • Localization audit:

    • localization_catalog.py check on the Settings catalog reports nothing for the four new keys. The catalog's existing needs_review entries are what it does flag.
    • The four keys have translated entries for en, de, fr, ar, es, zh-Hant, zh-Hans, ko and ja.
    • The changed Swift has no new bare English: the row's texts go through SettingsText.keyed.
    • scripts/localize-changes couldn't run here because this sparse checkout has no web/.
  • lint-swift-post-edit.sh is 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