Automated PR reviewer assignment based on git blame analysis and contributor workload.
go build -o better-reviewers ./cmd/best-reviewer-botexport GITHUB_APP_ID="123456"
export GITHUB_APP_KEY="projects/PROJECT/secrets/SECRET/versions/latest" # GCP Secret Manager
# or
export GITHUB_APP_KEY_PATH="/path/to/private-key.pem" # Local fileRequired App permissions: repository:write, pull_requests:write, organization_members:read
gh auth login# Single PR
./better-reviewers -pr "owner/repo#123"
# Project monitoring
./better-reviewers -project "owner/repo" -poll 1h
# Organization monitoring
./better-reviewers -org "myorg" -poll 1h
# GitHub App mode (monitors all installed orgs)
./better-reviewers -poll 1h
# Dry run
./better-reviewers -pr "owner/repo#123" -dry-run| Flag | Default | Description |
|---|---|---|
-pr |
PR URL or owner/repo#N |
|
-project |
Repository to monitor | |
-org |
Organization to monitor | |
--app-id |
GitHub App ID (overrides env) | |
--app-key |
App private key path (overrides env) | |
-poll |
Polling interval (e.g. 1h, 30m) |
|
-dry-run |
false |
Preview without assigning |
-min-age |
1h |
Minimum PR age |
-max-age |
180d |
Maximum PR age |
-max-prs |
9 |
Max open PRs per reviewer |
-pr-count-cache |
6h |
PR count cache TTL |
Create .codeGROOVE/assigner.yaml in any org repository:
min_grace_period: 2 # Minutes before assignment
pending_test_grace: 20 # Minutes while tests pending
failing_test_grace: 90 # Minutes while tests failing
max_reviewers: 2
max_prs_per_reviewer: 9
min_age: 0 # Hours
max_age: 8760 # Hours (1 year)
excluded_users:
- bot-account
excluded_paths:
- "vendor/**"
- "**/*.generated.go"- Fetch changed files from PR
- Run
git blameon each file to identify contributors - Score candidates by: code ownership weight, recent activity, current workload
- Filter out: PR author, bots, overloaded reviewers (>max_prs open)
- Assign top N reviewers
gcloud run deploy better-reviewers \
--image gcr.io/PROJECT/better-reviewers \
--set-env-vars GITHUB_APP_ID=123456 \
--set-secrets GITHUB_APP_KEY=github-app-key:latestenv:
- name: GITHUB_APP_ID
value: "123456"
- name: GITHUB_APP_KEY
valueFrom:
secretKeyRef:
name: github-app-key
key: private-key