この記事は何
Claude Codeには、Hooksという機能があります。
Hooksは特定の処理のタイミングで必ず実行してほしいスクリプトやプロンプトなどをかける便利機能です。
この記事では、このHooksはSkillにもかけるよという紹介をします。
Hooksとは
Hooksは、Claude Codeのライフサイクル上の特定のイベントをトリガーに、シェルコマンドなどを実行できる仕組みです。
CLAUDE.mdやSkillsのプロンプトに記載するのとは違い、LLMの判断を経由せず必ず実行されるのがポイントです。
代表的なイベントには以下のようなものがあります。
| イベント | タイミング |
|---|---|
PreToolUse |
ツール実行の直前(ブロック可能) |
PostToolUse |
ツール実行の成功後 |
UserPromptSubmit |
ユーザーがプロンプトを送信したとき |
Stop |
Claudeが応答を完了したとき |
SessionStart / SessionEnd
|
セッションの開始時 / 終了時 |
設定は settings.json に書きます。たとえば「ファイルを編集したら必ずPrettierをかける」は次のように書けます。
{
"hooks": {
"PostToolUse": [
{
"matcher": "Edit|Write",
"hooks": [
{
"type": "command",
"command": "jq -r '.tool_input.file_path' | xargs npx prettier --write"
}
]
}
]
}
}
matcher で対象のツールを絞り込み、マッチしたら hooks 配列のコマンドが実行されます。
フックにはイベントの情報(ツール名や引数など)がJSONとしてstdinで渡されます。exit code 2 を返すとツール実行をブロックして、Claudeにフィードバックを返すこともできます。
type には command のほかに prompt(LLMによる判定)や agent、http、mcp_tool もあり、柔軟に処理が可能です。詳細は公式ドキュメントをご確認ください。
Skillsとは
Skillsは、Claude Codeに特定のタスクの手順や知識を教え込むための仕組みです。
実体は SKILL.md というMarkdownファイルで、以下のような場所に置きます。
| 配置場所 | スコープ |
|---|---|
~/.claude/skills/<skill-name>/SKILL.md |
個人用(全プロジェクト) |
.claude/skills/<skill-name>/SKILL.md |
プロジェクト用(gitで共有可能) |
プラグイン内の skills/
|
プラグイン利用者全員 |
SKILL.md はYAML frontmatterと本文で構成されます。
---
name: release-note
description: リリースノートを作成するスキル。「リリースノート作って」と言われたら使う。
---
# リリースノート作成手順
1. 前回のリリースタグからのコミットログを取得する
2. ...
description を手がかりにClaudeが「今このスキルを使うべきだ」と自動で判断して読み込んだり、/release-note のようにスラッシュコマンドとして手動で呼び出すこともできます。
公式ドキュメントはこちらです。
SkillsにHooksを書く方法
ここからが本題です。実はHooksは settings.json だけでなく、SKILL.md のfrontmatterに直接書けます。
書き方は簡単で、frontmatterに hooks キーを追加するだけです。形式は settings.json と同じです。
---
name: secure-operations
description: Perform operations with security checks
hooks:
PreToolUse:
- matcher: "Bash"
hooks:
- type: command
command: "./scripts/security-check.sh"
---
この例では、スキルの実行中にBashツールが呼ばれるたびに、その直前で security-check.sh が実行されます。
settings.jsonに書く場合と比べて、決定的に違うのは「スコープ」です。
Hooks use the same configuration format as settings-based hooks but are scoped to the component's lifetime and cleaned up when it finishes.
スコープの違い
-
settings.jsonのHooks → セッション全体でずっと有効 -
SKILL.mdのHooks → そのスキルの実行中だけ有効で、終わったら自動でクリーンアップされる
「デプロイ用のスキルを実行している間だけ、危険なコマンドを検証スクリプトでチェックしたい」「このスキルでファイルを生成したときだけ、フォーマッタを必ずかけたい」といった、特定のワークフローに紐づくガードレールを、グローバル設定を汚さず、スキル自身に同梱できます。スキルをgitやプラグインで配布すれば、Hooksごとチームに展開することも可能です。
裏を返すと、第三者が作ったスキルにはHooksが同梱されていて、スキル実行中に任意のコマンドが動く可能性もあるということでもあります。外部のスキルやプラグインを導入するときは、frontmatterのhooksの中身も確認しましょう。
なお、すべてのHooksイベントがサポートされています。スキルがサブエージェント(context: fork)として実行される場合は、Stop フックが SubagentStop に自動で読み替えられる、というような細かい挙動の違いもあるため、ドキュメントを読みながら実装することをお勧めします。