From 4d8c41c5d5bb70ada84c614c54ec8cd08e9340c5 Mon Sep 17 00:00:00 2001 From: kpj2006 <24ucs074@lnmiit.ac.in> Date: Thu, 12 Feb 2026 00:11:03 +0530 Subject: [PATCH] feat: add CodeRabbit label sync workflow for PR reviews --- .github/workflows/coderabbit-label-sync.yml | 139 ++++++++++++++++++++ 1 file changed, 139 insertions(+) create mode 100644 .github/workflows/coderabbit-label-sync.yml diff --git a/.github/workflows/coderabbit-label-sync.yml b/.github/workflows/coderabbit-label-sync.yml new file mode 100644 index 0000000..e052231 --- /dev/null +++ b/.github/workflows/coderabbit-label-sync.yml @@ -0,0 +1,139 @@ +name: CodeRabbit Label Sync + +on: + pull_request_target: + types: [opened, reopened, synchronize, edited] + + pull_request_review: + types: [submitted, edited, dismissed] + + pull_request_review_thread: + types: [resolved, unresolved] + +permissions: + contents: read + pull-requests: write + issues: write + +jobs: + sync-coderabbit-label: + runs-on: ubuntu-latest + name: Update CodeRabbit Review Label + steps: + - name: Check for unresolved CodeRabbit threads + id: check-threads + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = context.issue.number; + + console.log('Checking PR:', prNumber); + + // Query for review threads using GraphQL API + const query = ` + query($owner: String!, $repo: String!, $prNumber: Int!) { + repository(owner: $owner, name: $repo) { + pullRequest(number: $prNumber) { + reviewThreads(first: 100) { + nodes { + isResolved + isOutdated + comments(first: 10) { + nodes { + author { + login + } + body + } + } + } + } + } + } + } + `; + + const variables = { + owner: context.repo.owner, + repo: context.repo.repo, + prNumber: parseInt(prNumber) + }; + + const result = await github.graphql(query, variables); + const threads = result.repository.pullRequest.reviewThreads.nodes; + + console.log(`Total review threads: ${threads.length}`); + + // Filter for unresolved CodeRabbit threads + const unresolvedCodeRabbitThreads = threads.filter(thread => { + // Skip resolved or outdated threads + if (thread.isResolved || thread.isOutdated) return false; + + // Check if any comment in the thread is from CodeRabbit + const hasCodeRabbitComment = thread.comments.nodes.some(comment => + comment.author?.login === 'coderabbitai' || + comment.author?.login === 'coderabbitai[bot]' + ); + + return hasCodeRabbitComment; + }); + + console.log('Unresolved CodeRabbit threads:', unresolvedCodeRabbitThreads.length); + + core.setOutput('has-unresolved', unresolvedCodeRabbitThreads.length > 0); + core.setOutput('unresolved-count', unresolvedCodeRabbitThreads.length); + core.setOutput('pr-number', prNumber); + + - name: Update unresolved-code-rabbit-review label + uses: actions/github-script@v7 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const prNumber = parseInt('${{ steps.check-threads.outputs.pr-number }}'); + const hasUnresolved = '${{ steps.check-threads.outputs.has-unresolved }}' === 'true'; + const unresolvedCount = parseInt('${{ steps.check-threads.outputs.unresolved-count }}'); + + console.log(`PR #${prNumber}: Has unresolved threads: ${hasUnresolved} (${unresolvedCount})`); + + // Get current labels + const { data: currentLabels } = await github.rest.issues.listLabelsOnIssue({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber + }); + + const existingLabel = currentLabels.find( + label => label.name === 'unresolved-code-rabbit-review' + ); + + // Apply label if unresolved comments exist + if (hasUnresolved && !existingLabel) { + console.log('Applying unresolved-code-rabbit-review label'); + + await github.rest.issues.addLabels({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + labels: ['unresolved-code-rabbit-review'] + }); + } + + // Remove label if all comments resolved + if (!hasUnresolved && existingLabel) { + console.log('Removing unresolved-code-rabbit-review label'); + + await github.rest.issues.removeLabel({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + name: 'unresolved-code-rabbit-review' + }); + } + + if ( + (!hasUnresolved && !existingLabel) || + (hasUnresolved && existingLabel) + ) { + console.log('Label already in correct state. No changes needed.'); + }