Skip to Content

06e - Skill 设计模式与排错

本文是《AI Agent 实战手册》第 6 章第 5 节。 上一节:Remotion Skills 与领域 Skills | 下一节:Gemini 2.5 Pro 能力概览

概述

掌握了 Skills 的创建方法后,下一步是学会如何设计可维护、可复用的 Skill 架构,以及在 Skill 不按预期工作时快速定位和修复问题。本节系统讲解三大 Skill 设计模式——组合模式、参数化模式和条件激活模式,并提供一份覆盖从”Skill 不触发”到”上下文溢出”等常见问题的排错指南。无论你使用 Claude Code Skills、Kiro Skills 还是 Vercel Skills,这些模式和排错方法都适用。


1. 设计模式总览

为什么需要设计模式?

随着团队 Skills 数量增长(从几个到几十个),以下问题会逐渐浮现:

  • 职责模糊:多个 Skill 功能重叠,AI 不知道该激活哪个
  • 上下文膨胀:单个 Skill 塞入过多指令,占满上下文窗口
  • 维护困难:修改一个 Skill 影响其他 Skill 的行为
  • 复用性差:相似逻辑在多个 Skill 中重复编写

设计模式的目标是让 Skills 像软件组件一样:高内聚、低耦合、可组合、易测试

三大设计模式速览

模式核心思想适用场景类比
组合模式多个小 Skill 协同完成复杂任务跨领域工作流、多步骤流程微服务架构
参数化模式同一 Skill 通过参数适配不同场景多项目/多环境/多语言复用泛型函数
条件激活模式根据上下文条件决定是否加载环境感知、角色切换、渐进式加载策略模式

工具推荐

工具用途价格适用场景
Claude CodeSkills 宿主(.claude/skills/)Max $100/月,Team $30/用户/月Skills 开发和测试的主要平台
Kiro IDESkills 宿主(.kiro/skills/)Free 50 credits/月,Pro $20/月Steering + Skills + Hooks 协同
skills CLISkills 安装和管理免费(开源)跨平台 Skills 安装
playbooks.comSkills 发现和分享免费浏览社区 Skills 学习设计模式
jqJSON 处理(Hook 脚本)免费(开源)Hook 脚本中解析 prompt 数据
shellcheckShell 脚本静态分析免费(开源)验证 Hook 脚本语法正确性

2. 组合模式(Composition Pattern)

核心理念

将复杂的领域能力拆分为多个职责单一的小 Skill,通过 AI agent 的自然语言理解能力在运行时自动组合。这类似于微服务架构——每个服务做好一件事,通过协作完成复杂任务。

架构图

用户 Prompt:"帮我创建一个新的 API 端点,包含测试和文档" ├─→ [api-design Skill] → 生成 API schema 和路由代码 ├─→ [test-generation Skill] → 根据 API 生成测试用例 └─→ [doc-generation Skill] → 根据 API 生成 OpenAPI 文档

实现方式

方式一:平行组合(Fan-out)

多个 Skill 独立处理同一请求的不同方面:

.claude/skills/ ├── api-design/ │ └── SKILL.md # 负责 API 路由和控制器 ├── test-generation/ │ └── SKILL.md # 负责测试代码生成 └── doc-generation/ └── SKILL.md # 负责 API 文档生成

每个 Skill 的 description 明确声明自己的职责边界:

--- name: api-design description: Design and generate REST/GraphQL API endpoints including route definitions, controllers, validation middleware, and error handling. Use when creating new API endpoints or modifying existing API routes. Does NOT handle tests or documentation - those are separate skills. --- # API 设计指令 ## 职责范围 - REST 端点设计(路由、HTTP 方法、状态码) - 请求/响应 schema 定义 - 验证中间件生成 - 错误处理模式 ## 不在职责范围内 - 测试代码(由 test-generation Skill 处理) - API 文档(由 doc-generation Skill 处理)

关键技巧:在 SKILL.md 中明确声明”不在职责范围内”的内容,帮助 AI 理解边界。

方式二:链式组合(Pipeline)

Skill 之间存在依赖关系,前一个 Skill 的输出是后一个的输入:

[data-modeling Skill] → 生成数据模型 [migration-gen Skill] → 根据模型生成迁移文件 [seed-data Skill] → 根据模型生成种子数据

链式组合的 SKILL.md 需要声明依赖关系:

--- name: migration-gen description: Generate database migration files from data models. Use AFTER data models have been defined. Supports Prisma, Drizzle, and TypeORM. Requires existing schema files as input. --- # 数据库迁移生成指令 ## 前置条件 - 数据模型已定义(通常由 data-modeling Skill 完成) - schema 文件已存在于项目中 ## 工作流 1. 读取现有 schema/model 文件 2. 检测 ORM 类型(Prisma/Drizzle/TypeORM) 3. 生成迁移文件 4. 添加回滚逻辑

