From 562d8aa06a2ffa84908db3fe5559b44f1dcae4e2 Mon Sep 17 00:00:00 2001 From: Mitch Francese <2227948+tux234@users.noreply.github.com> Date: Fri, 3 Apr 2026 14:45:11 -0400 Subject: [PATCH] Add Marvel as a Fleet-maintained app (#42404) ## Summary - Adds Marvel (macOS) to the Fleet maintained apps catalog - Input: `ee/maintained-apps/inputs/homebrew/marvel.json` - Output generated via ingester script ## Validation checklist - [ ] App can be downloaded using manifest URL - [ ] App installs successfully using manifest install script - [ ] App exists in software inventory after install - [ ] App uninstalls successfully using manifest uninstall script --- .../inputs/homebrew/marvel.json | 8 +++++++ ee/maintained-apps/outputs/apps.json | 7 ++++++ ee/maintained-apps/outputs/marvel/darwin.json | 21 ++++++++++++++++++ .../SoftwarePage/components/icons/Marvel.tsx | 14 ++++++++++++ .../SoftwarePage/components/icons/index.ts | 2 ++ .../images/app-icon-marvel-60x60@2x.png | Bin 0 -> 15320 bytes 6 files changed, 52 insertions(+) create mode 100644 ee/maintained-apps/inputs/homebrew/marvel.json create mode 100644 ee/maintained-apps/outputs/marvel/darwin.json create mode 100644 frontend/pages/SoftwarePage/components/icons/Marvel.tsx create mode 100644 website/assets/images/app-icon-marvel-60x60@2x.png diff --git a/ee/maintained-apps/inputs/homebrew/marvel.json b/ee/maintained-apps/inputs/homebrew/marvel.json new file mode 100644 index 0000000000..3bb330e8c3 --- /dev/null +++ b/ee/maintained-apps/inputs/homebrew/marvel.json @@ -0,0 +1,8 @@ +{ + "name": "Marvel", + "slug": "marvel/darwin", + "unique_identifier": "com.marvelprototyping.marvelmacos", + "token": "marvel", + "installer_format": "zip", + "default_categories": ["Productivity"] +} diff --git a/ee/maintained-apps/outputs/apps.json b/ee/maintained-apps/outputs/apps.json index aacead860f..baa7915694 100644 --- a/ee/maintained-apps/outputs/apps.json +++ b/ee/maintained-apps/outputs/apps.json @@ -1037,6 +1037,13 @@ "unique_identifier": "org.p0deje.Maccy", "description": "Maccy is a clipboard manager." }, + { + "name": "Marvel", + "slug": "marvel/darwin", + "platform": "darwin", + "unique_identifier": "com.marvelprototyping.marvelmacos", + "description": "Marvel is a design and prototyping platform for creating interactive app and web mockups." + }, { "name": "Mattermost", "slug": "mattermost/darwin", diff --git a/ee/maintained-apps/outputs/marvel/darwin.json b/ee/maintained-apps/outputs/marvel/darwin.json new file mode 100644 index 0000000000..7371be3879 --- /dev/null +++ b/ee/maintained-apps/outputs/marvel/darwin.json @@ -0,0 +1,21 @@ +{ + "versions": [ + { + "version": "11.5", + "queries": { + "exists": "SELECT 1 FROM apps WHERE bundle_identifier = 'com.marvelprototyping.marvelmacos';" + }, + "installer_url": "https://storage.googleapis.com/sketch-plugin/11.5/Marvel.zip", + "install_script_ref": "1eddbb9e", + "uninstall_script_ref": "ff5ef758", + "sha256": "fd6a3bb8a24ce9f4a44f6b3129ccdf37c532ba95e00ae6537f6d9a6699654911", + "default_categories": [ + "Productivity" + ] + } + ], + "refs": { + "1eddbb9e": "#!/bin/sh\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 if ! osascript -e \"application id \\\"$bundle_id\\\" is running\" 2>/dev/null; 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 [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; 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 [[ $EUID -eq 0 && \"$console_user\" == \"root\" ]]; 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 # Try to launch the application\n if osascript -e \"tell application id \\\"$bundle_id\\\" to activate\" >/dev/null 2>&1; 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\nunzip \"$INSTALLER_PATH\" -d \"$TMPDIR\"\n# copy to the applications folder\nquit_and_track_application 'com.marvelprototyping.marvelmacos'\nif [ -d \"$APPDIR/Marvel.app\" ]; then\n\tsudo mv \"$APPDIR/Marvel.app\" \"$TMPDIR/Marvel.app.bkp\"\nfi\nsudo cp -R \"$TMPDIR/Marvel.app\" \"$APPDIR\"\nrelaunch_application 'com.marvelprototyping.marvelmacos'\n", + "ff5ef758": "#!/bin/sh\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 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/Marvel.app\"\ntrash $LOGGED_IN_USER '~/Library/Caches/com.marvelprototyping.marvelmacos'\n" + } +} diff --git a/frontend/pages/SoftwarePage/components/icons/Marvel.tsx b/frontend/pages/SoftwarePage/components/icons/Marvel.tsx new file mode 100644 index 0000000000..7c76ee0607 --- /dev/null +++ b/frontend/pages/SoftwarePage/components/icons/Marvel.tsx @@ -0,0 +1,14 @@ +import * as React from "react"; + +import type { SVGProps } from "react"; + +const Marvel = (props: SVGProps) => ( + + + +); +export default Marvel; diff --git a/frontend/pages/SoftwarePage/components/icons/index.ts b/frontend/pages/SoftwarePage/components/icons/index.ts index dc9b79b4a9..b59776dc75 100644 --- a/frontend/pages/SoftwarePage/components/icons/index.ts +++ b/frontend/pages/SoftwarePage/components/icons/index.ts @@ -15,6 +15,7 @@ import Iina from "./Iina"; import Kitty from "./Kitty"; import Krita from "./Krita"; import LastPass from "./LastPass"; +import Marvel from "./Marvel"; import Nextcloud from "./Nextcloud"; import Notepad from "./Notepad++"; import OktaVerify from "./OktaVerify"; @@ -319,6 +320,7 @@ export const SOFTWARE_NAME_TO_ICON_MAP = { kitty: Kitty, krita: Krita, lastpass: LastPass, + marvel: Marvel, "microsoft.companyportal": IntuneCompanyPortal, coteditor: CotEditor, cursor: Cursor, diff --git a/website/assets/images/app-icon-marvel-60x60@2x.png b/website/assets/images/app-icon-marvel-60x60@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..fce8864b0b42a3734285cffae85c0e57b0ef3f42 GIT binary patch literal 15320 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