Перейти к основному содержимому

Github Issues

Создание, триаж, метки, назначение задач GitHub через gh или REST.

Метаданные навыка​

ИсточникВстроенный (установлен по умолчанию)
Путьskills/github/github-issues
Версия1.1.0
АвторVibeOS
ЛицензияMIT
Платформыlinux, macos, windows
ТегиGitHub, Issues, Project-Management, Bug-Tracking, Triage
Связанные навыкиgithub-auth, github-pr-workflow

Справочник: полный SKILL.md​

к сведению

Ниже приведено полное описание навыка, которое VibeOS загружает при его активации. Это те инструкции, которые видит агент, когда навык активен.

Управление задачами GitHub

Создание, поиск, триаж и управление задачами GitHub. В каждом разделе сначала показана команда gh, затем запасной вариант с curl.

Предварительные требования​

  • Аутентификация в GitHub (см. навык github-auth)
  • Нахождение внутри git-репозитория с удалённым репозиторием GitHub или явное указание репозитория

Настройка​

if command -v gh &>/dev/null && gh auth status &>/dev/null; then
AUTH="gh"
else
AUTH="git"
if [ -z "$GITHUB_TOKEN" ]; then
if _vibeos_env="${VIBEOS_HOME:-$HOME/.vibeos}/.env"; [ -f "$_vibeos_env" ] && grep -q "^GITHUB_TOKEN=" "$_vibeos_env"; then
GITHUB_TOKEN=$(grep "^GITHUB_TOKEN=" "$_vibeos_env" | head -1 | cut -d= -f2 | tr -d '\n\r')
elif grep -q "github.com" ~/.git-credentials 2>/dev/null; then
GITHUB_TOKEN=$(grep "github.com" ~/.git-credentials 2>/dev/null | head -1 | sed 's|https://[^:]*:\([^@]*\)@.*|\1|')
fi
fi
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)

1. Просмотр задач​

С помощью gh:

gh issue list
gh issue list --state open --label "bug"
gh issue list --assignee @me
gh issue list --search "authentication error" --state all
gh issue view 42

С помощью curl:

