본문으로 건너뛰기
cccskills
무료GitHub에 공개

cmux-browser

Automate browsing in cmux panels without taking focus away from current work. Target a specific panel to open pages, fill forms, click controls, wait for page changes, extract content, and inspect download history.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

원문원문 설명 보기

End-user browser automation with cmux. Use when you need to open sites, inspect or interact with browser surfaces, wait for page state, and extract data without stealing focus.

설치 방법 보기

이럴 때 유용합니다

  • Open and inspect sites without changing focus
  • Fill forms and check the result
  • Extract page text or HTML
  • Check download history and saved paths

포함된 파일(13)

  • SKILL.md10.9 KB
  • AGENTS.md821 B
  • agents/openai.yaml442 B
  • references/authentication.md4.9 KB
  • references/commands.md8.5 KB
  • references/proxy-support.md800 B
  • references/session-management.md2.4 KB
  • references/snapshot-refs.md1.2 KB
  • references/surface-discovery.md4.0 KB
  • references/video-recording.md995 B
  • templates/authenticated-session.sh733 B
  • templates/capture-workflow.sh491 B
  • templates/form-automation.sh468 B

SKILL.md(원문)

설치하기 전에 에이전트에게 전달되는 지시 내용을 확인할 수 있습니다.

Browser Automation with cmux

Read the CLI contract first

Check the binary that will actually run before giving an exact command:

cmux browser --help
cmux --version

There are two deliberately different command shapes:

  • Create a browser surface with open, open-split, or new. These commands may be workspace-scoped and do not need a surface handle.
  • Use an existing surface with every surface-bound navigation, inspection, interaction, tab, state, or diagnostic command. Pass the handle explicitly with --surface <handle> or as the first positional token.

Prefer the flag form in scripts because it makes the target unmissable:

SURFACE="surface:7" # use a ref returned by discovery; do not guess an index
cmux browser --surface "$SURFACE" get url
cmux browser --surface "$SURFACE" get-url       # accepted alias
cmux browser --surface "$SURFACE" snapshot --interactive
cmux browser --surface "$SURFACE" snapshot -i   # accepted alias
cmux browser --surface "$SURFACE" url            # accepted alias
cmux browser --surface "$SURFACE" tab list
cmux browser --surface "$SURFACE" click e1 --snapshot-after

The positional form is equivalent (cmux browser "$SURFACE" get url). url and get-url are accepted URL aliases, and the short interactive snapshot flag is accepted when a surface is already present; use get url and snapshot --interactive in new documentation so the target and operation are clear. Surface-bound operations have no unscoped form. The current CLI's explicitly global browser verbs (open, open-split, new, identify, import, profile, profiles, react-grab, reactgrab, devtools, dev-tools, focus-mode, design-mode, zoom, and history) may omit the handle and use caller/workspace routing; do not infer a target from visible focus for any other verb.

Find an existing browser surface without changing focus

identify, tree, and list commands are read-only and do not select a workspace, pane, or browser. Do not infer that the visually focused surface is the one the user wants.

First inspect the caller context (useful for the default workspace):

cmux identify --json

To discover browser surfaces in the caller or another workspace/window, use the all-window tree. It includes parent refs, so a browser in a different workspace can be targeted directly without selecting that workspace:

cmux tree --all --json \
  | jq -r '
      .windows[]? as $window
      | $window.workspaces[]? as $workspace
      | $workspace.panes[]? as $pane
      | $pane.surfaces[]?
      | select(.type == "browser")
      | [$window.ref, $workspace.ref, $pane.ref, .ref]
      | @tsv'

The filtered output is window, workspace, pane, and surface refs. Keep the surface ref, then target it explicitly:

SURFACE="surface:N" # copied from the filtered tree output
cmux browser --surface "$SURFACE" get url
cmux browser --surface "$SURFACE" snapshot --interactive

If the user gives a URL or title instead of a workspace/pane, match that metadata locally and emit only the unique surface ref. This never prints the matched URL or title:

MATCH_FIELD="url" # use "title" when matching a page title
MATCH_VALUE="${BROWSER_URL_OR_TITLE:?set BROWSER_URL_OR_TITLE without logging it}"
SURFACE="$(
  cmux tree --all --json |
    jq -r --arg field "$MATCH_FIELD" --arg value "$MATCH_VALUE" '
      [
        .windows[]? as $window
        | $window.workspaces[]? as $workspace
        | $workspace.panes[]? as $pane
        | $pane.surfaces[]?
        | select(.type == "browser")
        | select((if $field == "url" then (.url // "") else (.title // "") end) == $value)
        | .ref
      ] as $matches
      | if ($matches | length) == 1 then $matches[0]
        elif ($matches | length) == 0 then error("no matching browser surface")
        else error("multiple matches; use workspace/pane context")
        end'
)"
if [[ -z "$SURFACE" ]]; then
  printf '%s\n' 'no uniquely matching browser surface; provide workspace/pane context' >&2
  exit 1
fi
cmux browser --surface "$SURFACE" get url

For one known workspace, cmux --json list-pane-surfaces --workspace <workspace> is a smaller read-only query. Raw tree/list payloads can contain page URLs and titles; filter or redact them before logging or pasting them. Never use a focus/select command merely to discover a surface.

Core workflow

Open (or create) a surface without stealing focus, capture the returned ref, then use that ref for every existing-surface operation:

OPEN_JSON="$(cmux --json browser open https://example.com --focus false)"
SURFACE="$(printf '%s' "$OPEN_JSON" | jq -r '.surface_ref // .surface_id // empty')"
[ -n "$SURFACE" ] || { printf '%s\n' 'browser open did not return a surface ref' >&2; exit 1; }
cmux browser --surface "$SURFACE" get url
cmux browser --surface "$SURFACE" wait --load-state complete --timeout-ms 15000
cmux browser --surface "$SURFACE" snapshot --interactive
cmux browser --surface "$SURFACE" fill e1 "hello"
cmux browser --surface "$SURFACE" click e2 --snapshot-after
cmux browser --surface "$SURFACE" snapshot --interactive

After a browser download finishes, inspect the same surface's bounded history without opening the file or consuming a waiter:

cmux browser --surface "$SURFACE" download list
cmux browser --surface "$SURFACE" download list --limit 5 --json

The JSON records expose the stable download_id, filename, actual saved path when known, status (downloading, saved, or failed), byte count when known, and whether a known path still exists. Listing is newest first and repeatable; it remains scoped to the requested surface. Use download wait to keep the existing event-wait workflow.

The open response contains the new surface ref; in a script, extract it from the JSON response instead of printing the full response. If get url is empty or about:blank, navigate first instead of waiting on load state. Re-snapshot after navigation, modal open/close, or any major DOM change because refs go stale.

Wait

cmux browser --surface "$SURFACE" wait --selector "#ready" --timeout-ms 10000
cmux browser --surface "$SURFACE" wait --text "Success" --timeout-ms 10000
cmux browser --surface "$SURFACE" wait --url-contains "/dashboard" --timeout-ms 10000
cmux browser --surface "$SURFACE" wait --load-state complete --timeout-ms 15000
cmux browser --surface "$SURFACE" wait --function "document.readyState === 'complete'" --timeout-ms 10000

Viewport sizing (WKWebView)

cmux browser --surface "$SURFACE" viewport <width> <height> sets an exact logical viewport from 1 to 4096 CSS pixels. The page is aspect-fitted inside its existing pane, so pane layout and focus stay unchanged, and screenshots use the requested logical dimensions. viewport reset returns to native pane sizing.

Close or detach the browser inspector first: its inspector-managed split layout cannot be combined with viewport emulation, and opening or redocking an attached inspector resets emulation to native sizing. Large viewport and page-zoom combinations are bounded; the command returns structured maximum_page_zoom details and leaves the viewport unchanged when the combination exceeds WKWebView render limits.

Limits (WKWebView)

Trace/screencast recording, network route interception/mocking, and low-level raw input injection return not_supported; they depend on Chrome/CDP-only APIs. Use click, fill, press, scroll, wait, and snapshot instead. geolocation <lat> <lon> and offline true|false work: pages get the given position without a permission prompt, and offline mode blocks http(s) and ws(s) loads and reports navigator.onLine === false.

Troubleshooting js_error

Some complex pages reject the JavaScript behind snapshot --interactive and eval. Recover by checking whether the page actually navigated, then fall back to raw text or HTML:

cmux browser --surface "$SURFACE" get url
cmux browser --surface "$SURFACE" get text body
cmux browser --surface "$SURFACE" get html body

If it still fails, navigate to a simpler intermediate page and retry from there. If the CLI and this skill disagree, refresh help (cmux browser --help) and refresh the installed skill before continuing; do not invent an implicit target.

Skill distribution and refresh

The repository copies are the source of truth: .claude/skills/cmux-browser and .agents/skills/cmux-browser point at skills/cmux-browser. Do not edit a mirror by hand. The supported Vercel installer (pinned here to the reviewed skills 1.5.23 release) refreshes both global Claude Code and Codex discovery roots and copies the complete skill (including references and templates):

# From this checkout while developing the skill:
npx --yes skills@1.5.23 add . --global --yes --skill cmux-browser --agent claude-code codex --copy

# From the published repository after the change is merged:
npx --yes skills@1.5.23 add manaflow-ai/cmux --global --yes --skill cmux-browser --agent claude-code codex --copy

Restart an agent session after a refresh if it cached the previous document. The repository's skills.sh remains available for a Codex-only destination; pass its --dest explicitly when that is the installation path:

./skills.sh --dest "$HOME/.codex/skills" --skill cmux-browser

Never commit home-directory skill copies, credentials, cookies, or saved browser state.

Deep-dive references

ReferenceWhen to Use
references/surface-discovery.mdFind and target an existing browser surface without focus changes
references/commands.mdFull command mapping, aliases, agent-browser equivalents, viewport error codes
references/snapshot-refs.mdRef lifecycle and stale-ref troubleshooting
references/authentication.mdLogin/OAuth/2FA patterns and state save/load
references/session-management.mdMulti-surface isolation and state persistence
references/video-recording.mdRecording status and practical alternatives
references/proxy-support.mdProxy behavior in WKWebView and workarounds

Ready-to-use templates

TemplateDescription
templates/form-automation.shSnapshot/ref form fill loop (requires an explicit surface)
templates/authenticated-session.shLogin once, save/load state (requires an explicit surface)
templates/capture-workflow.shNavigate and capture snapshots/screenshots (requires an explicit surface)

리뷰

아직 리뷰가 없습니다. 사용해 본 소감을 남겨 주세요.

댓글

로그인 없이 쓸 수 있습니다. 사용 후기, 질문, 작동하지 않은 환경 등을 편하게 남겨 주세요.

아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.

보내면 바로 공개됩니다. 이메일 주소나 전화번호 같은 개인 정보는 쓰지 마세요. URL은 2개까지입니다.

0 / 1,000자

이 양식은 reCAPTCHA로 보호되며 Google 개인정보처리방침 및 서비스 약관이 적용됩니다.

같은 저장소의 스킬

cmux

무료

Organize cmux windows, workspaces, and split panes so an agent can target the right terminal reliably. Create terminals with startup commands, move or reorder panels, change focus, and flash a panel to identify it.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Arrange terminals for several tasks
  • Start a development command in a new split
  • Move or reorder panels
manaflow-ai/cmux2.8만2026년 10월 19일 업데이트

Guide substantial Swift changes in cmux with rules for package boundaries, dependency direction, state management, concurrency, and API documentation. Structure code so public package types can be tested without launching the app.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Extracting a large app feature into Swift Packages
  • Reviewing dependencies between UI, domain models, and services
  • Restructuring state management and Swift 6 concurrency
manaflow-ai/cmux2.8만2026년 10월 19일 업데이트

Guide cmux backend changes with consistent rules for Effect, a TypeScript library for structured error handling. Covers Cloud VM state, database migrations, provider integrations, and authentication and payment checks so changes follow the intended architecture.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Implementing API error handling
  • Updating Cloud VM lifecycle logic
  • Preparing database migrations
manaflow-ai/cmux2.8만2026년 10월 19일 업데이트

Maintain cmux billing code with guidance on Stripe checkout, pricing, subscriptions, and access rights. It maps the relevant services and provides workflows for testing purchases, handling payment events, and rolling out billing changes.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Debugging checkout and subscription records
  • Updating prices and plan switching
  • Checking paid access and Cloud VM limits
manaflow-ai/cmux2.8만2026년 10월 19일 업데이트

Capture cmux windows as screenshots or video clips from the CLI. Create visual evidence for pull requests and bug reports, with region selection and captions to explain drags, animations, or layout changes.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Attaching screenshots of visual changes to a pull request
  • Recording drags and animations for a bug report
  • Capturing a specific window region with explanatory captions
manaflow-ai/cmux2.8만2026년 10월 19일 업데이트

Run commands and coding agents on existing cmux Cloud machines, monitor work that continues after disconnection, and present results through workspaces or service URLs. The skill guides machine selection, background execution, and result verification.

한국어 요약은 준비 중입니다. 영어 요약을 표시하고 있습니다.

  • Run long commands that continue after disconnection
  • Assign coding work to a remote agent
  • Monitor remote work without opening panes
manaflow-ai/cmux2.8만2026년 10월 19일 업데이트

manaflow-ai의 스킬 모두 보기

이 스킬의 문제 신고