Finishing a Development Branch
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
Watches an open pull request's CI until green and fixes failing checks.
$ npx skills add opsmill/infrahub --skill monitoring-pull-requests -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install opsmill/infrahub monitoring-pull-requests --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/monitoring-pull-requests .claude/skills/monitoring-pull-requests && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "monitoring-pull-requests" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requests into .claude/skills/monitoring-pull-requests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "monitoring-pull-requests", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requestsType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add opsmill/infrahub --skill monitoring-pull-requests -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install opsmill/infrahub monitoring-pull-requests --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .agents/skills && cp -r skills-src/.agents/skills/monitoring-pull-requests .agents/skills/monitoring-pull-requests && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "monitoring-pull-requests" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requests into .agents/skills/monitoring-pull-requests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "monitoring-pull-requests", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opsmill/infrahub --skill monitoring-pull-requests -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install opsmill/infrahub monitoring-pull-requests --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/.agents/skills/monitoring-pull-requests .cursor/skills/monitoring-pull-requests && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "monitoring-pull-requests" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requests into .cursor/skills/monitoring-pull-requests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "monitoring-pull-requests", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/opsmill/infrahub.git --path .agents/skills/monitoring-pull-requests--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add opsmill/infrahub --skill monitoring-pull-requests -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install opsmill/infrahub monitoring-pull-requests --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/.agents/skills/monitoring-pull-requests .gemini/skills/monitoring-pull-requests && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "monitoring-pull-requests" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requests into .gemini/skills/monitoring-pull-requests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "monitoring-pull-requests", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install opsmill/infrahub monitoring-pull-requestsInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add opsmill/infrahub --skill monitoring-pull-requests -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .github/skills && cp -r skills-src/.agents/skills/monitoring-pull-requests .github/skills/monitoring-pull-requests && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "monitoring-pull-requests" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requests into .github/skills/monitoring-pull-requests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "monitoring-pull-requests", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add opsmill/infrahub --skill monitoring-pull-requests -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install opsmill/infrahub monitoring-pull-requests --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/opsmill/infrahub.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/.agents/skills/monitoring-pull-requests .opencode/skills/monitoring-pull-requests && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "monitoring-pull-requests" agent skill from https://github.com/opsmill/infrahub/tree/stable/.agents/skills/monitoring-pull-requests into .opencode/skills/monitoring-pull-requests/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "monitoring-pull-requests", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
monitoring-pull-requestsWatches an open pull request's CI until green and fixes failing checks.
Monitoring Pull Requests is an agent skill from opsmill/infrahub. Watches an open pull request's CI until green and fixes failing checks. TRIGGER when: the user wants to watch a pull request's CI, babysit a PR until it goes green, or fix failing CI checks on an open PR. DO NOT TRIGGER when: opening the PR in the first place → pr; rebasing the branch onto its base → rebase.
Its SKILL.md is about 6.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts. Compatibility notes: Requires a Git working tree and GitHub access (gh CLI authenticated). Local reproduction uses whatever toolchain the project itself defines.
It sits in Development, covering Pull requests. The repository describes itself as: Infrahub is a graph-based data management platform with built-in version control, CI workflows, peer review, and API access. It’s purpose-built to power reliable infrastructure… The licence is Apache-2.0.
7 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit 460d724. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gitghpytestvitestgocargoFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md. Its commands use git and gh, which can reach the network depending on how they are called.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Requires a Git working tree and GitHub access (gh CLI authenticated). Local reproduction uses whatever toolchain the project itself defines.
From compatibility in the SKILL.md frontmatter.
Monitoring Pull Requests loads about 6.3k tokens when it runs. Until then it costs about 84 tokens; SKILL.md has 3,292 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from opsmill/infrahub at commit 460d724, republished under its Apache-2.0 licence (© opsmill). 3,292 words, ~6,280 tokens.
.claude/skills/monitoring-pull-requests/SKILL.md (or your agent's skills folder).Watch the CI for a pull request, and when something fails, fix it the careful way: reproduce the failure locally before changing anything, validate the fix locally before pushing, and retry up to 5 times. If 5 fix attempts still leave the PR red, revert every fix-attempt commit — with the user's approval — and hand back the PR in its original state; five failed attempts is a strong signal the changes are misguided.
Push-without-local-reproduction is allowed only when the failure cannot be reproduced locally (genuine CI-only divergence). Never push a speculative fix when local reproduction is possible.
This skill is project-agnostic: it discovers how to reproduce CI failures from the project's own context (workflow definitions, AGENTS.md/CLAUDE.md/CONTRIBUTING.md, Makefile/Taskfile/justfile, package.json scripts, pyproject.toml/tox.ini, pre-commit config) rather than assuming a fixed toolchain.
This skill is designed to run as a background agent, not in the user's foreground turn. CI commonly runs for tens of minutes, and a fix-and-retry loop multiplies that by up to 5 iterations. Blocking the parent conversation that long is wasteful — spawn this skill as an asynchronous agent and let it report back when it has something to say.
pr Phase 7) using the runtime's background-agent primitive (Claude Code: Agent with run_in_background: true; equivalent in other runtimes)./monitoring-pull-requests when they explicitly want to watch a PR. In that case the loop runs in the foreground and the user can interrupt.baseline_commit itself in Phase 0 and resolves the PR/branch from arguments or current branch. No state needs to be inherited from the spawning conversation beyond what is passed in $ARGUMENTS.<arguments> $ARGUMENTS </arguments>
Supported arguments:
<PR-number> — Use the PR with that number on the current repo.<PR-URL> — Use the PR at that GitHub URL.Maintain these variables throughout the run. Track them in your scratch space; they drive the retry/revert logic.
iteration = 0
max_iterations = 5
pr_number = <resolved in Phase 0>
branch = <resolved in Phase 0>
baseline_commit = <HEAD on the branch when the skill starts — the revert target>
fix_commits = [] # SHAs created by this skill while attempting fixes
ci_resolved = false
attempt_log = [] # One entry per iterationEvery fix attempt produces exactly one new commit on the branch, appended to fix_commits. This is what makes the Phase 6 revert deterministic.
Move to the repo root:
cd "$(git rev-parse --show-toplevel)"If this fails, STOP — not inside a Git working tree.
Resolve the PR. Determine pr_number and branch:
$ARGUMENTS looks like a number → pr_number = $ARGUMENTS.$ARGUMENTS looks like a URL → extract the number with gh pr view "$ARGUMENTS" --json number -q .number.pr_number = $(gh pr view --json number -q .number) for the current branch. If no PR exists, STOP and tell the user to open one (or run /pr first).Then capture metadata:
gh pr view <pr_number> --json number,headRefName,headRefOid,baseRefName,state,isDraft,mergeable,statusCheckRollupbranch = headRefName (and keep headRefOid at hand — step 4 verifies the local baseline against it)Check out the PR branch locally (if not already):
git fetch origin
git checkout <branch>
git pull --ff-only origin <branch>If git pull is not fast-forward, STOP and tell the user the local branch has diverged from origin — they need to reconcile first.
Record baseline_commit as the current HEAD. This is the local revert target if all 5 iterations fail:
baseline_commit=$(git rev-parse HEAD)Verify it matches headRefOid from step 2. If they differ, STOP — the branch is out of sync with the PR head and any revert would lose work.
Refuse to operate on long-lived branches. If branch is the repository's default branch (git symbolic-ref --short refs/remotes/origin/HEAD), a long-standing integration branch (main, master, stable, develop, dev, trunk), or a release branch (release/*, release-*, version-named branches), STOP. This skill is for feature PRs only.
Discover the project's local toolchain (used by Phases 2–4). Read whatever project context exists — AGENTS.md/CLAUDE.md/CONTRIBUTING.md, Makefile/Taskfile/justfile, package.json scripts, pyproject.toml/tox.ini, .pre-commit-config.yaml — and note:
Report to the user: PR number, title, branch, baseline commit short SHA, current statusCheckRollup summary (counts of pending/success/failure). Then proceed.
The goal of this phase is to discover whether the CI is currently passing, failing, or still running — and to wait through "still running" states.
Find the most recent CI run for the branch:
gh run list --branch <branch> --limit 10 --json databaseId,name,status,conclusion,event,headSha,createdAtFilter to runs whose headSha matches the current branch tip. If multiple workflows ran for the same SHA, look at all of them — the PR is only green if every required check is green.
Wait for in-flight runs to settle. While any run for the current SHA has status other than completed:
gh run list --branch <branch> --limit 10 --json databaseId,status,conclusion,headSha. Where available, prefer a single blocking gh run watch <run-id> over polling.gh run list --branch <branch> --limit 5). Stalled webhooks happen.Once all runs for the SHA are completed:
conclusion == success (or skipped for legitimately skipped jobs) → set ci_resolved = true, go to Phase 5.conclusion in {failure, cancelled, timed_out, action_required} → go to Phase 2.If iteration == 0 and CI is already green when the skill is first invoked: report this to the user and exit cleanly. Nothing to do.
For each failed run, list its failed jobs and work out how to reproduce each one locally.
Failure outside the PR's diff — don't trust a stale "commits behind" count. A failure in a file or config the PR's diff doesn't touch may be inherited from the base — but the "how far behind" distance is a snapshot, not a durable property. It can go stale the moment the base gets fixed, including while you're escalating or waiting on a reviewer reply — a branch that was genuinely 0 commits behind an hour ago is not proof it still is now.
git fetch origin && git rev-list --count HEAD..origin/<base-branch>.gh run list --branch <base-branch> --json databaseId,conclusion,headSha,createdAt)
and confirm it failed the same way — a concrete run ID beats an inferred "probably pre-existing."gh run rerun <run-id> --failed) instead of pushing a fix-attempt commit first —
a workflow with concurrency: cancel-in-progress: true cancels the very run whose outcome would
answer the question.List failed jobs for each failed run:
gh run view <run-id> --json jobs --jq '.jobs[] | select(.conclusion=="failure") | {name, databaseId, conclusion}'Classify each failed job into a track. Read the workflow definition that ran the job (under .github/workflows/) to see the exact commands CI executed, then map the job onto one of these tracks:
| Track | Typical job names | Local reproduction strategy |
|---|---|---|
| lint | lint, pre-commit, format, static analysis | Re-run the specific failing hook/rule on the specific failing files (Phase 3.lint) |
| test | unit tests, integration tests | Re-run the exact failing test case(s) with the project's test runner (Phase 3.test) |
| build | build, compile, typecheck, packaging | Re-run the project's build/typecheck command (Phase 3.build) |
| e2e | e2e, acceptance, browser tests, anything needing heavy infrastructure | Target the single failing test; never the full suite (Phase 3.e2e) |
| other | publish, release, deploy, bots, unfamiliar workflows | Read logs and ask the user before guessing |
The local-equivalent command for each track comes from the toolchain discovered in Phase 0 step 6 and from the workflow file itself — when in doubt, run locally exactly what CI ran, narrowed to the failing case.
Pull the failing log lines for every failed job. Don't dump the whole log; extract the failing test/check:
gh run view <run-id> --log-failed > /tmp/monitoring-pull-requests-failed-<run-id>.logGrep for the runner's failure markers (e.g. FAILED/ERROR for pytest, FAIL for vitest/jest/go test, error[ for compilers) — those give the exact test IDs, hook names, or file/rule pairs to reproduce.
Always reproduce as narrowly as possible. The goal is the smallest local invocation that exercises the failing case, not a full-suite re-run. A run targeting one test finishes in seconds; a full suite can take many minutes. Narrow runs are also clearer to debug — less noise in the output. Concretely:
attempt_log.Decide the order of attack. Fix one failure per iteration. Prefer the cheapest one first (lint < test < build < e2e), because lint failures often mask deeper issues and are fast to fix. Record the chosen target in attempt_log for this iteration:
attempt_log[iteration] = {
failing_jobs: [<list of job names that failed>],
target_job: <the one being fixed this iteration>,
target_node: <test id or hook name being reproduced>,
failure_excerpt: <a few key log lines>,
}Hard rule: never push a speculative fix when local reproduction is possible. Reproduce first, then fix, then re-verify locally, then push.
The reproduction strategy depends on the track. Pick the matching subsection. In every subsection, the concrete commands come from the project's own toolchain (Phase 0 step 6) — the examples below illustrate the narrowing pattern, not a required tool.
Narrow first: run only the hook(s) or rule(s) that failed, on only the file(s) they flagged.
pre-commit run <hook-id> --files <file1> <file2>; with a direct linter: point it at the flagged files only.attempt_log and proceed to Phase 4 with a best-effort fix. Note the unreproduced status.Narrow first: run only the failing test case(s), not the full suite.
pytest -v <node_id>, vitest run <file> -t "<name>", go test -run '<TestName>' ./<pkg>, cargo test <name>. Run multiple failing cases in a single invocation if there's more than one — still narrower than the full suite.attempt_log that you fell back to the full suite and why.E2E failures are the most expensive to reproduce locally (heavy infrastructure, minutes per run, often 30+ minutes for the full suite). Never reproduce by running the whole E2E suite. Always target the specific failing test.
AGENTS.md), delegate to it with that single test ID, and treat its entire outcome as a single iteration of monitoring-pull-requests — even if it has its own internal retries.max_iterations. Do not push a speculative E2E fix without a local pass.Stop and ask the user. Do not guess fixes for unfamiliar workflows (publish, release, deploy, bots, etc.).
Don't push until the relevant local checks are green. This is where most "blind push" cycles get caught.
Run the project's local validation gate before every push — the lint/format command discovered in Phase 0 step 6 (the same checks that gate every PR). If the project defines no such gate, skip this step. If it fails, fix and re-run before pushing.
Re-run the specific track's local check that failed in Phase 3 (the targeted test, hook, or build) to confirm the fix sticks.
Generated-artefact guard. If the project checks in generated artefacts (GraphQL schemas, OpenAPI clients, generated SDK types, protobufs) and the diff touches their sources, regenerate using the project's documented commands before committing — CI commonly fails on stale generated files.
Stage and commit the fix. One commit per iteration, with a clear message following the repo's commit conventions (check git log --oneline -20):
git add <specific files>
git commit -m "ci: fix <short description of what failed and what changed>"Append the commit SHA to fix_commits. Avoid git add . — be specific, and never stage anything that looks like a secret or credential.
Push to origin (no force-push; these are new commits, not history rewrites):
git push origin <branch>Increment iteration. Record in attempt_log[iteration]:
{
fix_summary: <one line>,
files_changed: <list>,
commit_sha: <new sha>,
reproduced_locally: <true|false>,
local_checks_passed: <true|false>,
}If iteration >= max_iterations: go to Phase 6 (revert). Otherwise return to Phase 1 to wait for the new CI run.
Confirm one more time that all checks for the current SHA are green:
gh pr checks <pr_number>Produce the final report (see "Report Format" below) with Result: GREEN after N iterations.
Exit cleanly. Do not merge the PR — that is always the user's call.
If 5 iterations completed without reaching green, the fix attempts are likely misdirected. Roll the branch back to its pre-skill state so the user can take over with a clean slate.
Confirm the revert plan with the user before executing. Show:
git log --oneline <baseline_commit>..HEAD).attempt_log).Wait for explicit user approval. If the user wants to keep one or more of the fix commits, abort the revert and hand back to them with a written summary.
After approval, reset the local branch:
git reset --hard <baseline_commit>Force-push with lease so we don't clobber any commits the user may have pushed in parallel:
git push --force-with-lease=<branch>:<fix_commits[-1]> origin <branch>The --force-with-lease=<ref>:<expected_oid> form ensures the push only succeeds if the remote tip is exactly the last commit this skill pushed. If the lease check fails, STOP — the user pushed something concurrently and the revert needs human review.
Produce the final report with Result: NOT FIXED — reverted after 5 iterations.
Always produce this report at the end, regardless of outcome.
## PR Monitor Summary
**PR:** #<pr_number> — <title> (`<branch>`)
**Result:** GREEN after N iterations / NOT FIXED — reverted after 5 iterations
**Baseline commit:** `<short sha>`
**Final commit:** `<short sha>` (or "reverted to baseline")
### Iterations
#### Iteration 1
- **Failing job:** <name>
- **Failure summary:** <key log line(s)>
- **Reproduced locally:** yes / no (<reason if no>)
- **Fix applied:** <one-line description>
- **Files changed:** <list>
- **Local checks:** passed / skipped / failed
- **CI outcome after push:** green / still failing on <jobs>
#### Iteration 2
...
### CI-only failures (if any)
<List any failures that could not be reproduced locally and the evidence
gathered before pushing speculatively.>
### Current State
- Branch: `<branch>` at `<final sha>`
- Uncommitted changes: <yes/no — `git status --short`>
- Reverted: yes / no
### Recommendations
<If NOT FIXED: which iteration came closest, what hypotheses remain
untested, what a human should look at next.>
<If GREEN: any follow-up — flaky-looking failures, related tests to watch,
docs to update.>attempt_log and the final report.attempt_log. Never re-run an entire E2E suite.--no-verify. Pre-commit hooks are typically the same checks CI runs. Bypassing them locally just delays the failure; fix the underlying issue.AGENTS.md, a constitution, contribution guide) requires test coverage or docs for new behaviour, and a fix introduces new behaviour rather than just patching an existing path, flag this in the final report so the user knows additional coverage is owed.Either:
success (or legitimately skipped), with a documented log of what was fixed and how each fix was validated locally.© opsmill, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in .agents/skills/monitoring-pull-requests of opsmill/infrahub.
Open the folder on GitHubat commit 460d724
Monitoring Pull Requests next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Monitoring Pull Requests this skillopsmill/infrahub | 531 | — | ~6.3k | Automated safety check: Pass | Apache-2.0 | |
| Finishing a Development Branchobra/superpowers | 296k | 5 repos | ~1.9k | Automated safety check: Pass | MIT | |
| PR Babysitteropeninterpreter/openinterpreter | 69k | 3 repos | ~4.2k | Automated safety check: Pass | Apache-2.0 | |
| Check PRonyx-dot-app/onyx | 32k | 2 repos | ~2.3k | Automated safety check: Pass | MIT | |
| Understand Diff AnalysisEgonex-AI/Understand-Anything | 86k | 1 repos | ~1.4k | Automated safety check: Pass | MIT | |
| PR Design DocOpenHands/OpenHands | 90k | — | ~2.4k | Automated safety check: Pass | MIT |
obra/superpowers
Walks the last step of a branch: confirm tests pass, detect the git environment, ask how to integrate, carry out your choice and clean up the worktree.
openinterpreter/openinterpreter
Watches an open GitHub pull request until it merges, handling review comments, diagnosing CI failures and retrying flaky checks along the way.
onyx-dot-app/onyx
Checks a GitHub, GitLab, or Perforce (p4) pull request (or merge request, or shelved changelist) for unresolved review comments, failing status checks, and incomplete PR descriptions.
Egonex-AI/Understand-Anything
Reads your git changes or a pull request against a prebuilt knowledge graph of the project to explain what changed, which components are affected and what is risky.
OpenHands/OpenHands
For a non-trivial pull request, write a self-contained HTML design doc under the temporary .pr/ directory and link a visibility-appropriate preview in the PR description, so maintainers grasp the…
woocommerce/woocommerce
Reviews WooCommerce code changes against the project's standards, flagging backend PHP architecture, naming, documentation, data integrity and testing violations.
opsmill/infrahub
Analyzes recent CI failures on pull requests to identify flaky tests, using retry outcomes (failed attempt → green re-run) and cross-PR recurrence as evidence, and maintains a local longitudinal…
opsmill/infrahub
Audits internal (dev/) and external (docs/) documentation completeness for a feature, subject, or set of existing docs, maps changes indicated by the user, across Infrahub's documentation layers…
opsmill/infrahub
Stages and commits the current changes onto a safe working branch, enforcing branch discipline and optionally pushing upstream.
opsmill/infrahub
A skill your agent uses when you've fixed a bug, added a feature, or made any user-facing change in a project that uses Towncrier and need to record it for the changelog — before committing or…
opsmill/infrahub
Turns a single feature idea, improvement, or bug into ONE well-structured GitHub issue.
opsmill/infrahub
Synthesises the current conversation context into a Product Requirements Document and publishes it to GitHub (as a comment on a referenced issue, or a new issue).
Categories
Watches an open pull request's CI until green and fixes failing checks. Monitoring Pull Requests is an agent skill from opsmill/infrahub. Watches an open pull request's CI until green and fixes failing checks.
Monitoring Pull Requests fits situations like: : the user wants to watch a pull requests CI; babysit a PR until it goes green; fix failing CI checks on an open PR; : opening the PR in the first place → pr.
Run `npx skills add opsmill/infrahub --skill monitoring-pull-requests -a claude-code`. Or copy the skill folder (.agents/skills/monitoring-pull-requests in opsmill/infrahub) into .claude/skills/monitoring-pull-requests in your project. Claude Code loads it when a task matches its description.
Run `npx skills add opsmill/infrahub --skill monitoring-pull-requests -a codex`. Or copy the skill folder (.agents/skills/monitoring-pull-requests in opsmill/infrahub) into .agents/skills/monitoring-pull-requests in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add opsmill/infrahub --skill monitoring-pull-requests -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/monitoring-pull-requests, .gemini/skills/monitoring-pull-requests, .github/skills/monitoring-pull-requests and .opencode/skills/monitoring-pull-requests in your project.
Going by SKILL.md and its folder, Monitoring Pull Requests needs the command-line tools its instructions call (git, gh, pytest, vitest, go and cargo). Compatibility (from SKILL.md): Requires a Git working tree and GitHub access (gh CLI authenticated). Local reproduction uses whatever toolchain the project itself defines..
SKILL.md contains no URLs. Its commands use git and gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Monitoring Pull Requests is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 6.3k tokens (SKILL.md is roughly 25k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Monitoring Pull Requests: Finishing a Development Branch (obra/superpowers, 296k stars), PR Babysitter (openinterpreter/openinterpreter, 69k stars), Check PR (onyx-dot-app/onyx, 32k stars) and Understand Diff Analysis (Egonex-AI/Understand-Anything, 86k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
opsmill (a GitHub organization) maintains it in opsmill/infrahub, which has 531 GitHub stars. The repository holds 32 skills in this directory. The repository was last updated on October 8, 2026.
Source: opsmill/infrahub on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.