こんにちは、椎葉です。カケハシでVPoT(VP of Technology)をやっています。今日は、僕が使っているCursorのカスタムコマンドを2つ紹介します。
カケハシではコーディングエージェントとして、Cursor、Claude Code、GitHub Copilot、そしてDevinを利用できます。その中で僕はメインではCursorを使用しています。最近だと、Cursorを使ってTerraformによるAWSのインフラ構築をやっていて、便利だなーと思っています。
そんな日々の作業の中で、コミットとプルリクエストの作成をよく実施しているので、その2つをCursorのカスタムコマンドとして登録してみました。まだまだブラッシュアップ中ですが、わりと便利に利用できているので紹介します。
Cursorのコマンド
Cursorの「コマンド」とは再利用可能なプロンプト定義です。チャットウィンドウでスラッシュを入力すると呼び出せます。Cursorに限らず、他のAIエージェントにもコマンド機能はありますね。
Cursorの場合は .cursor/commands ディレクトリにコマンド用のマークダウンファイルを置くことで、そのプロジェクトのコマンドとして利用できます。また、 ~/.cursor/commands に置くとそのマシンのグローバルコマンドとして利用できます。
コミットコマンド
最初に紹介するのは /commit コマンドです。Cursor自体にコミットログを生成する機能(✨️)はあるのですが、もう少しルールを適用したいなと思って作成しました。

