`skills/` 目录清单与每个包的文件构成:70 个目录、70 个文件

2026-08-10

如果你是从 Agent Skills 这一侧接触 CLI-Anything 的,第一个会打开的目录多半是仓库根的 skills/。这一层的作用很直白:它是给 agent 读的那批文件的集中放置点。但真正打开之后,它的构成和很多人对「技能包」的预期不一样——不一样在哪,是这篇要说清的核心。

我们采集时(2026-08-10,对应仓库快照 39634a6)先把这一层的形状数了一遍。

目录清单:70 个子目录,顶层只有一个文件

find skills -maxdepth 1 -mindepth 1 -type d | wc -l 数出来是 70 个子目录。其中 69 个以 cli-anything- 开头,剩下 1 个例外是 skills/cli-hub-meta-skill/(用 find skills -maxdepth 1 -mindepth 1 -type d ! -name 'cli-anything-*' 可以直接把它挑出来)。

skills/ 顶层的文件只有一个:skills/README.mdfind skills -maxdepth 1 -type f)。这份 README 我们采集时是 31 行。

命名规则是机械的:目录名 = cli-anything-<软件名>,软件名里的下划线转成连字符。skills/README.md 第 9 到 13 行给出的布局示例就是 skills/cli-anything-audacity/SKILL.md 这种形态。

顺带一个对得上的数:70 个文件里,frontmatter 的 name 值与所在目录名 100% 一致(逐个比对,mismatch 为 0)。写法上有一处小分裂——69 个的 name 用双引号包着,只有 skills/cli-hub-meta-skill/SKILL.md 第 2 行写的是不带引号的 name: cli-hub-meta-skill。frontmatter 里到底有哪些字段、哪些是必填,另有一篇专门讲,这里不展开。

反直觉的那一处:每个包里只有一个文件

这是本篇真正要讲透的地方。把 skills/ 下所有非顶层文件按文件名归类:

find skills -mindepth 2 -type f -printf '%f\n' | sort | uniq -c

输出只有一行70 SKILL.md

也就是说,这 70 个目录里,每个目录恰好只有 1 个文件,文件名统一是 SKILL.md。没有 references/,没有 scripts/,没有 assets/,没有任何附属目录,也没有随包分发的脚本文件。

为什么说这反直觉:很多人对「技能包」的默认想象是一个自带脚本和资料的目录,装进 agent 就多了一份能干活的东西。而在这个仓库里,skills/ 下的每个包都只是一份 Markdown 说明书。

那真正干活的部分在哪?在另一条完全独立的安装路径上。我们统计 70 份 SKILL.md 正文的关键字覆盖时,有 35 份里出现了 pip install cli-anything- 这种形态的字样——也就是那个软件对应的 harness 包本身,得你另行安装。而 harness 装上之后要驱动的是本机上的宿主软件(Blender、OBS、GIMP 这类),那也得你自己装。这一整条链路上的每一环都会在你本机上执行外部程序与脚本,这一点在决定要不要用之前必须先摆到台面上。

由此引出一条判断纪律:skills/ 下有个目录,不等于对应能力可用。同一个仓库里就有反例——sketch 这个 harness 目录下 find sketch -iname '*skill*' 没有任何输出,registry.json 里 sketch 的 skill_md 字段是 null。目录清单和能力清单是两张表,别混着看。

一个文件要装下多少东西:49 行到 789 行

