Skip to content

Update Fleet-maintained apps - #49505

Merged
allenhouchins merged 2 commits into
mainfrom
fma-2607171848
Jul 17, 2026
Merged

Update Fleet-maintained apps#49505
allenhouchins merged 2 commits into
mainfrom
fma-2607171848

Conversation

@fleet-release

@fleet-release fleet-release commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Automated ingestion of latest Fleet-maintained app data.

Summary by CodeRabbit

  • New Features

    • Added updated release metadata for numerous maintained macOS and Windows applications, including ChatGPT, Claude, Cursor, Camo Studio, Dayflow, ExtraDock, Granola, Groove OmniDialer, Kiro, MacWhisper, Postman, Reqable, Spokenly, Stretchly, WhatsApp, Zen, and others.
    • Refreshed installer downloads and integrity checks for the latest builds.
  • Bug Fixes

    • Improved JetBrains Toolbox uninstall to close Toolbox before removing files.
    • Enhanced Stretchly uninstall on Windows with safer cleanup and PATH/registry fallbacks to better handle unreliable vendor uninstall behavior.
    • Refined version detection to target the newest installed releases.

Generated automatically with cmd/maintained-apps.
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/4k-youtube-to-mp3/darwin.json

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

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

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

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

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

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

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

ee/maintained-apps/outputs/carbon-copy-cloner/darwin.json

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ee/maintained-apps/outputs/free-download-manager/darwin.json

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

ee/maintained-apps/outputs/google-chrome/windows.json

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

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

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

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

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

ee/maintained-apps/outputs/groove-omnidialer/darwin.json

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

ee/maintained-apps/outputs/jetbrains-toolbox/darwin.json

=== Install Script (no changes) ===
=== Uninstall // 276d8363 -> 118b704f ===

--- /tmp/old.qkaETm	2026-07-17 18:58:10.879095862 +0000
+++ /tmp/new.BwErtm	2026-07-17 18:58:10.879095862 +0000
@@ -5,6 +5,46 @@
 LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
 # functions
 
+quit_application() {
+  local bundle_id="$1"
+  local timeout_duration=10
+
+  # check if the application is running
+  local app_running
+  app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+  if [[ "$app_running" != "true" ]]; then
+    return
+  fi
+
+  local console_user
+  console_user=$(stat -f "%Su" /dev/console)
+  if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+    echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+    return
+  fi
+
+  echo "Quitting application '$bundle_id'..."
+
+  # try to quit the application within the timeout period
+  local quit_success=false
+  SECONDS=0
+  while (( SECONDS < timeout_duration )); do
+    if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+      if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+        echo "Application '$bundle_id' quit successfully."
+        quit_success=true
+        break
+      fi
+    fi
+    sleep 1
+  done
+
+  if [[ "$quit_success" = false ]]; then
+    echo "Application '$bundle_id' did not quit."
+  fi
+}
+
+
 remove_launchctl_service() {
   local service="$1"
   local booleans=("true" "false")
@@ -162,6 +202,7 @@
 }
 
 remove_launchctl_service 'com.jetbrains.toolbox'
+quit_application 'com.jetbrains.toolbox'
 send_signal 'TERM' 'com.jetbrains.toolbox' "$LOGGED_IN_USER"
 sudo rm -rf "$APPDIR/JetBrains Toolbox.app"
 sudo rmdir '~/Library/Application Support/JetBrains'

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

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

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

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

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

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

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

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

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

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

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

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

ee/maintained-apps/outputs/prisma-browser/windows.json

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

@coderabbitai

coderabbitai Bot commented Jul 17, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: fd15b72b-3f4f-4148-a0df-663da774757e

📥 Commits

Reviewing files that changed from the base of the PR and between 4944f75 and 0ce3fda.

📒 Files selected for processing (2)
  • ee/maintained-apps/inputs/winget/scripts/stretchly_uninstall.ps1
  • ee/maintained-apps/outputs/stretchly/windows.json

Walkthrough

