Claude Code Skills 與 Hooks 關係解析

Claude Code Skills 與 Hooks 關係解析

研究摘要

核心結論 Skills 和 Hooks 是 Claude Code 中兩個互補的擴展機制:Skills 提供「知識和能力」(做什麼、怎麼做),Hooks 提供「控制和自動化」(確保做得對、做得安全)。兩者可在 Plugin 中整合,形成「能力層 + 控制層」的完整架構。


核心概念定義

Skills(技能)

Skills 是 Claude Code 的能力擴展機制,用於將專業知識打包成可重複使用的指導文件。

特性 說明
觸發方式 Model-invoked(模型自主判斷調用)
文件格式 Markdown(SKILL.md
存放位置 <sub>/.claude/skills/.claude/skills/
核心目的 教 Claude「如何做」特定任務
<!-- SKILL.md 範例結構 -->
| Skill Name | Description and trigger conditions |

## 技能說明
詳細的執行指導...

## 最佳實踐
...

Hooks(鉤子)

Hooks 是 Claude Code 的事件驅動自動化機制,在特定時機自動執行 shell 命令。

特性 說明
觸發方式 Event-driven(系統事件自動觸發)
配置格式 JSON(settings.jsonhooks.json
存放位置 .claude/settings.json 或 plugin 的 hooks/
核心目的 監控、驗證、自動化執行過程
{
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "prettier --write \"$CLAUDE_FILE_PATHS\""
          }
        ]
      }
    ]
  }
}

兩者的關鍵差異

面向 Skills Hooks
觸發機制 Claude 自主判斷使用 系統事件自動觸發
主要目的 提供知識和指導 執行驗證和自動化
執行控制 無法直接阻止操作 可透過 exit code 阻止工具執行
配置格式 Markdown 文件 JSON + Shell 腳本
用戶互動 被動(Claude 決定是否使用) 確定性(事件發生必定執行)

互動關係與生命週期

執行流程圖

[mermaid 圖表 — 原始 HackMD 版本可正常渲染]

flowchart TD A[用戶請求] --> B{Claude 分析任務} B --> C[識別相關 Skill] C --> D[Skill 指導執行策略] D --> E[Claude 調用工具] E --> F[PreToolUse Hook] F -->|允許| G[工具執行] F -->|阻止| H[回饋給 Claude] G --> I[PostToolUse Hook] I --> J{任務完成?} J -->|否| E J -->|是| K[Stop Hook] K --> L[結束] H --> E

層級架構

┌─────────────────────────────────────────────┐
│              用戶請求(User Request)         │
└─────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────┐
│    能力層(Skills)- 提供知識和執行指導        │
│    • 定義「做什麼」和「怎麼做」               │
│    • Model-invoked,Claude 自主決定          │
└─────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────┐
│    執行層(Tool Calls)- Claude 調用工具      │
│    • Write, Edit, Bash, Read 等            │
└─────────────────────────────────────────────┘
                      ↓
┌─────────────────────────────────────────────┐
│    控制層(Hooks)- 監控和干預執行            │
│    • 確保「做得對」和「做得安全」             │
│    • Event-driven,確定性執行               │
└─────────────────────────────────────────────┘

Hook 事件類型一覽

Hook 事件 觸發時機 常見用途
PreToolUse 工具執行 驗證、阻止危險操作
PostToolUse 工具執行 格式化、測試、日誌
UserPromptSubmit 用戶提交提示 添加上下文、過濾輸入
SessionStart 會話開始 載入項目配置
SessionEnd 會話結束 清理、保存狀態
Stop Claude 完成回應 最終驗證、測試
SubagentStop 子代理完成時 子任務驗證
PreCompact 上下文壓縮前 保存重要資訊
Notification 發送通知 自訂通知處理
PermissionRequest 權限請求 自動授權/拒絕

[!tip] Exit Code 行為

  • Exit 0:Hook 成功,繼續執行
  • 非零 Exit:對於 PreToolUse,會阻止工具執行並將 stderr 回饋給 Claude

在 Plugin 中整合 Skills 和 Hooks

Plugin 目錄結構

my-plugin/
├── .claude-plugin/
│   └── plugin.json          # Plugin 元數據
├── skills/
│   └── code-review/
│       └── SKILL.md         # 代碼審查技能
├── hooks/
│   └── hooks.json           # Hook 配置
├── scripts/
│   ├── pre-write-check.sh   # 寫入前檢查
│   └── post-format.sh       # 寫入後格式化
└── README.md

整合範例:代碼審查 Plugin

skills/code-review/SKILL.md

| Code Review | Use when reviewing code, analyzing PRs, or checking code quality |

## 審查流程
1. 檢查代碼風格和一致性
2. 識別潛在的 bug 和安全問題
3. 評估可讀性和可維護性
4. 提供具體的改進建議

## 注意事項
此專案使用 PreToolUse hook 阻止寫入 .env 文件,
並使用 PostToolUse hook 自動運行 linter。

hooks/hooks.json

{
  "description": "代碼審查安全和品質控制",
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PLUGIN_ROOT}/scripts/pre-write-check.sh"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "${CLAUDE_PLUGIN_ROOT}/scripts/post-format.sh"
          }
        ]
      }
    ]
  }
}

[!info] ${CLAUDE_PLUGIN_ROOT} 變數 此變數會自動解析為 plugin 的根目錄路徑,讓 hooks 可以引用同一 plugin 中的腳本。


實用組合模式

1. 代碼質量保證

