Update Fleet-maintained apps - #49935
Conversation
Generated automatically with cmd/maintained-apps.
Script Diff Resultsee/maintained-apps/outputs/antigravity/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/arc/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/capcut/darwin.json=== Install Script (no changes) ===
=== Uninstall // a9b4c8a1 -> 30a898df ===
--- /tmp/old.ddnxHo 2026-07-25 05:08:07.760276955 +0000
+++ /tmp/new.0N2kBS 2026-07-25 05:08:07.760276955 +0000
@@ -56,4 +56,3 @@
trash $LOGGED_IN_USER '~/Library/Application Scripts/com.lemon.lvoverseas'
trash $LOGGED_IN_USER '~/Library/Containers/com.lemon.lvoverseas'
trash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.lv'
-trash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.ve'ee/maintained-apps/outputs/clickup/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/dot/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/granola/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/kiro-cli/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/microsoft-edge/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/miro/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/obs/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/ocenaudio/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/ocenaudio/windows.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) ===ee/maintained-apps/outputs/yaak/darwin.json=== Install Script (no changes) ===
=== Uninstall Script (no changes) === |
WalkthroughUpdated 13 maintained-app definitions across macOS and Windows to newer versions, synchronized version-detection queries, refreshed installer URLs and SHA-256 checksums, and preserved existing script references where applicable. CapCut additionally switches to a new uninstall script reference and changes one cleanup target. Possibly related PRs
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@ee/maintained-apps/outputs/capcut/darwin.json`:
- Line 19: Update the CapCut uninstall commands in the script to trash both
group-container paths, preserving the existing 22MMUN2RN5.lv cleanup and adding
the corresponding 22MMUN2RN5.ve path through trash.
In `@ee/maintained-apps/outputs/miro/darwin.json`:
- Around line 4-7: Keep the Miro manifest’s installer artifact pinned to version
0.11.164 by using an immutable, versioned installer URL and recording its
SHA-256 checksum; if Install-Miro.dmg is guaranteed immutable for this release,
retain it and replace no_check with a comment documenting that guarantee.
🪄 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 Plus
Run ID: acca718e-c684-4fd6-b410-86df3f605cf1
📒 Files selected for processing (13)
ee/maintained-apps/outputs/antigravity/darwin.jsonee/maintained-apps/outputs/arc/darwin.jsonee/maintained-apps/outputs/capcut/darwin.jsonee/maintained-apps/outputs/clickup/windows.jsonee/maintained-apps/outputs/dot/darwin.jsonee/maintained-apps/outputs/granola/darwin.jsonee/maintained-apps/outputs/kiro-cli/darwin.jsonee/maintained-apps/outputs/microsoft-edge/windows.jsonee/maintained-apps/outputs/miro/darwin.jsonee/maintained-apps/outputs/obs/darwin.jsonee/maintained-apps/outputs/ocenaudio/darwin.jsonee/maintained-apps/outputs/ocenaudio/windows.jsonee/maintained-apps/outputs/yaak/darwin.json
| ], | ||
| "refs": { | ||
| "a9b4c8a1": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/CapCut.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.lv'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.ve'\n", | ||
| "30a898df": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/CapCut.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.lv'\n", |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
Preserve both CapCut group-container suffixes during uninstall.
The script now removes only 22MMUN2RN5.lv; the Fleet CapCut uninstall command lists both .lv and .ve, so removing the .ve cleanup leaves data from older installations behind. (fleetdm.com)
Proposed fix
trash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.lv'
+ trash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.ve'📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| "30a898df": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/CapCut.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.lv'\n", | |
| "30a898df": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nsudo rm -rf \"$APPDIR/CapCut.app\"\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Containers/com.lemon.lvoverseas'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.lv'\ntrash $LOGGED_IN_USER '~/Library/Group Containers/22MMUN2RN5.ve'\n", |
🤖 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/capcut/darwin.json` at line 19, Update the CapCut
uninstall commands in the script to trash both group-container paths, preserving
the existing 22MMUN2RN5.lv cleanup and adding the corresponding 22MMUN2RN5.ve
path through trash.
| "version": "0.11.164", | ||
| "queries": { | ||
| "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.realtimeboard';", | ||
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.realtimeboard' AND version_compare(bundle_short_version, '0.11.162') < 0);" | ||
| "patched": "SELECT 1 WHERE NOT EXISTS (SELECT 1 FROM apps WHERE bundle_identifier = 'com.electron.realtimeboard' AND version_compare(bundle_short_version, '0.11.164') < 0);" |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== repo files around miro maint apps =="
fd -a 'darwin\.json|maintained-apps' . | sed 's#^\./##' | head -100
echo "== target manifest =="
if [ -f ee/maintained-apps/outputs/miro/darwin.json ]; then
cat -n ee/maintained-apps/outputs/miro/darwin.json
fi
echo "== miro source/manifest files =="
fd -i 'miro|mir(.?o)?' . || true
echo "== text search for Install-Miro and checksum behavior =="
rg -n "Install-Miro|Miro|maintained-apps|checksum|sha256|no_check|validate" ee .github src 2>/dev/null | head -200Repository: fleetdm/fleet
Length of output: 7168
🏁 Script executed:
#!/bin/bash
set -u
echo "== target manifest =="
cat -n ee/maintained-apps/outputs/miro/darwin.json
echo "== miro source or related files =="
fd -i 'miro' ee/maintained-apps cmd/maintained-apps .github . 2>/dev/null | sed 's#^\./##' | head -100 || true
echo "== focused text search for miro/install/sum/registry =="
rg -n --glob '!ee/maintained-apps/outputs/**' 'miro|Miro|Install-Miro|maintained-apps|no_check|sha256|versions|manifest' ee/maintained-apps cmd/maintained-apps .github articles 2>/dev/null | head -300
echo "== compare Miro manifest style to nearby apps with checksum =="
python3 - <<'PY'
from pathlib import Path
import json
for p in sorted(Path('ee/maintained-apps/outputs').glob('*darwin.json')):
if 'miro' in str(p).lower() or p.name == '1password/darwin.json' or 'adobe-creative-cloud/darwin.json' in str(p):
try:
data=json.loads(p.read_text())
except Exception as e:
print(p, e)
continue
print('\n---', p)
print({k: data.get(k) for k in ['version','installer_url','sha256','queries'] if k in data})
PYRepository: fleetdm/fleet
Length of output: 50371
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== target manifest =="
cat -n ee/maintained-apps/outputs/miro/darwin.json
echo "== miro source or related files =="
fd -i 'miro' ee/maintained-apps cmd/maintained-apps .github . 2>/dev/null | sed 's#^\./##' | head -100 || true
echo "== focused text search for miro/install/sum/registry =="
rg -n --glob '!ee/maintained-apps/outputs/**' 'miro|Miro|Install-Miro|maintained-apps|no_check|sha256|versions|manifest' ee/maintained-apps cmd/maintained-apps .github articles 2>/dev/null | head -300
echo "== compare Miro manifest style to nearby apps with checksum =="
python3 - <<'PY'
from pathlib import Path
import json
files = [Path('ee/maintained-apps/outputs/miro/darwin.json'), Path('ee/maintained-apps/outputs/1password/darwin.json'), Path('ee/maintained-apps/outputs/adobe-creative-cloud/darwin.json')]
for p in files:
if p.exists():
data=json.loads(p.read_text())
print('\n---', p)
for k in ['version','installer_url','sha256','queries']:
if k in data:
print(f"{k}: {data[k]!r}")
PYRepository: fleetdm/fleet
Length of output: 50369
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== miros homebrew/winget input manifests =="
cat -n ee/maintained-apps/inputs/homebrew/miro.json
printf '\n--- winget input ---\n'
cat -n ee/maintained-apps/inputs/winget/miro.json
echo "== maintained apps manifest structs/types =="
ast-grep outline ee/maintained-apps/maintained_apps.go --view expanded || true
sed -n '1,140p' ee/maintained-apps/maintained_apps.go
echo "== validation code references =="
fd -i 'validat.*\.go|maintained.*\.go' ee/maintained-apps cmd/maintained-apps .github/scripts 2>/dev/null | sed 's#^\./##' | sed -n '1,120p'
rg -n 'SHA256|no_check|hash|installer_url|pkg/hash|download' ee/maintained-apps cmd/maintained-apps -g '*.go' -g '*.sh' -g '!outputs/**' | sed -n '1,220p'
echo "== behavioral probe from manifest source files =="
python3 - <<'PY'
from pathlib import Path
import json, re
m=json.loads(Path('ee/maintained-apps/outputs/miro/darwin.json').read_text())
v=m['versions'][0]
print('version:', v.get('version'))
print('installer_url:', v.get('installer_url'))
print('sha256:', v.get('sha256'))
print('url_is_versioned_in_path:', any(seg.strip('/') in str(v.get('installer_url', '')) for seg in re.split(r'[,/?.]', v.get('installer_url','')) if seg))
print('input_homebrew_has_sha256:', 'sha256' in json.loads(Path('ee/maintained-apps/inputs/homebrew/miro.json').read_text()))
PYRepository: fleetdm/fleet
Length of output: 11697
Keep Miro’s installer artifact pinned to 0.11.164.
This manifest advertises 0.11.164, but downloads from Install-Miro.dmg — not a versioned Miro release URL — and sha256 is no_check. If that URL is not immutable for this release, add/keep a versioned installer artifact with its SHA-256; otherwise add a comment documenting that this path is guaranteed immutable.
🤖 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/miro/darwin.json` around lines 4 - 7, Keep the
Miro manifest’s installer artifact pinned to version 0.11.164 by using an
immutable, versioned installer URL and recording its SHA-256 checksum; if
Install-Miro.dmg is guaranteed immutable for this release, retain it and replace
no_check with a comment documenting that guarantee.
|
Closing in favor of #49936. |
Automated ingestion of latest Fleet-maintained app data.
Summary by CodeRabbit