GPTによるコミットメッセージ自動生成プロンプトの紹介

# 🤖 GPT for Commits: GPTによるコミットメッセージ自動生成プロンプトの紹介
こんにちは、皆さん！今回はGPTを使ってコミットメッセージを自動生成するプロンプトを紹介します。
aicommits等のツールや、JetBrainsのIDEのプラグインにAICommitの機能等もございます。
設定が大変だったり、思うようにカスタマイズできないので、一番手軽なプロンプトを使う手法を紹介します。

# 🖊️ Commit Message Format: コミットメッセージの書き方
今回のプロンプトでのコミットメッセージは以下のように書かれます。
```
<prefix>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
```
- **prefix**: コミットのタイプを表します。
- **scope**: 変更の影響範囲を示す部分です。(省略可能)
- **subject**: 変更の簡潔な説明です。
- **body**: 変更についての詳細な情報を含みます。
- **footer**: 関連するissueや重大な変更点を記述します。(省略可能)

AngularJSチームが採用しているこのスタイルは、コミットメッセージの意図を明確にし、以下のようなメリットがあります：
1. **可読性向上**:
   - prefixを加えることで、どのような変更が行われたかが一目で分かります。

2. **構造の統一化**:
   - 全てのコミットに一貫したフォーマットを適用することにより、管理がしやすくなります。

3. **フィルタリングと自動化の効率化**:
   - 特定のprefixを持つコミットをすばやく識別し、ビルドやデプロイプロセスを最適化します。

4. **意図の明確化**:
   - prefixによって、コード変更の目的が明示されます。

5. **レビューの効率化**:
   - レビューアーはprefixに基づいて優先順位を付け、迅速に対応できます。

これらのガイドラインはチーム開発はもちろん、個人開発においても、コミットメッセージの意図を明確にするために有効です。

:::note info
コミットメッセージの「subject」は50文字以内にまとめることが推奨されています。これはGitHubなどのプラットフォームで表示される内容が50文字以内のためです。
:::

# 🤝 For Teams: チーム開発向け

## 🔖 Prefix Types: prefixの種類
- **feature**:
  - 新機能や改善の開発用。
  - メインの開発ブランチとして使用。

- **bugfix**:
  - 既存の問題やバグの修正用。
  - 変更内容は次のリリースに含まれることが多い。

- **hotfix**:
  - 緊急性の高いバグの迅速修正用。
  - 本番環境で直接修正し、リリース済みバージョンから派生。

- **release**:
  - リリース前の最終調整用。
  - バージョン番号の変更やドキュメントの更新を行い、リリース時にタグ付け。

- **refactor**:
  - コード構造の改善・リファクタリング用。
  - 機能追加ではなく、可読性や保守性、パフォーマンスの向上が目的。

- **chore**:
  - プロジェクト管理や運用関連の変更用。
  - 依存関係の更新、ビルドスクリプト編集、CI設定変更など。

## 🎯 Scope Types: scopeの種類
- **Frontend**:
  - ユーザーインターフェースの変更。
  - クライアントサイドのロジックとスタイルの調整。

- **Backend**:
  - サーバーサイドのロジックとビジネスルールの変更。
  - コントローラーやサービスの更新。

- **Database**:
  - データモデルの更新、スキーマ変更。
  - データベースマイグレーション作業。

- **API**:
  - RESTful APIやGraphQLエンドポイントの変更。
  - ミドルウェアとデータ交換形式の調整。

## 📝 Footer Types: footerの種類
- **BREAKING CHANGE**:
  - 既存の互換性を破る変更が含まれる場合に使用。

- **Issue Tracking**:
  - Issue番号の参照 (`Closes`, `Refs`) を統一的なタグで記録し、管理と連携。

- **Reverts**:
  - 取り消されたコミットを特定する際に使用。

- **Contributors**:
  - コミットに関わった人々 (`Signed-off-by`, `Co-authored-by`, `Reviewed-by`, `Tested-by`) の貢献を記録。

- **Deprecation & Security**:
  - セキュリティ修正や非推奨機能警告は通常別々だが、状況に応じて一つのタグでまとめることも。

