FMA - Antigravity IDE - #47011
Conversation
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #47011 +/- ##
==========================================
- Coverage 67.03% 67.03% -0.01%
==========================================
Files 2883 2884 +1
Lines 225149 225151 +2
Branches 11637 11637
==========================================
+ Hits 150939 150940 +1
- Misses 60539 60540 +1
Partials 13671 13671
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
There was a problem hiding this comment.
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.
|
Caution Review failedThe pull request is closed. ℹ️ Recent review info⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (2)
WalkthroughAdds Google Antigravity IDE across Fleet: Homebrew and Winget input manifests; Windows PowerShell install/uninstall scripts with registry discovery, process termination, uninstall-string parsing, silent-flag normalization, and exit-code handling; macOS Darwin output with embedded DMG install and uninstall scripts; updates apps registry with darwin/windows entries; and adds a React SVG icon component plus mappings in the frontend software icon resolver. Possibly related PRs
🚥 Pre-merge checks | ✅ 3 | ❌ 2❌ Failed checks (1 warning, 1 inconclusive)
✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches📝 Generate docstrings
🧪 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: 4
🤖 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/homebrew/antigravity-ide.json`:
- Line 7: The default_categories value uses the wrong casing ("Developer
tools"); update the manifest key default_categories to use the exact enum string
"Developer Tools" so it matches the documented allowed value and prevents
invalid/uncategorized metadata; locate the default_categories entry in the
antigravity-ide manifest and replace "Developer tools" with "Developer Tools".
In `@ee/maintained-apps/inputs/winget/scripts/antigravity_ide_uninstall.ps1`:
- Around line 1-2: The uninstall selector in antigravity_ide_uninstall.ps1 uses
broad patterns ($softwareNameLike = "Antigravity*" and $publisherLike =
"*Google*") which can match the wrong product; change these to the exact
DisplayName and Publisher values used in the generated manifest (use the same
identifier string that Fleet's outputs/antigravity-ide/windows.json uses), and
update any exists/patched checks to derive from that same identifier so both the
uninstall lookup and detection queries are identical; after updating
$softwareNameLike and $publisherLike in the script and aligning any related
detection variables, regenerate
ee/maintained-apps/outputs/antigravity-ide/windows.json to reflect the stricter
selector.
In `@ee/maintained-apps/outputs/antigravity-ide/darwin.json`:
- Around line 19-20: The symlink for the CLI is created and removed as a
relative path ("agy-ide") which is nondeterministic; update the installer ln
invocation (the line that currently calls ln -h -f -s -- "$APPDIR/Antigravity
IDE.app/Contents/Resources/app/bin/antigravity-ide" "agy-ide") to create an
absolute symlink (e.g. /usr/local/bin/agy-ide) and update the uninstaller
removal (the sudo rm -rf 'agy-ide' call) to remove that same absolute path,
ensuring both install (ln) and uninstall (rm) reference the identical absolute
target path.
In `@frontend/pages/SoftwarePage/components/icons/index.ts`:
- Line 339: The icon mapping is missing a "google antigravity ide" key so prefix
matching won't match names like "Google Antigravity IDE"; update the mapping
object that contains the "antigravity ide": AntigravityIde entry by adding a
second key "google antigravity ide": AntigravityIde (keep the same
AntigravityIde symbol) so loose/prefix matching will pick the custom icon for
names starting with "google antigravity ide".
🪄 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: 5f750d0f-a766-4ae3-a1fe-5bc44fc66cb7
⛔ Files ignored due to path filters (1)
website/assets/images/app-icon-antigravity-ide-60x60@2x.pngis excluded by!**/*.png
📒 Files selected for processing (9)
ee/maintained-apps/inputs/homebrew/antigravity-ide.jsonee/maintained-apps/inputs/winget/antigravity-ide.jsonee/maintained-apps/inputs/winget/scripts/antigravity_ide_install.ps1ee/maintained-apps/inputs/winget/scripts/antigravity_ide_uninstall.ps1ee/maintained-apps/outputs/antigravity-ide/darwin.jsonee/maintained-apps/outputs/antigravity-ide/windows.jsonee/maintained-apps/outputs/apps.jsonfrontend/pages/SoftwarePage/components/icons/AntigravityIde.tsxfrontend/pages/SoftwarePage/components/icons/index.ts
| $softwareNameLike = "Antigravity*" | ||
| $publisherLike = "*Google*" |
There was a problem hiding this comment.
Match the same product that Fleet detects.
This selector is broader than the Windows manifest query: the output manifest only treats Antigravity IDE ... from Google as the managed app, but this script grabs the first Google uninstall entry whose DisplayName matches Antigravity*. On hosts with multiple Google Antigravity entries, uninstall can target the wrong product and leave detection out of sync.
🔧 Proposed fix
-$softwareNameLike = "Antigravity*"
+$softwareNameLike = "Antigravity IDE*"If you want the strictest contract, derive both the uninstall lookup and the exists / patched queries from the same identifier, then regenerate ee/maintained-apps/outputs/antigravity-ide/windows.json.
Also applies to: 20-25
🤖 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/antigravity_ide_uninstall.ps1`
around lines 1 - 2, The uninstall selector in antigravity_ide_uninstall.ps1 uses
broad patterns ($softwareNameLike = "Antigravity*" and $publisherLike =
"*Google*") which can match the wrong product; change these to the exact
DisplayName and Publisher values used in the generated manifest (use the same
identifier string that Fleet's outputs/antigravity-ide/windows.json uses), and
update any exists/patched checks to derive from that same identifier so both the
uninstall lookup and detection queries are identical; after updating
$softwareNameLike and $publisherLike in the script and aligning any related
detection variables, regenerate
ee/maintained-apps/outputs/antigravity-ide/windows.json to reflect the stricter
selector.
| "c9689968": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\ntrash() {\n local logged_in_user=\"$1\"\n local target_file=\"$2\"\n local timestamp=\"$(date +%Y-%m-%d-%s)\"\n local rand=\"$(jot -r 1 0 99999)\"\n\n # replace ~ with /Users/$logged_in_user\n if [[ \"$target_file\" == ~* ]]; then\n target_file=\"/Users/$logged_in_user${target_file:1}\"\n fi\n\n local trash=\"/Users/$logged_in_user/.Trash\"\n\n # If the target contains glob characters, expand it and move each match.\n if [[ \"$target_file\" == *[*?[]* ]]; then\n local file file_name\n local matched=false\n local i=0\n # compgen -G expands the (quoted) pattern itself, so paths containing\n # spaces glob correctly; reading line by line keeps each match intact.\n while IFS= read -r file; do\n [[ -n \"$file\" ]] || continue\n [[ -e \"$file\" || -L \"$file\" ]] || continue\n matched=true\n i=$((i + 1))\n file_name=\"$(basename \"$file\")\"\n echo \"removing $file.\"\n # The per-match counter keeps matches that share a basename from\n # overwriting each other in the trash.\n mv -f \"$file\" \"$trash/${file_name}_${timestamp}_${rand}_${i}\"\n done < <(compgen -G \"$target_file\" 2>/dev/null)\n if [[ \"$matched\" == false ]]; then\n echo \"$target_file doesn't exist.\"\n fi\n return\n fi\n\n local file_name=\"$(basename \"${target_file}\")\"\n\n if [[ -e \"$target_file\" ]]; then\n echo \"removing $target_file.\"\n mv -f \"$target_file\" \"$trash/${file_name}_${timestamp}_${rand}\"\n else\n echo \"$target_file doesn't exist.\"\n fi\n}\n\nquit_application 'com.google.antigravity-ide'\nsudo rm -rf \"$APPDIR/Antigravity IDE.app\"\nsudo rm -rf 'agy-ide'\ntrash $LOGGED_IN_USER '~/.antigravity-ide-server/'\ntrash $LOGGED_IN_USER '~/.antigravity-ide/'\ntrash $LOGGED_IN_USER '~/.gemini/antigravity-ide/'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Antigravity IDE'\ntrash $LOGGED_IN_USER '~/Library/Application Support/com.apple.sharedfilelist/com.apple.LSSharedFileList.ApplicationRecentDocuments/com.google.antigravity-ide.sfl*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.google.antigravity-ide'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.google.antigravity-ide.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.google.antigravity-ide'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.google.antigravity-ide.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.google.antigravity-ide.savedState'\n", | ||
| "d4aa2ac0": "#!/bin/bash\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath \"$INSTALLER_PATH\")\")\n# functions\n\nquit_and_track_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local timeout_duration=10\n\n # check if the application is running\n local app_running\n app_running=$(osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null)\n if [[ \"$app_running\" != \"true\" ]]; then\n eval \"export $var_name=0\"\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping quitting application ID '$bundle_id'.\"\n eval \"export $var_name=0\"\n return\n fi\n\n # App was running, mark it for relaunch\n eval \"export $var_name=1\"\n echo \"Application '$bundle_id' was running; will relaunch after installation.\"\n\n echo \"Quitting application '$bundle_id'...\"\n\n # try to quit the application within the timeout period\n local quit_success=false\n SECONDS=0\n while (( SECONDS < timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" >/dev/null 2>&1; then\n if ! pgrep -f \"$bundle_id\" >/dev/null 2>&1; then\n echo \"Application '$bundle_id' quit successfully.\"\n quit_success=true\n break\n fi\n fi\n sleep 1\n done\n\n if [[ \"$quit_success\" = false ]]; then\n echo \"Application '$bundle_id' did not quit.\"\n fi\n}\n\n\nrelaunch_application() {\n local bundle_id=\"$1\"\n local var_name=\"APP_WAS_RUNNING_$(echo \"$bundle_id\" | tr '.-' '__')\"\n local was_running\n\n # Check if the app was running before installation\n eval \"was_running=\\$$var_name\"\n if [[ \"$was_running\" != \"1\" ]]; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ -z \"$console_user\" || \"$console_user\" == \"root\" || \"$console_user\" == \"loginwindow\" ]]; then\n echo \"Not logged into a non-root GUI; skipping relaunching application ID '$bundle_id'.\"\n return\n fi\n\n echo \"Relaunching application '$bundle_id'...\"\n\n # Launch the app in the logged-in user's GUI session. Apps launched by root\n # won't register with the user's Dock/GUI, so run 'open' as the console user.\n # Use 'launchctl asuser' to bootstrap into the console user's Mach namespace\n # and GUI session — 'sudo -u' alone doesn't do this, which can cause\n # LSOpenURLsWithRole() failures even when 'open' exits 0.\n local open_status=0\n if [[ $EUID -eq 0 ]]; then\n local console_uid\n console_uid=$(id -u \"$console_user\")\n /bin/launchctl asuser \"$console_uid\" sudo -u \"$console_user\" open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n else\n open -b \"$bundle_id\" >/dev/null 2>&1 || open_status=$?\n fi\n\n if [[ $open_status -eq 0 ]]; then\n echo \"Application '$bundle_id' relaunched successfully.\"\n else\n echo \"Failed to relaunch application '$bundle_id'.\"\n fi\n}\n\n\n# extract contents\nMOUNT_POINT=$(mktemp -d /tmp/dmg_mount_XXXXXX)\nyes | hdiutil attach -plist -nobrowse -readonly -mountpoint \"$MOUNT_POINT\" \"$INSTALLER_PATH\" || exit 1\nsudo cp -R \"$MOUNT_POINT\"/* \"$TMPDIR\"\nhdiutil detach \"$MOUNT_POINT\" || true\n# copy to the applications folder\nquit_and_track_application 'com.google.antigravity-ide'\nif [ -d \"$APPDIR/Antigravity IDE.app\" ]; then\n\tsudo mv \"$APPDIR/Antigravity IDE.app\" \"$TMPDIR/Antigravity IDE.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Antigravity IDE.app\" \"$APPDIR\"\nrelaunch_application 'com.google.antigravity-ide'\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/Antigravity IDE.app/Contents/Resources/app/bin/antigravity-ide\" \"agy-ide\"\n" |
There was a problem hiding this comment.
Use an absolute symlink path shared by install and uninstall scripts.
Line 20 creates agy-ide relative to the current working directory, and Line 19 removes the same relative path. This makes CLI placement non-deterministic and can delete the wrong file depending on runtime cwd.
Suggested fix
# in both install and uninstall scripts
+SYMLINK_PATH="/usr/local/bin/agy-ide"
# install
-mkdir -p .
-/bin/ln -h -f -s -- "$APPDIR/Antigravity IDE.app/Contents/Resources/app/bin/antigravity-ide" "agy-ide"
+sudo mkdir -p "$(dirname "$SYMLINK_PATH")"
+/bin/ln -h -f -s -- "$APPDIR/Antigravity IDE.app/Contents/Resources/app/bin/antigravity-ide" "$SYMLINK_PATH"
# uninstall
-sudo rm -rf 'agy-ide'
+sudo rm -f "$SYMLINK_PATH"🤖 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/antigravity-ide/darwin.json` around lines 19 - 20,
The symlink for the CLI is created and removed as a relative path ("agy-ide")
which is nondeterministic; update the installer ln invocation (the line that
currently calls ln -h -f -s -- "$APPDIR/Antigravity
IDE.app/Contents/Resources/app/bin/antigravity-ide" "agy-ide") to create an
absolute symlink (e.g. /usr/local/bin/agy-ide) and update the uninstaller
removal (the sudo rm -rf 'agy-ide' call) to remove that same absolute path,
ensuring both install (ln) and uninstall (rm) reference the identical absolute
target path.
|
@harrisonravazzolo converting to draft. There are a few findings that need to be addressed. |
# Conflicts: # ee/maintained-apps/outputs/apps.json # frontend/pages/SoftwarePage/components/icons/index.ts
There was a problem hiding this comment.
Pull request overview
This PR adds a new Fleet-maintained app (FMA) entry for Google Antigravity IDE across macOS (Homebrew) and Windows (winget), and makes the app show up with a dedicated icon in the Software UI.
Changes:
- Added a new Software page icon component and mapped it to “Antigravity IDE” software-name variants.
- Added new maintained-app input manifests (Homebrew + winget) and corresponding install/uninstall scripts.
- Added generated maintained-app output manifests and appended the app entries to
apps.json.
Reviewed changes
Copilot reviewed 9 out of 10 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| frontend/pages/SoftwarePage/components/icons/index.ts | Registers the new Antigravity IDE icon and maps software-name strings to it. |
| frontend/pages/SoftwarePage/components/icons/AntigravityIde.tsx | Adds the new 32x32 icon asset as an SVG wrapper. |
| ee/maintained-apps/outputs/apps.json | Adds Antigravity IDE entries to the published maintained-app catalog (darwin + windows). |
| ee/maintained-apps/outputs/antigravity-ide/windows.json | Adds generated Windows manifest including detection queries + install/uninstall refs. |
| ee/maintained-apps/outputs/antigravity-ide/darwin.json | Adds generated macOS manifest including detection queries + install/uninstall refs. |
| ee/maintained-apps/inputs/winget/scripts/antigravity_ide_uninstall.ps1 | New Windows uninstall script (registry-based). |
| ee/maintained-apps/inputs/winget/scripts/antigravity_ide_install.ps1 | New Windows install script (silent Inno install). |
| ee/maintained-apps/inputs/winget/antigravity-ide.json | New winget input manifest wiring scripts + identifiers. |
| ee/maintained-apps/inputs/homebrew/antigravity-ide.json | New Homebrew input manifest wiring token + identifiers. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| $softwareNameLike = "Antigravity*" | ||
| $publisherLike = "*Google*" |
| "65cab11a": "$softwareNameLike = \"Antigravity*\"\n$publisherLike = \"*Google*\"\n\n$paths = @(\n 'HKLM:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall',\n 'HKLM:\\SOFTWARE\\WOW6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall',\n 'HKCU:\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall'\n)\n\n$ExpectedExitCodes = @(0, 3010, 1641)\n$exitCode = 0\n\ntry {\n\n[array]$uninstallKeys = Get-ChildItem `\n -Path $paths `\n -ErrorAction SilentlyContinue |\n ForEach-Object { Get-ItemProperty $_.PSPath -ErrorAction SilentlyContinue }\n\n$selected = $null\nforeach ($key in $uninstallKeys) {\n if ($key.DisplayName -and $key.DisplayName -like $softwareNameLike -and $key.Publisher -like $publisherLike) {\n $selected = $key\n break\n }\n}\n\nif (-not $selected -or (-not $selected.UninstallString -and -not $selected.QuietUninstallString)) {\n Write-Host \"Uninstall entry not found for $softwareNameLike\"\n Exit 0\n}\n\n# Stop Antigravity and any helpers running out of the install dir so the\n# uninstaller doesn't fail on locked files.\nStop-Process -Name \"Antigravity\" -Force -ErrorAction SilentlyContinue\nif ($selected.InstallLocation -and (Test-Path -LiteralPath $selected.InstallLocation)) {\n $loc = $selected.InstallLocation.TrimEnd('\\')\n Get-Process | Where-Object { $_.Path -and $_.Path -like \"$loc\\*\" } |\n ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue }\n}\nStart-Sleep -Seconds 2\n\n# Prefer QuietUninstallString -- Inno populates it with /VERYSILENT\n# /SUPPRESSMSGBOXES already, so we just add /NORESTART if missing.\n$uninstallCommand = if ($selected.QuietUninstallString) {\n $selected.QuietUninstallString\n} else {\n $selected.UninstallString\n}\n\n# Parse the uninstaller exe path. Inno usually quotes it.\n$exePath = \"\"\n$existingArgs = \"\"\nif ($uninstallCommand -match '^\\s*\"([^\"]+)\"\\s*(.*)$') {\n $exePath = $matches[1]\n $existingArgs = $matches[2].Trim()\n} elseif ($uninstallCommand -match '(?i)^\\s*(.+?\\.exe)\\s*(.*)$') {\n $exePath = $matches[1]\n $existingArgs = $matches[2].Trim()\n} else {\n Throw \"Could not parse uninstall string: $uninstallCommand\"\n}\n\n$argumentList = @()\nif ($existingArgs) { $argumentList += ($existingArgs -split '\\s+') }\nforeach ($s in @(\"/VERYSILENT\", \"/SUPPRESSMSGBOXES\", \"/NORESTART\")) {\n if ($argumentList -notcontains $s) { $argumentList += $s }\n}\n\nWrite-Host \"Selected entry DisplayName: $($selected.DisplayName)\"\nWrite-Host \"Uninstall command: $exePath\"\nWrite-Host \"Uninstall args: $($argumentList -join ' ')\"\n\n$processOptions = @{\n FilePath = $exePath\n ArgumentList = $argumentList\n PassThru = $true\n Wait = $true\n}\n\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\nWrite-Host \"Uninstall exit code: $exitCode\"\n\nif ($ExpectedExitCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n", | ||
| "8b15c4d0": "$exeFilePath = \"${env:INSTALLER_PATH}\"\n\n$ExpectedExitCodes = @(0, 3010)\n\ntry {\n\n# Antigravity uses an Inno Setup-based installer (user scope).\n# /MERGETASKS=!runcode deselects the \"launch after install\" task.\n$processOptions = @{\n FilePath = \"$exeFilePath\"\n ArgumentList = \"/SP- /VERYSILENT /SUPPRESSMSGBOXES /NORESTART /CLOSEAPPLICATIONS /MERGETASKS=!runcode\"\n PassThru = $true\n Wait = $true\n}\n\n# Start process and track exit code\n$process = Start-Process @processOptions\n$exitCode = $process.ExitCode\n\nWrite-Host \"Install exit code: $exitCode\"\n\n# Stop the app if the installer auto-launched it despite !runcode\nStop-Process -Name \"Antigravity\" -Force -ErrorAction SilentlyContinue\n\nif ($ExpectedExitCodes -contains $exitCode) { Exit 0 }\nExit $exitCode\n\n} catch {\n Write-Host \"Error: $_\"\n Exit 1\n}\n" |
Summary by CodeRabbit