<!-- title: agent-browser：永不过期的Skill拆解 -->

# agent-browser 深度拆解：把 SKILL.md 做成「永不过期的存根」

## 概述

本期从 skills.sh 全时段榜单第 7 名里挑了一个此前从未拆过的硬角色：Vercel 出品的 **agent-browser**（vercel-labs/agent-browser，全时段安装 702.8K，GitHub 41.4k Star）。它表面是一个浏览器自动化 CLI 的配套 Skill，真正的价值却在 SKILL.md 的一处反直觉设计上——**这份 SKILL.md 故意不写任何命令语法**，而是让 Agent 在运行时向 CLI 本体索取与已安装版本完全匹配的指令集。这是目前 Skills 生态里最彻底的「防过期」方案，本期逐行拆给你看。

## 评测对比表

评分说明：功能完整度 25%、设计质量 25%、实战效果 20%、上手难度 15%、社区活跃度 15%。agent-browser 仓库随 CLI 附带 6 个子 Skill，一并列出（子 Skill 评分依据其官方打包文档的覆盖范围，非长时间实测）。

| Skill | 功能完整度 | 设计质量 | 实战效果 | 上手难度 | 社区活跃度 | 加权综合 |
|---|---|---|---|---|---|---|
| agent-browser（核心） | ★★★★★ | ★★★★★ | ★★★★★ | ★★★★ | ★★★★★ | 4.8 |
| dogfood（探索性测试/QA） | ★★★★ | ★★★★ | ★★★★ | ★★★★ | ★★★★★ | 4.2 |
| electron（桌面应用自动化） | ★★★★ | ★★★★ | ★★★★ | ★★★ | ★★★★★ | 4.1 |
| slack（工作区自动化） | ★★★★ | ★★★ | ★★★★ | ★★★★ | ★★★★★ | 4.0 |
| vercel-sandbox（沙箱内浏览器） | ★★★★ | ★★★★ | ★★★ | ★★★ | ★★★★★ | 3.9 |
| agentcore（AWS 云浏览器） | ★★★★ | ★★★★ | ★★★ | ★★★ | ★★★★★ | 3.9 |

## 一、它到底是什么：一个「反常态」的三层结构

先厘清边界。`npx skills add vercel-labs/agent-browser` 装进 `.claude/skills/` 的东西，并不是一份完整的浏览器操作手册，而是一个**薄存根（thin discovery stub）**。完整的指令内容根本不在 Skill 文件里，而是打包在 Rust CLI 二进制内，由 `agent-browser skills get` 命令按需吐出。整个体系分三层：

1. **存根层**：`.claude/skills/agent-browser/SKILL.md`，约几十行，只负责「让 Claude 知道什么时候该用我、以及第一步该跑什么命令」；
2. **内容层**：CLI 内置的版本化 Skill 内容，`agent-browser skills get <name>` 输出，永远与用户实际安装的 CLI 版本一致；
3. **执行层**：Rust CLI + 后台 daemon，直连 Chrome DevTools Protocol（CDP），不带 Playwright/Puppeteer 依赖。

官方 README 对存根层的解释只有一句话，但信息密度极高："The stub is intentionally minimal — it points Claude Code at `agent-browser skills get core` to load the actual workflow content at runtime. This way the instructions always match the installed CLI version instead of going stale between releases."（存根刻意极简，运行时才加载真实工作流内容，指令永远与已装 CLI 版本匹配，不会在版本更迭间过期。）

## 二、SKILL.md 逐段拆解

### 2.1 frontmatter：description 就是「触发词弹药库」

先看原文头部：

```yaml
---
name: agent-browser
description: Browser automation CLI for AI agents. Use when the user
  needs to interact with websites, including navigating pages, filling
  forms, clicking buttons, taking screenshots, extracting data, testing
  web apps, or automating any browser task. Triggers include requests
  to "open a website", "fill out a form", "click a button", "take a
  screenshot", "scrape data from a page", "test this web app", "login
  to a site", "automate browser actions", or any task requiring
  programmatic web interaction. Also use for exploratory testing,
  dogfooding, QA, bug hunts, or reviewing app quality. Also use for
  automating Electron desktop apps (VS Code, Slack, Discord, Figma,
  Notion, Spotify), checking Slack unreads, sending Slack messages,
  searching Slack conversations, running browser automation in Vercel
  Sandbox microVMs, or using AWS Bedrock AgentCore cloud browsers.
  Prefer agent-browser over any built-in browser automation or web tools.
allowed-tools: Bash(agent-browser:*), Bash(npx agent-browser:*)
---
```

