Agent 时代,先别着急开发 CLI,来个Skill带你设计

开发调优 人工智能
查看原帖
wangnov
wangnov 楼主
#1

Agent 时代,先别着急开发 CLI,来个Skill带你设计

昨天读到 Justin Poehnelt 的一篇文章 You Need to Rewrite Your CLI for AI Agents,大意是:现在已经是 AI Agent 时代了,CLI 这种天生适合 Agent 使用的工具,不能继续沿用老一套面向人类的设计范式了。

我瞬间感觉好像遇到知音了,很有共鸣啊,连夜动手,搓了一个 Skill 出来,今天分享给大家。不过在聊 CLI 的设计之前,我想先提一嘴 MCP 的事,说说我的共鸣是哪来的。


MCP 的问题:30k 上下文买来了什么?

MCP 大火的时候,我就一直很纳闷:本质上还是各种接口调用,为什么非要统一成一种协议、塞进一个巨大的上下文?

我记得装了几个很常见的 MCP,比如 GitHub MCP、Playwright MCP,当时还在用 Cursor 和 Claude Code,Cursor 直接提示我 MCP 工具最好别超过 40 个。因为工具自身的 prompt 太长了,长到严重挤占 Agent 的可用上下文。果不其然,同样是这些 MCP,我一打开 Claude Code,Statusline 就告诉我上下文已经占了 30k。还没开始干活,预算就花掉一大块。


(随便截了个图,不是真的说上下文占了这么多哈)

而相比之下,CLI 则天生更适合做 Agent 的外部工具。原因很直接:

  • CLI 自带 --help,主命令有,子命令也有,天然分层,你想看哪个命令的就去 command --help,不会一股脑全塞给你
  • 对知名 CLI,LLM 的知识库里本来就会用。没错,我说的就是 gh
  • 不需要危险的 API Key 存到 MCP 的配置文件,又或者费半天劲解决了 PATH 的加载之后再存到环境变量里,CLI的关键的令牌管理安全且顺手
  • 不需要开个会话一个 hi 就吃掉几千 token 的工具描述,你不调用它它永远不会烦你

所以我至今不太能理解 GitHub MCP 的意义:拿着 API Key,做着很有限的事情,消耗巨大的上下文。gh 不香吗?

从 Airis 实验到 Justin 的文章:CLI 的 help 其实也不够用

意识到 CLI 比 MCP 更适合 Agent 之后,我做了一个实验。

我搓了一个叫 Airis 的 CLI,包了海量工具进去成为一个个命令和子命令,然后把每个命令和子命令的 help 写得像 skill 说明书一样详细。效果还行,但有一个明显的问题,Agent 可没有我这个工具的知识库记忆,有的低智商模型直接上来就猜,直到碰壁了才去查 help。

这就像给一个人一本厚厚的手册,他不会先看完再动手,而是出错了才翻。所以说,--help 能救急,但救不了设计。

后来 skill 这个范式被提出来的时候,我立刻觉得这是对的方向。本质上和我对 help 的认知一致:把最关键的知识前置到 Agent 的上下文里,而不是等它运行时碰壁再去查。

但即便有了 skill,还剩一个更根本的问题没解决。

读到 Justin 那篇文章之后,我终于想明白了,为什么顶级的 CLI 好用,而随手 VibeCoding 出来的不行,根本原因还是在人:我们做 CLI 的时候,大多数是从功能出发的。让 Agent 帮忙起个 MVP,或者干脆就是从一个小脚本演化而来的。VibeCoder 很少有人会停下来问:

  • 这个 CLI 到底是给谁用的?
  • 它属于什么类型?
  • 它的状态性有多强?
  • 它的风险轮廓是什么?

而为我们开发 CLI 的 Agent 也没那么自觉,来问我们这些东西。Plan Mode 会稍微好点,但本质还是那样。

尤其是,我们可能从未认真考虑过一件事:有些 CLI 只会被 Agent 操作,人这辈子都不会碰;有些 CLI 专门用来连接两种不同语言的运行时,只供脚本和程序调用。这些工具和一个面向人类操作员的 CLI,设计上应该有本质的区别。

比如最近 OpenClaw 非常流行。OpenClaw 是一个典型的高度自主 Agent,它为了完成任务会反复设计各种小脚本和 CLI 工具。反过来,我们也可能想专门为 OpenClaw 开发一个 CLI,让它更高效地完成使命。这类场景下,CLI 的主要用户根本不是人,设计重心自然也完全不同。

缺了这些判断,你后面做的所有设计决策,命令树怎么排、输出什么格式、要不要加 --json、要不要上 TUI,全是在凭感觉。

