TRENDSHIFT DAILY #5 · 2026-07-24 · EGO-LITE · 사람과 AI가 나눠 쓰는 브라우저

citrolabs/ego-lite 딥다이브
— "AI 브라우저"인데, 이 저장소엔 LLM 코드가 한 줄도 없다

ego lite는 "당신과 당신의 AI 에이전트가 같은 브라우저에서 나란히(in parallel) 일하는" 것을 목표로 하는 macOS용 AI 브라우저다. 그런데 함정이 하나 있다 — 이 GitHub 저장소는 "브라우저 그 자체"가 아니다. 진짜 브라우저(Chromium을 커널 수준까지 손본 클로즈드 소스 바이너리)는 .dmg로 따로 무료 배포되고, 이 저장소에 담긴 건 Claude Code·Codex·Cursor 같은 아무 에이전트 CLI든 그 브라우저를 조종하게 해주는 "오픈소스 연결 계층(harness) + 에이전트 스킬 패키지"다.

그래서 이 저장소를 열면 놀란다. LLM API 호출도, MCP도, Playwright도 없다. 지능은 "밖의 에이전트"에게 있고, 이 저장소는 그 에이전트가 짠 자바스크립트를 브라우저 안에서 CDP(크롬 개발자 프로토콜)로 실행해줄 뿐이다. "브라우저를 사람이 클릭하는 UI가 아니라, 에이전트가 코드로 부르는 API로 노출한다"는 발상이 이 프로젝트의 전부다.

(저장소 citrolabs/ego-lite · 코어 언어 TypeScript · npm 패키지 ego-browser-v2 0.1.0 · Node ≥ 22 · ESM · 런타임 의존성 acorn 딱 1개 · 빌드 esbuild + rollup · 라이선스 MIT · 저작권 CitroLabs (2026) · ★ 47(별점 아닌 모멘텀 순위) · 최신 커밋 2026-07-24 · shallow clone 소스 직접 분석)
목차
  1. 프로젝트 한 줄 요약
  2. 왜 주목받는가 — AI 브라우저 전쟁의 제3의 길
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트
  7. 시스템 요구사항 · 빌드/실행
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한 줄 요약

"AI 브라우저"라는 말의 90%는 오해다 — 정체부터 바로잡고 시작하자

요즘 "AI 브라우저"가 쏟아진다. OpenAI의 ChatGPT Atlas, Perplexity의 Comet, The Browser Company의 Dia… 대부분 브라우저 안에 자기네 AI를 박아넣은 형태다. ego lite는 여기서 방향을 튼다. ego lite의 핵심 주장은 "우리 AI가 똑똑하다"가 아니라, "당신이 이미 쓰는 에이전트(Claude Code, Codex…)에게 진짜 브라우저를 통째로 내어준다"이다.

먼저 짚고 넘어갈 함정
이 저장소 ≠ 브라우저

저장소 ego-lite를 클론해도 "브라우저"는 없다. 개발 문서 AGENTS.md가 대놓고 말한다: "This repo contains the open-source harness and the agent skill package — not the browser itself." 진짜 브라우저는 cdn.ego.app에서 받는 클로즈드 소스 .dmg이고, 저장소엔 그 브라우저를 조종하는 도구(harness)에이전트 사용설명서(skill)만 있다.

한 줄 비유

ego lite 저장소는 "자동차"가 아니라, 로봇 기사에게 쥐어주는 "운전대·페달·매뉴얼 세트"다

진짜 자동차(브라우저 바이너리)는 회사가 따로 무료로 나눠준다. 이 저장소가 오픈소스로 공개한 건 "로봇 운전기사(=Claude Code 같은 에이전트)가 그 차를 몰 수 있게 해주는 운전대와 매뉴얼"이다. 그래서 운전기사(지능=LLM)는 저장소 안에 없다. 누구의 로봇 기사든 데려와서 이 운전대에 앉히면 된다는 게 핵심이다.

동작을 한 문장으로 압축하면 이렇다. 에이전트가 자바스크립트를 한 덩어리 짜서 ego-browser 명령의 표준입력으로 밀어넣으면 → 저장소의 하네스(harness)가 그 코드를 실행하며 page·browser·taskSpaces 같은 브라우저 조종 헬퍼를 주입하고 → 각 헬퍼는 CDP 메시지로 번역돼 클로즈드 브라우저에 전달된다. 결과(페이지 스냅샷·DOM·다운로드)는 console.log로만 에이전트에게 돌아온다.

TERM
하네스 (harness)
"마구(馬具)"라는 뜻. 소프트웨어에서는 어떤 대상을 감싸서 바깥에서 조종·실행할 수 있게 해주는 얇은 계층을 말한다. 여기서 하네스는 "에이전트가 쓴 JS ↔ 브라우저 CDP" 사이를 잇는 통역·실행기다. 지능(판단)은 없고, 받은 명령을 정확히 브라우저 동작으로 옮기는 것만 한다.
TERM
CDP (Chrome DevTools Protocol)
크롬 브라우저를 프로그램으로 원격 조종하기 위한 공식 프로토콜. 개발자도구(F12)가 브라우저와 대화할 때 쓰는 그 통로다. Page.navigate, Runtime.evaluate, Input.dispatchMouseEvent 같은 메서드를 JSON으로 주고받는다. Playwright·Puppeteer도 내부적으로 이걸 쓰는데, ego lite는 그 래퍼 없이 CDP를 직접 부른다.

2왜 주목받는가

"AI 브라우저 전쟁"과 "에이전트 스킬" 두 유행의 정확한 교집합에 서 있다

ego lite가 트렌딩에 오른 건 별점 때문이 아니다. 분석 시점 기준 별 47개, 포크 0, 커밋 34개에 불과하다. TrendShift 상위 순위의 굵은 숫자는 별 수가 아니라 "지금 얼마나 빠르게 화제가 번지는가"(모멘텀)를 뜻한다(프로젝트 규칙에도 명시). ego lite는 두 개의 뜨거운 흐름이 겹치는 지점에 정확히 자리 잡아 모멘텀을 얻었다.

ego lite의 포지셔닝은 README의 정면 비교표로 요약된다. 기존 두 진영을 각각 저격한다.

진영대표 주자결정적 약점(ego의 주장)
자동화 프레임워크Browser-Use, Vercel agent-browser에이전트 전용 브라우저를 따로 띄워야 하고 내 로그인 세션이 안 넘어간다. 게다가 에이전트와 내가 같은 탭을 두고 다툰다.
AI 내장 브라우저ChatGPT Atlas, Perplexity Comet브라우저에 박힌 자기네 내장 에이전트만 조종 가능. 내가 쓰는 Claude Code로는 못 몬다.
ego liteego lite (harness + skill)(해법) 하나의 브라우저를 사람과 임의의 에이전트가 공유. Chrome 데이터 상속, 로컬 저장, 무료.

기술적 후크도 있다. 저장소는 Vercel의 agent-browser와 비교해 복잡한 작업에서 최대 2.5배 빠르고 토큰도 크게 아낀다고 주장한다(docs/assets/ego-vs-agent-benchmark.png). 이 속도의 비결은 뒤(4장)에서 볼 "CLI를 여러 번 왕복하지 말고, 전 과정을 코드 한 덩어리로 짜서 한 번에 실행"이라는 설계에 있다. 왕복(round-trip)이 줄면 지연도, 토큰도 준다.

비유로 이해하기

왜 "코드 한 덩어리"가 빠른가? 요리사(에이전트)에게 심부름을 시킨다고 하자. "냉장고 열어" → (보고) → "계란 꺼내" → (보고) → "깨" … 이렇게 한 동작마다 전화로 확인하면 느리고 통화료(토큰)도 많이 든다. 대신 "냉장고 열고 계란 3개 꺼내 깨서 볼에 담아, 껍질 들어가면 건져내"라고 레시피를 통째로 한 번에 주면, 요리사는 알아서 끝까지 하고 결과만 보고한다. ego lite의 "한 Bash 호출 = 한 브라우저 작업" 원칙이 바로 이 레시피 방식이다.

