Skip to content

Update Fleet-maintained apps - #48521

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

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

Conversation

@fleet-release

@fleet-release fleet-release commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Automated ingestion of latest Fleet-maintained app data.

Summary by CodeRabbit

  • Bug Fixes
    • Refreshed app metadata for multiple maintained apps to the latest available releases on macOS and Windows.
    • Updated version checks so installed apps are more accurately recognized as current or patched.
    • Replaced installer links and checksums to match the newer app releases.
    • Improved uninstall handling for one app to catch related background services more completely.

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/1password/darwin.json

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

ee/maintained-apps/outputs/7-zip/windows.json

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

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

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

ee/maintained-apps/outputs/bricklink-studio/darwin.json

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

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

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

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

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

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

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

ee/maintained-apps/outputs/elgato-stream-deck/darwin.json

=== Install // 1dd644a7 -> 214a13cd ===

--- /tmp/old.jFCqDY	2026-06-30 20:40:25.564571484 +0000
+++ /tmp/new.oBpfPB	2026-06-30 20:40:25.564571484 +0000
@@ -96,5 +96,5 @@
 
 # install pkg files
 quit_and_track_application 'com.elgato.StreamDeck'
-sudo installer -pkg "$TMPDIR/Stream_Deck_7.4.2.22730.pkg" -target /
+sudo installer -pkg "$TMPDIR/Stream_Deck_7.5.0.22885.pkg" -target /
 relaunch_application 'com.elgato.StreamDeck'

=== Uninstall // 19b25325 -> dd528c8d ===

--- /tmp/old.ALAEkP	2026-06-30 20:40:25.589571602 +0000
+++ /tmp/new.uGoEPi	2026-06-30 20:40:25.589571602 +0000
@@ -203,7 +203,7 @@
   fi
 }
 
-remove_launchctl_service 'com.elgato.StreamDeck'
+remove_launchctl_service 'com.elgato.StreamDeck*'
 quit_application 'com.elgato.StreamDeck'
 remove_pkg_files 'com.elgato.StreamDeck'
 forget_pkg 'com.elgato.StreamDeck'

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

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

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

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

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

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

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

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

ee/maintained-apps/outputs/grammarly-desktop/darwin.json

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

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

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

ee/maintained-apps/outputs/hive-app/darwin.json

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ee/maintained-apps/outputs/tortoisegit/windows.json

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

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

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

@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

This PR updates 26 Fleet-maintained app output JSON files (mostly macOS, two Windows) to newer application releases. Each change bumps the version field, adjusts the queries.patched (and in some cases queries.exists) version_compare threshold, and replaces the installer_url and sha256 checksum to match the new installer artifact. For Elgato Stream Deck, the install script reference now installs the 7.5.0 package and the uninstall script's launchctl cleanup pattern was broadened from a literal label match to a wildcard match.

Possibly related PRs

  • fleetdm/fleet#47774: Updates the same 1Password darwin.json queries.patched version_compare threshold to a newer version.
  • fleetdm/fleet#47919: Updates the same hive-app/darwin.json queries.patched version threshold, installer_url, and sha256.
  • fleetdm/fleet#48476: Updates the same wins/darwin.json version/queries.patched threshold from 3.3 to 3.4.
🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is too brief and omits the required template sections like related issue, checklist, testing, and database migration details. Fill in the repository template sections, including a related issue and the relevant checklist/testing/migration items, or remove sections that don't apply.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main change set by describing an update to 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-2606302034

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: 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/elgato-stream-deck/darwin.json`:
- Around line 18-20: The wildcard uninstall path for launchctl services will not
match any labels because remove_launchctl_service uses the service string
literally in launchctl list/remove and in the plist path checks. Update the
uninstall flow to handle globs the same way expand_pkgid_and_map does for
forget_pkg/remove_pkg_files, either by adding a wildcard-expanding wrapper
around remove_launchctl_service or by having remove_launchctl_service iterate
over matched service labels before removing plist files. Use the
remove_launchctl_service, forget_pkg, and expand_pkgid_and_map symbols to locate
the relevant code.
🪄 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: aab6b4a0-e775-4f70-a7aa-3a59e37bbfd0

📥 Commits

Reviewing files that changed from the base of the PR and between 9805fb6 and a4bf74e.

📒 Files selected for processing (25)
  • ee/maintained-apps/outputs/1password/darwin.json
  • ee/maintained-apps/outputs/7-zip/windows.json
  • ee/maintained-apps/outputs/bitwarden/darwin.json
  • ee/maintained-apps/outputs/bricklink-studio/darwin.json
  • ee/maintained-apps/outputs/cardhop/darwin.json
  • ee/maintained-apps/outputs/claude/darwin.json
  • ee/maintained-apps/outputs/dockside/darwin.json
  • ee/maintained-apps/outputs/elgato-stream-deck/darwin.json
  • ee/maintained-apps/outputs/firefox/darwin.json
  • ee/maintained-apps/outputs/forklift/darwin.json
  • ee/maintained-apps/outputs/franz/darwin.json
  • ee/maintained-apps/outputs/gdevelop/darwin.json
  • ee/maintained-apps/outputs/grammarly-desktop/darwin.json
  • ee/maintained-apps/outputs/granola/darwin.json
  • ee/maintained-apps/outputs/hive-app/darwin.json
  • ee/maintained-apps/outputs/keka/darwin.json
  • ee/maintained-apps/outputs/macwhisper/darwin.json
  • ee/maintained-apps/outputs/mellel/darwin.json
  • ee/maintained-apps/outputs/netnewswire/darwin.json
  • ee/maintained-apps/outputs/notesnook/darwin.json
  • ee/maintained-apps/outputs/qlmarkdown/darwin.json
  • ee/maintained-apps/outputs/reqable/darwin.json
  • ee/maintained-apps/outputs/shapr3d/darwin.json
  • ee/maintained-apps/outputs/tortoisegit/windows.json
  • ee/maintained-apps/outputs/wins/darwin.json

Comment on lines 18 to +20
"refs": {
"19b25325": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/<key>volume<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/<key>install-location<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'com.elgato.StreamDeck'\nquit_application 'com.elgato.StreamDeck'\nremove_pkg_files 'com.elgato.StreamDeck'\nforget_pkg 'com.elgato.StreamDeck'\nsudo rm -rf '/Applications/Elgato Stream Deck.app'\nsudo rm -rf '/Library/LaunchAgents/com.elgato.StreamDeck.plist'\nsudo rm -rf '~/Library/LaunchAgents/com.elgato.StreamDeck.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.elgato.StreamDeck.plist'\n",
"1dd644a7": "#!/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# install pkg files\nquit_and_track_application 'com.elgato.StreamDeck'\nsudo installer -pkg \"$TMPDIR/Stream_Deck_7.4.2.22730.pkg\" -target /\nrelaunch_application 'com.elgato.StreamDeck'\n"
"214a13cd": "#!/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# install pkg files\nquit_and_track_application 'com.elgato.StreamDeck'\nsudo installer -pkg \"$TMPDIR/Stream_Deck_7.5.0.22885.pkg\" -target /\nrelaunch_application 'com.elgato.StreamDeck'\n",
"dd528c8d": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/<key>volume<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/<key>install-location<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'com.elgato.StreamDeck*'\nquit_application 'com.elgato.StreamDeck'\nremove_pkg_files 'com.elgato.StreamDeck'\nforget_pkg 'com.elgato.StreamDeck'\nsudo rm -rf '/Applications/Elgato Stream Deck.app'\nsudo rm -rf '/Library/LaunchAgents/com.elgato.StreamDeck.plist'\nsudo rm -rf '~/Library/LaunchAgents/com.elgato.StreamDeck.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.elgato.StreamDeck.plist'\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 | 🏗️ Heavy lift

Wildcard launchctl service removal won't actually work.

The uninstall script now calls remove_launchctl_service 'com.elgato.StreamDeck*', but remove_launchctl_service does not expand wildcards: it passes ${service} directly to launchctl list "${service}" (which requires an exact label, not a glob), and builds paths like "/Library/LaunchAgents/${service}.plist" that are tested with a quoted [[ -e "$path" ]] — quoted strings don't undergo glob expansion in bash. Unlike forget_pkg/remove_pkg_files, which route through expand_pkgid_and_map to handle wildcards, this function has no equivalent logic, so the new wildcard call will silently fail to find/remove any launch agent.

🐛 Suggested fix: route through wildcard expansion
-remove_launchctl_service() {
-  local service="$1"
+remove_launchctl_service() {
+  local service="$1"
+  if [[ "$service" == *"*"* ]]; then
+    local prefix="${service%\*}"
+    for label in $(launchctl list | awk '{print $3}' | grep "^${prefix}"); do
+      remove_launchctl_service "$label"
+    done
+    return
+  fi
   local booleans=("true" "false")
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"refs": {
"19b25325": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/<key>volume<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/<key>install-location<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'com.elgato.StreamDeck'\nquit_application 'com.elgato.StreamDeck'\nremove_pkg_files 'com.elgato.StreamDeck'\nforget_pkg 'com.elgato.StreamDeck'\nsudo rm -rf '/Applications/Elgato Stream Deck.app'\nsudo rm -rf '/Library/LaunchAgents/com.elgato.StreamDeck.plist'\nsudo rm -rf '~/Library/LaunchAgents/com.elgato.StreamDeck.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.elgato.StreamDeck.plist'\n",
"1dd644a7": "#!/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# install pkg files\nquit_and_track_application 'com.elgato.StreamDeck'\nsudo installer -pkg \"$TMPDIR/Stream_Deck_7.4.2.22730.pkg\" -target /\nrelaunch_application 'com.elgato.StreamDeck'\n"
"214a13cd": "#!/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# install pkg files\nquit_and_track_application 'com.elgato.StreamDeck'\nsudo installer -pkg \"$TMPDIR/Stream_Deck_7.5.0.22885.pkg\" -target /\nrelaunch_application 'com.elgato.StreamDeck'\n",
"dd528c8d": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/<key>volume<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/<key>install-location<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'com.elgato.StreamDeck*'\nquit_application 'com.elgato.StreamDeck'\nremove_pkg_files 'com.elgato.StreamDeck'\nforget_pkg 'com.elgato.StreamDeck'\nsudo rm -rf '/Applications/Elgato Stream Deck.app'\nsudo rm -rf '/Library/LaunchAgents/com.elgato.StreamDeck.plist'\nsudo rm -rf '~/Library/LaunchAgents/com.elgato.StreamDeck.plist'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.elgato.StreamDeck'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.elgato.StreamDeck.plist'\n"
remove_launchctl_service() {
local service="$1"
if [[ "$service" == *"*"* ]]; then
local prefix="${service%\*}"
for label in $(launchctl list | awk '{print $3}' | grep "^${prefix}"); do
remove_launchctl_service "$label"
done
return
fi
local booleans=("true" "false")
local plist_status
local paths
local should_sudo
echo "Removing launchctl service ${service}"
for should_sudo in "${booleans[@]}"; do
plist_status=$(launchctl list "${service}" 2>/dev/null)
if [[ $plist_status == \{* ]]; then
if [[ $should_sudo == "true" ]]; then
sudo launchctl remove "${service}"
else
launchctl remove "${service}"
fi
sleep 1
fi
paths=(
"/Library/LaunchAgents/${service}.plist"
"/Library/LaunchDaemons/${service}.plist"
)
# if not using sudo, prepend the home directory to the paths
if [[ $should_sudo == "false" ]]; then
for i in "${!paths[@]}"; do
paths[i]="${HOME}${paths[i]}"
done
fi
for path in "${paths[@]}"; do
if [[ -e "$path" ]]; then
if [[ $should_sudo == "true" ]]; then
sudo rm -f -- "$path"
else
rm -f -- "$path"
fi
fi
done
done
}
🤖 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/elgato-stream-deck/darwin.json` around lines 18 -
20, The wildcard uninstall path for launchctl services will not match any labels
because remove_launchctl_service uses the service string literally in launchctl
list/remove and in the plist path checks. Update the uninstall flow to handle
globs the same way expand_pkgid_and_map does for forget_pkg/remove_pkg_files,
either by adding a wildcard-expanding wrapper around remove_launchctl_service or
by having remove_launchctl_service iterate over matched service labels before
removing plist files. Use the remove_launchctl_service, forget_pkg, and
expand_pkgid_and_map symbols to locate the relevant code.

