在AI时代,每一个CLI,都值得包成Skill

很多人都说CLI(命令行界面,Command-Line-Interface)对Skill更友好,到底友好在哪儿?不只是子命令写进SKILL.md这么简单。

从playwright-cli这个案例看,AI时代的CLI,已经不仅仅是命令行界面,它的存在形式可以是Skill。

从Playwright到playwright-cli的演进过程

Playwright 是微软在2020年开源的浏览器自动化框架。2025 年 3 月,微软发布 playwright-mcp,把浏览器操作能力通过 MCP 协议开放给 AI Agent;2026 年 1 月底,又在此基础上推出了 playwright-cli,主要解决 token 效率问题。

举个例子,让 Agent 确认某个页面上有没有”提交”按钮:

  • • playwright: 你得自己写代码,await page.locator('button:has-text("提交")').isVisible()。Agent 不参与判断,只负责执行你写好的脚本。
  • • playwright-mcp:把整个页面的每个按钮、输入框、链接、文本节点,全部序列化成树状数据加载到Agent的上下文中,瞬间消耗几千个 token
  • • playwright-cli:打开页面后把所有元素保存为快照文件,每个元素都有一个短 ID(ref)。Agent 看到的是 button[ref=e23] "提交",后续操作直接用这个 ID,十几个 token,够了。

对于Claude Code这类通用型 agent 来说,context window非常宝贵。无用的上下文内容太多,直接影响大模型的输出质量。而playwright-cli的设计就是在解决这个问题。

不同于 Workflow,Skill 的核心是让 Agent 自己处理异常

这是我觉得最容易被误解的一点。

SKILL.md里也可以写step 1、step 2、step 3,但这不意味着 Agent 会严丝合缝地按步骤执行。Skill和Workflow的根本区别在于:Workflow必须提前枚举所有异常分支,一旦走到没覆盖的分支,流程就卡住;Skill把异常处理交给Agent的推理能力。

拿 playwright-cli 举两个例子:

简单异常:命令没装。 SKILL.md 里写了一行:如果 playwright-cli 未安装,执行
npm install -g @playwright/cli@latest。Agent 遇到命令缺失,自己装,装完继续,不需要人介入。这就优雅了很多。

复杂异常:页面结构变了。 你让 Agent 点击”提交”按钮,但页面改版了,按钮文案变成了”确认提交”,或者按钮藏在一个弹窗里需要先关掉 cookie 提示。这种情况 Workflow 没法提前穷举。但正因为 playwright-cli 输出的是结构化的 snapshot,Agent 能看到所有元素和它们的 ref,能推理出”确认提交”就是目标按钮,能决定先关弹窗再操作。这些判断不需要写在SKILL.md里,Agent自己补。

在AI时代,CLI的最佳存在形式是Skill

Skill是给Agent写的操作手册。好的Skill设计,就是让Agent拿到SKILL.md就能自给自足。知道什么场景用、优先用哪种命令模式、出了问题怎么兜底。

在AI时代,每一个CLI,都值得包成Skill。