Desktop Control Default Active

Computer Use 데스크톱 자동화 — get_app_state, click, set_value, 키보드/포인터 액션. 대상에 따라 CDP(브라우저 DOM)와 Computer Use(데스크톱 앱) 사이를 라우팅하는 통합 UI 자동화 스킬입니다.

스킬 ID: desktop-control
유형: 자동 활성
플랫폼: macOS
필수: cli-jaw, Google Chrome
선택: cliclick (brew)
이 스킬은 시스템 프롬프트에 항상 주입됩니다. 수동으로 로드할 필요가 없습니다. 독립적이었던 browservision-click 스킬을 대체하며, 해당 기능들을 통합 라우팅 시스템으로 흡수합니다.

빠른 참조

실행 경로

경로조건속도예시
CDP대상이 웹 DOM (페이지 요소, 폼, 버튼)~120 ms/액션naver.com에서 버튼 클릭
Computer Use데스크톱 앱, Chrome 크롬 UI, OS 대화상자, 단축키~1200 ms/액션Finder 열기, Cmd+Tab 누르기
CDP + CUDOM 조회 + 픽셀 클릭 (Canvas, iframe, WebGL)가변DOM 참조 없는 지도 라벨 클릭

액션 클래스

클래스계약설명예시
state-readCU-00 / TX-00현재 UI 상태 읽기get_app_state("Finder"), snapshot --interactive
element-actionCU-01 / TX-01요소 참조로 클릭/상호작용click(element_index=730), click e3
value-injectionCU-02 / TX-02필드 값 직접 설정set_value(element_index=12, value="text")
keyboard-actionCU-03키 입력 또는 조합press_key(key="super+Tab")
pointer-actionCU-04원시 좌표 클릭click(x=812, y=514)
pointer-action+visionCU-05비전 기반 좌표 클릭"Play 버튼" 비전 조회 후 click(x,y)
stale-recoveryCU-06stale 경고 후 재읽기stale 시 get_app_state 재호출
secondary-actionCU-10접근성 보조 액션perform_secondary_action(el=44, action="AXShowMenu")
scroll-actionCU-11스크롤 가능한 요소 스크롤scroll(element_index=9, direction="down")
drag-actionCU-12좌표 기반 드래그drag(from_x=100, from_y=100, to_x=400, to_y=100)

인텐트 라우팅

이 스킬은 액션을 수행하기 전에 실행 경로를 결정합니다. 모든 작업의 첫 번째 줄에는 반드시 path=cdp, path=computer-use, 또는 path=cdp+cu를 선언해야 합니다.

결정 테이블

대상사용자 인텐트 예시경로액션 클래스
웹 페이지 DOM"네이버에서 foo 검색해줘"CDPelement-action
웹 페이지 DOM (읽기)"이 페이지 헤드라인이 뭐야?"CDPstate-read
데스크톱 앱 창"Finder에서 다운로드 열어줘"CUelement-action
Chrome 크롬 UI (비DOM)"오른쪽 탭으로 전환해줘"CUelement-action
네이티브 대화상자 입력"macOS 대화상자에 입력해줘"CUvalue-injection
전역 단축키"Command-Tab 눌러줘"CUkeyboard-action
임의 픽셀"(812, 514) 위치 클릭해줘"CUpointer-action
Canvas / iframe / WebGL"Play 버튼 클릭해줘 (DOM 참조 없음)"CDP+CUpointer-action+vision
DOM 조회 + 포인터 클릭"DOM으로 버튼 찾아서 커서로 클릭해줘"CDP+CUelement-actionpointer-action

해석 우선순위

  1. 명시적 선택: 메시지에 $computer-use 또는 /computer-use가 포함되면 → 즉시 Computer Use 경로. 도구를 사용할 수 없으면 precondition failed: computer-use unavailable로 중단.
  2. cli-jaw browser snapshot --interactive 참조로 대상을 지정할 수 있는가? → CDP.
  3. 비DOM 웹 위젯(Canvas, WebGL, iframe)이 get_app_state 스크린샷에 보이는가? → Computer Use click(x, y).
  4. 대상이 웹페이지 밖(앱 창, 메뉴 바, OS 대화상자)에 있는가? → Computer Use.
  5. 사용자가 직접 지정한 픽셀 좌표인가? → Computer Use pointer-action.
  6. DOM으로 위치를 찾아야 하지만 사용자가 실제 커서 클릭을 요구하는가? → Hybrid.
  7. 앱 이름이 불분명한가? → get_app_state(app) 전에 list_apps() 호출.
  8. 해당 없음 → 중단 후 needs boss follow-up: ambiguous target 보고.
get_app_state(app) | 스크린샷에서 대상이 보이는가? |-- 예 + 요소 트리에 있음 --> element_index click |-- 예 + 트리에 없음 --> click(x, y) 즉시 실행 '-- 아니오 --> 스크롤/확대/검색 후 재읽기

