
Pressy는 2014년 킥스타터에서 출시된 안드로이드용 액세서리로, 이어폰 잭에 꽂는 작은 버튼을 눌러 휴대전화에서 동작을 실행했다. 회사와 앱은 사라졌지만, 오픈소스 프로젝트 pressy-resurrected는 이 버튼을 애플 실리콘 맥에서 다시 쓸 수 있게 한다. 버튼 입력을 짧게 누르기·길게 누르기 등의 패턴으로 구분해 셸 명령, Apple 단축어, 음악 제어 같은 동작을 실행한다.
프로젝트 저장소는 GitHub에 있다. 제작자는 MacBook Pro M5(Mac17,2)와 macOS 27.0.1에서 시험했다고 밝히며, 3.5mm 잭에서 헤드셋을 인식하는 애플 실리콘 맥이라면 작동할 것으로 예상한다.
기본 동작은 한 번 눌러 Spotify 재생·일시정지, 두 번 눌러 다음 곡, 세 번 눌러 이전 곡으로 설정돼 있다. 0.5초간 누르면 ‘Tink’ 소리를 낸 뒤 마이크를 음소거하거나 해제한다. 짧게 누른 뒤 길게 누르는 패턴은 Raycast 색종이 효과를 실행하며, 길게 누른 뒤 짧게 누르면 맥이 “Pressy is alive”라고 말한다. Spotify를 처음 제어할 때는 접근 권한을 허용해야 한다.
기존 Pressy뿐 아니라 Klick, Mi Key 등 복제품, 4극 플러그가 달린 유선 헤드셋의 가운데 버튼도 지원한다. Spotify는 실행 중일 때만 제어하며, Apple Music, Raycast 딥링크, Apple 단축어, 키 조합, 셸 명령과 스크립트, 맥의 화면·전원·음량 관련 동작도 지정할 수 있다.
설치와 첫 실행
가장 간단한 방법은 최신 릴리스에서 pressy-<version>.pkg를 내려받아 여는 것이다. 패키지는 공증되지 않았다. 공증에는 유료 Apple Developer ID가 필요하기 때문이다. macOS가 처음 실행을 막으면 시스템 설정 > 개인정보 보호 및 보안에서 pressy 메시지 옆의 ‘그래도 열기’를 눌러 설치한다.
터미널에서 설치 스크립트를 실행할 수도 있다. 이 방법은 최신 릴리스를 내려받아 SHA-256을 확인하고 ~/.local/bin/pressy, ~/Applications/Pressy.app과 LaunchAgent를 설치한다. 기존 설정은 그대로 둔다.
curl -fsSL https://raw.githubusercontent.com/gufertum/pressy-resurrected/main/get-pressy.sh | bash
스크립트를 먼저 읽고 싶다면 다음 세 명령을 실행한다.
curl -fsSLO https://raw.githubusercontent.com/gufertum/pressy-resurrected/main/get-pressy.sh
less get-pressy.sh
bash get-pressy.sh
릴리스 ZIP을 직접 설치할 때는 릴리스 페이지에서 pressy-<version>-macos-arm64.zip을 내려받고 .sha256 파일과 비교한 뒤 압축을 푼다. 브라우저로 내려받은 파일은 격리 표시가 붙으므로 이를 제거하고 설치 스크립트를 실행한다.
xattr -dr com.apple.quarantine pressy-*/ # a browser download is quarantined, see below
pressy-*/scripts/install.sh
소스에서 설치하려면 Command Line Tools가 필요하다. 없으면 xcode-select --install로 설치한 뒤 저장소를 복제하고, 로컬 코드 서명 인증서를 한 번 만든 다음 설치한다.
git clone https://github.com/gufertum/pressy-resurrected.git
cd pressy-resurrected
make cert # once: local code-signing certificate, keeps permissions across rebuilds
make install # tests, builds, signs, installs
릴리스는 관리자의 자체 서명 인증서로 서명돼 있지만 공증되지는 않았다. curl로 내려받으면 격리 표시가 붙지 않아 Gatekeeper가 개입하지 않는다. 브라우저 다운로드에는 표시가 붙으며, 위의 xattr 명령으로 지운다. 모든 릴리스는 같은 서명을 사용하므로 업데이트 뒤에도 macOS 권한을 유지한다. 업데이트는 설치 명령을 다시 실행하면 된다.
설치 후에는 버튼을 헤드폰 잭에 꽂고 macOS가 요청할 때 pressy에 입력 모니터링 권한을 허용한다. 권한이 없으면 버튼 입력이 전달되지 않는다. 첫 실행 때 권한 요청이 나타나면 시스템 설정을 열고 개인정보 보호 및 보안 > 입력 모니터링에서 pressy를 켠다. 목록에 없으면 +를 누르고 ⌘⇧G를 눌러 ~/.local/bin/pressy를 입력한 다음 추가하고 켠다. 허용한 뒤 입력은 바로 작동하며, 약 1분 안에 에이전트가 권한을 알아채고 다시 시작한다. 기다리지 않으려면 pressy reload를 실행한다.
첫 Spotify 입력 때는 pressy가 Spotify를 제어하도록 허용해야 한다. macOS가 헤드셋을 꽂은 것으로 인식해도 소리는 스피커에, 마이크는 내장 마이크에 유지된다.
버튼 패턴과 설정
짧게 누르면 ., longPressMs 이상 길게 누르면 -로 인식한다. 기본 길게 누르기 기준은 500ms이고, 한 패턴은 최대 5회 입력을 조합한다. 패턴은 마지막 입력 뒤 기본 400ms(sequenceGapMs) 동안 새 입력이 없으면 실행된다. 설정된 패턴으로 더 이어질 수 없는 경우에는 버튼을 놓는 즉시 실행한다. .과 -만 지정하면 각 입력이 바로 반응하지만, ..도 지정하면 두 번째 입력이 이어지는지 확인하기 위해 . 실행을 400ms 기다린다.
| 누르는 방식 | 패턴 | 기본 동작 |
|---|---|---|
| 한 번 | . | Spotify 재생·일시정지 |
| 두 번 | .. | Spotify 다음 곡 |
| 세 번 | ... | Spotify 이전 곡 |
| 0.5초간 누름 | - | ‘Tink’ 소리 후 마이크 음소거 전환 |
| 짧게 누른 뒤 길게 누름 | .- | Raycast 색종이 효과(Raycast가 설치된 경우) |
| 길게 누른 뒤 짧게 누름 | -. | 맥이 “Pressy is alive”라고 말함 |
실제 입력이 어떻게 인식되는지 확인하려면 에이전트를 멈추고 pressy watch를 실행한다. 종료할 때는 Ctrl-C를 누르고 LaunchAgent를 다시 시작한다.
launchctl bootout gui/$(id -u)/li.sudo.pressy
pressy watch # prints every press with its duration and the recognised pattern; Ctrl-C to stop
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/li.sudo.pressy.plist
설정은 ~/.config/pressy/config.yaml에 저장하며, $PRESSY_CONFIG로 다른 위치를 지정할 수 있다. make install은 config.example.yaml에서 설정 파일을 만든다. 수정 후 pressy reload를 실행하면 설정을 먼저 검사하고 에이전트를 다시 시작한다. 잘못된 설정은 오류가 난 위치와 원인을 표시하며, 실행 중인 데몬은 계속 작동한다.
longPressMs: 500
sequenceGapMs: 400
restoreAudioRoute: true
actionTimeoutSeconds: 30
patterns:
".": { builtin: spotify.playpause }
"..": { shortcut: Toggle Focus }
"-": { builtin: input.togglemute }
".-": { run: "open -a 'Visual Studio Code'" }
"--": { script: ~/bin/pressy-hook.sh }
패턴은 항상 따옴표로 묶어야 한다. 따옴표 없는 -는 YAML 목록 표시로 해석된다. 값에 :, # 또는 따옴표가 들어가면 해당 값도 인용한다. 메뉴 막대 편집기는 모든 값을 따옴표로 쓴다. JSON을 쓰려면 파일명을 config.json으로 하거나 $PRESSY_CONFIG가 .json 파일을 가리키게 한다. 키와 검증 방식은 YAML과 같다.
{ "longPressMs": 500, "patterns": { ".": { "builtin": "spotify.playpause" }, "-": [{ "sound": "Tink" }, { "builtin": "input.togglemute" }] } }
pressy는 config.yaml, config.yml, config.json 중 먼저 발견되는 파일을 사용한다. pressy convert config.json config.yaml로 형식을 바꿀 수 있다. make install은 기존 config.json을 한 번 변환하며, 원본은 config.json.bak으로 보관한다. 알 수 없는 설정 키는 오류로 처리해 오타가 조용히 무시되지 않게 한다.
| 설정 키 | 기본값 | 의미 |
|---|---|---|
longPressMs | 500 | 이 시간 이상 누르면 -, 더 짧으면 .로 인식한다(100~5000). |
sequenceGapMs | 400 | 입력을 끝내는 버튼 해제 뒤 기다리는 시간(100~3000). |
restoreAudioRoute | true | 잭에 연결된 ‘헤드폰’과 ‘마이크’로 바뀐 오디오 경로를 되돌린다. |
actionTimeoutSeconds | 30 | run, script, shortcut, raycast, AppleScript 내장 동작의 자식 프로세스를 중단하기까지 기다리는 시간(1~3600). |
patterns | {} | 패턴과 동작의 대응. 동작 하나 또는 동작 목록을 지정한다. |
동작은 패턴마다 다음 중 하나를 지정한다. builtin: <name>은 내장 동작, shortcut: <name>은 정확한 이름의 Apple 단축어를 shortcuts run으로 실행한다. script: <path>는 실행 가능한 파일을 실행하며 ~를 쓸 수 있고 chmod +x가 필요하다. run: <command>는 로그인 셸 /bin/zsh -lc에서 실행해 .zprofile의 PATH를 사용한다. keys: <combo>는 cmd+shift+4, ctrl+cmd+q, opt+space, f5 같은 키 조합을 누르며 손쉬운 사용 권한이 필요하다. raycast: <deeplink>는 Raycast 딥링크를 연다. sound: <name or file>은 시스템 사운드나 오디오 파일을 재생한다.
script와 run에는 PRESSY_PATTERN 환경 변수로 패턴이 전달된다. pressy check는 단축어와 스크립트, 사운드 파일의 존재 여부와 raycast://를 처리하는 앱이 있는지 확인한다. 한 패턴에 여러 동작을 지정하면 목록에 적은 순서대로 실행한다. 사운드 재생은 시작만 시키므로 뒤 동작을 지연시키지 않는다.
키 조합의 수정자는 cmd, shift, ctrl, opt(또는 alt), fn이며 +로 이어 쓴다. 마지막 항목에는 a, 4, / 같은 문자나 return, tab, space, escape, delete, forwarddelete, 방향키, home, end, pageup, pagedown, f1~f20 같은 이름을 쓴다. + 키는 plus로 쓴다. 문자는 현재 키보드 배열을 따르므로 QWERTZ에서도 cmd+z는 실행 취소다.
내장 동작에는 Spotify·Apple Music의 재생 제어, 현재 재생 중인 앱을 대상으로 하는 시스템 미디어 키, 출력 음량과 음소거, 마이크 음소거, 다크·라이트 모드, 화면 끄기, 맥 잠자기와 화면 잠금, 화면 보호기, 스크린샷 도구, Mission Control, 깨어 있기 전환, 현재 시각 말하기가 포함된다. Spotify와 Apple Music 동작은 해당 앱이 실행 중일 때만 작동하며 앱을 실행하지 않는다. output.volumeup과 output.volumedown은 음량을 16분의 1 단계씩 조절하고, 올리기는 음소거도 해제한다. 다크 모드 변경에는 System Events 제어 권한을 한 번 허용해야 한다. 초점 모드·방해 금지 모드와 Wi-Fi는 안정적인 명령줄 인터페이스가 없으므로 단축어를 만들어 shortcut으로 실행한다. pressy actions는 내장 동작 목록을 보여준다.
메뉴 막대 앱과 명령줄
선택 사항인 Pressy.app은 메뉴 막대에 ◎ 아이콘을 표시하고 버튼을 누를 때마다 아이콘을 깜박인다. 메뉴에서 데몬 실행 여부, 입력 모니터링 권한, 버튼 연결 여부, 각 입력의 지속 시간과 인식 패턴, 실행 결과, 현재 설정을 확인할 수 있다.
‘Edit…’(⌘,)를 누르면 패턴별 페이지와 일반 설정 페이지가 열린다. 동작 유형을 고른 뒤 내장 동작 목록, 단축어 라이브러리, 파일 선택기로 고른 스크립트·사운드, 키 기록 기능, Raycast 딥링크 예시에서 값을 지정한다. ‘Test now’는 저장하지 않고 해당 패턴의 동작을 한 번 실행한다. ‘Save & apply’는 설정을 검증해 YAML 또는 JSON 파일에 쓰고 데몬을 다시 시작한다. 편집기는 파일을 자체 형식으로 다시 쓰므로 직접 추가한 주석은 사라진다.
앱은 설정 파일을 편집하고 데몬의 상태를 확인하는 역할만 한다. 로그인 시 시작되며 LaunchAgent 이름은 li.sudo.pressy.bar다. 메뉴의 ⋯에서 ‘Quit Pressy’를 선택하면 다음 로그인 때까지 앱을 종료한다.
명령줄에서 사용할 수 있는 주요 명령은 다음과 같다. pressy run은 LaunchAgent가 실행하는 데몬이고, pressy watch는 동작을 실행하지 않고 입력과 패턴을 출력한다. pressy check는 설정과 단축어 이름을 검사하고, pressy reload는 검사 뒤 LaunchAgent를 다시 시작한다. pressy trigger <pattern>은 버튼을 누르지 않고 지정한 패턴의 동작을 실행하며 종료 코드에 결과를 담는다. pressy actions는 내장 동작을 나열하고, pressy convert <in> <out>은 출력 파일 확장자에 맞춰 설정 형식을 바꾼다. 모든 명령은 --config PATH를 받는다.
종료 코드는 0 성공, 1 동작 또는 검사 실패, 64 사용법 오류, 69 헤드셋 장치가 없거나 다른 pressy가 점유, 75 권한 변경 뒤 재시작 요청, 78 설정 오류다. make install, make uninstall, make logs(로그에 tail -f 실행), make cert도 제공한다. make uninstall은 설정·로그·인증서를 보존한다.
모든 파일과 개인정보 권한 항목까지 삭제하려면 다음을 실행한다. make cert를 실행한 경우에만 인증서 삭제 명령도 실행한다.
make uninstall && rm -rf ~/.config/pressy ~/Library/Logs/pressy*.log
security delete-identity -c "pressy local signing" # only if you ran make cert
저장소를 복제하지 않고 한 줄 설치나 패키지 설치를 사용했다면 다음 스크립트로 제거한다. .pkg로 설치한 경우에만 이어지는 sudo 명령도 실행한다.
curl -fsSL https://raw.githubusercontent.com/gufertum/pressy-resurrected/main/scripts/uninstall.sh | bash
sudo rm -rf "/Library/Application Support/pressy" && sudo pkgutil --forget li.sudo.pressy # only after the .pkg
그 뒤 시스템 설정 > 개인정보 보호 및 보안 > 입력 모니터링에서 pressy를 −로 제거한다. media.*를 사용했다면 손쉬운 사용 목록에서도 제거한다.
권한과 서명
macOS는 각 권한을 한 번 요청하며 설정 화면의 항목 이름은 모두 pressy다. 입력 모니터링은 버튼 입력에 항상 필요하고 첫 실행 때 요청한다. 자동화 권한은 spotify.*, music.*, appearance.*를 처음 실행할 때 필요하다. 손쉬운 사용 권한은 설정에 keys 또는 media.*가 있을 때 시작 과정에서 필요하다. 입력 모니터링이 없어도 pressy가 버튼 장치를 열 수는 있지만 입력값은 전달되지 않는다.
Spotify나 Music 제어 권한을 거부했다면 개인정보 보호 및 보안 > 자동화 > pressy에서 해당 앱을 켠다. keys와 media.*는 손쉬운 사용 목록에서 pressy를 켠 뒤 pressy reload를 실행한다.
macOS는 권한 허용을 실행 파일의 코드 서명과 연결한다. make cert로 로컬 인증서를 한 번 만들면 모든 빌드가 같은 신원으로 서명돼 make install 뒤에도 권한이 유지된다. 인증서가 없으면 빌드마다 임시 서명이 달라진다. 시스템 설정의 기존 스위치는 켜져 있어도 새 빌드에 적용되지 않으며, 로그에는 input_monitoring=denied가 기록되고 macOS가 다시 묻지 않을 수 있다.
오래된 권한을 고치거나 임시 서명에서 인증서 서명으로 옮길 때는 입력 모니터링에서 pressy를 −로 제거한다. +를 누르고 ⌘⇧G로 ~/.local/bin/pressy를 찾아 추가한 다음 다시 켠다. 입력은 즉시 작동하고, 약 1분 안에 pressy가 재시작한다. tccutil reset은 Launch Services에 등록된 앱만 알기 때문에 독립 실행 파일인 pressy에는 이 방법을 쓸 수 없다.
make cert는 scripts/make-signing-cert.sh를 실행한다. 로그인 키체인에 10년 유효한 자체 서명 신원 pressy local signing을 만든다. 이 인증서는 신뢰 설정에 추가되지 않으며, 키는 codesign만 사용할 수 있다.
로그는 ~/Library/Logs/pressy.log에 이벤트당 한 줄로 기록된다. 다음은 오디오 경로 복구, 입력 인식, Spotify 동작 성공과 스크립트 실행 실패가 남는 형식의 예다.
2026-10-17T12:27:17.816+0200 INFO audio route restored role=output from="External Headphones" to="MacBook Pro Speakers" 2026-10-17T12:30:02.114+0200 INFO press ms=182 2026-10-17T12:30:02.517+0200 INFO pattern pattern=. action="builtin spotify.playpause" 2026-10-17T12:30:02.601+0200 INFO action done pattern=. action="builtin spotify.playpause" ms=84 output="" 2026-10-17T12:31:10.020+0200 ERROR action failed pattern=-- action="run \"~/bin/pressy-hook.sh\"" ms=12 exit=127 output="zsh:1: no such file or directory: /Users/you/bin/pressy-hook.sh"
지원 범위와 한계
pressy는 헤드폰 잭이 Pressy와 유선 헤드셋을 구분하지 못한다는 제약이 있다. 실행 중에는 실제 유선 헤드셋의 가운데 버튼도 pressy가 받으며, restoreAudioRoute가 실제 유선 헤드폰의 소리 경로까지 바꿀 수 있다. 유선 헤드폰을 쓸 때는 "restoreAudioRoute": false로 설정하거나 에이전트를 멈춘다. 내장 잭만 지원하며 USB-C 헤드셋 어댑터는 지원하지 않는다. 데몬이 꺼져 있을 때 입력은 사라지고, 실패한 동작은 로그에 남지만 재시도하지 않는다.
문제가 생기면 로그와 권한 상태를 확인한다. 입력 모니터링이 허용되지 않았다는 로그가 있으면 개인정보 보호 및 보안에서 권한을 켠다. 스위치가 켜져 있는데 input_monitoring=denied가 표시되면 이전 빌드의 권한일 수 있으므로 pressy를 제거한 뒤 다시 추가한다. make cert는 이런 문제를 예방한다. 버튼을 눌렀을 때 Music이 열리거나 Spotify가 저절로 바뀌면 데몬이 실행 중인지 launchctl print gui/$(id -u)/li.sudo.pressy와 로그로 확인한다. held by another process가 나오면 에이전트를 먼저 멈춘 뒤 pressy watch를 실행한다. Spotify가 반응하지 않으면 Spotify가 실행 중인지, 자동화 권한이 켜져 있는지 확인한다. 버튼을 꽂은 뒤 소리가 나지 않으면 로그에 audio route restored가 있는지, restoreAudioRoute가 true인지 확인한다.
동작 원리
Pressy는 4극(TRRS) 플러그에 달린 수동 버튼이다. 잭에 꽂으면 헤드셋 마이크처럼 보이고, 누르면 마이크 선을 접지한다. 이는 유선 헤드셋의 가운데 버튼과 같은 방식이다. 안드로이드 헤드셋 잭 규격은 70Ω 이하에서 버튼을 감지한다.
애플 실리콘 맥에서는 Cirrus Logic CS42L84 코덱이 잭을 구동한다. 코덱의 인라인 리모컨 디코더는 Apple이 ‘Mikey’라고 부르는 내장 HID 장치다. 버튼 입력은 소비자 페이지의 HID 사용값 0x0C/0xCD(재생·일시정지)로 전달된다. 누르는 동안 값은 1, 놓으면 0이다. 제작자가 Pressy에서 측정한 짧은 입력은 106~255ms였고, 더블 클릭 사이 간격은 약 150ms였다. 길게 누르면 자동 반복 없이 1 상태가 유지된다. 가로채지 않으면 macOS는 이를 시스템 재생·일시정지 키로 처리해 재생 중인 앱을 제어하거나 Music을 연다.
pressy는 kIOHIDOptionsTypeSeizeDevice로 Headset 장치를 독점적으로 연다. 따라서 입력은 윈도 서버에 전달되지 않아 잭 버튼이 음악을 저절로 바꾸지 않고, 키보드의 미디어 키는 계속 작동한다. 이 방식에는 이벤트 탭이나 손쉬운 사용 권한이 필요하지 않지만 입력 모니터링 권한은 필요하다. 권한이 없으면 장치를 오류 없이 열어도 입력값을 받지 못한다. 한 번에 한 프로세스만 장치를 점유할 수 있어 두 번째 pressy는 kIOReturnExclusiveAccess(0xE00002C5) 오류를 낸다.
버튼을 놓을 때 누른 시간이 짧은지 긴지 판정해 점이나 대시를 붙인다. 현재 입력으로 시작하는 설정 패턴이 있으면 sequenceGapMs만큼 다음 입력을 기다리고, 더 이어질 패턴이 없으면 바로 실행한다. 같은 방향으로 반복된 HID 이벤트는 무시해 중복 보고가 가짜 입력을 만들지 않게 한다. 시간 계산에는 pressy가 이벤트를 처리한 시각이 아니라 HID 이벤트 타임스탬프를 사용한다.
버튼을 꽂으면 macOS는 새 오디오 장치를 만들고 기본 장치로 설정한다. pressy는 최근 5초 안에 나타난 잭 장치로의 전환만 되돌린다. 나중에 사용자가 직접 ‘External Headphones’를 선택한 경우에는 그대로 둔다. 이미 Pressy가 꽂힌 상태에서 시작하면 내장 스피커(ispk)와 내장 마이크(imic)로 되돌린다. 장치는 현지화된 이름이 아니라 데이터 소스 코드로 식별한다.
동작 실행은 run, script, shortcut, spotify.*, music.*의 경우 zsh -lc, shortcuts run, osascript 등의 자식 프로세스를 시작하고 버튼 처리를 막지 않는다. 각 동작에는 시간 제한이 있으며 종료 코드, 실행 시간, 출력 마지막 300바이트를 로그에 남긴다. output.*과 input.togglemute는 CoreAudio에 직접 접근한다. media.*는 시스템 미디어 키 이벤트를 보낸다. 현재 macOS에서는 더 깔끔한 MediaRemote API가 제3자 프로세스에 응답하지 않는다고 프로젝트는 설명한다.
데몬과 메뉴 막대 앱은 로그인 세션의 분산 알림으로 통신한다. 알림 이름과 키는 Events.swift에 정의돼 있다. 이벤트는 대기열에 저장되지 않으므로 앱이 열릴 때 데몬에 ping을 보내 현재 상태를 요청한다. 편집기와 데몬은 PressyCore를 공유하므로 편집기도 데몬과 같은 설정 검증을 수행한다.
저장소의 구성은 다음과 같다. Sources/PressyCore/에는 PatternRecognizer, 엄격한 YAML·JSON 검증을 담당하는 Config, 편집기 모델 ConfigDraft, KeyCombo, BuiltinAction, AudioRoutePolicy, 데몬과 앱 사이 계약인 PressyEvent가 있다. Sources/PressyBar/에는 SwiftUI MenuBarExtra 앱과 설정 편집기가, Sources/pressy/에는 IOKit HID 입력 처리, CoreAudio 장치 관리, 동작 실행기, 로그, CLI가 있다. Support/Info.plist는 바이너리에 연결돼 개인정보 설정에 쓰이는 번들 ID li.sudo.pressy를 제공한다. scripts/에는 설치·제거와 LaunchAgent 생성, 서명 인증서 스크립트가 있고, Tests/PressyCoreTests/에는 세 핵심 유형에 대한 swift-testing 테스트가 있다.
개발에는 Swift 6 언어 모드를 사용하며 YAML 읽기에는 Yams 하나만 의존한다. Command Line Tools만으로 빌드할 수 있도록 Makefile이 swift-testing 플러그인 경로를 추가한다. 앱은 macOS 27 SDK의 @State 매크로 플러그인이 Xcode에만 포함된 문제를 피하려고 SwiftUI.State를 감싼 @Local을 사용한다.
make test # swift test; with only the Command Line Tools it adds the swift-testing plugin path
make build # release build in .build/release/pressy
make release # dist/pressy-<version>-macos-arm64.zip and .pkg, each with .sha256, programs signed with the local certificate
make screenshots # docs/images/*.png, rendered by the app itself with demo data (light and dark)
.build/release/pressy trigger .. --config config.example.yaml # try an action without the button
부록: 원문 예시
원문에 실린 예시 1
INFO input monitoring granted, restarting exit=75 INFO start version=0.1.0 ... input_monitoring=granted
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요