方式三:层级组合(Hierarchical)

一个”编排 Skill”协调多个”执行 Skill”:

--- name: full-stack-feature description: Orchestrate the creation of a complete full-stack feature including API, frontend component, tests, and documentation. Use when building a new feature end-to-end. --- # 全栈功能编排指令 ## 执行顺序 1. 使用 api-design Skill 创建后端 API 2. 使用 component-gen Skill 创建前端组件 3. 使用 test-generation Skill 生成测试 4. 使用 doc-generation Skill 更新文档 ## 协调规则 - 每步完成后验证输出再进入下一步 - 如果某步失败,停止并报告,不要继续 - 保持各步骤的命名和路径一致性

组合模式最佳实践

  1. 单一职责:每个 Skill 只做一件事,description 控制在 2-3 句话
  2. 明确边界:在 SKILL.md 中声明”不负责什么”
  3. 松耦合:Skill 之间通过文件系统(代码文件)间接通信,而非直接引用
  4. 可独立使用:每个 Skill 都能单独工作,组合只是增强

3. 参数化模式(Parameterization Pattern)

核心理念

创建一个通用 Skill 模板,通过外部配置文件或项目上下文注入参数,使同一 Skill 适配不同项目、团队或环境。这类似于编程中的泛型或模板方法模式。

适用场景

  • 同一团队维护多个项目,每个项目技术栈不同
  • 同一 Skill 需要在开发/测试/生产环境中表现不同
  • 组织级 Skill 需要适配不同团队的编码规范

实现方式

方式一:配置文件驱动

将可变参数抽取到独立配置文件中:

.claude/skills/code-review/ ├── SKILL.md # 通用审查流程(不变) ├── config/ │ ├── defaults.md # 默认配置 │ └── overrides.md # 项目特定覆盖(可选) └── checklists/ ├── security.md # 安全审查清单 ├── performance.md # 性能审查清单 └── accessibility.md # 无障碍审查清单

SKILL.md 引用配置文件:

--- name: code-review description: Perform structured code reviews with configurable checklists for security, performance, and accessibility. Use when reviewing PRs, commits, or code changes. --- # 代码审查指令 ## 配置 - 默认配置:[defaults.md](config/defaults.md) - 项目覆盖:[overrides.md](config/overrides.md)(如果存在则优先) ## 审查流程 1. 加载配置(项目覆盖 > 默认配置) 2. 根据文件类型选择对应清单 3. 逐项检查并记录发现 4. 生成审查报告

config/defaults.md 示例:

# 默认审查配置 ## 语言和框架 - 主语言:TypeScript - 框架:React + Next.js - 测试框架:Vitest ## 审查重点 - 安全:启用(见 checklists/security.md) - 性能:启用(见 checklists/performance.md) - 无障碍:启用(见 checklists/accessibility.md) ## 严格度 - 安全问题:必须修复(blocker) - 性能问题:建议修复(warning) - 风格问题:可选修复(info)

不同项目只需修改 config/overrides.md 即可复用同一 Skill:

# 项目覆盖配置(后端 API 项目) ## 语言和框架 - 主语言:Python - 框架:FastAPI - 测试框架:Pytest ## 审查重点 - 无障碍:禁用(后端项目不需要) ## 额外检查 - SQL 注入防护:启用 - API 速率限制:启用

方式二:项目上下文感知

让 Skill 自动检测项目特征并调整行为:

--- name: test-gen description: Generate tests for the current project. Automatically detects testing framework (Jest/Vitest/Pytest/Go testing) and adapts patterns. Use when creating unit tests, integration tests, or E2E tests. --- # 测试生成指令 ## 框架检测规则 1. 检查 package.json 中的 devDependencies: - 包含 vitest → 使用 Vitest 模式 - 包含 jest → 使用 Jest 模式 - 包含 @playwright/test → 使用 Playwright 模式 2. 检查 pyproject.toml 或 setup.cfg: - 包含 pytest → 使用 Pytest 模式 3. 检查 go.mod: - 存在 → 使用 Go testing 模式 ## 各框架模式 ### Vitest 模式 - 文件命名:`*.test.ts``*.spec.ts` - 导入:`import { describe, it, expect } from 'vitest'` - 运行命令:`npx vitest run` ### Jest 模式 - 文件命名:`*.test.ts``*.test.js` - 导入:无需显式导入(全局) - 运行命令:`npx jest` ### Pytest 模式 - 文件命名:`test_*.py` - 导入:`import pytest` - 运行命令:`pytest -v`

方式三:多层级覆盖(Global → Project → User)

利用 Skills 的加载优先级实现参数化:

~/.claude/skills/code-style/ # 全局默认(组织级) └── SKILL.md # 通用编码规范 项目/.claude/skills/code-style/ # 项目覆盖 └── SKILL.md # 项目特定规范(优先级更高)