절대 규칙

이 규칙들은 협상 불가입니다. 이 중 하나라도 위반하면 잘못된 트랜스크립트가 생성되거나 액션이 낭비됩니다.

  1. 액션 전에 경로를 선언하라. 모든 작업의 첫 번째 줄은 반드시 path=cdp, path=computer-use, 또는 path=cdp+cu여야 합니다.
  2. 상태 우선 규칙. Computer Use는 항상 각 어시스턴트 턴의 시작에서 상호작용 전에 get_app_state(app)를 호출합니다. stale 경고 시, UI 변경 액션 후, 확신도가 떨어질 때마다 재호출합니다.
  3. 모든 의미 있는 액션은 action_class를 기록한다. 클래스: state-read, element-action, value-injection, keyboard-action, pointer-action, pointer-action+vision.
  4. 무단 폴백 금지. 필요한 경로를 사용할 수 없으면, 중단하고 어떤 전제조건이 실패했는지 보고합니다.
  5. 커서가 보였다고 주장하지 마라. 현재 빌드에서 커서 오버레이는 최선 노력(best-effort) 방식입니다.
  6. 불확실할 때는 먼저 스크린샷을 찍어라. 불확실한 상태에서 연속으로 액션을 실행하지 마십시오. 두 개의 연속 액션이 모호한 상태를 생성하면, 다음 호출은 반드시 state-read여야 합니다.
추측 전 스크린샷 (강제 규칙): 현재 상태를 100% 확신할 수 없는 경우 — 어떤 탭에 포커스가 있는지, 클릭이 성공했는지, 어떤 element_index가 대상인지 — 다음 액션 전에 반드시 get_app_state(app)를 호출하십시오. 인덱스를 추측하면 무한 수정 루프에 빠집니다. 한 번의 추가 state-read가 항상 한 번의 잘못된 클릭보다 낫습니다.

Computer Use 도구 인터페이스

Computer Use 경로는 활성 런타임을 통해 다음 도구들을 노출합니다:

도구시그니처용도
list_apps()이름을 모를 때 사용 가능한/최근 앱 검색
get_app_state(app)세션 시작 또는 갱신; 스크린샷 + 접근성 트리 반환
click(app, element_index) 또는 (app, x, y)요소 참조 또는 원시 좌표로 클릭
drag(app, from_x, from_y, to_x, to_y)좌표 기반 드래그
press_key(app, key)키 또는 조합: Return, Tab, super+c
scroll(app, element_index, direction, pages)스크롤 가능한 접근성 요소 스크롤
set_value(app, element_index, value)편집 가능한 접근성 요소의 값 설정
type_text(app, text)현재 포커스에 텍스트 입력 (먼저 포커스를 확인하세요!)
perform_secondary_action(app, element_index, action)접근성 보조 액션 실행
type_text보다 set_value를 우선 사용하세요. type_text(app, text)는 현재 포커스된 곳에 키 입력을 보냅니다 — 최신 상태에서 커서가 의도한 필드에 있음이 증명되지 않으면 취약합니다. set_value(app, element_index, value)는 특정 요소를 대상으로 합니다 — 결정적이고 안정적입니다.

CDP 경로 — cli-jaw browser

Chrome DOM으로 접근 가능한 모든 것에 사용: 페이지 텍스트, 폼 필드, 페이지 내 버튼. 웹 콘텐츠에서 Computer Use보다 10배 빠릅니다.

세션 명령어

cli-jaw browser status                         # 세션이 활성 상태인가?
cli-jaw browser start --agent                  # 헤드리스 자동화 세션
cli-jaw browser start --headless               # 수동 헤드리스 (WSL/CI/Docker)
cli-jaw browser start                          # 가시 창 (사용자 요청 시에만)
cli-jaw browser navigate "https://example.com" # URL로 이동
cli-jaw browser open "https://example.com"     # 새 탭에서 열기
cli-jaw browser tabs                           # 탭 목록

스냅샷 + 액션

cli-jaw browser snapshot --interactive   # 클릭 가능한 요소 목록 (e1, e2, ...)
cli-jaw browser click e3                 # 참조로 클릭
cli-jaw browser type e5 "query" --submit # 입력 + Enter
cli-jaw browser press Enter              # 폴백 키 입력
cli-jaw browser screenshot               # PNG 저장
cli-jaw browser text                     # 화면 텍스트 덤프
참조 ID는 매 navigate 후 초기화됩니다. 새 페이지로 이동한 후에는 반드시 스냅샷을 다시 찍으세요.

CDP 액션 클래스 매핑

명령어액션 클래스계약
snapshot, text, screenshotstate-readTX-00
click, type ... --submitelement-actionTX-01
type <ref> "value" (submit 없이)value-injectionTX-02
press Enter / press Escapekeyboard-action