@qodo-free-for-open-source-projects

Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: test-fma-pr-only

Failed stage: Filter apps.json and verify changed apps [❌]

Failed test name: ""

Failure summary:

The action failed during an app validation step because the Wins macOS app did not match the
expected version.
- The validator looked for Wins version 3.4 but osquery detected the installed app
version as 3.3 (log lines ~5353-5356).
- This mismatch triggered time=level=ERROR msg="App version
'3.4' was not found by osquery" app=Wins, causing the validation to report Apps with errors: [Wins]
and exit with exit status 1 (log lines ~5356-5361).

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

168:  * [new branch]            11938-loadtesting-branch    -> origin/11938-loadtesting-branch
169:  * [new branch]            12007-ui-idp-metadata       -> origin/12007-ui-idp-metadata
170:  * [new branch]            12351-try-fix-for-fleet-desktop -> origin/12351-try-fix-for-fleet-desktop
171:  * [new branch]            12356-puppet-callback       -> origin/12356-puppet-callback
172:  * [new branch]            12375-query-bulk-action     -> origin/12375-query-bulk-action
173:  * [new branch]            12474-documentation         -> origin/12474-documentation
174:  * [new branch]            12614-federated-auth-support -> origin/12614-federated-auth-support
175:  * [new branch]            12687-host-issues-query     -> origin/12687-host-issues-query
176:  * [new branch]            12696-loadtest-cis-changes  -> origin/12696-loadtest-cis-changes
177:  * [new branch]            12842-fleetd-bitlocker-management -> origin/12842-fleetd-bitlocker-management
178:  * [new branch]            12842-fleetd-bitlocker-table -> origin/12842-fleetd-bitlocker-table
179:  * [new branch]            12889-faster-software       -> origin/12889-faster-software
180:  * [new branch]            13287-loadtest-changes      -> origin/13287-loadtest-changes
181:  * [new branch]            13288-poc-fleet-fips        -> origin/13288-poc-fleet-fips
182:  * [new branch]            13485-query-reports-migration -> origin/13485-query-reports-migration
183:  * [new branch]            13574-cache-failed-policy-counts -> origin/13574-cache-failed-policy-counts
184:  * [new branch]            13657-docs                  -> origin/13657-docs
...

196:  * [new branch]            146orch                     -> origin/146orch
197:  * [new branch]            14753-windows-ps1-api       -> origin/14753-windows-ps1-api
198:  * [new branch]            14957-test-dep-screen       -> origin/14957-test-dep-screen
199:  * [new branch]            14957-test-dep-screen-patch -> origin/14957-test-dep-screen-patch
200:  * [new branch]            15068-disk-encryption-ii    -> origin/15068-disk-encryption-ii
201:  * [new branch]            15082-download-api-docs     -> origin/15082-download-api-docs
202:  * [new branch]            15082-make-endpoints-consistent -> origin/15082-make-endpoints-consistent
203:  * [new branch]            15082-update-download-endpoints -> origin/15082-update-download-endpoints
204:  * [new branch]            15380-hosts-api-doc         -> origin/15380-hosts-api-doc
205:  * [new branch]            15461-ui-dep-assign-profile-responses -> origin/15461-ui-dep-assign-profile-responses
206:  * [new branch]            15463-msi-fix               -> origin/15463-msi-fix
207:  * [new branch]            15559-move-scep             -> origin/15559-move-scep
208:  * [new branch]            15633                       -> origin/15633
209:  * [new branch]            15770-mac-os-vuln           -> origin/15770-mac-os-vuln
210:  * [new branch]            15801-migration             -> origin/15801-migration
211:  * [new branch]            15912-password-reset-error-code -> origin/15912-password-reset-error-code
212:  * [new branch]            16182-log-root              -> origin/16182-log-root
...

618:  * [new branch]            4701-tickets                -> origin/4701-tickets
619:  * [new branch]            4701-with-osqpfix           -> origin/4701-with-osqpfix
620:  * [new branch]            471-0716                    -> origin/471-0716
621:  * [new branch]            471-cloudfront              -> origin/471-cloudfront
622:  * [new branch]            471-tickets                 -> origin/471-tickets
623:  * [new branch]            4710mdm                     -> origin/4710mdm
624:  * [new branch]            4710mdmloadtest             -> origin/4710mdmloadtest
625:  * [new branch]            4711-bsln                   -> origin/4711-bsln
626:  * [new branch]            471RC-07-09                 -> origin/471RC-07-09
627:  * [new branch]            4720mdm                     -> origin/4720mdm
628:  * [new branch]            4720orch                    -> origin/4720orch
629:  * [new branch]            4720orch1                   -> origin/4720orch1
630:  * [new branch]            4720orch2                   -> origin/4720orch2
631:  * [new branch]            47289-new-fma-masv          -> origin/47289-new-fma-masv
632:  * [new branch]            472orchm                    -> origin/472orchm
633:  * [new branch]            47303-redis-moved-errors-from-getqueryresultscounts-incrqueryresultscounts-in-cluster-mode -> origin/47303-redis-moved-errors-from-getqueryresultscounts-incrqueryresultscounts-in-cluster-mode
634:  * [new branch]            4735orch                    -> origin/4735orch
...

661:  * [new branch]            7765-frontend               -> origin/7765-frontend
662:  * [new branch]            7766-backend-final-main-merge -> origin/7766-backend-final-main-merge
663:  * [new branch]            7766-backend-test           -> origin/7766-backend-test
664:  * [new branch]            7766-frontend               -> origin/7766-frontend
665:  * [new branch]            7993-figure-out-the-limits-of-our-current-search-approach -> origin/7993-figure-out-the-limits-of-our-current-search-approach
666:  * [new branch]            8021-orbit-use-specified-identifier -> origin/8021-orbit-use-specified-identifier
667:  * [new branch]            8186-vulnerable-software-false-positive-docker -> origin/8186-vulnerable-software-false-positive-docker
668:  * [new branch]            8593-gitops                 -> origin/8593-gitops
669:  * [new branch]            8708-docs                   -> origin/8708-docs
670:  * [new branch]            8708-encryption-key-api     -> origin/8708-encryption-key-api
671:  * [new branch]            8708-ingest-file-vault      -> origin/8708-ingest-file-vault
672:  * [new branch]            8708-ingest-macos-encription-key -> origin/8708-ingest-macos-encription-key
673:  * [new branch]            8708-ingest-macos-encription-key-ii -> origin/8708-ingest-macos-encription-key-ii
674:  * [new branch]            8974-native-smbios-uuid-support -> origin/8974-native-smbios-uuid-support
675:  * [new branch]            9260-cis-checks-5.10.x      -> origin/9260-cis-checks-5.10.x
676:  * [new branch]            9394-failed-to-create-device-auth-token-due-to-duplicate-key-errors -> origin/9394-failed-to-create-device-auth-token-due-to-duplicate-key-errors
677:  * [new branch]            9590-schema                 -> origin/9590-schema
...

