Cursor CLIを使って国際化の翻訳キーを自動管理しよう。このワークフローはプルリクエストで新しく追加されたり変更されたi18nキーを検出して、既存の翻訳を上書きすることなく不足している翻訳を自動で補完してくれる。
name: Auto Translate Keys

on:
  pull_request:
    types: [opened, synchronize, reopened, ready_for_review]

permissions:
  contents: write
  pull-requests: write

jobs:
  i18n:
    if: ${{ !startsWith(github.head_ref, 'translate/') }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout repository
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Cursor CLI
        run: |
          curl https://cursor.com/install -fsS | bash
          echo "$HOME/.cursor/bin" >> $GITHUB_PATH

      - name: Configure git identity
        run: |
          git config user.name "Cursor Agent"
          git config user.email "cursoragent@cursor.com"

      - name: Propose i18n updates
        env:
          CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
          MODEL: gpt-5
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          BRANCH_PREFIX: translate
        run: |
          cursor-agent -p "あなたはGitHub Actionsランナー内で動作しています。

          GitHub CLIは`gh`として利用可能で、`GH_TOKEN`で認証済みです。Gitも利用できます。リポジトリのコンテンツへの書き込み権限があり、プルリクエストにコメントできますが、PRを直接作成・編集することはできません。

          # コンテキスト:
          - リポジトリ: ${{ github.repository }}
          - PR番号: ${{ github.event.pull_request.number }}
          - ヘッドRef: ${{ github.head_ref }}
          - 翻訳ブランチプレフィックス: ${{ env.BRANCH_PREFIX }}

          # 目標:
          - PRで追加・変更されたi18nキーを検出し、メッセージファイル内の不足しているロケールのみを補完する。既存の翻訳は絶対に上書きしない。

          # 要件:
          1) PR差分(ソースファイルとメッセージファイル)を調査して変更されたキーを特定する。
          2) ソース/正規ロケールを基準として、ロケールごとの不足キーを計算する。
          3) 不足しているキーのエントリのみを追加する。既存の値はすべてそのまま保持する。
          4) JSONフォーマットとスキーマを検証する。
          5) コンテキストの翻訳ブランチプレフィックスを使って、このPRヘッド用の永続的な翻訳ブランチを維持する。存在しない場合は作成し、存在する場合は更新して、変更をoriginにプッシュする。
          6) 更新内容とその理由を簡潔に説明し(1〜2文)、PRを素早く作成するためのインライン比較リンクを含む自然言語で書かれた単一のPRコメントを元のPRに投稿または更新する。
          7) 重複コメントを避ける。以前のボットコメントが存在する場合は更新する。
          8) 変更が不要な場合は、コミットもコメント投稿も行わない。

          # 入力と規約:
          - 変更を検出するために`gh pr diff`とgit履歴を使用する。

          # 更新が発生した場合の成果物:
          - このPRヘッド用の永続的な翻訳ブランチへのプッシュされたコミット。
          - 上記の比較リンクを含む元のPRへの単一の自然言語PRコメント。
          " --force --model "$MODEL" --output-format=text