除了 SKILL.md,Skill 目录里还可以放参考文档、模板、素材和脚本。它们是三级加载里的第三级:只有在 Agent 明确读取、复制或运行时才会用到。
目录结构
my-skill/
├── SKILL.md
├── reference.md 参考文档:按需读进上下文
├── references/ 参考文档较多时按主题分文件
│ ├── api.md
│ └── schema.md
├── scripts/ 脚本:只有这里的脚本能被 run_script 运行
│ └── extract.py
└── assets/ 模板和素材:复制到工作区后使用
└── report-template.docx
除了 scripts/ 是运行脚本的硬性要求,其他目录名都是约定,可以按需调整。附带文件尽量只放完成任务真正需要的东西,不要放 README、安装说明、更新记录这类写给人看的文档。
Agent 如何访问附带文件
Skill 安装在 StablEdge 的数据目录里,不在工作区。Agent 不能用通用的文件或终端工具访问这些文件,只能通过 skill 工具:
| 动作 | 用途 | 限制 |
|---|---|---|
list_files | 列出附带文件和大小,声明过角色的会标注角色 | 分页,每页最多 200 条。跳过以 . 开头的文件和目录、__pycache__、node_modules、符号链接,以及根目录的 SKILL.md。 |
read_file | 把一个文本文件读进上下文,可用 offset / limit 按行读取 | 按 UTF-8 读取;前 8 KB 里含空字节的文件视为二进制,会被拒绝。 |
copy_file | 把文件复制到当前工作区,dest 是工作区内的相对路径,默认与文件在 Skill 里的相对路径相同 | 单个文件不超过 20 MB;写入工作区需经过宿主的安全检查。 |
run_script | 由宿主在沙箱里运行 scripts/ 下的脚本 | 见下文运行脚本。 |
加载 Skill 时,StablEdge 会把附带文件清单(最多前 20 项)和这些读法一起交给 Agent。所以在正文里引用附带文件时,写相对于 Skill 目录的路径即可,例如 reference.md、scripts/extract.py。路径必须留在 Skill 目录内:绝对路径、~ 开头的路径、盘符路径、用 .. 或符号链接跳出目录的路径都会被拒绝。
声明资源
Progressive Skill 可以在 frontmatter 的 resources 里声明附带文件和它们的角色。下面摘自内置 pdf Skill(builtin/pdf/SKILL.md,节选):
resources:
- path: reference.md
role: reference
- path: scripts/extract_text.py
role: executable
- path: scripts/merge_pdfs.py
role: executable
每一项的校验规则:
path:相对于 Skill 目录的路径,反斜杠会转成/;不能为空、不能是绝对路径或盘符路径、不能含..;path不能是SKILL.md,同一路径不能声明两次;- 声明的文件必须真实存在于 Skill 目录内;
role必须是下表四个值之一。
任一项不合规都会让整个 Progressive 校验失败,处理方式见 校验与降级。
resources 只在 frontmatter 同时有 progressive 时才会被解析;普通 Skill 写了也不生效。没有声明的文件同样可以被列出、读取和复制,声明的作用是提前校验文件存在,并在文件清单里标出角色。资源角色
| role | 适合放什么 | Agent 通常怎么用 |
|---|---|---|
reference | 接口文档、数据结构、详细规范等参考资料 | read_file 读进上下文 |
executable | scripts/ 下的脚本 | run_script 运行 |
template | 要基于它生成产物的模板,如文档模板、项目骨架 | copy_file 复制到工作区再修改 |
asset | 图片、字体、示例文件等直接用在产物里的素材 | copy_file 复制到工作区 |
角色是给 Agent 看的标注,不会改变动作本身的限制,例如标成 executable 的文件如果不在 scripts/ 下,仍然不能用 run_script 运行。
运行脚本
需要稳定、可重复执行的操作(格式转换、批量处理、数据提取),比起让 Agent 每次重写代码,更适合写成脚本放进 scripts/。正文里写的“用 python 运行 scripts/xxx.py”,Agent 会转成 run_script 调用,由宿主执行,而不是交给 shell。
运行时
宿主按文件扩展名选择自带的运行时:
| 扩展名 | 运行时 |
|---|---|
.py | 宿主自带的 Python(隔离模式、UTF-8) |
.js、.mjs、.cjs | 宿主自带的 Node.js |
.ts、.mts、.cts | Node.js + tsx |
.sh、.bash | Bash(系统里需要能找到 Bash) |
| 无扩展名 | 按首行 shebang 识别 python、python3、node、bash、sh |
其他类型(包括可执行程序)一律不支持。
限制
| 项目 | 限制 |
|---|---|
| 脚本路径 | 必须在 Skill 的 scripts/ 目录内 |
| 超时 | 1–300 秒,默认 60 秒 |
| 参数 | 通过 argv 逐项传入,最多 64 项,每项不超过 8 KB |
| 网络 | 默认使用 frontmatter 中声明的域名;也可以在调用时用 network_hosts 指定,最多 16 个,只接受精确的 HTTPS 域名(不接受 IP、端口、通配符和 URL);传空列表即离线运行 |
| 工作区 | 需要当前对话有可用的本地工作区,否则会返回 SKILL_SCRIPT_WORKSPACE_UNAVAILABLE |
安全机制
- 每次运行脚本都需要用户单独确认,确认卡上会显示将要放行的网络域名;
- 宿主先为 Skill 目录做一份快照并校验内容 hash,确认与 Agent 加载时一致后才运行,防止运行期间被替换;
- 脚本在操作系统沙箱里运行,工作目录是当前工作区;
- 内置 Skill 的脚本要先
load该 Skill 才能运行; - 运行结果以
status、exit_code、duration_ms、truncated、stdout、stderr返回给 Agent。
SKILL_INSTALL_EXECUTABLE_CONTENT),提醒用户先检查内容。编写建议
- 参数从命令行读取,结果写到标准输出或工作区内的文件,不要写死路径;
- 出错时返回非零退出码,并把原因写到标准错误,方便 Agent 调整;
- 尽量只依赖运行时自带的库,不要在脚本里临时下载或安装依赖;
- 发布前实际运行一遍,确认输出符合预期。