868:  * [new branch]            allenhouchins-add-hardware-procurement-info -> origin/allenhouchins-add-hardware-procurement-info
869:  * [new branch]            allenhouchins-contour-normalize -> origin/allenhouchins-contour-normalize
870:  * [new branch]            allenhouchins-fma-installer-arch -> origin/allenhouchins-fma-installer-arch
871:  * [new branch]            allenhouchins-net-arm64     -> origin/allenhouchins-net-arm64
872:  * [new branch]            allenhouchins-new-blog-post -> origin/allenhouchins-new-blog-post
873:  * [new branch]            allenhouchins-patch-1       -> origin/allenhouchins-patch-1
874:  * [new branch]            allenhouchins-santa-table-updates -> origin/allenhouchins-santa-table-updates
875:  * [new branch]            allenhouchins-update-custom-tap -> origin/allenhouchins-update-custom-tap
876:  * [new branch]            allenhouchins-update-ingester -> origin/allenhouchins-update-ingester
877:  * [new branch]            allenhouchins-update-new-fma-skill -> origin/allenhouchins-update-new-fma-skill
878:  * [new branch]            always-create-event-next-thu -> origin/always-create-event-next-thu
879:  * [new branch]            and_osq_proj                -> origin/and_osq_proj
880:  * [new branch]            andrey/loadtest-oval-vulns  -> origin/andrey/loadtest-oval-vulns
881:  * [new branch]            android-cofniguration-profiles-research -> origin/android-cofniguration-profiles-research
882:  * [new branch]            android-enroll-note         -> origin/android-enroll-note
883:  * [new branch]            android-enrollment-error    -> origin/android-enrollment-error
884:  * [new branch]            android-fleet-vars          -> origin/android-fleet-vars
...

936:  * [new branch]            await-configuration-docs    -> origin/await-configuration-docs
937:  * [new branch]            aws-licensing-integration-proposal -> origin/aws-licensing-integration-proposal
938:  * [new branch]            backport-a41fb63            -> origin/backport-a41fb63
939:  * [new branch]            backport-c02af              -> origin/backport-c02af
940:  * [new branch]            backport-e65d6cf            -> origin/backport-e65d6cf
941:  * [new branch]            backport-ef07a406cc8dbccb4914bbd27631df74e5b13b49 -> origin/backport-ef07a406cc8dbccb4914bbd27631df74e5b13b49
942:  * [new branch]            backport-vpp-fix            -> origin/backport-vpp-fix
943:  * [new branch]            base-software-titles-loadtest -> origin/base-software-titles-loadtest
944:  * [new branch]            base-software-titles-loadtest-2 -> origin/base-software-titles-loadtest-2
945:  * [new branch]            beekeeper-fma-initial       -> origin/beekeeper-fma-initial
946:  * [new branch]            bettapizza                  -> origin/bettapizza
947:  * [new branch]            bettapizza--ghost-testimonial-update -> origin/bettapizza--ghost-testimonial-update
948:  * [new branch]            bettapizza-patch-1          -> origin/bettapizza-patch-1
949:  * [new branch]            bettapizza-patch-2          -> origin/bettapizza-patch-2
950:  * [new branch]            bettapizza-patch-3          -> origin/bettapizza-patch-3
951:  * [new branch]            better-byod-error           -> origin/better-byod-error
952:  * [new branch]            bounded-context-proposals   -> origin/bounded-context-proposals
...

986:  * [new branch]            cherry-pick-42773-vitals-constants -> origin/cherry-pick-42773-vitals-constants
987:  * [new branch]            cherry-pick-48012-to-docs-v4.89.0 -> origin/cherry-pick-48012-to-docs-v4.89.0
988:  * [new branch]            cherry-pick-8750-into-rc-minor-fleet-v4.60.0 -> origin/cherry-pick-8750-into-rc-minor-fleet-v4.60.0
989:  * [new branch]            cherry-pick-dogfood-change  -> origin/cherry-pick-dogfood-change
990:  * [new branch]            cherry-pick-dogfood-env-vars -> origin/cherry-pick-dogfood-env-vars
991:  * [new branch]            cherry-pick-fleetctl-changes-to-allow-testing -> origin/cherry-pick-fleetctl-changes-to-allow-testing
992:  * [new branch]            cherry-pick-mac-address-vital -> origin/cherry-pick-mac-address-vital
993:  * [new branch]            cherry-pick-patches         -> origin/cherry-pick-patches
994:  * [new branch]            cherry-pick-remove-overrides-in-dev-mode -> origin/cherry-pick-remove-overrides-in-dev-mode
995:  * [new branch]            cherry-pick-util            -> origin/cherry-pick-util
996:  * [new branch]            cherry-pick-webhooks        -> origin/cherry-pick-webhooks
997:  * [new branch]            cherrypick-v4.85.0-version-bump-into-main -> origin/cherrypick-v4.85.0-version-bump-into-main
998:  * [new branch]            chore-UI-update-for-CSP     -> origin/chore-UI-update-for-CSP
999:  * [new branch]            chore-add-specific-yarn-version -> origin/chore-add-specific-yarn-version
1000:  * [new branch]            chore-backend-api-patterns  -> origin/chore-backend-api-patterns
1001:  * [new branch]            chore-change-error-message-custom-profile -> origin/chore-change-error-message-custom-profile
1002:  * [new branch]            chore-cp-chage-status-code-turn-off-mdm -> origin/chore-cp-chage-status-code-turn-off-mdm
...

1192:  * [new branch]            edwardsb-vuln-processing-fix-sandcastle -> origin/edwardsb-vuln-processing-fix-sandcastle
1193:  * [new branch]            edwardsb-vuln-processing-volume-fix -> origin/edwardsb-vuln-processing-volume-fix
1194:  * [new branch]            edwardsb/deployment-guide-updates -> origin/edwardsb/deployment-guide-updates
1195:  * [new branch]            edwardsb/restrict_console_access -> origin/edwardsb/restrict_console_access
1196:  * [new branch]            elastic_rum                 -> origin/elastic_rum
1197:  * [new branch]            enable-jit-by-default       -> origin/enable-jit-by-default
1198:  * [new branch]            enable-test-go-automation-macos -> origin/enable-test-go-automation-macos
1199:  * [new branch]            enforce-firefox-doh         -> origin/enforce-firefox-doh
1200:  * [new branch]            enforce-firefox-windows     -> origin/enforce-firefox-windows
1201:  * [new branch]            enforce-ios-26.5-update-deadline-july-2026 -> origin/enforce-ios-26.5-update-deadline-july-2026
1202:  * [new branch]            enforce-iso27001-workstations -> origin/enforce-iso27001-workstations
1203:  * [new branch]            enforce-macos-15.5-update-deadline -> origin/enforce-macos-15.5-update-deadline
1204:  * [new branch]            enforce-macos-version-workstations -> origin/enforce-macos-version-workstations
1205:  * [new branch]            enroll-android-feature-guide -> origin/enroll-android-feature-guide
1206:  * [new branch]            ericswenson0-patch-1        -> origin/ericswenson0-patch-1
1207:  * [new branch]            error-counts                -> origin/error-counts
1208:  * [new branch]            errors-perf-testing         -> origin/errors-perf-testing
1209:  * [new branch]            es-reports                  -> origin/es-reports
...

1225:  * [new branch]            eugkuo-patch-6-slugs-FMA    -> origin/eugkuo-patch-6-slugs-FMA
1226:  * [new branch]            example-fleetctl-profiles   -> origin/example-fleetctl-profiles
1227:  * [new branch]            exp-mdbook-docs             -> origin/exp-mdbook-docs
1228:  * [new branch]            experiment-disable-some-deletes -> origin/experiment-disable-some-deletes
1229:  * [new branch]            experiment-hardcode-counters-to-zero -> origin/experiment-hardcode-counters-to-zero
1230:  * [new branch]            experiment-no-txs           -> origin/experiment-no-txs
1231:  * [new branch]            experiment-status-tooltip   -> origin/experiment-status-tooltip
1232:  * [new branch]            experiment-with-two-branches -> origin/experiment-with-two-branches
1233:  * [new branch]            experimental_moveitem       -> origin/experimental_moveitem
1234:  * [new branch]            experimient-no-counts       -> origin/experimient-no-counts
1235:  * [new branch]            expiredcertstool            -> origin/expiredcertstool
1236:  * [new branch]            express-vpn-win             -> origin/express-vpn-win
1237:  * [new branch]            extra-dep-logs              -> origin/extra-dep-logs
1238:  * [new branch]            f84ee4c5f4                  -> origin/f84ee4c5f4
1239:  * [new branch]            faf-doc-clarification       -> origin/faf-doc-clarification
1240:  * [new branch]            failing-test                -> origin/failing-test
1241:  * [new branch]            faq-updates-2026-06         -> origin/faq-updates-2026-06
...