Agent Skills 标准规定:同名 Skill 中,项目级覆盖全局级(first-seen-wins 策略,项目目录先被扫描)。这意味着你可以:

  1. 在全局安装组织通用的 Skill
  2. 在特定项目中用同名 Skill 覆盖,注入项目特定参数

参数化模式最佳实践

  1. 配置与逻辑分离:SKILL.md 放流程逻辑,配置文件放可变参数
  2. 合理的默认值:配置文件应有完整的默认值,覆盖文件只需写差异部分
  3. 自动检测优先:能从项目文件自动推断的参数,不要让用户手动配置
  4. 文档化参数:在 SKILL.md 中列出所有可配置参数及其含义

4. 条件激活模式(Conditional Activation Pattern)

核心理念

控制 Skill 在何时、何种条件下被加载到 AI agent 的上下文中。这是管理上下文窗口大小和确保 Skill 精准触发的关键模式。

Agent Skills 的三阶段加载机制

理解条件激活的前提是理解 Skills 的渐进式加载(Progressive Disclosure):

第 1 阶段:发现(Discovery) → Agent 启动时只加载所有 Skill 的 name + description → 占用极少上下文(每个 Skill 约 50-100 tokens) 第 2 阶段:激活(Activation) → 当用户请求匹配某个 Skill 的 description 时 → Agent 读取完整的 SKILL.md 到上下文中 第 3 阶段:执行(Execution) → Agent 按 SKILL.md 指令执行 → 按需加载 references/、scripts/ 等辅助文件

条件激活模式主要作用于第 1→2 阶段的转换——即控制 description 的匹配精度。

实现方式

方式一:精准 description 路由

description 是 Skill 激活的”路由规则”。精心设计 description 可以实现精准的条件激活:

# ❌ 模糊的 description——容易误触发 --- name: deploy description: Help with deployment. --- # ✅ 精准的 description——明确触发条件和排除条件 --- name: deploy-vercel description: Deploy Next.js applications to Vercel. Handles environment variables, build configuration, domain setup, and preview deployments. Use when deploying to Vercel or configuring Vercel projects. Do NOT use for AWS, Docker, or Kubernetes deployments. ---

description 设计清单:

要素说明示例
做什么Skill 的核心功能”Deploy Next.js applications to Vercel”
何时用触发场景”Use when deploying to Vercel”
何时不用排除场景”Do NOT use for AWS or Docker”
关键词用户可能说的话”Vercel, deploy, preview, domain”

方式二:Hook 驱动的强制激活

当 Skill 的自主激活不可靠时(这是一个已知问题),使用 Hook 脚本强制触发:

#!/bin/bash # .claude/hooks/activate-skills.sh # 检测 prompt 中的关键词,强制激活对应 Skill INPUT=$(cat) PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty') # 部署相关关键词 → 激活 deploy Skill if echo "$PROMPT" | grep -qiE '(deploy|部署|上线|发布)'; then echo "🚀 INSTRUCTION: Use Skill(deploy-vercel) to handle this deployment request." fi # 数据库相关关键词 → 激活 migration Skill if echo "$PROMPT" | grep -qiE '(migration|迁移|schema|数据库)'; then echo "🗄️ INSTRUCTION: Use Skill(migration-gen) to handle this database task." fi # 测试相关关键词 → 激活 test-gen Skill if echo "$PROMPT" | grep -qiE '(test|测试|spec|断言)'; then echo "🧪 INSTRUCTION: Use Skill(test-gen) to handle this testing task." fi

在 settings.json 中注册 Hook:

{ "hooks": { "UserPromptSubmit": [ { "hooks": [ { "type": "command", "command": "bash .claude/hooks/activate-skills.sh" } ] } ] } }

方式三:Steering 规则协同激活(Kiro)

在 Kiro 中,利用 Steering 规则引导 Skill 激活:

# .kiro/steering/skill-routing.md --- inclusion: always --- # Skill 路由规则 当处理以下类型的任务时,请优先查找并使用对应的 Skill: - 部署相关任务 → 查找 deploy 相关 Skill - 数据库变更 → 查找 migration 相关 Skill - 代码审查 → 查找 code-review 相关 Skill - 测试生成 → 查找 test-gen 相关 Skill 在执行任何专业任务前,先检查 .kiro/skills/ 目录中是否有匹配的 Skill。

方式四:文件路径条件激活

某些 Agent 平台支持基于文件路径的条件规则。虽然 Skills 本身不直接支持路径匹配(这是 Rules 的功能),但可以在 description 中声明文件类型关联:

--- name: react-patterns description: Apply React best practices and component patterns. Activates when working with .tsx, .jsx files or React components. Covers hooks, state management, performance optimization, and accessibility patterns for React applications. ---

