はじめに
七尾百合子さん、お誕生日 223日目 おめでとうございます! nikkieです。
掴みそこねていた Claude Code のフックについて手を動かします。
目次
Claude Code に Python のリンタを渡したい
言語を少し深く知ってる開発者なら、いまのAIよりは自分のほうが(速くはないけど)詳しいって感覚なんですかねぇ #kichijojipm
— nikkie(にっきー) 技書博12 お-08 Python仮想環境本 (@ftnext) 2025年9月6日
私にとってはPythonがそうで、Claude Codeが書いてくるコード、Pythonを理解してないので、リンタが怒るようなコードをいつも書くんですよね(リンタを設定して渡さなきゃ
これがフックでできそうと気づき、手を動かしました。
ドキュメント「Claude Code フックを始める」を元に(Claude Code と一緒に)手を動かしていきます。
(「ページをコピー」してローカルにファイルを作り、Claude Code のコンテキストに入れました)
設定ファイル .claude/settings.local.json
{ "hooks": { "PostToolUse": [ { "matcher": "Edit|Write", "hooks": [ { "type": "command", "command": "jq -r '.tool_input.file_path' | { read file_path; if echo \"$file_path\" | grep -q '\\.py$'; then uvx ruff format \"$file_path\" && uvx ruff check --fix --extend-select I \"$file_path\"; fi; }" } ] } ] } }
コードフォーマットフックをベースにしました。
- TypeScript から Python に置き換え
- 私がよく使う Ruff コマンドを設定1
readで変数に代入read -pでプロンプトに対する入力を変数に受け取ったことがあるのですが、jqの出力をパイプで受け取れるのか!
この JSON は直接書いたわけでなく /hooks で対話的に作ることができました
動作確認
フックが効くことの確認です。
Pythonのコードを書いてみてください。10行程度でPEP 8違反を入れてください
Write(/.../pep8_violations.py)
⎿ PostToolUse:Write hook succeeded: 1 file reformatted
Found 4 errors (4 fixed, 0 remaining).
計画通り!
今回はフックの理解 + 簡単な例で動かした形です。
積み残しも書き出します
- Ruffをもっと細かく設定したい(プロジェクトごとのpyproject.toml?)
- 1コマンドで実行したいので、スクリプトを置く?
- フックのリファレンスを一読すると、もっと自在に書けそう
- フックとは関係ないが、check --fix -> format の順番のほうがいいかも
終わりに
Claude Code のフック、どんなものか掴めました。
Claude Code が Python を書いた後に Ruff を動かせています。
実運用はこれからですが、このあたりの過去記事とつながってくる感じがしますね
今回の Claude Code のバージョン
% claude --version 2.0.27 (Claude Code)
/terminal-setupで改行入れられるように設定できて助かりました