cc-pr-tracker Claude Code mod: Claude Code PR status above your prompt
One line per GitHub PR above the Claude Code prompt: merge state, review, required checks, and alerts on change.
Permissions
- Reads filesCan read files and list directories on your machine ($.fs.read / list / stat / exists).
- Runs commandsCan run shell programs on your machine ($.process.run / spawn). Check the source for exactly which ones.
- Intercepts tool callsSees every tool call Claude makes (tool.call / tool.check) and could block or change it.
- Reads your promptsCan see what you type and the conversation transcript (prompt.* / session.append / session.messages).
- Changes the UIDraws into the Claude Code interface: bands, panes, status text, toasts (ui.render / $.ui.*).
- Adds commands/toolsRegisters new slash commands or tools that you or Claude can invoke ($.command.register / $.tool.register).
- Stores dataKeeps data between sessions in the plugin's private store ($.store.*).
- tested with
- v2.1.296
- last tested
- requires
- Claude Code ≥ 2.1.287
- surfaces
- above-prompt, toast
- source
- Seza Akgün (sezaakgun) (MIT)
Install inside Claude Code:
/plugin install cc-pr-tracker --marketplace sezaakgun/cc-pr-trackerWhat does this mod do?
cc-pr-tracker is a community mod by Seza Akgün (sezaakgun) that keeps the Claude Code PR status in view while you work. Paste a GitHub pull request URL, or let Claude open one, and the PR gets one line above the prompt: its merge state, review decision, the count of required checks that passed, failed or are pending, and the title. It refreshes every minute by default.
When a required check changes or the merge state moves, you get a toast, a one-second strip above the prompt and, on macOS, a system sound. Claude also gets a short automated note on its next turn with the failing check's log link. Hovering a line shows buttons to open the PR, copy its URL, mute it, show a details panel, or stop watching. Claude can ask for the status itself through a pr_status tool, and /prs prints the watched PRs as text anywhere.
It is close to Git Branch, which shows the local branch, but it looks at GitHub rather than your working tree. For a plain "turn finished" toast see Done Toast. The author's README needs Claude Code 2.1.289 or later for everything; older builds keep the list in memory only.
Demo
The recording uses the author's own stand-in gh script (docs/record/gh in the repo), which answers the mod's GraphQL call from canned JSON, so no real GitHub repository is queried. It starts Claude Code with the mod loaded in the small demo project, then pastes two PR URLs as one prompt: acme/api#87 and acme/storefront#418. No model turn runs. Claude Code shows "Prompt dropped by a hook: watching acme/api#87, watching acme/storefront#418", and two lines appear above the prompt, each with the repo and number, blocked in red, approved in green, a green check count, a yellow pending count and the PR title.
Install
Use any of the methods in the install block; they install straight from the author's own marketplace. You also need gh installed and logged in (gh auth status). To try it for one session from a clone, run claude --plugin-dir . in the repo. Run /plugin to confirm the mod is active.
$ install cc-pr-tracker
Requires Claude Code ≥ 2.1.287
Installs from the author's own marketplace: sezaakgun/cc-pr-tracker
1.One line, inside Claude Code
/plugin install cc-pr-tracker --marketplace sezaakgun/cc-pr-trackerPaste into a running session (v2.1.275+). Claude Code asks to add the marketplace first.
2.From your shell
claude plugin marketplace add sezaakgun/cc-pr-tracker claude plugin install cc-pr-tracker@cc-pr-trackerThen run /reload-plugins in any session that is already open.
3.Try it without installing
git clone https://github.com/sezaakgun/cc-pr-tracker claude --plugin-dir ./cc-pr-trackerLoads the mod for one session only. Nothing is added to your settings.
How it works
The plugin is one hooks module. prompt.submit reads PR URLs from your prompt, turn.complete and a tool.call hook on Bash catch URLs in Claude's answer and in gh pr create output, and ui.render on AbovePrompt draws the lines. A timer started in session.start polls every watched PR through gh. The call, from hooks/register.tsx:
const gh = async (args: string[]) => {
const { stdout, stderr, exitCode } = await $.process.run(['gh', ...args], { timeoutMs: 30_000 })
if (exitCode) throw new Error(stderr.trim() || `gh exited ${exitCode}`)
return JSON.parse(stdout)
}Each poll is one read-only gh api graphql query for the PR's title, state, merge state, review decision and the checks on its head commit, with GitHub's own isRequired flag. Only the latest run of each check is kept, using the same buckets as gh pr checks. If GitHub refuses GraphQL (as claude.ai/code does), the mod switches to four to six REST calls per poll. A failed poll keeps the old values and marks the line refresh failed, so a network blip is not reported as a change. The first load of a PR and moves into or out of the temporary unknown merge state never alert.
Customize it
Open /config and look for the cc-pr-tracker rows; each also takes /config cc-pr-tracker.<field>=<value> and applies at once. The twelve options are: Mute all PR alerts, Alert on (every change, failures and ready to merge, or failures only), Tell Claude about changes, Alert sound, Poll every (seconds), Auto-watch PRs, Remember watched PRs (this session or this project), Stop watching merged or closed PRs, Count all checks, Alert on review changes, Flash strip, and Show PRs in the transcript. The line's hover buttons mute or stop one PR.
Permissions & safety
We read every file the plugin loads: .claude-plugin/plugin.json, hooks/hooks.json, hooks/register.tsx (about 740 lines of readable TypeScript), the type declarations, both test files, plus the repo's helper scripts and workflow. There is no package.json, install script, bundled or minified code, remote code or dynamic import(). The docs/record/ scripts only produce the README images and are not loaded by the plugin.
Findings, all matching the README:
- Network: the mod makes no requests itself. It runs
gh api graphql(orgh api repos/...over REST) for PRs you watch, so the owner, repo and PR number go to github.com under yourghlogin. - Processes:
ghfor polling;openorxdg-openfor the open button;afplaywith a macOS system sound on an alert; and, only inside the cmux terminal, cmux's own CLI fromCMUX_BUNDLED_CLI_PATHto flash the pane and post a notification. Arguments are passed as arrays, not shell strings. - Environment: it reads only
CMUX_BUNDLED_CLI_PATHandCMUX_SURFACE_ID. It never writes environment variables. - Files: it writes no files. The watch list is kept in the plugin's own
$.storeand$.state, keyed by session or project; lists not polled for 30 days are pruned. - Prompt influence: after an alert it appends a user-role note to the conversation. The note says it is an automated notice not written by you, and quotes check names from GitHub as data, capped at 100 characters. Control characters in GitHub text are stripped before display. You can turn the note off with "Tell Claude about changes". It also registers a
pr_statustool for Claude. - Gating hooks: a prompt that is only PR URLs is dropped (no model turn); that is the documented behavior. A longer prompt passes through unchanged. The
Bashhook only readsgh pr createoutput. - Daemons and telemetry: none. The polling timer lives inside Claude Code and stops with it. No analytics.
- Requirements:
gh, logged in. macOS for sounds; cmux is optional. - License: MIT, with a LICENSE file.
claude plugin validate reported no errors or warnings; its notes list four hooks without .catch (config.set, prompt.submit and the two tool.call hooks), which is informational. The author's 70 tests passed on Claude Code 2.1.296.
- Reads files
- Can read files and list directories on your machine ($.fs.read / list / stat / exists).
- Runs commands
- Can run shell programs on your machine ($.process.run / spawn). Check the source for exactly which ones.
- Intercepts tool calls
- Sees every tool call Claude makes (tool.call / tool.check) and could block or change it.
- Reads your prompts
- Can see what you type and the conversation transcript (prompt.* / session.append / session.messages).
- Changes the UI
- Draws into the Claude Code interface: bands, panes, status text, toasts (ui.render / $.ui.*).
- Adds commands/tools
- Registers new slash commands or tools that you or Claude can invoke ($.command.register / $.tool.register).
- Stores data
- Keeps data between sessions in the plugin's private store ($.store.*).
Compatibility & troubleshooting
Checked with Claude Code 2.1.296 on macOS (validate, tests and the recording). If something does not work:
- The URL is sent to the model. The mod did not load. Check
claude --versionis 2.1.287 or later and that/pluginshows cc-pr-tracker under active mods. gh failed: …on a line. Rungh pr view <url>in a terminal; usuallyghis not logged in or cannot see that repo.- No hover buttons. Your terminal does not report the mouse; paste the URL again to stop watching, or use
/prs. - No sound. Only macOS with
/System/Library/Soundsplays sounds. - Only
github.comURLs are recognised; GitHub Enterprise hosts are not.
FAQ
- Does cc-pr-tracker need a GitHub token or API key?
- It needs the GitHub CLI (gh), logged in with access to the repos you watch. The mod holds no token itself; it runs gh for every poll, so gh's own login decides what it can see.
- How often does it poll, and does it spend model tokens?
- Every 60 seconds by default, one GraphQL call per PR through gh; the interval is 30 to 3600 seconds in /config. Polling does not call the model. Only an alert adds a short note that Claude reads on its next turn.
- Why did my prompt vanish when I pasted a PR URL?
- A prompt that is only PR URLs is dropped by the mod and starts (or stops) watching them, with no model turn. Claude Code shows "Prompt dropped by a hook: watching owner/repo#N". A URL inside a longer prompt is watched and the prompt still runs.
- Can Claude see the PR status?
- Yes. The mod registers a pr_status tool, so Claude can ask for the watched PRs' state, merge state, review and checks instead of calling gh. After an alert it also adds an automated note, marked as not written by you, with the failing checks' log links.
- How do I turn the alerts off?
- Hover a line and press mute for one PR, or turn on "Mute all PR alerts" in /config. Lines keep updating but nothing toasts, flashes, plays a sound or tells Claude. "Alert sound", "Flash strip" and "Tell Claude about changes" switch off single parts.
# Related mods
FeaturedGit Branch Above Prompt
Shows your git branch, changed-file count and ahead/behind status in a one-line band above the Claude Code prompt.
- above-prompt
- Runs commands
- Intercepts tool calls
- Changes the UI
tested with v2.1.310
FeaturedDone Toast
A "Done in 2m 14s" toast and a short chime when a long Claude turn finishes, plus an optional desktop notification.
- toast
- Runs commands
- Changes the UI
- Plays sound
tested with v2.1.310
More in Git & GitHub, Toasts & notifications.