# Coderabbit Rules From Pr Reviews

> Fetch and filter human review comments from recent merged PRs in a GitHub repository

- Skill: `openshift-eng/coderabbit-rules-from-pr-reviews` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add openshift-eng/coderabbit-rules-from-pr-reviews`
- Raw SKILL.md: https://api.skillmd.com/api/skills/openshift-eng/coderabbit-rules-from-pr-reviews/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: openshift-eng (https://skillmd.com/u/openshift-eng)
- Updated: 2026-09-10
- Page: https://skillmd.com/skills/openshift-eng/coderabbit-rules-from-pr-reviews

---


# CodeRabbit Rules from PR Reviews - Fetch Comments

This skill runs a Python script that fetches human review comments from recent merged PRs in a given GitHub repository. It handles all GitHub API calls, bot filtering, noise removal, rate limiting, and pagination, returning clean JSON output for AI analysis.

## When to Use This Skill

Use this skill as Step 2-3 of the `/teams:coderabbit-rules-from-pr-reviews` command to collect review comments. The script replaces manual `gh api` calls with a single Python invocation.

## Prerequisites

1. **GitHub CLI (`gh`)**: Must be installed and authenticated.
2. **Python 3**: Python 3.6 or later.

## Script Location

```
plugins/teams/skills/coderabbit-rules-from-pr-reviews/fetch_pr_comments.py
```

## Usage

```bash
# Default: 30 most recent merged PRs
python3 plugins/teams/skills/coderabbit-rules-from-pr-reviews/fetch_pr_comments.py openshift/origin

# Custom count
python3 plugins/teams/skills/coderabbit-rules-from-pr-reviews/fetch_pr_comments.py openshift/origin --count 50

# Full URL
python3 plugins/teams/skills/coderabbit-rules-from-pr-reviews/fetch_pr_comments.py https://github.com/openshift/origin
```

## What the Script Does

1. **Parses the repo argument** — accepts `owner/repo` or full GitHub URL
2. **Fetches recent merged PRs** via `gh pr list`
3. **For each PR, fetches two types of comments**:
   - Inline code review comments (`/pulls/{number}/comments`)
   - General discussion comments (`/issues/{number}/comments`)
4. **Filters out noise**:
   - Bot accounts: logins ending in `[bot]` or matching known bots (`coderabbitai`, `openshift-ci`, `openshift-bot`, `openshift-merge-robot`, `codecov`, `dependabot`, `renovate`, `k8s-ci-robot`, etc.)
   - Prow commands: comments where every line starts with `/`
   - Approvals: `/lgtm`, `/approve`, `/hold`, etc.
   - Short comments: less than 20 characters
5. **Rate limiting**: 0.5s sleep between API calls, with retry logic for rate limit errors

## Output Format

JSON to stdout, progress to stderr:

```json
{
  "repo": "openshift/origin",
  "prs_analyzed": 30,
  "total_comments": 142,
  "unique_reviewers": 18,
  "reviewers": ["alice", "bob", "carol"],
  "prs": [
    {
      "number": 29500,
      "title": "Fix flaky test in e2e suite",
      "author": "dave",
      "url": "https://github.com/openshift/origin/pull/29500",
      "merged_at": "2026-03-25T14:30:00Z"
    }
  ],
  "comments": [
    {
      "pr": 29500,
      "user": "alice",
      "body": "This error should be wrapped with fmt.Errorf to preserve context",
      "path": "pkg/cmd/server/start.go",
      "type": "review",
      "pr_title": "Fix flaky test in e2e suite",
      "pr_author": "dave"
    },
    {
      "pr": 29500,
      "user": "bob",
      "body": "We should add a unit test for this edge case",
      "path": "",
      "type": "issue",
      "pr_title": "Fix flaky test in e2e suite",
      "pr_author": "dave"
    }
  ]
}
```

### Field Descriptions

- `repo`: The normalized `owner/repo` string
- `prs_analyzed`: Number of merged PRs fetched
- `total_comments`: Number of human review comments after filtering
- `unique_reviewers`: Count of distinct human reviewers
- `reviewers`: Sorted list of reviewer logins
- `prs[].number`: PR number
- `prs[].title`: PR title
- `prs[].author`: PR author login
- `prs[].url`: PR URL
- `prs[].merged_at`: Merge timestamp
- `comments[].pr`: PR number the comment belongs to
- `comments[].user`: Reviewer login
- `comments[].body`: Full comment text
- `comments[].path`: File path (for inline review comments; empty for discussion comments)
- `comments[].type`: `"review"` for inline code comments, `"issue"` for general discussion
- `comments[].pr_title`: Title of the PR
- `comments[].pr_author`: Author of the PR

## Notes

- Uses only Python standard library (no pip dependencies)
- Diagnostic/progress messages go to stderr, JSON data to stdout
- Handles GitHub API pagination for PRs with many comments
- Retries on rate limits with exponential backoff
- Analyzing 30 PRs typically takes 1-2 minutes (~60 API calls)

