Skip to content

Add macOS Fleet-maintained apps (K) - #47316

Merged
allenhouchins merged 2 commits into
mainfrom
new-mac-fmas-k
Jun 10, 2026
Merged

Add macOS Fleet-maintained apps (K)#47316
allenhouchins merged 2 commits into
mainfrom
new-mac-fmas-k

Conversation

@allenhouchins

@allenhouchins allenhouchins commented Jun 10, 2026

Copy link
Copy Markdown
Member

Adds 17 Fleet-maintained app(s) whose cask token starts with 'K': inputs, outputs, app icons (TSX + website PNG), and the matching index.ts and apps.json entries.

Summary by CodeRabbit

New Features

  • Added support for 20+ new applications including Kaleidoscope, Kap, Kdenlive, KeeWeb, keyboard utilities, KNIME, KnockKnock, and Krisp
  • Applications now feature automated installation and uninstallation capabilities
  • UI updated with icons and listings for newly supported software

Adds 17 Fleet-maintained app(s) whose cask token starts with 'K':
inputs, outputs, app icons (TSX + website PNG), and the matching
index.ts and apps.json entries. Split out from #47121.
fleet-release
fleet-release previously approved these changes Jun 10, 2026
@allenhouchins
allenhouchins marked this pull request as ready for review June 10, 2026 15:56
@allenhouchins
allenhouchins requested a review from a team as a code owner June 10, 2026 15:56
Copilot AI review requested due to automatic review settings June 10, 2026 15:56
@allenhouchins
allenhouchins merged commit 15fedba into main Jun 10, 2026
23 of 27 checks passed
@allenhouchins
allenhouchins deleted the new-mac-fmas-k branch June 10, 2026 15:56
@codecov

codecov Bot commented Jun 10, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 50.00000% with 17 lines in your changes missing coverage. Please review.
✅ Project coverage is 67.19%. Comparing base (4b6e494) to head (a4fd535).
⚠️ Report is 3 commits behind head on main.

Files with missing lines Patch % Lines
...ges/SoftwarePage/components/icons/Kaleidoscope.tsx 50.00% 1 Missing ⚠️
...ontend/pages/SoftwarePage/components/icons/Kap.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/Kdenlive.tsx 50.00% 1 Missing ⚠️
.../SoftwarePage/components/icons/Keepingyouawake.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Keeweb.tsx 50.00% 1 Missing ⚠️
...s/SoftwarePage/components/icons/KeyboardCowboy.tsx 50.00% 1 Missing ⚠️
.../SoftwarePage/components/icons/KeyboardMaestro.tsx 50.00% 1 Missing ⚠️
...oftwarePage/components/icons/Keyboardcleantool.tsx 50.00% 1 Missing ⚠️
...d/pages/SoftwarePage/components/icons/Keycastr.tsx 50.00% 1 Missing ⚠️
...end/pages/SoftwarePage/components/icons/Keyclu.tsx 50.00% 1 Missing ⚠️
... and 7 more
Additional details and impacted files
@@            Coverage Diff             @@
##             main   #47316      +/-   ##
==========================================
- Coverage   67.19%   67.19%   -0.01%     
==========================================
  Files        3151     3168      +17     
  Lines      227023   227057      +34     
  Branches    11889    11890       +1     
==========================================
+ Hits       152545   152562      +17     
- Misses      60740    60756      +16     
- Partials    13738    13739       +1     
Flag Coverage Δ
frontend 57.84% <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.

@coderabbitai

coderabbitai Bot commented Jun 10, 2026

Copy link
Copy Markdown
Contributor

Review Change Stack

Caution

Review failed

The pull request is closed.

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 6ea98ddb-eab0-4135-b1ec-4562ab6982b5

📥 Commits

Reviewing files that changed from the base of the PR and between 4b6e494 and a4fd535.

⛔ Files ignored due to path filters (17)
  • website/assets/images/app-icon-kaleidoscope-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-kap-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-kdenlive-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keepingyouawake-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keeweb-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keyboard-cowboy-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keyboard-maestro-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keyboardcleantool-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keycastr-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keyclu-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-keystore-explorer-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-kiro-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-kiro-cli-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-klokki-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-knime-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-knockknock-60x60@2x.png is excluded by !**/*.png
  • website/assets/images/app-icon-krisp-60x60@2x.png is excluded by !**/*.png
