From badb4d5baff8d54ef04a1ced2efecb2effc07f1c Mon Sep 17 00:00:00 2001 From: John Myers <9696606+johntmyers@users.noreply.github.com> Date: Fri, 13 Mar 2026 15:55:09 -0700 Subject: [PATCH] chore: remove github-rest-api skill Signed-off-by: John Myers <9696606+johntmyers@users.noreply.github.com> --- .agents/skills/github-rest-api/SKILL.md | 377 ------------------------ 1 file changed, 377 deletions(-) delete mode 100644 .agents/skills/github-rest-api/SKILL.md diff --git a/.agents/skills/github-rest-api/SKILL.md b/.agents/skills/github-rest-api/SKILL.md deleted file mode 100644 index 4044ddcaa..000000000 --- a/.agents/skills/github-rest-api/SKILL.md +++ /dev/null @@ -1,377 +0,0 @@ ---- -name: github-rest-api -description: Interact with GitHub using the gh CLI restricted to REST API only (no GraphQL). Use when the user wants to work with GitHub issues, pull requests, repos, releases, or Actions — especially in sandboxed environments where the GraphQL endpoint may be blocked. Trigger keywords - github, gh, pull request, PR, github issue, github actions, workflow, release, gh api. ---- - -# GitHub via REST API - -Work with GitHub using `gh api` and REST-only subcommands. Many `gh` subcommands (`gh pr list`, `gh issue list`, `gh issue view`, `gh pr view`, etc.) use GraphQL internally and **will fail** if the sandbox blocks `api.github.com/graphql`. Always prefer `gh api` hitting REST endpoints. - -## Shell Permissions - -Use `required_permissions: ["full_network"]` for all `gh` commands (they need to reach `api.github.com`). - -## Key Constraint - -| Endpoint | Status | -|---|---| -| `api.github.com/graphql` | **Blocked** in sandbox | -| `api.github.com/repos/...` (REST) | Allowed | - -**Rule:** Never use `gh` subcommands that call GraphQL. When in doubt, use `gh api` with an explicit REST path. - -### Commands known to use GraphQL (avoid these) - -- `gh pr list`, `gh pr view`, `gh pr status`, `gh pr checks` -- `gh issue list`, `gh issue view`, `gh issue status` -- `gh project` (all subcommands) -- `gh search` (all subcommands) -- `gh label list` - -### Commands that are REST-safe - -- `gh api ` — always REST when given a path (not `graphql`) -- `gh pr create` — uses REST -- `gh pr merge` — uses REST -- `gh release *` — uses REST -- `gh run *` — uses REST -- `gh workflow *` — uses REST -- `gh auth status` — local/REST -- `gh repo clone` / `gh repo view --json` — may use GraphQL; prefer `gh api` - -## Authentication Check - -```bash -gh auth status -``` - -If not authenticated, instruct the user to run `gh auth login`. - -## Repositories - -### Get repo info - -```bash -gh api repos/{owner}/{repo} -``` - -### List repos for a user or org - -```bash -gh api "users/{username}/repos?per_page=30&sort=updated" -gh api "orgs/{org}/repos?per_page=30&sort=updated" -``` - -## Issues - -### List issues - -```bash -gh api "repos/{owner}/{repo}/issues?state=open&per_page=30" \ - | jq '.[] | {number, title, state, user: .user.login, labels: [.labels[].name]}' -``` - -Filter options (query params): `state` (open/closed/all), `labels` (comma-separated), `assignee`, `creator`, `milestone`, `sort` (created/updated/comments), `direction` (asc/desc), `since` (ISO 8601), `per_page`, `page`. - -### Get a single issue - -```bash -gh api repos/{owner}/{repo}/issues/{number} -``` - -### Create an issue - -```bash -gh api repos/{owner}/{repo}/issues \ - -f title="Issue title" \ - -f body="Issue description" \ - -f "labels[]=bug" \ - -f "assignees[]={username}" -``` - -### Comment on an issue - -```bash -gh api repos/{owner}/{repo}/issues/{number}/comments \ - -f body="Comment text" -``` - -### Close an issue - -```bash -gh api repos/{owner}/{repo}/issues/{number} -X PATCH -f state=closed -``` - -### Reopen an issue - -```bash -gh api repos/{owner}/{repo}/issues/{number} -X PATCH -f state=open -``` - -### Add labels - -```bash -gh api repos/{owner}/{repo}/issues/{number}/labels \ - -f "labels[]=bug" -f "labels[]=priority-high" -``` - -## Pull Requests - -### List PRs - -```bash -gh api "repos/{owner}/{repo}/pulls?state=open&per_page=30" \ - | jq '.[] | {number, title, state, user: .user.login, head: .head.ref, base: .base.ref}' -``` - -Filter options: `state` (open/closed/all), `head` (filter by head user/org and branch: `user:ref-name`), `base` (filter by base branch), `sort` (created/updated/popularity/long-running), `direction`, `per_page`, `page`. - -### Get a single PR - -```bash -gh api repos/{owner}/{repo}/pulls/{number} \ - | jq '{number, title, state, body, user: .user.login, head: .head.ref, base: .base.ref, mergeable: .mergeable, merged: .merged}' -``` - -### Get PR diff - -```bash -gh api repos/{owner}/{repo}/pulls/{number} \ - -H "Accept: application/vnd.github.diff" -``` - -### Get PR files changed - -```bash -gh api "repos/{owner}/{repo}/pulls/{number}/files?per_page=100" \ - | jq '.[] | {filename, status, additions, deletions, changes}' -``` - -### Create a PR (REST-safe alternative) - -`gh pr create` is REST-safe and the easiest way: - -```bash -gh pr create --title "PR title" --body "PR description" --base main --head feature-branch -``` - -Or via `gh api`: - -```bash -gh api repos/{owner}/{repo}/pulls \ - -f title="PR title" \ - -f body="PR description" \ - -f head="feature-branch" \ - -f base="main" -``` - -### Merge a PR - -```bash -gh pr merge {number} --squash # REST-safe -``` - -Or via `gh api`: - -```bash -gh api repos/{owner}/{repo}/pulls/{number}/merge \ - -X PUT -f merge_method=squash -``` - -### Request reviewers - -```bash -gh api repos/{owner}/{repo}/pulls/{number}/requested_reviewers \ - -f "reviewers[]={username}" -``` - -### List PR reviews - -```bash -gh api "repos/{owner}/{repo}/pulls/{number}/reviews" \ - | jq '.[] | {user: .user.login, state, body}' -``` - -### List PR review comments - -```bash -gh api "repos/{owner}/{repo}/pulls/{number}/comments" \ - | jq '.[] | {user: .user.login, path, body, line}' -``` - -### Comment on a PR - -PRs use the issues comments endpoint: - -```bash -gh api repos/{owner}/{repo}/issues/{number}/comments \ - -f body="Comment text" -``` - -## Commits & Branches - -### List branches - -```bash -gh api "repos/{owner}/{repo}/branches?per_page=30" \ - | jq '.[].name' -``` - -### Get a commit - -```bash -gh api repos/{owner}/{repo}/commits/{sha} \ - | jq '{sha, message: .commit.message, author: .commit.author.name, date: .commit.author.date}' -``` - -### Compare two refs - -```bash -gh api "repos/{owner}/{repo}/compare/{base}...{head}" \ - | jq '{ahead_by, behind_by, total_commits, files: [.files[] | {filename, status, additions, deletions}]}' -``` - -### List commits on a branch - -```bash -gh api "repos/{owner}/{repo}/commits?sha={branch}&per_page=20" \ - | jq '.[] | {sha: .sha[:8], message: (.commit.message | split("\n")[0]), date: .commit.author.date}' -``` - -## GitHub Actions - -### List workflow runs - -```bash -gh run list --limit 10 # REST-safe -``` - -Or via `gh api`: - -```bash -gh api "repos/{owner}/{repo}/actions/runs?per_page=10" \ - | jq '.workflow_runs[] | {id, name, status, conclusion, head_branch, created_at}' -``` - -### Get a specific run - -```bash -gh api repos/{owner}/{repo}/actions/runs/{run_id} \ - | jq '{id, name, status, conclusion, head_branch, html_url}' -``` - -### List jobs for a run - -```bash -gh api "repos/{owner}/{repo}/actions/runs/{run_id}/jobs" \ - | jq '.jobs[] | {id, name, status, conclusion, started_at, completed_at}' -``` - -### Download job logs - -```bash -gh run view {run_id} --log # REST-safe -``` - -### Re-run a workflow - -```bash -gh api repos/{owner}/{repo}/actions/runs/{run_id}/rerun -X POST -``` - -### Re-run failed jobs only - -```bash -gh api repos/{owner}/{repo}/actions/runs/{run_id}/rerun-failed-jobs -X POST -``` - -### List workflows - -```bash -gh api "repos/{owner}/{repo}/actions/workflows" \ - | jq '.workflows[] | {id, name, state, path}' -``` - -### Trigger a workflow dispatch - -```bash -gh api repos/{owner}/{repo}/actions/workflows/{workflow_id}/dispatches \ - -f ref=main -f "inputs[key]=value" -``` - -## Releases - -### List releases - -```bash -gh api "repos/{owner}/{repo}/releases?per_page=10" \ - | jq '.[] | {tag_name, name, draft, prerelease, published_at}' -``` - -### Get latest release - -```bash -gh api repos/{owner}/{repo}/releases/latest \ - | jq '{tag_name, name, body, published_at, assets: [.assets[] | {name, download_count, browser_download_url}]}' -``` - -### Create a release - -```bash -gh api repos/{owner}/{repo}/releases \ - -f tag_name="v1.0.0" \ - -f name="Release v1.0.0" \ - -f body="Release notes here" \ - -F draft=false \ - -F prerelease=false -``` - -## Check Runs & Statuses (CI) - -### List check runs for a ref - -```bash -gh api "repos/{owner}/{repo}/commits/{ref}/check-runs" \ - | jq '.check_runs[] | {name, status, conclusion, html_url}' -``` - -### Get combined status for a ref - -```bash -gh api "repos/{owner}/{repo}/commits/{ref}/status" \ - | jq '{state, total_count, statuses: [.statuses[] | {context, state, description}]}' -``` - -## Pagination - -GitHub REST API returns at most 100 items per page. Use `per_page` and `page` query params: - -```bash -gh api "repos/{owner}/{repo}/issues?state=all&per_page=100&page=1" -gh api "repos/{owner}/{repo}/issues?state=all&per_page=100&page=2" -``` - -Or use `--paginate` to auto-follow `Link` headers (returns all pages concatenated): - -```bash -gh api "repos/{owner}/{repo}/issues?state=all&per_page=100" --paginate \ - | jq '.[] | {number, title}' -``` - -## Resolving Owner/Repo - -If the user doesn't specify a repo, infer from the current git remote: - -```bash -gh api repos/:owner/:repo -``` - -`gh api` resolves `:owner` and `:repo` from the current git remote automatically. - -## Error Handling - -- **401 Unauthorized** — run `gh auth status`; may need `gh auth login` -- **403 Forbidden** — rate limit or insufficient permissions; check `gh api rate_limit` -- **404 Not Found** — wrong owner/repo/number or private repo without access -- **422 Unprocessable** — invalid payload; check field names and types -- **Network error / timeout** — if you see connection refused on the graphql endpoint, you're hitting the sandbox restriction; switch to a REST endpoint