合集:Claude Code Skills 系列 · 中级篇(一)
前言
初级篇里我们学会了创建 Skill、配置 CLAUDE.md 和 settings.json。但很多人的 Skill 用着用着会发现:自动触发不准、工具权限太粗放、Skill 写着写着越来越臃肿。
本篇深入讲解两个核心机制:语义自动触发和工具权限精细控制,让你的 Skill 更智能、更安全。国内使用Claude Code 访问 ccAiHub.com
一、深入理解自动触发机制
1.1 触发原理
Claude Code 在每次会话启动时,会读取所有 Skill 的 description 字段,构建一个"意图映射表"。当你输入任何请求时,Claude 会做语义匹配,判断是否有对应 Skill 应该被加载。
这个过程不是简单的关键词匹配,而是基于语义理解的模糊匹配。
1.2 description 的写作公式
高效 description = 核心功能描述 + 典型触发短语 + 边界条件
# 公式示例
description: >
[核心功能] 分析 Git 暂存区变更,生成 Conventional Commits 格式提交信息。
[触发短语] 触发词:提交信息、commit message、git commit、帮我提交、write commit。
[边界条件] 仅处理 Git 仓库内的提交,不处理 SVN 或其他版本控制系统。
1.3 description 优化实验
下面是同一个 Skill 的三种 description,触发准确率从低到高:
差(关键词堆砌):
description: 代码审查 review PR 检查代码
问题:没有说明触发场景,Claude 不知道什么时候该用这个 Skill。
中(有功能描述,缺触发词):
description: 对代码进行全面审查,包括代码质量、安全漏洞和性能问题。
问题:Claude 能理解功能,但不知道用户会怎么表达。
好(功能 + 触发词 + 边界):
description: >
执行全面代码审查,检查代码质量(可读性、复杂度)、安全漏洞(OWASP Top 10)
和性能问题。当用户说"review 一下"、"帮我看看代码"、"代码审查"、"code review"、
"有没有问题"时触发。针对 diff 内容或指定文件,不处理整个项目级别的宏观分析。
1.4 避免触发冲突
当你有多个功能相近的 Skill 时,容易出现触发冲突(Claude 不知道该用哪个)。
冲突示例:
# Skill 1
description: 帮助审查 API 代码的质量和安全性
# Skill 2
description: 审查后端代码,确保符合团队规范
消除冲突的方法:
# Skill 1 - 更明确的边界
description: >
专门审查 REST API 端点代码,重点关注:请求验证、认证授权、响应格式、
错误处理和 API 安全(注入、CORS 等)。
触发词:API 审查、接口安全、endpoint review。
不包括:前端组件、数据库 schema、CI/CD 配置。
# Skill 2 - 不同的触发场景
description: >
按照团队编码规范审查后端业务逻辑代码(Service 层、Repository 层),
检查命名规范、注释完整性和单元测试覆盖。
触发词:规范检查、业务逻辑 review、service 层审查。
1.5 禁用自动触发
如果某个 Skill 太危险或太具体,不希望自动触发:
---
name: production-deploy
description: 部署到生产环境。触发词:生产部署、deploy to prod。
disable-model-invocation: true # 禁止自动触发,只能手动 /production-deploy
user-invocable: true
---
二、工具权限精细控制
2.1 为什么需要精细控制?
如果 Skill 有 allowed-tools: [Bash] 但没有具体限制,Claude 可能执行:
rm -rf ./node_modules # 你可能不想要这个
git push --force origin main # 绝对不想要这个
curl http://external-api.com # 可能存在安全风险
精细的工具控制让每个 Skill 只能做它应该做的事。
2.2 Bash 工具的精细限制
allowed-tools 中的 Bash 支持参数模式匹配:
# 只允许只读 git 命令
allowed-tools:
- Read
- Bash(git diff*)
- Bash(git log*)
- Bash(git status*)
- Bash(git show*)
# 测试相关 Skill,只允许测试命令
allowed-tools:
- Read
- Bash(npx vitest*)
- Bash(npx jest*)
- Bash(python -m pytest*)
# 文档生成 Skill,允许写入,但只限特定目录
allowed-tools:
- Read
- Write(docs/**)
- Bash(npx typedoc*)
2.3 settings.json 中的全局权限 vs Skill 级别权限
两个层次的权限控制:
全局权限(.claude/settings.json):所有操作都受这个约束
{
"permissions": {
"allow": ["Read", "Edit", "Bash(git *)"],
"deny": ["Bash(rm -rf *)"]
}
}
Skill 级别权限(SKILL.md 的 allowed-tools):进一步限制该 Skill 能用的工具
# 即使全局允许了 Bash,这个 Skill 也只能用只读的 git 命令
allowed-tools:
- Read
- Bash(git diff*)
- Bash(git log*)
优先级:Skill 级别权限 ≤ 全局权限(Skill 不能突破全局限制)
2.4 构建最小权限原则的 Skill
以一个"API 文档生成"Skill 为例,展示完整的权限设计:
---
name: api-docs
description: >
读取 TypeScript 源码,生成 OpenAPI 规范文档并写入 docs/api/ 目录。
触发词:生成 API 文档、更新接口文档、openapi spec。
allowed-tools:
- Read # 读取源码
- Glob # 查找文件
- Grep # 搜索注释和类型定义
- Write(docs/api/*) # 只能写入 docs/api 目录
- Bash(npx typedoc --out docs/api src/) # 只允许这一条具体命令
user-invocable: true
---
## 任务说明
扫描 src/ 目录下的 TypeScript 文件,提取 JSDoc 注释,生成 OpenAPI 3.0 规范文档。
## 步骤
1. 用 Glob 找到所有 `src/**/*.ts` 文件
2. 用 Grep 提取带有 `@api` 标注的注释
3. 运行 typedoc 生成文档
4. 将结果写入 docs/api/openapi.yaml
三、动态上下文注入:让 Skill 感知实时状态
静态的 SKILL.md 内容在写入时就固定了,但有时需要在执行时注入实时数据。
3.1 反引号感叹号语法
在 SKILL.md 的正文中,使用 !`command` 语法可以在 Skill 加载时执行命令并注入结果:
## 当前项目状态
当前 Git 分支:!`git branch --show-current`
最近 5 次提交:!`git log --oneline -5`
未暂存的变更文件:!`git diff --name-only`
当 Skill 被触发时,这些命令会实时执行,Claude 看到的是真实的输出。
3.2 实际应用:智能代码审查 Skill
---
name: smart-review
description: 基于当前分支和变更内容,进行上下文感知的代码审查。触发词:审查这次变更、review my changes。
allowed-tools: [Read, Bash(git *), Grep]
---
## 当前上下文(自动注入)
**当前分支**:!`git branch --show-current`
**与 main 分支的差异文件**:
!`git diff main --name-only`
**变更统计**:
!`git diff main --stat`
**最近提交历史**:
!`git log main..HEAD --oneline`
---
## 审查任务
基于以上上下文,请对变更内容进行审查:
1. 这次变更的目的是什么?(从 diff 内容推断)
2. 是否有潜在的 Bug?
3. 是否符合代码规范?
4. 是否有遗漏的测试用例?
5. 是否有性能隐患?
输出格式:问题列表(按严重程度排序)+ 总体评价 + 修改建议
四、多文件 Skill 的实战结构
复杂的 Skill 应该拆分成多个文件,避免单个 SKILL.md 过于臃肿。
4.1 推荐目录结构
.claude/skills/deploy-checker/
├── SKILL.md # 主入口:工作流程说明
├── checklists/
│ ├── pre-deploy.md # 部署前检查清单
│ ├── post-deploy.md # 部署后验证清单
│ └── rollback.md # 回滚步骤
├── scripts/
│ ├── check-env.sh # 环境变量检查脚本
│ └── health-check.sh # 健康检查脚本
└── references/
└── deployment-runbook.md # 部署 Runbook 引用
4.2 主 SKILL.md 的组织方式
---
name: deploy-checker
description: 执行部署前全面检查,确保代码可以安全上线。触发词:部署检查、pre-deploy、上线前确认。
allowed-tools: [Read, Bash(git *), Bash(./scripts/*)]
user-invocable: true
---
## 使用说明
本 Skill 执行三阶段部署检查,使用前请确保:
- 已在 main 分支上完成 code review
- PR 已合并,CI 已通过
## 第一阶段:环境检查
参考 `checklists/pre-deploy.md` 执行逐项检查。
运行脚本:`./scripts/check-env.sh`
## 第二阶段:代码质量验证
1. 检查是否有 TODO/FIXME 未处理
2. 确认所有测试通过
3. 验证 Bundle 大小未超出阈值
## 第三阶段:部署后验证
参考 `checklists/post-deploy.md`,部署后 5 分钟内完成验证。
## 如果出现问题
立即参考 `checklists/rollback.md` 执行回滚。
五、Skill 的版本管理与迭代
5.1 用 Git 追踪 Skill 的演进
# 查看 Skill 的修改历史
git log --oneline .claude/skills/deploy-checker/
# 对比两个版本
git diff HEAD~3 .claude/skills/deploy-checker/SKILL.md
5.2 "先迭代,再提炼"的工作方法
不要一开始就尝试写出完美的 Skill,而是:
- 先在对话中反复实验:找到有效的 Prompt 模式
- 请 Claude 帮你提炼:
我们刚才解决这个问题的方式效果很好,帮我把这个工作流提炼成一个 SKILL.md 文件 - Claude 自动生成:包括 description、allowed-tools、步骤说明
- 保存到
.claude/skills/:团队共享
六、本篇小结
| 技术点 | 关键要素 |
|---|---|
| 自动触发优化 | description = 功能描述 + 触发短语 + 边界条件 |
| 触发冲突消除 | 明确每个 Skill 的适用边界,避免功能重叠 |
| 工具精细控制 | 使用参数模式匹配,遵循最小权限原则 |
| 动态上下文注入 | !`command` 语法注入实时数据 |
| 多文件结构 | 主 SKILL.md + checklists/ + scripts/ + references/ |
下一篇我们深入 Hooks 钩子机制,它能在 Claude Code 的特定生命周期自动触发确定性脚本,让工作流更加自动化。
系列导航
- 初级篇(一):什么是 Skills,为什么需要它
- 初级篇(二):从零创建你的第一个斜杠命令
- 初级篇(三):CLAUDE.md 与配置体系入门
- 中级篇(一):自动触发机制与工具权限精细控制 ← 当前
- 中级篇(二):Hooks 钩子与确定性自动化
- 中级篇(三):团队协作与 Git 共享实践
- 高级篇(一):CI/CD 集成与无头模式
- 高级篇(二):动态上下文注入与多文件 Skill
- 高级篇(三):多智能体编排与复杂工作流