fix: cleanup step ordering in workflows #113
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: AI Iteration | |
| on: | |
| pull_request: | |
| types: [opened, synchronize] | |
| schedule: | |
| - cron: '0 0 * * *' | |
| issue_comment: | |
| types: [created] | |
| permissions: | |
| contents: write | |
| pull-requests: write | |
| issues: read | |
| jobs: | |
| ai-iterate: | |
| if: github.event_name == 'schedule' || (github.event_name == 'pull_request' && startsWith(github.head_ref, 'ai/issue-')) || (github.event_name == 'issue_comment' && contains(github.event.comment.body, '@ai')) | |
| runs-on: windows-latest | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| with: | |
| ref: ${{ github.head_ref }} | |
| fetch-depth: 1 | |
| - name: Setup bun | |
| uses: oven-sh/setup-bun@v1 | |
| with: | |
| bun-version: latest | |
| - name: Install OpenCode and oh-my-opencode | |
| run: | | |
| bun add -g opencode-ai | |
| bunx oh-my-opencode install --no-tui --claude=no --gemini=no --copilot=no | |
| - name: Copy oh-my-opencode config | |
| env: | |
| MINIMAX_API_KEY: ${{ secrets.MINIMAX_API_KEY }} | |
| run: | | |
| mkdir %USERPROFILE%\.config\opencode | |
| # 复制并替换 opencode.json | |
| powershell -Command "$content = Get-Content '.github/workflows/opencode.json' -Raw; $content = $content -replace 'MINIMAX_API_KEY', $env:MINIMAX_API_KEY; Set-Content -Path $env:USERPROFILE\\.config\\opencode\\opencode.json -Value $content" | |
| # 复制并替换 oh-my-opencode.json | |
| powershell -Command "$content = Get-Content '.github/workflows/oh-my-opencode.json' -Raw; $content = $content -replace 'MINIMAX_API_KEY', $env:MINIMAX_API_KEY; Set-Content -Path $env:USERPROFILE\\.config\\opencode\\oh-my-opencode.json -Value $content" | |
| - name: Extract issue number | |
| id: extract | |
| run: | | |
| $branch = $env:GITHUB_HEAD_REF | |
| if ($branch -match 'ai/issue-(\d+)') { | |
| Write-Output "issue_number=$($Matches[1])" >> $env:GITHUB_OUTPUT | |
| } | |
| Write-Output "pr_number=$env:GITHUB_PR_NUMBER" >> $env:GITHUB_OUTPUT | |
| - name: Set environment variables | |
| run: | | |
| echo "ISSUE_NUM=${{ steps.extract.outputs.issue_number }}" >> $env:GITHUB_ENV | |
| echo "PR_NUMBER=${{ steps.extract.outputs.pr_number }}" >> $env:GITHUB_ENV | |
| - name: Get PR comments | |
| id: comments | |
| uses: actions/github-script@v7 | |
| with: | |
| result-encoding: string | |
| script: | | |
| const prNum = '${{ steps.extract.outputs.pr_number }}'; | |
| const { data: comments } = await github.rest.issues.listComments({ | |
| issue_number: parseInt(prNum), | |
| owner: context.repo.owner, | |
| repo: context.repo.repo | |
| }); | |
| const newComments = comments.filter(c => | |
| c.user.type !== 'Bot' && | |
| new Date(c.created_at) > new Date('${{ github.event.pull_request.updated_at || github.event.comment.created_at }}') | |
| ); | |
| return JSON.stringify(newComments.map(c => c.body)); | |
| - name: Run OpenCode for changes | |
| if: steps.comments.outputs.result != '[]' | |
| id: opencode | |
| env: | |
| MINIMAX_API_KEY: ${{ secrets.MINIMAX_API_KEY }} | |
| COMMENTS_DATA: ${{ steps.comments.outputs.result }} | |
| run: | | |
| # 创建临时 prompt 文件在 TEMP 目录 | |
| node -e "const fs=require('fs');const c=JSON.parse(process.env.COMMENTS_DATA);let p=fs.readFileSync('.github/workflows/prompts/ai-iterate-prompt.txt','utf8');p=p.replace(/{{issue_number}}/g,'$env:ISSUE_NUM').replace(/{{pr_number}}/g,'$env:PR_NUMBER').replace(/{{comments}}/g,c.join('\\n\\n'));fs.writeFileSync(process.env.TEMP + '\\\\prompt.txt',p);" | |
| # 运行 opencode | |
| opencode run "$(type %TEMP%\prompt.txt)" | |
| - name: Check changes | |
| id: changes | |
| if: steps.opencode.outputs.result != '' | |
| run: | | |
| for /f %%a in ('git status --porcelain ^| find /c /v ""') do echo changed=%%a >> %GITHUB_OUTPUT% | |
| - name: Commit and push | |
| if: steps.changes.outputs.changed > 0 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| git config user.name "AI Agent" | |
| git config user.email "ai@github.local" | |
| git add -A | |
| git commit -m "AI: Iterate based on feedback" 2>nul | |
| git push origin "ai/issue-$env:ISSUE_NUM" 2>nul | |
| - name: Post iteration report | |
| if: steps.changes.outputs.changed > 0 | |
| uses: actions/github-script@v7 | |
| with: | |
| script: | | |
| const body = "## AI Iteration Report\n\nChanges made:\n- Applied requested changes from PR comments\n- Fixed identified issues\n\nFiles modified: See commit history\nTest results: See workflow logs"; | |
| await github.rest.issues.createComment({ | |
| issue_number: parseInt('${{ steps.extract.outputs.pr_number }}'), | |
| owner: context.repo.owner, | |
| repo: context.repo.repo, | |
| body: body | |
| }); | |
| - name: Merge PR | |
| if: steps.changes.outputs.changed > 0 | |
| env: | |
| GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} | |
| run: | | |
| gh pr merge --squash --delete-branch "ai/issue-$env:ISSUE_NUM" --auto 2>nul || echo "PR merge failed or already merged" | |
| - name: Cleanup temp files | |
| if: always() | |
| run: | | |
| del /q "%TEMP%\prompt.txt" 2>nul || exit 0 | |