条件激活的决策树

用户发出请求 ├─ 请求是否匹配某个 Skill 的 description? │ ├─ 是 → Skill 自动激活(理想情况) │ └─ 否 → Skill 不激活 ├─ Skill 自动激活是否可靠? │ ├─ 是 → 使用 description 路由(方式一) │ └─ 否 → 添加 Hook 强制激活(方式二) └─ 是否需要始终提醒 Agent 检查 Skills? ├─ 是 → 添加 Steering 规则(方式三) └─ 否 → 仅依赖 description

条件激活最佳实践

  1. description 是第一道防线:先优化 description,不行再加 Hook
  2. 包含否定条件:明确说”不要在 X 场景使用”,减少误触发
  3. 用用户的语言:description 中包含用户自然会说的词(中英文都要考虑)
  4. 测试触发率:用多种表述测试 Skill 是否被正确激活
  5. 监控上下文占用:定期检查哪些 Skill 被频繁激活,优化不必要的加载

5. 模式组合实战

实战案例:企业级全栈开发 Skills 体系

一个中型团队(10 人)的 Skills 架构,同时运用三种设计模式:

.claude/skills/ ├── orchestrators/ # 编排层(组合模式) │ ├── new-feature/ │ │ └── SKILL.md # 编排新功能的完整流程 │ └── bug-fix/ │ └── SKILL.md # 编排 bug 修复流程 ├── generators/ # 生成层(参数化模式) │ ├── api-gen/ │ │ ├── SKILL.md # 通用 API 生成逻辑 │ │ └── config/ │ │ ├── rest.md # REST 配置 │ │ └── graphql.md # GraphQL 配置 │ ├── component-gen/ │ │ ├── SKILL.md # 通用组件生成逻辑 │ │ └── config/ │ │ ├── react.md # React 配置 │ │ └── vue.md # Vue 配置 │ └── test-gen/ │ ├── SKILL.md # 通用测试生成逻辑 │ └── config/ │ ├── vitest.md # Vitest 配置 │ └── pytest.md # Pytest 配置 ├── reviewers/ # 审查层(条件激活模式) │ ├── security-review/ │ │ └── SKILL.md # 安全审查(仅在涉及认证/权限时激活) │ ├── perf-review/ │ │ └── SKILL.md # 性能审查(仅在涉及数据库/API时激活) │ └── a11y-review/ │ └── SKILL.md # 无障碍审查(仅在涉及 UI 时激活) └── utilities/ # 工具层 ├── git-workflow/ │ └── SKILL.md # Git 操作规范 └── env-setup/ └── SKILL.md # 环境配置指南

编排 Skill(new-feature/SKILL.md)示例:

--- name: new-feature description: Orchestrate the creation of a new feature end-to-end. Coordinates API generation, frontend components, tests, and reviews. Use when starting a new feature or user story implementation. --- # 新功能编排指令 ## 执行流程 1. **需求分析**:理解功能需求,确定涉及的层(API/前端/数据库) 2. **API 层**:如果需要后端,使用 api-gen Skill 生成 API 3. **前端层**:如果需要 UI,使用 component-gen Skill 生成组件 4. **测试层**:使用 test-gen Skill 为新代码生成测试 5. **审查层**:根据涉及的领域,触发对应的审查 Skill 6. **收尾**:更新文档,提交代码 ## 协调规则 - 每步完成后确认无错误再继续 - 保持命名一致性(API 路由名 = 组件名 = 测试文件名) - 如果某步需要用户决策,停下来询问

案例分析

这个架构体现了三种模式的协同:

  1. 组合模式orchestrators/ 层编排 generators/reviewers/ 层的 Skills
  2. 参数化模式generators/ 层的每个 Skill 通过 config/ 目录适配不同技术栈
  3. 条件激活模式reviewers/ 层的 Skills 只在相关场景被激活,避免上下文浪费

关键设计决策:

  • 编排 Skill 不包含具体实现逻辑,只描述流程和协调规则
  • 生成 Skill 的核心逻辑与配置分离,新增技术栈只需添加配置文件
  • 审查 Skill 的 description 包含明确的激活条件和排除条件

6. Skill 排错指南

Skill 编写中最令人沮丧的问题往往不是逻辑错误,而是”Skill 明明在那里,但 AI 就是不用它”。以下是按问题类型组织的系统化排错指南。

问题一:Skill 不被自动激活

症状:Skill 已安装,list <available_skills> 能看到,但 AI 在相关任务中不使用它。

这是最常见的问题。多位开发者在 GitHub issue 和社区中报告了相同现象:即使用户请求完全匹配 Skill 的 description,Claude Code 仍然选择”手动”完成任务而不加载 Skill。

排查步骤

