modules/home/programs/cli-agents/shared/skills/github/SKILL.md
Use whenever working with GitHub — PRs, issues, CI runs, review comments, unresolved threads, code search, or any `gh` CLI / GraphQL query.
npx skillsauth add not-matthias/dotfiles-nix githubInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use the gh CLI to interact with GitHub. Always specify --repo owner/repo when not in a git directory, or use URLs directly.
Check CI status on a PR:
gh pr checks 55 --repo owner/repo
List recent workflow runs:
gh run list --repo owner/repo --limit 10
View a run and see which steps failed:
gh run view <run-id> --repo owner/repo
View logs for failed steps only:
gh run view <run-id> --repo owner/repo --log-failed
Fetch every review comment on a PR:
gh api repos/owner/repo/pulls/55/comments
Limitation: The REST API returns a flat list with no
isResolvedfield. You cannot distinguish resolved from unresolved threads using REST alone.
The GraphQL API models reviews as threads, each with isResolved and isOutdated flags. Use this to get only actionable, unresolved threads:
gh api graphql \
-f owner="OWNER" -f repo="REPO" -F pr=55 \
-f query='
query FetchReviewComments($owner: String!, $repo: String!, $pr: Int!) {
repository(owner: $owner, name: $repo) {
pullRequest(number: $pr) {
reviewThreads(first: 100) {
nodes {
id
isResolved
isOutdated
comments(first: 50) {
nodes {
author { login }
body
}
}
}
}
}
}
}' | jq '.data.repository.pullRequest.reviewThreads.nodes[] | select(.isResolved == false and .isOutdated == false)'
Key fields on each reviewThread:
isResolved — user clicked "Resolve conversation" in the GitHub UIisOutdated — the diff line no longer exists (code moved/deleted)Both must be false for a comment to be genuinely actionable.
To exclude bot comments, add: | select(.comments.nodes[0].author.login | endswith("[bot]") | not)
scripts/unresolved-pr-comments.pyFor a complete solution with pagination and formatted output, use the bundled script:
uv run scripts/unresolved-pr-comments.py <owner> <repo> <pr-number> # exclude bots (default)
uv run scripts/unresolved-pr-comments.py <owner> <repo> <pr-number> --bots # include bot comments
Handles pagination, bot filtering, and prints a numbered list of actionable threads with file path, line number, author, and comment body.
The gh api command is useful for accessing data not available through other subcommands.
Get PR with specific fields:
gh api repos/owner/repo/pulls/55 --jq '.title, .state, .user.login'
Most commands support --json for structured output. You can use --jq to filter:
gh issue list --repo owner/repo --json number,title --jq '.[] | "\(.number): \(.title)"'
tools
Spawn the pi coding agent with a specific model/provider. Use when asked to run pi with a particular model, switch pi's model, use DeepSeek V4 Flash/Pro in pi, or look up pi's --model/--provider/--models CLI flags and thinking-level shorthand.
development
Navigate to directories using zoxide (frecency-based directory jumper). Use when the user says "go to", "navigate to", "cd to", "jump to" a project or directory by nickname/partial name (e.g. "go to my dotfiles", "jump to dot").
tools
Use when manipulating Zellij sessions, creating tabs or panes, sending commands to panes, capturing output, or looking up Zellij CLI commands for terminal multiplexer operations
development
Emulates not-matthias's technical blog writing style. Use when writing blog posts, technical articles, README content, or any long-form technical prose. Produces investigation-driven, first-person narratives with dry humor, practical code examples, and concrete takeaways.