1281:  * [new branch]            feature-hydrant-ca          -> origin/feature-hydrant-ca
1282:  * [new branch]            feature-idp-byod            -> origin/feature-idp-byod
1283:  * [new branch]            feature-orbit-find          -> origin/feature-orbit-find
1284:  * [new branch]            feature-prioritization      -> origin/feature-prioritization
1285:  * [new branch]            feature-v4.44.1-live-queries -> origin/feature-v4.44.1-live-queries
1286:  * [new branch]            feature-windows-mdm-policy-extraction -> origin/feature-windows-mdm-policy-extraction
1287:  * [new branch]            feature/add-blank-to-osquer-link -> origin/feature/add-blank-to-osquer-link
1288:  * [new branch]            feature/fleet-macos-password-sync -> origin/feature/fleet-macos-password-sync
1289:  * [new branch]            feature_14722-activity-feed-webhooks -> origin/feature_14722-activity-feed-webhooks
1290:  * [new branch]            feature_18115-crit-vuln-issues -> origin/feature_18115-crit-vuln-issues
1291:  * [new branch]            feature_19010-ipad-ios-lock-wipe-backend-changes -> origin/feature_19010-ipad-ios-lock-wipe-backend-changes
1292:  * [new branch]            feature_22078               -> origin/feature_22078
1293:  * [new branch]            fix                         -> origin/fix
1294:  * [new branch]            fix-35118-cis-win10-v4      -> origin/fix-35118-cis-win10-v4
1295:  * [new branch]            fix-4.84.4-k8s              -> origin/fix-4.84.4-k8s
1296:  * [new branch]            fix-40083-failed-install-retries -> origin/fix-40083-failed-install-retries
1297:  * [new branch]            fix-41290-vpp-added-status  -> origin/fix-41290-vpp-added-status
1298:  * [new branch]            fix-41337-save-env-secrets-dry-run -> origin/fix-41337-save-env-secrets-dry-run
1299:  * [new branch]            fix-43623-fma-patch-policy-gitops -> origin/fix-43623-fma-patch-policy-gitops
1300:  * [new branch]            fix-44199-embedded-app-bundles -> origin/fix-44199-embedded-app-bundles
1301:  * [new branch]            fix-44325-gitops-mode-tooltips -> origin/fix-44325-gitops-mode-tooltips
1302:  * [new branch]            fix-android-unenroll-activities -> origin/fix-android-unenroll-activities
1303:  * [new branch]            fix-blockquotes-google-groups -> origin/fix-blockquotes-google-groups
1304:  * [new branch]            fix-ca-verdict-spoof-16386  -> origin/fix-ca-verdict-spoof-16386
1305:  * [new branch]            fix-case-in-deploy-config-docs -> origin/fix-case-in-deploy-config-docs
1306:  * [new branch]            fix-cert-details-modal      -> origin/fix-cert-details-modal
1307:  * [new branch]            fix-checkerboard-scroll-to-right -> origin/fix-checkerboard-scroll-to-right
1308:  * [new branch]            fix-checkerboard-tooltip-nowrap -> origin/fix-checkerboard-tooltip-nowrap
1309:  * [new branch]            fix-cloudflare-warp-fma-output-json -> origin/fix-cloudflare-warp-fma-output-json
1310:  * [new branch]            fix-codeql-ci-error         -> origin/fix-codeql-ci-error
1311:  * [new branch]            fix-colima                  -> origin/fix-colima
1312:  * [new branch]            fix-color-for-mobile-sticky-nav -> origin/fix-color-for-mobile-sticky-nav
1313:  * [new branch]            fix-conditional-access-observer-authz -> origin/fix-conditional-access-observer-authz
1314:  * [new branch]            fix-conflict-in-feature_19010-ipad-ios-lock-wipe -> origin/fix-conflict-in-feature_19010-ipad-ios-lock-wipe
1315:  * [new branch]            fix-contrib-docs            -> origin/fix-contrib-docs
1316:  * [new branch]            fix-cve-2026-2792-firefox-esr -> origin/fix-cve-2026-2792-firefox-esr
1317:  * [new branch]            fix-cve-validate-enrichment-canary -> origin/fix-cve-validate-enrichment-canary
1318:  * [new branch]            fix-docker-cleanup-quay-nonfatal -> origin/fix-docker-cleanup-quay-nonfatal
1319:  * [new branch]            fix-docker-publish          -> origin/fix-docker-publish
1320:  * [new branch]            fix-dogfood-workstation     -> origin/fix-dogfood-workstation
1321:  * [new branch]            fix-embedded-bundle-titles-44199 -> origin/fix-embedded-bundle-titles-44199
1322:  * [new branch]            fix-firefox-cve-2026-2792   -> origin/fix-firefox-cve-2026-2792
1323:  * [new branch]            fix-firefox-fma-conflict-error-msg -> origin/fix-firefox-fma-conflict-error-msg
1324:  * [new branch]            fix-flakey-orbit-test       -> origin/fix-flakey-orbit-test
...

1330:  * [new branch]            fix-host-counts-vpp-software -> origin/fix-host-counts-vpp-software
1331:  * [new branch]            fix-instability-ubuntu-latest -> origin/fix-instability-ubuntu-latest
1332:  * [new branch]            fix-ios-ipados-enrollment-label-42721 -> origin/fix-ios-ipados-enrollment-label-42721
1333:  * [new branch]            fix-list-sw-permissions     -> origin/fix-list-sw-permissions
1334:  * [new branch]            fix-mdm-enrolled-webhook    -> origin/fix-mdm-enrolled-webhook
1335:  * [new branch]            fix-mdm-redirect            -> origin/fix-mdm-redirect
1336:  * [new branch]            fix-mdm-url-truncation      -> origin/fix-mdm-url-truncation
1337:  * [new branch]            fix-missing-test-schema-update -> origin/fix-missing-test-schema-update
1338:  * [new branch]            fix-modernize               -> origin/fix-modernize
1339:  * [new branch]            fix-no-space-left-on-device-failure -> origin/fix-no-space-left-on-device-failure
1340:  * [new branch]            fix-notarization            -> origin/fix-notarization
1341:  * [new branch]            fix-orbit-notarization      -> origin/fix-orbit-notarization
1342:  * [new branch]            fix-os-settings-name-col-truncation -> origin/fix-os-settings-name-col-truncation
1343:  * [new branch]            fix-os-settings-underline-descender-clip -> origin/fix-os-settings-underline-descender-clip
1344:  * [new branch]            fix-pricing-more-info-icon-documentationurl -> origin/fix-pricing-more-info-icon-documentationurl
1345:  * [new branch]            fix-receive-from-github-error -> origin/fix-receive-from-github-error
1346:  * [new branch]            fix-sandbox-local           -> origin/fix-sandbox-local
...

1360:  * [new branch]            fix-ui-typo-fleet-maintained-empty -> origin/fix-ui-typo-fleet-maintained-empty
1361:  * [new branch]            fix-vpp-edit-fleet-desktop-message -> origin/fix-vpp-edit-fleet-desktop-message
1362:  * [new branch]            fix-whatsapp-version-check  -> origin/fix-whatsapp-version-check
1363:  * [new branch]            fix-win-os-version          -> origin/fix-win-os-version
1364:  * [new branch]            fix_14825                   -> origin/fix_14825
1365:  * [new branch]            fixes-on-minor-fleet-v4.54.0 -> origin/fixes-on-minor-fleet-v4.54.0
1366:  * [new branch]            fixes-plus-4.35.1           -> origin/fixes-plus-4.35.1
1367:  * [new branch]            flaky-tests-nov-6           -> origin/flaky-tests-nov-6
1368:  * [new branch]            fleet-desktop-linux-browser -> origin/fleet-desktop-linux-browser
1369:  * [new branch]            fleet-desktop-version       -> origin/fleet-desktop-version
1370:  * [new branch]            fleet-mdm-server-url        -> origin/fleet-mdm-server-url
1371:  * [new branch]            fleet-multiple-abm-vpp-proposal -> origin/fleet-multiple-abm-vpp-proposal
1372:  * [new branch]            fleet-premium-users-usage-statistics -> origin/fleet-premium-users-usage-statistics
1373:  * [new branch]            fleet-release-infra         -> origin/fleet-release-infra
1374:  * [new branch]            fleet-server-config-1817    -> origin/fleet-server-config-1817
1375:  * [new branch]            fleet-server-log-request-errors -> origin/fleet-server-log-request-errors
1376:  * [new branch]            fleet-ship-rebuild          -> origin/fleet-ship-rebuild
...

2380:  * [new branch]            hotfix-failing-tests        -> origin/hotfix-failing-tests
2381:  * [new branch]            hotfix-query-update         -> origin/hotfix-query-update
2382:  * [new branch]            hotfix-revert-sofa-tables   -> origin/hotfix-revert-sofa-tables
2383:  * [new branch]            hotfix-v4.67.2-migration    -> origin/hotfix-v4.67.2-migration
2384:  * [new branch]            hotfix-v4.76.1              -> origin/hotfix-v4.76.1
2385:  * [new branch]            hover-gravatar              -> origin/hover-gravatar
2386:  * [new branch]            hughestaylor-patch-1        -> origin/hughestaylor-patch-1
2387:  * [new branch]            hughestaylor-patch-1-1      -> origin/hughestaylor-patch-1-1
2388:  * [new branch]            ignore-fleetctl-vulnerabilities -> origin/ignore-fleetctl-vulnerabilities
2389:  * [new branch]            improve-flakey-test         -> origin/improve-flakey-test
2390:  * [new branch]            improve-prometheus-metrics  -> origin/improve-prometheus-metrics
2391:  * [new branch]            improve-settings-subnav     -> origin/improve-settings-subnav
2392:  * [new branch]            include-mnt-in-gads-metric  -> origin/include-mnt-in-gads-metric
2393:  * [new branch]            increase-goreleaser-timeout-to-60m -> origin/increase-goreleaser-timeout-to-60m
2394:  * [new branch]            ingress-gateway-support     -> origin/ingress-gateway-support
2395:  * [new branch]            insert-software-installers-retry-error -> origin/insert-software-installers-retry-error
2396:  * [new branch]            install-all-recently-installed -> origin/install-all-recently-installed
...

