scripts/ 目录中捆绑可重用的脚本。本指南涵盖一次性命令、带有各自依赖项的独立脚本,以及如何设计用于代理使用的脚本接口。
一次性命令
当现有的包已经满足您的需求时,您可以在SKILL.md 指令中直接引用它,而无需 scripts/ 目录。许多生态系统提供在运行时自动解析依赖项的工具。
- uvx
- pipx
- npx
- bunx
- deno run
- go run
- 固定版本(例如,
npx [email protected]),以便命令随时间保持一致的行为。 - 声明先决条件 在您的
SKILL.md中(例如,“Requires Node.js 18+”),而不是假设代理的环境已具备它们。对于运行时级别的要求,使用compatibilityfrontmatter 字段。 - 将复杂命令移入脚本。 当您使用几个标志调用工具时,一次性命令效果很好。当命令变得复杂以至于难以第一次就做对时,
scripts/中经过测试的脚本更可靠。
从 SKILL.md 引用脚本
使用相对于技能目录根目录的路径来引用捆绑文件。代理会自动解析这些路径 — 无需绝对路径。
在 SKILL.md 中列出可用脚本,以便代理知道它们存在:
SKILL.md
SKILL.md
相同的相对路径约定也适用于支持文件(如
references/*.md)— 脚本执行路径(在代码块中)相对于技能目录根目录,因为代理是从那里运行命令的。独立脚本
当您需要可重用的逻辑时,在scripts/ 中捆绑一个脚本,该脚本在内联声明其自己的依赖项。代理可以通过单个命令运行脚本 — 无需单独的清单文件或安装步骤。
多种语言支持内联依赖项声明:
- Python
- Deno
- Bun
- Ruby
为代理使用设计脚本
当代理运行您的脚本时,它读取 stdout 和 stderr 来决定下一步做什么。一些设计选择使脚本更容易被代理使用。避免交互式提示
这是代理执行环境的硬性要求。代理在非交互式 shell 中运行 — 它们无法响应 TTY 提示、密码对话框或确认菜单。阻塞等待交互式输入的脚本将无限期挂起。 通过命令行标志、环境变量或 stdin 接受所有输入:使用 --help 记录用法
--help 输出是代理了解脚本接口的主要方式。包括简短描述、可用标志和用法示例:
编写有帮助的错误消息
当代理收到错误时,消息直接塑造其下一次尝试。不透明的 “Error: invalid input” 浪费了一次回合。相反,说明出了什么问题、预期是什么以及尝试什么:使用结构化输出
优先使用结构化格式 — JSON、CSV、TSV — 而不是自由格式文本。结构化格式可以被代理和标准工具(jq, cut, awk)消耗,使您的脚本可在管道中组合。
进一步考虑
- 幂等性。 代理可能会重试命令。“如果不存在则创建”比“创建并在重复时失败”更安全。
- 输入约束。 用清晰的错误拒绝模糊的输入,而不是猜测。尽可能使用枚举和封闭集。
- 试运行支持。 对于破坏性或状态操作,
--dry-run标志让代理预览将要发生的事情。 - 有意义的退出代码。 对不同的失败类型使用不同的退出代码(未找到、无效参数、认证失败),并在
--help输出中记录它们,以便代理知道每个代码的含义。 - 安全的默认值。 考虑破坏性操作是否需要显式确认标志(
--confirm,--force)或其他适合风险级别的保护措施。 - 可预测的输出大小。 许多代理框架会自动截断超过阈值(例如 10-30K 字符)的工具输出,可能会丢失关键信息。如果您的脚本可能产生大量输出,默认使用摘要或合理限制,并支持
--offset等标志,以便代理在需要时请求更多信息。或者,如果输出很大且不适合分页,要求代理传递--output标志,指定输出文件或-以显式选择加入 stdout。