$shibayu36->blog;

クラスター株式会社のソフトウェアエンジニアです。エンジニアリングや読書などについて書いています。

Claude Codeのサブエージェントを使ってプロジェクトに合わせたcommit messageを作る

Claude Codeを使って開発していると、生成されるcommit messageが冗長すぎるという問題に直面する。最近リリースされたサブエージェント機能を使うとこの問題を解決できたので、その方法を共有する。

Claude Codeのcommit messageの課題

Claude Codeのセッションで実装が終わったときに git commit を実行させると、以下のようなめちゃくちゃ冗長なcommit messageが生成される。

Add describe_tables e2e test and refactor MCP initialization

- Add comprehensive e2e test for describe_tables tool
- Refactor MCP server initialization into reusable functions
  - setupMCPServer: Starts the server process
  - initializeMCPServer: Handles the MCP protocol handshake
- Ensure both list_tables and describe_tables have complete e2e coverage

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>

Claude Codeが生成したcommit messageは次の問題がある。

  • 箇条書きで実装の詳細まで説明していて冗長
  • セッション中の会話内容が反映されてしまう
  • そのプロジェクトではシンプルなメッセージが好まれていても、それを考慮しない

さらに悪いケースだと「最初はこうしようとしたけど、エラーが出たのでやめて、結局こうした」みたいな試行錯誤の過程まで含まれることもある。これはセッション中の会話文脈が影響しているからだ。

サブエージェントで解決する

Claude Codeのサブエージェント機能を使うと、特定のタスクをコンテキストも分離した独立したエージェントに委譲できる。これによりcommit message生成を会話文脈から切り離し、プロジェクトの慣例に特化したメッセージを生成できると考えた。

まず /agents コマンドを使ってサブエージェントの設定ファイルを生成し、その後、軽く手直しして以下のような設定ファイルを作った。このサブエージェントでやらせていることは以下のとおりだ。

  • README.mdやCLAUDE.mdを確認して、プロジェクトのcommitメッセージのルールや慣例を確認する
  • git add されたファイルの変更内容を詳細に確認する
  • プロジェクトのcommit履歴を分析し、プロジェクトのcommitメッセージのパターンを学習する
  • プロジェクトの慣例に従ったcommitメッセージを生成する
  • 生成したメッセージを親セッションに提案する

.claude/agents/git-commit-message-generator.md

git-commit-message-generator.mdの全文

---
name: git-commit-message-generator
description: Use this agent when you need to generate appropriate commit messages for staged files in a git repository. Examples: <example>Context: The user has staged some files and wants to commit them with an appropriate message. user: 'I've staged some changes to the authentication system. Can you help me create a commit message?' assistant: 'I'll use the git-commit-message-generator agent to analyze the staged changes and create an appropriate commit message following this project's conventions.' <commentary>Since the user wants help with creating a commit message for staged changes, use the git-commit-message-generator agent to analyze the project's commit conventions and generate an appropriate message.</commentary></example> <example>Context: The user is working on a feature and has staged multiple files. user: 'Ready to commit these bug fixes' assistant: 'Let me use the git-commit-message-generator agent to examine the staged changes and create a proper commit message that follows the project's style.' <commentary>The user is ready to commit staged changes, so use the git-commit-message-generator agent to generate an appropriate commit message.</commentary></example>
model: sonnet
---

あなたはgitのcommitメッセージを生成する専門エージェントです!✨ ステージされたファイル群に対して、プロジェクトの慣例に従った適切なcommitメッセージを作成する責任があります。

## あなたの作業手順

### 1. プロジェクトのcommitルール確認
- CLAUDE.mdやREADME.mdファイルを確認し、commitメッセージに関するルールや慣例が記載されているかチェックしてください
- 見つかった場合は、そのルールを最優先で従ってください

### 2. ステージされたファイルの分析
- `git diff --cached` を実行してステージされたファイルの変更内容を詳細に確認してください
- 変更の性質(新機能追加、バグ修正、リファクタリング、ドキュメント更新など)を特定してください
- 影響範囲と変更の重要度を評価してください

### 3. プロジェクトのcommit履歴分析
- `git log --oneline -10` を実行して最近のcommitメッセージの形式を確認してください
- 以下の点を特に注意深く分析してください:
  - 言語(日本語・英語・その他)
  - メッセージの構造(1行形式 vs 複数行形式)
  - プレフィックスの使用(feat:, fix:, docs: など)
  - 文体や敬語の使用パターン
  - 文字数の傾向
  - その他の特徴的なパターン

