同版本CLI与Skill示例
将以下提示词粘贴到你的 AI 对话框中:
请根据 https://skillhub.cn/install/skillhub.md,安装 @user_2014850e/qy-skillhub-test。
技能介绍
要解决的问题
当 agent 去调用一个 CLI 时,它读到的往往是文档,真正跑起来的是二进制,这两者经常各说各话:文档描述了新版本才有的命令,二进制却是旧的;升级时只把新文件复制进去,旧文档永远留在磁盘上被一起读到;调用方看到 stdout 里出现了 JSON,就以为执行成功了。这个技能是一个最小但完整的示例:一个 helloworld CLI 被打成单文件二进制(内嵌 Node 运行时),skill 与它同版本发布,两者靠 latest.json 一起升级。它重点演示的不是命令本身,而是周边那套分发机制。
核心能力
- 自检命令:
helloworld info打印版本、内嵌的 Node 运行时版本、平台架构与本地路径。packaged: true表示正跑在单文件二进制里;runtime.node是打进二进制的那个 Node,与目标机器上装没装 Node 无关,机器上完全没有 Node 时这条命令照样出结果。 - 业务命令:
helloworld greet [name]支持-l, --locale(zh/en/ja)、-n, --repeat(1~100)、--ndjson(逐行 NDJSON,供流式管道使用)、--plain(只输出纯文本,不带 JSON 包装)。 - 输出契约:调用方主要是 agent 而不是人,因此两条流严格分工——stdout 只放结构化数据(JSON / NDJSON),stderr 放给人看的进度、警告与错误;失败时 stdout 不输出成功结构,刻意与一部分同类 CLI 相反,免得调用方「见到 JSON 就以为成功」。退出码分为 0(成功)、1(通用失败)、2(用法错误,如参数缺失或取值非法)、3(环境不满足)。
分发链路的四条关键约束
- CLI 与 skill 必须同版本。 skill 是 CLI 的操作手册,版本漂移时文档会描述二进制里根本不存在的命令,而 agent 读不出「CLI 旧了」这层意思。因此有 install-*-all 脚本:版本只解析一次再分发给两半。
- 版本从
latest.json现取,不自己拼 URL。 旧版本目录不会被清理,拼错版本段会稳定下载到旧包,还打印「更新完成」。 - 升级是整目录替换,不是
cp叠加。 叠加只加不删,上个版本删掉的文件会永远留下,新旧两套文档同时被读到,而旧的那份不带任何「我已过期」标记。 - 不留备份,尤其别放进 skills 目录。 宿主按
/*扫子目录加载 skill,放个xxx.bak兄弟目录等于凭空多一份陈旧副本。
适用边界与注意点
本技能与 CLI 源码同仓库,改了 CLI 行为就在同一次变更里更新它。命令细节与文档冲突时,以 helloworld --help 的实际输出为准——文档会过期,二进制不会。构建、打包与分发的细节见仓库根目录 README.md,安装与升级步骤见 scripts/install.md,输出契约与退出码的实现见 src/core/output.ts,分发产物的组装见 scripts/dist.mjs。不要自己写更新脚本。
使用场景
- 在无Node的目标机器部署CLI,用`helloworld info`自检内嵌运行时与架构
- 需将CLI打成单文件二进制并和skill同步升级,参考同版本发布机制
- Agent消费CLI输出时,严格区分stdout结构化数据与stderr人类可读信息
- 升级CLI时避免旧文档残留,用整目录替换而非cp叠加保证一致性
适合人员
- 需要同步发布CLI与skill的开发者,诉求是避免版本漂移导致的文档与二进制不一致
- 构建单文件Node CLI的工程师,诉求是实现内嵌运行时与跨平台分发
- 为Agent设计CLI输出契约的开发者,诉求是严格区分stdout与stderr的职责
- 维护CLI升级脚本的开发者,诉求是避免旧文档残留与版本拼写错误