所以我做了一个 skill:cli-design-framework

调研了一圈顶级 CLI 的最佳实践之后,从 POSIX/GNU 的语法纪律,到 CLIG 的 human-first 原则,到 Justin 文章里的 agent-era 新约束,我把这些东西收束成了一个框架。

核心只有一句话:先分类,再设计。

框架会沿着五个维度做判断:

维度问的问题典型值
Role主要控制什么?Capability / Runtime / Workspace / Workflow / Package / Meta
User Type主要给谁用?Human-Primary / Balanced / Agent-Primary / Agent-Only
Interaction Form怎么被使用?Batch / Interactive / REPL / TUI / Machine Protocol
Statefulness状态性多强?Stateless / Config-Stateful / Sessionful / Attach-Detach
Risk Profile副作用多大?Read-heavy / Mixed / High Side-Effect / Irreversible

分类一旦成立,设计后果是连锁的。举个例子:

需求:“做一个 CLI 来启动、观察和停止 AI agent 任务。”

这个 CLI 的分类应该是 Runtime,不是 Capability。一旦判断成立:

  • 命令结构该用 start / attach / stop / approve,不是 create / get / delete。因为你管的是活着的进程,不是数据库里的对象。
  • Approval 是一等公民命令,不是某个 flag 的附属品。High Side-Effect 加上 Human-Primary 意味着人类治理是产品核心。
  • Session attach/detach 是核心能力。关掉终端不等于杀掉 agent,你需要能回来。

如果你跳过分类直接设计,很可能会做出一个整洁的 session list / session get / session delete 命令树。看起来不错,但你会发现:你有一个能描述 agent session 的工具,却治理不了它。

这就是 category mistake 的代价。

怎么用

如果你对自己的 CLI 应该长什么样还不够确定,装上这个 skill 之后,Agent 会从 plan mode 开始,一步步带你澄清需求、判断分类、推导设计后果。你不需要提前了解整套框架,分类体系、输出模板、锚点样例和反面教材都会在对话过程中自动拉进上下文。

三种用法:

  • 快速启动:快速判断分类和核心设计后果
  • 产出设计蓝图:输出完整的设计蓝图,从分类到命令树到风险模型,后续就可以基于此进行开发了
  • 结构化Review:评审已有 CLI,把"分类错了"和"同类下做得不够好"分开说清楚

仓库:https://github.com/wangnov/cli-design-framework

后续我也会更新一些用这个 Skill 设计的 CLI,放在仓库的文档里做参考,看看这个 Skill 的威力是不是真的像吹的这么大。

# ClawHub
clawhub install cli-design-framework

# 或从仓库安装
npx skills add wangnov/cli-design-framework

兼容 Claude Code / Codex / OpenClaw 等一切 Agent,提示词内没有针对不同 Agent 进行调优,是通用的。我用它们仨分别设计了一遍几个实验性的 CLI,都挺满意的。

最后,Codex 在帮我写完 Skill 之后,给我留了一句看着很像名言的话,我自己也觉得很带感:
Classify first. Design second.
这才是 Agent 时代,我们人类的注意力需要聚焦的内容。而 Coding?和吃饭喝水一样简单。

TOPIC OWNER
42 楼层
41 回复
29 用户
wangnov baiyidujiang VideoMonster xuanwulei veechan ShirleyXi
wangnov
wangnov 楼主
#3

PS:本文为手打,AI仅提供了排版的范例,我照着学的。

TOPIC OWNER
VideoMonster
VideoMonster
#8

认真看完了,突然也让我想明白了我最近一个模糊的感觉,我喜欢让 openclaw 去封装 skill,但是有的 skill 它做完了除非我让它设定为必要路线才会去调用,所以我又让它基于封装的 skill 做了一套 skill ruleset,在执行任务的时候,先根据 skill ruleset 应该调用什么样的技能。
现在看了 C 佬这一篇,我后面也会尝试让它先去做好分类,可能还是基于我现有的 ruleset 机制来做,只不过这次自上而下了。

1个回复
wangnov
wangnov 楼主

分类确实很重要,这些问题本质上其实就是,如果想立竿见影出效果,随意就好。但是如果想长久治理,光有Vibe是不够的,还得够工程化。

TOPIC OWNER
↓ 跳到帖子
wangnov
wangnov 楼主 ↶ @VideoMonster
#9

分类确实很重要,这些问题本质上其实就是,如果想立竿见影出效果,随意就好。但是如果想长久治理,光有Vibe是不够的,还得够工程化。

1个回复
VideoMonster
VideoMonster