📒 Files selected for processing (53)
  • ee/maintained-apps/inputs/homebrew/kaleidoscope.json
  • ee/maintained-apps/inputs/homebrew/kap.json
  • ee/maintained-apps/inputs/homebrew/kdenlive.json
  • ee/maintained-apps/inputs/homebrew/keepingyouawake.json
  • ee/maintained-apps/inputs/homebrew/keeweb.json
  • ee/maintained-apps/inputs/homebrew/keyboard-cowboy.json
  • ee/maintained-apps/inputs/homebrew/keyboard-maestro.json
  • ee/maintained-apps/inputs/homebrew/keyboardcleantool.json
  • ee/maintained-apps/inputs/homebrew/keycastr.json
  • ee/maintained-apps/inputs/homebrew/keyclu.json
  • ee/maintained-apps/inputs/homebrew/keystore-explorer.json
  • ee/maintained-apps/inputs/homebrew/kiro-cli.json
  • ee/maintained-apps/inputs/homebrew/kiro.json
  • ee/maintained-apps/inputs/homebrew/klokki.json
  • ee/maintained-apps/inputs/homebrew/knime.json
  • ee/maintained-apps/inputs/homebrew/knockknock.json
  • ee/maintained-apps/inputs/homebrew/krisp.json
  • ee/maintained-apps/outputs/apps.json
  • ee/maintained-apps/outputs/kaleidoscope/darwin.json
  • ee/maintained-apps/outputs/kap/darwin.json
  • ee/maintained-apps/outputs/kdenlive/darwin.json
  • ee/maintained-apps/outputs/keepingyouawake/darwin.json
  • ee/maintained-apps/outputs/keeweb/darwin.json
  • ee/maintained-apps/outputs/keyboard-cowboy/darwin.json
  • ee/maintained-apps/outputs/keyboard-maestro/darwin.json
  • ee/maintained-apps/outputs/keyboardcleantool/darwin.json
  • ee/maintained-apps/outputs/keycastr/darwin.json
  • ee/maintained-apps/outputs/keyclu/darwin.json
  • ee/maintained-apps/outputs/keystore-explorer/darwin.json
  • ee/maintained-apps/outputs/kiro-cli/darwin.json
  • ee/maintained-apps/outputs/kiro/darwin.json
  • ee/maintained-apps/outputs/klokki/darwin.json
  • ee/maintained-apps/outputs/knime/darwin.json
  • ee/maintained-apps/outputs/knockknock/darwin.json
  • ee/maintained-apps/outputs/krisp/darwin.json
  • frontend/pages/SoftwarePage/components/icons/Kaleidoscope.tsx
  • frontend/pages/SoftwarePage/components/icons/Kap.tsx
  • frontend/pages/SoftwarePage/components/icons/Kdenlive.tsx
  • frontend/pages/SoftwarePage/components/icons/Keepingyouawake.tsx
  • frontend/pages/SoftwarePage/components/icons/Keeweb.tsx
  • frontend/pages/SoftwarePage/components/icons/KeyboardCowboy.tsx
  • frontend/pages/SoftwarePage/components/icons/KeyboardMaestro.tsx
  • frontend/pages/SoftwarePage/components/icons/Keyboardcleantool.tsx
  • frontend/pages/SoftwarePage/components/icons/Keycastr.tsx
  • frontend/pages/SoftwarePage/components/icons/Keyclu.tsx
  • frontend/pages/SoftwarePage/components/icons/KeystoreExplorer.tsx
  • frontend/pages/SoftwarePage/components/icons/Kiro.tsx
  • frontend/pages/SoftwarePage/components/icons/KiroCli.tsx
  • frontend/pages/SoftwarePage/components/icons/Klokki.tsx
  • frontend/pages/SoftwarePage/components/icons/Knime.tsx
  • frontend/pages/SoftwarePage/components/icons/Knockknock.tsx
  • frontend/pages/SoftwarePage/components/icons/Krisp.tsx
  • frontend/pages/SoftwarePage/components/icons/index.ts

Walkthrough

