Skip to content

Update Fleet-maintained apps - #45783

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

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

Conversation

@fleet-release

@fleet-release fleet-release commented May 19, 2026

Copy link
Copy Markdown
Contributor

Automated ingestion of latest Fleet-maintained app data.

Summary by CodeRabbit

  • Bug Fixes

    • Improved uninstall process for Claude, Discord, Transmit, and Zotero to gracefully terminate running applications before removal, ensuring more reliable uninstalls and proper cleanup of user data and configuration files.
  • Chores

    • Updated app versions: Blender to 5.1.2, Postman to 12.11.2, and Warp to the latest stable release with refreshed installation packages.

Review Change Stack

Generated automatically with cmd/maintained-apps.

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/blender/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/claude/darwin.json

=== Install Script (no changes) ===
=== Uninstall // d857a128 -> e555285c ===

--- /tmp/old.baFTDx	2026-05-19 09:05:49.306202931 +0000
+++ /tmp/new.OxJ7y6	2026-05-19 09:05:49.306202931 +0000
@@ -5,6 +5,46 @@
 LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
 # functions
 
+quit_application() {
+  local bundle_id="$1"
+  local timeout_duration=10
+
+  # check if the application is running
+  local app_running
+  app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+  if [[ "$app_running" != "true" ]]; then
+    return
+  fi
+
+  local console_user
+  console_user=$(stat -f "%Su" /dev/console)
+  if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+    echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+    return
+  fi
+
+  echo "Quitting application '$bundle_id'..."
+
+  # try to quit the application within the timeout period
+  local quit_success=false
+  SECONDS=0
+  while (( SECONDS < timeout_duration )); do
+    if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+      if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+        echo "Application '$bundle_id' quit successfully."
+        quit_success=true
+        break
+      fi
+    fi
+    sleep 1
+  done
+
+  if [[ "$quit_success" = false ]]; then
+    echo "Application '$bundle_id' did not quit."
+  fi
+}
+
+
 trash() {
   local logged_in_user="$1"
   local target_file="$2"
@@ -27,6 +67,8 @@
   fi
 }
 
+quit_application 'com.anthropic.claudefordesktop'
+quit_application 'com.anthropic.claudefordesktop.helper'
 sudo rm -rf "$APPDIR/Claude.app"
 trash $LOGGED_IN_USER '~/Library/Application Support/Claude'
 trash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.anthropic.claudefordesktop.sfl*'

ee/maintained-apps/outputs/discord/darwin.json

=== Install Script (no changes) ===
=== Uninstall // 72bf55d9 -> 64f1f6c2 ===

--- /tmp/old.C2ZNbB	2026-05-19 09:05:49.354202802 +0000
+++ /tmp/new.KxAq4V	2026-05-19 09:05:49.355202799 +0000
@@ -5,6 +5,46 @@
 LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
 # functions
 
+quit_application() {
+  local bundle_id="$1"
+  local timeout_duration=10
+
+  # check if the application is running
+  local app_running
+  app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+  if [[ "$app_running" != "true" ]]; then
+    return
+  fi
+
+  local console_user
+  console_user=$(stat -f "%Su" /dev/console)
+  if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+    echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+    return
+  fi
+
+  echo "Quitting application '$bundle_id'..."
+
+  # try to quit the application within the timeout period
+  local quit_success=false
+  SECONDS=0
+  while (( SECONDS < timeout_duration )); do
+    if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+      if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+        echo "Application '$bundle_id' quit successfully."
+        quit_success=true
+        break
+      fi
+    fi
+    sleep 1
+  done
+
+  if [[ "$quit_success" = false ]]; then
+    echo "Application '$bundle_id' did not quit."
+  fi
+}
+
+
 trash() {
   local logged_in_user="$1"
   local target_file="$2"
@@ -27,6 +67,9 @@
   fi
 }
 
+quit_application 'com.hnc.Discord'
+quit_application 'com.hnc.Discord.helper.Plugin'
+quit_application 'com.hnc.Discord.helper.Renderer'
 sudo rm -rf "$APPDIR/Discord.app"
 trash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.hnc.discord.sfl*'
 trash $LOGGED_IN_USER '~/Library/Application Support/discord'

ee/maintained-apps/outputs/postman/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/transmit/darwin.json

