Initial commit
This commit is contained in:
14
.claude-plugin/plugin.json
Normal file
14
.claude-plugin/plugin.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"name": "reviewer",
|
||||
"description": "Claude Code Skill for exporting and fixing CodeRabbit AI review comments from GitHub Pull Requests. Auto-downloads PR reviews, organizes them by severity, and provides commands to systematically resolve issues.",
|
||||
"version": "1.0.0",
|
||||
"author": {
|
||||
"name": "marcio"
|
||||
},
|
||||
"skills": [
|
||||
"./skills"
|
||||
],
|
||||
"commands": [
|
||||
"./commands"
|
||||
]
|
||||
}
|
||||
3
README.md
Normal file
3
README.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# reviewer
|
||||
|
||||
Claude Code Skill for exporting and fixing CodeRabbit AI review comments from GitHub Pull Requests. Auto-downloads PR reviews, organizes them by severity, and provides commands to systematically resolve issues.
|
||||
145
commands/download-issues.md
Normal file
145
commands/download-issues.md
Normal file
@@ -0,0 +1,145 @@
|
||||
---
|
||||
description: Download CodeRabbit AI review comments for a Pull Request
|
||||
---
|
||||
|
||||
## Download PR Reviews
|
||||
|
||||
This command downloads CodeRabbit AI review comments from a GitHub Pull Request and organizes them by severity for systematic resolution.
|
||||
|
||||
**This command works from any directory** - it will save reviews to the current working directory's `.reviews/` folder.
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
# With PR number
|
||||
/reviewer:download-issues --pr 123
|
||||
|
||||
# Without PR number (auto-detects latest open PR)
|
||||
/reviewer:download-issues
|
||||
```
|
||||
|
||||
## How Claude Code Executes This
|
||||
|
||||
When you run `/reviewer:download-issues --pr 123` or `/reviewer:download-issues`, Claude Code will:
|
||||
|
||||
1. Find the installed `pr-reviewer` skill location
|
||||
2. Execute the download script from the skill directory
|
||||
3. Save output to **your current working directory** (the repo you're working on)
|
||||
|
||||
## Command
|
||||
|
||||
```bash
|
||||
# Execute from skill location, save to current working directory
|
||||
CWD=$(pwd) node ~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/run.js download <pr>
|
||||
|
||||
# Or without PR number (auto-detect latest)
|
||||
CWD=$(pwd) node ~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/run.js download
|
||||
```
|
||||
|
||||
**Note:** The exact path may vary depending on where Claude Code installs plugins. Claude will handle finding the correct path automatically.
|
||||
|
||||
## Prerequisites
|
||||
|
||||
1. **GitHub Personal Access Token**
|
||||
|
||||
The skill needs a `.env` file in its installation directory with your GitHub token:
|
||||
|
||||
```bash
|
||||
# Location: ~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/.env
|
||||
GITHUB_TOKEN=ghp_your_personal_access_token_here
|
||||
OUTPUT_DIR=./.reviews
|
||||
LOG_LEVEL=info
|
||||
PR_REVIEW_TZ=America/Sao_Paulo
|
||||
```
|
||||
|
||||
Generate token at: https://github.com/settings/tokens
|
||||
Required scopes: `repo` (full repository access)
|
||||
|
||||
2. **Dependencies**
|
||||
|
||||
Dependencies will be auto-installed on first run. To install manually:
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill
|
||||
bun install
|
||||
```
|
||||
|
||||
## Output Structure
|
||||
|
||||
The command creates a directory structure in **your repo's** `.reviews/reviews-pr-<pr>/`:
|
||||
|
||||
```
|
||||
your-repo/
|
||||
└── .reviews/ # Created in YOUR working directory
|
||||
└── reviews-pr-123/
|
||||
├── summary.md # 📊 Overview with statistics
|
||||
├── pr-review-combined.log # 📋 Full execution logs
|
||||
├── pr-review-error.log # ⚠️ Error logs only
|
||||
├── issues/ # 🔧 Resolvable issues (threads)
|
||||
│ ├── issue_001_critical_unresolved.md
|
||||
│ ├── issue_002_major_unresolved.md
|
||||
│ └── issue_003_trivial_resolved.md
|
||||
└── comments/ # 💬 General comments
|
||||
├── comment_001.md
|
||||
└── comment_002.md
|
||||
```
|
||||
|
||||
## Issue Severity Levels
|
||||
|
||||
Issues are automatically categorized by severity:
|
||||
|
||||
- **🔴 Critical**: Serious problems requiring immediate attention
|
||||
- **🟠 Major**: Important issues affecting functionality
|
||||
- **🔵 Trivial**: Minor issues and style improvements
|
||||
|
||||
## Next Steps
|
||||
|
||||
After downloading reviews:
|
||||
|
||||
1. **Review the summary**: Check `.reviews/reviews-pr-<pr>/summary.md`
|
||||
2. **Start fixing issues**: Use the `/fix` command
|
||||
3. **Track progress**: Issues are marked as resolved/unresolved
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `GITHUB_TOKEN` (required): GitHub Personal Access Token
|
||||
- `OUTPUT_DIR` (optional): Output directory relative to working dir (default: `./.reviews`)
|
||||
- `CWD` (optional): Override working directory (default: current directory)
|
||||
- `LOG_LEVEL` (optional): Logging level - `error`, `warn`, `info`, `debug` (default: `info`)
|
||||
- `PR_REVIEW_TZ` (optional): Timezone for dates (default: system timezone)
|
||||
|
||||
## Examples
|
||||
|
||||
```bash
|
||||
# Download PR #123 - saves to current directory's .reviews/
|
||||
/reviewer:download-issues --pr 123
|
||||
|
||||
# Download latest open PR (auto-detects)
|
||||
/reviewer:download-issues
|
||||
|
||||
# With debug logging
|
||||
LOG_LEVEL=debug /reviewer:download-issues --pr 123
|
||||
|
||||
# Save to custom directory
|
||||
OUTPUT_DIR=./my-reviews /reviewer:download-issues --pr 123
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
**"GITHUB_TOKEN is not set"**
|
||||
- Create `.env` file in the skill's installation directory
|
||||
- Path: `~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/.env`
|
||||
|
||||
**"No CodeRabbit AI comments found"**
|
||||
- CodeRabbit hasn't reviewed the PR yet
|
||||
- Check if PR has comments from `@coderabbitai[bot]`
|
||||
|
||||
**"Repository information could not be parsed"**
|
||||
- Verify you're in a git repository
|
||||
- Check git remote: `git remote -v`
|
||||
- Remote must be: `https://github.com/owner/repo.git`
|
||||
|
||||
## See Also
|
||||
|
||||
- `/reviewer:fix-issues` - Fix issues from a downloaded PR review
|
||||
- `/reviewer:pr-status` - Check status of PR reviews
|
||||
107
commands/fix-issues.md
Normal file
107
commands/fix-issues.md
Normal file
@@ -0,0 +1,107 @@
|
||||
---
|
||||
description: Fix issues for a given PR
|
||||
---
|
||||
|
||||
<type>--type</type>
|
||||
<pr>--pr</pr>
|
||||
<from>--from</from>
|
||||
|
||||
## Fix PR Review Issues
|
||||
|
||||
This command helps you systematically fix issues from a downloaded CodeRabbit AI review.
|
||||
|
||||
**Works from any directory** - reads issues from `.reviews/` in your current working directory.
|
||||
|
||||
## Helper Commands
|
||||
|
||||
Before starting work on fixing issues, use the `read-pr-issues.sh` script to review what needs to be addressed:
|
||||
|
||||
```bash
|
||||
# Read all issues for a PR (from your working directory's .reviews/)
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/read-pr-issues.sh --pr <pr> --type issue --all
|
||||
|
||||
# Read a specific range of issues
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/read-pr-issues.sh --pr <pr> --type issue --from <from> --to 10
|
||||
|
||||
# Read critical issues only
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/read-pr-issues.sh --pr <pr> --type critical --all
|
||||
|
||||
# Read major issues only
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/read-pr-issues.sh --pr <pr> --type major --all
|
||||
|
||||
# Read trivial issues only
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/read-pr-issues.sh --pr <pr> --type trivial --all
|
||||
```
|
||||
|
||||
**Note:** The exact path may vary. Claude Code will find the skill automatically.
|
||||
|
||||
This script displays issues in a clean, readable format with:
|
||||
|
||||
- Issue numbers and titles
|
||||
- File locations
|
||||
- Current status (resolved/unresolved)
|
||||
- Issue descriptions
|
||||
- Thread IDs for GitHub reference
|
||||
|
||||
## Critical Requirements
|
||||
|
||||
<critical>
|
||||
- **YOU NEED** to fix the <type> from <from> in the `.reviews/reviews-pr-<pr>`, and only finish when ALL THESE ISSUES are addressed;
|
||||
- This should be fixed in THE BEST WAY possible, not using workarounds;
|
||||
- **YOU MUST** follow project standards and rules from `.cursor/rules` or `.claude/CLAUDE.md`, and ensure all parameters are addressed;
|
||||
- If, in the end, you don't have all issues addressed, your work will be **INVALIDATED**;
|
||||
- After making all the changes, you need to update the progress in the `summary.md` file and all the related issue files.
|
||||
- **MUST DO:** After resolving every issue run `~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/resolve-pr-issues.sh --pr-dir .reviews/reviews-pr-<pr> --from <from> --to <end>` so the script calls `gh` to close the review threads and refreshes the summary.
|
||||
</critical>
|
||||
|
||||
## Workflow
|
||||
|
||||
1. **Read issues** to understand what needs to be fixed
|
||||
2. **Fix the code** following best practices and project standards
|
||||
3. **Mark as resolved** using the resolve script
|
||||
4. **Commit changes** with descriptive message
|
||||
|
||||
## After Finishing
|
||||
|
||||
<after_finish>
|
||||
|
||||
- **MUST COMMIT:** After fixing ALL issues in this batch and ensuring `make lint && make test` pass (or equivalent),
|
||||
commit the changes with a descriptive message that references the PR and fixed issues.
|
||||
Example: `git commit -am "fix(repo): resolve PR #<pr> issues [batch <from>-<end>]"`
|
||||
Note: Commit locally only - do NOT push. Multiple batches will be committed separately.
|
||||
</after_finish>
|
||||
|
||||
## Examples
|
||||
|
||||
```bash
|
||||
# Fix critical issues starting from issue 1
|
||||
/fix --pr 123 --type critical --from 1
|
||||
|
||||
# Fix major issues from 5 to 10
|
||||
/fix --pr 123 --type major --from 5
|
||||
|
||||
# Fix all trivial issues
|
||||
/fix --pr 123 --type trivial --from 1
|
||||
```
|
||||
|
||||
## Resolving Issues
|
||||
|
||||
After fixing issues, mark them as resolved:
|
||||
|
||||
```bash
|
||||
# Resolve issues 1-10
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/resolve-pr-issues.sh --pr-dir .reviews/reviews-pr-123 --from 1 --to 10
|
||||
|
||||
# Resolve all unresolved issues
|
||||
~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/resolve-pr-issues.sh --pr-dir .reviews/reviews-pr-123 --all
|
||||
```
|
||||
|
||||
This will:
|
||||
- Mark threads as resolved in GitHub
|
||||
- Rename files from `*_unresolved.md` to `*_resolved.md`
|
||||
- Update the summary
|
||||
|
||||
## See Also
|
||||
|
||||
- `/reviewer:download-issues` - Download PR reviews
|
||||
- `/reviewer:pr-status` - Check status of PR reviews
|
||||
82
commands/pr-status.md
Normal file
82
commands/pr-status.md
Normal file
@@ -0,0 +1,82 @@
|
||||
---
|
||||
description: Check status of PR review issues
|
||||
---
|
||||
|
||||
<pr>--pr</pr>
|
||||
|
||||
## Check PR Review Status
|
||||
|
||||
This command displays a summary of the current status of issues for a Pull Request review.
|
||||
|
||||
## Usage
|
||||
|
||||
```bash
|
||||
# View summary file for a PR
|
||||
cat .reviews/reviews-pr-<pr>/summary.md
|
||||
|
||||
# Count unresolved issues
|
||||
find .reviews/reviews-pr-<pr>/issues -name "*_unresolved.md" | wc -l
|
||||
|
||||
# Count resolved issues
|
||||
find .reviews/reviews-pr-<pr>/issues -name "*_resolved.md" | wc -l
|
||||
|
||||
# List unresolved critical issues
|
||||
ls .reviews/reviews-pr-<pr>/issues/*_critical_unresolved.md
|
||||
|
||||
# List unresolved major issues
|
||||
ls .reviews/reviews-pr-<pr>/issues/*_major_unresolved.md
|
||||
|
||||
# List unresolved trivial issues
|
||||
ls .reviews/reviews-pr-<pr>/issues/*_trivial_unresolved.md
|
||||
```
|
||||
|
||||
## Summary File
|
||||
|
||||
The `summary.md` file contains:
|
||||
|
||||
- **Total Issues**: Breakdown by severity (Critical/Major/Trivial)
|
||||
- **Resolution Status**: Resolved vs Unresolved counts
|
||||
- **Issue Links**: Direct links to each issue file
|
||||
- **File Locations**: Code locations for each issue
|
||||
|
||||
## Progress Tracking
|
||||
|
||||
The summary is automatically updated when you:
|
||||
|
||||
1. Download PR reviews (`/reviewer:download-issues`)
|
||||
2. Resolve issues using the resolve script
|
||||
|
||||
## Example Output
|
||||
|
||||
```markdown
|
||||
# PR Review #123 - CodeRabbit AI Export
|
||||
|
||||
## Summary
|
||||
|
||||
- **Issues (resolvable review comments):** 15
|
||||
- 🔴 Critical: 3
|
||||
- 🟠 Major: 7
|
||||
- 🔵 Trivial: 5
|
||||
- **Comments (simple, not resolvable):** 8
|
||||
- **Resolved issues:** 10 ✓
|
||||
- **Unresolved issues:** 5
|
||||
|
||||
**Generated on:** 2025-01-15 14:30:00 America/Sao_Paulo
|
||||
```
|
||||
|
||||
## Quick Status Check
|
||||
|
||||
Create an alias for quick status checks:
|
||||
|
||||
```bash
|
||||
# Add to your .bashrc or .zshrc
|
||||
alias pr-status='f() { cat .reviews/reviews-pr-$1/summary.md | head -20; }; f'
|
||||
|
||||
# Usage
|
||||
pr-status 123
|
||||
```
|
||||
|
||||
## See Also
|
||||
|
||||
- `/reviewer:download-issues` - Download PR reviews
|
||||
- `/reviewer:fix-issues` - Fix issues from a PR review
|
||||
85
plugin.lock.json
Normal file
85
plugin.lock.json
Normal file
@@ -0,0 +1,85 @@
|
||||
{
|
||||
"$schema": "internal://schemas/plugin.lock.v1.json",
|
||||
"pluginId": "gh:marcioaltoe/claude-craftkit:plugins/reviewer",
|
||||
"normalized": {
|
||||
"repo": null,
|
||||
"ref": "refs/tags/v20251128.0",
|
||||
"commit": "4c24d16c9543015a9e837650b08304b0685bf7ab",
|
||||
"treeHash": "c5192abb7e28d6c97deae56dbbae4ead8e357d4962bf3b0d306b953cf1b9329f",
|
||||
"generatedAt": "2025-11-28T10:27:01.481271Z",
|
||||
"toolVersion": "publish_plugins.py@0.2.0"
|
||||
},
|
||||
"origin": {
|
||||
"remote": "git@github.com:zhongweili/42plugin-data.git",
|
||||
"branch": "master",
|
||||
"commit": "aa1497ed0949fd50e99e70d6324a29c5b34f9390",
|
||||
"repoRoot": "/Users/zhongweili/projects/openmind/42plugin-data"
|
||||
},
|
||||
"manifest": {
|
||||
"name": "reviewer",
|
||||
"description": "Claude Code Skill for exporting and fixing CodeRabbit AI review comments from GitHub Pull Requests. Auto-downloads PR reviews, organizes them by severity, and provides commands to systematically resolve issues.",
|
||||
"version": "1.0.0"
|
||||
},
|
||||
"content": {
|
||||
"files": [
|
||||
{
|
||||
"path": "README.md",
|
||||
"sha256": "0f8511cd5b9b8fbac0d122299225d432929a02588c1b7231a4efc6daefe00555"
|
||||
},
|
||||
{
|
||||
"path": ".claude-plugin/plugin.json",
|
||||
"sha256": "4387bb4e6f0718e9c9db4f86d2efd919798d63664c4c4bbfd9e25eb0973409c5"
|
||||
},
|
||||
{
|
||||
"path": "commands/fix-issues.md",
|
||||
"sha256": "c34a0a6e766a1fe375784ba7f0dbdfb414a36597ba084ff95119f1372eb1ea05"
|
||||
},
|
||||
{
|
||||
"path": "commands/pr-status.md",
|
||||
"sha256": "eb48150ed0f3172bb0eb4a019a99087e8315fb48c29df9c64ea3b0c335e9ffce"
|
||||
},
|
||||
{
|
||||
"path": "commands/download-issues.md",
|
||||
"sha256": "319c9982d009b82dfb876f4a22d0c0645b143b20b575cc20fdc04efd11054d65"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/read-pr-issues.sh",
|
||||
"sha256": "624fd73901635617b4f3724f81c126ba213a7c68b69a4fb7e1bf441fc819877f"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/run.js",
|
||||
"sha256": "5fbac52066b70ee15443a12a5d251605a1471588c01894e7cf9b20b607abaec8"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/.gitignore",
|
||||
"sha256": "11e7f15002a201677c5c6da04175302ea9cbdca8bcecfef9d1bc845dbbd82c48"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/package.json",
|
||||
"sha256": "27a8e36f3e3056eaaaeac1cbb34d645180e7421d4e69680083fd57c8a3608905"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/SKILL.md",
|
||||
"sha256": "58753a849a5c5f733b00f269c0b3ed7608885b0dddaf336380d3729f6e0752a0"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/pr-review.ts",
|
||||
"sha256": "193a4c98b12562f93dceec222082983f17d7f39f996b632b382fc316ecf460d8"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/resolve-pr-issues.sh",
|
||||
"sha256": "4f5a6a28e5d8e77e0fbda3dd0049bf8841044ba5b247a7f842224a22e0293a4b"
|
||||
},
|
||||
{
|
||||
"path": "skills/pull-request-skill/.env.example",
|
||||
"sha256": "33338c740294b1b3fb317919185ab8b2649f57dc18928c4f969c1772a7e6f0b0"
|
||||
}
|
||||
],
|
||||
"dirSha256": "c5192abb7e28d6c97deae56dbbae4ead8e357d4962bf3b0d306b953cf1b9329f"
|
||||
},
|
||||
"security": {
|
||||
"scannedAt": null,
|
||||
"scannerVersion": null,
|
||||
"flags": []
|
||||
}
|
||||
}
|
||||
19
skills/pull-request-skill/.env.example
Normal file
19
skills/pull-request-skill/.env.example
Normal file
@@ -0,0 +1,19 @@
|
||||
# GitHub Personal Access Token (OBRIGATÓRIO)
|
||||
# Create a token at: https://github.com/settings/tokens
|
||||
# Required scopes: 'repo' (full control of private repositories)
|
||||
GITHUB_TOKEN=ghp_your_personal_access_token_here
|
||||
|
||||
# Diretório de saída (OPCIONAL)
|
||||
# Onde os arquivos serão salvos (relativo à raiz do projeto)
|
||||
# Padrão: ./.reviews
|
||||
OUTPUT_DIR=./.reviews
|
||||
|
||||
# Timezone para formatação de datas (OPCIONAL)
|
||||
# Padrão: timezone do sistema local
|
||||
# Exemplos: America/Sao_Paulo, Europe/London, UTC
|
||||
# PR_REVIEW_TZ=America/Sao_Paulo
|
||||
|
||||
# Nível de logging (OPCIONAL)
|
||||
# Padrão: info
|
||||
# Opções: error, warn, info, debug
|
||||
# LOG_LEVEL=debug
|
||||
19
skills/pull-request-skill/.gitignore
vendored
Normal file
19
skills/pull-request-skill/.gitignore
vendored
Normal file
@@ -0,0 +1,19 @@
|
||||
# Environment files
|
||||
.env
|
||||
.env.local
|
||||
|
||||
# Dependencies
|
||||
node_modules/
|
||||
bun.lockb
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
pr-review-combined.log
|
||||
pr-review-error.log
|
||||
|
||||
# Temporary files
|
||||
.temp-execution-*.js
|
||||
*.tmp
|
||||
|
||||
# Backup files
|
||||
*.bak
|
||||
359
skills/pull-request-skill/SKILL.md
Normal file
359
skills/pull-request-skill/SKILL.md
Normal file
@@ -0,0 +1,359 @@
|
||||
---
|
||||
name: pull-request-skill
|
||||
description: Pull Request review manager for CodeRabbit AI. **ALWAYS use when user needs to work with PR reviews, fix CodeRabbit issues, or check review status.** Downloads, organizes, and helps resolve review comments systematically. Examples - "download PR reviews", "fix CodeRabbit issues for PR 123", "check review status", "organize review comments by severity".
|
||||
---
|
||||
|
||||
You are an expert Pull Request Review Manager specializing in working with CodeRabbit AI review comments from GitHub Pull Requests.
|
||||
|
||||
## When to Engage
|
||||
|
||||
You should proactively assist when:
|
||||
|
||||
- User mentions working with CodeRabbit reviews
|
||||
- User wants to download PR review comments
|
||||
- User needs to fix issues from a PR review
|
||||
- User asks about PR review status
|
||||
- User mentions CodeRabbit, PR reviews, or review comments
|
||||
- User wants to organize or prioritize review feedback
|
||||
- User needs to resolve review threads
|
||||
|
||||
**Trigger Keywords**: coderabbit, pr review, pull request review, review comments, fix issues, download reviews, pr status
|
||||
|
||||
## Your Role
|
||||
|
||||
As a Pull Request Review Manager, you:
|
||||
|
||||
1. **Download** - Fetch CodeRabbit AI review comments from GitHub PRs
|
||||
2. **Organize** - Categorize issues by severity (critical, major, trivial)
|
||||
3. **Track** - Monitor issue resolution status
|
||||
4. **Guide** - Help users systematically resolve review feedback
|
||||
5. **Report** - Provide clear summaries of review status
|
||||
|
||||
## Available Commands
|
||||
|
||||
The reviewer plugin provides three slash commands:
|
||||
|
||||
1. `/reviewer:download-issues --pr <number>` - Download CodeRabbit reviews
|
||||
2. `/reviewer:fix-issues --pr <number>` - Fix issues from a PR review
|
||||
3. `/reviewer:pr-status --pr <number>` - Check review status
|
||||
|
||||
**Note**: PR number is optional - if not provided, the latest open PR is used.
|
||||
|
||||
## Workflow
|
||||
|
||||
### 1. Download Reviews
|
||||
|
||||
```bash
|
||||
# Download reviews for PR #123
|
||||
/reviewer:download-issues --pr 123
|
||||
|
||||
# Download latest open PR
|
||||
/reviewer:download-issues
|
||||
```
|
||||
|
||||
**What happens:**
|
||||
|
||||
- Fetches all CodeRabbit AI comments from the PR
|
||||
- Organizes them into issues (review threads) and comments
|
||||
- Categorizes by severity: 🔴 Critical, 🟠 Major, 🔵 Trivial
|
||||
- Saves to `.reviews/reviews-pr-<number>/` in the working directory
|
||||
- Generates a summary report
|
||||
|
||||
**Output Structure:**
|
||||
|
||||
```
|
||||
.reviews/reviews-pr-123/
|
||||
├── summary.md # 📊 Overview with statistics
|
||||
├── pr-review-combined.log # 📋 Full execution logs
|
||||
├── pr-review-error.log # ⚠️ Error logs only
|
||||
├── issues/ # 🔧 Resolvable issues (threads)
|
||||
│ ├── issue_001_critical_unresolved.md
|
||||
│ ├── issue_002_major_unresolved.md
|
||||
│ └── issue_003_trivial_resolved.md
|
||||
└── comments/ # 💬 General comments
|
||||
├── comment_001.md
|
||||
└── comment_002.md
|
||||
```
|
||||
|
||||
### 2. Review Summary
|
||||
|
||||
After downloading, **always** read and show the user:
|
||||
|
||||
```bash
|
||||
# Read the summary
|
||||
cat .reviews/reviews-pr-<number>/summary.md
|
||||
```
|
||||
|
||||
The summary includes:
|
||||
|
||||
- Total issues by severity
|
||||
- Resolved vs unresolved count
|
||||
- Issue list with file paths and descriptions
|
||||
- Quick overview for prioritization
|
||||
|
||||
### 3. Fix Issues
|
||||
|
||||
Help users systematically resolve issues:
|
||||
|
||||
```bash
|
||||
# Fix issues from PR #123
|
||||
/reviewer:fix-issues --pr 123
|
||||
```
|
||||
|
||||
**Your role when fixing:**
|
||||
|
||||
1. Read the issue file to understand the problem
|
||||
2. Locate the relevant code file
|
||||
3. Analyze the CodeRabbit suggestion
|
||||
4. Implement the fix following best practices
|
||||
5. Mark the issue as resolved
|
||||
6. Move to the next issue
|
||||
|
||||
**Priority order:**
|
||||
|
||||
1. 🔴 Critical issues first
|
||||
2. 🟠 Major issues next
|
||||
3. 🔵 Trivial issues last
|
||||
|
||||
### 4. Check Status
|
||||
|
||||
Monitor progress on review resolution:
|
||||
|
||||
```bash
|
||||
# Check status of PR #123
|
||||
/reviewer:pr-status --pr 123
|
||||
```
|
||||
|
||||
Shows:
|
||||
|
||||
- Total issues vs resolved
|
||||
- Remaining critical/major/trivial issues
|
||||
- Progress percentage
|
||||
- Next recommended actions
|
||||
|
||||
## Prerequisites
|
||||
|
||||
### GitHub Token Setup
|
||||
|
||||
The skill requires a `.env` file in its installation directory:
|
||||
|
||||
```bash
|
||||
# Location: ~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/.env
|
||||
GITHUB_TOKEN=ghp_your_personal_access_token_here
|
||||
OUTPUT_DIR=./.reviews
|
||||
LOG_LEVEL=info
|
||||
PR_REVIEW_TZ=America/Sao_Paulo
|
||||
```
|
||||
|
||||
**If the token is not set:**
|
||||
|
||||
1. Guide user to create `.env` file in skill directory
|
||||
2. Help them generate token at: https://github.com/settings/tokens
|
||||
3. Required scopes: `repo` (full repository access)
|
||||
|
||||
### Dependencies
|
||||
|
||||
Dependencies are auto-installed on first run. The skill uses:
|
||||
|
||||
- `@octokit/rest` - GitHub API client
|
||||
- `@octokit/graphql` - GraphQL API
|
||||
- `winston` - Logging
|
||||
- `zod` - Validation
|
||||
- `dotenv` - Environment variables
|
||||
|
||||
## Issue Severity Levels
|
||||
|
||||
Issues are automatically categorized:
|
||||
|
||||
- **🔴 Critical**: Security issues, bugs, breaking changes
|
||||
|
||||
- **Action**: Fix immediately
|
||||
- **Examples**: Memory leaks, security vulnerabilities, data corruption
|
||||
|
||||
- **🟠 Major**: Important issues affecting functionality
|
||||
|
||||
- **Action**: Fix before merging
|
||||
- **Examples**: Logic errors, performance issues, incorrect behavior
|
||||
|
||||
- **🔵 Trivial**: Minor issues and style improvements
|
||||
- **Action**: Fix when convenient
|
||||
- **Examples**: Code style, formatting, minor optimizations
|
||||
|
||||
## Best Practices
|
||||
|
||||
### When Downloading Reviews
|
||||
|
||||
1. **Always show summary first**
|
||||
|
||||
```bash
|
||||
/reviewer:download-issues --pr 123
|
||||
# Then immediately:
|
||||
cat .reviews/reviews-pr-123/summary.md
|
||||
```
|
||||
|
||||
2. **Verify repository context**
|
||||
|
||||
- Ensure you're in the correct repository
|
||||
- Check git remote: `git remote -v`
|
||||
|
||||
3. **Handle errors gracefully**
|
||||
- Check for `.env` file if token error
|
||||
- Verify PR exists and has CodeRabbit comments
|
||||
- Check logs if issues occur: `pr-review-error.log`
|
||||
|
||||
### When Fixing Issues
|
||||
|
||||
1. **Work systematically**
|
||||
|
||||
- Start with critical issues
|
||||
- Fix one issue at a time
|
||||
- Test after each fix
|
||||
|
||||
2. **Read the full issue**
|
||||
|
||||
- Understand CodeRabbit's reasoning
|
||||
- Check the suggested code change
|
||||
- Consider the context and impact
|
||||
|
||||
3. **Follow project standards**
|
||||
|
||||
- Use project's code style
|
||||
- Run linters/formatters after changes
|
||||
- Ensure tests pass
|
||||
|
||||
4. **Mark issues as resolved**
|
||||
- Rename file: `issue_001_critical_unresolved.md` → `issue_001_critical_resolved.md`
|
||||
- Or move to `resolved/` subfolder
|
||||
|
||||
### When Reporting Status
|
||||
|
||||
1. **Provide clear summary**
|
||||
|
||||
- Total issues vs resolved
|
||||
- Breakdown by severity
|
||||
- Estimated remaining work
|
||||
|
||||
2. **Recommend next actions**
|
||||
- Prioritize critical issues
|
||||
- Suggest grouping similar issues
|
||||
- Identify quick wins
|
||||
|
||||
## Environment Variables
|
||||
|
||||
- `GITHUB_TOKEN` (required): GitHub Personal Access Token
|
||||
- `OUTPUT_DIR` (optional): Output directory relative to working dir (default: `./.reviews`)
|
||||
- `CWD` (optional): Override working directory (default: current directory)
|
||||
- `LOG_LEVEL` (optional): Logging level - `error`, `warn`, `info`, `debug` (default: `info`)
|
||||
- `PR_REVIEW_TZ` (optional): Timezone for dates (default: system timezone)
|
||||
|
||||
## Common Scenarios
|
||||
|
||||
### Scenario 1: User wants to work on PR feedback
|
||||
|
||||
**User**: "I got CodeRabbit feedback on my PR, help me fix it"
|
||||
|
||||
**Your actions**:
|
||||
|
||||
1. Ask for PR number (or auto-detect)
|
||||
2. Run `/reviewer:download-issues --pr <number>`
|
||||
3. Show the summary
|
||||
4. Ask which severity level to start with
|
||||
5. Begin fixing issues systematically
|
||||
|
||||
### Scenario 2: User wants to see what needs fixing
|
||||
|
||||
**User**: "What issues are left on PR 123?"
|
||||
|
||||
**Your actions**:
|
||||
|
||||
1. Run `/reviewer:pr-status --pr 123`
|
||||
2. Show breakdown by severity
|
||||
3. Recommend starting with critical issues
|
||||
4. Offer to begin fixing
|
||||
|
||||
### Scenario 3: User completed some fixes
|
||||
|
||||
**User**: "I fixed the critical issues, what's next?"
|
||||
|
||||
**Your actions**:
|
||||
|
||||
1. Run `/reviewer:pr-status --pr 123`
|
||||
2. Verify critical issues are resolved
|
||||
3. Show remaining major issues
|
||||
4. Offer to continue with major issues
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### "GITHUB_TOKEN is not set"
|
||||
|
||||
**Solution**:
|
||||
|
||||
1. Create `.env` file: `~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill/.env`
|
||||
2. Add: `GITHUB_TOKEN=ghp_...`
|
||||
3. Generate token at: https://github.com/settings/tokens
|
||||
|
||||
### "No CodeRabbit AI comments found"
|
||||
|
||||
**Causes**:
|
||||
|
||||
- CodeRabbit hasn't reviewed the PR yet
|
||||
- PR doesn't have comments from `@coderabbitai[bot]`
|
||||
- Wrong PR number
|
||||
|
||||
**Solution**: Verify PR has CodeRabbit comments on GitHub
|
||||
|
||||
### "Repository information could not be parsed"
|
||||
|
||||
**Causes**:
|
||||
|
||||
- Not in a git repository
|
||||
- No remote configured
|
||||
- Remote URL format incorrect
|
||||
|
||||
**Solution**:
|
||||
|
||||
1. Check: `git remote -v`
|
||||
2. Remote must be: `https://github.com/owner/repo.git`
|
||||
|
||||
### "Dependencies not found"
|
||||
|
||||
**Solution**:
|
||||
|
||||
```bash
|
||||
cd ~/.claude/plugins/marketplaces/claude-craftkit/plugins/reviewer/skills/pull-request-skill
|
||||
bun install
|
||||
```
|
||||
|
||||
## Integration with Development Workflow
|
||||
|
||||
This skill works best when integrated with other tools:
|
||||
|
||||
1. **After PR creation** → Download reviews
|
||||
2. **While fixing** → Use `/quality:check` to verify changes
|
||||
3. **After fixes** → Use `/git:commit` for conventional commits
|
||||
4. **Before merge** → Use `/reviewer:pr-status` to verify all issues resolved
|
||||
|
||||
## Remember
|
||||
|
||||
- **Always download first** - Get fresh reviews before working
|
||||
- **Prioritize by severity** - Critical → Major → Trivial
|
||||
- **One issue at a time** - Focus on quality over speed
|
||||
- **Test after changes** - Ensure fixes don't break anything
|
||||
- **Track progress** - Use status command to monitor completion
|
||||
- **Communicate clearly** - Show summaries and next steps to users
|
||||
|
||||
## Success Criteria
|
||||
|
||||
A successful review resolution workflow:
|
||||
|
||||
✅ **Downloads** reviews successfully with clear summary
|
||||
✅ **Prioritizes** issues by severity (critical first)
|
||||
✅ **Fixes** issues systematically with proper testing
|
||||
✅ **Tracks** progress with status updates
|
||||
✅ **Completes** all critical and major issues before merge
|
||||
✅ **Maintains** code quality and project standards
|
||||
✅ **Communicates** progress clearly to the user
|
||||
|
||||
---
|
||||
|
||||
**You are the Pull Request Review Manager. When users need to work with CodeRabbit reviews, use this skill to guide them through the process systematically.**
|
||||
35
skills/pull-request-skill/package.json
Normal file
35
skills/pull-request-skill/package.json
Normal file
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"name": "pull-request-skill",
|
||||
"version": "1.0.0",
|
||||
"description": "Pull Request review exporter and issue resolver for CodeRabbit AI comments",
|
||||
"author": "marcio",
|
||||
"main": "run.js",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"setup": "bun install",
|
||||
"download": "bun run pr-review.ts",
|
||||
"download-pr": "bun run pr-review.ts"
|
||||
},
|
||||
"keywords": [
|
||||
"pull-request",
|
||||
"code-review",
|
||||
"coderabbit",
|
||||
"github",
|
||||
"claude-skill"
|
||||
],
|
||||
"dependencies": {
|
||||
"@octokit/graphql": "^9.0.2",
|
||||
"@octokit/plugin-retry": "^8.0.2",
|
||||
"@octokit/plugin-throttling": "^11.0.2",
|
||||
"@octokit/rest": "^22.0.0",
|
||||
"@octokit/types": "^15.0.1",
|
||||
"@types/node": "^24.9.1",
|
||||
"dotenv": "^17.2.3",
|
||||
"winston": "^3.18.3",
|
||||
"zod": "^4.1.12"
|
||||
},
|
||||
"engines": {
|
||||
"bun": ">=1.0.0"
|
||||
},
|
||||
"license": "MIT"
|
||||
}
|
||||
1101
skills/pull-request-skill/pr-review.ts
Normal file
1101
skills/pull-request-skill/pr-review.ts
Normal file
File diff suppressed because it is too large
Load Diff
139
skills/pull-request-skill/read-pr-issues.sh
Executable file
139
skills/pull-request-skill/read-pr-issues.sh
Executable file
@@ -0,0 +1,139 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Read PR Issues Script
|
||||
# Displays issues from the PR review export in a clean, readable format
|
||||
#
|
||||
# Usage:
|
||||
# ./read-pr-issues.sh --pr 277 --type issue --all
|
||||
# ./read-pr-issues.sh --pr 277 --type issue --from 1 --to 10
|
||||
# ./read-pr-issues.sh --pr 277 --type critical --all
|
||||
# ./read-pr-issues.sh --pr 277 --type major --all
|
||||
# ./read-pr-issues.sh --pr 277 --type trivial --all
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Default values
|
||||
PR=""
|
||||
TYPE="issue"
|
||||
FROM=""
|
||||
TO=""
|
||||
ALL=false
|
||||
# Use CWD if provided (for when called from skill location), otherwise use current directory
|
||||
WORKING_DIR="${CWD:-$(pwd)}"
|
||||
BASE_DIR="${OUTPUT_DIR:-./.reviews}"
|
||||
# Resolve BASE_DIR relative to WORKING_DIR if it's not absolute
|
||||
if [[ ! "$BASE_DIR" = /* ]]; then
|
||||
BASE_DIR="${WORKING_DIR}/${BASE_DIR}"
|
||||
fi
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--pr)
|
||||
PR="$2"
|
||||
shift 2
|
||||
;;
|
||||
--type)
|
||||
TYPE="$2"
|
||||
shift 2
|
||||
;;
|
||||
--from)
|
||||
FROM="$2"
|
||||
shift 2
|
||||
;;
|
||||
--to)
|
||||
TO="$2"
|
||||
shift 2
|
||||
;;
|
||||
--all)
|
||||
ALL=true
|
||||
shift
|
||||
;;
|
||||
--base-dir)
|
||||
BASE_DIR="$2"
|
||||
shift 2
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
echo "Usage: $0 --pr PR_NUMBER --type TYPE [--from N --to M | --all] [--base-dir DIR]"
|
||||
echo "Types: issue, critical, major, trivial"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate PR number
|
||||
if [[ -z "$PR" ]]; then
|
||||
echo "❌ Error: --pr is required"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Set PR directory
|
||||
PR_DIR="${BASE_DIR}/reviews-pr-${PR}"
|
||||
|
||||
if [[ ! -d "$PR_DIR" ]]; then
|
||||
echo "❌ Error: PR directory not found: $PR_DIR"
|
||||
echo "Have you run the download command first?"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "📂 Reading issues from: $PR_DIR"
|
||||
echo ""
|
||||
|
||||
# Determine which files to read based on type
|
||||
case "$TYPE" in
|
||||
critical|major|trivial)
|
||||
PATTERN="*_${TYPE}_*.md"
|
||||
DIR="${PR_DIR}/issues"
|
||||
;;
|
||||
issue)
|
||||
PATTERN="issue_*.md"
|
||||
DIR="${PR_DIR}/issues"
|
||||
;;
|
||||
*)
|
||||
echo "❌ Error: Unknown type: $TYPE"
|
||||
echo "Valid types: issue, critical, major, trivial"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
|
||||
# Find matching files
|
||||
if [[ "$ALL" == true ]]; then
|
||||
FILES=($(find "$DIR" -name "$PATTERN" -type f | sort))
|
||||
else
|
||||
if [[ -z "$FROM" ]] || [[ -z "$TO" ]]; then
|
||||
echo "❌ Error: Either use --all or specify both --from and --to"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILES=()
|
||||
for i in $(seq "$FROM" "$TO"); do
|
||||
ISSUE_NUM=$(printf "%03d" "$i")
|
||||
MATCHES=($(find "$DIR" -name "issue_${ISSUE_NUM}_*.md" -type f))
|
||||
if [[ ${#MATCHES[@]} -gt 0 ]]; then
|
||||
FILES+=("${MATCHES[0]}")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ${#FILES[@]} -eq 0 ]]; then
|
||||
echo "⚠️ No issues found matching criteria"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found ${#FILES[@]} issue(s)"
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
|
||||
# Display each file
|
||||
for file in "${FILES[@]}"; do
|
||||
filename=$(basename "$file")
|
||||
echo "📄 $filename"
|
||||
echo ""
|
||||
cat "$file"
|
||||
echo ""
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo ""
|
||||
done
|
||||
|
||||
echo "✅ Displayed ${#FILES[@]} issue(s)"
|
||||
179
skills/pull-request-skill/resolve-pr-issues.sh
Executable file
179
skills/pull-request-skill/resolve-pr-issues.sh
Executable file
@@ -0,0 +1,179 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
# Resolve PR Issues Script
|
||||
# Marks review threads as resolved using GitHub CLI and updates the summary
|
||||
#
|
||||
# Usage:
|
||||
# ./resolve-pr-issues.sh --pr-dir ./ai-docs/reviews-pr-277 --from 1 --to 10
|
||||
# ./resolve-pr-issues.sh --pr-dir ./ai-docs/reviews-pr-277 --all
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
# Default values
|
||||
PR_DIR=""
|
||||
FROM=""
|
||||
TO=""
|
||||
ALL=false
|
||||
# Use CWD if provided (for when called from skill location), otherwise use current directory
|
||||
WORKING_DIR="${CWD:-$(pwd)}"
|
||||
|
||||
# Parse arguments
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--pr-dir)
|
||||
PR_DIR="$2"
|
||||
shift 2
|
||||
;;
|
||||
--from)
|
||||
FROM="$2"
|
||||
shift 2
|
||||
;;
|
||||
--to)
|
||||
TO="$2"
|
||||
shift 2
|
||||
;;
|
||||
--all)
|
||||
ALL=true
|
||||
shift
|
||||
;;
|
||||
*)
|
||||
echo "Unknown option: $1"
|
||||
echo "Usage: $0 --pr-dir PR_DIR [--from N --to M | --all]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Validate PR directory
|
||||
if [[ -z "$PR_DIR" ]]; then
|
||||
echo "❌ Error: --pr-dir is required"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Resolve PR_DIR relative to WORKING_DIR if it's not absolute
|
||||
if [[ ! "$PR_DIR" = /* ]]; then
|
||||
PR_DIR="${WORKING_DIR}/${PR_DIR}"
|
||||
fi
|
||||
|
||||
if [[ ! -d "$PR_DIR" ]]; then
|
||||
echo "❌ Error: PR directory not found: $PR_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
ISSUES_DIR="${PR_DIR}/issues"
|
||||
|
||||
if [[ ! -d "$ISSUES_DIR" ]]; then
|
||||
echo "❌ Error: Issues directory not found: $ISSUES_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# Check if gh is installed
|
||||
if ! command -v gh &> /dev/null; then
|
||||
echo "❌ Error: GitHub CLI (gh) is not installed"
|
||||
echo "Install from: https://cli.github.com"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "🔧 Resolving issues in: $PR_DIR"
|
||||
echo ""
|
||||
|
||||
# Find unresolved issue files
|
||||
if [[ "$ALL" == true ]]; then
|
||||
FILES=($(find "$ISSUES_DIR" -name "issue_*_unresolved.md" -type f | sort))
|
||||
else
|
||||
if [[ -z "$FROM" ]] || [[ -z "$TO" ]]; then
|
||||
echo "❌ Error: Either use --all or specify both --from and --to"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
FILES=()
|
||||
for i in $(seq "$FROM" "$TO"); do
|
||||
ISSUE_NUM=$(printf "%03d" "$i")
|
||||
MATCHES=($(find "$ISSUES_DIR" -name "issue_${ISSUE_NUM}_*_unresolved.md" -type f))
|
||||
if [[ ${#MATCHES[@]} -gt 0 ]]; then
|
||||
FILES+=("${MATCHES[@]}")
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
if [[ ${#FILES[@]} -eq 0 ]]; then
|
||||
echo "✅ No unresolved issues found in specified range"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
echo "Found ${#FILES[@]} unresolved issue(s) to process"
|
||||
echo ""
|
||||
|
||||
RESOLVED_COUNT=0
|
||||
FAILED_COUNT=0
|
||||
|
||||
# Process each file
|
||||
for file in "${FILES[@]}"; do
|
||||
filename=$(basename "$file")
|
||||
|
||||
# Extract thread ID from file
|
||||
THREAD_ID=$(grep -m1 "^- Thread ID:" "$file" | sed 's/^- Thread ID: `\(.*\)`$/\1/' || echo "")
|
||||
|
||||
if [[ -z "$THREAD_ID" ]] || [[ "$THREAD_ID" == "(not found)" ]]; then
|
||||
echo "⚠️ Skipping $filename - no thread ID found"
|
||||
((FAILED_COUNT++))
|
||||
continue
|
||||
fi
|
||||
|
||||
echo "Processing: $filename"
|
||||
echo " Thread ID: $THREAD_ID"
|
||||
|
||||
# Resolve the thread using GitHub CLI
|
||||
if gh api graphql \
|
||||
-f query='mutation($threadId: ID!) { resolveReviewThread(input: { threadId: $threadId }) { thread { isResolved } } }' \
|
||||
-F threadId="$THREAD_ID" &> /dev/null; then
|
||||
|
||||
echo " ✅ Resolved successfully"
|
||||
|
||||
# Rename file from unresolved to resolved
|
||||
NEW_FILE="${file/_unresolved.md/_resolved.md}"
|
||||
mv "$file" "$NEW_FILE"
|
||||
|
||||
# Update status in file
|
||||
sed -i.bak 's/- \[ \] UNRESOLVED/- [x] RESOLVED ✓/g' "$NEW_FILE"
|
||||
sed -i.bak 's/UNRESOLVED/RESOLVED/g' "$NEW_FILE"
|
||||
rm -f "${NEW_FILE}.bak"
|
||||
|
||||
((RESOLVED_COUNT++))
|
||||
else
|
||||
echo " ❌ Failed to resolve"
|
||||
((FAILED_COUNT++))
|
||||
fi
|
||||
|
||||
echo ""
|
||||
done
|
||||
|
||||
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
|
||||
echo "Summary:"
|
||||
echo " ✅ Resolved: $RESOLVED_COUNT"
|
||||
echo " ❌ Failed: $FAILED_COUNT"
|
||||
echo " 📊 Total processed: ${#FILES[@]}"
|
||||
echo ""
|
||||
|
||||
if [[ $RESOLVED_COUNT -gt 0 ]]; then
|
||||
echo "🔄 Re-running PR review export to update summary..."
|
||||
|
||||
# Extract PR number from directory name
|
||||
PR_NUM=$(basename "$PR_DIR" | sed 's/reviews-pr-//')
|
||||
|
||||
# Re-run the export script to update summary
|
||||
if command -v bun &> /dev/null; then
|
||||
SCRIPT_DIR="$(dirname "$0")"
|
||||
if CWD="$WORKING_DIR" bun run "$SCRIPT_DIR/pr-review.ts" "$PR_NUM"; then
|
||||
echo "✅ Summary updated successfully"
|
||||
else
|
||||
echo "⚠️ Warning: Failed to update summary, but issues were resolved"
|
||||
fi
|
||||
else
|
||||
echo "⚠️ Warning: Bun not found, summary not updated automatically"
|
||||
echo "Run manually: CWD=$(pwd) bun run <skill-path>/pr-review.ts $PR_NUM"
|
||||
fi
|
||||
fi
|
||||
|
||||
echo ""
|
||||
echo "✅ Done!"
|
||||
173
skills/pull-request-skill/run.js
Executable file
173
skills/pull-request-skill/run.js
Executable file
@@ -0,0 +1,173 @@
|
||||
#!/usr/bin/env node
|
||||
/**
|
||||
* Universal Pull Request Review Exporter for Claude Code
|
||||
*
|
||||
* Executes the PR review export script with Bun:
|
||||
* - Download PR reviews: node run.js download [PR_NUMBER]
|
||||
* - Help: node run.js --help
|
||||
*
|
||||
* Ensures proper module resolution and dependency installation.
|
||||
*/
|
||||
|
||||
import { execSync, spawn } from 'node:child_process';
|
||||
import { existsSync } from 'node:fs';
|
||||
import { dirname, join } from 'node:path';
|
||||
import { fileURLToPath } from 'node:url';
|
||||
|
||||
const __filename = fileURLToPath(import.meta.url);
|
||||
const __dirname = dirname(__filename);
|
||||
|
||||
// Change to skill directory for proper module resolution
|
||||
process.chdir(__dirname);
|
||||
|
||||
/**
|
||||
* Check if Bun is installed
|
||||
*/
|
||||
function checkBunInstalled() {
|
||||
try {
|
||||
execSync('bun --version', { stdio: 'pipe' });
|
||||
return true;
|
||||
} catch (e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if dependencies are installed
|
||||
*/
|
||||
function checkDependenciesInstalled() {
|
||||
return existsSync(join(__dirname, 'node_modules'));
|
||||
}
|
||||
|
||||
/**
|
||||
* Install dependencies using Bun
|
||||
*/
|
||||
function installDependencies() {
|
||||
console.log('📦 Dependencies not found. Installing...');
|
||||
try {
|
||||
execSync('bun install', { stdio: 'inherit', cwd: __dirname });
|
||||
console.log('✅ Dependencies installed successfully');
|
||||
return true;
|
||||
} catch (e) {
|
||||
console.error('❌ Failed to install dependencies:', e.message);
|
||||
console.error('Please run manually: cd', __dirname, '&& bun install');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show help message
|
||||
*/
|
||||
function showHelp() {
|
||||
console.log(`
|
||||
Pull Request Review Exporter - Claude Code Skill
|
||||
|
||||
USAGE:
|
||||
node run.js download [PR_NUMBER] Download CodeRabbit comments for a PR
|
||||
node run.js download Download comments for latest open PR
|
||||
node run.js --help Show this help message
|
||||
|
||||
EXAMPLES:
|
||||
node run.js download 123 Download PR #123 reviews
|
||||
node run.js download Download latest open PR reviews
|
||||
|
||||
# From any directory (saves to that directory's .reviews/)
|
||||
CWD=/path/to/repo node run.js download 123
|
||||
|
||||
ENVIRONMENT VARIABLES:
|
||||
GITHUB_TOKEN GitHub Personal Access Token (required)
|
||||
OUTPUT_DIR Output directory for reviews (default: ./.reviews)
|
||||
CWD Working directory to save reviews (default: current directory)
|
||||
LOG_LEVEL Logging level: error, warn, info, debug (default: info)
|
||||
PR_REVIEW_TZ Timezone for dates (default: system timezone)
|
||||
|
||||
SETUP:
|
||||
1. Create .env file in skill directory:
|
||||
echo "GITHUB_TOKEN=ghp_your_token_here" > .env
|
||||
|
||||
2. Optionally configure output directory and logging:
|
||||
echo "OUTPUT_DIR=./my-reviews" >> .env
|
||||
echo "LOG_LEVEL=debug" >> .env
|
||||
|
||||
For more information, see README.md
|
||||
`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the PR review export script
|
||||
*/
|
||||
function runPRReviewScript(args) {
|
||||
const scriptPath = join(__dirname, 'pr-review.ts');
|
||||
|
||||
if (!existsSync(scriptPath)) {
|
||||
console.error('❌ Error: pr-review.ts not found in skill directory');
|
||||
console.error('Expected at:', scriptPath);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log('🚀 Starting PR Review Exporter...\n');
|
||||
|
||||
// Use spawn to stream output in real-time
|
||||
const bunProcess = spawn('bun', ['run', scriptPath, ...args], {
|
||||
cwd: __dirname,
|
||||
stdio: 'inherit',
|
||||
env: { ...process.env }
|
||||
});
|
||||
|
||||
bunProcess.on('error', (error) => {
|
||||
console.error('❌ Failed to start Bun process:', error.message);
|
||||
process.exit(1);
|
||||
});
|
||||
|
||||
bunProcess.on('exit', (code) => {
|
||||
process.exit(code || 0);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Main execution
|
||||
*/
|
||||
async function main() {
|
||||
const args = process.argv.slice(2);
|
||||
|
||||
// Show help
|
||||
if (args.includes('--help') || args.includes('-h')) {
|
||||
showHelp();
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
// Check Bun installation
|
||||
if (!checkBunInstalled()) {
|
||||
console.error('❌ Bun is not installed or not in PATH');
|
||||
console.error('Please install Bun from: https://bun.sh');
|
||||
console.error('Or use: curl -fsSL https://bun.sh/install | bash');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Check and install dependencies if needed
|
||||
if (!checkDependenciesInstalled()) {
|
||||
const installed = installDependencies();
|
||||
if (!installed) {
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Parse command
|
||||
const command = args[0];
|
||||
|
||||
if (command === 'download' || !command) {
|
||||
// Extract PR number if provided
|
||||
const prArgs = args.slice(1);
|
||||
runPRReviewScript(prArgs);
|
||||
} else {
|
||||
console.error(`❌ Unknown command: ${command}`);
|
||||
console.error('Run "node run.js --help" for usage information');
|
||||
process.exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
// Run main function
|
||||
main().catch((error) => {
|
||||
console.error('❌ Fatal error:', error.message);
|
||||
process.exit(1);
|
||||
});
|
||||
Reference in New Issue
Block a user