diff --git a/ee/maintained-apps/outputs/adobe-acrobat-reader/windows.json b/ee/maintained-apps/outputs/adobe-acrobat-reader/windows.json
index d60d70afff..9010ada330 100644
--- a/ee/maintained-apps/outputs/adobe-acrobat-reader/windows.json
+++ b/ee/maintained-apps/outputs/adobe-acrobat-reader/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "26.001.21651",
+ "version": "26.001.21662",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Adobe Acrobat (64-bit)' AND publisher = 'Adobe';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Adobe Acrobat (64-bit)' AND publisher = 'Adobe' AND version_compare(version, '26.001.21651') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Adobe Acrobat (64-bit)' AND publisher = 'Adobe' AND version_compare(version, '26.001.21662') < 0);"
},
- "installer_url": "https://ardownload2.adobe.com/pub/adobe/acrobat/win/AcrobatDC/2600121651/AcroRdrDCx642600121651_MUI.exe",
+ "installer_url": "https://ardownload2.adobe.com/pub/adobe/acrobat/win/AcrobatDC/2600121662/AcroRdrDCx642600121662_MUI.exe",
"install_script_ref": "7dc0b065",
"uninstall_script_ref": "3bb10c80",
- "sha256": "f5ccdbe1b020b51a7d1caf9e4db02fa06b43082a8dc9a6a1125f034888e20b96",
+ "sha256": "2bf2c241859b1d1b13198394ce87639352635a3c3901c9992203de632cdea66a",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/amazon-workspaces/windows.json b/ee/maintained-apps/outputs/amazon-workspaces/windows.json
index 59d1ceefeb..6d222ff97b 100644
--- a/ee/maintained-apps/outputs/amazon-workspaces/windows.json
+++ b/ee/maintained-apps/outputs/amazon-workspaces/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "5.32.2.5905",
+ "version": "5.33.0.5939",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Amazon WorkSpaces' AND publisher = 'Amazon Web Services, Inc';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Amazon WorkSpaces' AND publisher = 'Amazon Web Services, Inc' AND version_compare(version, '5.32.2.5905') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Amazon WorkSpaces' AND publisher = 'Amazon Web Services, Inc' AND version_compare(version, '5.33.0.5939') < 0);"
},
"installer_url": "https://d2td7dqidlhjx7.cloudfront.net/prod/global/windows/Amazon+WorkSpaces.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "24059738",
- "sha256": "d92852c27efd33f349da727f6a7d2c5622441bf7fdb1a00a3132e4a4988f3f96",
+ "sha256": "b2d463cd6d0124a6ea887d4d1f3c3457fa32ade448b6eb3e29db1ecd07a356c9",
"default_categories": [
"Productivity"
],
diff --git a/ee/maintained-apps/outputs/aws-cli/windows.json b/ee/maintained-apps/outputs/aws-cli/windows.json
index 55c0f5745d..9b312db788 100644
--- a/ee/maintained-apps/outputs/aws-cli/windows.json
+++ b/ee/maintained-apps/outputs/aws-cli/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "2.34.63",
+ "version": "2.34.64",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.34.63') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'AWS Command Line Interface v2 %' AND publisher = 'Amazon Web Services' AND version_compare(version, '2.34.64') < 0);"
},
- "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.34.63.msi",
+ "installer_url": "https://awscli.amazonaws.com/AWSCLIV2-2.34.64.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "58bcd016",
- "sha256": "6c3a583a96cf92905c5b01ede3456e7a4a5c90f4a77a3058140952bf956f2ccf",
+ "sha256": "a45be95e0b5ce8f42c3334dd2e7a001805a467ed4e7df4a6a336a5e4c01051d8",
"default_categories": [
"Developer tools"
],
diff --git a/ee/maintained-apps/outputs/clion/darwin.json b/ee/maintained-apps/outputs/clion/darwin.json
index 9c95e63806..4844dbe675 100644
--- a/ee/maintained-apps/outputs/clion/darwin.json
+++ b/ee/maintained-apps/outputs/clion/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "2026.1.2",
+ "version": "2026.1.3",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.jetbrains.CLion';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.jetbrains.CLion' AND version_compare(bundle_short_version, '2026.1.2') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.jetbrains.CLion' AND version_compare(bundle_short_version, '2026.1.3') < 0);"
},
- "installer_url": "https://download.jetbrains.com/cpp/CLion-2026.1.2-aarch64.dmg",
+ "installer_url": "https://download.jetbrains.com/cpp/CLion-2026.1.3-aarch64.dmg",
"install_script_ref": "0eea3e67",
"uninstall_script_ref": "efb3480e",
- "sha256": "b1c3300c5fa621fc7feba701aef771a7e814dfea80dac516aa81821213c8b631",
+ "sha256": "4073f514213ffcaf785dd6036d07f740feaadfd6a0efcb57c862ac54fbe7953f",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/clockify/darwin.json b/ee/maintained-apps/outputs/clockify/darwin.json
index eaccb1ba4e..f63da5efba 100644
--- a/ee/maintained-apps/outputs/clockify/darwin.json
+++ b/ee/maintained-apps/outputs/clockify/darwin.json
@@ -1,10 +1,10 @@
{
"versions": [
{
- "version": "2.12.4",
+ "version": "2.12.5",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'coing.ClockifyDesktop';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'coing.ClockifyDesktop' AND version_compare(bundle_short_version, '2.12.4') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'coing.ClockifyDesktop' AND version_compare(bundle_short_version, '2.12.5') < 0);"
},
"installer_url": "https://clockify.me/downloads/ClockifyDesktop.zip",
"install_script_ref": "de01ae28",
diff --git a/ee/maintained-apps/outputs/connect-fonts/darwin.json b/ee/maintained-apps/outputs/connect-fonts/darwin.json
index b90ce20eea..5c18eaea6d 100644
--- a/ee/maintained-apps/outputs/connect-fonts/darwin.json
+++ b/ee/maintained-apps/outputs/connect-fonts/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "28.1.4",
+ "version": "28.1.5",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.extensis.SuitcaseFusion';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.extensis.SuitcaseFusion' AND version_compare(bundle_short_version, '28.1.4') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.extensis.SuitcaseFusion' AND version_compare(bundle_short_version, '28.1.5') < 0);"
},
- "installer_url": "https://bin.extensis.com/ConnectFonts-M-28-1-4.dmg",
+ "installer_url": "https://bin.extensis.com/ConnectFonts-M-28-1-5.dmg",
"install_script_ref": "2f23cef8",
"uninstall_script_ref": "4a5a730b",
- "sha256": "3bce1e36faad24aa42f4ededb132c78439a3ed69d56bf0ac61e70f2c3b341c91",
+ "sha256": "8e8b35781729855397922fe7742a84d47dbb2a559a56c49eaef85fd8c8026fbc",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/cursor/darwin.json b/ee/maintained-apps/outputs/cursor/darwin.json
index bc92b7c0b2..8fe6d9df6f 100644
--- a/ee/maintained-apps/outputs/cursor/darwin.json
+++ b/ee/maintained-apps/outputs/cursor/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "3.7.19",
+ "version": "3.7.21",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92' AND version_compare(bundle_short_version, '3.7.19') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92' AND version_compare(bundle_short_version, '3.7.21') < 0);"
},
- "installer_url": "https://downloads.cursor.com/production/80c653c2c3528e65016a0d304b54486084b470bb/darwin/arm64/Cursor-darwin-arm64.zip",
+ "installer_url": "https://downloads.cursor.com/production/517f696d8ab6c53eb04fbfdaae705cd146bf346e/darwin/arm64/Cursor-darwin-arm64.zip",
"install_script_ref": "5147ff0b",
"uninstall_script_ref": "9d80ae1c",
- "sha256": "6afb577260c9ede66c0ad7e1a023cabc5eae86b9b53691b52e2bbf5ee16c82c2",
+ "sha256": "260331dd3d601b82f7900f05e44ba895a2ee69d456783a401285cd6a07976507",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/dbeaver-enterprise/windows.json b/ee/maintained-apps/outputs/dbeaver-enterprise/windows.json
index d9de358889..e8b75c22e8 100644
--- a/ee/maintained-apps/outputs/dbeaver-enterprise/windows.json
+++ b/ee/maintained-apps/outputs/dbeaver-enterprise/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "26.0.0",
+ "version": "26.1.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'DBeaverEE %' AND publisher = 'DBeaver Corp';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'DBeaverEE %' AND publisher = 'DBeaver Corp' AND version_compare(version, '26.0.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'DBeaverEE %' AND publisher = 'DBeaver Corp' AND version_compare(version, '26.1.0') < 0);"
},
- "installer_url": "https://downloads.dbeaver.net/enterprise/26.0.0/dbeaver-ee-26.0.0-windows-x86_64.exe",
+ "installer_url": "https://downloads.dbeaver.net/enterprise/26.1.0/dbeaver-ee-26.1.0-windows-x86_64.exe",
"install_script_ref": "d217c97c",
"uninstall_script_ref": "bbffac6a",
- "sha256": "5ad29a11b254045b124364e1d335403faae1f6b420c036d77b23999e334765d0",
+ "sha256": "ba8e816a065564b7abcf2487ea0b1f28ec9e2427ba4d8aef9da3dfe15e1ba99e",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/dbeaverlite/windows.json b/ee/maintained-apps/outputs/dbeaverlite/windows.json
index f60c5d5ea8..c9f3b6a844 100644
--- a/ee/maintained-apps/outputs/dbeaverlite/windows.json
+++ b/ee/maintained-apps/outputs/dbeaverlite/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "26.0.0",
+ "version": "26.1.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'DBeaverLite %' AND publisher = 'DBeaver Corp';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'DBeaverLite %' AND publisher = 'DBeaver Corp' AND version_compare(version, '26.0.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'DBeaverLite %' AND publisher = 'DBeaver Corp' AND version_compare(version, '26.1.0') < 0);"
},
- "installer_url": "https://downloads.dbeaver.net/lite/26.0.0/dbeaver-le-26.0.0-windows-x86_64.exe",
+ "installer_url": "https://downloads.dbeaver.net/lite/26.1.0/dbeaver-le-26.1.0-windows-x86_64.exe",
"install_script_ref": "f305c446",
"uninstall_script_ref": "6763cb51",
- "sha256": "11b33c8d282e1e4ccd304da4d1c5c8677d380312c104e509cc5e5ded5367852d",
+ "sha256": "a95241f4f482f8fd552c018f29166ff5f2329102c848eb2787264e88991def41",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/dbeaverultimate/windows.json b/ee/maintained-apps/outputs/dbeaverultimate/windows.json
index 2cfe11181e..b99b75d64b 100644
--- a/ee/maintained-apps/outputs/dbeaverultimate/windows.json
+++ b/ee/maintained-apps/outputs/dbeaverultimate/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "26.0.0",
+ "version": "26.1.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'DBeaverUltimate %' AND publisher = 'DBeaver Corp';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'DBeaverUltimate %' AND publisher = 'DBeaver Corp' AND version_compare(version, '26.0.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'DBeaverUltimate %' AND publisher = 'DBeaver Corp' AND version_compare(version, '26.1.0') < 0);"
},
- "installer_url": "https://downloads.dbeaver.net/ultimate/26.0.0/dbeaver-ue-26.0.0-windows-x86_64.exe",
+ "installer_url": "https://downloads.dbeaver.net/ultimate/26.1.0/dbeaver-ue-26.1.0-windows-x86_64.exe",
"install_script_ref": "d46ba9a9",
"uninstall_script_ref": "d9df80cd",
- "sha256": "fe28a204a932105c6dddf1f673a00f95e30180bf814dea099f6633cae0567805",
+ "sha256": "20c94c65e8584abe9866a9094af46aa3fe501e006a7b07b7a24f557c3afdeaf7",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/discord/darwin.json b/ee/maintained-apps/outputs/discord/darwin.json
index cc45ebef70..c3f8d3ca46 100644
--- a/ee/maintained-apps/outputs/discord/darwin.json
+++ b/ee/maintained-apps/outputs/discord/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "0.0.393",
+ "version": "0.0.394",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.hnc.Discord';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hnc.Discord' AND version_compare(bundle_short_version, '0.0.393') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.hnc.Discord' AND version_compare(bundle_short_version, '0.0.394') < 0);"
},
- "installer_url": "https://dl.discordapp.net/apps/osx/0.0.393/Discord.dmg",
+ "installer_url": "https://dl.discordapp.net/apps/osx/0.0.394/Discord.dmg",
"install_script_ref": "de3e67db",
"uninstall_script_ref": "46a242eb",
- "sha256": "84cb4560a6f46034780d6c534c396591fe4f0550646b83e853d5d76df5438cf2",
+ "sha256": "0a899264f7862be99977ad747c646162d6eb139d3ec342d36fbfd0b721f099bc",
"default_categories": [
"Communication"
]
diff --git a/ee/maintained-apps/outputs/discord/windows.json b/ee/maintained-apps/outputs/discord/windows.json
index 8e0819f298..61f29e953c 100644
--- a/ee/maintained-apps/outputs/discord/windows.json
+++ b/ee/maintained-apps/outputs/discord/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "1.0.9240",
+ "version": "1.0.9241",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Discord' AND publisher = 'Discord Inc.';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Discord' AND publisher = 'Discord Inc.' AND version_compare(version, '1.0.9240') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Discord' AND publisher = 'Discord Inc.' AND version_compare(version, '1.0.9241') < 0);"
},
- "installer_url": "https://stable.dl2.discordapp.net/distro/app/stable/win/x64/1.0.9240/DiscordSetup.exe",
+ "installer_url": "https://stable.dl2.discordapp.net/distro/app/stable/win/x64/1.0.9241/DiscordSetup.exe",
"install_script_ref": "fd04e860",
"uninstall_script_ref": "73fc6eff",
- "sha256": "851ef42f56604c5b0998a683ac603b986898ddc1d06246e4e6ef8990a0fef005",
+ "sha256": "99909799082c39500bd6abe13ec7752fbe13ee659a75ddab585ff727d1d8b2bb",
"default_categories": [
"Communication"
]
diff --git a/ee/maintained-apps/outputs/docker-desktop/darwin.json b/ee/maintained-apps/outputs/docker-desktop/darwin.json
index 928c8b8373..f3c9bf533c 100644
--- a/ee/maintained-apps/outputs/docker-desktop/darwin.json
+++ b/ee/maintained-apps/outputs/docker-desktop/darwin.json
@@ -1,22 +1,22 @@
{
"versions": [
{
- "version": "4.76.0",
+ "version": "4.77.0",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.dockerdesktop';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.dockerdesktop' AND path NOT LIKE '%.back' AND version_compare(bundle_short_version, '4.76.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.dockerdesktop' AND path NOT LIKE '%.back' AND version_compare(bundle_short_version, '4.77.0') < 0);"
},
- "installer_url": "https://desktop.docker.com/mac/main/arm64/228118/Docker.dmg",
+ "installer_url": "https://desktop.docker.com/mac/main/arm64/228796/Docker.dmg",
"install_script_ref": "2c3a200a",
- "uninstall_script_ref": "1ff5f767",
- "sha256": "665ee778a5967fe3b0a6173e0c46657e71e090ff33d7f4dfd89dddbddf2981c4",
+ "uninstall_script_ref": "dd14c72d",
+ "sha256": "94fcfeb9f29035b600bf98ea799bdec8a3fb656eea7894bf6549a1a56a8f8213",
"default_categories": [
"Developer tools"
]
}
],
"refs": {
- "1ff5f767": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\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\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.docker.helper'\nremove_launchctl_service 'com.docker.socket'\nremove_launchctl_service 'com.docker.vmnetd'\nquit_application 'com.docker.docker'\nquit_application 'com.electron.dockerdesktop'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.docker.socket'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.docker.vmnetd'\nsudo rmdir '~/.docker/bin'\nsudo rm -rf \"$APPDIR/Docker.app\"\nsudo rm -rf '/usr/local/cli-plugins/docker-compose'\nsudo rm -rf '/usr/local/bin/hub-tool'\nsudo rm -rf '/usr/local/bin/kubectl.docker'\nsudo rm -rf '/usr/local/bin/docker'\nsudo rm -rf '/usr/local/bin/docker-credential-desktop'\nsudo rm -rf '/usr/local/bin/docker-credential-ecr-login'\nsudo rm -rf '/usr/local/bin/docker-credential-osxkeychain'\nsudo rmdir '~/Library/Caches/com.plausiblelabs.crashreporter.data'\nsudo rmdir '~/Library/Caches/KSCrashReports'\ntrash $LOGGED_IN_USER '/usr/local/bin/docker-compose.backup'\ntrash $LOGGED_IN_USER '/usr/local/bin/docker.backup'\ntrash $LOGGED_IN_USER '~/.docker'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.docker.helper'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/group.com.docker'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.docker.helper.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.electron.dockerdesktop.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.bugsnag.Bugsnag/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Docker Desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Caches/KSCrashReports/Docker'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.docker.helper'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/group.com.docker'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.docker.docker.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/Docker Desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.docker.docker.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.docker-frontend.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.dockerdesktop.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.electron.docker-frontend.savedState'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.electron.dockerdesktop.savedState'\n",
- "2c3a200a": "#!/bin/bash\n\nset -euo pipefail\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\nMOUNT_POINT=\"\"\n\ncleanup() {\n local mp=\"${MOUNT_POINT:-}\"\n if [[ -n \"$mp\" ]]; then\n if mount | grep -q \" on $mp \"; then\n hdiutil detach \"$mp\" >/dev/null 2>&1 || true\n fi\n rmdir \"$mp\" >/dev/null 2>&1 || true\n fi\n}\ntrap cleanup EXIT\n\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name\n 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 || echo \"false\")\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return 0\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console 2>/dev/null || echo \"\")\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 0\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 within ${timeout_duration}s; aborting install.\" >&2\n return 1\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name\n 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:-0}\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console 2>/dev/null || echo \"\")\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nif ! hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"; then\n echo \"Failed to mount DMG '$INSTALLER_PATH'.\" >&2\n exit 1\nfi\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\nMOUNT_POINT=\"\"\n# copy to the applications folder\nquit_and_track_application 'com.electron.dockerdesktop'\nif [ -d \"$APPDIR/Docker.app\" ]; then\n\tsudo mv \"$APPDIR/Docker.app\" \"$TMPDIR/Docker.app.bkp\"\nfi\n# Docker Desktop's own in-app updater leaves a Docker.app.back bundle alongside\n# Docker.app when it self-updates. osquery's apps table still picks up the\n# stale bundle by its bundle_identifier, which causes Fleet patch policies to\n# report Docker as out of date even after a successful upgrade.\nsudo rm -rf \"$APPDIR/Docker.app.back\"\nsudo cp -R \"$TMPDIR/Docker.app\" \"$APPDIR\"\nrelaunch_application 'com.electron.dockerdesktop'\nmkdir -p /usr/local/cli-plugins\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/cli-plugins/docker-compose\" \"/usr/local/cli-plugins/docker-compose\"\nmkdir -p /usr/local/bin\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/hub-tool\" \"/usr/local/bin/hub-tool\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/kubectl\" \"/usr/local/bin/kubectl.docker\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker\" \"/usr/local/bin/docker\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker-credential-desktop\" \"/usr/local/bin/docker-credential-desktop\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker-credential-ecr-login\" \"/usr/local/bin/docker-credential-ecr-login\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker-credential-osxkeychain\" \"/usr/local/bin/docker-credential-osxkeychain\"\n"
+ "2c3a200a": "#!/bin/bash\n\nset -euo pipefail\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\nMOUNT_POINT=\"\"\n\ncleanup() {\n local mp=\"${MOUNT_POINT:-}\"\n if [[ -n \"$mp\" ]]; then\n if mount | grep -q \" on $mp \"; then\n hdiutil detach \"$mp\" >/dev/null 2>&1 || true\n fi\n rmdir \"$mp\" >/dev/null 2>&1 || true\n fi\n}\ntrap cleanup EXIT\n\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name\n 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 || echo \"false\")\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return 0\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console 2>/dev/null || echo \"\")\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 0\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 within ${timeout_duration}s; aborting install.\" >&2\n return 1\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name\n 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:-0}\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console 2>/dev/null || echo \"\")\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nif ! hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\"; then\n echo \"Failed to mount DMG '$INSTALLER_PATH'.\" >&2\n exit 1\nfi\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\"\nMOUNT_POINT=\"\"\n# copy to the applications folder\nquit_and_track_application 'com.electron.dockerdesktop'\nif [ -d \"$APPDIR/Docker.app\" ]; then\n\tsudo mv \"$APPDIR/Docker.app\" \"$TMPDIR/Docker.app.bkp\"\nfi\n# Docker Desktop's own in-app updater leaves a Docker.app.back bundle alongside\n# Docker.app when it self-updates. osquery's apps table still picks up the\n# stale bundle by its bundle_identifier, which causes Fleet patch policies to\n# report Docker as out of date even after a successful upgrade.\nsudo rm -rf \"$APPDIR/Docker.app.back\"\nsudo cp -R \"$TMPDIR/Docker.app\" \"$APPDIR\"\nrelaunch_application 'com.electron.dockerdesktop'\nmkdir -p /usr/local/cli-plugins\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/cli-plugins/docker-compose\" \"/usr/local/cli-plugins/docker-compose\"\nmkdir -p /usr/local/bin\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/hub-tool\" \"/usr/local/bin/hub-tool\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/kubectl\" \"/usr/local/bin/kubectl.docker\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker\" \"/usr/local/bin/docker\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker-credential-desktop\" \"/usr/local/bin/docker-credential-desktop\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker-credential-ecr-login\" \"/usr/local/bin/docker-credential-ecr-login\"\n/bin/ln -h -f -s -- \"$APPDIR/Docker.app/Contents/Resources/bin/docker-credential-osxkeychain\" \"/usr/local/bin/docker-credential-osxkeychain\"\n",
+ "dd14c72d": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\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\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.docker.helper'\nremove_launchctl_service 'com.docker.socket'\nremove_launchctl_service 'com.docker.vmnetd'\nquit_application 'com.docker.docker'\nquit_application 'com.electron.dockerdesktop'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.docker.socket'\nsudo rm -rf '/Library/PrivilegedHelperTools/com.docker.vmnetd'\nsudo rmdir '~/.docker/bin'\nsudo rm -rf \"$APPDIR/Docker.app\"\nsudo rm -rf '/usr/local/bin/docker'\nsudo rm -rf '/usr/local/bin/docker-credential-osxkeychain'\nsudo rm -rf '/usr/local/bin/kubectl.docker'\nsudo rm -rf '/usr/local/cli-plugins/docker-compose'\nsudo rm -rf '/usr/local/bin/docker-credential-desktop'\nsudo rm -rf '/usr/local/bin/docker-credential-ecr-login'\nsudo rmdir '~/Library/Caches/com.plausiblelabs.crashreporter.data'\nsudo rmdir '~/Library/Caches/KSCrashReports'\ntrash $LOGGED_IN_USER '/usr/local/bin/docker-compose.backup'\ntrash $LOGGED_IN_USER '/usr/local/bin/docker.backup'\ntrash $LOGGED_IN_USER '~/.docker'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.docker.helper'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/group.com.docker'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.docker.helper.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.electron.dockerdesktop.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.bugsnag.Bugsnag/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Docker Desktop'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Caches/KSCrashReports/Docker'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.docker.helper'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/group.com.docker'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.docker.docker'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.docker.docker.binarycookies'\ntrash $LOGGED_IN_USER '~/Library/Logs/Docker Desktop'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.docker.docker.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.docker-frontend.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.electron.dockerdesktop.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.electron.docker-frontend.savedState'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.electron.dockerdesktop.savedState'\n"
}
}
diff --git a/ee/maintained-apps/outputs/docker/windows.json b/ee/maintained-apps/outputs/docker/windows.json
index 17d3c35342..c5b436c1a7 100644
--- a/ee/maintained-apps/outputs/docker/windows.json
+++ b/ee/maintained-apps/outputs/docker/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "4.76.0",
+ "version": "4.77.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.' AND version_compare(version, '4.76.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Docker Desktop' AND publisher = 'Docker Inc.' AND version_compare(version, '4.77.0') < 0);"
},
"installer_url": "https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe",
"install_script_ref": "b06042dd",
"uninstall_script_ref": "0b74af50",
- "sha256": "42978fa07e50e3beb6923448e970d03aadd9abf5ea52230cf8a28ff81d2815e0",
+ "sha256": "5b866599f0de9208f4594d64aa33658fa55cbdd64e0db13648cffe12c91795d2",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/firefox/darwin.json b/ee/maintained-apps/outputs/firefox/darwin.json
index e2c94afe60..fdbb121cb3 100644
--- a/ee/maintained-apps/outputs/firefox/darwin.json
+++ b/ee/maintained-apps/outputs/firefox/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "151.0.3",
+ "version": "151.0.4",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.firefox';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.firefox' AND version_compare(bundle_short_version, '151.0.3') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'org.mozilla.firefox' AND version_compare(bundle_short_version, '151.0.4') < 0);"
},
- "installer_url": "https://download-installer.cdn.mozilla.net/pub/firefox/releases/151.0.3/mac/en-US/Firefox%20151.0.3.dmg",
+ "installer_url": "https://download-installer.cdn.mozilla.net/pub/firefox/releases/151.0.4/mac/en-US/Firefox%20151.0.4.dmg",
"install_script_ref": "b5e4c76e",
"uninstall_script_ref": "b85c0267",
- "sha256": "60d5cb29412b161c76ecc58f3f8a960cd0048081cf84c6fe91579f1957564277",
+ "sha256": "bc2e72f6abf31aa854b30a3e2841d3f2b8b8e153eaa0a5c3ab285728b7f9b160",
"default_categories": [
"Browsers"
]
diff --git a/ee/maintained-apps/outputs/firefox/windows.json b/ee/maintained-apps/outputs/firefox/windows.json
index 5d91a521c5..a3e3457e91 100644
--- a/ee/maintained-apps/outputs/firefox/windows.json
+++ b/ee/maintained-apps/outputs/firefox/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "151.0.3",
+ "version": "151.0.4",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Mozilla Firefox (x64 en-US)' AND publisher = 'Mozilla';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Mozilla Firefox (x64 en-US)' AND publisher = 'Mozilla' AND version_compare(version, '151.0.3') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Mozilla Firefox (x64 en-US)' AND publisher = 'Mozilla' AND version_compare(version, '151.0.4') < 0);"
},
- "installer_url": "https://download-installer.cdn.mozilla.net/pub/firefox/releases/151.0.3/win64/en-US/Firefox%20Setup%20151.0.3.exe",
+ "installer_url": "https://download-installer.cdn.mozilla.net/pub/firefox/releases/151.0.4/win64/en-US/Firefox%20Setup%20151.0.4.exe",
"install_script_ref": "80fb9175",
"uninstall_script_ref": "8b5e20e4",
- "sha256": "ebeaca771401c1162df251681111262869e7186288605702811f4a734197d3d7",
+ "sha256": "528cf4d62c9e627231718d2c567cb5ac290d7279c97daae347e8227cdefd46ef",
"default_categories": [
"Browsers"
]
diff --git a/ee/maintained-apps/outputs/google-chrome/darwin.json b/ee/maintained-apps/outputs/google-chrome/darwin.json
index b10d557005..e115b4d871 100644
--- a/ee/maintained-apps/outputs/google-chrome/darwin.json
+++ b/ee/maintained-apps/outputs/google-chrome/darwin.json
@@ -1,10 +1,10 @@
{
"versions": [
{
- "version": "149.0.7827.54",
+ "version": "149.0.7827.103",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome' AND version_compare(bundle_short_version, '149.0.7827.54') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.google.Chrome' AND version_compare(bundle_short_version, '149.0.7827.103') < 0);"
},
"installer_url": "https://dl.google.com/dl/chrome/mac/universal/stable/gcem/GoogleChrome.pkg",
"install_script_ref": "6981ff84",
diff --git a/ee/maintained-apps/outputs/google-chrome/windows.json b/ee/maintained-apps/outputs/google-chrome/windows.json
index d9a5b0f1c1..095735812b 100644
--- a/ee/maintained-apps/outputs/google-chrome/windows.json
+++ b/ee/maintained-apps/outputs/google-chrome/windows.json
@@ -1,10 +1,10 @@
{
"versions": [
{
- "version": "149.0.7827.54",
+ "version": "149.0.7827.103",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC' AND version_compare(version, '149.0.7827.54') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Google Chrome' AND publisher = 'Google LLC' AND version_compare(version, '149.0.7827.103') < 0);"
},
"installer_url": "https://dl.google.com/dl/chrome/install/googlechromestandaloneenterprise64.msi",
"install_script_ref": "8959087b",
diff --git a/ee/maintained-apps/outputs/grammarly-desktop/darwin.json b/ee/maintained-apps/outputs/grammarly-desktop/darwin.json
index a76f14398d..676d4ea7aa 100644
--- a/ee/maintained-apps/outputs/grammarly-desktop/darwin.json
+++ b/ee/maintained-apps/outputs/grammarly-desktop/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "1.168.0",
+ "version": "1.169.1",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.grammarly.ProjectLlama';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.grammarly.ProjectLlama' AND version_compare(bundle_short_version, '1.168.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.grammarly.ProjectLlama' AND version_compare(bundle_short_version, '1.169.1') < 0);"
},
- "installer_url": "https://download-mac.grammarly.com/versions/1.168.0.0/Grammarly.dmg",
+ "installer_url": "https://download-mac.grammarly.com/versions/1.169.1.0/Grammarly.dmg",
"install_script_ref": "20d5bd8f",
"uninstall_script_ref": "e14b2d61",
- "sha256": "858906acf4bdb42395a0ecb301312a52e4f595ae88d14c99c21d25acd16f186e",
+ "sha256": "e486fb425b7a2b631e56190273517518ad137705475e0be84aed247173b30b75",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/granola/darwin.json b/ee/maintained-apps/outputs/granola/darwin.json
index 1da4d99c0a..e64b970698 100644
--- a/ee/maintained-apps/outputs/granola/darwin.json
+++ b/ee/maintained-apps/outputs/granola/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "7.303.0",
+ "version": "7.309.0",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.granola.app';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.granola.app' AND version_compare(bundle_short_version, '7.303.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.granola.app' AND version_compare(bundle_short_version, '7.309.0') < 0);"
},
- "installer_url": "https://dr2v7l5emb758.cloudfront.net/7.303.0/Granola-7.303.0-mac-universal.dmg",
+ "installer_url": "https://dr2v7l5emb758.cloudfront.net/7.309.0/Granola-7.309.0-mac-universal.dmg",
"install_script_ref": "89a55638",
"uninstall_script_ref": "7b9b9d06",
- "sha256": "038c7dd6b1a8013f0bf956f31d0d8dee1b9b641b756a8ff2fb11d41421b698b7",
+ "sha256": "3dd76897395f981f8f4bfef52b75bb88e09b7948d73a1e253dbd99713df86b0f",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/granola/windows.json b/ee/maintained-apps/outputs/granola/windows.json
index 48549c4bab..61bbc4fa5a 100644
--- a/ee/maintained-apps/outputs/granola/windows.json
+++ b/ee/maintained-apps/outputs/granola/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "7.303.0",
+ "version": "7.309.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola' AND version_compare(version, '7.303.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Granola %' AND publisher = 'Granola' AND version_compare(version, '7.309.0') < 0);"
},
- "installer_url": "https://dr2v7l5emb758.cloudfront.net/7.303.0/Granola-7.303.0-win-x64.exe",
+ "installer_url": "https://dr2v7l5emb758.cloudfront.net/7.309.0/Granola-7.309.0-win-x64.exe",
"install_script_ref": "3f66ac53",
"uninstall_script_ref": "a4fab3f5",
- "sha256": "5381b059899caf0a6b6f7b7d6506db4b7d7b408afe8eec05ea42535dc3628da8",
+ "sha256": "6854bcd0fe746ff547f5ea5414ae84cb8c4a06d50bc037a81da6e81ac57e1200",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/imazing/windows.json b/ee/maintained-apps/outputs/imazing/windows.json
index e89c7bb52a..5181fb3328 100644
--- a/ee/maintained-apps/outputs/imazing/windows.json
+++ b/ee/maintained-apps/outputs/imazing/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "3.5.3.0",
+ "version": "3.5.4.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'iMazing' AND publisher = 'DigiDNA';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'iMazing' AND publisher = 'DigiDNA' AND version_compare(version, '3.5.3.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'iMazing' AND publisher = 'DigiDNA' AND version_compare(version, '3.5.4.0') < 0);"
},
"installer_url": "https://downloads.imazing.com/windows/iMazing/iMazing3forWindows.exe",
"install_script_ref": "145b29b1",
"uninstall_script_ref": "a8fdf759",
- "sha256": "d167f1900190738d850c5ec41ad3838fd12818374b7681170d32af8adb50ef20",
+ "sha256": "0686128d3d53956beb8409d7812acbc4f6531ab9d0a515e284f227d6533ce8c6",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/microsoft-365-copilot/darwin.json b/ee/maintained-apps/outputs/microsoft-365-copilot/darwin.json
index bfd337457b..2a4ab4bb6d 100644
--- a/ee/maintained-apps/outputs/microsoft-365-copilot/darwin.json
+++ b/ee/maintained-apps/outputs/microsoft-365-copilot/darwin.json
@@ -1,22 +1,22 @@
{
"versions": [
{
- "version": "1.2605.2501",
+ "version": "1.2606.0101",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.m365copilot';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.m365copilot' AND version_compare(bundle_short_version, '1.2605.2501') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.microsoft.m365copilot' AND version_compare(bundle_short_version, '1.2606.0101') < 0);"
},
- "installer_url": "https://res.cdn.office.net/mro1cdnstorage/C1297A47-86C4-4C1F-97FA-950631F94777/MacAutoupdate/Microsoft_365_Copilot_universal_1.2605.2501_Installer.pkg",
- "install_script_ref": "4397e3d6",
+ "installer_url": "https://res.cdn.office.net/mro1cdnstorage/C1297A47-86C4-4C1F-97FA-950631F94777/MacAutoupdate/Microsoft_365_Copilot_universal_1.2606.0101_Installer.pkg",
+ "install_script_ref": "8c070fea",
"uninstall_script_ref": "ff8e1cf4",
- "sha256": "939836dc7d0c4403d0ffbc8fe138d75959b98898376886273114b36f64f56ea1",
+ "sha256": "99c2abda06be7a5369b2f3a9124c4735ecb4db69b1438265a872a4f1d768eabc",
"default_categories": [
"Productivity"
]
}
],
"refs": {
- "4397e3d6": "#!/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.microsoft.m365copilot'\n\nCHOICE_XML=$(mktemp /tmp/choice_xml_XXX)\n\ncat << EOF > \"$CHOICE_XML\"\n\n\n\n\n \n attributeSetting\n 0\n choiceAttribute\n selected\n choiceIdentifier\n com.microsoft.autoupdate\n \n\n\n\nEOF\n\nsudo installer -pkg \"$TMPDIR\"/Microsoft_365_Copilot_universal_1.2605.2501_Installer.pkg -target / -applyChoiceChangesXML \"$CHOICE_XML\"\n\nrelaunch_application 'com.microsoft.m365copilot'\n",
+ "8c070fea": "#!/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.microsoft.m365copilot'\n\nCHOICE_XML=$(mktemp /tmp/choice_xml_XXX)\n\ncat << EOF > \"$CHOICE_XML\"\n\n\n\n\n \n attributeSetting\n 0\n choiceAttribute\n selected\n choiceIdentifier\n com.microsoft.autoupdate\n \n\n\n\nEOF\n\nsudo installer -pkg \"$TMPDIR\"/Microsoft_365_Copilot_universal_1.2606.0101_Installer.pkg -target / -applyChoiceChangesXML \"$CHOICE_XML\"\n\nrelaunch_application 'com.microsoft.m365copilot'\n",
"ff8e1cf4": "#!/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_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 '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/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\nquit_application 'com.microsoft.autoupdate2'\nremove_pkg_files 'com.microsoft.m365copilot'\nforget_pkg 'com.microsoft.m365copilot'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.microsoft.m365copilot'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.microsoft.m365copilot'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.microsoft.m365copilot.plist'\n"
}
}
diff --git a/ee/maintained-apps/outputs/ollama/darwin.json b/ee/maintained-apps/outputs/ollama/darwin.json
index 557436654c..540fd168fa 100644
--- a/ee/maintained-apps/outputs/ollama/darwin.json
+++ b/ee/maintained-apps/outputs/ollama/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "0.30.6",
+ "version": "0.30.7",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.ollama';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.ollama' AND version_compare(bundle_short_version, '0.30.6') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.ollama' AND version_compare(bundle_short_version, '0.30.7') < 0);"
},
- "installer_url": "https://github.com/ollama/ollama/releases/download/v0.30.6/Ollama-darwin.zip",
+ "installer_url": "https://github.com/ollama/ollama/releases/download/v0.30.7/Ollama-darwin.zip",
"install_script_ref": "9f174559",
"uninstall_script_ref": "bf40e2d5",
- "sha256": "5b95c6c35595f668309a0c10de3cb059ddbf8fa06b548e4c4c4b3c7733dfbdec",
+ "sha256": "54f754d638e61f0aca6a1420e3f61c6bce2a640a4f736661adcdabd79f98a742",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/openvpn-connect/windows.json b/ee/maintained-apps/outputs/openvpn-connect/windows.json
index 37c5de0687..c64c3cebf3 100644
--- a/ee/maintained-apps/outputs/openvpn-connect/windows.json
+++ b/ee/maintained-apps/outputs/openvpn-connect/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "3.8.0",
+ "version": "3.9.0",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'OpenVPN Connect %' AND publisher = 'OpenVPN Inc.';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'OpenVPN Connect %' AND publisher = 'OpenVPN Inc.' AND version_compare(version, '3.8.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'OpenVPN Connect %' AND publisher = 'OpenVPN Inc.' AND version_compare(version, '3.9.0') < 0);"
},
- "installer_url": "https://packages.openvpn.net/connect/v3/openvpn-connect-3.8.0.4528_signed.msi",
+ "installer_url": "https://packages.openvpn.net/connect/v3/openvpn-connect-3.9.0.5008_signed.msi",
"install_script_ref": "8959087b",
"uninstall_script_ref": "9f994a0b",
- "sha256": "cc741664d07fd4eedc98103edb86b791d290640a969c288c3d1cb2d0b6de98ce",
+ "sha256": "31347812dd37dbbb69bc47de842eb179827266e9dfb45e7f6ce10c5d71a5bad6",
"default_categories": [
"Productivity"
],
diff --git a/ee/maintained-apps/outputs/postman/darwin.json b/ee/maintained-apps/outputs/postman/darwin.json
index 65108d1409..ca02ccff95 100644
--- a/ee/maintained-apps/outputs/postman/darwin.json
+++ b/ee/maintained-apps/outputs/postman/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "12.14.0",
+ "version": "12.14.2",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.14.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.postmanlabs.mac' AND version_compare(bundle_short_version, '12.14.2') < 0);"
},
- "installer_url": "https://dl.pstmn.io/download/version/12.14.0/osx_arm64",
+ "installer_url": "https://dl.pstmn.io/download/version/12.14.2/osx_arm64",
"install_script_ref": "96d73870",
"uninstall_script_ref": "966b2fa5",
- "sha256": "0435aa4b9479b923a0ff32eb7c1bfac921be3eb4803f8120967c6cb844a81bfc",
+ "sha256": "7f52fd4255bcc0601cfa7fc5acc4c8faaeb74ec3680b00e589700d55c83c2c1c",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/postman/windows.json b/ee/maintained-apps/outputs/postman/windows.json
index 1decaf368f..7d7749710d 100644
--- a/ee/maintained-apps/outputs/postman/windows.json
+++ b/ee/maintained-apps/outputs/postman/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "12.14.0",
+ "version": "12.14.2",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name LIKE 'Postman x64 %' AND publisher = 'Postman';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Postman x64 %' AND publisher = 'Postman' AND version_compare(version, '12.14.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name LIKE 'Postman x64 %' AND publisher = 'Postman' AND version_compare(version, '12.14.2') < 0);"
},
- "installer_url": "https://dl.pstmn.io/download/version/12.14.0/windows_64",
+ "installer_url": "https://dl.pstmn.io/download/version/12.14.2/windows_64",
"install_script_ref": "538f63bf",
"uninstall_script_ref": "cd01b68f",
- "sha256": "855e62162c4518e6d96aed4b70f246b7e532eecd82896fbd97fc939450f06a4f",
+ "sha256": "20d6b29bc22e11f2248fcc4a069a137db1650d92f64e4d88019340b4b16545ec",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/proxyman/darwin.json b/ee/maintained-apps/outputs/proxyman/darwin.json
index 7b0bf9b478..45211bf6ef 100644
--- a/ee/maintained-apps/outputs/proxyman/darwin.json
+++ b/ee/maintained-apps/outputs/proxyman/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "6.10.0",
+ "version": "6.11.0",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.proxyman.NSProxy';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.proxyman.NSProxy' AND version_compare(bundle_short_version, '6.10.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.proxyman.NSProxy' AND version_compare(bundle_short_version, '6.11.0') < 0);"
},
- "installer_url": "https://download.proxyman.com/61000/Proxyman_6.10.0.dmg",
+ "installer_url": "https://download.proxyman.com/61100/Proxyman_6.11.0.dmg",
"install_script_ref": "1e7b20cd",
"uninstall_script_ref": "3dd0b5dd",
- "sha256": "7175e835eec424daff05a73037f373b54538cb4b1bc79ad46476d2f18d4e30f9",
+ "sha256": "adc9e992c22f8cf2b0686194ef355490a45702075cbec31be99af6c9eeb96273",
"default_categories": [
"Developer tools"
]
diff --git a/ee/maintained-apps/outputs/reaper/darwin.json b/ee/maintained-apps/outputs/reaper/darwin.json
index 7346db8e2b..dd327dbff9 100644
--- a/ee/maintained-apps/outputs/reaper/darwin.json
+++ b/ee/maintained-apps/outputs/reaper/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "7.73",
+ "version": "7.74",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.cockos.reaper';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.cockos.reaper' AND version_compare(bundle_short_version, '7.73') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.cockos.reaper' AND version_compare(bundle_short_version, '7.74') < 0);"
},
- "installer_url": "https://dlcf.reaper.fm/7.x/reaper773_universal.dmg",
+ "installer_url": "https://dlcf.reaper.fm/7.x/reaper774_universal.dmg",
"install_script_ref": "812a1a26",
"uninstall_script_ref": "544a54e5",
- "sha256": "884b259b98269240b009fc229605e046bc298fa0fa94dca90d99cd22fd593cac",
+ "sha256": "4319806a0d6d3c1ddb8f3ebc945b314a53229b4e887e35944dafbeac4e1fb9d1",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/reaper/windows.json b/ee/maintained-apps/outputs/reaper/windows.json
index 2925c40411..97761d7e68 100644
--- a/ee/maintained-apps/outputs/reaper/windows.json
+++ b/ee/maintained-apps/outputs/reaper/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "7.73",
+ "version": "7.74",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'REAPER' AND publisher = 'Cockos Incorporated';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'REAPER' AND publisher = 'Cockos Incorporated' AND version_compare(version, '7.73') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'REAPER' AND publisher = 'Cockos Incorporated' AND version_compare(version, '7.74') < 0);"
},
- "installer_url": "https://www.reaper.fm/files/7.x/reaper773_x64-install.exe",
+ "installer_url": "https://www.reaper.fm/files/7.x/reaper774_x64-install.exe",
"install_script_ref": "8fd3787f",
"uninstall_script_ref": "c67e0453",
- "sha256": "1a96f1aaf2c8fec04f92753078582ff577ad666f267965303daa12511db8752b",
+ "sha256": "14f53556f147105ddcd55190fe3bbae8fe6ade996db84c119f24e2b9e85861e6",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/slack/windows.json b/ee/maintained-apps/outputs/slack/windows.json
index 6c5ae7676b..ee3b39e633 100644
--- a/ee/maintained-apps/outputs/slack/windows.json
+++ b/ee/maintained-apps/outputs/slack/windows.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "4.50.128",
+ "version": "4.50.136",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.' AND version_compare(version, '4.50.128') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'Slack' AND publisher = 'Slack Technologies Inc.' AND version_compare(version, '4.50.136') < 0);"
},
- "installer_url": "https://downloads.slack-edge.com/desktop-releases/windows/x64/4.50.128/Slack.msix",
+ "installer_url": "https://downloads.slack-edge.com/desktop-releases/windows/x64/4.50.136/Slack.msix",
"install_script_ref": "8b41f934",
"uninstall_script_ref": "034eae14",
- "sha256": "418297aa7ee085b72194eac0c5b4aff8e30740b81498e15f4b7603aaf335477b",
+ "sha256": "da15dc60c979b4c278278ac0b00e754716fc2163d2b1144a1a570dd82bb7b13d",
"default_categories": [
"Communication"
]
diff --git a/ee/maintained-apps/outputs/teamviewer/darwin.json b/ee/maintained-apps/outputs/teamviewer/darwin.json
index 81bd83cd2a..59e84e1c08 100644
--- a/ee/maintained-apps/outputs/teamviewer/darwin.json
+++ b/ee/maintained-apps/outputs/teamviewer/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "15.78.3",
+ "version": "15.78.4",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.teamviewer.TeamViewer';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.teamviewer.TeamViewer' AND version_compare(bundle_short_version, '15.78.3') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.teamviewer.TeamViewer' AND version_compare(bundle_short_version, '15.78.4') < 0);"
},
- "installer_url": "https://dl.teamviewer.com/download/version_15x/update/15.78.3/TeamViewer.pkg",
+ "installer_url": "https://dl.teamviewer.com/download/version_15x/update/15.78.4/TeamViewer.pkg",
"install_script_ref": "71f9d405",
"uninstall_script_ref": "c22a9ebd",
- "sha256": "a29a1fcbd7093df5b99439803b2b97d80d15d65a2f99be508a5202a7daff275a",
+ "sha256": "45a9bf92ef86e9a04f5df925561549c5ebe01016b3c13bb086c7b5a863e873a8",
"default_categories": [
"Communication"
]
diff --git a/ee/maintained-apps/outputs/teamviewer/windows.json b/ee/maintained-apps/outputs/teamviewer/windows.json
index 7e38dca94b..3ceb6a4904 100644
--- a/ee/maintained-apps/outputs/teamviewer/windows.json
+++ b/ee/maintained-apps/outputs/teamviewer/windows.json
@@ -1,12 +1,12 @@
{
"versions": [
{
- "version": "15.78.3",
+ "version": "15.78.4",
"queries": {
"exists": "SELECT 1 FROM programs WHERE name = 'TeamViewer' AND publisher = 'TeamViewer';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'TeamViewer' AND publisher = 'TeamViewer' AND version_compare(version, '15.78.3') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM programs WHERE name = 'TeamViewer' AND publisher = 'TeamViewer' AND version_compare(version, '15.78.4') < 0);"
},
- "installer_url": "https://download.teamviewer.com/download/version_15x/TeamViewer_Setup_x64_15.78.3.exe",
+ "installer_url": "https://download.teamviewer.com/download/version_15x/TeamViewer_Setup_x64_15.78.4.exe",
"install_script_ref": "45f422bf",
"uninstall_script_ref": "390c83e7",
"sha256": "no_check",
diff --git a/ee/maintained-apps/outputs/vpn-tracker-365/darwin.json b/ee/maintained-apps/outputs/vpn-tracker-365/darwin.json
index 90dba95192..0182207208 100644
--- a/ee/maintained-apps/outputs/vpn-tracker-365/darwin.json
+++ b/ee/maintained-apps/outputs/vpn-tracker-365/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "26.3",
+ "version": "26.4",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.equinux.VPNTracker365';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.equinux.VPNTracker365' AND version_compare(bundle_short_version, '26.3') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.equinux.VPNTracker365' AND version_compare(bundle_short_version, '26.4') < 0);"
},
- "installer_url": "https://download.equinux.com/files/other/VPN%20Tracker%20365%20-%2026.3.87.zip",
+ "installer_url": "https://download.equinux.com/files/other/VPN%20Tracker%20365%20-%2026.4.93.zip",
"install_script_ref": "2656907f",
"uninstall_script_ref": "27f1845a",
- "sha256": "84a4cbf48a3e7496e504a6dab2a6feef3712f7fd755f3161fcb54fc855171058",
+ "sha256": "8cf71f61d625a05871a1127c4998dcb497f3a92587483fdaafe64e7237c840a6",
"default_categories": [
"Security"
]
diff --git a/ee/maintained-apps/outputs/warp/darwin.json b/ee/maintained-apps/outputs/warp/darwin.json
index 6fc584f23d..15f1a3ee47 100644
--- a/ee/maintained-apps/outputs/warp/darwin.json
+++ b/ee/maintained-apps/outputs/warp/darwin.json
@@ -1,12 +1,12 @@
{
"versions": [
{
- "version": "0.2026.06.03.09.49.01",
+ "version": "0.2026.06.03.09.49.02",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'dev.warp.Warp-Stable';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'dev.warp.Warp-Stable' AND version_compare(bundle_short_version, '0.2026.06.03.09.49.01') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'dev.warp.Warp-Stable' AND version_compare(bundle_short_version, '0.2026.06.03.09.49.02') < 0);"
},
- "installer_url": "https://releases.warp.dev/stable/v0.2026.06.03.09.49.stable_01/Warp.dmg",
+ "installer_url": "https://releases.warp.dev/stable/v0.2026.06.03.09.49.stable_02/Warp.dmg",
"install_script_ref": "007bc795",
"uninstall_script_ref": "932356de",
"sha256": "no_check",
diff --git a/ee/maintained-apps/outputs/wavebox/darwin.json b/ee/maintained-apps/outputs/wavebox/darwin.json
index f8be0fb2c2..6fa779f5a2 100644
--- a/ee/maintained-apps/outputs/wavebox/darwin.json
+++ b/ee/maintained-apps/outputs/wavebox/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "149.2.63.2",
+ "version": "149.2.69.2",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'io.wavebox.wavebox';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.wavebox.wavebox' AND version_compare(bundle_short_version, '149.2.63.2') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'io.wavebox.wavebox' AND version_compare(bundle_short_version, '149.2.69.2') < 0);"
},
- "installer_url": "https://download.wavebox.app/stable/macarm64/Wavebox_149.2.63.2.zip",
+ "installer_url": "https://download.wavebox.app/stable/macarm64/Wavebox_149.2.69.2.zip",
"install_script_ref": "60a16753",
"uninstall_script_ref": "ecfbed36",
- "sha256": "0f50bd771011fc277ba664b8193c7459d1bbca1e7b387891900af4bf5058569d",
+ "sha256": "501dad72cc78c7f1151b3c11a751df5132dd939343b835c938c6e7d3b68f5f6d",
"default_categories": [
"Browsers"
]
diff --git a/ee/maintained-apps/outputs/wealthfolio/darwin.json b/ee/maintained-apps/outputs/wealthfolio/darwin.json
index 9b059fee9d..51157312c4 100644
--- a/ee/maintained-apps/outputs/wealthfolio/darwin.json
+++ b/ee/maintained-apps/outputs/wealthfolio/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "3.4.0",
+ "version": "3.5.1",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.teymz.wealthfolio';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.teymz.wealthfolio' AND version_compare(bundle_short_version, '3.4.0') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.teymz.wealthfolio' AND version_compare(bundle_short_version, '3.5.1') < 0);"
},
- "installer_url": "https://github.com/afadil/wealthfolio/releases/download/v3.4.0/Wealthfolio_3.4.0_aarch64.dmg",
+ "installer_url": "https://github.com/afadil/wealthfolio/releases/download/v3.5.1/Wealthfolio_3.5.1_aarch64.dmg",
"install_script_ref": "161e063d",
"uninstall_script_ref": "cd049db6",
- "sha256": "eaf1a36f0aba42905ea387929642b33ac3ded9ce09ff24ccff6b7e6259a3b5e3",
+ "sha256": "b3f031881cd51e9402b41b2a98a8012c6dc8f517ad0ef92427f56b19ce379512",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/webcatalog/darwin.json b/ee/maintained-apps/outputs/webcatalog/darwin.json
index 6a05fa4c67..8696c35cb7 100644
--- a/ee/maintained-apps/outputs/webcatalog/darwin.json
+++ b/ee/maintained-apps/outputs/webcatalog/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "75.1.1",
+ "version": "75.2.0",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.webcatalog.jordan';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.webcatalog.jordan' AND version_compare(bundle_short_version, '75.1.1') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.webcatalog.jordan' AND version_compare(bundle_short_version, '75.2.0') < 0);"
},
- "installer_url": "https://cdn-2.webcatalog.io/webcatalog/WebCatalog-75.1.1-universal.dmg",
+ "installer_url": "https://cdn-2.webcatalog.io/webcatalog/WebCatalog-75.2.0-universal.dmg",
"install_script_ref": "f04928dc",
"uninstall_script_ref": "d196a4c8",
- "sha256": "69824c5f4751bbc46e7d7c14dcbecc8e6591a49cf4e427f6522a84ada7f69653",
+ "sha256": "81e5e87fdf195ac2b16099f5483c4948527da6e2a4383866f646a26544cbae3b",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/whatsapp/darwin.json b/ee/maintained-apps/outputs/whatsapp/darwin.json
index 1c109be760..6701f84243 100644
--- a/ee/maintained-apps/outputs/whatsapp/darwin.json
+++ b/ee/maintained-apps/outputs/whatsapp/darwin.json
@@ -1,10 +1,10 @@
{
"versions": [
{
- "version": "26.22.26",
+ "version": "26.23.15",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp' AND version_compare(bundle_short_version, '26.22.26') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'net.whatsapp.WhatsApp' AND version_compare(bundle_short_version, '26.23.15') < 0);"
},
"installer_url": "https://web.whatsapp.com/desktop/mac_native/release/?configuration=Release&src=whatsapp_downloads_page",
"install_script_ref": "157dabb3",
diff --git a/ee/maintained-apps/outputs/workflowy/darwin.json b/ee/maintained-apps/outputs/workflowy/darwin.json
index 54fb7a68c5..277c14a860 100644
--- a/ee/maintained-apps/outputs/workflowy/darwin.json
+++ b/ee/maintained-apps/outputs/workflowy/darwin.json
@@ -1,15 +1,15 @@
{
"versions": [
{
- "version": "4.3.2606050257",
+ "version": "4.3.2606091008",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.workflowy.desktop';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.workflowy.desktop' AND version_compare(bundle_short_version, '4.3.2606050257') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.workflowy.desktop' AND version_compare(bundle_short_version, '4.3.2606091008') < 0);"
},
- "installer_url": "https://github.com/workflowy/desktop/releases/download/v4.3.2606050257/WorkFlowy.zip",
+ "installer_url": "https://github.com/workflowy/desktop/releases/download/v4.3.2606091008/WorkFlowy.zip",
"install_script_ref": "467dafec",
"uninstall_script_ref": "effe5345",
- "sha256": "8752964a2286b52579bc89724ab4b822e9601262357181528a91448885b4a764",
+ "sha256": "c645082b82195061a9591f7e12ab694fa2f7ad30b8ecafa76a48119cacea17cd",
"default_categories": [
"Productivity"
]
diff --git a/ee/maintained-apps/outputs/worksheet-crafter/darwin.json b/ee/maintained-apps/outputs/worksheet-crafter/darwin.json
index 584d184a18..294dafb654 100644
--- a/ee/maintained-apps/outputs/worksheet-crafter/darwin.json
+++ b/ee/maintained-apps/outputs/worksheet-crafter/darwin.json
@@ -1,22 +1,22 @@
{
"versions": [
{
- "version": "2026.1.3",
+ "version": "2026.2.4",
"queries": {
"exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.SchoolCraft.WillBeReplacedByQMake';",
- "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.SchoolCraft.WillBeReplacedByQMake' AND version_compare(bundle_short_version, '2026.1.3') < 0);"
+ "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.SchoolCraft.WillBeReplacedByQMake' AND version_compare(bundle_short_version, '2026.2.4') < 0);"
},
- "installer_url": "https://website.cdn.getschoolcraft.com/downloads/worksheet-crafter_2026.1.3.pkg",
- "install_script_ref": "6eefc6e9",
+ "installer_url": "https://website.cdn.getschoolcraft.com/downloads/worksheet-crafter_2026.2.4.pkg",
+ "install_script_ref": "545289c7",
"uninstall_script_ref": "cad81f0b",
- "sha256": "de3ccfe568a1ebca0e868e5d03ce68cc16ac6ea37a07405a7a6e5e923d7d1ba8",
+ "sha256": "c931f890d554c312ea985eccc51bd51e380c2a82d8a3dfb24405f9153dcd0b08",
"default_categories": [
"Productivity"
]
}
],
"refs": {
- "6eefc6e9": "#!/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.SchoolCraft.WillBeReplacedByQMake'\nsudo installer -pkg \"$TMPDIR/worksheet-crafter_2026.1.3.pkg\" -target /\nrelaunch_application 'com.SchoolCraft.WillBeReplacedByQMake'\n",
+ "545289c7": "#!/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.SchoolCraft.WillBeReplacedByQMake'\nsudo installer -pkg \"$TMPDIR/worksheet-crafter_2026.2.4.pkg\" -target /\nrelaunch_application 'com.SchoolCraft.WillBeReplacedByQMake'\n",
"cad81f0b": "#!/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\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 '/volume<\\/key>/ {getline; gsub(/.*|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/install-location<\\/key>/ {getline; gsub(/.*|<\\/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_pkg_files 'com.schoolcraft.pkg.worksheetcrafter'\nforget_pkg 'com.schoolcraft.pkg.worksheetcrafter'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.SchoolCraft.WorksheetCrafter.WsCQuickLook'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.SchoolCraft.WorksheetCrafter.WsCThumbnail'\ntrash $LOGGED_IN_USER '~/Library/Application Support/WorksheetCrafter'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.SchoolCraft.WorksheetCrafter.WsCQuickLook'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.SchoolCraft.WorksheetCrafter.WsCThumbnail'\ntrash $LOGGED_IN_USER '~/Library/Containers/WorksheetCrafter'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.schoolcraft.Worksheet Crafter.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.SchoolCraft.WillBeReplacedByQMake.savedState'\n"
}
}