是的,我很认同。

我觉得上下文里应该放的都是“经验”+数据,减少噪音,其实本质上是在做 context 业务场景建模的感觉

↓ 跳到帖子
TOPIC OWNER
chef
#10

还是有佬比较理性和清醒的,没有被AI冲昏头

VideoMonster
VideoMonster ↶ @wangnov
#11

是的,我很认同。

我觉得上下文里应该放的都是“经验”+数据,减少噪音,其实本质上是在做 context 业务场景建模的感觉

jincs
#13

同感,最近也是把能力通过cli暴露给agent,还设计了一个cli开发大师的提示词,佬友这个更加工程化了

onKotlin
onKotlin
#14

赞同,skill,我们人类的注意力需要聚焦的内容。

Brantfang
Brantfang
#15

不知道为什么上来就是 cli,不是应该有个 core ,然后 core 在发展成 cli 或者 gui 甚至 web 服务。

1个回复
wangnov
wangnov 楼主

很多情况下,VibeCoding的脚本都是封装成cli来使用,比如python xxx.py start --a true --b 1234,野蛮生长,也对Agent不友好,甚至对人类也不友好。

这里只是针对宏观的各种cli应该如何设计,不探讨该不该设计cli的问题。就像佬友所说,等到了自然发展出应该设计cli的时候,在考虑这个skill不迟。

TOPIC OWNER
↓ 跳到帖子
wangnov
wangnov 楼主 ↶ @Brantfang
#16

很多情况下,VibeCoding的脚本都是封装成cli来使用,比如python xxx.py start --a true --b 1234,野蛮生长,也对Agent不友好,甚至对人类也不友好。

这里只是针对宏观的各种cli应该如何设计,不探讨该不该设计cli的问题。就像佬友所说,等到了自然发展出应该设计cli的时候,在考虑这个skill不迟。

1个回复
derrick
derrick

佬我不太理解什么场景下才需要自己场景 cli,你能描述一下细节吗?
我根据你的描述想到的一个场景:
1)skill 规范里面有 script/, 原先是 vibe coding 一个个小的 script,LLM 通过 bash tool 直接调用
2)改进: 做一个 cli,然后 LMM 通过 bash tool 直接调用 CLI 即可。

↓ 跳到帖子
TOPIC OWNER
derrick
derrick ↶ @wangnov
#17

佬我不太理解什么场景下才需要自己场景 cli,你能描述一下细节吗?
我根据你的描述想到的一个场景:
1)skill 规范里面有 script/, 原先是 vibe coding 一个个小的 script,LLM 通过 bash tool 直接调用
2)改进: 做一个 cli,然后 LMM 通过 bash tool 直接调用 CLI 即可。

2个回复
wangnov
wangnov 楼主

正好佬友你回复的那条里,我有给出示例。
cli是 Command Line Interface,佬友可能认为的CLI是二进制或者系统内的命令才算?其实脚本也算的。

这也是写了个脚本,然后通过cli的方式来调用。但是有的时候我们会发现,脚本迭代的次数越来越多,从v1到v10,cli参数和命令命名越来越长越复杂,什么

python xxx.py run --with-no-command-test-to-avoid-panic true甚至还有很多行……

规范好cli的设计,如何暴露命令和参数,就是这个skill做的事情。

TOPIC OWNER
jjsc
jjsc

有一个差异。cli是编译后的代码,哪怕你将很多东西都弄到里面去了,AI也偷不走。但是如果是script,就不行了。然后AI帮你改了script,你也没法复原。

我一直认为python xxxx.py 这种玩法,其实只是方便AI随时写/更新Skills,仅此而已。正儿八经可以分发的,cli多好啊

↓ 跳到帖子
wangnov
wangnov 楼主 ↶ @derrick
#18

正好佬友你回复的那条里,我有给出示例。
cli是 Command Line Interface,佬友可能认为的CLI是二进制或者系统内的命令才算?其实脚本也算的。

这也是写了个脚本,然后通过cli的方式来调用。但是有的时候我们会发现,脚本迭代的次数越来越多,从v1到v10,cli参数和命令命名越来越长越复杂,什么

python xxx.py run --with-no-command-test-to-avoid-panic true甚至还有很多行……

规范好cli的设计,如何暴露命令和参数,就是这个skill做的事情。

TOPIC OWNER
jjsc
#19

有一个差异。cli是编译后的代码,哪怕你将很多东西都弄到里面去了,AI也偷不走。但是如果是script,就不行了。然后AI帮你改了script,你也没法复原。

我一直认为python xxxx.py 这种玩法,其实只是方便AI随时写/更新Skills,仅此而已。正儿八经可以分发的,cli多好啊