2401:  * [new branch]            ireedy-patch-2              -> origin/ireedy-patch-2
2402:  * [new branch]            ireedy-patch-3              -> origin/ireedy-patch-3
2403:  * [new branch]            irena-deebradelo            -> origin/irena-deebradelo
2404:  * [new branch]            irena-handbook-edit         -> origin/irena-handbook-edit
2405:  * [new branch]            irena-test-with-john        -> origin/irena-test-with-john
2406:  * [new branch]            irenareedy-event-process    -> origin/irenareedy-event-process
2407:  * [new branch]            irenareedy-patch-1          -> origin/irenareedy-patch-1
2408:  * [new branch]            irenareedy-patch-2          -> origin/irenareedy-patch-2
2409:  * [new branch]            irenareedy-patch-4          -> origin/irenareedy-patch-4
2410:  * [new branch]            irenareedy-thumbtack-case-study -> origin/irenareedy-thumbtack-case-study
2411:  * [new branch]            iso-27001-compliance        -> origin/iso-27001-compliance
2412:  * [new branch]            iso42001-ai-discovery-inventory -> origin/iso42001-ai-discovery-inventory
2413:  * [new branch]            issue-11545-my-device-dep-modal -> origin/issue-11545-my-device-dep-modal
2414:  * [new branch]            issue-2716-specify-query-platforms -> origin/issue-2716-specify-query-platforms
2415:  * [new branch]            issue-3271-rate-limit-distributed-writes -> origin/issue-3271-rate-limit-distributed-writes
2416:  * [new branch]            issue-4361-mail-change-should-error -> origin/issue-4361-mail-change-should-error
2417:  * [new branch]            issue-conf-1968-delete-uninstalled-software-from-main -> origin/issue-conf-1968-delete-uninstalled-software-from-main
...

2624:  * [new branch]            melpike-api-default-fleet-windows-41787 -> origin/melpike-api-default-fleet-windows-41787
2625:  * [new branch]            melpike-api-device-url-43895 -> origin/melpike-api-device-url-43895
2626:  * [new branch]            melpike-api-minimum-version-39085 -> origin/melpike-api-minimum-version-39085
2627:  * [new branch]            melpike-api-py-script-41470 -> origin/melpike-api-py-script-41470
2628:  * [new branch]            melpike-api-windows-managed-account-43488 -> origin/melpike-api-windows-managed-account-43488
2629:  * [new branch]            melpike-audit-log-account-provisioning-45524 -> origin/melpike-audit-log-account-provisioning-45524
2630:  * [new branch]            melpike-audit-log-mdm-cmd-45021 -> origin/melpike-audit-log-mdm-cmd-45021
2631:  * [new branch]            melpike-audit-recovery-lock-password-rotate -> origin/melpike-audit-recovery-lock-password-rotate
2632:  * [new branch]            melpike-byod-wipe-lock-23242 -> origin/melpike-byod-wipe-lock-23242
2633:  * [new branch]            melpike-byod-wipe-lock-23242-1 -> origin/melpike-byod-wipe-lock-23242-1
2634:  * [new branch]            melpike-byod-wipe-lock-api-23242 -> origin/melpike-byod-wipe-lock-api-23242
2635:  * [new branch]            melpike-byod-wipe-lock-yaml-23242 -> origin/melpike-byod-wipe-lock-yaml-23242
2636:  * [new branch]            melpike-combine-guides-30674 -> origin/melpike-combine-guides-30674
2637:  * [new branch]            melpike-create-managed-local-account-guide-37141 -> origin/melpike-create-managed-local-account-guide-37141
2638:  * [new branch]            melpike-default-fleet-windows-41787 -> origin/melpike-default-fleet-windows-41787
2639:  * [new branch]            melpike-dep-error-messaging-43916 -> origin/melpike-dep-error-messaging-43916
2640:  * [new branch]            melpike-doc-deploy-sw-41470 -> origin/melpike-doc-deploy-sw-41470
...

2787:  * [new branch]            mna-doc-change-api-structure -> origin/mna-doc-change-api-structure
2788:  * [new branch]            mna-experiment-macos-profiles-uuid -> origin/mna-experiment-macos-profiles-uuid
2789:  * [new branch]            mna-fix-22558-windows-installer-stuck-pending -> origin/mna-fix-22558-windows-installer-stuck-pending
2790:  * [new branch]            mna-fix-duplicate-lock-unlock-activity -> origin/mna-fix-duplicate-lock-unlock-activity
2791:  * [new branch]            mna-fix-failing-tests       -> origin/mna-fix-failing-tests
2792:  * [new branch]            mna-fix-flaky-integration-test -> origin/mna-fix-flaky-integration-test
2793:  * [new branch]            mna-fix-oom-fleetctl-test   -> origin/mna-fix-oom-fleetctl-test
2794:  * [new branch]            mna-loadtest-enroll-host-limit -> origin/mna-loadtest-enroll-host-limit
2795:  * [new branch]            mna-orbit-node-key          -> origin/mna-orbit-node-key
2796:  * [new branch]            mna-revert-change-to-autogenerated-activities-doc -> origin/mna-revert-change-to-autogenerated-activities-doc
2797:  * [new branch]            mna-temp-osquery-perf-loadtest -> origin/mna-temp-osquery-perf-loadtest
2798:  * [new branch]            mna11997                    -> origin/mna11997
2799:  * [new branch]            mock-associate-assets-endpoint -> origin/mock-associate-assets-endpoint
2800:  * [new branch]            monitoring-test             -> origin/monitoring-test
2801:  * [new branch]            more-conditional-access-api-updates -> origin/more-conditional-access-api-updates
2802:  * [new branch]            more-fd-errors              -> origin/more-fd-errors
2803:  * [new branch]            move-conditional-access-script-to-testing-qa -> origin/move-conditional-access-script-to-testing-qa
...

3369:  * [new branch]            sgress454/34259-end-user-auth-setup-backend -> origin/sgress454/34259-end-user-auth-setup-backend
3370:  * [new branch]            sgress454/34528-end-user-auth-setup-agent -> origin/sgress454/34528-end-user-auth-setup-agent
3371:  * [new branch]            sgress454/35376             -> origin/sgress454/35376
3372:  * [new branch]            sgress454/35452             -> origin/sgress454/35452
3373:  * [new branch]            sgress454/37127-open-macos-end-user-auth-window -> origin/sgress454/37127-open-macos-end-user-auth-window
3374:  * [new branch]            sgress454/38063-skeleton-server -> origin/sgress454/38063-skeleton-server
3375:  * [new branch]            sgress454/39344-rename-teams-to-fleet-all-changes -> origin/sgress454/39344-rename-teams-to-fleet-all-changes
3376:  * [new branch]            sgress454/39344-rename-teams-to-fleet-api-changes -> origin/sgress454/39344-rename-teams-to-fleet-api-changes
3377:  * [new branch]            sgress454/40642-update-jit-saml-prefix -> origin/sgress454/40642-update-jit-saml-prefix
3378:  * [new branch]            sgress454/43482-re-pin      -> origin/sgress454/43482-re-pin
3379:  * [new branch]            sgress454/44077-disable-datasets-backend -> origin/sgress454/44077-disable-datasets-backend
3380:  * [new branch]            sgress454/44077-disable-datasets-docs -> origin/sgress454/44077-disable-datasets-docs
3381:  * [new branch]            sgress454/44077-disable-datasets-frontend -> origin/sgress454/44077-disable-datasets-frontend
3382:  * [new branch]            sgress454/45290-drop-mobile-from-charting -> origin/sgress454/45290-drop-mobile-from-charting
3383:  * [new branch]            sgress454/add-vex-for-cve-2026-23517 -> origin/sgress454/add-vex-for-cve-2026-23517
3384:  * [new branch]            sgress454/adr-for-error-codes -> origin/sgress454/adr-for-error-codes
3385:  * [new branch]            sgress454/adr-refactor-list-hosts -> origin/sgress454/adr-refactor-list-hosts
...

3437:  * [new branch]            software-titles-loadtest-2  -> origin/software-titles-loadtest-2
3438:  * [new branch]            solarized-theme             -> origin/solarized-theme
3439:  * [new branch]            solutions-folder            -> origin/solutions-folder
3440:  * [new branch]            sort-seen-hosts-before-inserting -> origin/sort-seen-hosts-before-inserting
3441:  * [new branch]            spalmesano0-patch-2         -> origin/spalmesano0-patch-2
3442:  * [new branch]            spike-fleet-lint-plugin     -> origin/spike-fleet-lint-plugin
3443:  * [new branch]            spike-ui-permissions-pattern -> origin/spike-ui-permissions-pattern
3444:  * [new branch]            spokanemac-add-passcode-ddm-profile -> origin/spokanemac-add-passcode-ddm-profile
3445:  * [new branch]            spokanemac-dogfood-additional-apps -> origin/spokanemac-dogfood-additional-apps
3446:  * [new branch]            spokanemac-handbook-release-article -> origin/spokanemac-handbook-release-article
3447:  * [new branch]            spokanemac-macdevops-conference-post -> origin/spokanemac-macdevops-conference-post
3448:  * [new branch]            spokanemac-meetup-template  -> origin/spokanemac-meetup-template
3449:  * [new branch]            spokanemac-migrating-fleetdm-from-dogfood-to-terraform-on-aws -> origin/spokanemac-migrating-fleetdm-from-dogfood-to-terraform-on-aws
3450:  * [new branch]            spokanemac-release-article-issue-template -> origin/spokanemac-release-article-issue-template
3451:  * [new branch]            step4-improvements          -> origin/step4-improvements
3452:  * [new branch]            store-query-execution-and-ingestion-errors -> origin/store-query-execution-and-ingestion-errors
3453:  * [new branch]            support-breaking-osquery-downgrades -> origin/support-breaking-osquery-downgrades
...