Updated maintained-app JSON manifests for multiple macOS and Windows applications with new versions, patch-detection thresholds, installer URLs, and SHA-256 checksums. JetBrains Toolbox now uses a new uninstall script reference that conditionally quits the application before cleanup. Stretchly’s Windows uninstall script now stops the process, removes registry, PATH, shortcut, and installation remnants, and verifies final removal.

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Description check ⚠️ Warning The description is far too sparse and does not fill the required template sections like related issue, checklist, or testing. Expand the PR description to match the template, including Related issue, relevant checklist items, Testing, and any applicable deployment notes.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and accurately reflects the main change: refreshed Fleet-maintained app data.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch fma-2607171848

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Stretchly 1.22.0 added an EnVar PATH-cleanup step to its NSIS uninstaller
(runs before any removal work) and the uninstaller now exits 0xc0000005.
Verify removal via the registry instead of trusting the exit code, fall
back to manual removal (registry key, shortcuts, install dir), and scrub
the new Stretchly\bin PATH entry ourselves.
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/4k-youtube-to-mp3/darwin.json

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

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

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

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

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

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

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

ee/maintained-apps/outputs/carbon-copy-cloner/darwin.json

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ee/maintained-apps/outputs/free-download-manager/darwin.json

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

ee/maintained-apps/outputs/google-chrome/windows.json

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

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

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

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

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

ee/maintained-apps/outputs/groove-omnidialer/darwin.json

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

ee/maintained-apps/outputs/jetbrains-toolbox/darwin.json

=== Install Script (no changes) ===
=== Uninstall // 276d8363 -> 118b704f ===

--- /tmp/old.MG7DdY	2026-07-17 19:56:02.667938308 +0000
+++ /tmp/new.vjs9D8	2026-07-17 19:56:02.667938308 +0000
@@ -5,6 +5,46 @@
 LOGGED_IN_USER=$(scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ { print $3 }')
 # functions
 
+quit_application() {
+  local bundle_id="$1"
+  local timeout_duration=10
+
+  # check if the application is running
+  local app_running
+  app_running=$(osascript -e "application id \"$bundle_id\" is running" 2>/dev/null)
+  if [[ "$app_running" != "true" ]]; then
+    return
+  fi
+
+  local console_user
+  console_user=$(stat -f "%Su" /dev/console)
+  if [[ -z "$console_user" || "$console_user" == "root" || "$console_user" == "loginwindow" ]]; then
+    echo "Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'."
+    return
+  fi
+
+  echo "Quitting application '$bundle_id'..."
+
+  # try to quit the application within the timeout period
+  local quit_success=false
+  SECONDS=0
+  while (( SECONDS < timeout_duration )); do
+    if osascript -e "tell application id \"$bundle_id\" to quit" >/dev/null 2>&1; then
+      if ! pgrep -f "$bundle_id" >/dev/null 2>&1; then
+        echo "Application '$bundle_id' quit successfully."
+        quit_success=true
+        break
+      fi
+    fi
+    sleep 1
+  done
+
+  if [[ "$quit_success" = false ]]; then
+    echo "Application '$bundle_id' did not quit."
+  fi
+}
+
+
 remove_launchctl_service() {
   local service="$1"
   local booleans=("true" "false")
@@ -162,6 +202,7 @@
 }
 
 remove_launchctl_service 'com.jetbrains.toolbox'
+quit_application 'com.jetbrains.toolbox'
 send_signal 'TERM' 'com.jetbrains.toolbox' "$LOGGED_IN_USER"
 sudo rm -rf "$APPDIR/JetBrains Toolbox.app"
 sudo rmdir '~/Library/Application Support/JetBrains'

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

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

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

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

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

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

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

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

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

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

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

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

ee/maintained-apps/outputs/prisma-browser/windows.json

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

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

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

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

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

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

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

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

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

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

=== Install Script (no changes) ===
=== Uninstall // 4d8fe7a0 -> 399bc8f1 ===

--- /tmp/old.wN77sA	2026-07-17 19:56:03.095941213 +0000
+++ /tmp/new.K4Pqtr	2026-07-17 19:56:03.096941219 +0000
@@ -1,4 +1,8 @@
 # Locate the uninstall entry in the registry and run it silently.
+# Stretchly 1.22.0's NSIS uninstaller runs a custom PATH-cleanup step (EnVar
+# plugin) before any removal work and can crash with 0xc0000005, leaving the
+# app fully installed. Don't trust its exit code: verify the registry entry is
+# gone and fall back to removing the app manually.
 
 $displayNameLike = "Stretchly*"
 $publisher = "Jan Hovancik"
@@ -9,14 +13,45 @@
   'HKLM:\SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall'
 )
 
