Skip to content

Update Fleet-maintained apps - #49537

Closed
fleet-release wants to merge 1 commit into
mainfrom
fma-2607181616
Closed

Update Fleet-maintained apps#49537
fleet-release wants to merge 1 commit into
mainfrom
fma-2607181616

Conversation

@fleet-release

@fleet-release fleet-release commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Automated ingestion of latest Fleet-maintained app data.

Summary by CodeRabbit

  • Updates
    • Updated maintained application versions and installation metadata for ChatGPT, ChatWise, CLion, Clop, CodexBar, Dataflare, Firefox Nightly, Kitty, MassCode, Microsoft Edge, Outlook, Pika, and Super Productivity.
    • Installers now reference the latest release packages and verified checksums.
    • Improved ChatGPT macOS removal coverage for related application data.
    • Updated Outlook macOS installation and relaunch behavior for more reliable upgrades.

Generated automatically with cmd/maintained-apps.
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/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) ===

@coderabbitai

coderabbitai Bot commented Jul 18, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

Updated 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 launchctl asuser.

Possibly related PRs

  • fleetdm/fleet#49533: Overlaps on the ChatGPT uninstall script update and several maintained-app metadata changes.
  • fleetdm/fleet#49535: Updates the same ChatGPT metadata and other overlapping maintained-app entries.
  • fleetdm/fleet#49532: Updates the Microsoft Edge and Super Productivity maintained-app metadata.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is too vague and omits the required template sections like Related issue, Testing, and checklist items. Expand the description to match the template: add a related issue and complete the relevant checklist and testing sections.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately reflects the PR's main change: updating Fleet-maintained apps.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fma-2607181616

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (1)
ee/maintained-apps/outputs/microsoft-outlook/darwin.json (1)

18-20: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Use $INSTALLER_PATH directly to avoid hardcoded version dependencies.

The install script reconstructs the path to the installer package using $TMPDIR and 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 $TMPDIR variable entirely.

Additionally, macOS mktemp works most reliably with at least 6 Xs 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

📥 Commits

Reviewing files that changed from the base of the PR and between 7cb2399 and bd495ed.

📒 Files selected for processing (14)
  • ee/maintained-apps/outputs/chatgpt/darwin.json
  • ee/maintained-apps/outputs/chatwise/darwin.json
  • ee/maintained-apps/outputs/clion/windows.json
  • ee/maintained-apps/outputs/clop/darwin.json
  • ee/maintained-apps/outputs/codexbar/darwin.json
  • ee/maintained-apps/outputs/dataflare/darwin.json
  • ee/maintained-apps/outputs/dataflare/windows.json
  • ee/maintained-apps/outputs/firefox@nightly/darwin.json
  • ee/maintained-apps/outputs/kitty/darwin.json
  • ee/maintained-apps/outputs/masscode/darwin.json
  • ee/maintained-apps/outputs/microsoft-edge/windows.json
  • ee/maintained-apps/outputs/microsoft-outlook/darwin.json
  • ee/maintained-apps/outputs/pika/darwin.json
  • ee/maintained-apps/outputs/super-productivity/darwin.json

Comment on lines 18 to +20
"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"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Comment on lines +4 to +12
"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",

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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

@github-actions

Copy link
Copy Markdown
Contributor

Closing in favor of #49539.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants