Skip to content

Add 17 Windows Fleet-maintained apps - #48501

Closed
kitzy wants to merge 9 commits into
mainfrom
add-windows-fmas-batch-2026-06
Closed

Add 17 Windows Fleet-maintained apps#48501
kitzy wants to merge 9 commits into
mainfrom
add-windows-fmas-batch-2026-06

Conversation

@kitzy

@kitzy kitzy commented Jun 30, 2026

Copy link
Copy Markdown
Member

Related issue: N/A — Windows Fleet-maintained app (FMA) coverage for apps found deployed in a customer's ManageEngine SDP environment but missing from Fleet.

What this does

Adds 17 Windows Fleet-maintained apps. Each app has a winget-sourced input, a generated output manifest, and (where a cleanly-licensed ≥256px logo was found) a catalog icon. Detection identity was verified against each app's real registry DisplayName; apps whose DisplayName carries a version/arch suffix use fuzzy name matching, the rest match exactly.

MSI (clean, auto upgrade-code uninstall):

  • Git Extensions — versioned ARP name (Git Extensions 7.2.0.92) → fuzzy match
  • TightVNC, Yarn, SonicWall NetExtender (WiX), Zoom Outlook Plugin — clean ARP names → exact match

EXE — Inno Setup (custom /VERYSILENT install + registry-lookup uninstall):

  • TreeSize Free — versioned ARP name (TreeSize Free V4.8.1) → fuzzy match
  • Rtools — versioned + build-tagged ARP name (Rtools 4.5 (6768-6492)) → fuzzy match
  • AOMEI Backupper Standard — ARP DisplayName is AOMEI Backupper (no "Standard" suffix); x86-only
  • Azure Data Studio — machine-scope installer → exact match

EXE — NSIS (custom /S install + registry-lookup uninstall):

  • Gpg4win — versioned ARP name (Gpg4win (5.0.2)) → fuzzy match; x86-only
  • Logitech Unifying Software — versioned ARP name (Logitech Unifying Software 2.52) → fuzzy match
  • Spyder — versioned ARP name (Spyder 6) → fuzzy match
  • GNU Privacy Guard — clean ARP name → exact match

EXE — WiX bundle / burn (custom install + bundle uninstall):

  • Apple iTunes — WiX bundle; the visible ARP entry is the iTunes MSI (iTunes) → exact match; reuses the existing Itunes icon
  • Logi Tune — burn bundle; Logi Tune → exact match

EXE — vendor installer:

  • Dell Display and Peripheral Manager (/Silent) and Google Earth Pro (OMAHA=1, ships an embedded MSI) — clean ARP names → exact match

Not in this batch

  • Eclipse Temurin JDK 11, Eclipse Temurin JRE 8, and WinDirStat were originally part of this branch but shipped to main via separate PRs (e.g. Add WinDirStat as a Windows FMA #48762) and merged in, so they're no longer net-new here.

Notes

  • Detection verification. Every app's unique_identifier (registry DisplayName / osquery programs.name) and publisher were verified per the new-fma skill against winget AppsAndFeaturesEntries, MSI Property tables (msiinfo), and vendor installer scripts — not assumed. This corrected two silent no-match bugs: the six fuzzy-match apps above, and AOMEI Backupper, whose unique_identifier was AOMEI Backupper Standard (a string the registry never contains since ~v7.4).
  • AOMEI edition matching. The corrected AOMEI Backupper name also matches the paid Pro/Workstation/Server editions — AOMEI unified the ARP DisplayName across editions, and no registry value distinguishes them. Detecting the free edition (vs. nothing) is the intended tradeoff.
  • Incidental version bumps. Regenerating pulled Git Extensions to 7.2.0.92 and GnuPG to 2.5.21 (their current winget versions, with correct SHAs). Happy to revert those two if you'd rather keep the originally-pinned versions.
  • Icons. 13 apps ship new catalog icons + website assets; Apple iTunes reuses the existing Itunes icon, and Google Earth Pro, Logi Tune, and Spyder match icons already in the frontend.
  • x86-only installers: AOMEI Backupper, Gpg4win, Yarn, Zoom Outlook Plugin (no x64 in the winget manifest).

Testing

  • FMA CI validator (install → detect → uninstall) on the SYSTEM-context Windows runner.
  • Generated outputs verified locally: all 17 produce valid manifests; MSI apps carry the correct UpgradeCode-based uninstall; exists/patched queries reviewed for name + publisher correctness; go test ./ee/maintained-apps/... passes.

Adds Windows FMAs for apps identified as deployed in the ManageEngine
SDP environment but missing Fleet coverage: AOMEI Backupper Standard,
Apple iTunes, Azure Data Studio, CrystalDiskMark, Dell Display and
Peripheral Manager, Eclipse Temurin JDK 11, Eclipse Temurin JRE 8,
Git Extensions, GNU Privacy Guard, Google Earth Pro, Gpg4win, Logitech
Unifying Software, Logi Tune, Rtools, SonicWall NetExtender, Spyder,
TightVNC, TreeSize Free, WinDirStat, Yarn, and Zoom Outlook Plugin.

MSI-type apps use auto-generated install/uninstall scripts with
upgrade-code-based uninstall. EXE-type apps include custom PS1 scripts
with appropriate silent flags (Inno Setup, NSIS, WiX bundle, or
vendor-specific). Eclipse Temurin JDK 11 and JRE 8 use custom
exists_query with LIKE matching since the registry DisplayName includes
version and architecture suffixes.
Copilot AI review requested due to automatic review settings June 30, 2026 16:24

@claude claude Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Claude Code Review

This repository is configured for manual code reviews. Comment @claude review to trigger a review and subscribe this PR to future pushes, or @claude review once for a one-time review.

Tip: disable this comment in your organization's Code Review settings.

@kitzy
kitzy marked this pull request as draft June 30, 2026 16:24

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds 21 new Windows Fleet-maintained apps (FMAs) to the maintained-apps catalog by introducing new winget input definitions (and custom PS scripts where needed), generating corresponding output manifests, and registering the apps in the aggregated apps.json list.

Changes:

  • Added 21 new Windows app definitions under ee/maintained-apps/inputs/winget/ (plus install/uninstall scripts for EXE-based installers).
  • Added generated Windows output manifests under ee/maintained-apps/outputs/<app>/windows.json.
  • Updated the maintained-apps catalog index (outputs/apps.json) and added a user-visible change entry.

Reviewed changes

Copilot reviewed 69 out of 70 changed files in this pull request and generated 18 comments.

Show a summary per file
File Description
ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json New Windows output manifest (MSI)
ee/maintained-apps/outputs/yarn/windows.json New Windows output manifest (MSI)
ee/maintained-apps/outputs/windirstat/windows.json New Windows output manifest (MSI)
ee/maintained-apps/outputs/treesize-free/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/tightvnc/windows.json New Windows output manifest (MSI)
ee/maintained-apps/outputs/spyder/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/sonicwall-netextender/windows.json New Windows output manifest (MSI)
ee/maintained-apps/outputs/rtools/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/logitune/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/logitech-unifying-software/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/gpg4win/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/google-earth-pro/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/gnupg/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/git-extensions/windows.json New Windows output manifest (MSI)
ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json New Windows output manifest (MSI + LIKE exists)
ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json New Windows output manifest (MSI + LIKE exists)
ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/crystaldiskmark/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/azure-data-studio/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/apple-itunes/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/aomei-backupper-standard/windows.json New Windows output manifest (EXE + scripts)
ee/maintained-apps/outputs/apps.json Register new Windows apps in catalog
ee/maintained-apps/inputs/winget/zoom-outlook-plugin.json New winget input definition
ee/maintained-apps/inputs/winget/yarn.json New winget input definition
ee/maintained-apps/inputs/winget/windirstat.json New winget input definition
ee/maintained-apps/inputs/winget/treesize-free.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/tightvnc.json New winget input definition
ee/maintained-apps/inputs/winget/spyder.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/sonicwall-netextender.json New winget input definition
ee/maintained-apps/inputs/winget/rtools.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/logitune.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/logitech-unifying-software.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/gpg4win.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/google-earth-pro.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/gnupg.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/git-extensions.json New winget input definition
ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json New winget input definition + custom exists_query
ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json New winget input definition + custom exists_query
ee/maintained-apps/inputs/winget/dell-display-and-peripheral-manager.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/crystaldiskmark.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/azure-data-studio.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/apple-itunes.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/aomei-backupper-standard.json New winget input definition + script paths
ee/maintained-apps/inputs/winget/scripts/treesize_free_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/treesize_free_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/spyder_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/spyder_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/rtools_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/rtools_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/logitune_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/logitune_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/gpg4win_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/gpg4win_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/google_earth_pro_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/google_earth_pro_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/gnupg_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/gnupg_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/dell_dapm_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/dell_dapm_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/crystaldiskmark_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/crystaldiskmark_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/azure_data_studio_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/azure_data_studio_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/apple_itunes_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/apple_itunes_install.ps1 Custom install script (EXE)
ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1 Custom uninstall script (EXE)
ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1 Custom install script (EXE)
changes/add-windows-fmas-batch Release note entry

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

Comment thread ee/maintained-apps/inputs/winget/scripts/treesize_free_install.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/treesize_free_uninstall.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/spyder_install.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/spyder_uninstall.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/rtools_install.ps1 Outdated
Comment thread ee/maintained-apps/outputs/azure-data-studio/windows.json Outdated
Comment thread ee/maintained-apps/outputs/logitech-unifying-software/windows.json Outdated
Comment thread ee/maintained-apps/outputs/rtools/windows.json Outdated
Comment thread ee/maintained-apps/outputs/spyder/windows.json Outdated
Comment thread ee/maintained-apps/outputs/treesize-free/windows.json Outdated
- Add 18 icon TSX components and website PNG assets for all new
  Windows FMAs (AOMEI, iTunes, Azure Data Studio, CrystalDiskMark,
  Dell DAPM, Eclipse Temurin JDK 11/JRE 8, Git Extensions, GnuPG,
  Gpg4win, Logitech Unifying, Rtools, SonicWall, TightVNC, TreeSize
  Free, WinDirStat, Yarn, Zoom Outlook Plugin)
- Update icon index.ts with alphabetically sorted imports and map entries
- Fix CrystalDiskMark unique_identifier matching to use LIKE 'CrystalDiskMark %'
  since Inno Setup installers register as "CrystalDiskMark 9" in registry
- Fix map key for iTunes (slug-derived "apple itunes" → "itunes")
- Fix map key for GnuPG (slug-derived "gnupg" → "gnu privacy guard")
@coderabbitai

coderabbitai Bot commented Jun 30, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Walkthrough

This PR adds 21 new Fleet-maintained Windows applications to the maintained-apps pipeline. For each app, a Winget input manifest JSON is added under ee/maintained-apps/inputs/winget/, defining identifiers, publisher, installer characteristics, and script paths. PowerShell install and uninstall scripts are added under ee/maintained-apps/inputs/winget/scripts/. Output windows.json files are added for each app with version detection SQL queries, installer URLs, SHA-256 checksums, upgrade codes (for MSI apps), and embedded script references. The global ee/maintained-apps/outputs/apps.json catalog is updated with entries for all 21 apps, plus minor character corrections to existing Moom and Splice descriptions. A changeset file documenting the addition is also included.

Possibly related PRs

  • fleetdm/fleet#47024: Adds Fleet-maintained Windows apps using the same ee/maintained-apps/inputs/winget/ and ee/maintained-apps/outputs/ pipeline structure with the same pattern of input manifests, PowerShell scripts, and apps.json registrations.
  • fleetdm/fleet#47558: Adds Fleet-maintained Windows apps and updates the shared ee/maintained-apps/outputs/apps.json catalog with new Windows entries in the same workstream.
  • fleetdm/fleet#47659: Touches the same maintained-apps Windows catalog including apps.json description string updates to Moom and Splice that overlap with changes in this PR.
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
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.
Title check ✅ Passed The title matches the main change, though the app count is slightly outdated.
Description check ✅ Passed The description covers scope, rationale, and testing, and it includes the main required sections even though the checklist template is not followed exactly.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch add-windows-fmas-batch-2026-06

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

❤️ Share

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

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 8

Note

Due to the large number of review comments, Critical severity comments were prioritized as inline comments.

🟠 Major comments (13)
ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json-6-10 (1)

6-10: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Constrain the custom exists query to x64 installs.

Same problem here: the manifest selects the x64 MSI, but Line 6 does not filter on the architecture suffix. That lets another Temurin 8 JRE variant satisfy both existence and patch checks for this app.

Suggested fix
-  "exists_query": "SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JRE with Hotspot 8%' AND publisher = 'Eclipse Adoptium';",
+  "exists_query": "SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JRE with Hotspot 8% (x64)' AND publisher = 'Eclipse Adoptium';",
🤖 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/inputs/winget/eclipse-temurin-jre-8.json` around lines 6 -
10, The custom exists_query in the Temurin 8 JRE winget input is too broad
because it matches any Eclipse Temurin JRE with Hotspot 8 entry regardless of
architecture. Tighten the query used by this manifest so it explicitly filters
for x64 installs, aligning it with the selected x64 MSI and preventing other
Temurin 8 JRE variants from satisfying the existence and patch checks. Update
the exists_query entry in this manifest to include the architecture suffix
condition alongside the existing name and publisher constraints.
ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json-6-10 (1)

6-10: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Constrain the custom exists query to x64 installs.

This manifest pins installer_arch to x64, but Line 6 matches every Temurin 11 JDK display name with that prefix. Because this custom query also feeds the generated patched query, an x86/ARM64 install can be treated as the x64 app being present and current.

Suggested fix
-  "exists_query": "SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JDK with Hotspot 11%' AND publisher = 'Eclipse Adoptium';",
+  "exists_query": "SELECT 1 FROM programs WHERE name LIKE 'Eclipse Temurin JDK with Hotspot 11% (x64)' AND publisher = 'Eclipse Adoptium';",
🤖 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/inputs/winget/eclipse-temurin-jdk-11.json` around lines 6
- 10, The custom exists_query is too broad and can match non-x64 Temurin 11
installs, causing the x64 manifest to be treated as present when it is not.
Update the query in the Eclipse Temurin JDK 11 winget manifest to constrain
results to x64 installs, using the existing installer_arch setting as the guide
so the generated patched query only matches x64 entries.
ee/maintained-apps/inputs/winget/scripts/azure_data_studio_install.ps1-16-16 (1)

16-16: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the Start-Process splat on line 16. @$processOptions is treated as a literal argument here, so Start-Process gets @$processOptions instead of the hashtable values and the installer never launches.

🤖 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/inputs/winget/scripts/azure_data_studio_install.ps1` at
line 16, The Start-Process call in the Azure Data Studio install script is using
an invalid splat form, so the hashtable is being passed as a literal argument
instead of expanded parameters. Update the invocation at the Start-Process call
site to use the proper splatting syntax with the existing processOptions
hashtable so the installer launches correctly.
ee/maintained-apps/outputs/rtools/windows.json-19-20 (1)

19-20: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Regenerate this output after fixing the PowerShell splat typo in the source scripts. ee/maintained-apps/outputs/rtools/windows.json still embeds Start-Process @$processOptions in both refs, so the committed artifact will stay broken until it is refreshed from the updated install/uninstall scripts.

🤖 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/rtools/windows.json` around lines 19 - 20, The
generated Rtools PowerShell outputs are still stale and contain the broken splat
usage in both the uninstall and install script entries, so refresh this artifact
from the updated source scripts. Regenerate the `windows.json` output for the
Rtools package after fixing the `Start-Process` splat typo so the embedded
scripts in both referenced entries are updated consistently.
ee/maintained-apps/inputs/winget/scripts/rtools_install.ps1-16-16 (1)

16-16: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the PowerShell splat syntax.

Start-Process needs @processOptions, not @$processOptions; this causes a parameter-binding error, and the same generated line appears in the other winget installer/uninstaller scripts.

Proposed fix
-$process = Start-Process @$processOptions
+$process = Start-Process `@processOptions`
🤖 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/inputs/winget/scripts/rtools_install.ps1` at line 16, The
Start-Process call is using invalid PowerShell splat syntax, which causes
parameter binding to fail. Update the generated Start-Process invocation in
rtools_install.ps1 to use the processOptions splat correctly, and apply the same
fix to the matching Start-Process lines in the other winget
installer/uninstaller scripts so they all use the same valid pattern.
ee/maintained-apps/inputs/winget/scripts/rtools_uninstall.ps1-24-26 (1)

24-26: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the Start-Process splat syntax — use @processOptions here; @$processOptions will prevent the uninstall command from starting.

🤖 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/inputs/winget/scripts/rtools_uninstall.ps1` around lines
24 - 26, The Start-Process call in rtools_uninstall.ps1 is using the wrong splat
syntax, which prevents the uninstall command from launching. Update the
invocation that builds $processOptions and calls Start-Process so it splats the
hashtable with `@processOptions` instead of @$processOptions, keeping the existing
FilePath, ArgumentList, PassThru, and Wait behavior intact.
ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json-21-21 (1)

21-21: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Quote the MSI log path in the command line. $logFile is embedded in a single -ArgumentList string, so a space in %TEMP% will split /lv and can make msiexec fail before install starts.

🤖 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/zoom-outlook-plugin/windows.json` at line 21, The
msiexec invocation in the windows.json entry builds a single -ArgumentList
string in the Start-Process call, so the $logFile value from the /lv switch can
break if %TEMP% contains spaces. Update the logic around the Start-Process
msiexec.exe command to ensure the MSI log path is quoted/escaped as a single
argument, keeping the /lv target intact while preserving the existing
INSTALLER_PATH and ExitCode handling.
ee/maintained-apps/inputs/winget/scripts/azure_data_studio_uninstall.ps1-24-26 (1)

24-26: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use @processOptions here. @$processOptions is invalid splatting syntax, so Start-Process won’t bind the options and the uninstall path fails.

Proposed fix
-            $process = Start-Process @$processOptions
+            $process = Start-Process `@processOptions`
🤖 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/inputs/winget/scripts/azure_data_studio_uninstall.ps1`
around lines 24 - 26, The Start-Process call in azure_data_studio_uninstall.ps1
is using invalid splatting syntax, so the options in $processOptions will not
bind correctly and the uninstall flow can fail. Update the Start-Process
invocation in the uninstall script to use the proper splat form with the
$processOptions hashtable, and keep the existing
$uninstallCommand/$uninstallArgs handling intact.
ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1-24-26 (1)

24-26: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Fix the splatting typo in ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1:26.

Start-Process @$processOptions is invalid PowerShell splatting; it needs to be @processOptions, or this uninstall path will fail.

🤖 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/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1`
around lines 24 - 26, The `Start-Process` call in
`aomei_backupper_standard_uninstall.ps1` is using invalid splatting syntax, so
the uninstall flow will break when it runs. Update the `Start-Process`
invocation to use the `processOptions` hashtable with proper PowerShell
splatting in the uninstall logic, keeping the existing `uninstallCommand`,
`uninstallArgs`, and `$processOptions` setup unchanged.
ee/maintained-apps/inputs/winget/scripts/gnupg_uninstall.ps1-4-10 (1)

4-10: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Cover HKCU installs or force machine scope
installer_scope is empty here and the install script doesn’t force a machine install, so a per-user GnuPG install would be detected but never uninstalled. Add the HKCU uninstall hives here, or make the package machine-scoped upstream.

🤖 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/inputs/winget/scripts/gnupg_uninstall.ps1` around lines 4
- 10, The uninstall lookup in gnupg_uninstall.ps1 only scans machine-wide
registry hives, so per-user GnuPG installs can be missed. Update the registry
search used by the uninstall flow (the $machineKey / $machineKey32on64 lookup in
the script) to also include the equivalent HKCU uninstall hives, or otherwise
ensure the package is forced to machine scope so the uninstall path covers all
installed instances.
ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json-21-21 (1)

21-21: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Normalize MSI reboot-required exit codes in the shared install ref. This 8959087b script returns the raw msiexec code, so successful installs that end with 3010 or 1641 will be treated as failures. The same ref is reused across multiple Windows manifests, so handle those codes once here.

🤖 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/eclipse-temurin-jdk-11/windows.json` at line 21,
The shared install script for the 8959087b reference currently exits with the
raw msiexec result, so reboot-required success codes are being treated as
failures. Update the script in the shared Windows install ref to normalize the
Start-Process msiexec.exe exit handling: after the install finishes, treat 3010
and 1641 as successful outcomes and return a zero exit code, while preserving
non-success codes as failures. Keep the change centered around the 8959087b
entry so all manifests using this reference inherit the fix.
ee/maintained-apps/inputs/winget/scripts/google_earth_pro_uninstall.ps1-3-3 (1)

3-3: 🩺 Stability & Availability | 🟠 Major | ⚡ Quick win

Add the MSI silent uninstall flag to the fallback path Google Earth Pro uninstalls through msiexec, so UninstallString without /qn can still prompt UI in unattended runs. Handle the MSI case explicitly instead of relying on QuietUninstallString.

🤖 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/inputs/winget/scripts/google_earth_pro_uninstall.ps1` at
line 3, The fallback uninstall path in google_earth_pro_uninstall.ps1 does not
guarantee silent execution for MSI-based removals. Update the logic around the
UninstallString handling to detect the Google Earth Pro msiexec case and append
the MSI silent flag (/qn) explicitly instead of depending on
QuietUninstallString; keep the change focused on the uninstall argument
construction used by the script’s uninstall flow.
ee/maintained-apps/inputs/winget/scripts/treesize_free_uninstall.ps1-24-26 (1)

24-26: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Use @processOptions here instead of @$processOptions. PowerShell splatting takes the variable name directly; this typo prevents the uninstall arguments from being passed.

Suggested fix
-            $process = Start-Process @$processOptions
+            $process = Start-Process `@processOptions`
🤖 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/inputs/winget/scripts/treesize_free_uninstall.ps1` around
lines 24 - 26, The uninstall flow in the script’s Start-Process call is using
the wrong splatting syntax, which prevents the arguments from being passed.
Update the process launch in the uninstall block to use the splatted
$processOptions variable directly with the Start-Process invocation, keeping the
existing $processOptions construction and $uninstallArgs handling intact.
🤖 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/inputs/winget/scripts/aomei_backupper_standard_install.ps1`:
- Line 16: The Start-Process invocation in the install script is using invalid
splatting syntax, so it will not parse. Update the Start-Process call in the
script to use the proper `@processOptions` splat form, keeping the existing
processOptions variable and surrounding logic unchanged.

In
`@ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_install.ps1`:
- Line 16: The Start-Process call in logitech_unifying_software_install.ps1 is
using invalid splat syntax with $processOptions, which prevents the script from
parsing. Update the Start-Process invocation to use the proper PowerShell splat
form for the existing processOptions variable so the call is valid and the
script can execute. Use the unique symbol Start-Process and the processOptions
variable to locate and correct this line.

In
`@ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_uninstall.ps1`:
- Line 26: The uninstall launcher is using invalid splatting syntax in the
Start-Process call, which prevents the uninstaller from starting. Update the
invocation in the logitech_unifying_software_uninstall.ps1 script to use valid
splatting with the existing $processOptions variable, and then regenerate the
matching windows.json output ref for the Logitech Unifying Software app so the
package metadata stays in sync.

In `@ee/maintained-apps/inputs/winget/scripts/spyder_uninstall.ps1`:
- Around line 24-26: The uninstall script is using invalid splat syntax in the
Start-Process call, which prevents the command from running. Update the
Start-Process invocation in spyder_uninstall.ps1 to use the hashtable variable
with proper PowerShell splatting, and keep the existing $processOptions
construction and optional ArgumentList assignment intact.

In `@ee/maintained-apps/outputs/aomei-backupper-standard/windows.json`:
- Around line 19-20: The embedded PowerShell payloads for the install and
uninstall refs are using invalid splat syntax in Start-Process, which will break
execution. Update both script bodies in the AOMEI Backupper Standard entries so
Start-Process splats the processOptions hashtable correctly using the existing
$processOptions symbol, and make sure the same fix is applied in both the
installer and uninstaller refs.

In `@ee/maintained-apps/outputs/azure-data-studio/windows.json`:
- Around line 19-20: The embedded PowerShell in both Azure Data Studio script
entries is using invalid splatting syntax with Start-Process, which will prevent
the installer and uninstaller from running. Update the calls in the install and
uninstall script blobs to use proper splatting against the $processOptions
hashtable in both places where Start-Process is invoked. Keep the rest of the
logic in the 1dc8cafc and 87cf9389 script entries unchanged.

In `@ee/maintained-apps/outputs/spyder/windows.json`:
- Line 19: The Spyder Windows install script payload is using invalid splatting
syntax in the Start-Process invocation. Update the source script that generates
the Spyder Windows output so the $processOptions hashtable is passed with
standard PowerShell splatting syntax in Start-Process, then regenerate the
windows.json artifact to reflect the corrected payload. Use the Start-Process
and $processOptions symbols to locate and fix the source of the generated
output.

In `@ee/maintained-apps/outputs/treesize-free/windows.json`:
- Around line 19-20: The TreeSize Free install and uninstall scripts are using
invalid PowerShell splatting with Start-Process, so update both script payloads
referenced by the install and uninstall entries to use the correct splat syntax
in the Start-Process call. Locate the Start-Process usage in the TreeSize Free
PowerShell blobs and fix the argument expansion so the process launch works
before regenerating the refs.

---

Major comments:
In `@ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json`:
- Around line 6-10: The custom exists_query is too broad and can match non-x64
Temurin 11 installs, causing the x64 manifest to be treated as present when it
is not. Update the query in the Eclipse Temurin JDK 11 winget manifest to
constrain results to x64 installs, using the existing installer_arch setting as
the guide so the generated patched query only matches x64 entries.

In `@ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json`:
- Around line 6-10: The custom exists_query in the Temurin 8 JRE winget input is
too broad because it matches any Eclipse Temurin JRE with Hotspot 8 entry
regardless of architecture. Tighten the query used by this manifest so it
explicitly filters for x64 installs, aligning it with the selected x64 MSI and
preventing other Temurin 8 JRE variants from satisfying the existence and patch
checks. Update the exists_query entry in this manifest to include the
architecture suffix condition alongside the existing name and publisher
constraints.

In
`@ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1`:
- Around line 24-26: The `Start-Process` call in
`aomei_backupper_standard_uninstall.ps1` is using invalid splatting syntax, so
the uninstall flow will break when it runs. Update the `Start-Process`
invocation to use the `processOptions` hashtable with proper PowerShell
splatting in the uninstall logic, keeping the existing `uninstallCommand`,
`uninstallArgs`, and `$processOptions` setup unchanged.

In `@ee/maintained-apps/inputs/winget/scripts/azure_data_studio_install.ps1`:
- Line 16: The Start-Process call in the Azure Data Studio install script is
using an invalid splat form, so the hashtable is being passed as a literal
argument instead of expanded parameters. Update the invocation at the
Start-Process call site to use the proper splatting syntax with the existing
processOptions hashtable so the installer launches correctly.

In `@ee/maintained-apps/inputs/winget/scripts/azure_data_studio_uninstall.ps1`:
- Around line 24-26: The Start-Process call in azure_data_studio_uninstall.ps1
is using invalid splatting syntax, so the options in $processOptions will not
bind correctly and the uninstall flow can fail. Update the Start-Process
invocation in the uninstall script to use the proper splat form with the
$processOptions hashtable, and keep the existing
$uninstallCommand/$uninstallArgs handling intact.

In `@ee/maintained-apps/inputs/winget/scripts/gnupg_uninstall.ps1`:
- Around line 4-10: The uninstall lookup in gnupg_uninstall.ps1 only scans
machine-wide registry hives, so per-user GnuPG installs can be missed. Update
the registry search used by the uninstall flow (the $machineKey /
$machineKey32on64 lookup in the script) to also include the equivalent HKCU
uninstall hives, or otherwise ensure the package is forced to machine scope so
the uninstall path covers all installed instances.

In `@ee/maintained-apps/inputs/winget/scripts/google_earth_pro_uninstall.ps1`:
- Line 3: The fallback uninstall path in google_earth_pro_uninstall.ps1 does not
guarantee silent execution for MSI-based removals. Update the logic around the
UninstallString handling to detect the Google Earth Pro msiexec case and append
the MSI silent flag (/qn) explicitly instead of depending on
QuietUninstallString; keep the change focused on the uninstall argument
construction used by the script’s uninstall flow.

In `@ee/maintained-apps/inputs/winget/scripts/rtools_install.ps1`:
- Line 16: The Start-Process call is using invalid PowerShell splat syntax,
which causes parameter binding to fail. Update the generated Start-Process
invocation in rtools_install.ps1 to use the processOptions splat correctly, and
apply the same fix to the matching Start-Process lines in the other winget
installer/uninstaller scripts so they all use the same valid pattern.

In `@ee/maintained-apps/inputs/winget/scripts/rtools_uninstall.ps1`:
- Around line 24-26: The Start-Process call in rtools_uninstall.ps1 is using the
wrong splat syntax, which prevents the uninstall command from launching. Update
the invocation that builds $processOptions and calls Start-Process so it splats
the hashtable with `@processOptions` instead of @$processOptions, keeping the
existing FilePath, ArgumentList, PassThru, and Wait behavior intact.

In `@ee/maintained-apps/inputs/winget/scripts/treesize_free_uninstall.ps1`:
- Around line 24-26: The uninstall flow in the script’s Start-Process call is
using the wrong splatting syntax, which prevents the arguments from being
passed. Update the process launch in the uninstall block to use the splatted
$processOptions variable directly with the Start-Process invocation, keeping the
existing $processOptions construction and $uninstallArgs handling intact.

In `@ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json`:
- Line 21: The shared install script for the 8959087b reference currently exits
with the raw msiexec result, so reboot-required success codes are being treated
as failures. Update the script in the shared Windows install ref to normalize
the Start-Process msiexec.exe exit handling: after the install finishes, treat
3010 and 1641 as successful outcomes and return a zero exit code, while
preserving non-success codes as failures. Keep the change centered around the
8959087b entry so all manifests using this reference inherit the fix.

In `@ee/maintained-apps/outputs/rtools/windows.json`:
- Around line 19-20: The generated Rtools PowerShell outputs are still stale and
contain the broken splat usage in both the uninstall and install script entries,
so refresh this artifact from the updated source scripts. Regenerate the
`windows.json` output for the Rtools package after fixing the `Start-Process`
splat typo so the embedded scripts in both referenced entries are updated
consistently.

In `@ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json`:
- Line 21: The msiexec invocation in the windows.json entry builds a single
-ArgumentList string in the Start-Process call, so the $logFile value from the
/lv switch can break if %TEMP% contains spaces. Update the logic around the
Start-Process msiexec.exe command to ensure the MSI log path is quoted/escaped
as a single argument, keeping the /lv target intact while preserving the
existing INSTALLER_PATH and ExitCode handling.
🪄 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: 744b175c-03e4-4164-bbf5-5f3eb94012b4

📥 Commits

Reviewing files that changed from the base of the PR and between a4086dc and 7e88c22.

📒 Files selected for processing (70)
  • changes/add-windows-fmas-batch
  • ee/maintained-apps/inputs/winget/aomei-backupper-standard.json
  • ee/maintained-apps/inputs/winget/apple-itunes.json
  • ee/maintained-apps/inputs/winget/azure-data-studio.json
  • ee/maintained-apps/inputs/winget/crystaldiskmark.json
  • ee/maintained-apps/inputs/winget/dell-display-and-peripheral-manager.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json
  • ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json
  • ee/maintained-apps/inputs/winget/git-extensions.json
  • ee/maintained-apps/inputs/winget/gnupg.json
  • ee/maintained-apps/inputs/winget/google-earth-pro.json
  • ee/maintained-apps/inputs/winget/gpg4win.json
  • ee/maintained-apps/inputs/winget/logitech-unifying-software.json
  • ee/maintained-apps/inputs/winget/logitune.json
  • ee/maintained-apps/inputs/winget/rtools.json
  • ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/apple_itunes_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/apple_itunes_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/azure_data_studio_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/azure_data_studio_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/crystaldiskmark_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/crystaldiskmark_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/dell_dapm_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/dell_dapm_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/gnupg_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/gnupg_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/google_earth_pro_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/google_earth_pro_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/gpg4win_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/gpg4win_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/logitune_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/logitune_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/rtools_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/rtools_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/spyder_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/spyder_uninstall.ps1
  • ee/maintained-apps/inputs/winget/scripts/treesize_free_install.ps1
  • ee/maintained-apps/inputs/winget/scripts/treesize_free_uninstall.ps1
  • ee/maintained-apps/inputs/winget/sonicwall-netextender.json
  • ee/maintained-apps/inputs/winget/spyder.json
  • ee/maintained-apps/inputs/winget/tightvnc.json
  • ee/maintained-apps/inputs/winget/treesize-free.json
  • ee/maintained-apps/inputs/winget/windirstat.json
  • ee/maintained-apps/inputs/winget/yarn.json
  • ee/maintained-apps/inputs/winget/zoom-outlook-plugin.json
  • ee/maintained-apps/outputs/aomei-backupper-standard/windows.json
  • ee/maintained-apps/outputs/apple-itunes/windows.json
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/azure-data-studio/windows.json
  • ee/maintained-apps/outputs/crystaldiskmark/windows.json
  • ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json
  • ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json
  • ee/maintained-apps/outputs/git-extensions/windows.json
  • ee/maintained-apps/outputs/gnupg/windows.json
  • ee/maintained-apps/outputs/google-earth-pro/windows.json
  • ee/maintained-apps/outputs/gpg4win/windows.json
  • ee/maintained-apps/outputs/logitech-unifying-software/windows.json
  • ee/maintained-apps/outputs/logitune/windows.json
  • ee/maintained-apps/outputs/rtools/windows.json
  • ee/maintained-apps/outputs/sonicwall-netextender/windows.json
  • ee/maintained-apps/outputs/spyder/windows.json
  • ee/maintained-apps/outputs/tightvnc/windows.json
  • ee/maintained-apps/outputs/treesize-free/windows.json
  • ee/maintained-apps/outputs/windirstat/windows.json
  • ee/maintained-apps/outputs/yarn/windows.json
  • ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

Comment thread ee/maintained-apps/inputs/winget/scripts/aomei_backupper_standard_install.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_install.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/logitech_unifying_software_uninstall.ps1 Outdated
Comment thread ee/maintained-apps/inputs/winget/scripts/spyder_uninstall.ps1 Outdated
Comment thread ee/maintained-apps/outputs/aomei-backupper-standard/windows.json Outdated
Comment thread ee/maintained-apps/outputs/azure-data-studio/windows.json Outdated
Comment thread ee/maintained-apps/outputs/spyder/windows.json Outdated
Comment thread ee/maintained-apps/outputs/treesize-free/windows.json Outdated
@codecov

codecov Bot commented Jun 30, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 13 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.95%. Comparing base (19efda2) to head (ba6201b).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
...rePage/components/icons/AomeiBackupperStandard.tsx 50.00% 1 Missing ⚠️
.../SoftwarePage/components/icons/AzureDataStudio.tsx 50.00% 1 Missing ⚠️
...mponents/icons/DellDisplayAndPeripheralManager.tsx 50.00% 1 Missing ⚠️
...es/SoftwarePage/components/icons/GitExtensions.tsx 50.00% 1 Missing ⚠️
...tend/pages/SoftwarePage/components/icons/Gnupg.tsx 50.00% 1 Missing ⚠️
...nd/pages/SoftwarePage/components/icons/Gpg4Win.tsx 50.00% 1 Missing ⚠️
...Page/components/icons/LogitechUnifyingSoftware.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Rtools.tsx 50.00% 1 Missing ⚠️
...warePage/components/icons/SonicwallNetextender.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/Tightvnc.tsx 50.00% 1 Missing ⚠️
... and 3 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #48501      +/-   ##
==========================================
- Coverage   67.95%   67.95%   -0.01%     
==========================================
  Files        3922     3935      +13     
  Lines      250015   250038      +23     
  Branches    13178    13334     +156     
==========================================
+ Hits       169888   169903      +15     
- Misses      64833    64842       +9     
+ Partials    15294    15293       -1     
Flag Coverage Δ
frontend 60.40% <50.00%> (-0.01%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

- Fix PowerShell splatting bug: `@$processOptions` → `@processOptions` in 12 install/uninstall scripts (AOMEI, Azure Data Studio, Logitech Unifying Software, Rtools, Spyder, TreeSize Free)
- Fix SourceForge installer URL: append /download suffix so Go HTTP client downloads the binary instead of the HTML download page; update winget ingester to auto-apply this for any SourceForge URL without the suffix
- Fix Logi Tune SHA256: add ignore_hash=true since the download URL is unversioned and winget manifest lags behind Logitech releases
- Fix iTunes/Google Earth Pro uninstall: add msiexec wait loop after uninstall command, since both use wrapper EXEs that exit before child MSI processes complete
- Freeze Dell DAPM: requires physical Dell display hardware not available in CI runners; mark frozen to skip CI validation
- Regenerate affected output JSONs for all modified apps
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/aomei-backupper-standard/windows.json

=== Install // 34b42c0a -> 03d967ed ===

--- /tmp/old.KxRDsU	2026-06-30 18:51:06.064075158 +0000
+++ /tmp/new.DwHdoU	2026-06-30 18:51:06.064075158 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 90ede407 -> 2a469c3f ===

--- /tmp/old.XXtbuU	2026-06-30 18:51:06.100075511 +0000
+++ /tmp/new.rNLUau	2026-06-30 18:51:06.100075511 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/apple-itunes/windows.json

=== Install Script (no changes) ===
=== Uninstall // 5f74ea2b -> ac09716c ===

--- /tmp/old.H4PIGI	2026-06-30 18:51:06.146075962 +0000
+++ /tmp/new.3xfR9j	2026-06-30 18:51:06.147075972 +0000
@@ -30,4 +30,13 @@
     if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found."; Exit 1 }
 } catch { Write-Host "Error: $_"; Exit 1 }
 
+# iTunes uses a WiX bundle that spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

ee/maintained-apps/outputs/azure-data-studio/windows.json

=== Install // 1dc8cafc -> 622c4e10 ===

--- /tmp/old.0rcXU8	2026-06-30 18:51:06.277077246 +0000
+++ /tmp/new.fY2L7z	2026-06-30 18:51:06.277077246 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 87cf9389 -> 23fce27b ===

--- /tmp/old.uGgOaz	2026-06-30 18:51:06.293077403 +0000
+++ /tmp/new.Z4zOam	2026-06-30 18:51:06.293077403 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/git-extensions/windows.json

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

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

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

ee/maintained-apps/outputs/google-earth-pro/windows.json

=== Install Script (no changes) ===
=== Uninstall // 7e72e637 -> 51dc162a ===

--- /tmp/old.OBKWj6	2026-06-30 18:51:07.467087918 +0000
+++ /tmp/new.ayizCM	2026-06-30 18:51:07.467087918 +0000
@@ -65,4 +65,13 @@
     Exit 1
 }
 
+# Google Earth Pro's uninstaller spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

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

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

ee/maintained-apps/outputs/logitech-unifying-software/windows.json

=== Install // f7bcd4ba -> a3795eea ===

--- /tmp/old.qMO0NT	2026-06-30 18:51:07.735090277 +0000
+++ /tmp/new.pbdZPY	2026-06-30 18:51:07.735090277 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 9f1b824a -> 8ec563fd ===

--- /tmp/old.RTunBt	2026-06-30 18:51:07.751090418 +0000
+++ /tmp/new.B53doI	2026-06-30 18:51:07.751090418 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

=== Install // adeab869 -> fec8495e ===

--- /tmp/old.mAYqXx	2026-06-30 18:51:07.829091104 +0000
+++ /tmp/new.bxGJJZ	2026-06-30 18:51:07.829091104 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 6125a07b -> a289eb1d ===

--- /tmp/old.tc3k80	2026-06-30 18:51:07.845091245 +0000
+++ /tmp/new.zkIN31	2026-06-30 18:51:07.845091245 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/sonicwall-netextender/windows.json

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

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

=== Install // 297c1c96 -> 6831586d ===

--- /tmp/old.BSLYhF	2026-06-30 18:51:08.119093657 +0000
+++ /tmp/new.uAW7rC	2026-06-30 18:51:08.119093657 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 338688ef -> 1fe840b2 ===

--- /tmp/old.ovDZjD	2026-06-30 18:51:08.135093797 +0000
+++ /tmp/new.WVAwJA	2026-06-30 18:51:08.135093797 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

ee/maintained-apps/outputs/treesize-free/windows.json

=== Install // 3e307826 -> 36e33a58 ===

--- /tmp/old.JBgmaw	2026-06-30 18:51:08.409096209 +0000
+++ /tmp/new.hPi2iW	2026-06-30 18:51:08.410096218 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 3cc408af -> f316b604 ===

--- /tmp/old.hHBAkG	2026-06-30 18:51:08.425096350 +0000
+++ /tmp/new.sizpHp	2026-06-30 18:51:08.425096350 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

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

ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

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

CrystalDiskMark uses a SourceForge installer URL that requires a /download
suffix to serve the binary directly to non-browser HTTP clients, but the
winget manifest doesn't include that suffix. Rather than patching the
ingester broadly, drop CrystalDiskMark from the batch.

Reverts the SourceForge /download logic added to winget ingester.go.
Removes input JSON, install/uninstall scripts, output JSON, icon, and
apps.json entry. Updates changes file from 21 to 20 apps.
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/aomei-backupper-standard/windows.json

=== Install // 34b42c0a -> 03d967ed ===

--- /tmp/old.8BnFdz	2026-06-30 19:24:27.187970929 +0000
+++ /tmp/new.EdiQFP	2026-06-30 19:24:27.187970929 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 90ede407 -> 2a469c3f ===

--- /tmp/old.7ZPcVJ	2026-06-30 19:24:27.210971162 +0000
+++ /tmp/new.U2wQmy	2026-06-30 19:24:27.210971162 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/apple-itunes/windows.json

=== Install Script (no changes) ===
=== Uninstall // 5f74ea2b -> ac09716c ===

--- /tmp/old.KSYDhM	2026-06-30 19:24:27.253971599 +0000
+++ /tmp/new.25vb4i	2026-06-30 19:24:27.253971599 +0000
@@ -30,4 +30,13 @@
     if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found."; Exit 1 }
 } catch { Write-Host "Error: $_"; Exit 1 }
 
+# iTunes uses a WiX bundle that spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

ee/maintained-apps/outputs/azure-data-studio/windows.json

=== Install // 1dc8cafc -> 622c4e10 ===

--- /tmp/old.NWfJ4i	2026-06-30 19:24:27.379972878 +0000
+++ /tmp/new.aHNcwG	2026-06-30 19:24:27.379972878 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 87cf9389 -> 23fce27b ===

--- /tmp/old.XpSlah	2026-06-30 19:24:27.393973020 +0000
+++ /tmp/new.GZs441	2026-06-30 19:24:27.393973020 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/git-extensions/windows.json

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

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

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

ee/maintained-apps/outputs/google-earth-pro/windows.json

=== Install Script (no changes) ===
=== Uninstall // 7e72e637 -> 51dc162a ===

--- /tmp/old.dj813W	2026-06-30 19:24:28.421983459 +0000
+++ /tmp/new.3IIlQD	2026-06-30 19:24:28.421983459 +0000
@@ -65,4 +65,13 @@
     Exit 1
 }
 
+# Google Earth Pro's uninstaller spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

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

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

ee/maintained-apps/outputs/logitech-unifying-software/windows.json

=== Install // f7bcd4ba -> a3795eea ===

--- /tmp/old.XPfclN	2026-06-30 19:24:28.658985866 +0000
+++ /tmp/new.x9hBFE	2026-06-30 19:24:28.658985866 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 9f1b824a -> 8ec563fd ===

--- /tmp/old.P1vZ7o	2026-06-30 19:24:28.673986018 +0000
+++ /tmp/new.j8HBN7	2026-06-30 19:24:28.673986018 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

=== Install // adeab869 -> fec8495e ===

--- /tmp/old.xPjzee	2026-06-30 19:24:28.743986729 +0000
+++ /tmp/new.YNH88Q	2026-06-30 19:24:28.743986729 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 6125a07b -> a289eb1d ===

--- /tmp/old.oFlaeh	2026-06-30 19:24:28.758986881 +0000
+++ /tmp/new.gQmcmy	2026-06-30 19:24:28.758986881 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/sonicwall-netextender/windows.json

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

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

=== Install // 297c1c96 -> 6831586d ===

--- /tmp/old.oT20sT	2026-06-30 19:24:29.004989379 +0000
+++ /tmp/new.7ZSttZ	2026-06-30 19:24:29.004989379 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 338688ef -> 1fe840b2 ===

--- /tmp/old.PzBPNp	2026-06-30 19:24:29.018989521 +0000
+++ /tmp/new.Sm8WKW	2026-06-30 19:24:29.018989521 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

ee/maintained-apps/outputs/treesize-free/windows.json

=== Install // 3e307826 -> 36e33a58 ===

--- /tmp/old.dz6AQa	2026-06-30 19:24:29.264992019 +0000
+++ /tmp/new.KLmgrE	2026-06-30 19:24:29.264992019 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 3cc408af -> f316b604 ===

--- /tmp/old.STrkEg	2026-06-30 19:24:29.279992172 +0000
+++ /tmp/new.L4Thxq	2026-06-30 19:24:29.279992172 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

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

ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

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

@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/aomei-backupper-standard/windows.json

=== Install // 34b42c0a -> 03d967ed ===

--- /tmp/old.n4Qxmx	2026-06-30 19:27:03.098666177 +0000
+++ /tmp/new.WNWJ99	2026-06-30 19:27:03.098666177 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 90ede407 -> 2a469c3f ===

--- /tmp/old.jCv0D1	2026-06-30 19:27:03.115666048 +0000
+++ /tmp/new.PwQxib	2026-06-30 19:27:03.115666048 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/apple-itunes/windows.json

=== Install Script (no changes) ===
=== Uninstall // 5f74ea2b -> ac09716c ===

--- /tmp/old.g2gPIj	2026-06-30 19:27:03.161665699 +0000
+++ /tmp/new.WKTfve	2026-06-30 19:27:03.161665699 +0000
@@ -30,4 +30,13 @@
     if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found."; Exit 1 }
 } catch { Write-Host "Error: $_"; Exit 1 }
 
+# iTunes uses a WiX bundle that spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

ee/maintained-apps/outputs/azure-data-studio/windows.json

=== Install // 1dc8cafc -> 622c4e10 ===

--- /tmp/old.3WxfS2	2026-06-30 19:27:03.292664705 +0000
+++ /tmp/new.JaTkrH	2026-06-30 19:27:03.292664705 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 87cf9389 -> 23fce27b ===

--- /tmp/old.x4QQei	2026-06-30 19:27:03.309664576 +0000
+++ /tmp/new.MiwvqJ	2026-06-30 19:27:03.309664576 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json

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

ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json

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

ee/maintained-apps/outputs/git-extensions/windows.json

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

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

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

ee/maintained-apps/outputs/google-earth-pro/windows.json

=== Install Script (no changes) ===
=== Uninstall // 7e72e637 -> 51dc162a ===

--- /tmp/old.dvc2ho	2026-06-30 19:27:04.469655777 +0000
+++ /tmp/new.BFoQbg	2026-06-30 19:27:04.469655777 +0000
@@ -65,4 +65,13 @@
     Exit 1
 }
 
+# Google Earth Pro's uninstaller spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

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

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

ee/maintained-apps/outputs/logitech-unifying-software/windows.json

=== Install // f7bcd4ba -> a3795eea ===

--- /tmp/old.SRSum1	2026-06-30 19:27:04.743653699 +0000
+++ /tmp/new.EvR2o1	2026-06-30 19:27:04.743653699 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 9f1b824a -> 8ec563fd ===

--- /tmp/old.HzScuU	2026-06-30 19:27:04.759653578 +0000
+++ /tmp/new.BkVtJo	2026-06-30 19:27:04.759653578 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

=== Install // adeab869 -> fec8495e ===

--- /tmp/old.8vKEwT	2026-06-30 19:27:04.836652994 +0000
+++ /tmp/new.A5bbAn	2026-06-30 19:27:04.836652994 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 6125a07b -> a289eb1d ===

--- /tmp/old.896Z4q	2026-06-30 19:27:04.853652865 +0000
+++ /tmp/new.LzajZq	2026-06-30 19:27:04.853652865 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/sonicwall-netextender/windows.json

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

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

=== Install // 297c1c96 -> 6831586d ===

--- /tmp/old.r2oMNT	2026-06-30 19:27:05.130650764 +0000
+++ /tmp/new.WQiZ5q	2026-06-30 19:27:05.130650764 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 338688ef -> 1fe840b2 ===

--- /tmp/old.1FDOZV	2026-06-30 19:27:05.147650635 +0000
+++ /tmp/new.mwollQ	2026-06-30 19:27:05.147650635 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

ee/maintained-apps/outputs/treesize-free/windows.json

=== Install // 3e307826 -> 36e33a58 ===

--- /tmp/old.DfdEPX	2026-06-30 19:27:05.429648495 +0000
+++ /tmp/new.rdT5X7	2026-06-30 19:27:05.429648495 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 3cc408af -> f316b604 ===

--- /tmp/old.dzSrLj	2026-06-30 19:27:05.445648374 +0000
+++ /tmp/new.Y98SL9	2026-06-30 19:27:05.445648374 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

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

ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

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

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

Copy link
Copy Markdown

CI Feedback 🧐

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

Action: test-fma-pr-only

Failed stage: Validate changed apps [❌]

Failed test name: ee/maintained-apps validation (Windows)

Failure summary:

The action failed during the Windows “maintained apps” validation step because the app validation
command exited with exit status 1 after multiple apps failed their install/uninstall/version checks.

- Several apps could not be validated because osquery did not find the expected version after
install (e.g., AOMEI Backupper Standard expected 8.4.0.0, Logi Tune expected 3.13.138.0).
- Several
apps failed because they were still detected after running the uninstall script (e.g., iTunes
expected no match for 12.13.10.3, Google Earth Pro expected no match for 7.3.7.1155, Logitech
Unifying Software expected no match for 2.52.33).
- Several installers returned non-zero status
(exit status 1) when executing install scripts (e.g., Azure Data Studio, GNU Privacy Guard, Gpg4win,
Rtools, TreeSize Free).
- The validator reported: Validated 10 out of 21 apps successfully and Apps
with errors: [AOMEI Backupper Standard iTunes Azure Data Studio GNU Privacy Guard Google Earth Pro
Gpg4win Logitech Unifying Software Logi Tune Rtools TreeSize Free], then terminated with exit status
1 (lines ~5291-5296).
- There were also cleanup warnings where temporary installer files could not
be deleted because they were still in use (The process cannot access the file because it is being
used by another process), but the job failure is caused by the validator returning a non-zero exit
code.

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

148:  * [new branch]            11938-loadtesting-branch    -> origin/11938-loadtesting-branch
149:  * [new branch]            12007-ui-idp-metadata       -> origin/12007-ui-idp-metadata
150:  * [new branch]            12351-try-fix-for-fleet-desktop -> origin/12351-try-fix-for-fleet-desktop
151:  * [new branch]            12356-puppet-callback       -> origin/12356-puppet-callback
152:  * [new branch]            12375-query-bulk-action     -> origin/12375-query-bulk-action
153:  * [new branch]            12474-documentation         -> origin/12474-documentation
154:  * [new branch]            12614-federated-auth-support -> origin/12614-federated-auth-support
155:  * [new branch]            12687-host-issues-query     -> origin/12687-host-issues-query
156:  * [new branch]            12696-loadtest-cis-changes  -> origin/12696-loadtest-cis-changes
157:  * [new branch]            12842-fleetd-bitlocker-management -> origin/12842-fleetd-bitlocker-management
158:  * [new branch]            12842-fleetd-bitlocker-table -> origin/12842-fleetd-bitlocker-table
159:  * [new branch]            12889-faster-software       -> origin/12889-faster-software
160:  * [new branch]            13287-loadtest-changes      -> origin/13287-loadtest-changes
161:  * [new branch]            13288-poc-fleet-fips        -> origin/13288-poc-fleet-fips
162:  * [new branch]            13485-query-reports-migration -> origin/13485-query-reports-migration
163:  * [new branch]            13574-cache-failed-policy-counts -> origin/13574-cache-failed-policy-counts
164:  * [new branch]            13657-docs                  -> origin/13657-docs
...

176:  * [new branch]            146orch                     -> origin/146orch
177:  * [new branch]            14753-windows-ps1-api       -> origin/14753-windows-ps1-api
178:  * [new branch]            14957-test-dep-screen       -> origin/14957-test-dep-screen
179:  * [new branch]            14957-test-dep-screen-patch -> origin/14957-test-dep-screen-patch
180:  * [new branch]            15068-disk-encryption-ii    -> origin/15068-disk-encryption-ii
181:  * [new branch]            15082-download-api-docs     -> origin/15082-download-api-docs
182:  * [new branch]            15082-make-endpoints-consistent -> origin/15082-make-endpoints-consistent
183:  * [new branch]            15082-update-download-endpoints -> origin/15082-update-download-endpoints
184:  * [new branch]            15380-hosts-api-doc         -> origin/15380-hosts-api-doc
185:  * [new branch]            15461-ui-dep-assign-profile-responses -> origin/15461-ui-dep-assign-profile-responses
186:  * [new branch]            15463-msi-fix               -> origin/15463-msi-fix
187:  * [new branch]            15559-move-scep             -> origin/15559-move-scep
188:  * [new branch]            15633                       -> origin/15633
189:  * [new branch]            15770-mac-os-vuln           -> origin/15770-mac-os-vuln
190:  * [new branch]            15801-migration             -> origin/15801-migration
191:  * [new branch]            15912-password-reset-error-code -> origin/15912-password-reset-error-code
192:  * [new branch]            16182-log-root              -> origin/16182-log-root
...

598:  * [new branch]            4701-tickets                -> origin/4701-tickets
599:  * [new branch]            4701-with-osqpfix           -> origin/4701-with-osqpfix
600:  * [new branch]            471-0716                    -> origin/471-0716
601:  * [new branch]            471-cloudfront              -> origin/471-cloudfront
602:  * [new branch]            471-tickets                 -> origin/471-tickets
603:  * [new branch]            4710mdm                     -> origin/4710mdm
604:  * [new branch]            4710mdmloadtest             -> origin/4710mdmloadtest
605:  * [new branch]            4711-bsln                   -> origin/4711-bsln
606:  * [new branch]            471RC-07-09                 -> origin/471RC-07-09
607:  * [new branch]            4720mdm                     -> origin/4720mdm
608:  * [new branch]            4720orch                    -> origin/4720orch
609:  * [new branch]            4720orch1                   -> origin/4720orch1
610:  * [new branch]            4720orch2                   -> origin/4720orch2
611:  * [new branch]            47289-new-fma-masv          -> origin/47289-new-fma-masv
612:  * [new branch]            472orchm                    -> origin/472orchm
613:  * [new branch]            47303-redis-moved-errors-from-getqueryresultscounts-incrqueryresultscounts-in-cluster-mode -> origin/47303-redis-moved-errors-from-getqueryresultscounts-incrqueryresultscounts-in-cluster-mode
614:  * [new branch]            4735orch                    -> origin/4735orch
...

640:  * [new branch]            7765-frontend               -> origin/7765-frontend
641:  * [new branch]            7766-backend-final-main-merge -> origin/7766-backend-final-main-merge
642:  * [new branch]            7766-backend-test           -> origin/7766-backend-test
643:  * [new branch]            7766-frontend               -> origin/7766-frontend
644:  * [new branch]            7993-figure-out-the-limits-of-our-current-search-approach -> origin/7993-figure-out-the-limits-of-our-current-search-approach
645:  * [new branch]            8021-orbit-use-specified-identifier -> origin/8021-orbit-use-specified-identifier
646:  * [new branch]            8186-vulnerable-software-false-positive-docker -> origin/8186-vulnerable-software-false-positive-docker
647:  * [new branch]            8593-gitops                 -> origin/8593-gitops
648:  * [new branch]            8708-docs                   -> origin/8708-docs
649:  * [new branch]            8708-encryption-key-api     -> origin/8708-encryption-key-api
650:  * [new branch]            8708-ingest-file-vault      -> origin/8708-ingest-file-vault
651:  * [new branch]            8708-ingest-macos-encription-key -> origin/8708-ingest-macos-encription-key
652:  * [new branch]            8708-ingest-macos-encription-key-ii -> origin/8708-ingest-macos-encription-key-ii
653:  * [new branch]            8974-native-smbios-uuid-support -> origin/8974-native-smbios-uuid-support
654:  * [new branch]            9260-cis-checks-5.10.x      -> origin/9260-cis-checks-5.10.x
655:  * [new branch]            9394-failed-to-create-device-auth-token-due-to-duplicate-key-errors -> origin/9394-failed-to-create-device-auth-token-due-to-duplicate-key-errors
656:  * [new branch]            9590-schema                 -> origin/9590-schema
...

847:  * [new branch]            allenhouchins-add-hardware-procurement-info -> origin/allenhouchins-add-hardware-procurement-info
848:  * [new branch]            allenhouchins-contour-normalize -> origin/allenhouchins-contour-normalize
849:  * [new branch]            allenhouchins-fma-installer-arch -> origin/allenhouchins-fma-installer-arch
850:  * [new branch]            allenhouchins-net-arm64     -> origin/allenhouchins-net-arm64
851:  * [new branch]            allenhouchins-new-blog-post -> origin/allenhouchins-new-blog-post
852:  * [new branch]            allenhouchins-patch-1       -> origin/allenhouchins-patch-1
853:  * [new branch]            allenhouchins-santa-table-updates -> origin/allenhouchins-santa-table-updates
854:  * [new branch]            allenhouchins-update-custom-tap -> origin/allenhouchins-update-custom-tap
855:  * [new branch]            allenhouchins-update-ingester -> origin/allenhouchins-update-ingester
856:  * [new branch]            allenhouchins-update-new-fma-skill -> origin/allenhouchins-update-new-fma-skill
857:  * [new branch]            always-create-event-next-thu -> origin/always-create-event-next-thu
858:  * [new branch]            and_osq_proj                -> origin/and_osq_proj
859:  * [new branch]            andrey/loadtest-oval-vulns  -> origin/andrey/loadtest-oval-vulns
860:  * [new branch]            android-cofniguration-profiles-research -> origin/android-cofniguration-profiles-research
861:  * [new branch]            android-enroll-note         -> origin/android-enroll-note
862:  * [new branch]            android-enrollment-error    -> origin/android-enrollment-error
863:  * [new branch]            android-fleet-vars          -> origin/android-fleet-vars
...

915:  * [new branch]            await-configuration-docs    -> origin/await-configuration-docs
916:  * [new branch]            aws-licensing-integration-proposal -> origin/aws-licensing-integration-proposal
917:  * [new branch]            backport-a41fb63            -> origin/backport-a41fb63
918:  * [new branch]            backport-c02af              -> origin/backport-c02af
919:  * [new branch]            backport-e65d6cf            -> origin/backport-e65d6cf
920:  * [new branch]            backport-ef07a406cc8dbccb4914bbd27631df74e5b13b49 -> origin/backport-ef07a406cc8dbccb4914bbd27631df74e5b13b49
921:  * [new branch]            backport-vpp-fix            -> origin/backport-vpp-fix
922:  * [new branch]            base-software-titles-loadtest -> origin/base-software-titles-loadtest
923:  * [new branch]            base-software-titles-loadtest-2 -> origin/base-software-titles-loadtest-2
924:  * [new branch]            beekeeper-fma-initial       -> origin/beekeeper-fma-initial
925:  * [new branch]            bettapizza                  -> origin/bettapizza
926:  * [new branch]            bettapizza--ghost-testimonial-update -> origin/bettapizza--ghost-testimonial-update
927:  * [new branch]            bettapizza-patch-1          -> origin/bettapizza-patch-1
928:  * [new branch]            bettapizza-patch-2          -> origin/bettapizza-patch-2
929:  * [new branch]            bettapizza-patch-3          -> origin/bettapizza-patch-3
930:  * [new branch]            better-byod-error           -> origin/better-byod-error
931:  * [new branch]            bounded-context-proposals   -> origin/bounded-context-proposals
...

965:  * [new branch]            cherry-pick-42773-vitals-constants -> origin/cherry-pick-42773-vitals-constants
966:  * [new branch]            cherry-pick-48012-to-docs-v4.89.0 -> origin/cherry-pick-48012-to-docs-v4.89.0
967:  * [new branch]            cherry-pick-8750-into-rc-minor-fleet-v4.60.0 -> origin/cherry-pick-8750-into-rc-minor-fleet-v4.60.0
968:  * [new branch]            cherry-pick-dogfood-change  -> origin/cherry-pick-dogfood-change
969:  * [new branch]            cherry-pick-dogfood-env-vars -> origin/cherry-pick-dogfood-env-vars
970:  * [new branch]            cherry-pick-fleetctl-changes-to-allow-testing -> origin/cherry-pick-fleetctl-changes-to-allow-testing
971:  * [new branch]            cherry-pick-mac-address-vital -> origin/cherry-pick-mac-address-vital
972:  * [new branch]            cherry-pick-patches         -> origin/cherry-pick-patches
973:  * [new branch]            cherry-pick-remove-overrides-in-dev-mode -> origin/cherry-pick-remove-overrides-in-dev-mode
974:  * [new branch]            cherry-pick-util            -> origin/cherry-pick-util
975:  * [new branch]            cherry-pick-webhooks        -> origin/cherry-pick-webhooks
976:  * [new branch]            cherrypick-v4.85.0-version-bump-into-main -> origin/cherrypick-v4.85.0-version-bump-into-main
977:  * [new branch]            chore-UI-update-for-CSP     -> origin/chore-UI-update-for-CSP
978:  * [new branch]            chore-add-specific-yarn-version -> origin/chore-add-specific-yarn-version
979:  * [new branch]            chore-backend-api-patterns  -> origin/chore-backend-api-patterns
980:  * [new branch]            chore-change-error-message-custom-profile -> origin/chore-change-error-message-custom-profile
981:  * [new branch]            chore-cp-chage-status-code-turn-off-mdm -> origin/chore-cp-chage-status-code-turn-off-mdm
...

1172:  * [new branch]            edwardsb-vuln-processing-fix-sandcastle -> origin/edwardsb-vuln-processing-fix-sandcastle
1173:  * [new branch]            edwardsb-vuln-processing-volume-fix -> origin/edwardsb-vuln-processing-volume-fix
1174:  * [new branch]            edwardsb/deployment-guide-updates -> origin/edwardsb/deployment-guide-updates
1175:  * [new branch]            edwardsb/restrict_console_access -> origin/edwardsb/restrict_console_access
1176:  * [new branch]            elastic_rum                 -> origin/elastic_rum
1177:  * [new branch]            enable-jit-by-default       -> origin/enable-jit-by-default
1178:  * [new branch]            enable-test-go-automation-macos -> origin/enable-test-go-automation-macos
1179:  * [new branch]            enforce-firefox-doh         -> origin/enforce-firefox-doh
1180:  * [new branch]            enforce-firefox-windows     -> origin/enforce-firefox-windows
1181:  * [new branch]            enforce-ios-26.5-update-deadline-july-2026 -> origin/enforce-ios-26.5-update-deadline-july-2026
1182:  * [new branch]            enforce-iso27001-workstations -> origin/enforce-iso27001-workstations
1183:  * [new branch]            enforce-macos-15.5-update-deadline -> origin/enforce-macos-15.5-update-deadline
1184:  * [new branch]            enforce-macos-version-workstations -> origin/enforce-macos-version-workstations
1185:  * [new branch]            enroll-android-feature-guide -> origin/enroll-android-feature-guide
1186:  * [new branch]            ericswenson0-patch-1        -> origin/ericswenson0-patch-1
1187:  * [new branch]            error-counts                -> origin/error-counts
1188:  * [new branch]            errors-perf-testing         -> origin/errors-perf-testing
1189:  * [new branch]            es-reports                  -> origin/es-reports
...

1205:  * [new branch]            eugkuo-patch-6-slugs-FMA    -> origin/eugkuo-patch-6-slugs-FMA
1206:  * [new branch]            example-fleetctl-profiles   -> origin/example-fleetctl-profiles
1207:  * [new branch]            exp-mdbook-docs             -> origin/exp-mdbook-docs
1208:  * [new branch]            experiment-disable-some-deletes -> origin/experiment-disable-some-deletes
1209:  * [new branch]            experiment-hardcode-counters-to-zero -> origin/experiment-hardcode-counters-to-zero
1210:  * [new branch]            experiment-no-txs           -> origin/experiment-no-txs
1211:  * [new branch]            experiment-status-tooltip   -> origin/experiment-status-tooltip
1212:  * [new branch]            experiment-with-two-branches -> origin/experiment-with-two-branches
1213:  * [new branch]            experimental_moveitem       -> origin/experimental_moveitem
1214:  * [new branch]            experimient-no-counts       -> origin/experimient-no-counts
1215:  * [new branch]            expiredcertstool            -> origin/expiredcertstool
1216:  * [new branch]            express-vpn-win             -> origin/express-vpn-win
1217:  * [new branch]            extra-dep-logs              -> origin/extra-dep-logs
1218:  * [new branch]            f84ee4c5f4                  -> origin/f84ee4c5f4
1219:  * [new branch]            faf-doc-clarification       -> origin/faf-doc-clarification
1220:  * [new branch]            failing-test                -> origin/failing-test
1221:  * [new branch]            faq-updates-2026-06         -> origin/faq-updates-2026-06
...

1260:  * [new branch]            feature-hydrant-ca          -> origin/feature-hydrant-ca
1261:  * [new branch]            feature-idp-byod            -> origin/feature-idp-byod
1262:  * [new branch]            feature-orbit-find          -> origin/feature-orbit-find
1263:  * [new branch]            feature-prioritization      -> origin/feature-prioritization
1264:  * [new branch]            feature-v4.44.1-live-queries -> origin/feature-v4.44.1-live-queries
1265:  * [new branch]            feature-windows-mdm-policy-extraction -> origin/feature-windows-mdm-policy-extraction
1266:  * [new branch]            feature/add-blank-to-osquer-link -> origin/feature/add-blank-to-osquer-link
1267:  * [new branch]            feature/fleet-macos-password-sync -> origin/feature/fleet-macos-password-sync
1268:  * [new branch]            feature_14722-activity-feed-webhooks -> origin/feature_14722-activity-feed-webhooks
1269:  * [new branch]            feature_18115-crit-vuln-issues -> origin/feature_18115-crit-vuln-issues
1270:  * [new branch]            feature_19010-ipad-ios-lock-wipe-backend-changes -> origin/feature_19010-ipad-ios-lock-wipe-backend-changes
1271:  * [new branch]            feature_22078               -> origin/feature_22078
1272:  * [new branch]            fix                         -> origin/fix
1273:  * [new branch]            fix-35118-cis-win10-v4      -> origin/fix-35118-cis-win10-v4
1274:  * [new branch]            fix-4.84.4-k8s              -> origin/fix-4.84.4-k8s
1275:  * [new branch]            fix-40083-failed-install-retries -> origin/fix-40083-failed-install-retries
1276:  * [new branch]            fix-41290-vpp-added-status  -> origin/fix-41290-vpp-added-status
1277:  * [new branch]            fix-41337-save-env-secrets-dry-run -> origin/fix-41337-save-env-secrets-dry-run
1278:  * [new branch]            fix-43623-fma-patch-policy-gitops -> origin/fix-43623-fma-patch-policy-gitops
1279:  * [new branch]            fix-44199-embedded-app-bundles -> origin/fix-44199-embedded-app-bundles
1280:  * [new branch]            fix-44325-gitops-mode-tooltips -> origin/fix-44325-gitops-mode-tooltips
1281:  * [new branch]            fix-android-unenroll-activities -> origin/fix-android-unenroll-activities
1282:  * [new branch]            fix-blockquotes-google-groups -> origin/fix-blockquotes-google-groups
1283:  * [new branch]            fix-ca-verdict-spoof-16386  -> origin/fix-ca-verdict-spoof-16386
1284:  * [new branch]            fix-case-in-deploy-config-docs -> origin/fix-case-in-deploy-config-docs
1285:  * [new branch]            fix-cert-details-modal      -> origin/fix-cert-details-modal
1286:  * [new branch]            fix-checkerboard-scroll-to-right -> origin/fix-checkerboard-scroll-to-right
1287:  * [new branch]            fix-checkerboard-tooltip-nowrap -> origin/fix-checkerboard-tooltip-nowrap
1288:  * [new branch]            fix-cloudflare-warp-fma-output-json -> origin/fix-cloudflare-warp-fma-output-json
1289:  * [new branch]            fix-codeql-ci-error         -> origin/fix-codeql-ci-error
1290:  * [new branch]            fix-colima                  -> origin/fix-colima
1291:  * [new branch]            fix-color-for-mobile-sticky-nav -> origin/fix-color-for-mobile-sticky-nav
1292:  * [new branch]            fix-conditional-access-observer-authz -> origin/fix-conditional-access-observer-authz
1293:  * [new branch]            fix-conflict-in-feature_19010-ipad-ios-lock-wipe -> origin/fix-conflict-in-feature_19010-ipad-ios-lock-wipe
1294:  * [new branch]            fix-contrib-docs            -> origin/fix-contrib-docs
1295:  * [new branch]            fix-cve-2026-2792-firefox-esr -> origin/fix-cve-2026-2792-firefox-esr
1296:  * [new branch]            fix-cve-validate-enrichment-canary -> origin/fix-cve-validate-enrichment-canary
1297:  * [new branch]            fix-docker-cleanup-quay-nonfatal -> origin/fix-docker-cleanup-quay-nonfatal
1298:  * [new branch]            fix-docker-publish          -> origin/fix-docker-publish
1299:  * [new branch]            fix-dogfood-workstation     -> origin/fix-dogfood-workstation
1300:  * [new branch]            fix-embedded-bundle-titles-44199 -> origin/fix-embedded-bundle-titles-44199
1301:  * [new branch]            fix-firefox-cve-2026-2792   -> origin/fix-firefox-cve-2026-2792
1302:  * [new branch]            fix-firefox-fma-conflict-error-msg -> origin/fix-firefox-fma-conflict-error-msg
1303:  * [new branch]            fix-flakey-orbit-test       -> origin/fix-flakey-orbit-test
...

1310:  * [new branch]            fix-instability-ubuntu-latest -> origin/fix-instability-ubuntu-latest
1311:  * [new branch]            fix-ios-ipados-enrollment-label-42721 -> origin/fix-ios-ipados-enrollment-label-42721
1312:  * [new branch]            fix-list-sw-permissions     -> origin/fix-list-sw-permissions
1313:  * [new branch]            fix-mdm-enrolled-webhook    -> origin/fix-mdm-enrolled-webhook
1314:  * [new branch]            fix-mdm-redirect            -> origin/fix-mdm-redirect
1315:  * [new branch]            fix-mdm-url-truncation      -> origin/fix-mdm-url-truncation
1316:  * [new branch]            fix-missing-test-schema-update -> origin/fix-missing-test-schema-update
1317:  * [new branch]            fix-modernize               -> origin/fix-modernize
1318:  * [new branch]            fix-no-space-left-on-device-failure -> origin/fix-no-space-left-on-device-failure
1319:  * [new branch]            fix-notarization            -> origin/fix-notarization
1320:  * [new branch]            fix-orbit-notarization      -> origin/fix-orbit-notarization
1321:  * [new branch]            fix-orbit-nudge-test-mdm-connection-fidelity -> origin/fix-orbit-nudge-test-mdm-connection-fidelity
1322:  * [new branch]            fix-os-settings-name-col-truncation -> origin/fix-os-settings-name-col-truncation
1323:  * [new branch]            fix-os-settings-underline-descender-clip -> origin/fix-os-settings-underline-descender-clip
1324:  * [new branch]            fix-pricing-more-info-icon-documentationurl -> origin/fix-pricing-more-info-icon-documentationurl
1325:  * [new branch]            fix-receive-from-github-error -> origin/fix-receive-from-github-error
1326:  * [new branch]            fix-sandbox-local           -> origin/fix-sandbox-local
...

1340:  * [new branch]            fix-ui-typo-fleet-maintained-empty -> origin/fix-ui-typo-fleet-maintained-empty
1341:  * [new branch]            fix-vpp-edit-fleet-desktop-message -> origin/fix-vpp-edit-fleet-desktop-message
1342:  * [new branch]            fix-whatsapp-version-check  -> origin/fix-whatsapp-version-check
1343:  * [new branch]            fix-win-os-version          -> origin/fix-win-os-version
1344:  * [new branch]            fix_14825                   -> origin/fix_14825
1345:  * [new branch]            fixes-on-minor-fleet-v4.54.0 -> origin/fixes-on-minor-fleet-v4.54.0
1346:  * [new branch]            fixes-plus-4.35.1           -> origin/fixes-plus-4.35.1
1347:  * [new branch]            flaky-tests-nov-6           -> origin/flaky-tests-nov-6
1348:  * [new branch]            fleet-desktop-linux-browser -> origin/fleet-desktop-linux-browser
1349:  * [new branch]            fleet-desktop-version       -> origin/fleet-desktop-version
1350:  * [new branch]            fleet-mdm-server-url        -> origin/fleet-mdm-server-url
1351:  * [new branch]            fleet-multiple-abm-vpp-proposal -> origin/fleet-multiple-abm-vpp-proposal
1352:  * [new branch]            fleet-premium-users-usage-statistics -> origin/fleet-premium-users-usage-statistics
1353:  * [new branch]            fleet-release-infra         -> origin/fleet-release-infra
1354:  * [new branch]            fleet-server-config-1817    -> origin/fleet-server-config-1817
1355:  * [new branch]            fleet-server-log-request-errors -> origin/fleet-server-log-request-errors
1356:  * [new branch]            fleet-ship-rebuild          -> origin/fleet-ship-rebuild
...

2360:  * [new branch]            hotfix-failing-tests        -> origin/hotfix-failing-tests
2361:  * [new branch]            hotfix-query-update         -> origin/hotfix-query-update
2362:  * [new branch]            hotfix-revert-sofa-tables   -> origin/hotfix-revert-sofa-tables
2363:  * [new branch]            hotfix-v4.67.2-migration    -> origin/hotfix-v4.67.2-migration
2364:  * [new branch]            hotfix-v4.76.1              -> origin/hotfix-v4.76.1
2365:  * [new branch]            hover-gravatar              -> origin/hover-gravatar
2366:  * [new branch]            hughestaylor-patch-1        -> origin/hughestaylor-patch-1
2367:  * [new branch]            hughestaylor-patch-1-1      -> origin/hughestaylor-patch-1-1
2368:  * [new branch]            ignore-fleetctl-vulnerabilities -> origin/ignore-fleetctl-vulnerabilities
2369:  * [new branch]            improve-flakey-test         -> origin/improve-flakey-test
2370:  * [new branch]            improve-prometheus-metrics  -> origin/improve-prometheus-metrics
2371:  * [new branch]            improve-settings-subnav     -> origin/improve-settings-subnav
2372:  * [new branch]            include-mnt-in-gads-metric  -> origin/include-mnt-in-gads-metric
2373:  * [new branch]            increase-goreleaser-timeout-to-60m -> origin/increase-goreleaser-timeout-to-60m
2374:  * [new branch]            ingress-gateway-support     -> origin/ingress-gateway-support
2375:  * [new branch]            insert-software-installers-retry-error -> origin/insert-software-installers-retry-error
2376:  * [new branch]            install-all-recently-installed -> origin/install-all-recently-installed
...

2381:  * [new branch]            ireedy-patch-2              -> origin/ireedy-patch-2
2382:  * [new branch]            ireedy-patch-3              -> origin/ireedy-patch-3
2383:  * [new branch]            irena-deebradelo            -> origin/irena-deebradelo
2384:  * [new branch]            irena-handbook-edit         -> origin/irena-handbook-edit
2385:  * [new branch]            irena-test-with-john        -> origin/irena-test-with-john
2386:  * [new branch]            irenareedy-event-process    -> origin/irenareedy-event-process
2387:  * [new branch]            irenareedy-patch-1          -> origin/irenareedy-patch-1
2388:  * [new branch]            irenareedy-patch-2          -> origin/irenareedy-patch-2
2389:  * [new branch]            irenareedy-patch-4          -> origin/irenareedy-patch-4
2390:  * [new branch]            irenareedy-thumbtack-case-study -> origin/irenareedy-thumbtack-case-study
2391:  * [new branch]            iso-27001-compliance        -> origin/iso-27001-compliance
2392:  * [new branch]            iso42001-ai-discovery-inventory -> origin/iso42001-ai-discovery-inventory
2393:  * [new branch]            issue-11545-my-device-dep-modal -> origin/issue-11545-my-device-dep-modal
2394:  * [new branch]            issue-2716-specify-query-platforms -> origin/issue-2716-specify-query-platforms
2395:  * [new branch]            issue-3271-rate-limit-distributed-writes -> origin/issue-3271-rate-limit-distributed-writes
2396:  * [new branch]            issue-4361-mail-change-should-error -> origin/issue-4361-mail-change-should-error
2397:  * [new branch]            issue-conf-1968-delete-uninstalled-software-from-main -> origin/issue-conf-1968-delete-uninstalled-software-from-main
...

2604:  * [new branch]            melpike-api-default-fleet-windows-41787 -> origin/melpike-api-default-fleet-windows-41787
2605:  * [new branch]            melpike-api-device-url-43895 -> origin/melpike-api-device-url-43895
2606:  * [new branch]            melpike-api-minimum-version-39085 -> origin/melpike-api-minimum-version-39085
2607:  * [new branch]            melpike-api-py-script-41470 -> origin/melpike-api-py-script-41470
2608:  * [new branch]            melpike-api-windows-managed-account-43488 -> origin/melpike-api-windows-managed-account-43488
2609:  * [new branch]            melpike-audit-log-account-provisioning-45524 -> origin/melpike-audit-log-account-provisioning-45524
2610:  * [new branch]            melpike-audit-log-mdm-cmd-45021 -> origin/melpike-audit-log-mdm-cmd-45021
2611:  * [new branch]            melpike-audit-recovery-lock-password-rotate -> origin/melpike-audit-recovery-lock-password-rotate
2612:  * [new branch]            melpike-byod-wipe-lock-23242 -> origin/melpike-byod-wipe-lock-23242
2613:  * [new branch]            melpike-byod-wipe-lock-23242-1 -> origin/melpike-byod-wipe-lock-23242-1
2614:  * [new branch]            melpike-byod-wipe-lock-api-23242 -> origin/melpike-byod-wipe-lock-api-23242
2615:  * [new branch]            melpike-byod-wipe-lock-yaml-23242 -> origin/melpike-byod-wipe-lock-yaml-23242
2616:  * [new branch]            melpike-combine-guides-30674 -> origin/melpike-combine-guides-30674
2617:  * [new branch]            melpike-create-managed-local-account-guide-37141 -> origin/melpike-create-managed-local-account-guide-37141
2618:  * [new branch]            melpike-default-fleet-windows-41787 -> origin/melpike-default-fleet-windows-41787
2619:  * [new branch]            melpike-dep-error-messaging-43916 -> origin/melpike-dep-error-messaging-43916
2620:  * [new branch]            melpike-doc-deploy-sw-41470 -> origin/melpike-doc-deploy-sw-41470
...

2767:  * [new branch]            mna-doc-change-api-structure -> origin/mna-doc-change-api-structure
2768:  * [new branch]            mna-experiment-macos-profiles-uuid -> origin/mna-experiment-macos-profiles-uuid
2769:  * [new branch]            mna-fix-22558-windows-installer-stuck-pending -> origin/mna-fix-22558-windows-installer-stuck-pending
2770:  * [new branch]            mna-fix-duplicate-lock-unlock-activity -> origin/mna-fix-duplicate-lock-unlock-activity
2771:  * [new branch]            mna-fix-failing-tests       -> origin/mna-fix-failing-tests
2772:  * [new branch]            mna-fix-flaky-integration-test -> origin/mna-fix-flaky-integration-test
2773:  * [new branch]            mna-fix-oom-fleetctl-test   -> origin/mna-fix-oom-fleetctl-test
2774:  * [new branch]            mna-loadtest-enroll-host-limit -> origin/mna-loadtest-enroll-host-limit
2775:  * [new branch]            mna-orbit-node-key          -> origin/mna-orbit-node-key
2776:  * [new branch]            mna-revert-change-to-autogenerated-activities-doc -> origin/mna-revert-change-to-autogenerated-activities-doc
2777:  * [new branch]            mna-temp-osquery-perf-loadtest -> origin/mna-temp-osquery-perf-loadtest
2778:  * [new branch]            mna11997                    -> origin/mna11997
2779:  * [new branch]            mock-associate-assets-endpoint -> origin/mock-associate-assets-endpoint
2780:  * [new branch]            monitoring-test             -> origin/monitoring-test
2781:  * [new branch]            more-conditional-access-api-updates -> origin/more-conditional-access-api-updates
2782:  * [new branch]            more-fd-errors              -> origin/more-fd-errors
2783:  * [new branch]            move-conditional-access-script-to-testing-qa -> origin/move-conditional-access-script-to-testing-qa
...

3349:  * [new branch]            sgress454/34259-end-user-auth-setup-backend -> origin/sgress454/34259-end-user-auth-setup-backend
3350:  * [new branch]            sgress454/34528-end-user-auth-setup-agent -> origin/sgress454/34528-end-user-auth-setup-agent
3351:  * [new branch]            sgress454/35376             -> origin/sgress454/35376
3352:  * [new branch]            sgress454/35452             -> origin/sgress454/35452
3353:  * [new branch]            sgress454/37127-open-macos-end-user-auth-window -> origin/sgress454/37127-open-macos-end-user-auth-window
3354:  * [new branch]            sgress454/38063-skeleton-server -> origin/sgress454/38063-skeleton-server
3355:  * [new branch]            sgress454/39344-rename-teams-to-fleet-all-changes -> origin/sgress454/39344-rename-teams-to-fleet-all-changes
3356:  * [new branch]            sgress454/39344-rename-teams-to-fleet-api-changes -> origin/sgress454/39344-rename-teams-to-fleet-api-changes
3357:  * [new branch]            sgress454/40642-update-jit-saml-prefix -> origin/sgress454/40642-update-jit-saml-prefix
3358:  * [new branch]            sgress454/43482-re-pin      -> origin/sgress454/43482-re-pin
3359:  * [new branch]            sgress454/44077-disable-datasets-backend -> origin/sgress454/44077-disable-datasets-backend
3360:  * [new branch]            sgress454/44077-disable-datasets-docs -> origin/sgress454/44077-disable-datasets-docs
3361:  * [new branch]            sgress454/44077-disable-datasets-frontend -> origin/sgress454/44077-disable-datasets-frontend
3362:  * [new branch]            sgress454/45290-drop-mobile-from-charting -> origin/sgress454/45290-drop-mobile-from-charting
3363:  * [new branch]            sgress454/add-vex-for-cve-2026-23517 -> origin/sgress454/add-vex-for-cve-2026-23517
3364:  * [new branch]            sgress454/adr-for-error-codes -> origin/sgress454/adr-for-error-codes
3365:  * [new branch]            sgress454/adr-refactor-list-hosts -> origin/sgress454/adr-refactor-list-hosts
...

3417:  * [new branch]            software-titles-loadtest-2  -> origin/software-titles-loadtest-2
3418:  * [new branch]            solarized-theme             -> origin/solarized-theme
3419:  * [new branch]            solutions-folder            -> origin/solutions-folder
3420:  * [new branch]            sort-seen-hosts-before-inserting -> origin/sort-seen-hosts-before-inserting
3421:  * [new branch]            spalmesano0-patch-2         -> origin/spalmesano0-patch-2
3422:  * [new branch]            spike-fleet-lint-plugin     -> origin/spike-fleet-lint-plugin
3423:  * [new branch]            spike-ui-permissions-pattern -> origin/spike-ui-permissions-pattern
3424:  * [new branch]            spokanemac-add-passcode-ddm-profile -> origin/spokanemac-add-passcode-ddm-profile
3425:  * [new branch]            spokanemac-dogfood-additional-apps -> origin/spokanemac-dogfood-additional-apps
3426:  * [new branch]            spokanemac-handbook-release-article -> origin/spokanemac-handbook-release-article
3427:  * [new branch]            spokanemac-macdevops-conference-post -> origin/spokanemac-macdevops-conference-post
3428:  * [new branch]            spokanemac-meetup-template  -> origin/spokanemac-meetup-template
3429:  * [new branch]            spokanemac-migrating-fleetdm-from-dogfood-to-terraform-on-aws -> origin/spokanemac-migrating-fleetdm-from-dogfood-to-terraform-on-aws
3430:  * [new branch]            spokanemac-release-article-issue-template -> origin/spokanemac-release-article-issue-template
3431:  * [new branch]            step4-improvements          -> origin/step4-improvements
3432:  * [new branch]            store-query-execution-and-ingestion-errors -> origin/store-query-execution-and-ingestion-errors
3433:  * [new branch]            support-breaking-osquery-downgrades -> origin/support-breaking-osquery-downgrades
...

3501:  * [new branch]            ui-self-service-sg-5-21     -> origin/ui-self-service-sg-5-21
3502:  * [new branch]            unauth-installers           -> origin/unauth-installers
3503:  * [new branch]            uniform-brex-spending-limit -> origin/uniform-brex-spending-limit
3504:  * [new branch]            untx-software               -> origin/untx-software
3505:  * [new branch]            upcoming-activities-mdm-commands -> origin/upcoming-activities-mdm-commands
3506:  * [new branch]            upcoming-commands           -> origin/upcoming-commands
3507:  * [new branch]            update-1password-and-safari-policy-versions-2601200025 -> origin/update-1password-and-safari-policy-versions-2601200025
3508:  * [new branch]            update-1password-and-safari-policy-versions-2601200610 -> origin/update-1password-and-safari-policy-versions-2601200610
3509:  * [new branch]            update-1password-and-safari-policy-versions-2602261818 -> origin/update-1password-and-safari-policy-versions-2602261818
3510:  * [new branch]            update-1password-and-safari-policy-versions-2603101819 -> origin/update-1password-and-safari-policy-versions-2603101819
3511:  * [new branch]            update-1password-and-safari-policy-versions-2604080037 -> origin/update-1password-and-safari-policy-versions-2604080037
3512:  * [new branch]            update-1password-and-safari-policy-versions-2604080637 -> origin/update-1password-and-safari-policy-versions-2604080637
3513:  * [new branch]            update-Cloudflare-WARP-FMA-with-UpgradeCode -> origin/update-Cloudflare-WARP-FMA-with-UpgradeCode
3514:  * [new branch]            update-article-format       -> origin/update-article-format
3515:  * [new branch]            update-bug-report-template  -> origin/update-bug-report-template
3516:  * [new branch]            update-build-script-error-message -> origin/update-build-script-error-message
3517:  * [new branch]            update-cancel-and-done-links -> origin/update-cancel-and-done-links
...

3597:  * [new branch]            update-spec-story-skill     -> origin/update-spec-story-skill
3598:  * [new branch]            update-testing-qa-apps-2511191525 -> origin/update-testing-qa-apps-2511191525
3599:  * [new branch]            update-tuf-keys             -> origin/update-tuf-keys
3600:  * [new branch]            update-tuf-md               -> origin/update-tuf-md
3601:  * [new branch]            update-usage-statistics-mobile-devices -> origin/update-usage-statistics-mobile-devices
3602:  * [new branch]            update-user-password-length-validation-test -> origin/update-user-password-length-validation-test
3603:  * [new branch]            update-vex-statements       -> origin/update-vex-statements
3604:  * [new branch]            update-why-this-way         -> origin/update-why-this-way
3605:  * [new branch]            upgrade-eslint              -> origin/upgrade-eslint
3606:  * [new branch]            upgrade-go                  -> origin/upgrade-go
3607:  * [new branch]            upgrade-typescript          -> origin/upgrade-typescript
3608:  * [new branch]            upload-msiexec-install-log  -> origin/upload-msiexec-install-log
3609:  * [new branch]            usage-stats-mobile-devices-count -> origin/usage-stats-mobile-devices-count
3610:  * [new branch]            use-dockerhub-creds         -> origin/use-dockerhub-creds
3611:  * [new branch]            use-software-name-helper    -> origin/use-software-name-helper
3612:  * [new branch]            user-channel-error          -> origin/user-channel-error
3613:  * [new branch]            users-table-experiment      -> origin/users-table-experiment
...

