Skip to content

Update Fleet-maintained apps - #45786

Merged
allenhouchins merged 1 commit into
mainfrom
fma-2605191255
May 19, 2026
Merged

Update Fleet-maintained apps#45786
allenhouchins merged 1 commit into
mainfrom
fma-2605191255

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

  • Chores
    • Updated application versions for multiple maintained apps: Blender (5.1.1→5.1.2), Postman (12.11.0→12.11.2), and Warp stable release
    • Enhanced application lifecycle management for Claude, Discord, Transmit, and Zotero with improved system cleanup procedures
    • Updated installation metadata and checksums across macOS and Windows platforms

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/blender/windows.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.IHzzTZ	2026-05-19 12:59:20.972302683 +0000
+++ /tmp/new.GdfSz3	2026-05-19 12:59:20.972302683 +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.qdJ6sQ	2026-05-19 12:59:21.026302611 +0000
+++ /tmp/new.eEmhcs	2026-05-19 12:59:21.026302611 +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.UY9VEO	2026-05-19 12:59:21.104302508 +0000
+++ /tmp/new.IAuvuK	2026-05-19 12:59:21.104302508 +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.ZMMd3C	2026-05-19 12:59:21.191302392 +0000
+++ /tmp/new.1GdJbC	2026-05-19 12:59:21.191302392 +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 maintained app metadata for seven applications. It includes version bumps for Blender (5.1.1 → 5.1.2 on macOS and Windows), Postman (12.11.0 → 12.11.2 on macOS), and Warp (dated snapshot update on macOS), each with corresponding URL and checksum updates. Additionally, the PR enhances uninstall scripts for Claude, Discord, Transmit, and Zotero by introducing graceful app-quit logic that checks for running processes and logged-in users before deleting application bundles and cleaning up associated user data.

Possibly related PRs

  • fleetdm/fleet#45698: Updates Postman maintained app metadata version and installer URL in the same configuration file.
  • fleetdm/fleet#45225: Updates Warp maintained app metadata by bumping version and installer URL in ee/maintained-apps/outputs/warp/darwin.json.
  • fleetdm/fleet#45571: Modifies Postman and Warp maintained-app JSON entries with version and installer metadata updates.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The PR description is minimal but the template requires extensive checklists for validation, testing, database migrations, and platform compatibility that are not addressed. Complete the required checklist items from the template, including confirming data validation, testing approaches, and platform compatibility verification for the app updates.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title 'Update Fleet-maintained apps' directly and clearly summarizes the main change—updating Fleet-maintained app data across multiple application JSON configuration files.
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-2605191255

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: 1

🤖 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/zotero/darwin.json`:
- Line 19: The rmdir command uses a single-quoted '~/Zotero' so tilde won't
expand and the remove will fail; replace the literal sudo rmdir '~/Zotero' with
an expanded path or reuse the existing trash helper. For example, call trash
with LOGGED_IN_USER and '~/Zotero' (trash $LOGGED_IN_USER '~/Zotero') or change
to sudo rmdir "/Users/$LOGGED_IN_USER/Zotero" so the directory is removed
correctly; update the line containing sudo rmdir and ensure it references
LOGGED_IN_USER consistently with the other cleanup calls.
🪄 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: ed459dde-fa49-40b9-be41-70a515f964b3

📥 Commits

Reviewing files that changed from the base of the PR and between ea013d0 and e40fa62.

📒 Files selected for processing (8)
  • ee/maintained-apps/outputs/blender/darwin.json
  • ee/maintained-apps/outputs/blender/windows.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": {
"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 | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Verify the uninstall script still contains a single-quoted tilde path in rmdir.
# Expected: one match showing "sudo rmdir '~/Zotero'".
rg -nP "sudo rmdir '\\~/Zotero'" ee/maintained-apps/outputs/zotero/darwin.json

Repository: fleetdm/fleet

Length of output: 2623


Fix quoted ~ path in rmdir command.

sudo rmdir '~/Zotero' uses single quotes, preventing tilde expansion. The command will fail because the literal path ~/Zotero doesn't exist. Either expand the path explicitly (e.g., sudo rmdir "/Users/$LOGGED_IN_USER/Zotero") or use the existing trash helper function like the other cleanup commands do.

🤖 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 command
uses a single-quoted '~/Zotero' so tilde won't expand and the remove will fail;
replace the literal sudo rmdir '~/Zotero' with an expanded path or reuse the
existing trash helper. For example, call trash with LOGGED_IN_USER and
'~/Zotero' (trash $LOGGED_IN_USER '~/Zotero') or change to sudo rmdir
"/Users/$LOGGED_IN_USER/Zotero" so the directory is removed correctly; update
the line containing sudo rmdir and ensure it references LOGGED_IN_USER
consistently with the other cleanup calls.

@allenhouchins
allenhouchins merged commit d11401f into main May 19, 2026
13 checks passed
@allenhouchins
allenhouchins deleted the fma-2605191255 branch May 19, 2026 13:22
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