Full Code of raycast/script-commands for AI

master 68341e8b24c9 cached
963 files
2.2 MB
617.0k tokens
202 symbols
1 requests
Download .txt
Showing preview only (2,447K chars total). Download the full file or copy to clipboard to get everything.
Repository: raycast/script-commands
Branch: master
Commit: 68341e8b24c9
Files: 963
Total size: 2.2 MB

Directory structure:
gitextract_go6t_duu/

├── .gitattributes
├── .github/
│   ├── pull_request_template.md
│   ├── stale.yml
│   └── workflows/
│       └── script-commands.yml
├── .gitignore
├── .swiftlint.yml
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── Tools/
│   └── Toolkit/
│       ├── CONTRIBUTING.md
│       ├── Package.resolved
│       ├── Package.swift
│       ├── README.md
│       ├── Sources/
│       │   ├── Toolkit/
│       │   │   ├── SubCommands/
│       │   │   │   ├── GenerateDocumentation.swift
│       │   │   │   ├── Report.swift
│       │   │   │   ├── SetExecutable.swift
│       │   │   │   └── Version.swift
│       │   │   └── main.swift
│       │   └── ToolkitLibrary/
│       │       ├── Core/
│       │       │   ├── Console.swift
│       │       │   ├── Documentation/
│       │       │   │   └── Documentation.swift
│       │       │   ├── GitShell.swift
│       │       │   ├── RegEx.swift
│       │       │   ├── Report/
│       │       │   │   └── Report.swift
│       │       │   ├── Stores/
│       │       │   │   └── DataManager.swift
│       │       │   └── Toolkit/
│       │       │       ├── Toolkit+Constants.swift
│       │       │       ├── Toolkit+GenerateDocumentation.swift
│       │       │       ├── Toolkit+Mode.swift
│       │       │       ├── Toolkit+ReadContent.swift
│       │       │       ├── Toolkit+Report.swift
│       │       │       ├── Toolkit+ReportType.swift
│       │       │       └── Toolkit.swift
│       │       ├── Errors/
│       │       │   └── Reader+Error.swift
│       │       ├── Extensions/
│       │       │   ├── Array/
│       │       │   │   ├── Array+Metadata.swift
│       │       │   │   └── Array+UInt8.swift
│       │       │   ├── Character/
│       │       │   │   ├── Character+Emoji.swift
│       │       │   │   └── Character+String.swift
│       │       │   ├── Codable/
│       │       │   │   └── Encodable+Data.swift
│       │       │   ├── Data/
│       │       │   │   ├── Data+Bytes.swift
│       │       │   │   └── Data+Decodable.swift
│       │       │   ├── Dictionary/
│       │       │   │   └── Dictionary+Codable.swift
│       │       │   ├── Integer/
│       │       │   │   ├── Int+Indent.swift
│       │       │   │   └── UInt8+Data.swift
│       │       │   ├── String/
│       │       │   │   ├── String+Emoji.swift
│       │       │   │   ├── String+Interpolation.swift
│       │       │   │   ├── String+URL.swift
│       │       │   │   └── String.swift
│       │       │   └── TSCBasic/
│       │       │       ├── AbsolutePath+SocialBasename.swift
│       │       │       └── FileSystem+AbsolutePath.swift
│       │       ├── Models/
│       │       │   ├── Group.swift
│       │       │   ├── Language+Information.swift
│       │       │   ├── Language.swift
│       │       │   ├── Metadata.swift
│       │       │   ├── RaycastData.swift
│       │       │   ├── ScriptCommand+Author.swift
│       │       │   ├── ScriptCommand+Icon.swift
│       │       │   ├── ScriptCommand+Mode.swift
│       │       │   └── ScriptCommand.swift
│       │       ├── Protocols/
│       │       │   └── MarkdownDescriptionProtocol.swift
│       │       └── Typealiases/
│       │           └── Identifier.swift
│       ├── Tests/
│       │   ├── LinuxMain.swift
│       │   └── ToolkitLibraryTests/
│       │       ├── ToolkitLibraryTests.swift
│       │       └── XCTestManifests.swift
│       └── integration.sh
├── _enabled-commands/
│   ├── .gitignore
│   └── README.md
├── commands/
│   ├── README.md
│   ├── ai/
│   │   └── gemini/
│   │       └── gemini.js
│   ├── apps/
│   │   ├── Message/
│   │   │   └── copycode.sh
│   │   ├── agenda/
│   │   │   ├── README.md
│   │   │   ├── agenda-new-note.sh
│   │   │   ├── agenda-on-the-agenda.sh
│   │   │   └── agenda-today.sh
│   │   ├── amphetamine/
│   │   │   ├── amphetamine-off.applescript
│   │   │   └── amphetamine-on.applescript
│   │   ├── baremetrics/
│   │   │   ├── get-arpu.sh
│   │   │   ├── get-arr.sh
│   │   │   ├── get-ltv.sh
│   │   │   ├── get-mrr.sh
│   │   │   └── simple-dashboard.sh
│   │   ├── bartender/
│   │   │   └── bartender-search.applescript
│   │   ├── bear/
│   │   │   ├── bear-add-note.sh
│   │   │   ├── bear-open-note.sh
│   │   │   ├── bear-open-tag.sh
│   │   │   ├── bear-search.sh
│   │   │   ├── bear-today.sh
│   │   │   └── bear-todo.sh
│   │   ├── busycal/
│   │   │   └── new-busycal-event-or-task.applescript
│   │   ├── chatgpt/
│   │   │   └── chatgpt-open-safari.applescript
│   │   ├── claude/
│   │   │   └── claude.js
│   │   ├── cleanshot/
│   │   │   ├── cleanshot-add-quick-access-overlay.sh
│   │   │   ├── cleanshot-annotate.sh
│   │   │   ├── cleanshot-capture-area.sh
│   │   │   ├── cleanshot-capture-fullscreen.sh
│   │   │   ├── cleanshot-capture-previous-area.sh
│   │   │   ├── cleanshot-capture-text.sh
│   │   │   ├── cleanshot-capture-window.sh
│   │   │   ├── cleanshot-open-from-clipboard.sh
│   │   │   ├── cleanshot-pin.sh
│   │   │   ├── cleanshot-record-screen-with-keystroke-pro.sh
│   │   │   ├── cleanshot-record-screen.sh
│   │   │   ├── cleanshot-restore.sh
│   │   │   ├── cleanshot-scrolling-capture.sh
│   │   │   ├── cleanshot-self-timer.sh
│   │   │   └── cleanshot-toggle-desktop-icons.sh
│   │   ├── craft/
│   │   │   ├── craft-create-doc.template.sh
│   │   │   └── craft-search-workspace.template.sh
│   │   ├── deepl/
│   │   │   ├── deepl-app-translate.applescript
│   │   │   └── deepl-web-translate.sh
│   │   ├── devutils/
│   │   │   ├── backslash.sh
│   │   │   ├── base64encode.sh
│   │   │   ├── base64image.sh
│   │   │   ├── cronparser.sh
│   │   │   ├── cssformatter.sh
│   │   │   ├── csv2json.sh
│   │   │   ├── erbformatter.sh
│   │   │   ├── hashing.sh
│   │   │   ├── html2jsx.sh
│   │   │   ├── htmlencode.sh
│   │   │   ├── htmlformatter.sh
│   │   │   ├── htmlpreview.sh
│   │   │   ├── jsformatter.sh
│   │   │   ├── json2csv.sh
│   │   │   ├── json2yaml.sh
│   │   │   ├── jsonformatter.sh
│   │   │   ├── jwt.sh
│   │   │   ├── lessformatter.sh
│   │   │   ├── loremipsum.sh
│   │   │   ├── markdownpreview.sh
│   │   │   ├── numberbase.sh
│   │   │   ├── qrcode.sh
│   │   │   ├── querystringparser.sh
│   │   │   ├── regextester.sh
│   │   │   ├── scssformatter.sh
│   │   │   ├── sqlformatter.sh
│   │   │   ├── stringcaseconverter.sh
│   │   │   ├── stringinspect.sh
│   │   │   ├── textdiff.sh
│   │   │   ├── unixtime.sh
│   │   │   ├── urlencode.sh
│   │   │   ├── uuidtool.sh
│   │   │   ├── xmlformatter.sh
│   │   │   └── yaml2json.sh
│   │   ├── dictionary/
│   │   │   ├── images/
│   │   │   │   └── dictionary.icns
│   │   │   └── look-up-in-dictionary.applescript
│   │   ├── dnd-me/
│   │   │   ├── start-dnd-me.sh
│   │   │   └── stop-dnd-me.sh
│   │   ├── downie/
│   │   │   └── download-video.sh
│   │   ├── espanso/
│   │   │   ├── disable-espanso.sh
│   │   │   ├── enable-espanso.sh
│   │   │   ├── espanso-create-expansion.sh
│   │   │   ├── restart-espanso.sh
│   │   │   ├── start-espanso.sh
│   │   │   └── stop-espanso.sh
│   │   ├── eudic/
│   │   │   └── look-up-in-eudic.applescript
│   │   ├── evernote/
│   │   │   ├── create-note-paste-clipboard.applescript
│   │   │   └── create-note.applescript
│   │   ├── expressvpn/
│   │   │   ├── expressvpn-connect.applescript
│   │   │   ├── expressvpn-disconnect.applescript
│   │   │   └── expressvpn-reconnect.applescript
│   │   ├── fantastical/
│   │   │   ├── create-event.applescript
│   │   │   └── create-todo-in-fantastical.applescript
│   │   ├── ferdi/
│   │   │   ├── ferdi-open-service-by-index.applescript
│   │   │   └── ferdi-open-service-by-name.applescript
│   │   ├── find-my/
│   │   │   ├── README.md
│   │   │   ├── fmp.js
│   │   │   └── package.json
│   │   ├── focus/
│   │   │   ├── focus-preferences.sh
│   │   │   ├── focus-start-break-5.sh
│   │   │   ├── focus-start-custom-break.sh
│   │   │   ├── focus-start-custom-session.sh
│   │   │   ├── focus-start-session-25.sh
│   │   │   ├── focus-start-session.sh
│   │   │   ├── focus-stop-break.sh
│   │   │   ├── focus-stop-session.sh
│   │   │   └── focus-toggle-focus.sh
│   │   ├── goodlinks/
│   │   │   ├── goodlinks-last-unread-link.sh
│   │   │   ├── goodlinks-open-link.sh
│   │   │   ├── goodlinks-random-unread-link.sh
│   │   │   ├── goodlinks-read-list.sh
│   │   │   ├── goodlinks-save-link.sh
│   │   │   ├── goodlinks-starred-list.sh
│   │   │   ├── goodlinks-tagged-links.sh
│   │   │   ├── goodlinks-unread-list.sh
│   │   │   └── goodlinks-untagged-list.sh
│   │   ├── hazeover/
│   │   │   ├── hazeover-set-intensity.applescript
│   │   │   └── hazeover-toggle-dimming.applescript
│   │   ├── hyper/
│   │   │   └── hyper-run-shell-command.applescript
│   │   ├── iconsur/
│   │   │   └── iconsur.sh
│   │   ├── iterm/
│   │   │   ├── iterm-open-profile-in-new-window.applescript
│   │   │   └── iterm-run-shell-command.applescript
│   │   ├── lungo/
│   │   │   ├── lungo-activate.sh
│   │   │   ├── lungo-deactivate.sh
│   │   │   └── lungo-toggle.sh
│   │   ├── mail/
│   │   │   ├── copy-captcha-from-mail.py
│   │   │   └── copy-foreground-mail-deeplink.applescript
│   │   ├── medo/
│   │   │   ├── add-task.sh
│   │   │   ├── medo-float-large.sh
│   │   │   ├── medo-float-small.sh
│   │   │   └── medo-float.sh
│   │   ├── meetingbar/
│   │   │   ├── meetingbar-create-meeting.applescript
│   │   │   └── meetingbar-join-meeting.applescript
│   │   ├── menubarx/
│   │   │   ├── close-last-menubarx-tab.sh
│   │   │   ├── open-in-menubarx.sh
│   │   │   └── open-tab-in-menubar.applescript
│   │   ├── mullvad/
│   │   │   ├── README.md
│   │   │   ├── connect.sh
│   │   │   ├── disconnect.sh
│   │   │   ├── location.sh
│   │   │   ├── reconnect.sh
│   │   │   ├── search.sh
│   │   │   └── status.sh
│   │   ├── noteplan3/
│   │   │   ├── README.md
│   │   │   ├── noteplan-append-daily-note.sh
│   │   │   └── noteplan-new-note-from-clipboard.sh
│   │   ├── notes/
│   │   │   ├── append-note-from-clipboard.applescript
│   │   │   ├── create-note-from-clipboard.applescript
│   │   │   ├── create-note.applescript
│   │   │   ├── open-note.applescript
│   │   │   └── search-note-by-name.applescript
│   │   ├── obsidian/
│   │   │   ├── obsidian-create-note.template.sh
│   │   │   └── obsidian-search-vault.template.sh
│   │   ├── one-thing/
│   │   │   ├── one-thing-clear-text.sh
│   │   │   └── one-thing-set-text.sh
│   │   ├── openvpn/
│   │   │   ├── connect-openvpn.applescript
│   │   │   ├── disconnect-openvpn.applescript
│   │   │   └── quit-openvpn.applescript
│   │   ├── phpstorm/
│   │   │   ├── .gitignore
│   │   │   └── recent-projects.sh
│   │   ├── plash/
│   │   │   ├── plash-add-website.sh
│   │   │   ├── plash-next-website.sh
│   │   │   ├── plash-previous-website.sh
│   │   │   ├── plash-random-website.sh
│   │   │   ├── plash-reload-website.sh
│   │   │   └── plash-toggle-browser-mode.sh
│   │   ├── playground/
│   │   │   ├── README.md
│   │   │   ├── open-new-playground.py
│   │   │   └── open-new-view-playground.py
│   │   ├── pulse-secure/
│   │   │   ├── README.md
│   │   │   ├── pulse-secure-connect.applescript
│   │   │   ├── pulse-secure-disconnect.applescript
│   │   │   ├── pulse-secure-resume.applescript
│   │   │   └── pulse-secure-suspend.applescript
│   │   ├── quip/
│   │   │   ├── .gitignore
│   │   │   ├── README.org
│   │   │   ├── quip-new.template.py
│   │   │   ├── quip.py
│   │   │   ├── quip_config.chezmoi.template.ini
│   │   │   ├── quip_config.template.ini
│   │   │   ├── quip_utils.py
│   │   │   └── set-up-quip-commands.py
│   │   ├── raycast/
│   │   │   └── celebrate.sh
│   │   ├── reminders/
│   │   │   └── reminders-create-reminder.sh
│   │   ├── safari/
│   │   │   ├── README.md
│   │   │   ├── safari-bing-edge-user-agent.applescript
│   │   │   ├── safari-clear-cache-reload.applescript
│   │   │   ├── safari-close-all-tabs.applescript
│   │   │   ├── safari-close-duplicated-tabs.applescript
│   │   │   ├── safari-close-other-tabs.applescript
│   │   │   ├── safari-close-tabs-left.applescript
│   │   │   ├── safari-close-tabs-right.applescript
│   │   │   ├── safari-create-reading-list-item.applescript
│   │   │   ├── safari-current-page-url-in-chrome.applescript
│   │   │   ├── safari-current-page-url-in-firefox.applescript
│   │   │   ├── safari-download-url.applescript
│   │   │   └── safari-duplicate-tab.applescript
│   │   ├── session/
│   │   │   ├── session-abandon.sh
│   │   │   ├── session-finish.sh
│   │   │   ├── session-pause.sh
│   │   │   ├── session-start-new.sh
│   │   │   └── session-start-previous.sh
│   │   ├── sidenotes/
│   │   │   └── sidenotes-create-note.applescript
│   │   ├── sip/
│   │   │   ├── sip-add-hex-color.sh
│   │   │   ├── sip-check-contrast-hex.sh
│   │   │   ├── sip-open-check-contrast.sh
│   │   │   └── sip-show-picker.sh
│   │   ├── stickies/
│   │   │   └── new-floating-sticky.applescript
│   │   ├── sublime/
│   │   │   └── open-with-sublime.applescript
│   │   ├── surfshark/
│   │   │   ├── surfshark-vpn-start.sh
│   │   │   ├── surfshark-vpn-status.sh
│   │   │   ├── surfshark-vpn-stop.sh
│   │   │   └── surfshark.config.sh
│   │   ├── tailscale/
│   │   │   ├── README.md
│   │   │   ├── tailscale-connect.sh
│   │   │   ├── tailscale-disconnect.sh
│   │   │   ├── tailscale-ip.sh
│   │   │   └── tailscale-switch.sh
│   │   ├── terminal-translate/
│   │   │   └── translate.sh
│   │   ├── things/
│   │   │   ├── README.md
│   │   │   ├── things-create-todo.sh
│   │   │   ├── things-current-todo.applescript
│   │   │   ├── things-search-to-dos.sh
│   │   │   └── things-today.applescript
│   │   ├── timing/
│   │   │   ├── timing-start-timer.js
│   │   │   └── timing-stop-timer.js
│   │   ├── todoist/
│   │   │   ├── create-task.template.sh
│   │   │   └── get-tasks.template.sh
│   │   ├── translate-shell/
│   │   │   ├── translate-shell-language-pair.py
│   │   │   ├── translate-to-en.sh
│   │   │   └── translate-to-zh.sh
│   │   ├── trello/
│   │   │   └── create-trello-card.template.py
│   │   ├── tunnelblick/
│   │   │   ├── tunnelblick-connect-all.applescript
│   │   │   ├── tunnelblick-connect.applescript
│   │   │   ├── tunnelblick-disconnect-all.applescript
│   │   │   └── tunnelblick-disconnect.applescript
│   │   ├── viscosity/
│   │   │   ├── viscosity-connect-all.applescript
│   │   │   ├── viscosity-connect.applescript
│   │   │   ├── viscosity-disconnect-all.applescript
│   │   │   └── viscosity-disconnect.applescript
│   │   ├── warp/
│   │   │   ├── warp-reauth.sh
│   │   │   ├── warp-start.sh
│   │   │   ├── warp-status.sh
│   │   │   ├── warp-stop.sh
│   │   │   └── warp-toggle.sh
│   │   ├── webstorm/
│   │   │   └── open-workspace.template.sh
│   │   ├── wikipedia/
│   │   │   └── wikipedia-search.py
│   │   └── y-pomodoro/
│   │       ├── pause.sh
│   │       ├── resume.sh
│   │       ├── show.sh
│   │       ├── start.sh
│   │       └── stop.sh
│   ├── browsing/
│   │   ├── Youtube Shorts in video player.sh
│   │   ├── chrome-current-page-url.sh
│   │   ├── convert-twitter-to-nitter.js
│   │   ├── git-io.sh
│   │   ├── go-to-outine.sh
│   │   ├── new-browser-window.sh
│   │   ├── open-chrome-without-cors.sh
│   │   ├── open-in-guest-profile.sh
│   │   ├── open-multiple-websites-on-safari.template.sh
│   │   ├── peekalink.template.sh
│   │   ├── safari-current-page-url.sh
│   │   ├── safari-current-window-urls.applescript
│   │   ├── shlink-create-short-url.template.sh
│   │   ├── short-url-emoji.sh
│   │   ├── shorten-url-bitly.template.sh
│   │   ├── shorten-url.sh
│   │   ├── to-private-browsing.sh
│   │   └── website-screenshots.sh
│   ├── communication/
│   │   ├── call-with-iphone.sh
│   │   ├── cloudup/
│   │   │   ├── cloudup-paste.sh
│   │   │   ├── cloudup-pick.sh
│   │   │   └── cloudup-upload.sh
│   │   ├── duckduckgo-email-protection/
│   │   │   ├── README.md
│   │   │   ├── configure-@duck.com-script-command.applescript
│   │   │   └── generate-unique-email-address.applescript
│   │   ├── emojis/
│   │   │   ├── emoji-copy.sh
│   │   │   ├── emojis-search.sh
│   │   │   └── random-emoji.sh
│   │   ├── gmail/
│   │   │   └── google-gmail.sh
│   │   ├── google-meet/
│   │   │   └── meet.sh
│   │   ├── imessage-2fa.sh
│   │   ├── let-me-google-that.sh
│   │   ├── mail/
│   │   │   └── open-most-recent-email.applescript
│   │   ├── messenger/
│   │   │   └── messenger-open-conversation.applescript
│   │   ├── say.sh
│   │   ├── share-secret-doppler.py
│   │   ├── slack/
│   │   │   ├── add-slack-reminder.template.sh
│   │   │   ├── clear-slack-DND-status.sh
│   │   │   ├── clear-slack-status.template.sh
│   │   │   ├── set-slack-DND-status.sh
│   │   │   ├── set-slack-status-spotify.sh
│   │   │   ├── set-slack-status.template.sh
│   │   │   ├── set-slack-wfh-status.sh
│   │   │   ├── slack-dev-mode.sh
│   │   │   ├── slack-jump-to.applescript
│   │   │   ├── slack-open-workspace-by-index.applescript
│   │   │   ├── slack-open-workspace-by-name.applescript
│   │   │   └── slack-send-message.applescript
│   │   ├── xkcdpass.sh
│   │   └── zoom/
│   │       ├── leave-meeting.applescript
│   │       ├── rename-profile.applescript
│   │       ├── toggle-mic.applescript
│   │       └── toggle-video.applescript
│   ├── conversions/
│   │   ├── change-case/
│   │   │   ├── camelcase.py
│   │   │   ├── kebabcase.py
│   │   │   ├── lowercase.py
│   │   │   ├── snakecase.py
│   │   │   ├── titlecase.py
│   │   │   └── uppercase.py
│   │   ├── clipboard-ocr.sh
│   │   ├── clipboard-to-markdown.js
│   │   ├── color-conversion.sh
│   │   ├── column-to-comma.sh
│   │   ├── create-gif-from-video.py
│   │   ├── create-markdown-table.js
│   │   ├── epoch-to-human-date.sh
│   │   ├── google-docs-to-markdown.sh
│   │   ├── hex-to-rgb.sh
│   │   ├── hex-to-rgba.sh
│   │   ├── human-date-to-epoch.sh
│   │   ├── inputs-to-markdown-link.sh
│   │   ├── markdown-to-telegram.py
│   │   ├── paste-as-plain-text.applescript
│   │   ├── qr-code-screenshot-to-text.sh
│   │   ├── qrcode-generate.sh
│   │   ├── raw-html-to-rich-text-clipboard.sh
│   │   ├── rich-text-clipboard-to-markdown.sh
│   │   ├── space-fixer.sh
│   │   ├── strikethrough.sh
│   │   ├── trim-newlines-tabs.sh
│   │   ├── unicode-superscript.sh
│   │   ├── unix-time-reader.sh
│   │   ├── vaporwave-text.sh
│   │   ├── what-day-is.py
│   │   └── zalgo-text.swift
│   ├── culture/
│   │   ├── prayer-summary.template.sh
│   │   └── prayer-times.sh
│   ├── dashboard/
│   │   ├── bitcoin-price-usd.sh
│   │   ├── countdowns/
│   │   │   ├── countdown-to-christmas.sh
│   │   │   ├── countdown-to-date.template.sh
│   │   │   └── create-countdown.template.sh
│   │   ├── crypto-portfolio.py
│   │   ├── current-weather.sh
│   │   ├── doge.sh
│   │   ├── ethereum-price-usd.sh
│   │   ├── fear-index.sh
│   │   ├── firebase/
│   │   │   ├── firebase-authentication-get-token.template.sh
│   │   │   └── firebase-realtime-db-get-data.template.sh
│   │   ├── mood-meter/
│   │   │   ├── add-mood.js
│   │   │   ├── display-mood-month.js
│   │   │   └── display-mood-year.js
│   │   ├── nextdns-status-check.py
│   │   ├── open-ai-usage.sh
│   │   ├── open-weather/
│   │   │   ├── weather-current.template.sh
│   │   │   └── weather-forecast.template.sh
│   │   ├── precious-metals.sh
│   │   ├── sabnzbd-queue-status.template.sh
│   │   ├── speedtest.sh
│   │   ├── stock-portfolio.rb
│   │   ├── system-activity.sh
│   │   ├── tesla.template.sh
│   │   ├── twitter-statistics.template.rb
│   │   ├── world-time.sh
│   │   ├── year-progress.sh
│   │   └── youtube-statistics.template.rb
│   ├── dashboards/
│   │   └── iperf-speed-test.template.sh
│   ├── developer-utils/
│   │   ├── add-ssh-keys.template.applescript
│   │   ├── aws/
│   │   │   ├── amazon-s3-download.sh
│   │   │   ├── aws-sso-util.sh
│   │   │   └── whatismyregion.sh
│   │   ├── base-converter.sh
│   │   ├── base64-decode-input.sh
│   │   ├── base64-encode-input.sh
│   │   ├── brew/
│   │   │   ├── brew-cask-upgrade.sh
│   │   │   ├── brew-doctor.sh
│   │   │   ├── brew-install.sh
│   │   │   ├── brew-leaves.sh
│   │   │   ├── brew-list.sh
│   │   │   ├── brew-outdated.sh
│   │   │   ├── brew-services-list.sh
│   │   │   ├── brew-services-restart.sh
│   │   │   ├── brew-services-start.sh
│   │   │   ├── brew-services-stop.sh
│   │   │   ├── brew-uninstall-application.sh
│   │   │   ├── brew-update.sh
│   │   │   └── brew-upgrade.sh
│   │   ├── cheat.sh
│   │   ├── check-domain.template.sh
│   │   ├── clear-derived-data.sh
│   │   ├── clear_xcode.sh
│   │   ├── cloudflare/
│   │   │   └── purge-cloudflare-cache.template.sh
│   │   ├── copy-focused-finder-window-path.sh
│   │   ├── copy-ssh-public-key.sh
│   │   ├── count-characters.sh
│   │   ├── create-image-from-code.sh
│   │   ├── decode-base64.sh
│   │   ├── decode-jwt.sh
│   │   ├── decode-url.sh
│   │   ├── delete-current-line.applescript
│   │   ├── dig.sh
│   │   ├── docker/
│   │   │   ├── clean-docker.sh
│   │   │   ├── docker-images.sh
│   │   │   ├── docker-ps.sh
│   │   │   ├── docker-system-prune.sh
│   │   │   ├── run-docker.sh
│   │   │   └── stop-docker.sh
│   │   ├── encode-base64.sh
│   │   ├── encode-url.sh
│   │   ├── error-info.sh
│   │   ├── escape-shell-chars.sh
│   │   ├── flutter-create.sh
│   │   ├── format-swift.sh
│   │   ├── generate-git-ignore.sh
│   │   ├── generate-password.sh
│   │   ├── generate-ulid.sh
│   │   ├── generate-uuid.sh
│   │   ├── genpasswd.py
│   │   ├── get-ttfb.sh
│   │   ├── git/
│   │   │   ├── git-clear-changes.sh
│   │   │   ├── git-save-changes.sh
│   │   │   ├── git-standup.sh
│   │   │   ├── git-status.sh
│   │   │   ├── git-switch-branch.sh
│   │   │   └── git-sync-changes.sh
│   │   ├── github/
│   │   │   ├── create-github-gist.template.sh
│   │   │   ├── github-contributions.template.sh
│   │   │   ├── github-open-commit-history.sh
│   │   │   ├── github-open-pull-requests-details.template.rb
│   │   │   ├── github-open-pull-requests-page.sh
│   │   │   ├── github-open-pull-requests.template.rb
│   │   │   ├── github-repository-stars.template.rb
│   │   │   ├── github-repository-stars_all_repos_template.rb
│   │   │   ├── github-review-requests.template.rb
│   │   │   ├── github-unread-notifications.template.sh
│   │   │   └── open-gh-repo-pr-or-issue.sh
│   │   ├── gitlab/
│   │   │   ├── gitlab-issues.template.py
│   │   │   ├── gitlab-mergerequests.template.py
│   │   │   ├── gitlab-todos.template.py
│   │   │   ├── gitlabconfig.py
│   │   │   └── gitlabhelper.py
│   │   ├── google/
│   │   │   ├── google-lighthouse.sh
│   │   │   ├── google-psi-desktop.sh
│   │   │   └── google-psi-mobile.sh
│   │   ├── ignore-package-folders-time-machine.template.sh
│   │   ├── ip/
│   │   │   ├── get-external-ip-v4.sh
│   │   │   ├── get-external-ip-v6.sh
│   │   │   ├── get-local-ip-v4.sh
│   │   │   ├── get-local-ip-v6.sh
│   │   │   ├── get-url-ip-v4.sh
│   │   │   └── get-url-ip-v6.sh
│   │   ├── is-it-up.sh
│   │   ├── join-lines.sh
│   │   ├── json-stringify-text.js
│   │   ├── json-to-go-struct.sh
│   │   ├── lorem-ipsum.sh
│   │   ├── md5-hash.sh
│   │   ├── microlink.sh
│   │   ├── minikube/
│   │   │   ├── minikube-config-set.sh
│   │   │   ├── minikube-pause.sh
│   │   │   ├── minikube-start.sh
│   │   │   ├── minikube-status.sh
│   │   │   ├── minikube-stop.sh
│   │   │   └── minikube-unpause.sh
│   │   ├── open-link-simulator.applescript
│   │   ├── pa11y.sh
│   │   ├── ping-monitor.template.sh
│   │   ├── ping.sh
│   │   ├── prettify-json.sh
│   │   ├── record-simulator.sh
│   │   ├── run-bash-command.sh
│   │   ├── run-command-in-finder.sh
│   │   ├── search-script-command.sh
│   │   ├── search-script-command.swift
│   │   ├── sentry/
│   │   │   ├── sentry-unresolved-issues-by-project.template.py
│   │   │   └── sentry-unresolved-issues.template.py
│   │   ├── sha1-hash.sh
│   │   ├── solana/
│   │   │   ├── solana-tx-blink-extract.sh
│   │   │   ├── solana-tx-details.sh
│   │   │   └── solana-tx-inspector.sh
│   │   ├── strong-password-generator.sh
│   │   ├── time-between-dates.js
│   │   ├── time-calculator.js
│   │   ├── tldr.sh
│   │   ├── toggle_ssh_proxy_tunnel.template.sh
│   │   ├── transform-case.sh
│   │   ├── trim-git-commit-hash.sh
│   │   ├── unix-timestamp.sh
│   │   ├── unshorten-url.sh
│   │   ├── view-scripting-dictionary.sh
│   │   ├── vscode/
│   │   │   ├── open-folder-in-vscode.applescript
│   │   │   └── open-project-in-vscode.sh
│   │   ├── wayback-machine-save.sh
│   │   ├── whois.sh
│   │   └── xcode/
│   │       ├── xcode-last-project.sh
│   │       └── xcode-recent-project.sh
│   ├── extensions.json
│   ├── home/
│   │   ├── elgato/
│   │   │   ├── elgato-key-light-decrease-brightness.template.rb
│   │   │   ├── elgato-key-light-increase-brightness.template.rb
│   │   │   ├── elgato-key-light-turn-off.template.rb
│   │   │   └── elgato-key-light-turn-on.template.rb
│   │   └── philips-hue/
│   │       ├── hue-bulb.template.mjs
│   │       ├── hue-lights-inline.template.mjs
│   │       ├── hue-room.template.mjs
│   │       └── hue-rooms-inline.template.mjs
│   ├── math/
│   │   ├── calculate-CAGR.sh
│   │   ├── calculate-combinations.js
│   │   ├── calculate-growth.sh
│   │   ├── latex-calculator.py
│   │   ├── random-number.sh
│   │   └── wolfram-alpha.template.sh
│   ├── media/
│   │   ├── apple-music/
│   │   │   ├── apple-music-current-track.applescript
│   │   │   ├── apple-music-go-to-artist-page.sh
│   │   │   ├── apple-music-hate-current-track.applescript
│   │   │   ├── apple-music-love-current-track.applescript
│   │   │   ├── apple-music-next.applescript
│   │   │   ├── apple-music-pause.applescript
│   │   │   ├── apple-music-play.applescript
│   │   │   ├── apple-music-previous.applescript
│   │   │   ├── apple-music-repeat.applescript
│   │   │   ├── apple-music-search.applescript
│   │   │   ├── apple-music-set-volume.applescript
│   │   │   ├── apple-music-shuffle.applescript
│   │   │   ├── apple-music-stop.applescript
│   │   │   ├── apple-music-volume-down.applescript
│   │   │   └── apple-music-volume-up.applescript
│   │   ├── apple-tv/
│   │   │   ├── apple-tv-pause.applescript
│   │   │   ├── apple-tv-play-movie.applescript
│   │   │   ├── apple-tv-play.applescript
│   │   │   ├── apple-tv-set-volume.applescript
│   │   │   └── apple-tv-stop.applescript
│   │   ├── cmus/
│   │   │   ├── next-track.sh
│   │   │   ├── play-pause.sh
│   │   │   ├── previous-track.sh
│   │   │   ├── toggle-repeat.sh
│   │   │   ├── toggle-shuffle.sh
│   │   │   └── track-info.sh
│   │   ├── endel/
│   │   │   ├── endel-alarm.sh
│   │   │   ├── endel-deep-focus.sh
│   │   │   ├── endel-focus.sh
│   │   │   ├── endel-lullaby.sh
│   │   │   ├── endel-recovery.sh
│   │   │   ├── endel-relax.sh
│   │   │   ├── endel-scenarios-deepwork.sh
│   │   │   ├── endel-scenarios-homework.sh
│   │   │   ├── endel-scenarios-meditate.sh
│   │   │   ├── endel-scenarios-powernap.sh
│   │   │   ├── endel-scenarios-read.sh
│   │   │   ├── endel-scenarios-selfcare.sh
│   │   │   ├── endel-scenarios-unwind.sh
│   │   │   ├── endel-scenarios-workout.sh
│   │   │   ├── endel-scenarios-yoga.sh
│   │   │   ├── endel-sleep.sh
│   │   │   ├── endel-study.sh
│   │   │   ├── endel-timer.sh
│   │   │   └── endel-wisdom.sh
│   │   ├── foobar2000/
│   │   │   ├── foobar2000-next.applescript
│   │   │   ├── foobar2000-pause.applescript
│   │   │   └── foobar2000-pervious.applescript
│   │   ├── lowfi/
│   │   │   └── lowfi.sh
│   │   ├── sonos/
│   │   │   ├── README.md
│   │   │   ├── sonos-play-favorite.sh
│   │   │   ├── sonos-volume-down.sh
│   │   │   ├── sonos-volume-set.sh
│   │   │   └── sonos-volume-up.sh
│   │   ├── speaker-setup/
│   │   │   └── speaker-setup.sh
│   │   ├── spotify/
│   │   │   ├── create-spotify-command.js
│   │   │   ├── spotify-current-track.applescript
│   │   │   ├── spotify-next-track.applescript
│   │   │   ├── spotify-now-playing-url.applescript
│   │   │   ├── spotify-pause.applescript
│   │   │   ├── spotify-play-pause.applescript
│   │   │   ├── spotify-play-playlist.template.applescript
│   │   │   ├── spotify-play.applescript
│   │   │   └── spotify-previous-track.applescript
│   │   └── tidal/
│   │       ├── tidal-next-track.applescript
│   │       ├── tidal-pause.applescript
│   │       ├── tidal-play.applescript
│   │       ├── tidal-previous-track.applescript
│   │       └── tidal.applescript
│   ├── navigation/
│   │   ├── hide-application.applescript
│   │   ├── justfocus.applescript
│   │   ├── open-applications.sh
│   │   ├── open-clipboard-in-pixelmator-pro.applescript
│   │   ├── open-desktop-url-from-clipboard.swift
│   │   ├── open-desktop.sh
│   │   ├── open-documents.sh
│   │   ├── open-downloads.sh
│   │   ├── open-finder-from-iterm.applescript
│   │   ├── open-finder-from-terminal.applescript
│   │   ├── open-finder.sh
│   │   ├── open-home.sh
│   │   ├── open-iterm-from-finder.applescript
│   │   ├── open-last-downloaded.sh
│   │   ├── open-library.sh
│   │   ├── open-terminal-from-finder.applescript
│   │   ├── open-url-from-clipboard.sh
│   │   ├── quit-application.applescript
│   │   ├── restart-application.applescript
│   │   ├── search-in-dash.sh
│   │   └── search-in-devdocs.sh
│   ├── productivity/
│   │   ├── bitwarden/
│   │   │   ├── README.md
│   │   │   ├── copy-first-matching-password.sh
│   │   │   ├── copy-first-matching-totp.sh
│   │   │   ├── create-text-send.sh
│   │   │   ├── delete-send.sh
│   │   │   ├── edit-send.sh
│   │   │   ├── list-sends.sh
│   │   │   ├── lock.sh
│   │   │   ├── log-in-apikey.template.sh
│   │   │   ├── log-in.template.sh
│   │   │   ├── log-out.sh
│   │   │   ├── receive-text-send.sh
│   │   │   ├── search-vault-items.sh
│   │   │   ├── status.sh
│   │   │   └── unlock.sh
│   │   ├── imgur/
│   │   │   ├── imgur-upload-clipboard-image.template.sh
│   │   │   ├── imgur-upload-latest-screenshot.template.sh
│   │   │   └── screenshot-and-imgur.sh
│   │   ├── macocr/
│   │   │   └── macocr-run-ocr.sh
│   │   ├── pomodoro/
│   │   │   ├── pomodoro-start-timer.sh
│   │   │   ├── pomodoro-status.sh
│   │   │   └── pomodoro-stop-timer.sh
│   │   ├── qpdf/
│   │   │   └── compress-pdf-qpdf.sh
│   │   ├── stopwatch/
│   │   │   ├── stopwatch-progress.sh
│   │   │   ├── stopwatch-start.sh
│   │   │   └── stopwatch-stop.sh
│   │   ├── tesseract/
│   │   │   └── tesseract-ocr.sh
│   │   └── writing/
│   │       ├── dictionary-lookup.swift
│   │       └── word-count.sh
│   ├── remote-control/
│   │   ├── ddc/
│   │   │   ├── arm64/
│   │   │   │   ├── screen-dp.sh
│   │   │   │   └── screen-hdmi.sh
│   │   │   └── x86/
│   │   │       ├── screen-dp.sh
│   │   │       └── screen-hdmi.sh
│   │   ├── denon-avr/
│   │   │   ├── configure.applescript
│   │   │   ├── power-off.applescript
│   │   │   ├── power-on.applescript
│   │   │   ├── set-volume.applescript
│   │   │   ├── volume-down.applescript
│   │   │   └── volume-up.applescript
│   │   ├── lg-tv/
│   │   │   ├── README.md
│   │   │   ├── authenticate.sh
│   │   │   ├── change-channel.sh
│   │   │   ├── change-input.sh
│   │   │   ├── change-sound-output.sh
│   │   │   ├── change-volume.sh
│   │   │   ├── close-app.sh
│   │   │   ├── execute-command.sh
│   │   │   ├── fast-forward-media.sh
│   │   │   ├── list-apps.sh
│   │   │   ├── list-channels.sh
│   │   │   ├── list-inputs.sh
│   │   │   ├── list-launch-points.sh
│   │   │   ├── list-services.sh
│   │   │   ├── mute.sh
│   │   │   ├── open-app-with-payload.sh
│   │   │   ├── open-app.sh
│   │   │   ├── open-browser.sh
│   │   │   ├── open-youtube-id.sh
│   │   │   ├── open-youtube-url.sh
│   │   │   ├── pause-media.sh
│   │   │   ├── play-media.sh
│   │   │   ├── rewind-media.sh
│   │   │   ├── scan.sh
│   │   │   ├── send-notification-with-icon.sh
│   │   │   ├── send-notification.sh
│   │   │   ├── show-audio-status.sh
│   │   │   ├── show-audio-volume.sh
│   │   │   ├── show-channel.sh
│   │   │   ├── show-config.sh
│   │   │   ├── show-cursor-socket.sh
│   │   │   ├── show-fg-app-info.sh
│   │   │   ├── show-picture-settings.sh
│   │   │   ├── show-power-state.sh
│   │   │   ├── show-software-info.sh
│   │   │   ├── show-sound-output.sh
│   │   │   ├── show-tv-info.sh
│   │   │   ├── stop-media.sh
│   │   │   ├── switch-next-channel.sh
│   │   │   ├── switch-previous-channel.sh
│   │   │   ├── turn-off-3d.sh
│   │   │   ├── turn-off-screen.sh
│   │   │   ├── turn-off.sh
│   │   │   ├── turn-on-3d.sh
│   │   │   ├── turn-on-screen.sh
│   │   │   ├── turn-on.sh
│   │   │   ├── turn-volume-down.sh
│   │   │   ├── turn-volume-up.sh
│   │   │   └── unmute.sh
│   │   └── samsung-tv/
│   │       ├── README.md
│   │       ├── samsungexceptions.py
│   │       ├── samsunghelper.py
│   │       ├── samsungshortcuts.py
│   │       ├── turn-off.template.py
│   │       └── turn-on.template.py
│   ├── system/
│   │   ├── Low Power Mode.sh
│   │   ├── Network Info.sh
│   │   ├── add-spacer-to-dock.sh
│   │   ├── audio/
│   │   │   ├── airpodsbattery.sh
│   │   │   ├── audio-output-switch.template.applescript
│   │   │   ├── bluetooth-headphones-battery-level.template.sh
│   │   │   ├── get-audio-devices.swift
│   │   │   ├── get-selected-audio-device.swift
│   │   │   ├── reload-coreaudio.sh
│   │   │   ├── set-audio-device.swift
│   │   │   ├── toggle-airpods.template.swift
│   │   │   ├── toggle-mic.applescript
│   │   │   └── toggle-mute-notification-sounds.applescript
│   │   ├── battery-info.sh
│   │   ├── bluetooth.template.applescript
│   │   ├── brightness.sh
│   │   ├── caffeinate-disable.sh
│   │   ├── caffeinate-enable.sh
│   │   ├── caffeinate-status.sh
│   │   ├── caffeinate-status.swift
│   │   ├── capture-fullscreen-to-clipboard.sh
│   │   ├── capture-fullscreen-to-desktop.sh
│   │   ├── capture-screen-selection-to-clipboard.sh
│   │   ├── capture-screen-selection-to-desktop.sh
│   │   ├── close-finder-windows.applescript
│   │   ├── copy-availability.swift
│   │   ├── copy-last-download.swift
│   │   ├── copy-last-screenshot.swift
│   │   ├── copy-selection-to-clipboard.applescript
│   │   ├── create-new-file-in-finder.applescript
│   │   ├── create-new-file.applescript
│   │   ├── custom-window.applescript
│   │   ├── default-browser-arc.applescript
│   │   ├── default-browser-chrome.applescript
│   │   ├── default-browser-chromium.applescript
│   │   ├── default-browser-firefox.applescript
│   │   ├── default-browser-front-most-app.applescript
│   │   ├── default-browser-safari.applescript
│   │   ├── delete-selected-files.sh
│   │   ├── disk-free.sh
│   │   ├── disk-usage.sh
│   │   ├── dismiss-notifications.applescript
│   │   ├── dnd-off.sh
│   │   ├── dnd-on.sh
│   │   ├── do-not-disturb.sh
│   │   ├── dock-autohide-toggle.sh
│   │   ├── dock-set-autohide.sh
│   │   ├── dock-set-position.sh
│   │   ├── eject-all-disks.applescript
│   │   ├── empty-clipboard.sh
│   │   ├── empty-trash.applescript
│   │   ├── flush-dns.sh
│   │   ├── inline-cpu-usage-percent.sh
│   │   ├── kill-a-process-on-port.sh
│   │   ├── kill-airdrop.processes.sh
│   │   ├── kill-process.sh
│   │   ├── largest-cpu-process.sh
│   │   ├── largest-ram-process.sh
│   │   ├── list-processes.rb
│   │   ├── magic-keyboard-switcher/
│   │   │   ├── README.md
│   │   │   └── magic-keyboard-switcher.template.sh
│   │   ├── meeting_summary_script.swift
│   │   ├── minimize-all-windows.applescript
│   │   ├── modify-extension.sh
│   │   ├── move-desktop-to-trash.applescript
│   │   ├── move-downloads-to-trash.applescript
│   │   ├── network-quality.sh
│   │   ├── network-status.sh
│   │   ├── new-email.sh
│   │   ├── nightshift.sh
│   │   ├── ocr.swift
│   │   ├── open-folder.sh
│   │   ├── open-image-from-clipboard.sh
│   │   ├── open-last-download.swift
│   │   ├── open-selection-with.applescript
│   │   ├── otp.sh
│   │   ├── paste-clipboard.sh
│   │   ├── quit-all-apps.swift
│   │   ├── quit-app.swift
│   │   ├── rename-videos-pictures.py
│   │   ├── reset-launchpad.sh
│   │   ├── restart-dock.sh
│   │   ├── restart-finder.sh
│   │   ├── restart.applescript
│   │   ├── sample-color.swift
│   │   ├── save-image-from-clipboard.py
│   │   ├── screensaver.applescript
│   │   ├── shutdown.applescript
│   │   ├── sleep-timer.applescript
│   │   ├── sleep.applescript
│   │   ├── toggle-battery-charging.sh
│   │   ├── toggle-desktop-icons.applescript
│   │   ├── toggle-desktop-widget.sh
│   │   ├── toggle-ds-store.applescript
│   │   ├── toggle-filename-extensions.applescript
│   │   ├── toggle-flip-screen.template.applescript
│   │   ├── toggle-hidden-files.applescript
│   │   ├── toggle-lid-sleep.sh
│   │   ├── toggle-natural-scrolling-macos15.applescript
│   │   ├── toggle-natural-scrolling.applescript
│   │   ├── toggle-sidecar.template.applescript
│   │   ├── toggle-system-appearance.applescript
│   │   ├── uninstall-with-appcleaner.applescript
│   │   ├── update-scripts-command.template.py
│   │   ├── vpn/
│   │   │   ├── vpn-config.sh
│   │   │   ├── vpn-start.sh
│   │   │   ├── vpn-status.sh
│   │   │   └── vpn-stop.sh
│   │   ├── vpnutil/
│   │   │   ├── vpnutil-config.template.sh
│   │   │   ├── vpnutil-start.sh
│   │   │   ├── vpnutil-status.sh
│   │   │   ├── vpnutil-stop.sh
│   │   │   └── vpnutil-toggle.sh
│   │   ├── wallpaper-refresh.applescript
│   │   ├── wifi-password.sh
│   │   └── wifi.template.applescript
│   └── web-searches/
│       ├── amazon.sh
│       ├── app-store.sh
│       ├── arxiv.sh
│       ├── bnf-search.sh
│       ├── bundlephobia.sh
│       ├── caniuse.sh
│       ├── check-weather.sh
│       ├── clipboard-to-17track.js
│       ├── crunchbase.sh
│       ├── doi-clipboard.sh
│       ├── doi.sh
│       ├── duck-duck-go.sh
│       ├── ecosia.sh
│       ├── figma.sh
│       ├── giphy.sh
│       ├── google-maps.sh
│       ├── google-search.sh
│       ├── google-translate.rb
│       ├── grep-app-search.sh
│       ├── hunter.sh
│       ├── im-feeling-ducky.sh
│       ├── kinopoisk.sh
│       ├── mdn.sh
│       ├── mozilla-developer-network.sh
│       ├── njt.sh
│       ├── npmjs.sh
│       ├── npms.sh
│       ├── opensecrets.sh
│       ├── pkg-go-dev.sh
│       ├── postgresql.sh
│       ├── pub-search.sh
│       ├── repo.sh
│       ├── rust-crate.sh
│       ├── search-cdnjs.sh
│       ├── search-coinmarketcap.sh
│       ├── search-emojipedia.sh
│       ├── search-gender-in-chosic.applescript
│       ├── search-github.sh
│       ├── search-hacker-news.sh
│       ├── search-imdb.sh
│       ├── search-in-baidu.sh
│       ├── search-in-bilibili.sh
│       ├── search-in-devhints.sh
│       ├── search-in-dndbeyond.sh
│       ├── search-in-jingdong.sh
│       ├── search-in-taobao.sh
│       ├── search-in-wikipedia.sh
│       ├── search-in-zhihu.sh
│       ├── search-linkedin.sh
│       ├── search-netflix.sh
│       ├── search-php-docs.sh
│       ├── search-pypi.sh
│       ├── search-python3-docs.sh
│       ├── search-rust-docs.sh
│       ├── search-script-command-marketplace.sh
│       ├── search-swift-github.sh
│       ├── search-unsplash.sh
│       ├── search-wpengine-installs.sh
│       ├── swift-package-index.sh
│       ├── translate-with-baidu.template.sh
│       ├── translate-with-google.template.sh
│       ├── twitter-search.sh
│       ├── unfurl.sh
│       ├── wayback-machine.sh
│       ├── wordpress/
│       │   ├── search-wordpress-docs.sh
│       │   ├── wordpress-classes-reference.sh
│       │   ├── wordpress-cli-command.sh
│       │   ├── wordpress-functions-reference.sh
│       │   └── wordpress-hooks-reference.sh
│       ├── wpengine-install.sh
│       ├── yandex-search.sh
│       └── youtube.sh
├── documentation/
│   ├── ARGUMENTS.md
│   └── OUTPUTMODES.md
└── templates/
    ├── script-command.template.applescript
    ├── script-command.template.cs
    ├── script-command.template.js
    ├── script-command.template.php
    ├── script-command.template.py
    ├── script-command.template.rb
    ├── script-command.template.sh
    └── script-command.template.swift