This PR extends Fleet's maintained-app system by adding 16 new macOS applications spanning productivity, utilities, development, and security categories. For each app, the PR adds: (1) input metadata defining identifiers and installer details in ee/maintained-apps/inputs/homebrew/; (2) macOS output manifests in ee/maintained-apps/outputs/*/darwin.json with versioning, installer URLs, checksums, and embedded bash automation for installation and uninstallation; (3) catalog entries in ee/maintained-apps/outputs/apps.json; and (4) frontend UI assets including 16 new React SVG icon components and registry mappings in frontend/pages/SoftwarePage/components/icons/.

Possibly related PRs

  • fleetdm/fleet#47053: Extends Fleet's maintained-app catalogs and frontend icon registry with new app entries.
  • fleetdm/fleet#47014: Updates frontend icon registry and adds new React SVG icon components for macOS software.
  • fleetdm/fleet#47046: Modifies the frontend icon registry by updating SOFTWARE_NAME_TO_ICON_MAP with new app-to-icon entries.
✨ 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 new-mac-fmas-k

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 and usage tips.

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

This PR adds a new batch of macOS Fleet-maintained apps whose Homebrew cask tokens begin with “K”, including their generated manifests (inputs/outputs), corresponding Software page icons, and registry entries so they appear correctly across Fleet’s UI and maintained-apps catalog.

Changes:

  • Added multiple new Software page icon components and wired them into SOFTWARE_NAME_TO_ICON_MAP.
  • Added new Homebrew input manifests and generated darwin output manifests (including install/uninstall scripts).
  • Updated the maintained-apps catalog (ee/maintained-apps/outputs/apps.json) with new app metadata entries.

Reviewed changes

Copilot reviewed 53 out of 70 changed files in this pull request and generated 5 comments.