=== Install Script (no changes) ===
=== Uninstall // 2176f321 -> 16b182db ===

--- /tmp/old.hJb4z0	2026-05-19 09:05:49.426202609 +0000
+++ /tmp/new.TDgltP	2026-05-19 09:05:49.426202609 +0000
@@ -5,6 +5,46 @@
 LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
 # functions
 
+quit_application() {
+  local bundle_id="$1"
+  local timeout_duration=10
+
+  # check if the application is running
+  local app_running
+  app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+  if [[ "$app_running" != "true" ]]; then
+    return
+  fi
+
+  local console_user
+  console_user=$(stat -f "%Su" /dev/console)
+  if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+    echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+    return
+  fi
+
+  echo "Quitting application '$bundle_id'..."
+
+  # try to quit the application within the timeout period
+  local quit_success=false
+  SECONDS=0
+  while (( SECONDS < timeout_duration )); do
+    if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+      if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+        echo "Application '$bundle_id' quit successfully."
+        quit_success=true
+        break
+      fi
+    fi
+    sleep 1
+  done
+
+  if [[ "$quit_success" = false ]]; then
+    echo "Application '$bundle_id' did not quit."
+  fi
+}
+
+
 trash() {
   local logged_in_user="$1"
   local target_file="$2"
@@ -27,6 +67,7 @@
   fi
 }
 
+quit_application 'com.panic.Transmit'
 sudo rm -rf "$APPDIR/Transmit.app"
 trash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.panic.transmit.sfl*'
 trash $LOGGED_IN_USER '~/Library/Application Support/com.panic.Transmit'

ee/maintained-apps/outputs/warp/darwin.json

=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===

ee/maintained-apps/outputs/zotero/darwin.json

=== Install Script (no changes) ===
=== Uninstall // 34c55f94 -> 7aa375d3 ===

--- /tmp/old.k9qWaA	2026-05-19 09:05:49.508202389 +0000
+++ /tmp/new.3MQwLN	2026-05-19 09:05:49.508202389 +0000
@@ -5,6 +5,46 @@
 LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
 # functions
 
+quit_application() {
+  local bundle_id="$1"
+  local timeout_duration=10
+
+  # check if the application is running
+  local app_running
+  app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+  if [[ "$app_running" != "true" ]]; then
+    return
+  fi
+
+  local console_user
+  console_user=$(stat -f "%Su" /dev/console)
+  if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+    echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+    return
+  fi
+
+  echo "Quitting application '$bundle_id'..."
+
+  # try to quit the application within the timeout period
+  local quit_success=false
+  SECONDS=0
+  while (( SECONDS < timeout_duration )); do
+    if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+      if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+        echo "Application '$bundle_id' quit successfully."
+        quit_success=true
+        break
+      fi
+    fi
+    sleep 1
+  done
+
+  if [[ "$quit_success" = false ]]; then
+    echo "Application '$bundle_id' did not quit."
+  fi
+}
+
+
 trash() {
   local logged_in_user="$1"
   local target_file="$2"
@@ -27,6 +67,7 @@
   fi
 }
 
+quit_application 'org.zotero.zotero'
 sudo rm -rf "$APPDIR/Zotero.app"
 sudo rmdir '~/Zotero'
 trash $LOGGED_IN_USER '~/Library/Application Scripts/org.zotero.SafariExtensionApp.SafariExtension'

@coderabbitai

coderabbitai Bot commented May 19, 2026

Copy link
Copy Markdown
Contributor

Walkthrough

This PR updates macOS app metadata across six applications in the Fleet maintained-apps registry. Three apps receive version bumps: Blender (5.1.1 → 5.1.2), Postman (12.11.0 → 12.11.2), and Warp (0.2026.05.18.05.32.02), each with corresponding installer URL and SHA256 checksum updates. Four apps—Claude, Discord, Transmit, and Zotero—receive uninstall script enhancements that introduce a common pattern: a quit_application helper function that gracefully terminates the application (with process and user-session checks) before the app bundle and associated user data are removed and trashed.

