Mencantumkan dan Mengelola Isu
Mengambil, membuat, memberi label, dan menutup isu secara terprogram.
Mencantumkan dan Mengelola Isu adalah pelajaran AI Agents gratis di CoddyKit. Ini adalah pelajaran 2 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar AI Agents, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus AI Agents mencakup 4 pelajaran total.
Mendapatkan Isu dari Repositori
Gunakan repo.get_issues() untuk mencantumkan isu. Secara bawaan, fungsi ini mengembalikan isu terbuka; teruskan state='closed' atau state='all' untuk status lainnya. Hasilnya berupa PaginatedList — lakukan iterasi atasnya untuk memproses setiap isu.
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()}')Memfilter Isu
get_issues() mendukung beberapa parameter penyaring: state, labels, assignee, milestone, since, dan sort. Gabungkan parameter tersebut untuk mendapatkan tepat isu yang perlu diproses oleh agen Anda.
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}')Mengakses Properti Isu
Setiap objek Issue memiliki properti yang lengkap: nomor, judul, isi, label, penerima tugas, tonggak pencapaian, status, jumlah komentar, dan cap waktu. Akses properti tersebut sebagai atribut Python. Isinya berupa teks Markdown mentah.
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}')Membuat Isu Baru
Gunakan repo.create_issue() untuk membuat isu baru secara terprogram. Satu-satunya bidang wajib adalah title. Tambahkan body (Markdown), labels (harus sudah ada), assignees (nama pengguna GitHub), dan milestone (objek tonggak pencapaian).
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}')Mengedit (Memperbarui) Isu
Gunakan issue.edit() untuk memperbarui properti apa pun dari isu yang sudah ada. Anda dapat mengubah judul, isi, status, label, penerima tugas, atau tonggak pencapaian dalam satu pemanggilan. Teruskan hanya bidang yang ingin diubah — bidang lainnya akan dipertahankan.
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.')Mengelola Label
Label digunakan untuk mengatur isu. Dapatkan semua label repositori dengan repo.get_labels(), buat label baru dengan repo.create_label(), dan tambahkan atau hapus label pada sebuah isu dengan issue.add_to_labels() dan 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')Membaca Komentar Isu
Gunakan issue.get_comments() untuk mengambil semua komentar pada sebuah isu. Setiap komentar memiliki penulis (user.login), teks isi, dan cap waktu. Lakukan iterasi sesuai urutan untuk melihat riwayat percakapan.
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]}')Menambahkan Komentar ke Isu
Gunakan issue.create_comment(body) untuk mengirim komentar. Isinya mendukung Markdown. Komentar agen harus dengan jelas mengidentifikasi dirinya sebagai komentar otomatis — sertakan tajuk "🤖 Analisis otomatis" untuk menetapkan ekspektasi.
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}')Agen Triase Isu Massal
Agen triase secara otomatis memproses isu baru: membaca judul dan isi, mengklasifikasikannya melalui LLM, menambahkan label yang sesuai, menetapkannya kepada tim yang tepat, dan mengirim komentar awal. Proses ini menghemat waktu kerja triase manual para insinyur hingga berjam-jam.
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'}Menerapkan Hasil Triase pada Isu
Terapkan klasifikasi triase LLM pada isu: tetapkan label berdasarkan jenis dan prioritas, tetapkan isu kepada pemimpin tim yang sesuai, dan kirim komentar triase. Lacak isu yang telah menjalani triase dengan label khusus agar tidak diproses ulang.
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)
Menutup Isu Usang Secara Otomatis
Pengelolaan isu usang adalah otomatisasi yang umum: temukan isu terbuka tanpa aktivitas selama N hari, kirim komentar peringatan, lalu tutup isu jika tidak ada tanggapan dalam masa tenggang. Gunakan issue.updated_at untuk memeriksa aktivitas dan issue.edit(state='closed') untuk menutup isu.
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}')Pemeriksaan Singkat: issue.edit() vs create_issue()
Uji pemahaman Anda tentang pengelolaan isu GitHub.
Ringkasan Pengelolaan Isu
Sekarang agen Anda dapat mengelola isu GitHub secara menyeluruh:
- repo.get_issues(state, labels, assignee, since) — menyaring dan mencantumkan isu
- repo.get_issue(number) — mendapatkan isu tertentu berdasarkan nomor
- repo.create_issue(title, body, labels, assignees) — membuka isu baru
- issue.edit(state, title, labels, assignees) — memperbarui bidang apa pun
- issue.create_comment(body) — menambahkan komentar Markdown
- repo.create_label() / issue.add_to_labels() — mengelola label
- Selalu identifikasi komentar agen dengan jelas agar dapat dibedakan dari aktivitas manusia
- Gunakan label
'agent-triaged'untuk mencegah pemrosesan ulang
Pertanyaan yang Sering Diajukan
Apakah pelajaran “Mencantumkan dan Mengelola Isu” gratis?
Ya — teks lengkap “Mencantumkan dan Mengelola Isu” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus AI Agents, upgrade ke CoddyKit PRO. Kursus AI Agents mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “Mencantumkan dan Mengelola Isu”?
Mengambil, membuat, memberi label, dan menutup isu secara terprogram. Kamu berlatih AI Agents dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai AI Agents?
Tidak diperlukan pengalaman sebelumnya. AI Agents di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 2 dari 4.
Berapa lama pelajaran “Mencantumkan dan Mengelola Isu” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran AI Agents ini?
Ya. Setiap pelajaran AI Agents menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Ikhtisar GitHub REST API
- Mencantumkan dan Mengelola Isu
- Komentar Tinjauan PR Otomatis
- Riwayat Commit dan Analisis Perbedaan