Trending 排名:#4|快照日期:2026-09-18|Stars:4,683|Forks:331|主语言:TypeScript|License:MIT
AI Agent 做网页任务时,最别扭的地方往往不是点击按钮,而是登录状态。让它重新开一个无痕浏览器?很多网站要验证码、短信、企业 SSO。把自己的浏览器直接交出去?又会打断当前工作,权限边界也说不清。
BrowserSkill 解决的是这个夹缝问题:Agent 通过一个本地 bsk CLI 发指令,真实浏览器里的扩展负责执行;任务跑在单独的 Agent Window,只有在明确借用用户已有标签页时才触碰你的普通窗口。这个设计没有把浏览器自动化包装成一个黑盒云服务,而是把 CLI、守护进程、浏览器扩展和技能说明拆成了几层可以审计的边界。
我更关心它的工程价值,而不是"Agent 能打开网页"这件事本身。源码里最有意思的部分,是它把浏览器自动化拆成了协议兼容、会话所有权、用户中断、借用标签页、长截图、文件传输、人工接管这些细粒度问题。换句话说,它不是一个简单的 Playwright 外壳,而是在给任意 shell-capable Agent 补一条真实浏览器通道。
📋 项目概览
| 项目 | 内容 |
|---|---|
| 项目名 | Tencent/BrowserSkill |
| 一句话 | 让 AI Agent 在不打断用户工作的前提下,操作用户已登录的 Chromium 浏览器 |
| GitHub | github.com/Tencent/Bro... |
| Stars / Forks | 4,683 / 331 |
| 主要语言 | TypeScript 65.1%、Rust 31.5%、JavaScript 2.3% |
| License | MIT |
| 最新版本 | CLI / Extension / DSH Plugin 均为 v0.3.0(2026-09-16/17 发布) |
| 代码规模 | 753 个 Git 跟踪文件;约 9.0 万行 TS、4.8 万行 Rust |
| 核心组件 | Rust CLI/daemon、Chromium MV3 扩展、共享协议 crate、DSH 插件、浏览器评测集 |
🔥 为什么值得关注
浏览器自动化这条路已经很拥挤。Playwright、Puppeteer、Chrome DevTools Protocol 都能点按钮、填表、截图。但 Agent 场景多了几个传统自动化不太关心的问题:它需要复用真实登录态,需要在模型做错时被用户中断,需要把"读页面"和"改页面"分清楚,还要能把任务窗口和用户正在用的窗口隔离开。
BrowserSkill 的处理方式比较务实。它没有要求 Agent 嵌进某个特定框架,只要 Agent 能执行 shell,就可以调用 bsk。Claude Code、Cursor、Codex、Hermes Agent 这类工具都能通过同一层 CLI 接入;DeepSeek Harness 则有单独的插件,把浏览器能力暴露成 browser_* 工具。
这类项目最容易写成"给 Agent 一个浏览器"的口号。看源码后我觉得它真正有价值的地方在两个字:边界。Agent 只能操作自己的 Agent Window;用户标签页要走 borrow/return;扩展保存的自动化偏好优先于旧版命令行绕过参数;协议版本不一致时能继续工作或明确拒绝;长截图这种看似小功能,也做了分块、取消、恢复和清理。这些东西不花哨,但决定了它能不能在真实桌面环境里长期使用。
🏗️ 核心特性
-
真实登录态复用,但不默认接管用户窗口
BrowserSkill 让 Agent 使用同一个浏览器 profile,因此企业 SSO、站点登录状态、Cookie 都可以复用。它默认创建独立 Agent Window,普通用户窗口不被直接控制。需要操作已有标签页时,流程是先列出用户标签页,再借用,再归还。
bashbsk session start --no-focus --json bsk tab list --scope user --session <id> bsk tab borrow <tab-id> --session <id> bsk tab return <tab-id> --session <id> bsk session stop <id>上面这些命令名和参数已用当前源码构建出的
bsk --help、bsk session start --help和 parser 测试核对。--no-focus是真实存在的 session start 参数;tab borrow --timeout只改变等待确认的时间,不会绕过确认。 -
CLI → daemon → extension 的本地桥接架构
README 的架构图和源码是一致的:Agent 调 shell,CLI 走本地 IPC 找 daemon,daemon 用 WebSocket 连接扩展,扩展再操作浏览器页面。Agent 不直接拿到浏览器内部对象。
textAgent Harness | | shell: bsk navigate / observe / click v bsk CLI --local IPC--> bsk daemon --WS 127.0.0.1--> BrowserSkill extension | v Agent Window / borrowed user tab这层拆分的好处是可替换。CLI 负责命令行体验,daemon 负责会话、队列、取消和文件中转,extension 负责 CDP 与页面操作。坏处也很直接:CLI、daemon、extension 版本必须保持兼容,真实浏览器链路也比纯 headless 脚本更难部署。
-
协议兼容和用户中断是源码里的硬逻辑
crates/bsk-protocol/src/method.rs给每个 RPC 方法分了效果类型:只读、临时输入、浏览器变更、控制面。这个 match 没有兜底分支,新增方法时必须显式分类。observe被归为 transient input,因为它的 hover probe 会触发真实页面事件;session.stop属于控制面,不能被中断门拦住,否则用户点击停止后反而没法收尾。方法类型 例子 中断/权限含义 PassiveRead snapshot、get-html、普通screenshot读取状态,不驱动页面输入 TransientInput observe、hover、screenshot --full-page会触发临时输入,需要被用户中断门约束 BrowserMutation click、fill、navigate、tab borrow改变页面或浏览器状态 ControlPlane session start/stop、cancel会话控制,不能被普通页面中断逻辑卡死 这种分类比"把所有浏览器命令都当危险操作"更细,也比"截图观察一定无害"更诚实。
-
长截图做成了流式管线,而不是拼一个超大 Canvas
v0.3.0 增加了 full-page screenshot。文档显示扩展把截图切成 512px 高的 PNG tiles,存在 OPFS,导出时由 worker 顺序读取、用 PNG Up filter 和原生 zlib 写出。Agent 侧通过
tool.screenshot_full_page开始,再用tool.screenshot_read分块读取,最后 release。bashbsk screenshot --session <id> --full-page --out page.png bsk screenshot --session <id> --full-page --scope current --timeout 5m --out loaded.png --json项目文档给过一个渲染测试样本:3,170 × 100,062 像素的长图,工作 Canvas 和 ImageBitmap RGBA buffer 峰值约 41.7 MiB;整张 RGBA 图如果一次性展开需要约 1.27 GiB。这个数字只覆盖截图管线自身的像素缓冲,不代表网页 DOM、Chrome 进程或编码器的总内存。
-
远程浏览器连接把认证问题放进协议层
v0.3.0 的 remote browser connections 支持 Agent 跑在服务器上,浏览器扩展从用户电脑主动连出去。配对链接一次性使用,设备凭证会轮换,可撤销;WebSocket 使用
Sec-WebSocket-Protocol: bsk-auth.DEVICE_TOKEN,而不是靠浏览器形状的 Origin 当身份。这对团队内的 Agent runner 有现实意义:模型和 CLI 可以在服务器,浏览器仍然在用户桌面。但它也不是完整远程桌面。远程 upload/download 在这个版本里明确不支持,远程任务仍然只能操作任务创建或借用过的标签页。
🔬 技术架构深度解析
BrowserSkill 的代码分层很清楚,GitHub 语言统计里 TypeScript 占 65.1%,Rust 占 31.5%。这不是"前端项目顺便写了个 CLI"。Rust 部分承担了 CLI、daemon、IPC、WebSocket、授权、更新、文件传输和协议 schema;TypeScript 部分主要是 MV3 扩展、VOM 观察模型、DSH 插件和 UI。
text
Repository
├── crates/
│ ├── bsk-cli # Rust CLI + local daemon
│ └── bsk-protocol # RPC frame、method、tool payload、schema
├── apps/extension # Chromium MV3 extension,React + WXT
├── packages/
│ ├── vom # semantic observation model
│ ├── ui / i18n # 扩展 UI 与多语言
│ └── dsh-plugin-browserskill
├── skill/SKILL.md # 给 Agent 的操作规范
└── evals/browser # 本地确定性浏览器能力评测集
请求生命周期
一次普通页面读取大致是这样走的:
text
bsk observe --session S
|
v
CLI 解析参数并构造 RPC
|
v
Daemon 校验 session、browser、队列和中断状态
|
v
WebSocket 发给对应浏览器扩展
|
v
Extension 在 Agent Window 里抓取 VOM / refs / hover hints
|
v
结果回到 CLI,输出给 Agent
关键点是 daemon 维护会话所有权和队列。源码里的 per-session queue 测试覆盖了同一 session 并发调度、不同 session 不互相阻塞、超时后保持 session busy 直到扩展清理完成等情况。这个设计看起来有点啰嗦,但对浏览器自动化很重要:点击、滚动、截图这些动作有真实副作用,不能像普通函数调用一样超时就立刻忘掉。
协议兼容
system.handshake 不用应用版本号做硬判断,而是比较 protocol_version 和 min_compatible_protocol。同一 major、minor 有漂移时允许连接但标记 skew;major 不匹配或低于协议地板时拒绝。Rust 侧还把 protocol major 的解析上限对齐到 JavaScript 的 Number.MAX_SAFE_INTEGER,避免 daemon 接受而 extension 拒绝的非对称情况。
text
peer/local protocol major 不一致 -> reject
peer protocol < local min compatible -> reject
local protocol < peer min compatible -> reject
同 major 但 minor 不同 -> warn but allow
完全匹配 -> connected
这不是 README 层面的兼容声明,而是 crates/bsk-protocol/src/system.rs 和扩展 connection-controller.ts 两侧都有实现和测试。
安全边界
它的安全边界主要有四层:
| 边界 | 源码/文档证据 | 含义 |
|---|---|---|
| Agent Window | README 和 session lifecycle | 默认任务窗口与用户普通窗口隔离 |
| Borrow/return | tab borrow、tab return、skill 说明 |
用户标签页需要显式借用并归还 |
| 自动化偏好 | README v0.3.0、interaction preferences 测试 | 旧版 --unattended 不能覆盖扩展保存的确认/求助开关 |
| 远程授权 | remote docs、server tests | 设备凭证绑定身份,撤销会关闭连接并阻止新连接 |
但它不是浏览器沙箱。配对的服务器或本地 Agent 仍然能创建任务窗口、读取任务页、使用已登录状态做被授权的操作。项目文档也把这一点说得很直:pair 只是在授权某台服务器操作浏览器,不是给网站级别的最小权限账号。
验证结果
我在浅克隆的 fa0439d 提交上做了几组确定性检查:
| 检查 | 结果 |
|---|---|
cargo run --locked -p bsk -- --help 及关键子命令 help |
通过,确认本文 CLI 示例参数存在 |
env -u HERMES_HOME cargo test --workspace --locked |
通过 |
pnpm eval:browser:check |
通过,验证 9 个 case、18 条 fixture route、15 个 Node 测试 |
pnpm --filter @browser-skill/extension compile |
通过 |
pnpm --filter @browser-skill/extension test |
118 个测试文件通过、10 个跳过;1741 个测试通过、97 个跳过 |
pnpm --filter @browser-skill/vom test |
55 个测试通过 |
pnpm --filter @browser-skill/i18n test |
52 个测试通过 |
pnpm ext:build |
通过,Chrome MV3 产物约 1.59 MB |
pnpm lint |
通过,含 Biome、stylelint、DSH 插件 typecheck 和 240 个插件测试 |
有一个小插曲:直接运行 Rust workspace tests 时,宿主环境里的 HERMES_HOME 会影响两个 Hermes skill 安装路径测试;清掉这个环境变量后全部通过。这更像测试环境污染暴露出的假失败,不影响 CLI/daemon 的运行路径,但也说明这类多 harness 安装逻辑很容易被宿主环境牵动。
📖 README 核心内容摘要
README 把 BrowserSkill 定位成"让 AI agents 使用你的真实浏览器,同时不打断你工作"的本地桥接工具。它支持 macOS、Linux、Windows,浏览器以 Chrome 和 Edge 为主,其他 Chromium 浏览器在支持 unpacked extension 时通常可用,Firefox 仍是计划项。
安装路径有两种。推荐路径是让 Agent 读取 AGENT_INSTALL.md 自动处理 CLI 和 skill 安装;手动路径则是安装 bsk CLI、安装浏览器扩展、执行 bsk install-skill,然后用 bsk doctor 检查连接。
bash
curl -fsSL https://raw.githubusercontent.com/Tencent/BrowserSkill/main/install.sh | sh
export PATH="${BSK_INSTALL_DIR:-$HOME/.local/bin}:$PATH"
bsk --version
bsk install-skill
bsk doctor
install-skill 的 README 示例里提到交互选择和非交互安装。当前 help 确认它支持 --list、--harness、--json、--source、--force、--yes。如果要给 Cursor 安装,可以这样写:
bash
bsk install-skill --list --json
bsk install-skill --harness cursor --json
README 还强调了几个升级注意点:v0.3.0 后,CLI、扩展、DSH 插件共享版本号;--unattended、tab borrow --no-confirm、BSK_REQUEST_HELP=off 保留兼容但不能绕过扩展侧的自动化设置;长截图、远程连接、operation audit、scroll-to、wheel、focus/blur 等能力需要 CLI、daemon、extension 版本匹配。
对开发者来说,最值得读的不是首页,而是这些文档:
| 文档 | 价值 |
|---|---|
skill/SKILL.md |
Agent 实际该怎么启动 session、观察、点击、借用标签页、请求人工帮助 |
docs/remote-extension-connection.md |
远程连接的 pairing、credential renewal、撤销和代理边界 |
docs/long-screenshot.md |
分块长截图、OPFS、PNG 流式导出和错误边界 |
evals/browser/README.md |
浏览器能力评测集的 case、fixture、oracle 和 adapter 设计 |
CHANGELOG.md |
v0.3.0 能力边界与升级破坏点 |
🚀 快速上手
下面是一个最小的本地使用流程。真实执行前,你需要先在 Chrome 或 Edge 里装好 BrowserSkill 扩展,并让扩展连接到本地 daemon。
bash
# 1. 安装 CLI
curl -fsSL https://raw.githubusercontent.com/Tencent/BrowserSkill/main/install.sh | sh
export PATH="${BSK_INSTALL_DIR:-$HOME/.local/bin}:$PATH"
# 2. 安装 Agent skill
bsk install-skill --harness cursor --json
# 3. 检查连接
bsk doctor
# 4. 开一个不会抢焦点的 Agent Window
bsk session start --no-focus --json
# 5. 假设上一步返回 session_id = abc123
bsk navigate https://example.com --session abc123
bsk observe --session abc123
bsk screenshot --session abc123 --out example.png
bsk session stop abc123
如果你的 Agent 运行在会清理后台子进程的沙箱里,不要让每个命令都偷偷重启 daemon。README 建议把 daemon 放在持久宿主环境里管理,然后在 Agent 命令里设置:
bash
export BSK_AUTO_START=0
export BSK_HOME=/path/to/shared/bsk-home
bsk status --json
远程模式则需要先在服务器上启动 server 模式 daemon,再生成 pairing link,让用户电脑上的扩展主动连入。这个模式适合 Agent 跑在远程机器、浏览器留在用户桌面的场景,但要把 BSK_HOME 当成敏感本地状态保存,因为里面有设备授权与 IPC 元数据。
📊 增长速度与社区热度
BrowserSkill 创建于 2026-06-22,快照日为 2026-09-18,约 87.7 天内累积 4,683 Stars。粗略的生命周期均值约 53.4 Stars/天。这个数字只能当作长期基线,不能替代 GitHub Trending 当日新增 Stars,因为脚本快照没有保留每个仓库的当日新增值。
社区活跃度上,它的维护节奏很密。最近一次 GitHub Release 是 cli-v0.3.0(2026-09-17),扩展 ext-v0.3.0 是 2026-09-16;默认分支最新提交为 2026-09-18。贡献者 API 里前 10 名分别是 TencentXiaowei、Ljy-0827、iuyo5678、BB-fat、shnpd、NianJiuZst、iAstro、hobostay、dayi、hZsFN,提交分布不是单人玩具项目。
| 指标 | 数值 |
|---|---|
| Stars | 4,683 |
| Forks | 331 |
| Open Issues | 51 |
| Watchers/Subscribers | 13 |
| 最新提交 | 2026-09-18,fa0439d |
| 最新 Release | CLI v0.3.0 / Extension v0.3.0 |
| 代码文件 | 753 个 Git 跟踪文件 |
| 测试覆盖观察 | Rust、extension、VOM、i18n、DSH 插件、浏览器 eval harness 都有确定性测试 |
完整 Trending 榜单如下,Stars/语言为同日 API 补充校验值;当日新增 Stars 未在快照中保留。
| Rank | Repository | Language | Stars | Forks |
|---|---|---|---|---|
| 1 | alibaba/open-code-review | Go | 35,754 | 2,540 |
| 2 | cloudflare/security-audit-skill | JavaScript | 11,358 | 612 |
| 3 | addyosmani/agent-skills | JavaScript | 96,044 | 10,163 |
| 4 | Tencent/BrowserSkill | TypeScript | 4,683 | 331 |
| 5 | alphaXiv/OpenResearch | Rust | 5,151 | 313 |
| 6 | anthropics/claude-code | TypeScript | 145,989 | 23,662 |
| 7 | NationalSecurityAgency/ghidra | Java | 78,709 | 8,703 |
| 8 | anthropics/knowledge-work-plugins | Python | 24,671 | 2,957 |
| 9 | Tencent/WeKnora | Go | 26,630 | 3,592 |
| 10 | abue-ammar/tinycast | Swift | 6,271 | 290 |
| 11 | cilium/cilium | Go | 25,324 | 4,079 |
| 12 | jamiepine/voicebox | TypeScript | 54,993 | 6,841 |
| 13 | affaan-m/ECC | JavaScript | 261,412 | 39,131 |
| 14 | roboflow/supervision | Python | 50,887 | 4,837 |
| 15 | JustVugg/colibri | C | 35,904 | 3,777 |
| 16 | TencentCloud/Octop | Python | 3,685 | 384 |
| 17 | ever-co/ever-gauzy | TypeScript | 7,664 | 1,137 |
| 18 | cline/cline | TypeScript | 68,639 | 7,420 |
| 19 | coder/coder | Go | 14,982 | 1,491 |
| 20 | n8n-io/n8n | TypeScript | 205,158 | 60,759 |
🎯 适用场景
| 场景 | 为什么适合 | 需要注意 |
|---|---|---|
| 企业内网页登录流程自动化 | 复用真实登录态,绕过重复 SSO 登录成本 | 不适合把账号交给不可信 Agent 或服务器 |
| Agent 辅助运营后台操作 | 独立 Agent Window 可减少对用户工作流的打断 | 关键提交、支付、审批仍应人工确认 |
| Web UI 回归检查 | observe、截图、console、network、emulate 等能力比较完整 |
不是 Playwright 替代品,确定性测试仍应保留专门 E2E 套件 |
| 长页面资料采集 | full-page screenshot 支持自动/当前范围、分块导出 | 无限滚动和虚拟列表仍可能触发边界条件 |
| 远程 Agent + 本地浏览器 | 扩展主动连服务器,适合远程 runner 使用本地登录态 | 需要 TLS、凭证管理和清晰的设备授权策略 |
| DeepSeek Harness 浏览器工具 | DSH 插件提供 native browser_* 工具和 Web UI 视图 |
插件升级需要单独处理,不能只更新 CLI |
不太适合的场景也要说清楚:如果你需要大规模、完全无人工参与、可重放的浏览器测试,Playwright 仍然更合适;如果你希望给模型一个严格隔离的浏览器沙箱,BrowserSkill 也不是沙箱产品。它的定位更像"把用户真实浏览器安全地接到 Agent 工作流里",而不是"替代所有浏览器自动化工具"。
💡 总结
BrowserSkill 的亮点不在"能控制浏览器",而在它认真处理了真实浏览器接入 Agent 后会冒出来的一堆脏问题:登录态、标签页所有权、用户中断、版本漂移、长截图内存、远程配对、技能安装和确定性评测。
我会把它看成一个 Agent 基础设施项目。它适合那些已经在用 Claude Code、Cursor、Codex、Hermes Agent 或 DeepSeek Harness 做本地工作流的人:当任务必须碰真实网页,又不能每次都卡在登录和验证码上,BrowserSkill 提供了一条工程上比较克制的路。
边界也很明确。它依赖浏览器扩展和本地 daemon,部署比纯 CLI 工具复杂;配对远程浏览器时,服务端获得的是很强的浏览器操作能力;某些能力,比如远程 upload/download、Firefox 支持、真实浏览器 smoke,还不是"装上就全覆盖"。这些限制不减分,反而让这个项目显得更可信:它没有把权限问题说成魔法。