Start with one job and grow from there.
Free to start · No credit card required
# List every open PR across the configured repos.
gh pr list --repo {{target_repos}} --state open \
--json number,title,url,author,createdAt,updatedAt,reviewRequests,reviews,comments,commits
{{target_repos}} names more than one.gh pr view --repo {{target_repos}} <PR_NUMBER> \
--json number,title,url,author,createdAt,updatedAt,reviewRequests,reviews,comments,commits
reviews gives each review's state (APPROVED, CHANGES_REQUESTED,
COMMENTED) and timestamp; commits and comments give the last activity;
reviewRequests gives who's currently asked to review.reviewRequests entry and no APPROVED or
CHANGES_REQUESTED review from that reviewer since the request:hours_waiting = now - max(createdAt, last review-request timestamp)
hours_waiting > {{review_sla_hours}}. Nudge target: the requested
reviewer(s).days_idle = now - max(last_commit, last_comment, last_review)
days_idle > {{stale_days}}. Nudge target: the author. A PR already
flagged in Step 2 can also be flagged here if it independently qualifies — the
two checks are separate signals, not mutually exclusive.CHANGES_REQUESTED, check whether the
author has pushed a commit or posted a comment since that review's timestamp.
If not, flag it. Nudge target: the author.| Check | Passes (no nudge) | Fails (nudge) |
|---|---|---|
| Overdue review | Reviewer submitted within SLA | No review after {{review_sla_hours}}h |
| Stale | Any activity within the window | No activity for {{stale_days}}d |
| Unaddressed changes | Author pushed/replied after the review | Silence since CHANGES_REQUESTED |