Cursor × ghコマンドで作る「爆速Issue駆動開発」
はじめに
最近、Rustで Jarvish というAIネイティブシェルを個人開発しています。
https://github.com/tominaga-h/jarvis-shell/
自然言語とコマンドをシームレスに入力できるのが気持ちいいですし、コマンドが異常終了した場合、AIが自動で原因を調査してくれるので、ぜひ cargo install jarvish で試してみてください。
このように 「ターミナル上の作業をAIで自動化する」 プロダクトを作っている自分としては、自身の開発フローもAIで効率化したいと常に考えています。
そこで今回は、Jarvishの開発過程で辿り着いた、Cursorとghコマンドを連携させた「爆速Issue駆動開発」 を紹介します。
TODO駆動開発からIssue駆動開発へ
Jarvishを開発する際に、以下のような TODO.md を使ってタスク管理していました。
# TODO
- [x] [#1] コマンド補完が欲しい
- [ ] [#2] コマンドのハイライトをしたい
- [ ] [#3] ユーザーが自然言語を入力し、Jarvisとの会話がはじまったら、プロンプトの `jarvish` を `talking` に変えるなど変化が欲しい。
- [x] [#4] OPENAI APIにアクセス中は読み込み中のインジケータを表示したい
- [x] [DELETED] ~~自然言語を入力したはずなのに何も応答がない場合があることの原因追求~~
- [ ] [#6] デバッグのために具体的なプロンプト等のログを出力する
当初はこのTODO.mdでも充分管理できていたのですが、開発が進むと「シェル機能」や「AI機能」などのように タスクを分類 したり、マイルストーンを設定 したくなってきたので、Github Issueに移行することを決めました。
Github Issueに変える上で、以下の要望がありました。
- 各タスクに番号を付けていたので、その番号を維持したままGithub Issueに登録したかった
- そのタイミングでは20件以上のタスクがあったので、手動でIssue登録は面倒だった
- 削除した(
[DELETED]が付いたもの)タスクはIssueを作成した上でクローズしたい(タスク番号を維持するために必要)
そのため、Cursorに以下のプロンプトで gh コマンドを使った自動登録をお願いしました。
@docs/TODO.md
すべてのTODOを `gh` コマンドを使ってGithub (https://github.com/tominaga-h/jarvis-shell) のIssueに登録してほしい。各タスクの番号を維持したまま、完了しているものは完了済みとして、DELETEDが付いているものはクローズした状態で登録して。
これで上記の要望をすべて叶えつつ、全タスクがGithub Issueに移行できました。めちゃくちゃ便利。
Cursor CommandでIssue駆動開発を爆速化
常にCursorで開発している自分にとって、Issueの内容をコピー→Cursorチャットにペースト→プロンプトを整え実装 という作業が面倒でした。
なので Cursorにghコマンドを使ってIssueの内容を取得→プランモードに移行して実装プランを作成→実装(承認後) してもらう /implement-issue というCursor Commandを実装しました。( .cursor/commands/ 配下に以下のようなmdファイルを作成)
# /implement-issue コマンド
ユーザーが指定した番号の GitHub Issue の内容を読み取り、その機能を実際にコードベースに実装する。
## 手順
1. `gh issue view N -R tominaga-h/jarvis-shell` を実行し、Issue の内容を取得する
2. 該当する Issue が見つからない場合、ユーザーに「指定された番号の Issue が見つかりません」と伝え、処理を停止する
3. 既にクローズ済みの場合、ユーザーに「既にクローズ済みです。再実装しますか?」と確認する
4. Issue の内容を理解し、`docs/OVERVIEW.md` を読み込んでプロジェクト全体の構成を把握する
5. 必要に応じてコードベースを調査し、関連するファイルを特定する
6. プランモードに切り替え、実装計画をユーザーに提示し、確認を得る
7. 実装を行う
8. `make check` を実行し、異常終了しないことを確認する
## 制約
- 実装前に必ずプランモードで計画を提示し、ユーザーの承認を得ること
- 既存のコードスタイル・パターンに従うこと
- 変更範囲が大きい場合は段階的に実装すること
- 実装を完了しても Issue をクローズしないこと(実装後にユーザーの希望する要件が増える可能性があるため)
## 例
ユーザー入力: `/implement-issue 13`
→ `gh issue view 13 -R tominaga-h/jarvis-shell` で Issue 内容を取得し、プランモードで実装計画を提示、承認後に実装、完了後に Issue をクローズする。
このコマンドを作ってから、Jarvishの開発は /implement-issue <Issue番号> とチャットに書くだけ になりました(コマンドによる実装後に修正や追加要件の実装などはもちろんありますが)。エージェントモードからプランモードへの移行もCursorでやってくれます。
その他のコマンド
Issueを登録するためにターミナル( gh コマンドを使うため)とチャットを行き来するのも面倒だったので、Cursorにghコマンドを使ってIssue登録・完了 をやってもらおうと思い、下記のコマンドを実装しました。
-
/add-issue- ghコマンドを利用してIssueを登録するコマンド -
/close-issue- ghコマンドを利用してIssueをクローズするコマンド
add-issue
# /add-issue コマンド
ユーザーが入力した内容を GitHub Issue として登録する。
## 手順
1. `gh issue create -R tominaga-h/jarvis-shell --title "ユーザーが入力した内容"` を実行する
2. 作成された Issue の URL を表示する
## 例
ユーザー入力: `/add-issue ヘルプコマンドを実装する`
実行コマンド:
gh issue create -R tominaga-h/jarvis-shell --title "ヘルプコマンドを実装する" --body ""
close-issue
# /close-issue コマンド
ユーザーが指定した番号の GitHub Issue をクローズする。
## 手順
1. ユーザーが指定した Issue 番号 N を受け取る
2. `gh issue close N -R tominaga-h/jarvis-shell` を実行する
3. クローズ結果を表示する
## 例
ユーザー入力: `/close-issue 13`
実行コマンド:
gh issue close 13 -R tominaga-h/jarvis-shell
おわりに
Cursor Commandは(Claude Codeなど他のCLIツールも同様ですが)自然言語でコマンドを実装できます。しかも面白いのは、このコマンドさえCursorに作らせたもの であるということです。
以下は、実際にCursorにコマンドを実装させた時のプランです。(実際は TODO.md でタスク管理していた際も同様のコマンドを作っていて、それをissueベースに移行させました)
# TODO.md 廃止 / GitHub Issues ベースの Cursor コマンドへ移行
## 対象リポジトリ
`tominaga-h/jarvis-shell`
## 変更一覧
### 1. `/add-issue` コマンド (旧 `/add-todo`)
- 旧ファイル: [.cursor/commands/add-todo.md](.cursor/commands/add-todo.md) を削除
- 新ファイル: `.cursor/commands/add-issue.md` を作成
- 内容: ユーザー入力を `gh issue create -R tominaga-h/jarvis-shell --title "内容"` で Issue 登録
- 作成後、Issue の URL を表示する
### 2. `/issues` コマンド (新規)
- 新ファイル: `.cursor/commands/issues.md` を作成
- 内容: `gh issue list -R tominaga-h/jarvis-shell` でオープン中の Issue 一覧を表示
- `--state` オプションで closed や all も指定可能にする旨を記載
### 3. `/close-issue` コマンド (旧 `/fix-todo`)
- 旧ファイル: [.cursor/commands/fix-todo.md](.cursor/commands/fix-todo.md) を削除
- 新ファイル: `.cursor/commands/close-issue.md` を作成
- 内容: ユーザー指定の Issue 番号を `gh issue close N -R tominaga-h/jarvis-shell` でクローズ
### 4. `/implement-issue` コマンド (旧 `/implement-todo`)
- 旧ファイル: [.cursor/commands/implement-todo.md](.cursor/commands/implement-todo.md) を削除
- 新ファイル: `.cursor/commands/implement-issue.md` を作成
- 内容:
- `gh issue view N -R tominaga-h/jarvis-shell` で Issue 内容を取得
- `docs/OVERVIEW.md` を読み込みプロジェクト構成を把握
- 実装計画を提示し、ユーザー承認後に実装
- 実装完了後 `gh issue close N -R tominaga-h/jarvis-shell` でクローズ
### 5. TODO.md の廃止
- [docs/TODO.md](docs/TODO.md) を削除
- 既に全項目は GitHub Issues に登録済みのため、情報の損失はない
みなさんもCursorにいろいろ作らせてみては?
最後まで読んで頂き、誠にありがとうございました。
