From b4f598e1b2cd08e898f1955439e4707ee3ffcf54 Mon Sep 17 00:00:00 2001
From: Allen Houchins <32207388+allenhouchins@users.noreply.github.com>
Date: Fri, 24 Oct 2025 13:54:30 -0400
Subject: [PATCH] Added Cursor FMA for macOS (#34069) (#34665)
Fixes #34069
Co-authored-by: Mitch Francese <2227948+tux234@users.noreply.github.com>
---
.../inputs/homebrew/cursor.json | 8 +++++++
ee/maintained-apps/outputs/apps.json | 9 +++++++-
ee/maintained-apps/outputs/cursor/darwin.json | 21 +++++++++++++++++++
3 files changed, 37 insertions(+), 1 deletion(-)
create mode 100644 ee/maintained-apps/inputs/homebrew/cursor.json
create mode 100644 ee/maintained-apps/outputs/cursor/darwin.json
diff --git a/ee/maintained-apps/inputs/homebrew/cursor.json b/ee/maintained-apps/inputs/homebrew/cursor.json
new file mode 100644
index 0000000000..9c98732fcf
--- /dev/null
+++ b/ee/maintained-apps/inputs/homebrew/cursor.json
@@ -0,0 +1,8 @@
+{
+ "name": "Cursor",
+ "unique_identifier": "com.todesktop.230313mzl4w4u92",
+ "token": "cursor",
+ "installer_format": "zip",
+ "slug": "cursor/darwin",
+ "default_categories": ["Developer tools"]
+}
diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json
index 04d648b102..6ccd6ce6e1 100644
--- a/ee/maintained-apps/outputs/apps.json
+++ b/ee/maintained-apps/outputs/apps.json
@@ -71,6 +71,13 @@
"unique_identifier": "Cloudflare WARP",
"description": "Cloudflare WARP enhances internet safety and performance by encrypting your data and optimizing connections for privacy."
},
+ {
+ "name": "Cursor",
+ "slug": "cursor/darwin",
+ "platform": "darwin",
+ "unique_identifier": "com.todesktop.230313mzl4w4u92",
+ "description": "Cursor AI boosts your coding productivity by giving smart, context-aware code suggestions, quick explanations, and easy refactors — all inside your editor."
+ },
{
"name": "Cursor",
"slug": "cursor/windows",
@@ -251,7 +258,7 @@
"slug": "yubico-yubikey-manager/darwin",
"platform": "darwin",
"unique_identifier": "com.yubico.ykman",
- "description": "YubiKey Manager is an application for configuring any YubiKey. Requires Rosetta 2. YubiKey Manager won't get security updates or bug fixes. It's End of Life: https://www.yubico.com/support/download/yubikey-manager/"
+ "description": "YubiKey Manager is an application for configuring any YubiKey. Requires Rosetta 2. YubiKey Manager won't get security updates or bug fixes. It's End of Life: https://www.yubico.com/support/download/yubikey-manager"
},
{
"name": "Zoom",
diff --git a/ee/maintained-apps/outputs/cursor/darwin.json b/ee/maintained-apps/outputs/cursor/darwin.json
new file mode 100644
index 0000000000..c88bd1ddb9
--- /dev/null
+++ b/ee/maintained-apps/outputs/cursor/darwin.json
@@ -0,0 +1,21 @@
+{
+ "versions": [
+ {
+ "version": "1.7.54",
+ "queries": {
+ "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.todesktop.230313mzl4w4u92';"
+ },
+ "installer_url": "https://downloads.cursor.com/production/5c17eb2968a37f66bc6662f48d6356a100b67be8/darwin/arm64/Cursor-darwin-arm64.zip",
+ "install_script_ref": "d059edf1",
+ "uninstall_script_ref": "f7561d44",
+ "sha256": "cdf2990e01ce1f8fb64c077661788133b88819818bc8aadd78a5d70f96240ed1",
+ "default_categories": [
+ "Developer tools"
+ ]
+ }
+ ],
+ "refs": {
+ "d059edf1": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nTMPDIR=$(dirname \"$(realpath $INSTALLER_PATH)\")\n# functions\n\nquit_application() {\n local bundle_id=\"$1\"\n local timeout_duration=10\n\n # check if the application is running\n if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2\u003e/dev/null; then\n return\n fi\n\n local console_user\n console_user=$(stat -f \"%Su\" /dev/console)\n if [[ $EUID -eq 0 \u0026\u0026 \"$console_user\" == \"root\" ]]; 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 \u003c timeout_duration )); do\n if osascript -e \"tell application id \\\"$bundle_id\\\" to quit\" \u003e/dev/null 2\u003e\u00261; then\n if ! pgrep -f \"$bundle_id\" \u003e/dev/null 2\u003e\u00261; 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\n# extract contents\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_application 'com.todesktop.230313mzl4w4u92'\nif [ -d \"$APPDIR/Cursor.app\" ]; then\n\tsudo mv \"$APPDIR/Cursor.app\" \"$TMPDIR/Cursor.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Cursor.app\" \"$APPDIR\"\nmkdir -p .\n/bin/ln -h -f -s -- \"$APPDIR/Cursor.app/Contents/Resources/app/bin/code\" \"cursor\"\n",
+ "f7561d44": "#!/bin/sh\n\n# variables\nAPPDIR=\"/Applications/\"\nLOGGED_IN_USER=$(scutil \u003c\u003c\u003c \"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 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/Cursor.app\"\nsudo rm -rf 'cursor'\ntrash $LOGGED_IN_USER '~/.cursor'\ntrash $LOGGED_IN_USER '~/.cursor-tutor'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Caches/cursor-updater'\ntrash $LOGGED_IN_USER '~/Library/Application Support/Cursor'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.todesktop.*'\ntrash $LOGGED_IN_USER '~/Library/Caches/com.todesktop.*.ShipIt'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/com.todesktop.*'\ntrash $LOGGED_IN_USER '~/Library/Logs/Cursor'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ByHost/com.todesktop.*.ShipIt.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/com.todesktop.*.plist'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/com.todesktop.*.savedState'\ntrash $LOGGED_IN_USER '~/Library/Saved Application State/todesktop.com.ToDesktop-Installer.savedState'\n"
+ }
+}
\ No newline at end of file