- **Infrastructure**:
  - ビルドシステムやCI/CDパイプライン (`Build`, `Ci`) 関連の変更を示すタグ。

- **Code Changes**:
  - コード修正 (`Fix`), 新機能追加 (`Feature`), リファクタリング (`Refactor`) を包含する包括的なタグ。

# 🧑‍💻 For Solo Developers: 個人開発向け

## 🔖 Prefix Types: prefixの種類
- **feat**:
  - 新機能や機能の改善を追加した際に使用。

- **fix**:
  - バグを修正した際に使用。

- **docs**:
  - ドキュメントの更新や改善のみに関する変更。

- **refactor**:
  - コードのリファクタリングやパフォーマンスの向上に関する変更。

- **chore**:
  - ビルドプロセス、依存関係の更新など、コード変更以外の小さな作業。

## 🎯 Scope Types: scopeの種類
- **ui**:
  - ユーザーインターフェースに対する変更や改善が含まれるときに指定。
  
- **backend**:
  - サーバーサイドのロジック、ビジネスルールの変更が行われた際に指定。
  
- **db**:
  - データベースのスキーマ更新、マイグレーションなどデータ関連の変更時に使用。
  
- **api**:
  - APIエンドポイント、リクエスト/レスポンス形式の変更があった場合に使用。
  
## 📝 Footer Types: footerの種類
- **BREAKING**:
  - 公開APIやそれ以外の互換性のない修正が含まれている場合に明記。
  
- **See**:
  - コミットに関連するIssue番号や外部ドキュメントへの参照を含める際に用いる。

# 🤖 GPT-powered Commits: GPTを使ったコミットメッセージの自動生成プロンプト

以下のプロンプトを入力すると、個人開発向けのコミットメッセージが自動生成されます。
【今回の変更点】に変更点を書いてください。

```
【今回の変更点】を考慮して、【ルール】に基づいたコミットメッセージを生成してください。

【今回の変更点】

【ルール】
このプロジェクトは個人開発なので、今後の展望は不要です。
bodyは必ず1行に収めて、途中に改行を付けないでください。
言語は日本語でお願いします。
<prefix>(<scope>): <subject>の部分は必ず50文字以内に収めてください。

【コミットメッセージの書き方】
コミットメッセージは以下のように書きます。
<prefix>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
- prefix: コミットの種類
- scope: 変更の範囲(省略可)
- subject: 変更の概要
- body: 変更の詳細
- footer: 関連するissueやブレーク変更など(省略可)

・prefixの種類
- feat: 新しい機能や改善を追加。
- fix: バグ修正。
- docs: ドキュメントのみの変更。
- refactor: パフォーマンス改善やリファクタリング。
- chore: その他の小さな変更（ビルドスクリプト、依存関係の更新など）。

・scopeの種類
- ui: ユーザーインターフェースの変更。
- backend: サーバーサイドのロジック変更。
- db: データベース関連の変更。
- api: API関連の変更。
  
・footerの種類
- BREAKING: 互換性のない変更。
- See: 関連するIssueや外部リソースへの参照。
```

# 📚 Usage Examples: 使用例
プロンプト部分は省略しています。

変更点
```
フロントエンドのUI表示部分のリファクタリングを行いました。
```

出力
```
今回の変更点とルールを考慮したコミットメッセージは以下のようになります：

refactor(ui): フロントエンドUI表示のリファクタリング

フロントエンドのUI表示部分を整理し、可読性とメンテナンス性を向上させました。

このメッセージでは、以下のガイドラインに従っています：
- **prefix**: `refactor` - リファクタリングを行ったため。
- **scope**: `ui` - フロントエンドのUI表示部分に関連するため。
- **subject**: 50文字以内で変更の概要を簡潔に表現。
- **body**: 1行で変更の詳細を日本語で記述。
- **footer**: 今回は関連するissueやブレーク変更がないため省略。
```

変更点
```
プロジェクトにuuid4のライブラリを追加しました。
```

