Add macOS Fleet-maintained apps (G) - #47232
Conversation
Adds 22 Fleet-maintained app(s) whose cask token starts with 'G': 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 #47232 +/- ##
==========================================
- Coverage 67.14% 67.14% -0.01%
==========================================
Files 3024 3045 +21
Lines 226564 226606 +42
Branches 11868 11867 -1
==========================================
+ Hits 152129 152150 +21
- Misses 60695 60717 +22
+ Partials 13740 13739 -1
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:
|
|
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 (22)
📒 Files selected for processing (67)
WalkthroughThis PR adds support for 23 new macOS applications (with names starting with "G") to Fleet's maintained-app catalog. It introduces Homebrew input metadata files defining each app's identifier and distribution format; corresponding output files with version-specific installer metadata and bash scripts for installation, uninstallation, and process management; entries in the central app registry; and frontend React icon components that are wired into the application name-to-icon mapping for UI rendering. 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 |
There was a problem hiding this comment.
Pull request overview
This PR expands Fleet’s macOS Fleet-maintained apps catalog for casks whose token starts with “G”, adding corresponding app manifests (inputs/outputs), Software page icons, and catalog entries so these apps show up correctly in the UI and website-generated software catalog data.
Changes:
- Added/updated Software page icon components and extended the name→icon mapping for the new “G*” apps.
- Added new Fleet-maintained app manifests under
ee/maintained-apps/outputs/**/darwin.json(with install/uninstall script refs). - Registered the new apps in
ee/maintained-apps/outputs/apps.jsonand added matchingee/maintained-apps/inputs/homebrew/*.jsoninputs.
Reviewed changes
Copilot reviewed 67 out of 89 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/pages/SoftwarePage/components/icons/index.ts | Adds imports and software-name-to-icon map entries for new “G*” apps. |
| frontend/pages/SoftwarePage/components/icons/Gyazo.tsx | Adds Gyazo icon component. |
| frontend/pages/SoftwarePage/components/icons/Glyphs.tsx | Adds Glyphs icon component. |
| frontend/pages/SoftwarePage/components/icons/GitupApp.tsx | Adds GitUp icon component. |
| frontend/pages/SoftwarePage/components/icons/Gitify.tsx | Adds Gitify icon component. |
| ee/maintained-apps/outputs/gyazo/darwin.json | Adds Gyazo macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/grids/darwin.json | Adds Grids macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/grandperspective/darwin.json | Adds GrandPerspective macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gpodder/darwin.json | Adds gPodder macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/google-earth-pro/darwin.json | Adds Google Earth Pro macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/goodsync/darwin.json | Adds GoodSync macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gog-galaxy/darwin.json | Adds GOG Galaxy macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/godspeed/darwin.json | Adds Godspeed macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/godot/darwin.json | Adds Godot macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/go2shell/darwin.json | Adds Go2Shell macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/glyphs/darwin.json | Adds Glyphs macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gitup-app/darwin.json | Adds GitUp macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gitify/darwin.json | Adds Gitify macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/github-copilot-for-xcode/darwin.json | Adds GitHub Copilot for Xcode macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gitfinder/darwin.json | Adds GitFinder macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gephi/darwin.json | Adds Gephi macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gemini/darwin.json | Adds Gemini (MacPaw) macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/geekbench/darwin.json | Adds Geekbench macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/geany/darwin.json | Adds Geany macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gdevelop/darwin.json | Adds GDevelop macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/gather/darwin.json | Adds Gather Town macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/garmin-express/darwin.json | Adds Garmin Express macOS maintained app output (version, queries, scripts). |
| ee/maintained-apps/outputs/apps.json | Registers the new apps in the maintained-apps catalog list. |
| ee/maintained-apps/inputs/homebrew/gyazo.json | Adds Homebrew input for Gyazo. |
| ee/maintained-apps/inputs/homebrew/grids.json | Adds Homebrew input for Grids. |
| ee/maintained-apps/inputs/homebrew/grandperspective.json | Adds Homebrew input for GrandPerspective. |
| ee/maintained-apps/inputs/homebrew/gpodder.json | Adds Homebrew input for gPodder. |
| ee/maintained-apps/inputs/homebrew/google-earth-pro.json | Adds Homebrew input for Google Earth Pro. |
| ee/maintained-apps/inputs/homebrew/goodsync.json | Adds Homebrew input for GoodSync. |
| ee/maintained-apps/inputs/homebrew/gog-galaxy.json | Adds Homebrew input for GOG Galaxy. |
| ee/maintained-apps/inputs/homebrew/godspeed.json | Adds Homebrew input for Godspeed. |
| ee/maintained-apps/inputs/homebrew/godot.json | Adds Homebrew input for Godot. |
| ee/maintained-apps/inputs/homebrew/go2shell.json | Adds Homebrew input for Go2Shell. |
| ee/maintained-apps/inputs/homebrew/glyphs.json | Adds Homebrew input for Glyphs. |
| ee/maintained-apps/inputs/homebrew/gitup-app.json | Adds Homebrew input for GitUp. |
| ee/maintained-apps/inputs/homebrew/gitify.json | Adds Homebrew input for Gitify. |
| ee/maintained-apps/inputs/homebrew/github-copilot-for-xcode.json | Adds Homebrew input for GitHub Copilot for Xcode. |
| ee/maintained-apps/inputs/homebrew/gitfinder.json | Adds Homebrew input for GitFinder. |
| ee/maintained-apps/inputs/homebrew/gephi.json | Adds Homebrew input for Gephi. |
| ee/maintained-apps/inputs/homebrew/gemini.json | Adds Homebrew input for Gemini (MacPaw). |
| ee/maintained-apps/inputs/homebrew/geekbench.json | Adds Homebrew input for Geekbench. |
| ee/maintained-apps/inputs/homebrew/geany.json | Adds Homebrew input for Geany. |
| ee/maintained-apps/inputs/homebrew/gdevelop.json | Adds Homebrew input for GDevelop. |
| ee/maintained-apps/inputs/homebrew/gather.json | Adds Homebrew input for Gather Town. |
| ee/maintained-apps/inputs/homebrew/garmin-express.json | Adds Homebrew input for Garmin Express. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "name": "Gemini", | ||
| "slug": "gemini/darwin", | ||
| "platform": "darwin", | ||
| "unique_identifier": "com.macpaw.site.Gemini2", | ||
| "description": "Gemini is a disk space cleaner that finds and deletes duplicated and similar files." |
| "slug": "garmin-express/darwin", | ||
| "platform": "darwin", | ||
| "unique_identifier": "com.garmin.renu.client", | ||
| "description": "Garmin Express is an update maps and software, sync with Garmin Connect and register your device." |
| "slug": "github-copilot-for-xcode/darwin", | ||
| "platform": "darwin", | ||
| "unique_identifier": "com.github.CopilotForXcode", | ||
| "description": "GitHub Copilot for Xcode is a xcode extension for GitHub Copilot." |
| "slug": "gitify/darwin", | ||
| "platform": "darwin", | ||
| "unique_identifier": "com.electron.gitify", | ||
| "description": "Gitify is a GitHub notifications on your menu bar." |
| "slug": "go2shell/darwin", | ||
| "platform": "darwin", | ||
| "unique_identifier": "com.zipzapmac.Go2Shell", | ||
| "description": "Go2Shell is an opens a terminal window to the current directory in Finder." |
| @@ -0,0 +1,10 @@ | |||
| { | |||
| "name": "Gemini", | |||
| } | ||
| ], | ||
| "refs": { | ||
| "0ee76fb2": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\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\nsudo rm -rf \"$APPDIR/Gemini 2.app\"\nsudo rmdir '~/.gemini'\ntrash $LOGGED_IN_USER '/Users/Shared/Gemini 2'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Gemini*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.macpaw.site.Gemini*'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.macpaw.site.Gemini*.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/com.macpaw.site.Gemini*'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.macpaw.site.Gemini*'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.macpaw.site.Gemini*'\n", |
| ], | ||
| "refs": { | ||
| "2eef54ed": "#!/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\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'net.sourceforge.grandperspectiv'\nif [ -d \"$APPDIR/GrandPerspective.app\" ]; then\n\tsudo mv \"$APPDIR/GrandPerspective.app\" \"$TMPDIR/GrandPerspective.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/GrandPerspective.app\" \"$APPDIR\"\nrelaunch_application 'net.sourceforge.grandperspectiv'\n", | ||
| "9cc63336": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\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\nsudo rm -rf \"$APPDIR/GrandPerspective.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/net.courceforge.grandperspectiv'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/net.sourceforge.grandperspectiv.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Containers/net.sourceforge.grandperspectiv'\ntrash $LOGGED_IN_USER '~/Library/Preferences/net.sourceforge.grandperspectiv.plist'\n" |
| } | ||
| ], | ||
| "refs": { | ||
| "1a27516d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\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\nsudo rm -rf \"$APPDIR/Geekbench 6.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.primatelabs.Geekbench6'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.primatelabs.Geekbench6'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.primatelabs.Geekbench6.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.primeatelabs.Geekbench6.savedState'\n", |
| import Gitfinder from "./Gitfinder"; | ||
| import GithubCopilotForXcode from "./GithubCopilotForXcode"; | ||
| import GitHubDesktop from "./GitHubDesktop"; |
Adds 22 Fleet-maintained app(s) whose cask token starts with 'G': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries.
Summary by CodeRabbit