전제조건

Computer Use 경로

CDP 경로

차단 조건이 실패하면 precondition failed: <name>을 보고하고 중단합니다. 절대 경로를 무단으로 전환하지 마세요.

트랜스크립트 형식

모든 액션은 구조화된 트랜스크립트에 기록됩니다. 보스가 이를 파싱하므로 — path= 줄을 생략하지 마세요.

CDP 트랜스크립트

path=cdp
url=https://example.com
action=click e3
result=ok

Computer Use 트랜스크립트

path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=730)
stale_warning=no
result=ok

하이브리드 트랜스크립트

path=cdp+cu
lookup=cli-jaw browser snapshot -> bbox of "Play"
action_class=pointer-action
action=click(x=812, y=514)
result=ok

오류 트랜스크립트

path=computer-use
app=Finder
action_class=element-action
action=click(element_index=34)
stale_warning=yes
result=error: stale element tree

Stale 복구 패턴

stale_warning=yes가 반환되면 요소 트리가 변경된 것입니다. 다음 정확한 순서를 따르세요:

  1. get_app_state(app) — 상태를 재확인하고 대상의 실제 element_index를 확인합니다.
  2. action_class=stale-recovery (CU-06)를 한 줄 메모와 함께 기록합니다 (reason=disambiguation).
  3. 새로운 element_index를 사용하여 의도한 액션을 재실행합니다.
  4. 해당 액션 후 get_app_state(app)를 한 번 더 호출하여 효과를 확인합니다.
# Stale 경고 수신
path=computer-use
app=Google Chrome
action_class=stale-recovery
action=get_app_state("Google Chrome")
stale_warning=no
result=ok (52 elements -- tree changed)

# 새 인덱스로 재시도
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=38)   # 같은 대상, 새 인덱스
stale_warning=no
result=ok
이전 인덱스로 재시도하지 마세요. 항상 먼저 상태를 재읽기하세요. 기억한 인덱스는 상태 변경 후 무효화됩니다.

Vision-Click 통합

Vision-click은 더 넓은 UI 타겟팅 문제 내의 하나의 특정 전술입니다. 레거시이며, 일반적으로 스크린샷에서의 직접 좌표 클릭으로 대체되었습니다.

결정 순서

  1. cli-jaw browser snapshot --interactive가 참조를 반환했는가? → CDP click.
  2. Computer Use를 사용할 수 있고 대상이 스크린샷에 보이는가? → click(x, y) pointer-action 직접 실행 (권장).
  3. 참조 없고 직접 좌표가 부적합 → cli-jaw browser vision-click (Codex 전용, 레거시).
# CDP vision-click (Chrome 내부, Codex 전용)
cli-jaw browser vision-click "Submit button"
cli-jaw browser vision-click "Play button" --double

# 데스크톱 vision-click (CU-05)
# 1. get_app_state(app)로 스크린샷 캡처
# 2. 비전 모델이 좌표 식별
# 3. Computer Use를 통해 click(x=vx, y=vy)
항상 참조 기반 클릭을 먼저 시도하세요. Vision-click은 토큰을 소비하고 지연을 추가합니다. 접근성 트리가 element_index를 노출하면 그것을 사용하세요.

실전 예제: Chrome → Spotify 추적

상태 우선, 요소 타겟팅, stale 복구, CDP 속도 전환을 시연하는 실제 전체 추적 예제입니다.

1. 상태 우선

path=computer-use
app=Google Chrome
action_class=state-read
action=get_app_state("Google Chrome")
stale_warning=no
result=ok (47 elements, focused tab: open.spotify.com)

2. Element-Index 타겟팅 (포커스 의존 입력이 아닌)

# 검색 입력 필드 클릭
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=12)
stale_warning=no
result=ok

# 검색 값을 결정적으로 설정
path=computer-use
app=Google Chrome
action_class=value-injection
action=set_value(element_index=12, value="Daft Punk")
stale_warning=no
result=ok

3. Stale 경고 → 복구

# 검색 결과가 비동기 로드 -- 트리 변경
path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=34)
stale_warning=yes
result=error: stale element tree

# 올바른 복구
path=computer-use
app=Google Chrome
action_class=stale-recovery
action=get_app_state("Google Chrome")
result=ok (52 elements -- tree changed)

path=computer-use
app=Google Chrome
action_class=element-action
action=click(element_index=38)   # 같은 결과, 새 인덱스
stale_warning=no
result=ok

4. 10배 속도를 위해 CDP로 전환

# 모든 대상이 DOM 노드임을 인식 -- CDP로 전환
path=cdp
url=https://open.spotify.com
action=cli-jaw browser snapshot --interactive
result=ok (ref IDs: e1..e89)

path=cdp
url=https://open.spotify.com
action=click e42   # "Shuffle Play" 버튼
result=ok
속도 비교: CDP 액션당 ~120 ms vs Computer Use 액션당 ~1200 ms. 대상이 웹 DOM이면 CDP가 한 자릿수 차이로 빠릅니다. 웹 콘텐츠에는 항상 CDP를 우선 사용하세요.

일반적인 실패 및 올바른 대응

증상올바른 보고
"커서가 안 보여요"cursor overlay is best-effort in the current build -- action=click(...) succeeded; visible cursor not guaranteed
CDP 서버 미실행precondition failed: cli-jaw serve not running. Start with 'jaw serve' and retry.
Computer Use 도구 누락precondition failed: computer-use unavailable
cli-jaw CU 앱 누락 (패키지 설치)precondition failed: /Applications/Codex Computer Use.app missing. Recover: jaw doctor --tcc --fix
액션 시 stale 경고get_app_state(app)를 재호출한 후 재시도; stale_warning=yes 기록
대상에 대한 참조 없음스크린샷에 보이면 Computer Use click(x, y) 사용. 그렇지 않으면 갭 보고.
스냅샷과 클릭 사이 탐색 드리프트스냅샷을 다시 찍고 한 번 재시도; 여전히 어긋나면 보고.
CDP 세션이 작업 중 종료precondition failed: cdp session terminated
비전 모델이 "일치 없음" 반환vision lookup failed for "<query>" -- suggest a more specific description
비GUI 작업이 여기로 라우팅됨needs boss follow-up: not GUI automation

계약 ID 참조

모든 라우팅은 내부 Computer Use 사양에 정의된 기능 계약에 매핑됩니다. 계약 이름이 필요한 경우 트랜스크립트에서 이 ID를 사용하세요.

경로계약설명
CDP state-readTX-00snapshot/text/screenshot을 통한 페이지 상태 읽기
CDP element-actionTX-01DOM 참조로 클릭/입력
CDP value-injectionTX-02submit 없이 필드 값 설정
CDP hybrid-lookupTX-03하이브리드 경로용 DOM 조회
CDP vision-lookupTX-04비전 기반 좌표 조회 (Codex 전용)
CDP error-reportTX-05CDP 오류 보고
CU state-readCU-00get_app_state 스크린샷 + 트리
CU element-actionCU-01element_index로 클릭
CU value-injectionCU-02set_value / type_text
CU keyboard-actionCU-03press_key 조합
CU pointer-actionCU-04원시 좌표 클릭
CU pointer-action+visionCU-05비전 기반 좌표 클릭
CU stale-recoveryCU-06stale 경고 후 재읽기
CU precondition-failCU-07전제조건 실패 보고
CU confirmation-promptCU-08파괴적 액션 전 확인 요청
CU transcript-summaryCU-09보스용 사후 액션 요약
CU secondary-actionCU-10접근성 보조 액션
CU scroll-actionCU-11스크롤 가능한 요소 스크롤
CU drag-actionCU-12좌표 기반 드래그

"~해줘" 사용 예시

desktop-control 스킬을 트리거하는 자연스러운 한국어 요청입니다. 라우팅 시스템은 한국어와 영어 모두 이해합니다.

예시 1 — 웹 자동화 (CDP)

"네이버에서 '서울 날씨' 검색해줘"

경로: CDP → naver.com으로 navigatesnapshot --interactive → 검색 필드에 type → 제출 click

예시 2 — 데스크톱 앱 (Computer Use)

"Finder에서 다운로드 폴더 열어줘"

경로: CUget_app_state("Finder") → 다운로드에서 click(element_index=N)get_app_state로 확인

예시 3 — Chrome 탭 전환 (Computer Use)

"크롬 탭 Gmail로 전환해줘"

경로: CUget_app_state("Google Chrome") → 접근성 트리에서 Gmail 탭 찾기 → click(element_index=N)

예시 4 — 지도 클릭 (하이브리드)

"네이버 지도에서 '스타벅스' 라벨 클릭해줘"

경로: CDP+CUget_app_state 스크린샷에 라벨이 보이지만 요소 트리에 없음 → 스크린샷 좌표에서 click(x=719, y=388) pointer-action

예시 5 — 시스템 설정 (Computer Use)

"시스템 설정에서 다크 모드 켜줘"

경로: CUlist_apps()get_app_state("System Settings") → 외관으로 이동 → 다크 모드 옵션 click

규칙: 절대 하지 말 것

관련 스킬

스킬관계
browserCDP 명령어 참조 — 이 스킬이 해당 범위를 대체합니다
screen-capture일반 macOS 스크린샷 / 웹캠 / 비디오 녹화 (변경 없음, 별도 관심사)
vision-click더 이상 자동 활성화되지 않음; 전술로 흡수됨. 저수준 레시피(NDJSON 파싱, DPR 보정)는 cli-jaw skill install vision-click으로 설치