3521:  * [new branch]            ui-self-service-sg-5-21     -> origin/ui-self-service-sg-5-21
3522:  * [new branch]            unauth-installers           -> origin/unauth-installers
3523:  * [new branch]            uniform-brex-spending-limit -> origin/uniform-brex-spending-limit
3524:  * [new branch]            untx-software               -> origin/untx-software
3525:  * [new branch]            upcoming-activities-mdm-commands -> origin/upcoming-activities-mdm-commands
3526:  * [new branch]            upcoming-commands           -> origin/upcoming-commands
3527:  * [new branch]            update-1password-and-safari-policy-versions-2601200025 -> origin/update-1password-and-safari-policy-versions-2601200025
3528:  * [new branch]            update-1password-and-safari-policy-versions-2601200610 -> origin/update-1password-and-safari-policy-versions-2601200610
3529:  * [new branch]            update-1password-and-safari-policy-versions-2602261818 -> origin/update-1password-and-safari-policy-versions-2602261818
3530:  * [new branch]            update-1password-and-safari-policy-versions-2603101819 -> origin/update-1password-and-safari-policy-versions-2603101819
3531:  * [new branch]            update-1password-and-safari-policy-versions-2604080037 -> origin/update-1password-and-safari-policy-versions-2604080037
3532:  * [new branch]            update-1password-and-safari-policy-versions-2604080637 -> origin/update-1password-and-safari-policy-versions-2604080637
3533:  * [new branch]            update-Cloudflare-WARP-FMA-with-UpgradeCode -> origin/update-Cloudflare-WARP-FMA-with-UpgradeCode
3534:  * [new branch]            update-article-format       -> origin/update-article-format
3535:  * [new branch]            update-bug-report-template  -> origin/update-bug-report-template
3536:  * [new branch]            update-build-script-error-message -> origin/update-build-script-error-message
3537:  * [new branch]            update-cancel-and-done-links -> origin/update-cancel-and-done-links
...

3616:  * [new branch]            update-solutions-folder     -> origin/update-solutions-folder
3617:  * [new branch]            update-testing-qa-apps-2511191525 -> origin/update-testing-qa-apps-2511191525
3618:  * [new branch]            update-tuf-keys             -> origin/update-tuf-keys
3619:  * [new branch]            update-tuf-md               -> origin/update-tuf-md
3620:  * [new branch]            update-usage-statistics-mobile-devices -> origin/update-usage-statistics-mobile-devices
3621:  * [new branch]            update-user-password-length-validation-test -> origin/update-user-password-length-validation-test
3622:  * [new branch]            update-vex-statements       -> origin/update-vex-statements
3623:  * [new branch]            update-why-this-way         -> origin/update-why-this-way
3624:  * [new branch]            upgrade-eslint              -> origin/upgrade-eslint
3625:  * [new branch]            upgrade-go                  -> origin/upgrade-go
3626:  * [new branch]            upgrade-typescript          -> origin/upgrade-typescript
3627:  * [new branch]            upload-msiexec-install-log  -> origin/upload-msiexec-install-log
3628:  * [new branch]            usage-stats-mobile-devices-count -> origin/usage-stats-mobile-devices-count
3629:  * [new branch]            use-dockerhub-creds         -> origin/use-dockerhub-creds
3630:  * [new branch]            use-software-name-helper    -> origin/use-software-name-helper
3631:  * [new branch]            user-channel-error          -> origin/user-channel-error
3632:  * [new branch]            users-table-experiment      -> origin/users-table-experiment
...

3661:  * [new branch]            victor/36202-bootstrap-enroll -> origin/victor/36202-bootstrap-enroll
3662:  * [new branch]            victor/36452-activity-bounded-context -> origin/victor/36452-activity-bounded-context
3663:  * [new branch]            victor/36453-activity-scaffold -> origin/victor/36453-activity-scaffold
3664:  * [new branch]            victor/36793-logging        -> origin/victor/36793-logging
3665:  * [new branch]            victor/37241-archtest       -> origin/victor/37241-archtest
3666:  * [new branch]            victor/37806-fleet-activities -> origin/victor/37806-fleet-activities
3667:  * [new branch]            victor/38607-otel-logs      -> origin/victor/38607-otel-logs
3668:  * [new branch]            victor/38889-slog-mysql     -> origin/victor/38889-slog-mysql
3669:  * [new branch]            victor/39370-emacs-false-positive -> origin/victor/39370-emacs-false-positive
3670:  * [new branch]            victor/41374-backout        -> origin/victor/41374-backout
3671:  * [new branch]            victor/42318-bitlocker-pin  -> origin/victor/42318-bitlocker-pin
3672:  * [new branch]            victor/42843-esp-tracking-reference -> origin/victor/42843-esp-tracking-reference
3673:  * [new branch]            victor/44599-unknown-nodekey-prob -> origin/victor/44599-unknown-nodekey-prob
3674:  * [new branch]            victor/44802-mysql-conns-tunable -> origin/victor/44802-mysql-conns-tunable
3675:  * [new branch]            victor/45491-repro          -> origin/victor/45491-repro
3676:  * [new branch]            victor/46387-windows-mdm-enrollment-auth-error -> origin/victor/46387-windows-mdm-enrollment-auth-error
3677:  * [new branch]            victor/46387-windows-mdm-federated-discovery -> origin/victor/46387-windows-mdm-federated-discovery
...

3786:  * [new branch]            wesite-fix-sales-rituals    -> origin/wesite-fix-sales-rituals
3787:  * [new branch]            willmayhone88-patch-1       -> origin/willmayhone88-patch-1
3788:  * [new branch]            win-fma-deepl               -> origin/win-fma-deepl
3789:  * [new branch]            win-fma-evernote            -> origin/win-fma-evernote
3790:  * [new branch]            win-fma-goland              -> origin/win-fma-goland
3791:  * [new branch]            win-fma-testing             -> origin/win-fma-testing
3792:  * [new branch]            win-fma-vnc-apps            -> origin/win-fma-vnc-apps
3793:  * [new branch]            win-mdm-loadtest            -> origin/win-mdm-loadtest
3794:  * [new branch]            windows-baseline            -> origin/windows-baseline
3795:  * [new branch]            windows-end-user-experience-labels -> origin/windows-end-user-experience-labels
3796:  * [new branch]            windows-firefox-doh-script  -> origin/windows-firefox-doh-script
3797:  * [new branch]            windows-mdm-autopilot       -> origin/windows-mdm-autopilot
3798:  * [new branch]            windows-mdm-c-poc           -> origin/windows-mdm-c-poc
3799:  * [new branch]            windows-mdm-docs-auto-enroll -> origin/windows-mdm-docs-auto-enroll
3800:  * [new branch]            windows-mdm-load-test       -> origin/windows-mdm-load-test
3801:  * [new branch]            windows_enable_and_configure-error-message -> origin/windows_enable_and_configure-error-message
3802:  * [new branch]            workstations-to-use-edge-channels -> origin/workstations-to-use-edge-channels
...

3814:  * [new branch]            zayhanlon-patch-1           -> origin/zayhanlon-patch-1
3815:  * [new branch]            zenity-execuser             -> origin/zenity-execuser
3816:  * [new branch]            zhumo-patch-1               -> origin/zhumo-patch-1
3817:  * [new branch]            zhumo-patch-2               -> origin/zhumo-patch-2
3818:  * [new branch]            zhumo-patch-3               -> origin/zhumo-patch-3
3819:  * [new branch]            zhumo-patch-4               -> origin/zhumo-patch-4
3820:  * [new branch]            zhumo-patch-5               -> origin/zhumo-patch-5
3821:  * [new branch]            zhumo-patch-6               -> origin/zhumo-patch-6
3822:  * [new branch]            zhumo-patch-7               -> origin/zhumo-patch-7
3823:  * [new branch]            zwass-actions-reminders     -> origin/zwass-actions-reminders
3824:  * [new branch]            zwass-improve-macos-cpe     -> origin/zwass-improve-macos-cpe
3825:  * [new branch]            zwass-patch-1               -> origin/zwass-patch-1
3826:  * [new branch]            zwass-patch-2               -> origin/zwass-patch-2
3827:  * [new branch]            zwinnerman-fixup            -> origin/zwinnerman-fixup
3828:  * [new branch]            zwinnerman-livequery-tracing -> origin/zwinnerman-livequery-tracing
3829:  * [new branch]            zwinnerman-redis-error-handling -> origin/zwinnerman-redis-error-handling
3830:  * [new branch]            zwinnerman-test             -> origin/zwinnerman-test
...

4555:  check-latest: false
4556:  token: ***
4557:  cache: true
4558:  env:
4559:  GH_TOKEN: ***
4560:  LOG_LEVEL: info
4561:  ##[endgroup]
4562:  Setup go version spec 1.26.4
4563:  Found in cache @ /Users/runner/hostedtoolcache/go/1.26.4/arm64
4564:  Added go to the path
4565:  Successfully set up Go version 1.26.4
4566:  [command]/Users/runner/hostedtoolcache/go/1.26.4/arm64/bin/go env GOMODCACHE
4567:  [command]/Users/runner/hostedtoolcache/go/1.26.4/arm64/bin/go env GOCACHE
4568:  /Users/runner/go/pkg/mod
4569:  /Users/runner/Library/Caches/go-build
4570:  ##[warning]Restore cache failed: Dependencies file is not found in /Users/runner/work/fleet/fleet. Supported file pattern: go.mod
4571:  go version go1.26.4 darwin/arm64
...