Show a summary per file
File Description
frontend/pages/SoftwarePage/components/icons/Krisp.tsx Adds Krisp software icon component.
frontend/pages/SoftwarePage/components/icons/KiroCli.tsx Adds Kiro CLI software icon component.
frontend/pages/SoftwarePage/components/icons/Kiro.tsx Adds Kiro software icon component.
frontend/pages/SoftwarePage/components/icons/Keyclu.tsx Adds KeyClu software icon component.
frontend/pages/SoftwarePage/components/icons/Kdenlive.tsx Adds Kdenlive software icon component.
frontend/pages/SoftwarePage/components/icons/Kap.tsx Adds Kap software icon component.
frontend/pages/SoftwarePage/components/icons/index.ts Registers new “K*” icons in imports and name→icon map.
ee/maintained-apps/outputs/krisp/darwin.json Adds generated Krisp maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/knockknock/darwin.json Adds generated KnockKnock maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/knime/darwin.json Adds generated KNIME maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/klokki/darwin.json Adds generated Klokki maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/kiro/darwin.json Adds generated Kiro maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/kiro-cli/darwin.json Adds generated Kiro CLI maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keystore-explorer/darwin.json Adds generated KeyStore Explorer maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keyclu/darwin.json Adds generated KeyClu maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keycastr/darwin.json Adds generated KeyCastr maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keyboardcleantool/darwin.json Adds generated KeyboardCleanTool maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keyboard-maestro/darwin.json Adds generated Keyboard Maestro maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keyboard-cowboy/darwin.json Adds generated Keyboard Cowboy maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keeweb/darwin.json Adds generated KeeWeb maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/keepingyouawake/darwin.json Adds generated KeepingYouAwake maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/kdenlive/darwin.json Adds generated Kdenlive maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/kap/darwin.json Adds generated Kap maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/kaleidoscope/darwin.json Adds generated Kaleidoscope maintained-app manifest + scripts (macOS).
ee/maintained-apps/outputs/apps.json Adds catalog entries for new maintained apps (macOS).
ee/maintained-apps/inputs/homebrew/krisp.json Adds Homebrew input definition for Krisp.
ee/maintained-apps/inputs/homebrew/knockknock.json Adds Homebrew input definition for KnockKnock.
ee/maintained-apps/inputs/homebrew/knime.json Adds Homebrew input definition for KNIME.
ee/maintained-apps/inputs/homebrew/klokki.json Adds Homebrew input definition for Klokki.
ee/maintained-apps/inputs/homebrew/kiro.json Adds Homebrew input definition for Kiro.
ee/maintained-apps/inputs/homebrew/kiro-cli.json Adds Homebrew input definition for Kiro CLI.
ee/maintained-apps/inputs/homebrew/keystore-explorer.json Adds Homebrew input definition for KeyStore Explorer.
ee/maintained-apps/inputs/homebrew/keyclu.json Adds Homebrew input definition for KeyClu.
ee/maintained-apps/inputs/homebrew/keycastr.json Adds Homebrew input definition for KeyCastr.
ee/maintained-apps/inputs/homebrew/keyboardcleantool.json Adds Homebrew input definition for KeyboardCleanTool.
ee/maintained-apps/inputs/homebrew/keyboard-maestro.json Adds Homebrew input definition for Keyboard Maestro.
ee/maintained-apps/inputs/homebrew/keyboard-cowboy.json Adds Homebrew input definition for Keyboard Cowboy.
ee/maintained-apps/inputs/homebrew/keeweb.json Adds Homebrew input definition for KeeWeb.
ee/maintained-apps/inputs/homebrew/keepingyouawake.json Adds Homebrew input definition for KeepingYouAwake.
ee/maintained-apps/inputs/homebrew/kdenlive.json Adds Homebrew input definition for Kdenlive.
ee/maintained-apps/inputs/homebrew/kap.json Adds Homebrew input definition for Kap.
ee/maintained-apps/inputs/homebrew/kaleidoscope.json Adds Homebrew input definition for Kaleidoscope.

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

],
"refs": {
"ad9fa894": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/<key>volume<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/<key>install-location<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'ai.krisp.krispMac*'\nremove_launchctl_service 'krisp'\nquit_application 'ai.krisp.krispMac'\nremove_pkg_files 'ai.krisp.krispMac*'\nforget_pkg 'ai.krisp.krispMac*'\nsudo rm -rf '/Applications/krisp.app'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Support/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Caches/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Containers/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/ai.krisp.krispMac.*'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/ai.krisp.krispMac.cameraAssistant.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ai.krisp.krispMac.plist'\n",
"ed010849": "#!/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# install pkg files\nquit_and_track_application 'ai.krisp.krispMac'\nsudo installer -pkg \"$TMPDIR/krisp_3.12.5_arm64.pkg\" -target /\nrelaunch_application 'ai.krisp.krispMac'\n"
}
],
"refs": {
"ad9fa894": "#!/bin/bash\n\n# variables\nLOGGED_IN_USER=$(scutil <<< \"show State:/Users/ConsoleUser\" | awk '/Name :/ { print $3 }')\n# functions\n\nexpand_pkgid_and_map() {\n local PKGID=\"$1\"\n local FUNC=\"$2\"\n if [[ \"$PKGID\" == *\"*\" ]]; then\n local prefix=\"${PKGID%\\*}\"\n echo \"Expanding wildcard for PKGID: $PKGID\"\n for receipt in $(pkgutil --pkgs | grep \"^${prefix}\"); do\n echo \"Processing $receipt\"\n \"$FUNC\" \"$receipt\"\n done\n else\n \"$FUNC\" \"$PKGID\"\n fi\n}\n\nforget_pkg() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" forget_receipt\n}\n\nforget_receipt() {\n local PKGID=\"$1\"\n sudo pkgutil --forget \"$PKGID\"\n}\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\nremove_launchctl_service() {\n local service=\"$1\"\n local booleans=(\"true\" \"false\")\n local plist_status\n local paths\n local should_sudo\n\n echo \"Removing launchctl service ${service}\"\n\n for should_sudo in \"${booleans[@]}\"; do\n plist_status=$(launchctl list \"${service}\" 2>/dev/null)\n\n if [[ $plist_status == \\{* ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo launchctl remove \"${service}\"\n else\n launchctl remove \"${service}\"\n fi\n sleep 1\n fi\n\n paths=(\n \"/Library/LaunchAgents/${service}.plist\"\n \"/Library/LaunchDaemons/${service}.plist\"\n )\n\n # if not using sudo, prepend the home directory to the paths\n if [[ $should_sudo == \"false\" ]]; then\n for i in \"${!paths[@]}\"; do\n paths[i]=\"${HOME}${paths[i]}\"\n done\n fi\n\n for path in \"${paths[@]}\"; do\n if [[ -e \"$path\" ]]; then\n if [[ $should_sudo == \"true\" ]]; then\n sudo rm -f -- \"$path\"\n else\n rm -f -- \"$path\"\n fi\n fi\n done\n done\n}\n\nremove_pkg_files() {\n local PKGID=\"$1\"\n expand_pkgid_and_map \"$PKGID\" remove_receipt_files\n}\n\nremove_receipt_files() {\n local PKGID=\"$1\"\n local PKGINFO VOLUME INSTALL_LOCATION FULL_INSTALL_LOCATION\n\n echo \"pkgutil --pkg-info-plist \\\"$PKGID\\\"\"\n PKGINFO=$(pkgutil --pkg-info-plist \"$PKGID\")\n VOLUME=$(echo \"$PKGINFO\" | awk '/<key>volume<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n INSTALL_LOCATION=$(echo \"$PKGINFO\" | awk '/<key>install-location<\\/key>/ {getline; gsub(/.*<string>|<\\/string>.*/, \"\"); print}')\n\n if [ -z \"$INSTALL_LOCATION\" ] || [ \"$INSTALL_LOCATION\" = \"/\" ]; then\n FULL_INSTALL_LOCATION=\"$VOLUME\"\n else\n FULL_INSTALL_LOCATION=\"$VOLUME/$INSTALL_LOCATION\"\n FULL_INSTALL_LOCATION=$(echo \"$FULL_INSTALL_LOCATION\" | sed 's|//|/|g')\n fi\n\n echo \"sudo pkgutil --only-files --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-files --files \"$PKGID\" | sed \"s|^|/${INSTALL_LOCATION}/|\" | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n echo \"sudo pkgutil --only-dirs --files \\\"$PKGID\\\" | sed \\\"s|^|${FULL_INSTALL_LOCATION}/|\\\" | grep '\\\\.app$' | tr '\\\\\\\\n' '\\\\\\\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\"\n sudo pkgutil --only-dirs --files \"$PKGID\" | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" | grep '\\.app$' | tr '\\n' '\\0' | /usr/bin/sudo -u root -E -- /usr/bin/xargs -0 -- /bin/rm -rf\n\n root_app_dir=$(\n sudo pkgutil --only-dirs --files \"$PKGID\" \\\n | sed \"s|^|${FULL_INSTALL_LOCATION}/|\" \\\n | grep 'Applications' \\\n | awk '{ print length, $0 }' \\\n | sort -n \\\n | head -n1 \\\n | cut -d' ' -f2-\n )\n if [ -n \"$root_app_dir\" ]; then\n echo \"sudo rmdir -p \\\"$root_app_dir\\\" 2>/dev/null || :\"\n sudo rmdir -p \"$root_app_dir\" 2>/dev/null || :\n fi\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\nremove_launchctl_service 'ai.krisp.krispMac*'\nremove_launchctl_service 'krisp'\nquit_application 'ai.krisp.krispMac'\nremove_pkg_files 'ai.krisp.krispMac*'\nforget_pkg 'ai.krisp.krispMac*'\nsudo rm -rf '/Applications/krisp.app'\ntrash $LOGGED_IN_USER '~/Library/Application Scripts/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/Application Support/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Caches/ai.krisp.krispMac'\ntrash $LOGGED_IN_USER '~/Library/Containers/ai.krisp.krispMac.LaunchHelper'\ntrash $LOGGED_IN_USER '~/Library/HTTPStorages/ai.krisp.krispMac.*'\ntrash $LOGGED_IN_USER '~/Library/LaunchAgents/ai.krisp.krispMac.cameraAssistant.plist'\ntrash $LOGGED_IN_USER '~/Library/Preferences/ai.krisp.krispMac.plist'\n",
"slug": "kaleidoscope/darwin",
"platform": "darwin",
"unique_identifier": "app.kaleidoscope.v6",
"description": "Kaleidoscope is a spot and merge differences in text and image files or folders."
"slug": "keyboardcleantool/darwin",
"platform": "darwin",
"unique_identifier": "com.hegenberg.KeyboardCleanTool",
"description": "KeyboardCleanTool is a blocks all Keyboard and TouchBar input."
"slug": "knime/darwin",
"platform": "darwin",
"unique_identifier": "org.knime.product",
"description": "KNIME Analytics Platform is a software to create and productionise data science."
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.

3 participants