BLOCKING INTERCEPT: When ANY github.com URL appears in user input, STOP and use this skill. Never fetch GitHub HTML pages directly - they are 5-10MB and will exhaust your context window. This skill routes URLs to efficient API calls (1-50KB). Triggers on: pull/, issues/, blob/, tree/, commit/, compare/, discussions/.
Intercepts GitHub URLs and routes them to efficient API calls instead of fetching bloated HTML pages.
/plugin marketplace add rjmurillo/ai-agents/plugin install project-toolkit@ai-agentsThis skill inherits all available tools. When active, it can use any tool Claude has access to.
CRITICAL: This skill activates AUTOMATICALLY when you see ANY
github.comURL. Do NOT useweb_fetch,curl, or any browser-based fetch on GitHub URLs. Doing so wastes 1-2.5 MILLION tokens on HTML that provides no useful data.
MANDATORY BEHAVIOR: Parse the URL → Route to API → Return structured JSON.
When you see a GitHub URL, use these commands immediately:
# PR URL → Use this
python3 .claude/skills/github/scripts/pr/get_pr_context.py --pull-request {n} --owner {owner} --repo {repo}
# Issue URL → Use this
python3 .claude/skills/github/scripts/issue/get_issue_context.py --issue {n} --owner {owner} --repo {repo}
# File/blob URL → Use this
gh api repos/{owner}/{repo}/contents/{path}?ref={ref}
# Commit URL → Use this
gh api repos/{owner}/{repo}/commits/{sha}
# Comment fragment (#discussion_r{id}) → Use this
gh api repos/{owner}/{repo}/pulls/comments/{id}
| Phrase | Action |
|---|---|
Any github.com URL in user input (even bare URL pasted alone) | Parse URL type and route to API |
analyze / research / scan + GitHub URL | Route based on URL type |
| URL + question (e.g., "...#r123 what's the tracking issue?") | Extract fragment, call specific API |
| Multiple GitHub URLs in one prompt | Process each URL, batch API calls |
Use this skill when:
github.com URL appears in user input (automatic activation)Use github instead when:
| Pattern | Example | Why Intercept |
|---|---|---|
github.com/.../pull/ | https://github.com/owner/repo/pull/123 | PR HTML is 5-10MB |
github.com/.../pull/.../checks | https://github.com/owner/repo/pull/123/checks?check_run_id=... | CI checks page bloat |
github.com/.../pull/.../files or /changes | https://github.com/owner/repo/pull/123/files#r123456 | Diff view with comment fragment |
github.com/.../issues/ | https://github.com/owner/repo/issues/456 | Issue HTML is 2-5MB |
github.com/.../actions/runs/ | https://github.com/owner/repo/actions/runs/123/job/456 | Workflow run page bloat |
github.com/.../blob/ | https://github.com/owner/repo/blob/main/file.py | File page has nav bloat |
github.com/.../tree/ | https://github.com/owner/repo/tree/main/src | Directory listing bloat |
github.com/.../commit/ | https://github.com/owner/repo/commit/abc123 | Commit page overhead |
github.com/.../compare/ | https://github.com/owner/repo/compare/main...feat | Diff page overhead |
github.com/.../discussions/ | https://github.com/owner/repo/discussions/789 | Discussion page bloat |
Fragment #discussion_r{id} | Review comment ID in /changes or /files URL | Extract ID, call API directly |
Fragment #issuecomment-{id} | Issue comment ID | Extract ID, call API directly |
Fragment #pullrequestreview-{id} | Review ID | Extract ID, call API directly |
Fragment #r{id} (short form) | Review comment in /changes#r123 | Same as #discussion_r{id} |
GitHub URL detected in user input
│
├─ Has fragment (#pullrequestreview-, #discussion_r, #issuecomment-)?
│ Yes → Extract ID, use gh api for specific comment/review
│
├─ Is /pull/{n}?
│ Yes → get_pr_context.py --pull-request {n} --owner {o} --repo {r}
│ (or get_pr_review_comments.py / get_pr_review_threads.py for comments)
│
├─ Is /issues/{n}?
│ Yes → get_issue_context.py --issue {n} --owner {o} --repo {r}
│
├─ Is /blob/{ref}/{path} or /tree/{ref}/{path}?
│ Yes → gh api repos/{o}/{r}/contents/{path}?ref={ref}
│
├─ Is /commit/{sha}?
│ Yes → gh api repos/{o}/{r}/commits/{sha}
│
└─ Is /compare/{base}...{head}?
Yes → gh api repos/{o}/{r}/compare/{base}...{head}
| Step | Action | Verification |
|---|---|---|
| 1.1 | Detect github.com URL in user input | URL pattern matched |
| 1.2 | Extract owner/repo from path | Both values non-empty |
| 1.3 | Identify URL type (pull, issues, blob, tree, commit, compare) | Type classified |
| 1.4 | Extract fragment ID if present | Fragment parsed or null |
| Step | Action | Verification |
|---|---|---|
| 2.1 | Check if github skill script exists for URL type | Script path resolved |
| 2.2 | If script exists → use github skill (primary route) | Script invocation planned |
| 2.3 | If no script → use gh api (fallback route) | API command constructed |
| 2.4 | For fragments → always use gh api with specific endpoint | Endpoint includes ID |
| Step | Action | Verification |
|---|---|---|
| 3.1 | Execute selected command | Command runs without error |
| 3.2 | Receive structured JSON response | Success: true for scripts |
| 3.3 | Parse relevant fields for user query | Response processed |
| URL Pattern | Script | Parameters |
|---|---|---|
/pull/{n} | get_pr_context.py | --pull-request {n} --owner {o} --repo {r} |
/pull/{n} (with diff) | get_pr_context.py | --pull-request {n} --include-diff |
/pull/{n} (review comments) | get_pr_review_comments.py | --pull-request {n} |
/pull/{n} (review threads) | get_pr_review_threads.py | --pull-request {n} |
/pull/{n} (CI status) | get_pr_checks.py | --pull-request {n} |
/issues/{n} | get_issue_context.py | --issue {n} --owner {o} --repo {r} |
Script location: .claude/skills/github/scripts/
Use only when no script exists for the operation:
| URL Pattern | API Call |
|---|---|
/pull/{n}#pullrequestreview-{id} | gh api repos/{o}/{r}/pulls/{n}/reviews/{id} |
/pull/{n}#discussion_r{id} | gh api repos/{o}/{r}/pulls/comments/{id} |
/pull/{n}/files#r{id} or /changes#r{id} | gh api repos/{o}/{r}/pulls/comments/{id} |
/pull/{n}#issuecomment-{id} | gh api repos/{o}/{r}/issues/comments/{id} |
/pull/{n}/checks | gh api repos/{o}/{r}/check-runs?head_sha=... or use get_pr_checks.py |
/issues/{n}#issuecomment-{id} | gh api repos/{o}/{r}/issues/comments/{id} |
/actions/runs/{run_id} | gh api repos/{o}/{r}/actions/runs/{run_id} |
/actions/runs/{run_id}/job/{job_id} | gh api repos/{o}/{r}/actions/jobs/{job_id} |
/blob/{ref}/{path} | gh api repos/{o}/{r}/contents/{path}?ref={ref} |
/tree/{ref}/{path} | gh api repos/{o}/{r}/contents/{path}?ref={ref} |
/commit/{sha} | gh api repos/{o}/{r}/commits/{sha} |
/compare/{base}...{head} | gh api repos/{o}/{r}/compare/{base}...{head} |
Extract owner, repo, and resource from GitHub URLs:
https://github.com/{owner}/{repo}/pull/{number}
https://github.com/{owner}/{repo}/issues/{number}
https://github.com/{owner}/{repo}/blob/{ref}/{path}
https://github.com/{owner}/{repo}/tree/{ref}/{path}
https://github.com/{owner}/{repo}/commit/{sha}
https://github.com/{owner}/{repo}/compare/{base}...{head}
Fragment extraction (when present):
#pullrequestreview-{id} → Review ID#discussion_r{id} → Discussion comment ID#issuecomment-{id} → Issue comment IDFetching GitHub HTML is catastrophic for your context window:
| Method | Response Size | Token Cost | Time | Usability |
|---|---|---|---|---|
| ❌ HTML fetch | 5-10 MB | 1-2.5M tokens | 10-30s | UNUSABLE - HTML noise, no structured data |
| ✅ API call | 1-50 KB | 250-12K tokens | 0.5-2s | Clean JSON with exactly what you need |
| ✅ Script | 1-50 KB | 250-12K tokens | 0.5-2s | Structured output, error handling |
Impact: 100-1000x reduction in token consumption.
If you fetch GitHub HTML directly, you will:
ALWAYS use this skill when you see a GitHub URL.
Input: "https://github.com/rjmurillo/ai-agents/pull/735/checks?check_run_id=59355308734"
Action:
1. Parse: owner=rjmurillo, repo=ai-agents, pr=735, type=checks
2. Route: python3 .claude/skills/github/scripts/pr/get_pr_checks.py --pull-request 735 --owner rjmurillo --repo ai-agents
Input: "https://github.com/owner/repo/pull/715/changes#r2656144507 are the graph refactoring items part of Issue 722?"
Action:
1. Extract fragment: r2656144507 (review comment ID)
2. Call: gh api "repos/owner/repo/pulls/comments/2656144507"
3. Answer user's question using the comment content
Input: "https://github.com/owner/repo/pull/715#discussion_r123 https://github.com/owner/repo/pull/715#discussion_r456"
Action:
1. Parse each URL
2. Batch: gh api "repos/owner/repo/pulls/comments/123"
3. Batch: gh api "repos/owner/repo/pulls/comments/456"
Input: "analyze https://github.com/modu-ai/moai-adk for insights"
Action:
1. Use deepwiki MCP or gh api to get repo info
2. Call: gh api "repos/modu-ai/moai-adk" (NOT web_fetch!)
Input: "https://github.com/owner/repo/actions/runs/20675405338/job/59362398542?pr=740"
Action:
1. Extract: run_id=20675405338, job_id=59362398542
2. Call: gh api "repos/owner/repo/actions/jobs/59362398542"
Input: "Review this: https://github.com/owner/repo/pull/123"
Action:
python3 .claude/skills/github/scripts/pr/get_pr_context.py --pull-request 123 --owner owner --repo repo
Input: "would a hook like https://github.com/ruvnet/claude-flow/blob/main/.claude/settings.json help?"
Action:
gh api "repos/ruvnet/claude-flow/contents/.claude/settings.json?ref=main"
| ❌ NEVER | Why It's Catastrophic | ✅ Do This Instead |
|---|---|---|
web_fetch("https://github.com/...") | 5-10 MB HTML, 1-2.5M tokens WASTED | Parse URL, use script or gh api |
curl https://github.com/... | Same catastrophic result | Use gh CLI for authentication + JSON |
fetch / requests.get on GitHub URLs | Same catastrophic result | Route through this skill |
gh pr view without --json | Unstructured text output | Use get_pr_context.py for structured JSON |
| Fetching full page to find one comment | Fetches 5MB to read 500 bytes | Extract fragment ID (#discussion_r...), call specific endpoint |
| Ignoring GitHub URLs in user input | User expects you to understand the link | ALWAYS parse and route |
| Hardcoding owner/repo in commands | Breaks when user shares fork/different repo | Extract from URL path |
RED FLAG PHRASES - If you're about to do any of these, STOP:
These indicate you're about to waste millions of tokens. Use this skill instead.
Routes GitHub URLs to appropriate API access methods with CWE-78 command injection protection.
python3 .claude/skills/github-url-intercept/scripts/test_url_routing.py <github-url>
| Skill | When to Use |
|---|---|
| github | Full PR/issue operations (mutations, reactions, labels) |
| pr-comment-responder | Systematic PR review response |
Before processing any GitHub URL:
Success: true (for scripts)Activates when the user asks about AI prompts, needs prompt templates, wants to search for prompts, or mentions prompts.chat. Use for discovering, retrieving, and improving prompts.
Search, retrieve, and install Agent Skills from the prompts.chat registry using MCP tools. Use when the user asks to find skills, browse skill catalogs, install a skill for Claude, or extend Claude's capabilities with reusable AI agent components.
Creating algorithmic art using p5.js with seeded randomness and interactive parameter exploration. Use this when users request creating art using code, generative art, algorithmic art, flow fields, or particle systems. Create original algorithmic art rather than copying existing artists' work to avoid copyright violations.