Possibly related PRs

  • fleetdm/fleet#45225: Both PRs modify Warp darwin.json by bumping version and updating queries.patched/installer_url to match new release artifacts.
  • fleetdm/fleet#45698: Both PRs update Postman darwin.json metadata—version, queries.patched, installer_url, and SHA256 for new installer.
  • fleetdm/fleet#45571: Both PRs update maintained-app metadata for Postman and Warp, synchronizing version and installer artifacts across both files.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Description check ❓ Inconclusive The description is minimal but sufficient for an automated pull request. However, it does not follow the repository's template structure with required checklist sections. Add relevant checklist items from the template or document why this automated PR doesn't require standard checklist validation.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately and concisely summarizes the main change: updating Fleet-maintained apps configuration files with version bumps and script references.
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.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fma-2605190902

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 and usage tips.

@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: 3

🤖 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/discord/darwin.json`:
- Line 20: The path passed to the trash function uses URL-encoding and won't
match the filesystem; update the call that currently passes
"~/Library/Application%20Support/discord" to use a literal space
("~/Library/Application Support/discord") so the trash function (trash) can
locate and remove the Discord Application Support folder; ensure no other calls
to trash or string constants reference "%20" for Application Support.

In `@ee/maintained-apps/outputs/warp/darwin.json`:
- Line 12: The JSON entry sets "sha256" to "no_check", which disables integrity
verification; replace the "sha256" value with the actual SHA256 hex of the
Darwin installer (computed from the official download) so the installer is
verified, and if the checksum truly cannot be fixed, add explicit rationale
metadata (e.g., a "sha256_reason" string or documentation entry) explaining why
"no_check" is required and linking to the checksum source; look for the "sha256"
key and the "no_check" value in the Warp darwin manifest to implement this
change.

In `@ee/maintained-apps/outputs/zotero/darwin.json`:
- Line 19: The rmdir call using sudo rmdir '~/Zotero' won't remove the user's
Zotero folder (tilde is single-quoted, rmdir requires empty dir and tilde would
resolve to root if expanded); replace that line with a call to the existing
trash function to mirror other cleanup steps: use trash "$LOGGED_IN_USER"
'~/Zotero' (so the function expands the tilde to the correct user's path and
handles non-empty dirs), and remove the sudo rmdir invocation; reference the
trash function and LOGGED_IN_USER variable when making this change.
🪄 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: b65750d5-2396-4b85-af4d-82cd567f679f

📥 Commits

Reviewing files that changed from the base of the PR and between 9dd097c and 77a4db3.

📒 Files selected for processing (7)
  • ee/maintained-apps/outputs/blender/darwin.json
  • ee/maintained-apps/outputs/claude/darwin.json
  • ee/maintained-apps/outputs/discord/darwin.json
  • ee/maintained-apps/outputs/postman/darwin.json
  • ee/maintained-apps/outputs/transmit/darwin.json
  • ee/maintained-apps/outputs/warp/darwin.json
  • ee/maintained-apps/outputs/zotero/darwin.json

"refs": {
"57ec7b28": "#!/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)\nhdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\n# copy to the applications folder\nquit_and_track_application 'com.hnc.Discord'\nif [ -d \"$APPDIR/Discord.app\" ]; then\n\tsudo mv \"$APPDIR/Discord.app\" \"$TMPDIR/Discord.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Discord.app\" \"$APPDIR\"\nrelaunch_application 'com.hnc.Discord'\n",
"72bf55d9": "#!/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 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/Discord.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.hnc.discord.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/discord'\ntrash $LOGGED_IN_USER '~/Library/Application%20Support/discord'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hnc.Discord'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hnc.Discord.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.hnc.Discord.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hnc.Discord'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hnc.Discord.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hnc.Discord.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hnc.Discord.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.hnc.Discord.savedState'\n"
"64f1f6c2": "#!/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 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.hnc.Discord'\nquit_application 'com.hnc.Discord.helper.Plugin'\nquit_application 'com.hnc.Discord.helper.Renderer'\nsudo rm -rf \"$APPDIR/Discord.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.hnc.discord.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/discord'\ntrash $LOGGED_IN_USER '~/Library/Application%20Support/discord'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hnc.Discord'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.hnc.Discord.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/Cookies/com.hnc.Discord.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hnc.Discord'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.hnc.Discord.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hnc.Discord.helper.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.hnc.Discord.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.hnc.Discord.savedState'\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.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

URL-encoded path won't match actual filesystem path.

The path ~/Library/Application%20Support/discord uses URL encoding (%20), but macOS filesystem paths use literal spaces. This path will never exist, so the trash function will silently skip it, leaving Discord's Application Support data behind.

The correct path should have a space:

~/Library/Application Support/discord

Note: The other path ~/Library/Application Support/com.apple.sharedfilelist/... is correct, so this appears to be an oversight just for the discord-specific path.

🤖 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/discord/darwin.json` at line 20, The path passed
to the trash function uses URL-encoding and won't match the filesystem; update
the call that currently passes "~/Library/Application%20Support/discord" to use
a literal space ("~/Library/Application Support/discord") so the trash function
(trash) can locate and remove the Discord Application Support folder; ensure no
other calls to trash or string constants reference "%20" for Application
Support.

