Update Fleet-maintained apps - #49537
Conversation
Generated automatically with cmd/maintained-apps.
Script Diff Resultsee/maintained-apps/outputs/chatgpt/darwin.json=== Install Script (no changes) ===
=== Uninstall // 8a4a4a85 -> 678e6cf0 ===
--- /tmp/old.2xTTZm 2026-07-18 16:24:15.380053406 +0000
+++ /tmp/new.OL7Uak 2026-07-18 16:24:15.381053398 +0000
@@ -95,11 +95,21 @@
quit_application 'com.openai.codex'
sudo rm -rf "$APPDIR/ChatGPT.app"
sudo rmdir '~/.codex'
+trash $LOGGED_IN_USER '/Library/Application Support/CodexComputerUseAuthorizationPlugin'
trash $LOGGED_IN_USER '~/Library/Application Support/Codex'
trash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.openai.codex.sfl*'
+trash $LOGGED_IN_USER '~/Library/Application Support/com.openai.codex'
+trash $LOGGED_IN_USER '~/Library/Application Support/OpenAI/Codex'
+trash $LOGGED_IN_USER '~/Library/Caches/Codex'
trash $LOGGED_IN_USER '~/Library/Caches/com.openai.codex'
+trash $LOGGED_IN_USER '~/Library/Caches/com.openai.sky.CUAService'
+trash $LOGGED_IN_USER '~/Library/Group Containers/*.com.openai.sky.CUAService'
trash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.codex'
trash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.codex.binarycookies'
+trash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.sky.CUAService'
+trash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.sky.CUAService.binarycookies'
trash $LOGGED_IN_USER '~/Library/Logs/com.openai.codex'
trash $LOGGED_IN_USER '~/Library/Preferences/com.openai.codex.plist'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.openai.sky.CUAService.cli.plist'
+trash $LOGGED_IN_USER '~/Library/Preferences/com.openai.sky.CUAService.plist'
trash $LOGGED_IN_USER '~/Library/Saved Application State/com.openai.codex.savedState'ee/maintained-apps/outputs/chatwise/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/clion/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/clop/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/codexbar/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/dataflare/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/dataflare/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/firefox@nightly/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/kitty/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/masscode/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/microsoft-edge/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/microsoft-outlook/darwin.json=== Install // 6372af77 -> 1fb85dbd ===
--- /tmp/old.VvJt1h 2026-07-18 16:24:15.829049984 +0000
+++ /tmp/new.dHpwJC 2026-07-18 16:24:15.830049977 +0000
@@ -117,6 +117,6 @@
EOF
-sudo installer -pkg "$TMPDIR"/Microsoft_Outlook_16.109.26053122_Installer.pkg -target / -applyChoiceChangesXML "$CHOICE_XML"
+sudo installer -pkg "$TMPDIR"/Microsoft_Outlook_16.111.26071325_Installer.pkg -target / -applyChoiceChangesXML "$CHOICE_XML"
relaunch_application 'com.microsoft.Outlook'
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/pika/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/super-productivity/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) === |
WalkthroughUpdated maintained-app metadata for 14 macOS and Windows applications, including versions, patch-detection queries, installer URLs, and SHA-256 checksums. ChatGPT now references an expanded uninstall cleanup script. Outlook now references an updated installer script for version 16.111, including root-session relaunch handling through Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 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.
Actionable comments posted: 2
🧹 Nitpick comments (1)
ee/maintained-apps/outputs/microsoft-outlook/darwin.json (1)
18-20: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winUse
$INSTALLER_PATHdirectly to avoid hardcoded version dependencies.The install script reconstructs the path to the installer package using
$TMPDIRand a hardcoded package name (Microsoft_Outlook_16.111.26071325_Installer.pkg). This requires updating the script every time the version changes and might fail if the download agent saves the file under a different name. Using"$INSTALLER_PATH"directly is more robust and allows removing the unused$TMPDIRvariable entirely.Additionally, macOS
mktempworks most reliably with at least 6Xs in the template, so it's safer to use/tmp/choice_xml_XXXXXX.♻️ Proposed refactor
# variables APPDIR="/Applications/" -TMPDIR=$(dirname "$(realpath "$INSTALLER_PATH")") # functions quit_and_track_application() { @@ -93,7 +92,7 @@ # install pkg files quit_and_track_application 'com.microsoft.Outlook' -CHOICE_XML=$(mktemp /tmp/choice_xml_XXX) +CHOICE_XML=$(mktemp /tmp/choice_xml_XXXXXX) cat << EOF > "$CHOICE_XML" <?xml version="1.0" encoding="UTF-8"?> @@ -113,7 +112,7 @@ EOF -sudo installer -pkg "$TMPDIR"/Microsoft_Outlook_16.111.26071325_Installer.pkg -target / -applyChoiceChangesXML "$CHOICE_XML" +sudo installer -pkg "$INSTALLER_PATH" -target / -applyChoiceChangesXML "$CHOICE_XML" relaunch_application 'com.microsoft.Outlook'🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@ee/maintained-apps/outputs/microsoft-outlook/darwin.json` around lines 18 - 20, Update the install flow in the script containing quit_and_track_application and relaunch_application to invoke installer with "$INSTALLER_PATH" directly, remove the now-unused TMPDIR assignment, and change the CHOICE_XML mktemp template to /tmp/choice_xml_XXXXXX.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ee/maintained-apps/outputs/chatgpt/darwin.json`:
- Around line 18-20: Update the uninstall script’s termination sequence to call
quit_application for the actual ChatGPT bundle identifier com.openai.chat,
alongside the existing com.openai.codex call, before removing ChatGPT.app.
In `@ee/maintained-apps/outputs/codexbar/darwin.json`:
- Around line 4-12: Regenerate the CodexBar manifest entry using an existing
release: update the version in the top-level version field and patched query,
replace installer_url with the matching release asset, and set sha256 to that
asset’s checksum. Keep the bundle identifier and script references unchanged
unless the regenerated release requires otherwise.
---
Nitpick comments:
In `@ee/maintained-apps/outputs/microsoft-outlook/darwin.json`:
- Around line 18-20: Update the install flow in the script containing
quit_and_track_application and relaunch_application to invoke installer with
"$INSTALLER_PATH" directly, remove the now-unused TMPDIR assignment, and change
the CHOICE_XML mktemp template to /tmp/choice_xml_XXXXXX.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 7bebf506-d3ec-48f8-98aa-d6157743cd02
📒 Files selected for processing (14)
ee/maintained-apps/outputs/chatgpt/darwin.jsonee/maintained-apps/outputs/chatwise/darwin.jsonee/maintained-apps/outputs/clion/windows.jsonee/maintained-apps/outputs/clop/darwin.jsonee/maintained-apps/outputs/codexbar/darwin.jsonee/maintained-apps/outputs/dataflare/darwin.jsonee/maintained-apps/outputs/dataflare/windows.jsonee/maintained-apps/outputs/firefox@nightly/darwin.jsonee/maintained-apps/outputs/kitty/darwin.jsonee/maintained-apps/outputs/masscode/darwin.jsonee/maintained-apps/outputs/microsoft-edge/windows.jsonee/maintained-apps/outputs/microsoft-outlook/darwin.jsonee/maintained-apps/outputs/pika/darwin.jsonee/maintained-apps/outputs/super-productivity/darwin.json
| "refs": { | ||
| "6872008e": "#!/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.openai.chat'\nif [ -d \"$APPDIR/ChatGPT.app\" ]; then\n\tsudo mv \"$APPDIR/ChatGPT.app\" \"$TMPDIR/ChatGPT.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/ChatGPT.app\" \"$APPDIR\"\nrelaunch_application 'com.openai.chat'\n", | ||
| "8a4a4a85": "#!/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.openai.codex'\nsudo rm -rf \"$APPDIR/ChatGPT.app\"\nsudo rmdir '~/.codex'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Codex'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.openai.codex.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.codex.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.openai.codex.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.openai.codex.savedState'\n" | ||
| "678e6cf0": "#!/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.openai.codex'\nsudo rm -rf \"$APPDIR/ChatGPT.app\"\nsudo rmdir '~/.codex'\ntrash $LOGGED_IN_USER '/Library/Application Support/CodexComputerUseAuthorizationPlugin'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Codex'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.openai.codex.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/Application Support/OpenAI/Codex'\ntrash $LOGGED_IN_USER '~/Library/Caches/Codex'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.openai.sky.CUAService'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/*.com.openai.sky.CUAService'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.codex.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.sky.CUAService'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.openai.sky.CUAService.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/com.openai.codex'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.openai.codex.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.openai.sky.CUAService.cli.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.openai.sky.CUAService.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.openai.codex.savedState'\n", | ||
| "6872008e": "#!/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.openai.chat'\nif [ -d \"$APPDIR/ChatGPT.app\" ]; then\n\tsudo mv \"$APPDIR/ChatGPT.app\" \"$TMPDIR/ChatGPT.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/ChatGPT.app\" \"$APPDIR\"\nrelaunch_application 'com.openai.chat'\n" |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Missing application termination for com.openai.chat.
The uninstall script quits com.openai.codex, but omits quitting com.openai.chat, which is the actual bundle identifier used in the exists/patched queries and the install script. If the main ChatGPT application (com.openai.chat) is running, it won't be terminated before its removal, which could lead to zombie processes or failures when deleting the .app bundle.
Consider adding quit_application 'com.openai.chat' alongside quit_application 'com.openai.codex'.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/outputs/chatgpt/darwin.json` around lines 18 - 20, Update
the uninstall script’s termination sequence to call quit_application for the
actual ChatGPT bundle identifier com.openai.chat, alongside the existing
com.openai.codex call, before removing ChatGPT.app.
| "version": "0.45.0", | ||
| "queries": { | ||
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar';", | ||
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar' AND version_compare(bundle_short_version, '0.44.0') < 0);" | ||
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.steipete.codexbar' AND version_compare(bundle_short_version, '0.45.0') < 0);" | ||
| }, | ||
| "installer_url": "https://github.com/steipete/CodexBar/releases/download/v0.44.0/CodexBar-macos-universal-0.44.0.zip", | ||
| "installer_url": "https://github.com/steipete/CodexBar/releases/download/v0.45.0/CodexBar-macos-universal-0.45.0.zip", | ||
| "install_script_ref": "aea54a4e", | ||
| "uninstall_script_ref": "efcab822", | ||
| "sha256": "958c4b3fc64367d833b6e26df98d262b16384a52dcf6b8181f9b98091505671f", | ||
| "sha256": "624172121dd792bf63e6074795e339dec83acf07792d463c28ca612f76c85217", |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Fix the nonexistent CodexBar release reference.
On July 18, 2026, both the v0.45.0 release tag and the configured installer asset return 404, so installations and upgrades using this manifest will fail. Update the version, URL, and checksum to an existing release, or regenerate this entry. ()
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/outputs/codexbar/darwin.json` around lines 4 - 12,
Regenerate the CodexBar manifest entry using an existing release: update the
version in the top-level version field and patched query, replace installer_url
with the matching release asset, and set sha256 to that asset’s checksum. Keep
the bundle identifier and script references unchanged unless the regenerated
release requires otherwise.
Source: MCP tools
|
Closing in favor of #49539. |
Automated ingestion of latest Fleet-maintained app data.
Summary by CodeRabbit