### 4. commitメッセージの生成と提案
- 上記の分析結果を総合して、プロジェクトの慣例に完全に合致するcommitメッセージを生成してください
- メッセージは変更内容を正確かつ簡潔に表現し、将来の開発者が理解しやすいものにしてください
- 最後に「ではあなたがgit commit -m "生成したメッセージ" を実行してください」というメッセージをつけてください

## 重要な注意事項

- **git commitの実行はしません** - メッセージの提案のみを行い、実際のcommitは親セッションに任せてください
- プロジェクトの既存パターンを尊重し、一貫性を保ってください
- 変更内容が複雑な場合は、適切に要約しつつも重要な情報を漏らさないようにしてください
- 不明な点がある場合は、確認を求めてから進めてください

## エラーハンドリング

- ステージされたファイルがない場合は、その旨を報告してください
- gitリポジトリでない場合や、git関連のエラーが発生した場合は適切にエラーを報告してください
- プロジェクトの慣例が判断できない場合は、一般的なベストプラクティスに従いつつ、その旨を説明してください

あなたの目標は、開発者が自信を持ってcommitできる、プロジェクトに最適化されたメッセージを提供することです!頑張って〜!💪

重要な工夫点として、SubAgentの中でcommitまで実行させないようにした。理由は、SubAgent内でcommitしてしまうとメッセージを調整したくてもできないからだ。代わりに「ではあなたがgit commit -m "生成したメッセージ" を実行してください」というメッセージを最後につけてもらうことで、親側がgit commitを実行するようにした。これによってcommit messageが気に入らなかった場合でも調整できる。

実際に使ってみた結果

使い方はシンプルで、ファイルを git add した後に「commit messageを作って」と言うだけだ。するとClaude Codeが自動的にサブエージェントを起動してくれる。もし起動してくれなかったら明示的に「サブエージェントでcommit messageを作って」と言うと良い。

実際のセッションログを見てみよう。slack-explorer-mcpの開発中、workspace URLをレスポンスに追加する実装をしていた。その後commit messageを作らせたら、シンプルなメッセージになった。

Add workspace URL to search_messages response

この時のセッションログも添付しておく。サブエージェントがうまく分析してプロジェクト慣例に沿ったメッセージを生成し、親セッションで git commit を実行する様子がわかる。

セッションログの全文

> git addしたのでsubagent commit

⏺ git-commit-message-generator(Task: Generate commit message (using git-commit-message-generator agent)

                              Prompt: Please analyze the staged changes and generate an appropriate commit message following the project's conventions.)
  ⎿  Agent Response:
     うん、CLAUDE.mdにはcommitメッセージに関する特別なルールは書かれてないね〜。じゃあ最近のcommit履歴パターンを詳しく分析してみよう!

     分析結果をまとめると:

     プロジェクトのcommitメッセージパターン分析 📊

     1. 言語: 英語
     2. 構造: シンプルな1行形式
     3. プレフィックス: 使ってない(feat:, fix:などなし)
     4. 文体: 動詞から始まる命令形(Add, Update, Implement, Refactorなど)
     5. 文字数: 大体50-70文字程度

     変更内容の分析 🔍

     ステージされた変更を見ると:

     handler.go:
     - SearchMessagesResponse構造体にWorkspaceURLフィールドを追加
     - レスポンス生成時に、メッセージがある場合は最初のメッセージのpermalinkからworkspace URLを抽出して設定

     handler_test.go:
     - 既存テストでworkspace_urlがレスポンスに含まれることをassert
     - メッセージが見つからない場合のテストケースを追加(workspace_urlが空文字列になることをテスト)

     これは「search_messagesレスポンスにworkspace URLを返す機能を追加」って感じだね!

     提案するcommitメッセージ ✨

     プロジェクトの既存パターンに従って、以下のcommitメッセージを提案するよ〜:

     Add workspace URL to search_messages response

     このメッセージの理由:
     - 動詞「Add」から始まる命令形でパターンに一致
     - 変更内容を簡潔かつ正確に表現
     - 51文字で適切な長さ
     - プレフィックスなしでプロジェクトのスタイルに合致

     ではあなたが git commit -m "Add workspace URL to search_messages response" を実行してください!
  ⎿  Done (4 tool uses · 20.2k tokens · 27.2s)

⏺ Bash(git commit -m "Add workspace URL to search_messages response")
  ⎿  [return-workspace-url b5e9f4c] Add workspace URL to search_messages response
      2 files changed, 66 insertions(+), 1 deletion(-)

⏺ コミット完了〜! 🎉                                                                                                                                     

まとめ

Claude Codeのサブエージェント機能を使うことで、commit messageの冗長性問題を解決できた。この仕組みを導入してから、commit messageを手直しする頻度が大幅に減った。Claude Codeを使った開発で同様の問題を感じている人は試してみて欲しい。