🔖

Cursor CLIを使ってBacklogのコメントからPRを提出するまでのシステム概要

に公開

はじめに

Cursorを使って開発をしているのですが、いちいちエディタを開いて課題のタスクを行うのは面倒だったので。Cursor CLIをつかって自動的にタスクをやらせないかと思い、下記のシステム概要で実装しました。

システム概要

使用技術

  • Gmail + Google Apps Script - Backlogメール監視
  • GitHub Actions - ワークフロー実行
  • Cursor CLI - AI駆動のコード生成
  • GitHub App - 認証とリポジトリ操作
  • Backlog API - 課題情報取得と通知

動作仕様

  1. 専用GmailアカウントでBacklogメールを受信(backlogに専用アカウントを作り、テキストメールを受信する設定に)
  2. GASが5分ごとに @cursorcli キーワードを含むメールをチェック
  3. GitHub APIでrepository_dispatchイベントを送信(トークンをべた書きは嫌だったのと、リポジトリ毎に作りたくなかったのでGitHub Appを利用)
  4. GitHub ActionsでCursor CLIを実行
  5. 生成されたコードをコミット&PR作成
  6. Backlog課題に完了通知

実際の使用感

PRの作成までして、コメントに記載してくれるので。AIに丸投げしている感があってよかったです。
ただ生半可な課題の記載だとトークン数をGUIでやるよりつかってそう(CLIだとインデックスがない?)なので、結構詳細にかかないといけないかも。でもそこまでしたらいちいち課題からカーソル呼ぶ必要があるのか微妙って感じです。

cliの設定でどんなふうに対応したかテキストだしてくれるので、それをgithubactionで確認できるのはよかったです。

今回の技術はcursorの利用料以外はよほど実行しなければ無料枠でいけるので
コストかけず実行できる点もよかった。


主要な躓きポイント

1. GASでのGitHub App認証

問題: Utilities.computeRsaSha256Signature で署名生成時に "Invalid argument: key" エラー

原因: GitHub Appの秘密鍵がPKCS#1形式だった

解決: OpenSSLでPKCS#8形式に変換が必要

openssl pkcs8 -topk8 -inform pem -in github-app-private-key.pem -outform pem -nocrypt -out github-app-private-key-pkcs8.pem

GASのRSA署名機能は特定の鍵形式しか受け付けないため、この変換作業が必須でした。

2. Backlogのメンション仕様

問題: コメント内の @userId 形式のメンションが通知されない

原因: Backlog APIでは <@userId> 形式が必要だと思い込んでいた

解決: メンション記法ではなく、notifiedUserId[] パラメータで通知ユーザーを指定

// ❌ これでは通知されない
content: "完了しました <@userId>"

// ⭕ パラメータで指定する
body: {
  content: "完了しました",
  'notifiedUserId[]': userId
}

メンション記法とAPI通知は別の仕組みでした。

3. Cursor CLIの非対話実行

問題: Cursor CLIが入力待ちで止まってしまう

解決: --force フラグで強制実行 + timeout コマンドで安全性確保

timeout 300 cursor-agent --force --model "claude-4-sonnet" "プロンプト"

CI/CD環境では必ず非対話モードにする必要があります。

4. Gmail APIの検索クエリ

問題: 処理済みメールの重複処理が発生

解決: Gmailラベルでの重複防止 + 適切な検索クエリ

const query = `from:backlog.com -label:BacklogToGitHub/Processed subject:"課題コメント"`;

メール検索の詳細仕様を理解するまで、同じメールを何度も処理してしまう問題がありました。

5. GitHub Actionsのタイムアウト設定

問題: Cursor AIの終了が感知できない

解決: 段階的なタイムアウト設定

  • Cursor CLI: 5分(300秒)
  • GitHub Actions job: 30分
  • ワークフロー全体: 制限なし

cursor-agentの実行が終わってるのに、次のstepに移動できませんでした。
仕方なく時間制限を設けてます。ほかの人も躓いてたみたいなので
正解がほしい

Discussion