================================================
FILE CONTENTS
================================================

================================================
FILE: .gitattributes
================================================
commands/README.md          -diff -merge
commands/README.md          linguist-generated=true
commands/extensions.json    -diff -merge
commands/extensions.json    linguist-generated=true

================================================
FILE: .github/pull_request_template.md
================================================
## Description

<!-- Please write a short summary for this change. If it's a new script command, explain what it does. -->

## Type of change

<!-- Please delete options that are not relevant. -->

- [ ] New script command
- [ ] Bug fix
- [ ] Improvement of an existing script
- [ ] Documentation update
- [ ] Toolkit change
- [ ] Other (Specify)

## Screenshot

<!-- If it's a new script command, please include a screenshot or a GIF of how it works. -->

## Dependencies / Requirements

<!-- If it's a new script command that requires some additional steps to make it work, please describe it here. E.g. requiring installation of another command line tool or requirement to specify username / API token / etc. -->

## Checklist

- [ ] I have read [Contribution Guidelines](https://github.com/raycast/script-commands/blob/master/CONTRIBUTING.md)

================================================
FILE: .github/stale.yml
================================================
daysUntilStale: 30
daysUntilClose: 7
exemptLabels:
  - security
  - enhancement
staleLabel: wontfix
markComment: >
  This issue/pull request has been automatically marked as stale because it has not had
  recent activity. It will be closed if no further activity occurs in the next 7 days to
  keep our backlog clean. Thanks for your contributions.
closeComment: false

================================================
FILE: .github/workflows/script-commands.yml
================================================
name: Set as Executable and Generate Documentation

on:
  push:
    branches: [master]
    paths-ignore:
      - commands/README.md
      - commands/extensions.json

jobs:
  scriptCommands:
    runs-on: macos-15

    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
          token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}

      - name: Setup Xcode
        uses: raycast/github-actions/setup-xcode@xcode-16.1.x

      - name: Setup GIT
        uses: raycast/github-actions/setup-git@v1.1.0

      - name: Build Toolkit
        run: |
          make build

      - name: Check and adjust scripts
        run: |
          make set-executable-and-commit

      - name: Generate Script Commands Documentation
        run: |
          make gen-docs-and-commit

      - name: Rebase
        if: success()
        run: git pull origin ${{ github.ref }} --autostash --rebase -X ours

      - name: Push
        if: success()
        uses: ad-m/github-push-action@master
        with:
          branch: ${{ github.ref }}
          github_token: ${{ secrets.PERSONAL_ACCESS_TOKEN }}

      - name: Notify Failure
        if: failure()
        uses: edge/simple-slack-notify@master
        with:
          color: "danger"
          text: ":no_entry_sign: ${env.GITHUB_WORKFLOW} has failed"
          fields: |
            [
              { "title": "Action logs:", "value": "${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/actions/runs/${env.GITHUB_RUN_ID}"},
              { "title": "Commit:", "value": "${env.GITHUB_SERVER_URL}/${env.GITHUB_REPOSITORY}/commit/${ env.GITHUB_SHA }"}
            ]
        env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_STREAM_INFRA_CHANNEL_WEBHOOK_URL }}


================================================
FILE: .gitignore
================================================
.DS_Store
.build
/Packages
*.xcodeproj
xcuserdata/
.swiftpm
.idea


================================================
FILE: .swiftlint.yml
================================================
indentation: 2
included:
  - Tools/Toolkit
excluded:
  - Tools/Toolkit/.build
  - _enabled-commands
  - commands
  - templates
disabled_rules:
  - cyclomatic_complexity
  - file_length
  - line_length
  - nesting
  - todo # Use custom_todo
  - unused_setter_value
  - generic_type_name
  - identifier_name
  - function_parameter_count
  - type_name
  - function_body_length
  - type_body_length
opt_in_rules:
  - indentation_width
  - array_init
  - closure_end_indentation
  - closure_spacing
  - collection_alignment
  - empty_collection_literal
  - empty_count
  - empty_string
  - fallthrough
  - fatal_error_message
  - file_header
  - overridden_super_call
  - sorted_imports
  - unused_declaration
  - unused_import
  - vertical_whitespace_closing_braces
  - vertical_whitespace_opening_braces
  - yoda_condition
indentation_width:
  indentation_width: 2
trailing_comma:
  mandatory_comma: true
file_header:
  required_pattern: ([Copyright (c) \d{4}\-\d{4} Raycast. All rights reserved.])\w+
identifier_name:
  min_length:
    error: 3
  excluded:
    - id
    - os


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing

Thank you for your interest in contributing to Raycast Script Commands! Here you will find simple guidelines that can help you with getting started.