"installer_url": "https://releases.warp.dev/stable/v0.2026.05.18.05.32.stable_02/Warp.dmg",
"install_script_ref": "4b1c0c37",
"uninstall_script_ref": "bd923c6f",
"sha256": "no_check",

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.

⚠️ Potential issue | 🟠 Major | 🏗️ Heavy lift

Security concern: SHA256 checksum verification disabled.

The "no_check" value for sha256 bypasses integrity verification of the downloaded installer. This means the installation will proceed without verifying the file hasn't been tampered with.

If Warp's download URLs are stable and trustworthy, consider obtaining and recording the actual SHA256 checksum to enable integrity verification. If the checksums change frequently or are unpredictable, document why "no_check" is necessary.

🤖 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/warp/darwin.json` at line 12, The JSON entry sets
"sha256" to "no_check", which disables integrity verification; replace the
"sha256" value with the actual SHA256 hex of the Darwin installer (computed from
the official download) so the installer is verified, and if the checksum truly
cannot be fixed, add explicit rationale metadata (e.g., a "sha256_reason" string
or documentation entry) explaining why "no_check" is required and linking to the
checksum source; look for the "sha256" key and the "no_check" value in the Warp
darwin manifest to implement this change.

],
"refs": {
"34c55f94": "#!/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 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/Zotero.app\"\nsudo rmdir '~/Zotero'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.zotero.SafariExtensionApp.SafariExtension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Zotero'\ntrash $LOGGED_IN_USER '~/Library/Caches/Zotero'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.zotero.SafariExtensionApp.SafariExtension'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.zotero.zotero.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.zotero.zotero.savedState'\n",
"7aa375d3": "#!/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 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 'org.zotero.zotero'\nsudo rm -rf \"$APPDIR/Zotero.app\"\nsudo rmdir '~/Zotero'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/org.zotero.SafariExtensionApp.SafariExtension'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Zotero'\ntrash $LOGGED_IN_USER '~/Library/Caches/Zotero'\ntrash $LOGGED_IN_USER '~/Library/Containers/org.zotero.SafariExtensionApp.SafariExtension'\ntrash $LOGGED_IN_USER '~/Library/Preferences/org.zotero.zotero.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/org.zotero.zotero.savedState'\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.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

sudo rmdir '~/Zotero' will never work as intended.

This command has multiple issues:

  1. Single quotes prevent tilde expansion - the path is treated literally as ~/Zotero, not /Users/username/Zotero
  2. rmdir only removes empty directories - if the folder contains any files, it fails silently
  3. Even with double quotes and sudo, the tilde would expand to root's home (/var/root), not the user's

This should use the trash function (which already handles tilde expansion via $LOGGED_IN_USER) for consistency with other cleanup paths:

🐛 Proposed fix

Replace:

-sudo rmdir '~/Zotero'
+trash $LOGGED_IN_USER '~/Zotero'
🤖 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/zotero/darwin.json` at line 19, The rmdir call
using sudo rmdir '~/Zotero' won't remove the user's Zotero folder (tilde is
single-quoted, rmdir requires empty dir and tilde would resolve to root if
expanded); replace that line with a call to the existing trash function to
mirror other cleanup steps: use trash "$LOGGED_IN_USER" '~/Zotero' (so the
function expands the tilde to the correct user's path and handles non-empty
dirs), and remove the sudo rmdir invocation; reference the trash function and
LOGGED_IN_USER variable when making this change.

@github-actions

Copy link
Copy Markdown
Contributor

Closing in favor of #45786.

@github-actions github-actions Bot closed this May 19, 2026
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