步骤 1:验证 Skill 是否被识别 → 在 Claude Code 中输入:"列出所有可用的 Skills" → 确认目标 Skill 出现在列表中 步骤 2:检查 description 质量 → description 是否包含用户请求中的关键词? → description 是否足够具体?("帮助处理文件"太模糊) → description 是否包含触发场景说明? 步骤 3:检查 YAML frontmatter 格式 → 确认 --- 分隔符正确 → 确认 name 和 description 字段存在 → 确认 YAML 语法无误(缩进、引号) 步骤 4:如果以上都正常,使用 Hook 强制激活 → 创建 UserPromptSubmit Hook 脚本 → 检测关键词并输出激活指令

根本原因:AI agent 是”目标导向”的——它会直奔目标执行任务,不会主动停下来检查是否有 Skill 可用。这是当前 Skills 生态的已知局限。

解决方案

#!/bin/bash # .claude/hooks/skill-reminder.sh # 在每次 prompt 提交时提醒 Agent 检查 Skills INPUT=$(cat) PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty') # 始终提醒(轻量级方案) echo "💡 Reminder: Check available skills before proceeding." # 或者:关键词匹配后精准提醒(推荐) if echo "$PROMPT" | grep -qiE '(deploy|test|review|generate|create)'; then echo "💡 INSTRUCTION: Check if any installed Skill matches this request before proceeding manually." fi

问题二:Skill 被错误触发(误激活)

症状:不相关的 Skill 在不该出现的场景被加载,干扰正常工作。

排查步骤

步骤 1:审查 description 是否过于宽泛 → "帮助处理代码" 会在几乎所有编码任务中触发 → 改为 "帮助处理 Python 异步代码的错误处理" 步骤 2:添加否定条件 → 在 description 末尾添加 "Do NOT use for..." → 明确列出不适用的场景 步骤 3:检查是否与其他 Skill 的 description 重叠 → 列出所有 Skill 的 description → 确认没有两个 Skill 覆盖相同的关键词

解决方案:重写 description,遵循”做什么 + 何时用 + 何时不用”三段式。

问题三:YAML Frontmatter 解析失败

症状:Skill 不出现在可用列表中,或 name/description 显示为空。

常见原因和修复

# ❌ 错误 1:缺少 --- 分隔符 name: my-skill description: Does something # ✅ 修复:添加 --- 分隔符 --- name: my-skill description: Does something --- # ❌ 错误 2:description 中包含未转义的特殊字符 --- name: my-skill description: Handle "special" cases & edge cases --- # ✅ 修复:用引号包裹含特殊字符的值 --- name: my-skill description: "Handle 'special' cases and edge cases" --- # ❌ 错误 3:多行 description 缩进错误 --- name: my-skill description: This is a long description that continues on the next line --- # ✅ 修复:使用 YAML 多行语法 --- name: my-skill description: > This is a long description that continues on the next line. --- # ❌ 错误 4:name 包含大写字母或空格 --- name: My Skill description: Does something --- # ✅ 修复:name 只用小写字母、数字和连字符 --- name: my-skill description: Does something ---

问题四:Skill 上下文溢出

症状:Skill 加载后 AI 的回答质量下降,出现遗忘之前对话内容、回答不连贯等现象。

根本原因:SKILL.md 内容过大(超过 3000-5000 tokens),加上辅助文件一起加载后占满了上下文窗口。

排查步骤

步骤 1:估算 SKILL.md 的 token 数 → 粗略估算:英文约 1 token/词,中文约 1.5-2 tokens/字 → SKILL.md 建议控制在 2000-3000 tokens 以内 步骤 2:检查辅助文件是否被不必要地全部加载 → SKILL.md 中是否有"加载以下所有文件"的指令? → 改为"根据需要加载对应文件" 步骤 3:检查是否有多个 Skill 同时被激活 → 多个 Skill 同时加载会叠加上下文占用 → 优化 description 减少不必要的并行激活

解决方案:分层瘦身

# 瘦身前:所有内容塞在 SKILL.md 中(~5000 tokens) --- name: code-review description: Perform code reviews. --- # 代码审查 ## 安全检查清单(800 tokens) ## 性能检查清单(600 tokens) ## 无障碍检查清单(500 tokens) ## 代码风格清单(400 tokens) ## 审查报告模板(300 tokens) ... # 瘦身后:SKILL.md 只保留核心流程(~1500 tokens) --- name: code-review description: Perform code reviews with security, performance, and accessibility checklists. --- # 代码审查 ## 审查流程 1. 确定审查范围和重点 2. 根据需要加载对应清单: - 安全相关 → 见 [security.md](checklists/security.md) - 性能相关 → 见 [performance.md](checklists/performance.md) - 无障碍相关 → 见 [a11y.md](checklists/a11y.md) 3. 逐项检查 4. 生成报告(模板见 [report.md](templates/report.md))