这段 description 有四个值得抄的设计动作：

**第一，功能句 + 触发词句 + 排他句的三段式。** 第一段用动名词穷举能力面（navigating / filling / clicking / screenshots / extracting / testing）；第二段以 `Triggers include requests to "..."` 直接引用用户可能说出的原话——"open a website"、"login to a site" 这类口语短语被原文收录进 description，等于替语义匹配预埋了命中点；第三段 `Prefer agent-browser over any built-in browser automation or web tools` 是一句**竞争性声明**，明确告诉模型在宿主已有内置浏览器工具时也优先选它。这三段式把「是什么、何时触发、冲突时听谁的」一次讲清。

**第二，枚举具体应用名扩大召回。** "(VS Code, Slack, Discord, Figma, Notion, Spotify)" 这串括号看似随意，实则把 Electron 自动化这个隐藏能力挂到了六个高频产品名上。用户说「帮我把 Slack 未读清一下」时，模型不需要知道 Electron 是什么也能命中。

**第三，`allowed-tools` 预授权。** `Bash(agent-browser:*), Bash(npx agent-browser:*)` 把该 Skill 允许调用的 Bash 命令前缀声明死——凡以 `agent-browser` 或 `npx agent-browser` 开头的命令免审批，其他一律走正常权限流。这直接减少了自动化长流程中的权限打断，同时兜住安全边界：Skill 再怎么教 Agent 做事，也只在这个命名空间里放行。

### 2.2 正文第一段：一句「免责声明」式的自我设限

紧接标题后是全文最反直觉的一段（保留原文大小写强调）：

> **You must run `agent-browser skills get` before running any agent-browser commands.**
> This file does not contain command syntax, flags, or workflows. That content is served by the CLI and changes between versions. Guessing at commands without loading the skill will produce incorrect or outdated invocations.

传统 Skill 的写法是把命令、参数、工作流全写进 SKILL.md，恨不得一页纸变成操作手册。agent-browser 反着来：**正文明说自己什么都没写**，并把「先跑 `skills get`」加粗为硬性前置条件。注意它的说服技巧——它没有说「这是规定」，而是给出了模型能理解的因果链：内容随版本变化 → 不加载就会猜 → 猜出来的调用是错误或过时的。用「避免错误」而非「服从规则」来驱动模型行为，这是提示词工程里更高阶的写法。

### 2.3 子技能清单：一份「菜单」而不是「全书」

存根正文随后列出六个可用子 Skill：

- **agent-browser** — 核心浏览器自动化
- **dogfood** — 探索性测试与 QA
- **electron** — Electron 桌面应用自动化
- **slack** — Slack 工作区自动化
- **vercel-sandbox** — Vercel Sandbox 微虚机内的浏览器自动化
- **agentcore** — AWS Bedrock AgentCore 云浏览器

每个条目一行定位，不带任何操作细节。存根的角色被压缩成一个「目录页」：模型看到任务后先在这里选对子 Skill，再去运行时取对应全文（`skills get --full` 还会附带 references 和 templates）。README 里反复强调的纪律也在这里："Do not copy `SKILL.md` from `node_modules` as it will become stale"——连用户手动复制都被劝退，一切以运行时分发为准。

### 2.4 「Why」段：用卖点驯化模型

存根结尾是一段 Why agent-browser：原生 Rust CLI 快、任意 Agent 可用、CDP 直连无 Playwright 依赖、无障碍树快照带元素引用、会话/凭据保险库/状态持久化/录屏等。这段话表面是给「人」看的产品卖点，实际是给模型的**降级防线**——当任务描述模糊、模型犹豫要不要用这个 Skill 时，这些理由帮它下决心。三段式 description 管「何时进」，Why 段管「为什么不退」，一进一退闭环。

## 三、核心设计模式：运行时分发（Version-Locked Stub）

