👏
Claude Code の hooks を lefthookで管理する
モチベーション
Claude Codeからhooksという機能が実装され、Claude Codeのライフサイクル中に任意のコマンドを実行できるようになるというもの。
ファイル編集後にlintやformatをかけるのに便利そうだが、モノレポのように複数のファイル種別が存在し異なるコマンドを実行させたくなると、Claude Codeの設定ファイルが煩雑化する。
そこでClaude Codeのhooksで実行する内容をlefthookで管理することによって、ファイルパターンや既存のgit hookとの設定を共通化させることができる。
lefthookには任意のhookを任意のファイルを指定して実行する機能があるため、これを利用する。
設定方法
hooks自体の詳しい使い方は、公式ドキュメントを参照してください。
tool実行後に動く PostToolUse
hookの場合は以下のような入力が来るので
これをjqでパースし、tool_input.file_path
をlefthookに渡します。
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