私たちのチームでは 6 月から全面的に Claude Code を使った開発をスタートしています。
本記事では筆者が 2 ヶ月間 Claude Code を触りながら行き着いた、シンプルながら効果的な git-grep の使い方を紹介します
この記事で書くこと
- Claude Code で git-grep を活用する例
- (おまけ)新しいフックを追加するときの Tips
この記事で書かないこと
- フック定義(python コード)の解説
- Claude Code やフックの説明
いきなり結論ですが、PreToolUse フックで Grep ツールの呼び出しを禁じ、 git grep --function-context
を強制するフック を定義しています。
もちろん Bash ツールで grep を使ったコンテンツ検索も禁じています。ripgrep も断固として禁じています。
なおフックの python コードは Claude Code のドキュメント を少し改変して利用しています。
git-grep の何がよいのか
LSP サーバー を使うよりフットプリントが小さく、また後述のフラグ利用でコード調査をスムーズに進められる利点があります。
思想が強いのは否定しません。
--function-context
と --show-function
そのまま git-grep を使うのではなく、 基本は --function-context
フラグも利用します。
(
lambda cmd: cmd.strip().startswith("grep "),
"grep の変わりに git grep --function-context [--and|--or|--not|(|)|-e ...] -- ... を使ってください。--function-context フラグにより出力行が多すぎる場合、 --show-function と -C フラグを利用してください" ,
),
(
lambda cmd: (
re.match(r"^git\s+grep\s+", cmd) and
not re.search(r"-W|-p|--function-context|--show-function", cmd)
),
"git grep では --function-context か --show-function フラグを使ってください。まず --function-context フラグを利用し、結果行が多すぎる場合、 --show-function と [ -C | -A | -B ] フラグを利用してください",
),
--function-context
フラグは、マッチしたパターンを含む 関数全体 を grep 結果に出力します。
つまり、調べたい関数やコンポーネント検索したとき、その使われ方 と一緒に確認することができます。
これを Claude Code に使わせることで、Claude Code に任意の関数やコンポーネントの使い方を効率よく調べさせることができます。
ただこの「関数全体を出力する」機能はときに出力サイズが大きくなるので、--show-function
フラグも許容しています。こちらは関数全体ではなく、マッチしたパターンと 関数名 を出力します。
なお --function-context
フラグの省略表記で -W
が、--show-function
フラグでは -p
が使えますが、Claude Code がより意図を理解してくれる気がするのであえて長いフラグを使っています。
独自のフックを定義する Tips
筆者は WebFetch ツール用のフック も定義しています。
当時 WebFetch でどういった json 入力がフックに与えられるかがわからず、ドキュメントや Web 上でも見つけられなかったので、独自で調べる必要がありました。
現時点ではベストプラクティスがあるかもしれませんが、簡単に json の形式を確認する Tips を紹介します。
結論からいうと次のようなコマンドを使います。
jq . ~/.claude/projects/*/*.jsonl | grep -C 10 WebFetch | less
簡単に解説すると、 ~/.claude/projects/
配下には、ワークスペース(Claude Code を起動したディレクトリ)ごとにディレクトリが作成されます。
~/.claude/projects//
配下には、セッションごとに jsonl ファイルで、ユーザーと Claude Code がやりとりしたプロンプトデータが保存されています。
上記コマンドでは、これらを jq
コマンドで整形してから grep
で任意のツール(上記例では WebFetch)の周辺行を確認しています。
jq .
の例
この例では url
という入力があることがわかります。これをフックで検証に利用することができます。
try:
input_data = json.load(sys.stdin)
except json.JSONDecodeError as e:
print(f"Error: Invalid JSON input: {e}", file=sys.stderr)
sys.exit(1)
tool_name = input_data.get("tool_name", "")
tool_input = input_data.get("tool_input", {})
url = tool_input.get("url", "")
issues = validate_url(url)
あとがき
本記事で紹介した効果は筆者の 経験に基づく感覚であり、計測したものではない ということにご留意ください。
クセのある Claude Code の使い方をネタとして紹介したかった という動機で書き始めた記事でした。
ただ git-grep はとても高機能であり、人間が使う上でも役立つ 場面が多いので、もし参考になれば幸いです。
Views: 0