| name: '🔀 Gemini Dispatch' |
| |
| on: |
| pull_request_review_comment: |
| types: |
| - 'created' |
| pull_request_review: |
| types: |
| - 'submitted' |
| pull_request: |
| types: |
| - 'opened' |
| issues: |
| types: |
| - 'opened' |
| - 'reopened' |
| issue_comment: |
| types: |
| - 'created' |
| |
| defaults: |
| run: |
| shell: 'bash' |
| |
| jobs: |
| debugger: |
| if: |- |
| ${{ fromJSON(vars.DEBUG || vars.ACTIONS_STEP_DEBUG || false) }} |
| runs-on: 'ubuntu-latest' |
| permissions: |
| contents: 'read' |
| steps: |
| - name: 'Print context for debugging' |
| env: |
| DEBUG_event_name: '${{ github.event_name }}' |
| DEBUG_event__action: '${{ github.event.action }}' |
| DEBUG_event__comment__author_association: '${{ github.event.comment.author_association }}' |
| DEBUG_event__issue__author_association: '${{ github.event.issue.author_association }}' |
| DEBUG_event__pull_request__author_association: '${{ github.event.pull_request.author_association }}' |
| DEBUG_event__review__author_association: '${{ github.event.review.author_association }}' |
| DEBUG_event: '${{ toJSON(github.event) }}' |
| run: |- |
| env | grep '^DEBUG_' |
| |
| dispatch: |
| # For PRs: only if not from a fork |
| # For comments: only if user types @gemini-cli and is OWNER/MEMBER/COLLABORATOR |
| # For issues: only on open/reopen |
| if: |- |
| ( |
| github.event_name == 'pull_request' && |
| github.event.pull_request.head.repo.fork == false |
| ) || ( |
| github.event.sender.type == 'User' && |
| startsWith(github.event.comment.body || github.event.review.body || github.event.issue.body, '@gemini-cli') && |
| contains(fromJSON('["OWNER", "MEMBER", "COLLABORATOR"]'), github.event.comment.author_association || github.event.review.author_association || github.event.issue.author_association) |
| ) || ( |
| github.event_name == 'issues' && |
| contains(fromJSON('["opened", "reopened"]'), github.event.action) |
| ) |
| runs-on: 'ubuntu-latest' |
| permissions: |
| contents: 'read' |
| issues: 'write' |
| pull-requests: 'write' |
| outputs: |
| command: '${{ steps.extract_command.outputs.command }}' |
| request: '${{ steps.extract_command.outputs.request }}' |
| additional_context: '${{ steps.extract_command.outputs.additional_context }}' |
| issue_number: '${{ github.event.pull_request.number || github.event.issue.number }}' |
| steps: |
| - name: 'Mint identity token' |
| id: 'mint_identity_token' |
| if: |- |
| ${{ vars.APP_ID }} |
| uses: 'actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b' # ratchet:actions/create-github-app-token@v2 |
| with: |
| app-id: '${{ vars.APP_ID }}' |
| private-key: '${{ secrets.APP_PRIVATE_KEY }}' |
| permission-contents: 'read' |
| permission-issues: 'write' |
| permission-pull-requests: 'write' |
| |
| - name: 'Extract command' |
| id: 'extract_command' |
| uses: 'actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea' # ratchet:actions/github-script@v7 |
| env: |
| EVENT_TYPE: '${{ github.event_name }}.${{ github.event.action }}' |
| REQUEST: '${{ github.event.comment.body || github.event.review.body || github.event.issue.body }}' |
| with: |
| script: | |
| const request = process.env.REQUEST; |
| const eventType = process.env.EVENT_TYPE |
| core.setOutput('request', request); |
| |
| if (request.startsWith("@gemini-cli /review")) { |
| core.setOutput('command', 'review'); |
| const additionalContext = request.replace(/^@gemini-cli \/review/, '').trim(); |
| core.setOutput('additional_context', additionalContext); |
| } else if (request.startsWith("@gemini-cli /triage")) { |
| core.setOutput('command', 'triage'); |
| } else if (request.startsWith("@gemini-cli")) { |
| core.setOutput('command', 'invoke'); |
| const additionalContext = request.replace(/^@gemini-cli/, '').trim(); |
| core.setOutput('additional_context', additionalContext); |
| } else if (eventType === 'pull_request.opened') { |
| core.setOutput('command', 'review'); |
| } else if (['issues.opened', 'issues.reopened'].includes(eventType)) { |
| core.setOutput('command', 'triage'); |
| } else { |
| core.setOutput('command', 'fallthrough'); |
| } |
| |
| - name: 'Acknowledge request' |
| env: |
| GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}' |
| ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}' |
| MESSAGE: |- |
| 🤖 Hi @${{ github.actor }}, I've received your request, and I'm working on it now! You can track my progress [in the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details. |
| REPOSITORY: '${{ github.repository }}' |
| run: |- |
| gh issue comment "${ISSUE_NUMBER}" \ |
| --body "${MESSAGE}" \ |
| --repo "${REPOSITORY}" |
| |
| review: |
| needs: 'dispatch' |
| if: |- |
| ${{ needs.dispatch.outputs.command == 'review' }} |
| uses: './.github/workflows/gemini-review.yml' |
| permissions: |
| contents: 'read' |
| id-token: 'write' |
| issues: 'write' |
| pull-requests: 'write' |
| with: |
| additional_context: '${{ needs.dispatch.outputs.additional_context }}' |
| secrets: 'inherit' |
| |
| triage: |
| needs: 'dispatch' |
| if: |- |
| ${{ needs.dispatch.outputs.command == 'triage' }} |
| uses: './.github/workflows/gemini-triage.yml' |
| permissions: |
| contents: 'read' |
| id-token: 'write' |
| issues: 'write' |
| pull-requests: 'write' |
| with: |
| additional_context: '${{ needs.dispatch.outputs.additional_context }}' |
| secrets: 'inherit' |
| |
| invoke: |
| needs: 'dispatch' |
| if: |- |
| ${{ needs.dispatch.outputs.command == 'invoke' }} |
| uses: './.github/workflows/gemini-invoke.yml' |
| permissions: |
| contents: 'read' |
| id-token: 'write' |
| issues: 'write' |
| pull-requests: 'write' |
| with: |
| additional_context: '${{ needs.dispatch.outputs.additional_context }}' |
| secrets: 'inherit' |
| |
| fallthrough: |
| needs: |
| - 'dispatch' |
| - 'review' |
| - 'triage' |
| - 'invoke' |
| if: |- |
| ${{ always() && !cancelled() && (failure() || needs.dispatch.outputs.command == 'fallthrough') }} |
| runs-on: 'ubuntu-latest' |
| permissions: |
| contents: 'read' |
| issues: 'write' |
| pull-requests: 'write' |
| steps: |
| - name: 'Mint identity token' |
| id: 'mint_identity_token' |
| if: |- |
| ${{ vars.APP_ID }} |
| uses: 'actions/create-github-app-token@a8d616148505b5069dccd32f177bb87d7f39123b' # ratchet:actions/create-github-app-token@v2 |
| with: |
| app-id: '${{ vars.APP_ID }}' |
| private-key: '${{ secrets.APP_PRIVATE_KEY }}' |
| permission-contents: 'read' |
| permission-issues: 'write' |
| permission-pull-requests: 'write' |
| |
| - name: 'Send failure comment' |
| env: |
| GITHUB_TOKEN: '${{ steps.mint_identity_token.outputs.token || secrets.GITHUB_TOKEN || github.token }}' |
| ISSUE_NUMBER: '${{ github.event.pull_request.number || github.event.issue.number }}' |
| MESSAGE: |- |
| 🤖 I'm sorry @${{ github.actor }}, but I was unable to process your request. Please [see the logs](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) for more details. |
| REPOSITORY: '${{ github.repository }}' |
| run: |- |
| gh issue comment "${ISSUE_NUMBER}" \ |
| --body "${MESSAGE}" \ |
| --repo "${REPOSITORY}" |