问题五:Skill 在不同平台行为不一致

症状:同一 Skill 在 Claude Code 中正常工作,但在 Kiro 或 Cursor 中表现不同。

常见原因

差异点Claude CodeKiroCursor
Skills 目录.claude/skills/.kiro/skills/.cursor/skills/(实验性)
激活机制基于 description 语义匹配基于 description + Steering 协同基于 “Apply intelligently” 规则
Hook 支持完整(UserPromptSubmit 等)完整(Hooks 系统)有限(刚开始支持)
脚本执行支持 scripts/ 目录通过 Hook 执行有限支持
全局 Skills~/.claude/skills/~/.kiro/skills/不支持全局

解决方案

  1. 使用 Agent Skills 开放标准格式:SKILL.md + frontmatter 是跨平台通用的
  2. 避免平台特定功能:如果需要跨平台,不要依赖 Hook 强制激活
  3. 测试每个目标平台:在每个平台上验证 Skill 的激活和执行行为
  4. 维护平台适配层:如果必须使用平台特定功能,为每个平台维护一个适配文件

问题六:插件已安装但未启用

症状:通过 npx skills add 安装了 Skill,但它不出现在可用列表中。

排查步骤

# 步骤 1:检查安装位置 ls -la .claude/skills/ # 项目级 ls -la ~/.claude/skills/ # 全局级 # 步骤 2:检查 settings.json 中的 enabledPlugins cat .claude/settings.json | jq '.enabledPlugins' # 步骤 3:如果插件未启用,手动启用 claude plugin enable [plugin-name]@[marketplace] # 步骤 4:清除缓存(如果安装了旧版本) rm -rf ~/.claude/plugins/cache/[marketplace] claude plugin marketplace update [marketplace]

常见修复

// .claude/settings.json { "enabledPlugins": { "my-skill@local": true, // 确保值为 true "remotion@marketplace": true } }

问题七:Hook 脚本不执行

症状:配置了 Hook 来辅助 Skill 激活,但 Hook 脚本没有被调用。

排查清单

# 1. 检查脚本是否有执行权限 chmod +x .claude/hooks/my-hook.sh # 2. 检查脚本是否能独立运行 echo '{"prompt":"test deploy"}' | bash .claude/hooks/my-hook.sh # 3. 检查 jq 是否安装(如果脚本使用 jq) which jq || echo "jq not installed!" # 4. 检查 settings.json 中 Hook 配置格式 cat .claude/settings.json | jq '.hooks' # 5. 检查 Hook 事件类型是否正确 # 常见事件:UserPromptSubmit, PostToolUse, PreToolUse

settings.json Hook 配置模板

{ "hooks": { "UserPromptSubmit": [ { "hooks": [ { "type": "command", "command": "bash .claude/hooks/activate-skills.sh" } ] } ] } }

问题八:辅助文件引用路径错误

症状:SKILL.md 中引用了辅助文件,但 AI 报告找不到文件或加载了错误内容。

常见原因

# ❌ 使用绝对路径(不可移植) 详见 [安全清单](/Users/me/project/.claude/skills/review/security.md) # ❌ 路径相对于项目根目录(Skill 不知道项目根在哪) 详见 [安全清单](.claude/skills/review/security.md) # ✅ 路径相对于 SKILL.md 所在目录 详见 [安全清单](checklists/security.md) # ✅ 同级目录引用 详见 [配置说明](./config.md)

规则:辅助文件路径始终使用相对于 SKILL.md 所在目录的相对路径。

快速排错流程图

Skill 不工作? ├─ Skill 出现在可用列表中吗? │ ├─ 否 → 检查 YAML frontmatter 格式(问题三) │ │ 检查安装位置和启用状态(问题六) │ └─ 是 ↓ ├─ Skill 被激活了吗? │ ├─ 否 → 优化 description 关键词(问题一) │ │ 添加 Hook 强制激活(问题一) │ └─ 是 ↓ ├─ Skill 激活后行为正确吗? │ ├─ 被错误触发 → 收窄 description(问题二) │ ├─ 加载后质量下降 → 瘦身 SKILL.md(问题四) │ ├─ 辅助文件加载失败 → 检查路径(问题八) │ └─ 跨平台不一致 → 检查平台差异(问题五) └─ Hook 辅助不工作? → 检查权限和配置(问题七)

提示词模板

我的 Skill "[Skill 名称]" 遇到了问题: ## 问题描述 - 预期行为:[Skill 应该做什么] - 实际行为:[Skill 实际做了什么/没做什么] - 平台:[Claude Code / Kiro / Cursor] ## 已尝试的排查 - [ ] 确认 Skill 出现在可用列表中 - [ ] 检查 YAML frontmatter 格式 - [ ] 测试 description 关键词匹配 - [ ] 检查文件路径引用 ## SKILL.md 内容