出力
```
この変更に基づいたコミットメッセージは以下のようになります：

feat(dependency): uuid4ライブラリの追加

プロジェクトにuuid4ライブラリを追加し、ユニークなID生成機能を強化しました。

このメッセージでは以下のガイドラインに従っています：
- **prefix**: `feat` - 新しいライブラリの追加は機能の改善と見なされるため。
- **scope**: `dependency` - 依存関係に関わる変更のため。(`ui`, `backend`, `db`, `api`のいずれにも該当しないため、`dependency`としています)
- **subject**: 50文字以内で変更の概要を簡潔に表現。
- **body**: 1行で変更の詳細を日本語で記述。
- **footer**: 今回は関連するissueやブレーク変更がないため省略。
```

変更点
```
README.mdのtypo修正
```

出力
```
この変更に基づいたコミットメッセージは以下のようになります：

fix(docs): README.mdのtypo修正

README.mdの文書内の誤字を修正しました。

このメッセージでは以下のガイドラインに従っています：
- **prefix**: `fix` - 誤字修正はバグ修正の一種と見なされるため。
- **scope**: `docs` - ドキュメントに関わる変更のため。
- **subject**: 50文字以内で変更の概要を簡潔に表現。
- **body**: 1行で変更の詳細を日本語で記述。
- **footer**: 今回は関連するissueやブレーク変更がないため省略。
```

変更点
```
メジャーアップデートによる、APIの破壊的変更を行いました。
このAPIはクライアントの操作ログを取得するものです。
```

出力
```
この変更に基づいたコミットメッセージは以下のようになります：

feat(api): クライアント操作ログAPIのメジャーアップデート

メジャーアップデートにより、クライアントの操作ログ取得APIを全面的に改変しました。

BREAKING CHANGE: 互換性のない変更を含みます。

このメッセージでは以下のガイドラインに従っています：
- **prefix**: `feat` - 機能の大幅な改善や追加として扱います。
- **scope**: `api` - APIに関わる変更のため。
- **subject**: 50文字以内で変更の概要を簡潔に表現。
- **body**: 1行で変更の詳細を日本語で記述。
- **footer**: `BREAKING CHANGE`を記載し、互換性のない変更を明示。
```

## 🗃 Summary: まとめ

お疲れ様でした！この記事を最後まで読んでいただきありがとうございます！
プロンプトに関しては、適宜修正して自分好みにカスタマイズしてください！

また、これらのプロンプトを使って、コマンドラインでコミットメッセージを自動生成するツールを作成する予定です。
ですが、APIのトークンを使用してしまう点が問題となってきます。(安いからあんまり気にならないかもしれませんが)
なので、GPTのトークンを削減するために英語を使用して日本語の出力をするようにする予定です。

<details><summary>英語にした場合のプロンプト</summary>

```
Please generate a commit message based on the 【Rules】 considering the 【Recent Changes】.

【Recent Changes】

【Rules】
Since this project is for personal development, future prospects are not necessary.
The body must be contained in a single line without any line breaks.
Please write the commit message in Japanese.
Ensure that the <prefix>(<scope>): <subject> part is always within 50 characters.

【How to Write Commit Messages】
Commit messages should be written as follows:
<prefix>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>
- prefix: Type of commit
- scope: Scope of changes (optional)
- subject: Summary of changes
- body: Details of changes
- footer: Related issues or breaking changes, etc. (optional)

Types of prefixes:
- feat: Add new feature or improvement.
- fix: Bug fix.
- docs: Documentation-only changes.
- refactor: Performance improvements or refactoring.
- chore: Other minor changes (such as build scripts, dependency updates, etc.).

Types of scopes:
- ui: Changes to the user interface.
- backend: Changes to server-side logic.
- db: Database-related changes.
- api: API-related changes.

Types of footers:
- BREAKING: Changes that break compatibility.
- See: References to related issues or external resources.
```

</details>

## 💡 Related Technologies: 関連技術

ダウンロードは自己責任でお願いします。
また、これらのツールは英語での使用を前提としています。

aicommitsの紹介記事

https://zenn.dev/sarah/articles/55f799fbe47e36

JetBrainsのIDEのプラグイン

https://plugins.jetbrains.com/plugin/21289-aicommit

vscodeの拡張機能

https://marketplace.visualstudio.com/items?itemName=vivaxy.vscode-conventional-commits

https://marketplace.visualstudio.com/items?itemName=MichaelCurrin.auto-commit-msg