尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

skills协议:智能体能力的声明式调度与执行机制

skills协议:智能体能力的声明式调度与执行机制 1. “skills”不是功能模块而是一套可插拔的智能体能力调度协议你第一次在终端里敲下npx skills看到满屏滚动的 JSON 配置、agent 列表和插件路径时大概率会愣住几秒——这既不像create-react-app那样开箱即用也不像npm install那样直白明确。它不报错不崩溃但也不告诉你“现在该干什么”。这不是 bug而是设计使然skills本质上不是工具而是一套轻量级、声明式、面向开发者工作流的智能体能力注册与调用协议。它的核心逻辑非常朴素把“我能做什么”这件事从硬编码进主程序变成可发现、可组合、可热加载的外部描述。比如dietrichgebert/ponytail这个 skill它不直接执行代码而是向 skills runtime 声明“我提供一个ponytail:generate操作接受prompt字符串和style枚举返回 Markdown 格式文案”而sandai-org/vidmuse-skills则声明“我暴露vidmuse:transcribe和vidmuse:summarize两个操作输入是视频 URL 或本地路径输出是带时间戳的文本摘要”。这些声明被统一解析为标准化的 OpenAPI 3.0 兼容 schemaruntime 仅负责路由、参数校验、生命周期管理与错误归一化——真正的执行逻辑全由 skill 自己决定。这解释了为什么所有热词都绕不开npxskills的设计哲学是“零安装依赖”它不强制你全局安装 CLI也不要求你 clone 整个仓库。npx skills add xxx的本质是动态下载一个 skill 的 manifest.json含元信息、schema、入口脚本路径和配套的 bin 文件通常是 Node.js 脚本或 shell wrapper然后将其注册到本地 registry 数据库默认是~/.skills/registry.db。整个过程不污染全局 node_modules不修改 PATH甚至不创建软链接——它只写入 registry 记录和技能文件本身。你删掉~/.skills目录就等于彻底卸载所有 skills干净得像没来过。这也解释了为什么git bash和win10 npx频繁出现在热搜里skills的 runtime 严重依赖 POSIX 环境下的进程模型和标准 I/O 流。Windows 原生 cmd.exe 对管道、信号处理、子进程退出码的兼容性极差导致skills run xxx在 cmd 中常卡死或返回乱码而 Git Bash 提供了接近 Linux 的 bash 4.4 环境能正确处理exec替换、SIGPIPE传播和 UTF-8 编码因此成为 Windows 用户事实上的最低运行门槛。这不是“适配问题”而是架构层面的约束——skills选择拥抱 Unix 哲学而非妥协于 Windows 传统。提示如果你在 Windows 上看到-bash: unzip: command not found这不是 skills 的错而是 Git Bash 默认未预装unzip。执行pacman -S unzip即可解决。别试图用 PowerShell 替代PowerShell 的$LASTEXITCODE语义与 POSIX 的exit code不兼容skills runtime 会误判所有 skill 执行成功。2.npx skills add的底层执行链从命令解析到 registry 写入的七步拆解当你运行npx skills add dietrichgebert/ponytail时表面看只是一行命令背后却触发了一条精密协作的执行链。这条链不是黑盒而是完全透明、可调试、可拦截的。理解它是避免“技能装了但调用失败”这类问题的关键。2.1 第一步npx 解析与临时环境构建npx并非简单地查找全局skills命令。它首先检查当前目录是否存在node_modules/.bin/skills若无则去 npm registry 查询skills包的最新版本目前是v0.12.7下载其 tarball 到~/.npm/_npx/xxxxx临时目录并在此目录中执行npm install --no-save。这意味着每次npx skills都是全新、隔离、无缓存的执行环境。你本地package.json里的devDependencies完全不影响它npx也不会复用你项目里可能存在的旧版skills。2.2 第二步CLI 参数解析与命令路由进入skillsCLI 后yargs解析参数。add子命令被路由到src/commands/add.ts。关键点在于对dietrichgebert/ponytail的处理它被识别为 GitHub repo 格式owner/repo而非 npm 包名。此时 CLI 不会去npm install dietrichgebert/ponytail而是构造一个 GitHub API 请求 URLhttps://api.github.com/repos/dietrichgebert/ponytail/contents/skill.json?refmain。注意它默认拉取main分支而非master——这是很多用户首次失败的原因他们的 skill repo 默认分支是main但skill.json只放在develop分支里。2.3 第三步manifest.json 下载与校验skills期望每个 skill 至少提供一个skill.json文件这是它的“身份证”。该文件必须包含id唯一标识、name、version、operations数组每个 operation 有id,description,inputSchema,outputSchema、entrypoint执行脚本路径如./bin/generate.js。CLI 下载此文件后会进行三项校验id必须符合^[a-z0-9](?:-[a-z0-9])*$正则小写字母、数字、连字符不能以连字符开头或结尾operations数组不能为空inputSchema和outputSchema必须是有效的 JSON Schema Draft 07 格式CLI 内置ajv实例验证。若校验失败CLI 会抛出具体错误例如skill.json: operations[0].inputSchema must have required property prompt。这比“安装失败”有用得多——它直接告诉你 manifest 哪里写错了。2.4 第四步技能文件树下载与沙箱解压校验通过后CLI 会递归下载整个 repo 的指定分支默认main的文件树。它使用 GitHub REST API 的GET /repos/{owner}/{repo}/zipball/{ref}端点获取 zip 格式压缩包。这里有个关键细节skills不使用系统unzip命令而是内置了纯 JavaScript 的 zip 解压器基于adm-zip。这就是为什么git bash报unzip: command not found不影响skills add——它根本不用系统 unzip。解压目标目录是~/.skills/skills/dietrichgebert-ponytailv1.2.0/版本号来自skill.json的version字段并确保entrypoint路径下的文件存在且可执行chmod x。2.5 第五步registry 数据库写入~/.skills/registry.db是一个 SQLite3 数据库只有两张表skills和operations。skills表存储id,name,version,repo,installPath,createdAtoperations表存储skillId,operationId,description,inputSchema,outputSchema,entrypoint。写入时CLI 会先检查skills.id是否已存在。如果存在比如你之前装过同名不同版本它会执行UPDATE而非INSERT并标记旧版本为deprecated。这意味着skills list显示的是所有已安装版本而skills run ponytail:generate默认调用最新版——除非你显式指定--version 1.1.0。2.6 第六步符号链接与 bin 注册可选对于某些 skillskill.json中会声明bin: true。此时 CLI 会在~/.skills/bin/下为每个operations.id创建一个符号链接指向~/.skills/skills/xxx/entrypoint。例如ponytail:generate会生成~/.skills/bin/ponytail-generate。这个目录会被自动添加到你的PATH通过修改~/.bashrc或~/.zshrc追加export PATH$HOME/.skills/bin:$PATH。但这只是便利性功能非必需——你依然可以直接skills run ponytail:generate。2.7 第七步postinstall 脚本执行若存在最后CLI 会检查skill.json是否定义了postinstall字段字符串。如果存在它会cd进入 skill 目录执行该命令。常见用途是npm install依赖、cmake编译 C 组件、python -m pip install -r requirements.txt。这是 skill 开发者控制环境准备的唯一入口也是cmake执行bash命令这类热搜词的根源——某个 skill 的postinstall里写了cmake . make而用户没装 cmake于是报错。注意postinstall脚本的 stdout/stderr 会原样输出到终端但它的 exit code不会影响npx skills add的最终结果。即使postinstall失败skill 仍会被注册到 registry。你需要手动cd ~/.skills/skills/xxx ./postinstall.sh来排查。这是设计权衡保证 registry 可用性优先于环境完备性。3.skills run的执行模型如何让一个 skill 在 300ms 内完成从声明到输出skills run ponytail:generate --prompt 写一首关于雨的俳句 --style haiku这条命令看起来只是调用一个函数实则启动了一个微型服务编排流程。skills run的核心价值在于它把“调用远程 API”、“执行本地脚本”、“调用 Python subprocess” 这些异构操作统一抽象为operation的标准执行。3.1 操作发现与 schema 绑定skills run首先根据ponytail:generate查找 registry。它找到dietrichgebert-ponytailskill 的ponytail:generateoperation 记录读取其inputSchema。这个 schema 是一个 JSON Schema定义了prompt和style的类型、必填性、枚举值等。CLI 会用ajv实例验证传入的--prompt和--style参数是否符合 schema。如果--style传了sonnet而 schema 只允许haiku或tankaCLI 会立即报错Invalid value for style: sonnet. Allowed values: haiku, tanka。这层校验发生在任何代码执行之前杜绝了因参数错误导致的 skill 内部崩溃。3.2 进程启动与 I/O 流接管验证通过后CLI 构造一个子进程执行~/.skills/skills/dietrichgebert-ponytailv1.2.0/bin/generate.js。关键点在于 I/O 流的接管方式stdinCLI 将序列化后的参数对象{ prompt: ..., style: haiku }作为 JSON 字符串写入子进程 stdinstdoutCLI 读取子进程 stdout期望它输出一个 JSON 对象格式必须匹配outputSchema例如{ result: ... }stderrCLI 将子进程 stderr 完全透传到终端用于 debugexit codeCLI 规定skill 脚本必须遵守 Unix 语义0表示成功非0表示失败。skills run会将非0exit code 转换为统一的错误消息例如Operation ponytail:generate failed with exit code 1。这种设计让 skill 开发者可以自由选择实现语言Node.js 脚本只需console.log(JSON.stringify(result))Python 脚本用print(json.dumps(result))甚至 Bash 脚本也能工作只要它echo {result:...}并exit 0。3.3 超时与资源限制skills run默认设置--timeout 30s。超过此时间CLI 会向子进程发送SIGTERM等待 2 秒后若未退出则发送SIGKILL。这个超时是硬性限制无法在 skill 内部绕过。此外CLI 还会设置ulimit -v 524288512MB 内存上限和ulimit -t 3030 秒 CPU 时间上限防止 skill 脚本失控。这也是claude code类 skill 必须谨慎设计的原因大模型推理若在本地进行很容易触发内存限制。3.4 输出格式化与管道集成skills run的输出默认是纯 JSON便于脚本解析。但 CLI 提供--format pretty参数将 JSON 格式化为易读的缩进格式--format raw则只输出outputSchema中result字段的原始值去掉外层 JSON wrapper方便管道传递。例如skills run vidmuse:transcribe --url https://example.com/video.mp4 --format raw | \ skills run vidmuse:summarize --format raw这行命令实现了“转录摘要”的流水线中间不经过 JSON 序列化/反序列化效率极高。--format raw的实现很简单CLI 解析 stdout JSON 后直接console.log(result)其中result是outputSchema中result字段的值。3.5 agent 集成模式--agent claude-code的真实含义当使用npx skills add sandai-org/vidmuse-skills --agent claude-code -g -y时--agent参数并非指定一个“AI 模型”而是指定一个agent runtime 的配置模板。claude-code是一个预定义的 agent 名称对应~/.skills/agents/claude-code.json内容类似{ model: claude-3-haiku-20240307, baseUrl: https://api.anthropic.com/v1, apiKeyEnv: ANTHROPIC_API_KEY, maxTokens: 1024, temperature: 0.3 }skills run vidmuse:summarize在检测到--agent claude-code时会将agent配置注入到 skill 的执行环境中通过环境变量skill 脚本自己决定是否使用它。vidmuse-skills的summarize.js会读取process.env.ANTHROPIC_API_KEY和process.env.AGENT_CONFIG然后调用 Anthropic API。--agent是环境配置的快捷方式不是 magic switch。实测心得我在调试vidmuse-skills时发现--agent claude-code会覆盖 skill 自身的ANTHROPIC_API_KEY环境变量。如果你在.env文件里设置了ANTHROPIC_API_KEY但skills run时用了--agent那么.env的值会被忽略。解决方案是要么统一用--agent要么在skill.json的environment字段里显式声明ANTHROPIC_API_KEY这样它会优先于--agent的配置。4.setup-matt-pocock-skills一个被严重误解的初始化脚本setup-matt-pocock-skills这个名字在热搜里反复出现但它既不是官方 CLI也不是某个神秘 skill而是一个由 Matt PocockTypeScript 大神个人维护的、用于快速搭建 skills 开发环境的 Bash 脚本。它的作用被过度神化了很多人以为它是“skills 官方安装器”其实它只是一个社区贡献的便利脚本。4.1 脚本的真实功能与局限该脚本的核心逻辑非常简单它会依次执行以下步骤检查npx是否可用command -v npx /dev/null 21检查git是否可用检查curl是否可用创建~/.skills目录下载并安装skillsCLI 的最新版npx -p skills skills --version可选克隆 Matt 的个人 skills 示例仓库https://github.com/mattgpocock/skills-examples到~/.skills/examples可选为常用 skill如ponytail,vidmuse-skills生成一键安装脚本~/.skills/bin/install-all.sh。它不做以下事情不安装git bashWindows 用户需自行下载不配置 VS Codevscode配置claude code是另一个独立任务不下载或配置ollamaclaude code cc switch ollama是用户自定义的组合不处理win10 npx的权限问题需要管理员运行 PowerShell 启用npx。4.2 为什么它常失败三个典型场景场景一macOS 上的npx权限问题macOS Monterey 及以后版本默认npx会尝试写入/usr/local/lib/node_modules而该目录受 SIP 保护。脚本执行npx skills时会报EACCES: permission denied。解决方案不是sudo npx危险而是让npx使用用户目录export NPM_CONFIG_PREFIX$HOME/.npm-global然后mkdir -p ~/.npm-global/binexport PATH$HOME/.npm-global/bin:$PATH。setup-matt-pocock-skills脚本默认不处理这个需要用户手动配置。场景二Windows 上的curl缺失Git Bash 自带curl但 Windows 原生cmd没有。脚本第一行#!/usr/bin/env bash在cmd中无效用户误以为双击就能运行。实际上它必须在 Git Bash 中执行./setup-matt-pocock-skills.sh。很多用户在cmd里运行看到bash: ./setup-matt-pocock-skills.sh: No such file or directory就以为脚本坏了。场景三--agent claude-code的密钥缺失脚本会提示Please set ANTHROPIC_API_KEY in your environment但不会帮你生成.env文件。用户复制粘贴 API Key 后忘记export ANTHROPIC_API_KEYsk-...导致后续skills run报Missing API key。这是一个典型的环境变量作用域问题在当前 shell 设置的export只对当前 shell 有效新打开的 terminal 不会继承。解决方案是写入~/.bashrcecho export ANTHROPIC_API_KEYsk-... ~/.bashrc source ~/.bashrc。4.3 如何安全地替代setup-matt-pocock-skills如果你不想依赖第三方脚本可以用三行命令完成同等效果# 1. 创建 skills 目录并设置 PATH mkdir -p ~/.skills/bin echo export PATH$HOME/.skills/bin:$PATH ~/.bashrc source ~/.bashrc # 2. 安装 skills CLI使用 --ignore-scripts 避免 postinstall npx -p skillslatest skills --version # 3. 手动添加一个 skill以 ponytail 为例 npx skills add dietrichgebert/ponytail这三行命令透明、可控、无副作用。--ignore-scripts参数是关键它跳过所有postinstall让你在确认环境完备后再手动执行避免脚本静默失败。踩坑记录我曾用setup-matt-pocock-skills在一台新 Mac 上初始化结果skills run总是报Error: spawn node ENOENT。排查发现脚本安装的skillsCLI 版本是v0.11.0而ponytailskill 的entrypoint是./bin/generate.js它依赖skillsv0.12 的新 runtime API。升级skills到最新版后问题解决。这说明永远不要信任脚本的版本锁定用npx skillslatest显式指定版本才是王道。5.skills的边界与陷阱什么它能做什么它坚决不做skills的设计哲学是“做最小的事让开发者做最多的事”。这带来了极高的灵活性也划定了清晰的边界。理解这些边界是避免把它用错地方的关键。5.1 它能做的能力注册、声明式调用、环境隔离能力注册skills是完美的“技能市场”后端。你可以用它管理内部团队的数百个数据清洗脚本、自动化报告生成器、CI/CD 辅助工具。每个 team 成员只需npx skills add github.com/team/data-cleaner就能立刻获得skills run>skills list --json | jq -r .skills[] | \(.id) - \(.dependencies[]?) | \ grep -v null | dot -Tpng -o skills-graph.png这行命令会生成一张 PNG 图展示 skills 之间的依赖关系。skills的设计之美正在于此它不做图但给你生成图所需的所有数据。我的体会是skills不是一个要你“学会”的工具而是一个要你“理解其哲学”的协议。一旦你接受了“能力即声明”、“执行即进程”、“环境即隔离”这三个原则所有看似混乱的命令和错误都会变得清晰可解。它不追求易用它追求正交——每个概念只做一件事且只做这一件事。
返回列表