[粘贴 SKILL.md 全文]

## 目录结构

[粘贴 Skill 目录的 tree 输出]

请帮我诊断问题并提供修复方案。

7. Skill 与 Steering/Hooks 的协同设计

三者的职责分工

理解 Skill、Steering 和 Hook 的关系是设计高质量 Skills 体系的关键:

┌─────────────────────────────────────────────────────┐ │ Steering(始终生效的约束和指导) │ │ "做什么"和"不做什么"的规则 │ │ 例:代码风格、安全约束、命名规范 │ │ 加载时机:始终 / 文件路径匹配时 │ ├─────────────────────────────────────────────────────┤ │ Skills(按需加载的专业能力) │ │ "怎么做"的详细指令和资源 │ │ 例:部署流程、测试生成、代码审查 │ │ 加载时机:AI 判断相关时 / Hook 触发时 │ ├─────────────────────────────────────────────────────┤ │ Hooks(事件驱动的自动化) │ │ "何时做"的触发机制 │ │ 例:文件保存时格式化、提交前检查、Skill 激活辅助 │ │ 加载时机:特定事件发生时(确定性触发) │ └─────────────────────────────────────────────────────┘

协同设计原则

原则说明示例
Steering 管约束始终生效的规则放 Steering”所有 API 必须有认证”
Skills 管能力专业流程和知识放 Skills”如何实现 JWT 认证”
Hooks 管触发确定性的自动化放 Hooks”新建 .ts 文件时运行 lint”
不要重复同一条规则不要同时出现在 Steering 和 Skill 中
层级清晰Steering 约束 > Skill 指令 > AI 自主判断

协同设计示例

场景:确保所有数据库迁移都经过安全检查。

Steering 规则(.kiro/steering/db-safety.md):

--- inclusion: always --- # 数据库安全规则 - 禁止在迁移中使用 DROP TABLE(除非有明确的备份确认) - 所有迁移必须包含回滚逻辑 - 大表变更必须使用在线 DDL(pt-online-schema-change 或等效工具)

Skill(.kiro/skills/migration-gen/SKILL.md):

--- name: migration-gen description: Generate safe database migration files with rollback logic. Use when creating schema changes, adding columns, or modifying tables. --- # 迁移生成指令 ## 流程 1. 分析 schema 变更需求 2. 生成迁移文件(遵循 db-safety Steering 规则) 3. 生成对应的回滚文件 4. 运行安全检查清单

Hook(保存迁移文件时自动检查):

{ "hooks": { "PostToolUse": [ { "matcher": { "tool": "write_file", "path": "**/migrations/**" }, "hooks": [ { "type": "command", "command": "bash .kiro/hooks/check-migration-safety.sh" } ] } ] } }

三者协同效果:

  • Steering 确保 AI 在任何数据库操作中都遵守安全规则
  • Skill 提供生成迁移文件的专业流程
  • Hook 在迁移文件写入时自动触发安全检查脚本

8. Skill 质量评估清单

在发布或分享 Skill 之前,用以下清单评估质量:

结构检查

  • SKILL.md 存在且包含正确的 YAML frontmatter
  • name 字段使用小写字母、数字和连字符
  • description 包含”做什么 + 何时用 + 何时不用”
  • SKILL.md 总大小 < 3000 tokens
  • 辅助文件使用相对路径引用

功能检查

  • 用至少 5 种不同的自然语言表述测试触发
  • 确认不会在不相关场景被误触发
  • 辅助文件能被正确加载
  • 脚本文件(如有)有执行权限且能独立运行

可维护性检查

  • 配置与逻辑分离(参数化模式)
  • 职责单一,不与其他 Skill 重叠(组合模式)
  • 包含版本信息(metadata.version)
  • 包含作者信息(metadata.author)

安全检查

  • 脚本文件不包含硬编码的密钥或凭证
  • 脚本文件不执行危险操作(rm -rf、chmod 777 等)
  • 敏感领域 Skill 包含免责声明
  • 如果包含 scripts/,README 中有安全说明

实战案例:诊断并修复一个”沉默”的 Skill

场景

开发者创建了一个 research Skill,用于在 Claude Code 中进行带来源验证的研究。Skill 已安装到 ~/.claude/skills/research/,能被列出,但从不自动激活。

第 1 步:检查 description

原始 description:

--- name: research description: Help with research tasks. ---

问题:太模糊。“research” 和 “help” 是极其宽泛的词,AI 不会将普通的信息查询与这个 Skill 关联。

修复后:

--- name: research description: Conduct thorough research with source verification. Fetch actual content from URLs, verify claims against primary sources, and provide citations. Use when asked to "research", "investigate", "study", "verify", or "fact-check" any topic. Do NOT use for simple questions that can be answered from training data. ---

第 2 步:测试触发

