name: mj-live-browse description: | agent-browser CLI로 Chrome Beta CDP에 연결해 실제 로그인된 브라우저에서 웹 작업을 자동 수행하는 스킬. 트리거: "브라우저로 해줘", "사이트에서 처리해줘", "클릭해줘", "입력해줘", "업로드해줘", "페이지 봐줘". 자동으로 의존성 체크/설치, Chrome Beta 실행, CDP 연결, 탭 선택까지 처리한다. 고정 프로필($HOME/.chrome-beta-live-profile)에 저장된 로그인 세션을 그대로 이어받는다.
AI 라이브 브라우저 제어 (자율 실행 버전)
브라우저 제어는 agent-browser를 기본 도구로 사용한다. (iframe 등 미지원 케이스에서만 playwright-cli 보조)
사용자가 자연어로 웹 작업을 요청하면 아래 부트스트랩 절차를 자동 실행하고 곧바로 작업에 들어간다.
사용자에게 탭 번호나 실행 여부를 묻지 않는다. 단, 결제·계정 삭제·돌이킬 수 없는 상태 변경 직전에는 한 번 확인한다.
고정 프로필:
$HOME/.chrome-beta-live-profile(변경 금지). 이 프로필에 사용자가 미리 로그인해 둔 세션을 AI가 이어받는다.
자동 부트스트랩 (작업 시작 시 항상 실행)
아래 한 블록을 그대로 실행하면 의존성 설치 → Chrome Beta 실행 → CDP 확인까지 끝난다.
macOS에서는 Chrome Beta 바이너리를
nohup ".../Google Chrome Beta"로 직접 실행하지 않는다. 직접 실행하면 GUI 프로세스가 잠깐 뜬 뒤 종료되고,agent-browser가 임시 headless Chrome 세션으로 빠질 수 있다. 반드시open -na "Google Chrome Beta" --args ...로 앱 런처를 통해 실행한다.
# 1) agent-browser 설치 확인 / 자동 설치
if ! command -v agent-browser >/dev/null 2>&1; then
echo "📦 agent-browser 설치 중..."
npm i -g agent-browser
fi
# 2) Chrome Beta CDP(9222) 살아 있는지 확인 / 없으면 GUI 앱으로 실행
if ! curl -s --max-time 1 http://127.0.0.1:9222/json/version >/dev/null 2>&1; then
echo "🚀 Chrome Beta 실행 중..."
# 이전에 Chrome Beta가 비정상 종료되며 남긴 stale profile lock만 제거
lock="$HOME/.chrome-beta-live-profile/SingletonLock"
if [ -L "$lock" ]; then
lock_target="$(readlink "$lock" 2>/dev/null || true)"
lock_pid="${lock_target##*-}"
if [ -n "$lock_pid" ] && ! ps -p "$lock_pid" >/dev/null 2>&1; then
rm -f "$HOME/.chrome-beta-live-profile/SingletonLock" \
"$HOME/.chrome-beta-live-profile/SingletonSocket" \
"$HOME/.chrome-beta-live-profile/SingletonCookie"
fi
fi
/usr/bin/open -na "Google Chrome Beta" --args \
--remote-debugging-port=9222 \
"--remote-allow-origins=*" \
"--user-data-dir=$HOME/.chrome-beta-live-profile" \
--no-first-run \
--no-default-browser-check
# CDP 깨어날 때까지 폴링 (최대 10초)
for i in 1 2 3 4 5 6 7 8 9 10; do
if curl -s --max-time 1 http://127.0.0.1:9222/json/version >/dev/null 2>&1; then break; fi
sleep 1
done
fi
# 3) 반드시 Beta CDP에 붙는지 확인
agent-browser --cdp 9222 tab list
Windows(Git Bash)는
"/c/Program Files/Google/Chrome Beta/Application/chrome.exe"경로로 대체. 이후 모든agent-browser명령은 기본 세션에 의존하지 말고agent-browser --cdp 9222 ...형태로 실행한다.agent-browser connect 9222만 호출한 뒤--cdp없이 명령하면, 9222가 죽었을 때 임시 headless Chrome으로 빠질 수 있다.
자동 탭 선택 규칙
부트스트랩 직후 agent-browser --cdp 9222 tab list로 탭을 가져와 아래 우선순위로 AI가 직접 선택한다 (사용자에게 묻지 않음).
- 사용자가 URL/도메인을 명시했고, 그 도메인에 매칭되는 탭이 있으면 → 그 탭 사용 (
tab N) about:blank탭이 있으면 → 그 탭 재활용 후open URL- 탭이 하나뿐이면 → 그 탭에
open URL - 위에 해당 없으면 →
tab new "URL"로 새 탭
선택 직후에는 반드시 다음을 실행해 의도한 페이지인지 확인한다:
agent-browser --cdp 9222 eval "document.title + ' | ' + location.href"
다르면 다시 navigate. 사용자에게 먼저 묻지 않는다.
작업 수행 패턴
데이터 조회 (eval 우선 — 빠르고 토큰 절약)
agent-browser --cdp 9222 eval "document.title"
agent-browser --cdp 9222 eval "document.querySelector('#field').value"
agent-browser --cdp 9222 eval "JSON.stringify(Array.from(document.querySelectorAll('li.item')).map(el=>el.innerText))"
agent-browser --cdp 9222 eval "document.body.innerText.substring(0, 2000)"
eval은 단순 표현식만. IIFE
(function(){...})()금지 — 직렬화 오류. 동작이 여러 개면 eval을 나눠 호출.
클릭/입력 (셀렉터 모를 때 snapshot)
# 인터랙티브 요소만 + 컴팩트 (필수 옵션)
agent-browser --cdp 9222 snapshot -i -c
agent-browser --cdp 9222 snapshot -i -c -s "form" # 범위 제한
# ref 기반 조작 (DOM 바뀌면 무효 → 다시 snapshot)
agent-browser --cdp 9222 click e10
agent-browser --cdp 9222 fill e37 "검색어"
agent-browser --cdp 9222 press Enter
eval로 click()은 isTrusted:false — 보안 폼/SPA에서 무시될 수 있음. 안 되면 snapshot → ref click. 전체 snapshot 금지 (~65k 토큰). 항상
-i -c.
Angular/React에서 fill 후 버튼이 [disabled]면
agent-browser --cdp 9222 eval "document.querySelector('#input').dispatchEvent(new Event('input', {bubbles:true}))"
# 그래도 안 되면 change 이벤트도 발행
상세: references/SPA-프레임워크-입력패턴.md
iframe 내부 접근 (agent-browser 미지원 → playwright-cli)
playwright-cli --config="$HOME/.playwright/cli.config.json" eval \
"document.querySelector('iframe[src*=대상]').contentDocument.querySelector('#x').innerText"
config 자동 생성:
if [ ! -f "$HOME/.playwright/cli.config.json" ]; then
mkdir -p "$HOME/.playwright"
echo '{"browser":{"cdpEndpoint":"http://localhost:9222","isolated":false}}' > "$HOME/.playwright/cli.config.json"
fi
Flutter 웹앱 (canvas/flt-semantics)
document.body.innerText가 빈값/"로딩 중"이면 Flutter 의심. UI 조작 대신 dart.js 분석 → fetch 직접 호출이 압도적으로 효율적.
상세: references/Flutter-웹앱-패턴.md
파일 업로드 (OS 다이얼로그 차단)
agent-browser --cdp 9222 click은 isTrusted:true라 다이얼로그가 뜬다. 미리 CDP Page.setInterceptFileChooserDialog로 가로챈 뒤 setFileInputFiles(backendNodeId) 주입.
상세: references/SPA-프레임워크-입력패턴.md §3.
마무리
작업을 정상 완료하고 결과를 확인한 뒤에는 사용한 Chrome Beta CDP 브라우저를 자동 종료한다. 사용자에게 결과를 텍스트로 요약 보고할 때 브라우저 종료 여부도 함께 포함한다.
pkill -f "Google Chrome Beta.*--remote-debugging-port=9222" || true
단, 로그인/2차 인증/캡차/사용자 확인 대기처럼 작업이 아직 완료되지 않은 상태에서는 닫지 않는다. 사용자가 후속 확인을 마친 뒤 이어서 작업할 수 있도록 Chrome Beta를 유지한다.
종료 확인이 필요하면:
if curl -s --max-time 1 http://127.0.0.1:9222/json/version >/dev/null 2>&1; then
echo "Chrome Beta CDP still running"
else
echo "Chrome Beta CDP closed"
fi
안전 가드
자율 실행이지만 아래는 멈추고 사용자 확인:
- 결제 버튼 클릭 직전 (장바구니 담기/조회는 OK, 최종 결제만 확인)
- 계정 삭제/탈퇴/비밀번호 변경 직전
- 돌이킬 수 없는 데이터 삭제 직전
- 로그인이 안 된 상태에서 로그인 시도 — AI가 직접 로그인하지 않음. 사용자에게 "고정 프로필에 로그인해 주세요" 안내 후 대기.
- 2차 인증/캡차 — 사용자에게 처리 요청 후 대기.
그 외(조회·검색·필터·페이지 이동·폼 작성·자동완성·집계 등)는 묻지 않고 진행한다.
핵심 규칙 (요약)
- 부트스트랩 블록을 매번 실행 (이미 떠 있으면 빠르게 통과).
- 탭은 AI가 자동 선택, 단 선택 직후
eval document.title로 확인. - 모든
agent-browser명령은--cdp 9222를 붙여 Chrome Beta에 직접 실행. - 조회는 eval 우선, 클릭/입력은 ref(snapshot) 우선.
- snapshot은
-i -c필수. - eval은 단순 표현식만, 여러 동작은 나눠 호출.
- ref는 DOM 바뀌면 무효 → 재 snapshot.
- iframe → playwright-cli, Flutter → API 직접 호출 검토.
- screenshot + 이미지 Read 금지(토큰 폭발). 텍스트는
body.innerText.substring으로 추출. - 정상 완료 후 Chrome Beta CDP 브라우저 자동 종료.
- 결제/탈퇴/삭제 직전만 확인.
참조 문서
| 문서 | 용도 |
|---|---|
references/SPA-프레임워크-입력패턴.md |
Angular/React 이벤트 발행, 파일 업로드 CDP 인터셉트 |
references/iframe-모달-패턴.md |
jQuery UI Dialog + iframe |
references/Flutter-웹앱-패턴.md |
Flutter 판별 / API 직접 호출 |
references/native-dialog-주의사항.md |
alert/confirm 자동 dismiss 이슈 |
references/외부서비스-링크전환-패턴.md |
외부 서비스 전환 fallback |
references/토큰-최적화-실측데이터.md |
명령별 토큰 비용 |