# Список открытых задач
curl -s \
-H "Authorization: token $GITHUB_TOKEN" \
"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):
if 'pull_request' not in i: # GitHub API также возвращает PR в /issues
labels = ', '.join(l['name'] for l in i['labels'])
print(f\"#{i['number']:5} {i['state']:6} {labels:30} {i['title']}\")"

# Фильтр по метке
curl -s \
-H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/repos/$OWNER/$REPO/issues?state=open&labels=bug&per_page=20" \
| python3 -c "
import sys, json
for i in json.load(sys.stdin):
if 'pull_request' not in i:
print(f\"#{i['number']} {i['title']}\")"

# Просмотр конкретной задачи
curl -s \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42 \
| python3 -c "
import sys, json
i = json.load(sys.stdin)
labels = ', '.join(l['name'] for l in i['labels'])
assignees = ', '.join(a['login'] for a in i['assignees'])
print(f\"#{i['number']}: {i['title']}\")
print(f\"Состояние: {i['state']} Метки: {labels} Назначенные: {assignees}\")
print(f\"Автор: {i['user']['login']} Создано: {i['created_at']}\")
print(f\"\n{i['body']}\")"

# Поиск задач
curl -s \
-H "Authorization: token $GITHUB_TOKEN" \
"https://api.github.com/search/issues?q=authentication+error+repo:$OWNER/$REPO" \
| python3 -c "
import sys, json
for i in json.load(sys.stdin)['items']:
print(f\"#{i['number']} {i['state']:6} {i['title']}\")"

2. Создание задач​

С помощью gh:

gh issue create \
--title "Перенаправление при входе игнорирует параметр ?next=" \
--body "## Описание
После входа пользователи всегда попадают на /dashboard.

## Шаги для воспроизведения
1. Перейти на /settings, будучи неавторизованным
2. Быть перенаправленным на /login?next=/settings
3. Войти
4. Фактически: перенаправление на /dashboard (должно быть на /settings)

## Ожидаемое поведение
Учитывать параметр запроса ?next=." \
--label "bug,backend" \
--assignee "username"

С помощью curl:

curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues \
-d '{
"title": "Перенаправление при входе игнорирует параметр ?next=",
"body": "## Описание\nПосле входа пользователи всегда попадают на /dashboard.\n\n## Шаги для воспроизведения\n1. Перейти на /settings, будучи неавторизованным\n2. Быть перенаправленным на /login?next=/settings\n3. Войти\n4. Фактически: перенаправление на /dashboard\n\n## Ожидаемое поведение\nУчитывать параметр запроса ?next=.",
"labels": ["bug", "backend"],
"assignees": ["username"]
}'

Шаблон отчёта об ошибке​

## Описание ошибки
<Что происходит>

## Шаги для воспроизведения
1. <шаг>
2. <шаг>

## Ожидаемое поведение
<Что должно происходить>

## Фактическое поведение
<Что происходит на самом деле>

## Окружение
- ОС: <ос>
- Версия: <версия>

Шаблон запроса функции​

## Описание функции
<Что вы хотите>

## Мотивация
<Почему это было бы полезно>

## Предлагаемое решение
<Как это может работать>

## Рассмотренные альтернативы
<Другие подходы>

3. Управление задачами​

Добавление/удаление меток​

С помощью gh:

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

С помощью curl:

# Добавить метки
curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/labels \
-d '{"labels": ["priority:high", "bug"]}'

# Удалить метку
curl -s -X DELETE \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/labels/needs-triage

# Список доступных меток в репозитории
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', '')}\")"

Назначение​

С помощью gh:

gh issue edit 42 --add-assignee username
gh issue edit 42 --add-assignee @me

С помощью curl:

curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/assignees \
-d '{"assignees": ["username"]}'

Комментирование​

С помощью gh:

gh issue comment 42 --body "Исследовано — коренная причина в middleware аутентификации. Работаю над исправлением."

С помощью curl:

curl -s -X POST \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42/comments \
-d '{"body": "Исследовано — коренная причина в middleware аутентификации. Работаю над исправлением."}'

Закрытие и повторное открытие​

С помощью gh:

gh issue close 42
gh issue close 42 --reason "not planned"
gh issue reopen 42

С помощью curl:

# Закрыть
curl -s -X PATCH \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42 \
-d '{"state": "closed", "state_reason": "completed"}'

# Повторно открыть
curl -s -X PATCH \
-H "Authorization: token $GITHUB_TOKEN" \
https://api.github.com/repos/$OWNER/$REPO/issues/42 \
-d '{"state": "open"}'

Связывание задач с PR​

Задачи автоматически закрываются, когда PR сливается с правильными ключевыми словами в описании:

Closes #42
Fixes #42
Resolves #42

Чтобы создать ветку из задачи:

С помощью gh:

gh issue develop 42 --checkout

С помощью git (ручной эквивалент):

git checkout main && git pull origin main
git checkout -b fix/issue-42-login-redirect

4. Рабочий процесс триажа задач​

Когда требуется провести триаж задач:

  1. Список необработанных задач:
# С помощью gh
gh issue list --label "needs-triage" --state open

# С помощью 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']}\")"
  1. Прочитать и классифицировать каждую задачу (просмотреть детали, понять ошибку/функцию)

  2. Применить метки и приоритет (см. раздел «Управление задачами» выше)

  3. Назначить, если владелец очевиден

  4. Прокомментировать с заметками по триажу при необходимости

5. Массовые операции​

Для пакетных операций комбинируйте вызовы API со скриптами оболочки:

С помощью gh:

# Закрыть все задачи с определённой меткой
gh issue list --label "wontfix" --json number --jq '.[].number' | \
xargs -I {} gh issue close {} --reason "not planned"

С помощью curl:

# Список номеров задач с меткой, затем закрыть каждую
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 "Закрыто #$num"
done

Краткая справочная таблица​

Действиеghcurl endpoint
Список задачgh issue listGET /repos/{o}/{r}/issues
Просмотр задачиgh issue view NGET /repos/{o}/{r}/issues/N
Создание задачиgh issue create ...POST /repos/{o}/{r}/issues
Добавление метокgh issue edit N --add-label ...POST /repos/{o}/{r}/issues/N/labels
Назначениеgh issue edit N --add-assignee ...POST /repos/{o}/{r}/issues/N/assignees
Комментарийgh issue comment N --body ...POST /repos/{o}/{r}/issues/N/comments
Закрытиеgh issue close NPATCH /repos/{o}/{r}/issues/N
Поискgh issue list --search "..."GET /search/issues?q=...