AIによるコミット自動化(改善版)
背景・モチベーション
以前公開した「AI によるコミット自動化」の記事に対して、以下のようなフィードバックを頂きました。
AI はまだ Why の部分を察するのが下手なので人間がコンテキスト渡さないと厳しいし、なにも考えずに AI に丸投げできるようになるのは危険
そこで前回から以下の 2 点を修正しました。
- コミットする Why の部分がセッションから分からない場合、ユーザーに質問をする
- ユーザーに必ず確認を取る
修正した Slash Command
commit.md
---
description: Git差分を分析して適切な粒度でコミットを作成(AIが質問してWhyを引き出す)
---
## 実行手順
1. `git status` と `git diff` で変更を分析
2. 差分に潜在的な問題や懸念事項があれば報告し、コミットしない
3. 以下の基準でコミットをグループ化:
- 1 コミット = 1 論理変更
- 依存する変更は同一コミット
4. 適切な粒度で変更をステージングする(`git add`)
5. ステージングした変更について、Why(変更の理由)を理解するために質問を生成し、ユーザーに質問する
- ステージングした変更(diff)とセッション情報の両方を分析すること
- まず、ステージングした変更とセッション情報を分析し、既に利用可能なコンテキストを理解する
- セッション情報から読み取れない「Why」についてのみ質問する
- セッション情報から「Why」を理解できる場合は、質問せずにコミットメッセージを生成する
- 質問が必要な場合のみ、必要な質問を一度に生成する(質問数は変更の複雑さとセッション情報に含まれるコンテキストの量によって異なる)
- 全ての質問を一度にユーザーに提示する
- 「何をしたか」ではなく、「なぜ」「意図」に焦点を当てる
- 「この変更は何をしますか?」のような汎用的な質問は避ける
- 良い質問の例(diffで特定の変更を見た場合):
- タイムアウト値の変更を見た場合: 「タイムアウトを3秒から5秒に増やした理由はなんですか?」
- nilチェックの追加を見た場合: 「このnilチェックはどのエッジケースやエラーシナリオに対応していますか?」
- コードのリファクタリングを見た場合: 「このリファクタリングはより大きなクリーンアップの一部ですか?それとも特定の問題があって行ったものですか?」
- テストの分割を見た場合: 「このテストを複数の小さなテストに分割した理由はなんですか?」
- 悪い質問の例(避けるべき):
- 「ファイルを更新しましたか?」(diffから明らか)
- 「Xの新しい値は何ですか?」(diffで確認できる)
- 「この変更は何をしますか?」(汎用的すぎる、「なぜ」に焦点を当てる)
6. 質問をした場合、ユーザーから全ての質問への回答を集める
7. 質問への回答(およびセッション情報)を基にコミットメッセージを完成させる
8. 必ずユーザーの確認を取ってからコミットを実行する
9. ユーザーが確認したら、コミットを実行する
10. ステージングされていない変更が残っている場合は、4 に戻る
## コミットメッセージ形式
```
<emoji> <prefix>: <subject>
[body: 変更の理由を説明(質問への回答を基に生成)]
```
**<emoji> <prefix> 一覧:**
- ✨ feat: 新機能の追加
- 🐛 fix: バグ修正
- ⚡️ perf: パフォーマンス改善
- ♻️ refactor: コードのリファクタリング
- 🔥 remove: コードやファイルの削除
- 💄 style: UI やスタイルファイルの追加・更新
- 🚸 ux: ユーザー体験/ユーザビリティの改善
- ♿️ a11y: アクセシビリティの改善
- 📝 docs: ドキュメントの追加・更新
- 💡 comment: ソースコード内のコメント追加・更新
- ✏️ typo: タイポの修正
- 🤡 mock: モックの作成
- 🏷️ types: 型の追加・更新
**ルール:**
- subject: 50 文字以内で変更内容を簡潔に説明(AIが生成)
- body: 変更の理由("なぜ")を詳しく説明(質問への回答およびセッション情報を基にAIが生成)。diffの内容を説明するのではなく、物語性とコンテキストに焦点を当てる。シグナル:ノイズ比を考える - 読者が変更の「なぜ」を真に理解できるようにする
- bodyの各文は一行ずつ記述すること(一文一行)
- 必ずユーザーの確認を取ってからコミットを実行すること
- このコマンド実行後は通常モードに戻り、ユーザーが明示的に `/commit` を実行するまで自動的にコミットしない
- コミットメッセージは全て日本語で記述してください。
解説
AI に理解できない Why を質問させる
複雑な差分に対し、詳細に質問してくれるようになりました。
必ず質問をさせるようにするとセッション情報から読み取れることも質問してきてしまうのでセッション情報から読み取れない「Why」についてのみ質問するにしてます。
全ての質問を一度にユーザーに提示するとつけているのは、下記のように 1 つずつ質問を聞いてくるのを防ぐためです。
1/3 hogehoge
次の質問...
2/3 hugahuga
次の質問...
3/3 piyopiyo
必ずユーザーの確認を取ってから実行
Why を質問させるようにしたことで、大抵いい感じのメッセージを生成してくれるようになったので不要な感じはしているのですが、仕事ではつけようと思います。
その他
その他諸々変わっている箇所ありますが、重要なのは上記 2 点です。
終わりに
前回の記事を書いたおかげでフィードバックを頂けたので書いてよかったです。