在 GitHub Actions 中使用 Cursor CLI 自动更新文档。提供两种方式:完全 AI 代理自主执行,或确定性工作流(仅由 AI 代理负责文件修改)。
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 运行环境中操作。

          GitHub CLI 可通过 `gh` 命令使用,并通过 `GH_TOKEN` 进行身份验证。Git 命令可用。你拥有仓库内容的写入权限,可以对 Pull Request 进行评论,但不能创建或编辑 PR。

          # 上下文信息:
          - 仓库:${{ github.repository }}
          - 所有者:${{ github.repository_owner }}
          - PR 编号:${{ github.event.pull_request.number }}
          - 基础分支:${{ github.base_ref }}
          - 头部分支:${{ github.head_ref }}
          - 文档分支前缀:${{ env.BRANCH_PREFIX }}

          # 目标:
          - 实现基于原始 PR 增量变更的端到端文档更新流程。

          # 要求:
          1) 确定原始 PR 中发生了哪些变更,如果有多次推送,计算自上次成功文档更新以来的增量差异。
          2) 仅根据这些增量变更更新相关文档。
          3) 使用上下文中的文档分支前缀维护此 PR 头部的持久文档分支。如果分支不存在则创建,否则更新,并将变更推送到远程仓库。
          4) 你没有创建 PR 的权限。请发布或更新一条自然语言 PR 评论(1-2 句话),简要说明文档更新内容并包含内联比较链接以便快速创建 PR

          # 输入和约定:
          - 使用 `gh pr diff` 和 git 历史记录检测变更并推导自上次文档更新以来的增量范围。
          - 不要尝试直接创建或编辑 PR。使用上述比较链接格式。
          - 保持变更最小化并与仓库代码风格保持一致。如果不需要文档更新,则不做任何变更且不发布评论。

          # 发生更新时的交付物:
          - 将提交推送到此 PR 头部的持久文档分支。
          - 在原始 PR 上发布一条自然语言 PR 评论,包含上述内联比较链接。避免发布重复内容;如果存在之前的机器人评论,则更新该评论。
          " --force --model "$MODEL" --output-format=text