/commit コマンドを実行すると、こんな風に作業を進めてコミットしてくれます。
変更内容を確認中です。 ``` $ cd (省略)/techblog-202511 && git status ``` ``` $ cd (省略)/techblog-202511 && git diff ``` 変更内容を確認しました。`sample.md` が新規ファイルとして追加されています。ステージングしてコミット対象を確認します。 ``` $ cd (省略)/techblog-202511 && git add . ``` ``` $ cd (省略)/techblog-202511 && git diff --cached ``` コミット対象を確認しました。`sample.md` が新規追加されています。コミットメッセージを作成してコミットします。 ``` $ COMMIT_MSG_FILE=$(mktemp /tmp/commit_msg.XXXXXX) && cat > "$COMMIT_MSG_FILE" << 'EOF' docs: サンプルファイルを追加 テックブログ用のサンプルファイルを追加する。 EOF echo "$COMMIT_MSG_FILE" ``` 一時ファイルを使用してコミットを実行します。 ``` $ cd (省略)/techblog-202511 && git commit -F /tmp/commit_msg.xInvsp ``` コミット完了。一時ファイルを削除します。 ``` $ rm /tmp/commit_msg.xInvsp ``` コミットを完了しました。 **コミット内容:** - `sample.md` を追加 - コミットメッセージ: `docs: サンプルファイルを追加` コミットハッシュ: `91cf2ff` 一時ファイルも削除済みです。
すべての動作を許可しているわけではないので、ちょこちょこ許可ボタンを押しながらにはなりますが、一連の作業をサクッとやってくれるのでとても便利です。
コマンドファイルの内容は、こんな感じになっています。僕が手で書いたわけではなくて、Cursorに書いてもらっています。
.cursor/commands/commit.md
# コミット ## 手順 1. **変更内容の確認** - `git status` と `git diff` で変更内容を確認する - ⚠️ **重要**: 記憶や推測に頼らず、必ず `git diff` で実際の差分を確認する 2. **ステージング** - `git add .` でステージングする 3. **コミット対象の確認** - `git diff --cached` でコミット対象を確認する - ⚠️ **重要**: コミット直前に必ず `git diff --cached` を実行して、コミット対象の変更を確認する 4. **コミットメッセージの作成** - `/tmp` ディレクトリに一時ファイルを作成し、コミットメッセージを記述する(以下のフォーマットに従う) 5. **コミット実行** - `git commit -F` で一時ファイルを使用してコミットする 6. **一時ファイルの削除** - コミット完了後、一時ファイルを削除する ## コミットメッセージのフォーマット ### 基本フォーマット ``` <1行のタイトル> <説明(最大5行)> ``` ### ルール - **1行目**: タイトル行(50文字以内を推奨) - **2行目**: 空白行(必須) - **3行目以降**: 説明文(最大5行まで) - **時制**: タイトル行と説明文は現在形(命令形)で記述する(「〜する」「〜を追加する」) ### タイトルのプレフィックス | プレフィックス | 用途 | |--------------|------| | `feat:` | 新機能の追加 | | `fix:` | バグ修正 | | `docs:` | ドキュメントのみの変更 | | `style:` | フォーマットの変更(コードの動作に影響しない) | | `refactor:` | リファクタリング | | `test:` | テストの追加・修正 | | `chore:` | ビルドプロセスやツールの変更 | ### 例 #### 例1: 新機能の追加 ``` feat: ユーザー認証機能を追加 ログイン画面にメールアドレスとパスワードによる認証機能を実装する。 セッション管理とトークン発行の仕組みを追加する。 ``` #### 例2: バグ修正 ``` fix: ページネーションの表示を修正 一覧画面でページ番号が正しく表示されない問題を修正する。 総件数の計算ロジックを修正し、正確なページ数が表示されるようにする。 ``` ## 実装例 ```bash # 1. 変更内容を確認する git status git diff # 2. ステージングする git add . # 3. コミット対象を確認する git diff --cached # 4. 一時ファイルを作成してコミットメッセージを記述する # 注意: 一時ファイルは必ず`/tmp`ディレクトリに作成し、`mktemp`で一意な名前を生成する COMMIT_MSG_FILE=$(mktemp /tmp/commit_msg.XXXXXX) cat > "$COMMIT_MSG_FILE" << 'EOF' feat: 新機能を追加 この機能により、ユーザーは新しい操作が可能になる。 既存の機能との互換性を保ちつつ、拡張性を向上させる。 EOF # 5. 一時ファイルを使用してコミットする git commit -F "$COMMIT_MSG_FILE" # 6. 一時ファイルを削除する rm "$COMMIT_MSG_FILE" ``` ## 注意事項 - 一時ファイルは必ず`/tmp`ディレクトリに作成する - ファイル名は`mktemp`を使用して一意な名前を生成する - 操作完了後は必ず一時ファイルを削除する
工夫したのは、この部分です。
⚠️ **重要**: 記憶や推測に頼らず、必ず `git diff` で実際の差分を確認する
Cursorと一緒に作業をしたあとに「コミットして!」とお願いすると、Cursorが自分で変更した内容を記憶しているので、その記憶だけでコミットしてしまいます。Cursorが変更したものを元に僕が少し手を加えていても、その変更を知らないままコミットしてしまうのです。
逆に、僕がほとんどの部分を修正してCursorがその内容を知らない場合は、ファイル名からの推測だけでコミットメッセージを書こうとする場合もあります。
そのため、記憶や推測に頼らず、必ず git diff で実際の差分を確認するように伝えています。
あとは、コミットメッセージが複数行にわたるときにコマンドの実行に失敗してしまう場合があるので、一旦 /tmp にファイルとしてコミットメッセージを書き出して、そのファイルを利用してコミットするようにしています。
feat: などのプレフィックスは僕から指示したのではなくてCursorが提案してきたので「いいね!」といってそのままコマンドに書いてもらっています。
プルリクエスト作成コマンド
次は /create-pr コマンドです。現在のブランチからデフォルトブランチ( origin/main )に対してプルリクエストを出してもらうときに使っています。
ということで /create-pr コマンドを実行してみました。
手順に従って進めます。まず、リモートの最新状態を取得し、変更内容を確認します。 ``` $ cd (省略)/techblog-202511 && git fetch -p ``` ``` $ cd (省略)/techblog-202511 && git branch --show-current ``` ``` $ cd (省略)/techblog-202511 && git status ``` ブランチは `work` で、`.cursor/commands/create-pr.md` に変更があります。ブランチのpush状況を確認し、変更内容を確認します。 ``` $ cd (省略)/techblog-202511 && git log origin/work..HEAD 2>&1 | head -5 ``` ``` $ cd (省略)/techblog-202511 && git diff --name-only origin/main...HEAD 2>&1 ``` ``` $ cd (省略)/techblog-202511 && git diff --stat origin/main...HEAD 2>&1 ``` 変更ファイルは3つです。各ファイルの差分を確認します。 ``` $ cd (省略)/techblog-202511 && git diff origin/main...HEAD .cursor/commands/commit.md ... ``` 差分を確認しました。変更は3ファイル: 1. `.cursor/commands/commit.md` - 新規追加(コミットコマンドのドキュメント) 2. `.cursor/commands/create-pr.md` - 新規追加(PR作成コマンドのドキュメント) 3. `sample.md` - 新規追加(サンプルファイル) `.cursor/commands/create-pr.md` に未コミットの変更があるため、まずコミットします。その後、ブランチをpushしてPRを作成します。 ``` $ cd (省略)/techblog-202511 && git add .cursor/commands/create-pr.md && git diff --cached .cursor/commands/create-pr.md ``` 未コミットの変更を確認しました。コミットしてからPRを作成します。 ``` $ COMMIT_MSG_FILE=$(mktemp /tmp/commit_msg.XXXXXX) && cat > "$COMMIT_MSG_FILE" << 'EOF' docs: create-prコマンドのドキュメントを改善 手順セクションを追加し、構造を明確化する。 実装例にgit diff --statと各ファイルの差分確認を追加する。 確認項目セクションを削除し、注意事項セクションを追加する。 EOF echo "$COMMIT_MSG_FILE" ``` ``` $ cd (省略)/techblog-202511 && git commit -F /tmp/commit_msg.RXO0bt && rm /tmp/commit_msg.RXO0bt ``` ブランチをpushしてからPRを作成します。 ``` $ cd (省略)/techblog-202511 && git push origin work ``` ブランチのpushが完了しました。確認した差分に基づいてPR本文を作成します。 ``` $ PR_BODY_FILE=$(mktemp /tmp/pr_body.XXXXXX) && cat > "$PR_BODY_FILE" << 'EOF' ## 概要 Cursorコマンドのドキュメントとサンプルファイルを追加する。 ## 変更内容 - Cursorコマンドのドキュメントを追加する - `commit.md`: コミットコマンドの手順とフォーマットを定義する - `create-pr.md`: プルリクエスト作成コマンドの手順とフォーマットを定義する - `create-pr.md`のドキュメントを改善する - 手順セクションを追加し、構造を明確化する - 実装例に`git diff --stat`と各ファイルの差分確認を追加する - 確認項目セクションを削除し、注意事項セクションを追加する - テックブログ用のサンプルファイルを追加する EOF echo "$PR_BODY_FILE" ``` PR本文ファイルを作成しました。draft PRを作成します。 ``` $ cd (省略)/techblog-202511 && gh pr create --draft --title "docs: Cursorコマンドのドキュメントとサンプルファイルを追加" --body-file /tmp/pr_body.Itsf3b ``` PRの作成が完了しました。一時ファイルを削除します。 ``` $ rm /tmp/pr_body.Itsf3b ``` プルリクエストの作成が完了しました。 **作成されたPR:** - URL: ... - タイトル: `docs: Cursorコマンドのドキュメントとサンプルファイルを追加` - ステータス: Draft(レビュー前に内容を確認できます) **変更内容:** - `.cursor/commands/commit.md` - コミットコマンドのドキュメントを追加 - `.cursor/commands/create-pr.md` - PR作成コマンドのドキュメントを追加・改善 - `sample.md` - サンプルファイルを追加 一時ファイルも削除済みです。
こんな感じでドラフトのプルリクエストが作成されます。

