Update Fleet-maintained apps - #47340
Conversation
Generated automatically with cmd/maintained-apps.
Script Diff Resultsee/maintained-apps/outputs/goland/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/goodsync/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/imazing/darwin.json=== Install Script (no changes) ===
=== Uninstall // 64a2ebfc -> b213835e ===
--- /tmp/old.q2JHs2 2026-06-10 17:07:12.033915891 +0000
+++ /tmp/new.TWhv6b 2026-06-10 17:07:12.033915891 +0000
@@ -92,8 +92,8 @@
fi
}
-quit_application 'com.DigiDNA.iMazing3.5.4.24052Mac'
-quit_application 'com.DigiDNA.iMazing3.5.4.24052Mac.Mini'
+quit_application 'com.DigiDNA.iMazing3.5.5.24057Mac'
+quit_application 'com.DigiDNA.iMazing3.5.5.24057Mac.Mini'
sudo rm -rf "$APPDIR/iMazing.app"
trash $LOGGED_IN_USER '/Users/Shared/iMazing Mini'
trash $LOGGED_IN_USER '/Users/Shared/iMazing'ee/maintained-apps/outputs/kiro-cli/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/kiro/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/opencode-desktop/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/tableplus/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/telegram/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/vc-redist-x64/windows.json=== Install Script (no changes) ===
=== Uninstall // 5077ddcb -> c4fbbcfd ===
--- /tmp/old.DnlbYh 2026-06-10 17:07:12.253923597 +0000
+++ /tmp/new.zEeFdN 2026-06-10 17:07:12.253923597 +0000
@@ -8,7 +8,7 @@
# the bundle by its ProductCode (injected by the ingester) and fall back to the
# cached bootstrapper in the Package Cache.
-$productCode = '{c157798c-9519-4e56-98d9-f696f78f4a61}'
+$productCode = '{0e3bb569-69d6-4c34-bff9-c2f81db5e5f0}'
function Invoke-Uninstaller {
param([string]$exe, [string]$exeArgs) |
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (3)
🚧 Files skipped from review as they are similar to previous changes (1)
WalkthroughThis PR updates version metadata for nine maintained applications under ee/maintained-apps/outputs (bumping versions, patched SQL predicates, installer URLs, and SHA-256 checksums). It also updates iMazing’s uninstall script reference and replaces the VC Redist x64 uninstall PowerShell implementation, while aligning the VC Redist unique_identifier and winget input exists_query to the “v14” naming. Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ee/maintained-apps/outputs/imazing/darwin.json`:
- Line 19: The uninstall script quits version-specific bundle IDs which won't
match the runtime/manifest identifier; update the quit_application calls in the
script (function quit_application in the b213835e diff) to use the
version-independent bundle IDs used elsewhere (use com.DigiDNA.iMazing3Mac and
com.DigiDNA.iMazing3Mac.Mini) so the running app is properly detected and quit
before removal.
In `@ee/maintained-apps/outputs/tableplus/darwin.json`:
- Line 9: Confirm that the TablePlus version bump to 7.1.8 is intentional and
that the installer_url and sha256 in
ee/maintained-apps/outputs/tableplus/darwin.json point to an official/public
release: verify installer_url points to an official TablePlus distribution
(official website, vendor CDN, or official GitHub release) and download the DMG
to compute its SHA256 and ensure it matches the sha256 field; if the URL or
checksum mismatch or 7.1.8 is not an official release, update installer_url and
sha256 to the correct official values or revert the version change and add a
short comment in the JSON noting the verification source.
In `@ee/maintained-apps/outputs/vc-redist-x64/windows.json`:
- Line 20: The script currently hardcodes $productCode
('{0e3bb569-69d6-4c34-bff9-c2f81db5e5f0}') which can miss installed VC++ bundle
variants; modify the uninstall logic so $productCode is not fixed but obtained
from the ingested installer metadata (preferred) or discovered at runtime by
searching the registry (e.g., lookup by UpgradeCode or DisplayName) before the
keys array is built, then use that discovered GUID when querying the ARP keys
and when falling back to the Package Cache; keep Invoke-Uninstaller and the
existing fallback (Get-ChildItem on Package Cache) but replace the hardcoded
$productCode assignment with the metadata/registry discovery step and ensure
null/empty checks behave the same.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 1dd7ee8e-a416-47c2-bb0c-62bd8a33e555
📒 Files selected for processing (9)
ee/maintained-apps/outputs/goland/windows.jsonee/maintained-apps/outputs/goodsync/darwin.jsonee/maintained-apps/outputs/imazing/darwin.jsonee/maintained-apps/outputs/kiro-cli/darwin.jsonee/maintained-apps/outputs/kiro/darwin.jsonee/maintained-apps/outputs/opencode-desktop/darwin.jsonee/maintained-apps/outputs/tableplus/darwin.jsonee/maintained-apps/outputs/telegram/windows.jsonee/maintained-apps/outputs/vc-redist-x64/windows.json
| ], | ||
| "refs": { | ||
| "64a2ebfc": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\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.DigiDNA.iMazing3.5.4.24052Mac'\nquit_application 'com.DigiDNA.iMazing3.5.4.24052Mac.Mini'\nsudo rm -rf \"$APPDIR/iMazing.app\"\ntrash $LOGGED_IN_USER '/Users/Shared/iMazing Mini'\ntrash $LOGGED_IN_USER '/Users/Shared/iMazing'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iMazing Mini'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iMazing'\ntrash $LOGGED_IN_USER '~/Library/Application Support/MobileSync/Backup/iMazing.Versions'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.DigiDNA.iMazing3Mac'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.DigiDNA.iMazing3Mac.Mini'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.DigiDNA.iMazing3Mac.Mini'\ntrash $LOGGED_IN_USER '~/Library/Caches/iMazing'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.DigiDNA.iMazing3Mac.Mini.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.DigiDNA.iMazing3Mac.plist'\n", | ||
| "b213835e": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\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.DigiDNA.iMazing3.5.5.24057Mac'\nquit_application 'com.DigiDNA.iMazing3.5.5.24057Mac.Mini'\nsudo rm -rf \"$APPDIR/iMazing.app\"\ntrash $LOGGED_IN_USER '/Users/Shared/iMazing Mini'\ntrash $LOGGED_IN_USER '/Users/Shared/iMazing'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iMazing Mini'\ntrash $LOGGED_IN_USER '~/Library/Application Support/iMazing'\ntrash $LOGGED_IN_USER '~/Library/Application Support/MobileSync/Backup/iMazing.Versions'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.DigiDNA.iMazing3Mac'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.DigiDNA.iMazing3Mac.Mini'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.plausiblelabs.crashreporter.data/com.DigiDNA.iMazing3Mac.Mini'\ntrash $LOGGED_IN_USER '~/Library/Caches/iMazing'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.DigiDNA.iMazing3Mac.Mini.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.DigiDNA.iMazing3Mac.plist'\n", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Search for other iMazing version manifests to check bundle ID patterns
# Look for other iMazing manifests or version history to compare bundle ID usage
rg -C5 "com\.DigiDNA\.iMazing" --type jsonRepository: fleetdm/fleet
Length of output: 21516
Align iMazing uninstall bundle IDs with the runtime identifier
- Uninstall script (ref
b213835e) quitscom.DigiDNA.iMazing3.5.5.24057Macandcom.DigiDNA.iMazing3.5.5.24057Mac.Mini, butqueries.existsand install script (refe18e4725) use the version-independentcom.DigiDNA.iMazing3Mac. - The iMazing input manifest also declares
unique_identifier: com.DigiDNA.iMazing3Mac, so the codebase provides no indication that iMazing registers with version-specific bundle IDs; uninstall may fail to quit the running app before removal.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/outputs/imazing/darwin.json` at line 19, The uninstall
script quits version-specific bundle IDs which won't match the runtime/manifest
identifier; update the quit_application calls in the script (function
quit_application in the b213835e diff) to use the version-independent bundle IDs
used elsewhere (use com.DigiDNA.iMazing3Mac and com.DigiDNA.iMazing3Mac.Mini) so
the running app is properly detected and quit before removal.
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.tinyapp.TablePlus' AND version_compare(bundle_short_version, '7.1.8') < 0);" | ||
| }, | ||
| "installer_url": "https://files.tableplus.com/macos/716/TablePlus.dmg", | ||
| "installer_url": "https://files.tableplus.com/macos/718/TablePlus.dmg", |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Download TablePlus 7.1.8 installer and verify SHA256 checksum
EXPECTED_SHA256="e342cdda6dc1cbae3add429843c2c92d4c056e66b3121aac632f37cc54775e24"
INSTALLER_URL="https://files.tableplus.com/macos/718/TablePlus.dmg"
# Download and compute checksum
ACTUAL_SHA256=$(curl -sL "$INSTALLER_URL" | shasum -a 256 | awk '{print $1}')
echo "Expected SHA256: $EXPECTED_SHA256"
echo "Actual SHA256: $ACTUAL_SHA256"
if [ "$EXPECTED_SHA256" = "$ACTUAL_SHA256" ]; then
echo "✓ Checksum verification PASSED"
exit 0
else
echo "✗ Checksum verification FAILED"
exit 1
fiRepository: fleetdm/fleet
Length of output: 251
🏁 Script executed:
#!/bin/bash
set -euo pipefail
EXPECTED_SHA256="e342cdda6dc1cbae3add429843c2c92d4c056e66b3121aac632f37cc54775e24"
INSTALLER_URL="https://files.tableplus.com/macos/718/TablePlus.dmg"
echo "Downloading: $INSTALLER_URL"
curl -sSL --fail "$INSTALLER_URL" -o /tmp/tableplus_7.1.8.dmg
if command -v sha256sum >/dev/null 2>&1; then
ACTUAL_SHA256="$(sha256sum /tmp/tableplus_7.1.8.dmg | awk '{print $1}')"
elif command -v shasum >/dev/null 2>&1; then
ACTUAL_SHA256="$(shasum -a 256 /tmp/tableplus_7.1.8.dmg | awk '{print $1}')"
else
echo "✗ No sha256 tool available (need sha256sum or shasum)." >&2
exit 2
fi
echo "Expected SHA256: $EXPECTED_SHA256"
echo "Actual SHA256: $ACTUAL_SHA256"
if [ "$EXPECTED_SHA256" = "$ACTUAL_SHA256" ]; then
echo "✓ Checksum verification PASSED"
exit 0
else
echo "✗ Checksum verification FAILED"
exit 1
fiRepository: fleetdm/fleet
Length of output: 195
🌐 Web query:
TablePlus 7.1.8 macOS release notes latest stable
💡 Result:
As of June 10, 2026, TablePlus 7.1.8 is not the latest stable release for macOS. Publicly available tracking indicates that the current stable version series is 7.1.0 (build 710) [1]. While there have been recent mentions of a TablePlus beta version 7.1.5 [2], there is no official record or release note documentation for a version 7.1.8. The official TablePlus changelog for macOS lists version 7.0.4 as a recent release (dated May 19, 2026) [3], and other package trackers identify version 7.1.0 as a stable release [1]. It is possible that version 7.1.8 is a future, unreleased, or private build, or the request refers to a version that has not yet been formally documented in public changelogs. For the most accurate and up-to-date information, you should check the official TablePlus changelog page directly [3][4].
Citations:
- 1: https://cask.news/cask/tableplus
- 2: https://x.com/TablePlus
- 3: https://tableplus.com/blog/2017/02/changelogs.html
- 4: https://tableplus.com/blog/2023/02/tableplus-changelogs.html
🏁 Script executed:
#!/bin/bash
set -euo pipefail
EXPECTED_SHA256="e342cdda6dc1cbae3add429843c2c92d4c056e66b3121aac632f37cc54775e24"
INSTALLER_URL="https://files.tableplus.com/macos/718/TablePlus.dmg"
OUT="/tmp/TablePlus.dmg"
curl -sSL --fail "$INSTALLER_URL" -o "$OUT"
ACTUAL_SHA256="$(openssl dgst -sha256 "$OUT" | awk '{print $2}')"
echo "Expected SHA256: $EXPECTED_SHA256"
echo "Actual SHA256: $ACTUAL_SHA256"
if [ "$EXPECTED_SHA256" = "$ACTUAL_SHA256" ]; then
echo "✓ Checksum verification PASSED"
else
echo "✗ Checksum verification FAILED"
exit 1
fiRepository: fleetdm/fleet
Length of output: 106
🏁 Script executed:
#!/bin/bash
set -euo pipefail
EXPECTED_SHA256="e342cdda6dc1cbae3add429843c2c92d4c056e66b3121aac632f37cc54775e24"
INSTALLER_URL="https://files.tableplus.com/macos/718/TablePlus.dmg"
OUT="/tmp/TablePlus.dmg"
curl -sSL --fail "$INSTALLER_URL" -o "$OUT"
ACTUAL_SHA256="$(python3 - <<'PY'
import hashlib, sys
p="/tmp/TablePlus.dmg"
h=hashlib.sha256()
with open(p,'rb') as f:
for chunk in iter(lambda: f.read(1024*1024), b''):
h.update(chunk)
print(h.hexdigest())
PY
)"
echo "Expected SHA256: $EXPECTED_SHA256"
echo "Actual SHA256: $ACTUAL_SHA256"
if [ "$EXPECTED_SHA256" = "$ACTUAL_SHA256" ]; then
echo "✓ Checksum verification PASSED"
else
echo "✗ Checksum verification FAILED"
exit 1
fiRepository: fleetdm/fleet
Length of output: 252
Confirm TablePlus 7.1.8 DMG integrity (URL+SHA256)
The SHA256 for installer_url on ee/maintained-apps/outputs/tableplus/darwin.json (lines 9/12) matches the sha256 value in the file, so fleet should download the expected DMG without corruption.
Public sources don’t clearly show 7.1.8 as the current latest stable release; confirm 7.1.8 is an official/public release and that this version bump is intentional.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/outputs/tableplus/darwin.json` at line 9, Confirm that the
TablePlus version bump to 7.1.8 is intentional and that the installer_url and
sha256 in ee/maintained-apps/outputs/tableplus/darwin.json point to an
official/public release: verify installer_url points to an official TablePlus
distribution (official website, vendor CDN, or official GitHub release) and
download the DMG to compute its SHA256 and ensure it matches the sha256 field;
if the URL or checksum mismatch or 7.1.8 is not an official release, update
installer_url and sha256 to the correct official values or revert the version
change and add a short comment in the JSON noting the verification source.
| "5077ddcb": "# Uninstalls the Microsoft Visual C++ Redistributable WiX \"burn\" bundle.\n#\n# The redistributable installs as a burn bootstrapper that registers a *bundle*\n# ARP entry (keyed by the bundle ProductCode) alongside several MSI component\n# entries (\"...X64 Minimum Runtime...\", \"...Additional Runtime...\"). Only the\n# bundle entry removes the whole redistributable, and it uninstalls by running\n# its cached bootstrapper .exe with /uninstall -- never via msiexec. We target\n# the bundle by its ProductCode (injected by the ingester) and fall back to the\n# cached bootstrapper in the Package Cache.\n\n$productCode = '{c157798c-9519-4e56-98d9-f696f78f4a61}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n", | ||
| "65654cc8": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# The Visual C++ Redistributable ships as a WiX \"burn\" bootstrapper (.exe). It\n# installs machine-wide and registers its own ARP entry. Silent switches come\n# from the winget installer manifest (burn bundles use /quiet /norestart).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet /norestart\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) {\n Exit 0\n }\n\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" | ||
| "65654cc8": "# Learn more about .exe install scripts:\n# http://fleetdm.com/learn-more-about/exe-install-scripts\n#\n# The Visual C++ Redistributable ships as a WiX \"burn\" bootstrapper (.exe). It\n# installs machine-wide and registers its own ARP entry. Silent switches come\n# from the winget installer manifest (burn bundles use /quiet /norestart).\n\n$exeFilePath = \"${env:INSTALLER_PATH}\"\n\ntry {\n if (-not (Test-Path $exeFilePath)) {\n Write-Host \"Error: Installer file not found at: $exeFilePath\"\n Exit 1\n }\n\n $processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/quiet /norestart\"\n PassThru = $true\n Wait = $true\n NoNewWindow = $true\n }\n\n $process = Start-Process @processOptions\n $exitCode = $process.ExitCode\n Write-Host \"Install exit code: $exitCode\"\n\n # 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\n if ($exitCode -eq 3010 -or $exitCode -eq 1641) {\n Exit 0\n }\n\n Exit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", | ||
| "c4fbbcfd": "# Uninstalls the Microsoft Visual C++ Redistributable WiX \"burn\" bundle.\n#\n# The redistributable installs as a burn bootstrapper that registers a *bundle*\n# ARP entry (keyed by the bundle ProductCode) alongside several MSI component\n# entries (\"...X64 Minimum Runtime...\", \"...Additional Runtime...\"). Only the\n# bundle entry removes the whole redistributable, and it uninstalls by running\n# its cached bootstrapper .exe with /uninstall -- never via msiexec. We target\n# the bundle by its ProductCode (injected by the ingester) and fall back to the\n# cached bootstrapper in the Package Cache.\n\n$productCode = '{0e3bb569-69d6-4c34-bff9-c2f81db5e5f0}'\n\nfunction Invoke-Uninstaller {\n param([string]$exe, [string]$exeArgs)\n if ($exeArgs -notmatch '/uninstall') { $exeArgs = \"/uninstall $exeArgs\" }\n if ($exeArgs -notmatch '/quiet') { $exeArgs = \"$exeArgs /quiet\" }\n if ($exeArgs -notmatch '/norestart') { $exeArgs = \"$exeArgs /norestart\" }\n $exeArgs = $exeArgs.Trim()\n Write-Host \"Uninstall command: $exe\"\n Write-Host \"Uninstall args: $exeArgs\"\n $process = Start-Process -FilePath $exe -ArgumentList $exeArgs -NoNewWindow -PassThru -Wait\n return $process.ExitCode\n}\n\n$exitCode = $null\n\n# 1) Preferred: the bundle ARP entry, looked up by the bundle ProductCode. Its\n# UninstallString/QuietUninstallString points to the cached bootstrapper .exe.\n$keys = @(\n \"HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\",\n \"HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\$productCode\"\n)\n\nforeach ($key in $keys) {\n if (-not (Test-Path $key)) { continue }\n $entry = Get-ItemProperty $key -ErrorAction SilentlyContinue\n if (-not $entry) { continue }\n\n $raw = $entry.QuietUninstallString\n if (-not $raw) { $raw = $entry.UninstallString }\n if (-not $raw) { continue }\n\n # Parse into executable + args, handling quoted/unquoted/bare shapes.\n if ($raw -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } elseif ($raw -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exe = $matches[1]; $exeArgs = $matches[2].Trim()\n } else {\n $exe = $raw; $exeArgs = \"\"\n }\n\n $exitCode = Invoke-Uninstaller -exe $exe -exeArgs $exeArgs\n break\n}\n\n# 2) Fallback: run the cached bootstrapper directly from the Package Cache, which\n# burn names after the bundle ProductCode.\nif ($null -eq $exitCode) {\n $cached = Get-ChildItem -Path \"C:\\ProgramData\\Package Cache\\$productCode\" -Filter *.exe -ErrorAction SilentlyContinue | Select-Object -First 1\n if ($cached) {\n $exitCode = Invoke-Uninstaller -exe $cached.FullName -exeArgs \"\"\n }\n}\n\nif ($null -eq $exitCode) {\n Write-Host \"Uninstall entry not found for product code: $productCode\"\n Exit 0\n}\n\nWrite-Host \"Uninstall exit code: $exitCode\"\n# 0 = success, 3010 = success but reboot required, 1641 = reboot initiated\nif ($exitCode -eq 3010 -or $exitCode -eq 1641) { Exit 0 }\nExit $exitCode\n" |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
# Description: Check Microsoft documentation or registry samples for VC Redist 14.51.36247.0 product code
# Note: This verification requires either:
# 1. Installing the redistributable and checking registry, or
# 2. Searching Microsoft's official documentation
# Since we cannot install in the sandbox, request web search for official product code
echo "Please verify the product code for Microsoft Visual C++ 2015-2022 Redistributable (x64) version 14.51.36247.0"
echo "Expected product code in script: {0e3bb569-69d6-4c34-bff9-c2f81db5e5f0}"
echo ""
echo "Verification methods:"
echo "1. Install the redistributable and check HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\"
echo "2. Check Microsoft's official release documentation"
echo "3. Inspect the installer package metadata"Repository: fleetdm/fleet
Length of output: 456
🌐 Web query:
Microsoft Visual C++ Redistributable 14.51.36247.0 product code GUID bundle
💡 Result:
The Microsoft Visual C++ Redistributable version 14.51.36247.0 (or similar versions in the 14.51.x series) does not have a single, static, or officially documented product code GUID [1][2]. For Visual C++ 2015 and later (v14), Microsoft frequently updates the redistributable packages to include security and performance improvements [1][2]. Because these packages are designed to be cumulative and are often updated, their product code GUIDs change with each new build release [3][4][5]. To determine the product code for a specific version currently installed on your system, you can use the following methods: 1. Registry Search: You can look in the Windows Registry under the uninstall keys. The GUIDs are found under: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall or HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall Search for the "DisplayName" matching "Microsoft Visual C++... Redistributable" and check the corresponding key name, which is the product code GUID [3][5]. 2. PowerShell: You can use commands to list installed software and their product codes. For example, using the Get-InstalledVcRedist tool (a community-maintained utility for managing these packages) can retrieve the current GUID for installed versions [3][4]. 3. UpgradeCode: If you are attempting to detect the installation for deployment or configuration management purposes, it is recommended to use the UpgradeCode rather than the specific product code [5]. The UpgradeCode is constant for the entire family of v14 redistributables (2015–2026), allowing you to query for any installed version within that family [5]. Because these GUIDs are generated by the installer and vary by build, relying on a specific product code for version 14.51.36247.0 is not recommended for reliable detection across different machines [1][2].
Citations:
- 1: https://learn.microsoft.com/en-us/cpp/windows/latest-supported-vc-redist?view=msvc-170
- 2: https://github.com/MicrosoftDocs/cpp-docs/blob/main/docs/windows/latest-supported-vc-redist.md
- 3: https://vcredist.com/get-installedvcredist
- 4: https://vcredist.com/get-vclist
- 5: https://stackoverflow.com/questions/12206314/detect-if-visual-c-redistributable-for-visual-studio-2012-is-installed
Avoid hardcoding the bundle ProductCode GUID in the uninstall script
ee/maintained-apps/outputs/vc-redist-x64/windows.json(refc4fbbcfd) hardcodes$productCode = '{0e3bb569-69d6-4c34-bff9-c2f81db5e5f0}'and relies on it to find the bundle ARP entry; VC++ Redistributable v14 product codes are generated per build/update and aren’t reliably fixed per semantic version.- This can make the uninstall fail to locate the correct ARP entry (and only hit the Package Cache fallback).
- Replace the hardcoded GUID with a value derived from the ingested installer metadata (or otherwise discover the installed bundle via registry/UpgradeCode/DisplayName), so the script targets the actual installed bundle for that specific build.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@ee/maintained-apps/outputs/vc-redist-x64/windows.json` at line 20, The script
currently hardcodes $productCode ('{0e3bb569-69d6-4c34-bff9-c2f81db5e5f0}')
which can miss installed VC++ bundle variants; modify the uninstall logic so
$productCode is not fixed but obtained from the ingested installer metadata
(preferred) or discovered at runtime by searching the registry (e.g., lookup by
UpgradeCode or DisplayName) before the keys array is built, then use that
discovered GUID when querying the ARP keys and when falling back to the Package
Cache; keep Invoke-Uninstaller and the existing fallback (Get-ChildItem on
Package Cache) but replace the hardcoded $productCode assignment with the
metadata/registry discovery step and ensure null/empty checks behave the same.
Rename unique_identifier for vc-redist-x64 to "Microsoft Visual C++ v14 Redistributable (x64)" and update existence/patch queries to match either the "2015-2022" or "v14" naming. This ensures detection and patch checks work for both naming variants across inputs (winget), the aggregated apps output, and the per-platform windows output.
Script Diff Resultsee/maintained-apps/outputs/goland/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/goodsync/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/imazing/darwin.json=== Install Script (no changes) ===
=== Uninstall // 64a2ebfc -> b213835e ===
--- /tmp/old.5YCSVG 2026-06-10 23:40:46.729046736 +0000
+++ /tmp/new.Me46ob 2026-06-10 23:40:46.729046736 +0000
@@ -92,8 +92,8 @@
fi
}
-quit_application 'com.DigiDNA.iMazing3.5.4.24052Mac'
-quit_application 'com.DigiDNA.iMazing3.5.4.24052Mac.Mini'
+quit_application 'com.DigiDNA.iMazing3.5.5.24057Mac'
+quit_application 'com.DigiDNA.iMazing3.5.5.24057Mac.Mini'
sudo rm -rf "$APPDIR/iMazing.app"
trash $LOGGED_IN_USER '/Users/Shared/iMazing Mini'
trash $LOGGED_IN_USER '/Users/Shared/iMazing'ee/maintained-apps/outputs/kiro-cli/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/kiro/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/opencode-desktop/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/tableplus/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/telegram/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/vc-redist-x64/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) === |
CI Feedback 🧐A test triggered by this PR failed. Here is an AI-generated analysis of the failure:
|
Automated ingestion of latest Fleet-maintained app data.
Summary by CodeRabbit