Claude CodeのHooks機能は、開発ワークフローを劇的に効率化できる強力なツールだと思います。本記事では、Hooks機能の基本から実践的な活用方法まで、具体例を交えて詳しく解説していきます。開発の自動化に興味のある方は、ぜひ最後までご覧ください。
Claude CodeのHooks機能とは
Hooks機能は、Claude Codeにおいて特定のイベントやタイミングで自動的にコードを実行する仕組みですね。ライフサイクルの各段階で処理を挟み込むことで、開発プロセスを大幅に自動化できるんです。
従来の手動開発では、テストの実行やコード品質チェック、デプロイメント準備など、繰り返し行う作業が本当に多くありました。Hooks機能を活用することで、こうした定型業務を自動化し、開発者はより創造的な作業に集中できるようになります。
Hooks機能の主な特徴
- イベント駆動型:コードの変更やビルドなど、特定のイベントをトリガーに自動実行される
- カスタマイズ可能:プロジェクトに合わせて処理内容を柔軟に定義できる
- チェーン処理:複数のHooksを組み合わせて複雑なワークフローを構築できる
- エラーハンドリング:失敗時の処理を明確に定義できるので、予期しない動作を防げる
Hooks機能の基本的な使い方
Claude CodeでHooks機能を使用するには、まずプロジェクト設定ファイルにHook定義を追加する必要があります。基本的な構文を見ていきましょう。
Hook定義の基本形式
以下は、claude.hooks.jsonファイルにHookを定義する例です。
{
"hooks": {
"beforeBuild": [
{
"name": "lint-check",
"command": "npm run lint",
"failOnError": true
}
],
"afterTest": [
{
"name": "coverage-report",
"command": "npm run coverage",
"failOnError": false
}
],
"beforeDeploy": [
{
"name": "security-scan",
"command": "npm audit",
"failOnError": true
}
]
}
}
このファイルにおいて、各フィールドがどういった役割を果たすかを説明します:
beforeBuild:ビルド前に実行するHook。ここでコード品質をチェックすることが多いですafterTest:テスト後に実行するHook。カバレッジレポートの生成などに使われますbeforeDeploy:デプロイ前に実行するHook。本番環境への安全性確認に重要ですね
実践的な活用例
例1:自動コード品質チェック
プロジェクトにコミットする前に、自動的にコード品質をチェックする設定を紹介しますね。実際のプロジェクトでこれを導入したときの経験から、かなり効果的だと実感しています。
{
"hooks": {
"beforeCommit": [
{
"name": "eslint",
"command": "npx eslint . --fix",
"failOnError": true
},
{
"name": "prettier",
"command": "npx prettier --write .",
"failOnError": false
},
{
"name": "type-check",
"command": "tsc --noEmit",
"failOnError": true
}
]
}
}
この設定により、コミット前に以下の処理が自動実行されるようになります:
- ESLintによるコード品質チェック(エラーが見つかると失敗します)
- Prettierによるコードフォーマット(エラーが出てもワークフロー継続します)
- TypeScriptの型チェック(型エラーがあると失敗します)
最初はfailOnErrorの設定で悩みましたが、公式ドキュメントを読んでみると、重要なチェック(lintと型チェック)はtrueに、フォーマットのような軽い処理はfalseにするのが慣例なんですね。
例2:テストと自動報告
テスト実行後に、カバレッジ報告を自動生成する例を見ていきましょう。これは現場でも重宝する設定です。
{
"hooks": {
"afterTest": [
{
"name": "generate-coverage",
"command": "jest --coverage",
"failOnError": false
},
{
"name": "upload-coverage",
"command": "codecov --token=$CODECOV_TOKEN",
"failOnError": false,
"env": {
"CODECOV_TOKEN": "$CODECOV_TOKEN"
}
}
]
}
}
環境変数の$CODECOV_TOKENは、システムの環境変数から自動的に参照されます。この方式だと、トークンをファイルに直書きせずに済むので、セキュリティ面でも安心ですね。
例3:デプロイメント前の安全性確認
本番環境へのデプロイ前に、複数の安全性チェックを実行する設定です。私が実装した際には、ここでかなり多くのバグが事前に検出されました。
{
"hooks": {
"beforeDeploy": [
{
"name": "dependency-audit",
"command": "npm audit --production",
"failOnError": true
},
{
"name": "run-tests",
"command": "npm test -- --coverage",
"failOnError": true
},
{
"name": "build-verification",
"command": "npm run build && npm run build:verify",
"failOnError": true
},
{
"name": "notify-team",
"command": "curl -X POST $SLACK_WEBHOOK -d 'Deploy starting...'",
"failOnError": false
}
]
}
}
ここで注目すべき点は、依存関係のチェックやテスト実行はfailOnError: trueにしていることです。デプロイ失敗は許されないので、問題があれば絶対に止めるべきですね。一方、Slackへの通知はfalseにしておくと、通知サービスの問題でデプロイが止まるという悲劇を避けられます。
Hooks機能の詳細設定
環境変数の活用
Hookの実行時に環境変数を使用することで、機密情報の安全な管理ができるんです。ここは特にセキュリティ的に重要なポイントですね。
{
"hooks": {
"beforeDeploy": [
{
"name": "secure-deploy",
"command": "deploy-script.sh",
"env": {
"API_KEY": "$API_KEY",
"DEPLOYMENT_ENV": "production"
},
"failOnError": true
}
]
}
}
調べてみたら、envフィールド内の$変数名は実行時に展開されるようになっています。つまり、システムで設定された環境変数がそのまま使われるわけです。ローカル開発環境では.envファイル、CI/CDではシークレット管理機能で環境変数を設定しておけば、同じ設定ファイルで対応できます。
条件付き実行
特定の条件下でのみHookを実行したい場合は、conditionフィールドを活用します。これがあると、本当に便利ですね。
{
"hooks": {
"afterBuild": [
{
"name": "docker-build",
"command": "docker build -t myapp:latest .",
"condition": "$BRANCH == 'main'",
"failOnError": true
}
]
}
}
この例では、ブランチがmainの場合にのみDocker イメージのビルドが実行されます。開発ブランチではDockerビルドをスキップして、CI/CDの処理時間を短縮できるわけです。条件式では==、!=、&&、||などの演算子が使えます。
トラブルシューティング
Hookが実行されない場合
実装してみると、設定がうまく反映されないことがたまにあります。そんなときはここをチェックしてみてください。
- 設定ファイルのパスが正しいか確認。
claude.hooks.jsonはプロジェクトのルートに配置されている必要があります - JSONの構文エラーをチェック。VS Codeの検証機能を使うと、タイプミスをすぐに見つけられます
- コマンドが実行可能か、実行権限があるか確認。特にシェルスクリプトの場合は
chmod +xで実行権限を付与しましょう - デバッグモードで詳細ログを表示:
--debugフラッグを使用することで、各ステップの実行状況が可視化されます
パフォーマンスの最適化
Hookの実行時間が長い場合は、以下の対策を検討してみましょう。最初のころは全部有効にしていたので、毎回のコミットが遅くて大変でした。
- 不要なチェックを削除または無効化。全てのチェックが常に必要とは限りません
- 重い処理は別スレッドで非同期実行。
async: trueオプションを使うと、他のHookと並列実行できます - キャッシング機構を導入して重複実行を避ける。例えば、依存関係が変わっていなければ監査をスキップするなど
- Hookの実行順序を最適化。並列実行可能な処理は同時に走らせることで、全体の時間を短縮できます
Hooks機能を活用するベストプラクティス
開発効率の向上と品質の確保のため、Hooks機能は開発ワークフローの中核として位置づけることをお勧めします。
- 段階的な導入:最初は最も重要なチェック(lintとテスト)から始めるべきです。全部一度に有効にするとチーム全体が混乱します
- チームで共有:
claude.hooks.jsonをバージョン管理に含めて、全員が同じ設定で開発できるようにしましょう - ログの記録:Hookの実行結果をログファイルに出力して、後で問題を確認できるようにしておくと便利です
- 定期的な見直し:Hookの設定が最適かどうか、定期的に評価する習慣をつけることが大事です
- エラーハンドリング:
failOnErrorを適切に設定し、重要な処理は失敗させることで、問題をできるだけ早く検出できます
まとめ
Claude CodeのHooks機能は、開発ワークフロー全体を自動化する強力なツールだと言えます。
- Hooks機能の基本:イベント駆動型で、
claude.hooks.jsonで定義される仕組みになっています - 主要なHook:
beforeBuild、afterTest、beforeDeployなど、ライフサイクルの各段階で活用できます - 実践的な活用:コード品質チェック、自動テスト、デプロイメント前の安全性確認など、多くのシーンで有効です
- 詳細設定:環境変数、条件付き実行、エラーハンドリングで柔軟性を確保できます
- ベストプラクティス:段階的導入、チーム共有、定期的見直しが成功の鍵になります
適切にHooks機能を設定することで、バグの早期発見、コード品質の向上、デプロイメントの信頼性向上など、本当に多くのメリットが得られるんです。ぜひあなたのプロジェクトで導入してみてください。
よくある質問(FAQ)
Q1: Hookの実行順序を変更することはできますか?
はい、できます。hooksオブジェクト内のHook配列の順序がそのまま実行順序になります。配列内の順序を変更することで、実行順序を制御できるわけです。ただし、非同期実行を有効にした場合は、順序が保証されないこともあるので注意しましょう。
Q2: 特定のHookだけを無効化したい場合はどうしますか?
設定ファイルから該当のHook定義を削除するか、"enabled": falseフィールドを追加することで無効化できます。公式ドキュメントによると、enabledフィールドがfalseの場合、そのHookは実行されません。デバッグ時に便利な機能ですね。
Q3: Hookが実行される前に通知を受け取ることはできますか?
はい、Slackやメール等への通知をHookで実装できます。例えば、デプロイ前にcurlコマンドを使ってWebhookを呼び出すことで、チームメンバーに通知を送ることができるんです。前述の例3で紹介したnotify-teamがその実装例になります。
Q4: 同じHookを複数のプロジェクトで再利用できますか?
複数のプロジェクトで共通のHook設定を使いたい場合は、共通ファイルを別途管理して、各プロジェクトからそれを参照する方法があります。あるいは、会社全体で統一された設定をclaude.hooks.jsonテンプレートとして提供することも可能です。チームで検討してみてください。
Q5: Hookの実行結果をCI/CDパイプラインと統合できますか?
できます。Hookが失敗すると、プロセス全体が終了コードを返すので、GitHubActionsやJenkins等のCI/CDツールと連携できるんです。実際のプロジェクトでは、Hookの失敗がCI/CDの失敗として報告されるように設定しておくと、問題を素早く検出できますね。