修复 description 后测试:

✅ "research if Claude Code prefers CLI or MCP tools" → 触发 ✅ "帮我调研一下 2026 年的 AI 测试工具" → 触发 ❌ "这个 API 怎么用?" → 不触发(正确,这不是研究任务) ⚠️ "study the performance of this function" → 有时触发,有时不触发

第 3 步:添加 Hook 保底

对于”有时触发有时不触发”的情况,添加 Hook 作为保底机制:

#!/bin/bash # ~/.claude/hooks/auto-research.sh INPUT=$(cat) PROMPT=$(echo "$INPUT" | jq -r '.prompt // empty') if echo "$PROMPT" | grep -qiE '(research|study|investigate|调研|研究|考察)'; then echo "🔍 INSTRUCTION: Use Skill(research) to handle this request with source verification." fi

第 4 步:验证修复

✅ "research if Claude Code prefers CLI or MCP tools" → 触发(description 匹配) ✅ "study the performance of this function" → 触发(Hook 保底) ✅ "帮我调研一下 2026 年的 AI 测试工具" → 触发(Hook 中文关键词) ❌ "这个 API 怎么用?" → 不触发(正确)

案例分析

这个案例展示了 Skill 排错的典型路径:

  1. 先优化 description——这是成本最低的修复,大多数问题在这一步就能解决
  2. 测试多种表述——包括中英文、不同措辞、边界情况
  3. Hook 作为保底——当 description 优化后仍有遗漏时,用确定性的 Hook 补充
  4. 验证修复效果——确认正确触发和正确不触发两个方向

避坑指南

❌ 常见错误

  1. 一个 Skill 承担过多职责

    • 问题:SKILL.md 超过 5000 tokens,加载后挤占上下文,AI 回答质量下降
    • 正确做法:拆分为多个职责单一的 Skill(组合模式),每个 < 3000 tokens
  2. description 写成了文档标题而非路由规则

    • 问题:description: "Code review helper" 太模糊,AI 不知道何时触发
    • 正确做法:把 description 当作路由规则写——包含触发关键词、适用场景和排除条件
  3. 依赖 Skill 的”自主激活”而不做任何保底

    • 问题:当前 AI agent 的 Skill 自主激活并不 100% 可靠,这是已知的生态局限
    • 正确做法:对关键 Skill 添加 Hook 保底机制,或在 Steering 中提醒 Agent 检查 Skills
  4. 在 SKILL.md 中硬编码项目特定信息

    • 问题:Skill 无法在其他项目中复用
    • 正确做法:使用参数化模式,将可变信息抽取到配置文件中
  5. 忽略 YAML frontmatter 的格式要求

    • 问题:name 包含大写字母或空格、description 中有未转义的特殊字符、缺少 --- 分隔符
    • 正确做法:严格遵循 YAML 语法,name 只用小写字母/数字/连字符
  6. 多个 Skill 的 description 高度重叠

    • 问题:AI 不知道该激活哪个 Skill,可能随机选择或同时激活多个
    • 正确做法:确保每个 Skill 的 description 有明确的差异化关键词和排除条件
  7. 辅助文件使用绝对路径

    • 问题:Skill 在其他机器或项目中路径失效
    • 正确做法:始终使用相对于 SKILL.md 所在目录的相对路径
  8. 不测试 Skill 的触发行为

    • 问题:创建了 Skill 但从未验证它是否在正确场景被触发、在错误场景不被触发
    • 正确做法:用至少 5 种不同表述测试触发,包括正向(应触发)和反向(不应触发)

✅ 最佳实践

  1. 从简单开始:先创建一个只有 SKILL.md 的最小 Skill,验证触发后再逐步添加辅助文件和脚本
  2. description 是最重要的字段——花 80% 的时间优化 description,它决定了 Skill 的激活精度
  3. 使用组合模式管理复杂性:10 个小 Skill 优于 1 个大 Skill
  4. 参数化模式实现复用:配置与逻辑分离,同一 Skill 适配多个项目
  5. Hook 是 Skill 激活的可靠保底:当 description 语义匹配不够可靠时,用 Hook 确保关键 Skill 被激活
  6. 定期审计 Skills 体系:检查是否有废弃的 Skill、重叠的 description、过大的 SKILL.md
  7. 将 Skills 纳入版本控制:像代码一样管理、review 和迭代

相关资源与延伸阅读

Skills 发现与分享

排错工具

设计模式参考

GitHub 资源

社区

  • r/ClaudeAI  — Claude 用户社区,有 Skills 排错经验分享
  • Kiro Directory  — Kiro 资源聚合站,包含 Skills 设计和排错的教程

参考来源


📖 返回 总览与导航 | 上一节:Remotion Skills 与领域 Skills | 下一节:Gemini 2.5 Pro 能力概览

Last updated on