[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M71HBDZRDRW8S5EBW6FZR45M":3,"skill-same:01M71HBDZRDRW8S5EBW6FZR45M":92},{"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":64,"repositoryHtmlUrl":65,"repositoryHomepageUrl":6,"ownerHtmlUrl":66,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":67,"install":68,"resources":81},"01M71HBDZRDRW8S5EBW6FZR45M","github-issues",null,"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.","0xzgbot\u002Fforge-nps-v01","0xzgbot","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F271900281?v=4","01M71GXWAFRXXJSJE3HBCVDKZY","01M71GXWBFQYRJK7M8RM6BDP0X",6,"MIT","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fprofiles\u002Flive\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","github","issues","add","gh cli","bug-tracking","git","bug","close","cli","create","project-management","api","workflow","people","labels","search","project","auth","back","2026-11-10 10:12:30",false,"---\nname: github-issues\ndescription: 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.\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","master","a76a61826887171cb38ce217ae85643d5d7685d1","hermes_home\u002Fprofiles\u002Flive\u002Fskills\u002Fgithub\u002Fgithub-issues",2,"https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01","https:\u002F\u002Fgithub.com\u002F0xzgbot","2026-08-31 09:13:28",{"source":8,"skillName":5,"commands":69,"prompt":79,"zipAvailable":80},[70,73,76],{"tool":71,"command":72},"npx","npx skills add 0xzgbot\u002Fforge-nps-v01 --skill github-issues",{"tool":74,"command":75},"bunx","bunx skills add 0xzgbot\u002Fforge-nps-v01 --skill github-issues",{"tool":77,"command":78},"pnpm","pnpm dlx skills add 0xzgbot\u002Fforge-nps-v01 --skill github-issues","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fprofiles\u002Flive\u002Fskills\u002Fgithub\u002Fgithub-issues\u002FSKILL.md",true,[82,88],{"path":83,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":86,"sourceHtmlUrl":87},"templates\u002Fbug-report.md","REFERENCE","参考文档",469,"https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fprofiles\u002Flive\u002Fskills\u002Fgithub\u002Fgithub-issues\u002Ftemplates\u002Fbug-report.md",{"path":89,"resourceType":84,"resourceTypeDesc":85,"sizeBytes":90,"sourceHtmlUrl":91},"templates\u002Ffeature-request.md",598,"https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fprofiles\u002Flive\u002Fskills\u002Fgithub\u002Fgithub-issues\u002Ftemplates\u002Ffeature-request.md",[93,106,123,137,148,160],{"skillNo":94,"name":95,"nameZh":6,"description":96,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":97,"categories":98,"keywords":99,"publishedAt":43},"01M71J5TFCV7K97773JYZE7ET8","yuanbao","Yuanbao (元宝) groups: @mention users, query info\u002Fmembers.","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fyuanbao\u002FSKILL.md",[],[95,100,101,102,103,104,105],"groups","at","info","users","query","group",{"skillNo":107,"name":108,"nameZh":6,"description":109,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":110,"categories":111,"keywords":116,"publishedAt":43},"01M71J5QR69MCT5J8P3B4Y9ZHA","workflow-ltx-i2v","Use when the task involves workflow ltx i2v. DESCRIPTION.","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fworkflow_ltx_i2v\u002FSKILL.md",[112,115],{"categoryNo":113,"categoryName":114,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[117,118,36,119,120,121,122],"ltx","workflow ltx i2v","Production","task","when","use",{"skillNo":124,"name":125,"nameZh":6,"description":126,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":127,"categories":128,"keywords":131,"publishedAt":43},"01M71J5NYW853AAPB17VR0F7ZX","workflow-flux2-text-to-image","Flux2 Text-to-Image Workflow Reference.","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fworkflow_flux2_text_to_image\u002FSKILL.md",[129,130],{"categoryNo":113,"categoryName":114,"taxonomyType":20,"taxonomyTypeDesc":21},{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[132,133,36,134,135,119,136],"workflow flux2 text to image","image","text","reference","Text-to-Image",{"skillNo":138,"name":139,"nameZh":6,"description":140,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":141,"categories":142,"keywords":144,"publishedAt":43},"01M71J5KWY96MD6B6YC2XP6NXB","wide-angle-environmental","Use when the task involves wide angle environmental. DESCRIPTION.","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fwide_angle_environmental\u002FSKILL.md",[143],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[145,146,147,119,120,121,122],"environmental","wide","wide angle environmental",{"skillNo":149,"name":150,"nameZh":6,"description":151,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":152,"categories":153,"keywords":155,"publishedAt":43},"01M71J5DXHECTDVDF8HRP81YFY","wes-anderson-specialist","Use when the task involves wes anderson specialist. 1. EXECUTIVE SUMMARY.","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fwes_anderson_specialist\u002FSKILL.md",[154],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[156,157,158,159,121,122,120,119],"specialist","wes anderson specialist","summary","executive summary",{"skillNo":161,"name":162,"nameZh":6,"description":163,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":164,"categories":165,"keywords":167,"publishedAt":43},"01M71J5BRHX2N4BRG2VQMWJK3E","volumetric-god-rays-lighting","Use when the task involves volumetric god rays lighting. DESCRIPTION.","https:\u002F\u002Fgithub.com\u002F0xzgbot\u002Fforge-nps-v01\u002Fblob\u002Fmaster\u002Fhermes_home\u002Fskills\u002Fvolumetric_god_rays_lighting\u002FSKILL.md",[166],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[168,169,122,121,120,119],"volumetric god rays lighting","lighting"]