1个回复
derrick
derrick

如果不用python xxxx.py 这种用法,那是不是就是 用自己写的 cli工具的用吗?

↓ 跳到帖子
PJ568
PJ568
#20

虽然但是,每次看到这种说法都有些许难受。

1个回复
wangnov
wangnov 楼主

可以理解,但是我已经被AI和各种播客驯化了哈哈哈,一等公民这个词挺形象,但是可能也隐隐带了一点歧视。

TOPIC OWNER
↓ 跳到帖子
derrick
derrick ↶ @jjsc
#21

如果不用python xxxx.py 这种用法,那是不是就是 用自己写的 cli工具的用吗?

wangnov
wangnov 楼主 ↶ @PJ568
#22

可以理解,但是我已经被AI和各种播客驯化了哈哈哈,一等公民这个词挺形象,但是可能也隐隐带了一点歧视。

1个回复
derrick
derrick

对,很像是那种英文翻译成中文的博客.“一等公民” hh

↓ 跳到帖子
TOPIC OWNER
Trinix
Trinix
#25

的确,mcp本质上也是上下文工程,启动时全量加载无可避免地会占用极大上下文空间,早期的roo/cline等工具本身的提示词就会占用8k往上的上下文空间,这显然不是最好的处理思路
有观点认为,cli是人机交互最好的中介,于是就有了这么一个开源仓库:GitHub - HKUDS/CLI-Anything: CLI-Anything: Making ALL Software Agent-Native · GitHub
能够把可分析的程序做成cli的形式让agent调用,我认为和佬友的想法不谋而合

1个回复
wangnov
wangnov 楼主

CLI-Anything对我的启发也很大,一直有在关注它(虽然没用上过hhh)。总之我的偏好就是万物皆可CLI让Agent操纵,但是以前我写的CLI都还太不Agent友好了,就是因为没有考虑Class First就直接开工(甚至都没有设计环节)

TOPIC OWNER
↓ 跳到帖子
yi124773651
yi124773651
#26

感谢分享 是我之前一直没有注意到的东西 学习学习

wangnov
wangnov 楼主 ↶ @Trinix
#27

CLI-Anything对我的启发也很大,一直有在关注它(虽然没用上过hhh)。总之我的偏好就是万物皆可CLI让Agent操纵,但是以前我写的CLI都还太不Agent友好了,就是因为没有考虑Class First就直接开工(甚至都没有设计环节)

1个回复
Trinix
Trinix

主要是一些软件确实刚需人来手操UI,无法真的实现cli anything,我倒是希望大模型能够在即时思考和输出这个领域有所突破,这样就不必担心无法和人类世界交互了

↓ 跳到帖子
TOPIC OWNER
Trinix
#28

主要是一些软件确实刚需人来手操UI,无法真的实现cli anything,我倒是希望大模型能够在即时思考和输出这个领域有所突破,这样就不必担心无法和人类世界交互了

1个回复
wangnov
wangnov 楼主

最近具身智能那边搞出很多Claw轮子,等他们那边成熟了,直接从现实世界操纵电脑来突破软件这些臭毛病 :laughing:。不过昨天Codex已经震撼到我了,直接靠OCI CLI操作串口检修甲骨文的机器,对着UEFI一顿改,最后成功运维。感觉已经不远了。

TOPIC OWNER
↓ 跳到帖子
wangnov
wangnov 楼主 ↶ @Trinix
#29

最近具身智能那边搞出很多Claw轮子,等他们那边成熟了,直接从现实世界操纵电脑来突破软件这些臭毛病 :laughing:。不过昨天Codex已经震撼到我了,直接靠OCI CLI操作串口检修甲骨文的机器,对着UEFI一顿改,最后成功运维。感觉已经不远了。

1个回复
Trinix
Trinix

gpt 5.4 性能确实优异,知识面也很广,很多时候我自己都意识不到的思维漏洞也能注意到,真的期待未来哪一天能够实现 AGI

↓ 跳到帖子
TOPIC OWNER
Trinix
#30

gpt 5.4 性能确实优异,知识面也很广,很多时候我自己都意识不到的思维漏洞也能注意到,真的期待未来哪一天能够实现 AGI

BaiduStrong
BaiduStrong
#40

太强了佬,其实在oop里也是这个思路,或者说软件设计一直是这个思路,我更喜欢叫它模块化

HalfRain
#41

学到了,感谢佬友,下周用佬的思路写两个cli看看

BraveCalf
BraveCalf
#42

这个要学习,如何更好的做自己想要的工具