Skill 是注入 system prompt 的可触发指令块,由 harness 在会话初始化时加载元数据,触发后懒加载正文。

Skill 数据结构

internal/skills/loader.go 定义的 Skill 结构体关键字段:

字段说明
Nameskill 标识符(对应目录名)
Description触发条件描述,LLM 路由依据
WhenToUse补充触发说明
AllowedTools限定该 skill 可用的 tool(nil=全部)
ArgumentNames支持的参数名列表
Modelskill 指定模型(覆盖全局)
DisableModelInvocation禁用 LLM 调用,直接执行 shell
UserInvocable是否出现在用户可调用列表
ExecutionContext"inline" 或 "fork"
Shellshell 模式下的 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 调用时触发:

  1. 从 registry 按名查找 skill
  2. 如果 DisableModelInvocation=true:直接执行 shell 命令(shell_execution.go)
  3. 否则:将 skill markdown 正文注入当前 context,让 LLM 按指令执行
  4. 参数替换通过 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 注册