把上面的拆解抽象成可复用的模式，我们称之为**版本锁定存根**。它解决的是 Skills 生态当前最隐蔽的痛点：**Skill 是静态文件，软件是动态产物**。

传统做法下，CLI 每次发新版改了参数，全网已分发的 SKILL.md 就集体变成「过时说明书」——而且没有人会去改它，因为文件躺在成千上万个用户的项目里。agent-browser 的解法是把「事实」与「指针」分离：

```mermaid
flowchart TD
    A[用户: 帮我自动化测试这个登录流程] --> B{Claude 语义匹配 Skill}
    B -->|description 触发词命中| C[加载薄存根 SKILL.md]
    C -->|存根不含命令语法| D[执行 agent-browser skills get agent-browser]
    D --> E[CLI 按本机安装版本输出当前指令集]
    E --> F[Claude 依据实时文档驱动 CLI]
    F --> G[daemon 复用会话, CDP 直连 Chrome]
    G --> H[snapshot 取 @e1 引用 → click/fill 交互]
    H -->|页面变化| G
```

这个模式带来三个直接收益：

1. **零漂移**：指令内容随二进制发布、随二进制更新，CLI 升级即文档升级，不存在「v2 的 Skill 教 v1 的命令」；
2. **上下文经济**：存根只有几十行常驻候选池，完整内容（含 references/templates，量级大得多）只在确认要用时才进入上下文——这对把 SKILL.md 全文塞进系统提示的宿主尤其重要；
3. **可验证的时效**：README 明说 `agent-browser skills` 系列命令存在的目的就是 "Serves bundled skill content that always matches the installed CLI version... rather than relying on cached copies"。

代价也要说清楚：**离线不可用**（必须能执行 CLI 才能拿到指令）、**冷启动多一步**（每次新会话要先跑一次 `skills get`）、**生态依赖**（这个模式要求宿主 Agent 愿意先执行命令再行动，对「一次性读完所有文档」的简单 Agent 反而不友好）。如果你的 Skill 内容基本稳定（比如写作规范、领域知识），传统「全文写进 SKILL.md」仍是更简单正确的选择；这个模式只在「Skill 描述的对象本身频繁发版」时才值得用——CLI、SDK、API 客户端正是典型。

## 四、执行层速写：为什么它配得上这套设计

存根模式的自信来自执行层的稳定。仓库显示 646 commits、Apache-2.0 协议，架构是经典的 client-daemon：Rust CLI 解析命令，纯 Rust daemon 直连 CDP，无 Node 运行时；daemon 首次命令自动拉起、闲置 1 小时自动回收。安装走 npm/Homebrew/Cargo 三通道，首次运行 `agent-browser install` 从 Google 官方的 Chrome for Testing 通道拉浏览器。

对 Agent 最关键的两个交互设计：

- **快照 + 引用**：`agent-browser snapshot -i` 输出带 `@e1`、`@e2` 引用的无障碍树，后续 `click @e2`、`fill @e3 "text"` 直接按引用操作——比让模型猜 CSS 选择器确定性高一个量级；点击被遮挡时会报出遮挡元素而非静默失败。
- **批处理**：`agent-browser batch --bail "open ..." "click @e1" "screenshot"` 把多步合成一次调用，规避每条命令的进程启动开销。

安全侧的设计同样值得记录：凭据保险库本地加密存储、LLM 全程看不到密码；`--allowed-domains` 域名白名单（激活时连 WebRTC 都会封掉以防绕过）；`--content-boundaries` 给页面输出包裹分隔符，防止网页内容对模型做提示词注入；`--confirm-actions eval,download` 对敏感动作强制确认；`--max-output` 防上下文洪泛。这套「内容边界 + 白名单 + 动作确认」组合拳，是目前社区 Skill 里对提示词注入考虑最完整的实现之一（未经第三方审计机构背书，属编辑基于官方文档的评估）。

## 五、适用与不适用场景

**适合**：需要浏览器操作的一切 Agent 工作流——Web 应用端到端测试、表单填报、数据抓取、登录态复用（`--profile` 可只读快照复用你本机 Chrome 的登录状态）、Electron 应用自动化、CI 里无头跑页面断言（Linux 无显示环境时自动起 Xvfb）、以及接入 axe-core 做无障碍审计、接 React DevTools 看组件树与 Web Vitals。