3기술 스택 전체 지도

놀랄 만큼 얇다 — 런타임 의존성이 딱 하나뿐인 이유

이 저장소를 처음 열면 "AI 브라우저치고 너무 가벼운데?"라는 인상을 받는다. 무거운 프레임워크가 없기 때문이다. 코어는 순수 TypeScript이고, 브라우저를 조종하는 데 Playwright도 Puppeteer도 쓰지 않으며, LLM 호출 코드도 MCP도 없다. 세 겹으로 나눠 지도를 그려보자.

① 하네스 코어 (이 저장소의 심장) — package/ego-browser

항목값 (파일 기준)
npm 패키지명ego-browser-v2 · 버전 0.1.0 · bin은 ego-browser
언어코어 로직(src/**) 전부 TypeScript (소스 TS 33개, JS 7개는 사이트 스크립트·테스트)
모듈 방식"type": "module"ESM 전용, Node ≥ 22 요구
런타임 의존성단 1개: acorn ^8.16.0 (그런데 브라우저 조종용이 아님 — 아래 설명)
빌드 도구esbuild ^0.28(개별 트랜스파일) + rollup ^4.60(단일 파일 번들)
타입/포맷TS target ES2024, lib: [ES2024, DOM] · prettier · lefthook(git hook)
테스트Node 내장 러너(node --test) + node:assert/strict, 소스 옆에 *.test.mjs 코로케이트
TERM
acorn 이 하필 여기 왜? (의외의 용도)
acorn은 자바스크립트 파서다. 보통 트랜스파일러·린터가 쓴다. 그런데 ego lite에서는 브라우저 조종과 무관하다. 빌드할 때 헬퍼 함수들의 JSDoc 주석을 acorn으로 파싱해 → 런타임 help() 문서를 자동 생성하는 데 쓴다(scripts/extract-help-docs.mjs). 즉 "주석이 곧 사용자용 API 문서"라는 원칙을 코드로 강제하는 장치다. 브라우저 조종 자체는 순수 CDP라 외부 런타임 의존성이 사실상 0이다.

② 브라우저 바이너리 (저장소 밖, 클로즈드) — ego lite.app

진짜 브라우저는 Chromium을 커널 수준까지 커스터마이즈한 클로즈드 소스 macOS 앱이다. "가장 강력한 스냅샷", "Task Space(격리 컨텍스트)", "로그인 세션 상속" 같은 해자(moat)에 해당하는 기능은 전부 이 바이너리 안에 있다. 하네스는 globalThis.ego.snapshot(), globalThis.ego.sendCDPMessage(), globalThis.ego.createTaskSpace() 같은 브리지 함수로 이 능력을 빌려 쓴다.

설계 전략
오픈/클로즈드 하이브리드

커널 수준 스냅샷·세션 상속처럼 따라 만들기 어려운 핵심은 클로즈드 바이너리에 숨기고, 에이전트가 닿는 접점(하네스 + 스킬)만 MIT로 공개했다. 생태계 확산(누구나 스킬을 만들고 붙임)과 독점성(핵심 기술은 못 베낌)을 동시에 노리는 영리한 구조다.

③ 배포·생태계 인프라 — .github/, .claude-plugin/, skills/

브랜드명 혼동 주의
ego lite · ego-browser · ego-browser-v2 정리

ego lite = 사용자에게 보이는 브랜드/앱 이름. ego-browser = 에이전트가 치는 CLI 명령·스킬 이름. ego-browser-v2 = npm 패키지의 내부 이름(버전 0.1.0). 셋을 구분해 읽어야 문서가 헷갈리지 않는다.

4아키텍처 심화 분석

데이터 한 줄기가 에이전트에서 브라우저까지 흐르는 경로를 따라가 보자

전체 데이터 흐름

에이전트 CLI (Claude Code / Codex / Cursor) — 지능·판단은 여기 │ "브라우저로 이걸 해줘"라고 JS 한 덩어리를 작성 ▼ Bash: ego-browser nodejs <<'EOF' ... 에이전트가 쓴 자바스크립트 ... EOF ← 표준입력(stdin)으로 코드 주입 │ ▼ run.ts : execute(code) │ new AsyncFunction(...헬퍼이름, code) 로 감싸 1회 실행 │ ← page / browser / taskSpaces / cdp / help 를 "주입" ▼ helpers.ts (헬퍼의 단일 진실원) → driver/* (nav·pointer·keyboard·waits…) │ ▼ cdp-eval.ts / browser-runtime.ts : browserCdp() │ JSON-RPC 메시지로 변환 ▼ globalThis.ego.sendCDPMessage(payload) ← 클로즈드 브라우저 브리지 │ ▼ ego lite.app (Chromium 커스텀) : 실제 클릭·이동·스냅샷 수행 │ └──▶ 결과(스냅샷 텍스트 · DOM · 다운로드) → console.log 로만 에이전트에 반환

핵심 패턴 ① "CLI base가 아니라 Code base" — new AsyncFunction 주입

이 프로젝트의 정체성이 담긴 5줄이다. 에이전트가 넘긴 코드 문자열을 비동기 함수로 감싸서, 브라우저 조종 헬퍼들을 함수 인자로 주입한 뒤 한 번에 실행한다(src/run.ts).

// src/run.ts — 에이전트 JS를 헬퍼 주입해 한 번에 실행
const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor;
const names  = Object.keys(context);   // page, browser, taskSpaces, cdp, help ...
const values = Object.values(context);
const fn = new AsyncFunction(...names, `"use strict";\n${code}`);
await fn(...values);                    // 헬퍼가 지역변수처럼 보이는 채로 실행

헬퍼를 import하지 않는데도 에이전트 코드에서 page·browser가 전역처럼 보이는 이유가 바로 이것이다. 이름이 곧 API다. 그리고 "관찰→호출→관찰"을 CLI로 여러 번 왕복하는 대신, 예측 가능한 전 과정을 하나의 JS 블록에 담아 왕복을 없앤다 — 2장에서 본 속도·토큰 이득의 정체다. 스킬 문서(SKILL.md)는 이를 규범으로 못 박는다: "기본은 브라우저 작업 전체를 한 번의 Bash 호출로."

TERM
new AsyncFunction(...) / 코드 주입 실행
new Function("a","b","return a+b")처럼 문자열을 실제 함수로 만드는 자바스크립트 기능의 비동기 버전. ego lite는 이걸로 에이전트가 보낸 코드에 page 같은 헬퍼를 인자로 꽂아 실행한다. 강력하지만 위험한 기술이라(임의 코드 실행), 신뢰된 로컬 에이전트만 쓰는 이 맥락에서만 안전하다.

핵심 패턴 ② 자가 치유 CDP 세션 (2초 TTL 캐시)

장시간 도는 런타임에서 CDP 세션은 자꾸 끊긴다(탭 전환·페이지 이동 등). browser-runtime.ts는 세션 id를 2초만 캐싱하고, "Session not found" 류 에러를 감지하면 조용히 재부착(re-attach) 후 1회 재시도한다. 에이전트는 끊김을 눈치채지 못한다.

// src/browser-runtime.ts — 세션 잃으면 재부착 후 재시도 (요약)
try {
  return await rawCdp(method, params, session, timeoutMs);
} catch (error) {
  const lost = SESSION_LOST.test(error?.message || "");
  if (lost && !isBrowserLevel(method)) {
    invalidateSession();
    const fresh = await ensureSession();  // 새 sessionId 확보
    return rawCdp(method, params, fresh, timeoutMs);
  }
  throw error;
}

핵심 패턴 ③ "@N ref"와 스냅샷 — 에이전트가 요소를 가리키는 법

에이전트는 픽셀 좌표로 클릭하지 않는다. 대신 snapshot()이 페이지를 텍스트로 요약하면서 클릭 가능한 요소마다 @21, @34 같은 ref 번호를 붙인다. 이 번호의 정체는 backendNodeId(브라우저 내부 DOM 노드 식별자)다. 스냅샷을 새로 뜰 때마다 ref 맵을 지우고 다시 만들기 때문에, ref는 "가장 최근 스냅샷 안에서만" 유효하다. 스냅샷 계산 자체는 커널 수준 커스텀 덕에 깊게 중첩된 iframe까지 네이티브 브라우저가 처리한다(driver/observe.tsbrowserEgo().snapshot()).

핵심 패턴 ④ Task Space = "나란히(parallel)"의 실제 구현

README 태그라인의 "parallel"이 마케팅 수사가 아니라 코드로 존재한다. Task Space는 사용자 로그인 상태를 상속하는 격리 브라우징 컨텍스트(자체 탭을 가진다)이고, 각 Space에는 소유권(ownership)이 붙는다.

소유권 값의미
agent에이전트가 소유·작업 중인 공간
user사람이 쓰는 공간 — 에이전트가 함부로 claim 못 함
agentDelegatedToUser에이전트가 잠시 사람에게 제어를 넘긴 상태(로그인·결제 등)

에이전트는 자기 소유 Space에서만 일하고, 사람 소유 Space는 건드리지 않는다. 그래서 사람과 에이전트가 같은 브라우저를 쓰면서도 서로의 탭을 빼앗지 않는다. 로그인이 필요하면 handOffTaskSpace로 사람에게 넘기고, waitForAgentControl로 다시 받는다. 작업 완료(completeTaskSpace)는 브라우저 조작과 분리된 별도 Bash 호출로만 하도록 강제해, 미완 작업을 "다 됐다"고 착각하는 사고를 막는다.

5디렉토리 구조 해부

크게 세 덩어리 — 실행 패키지 · 스킬 패키지 · 생태계 매니페스트
ego-lite/ ├── README.md # 비전·비교표·벤치마크 ├── AGENTS.md # ★개발자용 아키텍처 가이드(밀도 최고, 필독) ├── CONTRIBUTING.md # 빌드/구조/테스트/4대 설계원칙 ├── LICENSE # MIT, (c) 2026 CitroLabs ├── .claude-plugin/marketplace.json # Claude Code 마켓 등록 ├── .codex-plugin/plugin.json # Codex 플러그인 등록(UI 메타) ├── .github/workflows/ # ci · quality-gates · publish-skill · purge-cache │ ├── package/ego-browser/ # ★ 실행 가능한 npm 패키지 (TS CDP 하네스) │ ├── package.json tsconfig.json │ ├── scripts/ │ │ ├── build.mjs # esbuild(개별)+rollup(번들) 파이프라인 │ │ ├── extract-help-docs.mjs # acorn으로 JSDoc→help() 추출 │ │ └── real-browser-e2e/ # 실브라우저 e2e (티켓팅 시뮬 등) │ └── src/ # ★★ 코어 런타임 │ ├── index.ts # 부트스트랩: CLI vs SDK 이중 경로 │ ├── run.ts # stdin JS 실행기 (심장) │ ├── helpers.ts # 에이전트 헬퍼 전 표면의 단일 진실원(867줄) │ ├── browser-runtime.ts # CDP 트랜스포트·세션캐시·이벤트큐·다이얼로그 │ ├── cdp-eval.ts # cdp() 원시호출 + evaluate() │ ├── element-resolver.ts # @N ref / css / role / xpath 해석(913줄) │ ├── ref-map.ts ref-state.ts # backendNodeId 기반 @N ref 맵 │ ├── state.ts env.ts format.ts output-sink.ts ego-errors.ts │ ├── help-runtime.ts http.ts video-recorder.ts │ ├── driver/ # 능력별 드라이버(전부 CDP 위) │ │ ├── nav.ts pointer.ts keyboard.ts waits.ts │ │ ├── locator.ts observe.ts(snapshot) files.ts downloads.ts │ └── learning/ # 사이트별 learnings 로딩·검증·실행 │ ├── skills/ego-browser/ # ★ 에이전트 스킬 패키지 (실제 배포물) │ ├── SKILL.md # 에이전트용 정식 사용 가이드(프롬프트 규범집) │ ├── references/install.md references/video.md │ ├── scripts/install.sh # DMG 다운로드·설치·quarantine 제거 │ ├── agents/openai.yaml # OpenAI/Codex용 에이전트 인터페이스 │ └── learnings/<site>/ # 재사용 사이트 지식팩(google, x-com) │ └── manifest.json + notes/ + tools/ + browser-tools/ │ ├── spec/agent-skills-spec.md # 에이전트 스킬 스펙 참조 └── docs/assets/ assets/ # banner·benchmark·logo 이미지

구조를 읽는 핵심 감각: package/ego-browser"실행되는 코드"(당신이 npm run build로 만드는 CLI), skills/ego-browser"에이전트에게 주는 설명서 + 사이트 지식"이다. 빌드 시 build.mjsskills/ego-browser를 최종 산출물 안으로 복사해 하나로 묶는다. 즉 코드와 문서가 한 배포물로 함께 나간다.

TERM
learnings (사이트 지식팩)
특정 사이트(예: x-com, google)에서 한 번 성공한 추출/조작 로직을 캡슐로 굳혀 재사용하는 폴더. manifest.json(도메인 매칭 + 툴 스키마) + notes/(마크다운 메모) + tools/(Node 실행) + browser-tools/(페이지 실행)로 구성. URL 진입 시 매칭되는 지식이 에이전트에 주입돼, "매번 처음부터 헤매지 않게" 한다. 에이전트가 경험을 축적하는 최소 단위다.

6학습 포인트

이 저장소 하나로 배울 수 있는, 흔치 않은 것들

기술별 배울 것

주제이 저장소에서 배울 수 있는 것
CDP 직접 제어Playwright/Puppeteer 없이 순수 CDPpage.locator·getByRole·waitForResponse 같은 고수준 API를 밑바닥부터 구현하는 법. "Playwright는 안에서 뭘 하나"를 배우는 최고의 레퍼런스.
코드 주입 실행 모델new AsyncFunction으로 외부 코드에 의존성을 주입해 실행하는 패턴. 플러그인·샌드박스·DSL 런타임 설계에 그대로 응용 가능.
자가 치유 세션TTL 캐시 + 에러 패턴 감지 + 투명 재시도로 끊기는 연결을 스스로 복구하는 법. 장수 데몬·소켓 클라이언트 설계의 정석.
에러 택소노미실패를 transient(재시도 가능) vs permanent(즉시 실패)로 분류해 wait 루프가 이에 따라 다르게 행동하게 하는 설계(element-resolver.ts). 무한 재시도/조기 포기를 동시에 막는다.
에이전트 스킬 설계SKILL.md가 단순 사용법이 아니라 "에이전트를 신뢰성 있게 행동하게 만드는 규범집"이라는 점. 프롬프트 엔지니어링을 문서로 구조화하는 실전 사례.
오픈/클로즈드 전략핵심 해자는 감추고 접점만 여는 비즈니스-아키텍처 결합. 오픈소스로 생태계를 키우면서 수익성을 지키는 현실적 설계.

실습으로 확인해볼 개념

DIRECT OBSERVATION

"이 저장소엔 정말 LLM이 없는가?" 직접 grep 해보기

클론 후 grep -ri "anthropic\|openai\|api.key\|chat/completions" src/를 돌려보라. 비교표 텍스트 몇 개 말고는 실제 API 호출이 없다는 걸 눈으로 확인하게 된다. "AI 제품"의 지능이 꼭 그 제품 안에 있으란 법은 없다는 감각을 얻는다.

TRACE THE FLOW

헬퍼 하나가 CDP 메시지로 변하는 경로 따라가기

helpers.tspage.goto()driver/nav.tscdp-eval.tsbrowser-runtime.tssendCDPMessage까지, 한 동작이 프로토콜 메시지로 번역되는 전 과정을 손으로 짚어보면 "브라우저 자동화가 실제로 어떻게 동작하는가"가 손에 잡힌다.

7시스템 요구사항 · 빌드/실행

"브라우저는 macOS 전용, 하네스는 Node 22" — 두 부분을 나눠서 이해
구성요구사항
브라우저 앱macOS 전용 (Apple Silicon arm64 / Intel x64 .dmg). Windows·Linux는 로드맵.
하네스(CLI)Node.js ≥ 22, ESM. 코어 조종 자체는 OS 독립적이지만 브라우저가 macOS라 실사용은 macOS.
화면 녹화(선택)ffmpeg 필요 (PATH 또는 EGO_BROWSER_FFMPEG_PATH).
에이전트Claude Code · Codex · Cursor 등 로컬 코딩 에이전트 CLI 중 하나.

에이전트로 바로 쓰기 (가장 흔한 시나리오)

# 스킬만 먼저 추가 — 첫 브라우저 작업 때 앱 설치를 유도한다
npx skills add citrolabs/ego-lite

# 또는 설치 스크립트로 DMG 자동 설치(+quarantine 제거+실행)
sh skills/ego-browser/scripts/install.sh

개발자로 직접 빌드 (package/ego-browser/에서)

npm run build      # esbuild + rollup → dist/out/index.js 단일 파일
npm test           # build → tsc --noEmit 타입체크 → node --test
npm run e2e        # 실브라우저 Task Space e2e

# 로컬 실행 (실제 브라우저 작업엔 ego 런타임 필요)
node dist/out/index.js <<'JS'
  await page.goto("https://example.com");
  console.log(await page.title());
JS
node dist/out/index.js --doctor   # 환경 진단
주의
하네스만으론 화면이 안 뜬다

npm run build로 CLI는 만들 수 있지만, 실제 페이지 이동·클릭은 ego lite 브라우저 바이너리(globalThis.ego)가 있어야 동작한다. 바이너리 없이 실행하면 브리지 함수가 없어 브라우저 명령이 실패한다. 테스트는 FakeEgo 더블로 브라우저 없이 돌린다.

8직접 해볼 수 있는 실습 과제

읽기만 하지 말고 손으로 — 난이도별 5개
LEVEL 1 · 입문 · 30분

저장소 클론 후 "지능 없음" 확인 + 구조 파악

git clone --depth 1로 받아 AGENTS.md를 정독하고, grep -rc "sendCDPMessage" src/, grep -ri "mcp\|anthropic" src/"조종 코드는 많고 LLM 코드는 없다"를 숫자로 확인한다. 이 저장소의 정체를 스스로 규명하는 게 목표.

LEVEL 2 · 초급 · 1~2시간

helpers.ts 표면 지도 그리기

helpers.ts에서 에이전트가 부를 수 있는 헬퍼(page.*, browser.*, taskSpaces.*)를 전부 뽑아 기능별로 분류한 표를 만든다. 각 헬퍼가 어느 driver/*.ts로 내려가는지 화살표로 잇는다. "API 표면"을 읽는 훈련.

LEVEL 3 · 중급 · 반나절

나만의 사이트 learnings 팩 만들기

skills/ego-browser/learnings/x-com을 템플릿 삼아, 좋아하는 사이트(예: Hacker News)용 manifest.json + tools/를 작성한다. [data-testid] 대신 그 사이트의 안정적 셀렉터를 찾아 evaluateAll로 목록을 추출하는 함수를 짠다. 에이전트 지식을 캡슐화하는 감각을 익힌다.

LEVEL 4 · 중상급 · 하루

CDP 미니 하네스 직접 구현

Node + chrome --remote-debugging-port로 실제 크롬에 붙어, ego lite를 흉내 낸 초소형 하네스를 만든다. Target.attachToTarget으로 세션을 얻고 Runtime.evaluatedocument.title을 읽어 출력. ego의 browser-runtime.ts가 하는 일을 축소 재현하며 CDP를 체득한다.

LEVEL 5 · 고급 · 2~3일

자가 치유 세션 + 에러 택소노미 이식

Level 4의 미니 하네스에 2초 TTL 세션 캐시transient/permanent 에러 분류를 이식한다. 탭을 강제로 닫아 "Session not found"를 유발하고, 하네스가 조용히 재부착해 작업을 이어가는지 검증한다. 끊김에 강한 자동화의 원리를 손으로 확인.

9관련 기술 심화 학습 로드맵

이 저장소를 온전히 씹어먹기 위한 4주 코스

1주차 — CDP와 브라우저 자동화의 밑바닥

Chrome DevTools Protocol 공식 문서에서 Target·Page·Runtime·Input·DOM 도메인을 훑는다. chrome --remote-debugging-port=9222로 띄우고 ws://에 직접 붙어 JSON-RPC를 주고받아 본다. 그다음 Puppeteer/Playwright 소스에서 CDPSession이 어떻게 이걸 감싸는지 비교하면, ego lite가 "왜 래퍼 없이 직접 갔는지"가 보인다.

2주차 — 코드 실행 모델과 샌드박싱

new Function/AsyncFunction, vm 모듈, 그리고 "왜 임의 코드 실행이 위험한가/언제 안전한가"를 공부한다. ego lite가 로컬·신뢰된 에이전트라는 전제 위에서만 이 패턴을 쓰는 이유를 이해한다. DSL·플러그인 런타임 설계로 시야를 넓힌다.

3주차 — 에이전트 스킬 생태계

Anthropic의 Claude Code 스킬/플러그인 구조, SKILL.md 규범, agentskills.io 스펙을 읽는다. ego lite의 marketplace.json·publish-ego-browser-skill.yml을 뜯어보며 "스킬을 만들어 여러 마켓에 배포"하는 실전 파이프라인을 재현해 본다.

4주차 — 신뢰성 있는 자동화 엔지니어링

자가 치유 세션·에러 택소노미·이벤트 큐·타임아웃/하드스톱 같은 "오래 도는 자동화가 안 죽게 하는 기술"을 모아 학습한다. browser-runtime.ts·ego-errors.ts·output-sink.ts를 교재로, 실패를 우아하게 다루는 런타임 설계를 익힌다.

10핵심 키워드 사전

이 문서에 나온 용어를 한자리에
용어
harness (하네스)대상을 감싸 바깥에서 조종·실행하게 해주는 얇은 계층. 여기선 "에이전트 JS ↔ 브라우저 CDP" 통역·실행기.
CDPChrome DevTools Protocol. 크롬을 프로그램으로 원격 조종하는 공식 JSON-RPC 프로토콜.
agent skill에이전트(Claude Code 등)에게 특정 작업 수행법을 알려주는 패키지. SKILL.md + 스크립트로 구성.
Task Space로그인 상태를 상속하는 격리 브라우징 컨텍스트. 소유권(agent/user)이 붙어 사람·에이전트 충돌을 막음.
@N ref스냅샷이 클릭 가능 요소에 붙이는 참조 번호(= backendNodeId). 최신 스냅샷 안에서만 유효.
snapshot페이지를 에이전트가 읽기 좋은 텍스트로 요약한 것. 커널 커스텀 브라우저가 iframe까지 처리.
new AsyncFunction문자열을 비동기 함수로 만들어 헬퍼를 주입해 실행하는 JS 기법. ego lite의 "코드 한 덩어리 실행"의 정체.
transient / permanent재시도 가능한 일시적 실패 vs 즉시 실패해야 하는 영구적 실패. wait 루프가 이 분류에 따라 행동.
learnings사이트별로 성공한 조작 로직을 굳혀 재사용하는 지식팩. 에이전트 경험 축적의 최소 단위.
momentum (모멘텀)TrendShift 순위의 굵은 숫자. 누적 별점이 아니라 "지금 화제가 번지는 속도".
ESMECMAScript Modules. import/export 기반 JS 표준 모듈 시스템(CommonJS의 require 대체).
오픈/클로즈드 하이브리드핵심 해자는 클로즈드로 숨기고 에이전트 접점만 오픈소스로 여는 전략.

11참고 링크

원문으로 더 파고들기