-$uninstall = $null
-foreach ($p in $paths) {
-  $items = Get-ItemProperty "$p\*" -ErrorAction SilentlyContinue | Where-Object {
-    $_.DisplayName -like $displayNameLike -and ($publisher -eq "" -or $_.Publisher -like "*$publisher*")
+function Find-UninstallEntry {
+  foreach ($p in $paths) {
+    $items = Get-ItemProperty "$p\*" -ErrorAction SilentlyContinue | Where-Object {
+      $_.DisplayName -like $displayNameLike -and ($publisher -eq "" -or $_.Publisher -like "*$publisher*")
+    }
+    if ($items) { return $items | Select-Object -First 1 }
+  }
+  return $null
+}
+
+function Remove-StretchlyFromPath {
+  # The vendor uninstaller's EnVar step removes "<install dir>\bin" from PATH;
+  # do it ourselves since that step is what crashes. Use the raw registry API
+  # to preserve unexpanded REG_EXPAND_SZ entries like %SystemRoot%.
+  $envKeys = @(
+    @{ Hive = [Microsoft.Win32.Registry]::CurrentUser; SubKey = 'Environment' },
+    @{ Hive = [Microsoft.Win32.Registry]::LocalMachine; SubKey = 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment' }
+  )
+  foreach ($envKey in $envKeys) {
+    try {
+      $key = $envKey.Hive.OpenSubKey($envKey.SubKey, $true)
+      if (-not $key) { continue }
+      $current = $key.GetValue('Path', $null, [Microsoft.Win32.RegistryValueOptions]::DoNotExpandEnvironmentNames)
+      if ($current) {
+        $kind = $key.GetValueKind('Path')
+        $updated = ($current -split ';' | Where-Object { $_ -and $_ -notlike '*\Stretchly\bin' }) -join ';'
+        if ($updated -ne $current) {
+          $key.SetValue('Path', $updated, $kind)
+          Write-Host "Removed Stretchly from PATH in $($envKey.SubKey)"
+        }
+      }
+      $key.Close()
+    } catch {
+      Write-Host "PATH cleanup skipped for $($envKey.SubKey): $_"
+    }
   }
-  if ($items) { $uninstall = $items | Select-Object -First 1; break }
 }
 
+$uninstall = Find-UninstallEntry
 if (-not $uninstall -or -not $uninstall.UninstallString) {
   Write-Host "Uninstall entry not found"
   Exit 0
@@ -40,6 +75,8 @@
         $installDir = Split-Path $uninstallExe -Parent
     }
 
+    Stop-Process -Name "stretchly" -Force -ErrorAction SilentlyContinue
+
     $uninstallArgs = @("/S", "_?=$installDir")
 
     Write-Host "Uninstall command: $uninstallExe"
@@ -57,11 +94,40 @@
     $exitCode = $process.ExitCode
     Write-Host "Uninstall exit code: $exitCode"
 
+    if ($exitCode -ne 0) {
+        $remaining = Find-UninstallEntry
+        if ($remaining) {
+            # The vendor uninstaller crashed before removing anything; finish
+            # the job manually.
+            Write-Host "Uninstaller failed and app is still registered; removing manually"
+            Remove-Item -Path $remaining.PSPath -Recurse -Force -ErrorAction SilentlyContinue
+            $shortcuts = @(
+                "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Stretchly.lnk",
+                "$env:ProgramData\Microsoft\Windows\Start Menu\Programs\Stretchly.lnk",
+                "$env:USERPROFILE\Desktop\Stretchly.lnk",
+                "$env:PUBLIC\Desktop\Stretchly.lnk"
+            )
+            foreach ($shortcut in $shortcuts) {
+                Remove-Item $shortcut -Force -ErrorAction SilentlyContinue
+            }
+        } else {
+            Write-Host "App is no longer registered despite exit code $exitCode; treating as success"
+        }
+    }
+
+    Remove-StretchlyFromPath
+
     if ($installDir -and (Test-Path $installDir)) {
         Remove-Item $installDir -Recurse -Force -ErrorAction SilentlyContinue
     }
 
-    Exit $exitCode
+    if (Find-UninstallEntry) {
+        Write-Host "Stretchly is still present after removal attempts"
+        Exit 1
+    }
+
+    Write-Host "Stretchly is no longer present"
+    Exit 0
 } catch {
     Write-Host "Error running uninstaller: $_"
     Exit 1

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

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

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

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

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

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

@allenhouchins
allenhouchins merged commit 4d07660 into main Jul 17, 2026
17 checks passed
@allenhouchins
allenhouchins deleted the fma-2607171848 branch July 17, 2026 20:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants