modules/home/programs/cli-agents/shared/skills/cli-tools/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)"'
documentation
Save notes, journal entries, and research to the personal-notes Obsidian vault (personal-vault-v2). Use when the user asks to 'save note', 'save to notes', 'write to personal notes', 'save to daily notes', 'note this down', or wants to persist findings/analysis to their personal vault.
documentation
Use whenever the user asks to address, fix, resolve, review, or respond to pull-request comments or review feedback.
development
Apply Not Matthias's Rust-first personal coding style. Use whenever the user explicitly asks to apply or review their code style, make Rust match their preferences, perform a style pass, or simplify/refactor according to their conventions. Inspect only task-touched code, honor local project conventions first, and make only safe opt-out style edits.
development
Guide for writing ast-grep rules to perform structural code search and analysis. Use when users need to search codebases using Abstract Syntax Tree (AST) patterns, find specific code structures, or perform complex code queries that go beyond simple text search. This skill should be used when users ask to search for code patterns, find specific language constructs, or locate code with particular structural characteristics.