最近把技能包这件事管起来了:bl skill 一条命令对出三态清单,装了什么、有没有过期,还不用 Key
一、起因是我数不清自己到底装了几个
最近整理电脑,翻到好几个装着 SKILL.md 的目录,然后我卡住了:这些技能包我是什么时候装的,从哪儿装的,哪几个还跟着上游在更新,哪几个早就旧了,agent 每次读的又是哪一份。
一个都答不上来。
装的时候各有各的装法,有的跟着教程复制一条命令,有的从别人仓库里拷一个目录过来。当时都装成功了,事后就再没管过。这东西单个看无所谓,攒到十几个就开始有点乱,尤其这阵子技能框架明显热起来了。我这周看到 CoddyKit 对 GitHub Trending 的那份周分析(窗口是 10 月 19 到 25 日),趋势第一条就是 agent 技能框架,代表仓库 mattpocock/skills。装的人多了,"我装了什么"这个问题就躲不过去了。
后来发现阿里云百炼的命令行里有一组命令专门管这件事,叫 bl skill,底下有 list、add、update、remove、init 五个。它对着一个官方技能注册表,能一次说清三件事:注册表里有什么、我本地装了什么、装的是不是最新版。
让我立刻愿意试的一点是:整组命令都不需要 API Key,不登录、不调模型。安装说明在CLI 安装页,装好 bl 就能跑;Key 等以后用别的命令再领也来得及,想先在网页上逛逛可以去阿里云百炼控制台。

二、先跑一条 list,看注册表里有什么
bl skill list
2.8 秒回来一份 JSON,里面有注册表地址、注册表自己的更新时间(2026-10-24 凌晨四点半),还有 16 个技能的名字和状态。
我在一个空目录里跑的,16 条全是 not-installed。这就是三态里的第一态:注册表有、我没有。
我挺喜欢这条命令的一点是,它是对出来的。注册表是一边,我本地是另一边,list 把两边摆在一起给状态。以前我是靠翻目录猜,猜得还挺自信,现在直接读状态字段,没有猜的成分。
顺手把清单里每条的 description 读了一遍。技能本质就是 markdown 加一点自描述信息,会被 agent 当指令读进去,装之前看一眼里面写了什么,我觉得这三十秒花得值。
三、名字不能直接跟在命令后面
装单个技能,正确写法是带 --name:
bl skill add --name bailian-cli
1.6 秒,退出码 0。
但我第一次是这么写的:bl skill add bailian-cli,名字直接跟在后面。0.6 秒,退出码 2,报错 Unexpected argument: bailian-cli。remove 也一样,位置参数写名字同样是退出码 2,同一个报错形态。
坑不深,就是有点闷:退出码 2 的时候它不把可装名单打给你,你得自己再跑一次 list 去对名字。所以我现在的习惯变成先 list、再从清单里复制名字,不手打。手打容易在连字符和大小写上出错,错了也看不出来。

四、init 和 add --all 差的那 5 个
这两条我以前一直以为是同一件事:
bl skill init
bl skill add --all
我在两个干净环境里各跑了一次,才发现不是。
init 2.0 秒,装了 11 个,全是 bailian- 开头那一族,落盘 2826 个文件。跑完再 list 一次(0.8 秒),11 条 installed、5 条 not-installed。
add --all 1.6 秒,装的是注册表里全部 16 个,落盘 2931 个文件,list 是 16/16 全 installed。
差的就是那 5 个非 bailian- 族的技能。init 更像是"把百炼自家这一族一次配齐"的引导命令,add --all 才是"注册表有什么我全要"。我第一次跑完 init 就以为装全了,直到 list 把那 5 条 not-installed 摆出来。
落点也顺带说清楚:隔离环境里跑完 add,顶层只多一个 .bailian 目录,技能内容都在 .bailian/skills/ 下面。init 那 2826 个文件里有 2824 个在这个目录里,剩下两个是它自己的状态文件。知道落点,后面想删想查都有地方下手。
五、update 有两副面孔,第二副才有用
查版本用 bl skill update。这条命令我得提醒一句:它有两副面孔。
第一副是什么都没装的时候跑它。0.7 秒,退出码 0,返回一个空的 skills 列表。不报错,也不提示"你还没装任何东西"。我一开始差点把这个当成"检查通过、一切都是最新"。要是写进脚本里只靠退出码判断,这里一定会误判,得自己判空。
第二副是装过之后跑它,逐条给状态。我在 init 之后跑了一次,0.4 秒,每条都是 up-to-date,还各自带着 publishedAt(bailian-cli 那条是 2026-10-23 下午四点十分)。这才是查版本真正有用的读数。
有两个时钟别混:注册表整体的 updatedAt(10 月 24 日)和单个技能的 publishedAt(10 月 23 日)。前者是注册表什么时候更新的,后者是这个技能什么时候发布的。判断我这份新不新,看后者。
还有一种状态我这轮没见到:outdated。要造出它得等注册表发新版,或者把本地锁文件改旧,我嫌麻烦没造,所以这篇里不写它的样例,只写我亲手跑出来的 not-installed 和 up-to-date 两态。哪天你在 list 里看到 outdated,意思就是注册表那边有新版、你本地还是旧的,跑一次 update 就行。
六、卸完还剩三个文件
bl skill remove --name all
0.7 秒,技能文件清干净了,但目录里还剩 3 个状态文件,skill-lock.json 属于这一类。它删的是技能,不动注册表,也不删自己的账本。
只卸一个就写 bl skill remove --name bailian-cli,0.4 秒。--name 后面还能用逗号分隔写多个,这个在只想清掉某几个的时候挺方便。
我在隔离目录里的做法是连 .bailian 一起删,回到真干净。自己电脑上要不要留账本看习惯,留着下次装或者查版本还能对得上,删了就回到第二节那个全是 not-installed 的状态。
七、我现在的一套小流程
这组命令不要 Key,但它是真往磁盘写东西,两千多个文件那种写。所以我给自己定了个规矩:新技能先在隔离 HOME 里装一遍。
做法很土,开一个空目录,把 HOME 指过去,在这个目录里跑命令。list、add、update、remove 全都能在隔离环境里跑通,因为整组不依赖登录态。这一步零成本,跑完把目录一删,什么痕迹都不留。
我的顺序固定成这样:隔离环境里先 list 看清名单,再 add 或者 init,装完去 .bailian/skills/ 下面翻一眼内容,确认没问题了才在真环境里重复一遍。真环境那一遍有参照,基本不会出意外。
八、几句感受:什么时候值得用
说实话,如果你只装一两个技能、而且从来不升级,手动拷目录也能活,这组命令省不了你多少事。
它开始划算的时刻是这三种:装的技能超过五个;上游会发新版,你想知道自己是不是旧的;或者你要把技能装进脚本、装进新人入职流程,需要每次结果一致。这时候"一条 list 看三态、一条 update 查新旧、一条 remove all 清干净"就是最省事的版本治理了。
边界也得说清楚:注册表是百炼官方的技能库,不是任意第三方市场。技能能不能装进某个 agent 的目录、那个 agent 会不会去读 .bailian/skills,取决于你怎么配 agent 的技能路径。这组命令管的是"下载与对账"这一段,管不到 agent 的读取策略。我一开始以为装完 agent 就自动会用了,其实中间还隔着一层路径配置。
整组不要 Key,装完就能 list,这一点确实降低了试的门槛。命令在CLI 安装页,想先在网页上看看百炼还有什么,可以去阿里云百炼控制台。

浙公网安备 33010602011771号