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