Every new repository starts with ten labels: accessibility, bug, documentation, duplicate, enhancement, good first issue, help wanted, invalid, question and wontfix. They describe what an issue is. A useful taxonomy adds a few orthogonal dimensions, each with a prefix so they sort together: a status that triage clears, a priority, and an area of the code. Keep each dimension small.
while IFS='|' read -r name color desc; do
gh label create "$name" --color "$color" --description "$desc"
done <<'EOF'
needs triage|FBCA04|New, not yet reviewed
priority: high|D93F0B|Do this next
priority: low|C5DEF5|Nice to have
area: api|1D76DB|REST API and database
area: catalog|5319E7|The HTML catalog page
area: ops|0E8A16|CI, containers and deployment
EOF
gh issue edit 1 --add-label "area: api,priority: high"
gh issue edit 3 --add-label "area: ops,priority: high"Output
✓ Label "needs triage" created in binarybehemoth/booknest ✓ Label "priority: high" created in binarybehemoth/booknest ... ✓ Label "area: ops" created in binarybehemoth/booknest https://github.com/binarybehemoth/booknest/issues/1 https://github.com/binarybehemoth/booknest/issues/3
Issues #2, #4 and #5 received their area: labels the same way, and gh 29 issue list --label "priority: high" now answers "what next?". Colors are six hex digits without #. Labels belong to one repository; gh label clone copies a set to another. Organizations also get issue types (Bug, Feature, Task), which move the "what" dimension out of labels altogether.