[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71QBYD8VEJME2S6DH7F5KSG":3,"skill-same:01M71QBYD8VEJME2S6DH7F5KSG":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":61,"commitSha":62,"skillDirectory":63,"forksCount":13,"repositoryHtmlUrl":64,"repositoryHomepageUrl":6,"ownerHtmlUrl":65,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":66,"install":67,"resources":80},"01M71QBYD8VEJME2S6DH7F5KSG","github-issues",null,"Create, triage, label, assign GitHub issues via gh or REST.","gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN","gjbvsjjvgm-sketch","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F278511911?v=4","01M71F3JXKZQ70H2KCHHTXKZDA","01M71PENEVFN19DBZFNHJPCHQ7",0,"MIT","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fgithub\u002Fgithub-issues\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"github issues","issues","github","project-management","assign","via","project","bug-tracking","bug","management","tracking","hermes agent","hermes","gh","REST","create","pr","auth","workflow","triage","2026-11-10 13:02:02",false,"---\nname: github-issues\ndescription: \"Create, triage, label, assign GitHub issues via gh or REST.\"\nversion: 1.1.0\nauthor: Hermes Agent\nlicense: MIT\nmetadata:\n  hermes:\n    tags: [GitHub, Issues, Project-Management, Bug-Tracking, Triage]\n    related_skills: [github-auth, github-pr-workflow]\n---\n\n# GitHub Issues Management\n\nCreate, search, triage, and manage GitHub issues. Each section shows `gh` first, then the `curl` fallback.\n\n## Prerequisites\n\n- Authenticated with GitHub (see `github-auth` skill)\n- Inside a git repo with a GitHub remote, or specify the repo explicitly\n\n### Setup\n\n```bash\nif command -v gh &>\u002Fdev\u002Fnull && gh auth status &>\u002Fdev\u002Fnull; then\n  AUTH=\"gh\"\nelse\n  AUTH=\"git\"\n  if [ -z \"$GITHUB_TOKEN\" ]; then\n    if [ -f ~\u002F.hermes\u002F.env ] && grep -q \"^GITHUB_TOKEN=\" ~\u002F.hermes\u002F.env; then\n      GITHUB_TOKEN=$(grep \"^GITHUB_TOKEN=\" ~\u002F.hermes\u002F.env | head -1 | cut -d= -f2 | tr -d '\\n\\r')\n    elif grep -q \"github.com\" ~\u002F.git-credentials 2>\u002Fdev\u002Fnull; then\n      GITHUB_TOKEN=$(grep \"github.com\" ~\u002F.git-credentials 2>\u002Fdev\u002Fnull | head -1 | sed 's|https:\u002F\u002F[^:]*:\\([^@]*\\)@.*|\\1|')\n    fi\n  fi\nfi\n\nREMOTE_URL=$(git remote get-url origin)\nOWNER_REPO=$(echo \"$REMOTE_URL\" | sed -E 's|.*github\\.com[:\u002F]||; s|\\.git$||')\nOWNER=$(echo \"$OWNER_REPO\" | cut -d\u002F -f1)\nREPO=$(echo \"$OWNER_REPO\" | cut -d\u002F -f2)\n```\n\n---\n\n## 1. Viewing Issues\n\n**With gh:**\n\n```bash\ngh issue list\ngh issue list --state open --label \"bug\"\ngh issue list --assignee @me\ngh issue list --search \"authentication error\" --state all\ngh issue view 42\n```\n\n**With curl:**\n\n```bash\n# List open issues\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?state=open&per_page=20\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin):\n    if 'pull_request' not in i:  # GitHub API returns PRs in \u002Fissues too\n        labels = ', '.join(l['name'] for l in i['labels'])\n        print(f\\\"#{i['number']:5}  {i['state']:6}  {labels:30}  {i['title']}\\\")\"\n\n# Filter by label\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?state=open&labels=bug&per_page=20\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin):\n    if 'pull_request' not in i:\n        print(f\\\"#{i['number']}  {i['title']}\\\")\"\n\n# View a specific issue\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42 \\\n  | python3 -c \"\nimport sys, json\ni = json.load(sys.stdin)\nlabels = ', '.join(l['name'] for l in i['labels'])\nassignees = ', '.join(a['login'] for a in i['assignees'])\nprint(f\\\"#{i['number']}: {i['title']}\\\")\nprint(f\\\"State: {i['state']}  Labels: {labels}  Assignees: {assignees}\\\")\nprint(f\\\"Author: {i['user']['login']}  Created: {i['created_at']}\\\")\nprint(f\\\"\\n{i['body']}\\\")\"\n\n# Search issues\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Fsearch\u002Fissues?q=authentication+error+repo:$OWNER\u002F$REPO\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin)['items']:\n    print(f\\\"#{i['number']}  {i['state']:6}  {i['title']}\\\")\"\n```\n\n## 2. Creating Issues\n\n**With gh:**\n\n```bash\ngh issue create \\\n  --title \"Login redirect ignores ?next= parameter\" \\\n  --body \"## Description\nAfter logging in, users always land on \u002Fdashboard.\n\n## Steps to Reproduce\n1. Navigate to \u002Fsettings while logged out\n2. Get redirected to \u002Flogin?next=\u002Fsettings\n3. Log in\n4. Actual: redirected to \u002Fdashboard (should go to \u002Fsettings)\n\n## Expected Behavior\nRespect the ?next= query parameter.\" \\\n  --label \"bug,backend\" \\\n  --assignee \"username\"\n```\n\n**With curl:**\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues \\\n  -d '{\n    \"title\": \"Login redirect ignores ?next= parameter\",\n    \"body\": \"## Description\\nAfter logging in, users always land on \u002Fdashboard.\\n\\n## Steps to Reproduce\\n1. Navigate to \u002Fsettings while logged out\\n2. Get redirected to \u002Flogin?next=\u002Fsettings\\n3. Log in\\n4. Actual: redirected to \u002Fdashboard\\n\\n## Expected Behavior\\nRespect the ?next= query parameter.\",\n    \"labels\": [\"bug\", \"backend\"],\n    \"assignees\": [\"username\"]\n  }'\n```\n\n### Bug Report Template\n\n```\n## Bug Description\n\u003CWhat's happening>\n\n## Steps to Reproduce\n1. \u003Cstep>\n2. \u003Cstep>\n\n## Expected Behavior\n\u003CWhat should happen>\n\n## Actual Behavior\n\u003CWhat actually happens>\n\n## Environment\n- OS: \u003Cos>\n- Version: \u003Cversion>\n```\n\n### Feature Request Template\n\n```\n## Feature Description\n\u003CWhat you want>\n\n## Motivation\n\u003CWhy this would be useful>\n\n## Proposed Solution\n\u003CHow it could work>\n\n## Alternatives Considered\n\u003COther approaches>\n```\n\n## 3. Managing Issues\n\n### Add\u002FRemove Labels\n\n**With gh:**\n\n```bash\ngh issue edit 42 --add-label \"priority:high,bug\"\ngh issue edit 42 --remove-label \"needs-triage\"\n```\n\n**With curl:**\n\n```bash\n# Add labels\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Flabels \\\n  -d '{\"labels\": [\"priority:high\", \"bug\"]}'\n\n# Remove a label\ncurl -s -X DELETE \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Flabels\u002Fneeds-triage\n\n# List available labels in the repo\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Flabels \\\n  | python3 -c \"\nimport sys, json\nfor l in json.load(sys.stdin):\n    print(f\\\"  {l['name']:30}  {l.get('description', '')}\\\")\"\n```\n\n### Assignment\n\n**With gh:**\n\n```bash\ngh issue edit 42 --add-assignee username\ngh issue edit 42 --add-assignee @me\n```\n\n**With curl:**\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Fassignees \\\n  -d '{\"assignees\": [\"username\"]}'\n```\n\n### Commenting\n\n**With gh:**\n\n```bash\ngh issue comment 42 --body \"Investigated — root cause is in auth middleware. Working on a fix.\"\n```\n\n**With curl:**\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Fcomments \\\n  -d '{\"body\": \"Investigated — root cause is in auth middleware. Working on a fix.\"}'\n```\n\n### Closing and Reopening\n\n**With gh:**\n\n```bash\ngh issue close 42\ngh issue close 42 --reason \"not planned\"\ngh issue reopen 42\n```\n\n**With curl:**\n\n```bash\n# Close\ncurl -s -X PATCH \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42 \\\n  -d '{\"state\": \"closed\", \"state_reason\": \"completed\"}'\n\n# Reopen\ncurl -s -X PATCH \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42 \\\n  -d '{\"state\": \"open\"}'\n```\n\n### Linking Issues to PRs\n\nIssues are automatically closed when a PR merges with the right keywords in the body:\n\n```\nCloses #42\nFixes #42\nResolves #42\n```\n\nTo create a branch from an issue:\n\n**With gh:**\n\n```bash\ngh issue develop 42 --checkout\n```\n\n**With git (manual equivalent):**\n\n```bash\ngit checkout main && git pull origin main\ngit checkout -b fix\u002Fissue-42-login-redirect\n```\n\n## 4. Issue Triage Workflow\n\nWhen asked to triage issues:\n\n1. **List untriaged issues:**\n\n```bash\n# With gh\ngh issue list --label \"needs-triage\" --state open\n\n# With curl\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?labels=needs-triage&state=open\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin):\n    if 'pull_request' not in i:\n        print(f\\\"#{i['number']}  {i['title']}\\\")\"\n```\n\n2. **Read and categorize** each issue (view details, understand the bug\u002Ffeature)\n\n3. **Apply labels and priority** (see Managing Issues above)\n\n4. **Assign** if the owner is clear\n\n5. **Comment with triage notes** if needed\n\n## 5. Bulk Operations\n\nFor batch operations, combine API calls with shell scripting:\n\n**With gh:**\n\n```bash\n# Close all issues with a specific label\ngh issue list --label \"wontfix\" --json number --jq '.[].number' | \\\n  xargs -I {} gh issue close {} --reason \"not planned\"\n```\n\n**With curl:**\n\n```bash\n# List issue numbers with a label, then close each\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?labels=wontfix&state=open\" \\\n  | python3 -c \"import sys,json; [print(i['number']) for i in json.load(sys.stdin)]\" \\\n  | while read num; do\n    curl -s -X PATCH \\\n      -H \"Authorization: token $GITHUB_TOKEN\" \\\n      https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F$num \\\n      -d '{\"state\": \"closed\", \"state_reason\": \"not_planned\"}'\n    echo \"Closed #$num\"\n  done\n```\n\n## Quick Reference Table\n\n| Action | gh | curl endpoint |\n|--------|-----|--------------|\n| List issues | `gh issue list` | `GET \u002Frepos\u002F{o}\u002F{r}\u002Fissues` |\n| View issue | `gh issue view N` | `GET \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN` |\n| Create issue | `gh issue create ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues` |\n| Add labels | `gh issue edit N --add-label ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN\u002Flabels` |\n| Assign | `gh issue edit N --add-assignee ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN\u002Fassignees` |\n| Comment | `gh issue comment N --body ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN\u002Fcomments` |\n| Close | `gh issue close N` | `PATCH \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN` |\n| Search | `gh issue list --search \"...\"` | `GET \u002Fsearch\u002Fissues?q=...` |\n","# GitHub Issues Management\n\nCreate, search, triage, and manage GitHub issues. Each section shows `gh` first, then the `curl` fallback.\n\n## Prerequisites\n\n- Authenticated with GitHub (see `github-auth` skill)\n- Inside a git repo with a GitHub remote, or specify the repo explicitly\n\n### Setup\n\n```bash\nif command -v gh &>\u002Fdev\u002Fnull && gh auth status &>\u002Fdev\u002Fnull; then\n  AUTH=\"gh\"\nelse\n  AUTH=\"git\"\n  if [ -z \"$GITHUB_TOKEN\" ]; then\n    if [ -f ~\u002F.hermes\u002F.env ] && grep -q \"^GITHUB_TOKEN=\" ~\u002F.hermes\u002F.env; then\n      GITHUB_TOKEN=$(grep \"^GITHUB_TOKEN=\" ~\u002F.hermes\u002F.env | head -1 | cut -d= -f2 | tr -d '\\n\\r')\n    elif grep -q \"github.com\" ~\u002F.git-credentials 2>\u002Fdev\u002Fnull; then\n      GITHUB_TOKEN=$(grep \"github.com\" ~\u002F.git-credentials 2>\u002Fdev\u002Fnull | head -1 | sed 's|https:\u002F\u002F[^:]*:\\([^@]*\\)@.*|\\1|')\n    fi\n  fi\nfi\n\nREMOTE_URL=$(git remote get-url origin)\nOWNER_REPO=$(echo \"$REMOTE_URL\" | sed -E 's|.*github\\.com[:\u002F]||; s|\\.git$||')\nOWNER=$(echo \"$OWNER_REPO\" | cut -d\u002F -f1)\nREPO=$(echo \"$OWNER_REPO\" | cut -d\u002F -f2)\n```\n\n---\n\n## 1. Viewing Issues\n\n**With gh:**\n\n```bash\ngh issue list\ngh issue list --state open --label \"bug\"\ngh issue list --assignee @me\ngh issue list --search \"authentication error\" --state all\ngh issue view 42\n```\n\n**With curl:**\n\n```bash\n# List open issues\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?state=open&per_page=20\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin):\n    if 'pull_request' not in i:  # GitHub API returns PRs in \u002Fissues too\n        labels = ', '.join(l['name'] for l in i['labels'])\n        print(f\\\"#{i['number']:5}  {i['state']:6}  {labels:30}  {i['title']}\\\")\"\n\n# Filter by label\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?state=open&labels=bug&per_page=20\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin):\n    if 'pull_request' not in i:\n        print(f\\\"#{i['number']}  {i['title']}\\\")\"\n\n# View a specific issue\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42 \\\n  | python3 -c \"\nimport sys, json\ni = json.load(sys.stdin)\nlabels = ', '.join(l['name'] for l in i['labels'])\nassignees = ', '.join(a['login'] for a in i['assignees'])\nprint(f\\\"#{i['number']}: {i['title']}\\\")\nprint(f\\\"State: {i['state']}  Labels: {labels}  Assignees: {assignees}\\\")\nprint(f\\\"Author: {i['user']['login']}  Created: {i['created_at']}\\\")\nprint(f\\\"\\n{i['body']}\\\")\"\n\n# Search issues\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Fsearch\u002Fissues?q=authentication+error+repo:$OWNER\u002F$REPO\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin)['items']:\n    print(f\\\"#{i['number']}  {i['state']:6}  {i['title']}\\\")\"\n```\n\n## 2. Creating Issues\n\n**With gh:**\n\n```bash\ngh issue create \\\n  --title \"Login redirect ignores ?next= parameter\" \\\n  --body \"## Description\nAfter logging in, users always land on \u002Fdashboard.\n\n## Steps to Reproduce\n1. Navigate to \u002Fsettings while logged out\n2. Get redirected to \u002Flogin?next=\u002Fsettings\n3. Log in\n4. Actual: redirected to \u002Fdashboard (should go to \u002Fsettings)\n\n## Expected Behavior\nRespect the ?next= query parameter.\" \\\n  --label \"bug,backend\" \\\n  --assignee \"username\"\n```\n\n**With curl:**\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues \\\n  -d '{\n    \"title\": \"Login redirect ignores ?next= parameter\",\n    \"body\": \"## Description\\nAfter logging in, users always land on \u002Fdashboard.\\n\\n## Steps to Reproduce\\n1. Navigate to \u002Fsettings while logged out\\n2. Get redirected to \u002Flogin?next=\u002Fsettings\\n3. Log in\\n4. Actual: redirected to \u002Fdashboard\\n\\n## Expected Behavior\\nRespect the ?next= query parameter.\",\n    \"labels\": [\"bug\", \"backend\"],\n    \"assignees\": [\"username\"]\n  }'\n```\n\n### Bug Report Template\n\n```\n## Bug Description\n\u003CWhat's happening>\n\n## Steps to Reproduce\n1. \u003Cstep>\n2. \u003Cstep>\n\n## Expected Behavior\n\u003CWhat should happen>\n\n## Actual Behavior\n\u003CWhat actually happens>\n\n## Environment\n- OS: \u003Cos>\n- Version: \u003Cversion>\n```\n\n### Feature Request Template\n\n```\n## Feature Description\n\u003CWhat you want>\n\n## Motivation\n\u003CWhy this would be useful>\n\n## Proposed Solution\n\u003CHow it could work>\n\n## Alternatives Considered\n\u003COther approaches>\n```\n\n## 3. Managing Issues\n\n### Add\u002FRemove Labels\n\n**With gh:**\n\n```bash\ngh issue edit 42 --add-label \"priority:high,bug\"\ngh issue edit 42 --remove-label \"needs-triage\"\n```\n\n**With curl:**\n\n```bash\n# Add labels\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Flabels \\\n  -d '{\"labels\": [\"priority:high\", \"bug\"]}'\n\n# Remove a label\ncurl -s -X DELETE \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Flabels\u002Fneeds-triage\n\n# List available labels in the repo\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Flabels \\\n  | python3 -c \"\nimport sys, json\nfor l in json.load(sys.stdin):\n    print(f\\\"  {l['name']:30}  {l.get('description', '')}\\\")\"\n```\n\n### Assignment\n\n**With gh:**\n\n```bash\ngh issue edit 42 --add-assignee username\ngh issue edit 42 --add-assignee @me\n```\n\n**With curl:**\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Fassignees \\\n  -d '{\"assignees\": [\"username\"]}'\n```\n\n### Commenting\n\n**With gh:**\n\n```bash\ngh issue comment 42 --body \"Investigated — root cause is in auth middleware. Working on a fix.\"\n```\n\n**With curl:**\n\n```bash\ncurl -s -X POST \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42\u002Fcomments \\\n  -d '{\"body\": \"Investigated — root cause is in auth middleware. Working on a fix.\"}'\n```\n\n### Closing and Reopening\n\n**With gh:**\n\n```bash\ngh issue close 42\ngh issue close 42 --reason \"not planned\"\ngh issue reopen 42\n```\n\n**With curl:**\n\n```bash\n# Close\ncurl -s -X PATCH \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42 \\\n  -d '{\"state\": \"closed\", \"state_reason\": \"completed\"}'\n\n# Reopen\ncurl -s -X PATCH \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F42 \\\n  -d '{\"state\": \"open\"}'\n```\n\n### Linking Issues to PRs\n\nIssues are automatically closed when a PR merges with the right keywords in the body:\n\n```\nCloses #42\nFixes #42\nResolves #42\n```\n\nTo create a branch from an issue:\n\n**With gh:**\n\n```bash\ngh issue develop 42 --checkout\n```\n\n**With git (manual equivalent):**\n\n```bash\ngit checkout main && git pull origin main\ngit checkout -b fix\u002Fissue-42-login-redirect\n```\n\n## 4. Issue Triage Workflow\n\nWhen asked to triage issues:\n\n1. **List untriaged issues:**\n\n```bash\n# With gh\ngh issue list --label \"needs-triage\" --state open\n\n# With curl\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?labels=needs-triage&state=open\" \\\n  | python3 -c \"\nimport sys, json\nfor i in json.load(sys.stdin):\n    if 'pull_request' not in i:\n        print(f\\\"#{i['number']}  {i['title']}\\\")\"\n```\n\n2. **Read and categorize** each issue (view details, understand the bug\u002Ffeature)\n\n3. **Apply labels and priority** (see Managing Issues above)\n\n4. **Assign** if the owner is clear\n\n5. **Comment with triage notes** if needed\n\n## 5. Bulk Operations\n\nFor batch operations, combine API calls with shell scripting:\n\n**With gh:**\n\n```bash\n# Close all issues with a specific label\ngh issue list --label \"wontfix\" --json number --jq '.[].number' | \\\n  xargs -I {} gh issue close {} --reason \"not planned\"\n```\n\n**With curl:**\n\n```bash\n# List issue numbers with a label, then close each\ncurl -s \\\n  -H \"Authorization: token $GITHUB_TOKEN\" \\\n  \"https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues?labels=wontfix&state=open\" \\\n  | python3 -c \"import sys,json; [print(i['number']) for i in json.load(sys.stdin)]\" \\\n  | while read num; do\n    curl -s -X PATCH \\\n      -H \"Authorization: token $GITHUB_TOKEN\" \\\n      https:\u002F\u002Fapi.github.com\u002Frepos\u002F$OWNER\u002F$REPO\u002Fissues\u002F$num \\\n      -d '{\"state\": \"closed\", \"state_reason\": \"not_planned\"}'\n    echo \"Closed #$num\"\n  done\n```\n\n## Quick Reference Table\n\n| Action | gh | curl endpoint |\n|--------|-----|--------------|\n| List issues | `gh issue list` | `GET \u002Frepos\u002F{o}\u002F{r}\u002Fissues` |\n| View issue | `gh issue view N` | `GET \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN` |\n| Create issue | `gh issue create ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues` |\n| Add labels | `gh issue edit N --add-label ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN\u002Flabels` |\n| Assign | `gh issue edit N --add-assignee ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN\u002Fassignees` |\n| Comment | `gh issue comment N --body ...` | `POST \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN\u002Fcomments` |\n| Close | `gh issue close N` | `PATCH \u002Frepos\u002F{o}\u002F{r}\u002Fissues\u002FN` |\n| Search | `gh issue list --search \"...\"` | `GET \u002Fsearch\u002Fissues?q=...` |\n",{"name":5,"author":48,"license":14,"version":49,"metadata":50,"description":7},"Hermes Agent","1.1.0",{"hermes":51},{"tags":52,"related_skills":58},[53,54,55,56,57],"GitHub","Issues","Project-Management","Bug-Tracking","Triage",[59,60],"github-auth","github-pr-workflow","main","6746276ba18cb774853eb61b3b9399658bc9bc5c","core\u002Fskills\u002Fgithub\u002Fgithub-issues","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch","2026-04-28 17:01:03",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":79},[69,72,75],{"tool":70,"command":71},"npx","npx skills add gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN --skill github-issues",{"tool":73,"command":74},"bunx","bunx skills add gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN --skill github-issues",{"tool":76,"command":77},"pnpm","pnpm dlx skills add gjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN --skill github-issues","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fgithub\u002Fgithub-issues\u002FSKILL.md",true,[81,87],{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"templates\u002Fbug-report.md","REFERENCE","参考文档",469,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fgithub\u002Fgithub-issues\u002Ftemplates\u002Fbug-report.md",{"path":88,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":89,"sourceHtmlUrl":90},"templates\u002Ffeature-request.md",598,"https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fgithub\u002Fgithub-issues\u002Ftemplates\u002Ffeature-request.md",[92,132,157,173,190,209],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":112,"publishedAt":43},"01M71QG27G1R2H2ZWEG4S0WTZT","writing-plans","Write implementation plans: bite-sized tasks, paths, code.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fwriting-plans\u002FSKILL.md",[98,101,104,109],{"categoryNo":99,"categoryName":100,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000015","视觉设计",{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",{"categoryNo":110,"categoryName":111,"taxonomyType":107,"taxonomyTypeDesc":108},"01JBSEEDCAT000000000000036","内容创作者",[113,114,115,116,117,118,119,41,120,121,122,123,124,125,126,127,128,129,130,131],"writing","writing plans","plans","test-driven","test-driven-development","superpowers","design","code","tasks","subagent","code-review","review","documentation","write","paths","planning","development","test","implementation",{"skillNo":133,"name":117,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":143,"publishedAt":43},"01M71QFZYRTJXMAE551MRAKZ14","TDD: enforce RED-GREEN-REFACTOR, tests before code.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Ftest-driven-development\u002FSKILL.md",[137,140],{"categoryNo":138,"categoryName":139,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000007","代码审查",{"categoryNo":141,"categoryName":142,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000008","测试与质量",[144,129,130,145,146,147,148,118,113,149,120,122,150,151,152,153,154,115,155,156],"test driven development","driven","green","red-green-refactor","testing","debugging","systematic","refactor","systematic-debugging","enforce","tests","tdd","quality",{"skillNo":158,"name":152,"nameZh":6,"description":159,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":160,"categories":161,"keywords":163,"publishedAt":43},"01M71QFWR5Q8EYEQ6MCS3SM6MC","4-phase root cause debugging: understand bugs before fixing.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fsystematic-debugging\u002FSKILL.md",[162],{"categoryNo":141,"categoryName":142,"taxonomyType":20,"taxonomyTypeDesc":21},[164,149,150,116,165,166,117,118,113,122,167,168,129,169,115,170,130,171,172,35],"systematic debugging","problem","problem-solving","phase","bugs","root cause","root-cause","investigation","understand",{"skillNo":174,"name":175,"nameZh":6,"description":176,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":177,"categories":178,"keywords":182,"publishedAt":43},"01M71QFS9S04MD8JP747W5WM0N","subagent-driven-development","Execute plans via delegate_task subagents (2-stage review).","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fsubagent-driven-development\u002FSKILL.md",[179,180,181],{"categoryNo":102,"categoryName":103,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":110,"categoryName":111,"taxonomyType":107,"taxonomyTypeDesc":108},[183,122,129,145,116,117,184,185,118,113,41,120,123,124,186,187,115,188,189,130],"subagent driven development","delegate","delegation","subagents","parallel","stage","task",{"skillNo":191,"name":192,"nameZh":6,"description":193,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":194,"categories":195,"keywords":198,"publishedAt":43},"01M71QFQ1DBCVAZ511MXFE6T2V","requesting-code-review","Pre-commit review: security scan, quality gates, auto-fix.","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Frequesting-code-review\u002FSKILL.md",[196,197],{"categoryNo":138,"categoryName":139,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},[199,200,120,124,116,117,201,202,118,203,113,204,205,122,123,206,207,129,208,115],"code review","requesting code review","fix","auto-fix","auto","security scan","commit","verification","security","scan",{"skillNo":210,"name":211,"nameZh":6,"description":212,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":213,"categories":214,"keywords":216,"publishedAt":43},"01M71QFM7KWM540YR67FRN807Q","python-debugpy","Debug Python: pdb REPL + debugpy remote (DAP).","https:\u002F\u002Fgithub.com\u002Fgjbvsjjvgm-sketch\u002FWORM_V2_SOVEREIGN\u002Fblob\u002Fmain\u002Fcore\u002Fskills\u002Fsoftware-development\u002Fpython-debugpy\u002FSKILL.md",[215],{"categoryNo":105,"categoryName":106,"taxonomyType":107,"taxonomyTypeDesc":108},[217,218,219,220,221,222,223,224,149,150,225,226,227,152,228,229,230,231,35,232],"debugpy","python debugpy","python","dap","inspect","post-mortem","pdb","remote","debugger","node","commands","debug","post","breakpoints","node-inspect","tui"]