Sorunları Listeleme ve Yönetme
Sorunları programlı olarak getirme, oluşturma, etiketleme ve kapatma.
Sorunları Listeleme ve Yönetme, CoddyKit'te ücretsiz bir AI Agents dersidir. Bu, 4 dersinin 2. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, AI Agents öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. AI Agents kursu toplamda 4 dersten oluşur.
Depodan Sorunları Alma
Sorunları listelemek için repo.get_issues() kullanın. Varsayılan olarak açık sorunları döndürür; diğer durumlar için state='closed' veya state='all' iletin. Sonuç bir PaginatedList'tir; her sorunu işlemek için bu liste üzerinde yineleme yapın.
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()}')Sorunları Filtreleme
get_issues() çeşitli filtre parametrelerini destekler: state, labels, assignee, milestone, since ve sort. Aracınızın işlemesi gereken sorunları tam olarak elde etmek için bunları birleştirin.
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}')Sorun Özelliklerine Erişme
Her Issue nesnesi zengin özelliklere sahiptir: numara, başlık, gövde, etiketler, atanan kişiler, kilometre taşı, durum, yorum sayısı ve zaman damgaları. Bunlara Python öznitelikleri olarak erişin. Gövde, ham Markdown metnidir.
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}')Yeni Sorunlar Oluşturma
Program aracılığıyla yeni bir sorun oluşturmak için repo.create_issue() kullanın. Yalnızca title alanı zorunludur. body (Markdown), labels (önceden var olmalıdır), assignees (GitHub kullanıcı adları) ve milestone (kilometre taşı nesnesi) ekleyin.
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}')Sorunları Düzenleme (Güncelleme)
Mevcut bir sorunun herhangi bir özelliğini güncellemek için issue.edit() kullanın. Tek bir çağrıda başlığı, gövdeyi, durumu, etiketleri, atanan kişileri veya kilometre taşını değiştirebilirsiniz. Yalnızca değiştirmek istediğiniz alanları iletin; diğer alanlar korunur.
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.')Etiketleri Yönetme
Etiketler sorunları düzenler. Tüm depo etiketlerini repo.get_labels() ile alın, yenilerini repo.create_label() ile oluşturun ve bir sorundaki etiketleri issue.add_to_labels() ve issue.remove_from_labels() ile ekleyin veya kaldırın.
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')Sorun Yorumlarını Okuma
Bir sorunla ilgili tüm yorumları almak için issue.get_comments() kullanın. Her yorumda bir yazar (user.login), gövde metni ve zaman damgaları bulunur. Konuşma geçmişini görmek için sırayla yineleyin.
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]}')Sorunlara Yorum Ekleme
Yorum göndermek için issue.create_comment(body) kullanın. Gövde Markdown'ı destekler. Aracı yorumları, otomatik olarak oluşturulduklarını açıkça belirtmelidir; beklentileri belirlemek için "🤖 Otomatik analiz" başlığını ekleyin.
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}')Toplu Sorun Önceliklendirme Aracısı
Bir önceliklendirme aracısı yeni sorunları otomatik olarak işler: başlığı ve gövdeyi okur, bunları LLM aracılığıyla sınıflandırır, uygun etiketleri ekler, doğru ekibe atar ve ilk yorumu gönderir. Bu, mühendislerin elle önceliklendirme için harcadığı saatleri azaltır.
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'}Önceliklendirme Sonuçlarını Sorunlara Uygulama
LLM önceliklendirme sınıflandırmasını soruna uygulayın: türe ve önceliğe göre etiketleri ayarlayın, uygun ekip liderine atayın ve bir önceliklendirme yorumu gönderin. Yeniden işlemeyi önlemek için hangi sorunların önceliklendirildiğini özel bir etiketle izleyin.
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)
Eski Sorunları Otomatik Olarak Kapatma
Etkin olmayan sorunları yönetmek yaygın bir otomasyon işlemidir: N gündür etkinlik bulunmayan açık sorunları bulun, bir uyarı yorumu gönderin ve ek süre içinde yanıt gelmezse bunları kapatın. Etkinliği kontrol etmek için issue.updated_at, kapatmak için issue.edit(state='closed') kullanın.
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}')Hızlı Kontrol: issue.edit() ve create_issue() Karşılaştırması
GitHub sorun yönetimi konusundaki anlayışınızı sınayın.
Sorun Yönetimi Özeti
Aracınız artık GitHub sorunlarını baştan sona yönetebilir:
- repo.get_issues(state, labels, assignee, since) — sorunları filtreleme ve listeleme
- repo.get_issue(number) — numarasına göre belirli bir sorunu alma
- repo.create_issue(title, body, labels, assignees) — yeni bir sorun açma
- issue.edit(state, title, labels, assignees) — herhangi bir alanı güncelleme
- issue.create_comment(body) — Markdown yorumu ekleme
- repo.create_label() / issue.add_to_labels() — etiketleri yönetme
- İnsan etkinliklerinden ayırt edilebilmeleri için aracı yorumlarını her zaman açıkça belirtin
- Yeniden işlemeyi önlemek için
'agent-triaged'etiketlerini kullanın
Sıkça Sorulan Sorular
“Sorunları Listeleme ve Yönetme” dersi ücretsiz mi?
Evet — “Sorunları Listeleme ve Yönetme” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve AI Agents kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. AI Agents kursu toplamda 4 dersten oluşur.
“Sorunları Listeleme ve Yönetme” dersinde ne öğreneceğim?
Sorunları programlı olarak getirme, oluşturma, etiketleme ve kapatma. AI Agents ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
AI Agents öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te AI Agents, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 2. dersidir.
“Sorunları Listeleme ve Yönetme” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu AI Agents dersinde kod yazıp çalıştırabilir miyim?
Evet. Her AI Agents dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- GitHub REST API'ye Genel Bakış
- Sorunları Listeleme ve Yönetme
- Otomatik PR İnceleme Yorumları
- İşleme Geçmişi ve Fark Analizi