3643:  * [new branch]            victor/36202-bootstrap-enroll -> origin/victor/36202-bootstrap-enroll
3644:  * [new branch]            victor/36452-activity-bounded-context -> origin/victor/36452-activity-bounded-context
3645:  * [new branch]            victor/36453-activity-scaffold -> origin/victor/36453-activity-scaffold
3646:  * [new branch]            victor/36793-logging        -> origin/victor/36793-logging
3647:  * [new branch]            victor/37241-archtest       -> origin/victor/37241-archtest
3648:  * [new branch]            victor/37806-fleet-activities -> origin/victor/37806-fleet-activities
3649:  * [new branch]            victor/38607-otel-logs      -> origin/victor/38607-otel-logs
3650:  * [new branch]            victor/38889-slog-mysql     -> origin/victor/38889-slog-mysql
3651:  * [new branch]            victor/39370-emacs-false-positive -> origin/victor/39370-emacs-false-positive
3652:  * [new branch]            victor/41374-backout        -> origin/victor/41374-backout
3653:  * [new branch]            victor/42318-bitlocker-pin  -> origin/victor/42318-bitlocker-pin
3654:  * [new branch]            victor/42843-esp-tracking-reference -> origin/victor/42843-esp-tracking-reference
3655:  * [new branch]            victor/44599-unknown-nodekey-prob -> origin/victor/44599-unknown-nodekey-prob
3656:  * [new branch]            victor/44802-mysql-conns-tunable -> origin/victor/44802-mysql-conns-tunable
3657:  * [new branch]            victor/45491-repro          -> origin/victor/45491-repro
3658:  * [new branch]            victor/46387-windows-mdm-enrollment-auth-error -> origin/victor/46387-windows-mdm-enrollment-auth-error
3659:  * [new branch]            victor/46387-windows-mdm-federated-discovery -> origin/victor/46387-windows-mdm-federated-discovery
...

3768:  * [new branch]            wesite-fix-sales-rituals    -> origin/wesite-fix-sales-rituals
3769:  * [new branch]            willmayhone88-patch-1       -> origin/willmayhone88-patch-1
3770:  * [new branch]            win-fma-deepl               -> origin/win-fma-deepl
3771:  * [new branch]            win-fma-evernote            -> origin/win-fma-evernote
3772:  * [new branch]            win-fma-goland              -> origin/win-fma-goland
3773:  * [new branch]            win-fma-testing             -> origin/win-fma-testing
3774:  * [new branch]            win-fma-vnc-apps            -> origin/win-fma-vnc-apps
3775:  * [new branch]            win-mdm-loadtest            -> origin/win-mdm-loadtest
3776:  * [new branch]            windows-baseline            -> origin/windows-baseline
3777:  * [new branch]            windows-end-user-experience-labels -> origin/windows-end-user-experience-labels
3778:  * [new branch]            windows-firefox-doh-script  -> origin/windows-firefox-doh-script
3779:  * [new branch]            windows-mdm-autopilot       -> origin/windows-mdm-autopilot
3780:  * [new branch]            windows-mdm-c-poc           -> origin/windows-mdm-c-poc
3781:  * [new branch]            windows-mdm-docs-auto-enroll -> origin/windows-mdm-docs-auto-enroll
3782:  * [new branch]            windows-mdm-load-test       -> origin/windows-mdm-load-test
3783:  * [new branch]            windows_enable_and_configure-error-message -> origin/windows_enable_and_configure-error-message
3784:  * [new branch]            workstations-to-use-edge-channels -> origin/workstations-to-use-edge-channels
...

3796:  * [new branch]            zayhanlon-patch-1           -> origin/zayhanlon-patch-1
3797:  * [new branch]            zenity-execuser             -> origin/zenity-execuser
3798:  * [new branch]            zhumo-patch-1               -> origin/zhumo-patch-1
3799:  * [new branch]            zhumo-patch-2               -> origin/zhumo-patch-2
3800:  * [new branch]            zhumo-patch-3               -> origin/zhumo-patch-3
3801:  * [new branch]            zhumo-patch-4               -> origin/zhumo-patch-4
3802:  * [new branch]            zhumo-patch-5               -> origin/zhumo-patch-5
3803:  * [new branch]            zhumo-patch-6               -> origin/zhumo-patch-6
3804:  * [new branch]            zhumo-patch-7               -> origin/zhumo-patch-7
3805:  * [new branch]            zwass-actions-reminders     -> origin/zwass-actions-reminders
3806:  * [new branch]            zwass-improve-macos-cpe     -> origin/zwass-improve-macos-cpe
3807:  * [new branch]            zwass-patch-1               -> origin/zwass-patch-1
3808:  * [new branch]            zwass-patch-2               -> origin/zwass-patch-2
3809:  * [new branch]            zwinnerman-fixup            -> origin/zwinnerman-fixup
3810:  * [new branch]            zwinnerman-livequery-tracing -> origin/zwinnerman-livequery-tracing
3811:  * [new branch]            zwinnerman-redis-error-handling -> origin/zwinnerman-redis-error-handling
3812:  * [new branch]            zwinnerman-test             -> origin/zwinnerman-test
...

4542:  check-latest: false
4543:  token: ***
4544:  cache: true
4545:  env:
4546:  GH_TOKEN: ***
4547:  LOG_LEVEL: info
4548:  ##[endgroup]
4549:  Setup go version spec 1.26.4
4550:  Found in cache @ C:\hostedtoolcache\windows\go\1.26.4\x64
4551:  Added go to the path
4552:  Successfully set up Go version 1.26.4
4553:  [command]C:\hostedtoolcache\windows\go\1.26.4\x64\bin\go.exe env GOMODCACHE
4554:  [command]C:\hostedtoolcache\windows\go\1.26.4\x64\bin\go.exe env GOCACHE
4555:  C:\Users\runneradmin\go\pkg\mod
4556:  C:\Users\runneradmin\AppData\Local\go-build
4557:  ##[warning]Restore cache failed: Dependencies file is not found in D:\a\fleet\fleet. Supported file pattern: go.mod
4558:  go version go1.26.4 windows/amd64
...