既然每个包就一份文件,所有信息就都压在这一份里。wc -l skills/*/SKILL.md 的分布是这样的(n=70):最小 49 行(skills/cli-anything-threemf/SKILL.md),最大 789 行(skills/cli-anything-cloudcompare/SKILL.md),中位数 172 行,合计 13270 行。

同样是「一个包一份文件」,最长和最短之间差了十几倍。这不是随机波动,而是结构上的分层——我们抽 10 个不同应用,用 grep -n '^## ' 把它们的小节序列列出来对照:

文件行数## 小节序列
gimp256Installation / Usage / Command Groups / Examples / State Management / Output Formats / For AI Agents / More Information / Version
obs-studio229与 gimp 同序
ollama220与 gimp 同序
blender298同上序列,另插入 Preview Workflow(第 255 行)
zotero186Installation / Entry Points / Important Constraints / Command Groups / Examples / Version
lldb168Capabilities / Quick Commands / Debug Adapter Protocol / Command Groups / Agent Usage Notes
live2d105只有 Commands (42 total)Examples 两节
jumpserver350Quick Start / Agent Usage Guidance / Output Formats / Exit Codes / File Locations(前 236 行是 frontmatter 里的命令清单)
n8n50Installation / Configuration / Command Groups / For AI Agents
threemf49Installation / Commands / JSON Output / Key Features

这张表要这么读:gimp、obs-studio、ollama 三份是完全贴着模板走的,模板是 cli-anything-plugin/templates/SKILL.md.template,它定义的固定顺序是 Installation → Usage → Command Groups → Examples → State Management → Output Formats → For AI Agents → More Information → Version(模板第 12 到 123 行)。blender 是模板加一节。往下则逐级偏离:zotero 与 lldb 是自定义序列,live2d 只剩两节,jumpserver 干脆把大半内容塞进了 frontmatter。

把 9 个模板小节做成判定条件逐文件比一遍,结果是:同时具备全部 9 个模板小节的只有 14/70;一个模板小节都不含的有 10/70——eez-studio、eth2-quickstart、krita、musescore、nsight-graphics、openrefine、quietshrink、unrealinsights、web-yu-pri,以及那个例外的 cli-hub-meta-skill。

从全量频次看,最常见的小节是 Installation 49 次、Command Groups 46 次、Usage 31 次、For AI Agents 30 次、Version 29 次、Examples 26 次、Output Formats 25 次、More Information 19 次、State Management 16 次,再往后是 Prerequisites 11 次、Requirements 7 次。分母都是 70。

正文里的关键字覆盖:安装口径有两套写法

比小节标题更能说明「这份文件写给谁看」的,是正文里的子串覆盖(分母同为 70):

关键字命中文件数
--json67
REPL50
pip install cli-anything-35
| Command | Description | 表头31
Undo/Redo14
npm install3
npx skills0
uv tool install0

前四行的意思是清楚的:这些文件的主体就是「有哪些命令」加「输出是 JSON」这两件事,67/70 提到 --json。模板给 agent 的固定 5 条指引里第一条就是始终用 --json,其余四条是检查返回码(0 为成功)、失败时解析 stderr、文件操作用绝对路径、导出后校验产物存在(模板第 105 到 113 行)。模板还固定声明了状态能力:Undo/Redo 最多 50 级、项目状态以 JSON 持久化、会话跟踪(模板第 82 到 88 行)。

最后两行才是需要停下来看的:npx skills 在 70 份 SKILL.md 正文里出现 0 次。而 skills/README.md 第 3 到 4 行把这个目录定位成 npx skills 的 canonical surface,第 18、19 行给出的用法正是:

npx skills add HKUDS/CLI-Anything --list
npx skills add HKUDS/CLI-Anything --skill cli-anything-audacity -g -y

也就是说,skills/README.md 讲的是「怎么把这份 skill 装进你的 agent」,而 35 份 SKILL.md 正文里的 pip install cli-anything- 讲的是「怎么把干活的那个包装进你的 Python 环境」。两处写的是两件不同的事,落在不同的层上;README 那条安装口径没有在任何一份 SKILL.md 正文里复述。我们只陈述这个差异,不推断原因。npx skills 这个外部工具的真实行为不在本仓内,我们没有核实过,只记录了 README 里的命令文本。

顺带把「装到哪」这件事的几个位置摆清楚,都是仓库文本里的:全仓对 ~/.claude 的引用只有一处,而且是插件安装而非 skill 安装——cp -r CLI-Anything/cli-anything-plugin ~/.claude/plugins/cli-anything(根 README.md 第 342 行)。运行时的「全局 skill 目录」默认是 ~/.agents/skills,可用环境变量 CLI_ANYTHING_GLOBAL_SKILLS_DIR 覆盖(cli-anything-plugin/repl_skin.py 第 136 到 139 行)。其他宿主的目录在根 README 里另有说明:OpenClaw 是 ~/.openclaw/skills/cli-anything(第 520 到 521 行)、Codex 是 $CODEX_HOME/skills/cli-anything~/.codex/skills/cli-anything(第 556 行)、Hermes 是 ~/.hermes/skills/cli-anything-hermes(第 608 行)、Reasonix 是 ~/.reasonix/skills/cli-anything(第 650 行)。

70 与 69 差的那一个

harness 目录(含 agent-harness/ 的顶层目录)我们采集时是 69 个,skills/cli-anything-* 前缀的也是 69 个,加上 cli-hub-meta-skill 才凑成 70。cli-hub-meta-skill 不对应任何一个软件的 harness,它是 catalog 发现型的 meta skill。

但这里的 69 对 69 并不是一一对应——比如 skills/cli-anything-ccswitch/ 对应的 harness 目录叫 cc-switchskills/cli-anything-threemf/ 对应的是 3MF。谁对谁、哪几对错位,是另一篇的话题,本篇只交代 70 这个数是怎么凑出来的。

另外,skills/ 下这 70 份不是全仓的全部。全仓 SKILL.md 我们数到 150 份(find . -name 'SKILL.md' -not -path './.git/*' | wc -l),也就是说除了 skills/ 下这 70 份,还有 80 份散在 harness 包内与其它目录里。同一份内容在仓库里存在几份、彼此一不一致,同样另有专篇,这里不重复。

这一层里标了非稳定的地方

按红线要求,仓库自己标了 beta / experimental 的地方要照实列。在 skills/ 下全量 grep(grep -rniE '\b(beta|experimental|WIP|coming soon|TODO|not yet implemented|placeholder)\b' skills/)只命中 4 处,全部原样记录:

  • skills/cli-anything-notebooklm/SKILL.md 第 3 行(description):Experimental NotebookLM harness for listing notebooks, managing sources, asking questions, generating artifacts, and downloading outputs through an installed notebooklm CLI.
  • 同文件第 8 行:Experimental NotebookLM harness for CLI-Anything.
  • 同文件第 69 行:Treat this harness as experimental and unofficial.
  • skills/cli-anything-zotero/SKILL.md 第 29 行:Experimental SQLite write commands are local-only, user-library-only, and should be treated as non-stable power-user operations.

70 份里只有 2 份带这类字样,剩下 68 份没有标注——这只是「文本里没写」这一件事,不能反过来当成成熟度声明来读。

你可以自己复现的核查动作

上面每个数都是从文件系统数出来的,clone 之后按顺序敲这几条就能自己对一遍:

find skills -maxdepth 1 -mindepth 1 -type d | wc -l
find skills -maxdepth 1 -mindepth 1 -type d -name 'cli-anything-*' | wc -l
find skills -maxdepth 1 -type f
find skills -mindepth 2 -type f -printf '%f\n' | sort | uniq -c
find skills -name 'SKILL.md' | wc -l
wc -l skills/*/SKILL.md

