Install
$ agentstack add skill-osouthgate-agent-plus-skills-github-remote ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ● Network access Used
- ✓ Filesystem access No
- ● Shell / process execution Used
- ● Environment & secrets Used
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
github-remote
Project-scoped CLI that wraps the GitHub REST API into a read-first, JSON-output triage tool. Stdlib-only Python 3 (no pip installs, no venvs). Designed for agent-driven PR/CI inspection — one call returns PR state + checks + reviews + runs so you don't burn tool calls chaining gh pr view / gh pr checks / gh run view per investigation.
Lives at ${CLAUDE_SKILL_DIR}/../../bin/github-remote; the plugin auto-adds bin/ to PATH, so just run github-remote ....
Prerequisites
GITHUB_TOKENset in project.env/.env.local/ shell env, ORghlogged in (the CLI falls back togh auth token). Get a PAT at https://github.com/settings/tokens.- Repo resolution: pass
--repo owner/name, or setGITHUB_REPO, or run from a git checkout whoseoriginpoints at github.com.
The CLI bails with a clear missing-config message if neither auth nor repo is resolvable.
When to reach for this
- User asks "is this PR green / mergeable" → run
overview --pretty. One call → PR + checks + reviews + runs + mergeable + review comment count. - User asks "why did CI fail on " → run
overviewto see failing job names, thenrun logs --errors-only --tail 100. - User asks "resolve the PR for " → run
pr resolve. Exits non-zero with candidates on ambiguity; never auto-picks. - User asks "wait for the run on main" → run
run wait main --timeout 1800. Accepts a branch or a run ID. Exits non-zero on timeout or non-success conclusion. - User asks "post a comment on PR 498" → run
pr comment 498 --body '…'. Posts via/issues/{n}/comments(issue-style comments on PRs, which is whatgh pr commentdoes).
Headline commands
github-remote pr list [--state open|closed|merged|all] [--base ] [--author ] [--limit 50]
github-remote pr resolve
github-remote pr show
github-remote pr comment --body
github-remote issue list [--state open|closed|all] [--assignee ] [--label ] [--limit 50]
github-remote issue resolve
github-remote issue show
github-remote run list [--branch ] [--status in_progress|completed|queued] [--limit 20]
github-remote run show
github-remote run logs [--job ] [--errors-only] [--tail 50]
github-remote run wait [--timeout 1800] [--poll-interval 10]
github-remote overview
github-remote whoami [--json] # identity for `agent-plus refresh` ("what's my github identity")
All list/show commands emit JSON to stdout. Use --pretty for indentation.
jq-friendly. Default compact JSON pipes cleanly into jq. Every dict payload also carries a top-level tool: {name, version} field (injected by _with_tool_meta) so agents can self-diagnose version drift from the output alone — no extra --version subprocess call needed. Prefer jq against stable keys (.pr.number, .checks.failing_jobs[], .runs[].conclusion) rather than parsing human output.
Offloading large responses with --output
GitHub responses balloon quickly — run logs on a failing build, long pr list, run show with dozens of check annotations. Pulling the full payload through the model's context wastes tokens when you only need a slice.
Pass --output before the subcommand (it's a top-level flag, same position as --pretty):
github-remote --output /tmp/run.json run logs 1234567890 --errors-only
github-remote --output /tmp/prs.json pr list --state open --limit 100
Stdout returns a compact envelope instead of the full payload:
{
"tool": {"name": "github-remote", "version": "..."},
"payloadPath": "/tmp/run.json",
"bytes": 93420,
"fileLineCount": 2104,
"payloadKeys": ["run_id", "jobs", "failing_jobs"],
"payloadShape": {
"run_id": {"type": "number"},
"jobs": {"type": "list", "length": 12,
"sample": {"type": "dict", "keys": 6,
"shape": {"name": {"type": "string", "length": 8},
"conclusion": {"type": "string", "length": 7},
"annotations": {"type": "list", "length": 23}}}},
"failing_jobs": {"type": "list", "length": 2}
}
}
How to act on it:
payloadShapetells you what's in the file without reading it. Agent seesjobs[0].annotations.length: 23and knows the interesting data is nested under each job.- Use
Readwith offset/limit to pull only the slice you need. - For list-shaped responses (
pr list,run list), the envelope haspayloadType: "list"+payloadLength+sampleShape.
--shape-depth controls recursion depth. Default is 3 (two layers — surfaces checks[0].annotations.length or prs[0].head.sha). --shape-depth 1 gives a minimal top-level-only envelope.
When NOT to use --output: small responses (pr resolve, issue show for a single item), or when you need the data in the same turn to act on.
Design rules (agent-plus patterns)
- Aggregate server-side.
overviewreturns PR state + mergeable + check-runs rollup + review summary + latest runs in one call — replaces 4-6ghinvocations. - Resolve by name.
pr resolve feat/fooandissue resolve 'flaky test'— you never copy PR numbers between commands. Ambiguity never auto-picks: exits non-zero with up to 10 candidates so the agent can re-query. --waiton async flows.run waitpolls on a run ID or branch name with a 30-min default timeout and 10s poll interval. On timeout: non-zero exit with partial JSON including last-known state. Never hangs.--jsonis the default. No human-prose output paths. Pipe tojqfreely.- Zero token leakage. Every API response walks through
_scrub(), which redactstoken,password,authorization,client_secret,private_key,webhook_url_with_secret,access_token,refresh_token,secret,api_key. Free-text log blobs fromrun logsare regex-scrubbed forghp_…,github_pat_…,gho_…,ghu_…,ghs_…,ghr_…,AKIA…, andBearer …patterns. A canary no-leak test asserts a known secret substring cannot appear on any output path.
Overview output caps
Documented in --help and honoured by the CLI so agents can budget context:
- Reviews: 10 latest
- Failing jobs: 20
- Workflow runs tied to head SHA: 5
Config precedence (highest first)
--token/--repoCLI flags--env-fileif passed.env.local/.envwalked up from cwd (closest wins)- Shell env
Only GITHUB_* prefixed vars are picked up.
Auth precedence (highest first)
GITHUB_TOKENenv var (explicit, CI-friendly; fine-grained and classic PATs both flow here)gh auth tokensubprocess (inherits your localghlogin — best DX on dev machines)- Fail with a missing-config message pointing at
.env,~/.claude/settings.json, andgh auth login.
Rate limits
X-RateLimit-Remaining/X-RateLimit-Resetheaders are read on every response. When remaining,gh workflow list, orPOST /repos/{owner}/{repo}/actions/workflows/{id}/dispatches.github-remote run *` is read-only (list/show/logs/wait).- Releases, tags, team/repo admin, branch protection, secrets management. →
gh release ...,gh api ..., or the dashboard. Entirely out of wrapper scope. - GitHub Enterprise Server (non-
api.github.comhosts). →ghwithGH_HOSTset, orcurlagainst your GHES base URL.GITHUB_API_URLis reserved but not wired up in v1. - Git operations — cloning, checkouts, pushing, branch creation, local diffs. → plain
gitandgh repo clone. The wrapper has no git surface at all.
Don't get stuck in a loop. If the user's request obviously needs a write github-remote doesn't support (merge, create, dispatch, close), immediately switch to gh or curl rather than hunting for a wrapper flag that doesn't exist. The wrapper exists to make reading PR/CI state faster and safer — it is not a replacement for gh.
What it doesn't do
Deliberately out of scope for v1:
pr create,pr merge,issue create,issue close(deferred — distinct safety contracts)- Workflow authoring or
workflow dispatch/workflow run - Team, releases, repo admin, secrets management
- GitHub Enterprise Server (v1 assumes
api.github.com;GITHUB_API_URLis reserved for future GHES support) - GraphQL migration (REST covers every v1 command)
Use the gh CLI or dashboard for those. This plugin is read-first PR/CI triage plus one write.
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: osouthgate
- Source: osouthgate/agent-plus-skills
- License: MIT
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.