nikkie-ftnextの日記

イベントレポートや読書メモを発信

Claude Code のフックに Ruff を設定するのをお試し

はじめに

七尾百合子さん、お誕生日 223日目 おめでとうございます! nikkieです。

掴みそこねていた Claude Code のフックについて手を動かします。

目次

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で改行入れられるように設定できて助かりました