Issues auflisten und verwalten
Issues programmgesteuert abrufen, erstellen, mit Labels versehen und schließen.
Issues auflisten und verwalten ist eine kostenlose AI Agents-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des AI Agents-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Issues aus einem Repository abrufen
Verwenden Sie repo.get_issues(), um Issues aufzulisten. Standardmäßig werden offene Issues zurückgegeben. Übergeben Sie state='closed' oder state='all' für andere Zustände. Das Ergebnis ist eine PaginatedList — iterieren Sie darüber, um jedes Issue zu verarbeiten.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Open issues (default)
open_issues = repo.get_issues(state='open')
print(f'Open issues: {open_issues.totalCount}')
# Process first 20
for issue in open_issues[:20]:
print(f'#{issue.number}: {issue.title}')
print(f' Labels: {[l.name for l in issue.labels]}')
print(f' Assignee: {issue.assignee.login if issue.assignee else None}')
print(f' Created: {issue.created_at.date()}')Issues filtern
get_issues() unterstützt mehrere Filterparameter: state, labels, assignee, milestone, since und sort. Kombinieren Sie diese, um genau die Issues abzurufen, die Ihr Agent verarbeiten muss.
import datetime
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Issues with the 'bug' label, sorted by newest
bug_issues = repo.get_issues(
state='open',
labels=['bug'],
sort='created',
direction='desc'
)
# Issues updated in the last 7 days
cutoff = datetime.datetime.now() - datetime.timedelta(days=7)
recent_issues = repo.get_issues(
state='open',
since=cutoff
)
# Issues assigned to a specific user
my_issues = repo.get_issues(
state='open',
assignee='username'
)
print(f'Bug issues: {bug_issues.totalCount}')
print(f'Recent issues: {recent_issues.totalCount}')Issue-Eigenschaften abrufen
Jedes Issue-Objekt verfügt über umfangreiche Eigenschaften: Nummer, Titel, Beschreibung, Labels, Bearbeiter, Meilenstein, Status, Anzahl der Kommentare und Zeitstempel. Greifen Sie über Python-Attribute darauf zu. Die Beschreibung ist roher Markdown-Text.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42) # get by number
print(f'Number: #{issue.number}')
print(f'Title: {issue.title}')
print(f'State: {issue.state}') # 'open' or 'closed'
print(f'Author: {issue.user.login}')
print(f'Body length: {len(issue.body or "")}')
print(f'Labels: {[l.name for l in issue.labels]}')
print(f'Assignees: {[a.login for a in issue.assignees]}')
print(f'Milestone: {issue.milestone.title if issue.milestone else None}')
print(f'Comments: {issue.comments}')
print(f'Reactions: {issue.get_reactions().totalCount}')
print(f'URL: {issue.html_url}')Neue Issues erstellen
Verwenden Sie repo.create_issue(), um programmgesteuert ein neues Issue zu erstellen. Das einzige erforderliche Feld ist title. Fügen Sie body (Markdown), labels (müssen bereits vorhanden sein), assignees (GitHub-Benutzernamen) und milestone (Meilensteinobjekt) hinzu.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# Create a bug report
bug_body = (
'## Bug Report\n\n'
'**Observed:** Login fails with 500 error\n'
'**Expected:** Successful login\n'
'**Steps to reproduce:**\n'
'1. Navigate to /login\n'
'2. Enter valid credentials\n'
'3. Click Submit\n\n'
'**Environment:** Production, v2.3.1'
)
issue = repo.create_issue(
title='Login endpoint returns 500 for valid credentials',
body=bug_body,
labels=['bug', 'priority:high'],
assignees=['alice'], # must be repo collaborators
)
print(f'Created issue #{issue.number}: {issue.html_url}')Issues bearbeiten (aktualisieren)
Verwenden Sie issue.edit(), um beliebige Eigenschaften eines bestehenden Issues zu aktualisieren. Sie können Titel, Beschreibung, Status, Labels, Bearbeiter oder Meilenstein in einem einzigen Aufruf ändern. Übergeben Sie nur die Felder, die Sie ändern möchten — alle anderen Felder bleiben erhalten.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42)
# Update title and add new labels
issue.edit(
title='[URGENT] Login endpoint returns 500',
labels=['bug', 'priority:critical', 'needs-hotfix']
)
# Close the issue
issue.edit(state='closed')
print(f'Issue #{issue.number} closed')
# Reopen it
issue.edit(state='open')
# Assign to a user
from github import NamedUser
issue.edit(assignees=['bob', 'carol'])
# Update the body
issue.edit(body=issue.body + '\n\n**Update:** Hotfix deployed to production.')Labels verwalten
Labels strukturieren Issues. Rufen Sie mit repo.get_labels() alle Labels eines Repositories ab, erstellen Sie mit repo.create_label() neue Labels und fügen Sie Labels mit issue.add_to_labels() zu einem Issue hinzu oder entfernen Sie sie mit issue.remove_from_labels().
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
# List all labels
for label in repo.get_labels():
print(f'{label.name}: #{label.color}')
# Create a new label if it doesn't exist
existing_names = {l.name for l in repo.get_labels()}
if 'agent-reviewed' not in existing_names:
repo.create_label(
name='agent-reviewed',
color='0075ca', # hex without #
description='Reviewed by AI agent'
)
print('Created label: agent-reviewed')
# Add a label to an issue
issue = repo.get_issue(42)
issue.add_to_labels('agent-reviewed')
# Remove a label
issue.remove_from_labels('needs-triage')Issue-Kommentare lesen
Verwenden Sie issue.get_comments(), um alle Kommentare eines Issues abzurufen. Jeder Kommentar enthält einen Autor (user.login), den Kommentartext und Zeitstempel. Iterieren Sie in der Reihenfolge der Kommentare, um den Gesprächsverlauf zu sehen.
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42)
# Get all comments
comments = list(issue.get_comments())
print(f'Comments on #{issue.number}: {len(comments)}')
for comment in comments:
print(f'\n{comment.user.login} ({comment.created_at.date()}):')
print(comment.body[:200])
# Get only recent comments
for comment in issue.get_comments(since=cutoff):
print(f'Recent: {comment.user.login}: {comment.body[:100]}')Kommentare zu Issues hinzufügen
Verwenden Sie issue.create_comment(body), um einen Kommentar zu veröffentlichen. Der Inhalt unterstützt Markdown. Agent-Kommentare sollten eindeutig als automatisiert erkennbar sein — fügen Sie einen Header "🤖 Automated analysis" hinzu, um klare Erwartungen zu schaffen.
from github import Github
import os
import datetime
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
issue = repo.get_issue(42)
# Add an agent comment with clear attribution
agent_comment = (
'**Automated Analysis** (via code-review agent)\n\n'
'---\n'
f'**Issue classified as:** Critical Bug\n'
f'**Suggested priority:** P0\n'
f'**Suggested assignee:** @backend-team\n\n'
'**Analysis:**\n'
'The login 500 error matches pattern #12 in our known issues database.\n'
'Likely cause: database connection pool exhaustion during peak traffic.\n\n'
'**Suggested fix:** Increase pool size in `db_config.py` or add circuit breaker.\n\n'
f'_Generated at {datetime.datetime.now().strftime("%Y-%m-%d %H:%M UTC")}_'
)
comment = issue.create_comment(agent_comment)
print(f'Comment added: {comment.html_url}')Agent zur Massen-Triage von Issues
Ein Triage-Agent verarbeitet neue Issues automatisch: Er liest Titel und Beschreibung, klassifiziert sie mithilfe eines LLM, fügt passende Labels hinzu, weist sie dem richtigen Team zu und veröffentlicht einen ersten Kommentar. Das erspart Entwicklern viele Stunden manueller Triage-Arbeit.
import anthropic
import json
import os
from github import Github
g = Github(token=os.environ['GITHUB_TOKEN'])
client = anthropic.Anthropic(api_key=os.environ['ANTHROPIC_API_KEY'])
def triage_issue(repo, issue):
prompt = (
'Classify this GitHub issue. Return JSON only:\n'
'{"type": "bug|feature|question|docs", '
'"priority": "critical|high|medium|low", '
'"team": "backend|frontend|infra|ml", '
'"summary": "one sentence"}\n\n'
f'Title: {issue.title}\n'
f'Body: {(issue.body or "")[:1000]}'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=200,
messages=[{'role': 'user', 'content': prompt}]
)
try:
return json.loads(response.content[0].text)
except json.JSONDecodeError:
return {'type': 'question', 'priority': 'medium', 'team': 'backend', 'summary': 'Needs manual review'}Triage-Ergebnisse auf Issues anwenden
Wenden Sie die LLM-Klassifizierung der Triage auf das Issue an: Setzen Sie anhand von Typ und Priorität Labels, weisen Sie das Issue der zuständigen Teamleitung zu und veröffentlichen Sie einen Triage-Kommentar. Kennzeichnen Sie bereits bearbeitete Issues mit einem benutzerdefinierten Label, um eine erneute Verarbeitung zu vermeiden.
TEAM_ASSIGNEES = {
'backend': 'alice',
'frontend': 'bob',
'infra': 'carol',
'ml': 'dave'
}
def apply_triage(repo, issue, classification):
issue_type = classification.get('type', 'question')
priority = classification.get('priority', 'medium')
team = classification.get('team', 'backend')
summary = classification.get('summary', '')
# Apply labels
labels_to_add = [f'type:{issue_type}', f'priority:{priority}', 'agent-triaged']
issue.edit(labels=labels_to_add)
# Assign to team lead
assignee = TEAM_ASSIGNEES.get(team, 'alice')
issue.edit(assignees=[assignee])
# Post triage comment
comment = (
f'**Automated Triage**\n\n'
f'Type: `{issue_type}` | Priority: `{priority}` | Team: `{team}`\n'
f'Summary: {summary}\n\n'
f'Assigned to @{assignee} for follow-up.'
)
issue.create_comment(comment)
print(f'Triaged #{issue.number}: {issue_type}/{priority} -> {assignee}')
# --- demo: minimal stand-in for a GitHub Issue object ---
class _FakeIssue:
number = 501
def edit(self, **kwargs):
print(f'[github] issue.edit({kwargs})')
def create_comment(self, body):
print(f'[github] comment posted:\n{body}')
classification = {'type': 'bug', 'priority': 'high', 'team': 'backend',
'summary': 'Login fails with 500 when email has a plus sign'}
apply_triage('coddy-agents', _FakeIssue(), classification)
Veraltete Issues automatisch schließen
Die Verwaltung veralteter Issues ist eine häufige Automatisierungsaufgabe: Finden Sie offene Issues ohne Aktivität seit N Tagen, veröffentlichen Sie einen Warnkommentar und schließen Sie sie, wenn innerhalb einer Kulanzfrist keine Antwort eingeht. Verwenden Sie issue.updated_at, um die Aktivität zu prüfen, und issue.edit(state='closed'), um das Issue zu schließen.
import datetime
from github import Github
import os
g = Github(token=os.environ['GITHUB_TOKEN'])
repo = g.get_repo('myorg/myrepo')
STALE_DAYS = 90
GRACE_DAYS = 14
now = datetime.datetime.utcnow()
stale_cutoff = now - datetime.timedelta(days=STALE_DAYS)
for issue in repo.get_issues(state='open'):
last_updated = issue.updated_at.replace(tzinfo=None)
if last_updated > stale_cutoff:
continue
# Check if stale warning already posted
comments = list(issue.get_comments())
stale_warned = any('stale' in c.body.lower() for c in comments)
if not stale_warned:
issue.create_comment(
'This issue has been inactive for 90 days. '
'It will be closed in 14 days unless there is activity.'
)
issue.add_to_labels('stale')
print(f'Stale warning: #{issue.number}')Kurztest: issue.edit() im Vergleich zu create_issue()
Testen Sie Ihr Verständnis der Verwaltung von GitHub-Issues.
Zusammenfassung: Issue-Verwaltung
Ihr Agent kann GitHub-Issues jetzt vollständig verwalten:
- repo.get_issues(state, labels, assignee, since) — Issues filtern und auflisten
- repo.get_issue(number) — ein bestimmtes Issue anhand seiner Nummer abrufen
- repo.create_issue(title, body, labels, assignees) — ein neues Issue eröffnen
- issue.edit(state, title, labels, assignees) — beliebige Felder aktualisieren
- issue.create_comment(body) — einen Markdown-Kommentar hinzufügen
- repo.create_label() / issue.add_to_labels() — Labels verwalten
- Agent-Kommentare immer eindeutig kennzeichnen, damit sie von menschlichen Aktivitäten unterschieden werden können
'agent-triaged'-Labels verwenden, um eine erneute Verarbeitung zu verhindern
Häufig gestellte Fragen
Ist die Lektion „Issues auflisten und verwalten“ kostenlos?
Ja — der vollständige Text von „Issues auflisten und verwalten“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des AI Agents-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der AI Agents-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Issues auflisten und verwalten“?
Issues programmgesteuert abrufen, erstellen, mit Labels versehen und schließen. Du übst AI Agents mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um AI Agents zu starten?
Keine Vorkenntnisse erforderlich. AI Agents auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „Issues auflisten und verwalten“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser AI Agents-Lektion Code schreiben und ausführen?
Ja. Jede AI Agents-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Überblick über die GitHub REST API
- Issues auflisten und verwalten
- Automatisierte Kommentare zu PR-Reviews
- Commit-Historie und Diff-Analyse