About better-github-skill
A skill for agents using GitHub CLI, with scripts that gather Pull Request status, review discussions, and CI failure details. It targets recurring error-prone operations while retaining direct gh commands for known tasks.
Key features
- 01Collect PR status and checks in one report
- 02Read review discussions and unresolved threads
- 03Find failing CI jobs, steps, and logs
- 04Provide JSON output and usage help
- 05Use gh directly for known commands
Use cases
- 01Check the PR for the current branch
- 02Review feedback and unresolved discussions
- 03Locate CI failures and inspect their logs
Install
Copy the command and run it in a terminal.
npx skills add https:/ / github.com/ avgvstvs96/ better-github-skill --skill better-github-skillAfter installing, type/better-github-skillin Claude Code to confirm it loaded.
Bundled files
References and scripts installed along with SKILL.md.
README.mdLICENSEscripts/lib.tspr-snapshot.tspr-threads.tsci-failures.tsDetails
From the project READMEbetter-github-skill
Raw gh first when you know the command; the scripts replace only the flows
agents repeatedly get wrong. Scripts run TS directly (node ≥ 23.6), no deps.
Scripts
| script | use for |
|---|---|
scripts/pr-snapshot.ts [pr] [-R o/r] | full PR state in one call: meta, mergeability, checks, files, reviews, comments, thread counts. Use instead of hand-assembling pr view --json field sets or chaining view/checks/comments calls. |
scripts/pr-threads.ts [pr] [-R o/r] [--all] [--author X] [--since ISO] | the full review conversation: review bodies, issue comments, and unresolved inline threads (resolution state porcelain gh cannot get). Resolved/outdated threads are hidden by default, counted in the header; --all includes them. Read-only: never reply to or resolve threads unless explicitly told to. |
scripts/ci-failures.ts [run-id] [--pr N] [--list] [-R o/r] | failing checks → failing jobs/steps → log snippet each; full logs saved to files (paths printed); rg those instead of re-fetching. --list [--workflow W] [-L n] shows recent runs with conclusions; use it to find the failing run id instead of gh run list --json field sets. |
Rule of thumb: pr-snapshot answers "what's the state of this PR", pr-threads answers "what did reviewers write". Neither replaces the other.
All scripts: --json for structured output, --help for usage (includes the
--json shape). Omit the PR number to use the current branch's PR. Default
output is sized for context; pass --full only when a truncation marker
([…+N chars]) hides something you need. They exit 0 when the report
succeeds even if CI is red or threads are unresolved.
Gotchas (each one burned real sessions repeatedly)
- Never pipe gh into
head: SIGPIPE can kill gh mid-write (spurious nonzero exit, shell-dependent) or silently truncate large output. Redirect to a file and read that, or trim with--jq '.[0:20]'. gh pr diffhas no--statand no positive pathspec (--name-onlyand-e/--excludeglobs exist in gh ≥ 2.95). Per-file stats:gh api 'repos/{owner}/{repo}/pulls/N/files' --jq '.[]|[.filename,.additions,.deletions]|@tsv'Full diff:gh pr diff N > "$TMPDIR/pr.diff"once, then rg/sed the file.gh pr checksexits 1 = failing, 8 = pending by design; append|| true, read the table.- File at any ref, no base64 dance:
gh api 'repos/{owner}/{repo}/contents/PATH?ref=SHA' -H 'Accept: application/vnd.github.raw' gh apifills{owner}/{repo}from the cwd repo (GH_REPO=o/roverrides). Quote any api path containing?(zsh globs it), or use-X GET -F per_page=100(any-f/-Fsilently flips the request to POST without-X GET).--paginateon any list endpoint (/comments,/files,/reviews);--jqalready runs per page; don't add--slurp.- PR/comment bodies:
--body-file file.mdor a quoted heredoc. Never inline--body "..."containing backticks. - Field cheat-sheet: CI status on a PR =
statusCheckRollup(pr view); steps live undergh run view N --json jobs;gh search prsfields ≠gh pr viewfields. - gh has no
-C; pass-R owner/repoto every command, or cd first. - Branch rules live at
gh api 'repos/{owner}/{repo}/rulesets'on modern repos;/branches/main/protection404s unless classic protection is on AND you have admin ("Branch not protected" or plain "Not Found" both mean check rulesets; neither is a path error). - Branch drift:
gh api 'repos/{owner}/{repo}/compare/BASE...HEAD' --jq '{ahead_by,behind_by}' - jq beyond one line: write the program to a file and
jq -f prog.jq; inline zsh quoting breaks. - Don't sleep-poll runs or checks;
gh run watch IDandgh pr checks N --watch --fail-fastexist; let the harness background them.