内容をセルフレビューして必要に応じて概要を整えてから、プルリクエストをオープンしてチームメンバーにレビューを依頼します。今回だと、コマンドの変更が「ドキュメント」として扱われているので、実際の業務の中だとそのあたりは変更するだろうなと思います。
コマンドファイルの内容も書いておきます。
# プルリクエスト作成 ## 手順 1. **リモートの最新状態を取得** - `git fetch -p` でリモートの最新状態を取得する 2. **ブランチのpush** - 現在のブランチがpushされていなければ `git push origin <branch-name>` でpushする 3. **変更ファイル一覧の確認** - `git diff --name-only origin/main...HEAD` で変更されたファイル一覧を確認する 4. **変更の統計情報の確認** - `git diff --stat origin/main...HEAD` で変更の統計情報を確認する 5. **実際の差分の確認** - ⚠️ **重要**: すべての変更ファイルについて `git diff origin/main...HEAD <file-path>` で実際の差分を確認する - 記憶や推測に頼らず、実際の差分を確認してからPR本文を作成する - 変更されたファイルすべての内容を確認する 6. **PR本文の作成** - `/tmp` ディレクトリに一時ファイルを作成し、PR本文を記述する(以下のフォーマットに従う) - 確認した差分に基づいて正確に記述する 7. **PRの作成** - GitHub CLIの `gh pr create --draft` で一時ファイルを使用してdraft PRを作成する - draftで作成することで、レビュー前に内容を確認できる 8. **一時ファイルの削除** - 一時ファイルを削除する ## PR本文のフォーマット PR本文は以下の構成で記述する: ```markdown ## 概要 この変更の概要を記載する ## 変更内容 - 変更点1 - 変更点2 ``` ## 一時ファイル使用の実装例 ```bash # 1. リモートの最新状態を取得する git fetch -p # 2. ブランチをpushする(必要に応じて) # git push origin <branch-name> # 3. 変更ファイル一覧を確認する git diff --name-only origin/main...HEAD # 4. 変更の統計情報を確認する git diff --stat origin/main...HEAD # 5. 実際の差分を確認する # ⚠️ 重要: 記憶や推測に頼らず、必ず `git diff` で実際の差分を確認する # 変更された各ファイルについて個別に確認する git diff origin/main...HEAD <file-path-1> git diff origin/main...HEAD <file-path-2> # ... すべての変更ファイルについて確認する # 6. 一時ファイルを作成してPR本文を記述する # 注意: 一時ファイルは必ず`/tmp`ディレクトリに作成し、`mktemp`で一意な名前を生成する PR_BODY_FILE=$(mktemp /tmp/pr_body.XXXXXX) cat > "$PR_BODY_FILE" << 'EOF' ## 概要 この変更の概要を記載する ## 変更内容 - 変更点1 - 変更点2 EOF # 7. 一時ファイルを使用してPRを作成する gh pr create --draft --title "タイトル" --body-file "$PR_BODY_FILE" # または、既存のPRを更新する # gh pr edit <PR番号> --body-file "$PR_BODY_FILE" # 8. 一時ファイルを削除する rm "$PR_BODY_FILE" ``` ## 注意事項 - 一時ファイルは必ず`/tmp`ディレクトリに作成する - ファイル名は`mktemp`を使用して一意な名前を生成する - 操作完了後は必ず一時ファイルを削除する
工夫したのは /commit と同じで、記憶じゃなくて git diff で差分を理解すること、プルリクエストの概要は /tmp にファイルとして書き出してから利用することです。
また、プルリクエストの概要を書くときにはコミットログだけで内容を判断するのではなく、差分をチェックするようにお願いしています。差分が多い場合は「いくつかピックアップして確認しますね」と言ってチェックをスキップする場合があるので、すべての変更ファイルについて差分をチェックするプロンプトにしています。
カスタムコマンドは便利!
今日は僕がCursorで使っている2つのコマンド( /commit と /create-pr )の紹介をしました。
ちなみに、Claude Codeを使うときは @commit で補完されて出てくる @.cursor/commands/commit.md を使ってコミットしたりしています。Claude Codeのカスタムコマンドとして登録してもいいかなと思いつつ、まだやっていません。
エージェントに何度もお願いしているプロンプトはコマンド化しておくと便利ですね。