4659:  - franz/darwin
4660:  - gdevelop/darwin
4661:  - grammarly-desktop/darwin
4662:  - granola/darwin
4663:  - hive-app/darwin
4664:  - keka/darwin
4665:  - macwhisper/darwin
4666:  - mellel/darwin
4667:  - netnewswire/darwin
4668:  - notesnook/darwin
4669:  - qlmarkdown/darwin
4670:  - reqable/darwin
4671:  - shapr3d/darwin
4672:  - tortoisegit/windows
4673:  - wins/darwin
4674:  ##[group]Run # Default to no changes if detection step failed or didn't set output
4675:  �[36;1m# Default to no changes if detection step failed or didn't set output�[0m
4676:  �[36;1mHAS_CHANGES="true"�[0m
...

4877:  go: downloading go.opentelemetry.io/otel v1.43.0
4878:  go: downloading go.opentelemetry.io/otel/metric v1.43.0
4879:  go: downloading go.opentelemetry.io/otel/trace v1.43.0
4880:  go: downloading github.com/mattn/go-colorable v0.1.13
4881:  go: downloading github.com/edsrzf/mmap-go v1.1.0
4882:  go: downloading github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d
4883:  go: downloading go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0
4884:  go: downloading golang.org/x/oauth2 v0.35.0
4885:  go: downloading github.com/aws/aws-sdk-go-v2/config v1.32.12
4886:  go: downloading github.com/aws/aws-sdk-go-v2 v1.41.5
4887:  go: downloading github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.35.8
4888:  go: downloading github.com/spf13/cobra v1.9.1
4889:  go: downloading github.com/spf13/viper v1.20.1
4890:  go: downloading github.com/go-kit/kit v0.12.0
4891:  go: downloading github.com/smallstep/pkcs7 v0.0.0-20240723090913-5e2c6a136dfa
4892:  go: downloading github.com/hashicorp/go-multierror v1.1.1
4893:  go: downloading github.com/micromdm/plist v0.2.3-0.20260123201933-667adaf87d87
4894:  go: downloading github.com/MicahParks/jwkset v0.11.0
4895:  go: downloading github.com/golang-jwt/jwt/v4 v4.5.2
4896:  go: downloading github.com/WatchBeam/clock v0.0.0-20170901150240-b08e6b4da7ea
4897:  go: downloading go.opentelemetry.io/otel/sdk v1.43.0
4898:  go: downloading github.com/andygrunwald/go-jira v1.16.0
4899:  go: downloading github.com/cenkalti/backoff/v4 v4.3.0
4900:  go: downloading github.com/cenkalti/backoff v2.2.1+incompatible
4901:  go: downloading github.com/nukosuke/go-zendesk v0.13.1
4902:  go: downloading github.com/igm/sockjs-go/v3 v3.0.2
4903:  go: downloading github.com/mattn/go-isatty v0.0.20
4904:  go: downloading gopkg.in/yaml.v2 v2.4.0
4905:  go: downloading github.com/oschwald/maxminddb-golang v1.10.0
4906:  go: downloading golang.org/x/sys v0.45.0
4907:  go: downloading github.com/elastic/go-sysinfo v1.11.2
4908:  go: downloading github.com/pkg/errors v0.9.1
4909:  go: downloading go.elastic.co/fastjson v1.1.0
...

4961:  go: downloading github.com/subosito/gotenv v1.6.0
4962:  go: downloading github.com/pelletier/go-toml/v2 v2.2.3
4963:  go: downloading gopkg.in/yaml.v3 v3.0.1
4964:  go: downloading github.com/groob/finalizer v0.0.0-20170707115354-4c2ed49aabda
4965:  go: downloading cloud.google.com/go/iam v1.5.3
4966:  go: downloading go.opencensus.io v0.24.0
4967:  go: downloading golang.org/x/sync v0.21.0
4968:  go: downloading google.golang.org/grpc v1.79.3
4969:  go: downloading google.golang.org/protobuf v1.36.11
4970:  go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8
4971:  go: downloading github.com/micromdm/nanolib v0.2.0
4972:  go: downloading github.com/nats-io/nkeys v0.4.15
4973:  go: downloading github.com/nats-io/nuid v1.0.1
4974:  go: downloading go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352
4975:  go: downloading github.com/go-logfmt/logfmt v0.5.1
4976:  go: downloading github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901
4977:  go: downloading cloud.google.com/go/auth v0.18.2
...

4980:  go: downloading github.com/google/s2a-go v0.1.9
4981:  go: downloading cloud.google.com/go/pubsub/v2 v2.0.0
4982:  go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7
4983:  go: downloading google.golang.org/genproto v0.0.0-20260128011058-8636f8732409
4984:  go: downloading github.com/googleapis/enterprise-certificate-proxy v0.3.12
4985:  go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20
4986:  go: downloading go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0
4987:  time=level=INFO msg="GOOS environment variable is not set. Using system detected: 'darwin'"
4988:  time=level=INFO msg="INSTALLATION_SEARCH_DIRECTORY environment variable is not set. Using default: '/Applications'"
4989:  time=level=INFO msg="Validating app: 1Password (1password/darwin)"
4990:  time=level=INFO msg=Downloading...
4991:  time=level=INFO msg="Executing install script..." app=1Password
4992:  time=level=INFO msg="New application detected at: /Applications/1Password.app" app=1Password
4993:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/1Password.app'" app=1Password
4994:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/1Password.app'" app=1Password
4995:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app=1Password
4996:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/1Password.app: No such xattr: com.apple.quarantine'" app=1Password
4997:  time=level=INFO msg="Spctl output error: <nil>" app=1Password
4998:  time=level=INFO msg="spctl status: spctl status: '/Applications/1Password.app: accepted\nsource=Notarized Developer ID'" app=1Password
4999:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app=1Password
5000:  time=level=INFO msg="Looking for app: 1Password, version: 8.12.26" app=1Password
5001:  time=level=INFO msg="Found app: '1Password Helper (GPU)' at /Applications/1Password.app/Contents/Frameworks/1Password Helper (GPU).app, Version: , Bundled Version: 8.12.26" app=1Password
5002:  time=level=INFO msg="Executing uninstall script for app..." app=1Password
5003:  time=level=INFO msg="Looking for app: 1Password, version: 8.12.26" app=1Password
5004:  time=level=INFO msg="All checks passed for app: 1Password (1password/darwin)"
5005:  time=level=INFO msg="Validating app: Bitwarden (bitwarden/darwin)"
5006:  time=level=INFO msg=Downloading...
5007:  time=level=INFO msg="Executing install script..." app=Bitwarden
5008:  time=level=INFO msg="New application detected at: /Applications/Bitwarden.app" app=Bitwarden
5009:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Bitwarden.app'" app=Bitwarden
5010:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Bitwarden.app'" app=Bitwarden
5011:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app=Bitwarden
5012:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/Bitwarden.app: No such xattr: com.apple.quarantine'" app=Bitwarden
5013:  time=level=INFO msg="Spctl output error: <nil>" app=Bitwarden
5014:  time=level=INFO msg="spctl status: spctl status: '/Applications/Bitwarden.app: accepted\nsource=Notarized Developer ID'" app=Bitwarden
5015:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app=Bitwarden
5016:  time=level=INFO msg="Looking for app: Bitwarden, version: 2026.6.1" app=Bitwarden
5017:  time=level=INFO msg="Found app: 'Bitwarden' at /Applications/Bitwarden.app, Version: 2026.6.1, Bundled Version: 64377" app=Bitwarden
5018:  time=level=INFO msg="Executing uninstall script for app..." app=Bitwarden
5019:  time=level=INFO msg="Looking for app: Bitwarden, version: 2026.6.1" app=Bitwarden
5020:  time=level=INFO msg="All checks passed for app: Bitwarden (bitwarden/darwin)"
5021:  time=level=INFO msg="Validating app: BrickLink Studio (bricklink-studio/darwin)"
5022:  time=level=INFO msg=Downloading...
5023:  time=level=INFO msg="Executing install script..." app="BrickLink Studio"
5024:  time=level=INFO msg="New application detected at: /Applications/Studio 2.0" app="BrickLink Studio"
5025:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Studio 2.0'" app="BrickLink Studio"
5026:  time=level=WARN msg="Error detected in post-installation steps: Error forcing LaunchServices refresh: forcing LaunchServices refresh: exit status 1. Attempting to continue" app="BrickLink Studio"
5027:  time=level=INFO msg="Looking for app: BrickLink Studio, version: 2.26.6_1" app="BrickLink Studio"
5028:  time=level=INFO msg="Found app: 'eyesight' at /Applications/Studio 2.0/PhotoRealisticRenderer/mac/eyesight.app, Version: , Bundled Version: " app="BrickLink Studio"
5029:  time=level=INFO msg="Found app: 'Studio' at /Applications/Studio 2.0/Studio.app, Version: 2.26.6_1, Bundled Version: 0" app="BrickLink Studio"
5030:  time=level=INFO msg="Executing uninstall script for app..." app="BrickLink Studio"
5031:  time=level=INFO msg="Looking for app: BrickLink Studio, version: 2.26.6_1" app="BrickLink Studio"
5032:  time=level=INFO msg="All checks passed for app: BrickLink Studio (bricklink-studio/darwin)"
5033:  time=level=INFO msg="Validating app: Cardhop (cardhop/darwin)"
5034:  time=level=INFO msg=Downloading...
5035:  time=level=INFO msg="Executing install script..." app=Cardhop
5036:  time=level=INFO msg="New application detected at: /Applications/Cardhop.app" app=Cardhop
5037:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Cardhop.app'" app=Cardhop
5038:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Cardhop.app'" app=Cardhop
5039:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app=Cardhop
5040:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/Cardhop.app: No such xattr: com.apple.quarantine'" app=Cardhop
5041:  time=level=INFO msg="Spctl output error: <nil>" app=Cardhop
5042:  time=level=INFO msg="spctl status: spctl status: '/Applications/Cardhop.app: accepted\nsource=Notarized Developer ID'" app=Cardhop
5043:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app=Cardhop
5044:  time=level=INFO msg="Looking for app: Cardhop, version: 2.4.8" app=Cardhop
5045:  time=level=INFO msg="Found app: 'Cardhop' at /Applications/Cardhop.app, Version: 2.4.8, Bundled Version: 1413" app=Cardhop
5046:  time=level=INFO msg="Executing uninstall script for app..." app=Cardhop
5047:  time=level=INFO msg="Looking for app: Cardhop, version: 2.4.8" app=Cardhop
5048:  time=level=INFO msg="All checks passed for app: Cardhop (cardhop/darwin)"
5049:  time=level=INFO msg="Validating app: Claude (claude/darwin)"
5050:  time=level=INFO msg=Downloading...
5051:  time=level=INFO msg="Executing install script..." app=Claude
5052:  time=level=INFO msg="New application detected at: /Applications/Claude.app" app=Claude
5053:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Claude.app'" app=Claude
5054:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Claude.app'" app=Claude
5055:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app=Claude
5056:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/Claude.app: No such xattr: com.apple.quarantine'" app=Claude
5057:  time=level=INFO msg="Spctl output error: <nil>" app=Claude
5058:  time=level=INFO msg="spctl status: spctl status: '/Applications/Claude.app: accepted\nsource=Notarized Developer ID'" app=Claude
5059:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app=Claude
5060:  time=level=INFO msg="Looking for app: Claude, version: 1.17377.0" app=Claude
5061:  time=level=INFO msg="Found app: 'Claude' at /Applications/Claude.app, Version: 1.17377.0, Bundled Version: 1.17377.0" app=Claude
5062:  time=level=INFO msg="Executing uninstall script for app..." app=Claude
5063:  time=level=INFO msg="Looking for app: Claude, version: 1.17377.0" app=Claude
5064:  time=level=INFO msg="All checks passed for app: Claude (claude/darwin)"
5065:  time=level=INFO msg="Validating app: Dockside (dockside/darwin)"
5066:  time=level=INFO msg=Downloading...
5067:  time=level=INFO msg="Executing install script..." app=Dockside
5068:  time=level=INFO msg="New application detected at: /Applications/Dockside.app" app=Dockside
5069:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Dockside.app'" app=Dockside
5070:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Dockside.app'" app=Dockside
5071:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app=Dockside
5072:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/Dockside.app: No such xattr: com.apple.quarantine'" app=Dockside
5073:  time=level=INFO msg="Spctl output error: <nil>" app=Dockside
5074:  time=level=INFO msg="spctl status: spctl status: '/Applications/Dockside.app: accepted\nsource=Notarized Developer ID'" app=Dockside
5075:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app=Dockside
5076:  time=level=INFO msg="Looking for app: Dockside, version: 2.9.19" app=Dockside
5077:  time=level=INFO msg="Found app: 'Dockside' at /Applications/Dockside.app, Version: 2.9.19, Bundled Version: 2.9.19" app=Dockside
5078:  time=level=INFO msg="Executing uninstall script for app..." app=Dockside
5079:  time=level=INFO msg="Looking for app: Dockside, version: 2.9.19" app=Dockside
5080:  time=level=INFO msg="All checks passed for app: Dockside (dockside/darwin)"
5081:  time=level=INFO msg="Validating app: Elgato Stream Deck (elgato-stream-deck/darwin)"
5082:  time=level=INFO msg=Downloading...
5083:  time=level=INFO msg="Executing install script..." app="Elgato Stream Deck"
5084:  time=level=INFO msg="New application detected at: /Applications/Elgato Stream Deck.app" app="Elgato Stream Deck"
5085:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Elgato Stream Deck.app'" app="Elgato Stream Deck"
5086:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Elgato Stream Deck.app'" app="Elgato Stream Deck"
5087:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app="Elgato Stream Deck"
5088:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/Elgato Stream Deck.app: No such xattr: com.apple.quarantine'" app="Elgato Stream Deck"
5089:  time=level=INFO msg="Spctl output error: <nil>" app="Elgato Stream Deck"
5090:  time=level=INFO msg="spctl status: spctl status: '/Applications/Elgato Stream Deck.app: accepted\nsource=Notarized Developer ID'" app="Elgato Stream Deck"
5091:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app="Elgato Stream Deck"
5092:  time=level=INFO msg="Looking for app: Elgato Stream Deck, version: 7.5.0" app="Elgato Stream Deck"
5093:  time=level=INFO msg="Found app: 'Stream Deck' at /Applications/Elgato Stream Deck.app, Version: 7.5.0, Bundled Version: 22885" app="Elgato Stream Deck"
5094:  time=level=INFO msg="Executing uninstall script for app..." app="Elgato Stream Deck"
5095:  time=level=INFO msg="Looking for app: Elgato Stream Deck, version: 7.5.0" app="Elgato Stream Deck"
5096:  time=level=INFO msg="All checks passed for app: Elgato Stream Deck (elgato-stream-deck/darwin)"
5097:  time=level=INFO msg="Validating app: Mozilla Firefox (firefox/darwin)"
5098:  time=level=INFO msg=Downloading...
5099:  time=level=INFO msg="App is marked as pre-installed, attempting to run uninstall script..." app="Mozilla Firefox"
5100:  time=level=INFO msg="Executing uninstall script for app..." app="Mozilla Firefox"
5101:  time=level=INFO msg="Looking for app: Mozilla Firefox, version: 152.0.4" app="Mozilla Firefox"
5102:  time=level=INFO msg="Application removal detected at: /Applications/Firefox.app" app="Mozilla Firefox"
5103:  time=level=INFO msg="Executing install script..." app="Mozilla Firefox"
5104:  time=level=INFO msg="New application detected at: /Applications/Firefox.app" app="Mozilla Firefox"
5105:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Firefox.app'" app="Mozilla Firefox"
5106:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Firefox.app'" app="Mozilla Firefox"
5107:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app="Mozilla Firefox"
5108:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/Firefox.app: No such xattr: com.apple.quarantine'" app="Mozilla Firefox"
5109:  time=level=INFO msg="Spctl output error: <nil>" app="Mozilla Firefox"
5110:  time=level=INFO msg="spctl status: spctl status: '/Applications/Firefox.app: accepted\nsource=Notarized Developer ID'" app="Mozilla Firefox"
5111:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app="Mozilla Firefox"
5112:  time=level=INFO msg="Looking for app: Mozilla Firefox, version: 152.0.4" app="Mozilla Firefox"
5113:  time=level=INFO msg="Found app: 'Firefox' at /Applications/Firefox.app, Version: 152.0.4, Bundled Version: 15226.6.29" app="Mozilla Firefox"
5114:  time=level=INFO msg="Executing uninstall script for app..." app="Mozilla Firefox"
5115:  time=level=INFO msg="Looking for app: Mozilla Firefox, version: 152.0.4" app="Mozilla Firefox"
5116:  time=level=INFO msg="All checks passed for app: Mozilla Firefox (firefox/darwin)"
5117:  time=level=INFO msg="Validating app: ForkLift (forklift/darwin)"
5118:  time=level=INFO msg=Downloading...
5119:  time=level=INFO msg="Executing install script..." app=ForkLift
5120:  time=level=INFO msg="New application detected at: /Applications/ForkLift.app" app=ForkLift
5121:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/ForkLift.app'" app=ForkLift
5122:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/ForkLift.app'" app=ForkLift
5123:  time=level=INFO msg="Quarantine output error: checking quarantine status: exit status 1" app=ForkLift
5124:  time=level=INFO msg="Quarantine status: Quarantine status: 'xattr: /Applications/ForkLift.app: No such xattr: com.apple.quarantine'" app=ForkLift
5125:  time=level=INFO msg="Spctl output error: <nil>" app=ForkLift
5126:  time=level=INFO msg="spctl status: spctl status: '/Applications/ForkLift.app: accepted\nsource=Notarized Developer ID'" app=ForkLift
5127:  time=level=WARN msg="Error detected in post-installation steps: Error removing app quarantine: adding app to quarantine exceptions: exit status 4. Attempting to continue" app=ForkLift
5128:  time=level=INFO msg="Looking for app: ForkLift, version: 4.7.1" app=ForkLift
5129:  time=level=INFO msg="Found app: 'ForkLift' at /Applications/ForkLift.app, Version: 4.7.1, Bundled Version: 478" app=ForkLift
5130:  time=level=INFO msg="Executing uninstall script for app..." app=ForkLift
5131:  time=level=INFO msg="Looking for app: ForkLift, version: 4.7.1" app=ForkLift
5132:  time=level=INFO msg="All checks passed for app: ForkLift (forklift/darwin)"
5133:  time=level=INFO msg="Validating app: Franz (franz/darwin)"
5134:  time=level=INFO msg=Downloading...
5135:  time=level=INFO msg="Executing install script..." app=Franz
5136:  time=level=INFO msg="New application detected at: /Applications/Franz.app" app=Franz
5137:  time=level=INFO msg="Forcing LaunchServices refresh for: '/Applications/Franz.app'" app=Franz
5138:  time=level=INFO msg="Attempting to remove quarantine for: '/Applications/Franz.app'" ...

@github-actions

github-actions Bot commented Jul 1, 2026

Copy link
Copy Markdown
Contributor

Closing in favor of #48533.

@github-actions github-actions Bot closed this Jul 1, 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