我们采集时依次得到 70、69、只有 skills/README.md、只有 70 SKILL.md 这一行、70;最后一条会逐个文件列出行数,末行的 total 就是合计,我们数到的是 13270 行。

要判断某个具体的包够不够用,还有两个动作值得配上:一是 grep -n '^## ' skills/cli-anything-<软件>/SKILL.md,看它的小节序列是贴模板还是裁剪版(对照本文那张 10 个应用的表就知道自己拿到的是哪一档);二是 grep -n 'pip install cli-anything-' skills/cli-anything-<软件>/SKILL.md,确认它有没有写清楚干活的那个包怎么装——70 份里只有 35 份写了。

数字会随上游更新变动,重要的不是记住 70 和 13270,而是记住这一层的构成:一个目录一份 Markdown,说明书在这里,能力在别处,宿主软件还得你自己装。


本文依据 CLI-Anything 官方仓库(github.com/HKUDS/CLI-Anything)的 README、registry.jsondocs/ 与各 agent-harness/ 下的源码整理,核对日 2026-08-10,对应仓库快照 39634a6。 本文内容为仓库源码与文档口径,我们没有安装或运行过其中任何一个 harness, 也没有在本机驱动过任何一款宿主软件,因此不涉及实际操控效果的任何描述。 这类 harness 会在本机执行外部程序与脚本,是否使用请结合自身环境评估。 注册表与 harness 内容随上游更新而变动,请以仓库最新内容为准。 安全相关做法请结合自身环境评估,本文不构成安全方案建议。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。