hezaohezao/github-issues
Create, triage, label, assign GitHub issues via gh or REST.
npx skills add https://github.com/HezaoHezao/poirot --skill github-issues
Create, search, triage, and manage GitHub issues. Each section shows gh first,
then curl fallback.
github-auth skill)if command -v gh &>/dev/null && gh auth status &>/dev/null; then
AUTH="gh"
else
AUTH="curl"
fi
REMOTE_URL=$(git remote get-url origin)
OWNER_REPO=$(echo "$REMOTE_URL" | sed -E 's|.*github\.com[:/]||; s|\.git$||')
OWNER=$(echo "$OWNER_REPO" | cut -d/ -f1)
REPO=$(echo "$OWNER_REPO" | cut -d/ -f2)
# With gh
gh issue list --state open --limit 20
gh issue view 42
# With curl
curl -s "https://api.github.com/repos/$OWNER/$REPO/issues?state=open&per_page=20" | python3 -c "
import sys, json
for i in json.load(sys.stdin):
print(f'#{i[\"number\"]:4d} [{i[\"state\"]:6s}] {i[\"title\"][:60]}')
"
# With gh (interactive editor)
gh issue create
# With gh (inline)
gh issue create --title "Bug: login fails on Safari" --body "Description..."
# With curl
curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues \
-d '{"title":"Bug: login fails","body":"Description","labels":["bug"]}'
# Search within repo
gh issue list --search "login error" --state all
# Search across GitHub
gh search issues "is:issue is:open repo:$OWNER/$REPO label:bug"
# With curl (GitHub Search API)
curl -s "https://api.github.com/search/issues?q=repo:$OWNER/$REPO+label:bug+state:open" | python3 -c "
import sys, json
r = json.load(sys.stdin)
print(f'Total: {r[\"total_count\"]}')
for i in r['items']:
print(f'#{i[\"number\"]:4d} {i[\"title\"][:60]}')
"
# List labels
gh label list
# Create label
gh label create "priority-high" --color "D73A4A" --description "High priority"
# Add label to issue
gh issue edit 42 --add-label "priority-high"
# With curl
curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/labels \
-d '{"labels":["priority-high"]}'
# With gh
gh issue edit 42 --add-assignee username
# With curl
curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/assignees \
-d '{"assignees":["username"]}'
# With gh
gh issue comment 42 --body "Can you reproduce with the latest version?"
# With curl
curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/comments \
-d '{"body":"Can you reproduce with the latest version?"}'
# With gh
gh issue close 42
gh issue reopen 42
# With curl
curl -s -X PATCH \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42 \
-d '{"state":"closed"}'
# List untriaged issues (no labels)
gh issue list --state open --search "no:label"
# Bulk add labels
for num in 10 11 12 13; do
gh issue edit $num --add-label "triaged"
done
# List issues assigned to you
gh issue list --assignee @me --state open
with pull_request field: if 'pull_request' not in i.
use token.
# (e.g. D73A4A).Take hezaohezao/github-issues from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.