- [Contributing](#contributing)
  - [Guidelines](#guidelines)
    - [Git and Pull Requests](#git-and-pull-requests)
    - [Folder structure](#folder-structure)
    - [English style convention](#english-style-convention)
    - [File naming convention](#file-naming-convention)
    - [Metadata convention](#metadata-convention)
    - [Scripts that require additional modification](#scripts-that-require-additional-modification)
    - [Scripts that require installation of runtimes and dependencies](#scripts-that-require-installation-of-runtimes-and-dependencies)
    - [Scripts that require installation of apps](#scripts-that-require-installation-of-apps)
    - [Bash profiles and environmental variables](#bash-profiles-and-environmental-variables)
    - [Auto generated files](#auto-generated-files)
  - [Examples](#examples)

## Guidelines

### Git and Pull Requests

Please make sure that your pull request makes it easy for the reviewer to understand what the change is about (fill in the pull request template) and keep your change focused (do not create a PR containing multiple complex Script Commands).

In order to keep the Git history clean, we prefer if you rebase your branch on top of master, so that we can do a fast-forward merge back to master. Make sure to use descriptive commit messages (incl. proper spelling), and squash commits ("fix typo") already on your end.

### Folder structure

Try to bundle scripts that are related in a directory / sub-directory. Avoid having generic folders with lots of different commands. For example instead of having one `media` directory that contains integrations with different services, it's better to create sub-directories for each service:

```markdown
. commands
└─ media
   ├─ spotify
   ├─ apple-music
   └─ youtube
```

Reasoning behind it: To avoid automatically including scripts that people may not be interested in. E.g. if you're using Spotify scripts, there is a lower chance you will need to access Apple Music.

Images should go into dedicated `images` folder:

```markdown
. commands
└─ media
   └─ spotify
      └─ images
         └─ spotify-logo.png
      └─ spotify-next-track.applescript
      └─ spotify-prev-track.applescript
```

### English style convention

Use American English spelling and style for your command metadata. 
To make sure you use the right version, refer to [Wikipedia](https://en.wikipedia.org/wiki/Comparison_of_American_and_British_English) or use [British to American English Converter](https://www.infoenglish.net/british-to-american-english/)

### File naming convention

Use lowercased, dash-case format for script files and directories, and use proper file extensions: Applescript should be `.applescript`, Swift should be `.swift`, Bash should be `.sh`, etc.
Example: `spotify-next-track.applescript`

### Metadata convention

- **Title:** Raycast's UI adopts title-cased strings for all command titles as per Apple's Human Interface Guidelines. Please make sure your command title follows this pattern to look good between other commands.
- **Mode:** Use the `silent` mode for commands that are instant, e.g. `Toggle Hidden Files`. Use the `compact` mode for long-running tasks, e.g. some networking requests. Use the `fullOutput` mode for commands that print more information, e.g. output some file content. And use the `inline` mode for dashboard items, e.g. `Current Weather`.
- **Package Name:** While `packageName` is an optional parameter and if it's missing Raycast will derive it from the directory name, it is required in this repository to improve portability. Make sure to always provide it in your script commands.

### Scripts that require additional modification

1. Ensure that comments include instructions on how to start using the script. E.g. you might need to provide API token, username or tweak parameters.
2. Add `.template.` to the file name for scripts that need modifications. Then scripts won't be automatically parsed by Raycast and people who want to use it will need to copy the file and remove `.template.` part.

Example: `github-notifications.template.sh`

*NOTE:* This might change as soon as we introduce a better way to provide parameters / environmental variables.

### Scripts that require installation of runtimes and dependencies

Most scripts are either written in Bash or AppleScript. We also allow Swift and Node runtimes; however, always check if there's a strong need for those runtimes since they don't come pre-installed on macOS. We have non-technical users who don't bother installing a Node runtime just to perform a simple function.

Some general guidelines:
- First, ask yourself if you can build the Script Command without any dependencies. Less or no dependencies make it easier for others to adopt your command and make it more portable.
- A question you can ask yourself is whether a dependency is "deep" or "shallow": a deep dependency hides complex functionality behind a simple interface. A shallow dependency is the opposite. Avoid using shallow dependencies and check whether there are built-in Unix tools (curl, awk, sed, etc.) that can solve the same problem without much code.
- Also consider transitive dependencies and security aspects. The npm ecosystem, for instance, has been notorious for pulling-in dependencies for trivial tasks, sometimes exposing the user to security issues.

If you still need a dependency, follow these guidelines:

1. At the top of the file add a comment section explicitly stating the dependency and how to install it. Example:
   ```
   #!/bin/bash

   # Dependency: This script requires `jq` cli installed: https://stedolan.github.io/jq/
   # Install via homebrew: `brew install jq`

   # @raycast.schemaVersion 1
   # @raycast.title Prettify JSON from Clipboard
   ...
   ```


2. Make sure you have code that handles missing dependency. Example:
   ```bash
   if ! command -v download &> /dev/null; then
	     echo "download command is required (https://github.com/kevva/download-cli).";
	     exit 1;
   fi
   ```
   
### Scripts that require installation of apps

Some Scripts control apps and therefore require them to be installed. Make sure to hint the requirement and add guidance on how to install it at the top of the script:

```
#!/bin/bash

# Note: Plash v2.2.0 required
# Install via Mac App Store: https://apps.apple.com/app/id1494023538

# @raycast.schemaVersion 1
```

### Bash profiles and environmental variables

All Script Commands are executed in a non-login shell to avoid additional information loaded from profiles that aren't relevant to Raycast. With an argument after a shebang, you can run a script in a login shell, e.g. `#!/bin/bash -l`. We don't allow Script Commands that make use of this feature in this repository. Mainly to guarantee easy portability, explicit injection of information and best performance.

*NOTE:* We will add support for environmental variables in Raycast and keep track of it in [this issue](https://github.com/raycast/script-commands/issues/77).

### Auto generated files

There are some files auto generated by our Toolkit after each commit pushed to this repository, for now, this is the list of files:

- `commands/README.md`
- `commands/extensions.json`

Remember to keep these files unchanged. All manual changes will be lost when our integration workflow is performed. The information used to fill these files is collected from the Script Commands pushed to this repository. No changes on your side in these files are necessary.

## Examples

Some examples to get started:

- **[Apple Music Play](commands/media/apple-music/apple-music-play.applescript)**: An `AppleScript` to start playing music.
- **[Sentry Unresolved Issues](commands/developer-utils/sentry/sentry-unresolved-issues.template.py):** A `Python` script that fetches information from an API and parses the JSON response.
- **[Slack Set Status](commands/communication/slack/set-slack-status.template.sh)**: A `Bash` script that sends a JSON payload with cURL.


================================================
FILE: LICENSE
================================================
MIT License

Copyright (c) 2020-2021 Raycast Technologies Ltd.

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.


================================================
FILE: Makefile
================================================
EXECUTABLE_NAME = toolkit

TOOLKIT_PATH = Tools/Toolkit
BUILD_PATH_RELEASE = $(TOOLKIT_PATH)/.build/release
EXECUTABLE_PATH_RELEASE = $(BUILD_PATH_RELEASE)/Toolkit

BUILD_PATH_DEBUG = $(TOOLKIT_PATH)/.build/debug
EXECUTABLE_PATH_DEBUG = $(BUILD_PATH_DEBUG)/Toolkit

clean:
	rm -rf $(TOOLKIT_PATH)/.build $(EXECUTABLE_NAME)

build: clean
	swift build -c release --disable-sandbox --package-path $(TOOLKIT_PATH)
	ln -s $(EXECUTABLE_PATH_RELEASE) $(EXECUTABLE_NAME)

build-debug:
	if [ -f $(EXECUTABLE_NAME) ]; then rm $(EXECUTABLE_NAME); fi

	swift build --package-path $(TOOLKIT_PATH)
	ln -s $(EXECUTABLE_PATH_DEBUG) $(EXECUTABLE_NAME)

gen-docs:
	./$(EXECUTABLE_NAME) generate-documentation

gen-docs-and-commit: gen-docs
	./$(TOOLKIT_PATH)/integration.sh commit_documentation

set-executable:
	./$(EXECUTABLE_NAME) set-executable

set-executable-and-commit: set-executable
	./$(TOOLKIT_PATH)/integration.sh commit_executable

lint:
	swiftlint lint

fix:
	swiftlint --fix

open:
	open -a /Applications/Xcode.app $(TOOLKIT_PATH)


================================================
FILE: README.md
================================================
<div align="center">
  <img alt="Raycast Logo" src="images/logo.png" height="240"/>

  <div align="center">
    <a href="https://github.com/raycast/script-commands/tree/master/commands">
        <img alt="GitHub contributors" src="https://img.shields.io/badge/dynamic/json?style=flat&color=FF6363&label=Script%20Commands&query=$.totalScriptCommands&url=https:%2F%2Fraw.githubusercontent.com%2Fraycast%2Fscript-commands%2Fmaster%2Fcommands%2Fextensions.json&logo=raycast&labelColor=202123" />
    </a>
    <a href="https://twitter.com/raycastapp">
      <img alt="Twitter Follow" src="https://img.shields.io/badge/follow-@raycastapp-blue?labelColor=202123&logo=x&color=eee" />
    </a>
  </div>

<br>

  <h1>Raycast Script Commands</h1>

</div>

[Raycast](https://raycast.com/) lets you control your tools with a few keystrokes and installing script commands makes it possible to execute commands from anywhere on your desktop. They are a great way to speed up every-day tasks such as converting data, opening bookmarks or triggering dev workflows. This repository contains some example scripts as well as links to our community commands and documentation to write your own ones.

**✨ Looking to build richer extensions?** Check out the Extensions API [here](https://github.com/raycast/extensions).

🚨 For anything that is not related to script commands, please [send us an email](mailto:feedback@raycast.com), use the feedback command within Raycast, or join the [Slack community](https://www.raycast.com/community).

<br>
<br>

![Script Command Banner](images/screenshots/script-commands-readme-header.png)

<br>
<br>

## Install Script Commands from this repository

To install new commands, follow these steps:

1. Choose a script from the [community repo](https://github.com/raycast/script-commands/tree/master/commands#apps) and save it into a new directory.
   
   Scripts containing the word `.template.` in the filename require some values to be set (check [the troubleshooting section](#troubleshooting-and-faqs) for more information).
   
   Alternatively, instead of creating a new directory you can reuse the repo's [`_enable-commands` folder](https://github.com/raycast/script-commands/tree/master/_enabled-commands).
3. Open the Extensions tab in the Raycast preferences
4. Click the plus button
5. Click `Add Script Directory`
6. Select directories containing your Script Commands

**💡 Hint:** We recommend that you don't directly load the community script directories into Raycast to avoid potential restructuring and new script commands suddenly appearing in Raycast.

![Add directory](/images/screenshots/add-directory.png)


## Create your own Script Commands

To write your own custom Script Commands, go over the following steps:

1. Use the `Create Script Command` functionality in Raycast
2. Write and edit your script using your favourite code editor
3. Run your Script Command from the Raycast root search

**💡 Hint:** If you choose to write your script in `Bash`, we highly recommend using the [Shellcheck](https://marketplace.visualstudio.com/items?itemName=timonwong.shellcheck) linter as this will ensure smooth running of your script. All  scripts uploaded to GitHub will need to have been run through ShellCheck.

![Create Script Command](/images/screenshots/Create-Script-Command.png)

### Metadata

These parameters are available for you to customize your Script Command in Raycast. For practical examples of how these should be used, as well as best practices and supported languages, please browse our templates and community-built scripts.

| Name                 | Description                                                                                                                                                                                                                                                                          | Required | App Version         |
|----------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|----------|---------------------|
|schemaVersion        | Schema version to prepare for future changes in the API. Currently there is only version 1 available.                                                                                                                                                                                | Yes      | 0.29+               |
| title                | Display name of the Script Command that is shown as title in the root search.                                                                                                                                                                                                        | Yes      | 0.29+               |
| mode                 | Specifies how the script is executed and how the output is presented. [Details of the options for this parameter can be viewed here](https://github.com/raycast/script-commands/blob/master/documentation/OUTPUTMODES.md) | Yes      | 0.29+               |
| packageName          | Display name of the package that is shown as subtitle in the root search. When not provided, the name will be inferred from the script directory name.                                                                                                                               | No       | 0.29+               |
| icon                 | Icon that is displayed in the root search. Can be an emoji, a file path (relative or full) or a remote URL (only https). Supported formats for images are PNG and JPEG. Please make sure to use small icons, recommended size - 64px.                                                | No       | 0.29+               |
| iconDark             | Same as `icon`, but for dark theme. If not specified, then `icon` will be used in both themes.                                                                                                                             | No       | 1.3.0+              |
| currentDirectoryPath | Path from which the script is executed. Default is the path of the script.                                                                                                                                                                                                           | No       | 0.29+               |
| needsConfirmation    | Specify `true` if you would like to show confirmation alert dialog before running the script. Can be helpful with destructive scripts like "Quit All Apps" or "Empty Trash". Default value is `false`.                                                                               | No       | 0.30+               |
| refreshTime          | Specify a refresh interval for inline mode scripts in seconds, minutes, hours or days. Examples: 10s, 1m, 12h, 1d. Note that the actual times can vary depending on how the OS prioritises scheduled work. The minimum refresh interval is 10 seconds. If you have more than 10 inline commands, only the first 10 will be refreshed automatically; the rest have to be manually refreshed by navigating to them and pressing `return`.| No       | 0.31+ |
| argument[1...3]      | [Custom arguments, see Passing Arguments page](https://github.com/raycast/script-commands/blob/master/documentation/ARGUMENTS.md) for detail of how to use this field | No | 1.2.0+ |
| author               | Define an author name to be part of the script commands documentation | No | |
| authorURL            | Author social media, website, email or anything to help the users to get in touch | No | |
| description          | A brief description about the script command to be presented in the documentation | No | |

### Output Mode

You can use the standard output to present messages in Raycast. Depending on the `mode`, the standard output of your scripts is differently presented.`fullOutput` and `inline` modes support ANSI Escape codes allowing to color generated output by changing its background and foreground color. [You can view the different output mode options as well as their various forms and color options here.](https://github.com/raycast/script-commands/blob/master/documentation/OUTPUTMODES.md)


### Error Handling

If the script exits with a status code not equal to 0, Raycast interprets it as failed and shows a toast that the script failed to run. If this script has inline or compact mode, the last line of the output will be used as an error message. Consider this example for a bash script:
```bash
if ! [[ $value =~ $regex ]] ; then
  echo "Invalid value provided"
  exit 1
else
  ...
```

## Troubleshooting and FAQs
<details>
  <summary>Why isn't my script appearing in Raycast?</summary>

* Ensure the filename doesn't contain `.template.` string
* Check that all required metadata parameters are provided. See the table above which parameters are required.
* Ensure you use either `#` or `//` comments for metadata parameters
* If nothing helps, try to go step by step from a [template](https://github.com/raycast/script-commands/tree/master/templates) Script Command or use one of the examples in this repo.
</details>

<details>
  <summary>Why isn't my Shell script  working?</summary>

* Ensure the filename doesn't contain `.template.` string
* Run your code through [ShellCheck](https://www.shellcheck.net/) to check for syntax errors or unexpected characters
</details>

<details>
  <summary>Can I build in a non-login shell?</summary>

**We only allow Script Commands that run in a non-login shell in this repository as agreed on in our [contribution guidelines](https://github.com/raycast/script-commands/blob/master/CONTRIBUTING.md), due to any dependencies.**
However, if you need to run your local script as login-shell, you can specify an argument after shebang, e.g. `#!/bin/bash -l` for bash. We also append `/usr/local/bin` to `$PATH` variable so you can use your local shell commands without any additional steps. If this is not enough, you can always extend `$PATH` by adding `export PATH='/some/extra/path:$PATH'` at the top of your script.
</details>

## Community

We're always looking for new Script Commands or other ways to improve Raycast. If you have anything cool to show, please send us a pull request. If we screwed something up, please report a bug. Join our [Slack community](https://www.raycast.com/community) to brainstorm ideas with like-minded folks.


================================================
FILE: Tools/Toolkit/CONTRIBUTING.md
================================================
# Contributing to Raycast's Toolkit

Raycast Toolkit is a command-line application for automating repetitive tasks in this repo. At the moment the Toolkit automates the generation of the [Awesome Script Commands](../../commands/README.md) and the [extensions.json](../../commands/extensions.json) which contains information about each Script Command.

## Tech Stack

- [Swift](https://developer.apple.com/swift) 5.3
- [Swift Package Manager](https://github.com/apple/swift-package-manager/)
- [Swift Argument Parser](https://github.com/apple/swift-argument-parser)
- [SwiftLint](https://github.com/realm/SwiftLint)

## Code Structure

```txt
.
├── Sources
│   ├── Toolkit - Command-line Interface tool that makes calls to ToolkitLibrary. This is the interface used by the user or by the CI.
│   │   ├── Extensions - Custom Swift extensions specific to the CLI
│   │   └── SubCommands - Sub-commands are the interfaces that are exposed to the user
│   └── ToolkitLibrary - The main library
│       ├── Core - Core functionally
│       │   ├── Documentation - Documentation generation for Markdown and JSON
│       │   └── Toolkit - Contains the public interface which will be consumed by the Toolkit CLI
│       ├── Errors - Errors for the Toolkit
│       ├── Extensions - Custom Swift extensions
│       ├── Models - Data models
│       └── Protocols - Custom Swift protocols
└── Tests - Unit tests
    └── ToolkitLibraryTests - Unit tests for the library
```

## Getting Setup

Open this folder in Xcode with the following terminal command:

```bash
open -a Xcode.app .
```

Xcode will automatically download the Swift Packages for you.

## Running the CLI

1. Open up your terminal and head over to the root of this repo.
2. Run `make build`
3. Use the generated binary with `./toolkit`!

## Running the Unit Tests

See [Apple's documentation for running unit tests](https://developer.apple.com/library/archive/documentation/ToolsLanguages/Conceptual/Xcode_Overview/UnitTesting.html).


================================================
FILE: Tools/Toolkit/Package.resolved
================================================
{
  "object": {
    "pins": [
      {
        "package": "swift-argument-parser",
        "repositoryURL": "https://github.com/apple/swift-argument-parser.git",
        "state": {
          "branch": null,
          "revision": "d2930e8fcf9c33162b9fcc1d522bc975e2d4179b",
          "version": "1.0.1"
        }
      },
      {
        "package": "swift-tools-support-core",
        "repositoryURL": "https://github.com/apple/swift-tools-support-core.git",
        "state": {
          "branch": null,
          "revision": "f9bbd6b80d67408021576adf6247e17c2e957d92",
          "version": "0.2.4"
        }
      }
    ]
  },
  "version": 1
}


================================================
FILE: Tools/Toolkit/Package.swift
================================================
// swift-tools-version:5.3

import PackageDescription

let package = Package(
  name: "toolkit",
  platforms: [
    .macOS(.v11),
  ],
  dependencies: [
    .package(
      url: "https://github.com/apple/swift-tools-support-core.git",
      .upToNextMinor(from: "0.2.4")
    ),
    .package(
      url: "https://github.com/apple/swift-argument-parser.git",
      .upToNextMinor(from: "1.0.0")
    ),
  ],
  targets: [
    .target(
      name: "Toolkit",
      dependencies: [
        "ToolkitLibrary",
        .product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"),
        .product(name: "ArgumentParser", package: "swift-argument-parser"),
      ]
    ),
    .target(
      name: "ToolkitLibrary",
      dependencies: [
        .product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"),
      ]
    ),
    .testTarget(
      name: "ToolkitLibraryTests",
      dependencies: ["ToolkitLibrary"]),
  ]
)


================================================
FILE: Tools/Toolkit/README.md
================================================
# Raycast Toolkit

[Raycast](https://raycast.com) Toolkit helps you to generate documentation for all script commands on a predefined or customized path.

## CLI overview

```txt
OVERVIEW: A tool to generate automatized documentation

USAGE: toolkit [--version] <subcommand>

OPTIONS:
  -v, --version           Print the version and exit
  -h, --help              Show help information.

SUBCOMMANDS:
  generate-documentation  Generate the documentation in JSON and Markdown format

  See 'toolkit help <subcommand>' for detailed help.
```

## How does the Toolkit work?

The Toolkit runs on every push to master using [this GitHub Action workflow](../../.github/workflows/documentation.yml). That workflow goes through the following process:

1. Setup a version of Xcode
2. Build the Toolkit using the [Makefile](../../Makefile) located at the root of the repo
3. Run `make gen-docs-and-commit`
   1. Runs the [integration shell script](integration.sh)
   2. Commits the changes (if there are any)
4. Pushes the changes to the master branch using the Raycast bot.

## Contributing

We would love to have your contribution! Check out our [CONTRIBUTING.md](CONTRIBUTING.md) file to get started.

## Community

This is a shared place and we're always looking for new Script Commands or other ways to improve Raycast. If you have anything cool to show, please send us a pull request. If we screwed something up, please report a bug. Join our [Slack community](https://www.raycast.com/community) to brainstorm ideas with like-minded folks.


================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/GenerateDocumentation.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import ArgumentParser
import ToolkitLibrary

extension ToolkitCommand {
  struct GenerateDocumentation: ParsableCommand {
    static var configuration = CommandConfiguration(
      abstract: "Generate the documentation in JSON and Markdown format"
    )

    @Argument(help: "Path of the Raycast extensions folder.\n")
    var path: String = "./commands"

    @Argument(help: "Output file name for the Markdown documentation.\n")
    var outputMarkdownFilename: String = "README.md"

    @Argument(help: "Output file name for the Markdown documentation.\n")
    var outputJSONFilename: String = "extensions.json"

    func run() throws {
      do {
        let dataManager = try DataManager(
          extensionsPath: path,
          extensionsFilename: outputJSONFilename
        )

        let toolkit = Toolkit(
          dataManager: dataManager
        )

        try toolkit.generateDocumentation(
          outputJSONFilename: outputJSONFilename,
          outputMarkdownFilename: outputMarkdownFilename
        )

        Toolkit.raycastDescription()
        Console.shared.writeGreen("Documents generated!")
      } catch {
        Toolkit.raycastDescription()
        Console.shared.writeRed("Error: \(error)")
      }
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/Report.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import ArgumentParser
import SwiftUI
import ToolkitLibrary

extension ToolkitCommand {
  struct Report: ParsableCommand {
    static var configuration = CommandConfiguration(
      abstract: "Generate a report about the health of the Script Commands"
    )

    @Option(
      name: [
        .customShort("t"),
        .customLong("type"),
      ],
      help: "\(Toolkit.ReportType.allOptions)\n "
    )
    var reportType: Toolkit.ReportType = .allScripts

    @Argument(
      help: "Path of the Raycast extensions folder.\n "
    )
    var path: String = "./commands"

    @Flag(help: "Print report without colors")
    var noColor: Bool = false

    func run() throws {
      do {
        let dataManager = try DataManager(
          extensionsPath: path
        )

        let toolkit = Toolkit(
          dataManager: dataManager
        )

        try toolkit.report(
          type: reportType,
          noColor: noColor
        )
      } catch {
        Toolkit.raycastDescription()
        Console.shared.writeRed("Error: \(error)")
      }
    }
  }
}

// MARK: - Expressible By Argument

extension ToolkitLibrary.Toolkit.ReportType: ExpressibleByArgument {
  static var allOptions: String {
    Self.allValueStrings.joined(separator: "|")
  }
}


================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/SetExecutable.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import ArgumentParser
import ToolkitLibrary

extension ToolkitCommand {
  struct SetExecutable: ParsableCommand {
    static var configuration = CommandConfiguration(
      abstract: "Set file mode \"executable\" to Script Commands"
    )

    @Argument(help: "Path of the Raycast extensions folder.\n")
    var path: String = "./commands"

    func run() throws {
      do {
        let dataManager = try DataManager(
          extensionsPath: path
        )

        let toolkit = Toolkit(
          dataManager: dataManager
        )

        try toolkit.setScriptCommandsAsExecutable()
      } catch {
        Toolkit.raycastDescription()
        Console.shared.writeRed("Error: \(error)")
      }
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/Toolkit/SubCommands/Version.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import ArgumentParser
import ToolkitLibrary

extension ToolkitCommand {
  struct Version: ParsableCommand {
    static var configuration = CommandConfiguration(
      abstract: "Print the current Toolkit version"
    )

    func run() throws {
      Toolkit.version()
      throw ExitCode.success
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/Toolkit/main.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

import ArgumentParser
import ToolkitLibrary
import TSCBasic

struct ToolkitCommand: ParsableCommand {
  static var configuration = CommandConfiguration(
    commandName: "toolkit",
    abstract: "A tool to generate automatized documentation",
    subcommands: [
      GenerateDocumentation.self,
      Report.self,
      SetExecutable.self,
      Version.self,
    ]
  )
}

ToolkitCommand.main()


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Console.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

public final class Console {
  private var noColor: Bool
  private let terminalController: TerminalController?

  public static let shared = Console()

  init(noColor: Bool = false) {
    self.noColor = noColor
    self.terminalController = TerminalController(stream: stdoutStream)
  }

  public func writeRed(_ message: String, bold: Bool = false, endLine: Bool = true) {
    write(string: message, color: .red, bold: bold, endLine: endLine)
  }

  public func writeYellow(_ message: String, bold: Bool = false, endLine: Bool = true) {
    write(string: message, color: .yellow, bold: bold, endLine: endLine)
  }

  public func writeGreen(_ message: String, bold: Bool = false, endLine: Bool = true) {
    write(string: message, color: .green, bold: bold, endLine: endLine)
  }

  public func write(_ message: String, bold: Bool = false, endLine: Bool = true) {
    write(string: message, color: .noColor, bold: bold, endLine: endLine)
  }

  public func write(string: String, color: TerminalController.Color, bold: Bool = false, endLine: Bool = true) {
    terminalController?.write(string, inColor: noColor ? .noColor : color, bold: bold)

    if endLine {
      terminalController?.endLine()
    }
  }

  public func endLine() {
    terminalController?.endLine()
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Documentation/Documentation.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

final class Documentation {
  private let fileSystem = TSCBasic.localFileSystem

  private let path: AbsolutePath

  private let markdownFilename: String
  private let jsonFilename: String

  init(path: AbsolutePath, jsonFilename: String, markdownFilename: String) {
    self.path             = path
    self.jsonFilename     = jsonFilename
    self.markdownFilename = markdownFilename
  }

  func generateDocuments(for data: RaycastData) throws {
    try generateMarkdown(for: data)
    try generateJSON(for: data)
  }
}

// MARK: - Private methods

private extension Documentation {
  func generateMarkdown(for raycastData: RaycastData) throws {
    let documentFilePath = path.appending(
      component: markdownFilename
    )

    guard let data = markdownData(for: raycastData) else {
      return
    }

    try fileSystem.writeFileContents(
      documentFilePath,
      bytes: ByteString(data.uint8Array)
    )
  }

  func generateJSON(for raycastData: RaycastData) throws {
    let documentFilePath = path.appending(
      component: jsonFilename
    )

    let data = try raycastData.toData()

    try fileSystem.writeFileContents(
      documentFilePath,
      bytes: ByteString(data.uint8Array)
    )
  }

  func markdownData(for raycastData: RaycastData) -> Data? {
    let groups = raycastData.groups
    var tableOfContents = String.empty
    var contentString = String.empty

    let sortedGroups = groups.sorted()

    sortedGroups.forEach {
      tableOfContents += $0.markdownDescription
    }

    sortedGroups.forEach { group in
      contentString += .newLine + group.sectionTitle

      contentString += renderMarkdown(for: group)
    }

    let markdown = """
      <!-- AUTO GENERATED FILE. DO NOT EDIT. -->
      \(renderBadges())

      # Raycast Script Commands

      [Raycast](https://raycast.com) lets you control your tools with a few keystrokes
      and Script Commands makes it possible to execute scripts from anywhere on your desktop.
      They are a great way to speed up every-day tasks such as converting data, opening bookmarks
      or triggering dev workflows.

      This repository contains sample commands and documentation to write your own ones.

      ### Categories
      \(tableOfContents)\(contentString)

      ## Community

      This is a shared place and we're always looking for new Script Commands or other ways to improve Raycast.
      If you have anything cool to show, please send us a pull request. If we screwed something up,
      please report a bug. Join our
      [Slack community](https://www.raycast.com/community)
      to brainstorm ideas with like-minded folks.
      """

    guard let contentData = markdown.data(using: .utf8) else {
      return nil
    }

    return contentData
  }

  func renderMarkdown(for group: Group, headline: Bool = false) -> String {
    var contentString = String.empty

    if group.scriptCommands.isEmpty == false {
      if headline {
        contentString += .newLine
        contentString += .newLine + "#### \(group.name)"
      }

      contentString += .newLine
      contentString += .newLine + "| Icon | Title | Description | Author | Args | Templ | Lang |"
      contentString += .newLine + "| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |"

      for scriptCommand in group.scriptCommands.sorted() {
        contentString += scriptCommand.markdownDescription
      }
    }

    if let subGroups = group.subGroups?.sorted() {
      for subGroup in subGroups {
        contentString += renderMarkdown(
          for: subGroup,
          headline: true
        )
      }
    }

    return contentString
  }

  func renderBadges() -> String {
    let logo = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAABYCAIAAAD+96djAAAIC0lEQVR4nOybW2zb1hmADynqLsuWRFLOBVmTpqkVy5LlpkgfDGRdnSvcdSiKIUWHosO8lwDtw4Bge1pRYMAw9KXAgAxYMiTNGjRZt+5plxQIkCzpNjduZMmJnMRpt7WR7NgSJYqULFISNUQ8pikpKVLpkOwDP+QhUajj40//f3j+n0fEY1sfByYA4EZP4JuCKQJiioCYIiCmCIgpAmKKgJgiIKYIiCkCYoqAmCIgpgiIKQJiioCYIiDGi9jidIQ8bqNnYbSIkNv9h7HY+7HRXf39xs7ESBFbnc5To5Gg3d5vtf4uMhLu8xg4GSNF7BroJ202+e9eK3EmNvr0gGFxYRnw+Y362SmeL1Rrzwb8AMMAAHYc30+Sl3JMtlrVfzJGigAAJDguXRH2kQHowmJ5Phi8kmeWRVHnmegt4gmXa7vLlRYE5ZUUz+ertT0BPwZd4JNBejpfWFJdowO6itjssJ8bix3euGGGZdOV9d8zwXFtOXKQoi4yuayoX47oJ2Kzw/HuaHSz00ng+H6K+pjJ31PFf4Lj+Hp93O9T4mKCJC8zTE6v9UI/Ec8M9B/euNGy9plPBulrrXERLxbvVip7SVJ24SGIFwaDuuWIfiI+K68u8KVDNIUpLmi6LUfm+VJnjuizduq6RnxWLmcqwgQZkF0QOH6Aoq51rBeda+elnObrhbYiQm73bt/AQqmsvJLi+YVSaS9Fyjlia8bFbLH4ZaWiXJPgOLWvtdgpZrTMEQ1FbHU634tFX9wwmCxy/11dBQAMEMSugX6x0ahJjRFvn3wZgeOHaGpREAI22xanU/7D1+sei2W7GxZjDovlgMY5gml0LCDkcZ+KRmi7HQAgStKRuRsXcrlxv+/3o9GuxyzWalPJuasFFulMIVrVGttcrsBaHWHD8Z9sewzreUwvQZwYCYfcmtTsWon4y/LKVGJOlCQAwE2OfyWeaKAY1mu1nh2LaVGnalh9XmSYI3M3Uhz3cny2UKuhGlauU2NeL6oBZVCK2Oyw7yNJ9SsXcrnJq58itCDjJYhT0cgQ0r4WMhHyDvrX4Z37qRYXSDJCZjpfkBpwPK+VOBmN7HC7UA2ORsQTLtefnoptc7lsOH4sPPzShkEkw7ZxbnHx6PxNxcWg3f7BU2OocgSNCJ/V6iUIOCKG/WroyYOtcYGKD5fuvXX7DlDiopkjSNZONCI+YdnXEklubS3AMeyd4Z0auTidTr95+446R87ERnvvgyNbI6YL7A/iCcWFDcdf3rQR1eBtnE6nfzp/S1LFRe998O5FbHU6v9+6FiQ57sfJuUq93suEHpE/Li39YmE9R3rvg3cpIuRxnx0b/eXQk69u2qR+fbpwP0d41PdLGWUZkjl59wE50nUfvJuia4vDcSY2GrTbMQx7NuBPV4QUzyv/m64I11h2kqYzgvDnpXstb3Q6Xxzs/obyzMBAosh90VqnouqDdxMRbovFga+9EcPeDj0gLqY0yBGHxXI8Et7d+pmfTqePzt9ScsSK457WwHlEuomIbLU6w7IHaMou68CwPQF/oVpLcJxyzZeVyr8LbLnVRY8R8bBejtIHFyTp9RupK/l8FyN32Y/ICMIVhpmkabsFb6q4nyN8vR4vFpVryh0R0bsIpZfT2QdnxOq76fQ/mG4s9NSYWRbFT1l2P0XaLRbQlDHu992tVOb50sPegkSEHBedffAkx6nbXF+XnvYRV1n2cHy2qNpHvR0aalsvEPL35RW5rgcA9BHEe7HobnTPSnvdUM3zpVfis8Xquou3dmzXyMVH2ewb11PK/bKvub9G5QLBzvI6x7+WSCpxATDszR3bX0KRAp2cz2bVe0r5lolkZGQ9yyGP+2Q0MthsUgIApEbj57cWzmQy6msom23c7+v6R8wUWHkVOEiR7wzvXK3Xp5JzM2yx57kDxM3bHW7XB2NjXiu8jV9mmFdnk6gGb+MQRS2LAioLiDtUt0vllhxBhBXDjkfCzwUC6hf/urKC0AL6nmW8WFSvnb1jxbDfjAxPkOSxkeHvBDR8FoW+eXud4w9fi7OInmIfCw8/1+yD2nD8t5GR7wVpJMN2okkXe75UmkrOIcmRs5lFZe9QlSROsxpfqyddAADaZjvyrS191vUS6JM8e25xUX2NlyB+9vg2eZ8uc345+1E2q77m237/iehIVZJ+lJz7Z76g0Ww1FAEAeLq//0Qk7LVa5X9KjcbR+Zsfttbm4z7f8UjYIe/Tm88H37iROr/S4uK7QbpUq1/I5bSbqrZPwzOCcIlhng8G5W0PhmF7SbKtTv2iUrlfy1KUrXmNBcMO0VRGaOlx3CqV/tN8jKwdmp+PyIrVzjo13+pC6eUQa74myMBCqXSnXNZ0bmr0OCiyLIrThcLB1v5FpqOvNXO/lqXWY4ciPy+X1WcrNEWnEzNLgnAxl5sgSbl9JH/mXK02W2yJi4+Z/GSQll3wtdr7mYymh0PU6Hd0KCtWLzPMC8GgkiN7/O05ck8U5RypNRo/TCTR7h2/Gl3PUOWq1c4cKXSsFzMs+7eVlX9pcyDkYeh98nbpQT2+zj74/1a77zV1hwFnsZdF8VIuNxmkHWs9vn1koC1H9MeYQ+kP7IMzYjVpnAvDvq8xw7bUqaIkfb6q366hEyO/pqD0wSUAXr+e6roTjwRta41HIeRxewhCo0ODj043T8fQ8hXPQfTE+K87fkMwRUBMERBTBMQUATFFQEwREFMExBQBMUVATBEQUwTEFAExRUBMERBTBOT/AQAA//98wKt7wQJ9rAAAAABJRU5ErkJggg=="

    let style      = "for-the-badge"
    let labelColor = "202123"
    let dataURL    = "https:%2F%2Fraw.githubusercontent.com%2Fraycast%2Fscript-commands%2Fmaster%2Fcommands%2Fextensions.json"
    let jsonPath   = "$.totalScriptCommands"

    let badges = """
    <div align="center">
      <a href="https://github.com/raycast/script-commands">
        <img alt="GitHub contributors" src="https://img.shields.io/badge/dynamic/json?style=\(style)&color=\(labelColor)&label=Script%20Commands&query=\(jsonPath)&url=\(dataURL)&logo=\(logo)&labelColor=\(labelColor)">
      </a>
      <a href="https://github.com/raycast/script-commands/graphs/contributors">
        <img alt="GitHub contributors" src="https://img.shields.io/github/stars/raycast?style=\(style)">
      </a>
      <a href="https://github.com/raycast/script-commands/stargazers">
        <img alt="GitHub Org's stars" src="https://img.shields.io/github/contributors/raycast/script-commands?style=\(style)">
      </a>
      <a href="https://twitter.com/raycastapp">
        <img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/raycastapp?style=\(style)">
      </a>
    </div>
    """

    return badges
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/GitShell.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import TSCBasic
import TSCUtility

struct GitError: Error {
  let result: ProcessResult
}

struct GitShell {
  init() {}

  func run(_ args: String..., environment: [String: String] = Git.environment, path: AbsolutePath) throws -> String {
    do {
      return try execute(
        ["-C", path.dirname] + args,
        environment: environment
      )
    } catch {
      throw error
    }
  }

  private func execute(_ args: [String], environment: [String: String] = Git.environment) throws -> String {
    let process = Process(arguments: [Git.tool] + args, environment: environment)
    let result: ProcessResult

    do {
      try process.launch()
      result = try process.waitUntilExit()

      guard result.exitStatus == .terminated(code: 0) else {
        throw GitError(
          result: result
        )
      }

      let content = try result.utf8Output().spm_chomp()

      return content
    } catch let error as GitError {
      throw error
    } catch {
      let result = ProcessResult(
        arguments: process.arguments,
        environment: process.environment,
        exitStatus: .terminated(code: -1),
        output: .failure(error),
        stderrOutput: .failure(error)
      )

      throw GitError(
        result: result
      )
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/RegEx.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

typealias NSTextCheckingResults = [NSTextCheckingResult]

final class RegEx {
  static func checkingResults(for regex: String, in text: String) -> NSTextCheckingResults {
    do {
      let regex = try NSRegularExpression(
        pattern: regex,
        options: [
          .caseInsensitive,
          .anchorsMatchLines,
        ]
      )

      let range = NSRange(text.startIndex..., in: text)
      return regex.matches(in: text, range: range)
    } catch {
      print("Invalid regex: \(error.localizedDescription)")
      return []
    }
  }

  static func checkingResult(for regex: String, in text: String) -> NSTextCheckingResult? {
    return checkingResults(for: regex, in: text).first
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Report/Report.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

final class Report {
  private lazy var scriptCommands = ScriptCommands()
  private let console: Console

  private let data: RaycastData
  private let type: Toolkit.ReportType

  init(data: RaycastData, type: Toolkit.ReportType, noColor: Bool) {
    self.console = Console(
      noColor: noColor
    )

    self.data = data
    self.type = type
  }

  func showResult() {
    data.groups.sorted().forEach { group in
      filter(
        for: group,
        by: type
      )
    }

    renderReport(
      for: scriptCommands
    )
  }
}

// MARK: - Signs
extension Report {
  enum Divider {
    static let pipe = "|"
    static let plus = "+"
    static let minus = "-"
    static let space = " "
  }
}

// MARK: - Private methods

private extension Report {
  typealias Title = (value: String, color: TerminalController.Color, bold: Bool)
  typealias Titles = [Title]
  typealias Cell = (title: String, length: Int, color: TerminalController.Color, bold: Bool)
  typealias Cells = [Cell]

  func filter(for group: Group, by type: Toolkit.ReportType) {
    if group.scriptCommands.isEmpty == false {
      for scriptCommand in group.scriptCommands.sorted() {
        switch (type, scriptCommand.isExecutable) {
        case (.executable, true):
          self.scriptCommands.append(scriptCommand)
        case (.nonExecutable, false):
          self.scriptCommands.append(scriptCommand)
        case (.allScripts, _):
          self.scriptCommands.append(scriptCommand)
        default:
          break
        }
      }
    }

    if let subGroups = group.subGroups?.sorted() {
      for subGroup in subGroups {
        filter(
          for: subGroup,
          by: type
        )
      }
    }
  }

  func renderReport(for scriptCommands: ScriptCommands) {
    let raycast = "Raycast"
    let cellMargin = 2
    var firstColumnLength = 0
    var secondColumnLength = 0
    let thirdColumnLength = 10

    scriptCommands.forEach {
      let author: String = $0.authors?.description ?? raycast

      if author.count >= firstColumnLength {
        firstColumnLength = author.count
      }

      if $0.fullPath.count >= secondColumnLength {
        secondColumnLength = $0.fullPath.count
      }
    }

    let columnsLength = [firstColumnLength, secondColumnLength, thirdColumnLength]

    let titleCells = [
      Title(value: raycast, color: .red, bold: true),
      Title(value: "Script Commands", color: .green, bold: true),
    ]

    let descriptionCells = [
      Cell(title: "Author", length: firstColumnLength, color: .noColor, bold: false),
      Cell(title: "Path", length: secondColumnLength, color: .noColor, bold: false),
      Cell(title: "Executable", length: thirdColumnLength, color: .noColor, bold: false),
    ]

    let headerWidth = columnsLength.reduce(0, +) + (descriptionCells.count * cellMargin)

    renderDivider(with: columnsLength)
    renderHeader(with: headerWidth, titles: titleCells)
    renderDivider(with: columnsLength)
    renderRow(for: descriptionCells)
    renderDivider(with: columnsLength)

    scriptCommands.forEach {
      let author = $0.authors?.description ?? raycast

      let executableColor: TerminalController.Color = $0.isExecutable ? .cyan : .yellow

      let rowCells = [
        Cell(title: author, length: firstColumnLength, color: .green, bold: true),
        Cell(title: $0.fullPath, length: secondColumnLength, color: .noColor, bold: false),
        Cell(title: String($0.isExecutable), length: thirdColumnLength, color: executableColor, bold: !$0.isExecutable),
      ]

      renderRow(for: rowCells)
    }

    renderDivider(with: columnsLength)
    console.write("  Total of", endLine: false)
    console.write(string: " \(scriptCommands.count) ", color: .cyan, bold: true, endLine: false)
    console.write("script commands")
  }

  func renderHeader(with maxWidth: Int, titles: Titles) {
    let titleCount = titles.map { $0.value }.joined(separator: " ").count

    let titleLength = titleCount % 2 == 0 ? titleCount : titleCount + 1
    let halfMaxWidth = maxWidth / 2
    let halfTitleWidth = titleLength / 2

    let leadingOffset = halfMaxWidth - halfTitleWidth
    let titleLeadingMargin = Divider.space.`repeat`(by: leadingOffset)

    let trailingOffset = maxWidth - (leadingOffset + titleCount)
    let titleTrailingMargin = Divider.space.`repeat`(by: trailingOffset)

    console.write(Divider.pipe, endLine: false)
    console.write(titleLeadingMargin, endLine: false)

    titles.enumerated().forEach { (i, title) in
      if i > 0 {
        console.write(Divider.space, endLine: false)
      }

      console.write(
        string: title.value,
        color: title.color,
        bold: title.bold,
        endLine: false
      )
    }

    console.write(titleTrailingMargin, endLine: false)
    console.write(Divider.pipe)
  }

  func renderRow(for cells: Cells) {
    console.write(Divider.pipe, endLine: false)

    cells.forEach { cell in
      let length = cell.length - cell.title.count

      var cellString = String.empty
      cellString += Divider.space
      cellString += cell.title
      cellString += Divider.space.`repeat`(by: length)

      console.write(
        string: cellString,
        color: cell.color,
        bold: cell.bold,
        endLine: false
      )
      console.write(Divider.pipe, endLine: false)
    }

    console.endLine()
  }

  func renderDivider(with maxWidthList: [Int]) {
    var divisor = Divider.plus

    maxWidthList.forEach { maxWidth in
      divisor += Divider.minus.`repeat`(by: maxWidth + 1)
      divisor += Divider.plus
    }

    console.write(divisor, endLine: true)
  }
}

// MARK: - Extension for Array<Author>

private extension Array where Element == ScriptCommand.Author {
  /// Return the name of the author or in case of multiple authors, just "Multiple"
  var description: String {
    var author = String.empty

    if count == 1 {
      author = self[0].name ?? "Raycast"
    } else if count > 1 {
      author = "Multiple"
    }

    return author
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Stores/DataManager.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import TSCBasic

public final class DataManager {
  private var total: Int = 0 {
    // FIXME: Data racing
    didSet {
      data.totalScriptCommands = total
    }
  }

  var data = RaycastData()

  let extensionsFilePath: AbsolutePath
  let extensionsPath: AbsolutePath

  let fileSystem: FileSystem
  let ignoreGitInformation: Bool

  var isMetadataEmpty: Bool {
    data.metadata.isEmpty
  }

  var extensionsPathString: String {
    extensionsPath.pathString
  }

  public init(extensionsPath: String, extensionsFilename: String = "") throws {
    let fileSystem          = TSCBasic.localFileSystem
    let path                = fileSystem.absolutePath(for: extensionsPath)
    let extensionsFilePath  = path.appending(RelativePath(extensionsFilename))

    guard fileSystem.exists(path) else {
      throw ToolkitError.folderNotFound(path.pathString)
    }

    self.fileSystem           = fileSystem
    self.extensionsPath       = path
    self.extensionsFilePath   = extensionsFilePath
    self.ignoreGitInformation = extensionsFilename.isEmpty
  }

  func increaseTotal() {
    total += 1
  }

  func addLanguage(_ language: String) {
    data.languages.insert(
      Language.Information(name: language)
    )
  }

  func loadContent() {
    if let byteString = try? fileSystem.readFileContents(extensionsPath) {
      let data = byteString.contents.data

      do {
        self.data = try data.decode()
      } catch {
        self.data = RaycastData()
      }
    } else {
      data = RaycastData()
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Constants.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

public extension Toolkit {
  var blockedFolderList: [String] {
    [
      ".git",
      "screenshots",
      "Tools",
      ".build",
      ".github",
      "templates",
      "images",
      "_enabled-commands",
      ".swiftpm",
    ]
  }

  var blockedFilesExtensionsList: [String] {
    [
      "txt",
    ]
  }

  static var information: (name: String, version: String) {
    (
      name: "Raycast Toolkit",
      version: "0.4.0"
    )
  }

  static func raycastDescription() {
    Console.shared.writeRed(information.name, bold: true)
  }

  static func version() {
    raycastDescription()
    Console.shared.write("Current version: ", endLine: false)
    Console.shared.writeYellow(information.version, bold: true)
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+GenerateDocumentation.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

extension Toolkit {
  public func generateDocumentation(outputJSONFilename: String, outputMarkdownFilename: String) throws {
    dataManager.loadContent()

    try readFolderContent(
      path: dataManager.extensionsPath,
      parentGroups: &dataManager.data.groups,
      ignoreFilesInDir: true
    )

    let documentation = Documentation(
      path: dataManager.extensionsPath,
      jsonFilename: outputJSONFilename,
      markdownFilename: outputMarkdownFilename
    )

    try documentation.generateDocuments(
      for: dataManager.data
    )
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Mode.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

extension Toolkit {
  public func setScriptCommandsAsExecutable() throws {
    var data = RaycastData()

    try readFolderContent(
      path: dataManager.extensionsPath,
      parentGroups: &data.groups,
      ignoreFilesInDir: true
    )

    var scriptCommands = ScriptCommands()

    data.groups.forEach { group in
      filter(
        for: group,
        scriptCommands: &scriptCommands
      )
    }

    let rawCount = scriptCommands.count
    var newModeCount = 0

    scriptCommands.sorted().forEach { scriptCommand in
      let filePath = dataManager.extensionsPath.appending(RelativePath(scriptCommand.fullPath))

      do {
        try fileSystem.chmod(.executable, path: filePath)
        newModeCount += 1
      } catch {
        return
      }
    }

    let console = Console(noColor: false)

    Toolkit.raycastDescription()

    if newModeCount > 0 {
      console.write("Result:", endLine: false)
      console.writeYellow(" \(newModeCount) ", bold: true, endLine: false)
      console.write("of", endLine: false)
      console.writeGreen(" \(rawCount) ", bold: true, endLine: false)
      console.write("Script Commands was set as \"executable\".")
    } else {
      console.write("✅ Nothing to be done.")
    }
  }
}

private extension Toolkit {
  func filter(for group: Group, scriptCommands: inout ScriptCommands) {
    if group.scriptCommands.isEmpty == false {
      for scriptCommand in group.scriptCommands where scriptCommand.isExecutable == false {
        scriptCommands.append(scriptCommand)
      }
    }

    if let subGroups = group.subGroups {
      for subGroup in subGroups {
        filter(
          for: subGroup,
          scriptCommands: &scriptCommands
        )
      }
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+ReadContent.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

extension Toolkit {
  typealias FolderContent = (scriptCommands: ScriptCommands, readmePath: String?, groupName: String)

  @discardableResult
  func readFolderContent(path: AbsolutePath, parentGroups: inout Groups, ignoreFilesInDir: Bool = false) throws -> FolderContent {
    var scriptCommands = ScriptCommands()

    for directory in onlyDirectories(at: path) {
      guard blockedFolderList.contains(directory.basename) == false else {
        continue
      }

      var group = Group(
        name: directory.socialBasename,
        path: directory.basenameWithoutExt
      )

      var subGroups = Groups()

      let (scriptCommands, readmePath, groupName) = try readFolderContent(path: directory, parentGroups: &subGroups)

      if groupName.isEmpty == false, groupName.lowercased() == group.name.lowercased() {
        group.name = groupName
      }

      if scriptCommands.isEmpty == false {
        group.scriptCommands = scriptCommands
      }

      if subGroups.isEmpty == false {
        group.subGroups = subGroups
      }

      if let readmePath = readmePath {
        group.readme = readmePath
      }

      if scriptCommands.isEmpty == false || subGroups.isEmpty == false {
        parentGroups.append(group)
      }
    }

    let directoryFiles = onlyFiles(at: path)

    var groupName = ""
    var readmePath: String?

    for file in directoryFiles where directoryFiles.isEmpty == false {
      guard ignoreFilesInDir == false else {
        continue
      }

      guard
        let fileExtension = file.extension,
        blockedFilesExtensionsList.contains(fileExtension) == false else {
        continue
      }

      if file.basenameWithoutExt.lowercased() == "readme" {
        guard let fileContent = readContentFile(from: file), fileContent.count > 0 else {
          continue
        }

        let pathCount = dataManager.extensionsPathString.count + 1
        readmePath = String(file.pathString.dropFirst(pathCount))
      } else if var scriptCommand = readScriptCommand(from: file) {
        // This is to avoid data racing
        DispatchQueue.global(qos: .userInitiated).async {
          self.dataManager.increaseTotal()
          self.dataManager.addLanguage(scriptCommand.language)
        }

        scriptCommand.configure(
          isExecutable: fileSystem.isExecutableFile(file)
        )

        if let packageName = scriptCommand.packageName {
          groupName = packageName
        }

        scriptCommands.append(scriptCommand)
      }
    }

    return (
      scriptCommands: scriptCommands,
      readmePath: readmePath,
      groupName: groupName
    )
  }

  func readContentFile(from path: AbsolutePath) -> String? {
    guard let byteString = try? fileSystem.readFileContents(path) else {
      return nil
    }

    let data = byteString.contents.data
    let content = String(data: data, encoding: .utf8)

    return content
  }

  func extractGitDates(from filePath: AbsolutePath) -> [String]? {
    do {
      let dates = try git.run(
        "log", "--format=%aI", "--follow", filePath.basename,
        path: filePath
      )

      return dates.splitByNewLine
    } catch {
      return nil
    }
  }

  func readScriptCommand(from filePath: AbsolutePath) -> ScriptCommand? {
    guard fileSystem.isFile(filePath) else {
      return nil
    }

    guard let fileContent = readContentFile(from: filePath) else {
      return nil
    }

    let dictionary = keyValue(
      for: fileContent,
      filename: filePath.basename,
      path: filePath
    )

    return ScriptCommand(
      from: dictionary
    )
  }

  func keyValue(for content: String, filename: String, path: AbsolutePath) -> [String: Any] {
    let filenameKey = ScriptCommand.CodingKeys.filename.rawValue
    let packageNameKey = ScriptCommand.CodingKeys.packageName.rawValue

    var dictionary = readKeyValues(of: content)
    dictionary[filenameKey] = filename

    let pathCount = dataManager.extensionsPathString.count + 1
    let scriptPath = path.dirname.dropFirst(pathCount)
    dictionary["path"] = "\(scriptPath)/"

    if dataManager.ignoreGitInformation == false {
      if let dates = extractGitDates(from: path), dates.isEmpty == false {
        if let updateAt = dates.first {
          dictionary["updatedAt"] = updateAt
        }

        if let createdAt = dates.last {
          dictionary["createdAt"] = createdAt
        }
      }
    } else {
      dictionary["updatedAt"] = String.empty
      dictionary["createdAt"] = String.empty
    }

    dictionary["isTemplate"] = filename.contains("template")

    if dictionary[packageNameKey] == nil {
      dictionary[packageNameKey] = path.basenameWithoutExt.sanitize.capitalized
    }

    return dictionary
  }

  func readKeyValues(of content: String) -> [String: Any] {
    let regex = "@raycast.(?<key>[A-Za-z0-9]+)\\s(?<value>[\\S ]+)"
    let results = RegEx.checkingResults(for: regex, in: content)

    var dictionary: [String: Any] = [:]

    if let language = extractLanguageFromShebang(using: content) {
      dictionary["language"] = language
    }

    let authors = extractAuthors(from: content, using: results)
    if authors.isEmpty == false {
      dictionary["authors"] = authors
    }

    let icons = extractIcons(from: content, using: results)
    if icons.isEmpty == false {
      dictionary["icon"] = icons
    }

    dictionary["hasArguments"] = extractArguments(from: content, using: results)

    for result in results {
      let keyValue = readKeyValue(from: result, content: content)

      guard keyValue.authorKeys == false && keyValue.iconKeys == false else {
        continue
      }

      dictionary.merge(keyValue) { $1 }
    }

    return dictionary
  }

  func extractLanguageFromShebang(using content: String) -> String? {
    let regex = "#!(?<shebang>[^\n]+)"

    guard let result = RegEx.checkingResult(for: regex, in: content) else {
      return nil
    }

    let range = result.range(withName: "shebang")

    guard let shebang = self.content(of: range, on: content) else {
      return nil
    }

    guard var software = shebang.split(separator: "/").last else {
      return nil
    }

    let values = software.split(separator: " ")

    if values.count > 1 {
      software = values.first == "env"
        ? values.last ?? ""
        : values.first ?? ""
    }

    let language = Language(String(software))

    return language.name
  }

  func extractArguments(from content: String, using results: NSTextCheckingResults) -> Bool {
    var hasArguments = false

    for result in results {
      let dictionary = readKeyValue(from: result, content: content)

      guard dictionary.argumentsKeys else {
        continue
      }

      hasArguments = true
    }

    return hasArguments
  }

  func extractIcons(from content: String, using results: NSTextCheckingResults) -> [String: String] {
    var icons: [String: String] = [:]

    for result in results {
      let dictionary = readKeyValue(from: result, content: content)

      guard let key = dictionary.keys.first, dictionary.iconKeys else {
        continue
      }

      if let value = dictionary[key] as? String {
        icons[key] = value
      }
    }

    return icons
  }

  func extractAuthors(from content: String, using results: NSTextCheckingResults) -> [[String: String]] {
    var authors: [[String: String]] = []
    var currentAuthor: [String: String] = [:]

    for result in results {
      let dictionary = readKeyValue(from: result, content: content)

      guard let key = dictionary.keys.first, dictionary.authorKeys else {
        continue
      }

      if currentAuthor.keys.count == 2 {
        currentAuthor = [:]
      }

      if let value = dictionary[key] as? String {
        currentAuthor[key] = value
      }

      if currentAuthor.keys.count == 2 {
        guard let value = dictionary[key] as? String else {
          continue
        }

        guard authors.contains(
          where: {
            $0[key] == value
          }
        ) == false else {
          currentAuthor = [:]
          continue
        }

        authors.append(currentAuthor)
        currentAuthor = [:]
      }
    }

    if currentAuthor.keys.count == 1 {
      authors.append(currentAuthor)
    }

    return authors
  }

  func readKeyValue(from result: NSTextCheckingResult, content: String) -> [String: Any] {
    var dictionary = [String: Any]()

    let keyRange = result.range(withName: "key")
    let valueRange = result.range(withName: "value")

    if let key = self.content(of: keyRange, on: content), let value = self.content(of: valueRange, on: content) {
      if let intValue = Int(value) {
        dictionary[key] = intValue
      } else if let boolValue = Bool(value) {
        dictionary[key] = boolValue
      } else {
        dictionary[key] = value
      }
    }

    return dictionary
  }

  func content(of range: NSRange, on content: String) -> String? {
    var value: String?

    if range.location != NSNotFound, range.length > 0, let rangeString = Range<String.Index>(range, in: content) {
      value = String(content[rangeString])
    }

    return value
  }
}

// MARK: - Filter Extensions

private extension Toolkit {
  enum ContentDirType {
    case directories
    case files
  }

  func onlyFiles(at path: AbsolutePath) -> [AbsolutePath] {
    return folderContent(type: .files, for: path)
  }

  func onlyDirectories(at path: AbsolutePath) -> [AbsolutePath] {
    return folderContent(type: .directories, for: path)
  }

  func folderContent(type: ContentDirType, for path: AbsolutePath) -> [AbsolutePath] {
    do {
      let directoryContent = try fileSystem.getDirectoryContents(path)

      let pathsForType: [AbsolutePath] = directoryContent.compactMap {
        let contentPath = path.appending(component: $0)

        guard check(type, for: contentPath) else {
          return nil
        }

        return contentPath
      }

      return pathsForType
    } catch {
      return []
    }
  }

  private func check(_ type: ContentDirType, for path: AbsolutePath) -> Bool {
    switch type {
    case .directories:
      return fileSystem.isDirectory(path)
    case .files:
      return fileSystem.isFile(path)
    }
  }
}

// MARK: - Dictionary Extension

private extension Dictionary where Key == String {
  var authorKeys: Bool {
    typealias Keys = ScriptCommand.Author.InputCodingKeys
    let authorNameKey = Keys.name.rawValue
    let authorURLKey = Keys.url.rawValue

    guard let key = keys.first else {
      return false
    }

    return key == authorNameKey || key == authorURLKey
  }

  var iconKeys: Bool {
    typealias Keys = ScriptCommand.Icon.InputCodingKeys
    let iconKey = Keys.icon.rawValue
    let iconDarkKey = Keys.iconDark.rawValue

    guard let key = keys.first else {
      return false
    }

    return key == iconKey || key == iconDarkKey
  }

  var argumentsKeys: Bool {
    guard let key = keys.first else {
      return false
    }

    return key == "argument1" || key == "argument2" || key == "argument3"
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Report.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

extension Toolkit {
  public func report(type: ReportType, noColor: Bool) throws {
    try readFolderContent(
      path: dataManager.extensionsPath,
      parentGroups: &dataManager.data.groups,
      ignoreFilesInDir: true
    )

    let report = Report(
      data: dataManager.data,
      type: type,
      noColor: noColor
    )

    report.showResult()
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+ReportType.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

public extension Toolkit {
  enum ReportType: String, CaseIterable, CustomStringConvertible {
    case executable
    case nonExecutable = "non-executable"
    case allScripts = "all-scripts"

    public var description: String {
      return rawValue
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation
import TSCBasic

public final class Toolkit {
  lazy var fileSystem = TSCBasic.localFileSystem

  var dataManager: DataManager

  let git = GitShell()

  public init(dataManager: DataManager) {
    self.dataManager = dataManager
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Errors/Reader+Error.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

enum ToolkitError: Swift.Error, CustomStringConvertible, LocalizedError {
  case folderNotFound(String)
  case fileNotFound(String)

  var description: String {
    switch self {
    case .folderNotFound(let folder):
      return "Folder not found. Expected: \(folder)"
    case .fileNotFound(let file):
      return "File \"\(file)\" not found"
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Array/Array+Metadata.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Array where Element == Metadata {
  func hasIdentifier(_ identifier: Identifier) -> Bool {
    var foundValue = false

    for item in self {
      foundValue = item.identifiers.first(where: { $0 == identifier }) != nil
    }

    return foundValue
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Array/Array+UInt8.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Array where Element == UInt8 {
  var data: Data {
    var array = self

    return Data(
      bytes: &array,
      count: array.count
    )
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Character/Character+Emoji.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Character {
  var isSimpleEmoji: Bool {
    guard let firstScalar = unicodeScalars.first else {
      return false
    }

    return firstScalar.properties.isEmoji && firstScalar.value > 0x238C
  }

  var isCombinedIntoEmoji: Bool {
    guard unicodeScalars.count > 1, let firstScalar = unicodeScalars.first else {
      return false
    }

    return firstScalar.properties.isEmoji
  }

  var isEmoji: Bool {
    isSimpleEmoji || isCombinedIntoEmoji
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Character/Character+String.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Character {
  static var newLine = Character(.newLine)
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Codable/Encodable+Data.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Encodable {
  func toData() throws -> Data {
    let encoder = JSONEncoder()
    encoder.outputFormatting.insert(.prettyPrinted)
    encoder.outputFormatting.insert(.sortedKeys)
    encoder.dateEncodingStrategy = .iso8601

    return try encoder.encode(self)
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Data/Data+Bytes.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Data {
  var uint8Array: [UInt8] {
    return [UInt8](self)
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Data/Data+Decodable.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Data {
  func decode<T: Codable>(_ type: T.Type = T.self) throws -> T {
    let decoder = JSONDecoder()
    decoder.dateDecodingStrategy = .iso8601

    let object = try decoder.decode(type, from: self)

    return object
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Dictionary/Dictionary+Codable.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Dictionary where Key == String, Value: Any {
  func encodeToStruct<T: Decodable>() -> T? {
    do {
      let data = try JSONSerialization.data(
        withJSONObject: self
      )

      let decoder = JSONDecoder()
      decoder.dateDecodingStrategy = .iso8601

      return try decoder.decode(T.self, from: data)
    } catch {
      return nil
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Integer/Int+Indent.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension Int {
  var level: String {
    var content: String = .empty

    for _ in 0..<self {
      content += "  "
    }
    return content
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Integer/UInt8+Data.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension UInt8 {
  var data: Data {
    var int = self

    return Data(
      bytes: &int,
      count: MemoryLayout<UInt8>.size
    )
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+Emoji.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension String {
  var isEmoji: Bool {
    count == 1 && containsEmoji
  }

  var containsEmoji: Bool {
    contains {
      $0.isEmoji
    }
  }

  var containsOnlyEmoji: Bool {
    isEmpty == false &&
      contains {
        $0.isEmoji == false
      } == false
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+Interpolation.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension String.StringInterpolation {
  mutating func appendInterpolation(indent: Int, newLine: Bool = true) {
    appendInterpolation("\(newLine ? String.newLine : .empty)\(indent.level)")
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+URL.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension String {
  var isValidURL: Bool {
    guard let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) else {
      return false
    }

    if let match = detector.firstMatch(in: self, options: [], range: NSRange(location: 0, length: utf16.count)) {
      return match.range.length == self.utf16.count
    }

    return false
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import CryptoKit
import Foundation

enum StringError: Error {
  case convertStringToData
}

extension String {
  var sanitize: String {
    var text = self

    let entities = [
      "_",
      "-",
    ]

    entities.forEach { entity in
      guard text.contains(entity) else {
        return
      }

      text = text.replacingOccurrences(
        of: entity,
        with: " "
      )
    }

    return text
  }

  var trimmedString: String {
    trimmingCharacters(in: .whitespacesAndNewlines)
  }

  var splitByNewLine: [String] {
    split(separator: .newLine).map(String.init)
  }

  static var newLine: String {
    "\n"
  }

  static var empty: String {
    ""
  }

  func `repeat`(by times: Int) -> String {
    var content = self

    guard times >= 0 else {
      return .empty
    }

    for _ in 0..<times {
      content += self
    }

    return content
  }

  func convertToMD5() throws -> String {
    guard let data = data(using: .utf8) else {
      throw StringError.convertStringToData
    }

    let digest = Insecure.MD5.hash(data: data)

    let value = digest.map {
      String(format: "%02hhx", $0)
    }
    .joined()

    return value
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/TSCBasic/AbsolutePath+SocialBasename.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import TSCBasic

extension AbsolutePath {
  var socialBasename: String {
    basenameWithoutExt.sanitize.capitalized
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Extensions/TSCBasic/FileSystem+AbsolutePath.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import TSCBasic

extension FileSystem {
  func absolutePath(for path: String) -> AbsolutePath {
    if let path = try? AbsolutePath(validating: path) {
      return path
    } else if
      let path = try? RelativePath(validating: path),
      let currentWorkingDirectory = localFileSystem.currentWorkingDirectory {
      return AbsolutePath(
        path.pathString,
        relativeTo: currentWorkingDirectory
      )
    }

    return localFileSystem.homeDirectory.appending(
      RelativePath(path)
    )
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Group.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

typealias Groups = [Group]

struct Group: Codable {
  var name: String
  let path: String
  var readme: String?
  var scriptCommands: ScriptCommands = []
  var subGroups: Groups?
}

// MARK: - MarkdownDescription Protocol

extension Group: MarkdownDescriptionProtocol {
  var sectionTitle: String {
    .newLine + "## \(name)"
  }

  var markdownDescription: String {
    renderTree(for: self, level: 0)
  }

  func renderItem(for group: Group, level: Int = 0) -> String {
    "\(indent: level)- [\(group.name)](#\(group.path))"
  }

  func renderTree(for group: Group, level: Int) -> String {
    var description = String.empty

    if let subGroups = group.subGroups?.sorted() {
      description += renderItem(
        for: group,
        level: level
      )

      for subGroup in subGroups {
        description += renderTree(
          for: subGroup,
          level: level + 1
        )
      }
    } else {
      description += renderItem(
        for: group,
        level: level
      )
    }

    return description
  }
}

// MARK: - Comparable

extension Group: Comparable {
  static func < (lhs: Group, rhs: Group) -> Bool {
    lhs.name < rhs.name
  }

  static func == (lhs: Group, rhs: Group) -> Bool {
    lhs.name == rhs.name
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Language+Information.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

extension Language {
  typealias Informations = [Information]

  struct Information: Codable {
    let name: String
    let displayName: String
    let icon: String?

    init(name: String) {
      let language = Language(name)

      self.name = language.name
      self.displayName = language.displayName
      self.icon = language.icon
    }
  }
}

extension Language.Information: Hashable {
  func hash(into hasher: inout Hasher) {
    hasher.combine(name)
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Language.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

enum Language {
  case applescript
  case bash
  case python
  case ruby
  case swift
  case node
  case php
  case dotnet
  case custom(String)

  init(_ rawValue: String) {
    let value = rawValue.lowercased()

    switch value {
    case "applescript", "osascript":
      self = .applescript
    case "bash", "zsh", "sh":
      self = .bash
    case "python", "python2", "python3":
      self = .python
    case "ruby":
      self = .ruby
    case "swift":
      self = .swift
    case "node", "js", "zx":
      self = .node
    case "php":
      self = .php
    case "dotnet":
      self = .cs
    default:
      self = .custom(value)
    }
  }

  var icon: String? {
    switch self {
    case .applescript:
      return "icon-applescript.png"
    case .bash:
      return "icon-bash.png"
    case .python:
      return "icon-python.png"
    case .ruby:
      return "icon-ruby.png"
    case .swift:
      return "icon-swift.png"
    case .node:
      return "icon-nodejs.png"
    case .php:
      return "icon-php.png"
    case .cs:
      return "icon-dotnet.png"
    default:
      return nil
    }
  }

  var displayName: String {
    switch self {
    case .applescript:
      return "AppleScript"
    case .bash:
      return "Bash"
    case .python:
      return "Python"
    case .ruby:
      return "Ruby"
    case .swift:
      return "Swift"
    case .node:
      return "Node"
    case .php:
      return "PHP"
    case .cs:
      return ".NET"
    case .custom(let name):
      return name
    }
  }

  var name: String {
    displayName.lowercased()
  }
}

// MARK: -

extension Language: MarkdownDescriptionProtocol {
  var markdownDescription: String {
    if let iconFilename = icon {
      return "<img src=\"images/\(iconFilename)\" width=\"20\" height=\"20\" title=\"\(displayName)\">"
    }

    return displayName
  }

  var sectionTitle: String {
    .empty
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/Metadata.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

struct Metadata: Codable {
  let date: Date
  var identifiers: Identifiers
}

// MARK: - Equatable

extension Metadata: Equatable {
  static func == (lhs: Metadata, rhs: Metadata) -> Bool {
    lhs.date == rhs.date
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/RaycastData.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

struct RaycastData: Codable {
  var groups: Groups
  var updatedAt: Date
  var totalScriptCommands: Int
  var metadata: [Metadata]
  var languages: Set<Language.Information>

  var isEmpty: Bool {
    groups.isEmpty
      && totalScriptCommands == 0
      && metadata.isEmpty
  }

  private enum CodingKeys: String, CodingKey {
    case groups
    case updatedAt
    case totalScriptCommands
    case metadata
    case languages
  }

  init() {
    self.groups = .init()
    self.updatedAt = Date()
    self.totalScriptCommands = 0
    self.metadata = []
    self.languages = []
  }

  init(from decoder: Decoder) throws {
    let container = try decoder.container(keyedBy: CodingKeys.self)

    groups = try container.decode(Groups.self, forKey: .groups)
    totalScriptCommands = try container.decode(Int.self, forKey: .totalScriptCommands)
    languages = try container.decode(Set<Language.Information>.self, forKey: .languages)

    if let value = try container.decodeIfPresent(String.self, forKey: .updatedAt) {
      let dateFormatter = DateFormatter()
      dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"

      self.updatedAt = dateFormatter.date(from: value) ?? Date()
    } else {
      self.updatedAt = Date()
    }

    if let metadata = try container.decodeIfPresent([Metadata].self, forKey: .metadata) {
      self.metadata = metadata
    } else {
      self.metadata = []
    }
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Author.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension ScriptCommand {
  typealias Authors = [Author]

  struct Author: Codable {
    let name: String?
    let url: String?

    init(from decoder: Decoder) throws {
      let container = try decoder.container(keyedBy: InputCodingKeys.self)

      name = try container.decodeIfPresent(String.self, forKey: .name)
      url = try container.decodeIfPresent(String.self, forKey: .url)
    }

    func encode(to encoder: Encoder) throws {
      var container = encoder.container(keyedBy: OutputCodingKeys.self)

      try container.encode(name, forKey: .name)
      try container.encode(url, forKey: .url)
    }
  }
}

// MARK: - Keys

extension ScriptCommand.Author {
  enum InputCodingKeys: String, CodingKey {
    case url = "authorURL"
    case name = "author"
  }

  enum OutputCodingKeys: String, CodingKey {
    case url
    case name
  }
}

// MARK: - Comparable

extension ScriptCommand.Author: Comparable {
  static func < (lhs: ScriptCommand.Author, rhs: ScriptCommand.Author) -> Bool {
    guard let leftName = lhs.name, let rightName = rhs.name else {
      return false
    }

    return leftName < rightName
  }

  static func == (lhs: ScriptCommand.Author, rhs: ScriptCommand.Author) -> Bool {
    guard let leftName = lhs.name, let rightName = rhs.name else {
      return false
    }

    return leftName == rightName
  }
}

// MARK: - MarkdownDescription Protocol

extension ScriptCommand.Author: MarkdownDescriptionProtocol {
  var markdownDescription: String {
    if let name = name, let url = url {
      return "[\(name)](\(url))"
    } else if let name = name {
      return name
    } else if let url = url {
      return url
    }

    return .empty
  }

  var sectionTitle: String {
    .empty
  }
}

// MARK: - Authors

extension Array: MarkdownDescriptionProtocol where Element == ScriptCommand.Author {
  var sectionTitle: String {
    .empty
  }

  var markdownDescription: String {
    var authors = String.empty

    for author in self {
      let separator = self.separator(for: author.name ?? .empty)
      authors += separator + author.markdownDescription
    }

    return authors
  }

  func separator(for currentName: String) -> String {
    if let firstAuthor = first, currentName == firstAuthor.name {
      return .empty
    } else if let lastAuthor = last, currentName == lastAuthor.name {
      return Separator.and
    }

    return Separator.comma
  }
}

extension ScriptCommand.Authors {
  enum Separator {
    static let and = " and "
    static let comma = ", "
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Icon.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension ScriptCommand {
  struct Icon: Codable {
    let light: String?
    let dark: String?

    init(from decoder: Decoder) throws {
      let container = try decoder.container(keyedBy: InputCodingKeys.self)

      light = try container.decodeIfPresent(String.self, forKey: .icon)
      dark = try container.decodeIfPresent(String.self, forKey: .iconDark)
    }

    func encode(to encoder: Encoder) throws {
      var container = encoder.container(keyedBy: OutputCodingKeys.self)

      try container.encode(light, forKey: .light)
      try container.encode(dark, forKey: .dark)
    }
  }
}

// MARK: - Keys

extension ScriptCommand.Icon {
  enum InputCodingKeys: String, CodingKey {
    case icon
    case iconDark
  }

  enum OutputCodingKeys: String, CodingKey {
    case light
    case dark
  }
}

// MARK: - HTML Render

extension ScriptCommand.Icon {
  private func htmlImageTag(for lightFilepath: String?, darkFilepath: String?, path: String) -> String {
    if let iconLight = lightFilepath, let iconDark = darkFilepath {
      var darkURL: String { iconDark.isValidURL ? iconDark : path + iconDark }
      var lightURL: String { iconLight.isValidURL ? iconLight : path + iconLight }

      // This is the way to make modern HTML change images based on the theme (light or dark) used by the user
      return "<picture><source srcset=\"\(darkURL)\" media=\"(prefers-color-scheme: dark)\"><img src=\"\(lightURL)\" width=\"20\" height=\"20\"></picture>"
    } else if let icon = lightFilepath {
      var url: String { icon.isValidURL ? icon : path + icon }
      return "<img src=\"\(url)\" width=\"20\" height=\"20\">"
    } else if let icon = darkFilepath {
      var url: String { icon.isValidURL ? icon : path + icon }
      return "<img src=\"\(url)\" width=\"20\" height=\"20\">"
    }

    return .empty
  }

  func imageTag(with path: String) -> String {
    if let iconLight = light, let iconDark = dark {
      if iconLight.isEmoji && iconDark.isEmoji {
        return iconLight
      } else if iconLight.isImage && iconDark.isImage || iconLight.isValidURL && iconDark.isValidURL {
        let tag = htmlImageTag(
          for: iconLight,
          darkFilepath: iconDark,
          path: path
        )
        return tag
      }
    } else if let iconLight = light, iconLight.isEmoji {
      return iconLight
    } else if let iconDark = dark, iconDark.isEmoji {
      return iconDark
    } else if let icon = light, icon.isImage || icon.isValidURL {
      let tag = htmlImageTag(
        for: icon,
        darkFilepath: nil,
        path: path
      )

      return tag
    } else if let icon = dark, icon.isImage || icon.isValidURL {
      let tag = htmlImageTag(
        for: nil,
        darkFilepath: icon,
        path: path
      )

      return tag
    }

    return .empty
  }
}

// MARK: -

private extension String {
  var isImage: Bool {
    hasSuffix(".png") || hasSuffix(".jpeg") || hasSuffix(".jpg") || hasSuffix(".gif")
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Mode.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

extension ScriptCommand {
  enum Mode: String, Codable {
    case fullOutput
    case compact
    case silent
    case inline
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

typealias ScriptCommands = [ScriptCommand]

struct ScriptCommand: Codable {
  let identifier: String
  let schemaVersion: Int
  let title: String
  var filename: String
  let mode: Mode?
  var packageName: String?
  let icon: Icon?
  let authors: [Author]?
  let details: String?
  let currentDirectoryPath: String?
  let needsConfirmation: Bool?
  let refreshTime: String?
  let language: String
  let isTemplate: Bool
  let hasArguments: Bool
  let createdAt: String
  let updatedAt: String
  var path: String

  private(set) var isExecutable: Bool = false

  enum CodingKeys: String, CodingKey {
    case identifier
    case schemaVersion
    case title
    case filename
    case mode
    case packageName
    case icon
    case authors
    case details = "description"
    case currentDirectoryPath
    case needsConfirmation
    case refreshTime
    case language
    case isTemplate
    case hasArguments
    case createdAt
    case updatedAt
    case path
  }

  var iconDescription: String {
    guard let icon = self.icon else {
      return .empty
    }

    let path = "https://raw.githubusercontent.com/raycast/script-commands/master/commands/\(self.path)"

    let tag = icon.imageTag(
      with: path
    )

    return tag
  }

  var fullPath: String {
    "\(path)\(filename)"
  }

  mutating func configure(isExecutable: Bool) {
    self.isExecutable = isExecutable
  }
}

// MARK: - Encode/Decode

extension ScriptCommand {
  init?(from dictionary: [String: Any]) {
    if let scriptCommand: ScriptCommand = dictionary.encodeToStruct() {
      self = scriptCommand
    } else {
      return nil
    }
  }

  init(from decoder: Decoder) throws {
    let container      = try decoder.container(keyedBy: CodingKeys.self)

    // Required
    self.schemaVersion = try container.decode(Int.self, forKey: .schemaVersion)
    self.title         = try container.decode(String.self, forKey: .title)
    self.language      = try container.decode(String.self, forKey: .language)
    self.isTemplate    = try container.decode(Bool.self, forKey: .isTemplate)
    self.hasArguments  = try container.decode(Bool.self, forKey: .hasArguments)
    self.path          = try container.decode(String.self, forKey: .path)

    let filename       = try container.decode(String.self, forKey: .filename)
    let createdAt      = try container.decode(String.self, forKey: .createdAt)
    let updatedAt      = try container.decode(String.self, forKey: .updatedAt)

    self.filename  = filename
    self.createdAt = createdAt
    self.updatedAt  = updatedAt

    do {
      let value = "\(createdAt.description)\(filename)"
      let identifier = try value.convertToMD5()

      self.identifier = identifier
    } catch let error as StringError {
      fatalError(error.localizedDescription)
    }

    // Optionals
    self.mode                   = try container.decodeIfPresent(Mode.self, forKey: .mode)
    self.packageName            = try container.decodeIfPresent(String.self, forKey: .packageName)
    self.icon                   = try container.decodeIfPresent(Icon.self, forKey: .icon)
    self.details                = try container.decodeIfPresent(String.self, forKey: .details)
    self.currentDirectoryPath   = try container.decodeIfPresent(String.self, forKey: .currentDirectoryPath)
    self.needsConfirmation      = try container.decodeIfPresent(Bool.self, forKey: .needsConfirmation)
    self.refreshTime            = try container.decodeIfPresent(String.self, forKey: .refreshTime)
    self.authors                = try container.decodeIfPresent(Authors.self, forKey: .authors)
  }

  func encode(to encoder: Encoder) throws {
    var container = encoder.container(keyedBy: CodingKeys.self)

    try container.encode(identifier, forKey: .identifier)
    try container.encode(schemaVersion, forKey: .schemaVersion)
    try container.encode(title, forKey: .title)
    try container.encode(filename, forKey: .filename)
    try container.encode(mode, forKey: .mode)
    try container.encode(packageName, forKey: .packageName)
    try container.encode(icon, forKey: .icon)
    try container.encode(details, forKey: .details)
    try container.encode(currentDirectoryPath, forKey: .currentDirectoryPath)
    try container.encode(authors, forKey: .authors)
    try container.encode(needsConfirmation, forKey: .needsConfirmation)
    try container.encode(refreshTime, forKey: .refreshTime)
    try container.encode(language, forKey: .language)
    try container.encode(isTemplate, forKey: .isTemplate)
    try container.encode(hasArguments, forKey: .hasArguments)
    try container.encode(createdAt, forKey: .createdAt)
    try container.encode(updatedAt, forKey: .updatedAt)
    try container.encode(path, forKey: .path)
  }
}

// MARK: - Comparable

extension ScriptCommand: Comparable {
  static func < (lhs: ScriptCommand, rhs: ScriptCommand) -> Bool {
    lhs.title < rhs.title
  }

  static func == (lhs: ScriptCommand, rhs: ScriptCommand) -> Bool {
    lhs.title == rhs.title
      && lhs.schemaVersion == rhs.schemaVersion
      && lhs.authors == rhs.authors
  }
}

// MARK: - MarkdownDescription Protocol

extension ScriptCommand: MarkdownDescriptionProtocol {
  var markdownDescription: String {
    var content: String = .empty

    var author = "Raycast"
    var details = "N/A"

    if let value = self.authors {
      author = value.markdownDescription
    }

    if let value = self.details {
      details = value.replacingOccurrences(of: "|", with: #"\|"#)
    }

    let language = Language(self.language).markdownDescription
    let scriptPath = "\(path)\(filename)"

    let header = """
      | \(iconDescription) | [\(title)](\(scriptPath)) | \(details) | \(author) | \(hasArguments ? "✅" : "") | \(isTemplate ? "✅" : "") | \(language) |
    """

    content += .newLine + header

    return content
  }

  var sectionTitle: String {
    .empty
  }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Protocols/MarkdownDescriptionProtocol.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import Foundation

protocol MarkdownDescriptionProtocol {
  var markdownDescription: String { get }
  var sectionTitle: String { get }
}


================================================
FILE: Tools/Toolkit/Sources/ToolkitLibrary/Typealiases/Identifier.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

typealias Identifier = String
typealias Identifiers = [Identifier]


================================================
FILE: Tools/Toolkit/Tests/LinuxMain.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import XCTest

import ToolkitLibraryTests

var tests = [XCTestCaseEntry]()
tests += ToolkitLibraryTests.allTests()
XCTMain(tests)


================================================
FILE: Tools/Toolkit/Tests/ToolkitLibraryTests/ToolkitLibraryTests.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import XCTest
import class Foundation.Bundle

final class ToolkitLibraryTests: XCTestCase {
  func testExample() throws {
    let fooBinary = productsDirectory.appendingPathComponent("toolkit")

    let process = Process()
    process.executableURL = fooBinary

    let pipe = Pipe()
    process.standardOutput = pipe

    try process.run()
    process.waitUntilExit()

    let data = pipe.fileHandleForReading.readDataToEndOfFile()
    let output = String(data: data, encoding: .utf8)

    XCTAssertEqual(output, "OVERVIEW: A tool to generate automatized documentation\n\nUSAGE: toolkit <subcommand>\n\nOPTIONS:\n  -h, --help              Show help information.\n\nSUBCOMMANDS:\n  generate-documentation  Generate the documentation in JSON and Markdown format\n  version                 Print the current Toolkit version\n\n  See \'toolkit help <subcommand>\' for detailed help.\n")
  }

  /// Returns path to the built products directory.
  var productsDirectory: URL {
    #if os(macOS)
    for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") {
      return bundle.bundleURL.deletingLastPathComponent()
    }
    fatalError("couldn't find the products directory")
    #else
    return Bundle.main.bundleURL
    #endif
  }

  static var allTests = [
    ("testExample", testExample),
  ]
}


================================================
FILE: Tools/Toolkit/Tests/ToolkitLibraryTests/XCTestManifests.swift
================================================
//
//  MIT License
//  Copyright (c) 2020-2021 Raycast. All rights reserved.
//

import XCTest

#if !canImport(ObjectiveC)
public func allTests() -> [XCTestCaseEntry] {
  return [
    testCase(ToolkitLibraryTests.allTests),
  ]
}
#endif


================================================
FILE: Tools/Toolkit/integration.sh
================================================
#!/bin/bash

function commit_documentation() {
  if `git status | grep -q "nothing to commit"`; then
    exit 0;
  else
    extensions=false
    readme=false
    
    extensions_path="commands/extensions.json"
    readme_path="commands/README.md"
    
    while read -r file; do
      if [[ $file == $extensions_path ]]; then
        extensions=true
      fi
      
      if [[ $file == $readme_path ]]; then
        readme=true
      fi
    done <<< "$(git diff --name-only)"
    
    if $extensions && $readme; then
      git add $extensions_path $readme_path
      git commit -m "Update Script Commands documentation"
    fi
    
    exit 0;
  fi
}

function commit_executable() {
  if `git status | grep -q "nothing to commit"`; then
    exit 0;
  else
    git add -u
    git commit -m "Set scripts as executable"

    exit 0;
  fi
}

argument=$1

git config --local user.email "bot@raycast.com"
git config --local user.name "Raycast Bot"

if [[ $argument = "commit_documentation" ]]; then
  commit_documentation;
elif [[ $argument = "commit_executable" ]]; then
  commit_executable;
fi


================================================
FILE: _enabled-commands/.gitignore
================================================
# Ignore directory contents
*
# Except for
!.gitignore
!README.md

================================================
FILE: _enabled-commands/README.md
================================================
# How to use this directory

Grab script files you want to use from the repository and paste it here (rather than pointing directly to other repo folders). By doing this, you will avoid new unexpected scripts creeping in Raycast as community adds more. You also protect yourself from any potential folder renamings. All content in this directory will be ignored by git.

================================================
FILE: commands/README.md
================================================
<!-- AUTO GENERATED FILE. DO NOT EDIT. -->
<div align="center">
  <a href="https://github.com/raycast/script-commands">
    <img alt="GitHub contributors" src="https://img.shields.io/badge/dynamic/json?style=for-the-badge&color=202123&label=Script%20Commands&query=$.totalScriptCommands&url=https:%2F%2Fraw.githubusercontent.com%2Fraycast%2Fscript-commands%2Fmaster%2Fcommands%2Fextensions.json&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFgAAABYCAIAAAD+96djAAAIC0lEQVR4nOybW2zb1hmADynqLsuWRFLOBVmTpqkVy5LlpkgfDGRdnSvcdSiKIUWHosO8lwDtw4Bge1pRYMAw9KXAgAxYMiTNGjRZt+5plxQIkCzpNjduZMmJnMRpt7WR7NgSJYqULFISNUQ8pikpKVLpkOwDP+QhUajj40//f3j+n0fEY1sfByYA4EZP4JuCKQJiioCYIiCmCIgpAmKKgJgiIKYIiCkCYoqAmCIgpgiIKQJiioCYIiDGi9jidIQ8bqNnYbSIkNv9h7HY+7HRXf39xs7ESBFbnc5To5Gg3d5vtf4uMhLu8xg4GSNF7BroJ202+e9eK3EmNvr0gGFxYRnw+Y362SmeL1Rrzwb8AMMAAHYc30+Sl3JMtlrVfzJGigAAJDguXRH2kQHowmJ5Phi8kmeWRVHnmegt4gmXa7vLlRYE5ZUUz+ertT0BPwZd4JNBejpfWFJdowO6itjssJ8bix3euGGGZdOV9d8zwXFtOXKQoi4yuayoX47oJ2Kzw/HuaHSz00ng+H6K+pjJ31PFf4Lj+Hp93O9T4mKCJC8zTE6v9UI/Ec8M9B/euNGy9plPBulrrXERLxbvVip7SVJ24SGIFwaDuuWIfiI+K68u8KVDNIUpLmi6LUfm+VJnjuizduq6RnxWLmcqwgQZkF0QOH6Aoq51rBeda+elnObrhbYiQm73bt/AQqmsvJLi+YVSaS9Fyjlia8bFbLH4ZaWiXJPgOLWvtdgpZrTMEQ1FbHU634tFX9wwmCxy/11dBQAMEMSugX6x0ahJjRFvn3wZgeOHaGpREAI22xanU/7D1+sei2W7GxZjDovlgMY5gml0LCDkcZ+KRmi7HQAgStKRuRsXcrlxv+/3o9GuxyzWalPJuasFFulMIVrVGttcrsBaHWHD8Z9sewzreUwvQZwYCYfcmtTsWon4y/LKVGJOlCQAwE2OfyWeaKAY1mu1nh2LaVGnalh9XmSYI3M3Uhz3cny2UKuhGlauU2NeL6oBZVCK2Oyw7yNJ9SsXcrnJq58itCDjJYhT0cgQ0r4WMhHyDvrX4Z37qRYXSDJCZjpfkBpwPK+VOBmN7HC7UA2ORsQTLtefnoptc7lsOH4sPPzShkEkw7ZxbnHx6PxNxcWg3f7BU2OocgSNCJ/V6iUIOCKG/WroyYOtcYGKD5fuvXX7DlDiopkjSNZONCI+YdnXEklubS3AMeyd4Z0auTidTr95+446R87ERnvvgyNbI6YL7A/iCcWFDcdf3rQR1eBtnE6nfzp/S1LFRe998O5FbHU6v9+6FiQ57sfJuUq93suEHpE/Li39YmE9R3rvg3cpIuRxnx0b/eXQk69u2qR+fbpwP0d41PdLGWUZkjl59wE50nUfvJuia4vDcSY2GrTbMQx7NuBPV4QUzyv/m64I11h2kqYzgvDnpXstb3Q6Xxzs/obyzMBAosh90VqnouqDdxMRbovFga+9EcPeDj0gLqY0yBGHxXI8Et7d+pmfTqePzt9ScsSK457WwHlEuomIbLU6w7IHaMou68CwPQF/oVpLcJxyzZeVyr8LbLnVRY8R8bBejtIHFyTp9RupK/l8FyN32Y/ICMIVhpmkabsFb6q4nyN8vR4vFpVryh0R0bsIpZfT2QdnxOq76fQ/mG4s9NSYWRbFT1l2P0XaLRbQlDHu992tVOb50sPegkSEHBedffAkx6nbXF+XnvYRV1n2cHy2qNpHvR0aalsvEPL35RW5rgcA9BHEe7HobnTPSnvdUM3zpVfis8Xquou3dmzXyMVH2ewb11PK/bKvub9G5QLBzvI6x7+WSCpxATDszR3bX0KRAp2cz2bVe0r5lolkZGQ9yyGP+2Q0MthsUgIApEbj57cWzmQy6msom23c7+v6R8wUWHkVOEiR7wzvXK3Xp5JzM2yx57kDxM3bHW7XB2NjXiu8jV9mmFdnk6gGb+MQRS2LAioLiDtUt0vllhxBhBXDjkfCzwUC6hf/urKC0AL6nmW8WFSvnb1jxbDfjAxPkOSxkeHvBDR8FoW+eXud4w9fi7OInmIfCw8/1+yD2nD8t5GR7wVpJMN2okkXe75UmkrOIcmRs5lFZe9QlSROsxpfqyddAADaZjvyrS191vUS6JM8e25xUX2NlyB+9vg2eZ8uc345+1E2q77m237/iehIVZJ+lJz7Z76g0Ww1FAEAeLq//0Qk7LVa5X9KjcbR+Zsfttbm4z7f8UjYIe/Tm88H37iROr/S4uK7QbpUq1/I5bSbqrZPwzOCcIlhng8G5W0PhmF7SbKtTv2iUrlfy1KUrXmNBcMO0VRGaOlx3CqV/tN8jKwdmp+PyIrVzjo13+pC6eUQa74myMBCqXSnXNZ0bmr0OCiyLIrThcLB1v5FpqOvNXO/lqXWY4ciPy+X1WcrNEWnEzNLgnAxl5sgSbl9JH/mXK02W2yJi4+Z/GSQll3wtdr7mYymh0PU6Hd0KCtWLzPMC8GgkiN7/O05ck8U5RypNRo/TCTR7h2/Gl3PUOWq1c4cKXSsFzMs+7eVlX9pcyDkYeh98nbpQT2+zj74/1a77zV1hwFnsZdF8VIuNxmkHWs9vn1koC1H9MeYQ+kP7IMzYjVpnAvDvq8xw7bUqaIkfb6q366hEyO/pqD0wSUAXr+e6roTjwRta41HIeRxewhCo0ODj043T8fQ8hXPQfTE+K87fkMwRUBMERBTBMQUATFFQEwREFMExBQBMUVATBEQUwTEFAExRUBMERBTBOT/AQAA//98wKt7wQJ9rAAAAABJRU5ErkJggg==&labelColor=202123">
  </a>
  <a href="https://github.com/raycast/script-commands/graphs/contributors">
    <img alt="GitHub contributors" src="https://img.shields.io/github/stars/raycast?style=for-the-badge">
  </a>
  <a href="https://github.com/raycast/script-commands/stargazers">
    <img alt="GitHub Org's stars" src="https://img.shields.io/github/contributors/raycast/script-commands?style=for-the-badge">
  </a>
  <a href="https://twitter.com/raycastapp">
    <img alt="Twitter Follow" src="https://img.shields.io/twitter/follow/raycastapp?style=for-the-badge">
  </a>
</div>

# Raycast Script Commands

[Raycast](https://raycast.com) lets you control your tools with a few keystrokes
and Script Commands makes it possible to execute scripts from anywhere on your desktop.
They are a great way to speed up every-day tasks such as converting data, opening bookmarks
or triggering dev workflows.

This repository contains sample commands and documentation to write your own ones.

### Categories

- [Ai](#ai)
  - [Gemini](#gemini)
- [Apps](#apps)
  - [Agenda](#agenda)
  - [Amphetamine](#amphetamine)
  - [Baremetrics](#baremetrics)
  - [Bartender](#bartender)
  - [Bear](#bear)
  - [BusyCal](#busycal)
  - [Chatgpt](#chatgpt)
  - [Claude](#claude)
  - [Cleanshot](#cleanshot)
  - [Craft](#craft)
  - [DND Me](#dnd-me)
  - [Deepl](#deepl)
  - [Devutils](#devutils)
  - [Dictionary](#dictionary)
  - [Downie](#downie)
  - [Espanso](#espanso)
  - [Eudic](#eudic)
  - [Evernote](#evernote)
  - [ExpressVPN](#expressvpn)
  - [Fantastical](#fantastical)
  - [Ferdi](#ferdi)
  - [Find My](#find-my)
  - [Focus](#focus)
  - [GoodLinks](#goodlinks)
  - [HazeOver](#hazeover)
  - [Hyper](#hyper)
  - [Lungo](#lungo)
  - [Mail](#mail)
  - [Medo](#medo)
  - [MeetingBar](#meetingbar)
  - [MenubarX](#menubarx)
  - [Message](#Message)
  - [Mullvad](#mullvad)
  - [NotePlan3](#noteplan3)
  - [Notes](#notes)
  - [Obsidian](#obsidian)
  - [One Thing](#one-thing)
  - [OpenVPN](#openvpn)
  - [PhpStorm](#phpstorm)
  - [Plash](#plash)
  - [Playground](#playground)
  - [Pulse Secure](#pulse-secure)
  - [Quip](#quip)
  - [Raycast](#raycast)
  - [Reminders](#reminders)
  - [Safari](#safari)
  - [Session](#session)
  - [SideNotes](#sidenotes)
  - [Sip](#sip)
  - [Stickies](#stickies)
  - [Sublime](#sublime)
  - [Surfshark](#surfshark)
  - [Tailscale](#tailscale)
  - [Terminal Translate](#terminal-translate)
  - [Things](#things)
  - [Timing](#timing)
  - [Todoist](#todoist)
  - [Translate Shell](#translate-shell)
  - [Trello](#trello)
  - [TunnelBlick](#tunnelblick)
  - [Viscosity](#viscosity)
  - [WARP](#warp)
  - [WebStorm](#webstorm)
  - [Wikipedia](#wikipedia)
  - [Y Pomodoro](#y-pomodoro)
  - [iTerm](#iterm)
  - [iconsur](#iconsur)
- [Browsing](#browsing)
- [Communication](#communication)
  - [Cloudup](#cloudup)
  - [DuckDuckGo Email Protection](#duckduckgo-email-protection)
  - [Emojis](#emojis)
  - [Gmail](#gmail)
  - [Google Meet](#google-meet)
  - [Mail](#mail)
  - [Messenger](#messenger)
  - [Slack](#slack)
  - [Zoom](#zoom)
- [Conversions](#conversions)
  - [Change Case](#change-case)
- [Culture](#culture)
- [Dashboard](#dashboard)
  - [Countdowns](#countdowns)
  - [Firebase](#firebase)
  - [Mood Meter](#mood-meter)
  - [Open Weather](#open-weather)
- [Dashboards](#dashboards)
- [Developer Utils](#developer-utils)
  - [Aws](#aws)
  - [Brew](#brew)
  - [Cloudflare](#cloudflare)
  - [Docker](#docker)
  - [Git](#git)
  - [GitHub](#github)
  - [GitLab](#gitlab)
  - [Google](#google)
  - [Ip](#ip)
  - [Minikube](#minikube)
  - [Sentry](#sentry)
  - [Solana](#solana)
  - [Vscode](#vscode)
  - [Xcode](#xcode)
- [Home](#home)
  - [Elgato](#elgato)
  - [Philips Hue](#philips-hue)
- [Math](#math)
- [Media](#media)
  - [Apple Music](#apple-music)
  - [Apple Tv](#apple-tv)
  - [Cmus](#cmus)
  - [Endel](#endel)
  - [Lowfi](#lowfi)
  - [Sonos](#sonos)
  - [Speaker Setup](#speaker-setup)
  - [Spotify](#spotify)
  - [Tidal](#tidal)
  - [foobar2000](#foobar2000)
- [Navigation](#navigation)
- [Productivity](#productivity)
  - [Bitwarden](#bitwarden)
  - [Imgur](#imgur)
  - [Pomodoro](#pomodoro)
  - [QPDF](#qpdf)
  - [Writing](#writing)
  - [macOCR](#macocr)
  - [stopwatch](#stopwatch)
  - [tesseract](#tesseract)
- [Remote Control](#remote-control)
  - [Ddc](#ddc)
    - [Arm64](#arm64)
    - [X86](#x86)
  - [Denon AVR](#denon-avr)
  - [LG TV](#lg-tv)
  - [Samsung TV](#samsung-tv)
- [System](#system)
  - [Audio](#audio)
  - [Magic Keyboard Switcher](#magic-keyboard-switcher)
  - [VPN](#vpn)
  - [Vpnutil](#vpnutil)
- [Web Searches](#web-searches)
  - [WordPress](#wordpress)

## Ai

#### Gemini

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  |  | [Ask Gemini](ai/gemini/gemini.js) | Open Gemini in Chrome browser and submit a prompt with optional selected text as context | [Est7](https://github.com/est7) and [Nimo Beeren](https://github.com/nimobeeren) | ✅ |  | <img src="images/icon-nodejs.png" width="20" height="20" title="Node"> |

## Apps

#### Agenda

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/agenda/images/agenda.png" width="20" height="20"> | [Agenda Today Overview](apps/agenda/agenda-today.sh) | Opens Agenda - Today Overview | [Michael Ellis](https://github.com/mtellis2) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/agenda/images/agenda.png" width="20" height="20"> | [Create New On the Agenda Note](apps/agenda/agenda-new-note.sh) | Creates New Note and adds it to On the Agenda | [Michael Ellis](https://github.com/mtellis2) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/agenda/images/agenda.png" width="20" height="20"> | [On the Agenda Overview](apps/agenda/agenda-on-the-agenda.sh) | Opens Agenda - On the Agenda Overview | [Michael Ellis](https://github.com/mtellis2) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Amphetamine

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/amphetamine/images/amphetamine.png" width="20" height="20"> | [End Session](apps/amphetamine/amphetamine-off.applescript) | Stop Current Amphetamine Session | [James Lyons](https://github.com/jamesjlyons) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/amphetamine/images/amphetamine.png" width="20" height="20"> | [Start Default Session](apps/amphetamine/amphetamine-on.applescript) | Start Default Amphetamine Session | [James Lyons](https://github.com/jamesjlyons) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Baremetrics

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/baremetrics/images/baremetrics.png" width="20" height="20"> | [Annual Recurring Revenue](apps/baremetrics/get-arr.sh) | Display Annual Recurring Revenue (ARR) | [Valentin Chrétien](https://github.com/valentinchrt) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/baremetrics/images/baremetrics.png" width="20" height="20"> | [Average Revenue Per User](apps/baremetrics/get-arpu.sh) | Display Average revenue per user (ARPU) | [Valentin Chrétien](https://github.com/valentinchrt) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/baremetrics/images/baremetrics.png" width="20" height="20"> | [Lifetime Value](apps/baremetrics/get-ltv.sh) | Display Lifetime Value (LTV) | [Valentin Chrétien](https://github.com/valentinchrt) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/baremetrics/images/baremetrics.png" width="20" height="20"> | [Monthly Recurring Revenue](apps/baremetrics/get-mrr.sh) | Display Monthly Recurring Revenue (MRR) | [Valentin Chrétien](https://github.com/valentinchrt) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/baremetrics/images/baremetrics.png" width="20" height="20"> | [Revenue](apps/baremetrics/simple-dashboard.sh) | Display Revenue Dashboard | [Valentin Chrétien](https://github.com/valentinchrt) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Bartender

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bartender/images/bartender-icon.png" width="20" height="20"> | [Search Bartender](apps/bartender/bartender-search.applescript) | Perform a quick search of Menu Bar Items, in Bartender 4 | Raycast | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Bear

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-dark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-light.png" width="20" height="20"></picture> | [Add Note](apps/bear/bear-add-note.sh) | Add a new note to Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-dark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-light.png" width="20" height="20"></picture> | [Open Note](apps/bear/bear-open-note.sh) | Open the specified note in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-dark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-light.png" width="20" height="20"></picture> | [Open Tag](apps/bear/bear-open-tag.sh) | Open the specified tag in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-dark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-light.png" width="20" height="20"></picture> | [Open Today](apps/bear/bear-today.sh) | Open the Today section in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-dark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-light.png" width="20" height="20"></picture> | [Open Todos](apps/bear/bear-todo.sh) | Open the Todo section in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-dark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/bear/images/bear-light.png" width="20" height="20"></picture> | [Search](apps/bear/bear-search.sh) | Search notes by keyword and/or tag in Bear. | [Tanay Nistala](https://github.com/tanaynistala) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### BusyCal

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/busycal/images/busycal.png" width="20" height="20"> | [Create Event/Task](apps/busycal/new-busycal-event-or-task.applescript) | Creates new events or tasks in BusyCal. | [Annie Ma](www.anniema.co) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Chatgpt

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/chatgpt/images/chatgpt.png" width="20" height="20"> | [chatgpt](apps/chatgpt/chatgpt-open-safari.applescript) | Open chatgpt in safari | [gintonyc](https://raycast.com/gintonyc) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Claude

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | ✨ | [Ask Claude](apps/claude/claude.js) | Open Claude in Chrome browser and submit a prompt | [Nimo Beeren](https://github.com/nimobeeren) | ✅ |  | <img src="images/icon-nodejs.png" width="20" height="20" title="Node"> |

#### Cleanshot

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/add-quick-access-overlay.png" width="20" height="20"> | [Add Quick Access Overlay](apps/cleanshot/cleanshot-add-quick-access-overlay.sh) | Opens a new Quick Access Overlay with the specified image or video. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/annotate.png" width="20" height="20"> | [Annotate](apps/cleanshot/cleanshot-annotate.sh) | Opens specified file in Annotate. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/capture-area.png" width="20" height="20"> | [Capture Area](apps/cleanshot/cleanshot-capture-area.sh) | Take a screenshot of a specific area on your screen. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/capture-fullscreen.png" width="20" height="20"> | [Capture Fullscreen](apps/cleanshot/cleanshot-capture-fullscreen.sh) | Take a screenshot of your screen. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/capture-previous-area.png" width="20" height="20"> | [Capture Previous Area](apps/cleanshot/cleanshot-capture-previous-area.sh) | Take a screenshot of the previously specified area of your screen. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/capture-text.png" width="20" height="20"> | [Capture Text](apps/cleanshot/cleanshot-capture-text.sh) | Opens Text Recognition (OCR) tool or extracts text from the specified file. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/capture-window.png" width="20" height="20"> | [Capture Window](apps/cleanshot/cleanshot-capture-window.sh) | Take a screenshot of a window. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/clipboard.png" width="20" height="20"> | [Open from Clipboard](apps/cleanshot/cleanshot-open-from-clipboard.sh) | Open screenshot that is currently in the clipboard. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/pin.png" width="20" height="20"> | [Pin to the Screen](apps/cleanshot/cleanshot-pin.sh) | Pin a screenshot to the screen. | [CleanShot X](https://twitter.com/CleanShot_app) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/record-screen.png" width="20" height="20"> | [Record Screen](apps/cleanshot/cleanshot-record-screen.sh) | Start a screen recording and save it as a video or an optimized GIF file. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/record-screen-keystroke-pro.png" width="20" height="20"> | [Record Screen With Keystroke Pro](apps/cleanshot/cleanshot-record-screen-with-keystroke-pro.sh) | Start a screen recording with keystrokes using the Keystroke Pro app and save it as a video or an optimized GIF file. | [Danylo Zalizchuk](https://raycast.com/danulqua) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/restore.png" width="20" height="20"> | [Restore Recently Closed File](apps/cleanshot/cleanshot-restore.sh) | Restore the recently closed file. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/scrolling-capture.png" width="20" height="20"> | [Scrolling Capture](apps/cleanshot/cleanshot-scrolling-capture.sh) | Capture any scrollable content. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/self-timer.png" width="20" height="20"> | [Self-Timer](apps/cleanshot/cleanshot-self-timer.sh) | Take a screenshot after a specified delay to capture the perfect moment. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/cleanshot/./images/toggle-desktop-icons.png" width="20" height="20"> | [Toggle Desktop Icons](apps/cleanshot/cleanshot-toggle-desktop-icons.sh) | Hide clutter on your Desktop. | [CleanShot X](https://twitter.com/CleanShot_app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Craft

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/craft/./images/craft.png" width="20" height="20"> | [Create Doc](apps/craft/craft-create-doc.template.sh) | Creates a doc in Craft | [James Lyons](https://github.com/jamesjlyons) | ✅ | ✅ | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/craft/./images/craft.png" width="20" height="20"> | [Search in Workspace](apps/craft/craft-search-workspace.template.sh) | Searches in Workspace in Craft | [James Lyons](https://github.com/jamesjlyons) | ✅ | ✅ | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### DND Me

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | 🔕 | [Start DND](apps/dnd-me/start-dnd-me.sh) | Starts DND via DND Me. The parameter has to be a menu item or slider equivalent: 15m, 30m, 1h, 2h, ..., 12h, next, next-hour, next-half-hour; it defaults to next. next-hour means the next 60m mark, next-half-hour means the next 30m mark and next means the first of the two. For example, if it's 9:22, next-hour means 10:00, next-half-hour means 9:30 and next means 9:30. | [Roland Leth](https://runtimesharks.com/projects/dnd-me) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | 🔔 | [Stop DND](apps/dnd-me/stop-dnd-me.sh) | Stops DND via DND Me. | [Roland Leth](https://runtimesharks.com/projects/dnd-me) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Deepl

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/deepl/images/deepl.png" width="20" height="20"> | [DeepL App Translate](apps/deepl/deepl-app-translate.applescript) | Translate text in DeepL for Mac. Features options to input from the clipboard as well as automatically copy translation results. | [Jono Hewitt](https://github.com/jonohewitt) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/deepl/images/deepl.png" width="20" height="20"> | [DeepL Web Translate](apps/deepl/deepl-web-translate.sh) | Translate text on the DeepL website. Translates to a default language if no "to" argument is given. | [Jono Hewitt](https://github.com/jonohewitt) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Devutils

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Backslash Escape/Unescape](apps/devutils/backslash.sh) | Escape (or unescape) backslashes in your current clipboard string | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Base64 Image Encode/Decode](apps/devutils/base64image.sh) | Decode the Base64 string in clipboard to an image (if it’s decodable) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Base64 String Encode/Decode](apps/devutils/base64encode.sh) | Decode the Base64 string in clipboard (if it’s decodable) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [CSS Beautify/Minify](apps/devutils/cssformatter.sh) | Beautify or minify your current clipboard as CSS | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [CSV to JSON](apps/devutils/csv2json.sh) | Convert your current clipboard from CSV to JSON | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Cron Job Parser](apps/devutils/cronparser.sh) | Parse the cron job expression in clipboard (if it’s a valid cron expression) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [ERB Beautify/Minify](apps/devutils/erbformatter.sh) | Beautify or minify your current clipboard as ERB | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [HTML Beautify/Minify](apps/devutils/htmlformatter.sh) | Beautify or minify your current clipboard as HTML | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [HTML Entity Encode/Decode](apps/devutils/htmlencode.sh) | Escape (or unescape) the HTML entities your current clipboard string | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [HTML Preview](apps/devutils/htmlpreview.sh) | Show a HTML preview of your current clipboard string | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [HTML to JSX](apps/devutils/html2jsx.sh) | Convert the HTML string in clipboard to JSX | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Hash Generator](apps/devutils/hashing.sh) | Calculate the hash of your current clipboard string | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [JS Beautify/Minify](apps/devutils/jsformatter.sh) | Beautify or minify your current clipboard as JavaScript | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [JSON Format/Validate](apps/devutils/jsonformatter.sh) | Format the JSON string currently in your clipboard (if it’s a valid JSON) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [JSON to CSV](apps/devutils/json2csv.sh) | Convert your current clipboard from JSON to CSV | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [JSON to YAML](apps/devutils/json2yaml.sh) | Convert your current clipboard from JSON to YAML | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [JWT Debugger](apps/devutils/jwt.sh) | Decode and verify the current JWT token in your clipboard | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [LESS Beautify/Minify](apps/devutils/lessformatter.sh) | Beautify or minify your current clipboard as LESS | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Lorem Ipsum Generator](apps/devutils/loremipsum.sh) | Get some randomly generated lorem ipsum strings | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Markdown Preview](apps/devutils/markdownpreview.sh) | Preview the markdown string currently in your clipboard | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Number Base Converter](apps/devutils/numberbase.sh) | Convert numbers between bases (oct, hex, binary, etc.) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [QR Code Reader/Generator](apps/devutils/qrcode.sh) | Generate a QR code from your current clipboard string | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [RegExp Tester](apps/devutils/regextester.sh) | Test your regular expression with a string and inspect matches, groups, etc. | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [SCSS Beautify/Minify](apps/devutils/scssformatter.sh) | Beautify or minify your current clipboard as SCSS | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [SQL Formatter](apps/devutils/sqlformatter.sh) | Format the SQL string currently in your clipboard | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [String Case Converter](apps/devutils/stringcaseconverter.sh) | Convert a string in clipboard into various naming conventions | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [String Inspector](apps/devutils/stringinspect.sh) | Inspect your current clipboard string (length, words count, unicode, etc.) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Text Diff Checker](apps/devutils/textdiff.sh) | Compare two texts and find diff (per characters, words, lines, etc.) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [URL Encode/Decode](apps/devutils/urlencode.sh) | Decode the current URL string in your clipboard (if any) | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [URL Parser](apps/devutils/querystringparser.sh) | Parse the URL string currently in your clipboard | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [UUID/ULID Generate/Decode](apps/devutils/uuidtool.sh) | Decode the UUID in your clipboard (if any), or generate UUIDs | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [Unix Time Converter](apps/devutils/unixtime.sh) | Parse and display UNIX the timestamp string currently in your clipboard | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [XML Beautify/Minify](apps/devutils/xmlformatter.sh) | Beautify or minify your current clipboard as XML | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/devutils/images/devutils.png" width="20" height="20"> | [YAML to JSON](apps/devutils/yaml2json.sh) | Convert your current clipboard from YAML to JSON | [DevUtils.app](https://devutils.app) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Dictionary

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  |  | [Look up in Dictionary](apps/dictionary/look-up-in-dictionary.applescript) | Look up selected text in Dictionary | [yayiji](https://github.com/yayiji) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Downie

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/downie/images/downie.png" width="20" height="20"> | [Download Video](apps/downie/download-video.sh) | Download video from Pasteboard link | [Clu Soh](https://twitter.com/designedbyclu) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Espanso

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/espanso/images/espanso.png" width="20" height="20"> | [Create Text Expansion](apps/espanso/espanso-create-expansion.sh) | Add a text expansion to expanso | [Max Stoiber](https://github.com/mxstbr) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/espanso/images/espanso.png" width="20" height="20"> | [Disable Espanso](apps/espanso/disable-espanso.sh) | N/A | [es183923](https://github.com/es183923) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/espanso/images/espanso.png" width="20" height="20"> | [Enable Espanso](apps/espanso/enable-espanso.sh) | N/A | [es183923](https://github.com/es183923) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/espanso/images/espanso.png" width="20" height="20"> | [Restart Espanso](apps/espanso/restart-espanso.sh) | N/A | [es183923](https://github.com/es183923) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/espanso/images/espanso.png" width="20" height="20"> | [Start Espanso](apps/espanso/start-espanso.sh) | N/A | [es183923](https://github.com/es183923) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/espanso/images/espanso.png" width="20" height="20"> | [Stop Espanso](apps/espanso/stop-espanso.sh) | N/A | [es183923](https://github.com/es183923) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Eudic

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/eudic/./images/eudic.png" width="20" height="20"> | [Look up Word](apps/eudic/look-up-in-eudic.applescript) | look up in eudic | [jingyi](https://jingyi.blog) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Evernote

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/evernote/./images/evernote.png" width="20" height="20"> | [Create Evernote](apps/evernote/create-note.applescript) | Creates a new Evernote. | [Aaron Miller](https://github.com/aaronhmiller) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/evernote/./images/evernote.png" width="20" height="20"> | [Create Evernote Paste Clipboard](apps/evernote/create-note-paste-clipboard.applescript) | Creates a new Evernote, pastes in the contents of the clipboard, and positions the cursor in the title area. | [Aaron Miller](https://github.com/aaronhmiller) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### ExpressVPN

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  |  | [Connect](apps/expressvpn/expressvpn-connect.applescript) | N/A | [Amir Hossein SamadiPour](https://github.com/SamadiPour) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  |  | [Disconnect](apps/expressvpn/expressvpn-disconnect.applescript) | N/A | [Amir Hossein SamadiPour](https://github.com/SamadiPour) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  |  | [Reconnect](apps/expressvpn/expressvpn-reconnect.applescript) | N/A | [Amir Hossein SamadiPour](https://github.com/SamadiPour) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Fantastical

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/fantastical/./images/fantastical.png" width="20" height="20"> | [Create Event](apps/fantastical/create-event.applescript) | Create an event in Fantastical | [Robert Cooper](https://github.com/robertcoopercode) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/fantastical/./images/fantastical.png" width="20" height="20"> | [Create Task](apps/fantastical/create-todo-in-fantastical.applescript) | Speed up setting reminders for Fantastical by invoking this script. | [Vardan Sawhney](https://github.com/commai) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Ferdi

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/ferdi/images/ferdi.png" width="20" height="20"> | [Open Service by Index](apps/ferdi/ferdi-open-service-by-index.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/ferdi/images/ferdi.png" width="20" height="20"> | [Open Service by Name](apps/ferdi/ferdi-open-service-by-name.applescript) | N/A | [Jakub Lanski](https://github.com/jaklan) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Find My

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/find-my/images/find-my-icon.png" width="20" height="20"> | [Find My Phone (Auto Sound)](apps/find-my/fmp.js) | N/A | Raycast |  |  | <img src="images/icon-nodejs.png" width="20" height="20" title="Node"> |

#### Focus

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Open Focus Preferences](apps/focus/focus-preferences.sh) | Open focus preferences. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Start 25 minutes Focus Session](apps/focus/focus-start-session-25.sh) | Start a 25 minutes focus session. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Start Custom Break](apps/focus/focus-start-custom-break.sh) | Start a custom break. If you don't enter any values, it uses the last break duration. | [Ernest Ojeh](https://github.com/namzo) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Start Custom Focus Session](apps/focus/focus-start-custom-session.sh) | Start a custom focus session. If you don't enter any values, it starts an untimed focus session. | [Ernest Ojeh](https://github.com/namzo) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Start Focus Session (Focus)](apps/focus/focus-start-session.sh) | Start an untimed focus session. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Stop Break (Unbreak)](apps/focus/focus-stop-break.sh) | Stop break and continues the current focus session. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Stop Focus Session (Unfocus)](apps/focus/focus-stop-session.sh) | Stop the current focus session. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Take 5 Minutes Break](apps/focus/focus-start-break-5.sh) | Take 5 minutes break. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/focus/images/focus-logo.png" width="20" height="20"> | [Toggle Focus Session](apps/focus/focus-toggle-focus.sh) | Toggle between start session (untimed) and stop session. | [Ernest Ojeh](https://github.com/namzo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### GoodLinks

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Open Last Unread Link](apps/goodlinks/goodlinks-last-unread-link.sh) | Open the last unread link in the GoodLinks app | [Filip Chabik](https://github.com/hadret) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Open Link](apps/goodlinks/goodlinks-open-link.sh) | Open a link in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Open Random Unread Link](apps/goodlinks/goodlinks-random-unread-link.sh) | Open a random unread link in the GoodLinks app | [Filip Chabik](https://github.com/hadret) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Save Link](apps/goodlinks/goodlinks-save-link.sh) | Saves a new link to GoodLinks | [Filip Chabik](https://github.com/hadret) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Show Read List](apps/goodlinks/goodlinks-read-list.sh) | Show Read list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Show Starred List](apps/goodlinks/goodlinks-starred-list.sh) | Show Starred list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Show Tag](apps/goodlinks/goodlinks-tagged-links.sh) | Show links tagged with the specified tag in the GoodLinks app | [Filip Chabik](https://github.com/hadret) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Show Unread List](apps/goodlinks/goodlinks-unread-list.sh) | Show Unread list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/goodlinks/images/goodlinks.png" width="20" height="20"> | [Show Untagged List](apps/goodlinks/goodlinks-untagged-list.sh) | Show Untagged list in the GoodLinks app | [Filip Chabik](https://github.com/hadret) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### HazeOver

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/hazeover/images/hazeover.png" width="20" height="20"> | [Set Intensity](apps/hazeover/hazeover-set-intensity.applescript) | Set dimming intensity of background windows. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/hazeover/images/hazeover.png" width="20" height="20"> | [Toggle Dimming](apps/hazeover/hazeover-toggle-dimming.applescript) | Toggle dimming of all background windows. | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Hyper

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/hyper/images/hyper.png" width="20" height="20"> | [Run Shell Command](apps/hyper/hyper-run-shell-command.applescript) | Run a terminal using Hyper | [Eliot Hertenstein](https://github.com/eIiot) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Lungo

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/lungo/./images/lungo.png" width="20" height="20"> | [Activate](apps/lungo/lungo-activate.sh) | Deactivate Lungo. | [Lungo](https://sindresorhus.com/lungo) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/lungo/./images/lungo.png" width="20" height="20"> | [Deactivate](apps/lungo/lungo-deactivate.sh) | Deactivate Lungo. | [Lungo](https://sindresorhus.com/lungo) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/lungo/./images/lungo.png" width="20" height="20"> | [Toggle](apps/lungo/lungo-toggle.sh) | Toggle Lungo. | [Lungo](https://sindresorhus.com/lungo) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Mail

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mail/./images/mail.png" width="20" height="20"> | [CaptchaFromMail](apps/mail/copy-captcha-from-mail.py) | Copy the captcha from the emlx file. | [RealTong](https://raycast.com/RealTong) |  |  | <img src="images/icon-python.png" width="20" height="20" title="Python"> |
  | 📧 | [Copy Foreground Mail Deeplink](apps/mail/copy-foreground-mail-deeplink.applescript) | Copies the foreground Mail deeplink | [Jesse Claven](https://github.com/jesse-c) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Medo

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/medo/./images/medo.png" width="20" height="20"> | [Add Task](apps/medo/add-task.sh) | Add a new task | [Aayush ](https://github.com/Aayush9029) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/medo/./images/medo.png" width="20" height="20"> | [Medo Float](apps/medo/medo-float.sh) | Add a new task with priority  | [Aayush ](https://github.com/Aayush9029) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/medo/./images/medo.png" width="20" height="20"> | [Medo Float Large](apps/medo/medo-float-large.sh) | Add a new task with priority  | [Aayush ](https://github.com/Aayush9029) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/medo/./images/medo.png" width="20" height="20"> | [Medo Float Small](apps/medo/medo-float-small.sh) | Add a new task with priority  | [Aayush ](https://github.com/Aayush9029) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### MeetingBar

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/meetingbar/images/meetingbar.png" width="20" height="20"> | [Create Meeting](apps/meetingbar/meetingbar-create-meeting.applescript) | Create a new meeting. | [Jakub Lanski](https://github.com/jaklan) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/meetingbar/images/meetingbar.png" width="20" height="20"> | [Join Meeting](apps/meetingbar/meetingbar-join-meeting.applescript) | Join the ongoing or upcoming meeting. | [Jakub Lanski](https://github.com/jaklan) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### MenubarX

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/menubarx/images/menubarx_logo.png" width="20" height="20"> | [Close Last Tab](apps/menubarx/close-last-menubarx-tab.sh) | Close last viewed tab in MenubarX | [Clu Soh](https://twitter.com/designedbyclu) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/menubarx/images/menubarx_logo.png" width="20" height="20"> | [Open Tabs](apps/menubarx/open-tab-in-menubar.applescript) | Open X Tab in your menubar | [Clu Soh](https://twitter.com/designedbyclu) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/menubarx/images/menubarx_logo.png" width="20" height="20"> | [Open in MenubarX](apps/menubarx/open-in-menubarx.sh) | Open Pasteboard link in MenubarX | [Clu Soh](https://twitter.com/designedbyclu) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Message

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/Message/images/Message.png" width="20" height="20"> | [Copy Code](apps/Message/copycode.sh) | Copy verification code from a message. | [Fatpandac](https://github.com/Fatpandac) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Mullvad

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mullvad/images/mullvad.png" width="20" height="20"> | [Connect](apps/mullvad/connect.sh) | Connect the Mullvad VPN tunnel using the most recent configuration settings. | [Phil Salant](https://github.com/PSalant726) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mullvad/images/mullvad.png" width="20" height="20"> | [Connect to Location](apps/mullvad/location.sh) | Connect the Mullvad VPN tunnel using the specified location. | [Phil Salant](https://github.com/PSalant726) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mullvad/images/mullvad.png" width="20" height="20"> | [Disconnect](apps/mullvad/disconnect.sh) | Disconnect from the Mullvad VPN tunnel. | [Phil Salant](https://github.com/PSalant726) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mullvad/images/mullvad.png" width="20" height="20"> | [Mullvad Status](apps/mullvad/status.sh) | Display the current status of the Mullvad VPN tunnel connection. | [Phil Salant](https://github.com/PSalant726) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mullvad/images/mullvad.png" width="20" height="20"> | [Reconnect](apps/mullvad/reconnect.sh) | Force the client to reconnect to the Mullvad VPN tunnel. | [Phil Salant](https://github.com/PSalant726) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/mullvad/images/mullvad.png" width="20" height="20"> | [Search Countries, Cities, and Hostnames](apps/mullvad/search.sh) | Search the list of available entities to which a Mullvad VPN tunnel connection can be made. | [Phil Salant](https://github.com/PSalant726) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### NotePlan3

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/noteplan3/images/noteplan3.png" width="20" height="20"> | [Append To Daily Note](apps/noteplan3/noteplan-append-daily-note.sh) | Append to daily note | [Göran Damberg](https://github.com/gdamberg) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/noteplan3/images/noteplan3.png" width="20" height="20"> | [New Note From Clipboard](apps/noteplan3/noteplan-new-note-from-clipboard.sh) | Create a new note from clipboard | [Göran Damberg](https://github.com/gdamberg) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Notes

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/notes/./images/notes.png" width="20" height="20"> | [Append Content From Clipboard](apps/notes/append-note-from-clipboard.applescript) | Script to append to an existing note content from clipboard. | [Ayoub Gharbi](https://github.com/ayoub-g) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/notes/./images/notes.png" width="20" height="20"> | [Create Note](apps/notes/create-note.applescript) | Create a new Note  | [Vardan Sawhney](https://github.com/commai) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/notes/./images/notes.png" width="20" height="20"> | [Create Note From Clipboard](apps/notes/create-note-from-clipboard.applescript) | Create Note From Clipboard | [Ayoub Gharbi](https://github.com/ayoub-g) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/notes/./images/notes.png" width="20" height="20"> | [Open Note](apps/notes/open-note.applescript) | Open Note via its Title | [Vardan Sawhney](https://github.com/commai) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/notes/./images/notes.png" width="20" height="20"> | [Search Note By Name](apps/notes/search-note-by-name.applescript) | This script searches for a note, given its exact name, or a substring, the search does not consider case | [Ayoub Gharbi](github.com/ayoub-g) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Obsidian

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/obsidian/./images/obsidian.png" width="20" height="20"> | [Create Note](apps/obsidian/obsidian-create-note.template.sh) | Create a new note | [Yiyao Wei](https://github.com/HotThoughts) | ✅ | ✅ | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/obsidian/./images/obsidian.png" width="20" height="20"> | [Search in Vault](apps/obsidian/obsidian-search-vault.template.sh) | Search Obsidian Vault | [Yiyao Wei](https://github.com/HotThoughts) | ✅ | ✅ | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### One Thing

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/one-thing/./images/one-thing.png" width="20" height="20"> | [Clear Text](apps/one-thing/one-thing-clear-text.sh) | Clear the text shown in One Thing app. | [One Thing](https://sindresorhus.com/one-thing) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/one-thing/./images/one-thing.png" width="20" height="20"> | [Set Text](apps/one-thing/one-thing-set-text.sh) | Set the text shown in One Thing app. | [One Thing](https://sindresorhus.com/one-thing) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### OpenVPN

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/openvpn/./images/openvpn.png" width="20" height="20"> | [Connect OpenVPN](apps/openvpn/connect-openvpn.applescript) | Prepares OpenVPN Connect client to connect or reconnect. | [Aaron Miller](https://github.com/aaronhmiller) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/openvpn/./images/openvpn.png" width="20" height="20"> | [Disconnect OpenVPN](apps/openvpn/disconnect-openvpn.applescript) | Disconnects the OpenVPN Connect client from VPN. | [Aaron Miller](https://github.com/aaronhmiller) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/openvpn/./images/openvpn.png" width="20" height="20"> | [Quit OpenVPN](apps/openvpn/quit-openvpn.applescript) | Quits the OpenVPN Connect client. | [Aaron Miller](https://github.com/aaronhmiller) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### PhpStorm

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  |  | [Update Recent Projects](apps/phpstorm/recent-projects.sh) | N/A | Raycast |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Plash

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/plash/./images/plash.png" width="20" height="20"> | [Add Website](apps/plash/plash-add-website.sh) | Add a website to Plash. | [Plash](https://github.com/sindresorhus/Plash) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/plash/./images/plash.png" width="20" height="20"> | [Next Website](apps/plash/plash-next-website.sh) | Switch to the next website in the list in Plash. | [Plash](https://github.com/sindresorhus/Plash) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/plash/./images/plash.png" width="20" height="20"> | [Previous Website](apps/plash/plash-previous-website.sh) | Switch to the previous website in the list in Plash. | [Plash](https://github.com/sindresorhus/Plash) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/plash/./images/plash.png" width="20" height="20"> | [Reload Website](apps/plash/plash-reload-website.sh) | Reload the current website in Plash. | [Plash](https://github.com/sindresorhus/Plash) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/plash/./images/plash.png" width="20" height="20"> | [Switch to Random Website](apps/plash/plash-random-website.sh) | Switch to a random website from the list of websites in Plash. | [Plash](https://github.com/sindresorhus/Plash) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/plash/./images/plash.png" width="20" height="20"> | [Toggle Browsing Mode](apps/plash/plash-toggle-browser-mode.sh) | Toggle browsing mode in Plash. | [Plash](https://github.com/sindresorhus/Plash) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Playground

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | 🕊 | [Create Basic](apps/playground/open-new-playground.py) | Create and open a new basic Swift Playground | [Quentin Eude](https://github.com/qeude) | ✅ |  | <img src="images/icon-python.png" width="20" height="20" title="Python"> |
  | 🕊 | [Create View Based](apps/playground/open-new-view-playground.py) | Create and open a new view based Swift Playground | [Quentin Eude](https://github.com/qeude) | ✅ |  | <img src="images/icon-python.png" width="20" height="20" title="Python"> |

#### Pulse Secure

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/pulse-secure/images/pulse-secure.png" width="20" height="20"> | [Connect / Reconnect](apps/pulse-secure/pulse-secure-connect.applescript) | Connect to the given / default connection with the given / default username. | [Jakub Lanski](https://github.com/jaklan) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/pulse-secure/images/pulse-secure.png" width="20" height="20"> | [Disconnect / Cancel](apps/pulse-secure/pulse-secure-disconnect.applescript) | Disconnect / cancel the active connection. | [Jakub Lanski](https://github.com/jaklan) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/pulse-secure/images/pulse-secure.png" width="20" height="20"> | [Resume](apps/pulse-secure/pulse-secure-resume.applescript) | Resume the suspended connection. | [Jakub Lanski](https://github.com/jaklan) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/pulse-secure/images/pulse-secure.png" width="20" height="20"> | [Suspend](apps/pulse-secure/pulse-secure-suspend.applescript) | Suspend the active connection. | [Jakub Lanski](https://github.com/jaklan) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Quip

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  |  | [Set up Quip commands](apps/quip/set-up-quip-commands.py) | Create script commands for creating Quip documents, based on the configuration in quip_config.ini. | [diego_zamboni](https://raycast.com/diego_zamboni) |  |  | <img src="images/icon-python.png" width="20" height="20" title="Python"> |
  |  | [{{commandtitle}}](apps/quip/quip-new.template.py) | Configure your Quip API token and other defaults in quip_config.ini | [zzamboni](https://raycast.com/zzamboni) | ✅ | ✅ | <img src="images/icon-python.png" width="20" height="20" title="Python"> |

#### Raycast

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | 🎉 | [Celebrate](apps/raycast/celebrate.sh) | Set Confetti to run for a number of times and during intervals | [Fatpandac](https://github.com/Fatpandac) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Reminders

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/reminders/images/reminders.png" width="20" height="20"> | [Add Reminder](apps/reminders/reminders-create-reminder.sh) | Add a new reminder. | [Andrei Nedelcu](https://dinosaurgame.net) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Safari

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Add Item to Reading List](apps/safari/safari-create-reading-list-item.applescript) | Add a new Reading List item with the given URL. Allows a custom title to be specified. | [Thomas Paul Mann](https://github.com/thomaspaulmann) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Clear Cache and Refresh Page](apps/safari/safari-clear-cache-reload.applescript) | This script clears cache and reloads the page of the frontmost Safari window. | [Aaron Miller](https://github.com/aaronhmiller) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Close All Tabs](apps/safari/safari-close-all-tabs.applescript) | Close all tabs in the frontmost window | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Close Duplicated Tabs](apps/safari/safari-close-duplicated-tabs.applescript) | Close tabs with the same URL. | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Close Other Tabs](apps/safari/safari-close-other-tabs.applescript) | Close all tabs besides the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Close Tabs to the Left](apps/safari/safari-close-tabs-left.applescript) | Close all tabs to the left side of the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Close Tabs to the Right](apps/safari/safari-close-tabs-right.applescript) | Close all tabs to the right side of the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Download Current URL](apps/safari/safari-download-url.applescript) | Download the currently active tab's URL. | [Michael Bianco](https://github.com/iloveitaly) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Duplicate Tab](apps/safari/safari-duplicate-tab.applescript) | Duplicates and opens the currently active tab. | [Thomas Paul Mann](https://github.com/thomaspaulmann) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Open Bing with Edge User-Agent](apps/safari/safari-bing-edge-user-agent.applescript) | Open Bing in Safari with Edge User-Agent | [smxl](https://github.com/smxl) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Open Safari URL in Chrome](apps/safari/safari-current-page-url-in-chrome.applescript) | Open current Safari URL in new tab in Chrome | [Dave Lehman](https://github.com/dlehman) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/safari/images/safari.png" width="20" height="20"> | [Open Safari URL in Firefox](apps/safari/safari-current-page-url-in-firefox.applescript) | Open current Safari URL in new tab in Firefox | [Dave Lehman](https://github.com/dlehman) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Session

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/session/images/session.png" width="20" height="20"> | [Abandon Session](apps/session/session-abandon.sh) | Starts a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/session/images/session.png" width="20" height="20"> | [Finish Session](apps/session/session-finish.sh) | Finishes a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/session/images/session.png" width="20" height="20"> | [Pause Session](apps/session/session-pause.sh) | Starts a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/session/images/session.png" width="20" height="20"> | [Start Previous Session](apps/session/session-start-previous.sh) | Starts a focus session in Session app with the previous intent and duration | [James Lyons](https://github.com/jamesjlyons) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/session/images/session.png" width="20" height="20"> | [Start Session](apps/session/session-start-new.sh) | Starts a focus session in Session app | [James Lyons](https://github.com/jamesjlyons) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### SideNotes

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/sidenotes/images/sidenotes.png" width="20" height="20"> | [SideNotes create](apps/sidenotes/sidenotes-create-note.applescript) | Create a new note within the selected or the first SideNotes folder. | [Marcel Bochtler](https://github.com/MarcelBochtler) | ✅ |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Sip

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/sip/./images/sip.png" width="20" height="20"> | [ Add Color to History](apps/sip/sip-add-hex-color.sh) |  Add a color to your Sip history. | [Sip](https://twitter.com/sip_app/) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/sip/./images/sip.png" width="20" height="20"> | [Check Contrast](apps/sip/sip-check-contrast-hex.sh) | Open Sip Contrast Checker. | [Sip](https://twitter.com/sip_app/) | ✅ |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/sip/./images/sip.png" width="20" height="20"> | [Open Contrast Checker](apps/sip/sip-open-check-contrast.sh) | Open Sip Contrast Checker. | [Sip](https://twitter.com/sip_app/) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/sip/./images/sip.png" width="20" height="20"> | [Show Color Picker](apps/sip/sip-show-picker.sh) | Pick a color value from your screen. | [Sip](https://twitter.com/sip_app/) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Stickies

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/stickies/images/stickies.png" width="20" height="20"> | [New Floating Sticky Note](apps/stickies/new-floating-sticky.applescript) | This script creates a new floating note in the Apple Stickies application | [Annie Ma](http://www.anniema.co/) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Sublime

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://cdn.worldvectorlogo.com/logos/sublime-text.svg" width="20" height="20"> | [Open with Sublime](apps/sublime/open-with-sublime.applescript) | Open currently focused directory in Sublime | [Rock Hu](https://twitter.com/0xRock) |  |  | <img src="images/icon-applescript.png" width="20" height="20" title="AppleScript"> |

#### Surfshark

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/surfshark/images/surfshark.png" width="20" height="20"> | [Surfshark VPN Status](apps/surfshark/surfshark-vpn-status.sh) | Get Surfshark VPN status | [Jordi Clement](https://github.com/jordicl) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/surfshark/images/surfshark.png" width="20" height="20"> | [VPN Connect](apps/surfshark/surfshark-vpn-start.sh) | Start Surfshark VPN connection | [Jordi Clement](https://github.com/jordicl) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/surfshark/images/surfshark.png" width="20" height="20"> | [VPN Disconnect](apps/surfshark/surfshark-vpn-stop.sh) | Stop Surfshark VPN connection | [Jordi Clement](https://github.com/jordicl) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Tailscale

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-iconDark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-icon.png" width="20" height="20"></picture> | [Connect](apps/tailscale/tailscale-connect.sh) | Connects to Tailscale | [Ross Zurowski](https://github.com/rosszurowski) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-iconDark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-icon.png" width="20" height="20"></picture> | [Disconnect](apps/tailscale/tailscale-disconnect.sh) | Disconnects from Tailscale | [Ross Zurowski](https://github.com/rosszurowski) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-iconDark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-icon.png" width="20" height="20"></picture> | [Get IP](apps/tailscale/tailscale-ip.sh) | Gets your private Tailscale IP | [Ross Zurowski](https://github.com/rosszurowski) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |
  | <picture><source srcset="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-iconDark.png" media="(prefers-color-scheme: dark)"><img src="https://raw.githubusercontent.com/raycast/script-commands/master/commands/apps/tailscale/./images/tailscale-icon.png" width="20" height="20"></picture> | [Switch Account](apps/tailscale/tailscale-switch.sh) | Switches Tailscale networks | [Ross Zurowski](https://github.com/rosszurowski) and [Daniel Schoemer](https://github.com/quatauta) |  |  | <img src="images/icon-bash.png" width="20" height="20" title="Bash"> |

#### Terminal Translate

| Icon | Title | Description | Author | Args | Templ | Lang |
| :--: | ----- | ----------- | :----: | :--: | :---: | :--: |
  | 📖 | [Translate](apps/terminal-translate/translate.sh) | Translate word or sentence. | [Fatpandac](https://github.com/Fatpandac) | 
Download .txt
gitextract_go6t_duu/

├── .gitattributes
├── .github/
│   ├── pull_request_template.md
│   ├── stale.yml
│   └── workflows/
│       └── script-commands.yml
├── .gitignore
├── .swiftlint.yml
├── CONTRIBUTING.md
├── LICENSE
├── Makefile
├── README.md
├── Tools/
│   └── Toolkit/
│       ├── CONTRIBUTING.md
│       ├── Package.resolved
│       ├── Package.swift
│       ├── README.md
│       ├── Sources/
│       │   ├── Toolkit/
│       │   │   ├── SubCommands/
│       │   │   │   ├── GenerateDocumentation.swift
│       │   │   │   ├── Report.swift
│       │   │   │   ├── SetExecutable.swift
│       │   │   │   └── Version.swift
│       │   │   └── main.swift
│       │   └── ToolkitLibrary/
│       │       ├── Core/
│       │       │   ├── Console.swift
│       │       │   ├── Documentation/
│       │       │   │   └── Documentation.swift
│       │       │   ├── GitShell.swift
│       │       │   ├── RegEx.swift
│       │       │   ├── Report/
│       │       │   │   └── Report.swift
│       │       │   ├── Stores/
│       │       │   │   └── DataManager.swift
│       │       │   └── Toolkit/
│       │       │       ├── Toolkit+Constants.swift
│       │       │       ├── Toolkit+GenerateDocumentation.swift
│       │       │       ├── Toolkit+Mode.swift
│       │       │       ├── Toolkit+ReadContent.swift
│       │       │       ├── Toolkit+Report.swift
│       │       │       ├── Toolkit+ReportType.swift
│       │       │       └── Toolkit.swift
│       │       ├── Errors/
│       │       │   └── Reader+Error.swift
│       │       ├── Extensions/
│       │       │   ├── Array/
│       │       │   │   ├── Array+Metadata.swift
│       │       │   │   └── Array+UInt8.swift
│       │       │   ├── Character/
│       │       │   │   ├── Character+Emoji.swift
│       │       │   │   └── Character+String.swift
│       │       │   ├── Codable/
│       │       │   │   └── Encodable+Data.swift
│       │       │   ├── Data/
│       │       │   │   ├── Data+Bytes.swift
│       │       │   │   └── Data+Decodable.swift
│       │       │   ├── Dictionary/
│       │       │   │   └── Dictionary+Codable.swift
│       │       │   ├── Integer/
│       │       │   │   ├── Int+Indent.swift
│       │       │   │   └── UInt8+Data.swift
│       │       │   ├── String/
│       │       │   │   ├── String+Emoji.swift
│       │       │   │   ├── String+Interpolation.swift
│       │       │   │   ├── String+URL.swift
│       │       │   │   └── String.swift
│       │       │   └── TSCBasic/
│       │       │       ├── AbsolutePath+SocialBasename.swift
│       │       │       └── FileSystem+AbsolutePath.swift
│       │       ├── Models/
│       │       │   ├── Group.swift
│       │       │   ├── Language+Information.swift
│       │       │   ├── Language.swift
│       │       │   ├── Metadata.swift
│       │       │   ├── RaycastData.swift
│       │       │   ├── ScriptCommand+Author.swift
│       │       │   ├── ScriptCommand+Icon.swift
│       │       │   ├── ScriptCommand+Mode.swift
│       │       │   └── ScriptCommand.swift
│       │       ├── Protocols/
│       │       │   └── MarkdownDescriptionProtocol.swift
│       │       └── Typealiases/
│       │           └── Identifier.swift
│       ├── Tests/
│       │   ├── LinuxMain.swift
│       │   └── ToolkitLibraryTests/
│       │       ├── ToolkitLibraryTests.swift
│       │       └── XCTestManifests.swift
│       └── integration.sh
├── _enabled-commands/
│   ├── .gitignore
│   └── README.md
├── commands/
│   ├── README.md
│   ├── ai/
│   │   └── gemini/
│   │       └── gemini.js
│   ├── apps/
│   │   ├── Message/
│   │   │   └── copycode.sh
│   │   ├── agenda/
│   │   │   ├── README.md
│   │   │   ├── agenda-new-note.sh
│   │   │   ├── agenda-on-the-agenda.sh
│   │   │   └── agenda-today.sh
│   │   ├── amphetamine/
│   │   │   ├── amphetamine-off.applescript
│   │   │   └── amphetamine-on.applescript
│   │   ├── baremetrics/
│   │   │   ├── get-arpu.sh
│   │   │   ├── get-arr.sh
│   │   │   ├── get-ltv.sh
│   │   │   ├── get-mrr.sh
│   │   │   └── simple-dashboard.sh
│   │   ├── bartender/
│   │   │   └── bartender-search.applescript
│   │   ├── bear/
│   │   │   ├── bear-add-note.sh
│   │   │   ├── bear-open-note.sh
│   │   │   ├── bear-open-tag.sh
│   │   │   ├── bear-search.sh
│   │   │   ├── bear-today.sh
│   │   │   └── bear-todo.sh
│   │   ├── busycal/
│   │   │   └── new-busycal-event-or-task.applescript
│   │   ├── chatgpt/
│   │   │   └── chatgpt-open-safari.applescript
│   │   ├── claude/
│   │   │   └── claude.js
│   │   ├── cleanshot/
│   │   │   ├── cleanshot-add-quick-access-overlay.sh
│   │   │   ├── cleanshot-annotate.sh
│   │   │   ├── cleanshot-capture-area.sh
│   │   │   ├── cleanshot-capture-fullscreen.sh
│   │   │   ├── cleanshot-capture-previous-area.sh
│   │   │   ├── cleanshot-capture-text.sh
│   │   │   ├── cleanshot-capture-window.sh
│   │   │   ├── cleanshot-open-from-clipboard.sh
│   │   │   ├── cleanshot-pin.sh
│   │   │   ├── cleanshot-record-screen-with-keystroke-pro.sh
│   │   │   ├── cleanshot-record-screen.sh
│   │   │   ├── cleanshot-restore.sh
│   │   │   ├── cleanshot-scrolling-capture.sh
│   │   │   ├── cleanshot-self-timer.sh
│   │   │   └── cleanshot-toggle-desktop-icons.sh
│   │   ├── craft/
│   │   │   ├── craft-create-doc.template.sh
│   │   │   └── craft-search-workspace.template.sh
│   │   ├── deepl/
│   │   │   ├── deepl-app-translate.applescript
│   │   │   └── deepl-web-translate.sh
│   │   ├── devutils/
│   │   │   ├── backslash.sh
│   │   │   ├── base64encode.sh
│   │   │   ├── base64image.sh
│   │   │   ├── cronparser.sh
│   │   │   ├── cssformatter.sh
│   │   │   ├── csv2json.sh
│   │   │   ├── erbformatter.sh
│   │   │   ├── hashing.sh
│   │   │   ├── html2jsx.sh
│   │   │   ├── htmlencode.sh
│   │   │   ├── htmlformatter.sh
│   │   │   ├── htmlpreview.sh
│   │   │   ├── jsformatter.sh
│   │   │   ├── json2csv.sh
│   │   │   ├── json2yaml.sh
│   │   │   ├── jsonformatter.sh
│   │   │   ├── jwt.sh
│   │   │   ├── lessformatter.sh
│   │   │   ├── loremipsum.sh
│   │   │   ├── markdownpreview.sh
│   │   │   ├── numberbase.sh
│   │   │   ├── qrcode.sh
│   │   │   ├── querystringparser.sh
│   │   │   ├── regextester.sh
│   │   │   ├── scssformatter.sh
│   │   │   ├── sqlformatter.sh
│   │   │   ├── stringcaseconverter.sh
│   │   │   ├── stringinspect.sh
│   │   │   ├── textdiff.sh
│   │   │   ├── unixtime.sh
│   │   │   ├── urlencode.sh
│   │   │   ├── uuidtool.sh
│   │   │   ├── xmlformatter.sh
│   │   │   └── yaml2json.sh
│   │   ├── dictionary/
│   │   │   ├── images/
│   │   │   │   └── dictionary.icns
│   │   │   └── look-up-in-dictionary.applescript
│   │   ├── dnd-me/
│   │   │   ├── start-dnd-me.sh
│   │   │   └── stop-dnd-me.sh
│   │   ├── downie/
│   │   │   └── download-video.sh
│   │   ├── espanso/
│   │   │   ├── disable-espanso.sh
│   │   │   ├── enable-espanso.sh
│   │   │   ├── espanso-create-expansion.sh
│   │   │   ├── restart-espanso.sh
│   │   │   ├── start-espanso.sh
│   │   │   └── stop-espanso.sh
│   │   ├── eudic/
│   │   │   └── look-up-in-eudic.applescript
│   │   ├── evernote/
│   │   │   ├── create-note-paste-clipboard.applescript
│   │   │   └── create-note.applescript
│   │   ├── expressvpn/
│   │   │   ├── expressvpn-connect.applescript
│   │   │   ├── expressvpn-disconnect.applescript
│   │   │   └── expressvpn-reconnect.applescript
│   │   ├── fantastical/
│   │   │   ├── create-event.applescript
│   │   │   └── create-todo-in-fantastical.applescript
│   │   ├── ferdi/
│   │   │   ├── ferdi-open-service-by-index.applescript
│   │   │   └── ferdi-open-service-by-name.applescript
│   │   ├── find-my/
│   │   │   ├── README.md
│   │   │   ├── fmp.js
│   │   │   └── package.json
│   │   ├── focus/
│   │   │   ├── focus-preferences.sh
│   │   │   ├── focus-start-break-5.sh
│   │   │   ├── focus-start-custom-break.sh
│   │   │   ├── focus-start-custom-session.sh
│   │   │   ├── focus-start-session-25.sh
│   │   │   ├── focus-start-session.sh
│   │   │   ├── focus-stop-break.sh
│   │   │   ├── focus-stop-session.sh
│   │   │   └── focus-toggle-focus.sh
│   │   ├── goodlinks/
│   │   │   ├── goodlinks-last-unread-link.sh
│   │   │   ├── goodlinks-open-link.sh
│   │   │   ├── goodlinks-random-unread-link.sh
│   │   │   ├── goodlinks-read-list.sh
│   │   │   ├── goodlinks-save-link.sh
│   │   │   ├── goodlinks-starred-list.sh
│   │   │   ├── goodlinks-tagged-links.sh
│   │   │   ├── goodlinks-unread-list.sh
│   │   │   └── goodlinks-untagged-list.sh
│   │   ├── hazeover/
│   │   │   ├── hazeover-set-intensity.applescript
│   │   │   └── hazeover-toggle-dimming.applescript
│   │   ├── hyper/
│   │   │   └── hyper-run-shell-command.applescript
│   │   ├── iconsur/
│   │   │   └── iconsur.sh
│   │   ├── iterm/
│   │   │   ├── iterm-open-profile-in-new-window.applescript
│   │   │   └── iterm-run-shell-command.applescript
│   │   ├── lungo/
│   │   │   ├── lungo-activate.sh
│   │   │   ├── lungo-deactivate.sh
│   │   │   └── lungo-toggle.sh
│   │   ├── mail/
│   │   │   ├── copy-captcha-from-mail.py
│   │   │   └── copy-foreground-mail-deeplink.applescript
│   │   ├── medo/
│   │   │   ├── add-task.sh
│   │   │   ├── medo-float-large.sh
│   │   │   ├── medo-float-small.sh
│   │   │   └── medo-float.sh
│   │   ├── meetingbar/
│   │   │   ├── meetingbar-create-meeting.applescript
│   │   │   └── meetingbar-join-meeting.applescript
│   │   ├── menubarx/
│   │   │   ├── close-last-menubarx-tab.sh
│   │   │   ├── open-in-menubarx.sh
│   │   │   └── open-tab-in-menubar.applescript
│   │   ├── mullvad/
│   │   │   ├── README.md
│   │   │   ├── connect.sh
│   │   │   ├── disconnect.sh
│   │   │   ├── location.sh
│   │   │   ├── reconnect.sh
│   │   │   ├── search.sh
│   │   │   └── status.sh
│   │   ├── noteplan3/
│   │   │   ├── README.md
│   │   │   ├── noteplan-append-daily-note.sh
│   │   │   └── noteplan-new-note-from-clipboard.sh
│   │   ├── notes/
│   │   │   ├── append-note-from-clipboard.applescript
│   │   │   ├── create-note-from-clipboard.applescript
│   │   │   ├── create-note.applescript
│   │   │   ├── open-note.applescript
│   │   │   └── search-note-by-name.applescript
│   │   ├── obsidian/
│   │   │   ├── obsidian-create-note.template.sh
│   │   │   └── obsidian-search-vault.template.sh
│   │   ├── one-thing/
│   │   │   ├── one-thing-clear-text.sh
│   │   │   └── one-thing-set-text.sh
│   │   ├── openvpn/
│   │   │   ├── connect-openvpn.applescript
│   │   │   ├── disconnect-openvpn.applescript
│   │   │   └── quit-openvpn.applescript
│   │   ├── phpstorm/
│   │   │   ├── .gitignore
│   │   │   └── recent-projects.sh
│   │   ├── plash/
│   │   │   ├── plash-add-website.sh
│   │   │   ├── plash-next-website.sh
│   │   │   ├── plash-previous-website.sh
│   │   │   ├── plash-random-website.sh
│   │   │   ├── plash-reload-website.sh
│   │   │   └── plash-toggle-browser-mode.sh
│   │   ├── playground/
│   │   │   ├── README.md
│   │   │   ├── open-new-playground.py
│   │   │   └── open-new-view-playground.py
│   │   ├── pulse-secure/
│   │   │   ├── README.md
│   │   │   ├── pulse-secure-connect.applescript
│   │   │   ├── pulse-secure-disconnect.applescript
│   │   │   ├── pulse-secure-resume.applescript
│   │   │   └── pulse-secure-suspend.applescript
│   │   ├── quip/
│   │   │   ├── .gitignore
│   │   │   ├── README.org
│   │   │   ├── quip-new.template.py
│   │   │   ├── quip.py
│   │   │   ├── quip_config.chezmoi.template.ini
│   │   │   ├── quip_config.template.ini
│   │   │   ├── quip_utils.py
│   │   │   └── set-up-quip-commands.py
│   │   ├── raycast/
│   │   │   └── celebrate.sh
│   │   ├── reminders/
│   │   │   └── reminders-create-reminder.sh
│   │   ├── safari/
│   │   │   ├── README.md
│   │   │   ├── safari-bing-edge-user-agent.applescript
│   │   │   ├── safari-clear-cache-reload.applescript
│   │   │   ├── safari-close-all-tabs.applescript
│   │   │   ├── safari-close-duplicated-tabs.applescript
│   │   │   ├── safari-close-other-tabs.applescript
│   │   │   ├── safari-close-tabs-left.applescript
│   │   │   ├── safari-close-tabs-right.applescript
│   │   │   ├── safari-create-reading-list-item.applescript
│   │   │   ├── safari-current-page-url-in-chrome.applescript
│   │   │   ├── safari-current-page-url-in-firefox.applescript
│   │   │   ├── safari-download-url.applescript
│   │   │   └── safari-duplicate-tab.applescript
│   │   ├── session/
│   │   │   ├── session-abandon.sh
│   │   │   ├── session-finish.sh
│   │   │   ├── session-pause.sh
│   │   │   ├── session-start-new.sh
│   │   │   └── session-start-previous.sh
│   │   ├── sidenotes/
│   │   │   └── sidenotes-create-note.applescript
│   │   ├── sip/
│   │   │   ├── sip-add-hex-color.sh
│   │   │   ├── sip-check-contrast-hex.sh
│   │   │   ├── sip-open-check-contrast.sh
│   │   │   └── sip-show-picker.sh
│   │   ├── stickies/
│   │   │   └── new-floating-sticky.applescript
│   │   ├── sublime/
│   │   │   └── open-with-sublime.applescript
│   │   ├── surfshark/
│   │   │   ├── surfshark-vpn-start.sh
│   │   │   ├── surfshark-vpn-status.sh
│   │   │   ├── surfshark-vpn-stop.sh
│   │   │   └── surfshark.config.sh
│   │   ├── tailscale/
│   │   │   ├── README.md
│   │   │   ├── tailscale-connect.sh
│   │   │   ├── tailscale-disconnect.sh
│   │   │   ├── tailscale-ip.sh
│   │   │   └── tailscale-switch.sh
│   │   ├── terminal-translate/
│   │   │   └── translate.sh
│   │   ├── things/
│   │   │   ├── README.md
│   │   │   ├── things-create-todo.sh
│   │   │   ├── things-current-todo.applescript
│   │   │   ├── things-search-to-dos.sh
│   │   │   └── things-today.applescript
│   │   ├── timing/
│   │   │   ├── timing-start-timer.js
│   │   │   └── timing-stop-timer.js
│   │   ├── todoist/
│   │   │   ├── create-task.template.sh
│   │   │   └── get-tasks.template.sh
│   │   ├── translate-shell/
│   │   │   ├── translate-shell-language-pair.py
│   │   │   ├── translate-to-en.sh
│   │   │   └── translate-to-zh.sh
│   │   ├── trello/
│   │   │   └── create-trello-card.template.py
│   │   ├── tunnelblick/
│   │   │   ├── tunnelblick-connect-all.applescript
│   │   │   ├── tunnelblick-connect.applescript
│   │   │   ├── tunnelblick-disconnect-all.applescript
│   │   │   └── tunnelblick-disconnect.applescript
│   │   ├── viscosity/
│   │   │   ├── viscosity-connect-all.applescript
│   │   │   ├── viscosity-connect.applescript
│   │   │   ├── viscosity-disconnect-all.applescript
│   │   │   └── viscosity-disconnect.applescript
│   │   ├── warp/
│   │   │   ├── warp-reauth.sh
│   │   │   ├── warp-start.sh
│   │   │   ├── warp-status.sh
│   │   │   ├── warp-stop.sh
│   │   │   └── warp-toggle.sh
│   │   ├── webstorm/
│   │   │   └── open-workspace.template.sh
│   │   ├── wikipedia/
│   │   │   └── wikipedia-search.py
│   │   └── y-pomodoro/
│   │       ├── pause.sh
│   │       ├── resume.sh
│   │       ├── show.sh
│   │       ├── start.sh
│   │       └── stop.sh
│   ├── browsing/
│   │   ├── Youtube Shorts in video player.sh
│   │   ├── chrome-current-page-url.sh
│   │   ├── convert-twitter-to-nitter.js
│   │   ├── git-io.sh
│   │   ├── go-to-outine.sh
│   │   ├── new-browser-window.sh
│   │   ├── open-chrome-without-cors.sh
│   │   ├── open-in-guest-profile.sh
│   │   ├── open-multiple-websites-on-safari.template.sh
│   │   ├── peekalink.template.sh
│   │   ├── safari-current-page-url.sh
│   │   ├── safari-current-window-urls.applescript
│   │   ├── shlink-create-short-url.template.sh
│   │   ├── short-url-emoji.sh
│   │   ├── shorten-url-bitly.template.sh
│   │   ├── shorten-url.sh
│   │   ├── to-private-browsing.sh
│   │   └── website-screenshots.sh
│   ├── communication/
│   │   ├── call-with-iphone.sh
│   │   ├── cloudup/
│   │   │   ├── cloudup-paste.sh
│   │   │   ├── cloudup-pick.sh
│   │   │   └── cloudup-upload.sh
│   │   ├── duckduckgo-email-protection/
│   │   │   ├── README.md
│   │   │   ├── configure-@duck.com-script-command.applescript
│   │   │   └── generate-unique-email-address.applescript
│   │   ├── emojis/
│   │   │   ├── emoji-copy.sh
│   │   │   ├── emojis-search.sh
│   │   │   └── random-emoji.sh
│   │   ├── gmail/
│   │   │   └── google-gmail.sh
│   │   ├── google-meet/
│   │   │   └── meet.sh
│   │   ├── imessage-2fa.sh
│   │   ├── let-me-google-that.sh
│   │   ├── mail/
│   │   │   └── open-most-recent-email.applescript
│   │   ├── messenger/
│   │   │   └── messenger-open-conversation.applescript
│   │   ├── say.sh
│   │   ├── share-secret-doppler.py
│   │   ├── slack/
│   │   │   ├── add-slack-reminder.template.sh
│   │   │   ├── clear-slack-DND-status.sh
│   │   │   ├── clear-slack-status.template.sh
│   │   │   ├── set-slack-DND-status.sh
│   │   │   ├── set-slack-status-spotify.sh
│   │   │   ├── set-slack-status.template.sh
│   │   │   ├── set-slack-wfh-status.sh
│   │   │   ├── slack-dev-mode.sh
│   │   │   ├── slack-jump-to.applescript
│   │   │   ├── slack-open-workspace-by-index.applescript
│   │   │   ├── slack-open-workspace-by-name.applescript
│   │   │   └── slack-send-message.applescript
│   │   ├── xkcdpass.sh
│   │   └── zoom/
│   │       ├── leave-meeting.applescript
│   │       ├── rename-profile.applescript
│   │       ├── toggle-mic.applescript
│   │       └── toggle-video.applescript
│   ├── conversions/
│   │   ├── change-case/
│   │   │   ├── camelcase.py
│   │   │   ├── kebabcase.py
│   │   │   ├── lowercase.py
│   │   │   ├── snakecase.py
│   │   │   ├── titlecase.py
│   │   │   └── uppercase.py
│   │   ├── clipboard-ocr.sh
│   │   ├── clipboard-to-markdown.js
│   │   ├── color-conversion.sh
│   │   ├── column-to-comma.sh
│   │   ├── create-gif-from-video.py
│   │   ├── create-markdown-table.js
│   │   ├── epoch-to-human-date.sh
│   │   ├── google-docs-to-markdown.sh
│   │   ├── hex-to-rgb.sh
│   │   ├── hex-to-rgba.sh
│   │   ├── human-date-to-epoch.sh
│   │   ├── inputs-to-markdown-link.sh
│   │   ├── markdown-to-telegram.py
│   │   ├── paste-as-plain-text.applescript
│   │   ├── qr-code-screenshot-to-text.sh
│   │   ├── qrcode-generate.sh
│   │   ├── raw-html-to-rich-text-clipboard.sh
│   │   ├── rich-text-clipboard-to-markdown.sh
│   │   ├── space-fixer.sh
│   │   ├── strikethrough.sh
│   │   ├── trim-newlines-tabs.sh
│   │   ├── unicode-superscript.sh
│   │   ├── unix-time-reader.sh
│   │   ├── vaporwave-text.sh
│   │   ├── what-day-is.py
│   │   └── zalgo-text.swift
│   ├── culture/
│   │   ├── prayer-summary.template.sh
│   │   └── prayer-times.sh
│   ├── dashboard/
│   │   ├── bitcoin-price-usd.sh
│   │   ├── countdowns/
│   │   │   ├── countdown-to-christmas.sh
│   │   │   ├── countdown-to-date.template.sh
│   │   │   └── create-countdown.template.sh
│   │   ├── crypto-portfolio.py
│   │   ├── current-weather.sh
│   │   ├── doge.sh
│   │   ├── ethereum-price-usd.sh
│   │   ├── fear-index.sh
│   │   ├── firebase/
│   │   │   ├── firebase-authentication-get-token.template.sh
│   │   │   └── firebase-realtime-db-get-data.template.sh
│   │   ├── mood-meter/
│   │   │   ├── add-mood.js
│   │   │   ├── display-mood-month.js
│   │   │   └── display-mood-year.js
│   │   ├── nextdns-status-check.py
│   │   ├── open-ai-usage.sh
│   │   ├── open-weather/
│   │   │   ├── weather-current.template.sh
│   │   │   └── weather-forecast.template.sh
│   │   ├── precious-metals.sh
│   │   ├── sabnzbd-queue-status.template.sh
│   │   ├── speedtest.sh
│   │   ├── stock-portfolio.rb
│   │   ├── system-activity.sh
│   │   ├── tesla.template.sh
│   │   ├── twitter-statistics.template.rb
│   │   ├── world-time.sh
│   │   ├── year-progress.sh
│   │   └── youtube-statistics.template.rb
│   ├── dashboards/
│   │   └── iperf-speed-test.template.sh
│   ├── developer-utils/
│   │   ├── add-ssh-keys.template.applescript
│   │   ├── aws/
│   │   │   ├── amazon-s3-download.sh
│   │   │   ├── aws-sso-util.sh
│   │   │   └── whatismyregion.sh
│   │   ├── base-converter.sh
│   │   ├── base64-decode-input.sh
│   │   ├── base64-encode-input.sh
│   │   ├── brew/
│   │   │   ├── brew-cask-upgrade.sh
│   │   │   ├── brew-doctor.sh
│   │   │   ├── brew-install.sh
│   │   │   ├── brew-leaves.sh
│   │   │   ├── brew-list.sh
│   │   │   ├── brew-outdated.sh
│   │   │   ├── brew-services-list.sh
│   │   │   ├── brew-services-restart.sh
│   │   │   ├── brew-services-start.sh
│   │   │   ├── brew-services-stop.sh
│   │   │   ├── brew-uninstall-application.sh
│   │   │   ├── brew-update.sh
│   │   │   └── brew-upgrade.sh
│   │   ├── cheat.sh
│   │   ├── check-domain.template.sh
│   │   ├── clear-derived-data.sh
│   │   ├── clear_xcode.sh
│   │   ├── cloudflare/
│   │   │   └── purge-cloudflare-cache.template.sh
│   │   ├── copy-focused-finder-window-path.sh
│   │   ├── copy-ssh-public-key.sh
│   │   ├── count-characters.sh
│   │   ├── create-image-from-code.sh
│   │   ├── decode-base64.sh
│   │   ├── decode-jwt.sh
│   │   ├── decode-url.sh
│   │   ├── delete-current-line.applescript
│   │   ├── dig.sh
│   │   ├── docker/
│   │   │   ├── clean-docker.sh
│   │   │   ├── docker-images.sh
│   │   │   ├── docker-ps.sh
│   │   │   ├── docker-system-prune.sh
│   │   │   ├── run-docker.sh
│   │   │   └── stop-docker.sh
│   │   ├── encode-base64.sh
│   │   ├── encode-url.sh
│   │   ├── error-info.sh
│   │   ├── escape-shell-chars.sh
│   │   ├── flutter-create.sh
│   │   ├── format-swift.sh
│   │   ├── generate-git-ignore.sh
│   │   ├── generate-password.sh
│   │   ├── generate-ulid.sh
│   │   ├── generate-uuid.sh
│   │   ├── genpasswd.py
│   │   ├── get-ttfb.sh
│   │   ├── git/
│   │   │   ├── git-clear-changes.sh
│   │   │   ├── git-save-changes.sh
│   │   │   ├── git-standup.sh
│   │   │   ├── git-status.sh
│   │   │   ├── git-switch-branch.sh
│   │   │   └── git-sync-changes.sh
│   │   ├── github/
│   │   │   ├── create-github-gist.template.sh
│   │   │   ├── github-contributions.template.sh
│   │   │   ├── github-open-commit-history.sh
│   │   │   ├── github-open-pull-requests-details.template.rb
│   │   │   ├── github-open-pull-requests-page.sh
│   │   │   ├── github-open-pull-requests.template.rb
│   │   │   ├── github-repository-stars.template.rb
│   │   │   ├── github-repository-stars_all_repos_template.rb
│   │   │   ├── github-review-requests.template.rb
│   │   │   ├── github-unread-notifications.template.sh
│   │   │   └── open-gh-repo-pr-or-issue.sh
│   │   ├── gitlab/
│   │   │   ├── gitlab-issues.template.py
│   │   │   ├── gitlab-mergerequests.template.py
│   │   │   ├── gitlab-todos.template.py
│   │   │   ├── gitlabconfig.py
│   │   │   └── gitlabhelper.py
│   │   ├── google/
│   │   │   ├── google-lighthouse.sh
│   │   │   ├── google-psi-desktop.sh
│   │   │   └── google-psi-mobile.sh
│   │   ├── ignore-package-folders-time-machine.template.sh
│   │   ├── ip/
│   │   │   ├── get-external-ip-v4.sh
│   │   │   ├── get-external-ip-v6.sh
│   │   │   ├── get-local-ip-v4.sh
│   │   │   ├── get-local-ip-v6.sh
│   │   │   ├── get-url-ip-v4.sh
│   │   │   └── get-url-ip-v6.sh
│   │   ├── is-it-up.sh
│   │   ├── join-lines.sh
│   │   ├── json-stringify-text.js
│   │   ├── json-to-go-struct.sh
│   │   ├── lorem-ipsum.sh
│   │   ├── md5-hash.sh
│   │   ├── microlink.sh
│   │   ├── minikube/
│   │   │   ├── minikube-config-set.sh
│   │   │   ├── minikube-pause.sh
│   │   │   ├── minikube-start.sh
│   │   │   ├── minikube-status.sh
│   │   │   ├── minikube-stop.sh
│   │   │   └── minikube-unpause.sh
│   │   ├── open-link-simulator.applescript
│   │   ├── pa11y.sh
│   │   ├── ping-monitor.template.sh
│   │   ├── ping.sh
│   │   ├── prettify-json.sh
│   │   ├── record-simulator.sh
│   │   ├── run-bash-command.sh
│   │   ├── run-command-in-finder.sh
│   │   ├── search-script-command.sh
│   │   ├── search-script-command.swift
│   │   ├── sentry/
│   │   │   ├── sentry-unresolved-issues-by-project.template.py
│   │   │   └── sentry-unresolved-issues.template.py
│   │   ├── sha1-hash.sh
│   │   ├── solana/
│   │   │   ├── solana-tx-blink-extract.sh
│   │   │   ├── solana-tx-details.sh
│   │   │   └── solana-tx-inspector.sh
│   │   ├── strong-password-generator.sh
│   │   ├── time-between-dates.js
│   │   ├── time-calculator.js
│   │   ├── tldr.sh
│   │   ├── toggle_ssh_proxy_tunnel.template.sh
│   │   ├── transform-case.sh
│   │   ├── trim-git-commit-hash.sh
│   │   ├── unix-timestamp.sh
│   │   ├── unshorten-url.sh
│   │   ├── view-scripting-dictionary.sh
│   │   ├── vscode/
│   │   │   ├── open-folder-in-vscode.applescript
│   │   │   └── open-project-in-vscode.sh
│   │   ├── wayback-machine-save.sh
│   │   ├── whois.sh
│   │   └── xcode/
│   │       ├── xcode-last-project.sh
│   │       └── xcode-recent-project.sh
│   ├── extensions.json
│   ├── home/
│   │   ├── elgato/
│   │   │   ├── elgato-key-light-decrease-brightness.template.rb
│   │   │   ├── elgato-key-light-increase-brightness.template.rb
│   │   │   ├── elgato-key-light-turn-off.template.rb
│   │   │   └── elgato-key-light-turn-on.template.rb
│   │   └── philips-hue/
│   │       ├── hue-bulb.template.mjs
│   │       ├── hue-lights-inline.template.mjs
│   │       ├── hue-room.template.mjs
│   │       └── hue-rooms-inline.template.mjs
│   ├── math/
│   │   ├── calculate-CAGR.sh
│   │   ├── calculate-combinations.js
│   │   ├── calculate-growth.sh
│   │   ├── latex-calculator.py
│   │   ├── random-number.sh
│   │   └── wolfram-alpha.template.sh
│   ├── media/
│   │   ├── apple-music/
│   │   │   ├── apple-music-current-track.applescript
│   │   │   ├── apple-music-go-to-artist-page.sh
│   │   │   ├── apple-music-hate-current-track.applescript
│   │   │   ├── apple-music-love-current-track.applescript
│   │   │   ├── apple-music-next.applescript
│   │   │   ├── apple-music-pause.applescript
│   │   │   ├── apple-music-play.applescript
│   │   │   ├── apple-music-previous.applescript
│   │   │   ├── apple-music-repeat.applescript
│   │   │   ├── apple-music-search.applescript
│   │   │   ├── apple-music-set-volume.applescript
│   │   │   ├── apple-music-shuffle.applescript
│   │   │   ├── apple-music-stop.applescript
│   │   │   ├── apple-music-volume-down.applescript
│   │   │   └── apple-music-volume-up.applescript
│   │   ├── apple-tv/
│   │   │   ├── apple-tv-pause.applescript
│   │   │   ├── apple-tv-play-movie.applescript
│   │   │   ├── apple-tv-play.applescript
│   │   │   ├── apple-tv-set-volume.applescript
│   │   │   └── apple-tv-stop.applescript
│   │   ├── cmus/
│   │   │   ├── next-track.sh
│   │   │   ├── play-pause.sh
│   │   │   ├── previous-track.sh
│   │   │   ├── toggle-repeat.sh
│   │   │   ├── toggle-shuffle.sh
│   │   │   └── track-info.sh
│   │   ├── endel/
│   │   │   ├── endel-alarm.sh
│   │   │   ├── endel-deep-focus.sh
│   │   │   ├── endel-focus.sh
│   │   │   ├── endel-lullaby.sh
│   │   │   ├── endel-recovery.sh
│   │   │   ├── endel-relax.sh
│   │   │   ├── endel-scenarios-deepwork.sh
│   │   │   ├── endel-scenarios-homework.sh
│   │   │   ├── endel-scenarios-meditate.sh
│   │   │   ├── endel-scenarios-powernap.sh
│   │   │   ├── endel-scenarios-read.sh
│   │   │   ├── endel-scenarios-selfcare.sh
│   │   │   ├── endel-scenarios-unwind.sh
│   │   │   ├── endel-scenarios-workout.sh
│   │   │   ├── endel-scenarios-yoga.sh
│   │   │   ├── endel-sleep.sh
│   │   │   ├── endel-study.sh
│   │   │   ├── endel-timer.sh
│   │   │   └── endel-wisdom.sh
│   │   ├── foobar2000/
│   │   │   ├── foobar2000-next.applescript
│   │   │   ├── foobar2000-pause.applescript
│   │   │   └── foobar2000-pervious.applescript
│   │   ├── lowfi/
│   │   │   └── lowfi.sh
│   │   ├── sonos/
│   │   │   ├── README.md
│   │   │   ├── sonos-play-favorite.sh
│   │   │   ├── sonos-volume-down.sh
│   │   │   ├── sonos-volume-set.sh
│   │   │   └── sonos-volume-up.sh
│   │   ├── speaker-setup/
│   │   │   └── speaker-setup.sh
│   │   ├── spotify/
│   │   │   ├── create-spotify-command.js
│   │   │   ├── spotify-current-track.applescript
│   │   │   ├── spotify-next-track.applescript
│   │   │   ├── spotify-now-playing-url.applescript
│   │   │   ├── spotify-pause.applescript
│   │   │   ├── spotify-play-pause.applescript
│   │   │   ├── spotify-play-playlist.template.applescript
│   │   │   ├── spotify-play.applescript
│   │   │   └── spotify-previous-track.applescript
│   │   └── tidal/
│   │       ├── tidal-next-track.applescript
│   │       ├── tidal-pause.applescript
│   │       ├── tidal-play.applescript
│   │       ├── tidal-previous-track.applescript
│   │       └── tidal.applescript
│   ├── navigation/
│   │   ├── hide-application.applescript
│   │   ├── justfocus.applescript
│   │   ├── open-applications.sh
│   │   ├── open-clipboard-in-pixelmator-pro.applescript
│   │   ├── open-desktop-url-from-clipboard.swift
│   │   ├── open-desktop.sh
│   │   ├── open-documents.sh
│   │   ├── open-downloads.sh
│   │   ├── open-finder-from-iterm.applescript
│   │   ├── open-finder-from-terminal.applescript
│   │   ├── open-finder.sh
│   │   ├── open-home.sh
│   │   ├── open-iterm-from-finder.applescript
│   │   ├── open-last-downloaded.sh
│   │   ├── open-library.sh
│   │   ├── open-terminal-from-finder.applescript
│   │   ├── open-url-from-clipboard.sh
│   │   ├── quit-application.applescript
│   │   ├── restart-application.applescript
│   │   ├── search-in-dash.sh
│   │   └── search-in-devdocs.sh
│   ├── productivity/
│   │   ├── bitwarden/
│   │   │   ├── README.md
│   │   │   ├── copy-first-matching-password.sh
│   │   │   ├── copy-first-matching-totp.sh
│   │   │   ├── create-text-send.sh
│   │   │   ├── delete-send.sh
│   │   │   ├── edit-send.sh
│   │   │   ├── list-sends.sh
│   │   │   ├── lock.sh
│   │   │   ├── log-in-apikey.template.sh
│   │   │   ├── log-in.template.sh
│   │   │   ├── log-out.sh
│   │   │   ├── receive-text-send.sh
│   │   │   ├── search-vault-items.sh
│   │   │   ├── status.sh
│   │   │   └── unlock.sh
│   │   ├── imgur/
│   │   │   ├── imgur-upload-clipboard-image.template.sh
│   │   │   ├── imgur-upload-latest-screenshot.template.sh
│   │   │   └── screenshot-and-imgur.sh
│   │   ├── macocr/
│   │   │   └── macocr-run-ocr.sh
│   │   ├── pomodoro/
│   │   │   ├── pomodoro-start-timer.sh
│   │   │   ├── pomodoro-status.sh
│   │   │   └── pomodoro-stop-timer.sh
│   │   ├── qpdf/
│   │   │   └── compress-pdf-qpdf.sh
│   │   ├── stopwatch/
│   │   │   ├── stopwatch-progress.sh
│   │   │   ├── stopwatch-start.sh
│   │   │   └── stopwatch-stop.sh
│   │   ├── tesseract/
│   │   │   └── tesseract-ocr.sh
│   │   └── writing/
│   │       ├── dictionary-lookup.swift
│   │       └── word-count.sh
│   ├── remote-control/
│   │   ├── ddc/
│   │   │   ├── arm64/
│   │   │   │   ├── screen-dp.sh
│   │   │   │   └── screen-hdmi.sh
│   │   │   └── x86/
│   │   │       ├── screen-dp.sh
│   │   │       └── screen-hdmi.sh
│   │   ├── denon-avr/
│   │   │   ├── configure.applescript
│   │   │   ├── power-off.applescript
│   │   │   ├── power-on.applescript
│   │   │   ├── set-volume.applescript
│   │   │   ├── volume-down.applescript
│   │   │   └── volume-up.applescript
│   │   ├── lg-tv/
│   │   │   ├── README.md
│   │   │   ├── authenticate.sh
│   │   │   ├── change-channel.sh
│   │   │   ├── change-input.sh
│   │   │   ├── change-sound-output.sh
│   │   │   ├── change-volume.sh
│   │   │   ├── close-app.sh
│   │   │   ├── execute-command.sh
│   │   │   ├── fast-forward-media.sh
│   │   │   ├── list-apps.sh
│   │   │   ├── list-channels.sh
│   │   │   ├── list-inputs.sh
│   │   │   ├── list-launch-points.sh
│   │   │   ├── list-services.sh
│   │   │   ├── mute.sh
│   │   │   ├── open-app-with-payload.sh
│   │   │   ├── open-app.sh
│   │   │   ├── open-browser.sh
│   │   │   ├── open-youtube-id.sh
│   │   │   ├── open-youtube-url.sh
│   │   │   ├── pause-media.sh
│   │   │   ├── play-media.sh
│   │   │   ├── rewind-media.sh
│   │   │   ├── scan.sh
│   │   │   ├── send-notification-with-icon.sh
│   │   │   ├── send-notification.sh
│   │   │   ├── show-audio-status.sh
│   │   │   ├── show-audio-volume.sh
│   │   │   ├── show-channel.sh
│   │   │   ├── show-config.sh
│   │   │   ├── show-cursor-socket.sh
│   │   │   ├── show-fg-app-info.sh
│   │   │   ├── show-picture-settings.sh
│   │   │   ├── show-power-state.sh
│   │   │   ├── show-software-info.sh
│   │   │   ├── show-sound-output.sh
│   │   │   ├── show-tv-info.sh
│   │   │   ├── stop-media.sh
│   │   │   ├── switch-next-channel.sh
│   │   │   ├── switch-previous-channel.sh
│   │   │   ├── turn-off-3d.sh
│   │   │   ├── turn-off-screen.sh
│   │   │   ├── turn-off.sh
│   │   │   ├── turn-on-3d.sh
│   │   │   ├── turn-on-screen.sh
│   │   │   ├── turn-on.sh
│   │   │   ├── turn-volume-down.sh
│   │   │   ├── turn-volume-up.sh
│   │   │   └── unmute.sh
│   │   └── samsung-tv/
│   │       ├── README.md
│   │       ├── samsungexceptions.py
│   │       ├── samsunghelper.py
│   │       ├── samsungshortcuts.py
│   │       ├── turn-off.template.py
│   │       └── turn-on.template.py
│   ├── system/
│   │   ├── Low Power Mode.sh
│   │   ├── Network Info.sh
│   │   ├── add-spacer-to-dock.sh
│   │   ├── audio/
│   │   │   ├── airpodsbattery.sh
│   │   │   ├── audio-output-switch.template.applescript
│   │   │   ├── bluetooth-headphones-battery-level.template.sh
│   │   │   ├── get-audio-devices.swift
│   │   │   ├── get-selected-audio-device.swift
│   │   │   ├── reload-coreaudio.sh
│   │   │   ├── set-audio-device.swift
│   │   │   ├── toggle-airpods.template.swift
│   │   │   ├── toggle-mic.applescript
│   │   │   └── toggle-mute-notification-sounds.applescript
│   │   ├── battery-info.sh
│   │   ├── bluetooth.template.applescript
│   │   ├── brightness.sh
│   │   ├── caffeinate-disable.sh
│   │   ├── caffeinate-enable.sh
│   │   ├── caffeinate-status.sh
│   │   ├── caffeinate-status.swift
│   │   ├── capture-fullscreen-to-clipboard.sh
│   │   ├── capture-fullscreen-to-desktop.sh
│   │   ├── capture-screen-selection-to-clipboard.sh
│   │   ├── capture-screen-selection-to-desktop.sh
│   │   ├── close-finder-windows.applescript
│   │   ├── copy-availability.swift
│   │   ├── copy-last-download.swift
│   │   ├── copy-last-screenshot.swift
│   │   ├── copy-selection-to-clipboard.applescript
│   │   ├── create-new-file-in-finder.applescript
│   │   ├── create-new-file.applescript
│   │   ├── custom-window.applescript
│   │   ├── default-browser-arc.applescript
│   │   ├── default-browser-chrome.applescript
│   │   ├── default-browser-chromium.applescript
│   │   ├── default-browser-firefox.applescript
│   │   ├── default-browser-front-most-app.applescript
│   │   ├── default-browser-safari.applescript
│   │   ├── delete-selected-files.sh
│   │   ├── disk-free.sh
│   │   ├── disk-usage.sh
│   │   ├── dismiss-notifications.applescript
│   │   ├── dnd-off.sh
│   │   ├── dnd-on.sh
│   │   ├── do-not-disturb.sh
│   │   ├── dock-autohide-toggle.sh
│   │   ├── dock-set-autohide.sh
│   │   ├── dock-set-position.sh
│   │   ├── eject-all-disks.applescript
│   │   ├── empty-clipboard.sh
│   │   ├── empty-trash.applescript
│   │   ├── flush-dns.sh
│   │   ├── inline-cpu-usage-percent.sh
│   │   ├── kill-a-process-on-port.sh
│   │   ├── kill-airdrop.processes.sh
│   │   ├── kill-process.sh
│   │   ├── largest-cpu-process.sh
│   │   ├── largest-ram-process.sh
│   │   ├── list-processes.rb
│   │   ├── magic-keyboard-switcher/
│   │   │   ├── README.md
│   │   │   └── magic-keyboard-switcher.template.sh
│   │   ├── meeting_summary_script.swift
│   │   ├── minimize-all-windows.applescript
│   │   ├── modify-extension.sh
│   │   ├── move-desktop-to-trash.applescript
│   │   ├── move-downloads-to-trash.applescript
│   │   ├── network-quality.sh
│   │   ├── network-status.sh
│   │   ├── new-email.sh
│   │   ├── nightshift.sh
│   │   ├── ocr.swift
│   │   ├── open-folder.sh
│   │   ├── open-image-from-clipboard.sh
│   │   ├── open-last-download.swift
│   │   ├── open-selection-with.applescript
│   │   ├── otp.sh
│   │   ├── paste-clipboard.sh
│   │   ├── quit-all-apps.swift
│   │   ├── quit-app.swift
│   │   ├── rename-videos-pictures.py
│   │   ├── reset-launchpad.sh
│   │   ├── restart-dock.sh
│   │   ├── restart-finder.sh
│   │   ├── restart.applescript
│   │   ├── sample-color.swift
│   │   ├── save-image-from-clipboard.py
│   │   ├── screensaver.applescript
│   │   ├── shutdown.applescript
│   │   ├── sleep-timer.applescript
│   │   ├── sleep.applescript
│   │   ├── toggle-battery-charging.sh
│   │   ├── toggle-desktop-icons.applescript
│   │   ├── toggle-desktop-widget.sh
│   │   ├── toggle-ds-store.applescript
│   │   ├── toggle-filename-extensions.applescript
│   │   ├── toggle-flip-screen.template.applescript
│   │   ├── toggle-hidden-files.applescript
│   │   ├── toggle-lid-sleep.sh
│   │   ├── toggle-natural-scrolling-macos15.applescript
│   │   ├── toggle-natural-scrolling.applescript
│   │   ├── toggle-sidecar.template.applescript
│   │   ├── toggle-system-appearance.applescript
│   │   ├── uninstall-with-appcleaner.applescript
│   │   ├── update-scripts-command.template.py
│   │   ├── vpn/
│   │   │   ├── vpn-config.sh
│   │   │   ├── vpn-start.sh
│   │   │   ├── vpn-status.sh
│   │   │   └── vpn-stop.sh
│   │   ├── vpnutil/
│   │   │   ├── vpnutil-config.template.sh
│   │   │   ├── vpnutil-start.sh
│   │   │   ├── vpnutil-status.sh
│   │   │   ├── vpnutil-stop.sh
│   │   │   └── vpnutil-toggle.sh
│   │   ├── wallpaper-refresh.applescript
│   │   ├── wifi-password.sh
│   │   └── wifi.template.applescript
│   └── web-searches/
│       ├── amazon.sh
│       ├── app-store.sh
│       ├── arxiv.sh
│       ├── bnf-search.sh
│       ├── bundlephobia.sh
│       ├── caniuse.sh
│       ├── check-weather.sh
│       ├── clipboard-to-17track.js
│       ├── crunchbase.sh
│       ├── doi-clipboard.sh
│       ├── doi.sh
│       ├── duck-duck-go.sh
│       ├── ecosia.sh
│       ├── figma.sh
│       ├── giphy.sh
│       ├── google-maps.sh
│       ├── google-search.sh
│       ├── google-translate.rb
│       ├── grep-app-search.sh
│       ├── hunter.sh
│       ├── im-feeling-ducky.sh
│       ├── kinopoisk.sh
│       ├── mdn.sh
│       ├── mozilla-developer-network.sh
│       ├── njt.sh
│       ├── npmjs.sh
│       ├── npms.sh
│       ├── opensecrets.sh
│       ├── pkg-go-dev.sh
│       ├── postgresql.sh
│       ├── pub-search.sh
│       ├── repo.sh
│       ├── rust-crate.sh
│       ├── search-cdnjs.sh
│       ├── search-coinmarketcap.sh
│       ├── search-emojipedia.sh
│       ├── search-gender-in-chosic.applescript
│       ├── search-github.sh
│       ├── search-hacker-news.sh
│       ├── search-imdb.sh
│       ├── search-in-baidu.sh
│       ├── search-in-bilibili.sh
│       ├── search-in-devhints.sh
│       ├── search-in-dndbeyond.sh
│       ├── search-in-jingdong.sh
│       ├── search-in-taobao.sh
│       ├── search-in-wikipedia.sh
│       ├── search-in-zhihu.sh
│       ├── search-linkedin.sh
│       ├── search-netflix.sh
│       ├── search-php-docs.sh
│       ├── search-pypi.sh
│       ├── search-python3-docs.sh
│       ├── search-rust-docs.sh
│       ├── search-script-command-marketplace.sh
│       ├── search-swift-github.sh
│       ├── search-unsplash.sh
│       ├── search-wpengine-installs.sh
│       ├── swift-package-index.sh
│       ├── translate-with-baidu.template.sh
│       ├── translate-with-google.template.sh
│       ├── twitter-search.sh
│       ├── unfurl.sh
│       ├── wayback-machine.sh
│       ├── wordpress/
│       │   ├── search-wordpress-docs.sh
│       │   ├── wordpress-classes-reference.sh
│       │   ├── wordpress-cli-command.sh
│       │   ├── wordpress-functions-reference.sh
│       │   └── wordpress-hooks-reference.sh
│       ├── wpengine-install.sh
│       ├── yandex-search.sh
│       └── youtube.sh
├── documentation/
│   ├── ARGUMENTS.md
│   └── OUTPUTMODES.md
└── templates/
    ├── script-command.template.applescript
    ├── script-command.template.cs
    ├── script-command.template.js
    ├── script-command.template.php
    ├── script-command.template.py
    ├── script-command.template.rb
    ├── script-command.template.sh
    └── script-command.template.swift
Download .txt
SYMBOL INDEX (202 symbols across 39 files)

FILE: commands/ai/gemini/gemini.js
  function escapeJsString (line 40) | function escapeJsString(str) {
  function escapeShellString (line 45) | function escapeShellString(str) {
  function sleep (line 50) | function sleep(ms) {
  function checkDependencies (line 59) | function checkDependencies() {
  function executeScript (line 140) | function executeScript() {

FILE: commands/apps/claude/claude.js
  function escapeJsString (line 35) | function escapeJsString(str) {
  function escapeShellString (line 40) | function escapeShellString(str) {
  function executeScript (line 84) | function executeScript() {

FILE: commands/apps/mail/copy-captcha-from-mail.py
  function extract_captcha_from_emlx (line 28) | def extract_captcha_from_emlx(emlx_path):
  function get_latest_emlx_file (line 67) | def get_latest_emlx_file(folder):

FILE: commands/apps/playground/open-new-playground.py
  function safe_get (line 28) | def safe_get(array, index):

FILE: commands/apps/playground/open-new-view-playground.py
  function safe_get (line 28) | def safe_get(array, index):

FILE: commands/apps/quip/quip.py
  class QuipError (line 99) | class QuipError(Exception):
    method __init__ (line 100) | def __init__(self, code, message, http_error):
  class QuipClient (line 106) | class QuipClient(object):
    method __init__ (line 123) | def __init__(self, access_token=None, client_id=None, client_secret=None,
    method get_authorization_url (line 140) | def get_authorization_url(self, redirect_uri, state=None):
    method get_access_token (line 146) | def get_access_token(self, redirect_uri, code,
    method get_authenticated_user (line 160) | def get_authenticated_user(self):
    method get_user (line 164) | def get_user(self, id):
    method get_users (line 168) | def get_users(self, ids):
    method update_user (line 172) | def update_user(self, user_id, picture_url=None):
    method get_contacts (line 178) | def get_contacts(self):
    method get_folder (line 182) | def get_folder(self, id):
    method get_folders (line 186) | def get_folders(self, ids):
    method new_folder (line 190) | def new_folder(self, title, parent_id=None, color=None, member_ids=[]):
    method update_folder (line 198) | def update_folder(self, folder_id, color=None, title=None):
    method add_folder_members (line 205) | def add_folder_members(self, folder_id, member_ids):
    method remove_folder_members (line 212) | def remove_folder_members(self, folder_id, member_ids):
    method get_teams (line 219) | def get_teams(self):
    method get_messages (line 223) | def get_messages(self, thread_id, max_created_usec=None, count=None):
    method new_message (line 236) | def new_message(self, thread_id, content=None, **kwargs):
    method get_thread (line 248) | def get_thread(self, id):
    method get_threads (line 252) | def get_threads(self, ids):
    method get_recent_threads (line 256) | def get_recent_threads(self, max_updated_usec=None, count=None, **kwar...
    method get_matching_threads (line 262) | def get_matching_threads(
    method add_thread_members (line 268) | def add_thread_members(self, thread_id, member_ids):
    method delete_thread (line 275) | def delete_thread(self, thread_id):
    method remove_thread_members (line 281) | def remove_thread_members(self, thread_id, member_ids):
    method move_thread (line 288) | def move_thread(self, thread_id, source_folder_id, destination_folder_...
    method new_chat (line 294) | def new_chat(self, message, title=None, member_ids=[]):
    method new_document (line 303) | def new_document(self, content, format="html", title=None, member_ids=...
    method copy_document (line 321) | def copy_document(self, thread_id, folder_ids=None, member_ids=None,
    method merge_comments (line 341) | def merge_comments(self, original_id, children_ids, ignore_user_ids=[]):
    method edit_document (line 394) | def edit_document(self, thread_id, content, operation=APPEND, format="...
    method add_to_first_list (line 418) | def add_to_first_list(self, thread_id, *items, **kwargs):
    method add_to_spreadsheet (line 443) | def add_to_spreadsheet(self, thread_id, *rows, **kwargs):
    method update_spreadsheet_row (line 469) | def update_spreadsheet_row(self, thread_id, header, value, updates, **...
    method add_spreadsheet_row (line 506) | def add_spreadsheet_row(
    method toggle_checkmark (line 540) | def toggle_checkmark(self, thread_id, item, checked=True):
    method get_first_list (line 557) | def get_first_list(self, thread_id=None, document_html=None):
    method get_last_list (line 567) | def get_last_list(self, thread_id=None, document_html=None):
    method get_section (line 571) | def get_section(self, section_id, thread_id=None, document_html=None):
    method get_named_spreadsheet (line 582) | def get_named_spreadsheet(self, name, thread_id=None, document_html=No...
    method _get_container (line 593) | def _get_container(self, thread_id, document_html, container, index):
    method get_last_list_item_id (line 607) | def get_last_list_item_id(self, list_tree):
    method get_first_list_item_id (line 612) | def get_first_list_item_id(self, list_tree):
    method get_first_spreadsheet (line 618) | def get_first_spreadsheet(self, thread_id=None, document_html=None):
    method get_last_spreadsheet (line 627) | def get_last_spreadsheet(self, thread_id=None, document_html=None):
    method get_last_row_item_id (line 631) | def get_last_row_item_id(self, spreadsheet_tree):
    method get_first_row_item_id (line 636) | def get_first_row_item_id(self, spreadsheet_tree):
    method get_row_items (line 641) | def get_row_items(self, row_tree):
    method get_row_ids (line 645) | def get_row_ids(self, row_tree):
    method get_spreadsheet_header_items (line 649) | def get_spreadsheet_header_items(self, spreadsheet_tree):
    method get_index_of_header (line 653) | def get_index_of_header(self, header_items, header, default=0):
    method find_row_from_header (line 672) | def find_row_from_header(self, spreadsheet_tree, header, value):
    method parse_spreadsheet_contents (line 687) | def parse_spreadsheet_contents(self, spreadsheet_tree):
    method parse_document_html (line 723) | def parse_document_html(self, document_html):
    method parse_micros (line 728) | def parse_micros(self, usec):
    method get_blob (line 732) | def get_blob(self, thread_id, blob_id):
    method put_blob (line 753) | def put_blob(self, thread_id, blob, name=None):
    method new_websocket (line 780) | def new_websocket(self, **kwargs):
    method _fetch_json (line 785) | def _fetch_json(self, path, post_data=None, **args):
    method _clean (line 810) | def _clean(self, **args):
    method _url (line 814) | def _url(self, path, **args):

FILE: commands/apps/quip/quip_utils.py
  class ExtendedSectionInterpolation (line 22) | class ExtendedSectionInterpolation(ExtendedInterpolation):
    method before_get (line 23) | def before_get(self, parser, section, option, value, defaults):
  function fail (line 28) | def fail(message):
  function notify (line 34) | def notify(title, text):
  function readConfig (line 43) | def readConfig(filename=config_file):
  function checkAPIToken (line 52) | def checkAPIToken(doc_type):
  function setClipboardData (line 62) | def setClipboardData(text):
  function quip_open (line 68) | def quip_open(thing, doc_type='DEFAULT'):
  function normalize (line 85) | def normalize(s):
  function quip_new_doc (line 96) | def quip_new_doc(doc_type, text):

FILE: commands/apps/timing/timing-start-timer.js
  function run (line 23) | function run(argv) {

FILE: commands/apps/timing/timing-stop-timer.js
  function run (line 20) | function run() {

FILE: commands/apps/translate-shell/translate-shell-language-pair.py
  function green (line 53) | def green(message):
  function yellow (line 56) | def yellow(message):
  function red (line 59) | def red(message):
  function grey (line 62) | def grey(message):
  function white (line 65) | def white(message):
  function translate (line 68) | def translate(lang, query):
  function print_translations (line 87) | def print_translations(translations):

FILE: commands/apps/wikipedia/wikipedia-search.py
  function green (line 34) | def green(message):
  function yellow (line 37) | def yellow(message):
  function red (line 40) | def red(message):
  function grey (line 43) | def grey(message):
  function white (line 46) | def white(message):

FILE: commands/communication/share-secret-doppler.py
  function read_from_clipboard (line 34) | def read_from_clipboard():
  function write_to_clipboard (line 39) | def write_to_clipboard(output):

FILE: commands/conversions/change-case/camelcase.py
  function __dict_replace (line 28) | def __dict_replace(s, d):
  function titlecase (line 51) | def titlecase(text):
  function titlecase_plus (line 119) | def titlecase_plus(text):
  function getClipboardData (line 131) | def getClipboardData():
  function setClipboardData (line 136) | def setClipboardData(data):
  function tryDecode (line 141) | def tryDecode(s):
  function tryEncode (line 147) | def tryEncode(s):

FILE: commands/conversions/change-case/kebabcase.py
  function getClipboardData (line 21) | def getClipboardData():
  function setClipboardData (line 26) | def setClipboardData(data):
  function tryDecode (line 31) | def tryDecode(s):
  function tryEncode (line 37) | def tryEncode(s):

FILE: commands/conversions/change-case/lowercase.py
  function getClipboardData (line 21) | def getClipboardData():
  function setClipboardData (line 26) | def setClipboardData(data):
  function tryDecode (line 31) | def tryDecode(s):
  function tryEncode (line 37) | def tryEncode(s):

FILE: commands/conversions/change-case/snakecase.py
  function getClipboardData (line 22) | def getClipboardData():
  function setClipboardData (line 27) | def setClipboardData(data):
  function tryDecode (line 32) | def tryDecode(s):
  function tryEncode (line 38) | def tryEncode(s):

FILE: commands/conversions/change-case/titlecase.py
  function __dict_replace (line 28) | def __dict_replace(s, d):
  function titlecase (line 51) | def titlecase(text):
  function titlecase_plus (line 119) | def titlecase_plus(text):
  function getClipboardData (line 131) | def getClipboardData():
  function setClipboardData (line 136) | def setClipboardData(data):
  function tryDecode (line 141) | def tryDecode(s):
  function tryEncode (line 147) | def tryEncode(s):

FILE: commands/conversions/change-case/uppercase.py
  function getClipboardData (line 21) | def getClipboardData():
  function setClipboardData (line 26) | def setClipboardData(data):
  function tryDecode (line 31) | def tryDecode(s):
  function tryEncode (line 37) | def tryEncode(s):

FILE: commands/conversions/clipboard-to-markdown.js
  function pbpaste (line 25) | function pbpaste() {
  function pbcopy (line 29) | function pbcopy(data) {
  function processLine (line 46) | function processLine(content) {
  function processLines (line 57) | function processLines(content) {
  function processImageURL (line 65) | function processImageURL(content) {
  function processURL (line 69) | function processURL(content) {
  function processText (line 73) | function processText(content) {
  function processContent (line 77) | function processContent(content) {
  function processStoredContent (line 89) | function processStoredContent(content) {

FILE: commands/conversions/create-gif-from-video.py
  function is_video_file (line 44) | def is_video_file(file_path):
  function get_last_video_file_path (line 47) | def get_last_video_file_path():
  function get_default_destination_file_path (line 51) | def get_default_destination_file_path(from_file_path):
  function safe_get (line 55) | def safe_get(array, index):
  function handle_error (line 61) | def handle_error(stderr):

FILE: commands/conversions/create-markdown-table.js
  function pbcopy (line 24) | function pbcopy(data) {

FILE: commands/conversions/markdown-to-telegram.py
  function paste (line 24) | def paste():
  function copy (line 28) | def copy(text):
  function convert_markdown (line 33) | def convert_markdown(text):

FILE: commands/dashboard/mood-meter/display-mood-month.js
  function daysInMonth (line 83) | function daysInMonth(month, year) {
  function isLeapYear (line 89) | function isLeapYear(year) {

FILE: commands/dashboard/mood-meter/display-mood-year.js
  function daysInMonth (line 98) | function daysInMonth(month, year) {
  function isLeapYear (line 104) | function isLeapYear(year) {

FILE: commands/dashboard/stock-portfolio.rb
  function fetch_stock (line 40) | def fetch_stock(symbol)

FILE: commands/developer-utils/genpasswd.py
  function charset (line 27) | def charset(length: int = 6) -> str:
  function superset (line 31) | def superset(

FILE: commands/developer-utils/gitlab/gitlabhelper.py
  class GitLab (line 7) | class GitLab:
    method __init__ (line 8) | def __init__(self):
    method get_call (line 12) | def get_call(self, url):

FILE: commands/developer-utils/json-stringify-text.js
  function pbpaste (line 20) | function pbpaste() {
  function pbcopy (line 41) | function pbcopy(data) {

FILE: commands/developer-utils/sentry/sentry-unresolved-issues-by-project.template.py
  function error (line 63) | def error(message):
  function ok (line 66) | def ok(message):
  function warn (line 69) | def warn(message):

FILE: commands/developer-utils/time-calculator.js
  function conversion (line 44) | function conversion(n, unit) {

FILE: commands/home/philips-hue/hue-bulb.template.mjs
  function checkValue (line 145) | function checkValue(value, limit) {

FILE: commands/home/philips-hue/hue-room.template.mjs
  function checkValue (line 146) | function checkValue(value, limit) {

FILE: commands/media/spotify/create-spotify-command.js
  constant URL (line 22) | const URL = execSync("pbpaste").toString();

FILE: commands/remote-control/samsung-tv/samsungexceptions.py
  class ConnectionFailure (line 1) | class ConnectionFailure(Exception):
  class ResponseError (line 6) | class ResponseError(Exception):
  class HttpApiError (line 11) | class HttpApiError(Exception):

FILE: commands/remote-control/samsung-tv/samsunghelper.py
  class SamsungTVWS (line 17) | class SamsungTVWS:
    method __init__ (line 21) | def __init__(self, host, port=8002, timeout=None, key_press_delay=1,
    method _get_token (line 32) | def _get_token(self):
    method _set_token (line 42) | def _set_token(self, token):
    method _serialize_string (line 51) | def _serialize_string(self, string):
    method _is_ssl_connection (line 57) | def _is_ssl_connection(self):
    method _format_websocket_url (line 60) | def _format_websocket_url(self):
    method _ws_send (line 73) | def _ws_send(self, command, key_press_delay=None):
    method _process_api_response (line 82) | def _process_api_response(self, response):
    method open (line 89) | def open(self):
    method close (line 111) | def close(self):
    method send_key (line 118) | def send_key(self, key, times=1, key_press_delay=None, cmd='Click'):
    method shortcuts (line 133) | def shortcuts(self):

FILE: commands/remote-control/samsung-tv/samsungshortcuts.py
  class SamsungTVShortcuts (line 6) | class SamsungTVShortcuts:
    method __init__ (line 7) | def __init__(self, remote):
    method power (line 11) | def power(self):

FILE: commands/system/rename-videos-pictures.py
  class RenameFilesAsDate (line 25) | class RenameFilesAsDate:
    method __init__ (line 26) | def __init__(self, root_directory):
    method rename_files (line 32) | def rename_files(self, file_type='all', dry_run=False):
    method _is_already_renamed (line 41) | def _is_already_renamed(self, filename, current_date):
    method _get_max_sequence_number (line 47) | def _get_max_sequence_number(self, directory, current_date):
    method _process_directory (line 59) | def _process_directory(self, directory, current_date, file_type, dry_r...
    method _get_supported_extensions (line 98) | def _get_supported_extensions(self, file_type):
  function main (line 105) | def main():

FILE: commands/system/save-image-from-clipboard.py
  function save_image (line 30) | def save_image():

FILE: commands/system/update-scripts-command.template.py
  class RepoScriptFile (line 43) | class RepoScriptFile:
  class LocalScriptFile (line 48) | class LocalScriptFile:
  function get_files (line 52) | def get_files(root_path, extensions):
  function save_last_update_date (line 58) | def save_last_update_date():
  function read_last_update_date (line 62) | def read_last_update_date():
  function get_files_to_update (line 72) | def get_files_to_update(base_date=None, base_local_files=None):
Condensed preview — 963 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (2,492K chars).
[
  {
    "path": ".gitattributes",
    "chars": 185,
    "preview": "commands/README.md          -diff -merge\ncommands/README.md          linguist-generated=true\ncommands/extensions.json   "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 846,
    "preview": "## Description\n\n<!-- Please write a short summary for this change. If it's a new script command, explain what it does. -"
  },
  {
    "path": ".github/stale.yml",
    "chars": 368,
    "preview": "daysUntilStale: 30\ndaysUntilClose: 7\nexemptLabels:\n  - security\n  - enhancement\nstaleLabel: wontfix\nmarkComment: >\n  Thi"
  },
  {
    "path": ".github/workflows/script-commands.yml",
    "chars": 1715,
    "preview": "name: Set as Executable and Generate Documentation\n\non:\n  push:\n    branches: [master]\n    paths-ignore:\n      - command"
  },
  {
    "path": ".gitignore",
    "chars": 66,
    "preview": ".DS_Store\n.build\n/Packages\n*.xcodeproj\nxcuserdata/\n.swiftpm\n.idea\n"
  },
  {
    "path": ".swiftlint.yml",
    "chars": 1073,
    "preview": "indentation: 2\nincluded:\n  - Tools/Toolkit\nexcluded:\n  - Tools/Toolkit/.build\n  - _enabled-commands\n  - commands\n  - tem"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 8162,
    "preview": "# Contributing\n\nThank you for your interest in contributing to Raycast Script Commands! Here you will find simple guidel"
  },
  {
    "path": "LICENSE",
    "chars": 1087,
    "preview": "MIT License\n\nCopyright (c) 2020-2021 Raycast Technologies Ltd.\n\nPermission is hereby granted, free of charge, to any per"
  },
  {
    "path": "Makefile",
    "chars": 1028,
    "preview": "EXECUTABLE_NAME = toolkit\n\nTOOLKIT_PATH = Tools/Toolkit\nBUILD_PATH_RELEASE = $(TOOLKIT_PATH)/.build/release\nEXECUTABLE_P"
  },
  {
    "path": "README.md",
    "chars": 10543,
    "preview": "<div align=\"center\">\n  <img alt=\"Raycast Logo\" src=\"images/logo.png\" height=\"240\"/>\n\n  <div align=\"center\">\n    <a href="
  },
  {
    "path": "Tools/Toolkit/CONTRIBUTING.md",
    "chars": 1987,
    "preview": "# Contributing to Raycast's Toolkit\n\nRaycast Toolkit is a command-line application for automating repetitive tasks in th"
  },
  {
    "path": "Tools/Toolkit/Package.resolved",
    "chars": 643,
    "preview": "{\n  \"object\": {\n    \"pins\": [\n      {\n        \"package\": \"swift-argument-parser\",\n        \"repositoryURL\": \"https://gith"
  },
  {
    "path": "Tools/Toolkit/Package.swift",
    "chars": 946,
    "preview": "// swift-tools-version:5.3\n\nimport PackageDescription\n\nlet package = Package(\n  name: \"toolkit\",\n  platforms: [\n    .mac"
  },
  {
    "path": "Tools/Toolkit/README.md",
    "chars": 1536,
    "preview": "# Raycast Toolkit\n\n[Raycast](https://raycast.com) Toolkit helps you to generate documentation for all script commands on"
  },
  {
    "path": "Tools/Toolkit/Sources/Toolkit/SubCommands/GenerateDocumentation.swift",
    "chars": 1322,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport ArgumentParser\nimport ToolkitLib"
  },
  {
    "path": "Tools/Toolkit/Sources/Toolkit/SubCommands/Report.swift",
    "chars": 1341,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport ArgumentParser\nimport SwiftUI\nim"
  },
  {
    "path": "Tools/Toolkit/Sources/Toolkit/SubCommands/SetExecutable.swift",
    "chars": 795,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport ArgumentParser\nimport ToolkitLib"
  },
  {
    "path": "Tools/Toolkit/Sources/Toolkit/SubCommands/Version.swift",
    "chars": 390,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport ArgumentParser\nimport ToolkitLib"
  },
  {
    "path": "Tools/Toolkit/Sources/Toolkit/main.swift",
    "chars": 496,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nimport ArgumentParse"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Console.swift",
    "chars": 1389,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\npubl"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Documentation/Documentation.swift",
    "chars": 7840,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\nfina"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/GitShell.swift",
    "chars": 1356,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport TSCBasic\nimport TSCUtility\n\nstru"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/RegEx.swift",
    "chars": 804,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\ntypealias NSTextChec"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Report/Report.swift",
    "chars": 6125,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\nfina"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Stores/DataManager.swift",
    "chars": 1607,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport TSCBasic\n\npublic final class Dat"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Constants.swift",
    "chars": 848,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\npubl"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+GenerateDocumentation.swift",
    "chars": 675,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\nexte"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Mode.swift",
    "chars": 1845,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\nexte"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+ReadContent.swift",
    "chars": 11154,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\nexte"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+Report.swift",
    "chars": 481,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\nexte"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit+ReportType.swift",
    "chars": 364,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\npublic extension Too"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Core/Toolkit/Toolkit.swift",
    "chars": 334,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\nimport TSCBasic\n\npubl"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Errors/Reader+Error.swift",
    "chars": 458,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nenum ToolkitError: S"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Array/Array+Metadata.swift",
    "chars": 365,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Array wher"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Array/Array+UInt8.swift",
    "chars": 257,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Array wher"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Character/Character+Emoji.swift",
    "chars": 567,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Character "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Character/Character+String.swift",
    "chars": 167,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Character "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Codable/Encodable+Data.swift",
    "chars": 375,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Encodable "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Data/Data+Bytes.swift",
    "chars": 176,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Data {\n  v"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Data/Data+Decodable.swift",
    "chars": 338,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Data {\n  f"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Dictionary/Dictionary+Codable.swift",
    "chars": 469,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Dictionary"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Integer/Int+Indent.swift",
    "chars": 249,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension Int {\n  va"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/Integer/UInt8+Data.swift",
    "chars": 243,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension UInt8 {\n  "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+Emoji.swift",
    "chars": 373,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension String {\n "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+Interpolation.swift",
    "chars": 297,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension String.Str"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String+URL.swift",
    "chars": 474,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension String {\n "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/String/String.swift",
    "chars": 1254,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport CryptoKit\nimport Foundation\n\nenu"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/TSCBasic/AbsolutePath+SocialBasename.swift",
    "chars": 204,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport TSCBasic\n\nextension AbsolutePath"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Extensions/TSCBasic/FileSystem+AbsolutePath.swift",
    "chars": 597,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport TSCBasic\n\nextension FileSystem {"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/Group.swift",
    "chars": 1351,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\ntypealias Groups = ["
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/Language+Information.swift",
    "chars": 548,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nextension Language {\n  typealias Inform"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/Language.swift",
    "chars": 1992,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nenum Language {\n  ca"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/Metadata.swift",
    "chars": 321,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nstruct Metadata: Cod"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/RaycastData.swift",
    "chars": 1504,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nstruct RaycastData: "
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Author.swift",
    "chars": 2618,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension ScriptComm"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Icon.swift",
    "chars": 3069,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension ScriptComm"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand+Mode.swift",
    "chars": 232,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nextension ScriptComm"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Models/ScriptCommand.swift",
    "chars": 5975,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\ntypealias ScriptComm"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Protocols/MarkdownDescriptionProtocol.swift",
    "chars": 218,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport Foundation\n\nprotocol MarkdownDes"
  },
  {
    "path": "Tools/Toolkit/Sources/ToolkitLibrary/Typealiases/Identifier.swift",
    "chars": 148,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\ntypealias Identifier = String\ntypealias"
  },
  {
    "path": "Tools/Toolkit/Tests/LinuxMain.swift",
    "chars": 211,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport XCTest\n\nimport ToolkitLibraryTes"
  },
  {
    "path": "Tools/Toolkit/Tests/ToolkitLibraryTests/ToolkitLibraryTests.swift",
    "chars": 1398,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport XCTest\nimport class Foundation.B"
  },
  {
    "path": "Tools/Toolkit/Tests/ToolkitLibraryTests/XCTestManifests.swift",
    "chars": 237,
    "preview": "//\n//  MIT License\n//  Copyright (c) 2020-2021 Raycast. All rights reserved.\n//\n\nimport XCTest\n\n#if !canImport(Objective"
  },
  {
    "path": "Tools/Toolkit/integration.sh",
    "chars": 1091,
    "preview": "#!/bin/bash\n\nfunction commit_documentation() {\n  if `git status | grep -q \"nothing to commit\"`; then\n    exit 0;\n  else\n"
  },
  {
    "path": "_enabled-commands/.gitignore",
    "chars": 65,
    "preview": "# Ignore directory contents\n*\n# Except for\n!.gitignore\n!README.md"
  },
  {
    "path": "_enabled-commands/README.md",
    "chars": 369,
    "preview": "# How to use this directory\n\nGrab script files you want to use from the repository and paste it here (rather than pointi"
  },
  {
    "path": "commands/README.md",
    "chars": 313035,
    "preview": "<!-- AUTO GENERATED FILE. DO NOT EDIT. -->\n<div align=\"center\">\n  <a href=\"https://github.com/raycast/script-commands\">\n"
  },
  {
    "path": "commands/ai/gemini/gemini.js",
    "chars": 7555,
    "preview": "#!/usr/bin/env node\n\n// Dependencies:\n// This script requires the following software to be installed:\n// - `node` https:"
  },
  {
    "path": "commands/apps/Message/copycode.sh",
    "chars": 1018,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.title Copy Code\n# @raycast.mode silent\n# @rayc"
  },
  {
    "path": "commands/apps/agenda/README.md",
    "chars": 346,
    "preview": "Use these scripts to quickly access your notes on [Agenda](https://agenda.com/).\n\n![Screenshot](images/screenshot.png)\n\n"
  },
  {
    "path": "commands/apps/agenda/agenda-new-note.sh",
    "chars": 930,
    "preview": "#!/bin/bash\n\n# Note: Agenda required\n# Install via Mac App Store: https://apps.apple.com/us/app/agenda/id1287445660\n\n# R"
  },
  {
    "path": "commands/apps/agenda/agenda-on-the-agenda.sh",
    "chars": 560,
    "preview": "#!/bin/bash\n\n# Note: Agenda required\n# Install via Mac App Store: https://apps.apple.com/us/app/agenda/id1287445660\n\n# R"
  },
  {
    "path": "commands/apps/agenda/agenda-today.sh",
    "chars": 537,
    "preview": "#!/bin/bash\n\n# Note: Agenda required\n# Install via Mac App Store: https://apps.apple.com/us/app/agenda/id1287445660\n\n# R"
  },
  {
    "path": "commands/apps/amphetamine/amphetamine-off.applescript",
    "chars": 486,
    "preview": "#!/usr/bin/osascript\n\n# Install Amphetamine via Mac App Store: https://apps.apple.com/us/app/amphetamine/id937984704\n\n# "
  },
  {
    "path": "commands/apps/amphetamine/amphetamine-on.applescript",
    "chars": 505,
    "preview": "#!/usr/bin/osascript\n\n# Install Amphetamine via Mac App Store: https://apps.apple.com/us/app/amphetamine/id937984704\n\n# "
  },
  {
    "path": "commands/apps/baremetrics/get-arpu.sh",
    "chars": 1180,
    "preview": "#!/bin/bash\n\n# You may need to install coreutils via homebrew to make this script work (gdate function below).\n\n# Requir"
  },
  {
    "path": "commands/apps/baremetrics/get-arr.sh",
    "chars": 1174,
    "preview": "#!/bin/bash\n\n# You may need to install coreutils via homebrew to make this script work (gdate function below).\n\n# Requir"
  },
  {
    "path": "commands/apps/baremetrics/get-ltv.sh",
    "chars": 1154,
    "preview": "#!/bin/bash\n\n# You may need to install coreutils via homebrew to make this script work (gdate function below).\n\n# Requir"
  },
  {
    "path": "commands/apps/baremetrics/get-mrr.sh",
    "chars": 1176,
    "preview": "#!/bin/bash\n\n# You may need to install coreutils via homebrew to make this script work (gdate function below).\n\n# Requir"
  },
  {
    "path": "commands/apps/baremetrics/simple-dashboard.sh",
    "chars": 2256,
    "preview": "#!/bin/bash\n\n# You may need to install coreutils via homebrew to make this script work (gdate function below).\n\n# Requir"
  },
  {
    "path": "commands/apps/bartender/bartender-search.applescript",
    "chars": 575,
    "preview": "#!/usr/bin/osascript\n\n# Note: Bartender 4 required\n# Install from https://www.macbartender.com/\n\n# Required parameters:\n"
  },
  {
    "path": "commands/apps/bear/bear-add-note.sh",
    "chars": 818,
    "preview": "#!/bin/bash\n\n# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122\n\n# @raycast.title Add Not"
  },
  {
    "path": "commands/apps/bear/bear-open-note.sh",
    "chars": 563,
    "preview": "#!/bin/bash\n\n# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122\n\n# @raycast.title Open No"
  },
  {
    "path": "commands/apps/bear/bear-open-tag.sh",
    "chars": 557,
    "preview": "#!/bin/bash\n\n# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122\n\n# @raycast.title Open Ta"
  },
  {
    "path": "commands/apps/bear/bear-search.sh",
    "chars": 923,
    "preview": "#!/bin/bash\n\n# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122\n\n# @raycast.title Search\n"
  },
  {
    "path": "commands/apps/bear/bear-today.sh",
    "chars": 585,
    "preview": "#!/bin/bash\n\n# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122\n\n# @raycast.title Open To"
  },
  {
    "path": "commands/apps/bear/bear-todo.sh",
    "chars": 583,
    "preview": "#!/bin/bash\n\n# Install Bear via Mac App Store: https://apps.apple.com/us/app/bear/id1091189122\n\n# @raycast.title Open To"
  },
  {
    "path": "commands/apps/busycal/new-busycal-event-or-task.applescript",
    "chars": 978,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: This script requires `BusyCal` installed: https://www.busymac.com/busycal/\n\n# Requir"
  },
  {
    "path": "commands/apps/chatgpt/chatgpt-open-safari.applescript",
    "chars": 860,
    "preview": "#!/usr/bin/osascript\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.title chatgpt\n# @raycast.mode silent\n"
  },
  {
    "path": "commands/apps/claude/claude.js",
    "chars": 3785,
    "preview": "#!/usr/bin/env node\n\n// Dependencies:\n// This script requires the following software to be installed:\n// - `node` https:"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-add-quick-access-overlay.sh",
    "chars": 632,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.8.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-annotate.sh",
    "chars": 641,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.8.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-capture-area.sh",
    "chars": 503,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-capture-fullscreen.sh",
    "chars": 503,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-capture-previous-area.sh",
    "chars": 544,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-capture-text.sh",
    "chars": 689,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.8.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-capture-window.sh",
    "chars": 487,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-open-from-clipboard.sh",
    "chars": 512,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-pin.sh",
    "chars": 623,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-record-screen-with-keystroke-pro.sh",
    "chars": 727,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X required\n# Install from https://cleanshot.com\n#\n# Keystroke Pro required\n# Install from"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-record-screen.sh",
    "chars": 527,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-restore.sh",
    "chars": 506,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-scrolling-capture.sh",
    "chars": 497,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-self-timer.sh",
    "chars": 517,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/cleanshot/cleanshot-toggle-desktop-icons.sh",
    "chars": 504,
    "preview": "#!/bin/bash\n\n# Note: CleanShot X v3.5.1 required\n# Install from https://cleanshot.com\n\n# Required parameters:\n# @raycast"
  },
  {
    "path": "commands/apps/craft/craft-create-doc.template.sh",
    "chars": 1017,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `Craft v1.2.6` installed: https://www.craft.do/\n\n# Required parameters:\n"
  },
  {
    "path": "commands/apps/craft/craft-search-workspace.template.sh",
    "chars": 888,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `Craft v1.2.6` installed: https://www.craft.do/\n\n# Required parameters:\n"
  },
  {
    "path": "commands/apps/deepl/deepl-app-translate.applescript",
    "chars": 2454,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: This script requires DeepL to be installed: https://deepl.com/app\n# Tested with Deep"
  },
  {
    "path": "commands/apps/deepl/deepl-web-translate.sh",
    "chars": 1574,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.title DeepL Web Translate\n# @raycast.mode sile"
  },
  {
    "path": "commands/apps/devutils/backslash.sh",
    "chars": 418,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Back"
  },
  {
    "path": "commands/apps/devutils/base64encode.sh",
    "chars": 415,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Base"
  },
  {
    "path": "commands/apps/devutils/base64image.sh",
    "chars": 425,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Base"
  },
  {
    "path": "commands/apps/devutils/cronparser.sh",
    "chars": 420,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Cron"
  },
  {
    "path": "commands/apps/devutils/cssformatter.sh",
    "chars": 398,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title CSS "
  },
  {
    "path": "commands/apps/devutils/csv2json.sh",
    "chars": 385,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title CSV "
  },
  {
    "path": "commands/apps/devutils/erbformatter.sh",
    "chars": 398,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title ERB "
  },
  {
    "path": "commands/apps/devutils/hashing.sh",
    "chars": 391,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Hash"
  },
  {
    "path": "commands/apps/devutils/html2jsx.sh",
    "chars": 381,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title HTML"
  },
  {
    "path": "commands/apps/devutils/htmlencode.sh",
    "chars": 422,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title HTML"
  },
  {
    "path": "commands/apps/devutils/htmlformatter.sh",
    "chars": 401,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title HTML"
  },
  {
    "path": "commands/apps/devutils/htmlpreview.sh",
    "chars": 394,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title HTML"
  },
  {
    "path": "commands/apps/devutils/jsformatter.sh",
    "chars": 403,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title JS B"
  },
  {
    "path": "commands/apps/devutils/json2csv.sh",
    "chars": 385,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title JSON"
  },
  {
    "path": "commands/apps/devutils/json2yaml.sh",
    "chars": 388,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title JSON"
  },
  {
    "path": "commands/apps/devutils/jsonformatter.sh",
    "chars": 425,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title JSON"
  },
  {
    "path": "commands/apps/devutils/jwt.sh",
    "chars": 391,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title JWT "
  },
  {
    "path": "commands/apps/devutils/lessformatter.sh",
    "chars": 401,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title LESS"
  },
  {
    "path": "commands/apps/devutils/loremipsum.sh",
    "chars": 397,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Lore"
  },
  {
    "path": "commands/apps/devutils/markdownpreview.sh",
    "chars": 405,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Mark"
  },
  {
    "path": "commands/apps/devutils/numberbase.sh",
    "chars": 404,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Numb"
  },
  {
    "path": "commands/apps/devutils/qrcode.sh",
    "chars": 402,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title QR C"
  },
  {
    "path": "commands/apps/devutils/querystringparser.sh",
    "chars": 394,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title URL "
  },
  {
    "path": "commands/apps/devutils/regextester.sh",
    "chars": 419,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title RegE"
  },
  {
    "path": "commands/apps/devutils/scssformatter.sh",
    "chars": 401,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title SCSS"
  },
  {
    "path": "commands/apps/devutils/sqlformatter.sh",
    "chars": 393,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title SQL "
  },
  {
    "path": "commands/apps/devutils/stringcaseconverter.sh",
    "chars": 420,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Stri"
  },
  {
    "path": "commands/apps/devutils/stringinspect.sh",
    "chars": 422,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Stri"
  },
  {
    "path": "commands/apps/devutils/textdiff.sh",
    "chars": 412,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Text"
  },
  {
    "path": "commands/apps/devutils/unixtime.sh",
    "chars": 417,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title Unix"
  },
  {
    "path": "commands/apps/devutils/urlencode.sh",
    "chars": 401,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title URL "
  },
  {
    "path": "commands/apps/devutils/uuidtool.sh",
    "chars": 413,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title UUID"
  },
  {
    "path": "commands/apps/devutils/xmlformatter.sh",
    "chars": 398,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title XML "
  },
  {
    "path": "commands/apps/devutils/yaml2json.sh",
    "chars": 388,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.icon images/devutils.png\n# @raycast.title YAML"
  },
  {
    "path": "commands/apps/dictionary/look-up-in-dictionary.applescript",
    "chars": 523,
    "preview": "#!/usr/bin/osascript\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.title Look up in Dictionary\n# @raycas"
  },
  {
    "path": "commands/apps/dnd-me/start-dnd-me.sh",
    "chars": 962,
    "preview": "#!/bin/bash\n\n# Install DND Me from https://runtimesharks.com/projects/dnd-me?ref=producthunt\n\n# Required parameters:\n# @"
  },
  {
    "path": "commands/apps/dnd-me/stop-dnd-me.sh",
    "chars": 462,
    "preview": "#!/bin/bash\n\n# Install DND Me from https://runtimesharks.com/projects/dnd-me?ref=producthunt\n\n# Required parameters:\n# @"
  },
  {
    "path": "commands/apps/downie/download-video.sh",
    "chars": 647,
    "preview": "#!/bin/bash\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.title Download Video\n# @raycast.mode silent\n# "
  },
  {
    "path": "commands/apps/espanso/disable-espanso.sh",
    "chars": 540,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/\n\n# Required parame"
  },
  {
    "path": "commands/apps/espanso/enable-espanso.sh",
    "chars": 538,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/\n\n# Required parame"
  },
  {
    "path": "commands/apps/espanso/espanso-create-expansion.sh",
    "chars": 860,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/\n\n# Required parame"
  },
  {
    "path": "commands/apps/espanso/restart-espanso.sh",
    "chars": 536,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/\n\n# Required parame"
  },
  {
    "path": "commands/apps/espanso/start-espanso.sh",
    "chars": 532,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/\n\n# Required parame"
  },
  {
    "path": "commands/apps/espanso/stop-espanso.sh",
    "chars": 530,
    "preview": "#!/bin/bash\n\n# Dependency: This script requires `espanso` cli installed: https://espanso.org/install/\n\n# Required parame"
  },
  {
    "path": "commands/apps/eudic/look-up-in-eudic.applescript",
    "chars": 778,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: Eudic required\n# Install via Mac App Store: https://apps.apple.com/app/id402380914\n\n"
  },
  {
    "path": "commands/apps/evernote/create-note-paste-clipboard.applescript",
    "chars": 977,
    "preview": "#!/usr/bin/osascript\n\n# Assumption: Evernote running (launching and waiting not great UX)\n#\n# Required parameters:\n# @ra"
  },
  {
    "path": "commands/apps/evernote/create-note.applescript",
    "chars": 653,
    "preview": "#!/usr/bin/osascript\n\n# Assumption: Evernote running (launching and waiting not great UX)\n#\n# Required parameters:\n# @ra"
  },
  {
    "path": "commands/apps/expressvpn/expressvpn-connect.applescript",
    "chars": 658,
    "preview": "#!/usr/bin/osascript\n\n# You need ExpressVPN for this script: https://www.expressvpn.com/latest#mac\n\n# Required parameter"
  },
  {
    "path": "commands/apps/expressvpn/expressvpn-disconnect.applescript",
    "chars": 606,
    "preview": "#!/usr/bin/osascript\n\n# You need ExpressVPN for this script: https://www.expressvpn.com/latest#mac\n\n# Required parameter"
  },
  {
    "path": "commands/apps/expressvpn/expressvpn-reconnect.applescript",
    "chars": 634,
    "preview": "#!/usr/bin/osascript\n\n# You need ExpressVPN for this script: https://www.expressvpn.com/latest#mac\n\n# Required parameter"
  },
  {
    "path": "commands/apps/fantastical/create-event.applescript",
    "chars": 605,
    "preview": "#!/usr/bin/osascript\n\n# Install Fantastical via the Mac App Store: https://apps.apple.com/us/app/fantastical-calendar-ta"
  },
  {
    "path": "commands/apps/fantastical/create-todo-in-fantastical.applescript",
    "chars": 653,
    "preview": "#!/usr/bin/osascript\n\n# Install Fantastical via the Mac App Store: https://apps.apple.com/us/app/fantastical-calendar-ta"
  },
  {
    "path": "commands/apps/ferdi/ferdi-open-service-by-index.applescript",
    "chars": 1006,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: This script requires Ferdi to be installed: https://getferdi.com/\n\n# Required parame"
  },
  {
    "path": "commands/apps/ferdi/ferdi-open-service-by-name.applescript",
    "chars": 1366,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: This script requires Ferdi to be installed: https://getferdi.com/\n\n# Required parame"
  },
  {
    "path": "commands/apps/find-my/README.md",
    "chars": 1606,
    "preview": "# Find My Phone Raycast\n\nI lose my phone often, so I made this.\n\nThis is a Node.js script that uses Playwright to automa"
  },
  {
    "path": "commands/apps/find-my/fmp.js",
    "chars": 2522,
    "preview": "#!/usr/bin/env node\n\n// Required parameters:\n// @raycast.schemaVersion 1\n// @raycast.title Find My Phone (Auto Sound)\n//"
  },
  {
    "path": "commands/apps/find-my/package.json",
    "chars": 272,
    "preview": "{\n  \"name\": \"findmyraycast\",\n  \"version\": \"1.0.0\",\n  \"main\": \"fmp.js\",\n  \"scripts\": {\n    \"start\": \"node fmp.js\"\n  },\n  "
  },
  {
    "path": "commands/apps/focus/focus-preferences.sh",
    "chars": 446,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-start-break-5.sh",
    "chars": 446,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-start-custom-break.sh",
    "chars": 620,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-start-custom-session.sh",
    "chars": 757,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-start-session-25.sh",
    "chars": 469,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-start-session.sh",
    "chars": 453,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-stop-break.sh",
    "chars": 468,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-stop-session.sh",
    "chars": 456,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/focus/focus-toggle-focus.sh",
    "chars": 472,
    "preview": "#!/bin/bash\n\n# Note: Focus required\n# Install from: https://heyfocus.com\n\n# Required parameters:\n# @raycast.schemaVersio"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-last-unread-link.sh",
    "chars": 504,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-open-link.sh",
    "chars": 573,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-random-unread-link.sh",
    "chars": 508,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-read-list.sh",
    "chars": 486,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-save-link.sh",
    "chars": 828,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-starred-list.sh",
    "chars": 495,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-tagged-links.sh",
    "chars": 602,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-unread-list.sh",
    "chars": 492,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/goodlinks/goodlinks-untagged-list.sh",
    "chars": 498,
    "preview": "#!/bin/bash\n\n# Install GoodLinks via Mac App Store: https://apps.apple.com/app/id1474335294\n\n# Required parameters:\n# @r"
  },
  {
    "path": "commands/apps/hazeover/hazeover-set-intensity.applescript",
    "chars": 909,
    "preview": "#!/usr/bin/osascript\n\n# Install HazeOver via Mac App Store: https://apps.apple.com/gb/app/hazeover-distraction-dimmer/id"
  },
  {
    "path": "commands/apps/hazeover/hazeover-toggle-dimming.applescript",
    "chars": 656,
    "preview": "#!/usr/bin/osascript\n\n# Install HazeOver via Mac App Store: https://apps.apple.com/gb/app/hazeover-distraction-dimmer/id"
  },
  {
    "path": "commands/apps/hyper/hyper-run-shell-command.applescript",
    "chars": 1561,
    "preview": "#!/usr/bin/osascript\n\n# Note: Hyper required\n# Install via Hyper.is: https://hyper.is/\n\n# Dependency: This script requir"
  },
  {
    "path": "commands/apps/iconsur/iconsur.sh",
    "chars": 1750,
    "preview": "#!/bin/bash\n\n# Dependency: requires iconsur (https://github.com/rikumi/iconsur)\n# Install via Homebrew: `brew install ic"
  },
  {
    "path": "commands/apps/iterm/iterm-open-profile-in-new-window.applescript",
    "chars": 814,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: requires iTerm (https://iterm2.com)\n# Install via Homebrew: `brew install --cask ite"
  },
  {
    "path": "commands/apps/iterm/iterm-run-shell-command.applescript",
    "chars": 2036,
    "preview": "#!/usr/bin/osascript\n\n# Dependency: requires iTerm (https://iterm2.com)\n# Install via Homebrew: `brew install --cask ite"
  },
  {
    "path": "commands/apps/lungo/lungo-activate.sh",
    "chars": 705,
    "preview": "#!/bin/bash\n\n# Note: Lungo v2.0.4 required\n# Install via Mac App Store: https://apps.apple.com/app/id1263070803\n\n# Requi"
  },
  {
    "path": "commands/apps/lungo/lungo-deactivate.sh",
    "chars": 473,
    "preview": "#!/bin/bash\n\n# Note: Lungo v2.0.4 required\n# Install via Mac App Store: https://apps.apple.com/app/id1263070803\n\n# Requi"
  },
  {
    "path": "commands/apps/lungo/lungo-toggle.sh",
    "chars": 697,
    "preview": "#!/bin/bash\n\n# Note: Lungo v2.0.4 required\n# Install via Mac App Store: https://apps.apple.com/app/id1263070803\n\n# Requi"
  },
  {
    "path": "commands/apps/mail/copy-captcha-from-mail.py",
    "chars": 2965,
    "preview": "#!/usr/bin/env python3\n\n# Copy the verification code from Mail.\n#\n# Dependency: This script requires the `emlx` package."
  },
  {
    "path": "commands/apps/mail/copy-foreground-mail-deeplink.applescript",
    "chars": 1136,
    "preview": "#!/usr/bin/osascript\n\n# Required parameters:\n# @raycast.schemaVersion 1\n# @raycast.title Copy Foreground Mail Deeplink\n#"
  },
  {
    "path": "commands/apps/medo/add-task.sh",
    "chars": 624,
    "preview": "#!/bin/bash\n\n# Note: Medo v1.0 required\n# Install via Github Repo: https://github.com/Aayush9029/Medo\n\n# Required parame"
  },
  {
    "path": "commands/apps/medo/medo-float-large.sh",
    "chars": 470,
    "preview": "#!/bin/bash\n\n# Note: Medo v1.0 required\n# Install via Github Repo: https://github.com/Aayush9029/Medo\n\n# Required parame"
  },
  {
    "path": "commands/apps/medo/medo-float-small.sh",
    "chars": 470,
    "preview": "#!/bin/bash\n\n# Note: Medo v1.0 required\n# Install via Github Repo: https://github.com/Aayush9029/Medo\n\n# Required parame"
  },
  {
    "path": "commands/apps/medo/medo-float.sh",
    "chars": 465,
    "preview": "#!/bin/bash\n\n# Note: Medo v1.0 required\n# Install via Github Repo: https://github.com/Aayush9029/Medo\n\n# Required parame"
  },
  {
    "path": "commands/apps/meetingbar/meetingbar-create-meeting.applescript",
    "chars": 1739,
    "preview": "#!/usr/bin/osascript\n\n# Dependencies:\n# MeetingBar: https://github.com/leits/MeetingBar\n\n# Recommended installation:\n# b"
  }
]

// ... and 763 more files (download for full content)

About this extraction

This page contains the full source code of the raycast/script-commands GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 963 files (2.2 MB), approximately 617.0k tokens, and a symbol index with 202 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!