📄 SKILL.md

← Vault

name: github-issues

description: Create, manage, triage, and close GitHub issues. Search existing issues, add labels, assign people, and link to PRs. Works with gh CLI or falls back to git + GitHub REST API via curl.

version: 1.1.0

author: Hermes Agent

license: MIT

metadata:

hermes:

tags: [GitHub, Issues, Project-Management, Bug-Tracking, Triage]

related_skills: [github-auth, github-pr-workflow]


GitHub Issues Management

Create, search, triage, and manage GitHub issues. Each section shows gh first, then the curl fallback.

Prerequisites

`

Feature Request Template

`

Feature Description

Motivation

Proposed Solution

Alternatives Considered

`

3. Managing Issues

Add/Remove Labels

With gh:

`bash

gh issue edit 42 --add-label "priority:high,bug"

gh issue edit 42 --remove-label "needs-triage"

`

With curl:

`bash

Add labels

curl -s -X POST \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/42/labels \

-d '{"labels": ["priority:high", "bug"]}'

Remove a label

curl -s -X DELETE \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/42/labels/needs-triage

List available labels in the repo

curl -s \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/labels \

| python3 -c "

import sys, json

for l in json.load(sys.stdin):

print(f\" {l['name']:30} {l.get('description', '')}\")"

`

Assignment

With gh:

`bash

gh issue edit 42 --add-assignee username

gh issue edit 42 --add-assignee @me

`

With curl:

`bash

curl -s -X POST \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/42/assignees \

-d '{"assignees": ["username"]}'

`

Commenting

With gh:

`bash

gh issue comment 42 --body "Investigated — root cause is in auth middleware. Working on a fix."

`

With curl:

`bash

curl -s -X POST \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/42/comments \

-d '{"body": "Investigated — root cause is in auth middleware. Working on a fix."}'

`

Closing and Reopening

With gh:

`bash

gh issue close 42

gh issue close 42 --reason "not planned"

gh issue reopen 42

`

With curl:

`bash

Close

curl -s -X PATCH \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/42 \

-d '{"state": "closed", "state_reason": "completed"}'

Reopen

curl -s -X PATCH \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/42 \

-d '{"state": "open"}'

`

Linking Issues to PRs

Issues are automatically closed when a PR merges with the right keywords in the body:

`

Closes #42

Fixes #42

Resolves #42

`

To create a branch from an issue:

With gh:

`bash

gh issue develop 42 --checkout

`

With git (manual equivalent):

`bash

git checkout main && git pull origin main

git checkout -b fix/issue-42-login-redirect

`

4. Issue Triage Workflow

When asked to triage issues:

1. List untriaged issues:

`bash

With gh

gh issue list --label "needs-triage" --state open

With curl

curl -s \

-H "Authorization: token $GITHUB_TOKEN" \

"https://api.github.com/repos/$OWNER/$REPO/issues?labels=needs-triage&state=open" \

| python3 -c "

import sys, json

for i in json.load(sys.stdin):

if 'pull_request' not in i:

print(f\"#{i['number']} {i['title']}\")"

`

2. Read and categorize each issue (view details, understand the bug/feature)

3. Apply labels and priority (see Managing Issues above)

4. Assign if the owner is clear

5. Comment with triage notes if needed

5. Bulk Operations

For batch operations, combine API calls with shell scripting:

With gh:

`bash

Close all issues with a specific label

gh issue list --label "wontfix" --json number --jq '.[].number' | \

xargs -I {} gh issue close {} --reason "not planned"

`

With curl:

`bash

List issue numbers with a label, then close each

curl -s \

-H "Authorization: token $GITHUB_TOKEN" \

"https://api.github.com/repos/$OWNER/$REPO/issues?labels=wontfix&state=open" \

| python3 -c "import sys,json; [print(i['number']) for i in json.load(sys.stdin)]" \

| while read num; do

curl -s -X PATCH \

-H "Authorization: token $GITHUB_TOKEN" \

https://api.github.com/repos/$OWNER/$REPO/issues/$num \

-d '{"state": "closed", "state_reason": "not_planned"}'

echo "Closed #$num"

done

`

Quick Reference Table

Actionghcurl endpoint
---------------------------
List issuesgh issue listGET /repos/{o}/{r}/issues
View issuegh issue view NGET /repos/{o}/{r}/issues/N
Create issuegh issue create ...POST /repos/{o}/{r}/issues
Add labelsgh issue edit N --add-label ...POST /repos/{o}/{r}/issues/N/labels
Assigngh issue edit N --add-assignee ...POST /repos/{o}/{r}/issues/N/assignees
Commentgh issue comment N --body ...POST /repos/{o}/{r}/issues/N/comments
Closegh issue close NPATCH /repos/{o}/{r}/issues/N
Searchgh issue list --search "..."GET /search/issues?q=...