在 GitHub Actions 中使用 Cursor CLI 更新文件。提供兩種方式:完全由代理自主運作,或採用僅允許代理修改檔案的確定性工作流程。
name: 更新文件

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

permissions:
  contents: write
  pull-requests: write

jobs:
  auto-docs:
    if: ${{ !startsWith(github.head_ref, 'docs/') }}
    runs-on: ubuntu-latest
    steps:
      - name: 取用儲存庫
        uses: actions/checkout@v4
        with:
          fetch-depth: 0

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

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

      - name: 更新文件
        env:
          MODEL: gpt-5
          CURSOR_API_KEY: ${{ secrets.CURSOR_API_KEY }}
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
          BRANCH_PREFIX: docs
        run: |
          cursor-agent -p "你正在 GitHub Actions runner 環境中執行。

          GitHub CLI 可透過 \`gh\` 使用,並已使用 \`GH_TOKEN\` 完成驗證。Git 可用。你對儲存庫內容具有寫入權限,且可以在拉取請求上留言,但不得建立或編輯 PR。

          # 背景:
          - Repo:${{ github.repository }}
          - Owner:${{ github.repository_owner }}
          - PR Number:${{ github.event.pull_request.number }}
          - Base Ref:${{ github.base_ref }}
          - Head Ref:${{ github.head_ref }}
          - Docs Branch Prefix:${{ env.BRANCH_PREFIX }}

          # 目標:
          - 依據原始 PR 的增量變更,實作端到端的文件更新流程。

          # 要求:
          1) 判斷原始 PR 的變更內容;若有多次推送,計算自上次成功更新文件以來的增量 diff。
          2) 僅根據這些增量變更更新相關文件。
          3) 使用背景中的文件分支前綴,維護此 PR head 對應的持續文件分支;若不存在則建立,否則更新,並推送至 origin。
          4) 你沒有建立 PR 的權限。改為張貼或更新單一則自然語言 PR 留言(1–2 句),簡要說明文件更新,並附上可快速建立 PR 的 inline compare 連結。

          # 輸入與慣例:
          - 使用 \`gh pr diff\` 與 git 歷史來偵測變更,並推導自上次文件更新以來的增量範圍。
          - 不要嘗試直接建立或編輯 PR。請使用上述的 compare 連結格式。
          - 讓變更最小化並符合儲存庫風格。若無需更新文件,則不做任何變更且不發留言。

          # 有更新時的交付項:
          - 將提交推送到此 PR head 的持續文件分支。
          - 在原始 PR 上留下一則自然語言留言,包含上述的 inline compare 連結。避免重複張貼;若已有機器人留言則更新之。
          " --force --model "$MODEL" --output-format=text