Update Fleet-maintained apps - #45786
Conversation
Generated automatically with cmd/maintained-apps.
There was a problem hiding this comment.
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.
Script Diff Resultsee/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' |
WalkthroughThis 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
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ 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: 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
📒 Files selected for processing (8)
ee/maintained-apps/outputs/blender/darwin.jsonee/maintained-apps/outputs/blender/windows.jsonee/maintained-apps/outputs/claude/darwin.jsonee/maintained-apps/outputs/discord/darwin.jsonee/maintained-apps/outputs/postman/darwin.jsonee/maintained-apps/outputs/transmit/darwin.jsonee/maintained-apps/outputs/warp/darwin.jsonee/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", |
There was a problem hiding this comment.
🧩 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.jsonRepository: 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.
Automated ingestion of latest Fleet-maintained app data.
Summary by CodeRabbit