4652:  - eclipse-temurin-jre-8/windows
4653:  - git-extensions/windows
4654:  - gnupg/windows
4655:  - google-earth-pro/windows
4656:  - gpg4win/windows
4657:  - logitech-unifying-software/windows
4658:  - logitune/windows
4659:  - rtools/windows
4660:  - sonicwall-netextender/windows
4661:  - spyder/windows
4662:  - tightvnc/windows
4663:  - treesize-free/windows
4664:  - windirstat/windows
4665:  - yarn/windows
4666:  - zoom-outlook-plugin/windows
4667:  ##[group]Run # Default to no changes if detection step failed or didn't set output
4668:  �[36;1m# Default to no changes if detection step failed or didn't set output�[0m
4669:  �[36;1m$hasChanges = "true"�[0m
...

4847:  �[36;1mWrite-Host "Filtering apps.json for slugs: $windowsSlugsJson"�[0m
4848:  �[36;1m�[0m
4849:  �[36;1m$windowsSlugsFile = Join-Path $env:TEMP "windows-slugs-$(New-Guid).json"�[0m
4850:  �[36;1mSet-Content -Path $windowsSlugsFile -Value $windowsSlugsJson -Encoding ascii -NoNewline�[0m
4851:  �[36;1m# Use forward slashes so Git Bash reads the path reliably (it reads this arg as a file).�[0m
4852:  �[36;1m$windowsSlugsFileForBash = $windowsSlugsFile -replace '\\', '/'�[0m
4853:  �[36;1m�[0m
4854:  �[36;1m# Backup original apps.json�[0m
4855:  �[36;1mCopy-Item -Path "ee\maintained-apps\outputs\apps.json" -Destination "ee\maintained-apps\outputs\apps.json.backup"�[0m
4856:  �[36;1m�[0m
4857:  �[36;1m# Create filtered apps.json�[0m
4858:  �[36;1m# Use a fixed path for the temp file to avoid issues with bash�[0m
4859:  �[36;1m$filteredAppsJson = Join-Path $env:TEMP "filtered-apps-$(New-Guid).json"�[0m
4860:  �[36;1mbash .github/scripts/filter-apps-json.sh "$windowsSlugsFileForBash" "$filteredAppsJson"�[0m
4861:  �[36;1mif ($LASTEXITCODE -ne 0) {�[0m
4862:  �[36;1m  Write-Host "Error: filter-apps-json.sh failed with exit code $LASTEXITCODE"�[0m
4863:  �[36;1m  exit 1�[0m
4864:  �[36;1m}�[0m
4865:  �[36;1m�[0m
4866:  �[36;1m# Verify the filtered file was created�[0m
4867:  �[36;1mif (-not (Test-Path $filteredAppsJson)) {�[0m
4868:  �[36;1m  Write-Host "Error: Filtered apps.json was not created at $filteredAppsJson"�[0m
4869:  �[36;1m  exit 1�[0m
...

4974:  go: downloading github.com/secDre4mer/pkcs7 v0.0.0-20240322103146-665324a4461d
4975:  go: downloading go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0
4976:  go: downloading golang.org/x/oauth2 v0.35.0
4977:  go: downloading github.com/getsentry/sentry-go v0.18.0
4978:  go: downloading go.elastic.co/apm/v2 v2.7.0
4979:  go: downloading go.opentelemetry.io/otel v1.43.0
4980:  go: downloading go.opentelemetry.io/otel/metric v1.43.0
4981:  go: downloading go.opentelemetry.io/otel/trace v1.43.0
4982:  go: downloading github.com/aws/aws-sdk-go-v2/config v1.32.12
4983:  go: downloading github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.35.8
4984:  go: downloading github.com/aws/aws-sdk-go-v2 v1.41.5
4985:  go: downloading github.com/spf13/cobra v1.9.1
4986:  go: downloading github.com/spf13/viper v1.20.1
4987:  go: downloading github.com/go-kit/kit v0.12.0
4988:  go: downloading github.com/smallstep/pkcs7 v0.0.0-20240723090913-5e2c6a136dfa
4989:  go: downloading github.com/hashicorp/go-multierror v1.1.1
4990:  go: downloading github.com/micromdm/plist v0.2.3-0.20260123201933-667adaf87d87
4991:  go: downloading github.com/MicahParks/jwkset v0.11.0
4992:  go: downloading github.com/golang-jwt/jwt/v4 v4.5.2
4993:  go: downloading github.com/WatchBeam/clock v0.0.0-20170901150240-b08e6b4da7ea
4994:  go: downloading github.com/mattn/go-isatty v0.0.20
4995:  go: downloading go.opentelemetry.io/otel/sdk v1.43.0
4996:  go: downloading github.com/andygrunwald/go-jira v1.16.0
4997:  go: downloading github.com/cenkalti/backoff/v4 v4.3.0
4998:  go: downloading github.com/nukosuke/go-zendesk v0.13.1
4999:  go: downloading github.com/cenkalti/backoff v2.2.1+incompatible
5000:  go: downloading github.com/igm/sockjs-go/v3 v3.0.2
5001:  go: downloading gopkg.in/yaml.v2 v2.4.0
5002:  go: downloading github.com/oschwald/maxminddb-golang v1.10.0
5003:  go: downloading github.com/felixge/httpsnoop v1.0.4
5004:  go: downloading github.com/elastic/go-sysinfo v1.11.2
5005:  go: downloading github.com/pkg/errors v0.9.1
5006:  go: downloading go.elastic.co/fastjson v1.1.0
...

5062:  go: downloading github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8
5063:  go: downloading cloud.google.com/go/iam v1.5.3
5064:  go: downloading go.opencensus.io v0.24.0
5065:  go: downloading golang.org/x/sync v0.21.0
5066:  go: downloading google.golang.org/grpc v1.79.3
5067:  go: downloading google.golang.org/protobuf v1.36.11
5068:  go: downloading github.com/micromdm/nanolib v0.2.0
5069:  go: downloading github.com/nats-io/nkeys v0.4.15
5070:  go: downloading github.com/nats-io/nuid v1.0.1
5071:  go: downloading cloud.google.com/go/auth v0.18.2
5072:  go: downloading cloud.google.com/go/auth/oauth2adapt v0.2.8
5073:  go: downloading cloud.google.com/go/compute/metadata v0.9.0
5074:  go: downloading github.com/google/s2a-go v0.1.9
5075:  go: downloading github.com/go-logfmt/logfmt v0.5.1
5076:  go: downloading go.mozilla.org/pkcs7 v0.0.0-20210826202110-33d05740a352
5077:  go: downloading github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901
5078:  go: downloading github.com/elastic/go-windows v1.0.1
5079:  go: downloading cloud.google.com/go/pubsub/v2 v2.0.0
5080:  go: downloading google.golang.org/genproto/googleapis/rpc v0.0.0-20260319201613-d00831a3d3e7
5081:  go: downloading google.golang.org/genproto v0.0.0-20260128011058-8636f8732409
5082:  go: downloading github.com/googleapis/enterprise-certificate-proxy v0.3.12
5083:  go: downloading google.golang.org/genproto/googleapis/api v0.0.0-20260203192932-546029d2fa20
5084:  go: downloading go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0
5085:  time=level=INFO msg="GOOS environment variable is not set. Using system detected: 'windows'"
5086:  time=level=INFO msg="INSTALLATION_SEARCH_DIRECTORY environment variable is not set. Using default: 'C:\\Program Files'"
5087:  time=level=INFO msg="Validating app: AOMEI Backupper Standard (aomei-backupper-standard/windows)"
5088:  time=level=INFO msg=Downloading...
5089:  time=level=INFO msg="Executing install script..." app="AOMEI Backupper Standard"
5090:  time=level=WARN msg="no changes detected in C:\\Program Files directory after running application script." app="AOMEI Backupper Standard"
5091:  time=level=INFO msg="Looking for app: AOMEI Backupper Standard, version: 8.4.0.0" app="AOMEI Backupper Standard"
5092:  time=level=ERROR msg="App version '8.4.0.0' was not found by osquery" app="AOMEI Backupper Standard"
5093:  time=level=INFO msg="Validating app: iTunes (apple-itunes/windows)"
5094:  time=level=INFO msg=Downloading...
5095:  time=level=INFO msg="Executing install script..." app=iTunes
5096:  time=level=INFO msg="New application detected at: C:\\Program Files\\iTunes" app=iTunes
5097:  time=level=INFO msg="Looking for app: iTunes, version: 12.13.10.3" app=iTunes
5098:  time=level=INFO msg="Found app: 'iTunes' at C:\\Program Files\\iTunes\\, Version: 12.13.10.3" app=iTunes
5099:  time=level=INFO msg="Executing uninstall script for app..." app=iTunes
5100:  time=level=INFO msg="Looking for app: iTunes, version: 12.13.10.3" app=iTunes
5101:  time=level=INFO msg="Found app: 'iTunes' at C:\\Program Files\\iTunes\\, Version: 12.13.10.3" app=iTunes
5102:  time=level=ERROR msg="App still present after uninstall (expected no match for version '12.13.10.3' in programs)" app=iTunes
5103:  time=level=INFO msg="Validating app: Azure Data Studio (azure-data-studio/windows)"
5104:  time=level=INFO msg=Downloading...
5105:  time=level=INFO msg="Executing install script..." app="Azure Data Studio"
5106:  time=level=ERROR msg="Error executing install script: exit status 1" app="Azure Data Studio"
5107:  time=level=ERROR msg="Output: \n--------------------\n\n--------------------" app="Azure Data Studio"
5108:  time=level=INFO msg="New application detected at: C:\\Program Files\\Azure Data Studio" app="Azure Data Studio"
...

5135:  time=level=INFO msg="Executing uninstall script for app..." app="Eclipse Temurin JRE 8"
5136:  time=level=INFO msg="Looking for app: Eclipse Temurin JRE 8, version: 8.0.492.9" app="Eclipse Temurin JRE 8"
5137:  time=level=INFO msg="All checks passed for app: Eclipse Temurin JRE 8 (eclipse-temurin-jre-8/windows)"
5138:  time=level=INFO msg="Validating app: Git Extensions (git-extensions/windows)"
5139:  time=level=INFO msg=Downloading...
5140:  time=level=INFO msg="Executing install script..." app="Git Extensions"
5141:  time=level=INFO msg="New application detected at: C:\\Program Files\\GitExtensions" app="Git Extensions"
5142:  time=level=INFO msg="Looking for app: Git Extensions, version: 7.0.1.86" app="Git Extensions"
5143:  time=level=INFO msg="Found app: 'Git Extensions 7.0.1.86' at , Version: 7.0.1.86" app="Git Extensions"
5144:  time=level=INFO msg="Executing uninstall script for app..." app="Git Extensions"
5145:  time=level=INFO msg="Looking for app: Git Extensions, version: 7.0.1.86" app="Git Extensions"
5146:  time=level=INFO msg="All checks passed for app: Git Extensions (git-extensions/windows)"
5147:  time=level=INFO msg="Validating app: GNU Privacy Guard (gnupg/windows)"
5148:  time=level=INFO msg=Downloading...
5149:  time=level=INFO msg="Executing install script..." app="GNU Privacy Guard"
5150:  time=level=ERROR msg="Error executing install script: exit status 1" app="GNU Privacy Guard"
5151:  time=level=ERROR msg="Output: \n--------------------\n\n--------------------" app="GNU Privacy Guard"
5152:  time=level=INFO msg="New application detected at: C:\\Program Files\\GnuPG" app="GNU Privacy Guard"
5153:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5154:  time=level=INFO msg="Validating app: Google Earth Pro (google-earth-pro/windows)"
5155:  time=level=INFO msg=Downloading...
5156:  time=level=INFO msg="Executing install script..." app="Google Earth Pro"
5157:  time=level=WARN msg="no changes detected in C:\\Program Files directory after running application script." app="Google Earth Pro"
5158:  time=level=INFO msg="Looking for app: Google Earth Pro, version: 7.3.7.1155" app="Google Earth Pro"
5159:  time=level=INFO msg="Found app: 'Google Earth Pro' at , Version: 7.3.7.1155" app="Google Earth Pro"
5160:  time=level=INFO msg="Executing uninstall script for app..." app="Google Earth Pro"
5161:  time=level=INFO msg="Looking for app: Google Earth Pro, version: 7.3.7.1155" app="Google Earth Pro"
5162:  time=level=INFO msg="Found app: 'Google Earth Pro' at , Version: 7.3.7.1155" app="Google Earth Pro"
5163:  time=level=ERROR msg="App still present after uninstall (expected no match for version '7.3.7.1155' in programs)" app="Google Earth Pro"
5164:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5165:  time=level=INFO msg="Validating app: Gpg4win (gpg4win/windows)"
5166:  time=level=INFO msg=Downloading...
5167:  time=level=INFO msg="Executing install script..." app=Gpg4win
5168:  time=level=ERROR msg="Error executing install script: exit status 1" app=Gpg4win
5169:  time=level=ERROR msg="Output: \n--------------------\n\n--------------------" app=Gpg4win
5170:  time=level=INFO msg="New application detected at: C:\\Program Files\\Gpg4win" app=Gpg4win
5171:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5172:  time=level=WARN msg="failed to remove gpg4win-5.0.2.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gpg4win-5.0.2.exe: The process cannot access the file because it is being used by another process."
5173:  time=level=INFO msg="Validating app: Logitech Unifying Software (logitech-unifying-software/windows)"
5174:  time=level=INFO msg=Downloading...
5175:  time=level=INFO msg="Executing install script..." app="Logitech Unifying Software"
5176:  time=level=WARN msg="no changes detected in C:\\Program Files directory after running application script." app="Logitech Unifying Software"
5177:  time=level=INFO msg="Looking for app: Logitech Unifying Software, version: 2.52.33" app="Logitech Unifying Software"
5178:  time=level=INFO msg="Found app: 'Logitech Unifying Software 2.52' at C:\\Program Files\\Common Files\\LogiShrd\\Unifying, Version: 2.52.33" app="Logitech Unifying Software"
5179:  time=level=INFO msg="Executing uninstall script for app..." app="Logitech Unifying Software"
5180:  time=level=INFO msg="Looking for app: Logitech Unifying Software, version: 2.52.33" app="Logitech Unifying Software"
5181:  time=level=INFO msg="Found app: 'Logitech Unifying Software 2.52' at C:\\Program Files\\Common Files\\LogiShrd\\Unifying, Version: 2.52.33" app="Logitech Unifying Software"
5182:  time=level=ERROR msg="App still present after uninstall (expected no match for version '2.52.33' in programs)" app="Logitech Unifying Software"
5183:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5184:  time=level=WARN msg="failed to remove gpg4win-5.0.2.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gpg4win-5.0.2.exe: The process cannot access the file because it is being used by another process."
5185:  time=level=INFO msg="Validating app: Logi Tune (logitune/windows)"
5186:  time=level=INFO msg=Downloading...
5187:  time=level=INFO msg="Executing install script..." app="Logi Tune"
5188:  time=level=INFO msg="New application detected at: C:\\Program Files\\Logitech" app="Logi Tune"
5189:  time=level=INFO msg="Looking for app: Logi Tune, version: 3.13.138.0" app="Logi Tune"
5190:  time=level=INFO msg="Found app: 'Logi Tune' at , Version: 3.14.72.0" app="Logi Tune"
5191:  time=level=INFO msg="Found app: 'Logi Tune' at , Version: 3.14.72.0" app="Logi Tune"
5192:  time=level=ERROR msg="App version '3.13.138.0' was not found by osquery" app="Logi Tune"
5193:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5194:  time=level=WARN msg="failed to remove gpg4win-5.0.2.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gpg4win-5.0.2.exe: The process cannot access the file because it is being used by another process."
5195:  time=level=INFO msg="Validating app: Rtools (rtools/windows)"
5196:  time=level=INFO msg=Downloading...
5197:  time=level=INFO msg="Executing install script..." app=Rtools
5198:  time=level=ERROR msg="Error executing install script: exit status 1" app=Rtools
5199:  time=level=ERROR msg="Output: \n--------------------\n\n--------------------" app=Rtools
5200:  time=level=WARN msg="no changes detected in C:\\Program Files directory after running application script." app=Rtools
5201:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5202:  time=level=WARN msg="failed to remove gpg4win-5.0.2.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gpg4win-5.0.2.exe: The process cannot access the file because it is being used by another process."
5203:  time=level=WARN msg="failed to remove rtools45-6768-6492.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\rtools45-6768-6492.exe: Access is denied."
5204:  time=level=INFO msg="Validating app: SonicWall NetExtender (sonicwall-netextender/windows)"
5205:  time=level=INFO msg=Downloading...
5206:  time=level=INFO msg="Executing install script..." app="SonicWall NetExtender"
5207:  time=level=INFO msg="New application detected at: C:\\Program Files\\SonicWall" app="SonicWall NetExtender"
5208:  time=level=INFO msg="Looking for app: SonicWall NetExtender, version: 10.3.5" app="SonicWall NetExtender"
5209:  time=level=INFO msg="Found app: 'SonicWall NetExtender' at , Version: 10.3.5" app="SonicWall NetExtender"
5210:  time=level=INFO msg="Executing uninstall script for app..." app="SonicWall NetExtender"
5211:  time=level=INFO msg="Looking for app: SonicWall NetExtender, version: 10.3.5" app="SonicWall NetExtender"
5212:  time=level=WARN msg="failed to remove gnupg-w32-2.5.20_20260513.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gnupg-w32-2.5.20_20260513.exe: The process cannot access the file because it is being used by another process."
5213:  time=level=WARN msg="failed to remove gpg4win-5.0.2.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\gpg4win-5.0.2.exe: The process cannot access the file because it is being used by another process."
5214:  time=level=WARN msg="failed to remove rtools45-6768-6492.exe: unlinkat C:\\Users\\runneradmin\\AppData\\Local\\Temp\\fma-validate-1221187241\\rtools45-6768-6492.exe: Access is denied."
5215:  time=level=INFO msg="All checks passed for app: SonicWall NetExtender (sonicwall-netextender/windows)"
5216:  time=level=INFO msg="Validating app: Spyder (spyder/windows)"
5217:  time=level=INFO msg=Downloading...
5218:  time=level=INFO msg="Executing install script..." app=Spyder
5219:  time=level=WARN msg="no changes detected in C:\\Program Files directory after running application script." app=Spyder
5220:  time=level=INFO msg="Looking for app: Spyder, version: 6.1.4"...

@allenhouchins
allenhouchins removed their request for review July 6, 2026 13:22
…h-2026-06

# Conflicts:
#	ee/maintained-apps/inputs/winget/eclipse-temurin-jdk-11.json
#	ee/maintained-apps/inputs/winget/eclipse-temurin-jre-8.json
#	ee/maintained-apps/inputs/winget/windirstat.json
#	ee/maintained-apps/outputs/apps.json
#	ee/maintained-apps/outputs/eclipse-temurin-jdk-11/windows.json
#	ee/maintained-apps/outputs/eclipse-temurin-jre-8/windows.json
#	ee/maintained-apps/outputs/windirstat/windows.json
#	frontend/pages/SoftwarePage/components/icons/EclipseTemurinJdk11.tsx
#	frontend/pages/SoftwarePage/components/icons/EclipseTemurinJre8.tsx
#	frontend/pages/SoftwarePage/components/icons/Windirstat.tsx
#	frontend/pages/SoftwarePage/components/icons/index.ts
#	website/assets/images/app-icon-eclipse-temurin-jdk-11-60x60@2x.png
#	website/assets/images/app-icon-eclipse-temurin-jre-8-60x60@2x.png
#	website/assets/images/app-icon-windirstat-60x60@2x.png
Copilot AI review requested due to automatic review settings July 27, 2026 17:53
@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/aomei-backupper-standard/windows.json

=== Install // 34b42c0a -> 03d967ed ===

--- /tmp/old.QxzqzM	2026-07-27 19:19:34.329086701 +0000
+++ /tmp/new.gEYau3	2026-07-27 19:19:34.329086701 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 90ede407 -> 2a469c3f ===

--- /tmp/old.F94a0n	2026-07-27 19:19:34.346087063 +0000
+++ /tmp/new.HaPVC4	2026-07-27 19:19:34.346087063 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/apple-itunes/windows.json

=== Install Script (no changes) ===
=== Uninstall // 5f74ea2b -> ac09716c ===

--- /tmp/old.AmQX6U	2026-07-27 19:19:34.397088148 +0000
+++ /tmp/new.il5aBa	2026-07-27 19:19:34.397088148 +0000
@@ -30,4 +30,13 @@
     if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found."; Exit 1 }
 } catch { Write-Host "Error: $_"; Exit 1 }
 
+# iTunes uses a WiX bundle that spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

ee/maintained-apps/outputs/azure-data-studio/windows.json

=== Install // 1dc8cafc -> 622c4e10 ===

--- /tmp/old.79JtQB	2026-07-27 19:19:34.535091084 +0000
+++ /tmp/new.elkOKM	2026-07-27 19:19:34.535091084 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 87cf9389 -> 23fce27b ===

--- /tmp/old.GFSErd	2026-07-27 19:19:34.551091425 +0000
+++ /tmp/new.6pUK8M	2026-07-27 19:19:34.551091425 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json

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

ee/maintained-apps/outputs/git-extensions/windows.json

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

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

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

ee/maintained-apps/outputs/google-earth-pro/windows.json

=== Install Script (no changes) ===
=== Uninstall // 7e72e637 -> 51dc162a ===

--- /tmp/old.vzFD9r	2026-07-27 19:19:35.276106851 +0000
+++ /tmp/new.3mzb10	2026-07-27 19:19:35.276106851 +0000
@@ -65,4 +65,13 @@
     Exit 1
 }
 
+# Google Earth Pro's uninstaller spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

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

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

ee/maintained-apps/outputs/logitech-unifying-software/windows.json

=== Install // f7bcd4ba -> a3795eea ===

--- /tmp/old.w5uCST	2026-07-27 19:19:35.550112680 +0000
+++ /tmp/new.amJXud	2026-07-27 19:19:35.550112680 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 9f1b824a -> 8ec563fd ===

--- /tmp/old.e4pvet	2026-07-27 19:19:35.566113021 +0000
+++ /tmp/new.J8YhN9	2026-07-27 19:19:35.566113021 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

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

=== Install // adeab869 -> fec8495e ===

--- /tmp/old.5iiCDO	2026-07-27 19:19:35.646114723 +0000
+++ /tmp/new.XsL30P	2026-07-27 19:19:35.646114723 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 6125a07b -> a289eb1d ===

--- /tmp/old.5y62E2	2026-07-27 19:19:35.662115063 +0000
+++ /tmp/new.tNAReb	2026-07-27 19:19:35.662115063 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/sonicwall-netextender/windows.json

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

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

=== Install // 297c1c96 -> 6831586d ===

--- /tmp/old.MKXXeS	2026-07-27 19:19:35.942121021 +0000
+++ /tmp/new.SxcFWZ	2026-07-27 19:19:35.942121021 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 338688ef -> 1fe840b2 ===

--- /tmp/old.saSfdr	2026-07-27 19:19:35.958121361 +0000
+++ /tmp/new.0bPoct	2026-07-27 19:19:35.958121361 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

ee/maintained-apps/outputs/treesize-free/windows.json

=== Install // 3e307826 -> 36e33a58 ===

--- /tmp/old.5DQY5h	2026-07-27 19:19:36.241127382 +0000
+++ /tmp/new.ZrkMy4	2026-07-27 19:19:36.241127382 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 3cc408af -> f316b604 ===

--- /tmp/old.SjGmXe	2026-07-27 19:19:36.257127723 +0000
+++ /tmp/new.riINjn	2026-07-27 19:19:36.257127723 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

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

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

ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 88 changed files in this pull request and generated no new comments.

@kitzy kitzy changed the title Add 21 Windows Fleet-maintained apps Add 17 Windows Fleet-maintained apps Jul 27, 2026
Verified each app's real registry DisplayName (winget AppsAndFeaturesEntries,
MSI Property tables, vendor installer sources). Apps whose DisplayName carries
a version/arch suffix used exact name matching, which silently matches nothing:

- Added fuzzy_match_name to treesize-free (TreeSize Free V4.8.1), spyder
  (Spyder 6), git-extensions (Git Extensions 7.2.0.92), gpg4win (Gpg4win
  (5.0.2)), logitech-unifying-software (Logitech Unifying Software 2.52),
  and rtools (Rtools 4.5 (6768-6492)).
- Fixed aomei-backupper-standard unique_identifier: the registry DisplayName is
  'AOMEI Backupper' (no 'Standard' suffix since ~7.4), so the previous value
  matched nothing. Now also matches paid editions, which share the name.
- Recategorized to match precedent: treesize-free & aomei -> Utilities;
  gnupg, gpg4win & sonicwall-netextender -> Security.
- Removed the changes/ changelog entry (FMA additions aren't changelogged in
  the established Windows FMA PRs, and it double-counted apps from other PRs).

Regenerated outputs; git-extensions (7.2.0.92) and gnupg (2.5.21) picked up
their current winget versions in the process.
Copilot AI review requested due to automatic review settings July 27, 2026 20:01
@kitzy

kitzy commented Jul 27, 2026

Copy link
Copy Markdown
Member Author

Detection queries verified against real registry DisplayNames

Every app's identity query was verified against the actual Windows registry Add/Remove Programs DisplayName (osquery programs.name) — sourced from winget AppsAndFeaturesEntries, MSI Property tables (msiinfo), and vendor installer scripts — rather than assumed. Fixes in ba6201b:

Switched to fuzzy name matching (DisplayName carries a version/arch suffix, so exact match silently matched nothing):

App Registry DisplayName
TreeSize Free TreeSize Free V4.8.1
Spyder Spyder 6
Git Extensions Git Extensions 7.2.0.92
Gpg4win Gpg4win (5.0.2)
Logitech Unifying Software Logitech Unifying Software 2.52
Rtools Rtools 4.5 (6768-6492)

Fixed a broken identifier: AOMEI Backupper's registry DisplayName is AOMEI Backupper (the "Standard" suffix was dropped ~v7.4), so the previous unique_identifier matched nothing. Note: the corrected name also matches paid editions, which share it — there's no registry value that distinguishes them.

Verified correct as exact match, no change: iTunes, Azure Data Studio, Dell Display and Peripheral Manager, Google Earth Pro, Logi Tune, SonicWall NetExtender, TightVNC (TightVNC, despite RealVNC needing fuzzy), Yarn, Zoom Outlook Plugin, GNU Privacy Guard. Publishers were cross-checked against the MSI Manufacturer / installer source in each case.

Regenerating in the process pulled Git Extensions to 7.2.0.92 and GnuPG to 2.5.21 (their current winget versions).

@github-actions

Copy link
Copy Markdown
Contributor

Script Diff Results

ee/maintained-apps/outputs/aomei-backupper-standard/windows.json

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

ee/maintained-apps/outputs/apple-itunes/windows.json

=== Install Script (no changes) ===
=== Uninstall // 5f74ea2b -> ac09716c ===

--- /tmp/old.YrgI12	2026-07-27 20:02:33.228943602 +0000
+++ /tmp/new.SfhOAJ	2026-07-27 20:02:33.229943606 +0000
@@ -30,4 +30,13 @@
     if (-not $foundUninstaller) { Write-Host "Uninstaller for '$softwareName' not found."; Exit 1 }
 } catch { Write-Host "Error: $_"; Exit 1 }
 
+# iTunes uses a WiX bundle that spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

ee/maintained-apps/outputs/azure-data-studio/windows.json

=== Install // 1dc8cafc -> 622c4e10 ===

--- /tmp/old.RuAU04	2026-07-27 20:02:33.367944098 +0000
+++ /tmp/new.7puX8a	2026-07-27 20:02:33.367944098 +0000
@@ -13,7 +13,7 @@
   Wait = $true
 }
 
-$process = Start-Process @$processOptions
+$process = Start-Process @processOptions
 $exitCode = $process.ExitCode
 
 Write-Host "Install exit code: $exitCode"

=== Uninstall // 87cf9389 -> 23fce27b ===

--- /tmp/old.N9yKAU	2026-07-27 20:02:33.382944152 +0000
+++ /tmp/new.qETz85	2026-07-27 20:02:33.382944152 +0000
@@ -23,7 +23,7 @@
             Write-Host "Uninstall command: $uninstallCommand"; Write-Host "Uninstall args: $uninstallArgs"
             $processOptions = @{ FilePath = $uninstallCommand; PassThru = $true; Wait = $true }
             if ($uninstallArgs -ne '') { $processOptions.ArgumentList = $uninstallArgs }
-            $process = Start-Process @$processOptions
+            $process = Start-Process @processOptions
             $exitCode = $process.ExitCode; Write-Host "Uninstall exit code: $exitCode"; break
         }
     }

ee/maintained-apps/outputs/dell-display-and-peripheral-manager/windows.json

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

ee/maintained-apps/outputs/git-extensions/windows.json

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

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

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

ee/maintained-apps/outputs/google-earth-pro/windows.json

=== Install Script (no changes) ===
=== Uninstall // 7e72e637 -> 51dc162a ===

--- /tmp/old.4PKcHO	2026-07-27 20:02:33.681945219 +0000
+++ /tmp/new.0EGfm7	2026-07-27 20:02:33.681945219 +0000
@@ -65,4 +65,13 @@
     Exit 1
 }
 
+# Google Earth Pro's uninstaller spawns child msiexec processes; wait for them to finish
+$timeout = 120
+$elapsed = 0
+while ((Get-Process -Name "msiexec" -ErrorAction SilentlyContinue) -and ($elapsed -lt $timeout)) {
+    Start-Sleep -Seconds 2
+    $elapsed += 2
+    Write-Host "Waiting for msiexec to complete... ($elapsed seconds)"
+}
+
 Exit $exitCode

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

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

ee/maintained-apps/outputs/logitech-unifying-software/windows.json

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

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

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

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

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

ee/maintained-apps/outputs/sonicwall-netextender/windows.json

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

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

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

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

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

ee/maintained-apps/outputs/treesize-free/windows.json

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

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

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

ee/maintained-apps/outputs/zoom-outlook-plugin/windows.json

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

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 73 out of 87 changed files in this pull request and generated 1 comment.

Comment on lines +1 to +2
$softwareName = "AOMEI Backupper Standard"
$softwareNameLike = "*$softwareName*"
@kitzy kitzy closed this Jul 27, 2026
@kitzy
kitzy deleted the add-windows-fmas-batch-2026-06 branch July 27, 2026 22:35
allenhouchins pushed a commit that referenced this pull request Jul 29, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Azure Data Studio** as a Windows Fleet-maintained app. One of the
11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

The install itself worked — the validator logged `New application
detected at: C:\Program Files\Azure Data Studio`. The *script* never
returned:

```
20:08:19  INFO  msg="Executing install script..." app="Azure Data Studio"
20:18:19  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:18:19  INFO  msg="New application detected at: C:\Program Files\Azure Data Studio"
```

Ten minutes on the nose is the validator's `executeScript` timeout.
Azure Data Studio is a Visual Studio Code fork and ships the same Inno
Setup script — including the **`runcode` task, which launches the app
when the install finishes**. Because `Start-Process -Wait` waits for the
process *and all of its descendants*, the launched app kept the script
blocked forever.

The fix is the switch VS Code's own FMA already uses:
`/MERGETASKS=!runcode` (see
[`vscode_install.ps1`](ee/maintained-apps/inputs/winget/scripts/vscode_install.ps1)
and
[`vscodium_install.ps1`](ee/maintained-apps/inputs/winget/scripts/vscodium_install.ps1),
both of which pass validation). The script also waits on the installer
process alone rather than its descendants, polls for the Add/Remove
Programs entry, and stops a stray `azuredatastudio` process as a
backstop in case a future build ignores the task suppression.

## Notes

- Machine-scope x64 installer, per the winget manifest — Azure Data
Studio publishes both user and machine scope, and Fleet installs run as
SYSTEM, so machine scope is required.
- Clean ARP `DisplayName` (`Azure Data Studio`), so exact name matching.
Publisher `Microsoft Corporation`.
- Uninstall is unchanged: the Inno uninstaller doesn't leave anything
resident, and `-Wait` waiting on descendants is the desired behavior
there (Inno relaunches itself from `%TEMP%`).
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384162280](https://github.com/fleetdm/fleet/actions/runs/30384162280)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Azure Data Studio to the available Windows software catalog.
* Added support for installing and uninstalling Azure Data Studio
(version 1.52.0) via silent installer and uninstaller flows with
completion detection.
* Added an Azure Data Studio icon to the software interface for better
visual identification.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
allenhouchins pushed a commit that referenced this pull request Jul 29, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **GNU Privacy Guard** as a Windows Fleet-maintained app. One of the
11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

The install itself worked — the validator logged `New application
detected at: C:\Program Files\GnuPG`. The *script* never returned:

```
20:18:36  INFO  msg="Executing install script..." app="GNU Privacy Guard"
20:28:36  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:28:36  INFO  msg="New application detected at: C:\Program Files\GnuPG"
```

Ten minutes on the nose is the validator's `executeScript` timeout. The
cause is a PowerShell detail rather than anything wrong with the
installer: **`Start-Process -Wait` waits for the process *and all of its
descendants***. GnuPG's installer starts `gpg-agent`, `dirmngr`,
`keyboxd` and `scdaemon` and leaves them resident, so `-Wait` never
returns. The same run left the installer `.exe` locked in the
validator's temp dir, which is the other tell that a child process was
still alive.

The install script now follows the pattern already established by
[`ollama_install.ps1`](ee/maintained-apps/inputs/winget/scripts/ollama_install.ps1):
start with `-PassThru` (no `-Wait`), wait on the installer process alone
with a 7-minute cap (below the caller's 10-minute script budget), poll
for the Add/Remove Programs entry so a fast-returning installer can't be
mistaken for a finished one, then stop the daemons.

Stopping the daemons also fixes the uninstall, which would otherwise
fail on files those processes hold open. The uninstall script stops them
up front, uses NSIS's `_?=<dir>` switch so the uninstaller runs in place
instead of relaunching itself detached from `%TEMP%`, and polls the ARP
key to confirm removal.

## Notes

- Clean ARP `DisplayName` (`GNU Privacy Guard`), so exact name matching
— no `fuzzy_match_name` needed. Publisher `The GnuPG Project`.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384069714](https://github.com/fleetdm/fleet/actions/runs/30384069714)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually





<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added GNU Privacy Guard as a supported Windows application in the
maintained apps catalog.
  * Added install/upgrade detection and uninstall support for Windows.
  * Added GNU Privacy Guard to the software catalog (Security category).
* Added a dedicated GNU Privacy Guard icon to the software interface for
proper name-based display.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
allenhouchins pushed a commit that referenced this pull request Jul 29, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Logitech Unifying Software** as a Windows Fleet-maintained app.
One of the 11 apps split out of #48501 that failed the FMA validator;
#50016 shipped the 6 that passed.

## Why it was failing

Install and detection were already fine on the SYSTEM-context Windows
runner — osquery found `Logitech Unifying Software 2.52` at `C:\Program
Files\Common Files\LogiShrd\Unifying`. **Uninstall** was the failure:

```
20:40:55  INFO  msg="Executing uninstall script for app..."
20:40:57  INFO  msg="Found app: 'Logitech Unifying Software 2.52' ... Version: 2.52.33"
20:40:57  ERROR msg="App still present after uninstall (expected no match for version '2.52.33' in programs)"
```

Two seconds start to finish — the uninstaller hadn't actually done
anything yet. This is standard NSIS behavior: the uninstaller copies
itself to `%TEMP%` and relaunches, so the process the script starts
exits almost immediately while the real work happens in a detached
child.

The fix passes NSIS's `_?=<dir>` switch, which runs the uninstaller in
place instead of relaunching, making it synchronous. It has to be the
last argument and unquoted, so the script builds a single argument
string rather than an array (PowerShell would quote an element
containing spaces). A bounded poll on the ARP key follows as a backstop,
and the script fails explicitly if the entry is still there.

## Notes

- **Versioned ARP name.** The registry `DisplayName` is `Logitech
Unifying Software 2.52`, so the input uses `fuzzy_match_name` and the
exists query is `name LIKE 'Logitech Unifying Software %'`. The
uninstall script matches the same prefix rather than an exact string.
- Publisher `Logitech` confirmed against the winget locale manifest.
- Installs under `C:\Program Files\Common Files`, so the validator's "no
changes detected in `C:\Program Files`" line is an expected warning, not
a failure.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384010810](https://github.com/fleetdm/fleet/actions/runs/30384010810)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
* Added Logitech Unifying Software to the Windows software catalog,
including the version 2.52.33 download, checksum, and install-detection
metadata.
* Implemented silent installation and a robust, registry-aware uninstall
flow (with process lock handling and timeout behavior).
* Added a dedicated Logitech Unifying Software icon to the software page
UI.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
allenhouchins pushed a commit that referenced this pull request Jul 29, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Google Earth Pro** as a Windows Fleet-maintained app (a Windows
counterpart to the existing `google-earth-pro/darwin` FMA). One of the
11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

Install and detection were already fine on the SYSTEM-context Windows
runner — osquery found `Google Earth Pro` 7.3.7.1155. **Uninstall** was
the failure:

```
INFO  msg="Executing uninstall script for app..." app="Google Earth Pro"
INFO  msg="Found app: 'Google Earth Pro' at , Version: 7.3.7.1155"
ERROR msg="App still present after uninstall (expected no match for version '7.3.7.1155' in programs)"
```

The EXE wraps a WiX MSI, so the ARP `UninstallString` is `MsiExec.exe
/X{ProductCode}` — with **no quiet switch**. The old script ran that
string verbatim, which raises a confirmation dialog in session 0 where
nothing can click it, so the uninstall silently no-ops.

The uninstall script now resolves the MSI product code (from the
`UninstallString`, falling back to the registry key name) and runs
`msiexec /x <code> /quiet /norestart` with a bounded 5-minute wait, then
drains child `msiexec` processes. `3010`/`1641` are treated as success.

## Notes

- **Identity verified against the real installer**, not winget metadata.
The installer's embedded MSI Property table reads: `ProductName` =
`Google Earth Pro`, `Manufacturer` = `Google`, `ProductVersion` =
`7.3.7.1155`, `ALLUSERS` = `1`, `ProductCode` =
`{E3B69BB6-FFD8-441C-933E-BB8A3136ED8F}`. No `ARPSYSTEMCOMPONENT`, so it
is not a bootstrapper. That confirms `unique_identifier` = `Google Earth
Pro` and the exists-query publisher `Google` (not "Google LLC").
- Installs to `C:\Program Files (x86)`, so the validator's "no changes
detected in `C:\Program Files`" line is an expected warning, not a
failure.
- Reuses the existing `google earth pro` catalog icon — no new icon
needed.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30383934805](https://github.com/fleetdm/fleet/actions/runs/30383934805)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries checked against the MSI Property table,
`apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Google Earth Pro for Windows to the maintained app catalog.
* Added maintained-apps install and uninstall support for Google Earth
Pro (version 7.3.7.1155).
* Included automated download integrity verification and detection logic
for installed/updated versions.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
allenhouchins pushed a commit that referenced this pull request Jul 29, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Rtools** as a Windows Fleet-maintained app. One of the 11 apps
split out of #48501 that failed the FMA validator; #50016 shipped the 6
that passed.

## Why it was failing

The install script hit the validator's 10-minute `executeScript` cap
exactly:

```
20:41:22  INFO  msg="Executing install script..." app=Rtools
20:51:22  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:51:22  WARN  msg="failed to remove rtools45-6768-6492.exe: ... Access is denied."
```

The locked installer in the temp dir shows a process was still alive.
`Start-Process -Wait` waits for the process *and all of its
descendants*, which is the same root cause as the other install-timeout
apps in this batch.

Rtools is also the one app in the batch where a **slow unpack** is a
plausible second cause — the installer is ~460 MB and expands a full
toolchain. So rather than assume, the script now waits on the installer
process alone with a 480s cap (under the caller's 10-minute budget) and
logs elapsed time plus Add/Remove Programs registration state on every
poll. If the cap is reached:

- **registered** → the install finished and only a lingering child
remains, so it stops that process and succeeds;
- **not registered** → the unpack genuinely didn't finish, and it fails
with that stated explicitly.

Either way the CI log now says which one happened instead of just timing
out.

## Notes

- **Identity verified against the installer**, not winget metadata. The
setup stub's PE version resource reads `CompanyName: The R Foundation`,
`ProductName: Rtools`. Inno derives `VersionInfoCompany` from
`AppPublisher`, so the ARP publisher is `The R Foundation` — which is
what the exists query uses.
- **Versioned ARP name.** The registry `DisplayName` is `Rtools 4.5
(6768-6492)`, so the input uses `fuzzy_match_name` and the exists query
is `name LIKE 'Rtools %'`.
- Installs to `C:\rtools45`, not Program Files, so the validator's "no
changes detected in `C:\Program Files`" line is an expected warning, not
a failure.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384196159](https://github.com/fleetdm/fleet/actions/runs/30384196159)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries checked against the installer's PE
version resource, `apps.json` is valid JSON with a description filled
in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

* **New Features**
  * Added Rtools as a supported Windows application.
* Added installation and uninstallation support with silent setup and
silent removal.
* Added Rtools version metadata, installer verification, and Developer
tools categorization.
  * Added a dedicated Rtools icon for software listings.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
allenhouchins pushed a commit that referenced this pull request Jul 31, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **Gpg4win** as a Windows Fleet-maintained app. One of the 11 apps
split out of #48501 that failed the FMA validator; #50016 shipped the 6
that passed.

## Why it was failing

Same root cause as GNU Privacy Guard (#50025) — Gpg4win bundles GnuPG.
The install worked; the *script* never returned:

```
20:30:53  INFO  msg="Executing install script..." app=Gpg4win
20:40:53  ERROR msg="Error executing install script: exit status 1"   # exactly 10:00 later
20:40:53  INFO  msg="New application detected at: C:\Program Files\Gpg4win"
```

Ten minutes on the nose is the validator's `executeScript` timeout.
**`Start-Process -Wait` waits for the process *and all of its
descendants***, and Gpg4win leaves `gpg-agent`, `dirmngr`, `keyboxd` and
`scdaemon` resident (plus Kleopatra), so `-Wait` never returns. The same
run left `gpg4win-5.0.2.exe` locked in the validator's temp dir,
confirming a live child process.

The install script now follows the pattern already established by
[`ollama_install.ps1`](ee/maintained-apps/inputs/winget/scripts/ollama_install.ps1):
start with `-PassThru` (no `-Wait`), wait on the installer process alone
with a 7-minute cap (below the caller's 10-minute script budget), poll
for the Add/Remove Programs entry, then stop the leftovers.

The uninstall script stops those processes up front (they hold file
locks that make the uninstall fail), uses NSIS's `_?=<dir>` switch so
the uninstaller runs in place rather than relaunching itself detached
from `%TEMP%`, and polls the ARP key to confirm removal.

## Notes

- **Versioned ARP name.** The registry `DisplayName` is `Gpg4win
(5.0.2)`, so the input uses `fuzzy_match_name` and the exists query is
`name LIKE 'Gpg4win %'`. The uninstall script matches the same prefix.
- x86-only installer. Publisher `The Gpg4win Project`.
- Ships a new catalog icon and website asset.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30384125610](https://github.com/fleetdm/fleet/actions/runs/30384125610)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually





<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
  - Added Gpg4win as a supported Windows application.
  - Added Gpg4win version 5.0.2 with Security categorization.
  - Added a Gpg4win icon to the software interface.
- Introduced silent install and uninstall support with process cleanup,
timeouts, and registry-based verification to confirm install/removal
outcomes.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->
allenhouchins added a commit that referenced this pull request Jul 31, 2026
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** #50020

# What this does

Adds **AOMEI Backupper Standard** as a Windows Fleet-maintained app. One
of the 11 apps split out of #48501 that failed the FMA validator; #50016
shipped the 6 that passed.

## Why it was failing

Install and detection were already fine on the SYSTEM-context Windows
runner — the validator installed it and osquery found `AOMEI Backupper`
8.4.0. **Uninstall** was the failure:

```
ERROR msg="Error uninstalling app: exit status 1" app="AOMEI Backupper Standard"
ERROR msg="Output: Uninstaller for 'AOMEI Backupper Standard' not found."
```

AOMEI unified the ARP `DisplayName` across editions around v7.4 — the
registry entry reads `AOMEI Backupper`, with no `Standard` suffix. The
uninstall script searched for the catalog name and matched nothing.
`unique_identifier` was already corrected to `AOMEI Backupper`; this
fixes the uninstall script to match.

## Notes

- **Edition matching.** `AOMEI Backupper` also matches the paid
Pro/Workstation/Server editions — AOMEI shares the DisplayName across
editions and no registry value distinguishes them. Detecting the free
edition specifically isn't possible from inventory.
- **Non-pinned installer URL.**
`https://www2.aomeisoftware.com/download/adb/AOMEIBackupperStd.exe` is a
"latest" URL, so the pinned SHA will drift when AOMEI ships a new build
until the FMA auto-update bumps it.
- x86-only installer, so it lands in `C:\Program Files (x86)`. The
validator's "no changes detected in `C:\Program Files`" line is an
expected warning, not a failure.

# Checklist for submitter

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements), JS
inline code is prevented especially for url redirects, and untrusted
data interpolated into shell scripts/commands is validated against shell
metacharacters.
- [x] Timeouts are implemented and retries are limited to avoid infinite
loops

## Testing

- [x] FMA CI validator (install → detect → uninstall) **passes** on the
SYSTEM-context Windows runner — [run
30383902487](https://github.com/fleetdm/fleet/actions/runs/30383902487)
(`All checks passed`)
- [x] Generated output verified locally: manifest SHA matches the winget
manifest, exists/patched queries reviewed for name + publisher
correctness, `apps.json` is valid JSON with a description filled in.
- [x] QA'd all new/changed functionality manually




<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added **AOMEI Backupper Standard** (version **8.4.0.0.0**) to the
Windows software catalog, including verified installer download
(SHA-256).
- Introduced dedicated silent **install** and **uninstall** support,
with version gating and idempotent uninstall behavior when the app isn’t
present.
- Added a **new software icon** and updated the listing so the correct
icon now appears for this product.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->

---------

Co-authored-by: Allen Houchins <allenhouchins@mac.com>
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