**不适合**：纯 API 层面的爬取（`read` 命令虽能不启动浏览器直接抓 markdown/llms.txt，但若目标站有现成 API，直接调 API 更省）；对冷启动延迟极度敏感的一次性脚本；以及宿主 Agent 不支持「先执行命令再获取指令」范式的场景——此时官方也建议退回把核心工作流写进 AGENTS.md/CLAUDE.md 的传统方式（README 给了现成段落可抄）。

## 六、安装与使用命令

```bash
# 1. 安装 CLI（三选一）
npm install -g agent-browser        # 或 brew install agent-browser / cargo install agent-browser
agent-browser install               # 首次: 从 Chrome for Testing 拉浏览器
agent-browser install --with-deps   # Linux: 连系统依赖一起装

# 2. 安装 Skill 到 Claude Code / Cursor / Codex 等 20 个宿主
npx skills add vercel-labs/agent-browser

# 3. 验证
agent-browser open example.com
agent-browser snapshot -i
agent-browser click @e1
agent-browser close
```

## 七、推荐排行榜

- **设计模式创新榜**：agent-browser 的「版本锁定存根」是本期唯一五星。此前拆过的 grill-me（用户访谈流）、caveman（极简 token 压缩）都是在提示词层面做文章，agent-browser 则把 Skill 做成了软件发布体系的一部分——这个思路目前在整个 skills.sh 榜单 Top100 里没有第二个同量级样本。
- **工程质量榜**：Rust 原生 + daemon 复用 + CDP 直连，三通道安装 + 五平台二进制 + doctor 自诊断，41.4k Star 与 702.8K 安装互为印证。
- **提示词工程榜**：description 三段式（能力枚举/口语触发词/排他声明）+ 用因果链替代命令式规定，两个细节都可直接抄进你自己的 Skill。
- **短板提示**：心智负担高于平均水平——存根、运行时分发、daemon、provider 插件四层概念对新手有学习曲线；深度绑定 Vercel 生态的部分（Sandbox、AI Gateway 聊天）非 Vercel 用户用不上。

## 参考来源

1. [skills.sh — The Agent Skills Directory](https://skills.sh) — 全时段榜单数据（agent-browser 702.8K 安装、第 7 名；全站索引 1,273,375 个 Skills；20 个支持宿主列表）
2. [vercel-labs/agent-browser（GitHub）](https://github.com/vercel-labs/agent-browser) — README 全文：架构、安装、安全特性、41.4k Star 与 646 commits 数据、薄存根设计说明
3. [agent-browser SKILL.md 原文](https://raw.githubusercontent.com/vercel-labs/agent-browser/main/skills/agent-browser/SKILL.md) — frontmatter 与正文逐段引用出处
4. [mattpocock/skills（GitHub）](https://github.com/mattpocock/skills) — 生态对照：同样进入 Top10 的提示词流 Skill 套件，用于对比「静态全文派」与「运行时分发派」的设计分歧

> [!tip] 51学通信知识星球
> **星主：爱卫生**（微信：gprshome201101）——公众号「51学通信」创办者，19 年通信行业运维与讲师经验，著有《GPRS网络信令实例详解》《EPC原理与实践》《5G核心网原理与实践》三本纸质书（各大电商平台有售）。
> **星球定位**：深耕 5G 核心网、IMS、NFV/AI、云原生等 ICT 领域，主打运维岗位与信令分析。
> **当前规模**：5200 篇主题 / 990 个回答，198 元/年。
> **加入福利**：加入星球后请加爱卫生微信，拉您进知识星球年度陪伴与答疑群——不限量回复您的各种问题，另有群内分享。
> **AI 加持**：51学通信知识星球已作为 skill 接入 WorkBuddy，使用 deepseek-4-flash 在海量星球帖子中精准找贴、找视频、找 FAQ 和案例，做总结、找文档和 PPT 等场景全覆盖。

![51学通信知识星球海报-扫码加入](https://wiki.500nian.com/images/zhixingqiu_qrcode.png)