[mermaid 圖表 — 原始 HackMD 版本可正常渲染]

flowchart LR A[Skill: 編碼標準] --> B[Claude 編寫代碼] B --> C[PostToolUse: Linter] C --> D[PostToolUse: Formatter] D --> E[Stop: 運行測試]

組件 類型 職責
編碼標準指南 Skill 定義代碼風格和最佳實踐
自動 Linting PostToolUse Hook 即時檢查語法問題
自動格式化 PostToolUse Hook 確保代碼風格一致
測試執行 Stop Hook 確保所有測試通過

2. 安全合規控制

組件 類型 職責
安全編碼指南 Skill 指導安全編碼實踐
敏感文件保護 PreToolUse Hook 阻止寫入 .env、密鑰文件
安全掃描 PostToolUse Hook 掃描新代碼的安全漏洞

PreToolUse 阻止敏感文件寫入範例

#!/bin/bash
# pre-write-check.sh
input=$(cat)
file_path=$(echo "$input" | jq -r '.tool_input.file_path // empty')

# 檢查是否為敏感文件
if [[ "$file_path" =</sub> \.(env|pem|key)$ ]] || [[ "$file_path" =~ secrets ]]; then
    echo "❌ 禁止寫入敏感文件: $file_path" >&2
    exit 1
fi
exit 0

3. 文檔自動化

組件 類型 職責
文檔撰寫指南 Skill 定義文檔格式和內容標準
項目上下文載入 SessionStart Hook 自動載入項目資訊
Markdown 驗證 PostToolUse Hook 確保格式正確

4. 機器學習實驗

組件 類型 職責
實驗流程指南 Skill 定義實驗設計和記錄標準
參數驗證 PreToolUse Hook 確保超參數在合理範圍
結果記錄 Stop Hook 自動保存實驗結果

最佳實踐

Skills 設計原則

[!tip] DO - 建議做法

  • 保持專注:一個 Skill 解決一個問題
  • 清晰描述:讓 Claude 能準確判斷何時使用
  • 包含範例:提供具體的輸入/輸出範例
  • 文檔化限制:告知 Claude 相關的 Hook 行為

[!warning] DON'T - 避免做法

  • 不要讓 Skill 範圍太廣泛
  • 不要在 Skill 中放置實際執行代碼
  • 不要假設 Claude 一定會遵循(使用 Hook 強制執行關鍵規則)

Hooks 設計原則

[!tip] DO - 建議做法

  • 保持快速:Hook 會阻塞執行,保持輕量
  • 明確輸出:使用 stderr 提供清晰的錯誤訊息
  • 冪等設計:Hook 可能多次執行,確保結果一致
  • 使用 Matcher:精確匹配需要的工具,避免過度觸發

[!warning] DON'T - 避免做法

  • 不要在 Hook 中執行耗時操作
  • 不要忽略錯誤處理
  • 不要在 Hook 中做複雜的業務邏輯(保持簡單)

整合建議

  1. 先定義 Skill,再設計 Hooks

    • Skill 定義「應該怎麼做」
    • Hooks 確保「必須這樣做」
  2. 在 Skill 中記錄 Hook 行為

    • 讓 Claude 了解哪些操作會被阻止
    • 避免 Claude 重複嘗試被阻止的操作
  3. 使用 Plugin 打包完整功能

    • 一個 Plugin = 相關 Skills + 對應 Hooks + 輔助腳本
    • 便於分享和版本控制

常見問題

[!faq]- Skill 執行時會觸發哪些 Hooks? Skill 本身不直接觸發 Hooks。但當 Claude 根據 Skill 的指導調用工具(如 Write、Edit、Bash)時,這些工具調用會觸發相應的 PreToolUsePostToolUse Hooks。

[!faq]- 可以用 Hook 強制 Claude 使用特定 Skill 嗎? 不能直接強制。但可以在 UserPromptSubmit Hook 中注入上下文或提示,引導 Claude 考慮使用特定 Skill。

[!faq]- Hooks 失敗時 Skill 會如何反應? 如果 PreToolUse Hook 返回非零 exit code,工具調用會被阻止,stderr 內容會回饋給 Claude。Claude 可能會根據回饋調整策略,但這取決於 Skill 中的指導和 Claude 的判斷。

[!faq]- 如何調試 Skills 和 Hooks 的互動? 使用 claude --debug 啟動 Claude Code,可以看到詳細的 Hook 執行日誌。也可以在 Hook 腳本中輸出調試資訊到日誌文件。


參考資料

來源 標題 可信度
code.claude.com Agent Skills - Claude Code Docs ⭐⭐⭐⭐⭐
code.claude.com Hooks reference - Claude Code Docs ⭐⭐⭐⭐⭐
code.claude.com Get started with Claude Code hooks ⭐⭐⭐⭐⭐
code.claude.com Create plugins - Claude Code Docs ⭐⭐⭐⭐⭐
GitHub Hook Development Skill ⭐⭐⭐⭐⭐
alexop.dev Claude Code customization guide ⭐⭐⭐⭐
eesel.ai A complete guide to hooks in Claude Code ⭐⭐⭐⭐
youngleaders.tech Understanding Claude Code: Skills vs Commands vs Subagents ⭐⭐⭐⭐


本文最初發布於 HackMD @BASHCAT

留言

這個網誌中的熱門文章

Arduino 課本可能沒教的事(1)

SI4432 搭配Arduino

燒錄 Arduino mini Pro 燒錄