Skip to content

Commit 8050bb2

Browse files
authored
feat: automate CodeRabbit plan for intermediate/advanced issues (#1289) (#1332)
Signed-off-by: Mounil <mounilkankhara@gmail.com>
1 parent cadae31 commit 8050bb2

File tree

3 files changed

+128
-0
lines changed

3 files changed

+128
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
// Script to trigger CodeRabbit plan for intermediate and advanced issues
2+
3+
const marker = '<!-- CodeRabbit Plan Trigger -->';
4+
5+
async function triggerCodeRabbitPlan(github, owner, repo, issue, marker) {
6+
const comment = `${marker} @coderabbitai plan`;
7+
8+
try {
9+
await github.rest.issues.createComment({
10+
owner,
11+
repo,
12+
issue_number: issue.number,
13+
body: comment,
14+
});
15+
console.log(`Triggered CodeRabbit plan for issue #${issue.number}`);
16+
return true;
17+
} catch (commentErr) {
18+
console.log(`Failed to trigger CodeRabbit plan for issue #${issue.number}:`, commentErr.message || commentErr);
19+
return false;
20+
}
21+
}
22+
23+
function hasIntermediateOrAdvancedLabel(issue, label) {
24+
// Check if issue has intermediate or advanced label (case-insensitive)
25+
const hasIntermediateLabel = issue.labels?.some(l => l?.name?.toLowerCase() === 'intermediate');
26+
const hasAdvancedLabel = issue.labels?.some(l => l?.name?.toLowerCase() === 'advanced');
27+
28+
// Also check if newly added label is intermediate/advanced
29+
const isNewLabelIntermediate = label?.name?.toLowerCase() === 'intermediate';
30+
const isNewLabelAdvanced = label?.name?.toLowerCase() === 'advanced';
31+
32+
return hasIntermediateLabel || hasAdvancedLabel || isNewLabelIntermediate || isNewLabelAdvanced;
33+
}
34+
35+
async function hasExistingCodeRabbitPlan(github, owner, repo, issueNumber) {
36+
// Check for existing CodeRabbit plan comment (limited to first 500 comments)
37+
const comments = [];
38+
const iterator = github.paginate.iterator(github.rest.issues.listComments, {
39+
owner, repo, issue_number: issueNumber, per_page: 100
40+
});
41+
42+
let count = 0;
43+
for await (const { data: page } of iterator) {
44+
comments.push(...page);
45+
count += page.length;
46+
if (count >= 500) break; // Hard upper bound to prevent unbounded pagination
47+
}
48+
49+
return comments.some(c => c.body?.includes('@coderabbitai plan'));
50+
}
51+
52+
function logSummary(owner, repo, issue) {
53+
console.log('=== Summary ===');
54+
console.log(`Repository: ${owner}/${repo}`);
55+
console.log(`Issue Number: ${issue.number}`);
56+
console.log(`Issue Title: ${issue.title || '(no title)'}`);
57+
console.log(`Labels: ${issue.labels?.map(l => l.name).join(', ') || 'none'}`);
58+
}
59+
60+
module.exports = async ({ github, context }) => {
61+
try {
62+
const { owner, repo } = context.repo;
63+
const { issue, label } = context.payload;
64+
65+
// Validations
66+
if (!issue?.number) return console.log('No issue in payload');
67+
68+
if (!hasIntermediateOrAdvancedLabel(issue, label)) {
69+
return console.log('Issue does not have intermediate or advanced label');
70+
}
71+
72+
if (await hasExistingCodeRabbitPlan(github, owner, repo, issue.number)) {
73+
return console.log(`CodeRabbit plan already triggered for #${issue.number}`);
74+
}
75+
76+
// Post CodeRabbit plan trigger
77+
await triggerCodeRabbitPlan(github, owner, repo, issue, marker);
78+
79+
logSummary(owner, repo, issue);
80+
} catch (err) {
81+
console.log('❌ Error:', err.message);
82+
}
83+
};
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
# This workflow automatically triggers CodeRabbit's plan feature for intermediate and advanced issues.
2+
name: CodeRabbit Plan Trigger
3+
on:
4+
issues:
5+
types: [opened, labeled]
6+
7+
permissions:
8+
issues: write
9+
contents: read
10+
11+
jobs:
12+
coderabbit_plan_trigger:
13+
runs-on: ubuntu-latest
14+
concurrency:
15+
group: coderabbit-plan-${{ github.event.issue.number }}
16+
cancel-in-progress: false
17+
# Only run for issues labeled with 'intermediate' or 'advanced' (case-insensitive)
18+
if: >
19+
(github.event_name == 'issues' && (
20+
contains(github.event.issue.labels.*.name, 'intermediate') ||
21+
contains(github.event.issue.labels.*.name, 'advanced') ||
22+
contains(github.event.issue.labels.*.name, 'Intermediate') ||
23+
contains(github.event.issue.labels.*.name, 'Advanced') ||
24+
(github.event.label && (github.event.label.name == 'intermediate' || github.event.label.name == 'advanced' || github.event.label.name == 'Intermediate' || github.event.label.name == 'Advanced'))
25+
))
26+
27+
steps:
28+
- name: Harden the runner
29+
uses: step-security/harden-runner@20cf305ff2072d973412fa9b1e3a4f227bda3c76 # v2.14.0
30+
with:
31+
egress-policy: audit
32+
33+
- name: Checkout repository
34+
uses: actions/checkout@8e8c483db84b4bee98b60c0593521ed34d9990e8 #v6.0.1
35+
36+
- name: Trigger CodeRabbit Plan
37+
env:
38+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
39+
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd #v8.0.0
40+
with:
41+
script: |
42+
const script = require('./.github/scripts/coderabbit_plan_trigger.js');
43+
await script({ github, context});

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ This changelog is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.
2222
- Added method chaining examples to the developer training guide (`docs/sdk_developers/training/coding_token_transactions.md`) (#1194)
2323
- Added documentation explaining how to pin GitHub Actions to specific commit SHAs (`docs/sdk_developers/how-to-pin-github-actions.md`)(#1211)
2424
- examples/mypy.ini for stricter type checking in example scripts
25+
- Formatted examples/tokens directory using black code formatter for consistent code style
26+
- Added `.github/workflows/bot-coderabbit-plan-trigger.yml` to automatically invoke CodeRabbit's plan feature on intermediate and advanced issues, providing implementation guidance to help contributors assess complexity and understand requirements. (#1289)
2527
- Added a GitHub Actions workflow that reminds contributors to link pull requests to issues.
2628
- Added `__str__` and `__repr__` methods to `AccountInfo` class for improved logging and debugging experience (#1098)
2729
- Added Good First Issue (GFI) management and frequency documentation to clarify maintainer expectations and SDK-level GFI governance.

0 commit comments

Comments
 (0)