Add macOS Fleet-maintained apps (W) - #47182
Conversation
Adds 23 Fleet-maintained app(s) whose cask token starts with 'W': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries. Split out from #47121.
Codecov Report❌ Patch coverage is Additional details and impacted files@@ Coverage Diff @@
## main #47182 +/- ##
==========================================
- Coverage 67.19% 67.19% -0.01%
==========================================
Files 2926 2946 +20
Lines 226388 226428 +40
Branches 11683 11683
==========================================
+ Hits 152122 152142 +20
- Misses 60524 60544 +20
Partials 13742 13742
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
Remove Waterfox, WezTerm, and Witch from the repository: delete EE maintained-apps input manifests and per-platform output JSON (darwin), remove corresponding install/uninstall script refs, remove app entries from ee/maintained-apps/outputs/apps.json, delete frontend SVG icon components and website PNG assets, and update the icon index. This cleans up all traces of these three apps from the maintained apps data, UI icons, and website images.
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
This PR expands the catalog of supported macOS apps and their UI representation by adding new maintained-app manifests plus corresponding SoftwarePage icon mappings/components.
Changes:
- Added multiple new maintained-app definitions (inputs + generated outputs) and appended them to the consolidated
apps.json. - Added new icon React components and wired them into
SOFTWARE_NAME_TO_ICON_MAP. - Added installer/uninstaller scripts for the new maintained apps (embedded as refs in the generated output JSON).
Reviewed changes
Copilot reviewed 62 out of 82 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/pages/SoftwarePage/components/icons/index.ts | Registers new icon imports and maps additional software names to icon components. |
| frontend/pages/SoftwarePage/components/icons/Wave.tsx | Adds Wave Terminal icon component. |
| frontend/pages/SoftwarePage/components/icons/Wavebox.tsx | Supports Wavebox icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Wealthfolio.tsx | Adds Wealthfolio icon component. |
| frontend/pages/SoftwarePage/components/icons/Weasis.tsx | Adds Weasis icon component. |
| frontend/pages/SoftwarePage/components/icons/Webcatalog.tsx | Adds WebCatalog icon component. |
| frontend/pages/SoftwarePage/components/icons/Wechat.tsx | Supports WeChat icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Weektodo.tsx | Adds WeekToDo icon component. |
| frontend/pages/SoftwarePage/components/icons/Whatroute.tsx | Supports WhatRoute icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Whisky.tsx | Supports Whisky icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Whispering.tsx | Supports Whispering icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Wifiman.tsx | Supports WiFiman Desktop icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Windowkeys.tsx | Supports WindowKeys icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Wins.tsx | Adds Wins icon component. |
| frontend/pages/SoftwarePage/components/icons/WisprFlow.tsx | Adds Wispr Flow icon component. |
| frontend/pages/SoftwarePage/components/icons/WondershareEdrawmax.tsx | Supports EdrawMax icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/WondershareFilmora.tsx | Supports Wondershare Filmora icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Wordservice.tsx | Supports WordService icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Workflowy.tsx | Supports WorkFlowy icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/WorksheetCrafter.tsx | Supports Worksheet Crafter icon rendering (via new component). |
| frontend/pages/SoftwarePage/components/icons/Workspaces.tsx | Supports Workspaces icon rendering (via new component). |
| ee/maintained-apps/outputs/workspaces/darwin.json | Adds generated install/uninstall metadata and scripts for Workspaces. |
| ee/maintained-apps/outputs/worksheet-crafter/darwin.json | Adds generated install/uninstall metadata and scripts for Worksheet Crafter. |
| ee/maintained-apps/outputs/workflowy/darwin.json | Adds generated install/uninstall metadata and scripts for WorkFlowy. |
| ee/maintained-apps/outputs/wordservice/darwin.json | Adds generated install/uninstall metadata and scripts for WordService. |
| ee/maintained-apps/outputs/wondershare-filmora/darwin.json | Adds generated install/uninstall metadata and scripts for Wondershare Filmora. |
| ee/maintained-apps/outputs/wondershare-edrawmax/darwin.json | Adds generated install/uninstall metadata and scripts for EdrawMax. |
| ee/maintained-apps/outputs/wispr-flow/darwin.json | Adds generated install/uninstall metadata and scripts for Wispr Flow. |
| ee/maintained-apps/outputs/wins/darwin.json | Adds generated install/uninstall metadata and scripts for Wins. |
| ee/maintained-apps/outputs/windowkeys/darwin.json | Adds generated install/uninstall metadata and scripts for WindowKeys. |
| ee/maintained-apps/outputs/wifiman/darwin.json | Adds generated install/uninstall metadata and scripts for WiFiman Desktop. |
| ee/maintained-apps/outputs/whispering/darwin.json | Adds generated install/uninstall metadata and scripts for Whispering. |
| ee/maintained-apps/outputs/whisky/darwin.json | Adds generated install/uninstall metadata and scripts for Whisky. |
| ee/maintained-apps/outputs/whatroute/darwin.json | Adds generated install/uninstall metadata and scripts for WhatRoute. |
| ee/maintained-apps/outputs/weektodo/darwin.json | Adds generated install/uninstall metadata and scripts for WeekToDo. |
| ee/maintained-apps/outputs/wechat/darwin.json | Adds generated install/uninstall metadata and scripts for WeChat for Mac. |
| ee/maintained-apps/outputs/webcatalog/darwin.json | Adds generated install/uninstall metadata and scripts for WebCatalog. |
| ee/maintained-apps/outputs/weasis/darwin.json | Adds generated install/uninstall metadata and scripts for Weasis. |
| ee/maintained-apps/outputs/wealthfolio/darwin.json | Adds generated install/uninstall metadata and scripts for Wealthfolio. |
| ee/maintained-apps/outputs/wavebox/darwin.json | Adds generated install/uninstall metadata and scripts for Wavebox. |
| ee/maintained-apps/outputs/wave/darwin.json | Adds generated install/uninstall metadata and scripts for Wave Terminal. |
| ee/maintained-apps/outputs/apps.json | Appends entries for the newly supported apps to the consolidated list. |
| ee/maintained-apps/inputs/homebrew/workspaces.json | Adds Homebrew input metadata for Workspaces. |
| ee/maintained-apps/inputs/homebrew/worksheet-crafter.json | Adds Homebrew input metadata for Worksheet Crafter. |
| ee/maintained-apps/inputs/homebrew/workflowy.json | Adds Homebrew input metadata for WorkFlowy. |
| ee/maintained-apps/inputs/homebrew/wordservice.json | Adds Homebrew input metadata for WordService. |
| ee/maintained-apps/inputs/homebrew/wondershare-filmora.json | Adds Homebrew input metadata for Wondershare Filmora. |
| ee/maintained-apps/inputs/homebrew/wondershare-edrawmax.json | Adds Homebrew input metadata for EdrawMax. |
| ee/maintained-apps/inputs/homebrew/wispr-flow.json | Adds Homebrew input metadata for Wispr Flow. |
| ee/maintained-apps/inputs/homebrew/wins.json | Adds Homebrew input metadata for Wins. |
| ee/maintained-apps/inputs/homebrew/windowkeys.json | Adds Homebrew input metadata for WindowKeys. |
| ee/maintained-apps/inputs/homebrew/wifiman.json | Adds Homebrew input metadata for WiFiman Desktop. |
| ee/maintained-apps/inputs/homebrew/whispering.json | Adds Homebrew input metadata for Whispering. |
| ee/maintained-apps/inputs/homebrew/whisky.json | Adds Homebrew input metadata for Whisky. |
| ee/maintained-apps/inputs/homebrew/whatroute.json | Adds Homebrew input metadata for WhatRoute. |
| ee/maintained-apps/inputs/homebrew/weektodo.json | Adds Homebrew input metadata for WeekToDo. |
| ee/maintained-apps/inputs/homebrew/wechat.json | Adds Homebrew input metadata for WeChat for Mac. |
| ee/maintained-apps/inputs/homebrew/webcatalog.json | Adds Homebrew input metadata for WebCatalog. |
| ee/maintained-apps/inputs/homebrew/weasis.json | Adds Homebrew input metadata for Weasis. |
| ee/maintained-apps/inputs/homebrew/wealthfolio.json | Adds Homebrew input metadata for Wealthfolio. |
| ee/maintained-apps/inputs/homebrew/wavebox.json | Adds Homebrew input metadata for Wavebox. |
| ee/maintained-apps/inputs/homebrew/wave.json | Adds Homebrew input metadata for Wave Terminal. |
Comments suppressed due to low confidence (2)
ee/maintained-apps/outputs/wondershare-edrawmax/darwin.json:1
- Using
"sha256": "no_check"disables integrity verification of the downloaded installer. Please provide the actual SHA-256 (preferred) or, if skipping checks is unavoidable (e.g., upstream changes frequently), document the rationale and consider an alternative verification method (signature verification, pinned HTTPS origin with additional checks) to reduce supply-chain risk.
frontend/pages/SoftwarePage/components/icons/Wave.tsx:1 - These icon components embed large base64-encoded PNG payloads directly in TSX, which can substantially increase the JS bundle size and slow page load/parsing. Prefer shipping optimized SVG paths, or loading image assets via static files/CDN (with caching) instead of inlining; additionally, if these icons are decorative, consider setting
aria-hidden="true"/focusable="false"to avoid unnecessary accessibility noise.
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| } | ||
| ], | ||
| "refs": { | ||
| "18d6be1e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.tencent.xinWeChat'\nsudo rm -rf \"$APPDIR/WeChat.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/$(TeamIdentifierPrefix)com.tencent.xinWeChat'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/$(TeamIdentifierPrefix)com.tencent.xinWeChat.IPCHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.tencent.xinWeChat'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.tencent.xinWeChat.MiniProgram'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.tencent.xinWeChat.WeChatMacShare'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.tencent.xinWeChat'\ntrash $LOGGED_IN_USER '~/Library/Containers/$(TeamIdentifierPrefix)com.tencent.xinWeChat.IPCHelper'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.tencent.xinWeChat'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.tencent.xinWeChat.MiniProgram'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.tencent.xinWeChat.WeChatMacShare'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.tencent.xinWeChat.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/$(TeamIdentifierPrefix)com.tencent.xinWeChat'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.tencent.xinWeChat.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.tencent.xinWeChat.savedState'\n", |
| } | ||
| ], | ||
| "refs": { | ||
| "2c394b45": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.isaacmarovitz.Whisky'\nif [ -d \"$APPDIR/Whisky.app\" ]; then\n\tsudo mv \"$APPDIR/Whisky.app\" \"$TMPDIR/Whisky.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Whisky.app\" \"$APPDIR\"\nrelaunch_application 'com.isaacmarovitz.Whisky'\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/Whisky.app/Contents/Resources/WhiskyCmd\" \"whisky\"\n", |
| "slug": "workflowy/darwin", | ||
| "platform": "darwin", | ||
| "unique_identifier": "com.workflowy.desktop", | ||
| "description": "WorkFlowy is an app for notetaking tool." |
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: ⛔ Files ignored due to path filters (20)
📒 Files selected for processing (62)
WalkthroughThis PR adds 20 new macOS applications to the Fleet maintained-apps system. It defines input metadata for each app, creates macOS release configurations with embedded install/uninstall shell scripts that handle app lifecycle management, adds entries to the application registry, creates frontend icon components, and registers those icons in the lookup table. The install scripts manage app state preservation during updates and use privilege-aware GUI session relaunch logic. The uninstall scripts safely remove app bundles and user data by trashing files under the logged-in console user's context. Possibly related PRs
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Adds 23 Fleet-maintained app(s) whose cask token starts with 'W': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries.
Summary by CodeRabbit