核心概念:Skill触发机制是Claude Code中通过斜杠命令调用预设行为的能力。参数系统允许在调用时动态传递上下文信息,使Skill行为更加灵活和智能化。本文深入解析参数传递的完整链路,包括位置参数、命名参数、文件读取、环境变量引用等核心机制。
当用户在Claude Code中输入 /command 并按下回车后,系统会触发一条完整的处理链路。理解这条链路是掌握Skill参数系统的基础。
用户输入以斜杠开头的命令(如 /explain),Claude Code会首先解析输入字符串,提取斜杠后的命令名称。系统会扫描所有已注册的Skill,通过命令名称进行匹配。匹配成功后,进入参数提取阶段。
在命令名称之后,用户输入的所有内容被视为参数串。系统根据Skill的prompt模板中定义的变量占位符(如 {{1}}、{{name}}、{{FILE:path}} 等),从参数串中提取对应的值。
提取的参数值被注入到Skill的prompt模板中,替换对应的变量占位符。填充完成后,prompt模板变为一个完整的、包含具体上下文信息的指令。
填充后的完整prompt被发送给Claude模型执行。模型接收到指令和上下文后,生成相应的响应。
位置参数是最基础的参数传递方式,通过数字索引 {{1}}、{{2}}、{{3}} 等来引用用户在命令后输入的参数,按顺序一一对应。
在Skill的prompt模板中使用 {{1}} 表示第一个参数,{{2}} 表示第二个参数,以此类推。用户输入时,空格分隔的各个部分按顺序填充到对应的占位符中。
当用户输入 /explain python print('hello') 时,{{1}} 被替换为 python,{{2}} 被替换为 print('hello'),最终prompt为:
位置参数不要求连续使用,可以在prompt模板的任何位置出现。同一个位置参数也可以在模板中多次引用,实现参数复用。
对于需要多个参数的Skill,位置参数的数量需要与用户输入匹配。参数数量不够时,模型可能无法正确理解意图。
| 模板定义 | 用户输入 | 填充结果 |
|---|---|---|
| 翻译{{1}}到{{2}} | /translate 英文 中文 | 翻译英文到中文 |
| 对比{{1}}和{{2}} | /compare react vue | 对比react和vue |
| {{1}}与{{2}}的区别 | /diff TCP UDP | TCP与UDP的区别 |
命名参数通过在模板中使用有意义的变量名(如 {{language}}、{{code}}),并通过 --name value 或 --name="value" 语法传递。命名参数比位置参数具有更好的可读性和灵活性。
用户在斜杠命令后使用 --参数名 值 的格式传递参数。模板中使用 {{参数名}} 接收。支持短横线参数名(如 --lang)和等号语法(如 --lang="python")。
使用方式:/explain --language python --code "print('hello')"
命名参数相比位置参数有以下几个关键优势:
命名参数支持默认值设置。当用户在调用时没有提供某个命名参数时,模板中可以使用预设的默认值,确保prompt仍然完整可用。
{{FILE:path}} 语法用于在Skill模板中引用文件内容。当Skill被触发时,系统会自动读取指定路径的文件内容,并将其注入到prompt模板中。这是处理大量上下文信息的重要机制。
在prompt模板中使用 {{FILE:路径}} 占位符,路径可以是相对于项目根目录的相对路径,也可以是绝对路径。系统在执行时自动读取文件内容替换占位符。
{{FILE}} 自动读取package.json、tsconfig.json 等配置文件进行分析{{FILE}} 读取的是Skill定义所在项目中的文件。如果文件路径不存在,系统会报错。建议在使用前确认文件路径正确且存在。
| 路径写法 | 示例 | 说明 |
|---|---|---|
| 相对路径 | {{FILE:src/main.py}} |
相对于项目根目录 |
| 绝对路径 | {{FILE:/home/user/project/config.yml}} |
完整文件系统路径 |
| 带变量路径 | {{FILE:{{1}}}} |
结合位置参数动态指定路径 |
{{ENV:VAR_NAME}} 语法用于在Skill模板中引用环境变量。这对于管理API密钥、访问令牌等敏感信息特别有用,避免在CLAUDE.md或Skill定义中硬编码密钥。
在prompt模板中使用 {{ENV:变量名}} 占位符。系统执行时自动读取当前进程中的环境变量值替换占位符。
{{ENV:OPENAI_API_KEY}} 等密钥信息,用于API调用场景{{ENV:NODE_ENV}} 判断当前是开发/测试/生产环境{{ENV:USER}} 或 {{ENV:USERNAME}} 获取当前用户名{{ENV:HOME}} 或 {{ENV:PATH}} 获取系统路径| 特性 | {{FILE}} | {{ENV}} |
|---|---|---|
| 数据源 | 文件系统 | 进程环境 |
| 适用场景 | 大文本、配置文件、代码 | 短值、密钥、配置标志 |
| 敏感性 | 取决于文件权限 | 可能被 ps 等工具窥探 |
| 动态性 | 文件内容可变 | 进程启动后固定 |
完善的参数验证和错误处理是构建可靠Skill的关键环节。当用户提供的参数不符合预期时,系统应当给出清晰的提示,而不是生成误导性的响应。
对于Skill执行所必需的参数,需要在prompt中明确要求并提供缺失时的处理逻辑。可以在prompt模板中使用条件判断逻辑,或直接在prompt中说明参数要求。
不同类型的参数需要不同的验证策略。例如,数字类型的参数需要验证是否为有效数字;路径类型的参数需要验证文件是否存在。
当参数验证失败时,prompt应当引导用户提供正确的参数。好的错误提示应该包含问题描述、期望格式和示例。
错误提示设计原则:
1. 明确指出缺少哪个参数
2. 说明期望的参数格式
3. 给出具体的使用示例
4. 提供帮助命令(如 /help skill-name)的指引
| 错误场景 | 原因 | 处理方式 |
|---|---|---|
| 参数不足 | 用户提供的位置参数少于模板中的占位符 | 使用默认值或提示用户补充 |
| 参数顺序错误 | 用户混淆了参数的先后顺序 | 使用命名参数避免此问题 |
| 文件不存在 | {{FILE}} 引用的路径无效 |
检查路径是否正确,文件是否存在 |
| 环境变量未设置 | 引用的环境变量不在当前进程中 | 提示用户设置对应环境变量 |
| 特殊字符转义 | 参数中包含引号、空格等特殊字符 | 使用引号包裹参数或进行转义 |