A Swiss Army knife for GitHub pull requests.
brew install gechr/tap/prlgo install github.com/gechr/prl@latestRequires gh (installed and authenticated). Go 1.26+ if building from source.
prl --initThis writes ~/.config/prl/config.yaml. Edit it to set defaults such as owners, authors, output mode, plugin, and TUI behavior.
Everything is flags plus optional free-text query terms - no subcommands.
# Your open PRs
prl
# All PRs across states
prl -s all
# PRs for a specific repo
prl --repo owner/repo
# PRs with "fix" in the title/body/comments
prl fix
# PRs created in the last 2 weeks
prl -c 2weeks
# PRs that have never been updated after creation
prl --drift 0
# Open an interactive TUI browser
prl --interactive
# Refresh results continuously
prl --watch
# Print only the total count
prl --count
# Approve selected PRs
prl --approve
# Enable auto-merge for your PRs
prl --merge -y
# Clone matching repos
prl --clone -y
# Send your PRs to Slack via plugin
prl --send
# Dry run: show the query without executing it
prl --dry
# JSON output
prl -o json| Flag | Short | Description |
|---|---|---|
--owner |
-O |
Limit to GitHub owner(s), comma-separated |
--repo |
-R |
Limit to a specific repo |
--filter |
-f |
Raw GitHub search qualifier (repeatable) |
--match |
Restrict text search to title, body, or comments |
|
--author |
-a |
Filter by author(s), comma-separated |
--commenter |
Filter by commenter | |
--no-bot |
-B |
Exclude bot authors after fetch |
--team |
-t |
Filter by team authors via plugin or config |
--involves |
-I |
Filter by involvement |
--requested |
Filter by requested reviewer | |
--closed-by |
Filter by who closed the PR | |
--merged-by |
Filter by who merged the PR | |
--reviewed-by |
Filter by reviewer | |
--ci |
Filter by CI status: success, failure, pending |
|
--comments |
Filter by comment count, for example >5 or 10..20 |
|
--language |
-l |
Filter by language |
--review |
-r |
Filter by review status |
--state |
-s |
Filter by state: open, closed, ready, merged, all |
--topic |
-T |
Filter by repo topic via plugin |
--created |
-c |
Filter by creation date |
--drift |
-d |
Filter by gap between creation and last update |
--updated |
-u |
Filter by last updated date |
--merged |
-m |
Filter by merged date |
--archived |
Include archived repos | |
--draft / --no-draft |
Filter by draft state |
| Flag | Short | Description |
|---|---|---|
--interactive |
-i |
Launch the full-screen TUI browser |
--approve |
Approve each PR | |
--close |
Close each PR | |
--copilot |
Request Copilot review on each PR | |
--delete-branch |
Delete the branch after close | |
--comment |
Add a comment to each PR | |
--edit |
-e |
Edit title and body of each PR |
--mark-draft |
Convert each PR to draft | |
--mark-ready |
Mark each PR ready for review | |
--merge / --no-merge |
Toggle auto-merge | |
--force-merge |
-M |
Poll for checks, then force-merge |
--unsubscribe |
-U |
Remove review request and unsubscribe |
--update |
Update each PR branch from its base branch | |
--yes |
-y |
Skip the confirmation prompt |
| Flag | Short | Description |
|---|---|---|
--clone |
Clone unique repos from the results | |
--copy |
-C |
Copy rendered output to the clipboard |
--count |
-N |
Print only the total result count |
--dry |
-n |
Show the query without executing it |
--open |
-P |
Open each PR in the browser |
--web |
-w |
Open the GitHub search page in the browser |
--send |
Send PRs to Slack via plugin | |
--send-to |
Override the Slack recipient |
| Flag | Short | Description |
|---|---|---|
--watch |
-W |
Refresh output periodically |
--exit-0 |
-0 |
Exit immediately when there are no results |
--columns |
Custom table columns | |
--limit |
-L |
Maximum number of results |
--output |
-o |
table, url, bullet, json, or repo |
--reverse |
Show oldest first | |
--sort |
Sort by name, created, or updated |
| Flag | Short | Description |
|---|---|---|
--init |
Write the default config file | |
--color |
auto, always, or never |
|
--debug |
Log HTTP requests to stderr | |
--quick |
-Q |
Skip enrichment such as merge status and auto-merge |
--verbose |
-v |
Enable verbose logging |
-h |
Print short help | |
--help |
Print long help with examples |
--interactive opens a full-screen browser for inspecting PRs, filtering, and triggering actions. Configurable AI review launchers are available through tui.review.* settings in config.yaml.
2weeks # since 2 weeks ago (>=)
>2weeks # more than 2 weeks ago
<3days # less than 3 days ago
1y6mo # compound: 1 year and 6 months ago
1d12h # compound: 1 day and 12 hours ago
today # today
yesterday # yesterday
2024-01-15 # exact ISO date
Units: m/min/mins/minute/minutes, h/hr/hrs/hour/hours, d/day/days, w/week/weeks, mo/month/months, y/year/years
Gap between PR creation and last update. Default operator is <=.
--drift 0 # never updated after creation
--drift 1week # updated within 1 week of creation
--drift '>1week' # updated more than 1 week after creation
Also supports seconds: s, sec, secs, second, seconds.
Default columns: index, title, ref, created, updated.
author is added automatically when multiple authors are in play (e.g. --team).
Available columns: index, owner, ref, repo, number, title, labels, author, state, created, updated, url
prl --columns title,ref,author,labelsIn table mode, sort defaults to updated unless --sort is set explicitly.
Lives at ~/.config/prl/config.yaml. Overridden by PRL_* environment variables.
default:
owners:
- my-org
authors:
- "@me"
bots: true
limit: 30
match: title
merge_method: squash
output: table
reverse: false
sort: name
state: open
vcs: git
spinner:
style: dots
colors: ["39", "45", "51"]
tui:
refresh:
enabled: true
review:
# Optional: limit or reorder the available review providers.
# enabled: [claude, codex, gemini]
default:
provider: claude
model: sonnet
effort: medium
providers:
claude:
# Optional: override the available model/effort choices.
# models: [sonnet, opus]
# efforts: [low, medium, high, max, auto]
prompt: |
Review PR #{prNumber} in {ownerWithRepo}.
URL: {prURL}
codex:
# Optional: override the available model/effort choices.
# models: [gpt-5.4, gpt-5.4-mini, gpt-5.3-codex]
# efforts: [low, medium, high, xhigh]
prompt: |
Review PR #{prNumber} in {ownerWithRepo}.
URL: {prURL}
gemini:
# Optional: override the available model/effort choices.
# models: [gemini-3.1-pro, gemini-3-pro, gemini-2.5-flash]
# efforts:
# Gemini 3: [low, medium, high]
# Gemini 2.5 Flash budgets: [0, 1024, 8192, 24576, dynamic]
prompt: |
Review PR #{prNumber} in {ownerWithRepo}.
URL: {prURL}
filters: {}
sort: {}
plugin: ""
ignored_owners: []
team_aliases:
ops: my-org/ops
teams:
my-org/ops:
- alice
- bob
authors:
dependabot: Bot
jdoe: Jane Doeplugin: if empty, auto-discoversprl-plugin-*onPATHvcs: controls whether--cloneusesgitorjj- AI review placeholders:
{prNumber},{repo},{owner},{ownerWithRepo},{prURL},{prRef},{title} - Gemini review effort uses provider-specific semantics:
Gemini 3maps effort tothinkingLevel, whilegemini-2.5-flashmaps effort tothinkingBudget
External binaries (prl-plugin-*) that provide completion (author, team, repo, topic, slack-recipient), resolution (team, topic), and Slack sending. Set plugin: in config if multiple are on PATH.
make fmt
make lint
make test
make install