Skill 是注入 system prompt 的可触发指令块,由 harness 在会话初始化时加载元数据,触发后懒加载正文。
Skill 数据结构
internal/skills/loader.go 定义的 Skill 结构体关键字段:
| 字段 | 说明 |
|---|---|
Name | skill 标识符(对应目录名) |
Description | 触发条件描述,LLM 路由依据 |
WhenToUse | 补充触发说明 |
AllowedTools | 限定该 skill 可用的 tool(nil=全部) |
ArgumentNames | 支持的参数名列表 |
Model | skill 指定模型(覆盖全局) |
DisableModelInvocation | 禁用 LLM 调用,直接执行 shell |
UserInvocable | 是否出现在用户可调用列表 |
ExecutionContext | "inline" 或 "fork" |
Shell | shell 模式下的 interpreter |
Source | "userSettings" / "projectSettings" / "bundled" / "mcp" |
加载流程
skills.NewSkillRegistry()
└── LoadAllCommands(cwd)
├── ~/.claude/skills/ (userSettings)
│ 每个子目录读取 SKILL.md
├── .claude/skills/ (projectSettings)
│ 同上
└── bundled skills (internal/skills/bundled.go)
LoadSkillsFromDir() 只支持目录格式:skill-name/SKILL.md,不支持单文件。
Frontmatter 解析
parseFrontmatter() 实现了轻量级 YAML 解析(不依赖第三方库),支持:
key: value键值对- 布尔值(
true/false) - 引号字符串
- 不支持嵌套对象和列表(列表通过逗号分隔或多行处理)
Skill Tool 执行
internal/tools/skill/skill.go 实现 Skill tool,LLM 调用时触发:
- 从 registry 按名查找 skill
- 如果
DisableModelInvocation=true:直接执行 shell 命令(shell_execution.go) - 否则:将 skill markdown 正文注入当前 context,让 LLM 按指令执行
- 参数替换通过
argument_substitution.go完成($ARGUMENTS占位符)
MCP Skill
MCP 服务器的 Prompt 接口也注册为 skill(internal/mcp/manager.go:GetMCPSkills()),命名格式:mcp__serverName__promptName。
参数替换
argument_substitution.go 处理 skill 正文中的参数占位符,将 $ARGUMENTS 或具名参数($ARG_NAME)替换为实际传入值。
相关页面
- architecture — skill 在系统中的位置
- mcp — MCP prompt 作为 skill
- tools — Skill tool 注册