👏

Claude Code の hooks を lefthookで管理する

に公開

モチベーション

Claude Codeからhooksという機能が実装され、Claude Codeのライフサイクル中に任意のコマンドを実行できるようになるというもの。
https://docs.anthropic.com/en/docs/claude-code/hooks

ファイル編集後にlintやformatをかけるのに便利そうだが、モノレポのように複数のファイル種別が存在し異なるコマンドを実行させたくなると、Claude Codeの設定ファイルが煩雑化する。

そこでClaude Codeのhooksで実行する内容をlefthookで管理することによって、ファイルパターンや既存のgit hookとの設定を共通化させることができる。

lefthookには任意のhookを任意のファイルを指定して実行する機能があるため、これを利用する。
https://lefthook.dev/usage/commands.html#lefthook-run

設定方法

hooks自体の詳しい使い方は、公式ドキュメントを参照してください。
https://docs.anthropic.com/en/docs/claude-code/hooks

tool実行後に動く PostToolUse hookの場合は以下のような入力が来るので
これをjqでパースし、tool_input.file_path をlefthookに渡します。

https://docs.anthropic.com/en/docs/claude-code/hooks#posttooluse-input

hooksのinput

{
  "session_id": "abc123",
  "transcript_path": "~/.claude/projects/.../00893aaf-19fa-41d2-8238-13269b9b3ca0.jsonl",
  "tool_name": "Write",
  "tool_input": {
    "file_path": "/path/to/file.txt",
    "content": "file content"
  },
  "tool_response": {
    "filePath": "/path/to/file.txt",
    "success": true
  }
}

.claude/settings.json

{
 "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit|MultiEdit",
        "hooks": [
          {
            "type": "command",
            "command": "jq -r '.tool_input.file_path' | xargs -r -I {} npx lefthook run post-tool-use-edit --file={}"
          }
        ]
      }
    ]
  }
}

lefthook側の設定はこんなイメージ

lefthook.yml

post-tool-use-edit:                 
  commands:
    prettier:                                              
      glob: '*.{js,jsx,ts,tsx}'                         
      run: yarn prettier {staged_files} --check

Discussion