cmux/skills/cmux-debug-windows/scripts/debug_windows_snapshot.sh
Lawrence Chen 0105b6256a
Add workspace tab color schemes and debug scheme toggle (#324)
* Add tab color feature to sidebar workspaces

Lets users assign a custom background color to any sidebar workspace tab
via a right-click "Tab Color" submenu. The primary motivation is working
across multiple projects simultaneously — coloring tabs by project makes
it instant to visually locate the right workspace without reading the title.

- Workspace: adds `customColor: String?` (@Published hex string) and
  `setCustomColor()` setter
- TabManager: adds `setTabColor(tabId:color:)` convenience method
- ContentView: 16-color dark palette (all luminance < 0.30, white text
  always readable), `Color(hex:)` extension, `coloredCircleImage(hex:)`
  helper to render bitmapped NSImage circles (needed because macOS menus
  strip SwiftUI foregroundColor from SF Symbols), updated `backgroundColor`
  to use custom color at full/70%/35% opacity for active/inactive/
  multi-selected states, "Tab Color" submenu in context menu with
  "Clear Color" option, and a 1.5pt `Color.primary` border overlay on
  the active tab for clear selection indication when custom colors are set

* Add workspace tab color schemes with settings and debug toggles

* Remove Kelly scheme and keep only original tab color palette

* Preserve neutral grayscale when brightening tab colors

* Harden UpdatePill UI test polling timeouts

---------

Co-authored-by: Andreas Fruth <andreas.fruth@gmail.com>
2026-02-22 17:30:30 -08:00

190 lines
6.8 KiB
Bash
Executable file

#!/usr/bin/env bash
set -euo pipefail
usage() {
cat <<'USAGE'
Usage: debug_windows_snapshot.sh [--domain <defaults-domain>] [--copy]
Collect Sidebar Debug, Background Debug, Menu Bar Extra, and Browser DevTools debug values
from macOS defaults and print a combined payload. Use --copy to also copy the payload.
Examples:
debug_windows_snapshot.sh
debug_windows_snapshot.sh --copy
debug_windows_snapshot.sh --domain dev.manaflow.cmux --copy
USAGE
}
domain=""
copy_flag=0
while [[ $# -gt 0 ]]; do
case "$1" in
--domain)
shift
[[ $# -gt 0 ]] || { echo "Missing value for --domain" >&2; exit 1; }
domain="$1"
;;
--copy)
copy_flag=1
;;
-h|--help)
usage
exit 0
;;
*)
echo "Unknown argument: $1" >&2
usage >&2
exit 1
;;
esac
shift
done
discover_domain() {
defaults domains 2>/dev/null \
| tr ',' '\n' \
| tr -d ' ' \
| grep -E 'cmux' \
| head -n1 || true
}
read_value() {
local key="$1"
local fallback="$2"
local value
value=$(defaults read "$domain" "$key" 2>/dev/null || true)
if [[ -z "$value" ]]; then
printf '%s' "$fallback"
else
printf '%s' "$value"
fi
}
format_number() {
local raw="$1"
local precision="$2"
if [[ "$raw" =~ ^-?[0-9]+([.][0-9]+)?$ ]]; then
printf "%.*f" "$precision" "$raw"
else
printf "%.*f" "$precision" 0
fi
}
if [[ -z "$domain" ]]; then
domain="$(discover_domain)"
fi
if [[ -z "$domain" ]]; then
echo "Could not auto-detect a cmux defaults domain. Pass --domain <bundle-id>." >&2
exit 1
fi
if ! defaults domains 2>/dev/null | tr ',' '\n' | tr -d ' ' | grep -Fxq "$domain"; then
echo "Defaults domain '$domain' was not found on this machine." >&2
exit 1
fi
sidebarPreset="$(read_value sidebarPreset nativeSidebar)"
sidebarMaterial="$(read_value sidebarMaterial sidebar)"
sidebarBlendMode="$(read_value sidebarBlendMode behindWindow)"
sidebarState="$(read_value sidebarState followWindow)"
sidebarBlurOpacity="$(format_number "$(read_value sidebarBlurOpacity 0.79)" 2)"
sidebarTintHex="$(read_value sidebarTintHex '#101010')"
sidebarTintOpacity="$(format_number "$(read_value sidebarTintOpacity 0.54)" 2)"
sidebarCornerRadius="$(format_number "$(read_value sidebarCornerRadius 0.0)" 1)"
sidebarActiveTabIndicatorStyle="$(read_value sidebarActiveTabIndicatorStyle solidFill)"
shortcutHintSidebarXOffset="$(format_number "$(read_value shortcutHintSidebarXOffset 0.0)" 1)"
shortcutHintSidebarYOffset="$(format_number "$(read_value shortcutHintSidebarYOffset 0.0)" 1)"
shortcutHintTitlebarXOffset="$(format_number "$(read_value shortcutHintTitlebarXOffset 4.0)" 1)"
shortcutHintTitlebarYOffset="$(format_number "$(read_value shortcutHintTitlebarYOffset 0.0)" 1)"
shortcutHintPaneTabXOffset="$(format_number "$(read_value shortcutHintPaneTabXOffset 0.0)" 1)"
shortcutHintPaneTabYOffset="$(format_number "$(read_value shortcutHintPaneTabYOffset 0.0)" 1)"
shortcutHintAlwaysShow="$(read_value shortcutHintAlwaysShow 0)"
bgGlassEnabled="$(read_value bgGlassEnabled 1)"
bgGlassMaterial="$(read_value bgGlassMaterial hudWindow)"
bgGlassTintHex="$(read_value bgGlassTintHex '#000000')"
bgGlassTintOpacity="$(format_number "$(read_value bgGlassTintOpacity 0.05)" 2)"
menubarDebugPreviewEnabled="$(read_value menubarDebugPreviewEnabled 0)"
menubarDebugPreviewCount="$(read_value menubarDebugPreviewCount 1)"
menubarDebugBadgeRectX="$(format_number "$(read_value menubarDebugBadgeRectX 5.38)" 2)"
menubarDebugBadgeRectY="$(format_number "$(read_value menubarDebugBadgeRectY 6.43)" 2)"
menubarDebugBadgeRectWidth="$(format_number "$(read_value menubarDebugBadgeRectWidth 10.75)" 2)"
menubarDebugBadgeRectHeight="$(format_number "$(read_value menubarDebugBadgeRectHeight 11.58)" 2)"
menubarDebugSingleDigitFontSize="$(format_number "$(read_value menubarDebugSingleDigitFontSize 6.70)" 2)"
menubarDebugMultiDigitFontSize="$(format_number "$(read_value menubarDebugMultiDigitFontSize 6.70)" 2)"
menubarDebugSingleDigitYOffset="$(format_number "$(read_value menubarDebugSingleDigitYOffset 0.60)" 2)"
menubarDebugMultiDigitYOffset="$(format_number "$(read_value menubarDebugMultiDigitYOffset 0.60)" 2)"
legacySingleDigitX="$(read_value menubarDebugTextRectXAdjust '')"
if [[ -n "$legacySingleDigitX" ]]; then
menubarDebugSingleDigitXAdjust="$(format_number "$legacySingleDigitX" 2)"
else
menubarDebugSingleDigitXAdjust="$(format_number "$(read_value menubarDebugSingleDigitXAdjust -1.10)" 2)"
fi
menubarDebugMultiDigitXAdjust="$(format_number "$(read_value menubarDebugMultiDigitXAdjust 2.42)" 2)"
menubarDebugTextRectWidthAdjust="$(format_number "$(read_value menubarDebugTextRectWidthAdjust 1.80)" 2)"
browserDevToolsIconName="$(read_value browserDevToolsIconName 'wrench.and.screwdriver')"
browserDevToolsIconColor="$(read_value browserDevToolsIconColor bonsplitInactive)"
payload="$(cat <<PAYLOAD
# Defaults domain
$domain
# Sidebar Debug
sidebarPreset=$sidebarPreset
sidebarMaterial=$sidebarMaterial
sidebarBlendMode=$sidebarBlendMode
sidebarState=$sidebarState
sidebarBlurOpacity=$sidebarBlurOpacity
sidebarTintHex=$sidebarTintHex
sidebarTintOpacity=$sidebarTintOpacity
sidebarCornerRadius=$sidebarCornerRadius
sidebarActiveTabIndicatorStyle=$sidebarActiveTabIndicatorStyle
shortcutHintSidebarXOffset=$shortcutHintSidebarXOffset
shortcutHintSidebarYOffset=$shortcutHintSidebarYOffset
shortcutHintTitlebarXOffset=$shortcutHintTitlebarXOffset
shortcutHintTitlebarYOffset=$shortcutHintTitlebarYOffset
shortcutHintPaneTabXOffset=$shortcutHintPaneTabXOffset
shortcutHintPaneTabYOffset=$shortcutHintPaneTabYOffset
shortcutHintAlwaysShow=$shortcutHintAlwaysShow
# Background Debug
bgGlassEnabled=$bgGlassEnabled
bgGlassMaterial=$bgGlassMaterial
bgGlassTintHex=$bgGlassTintHex
bgGlassTintOpacity=$bgGlassTintOpacity
# Menu Bar Extra Debug
menubarDebugPreviewEnabled=$menubarDebugPreviewEnabled
menubarDebugPreviewCount=$menubarDebugPreviewCount
menubarDebugBadgeRectX=$menubarDebugBadgeRectX
menubarDebugBadgeRectY=$menubarDebugBadgeRectY
menubarDebugBadgeRectWidth=$menubarDebugBadgeRectWidth
menubarDebugBadgeRectHeight=$menubarDebugBadgeRectHeight
menubarDebugSingleDigitFontSize=$menubarDebugSingleDigitFontSize
menubarDebugMultiDigitFontSize=$menubarDebugMultiDigitFontSize
menubarDebugSingleDigitYOffset=$menubarDebugSingleDigitYOffset
menubarDebugMultiDigitYOffset=$menubarDebugMultiDigitYOffset
menubarDebugSingleDigitXAdjust=$menubarDebugSingleDigitXAdjust
menubarDebugMultiDigitXAdjust=$menubarDebugMultiDigitXAdjust
menubarDebugTextRectWidthAdjust=$menubarDebugTextRectWidthAdjust
# Browser DevTools Button
browserDevToolsIconName=$browserDevToolsIconName
browserDevToolsIconColor=$browserDevToolsIconColor
PAYLOAD
)"
printf '%s\n' "$payload"
if [[ "$copy_flag" -eq 1 ]]; then
if command -v pbcopy >/dev/null 2>&1; then
printf '%s' "$payload" | pbcopy
echo "Copied debug snapshot to clipboard."
else
echo "pbcopy not available; skipped clipboard copy." >&2
fi
fi