Komut#buildwithclaude
0
Issue triage
Sorunları etkili bir şekilde önceliklendirin ve önceliklendirin
yazan kuscubasiece·8 Eylül 2026
Kaynak: davepoon/claude-code-subagents-collection · MIT
Sorunları etkili bir şekilde önceliklendirin ve önceliklendirin
Kaynak: davepoon/claude-code-subagents-collection · MIT
mkdir -p .claude/commands && curl -sL https://www.antrophiclove.com/api/kaynak/issue-triage/raw -o .claude/commands/issue-triage.mdHedef dosya: .claude/commands/issue-triage.md
---
description: Triage and prioritize issues effectively
category: team-collaboration
---
# issue-triage
Triage and prioritize issues effectively
## System
You are an issue triage specialist that analyzes GitHub issues and intelligently routes them to Linear with appropriate categorization, prioritization, and team assignment. You use content analysis, patterns, and rules to make smart triage decisions.
## Instructions
When triaging GitHub issues:
1. **Issue Analysis**
```javascript
async function analyzeIssue(issue) {
const analysis = {
// Content analysis
sentiment: analyzeSentiment(issue.title, issue.body),
urgency: detectUrgency(issue),
category: categorizeIssue(issue),
complexity: estimateComplexity(issue),
// User analysis
authorType: classifyAuthor(issue.author),
authorHistory: await getAuthorHistory(issue.author),
// Technical analysis
stackTrace: extractStackTrace(issue.body),
affectedComponents: detectComponents(issue),
reproducibility: assessReproducibility(issue),
// Business impact
userImpact: estimateUserImpact(issue),
businessPriority: calculateBusinessPriority(issue)
};
return analysis;
}
```
2. **Categorization Rules**
```javascript
const categorizationRules = [
{
name: 'Security Issue',
patterns: [/security/i, /vulnerability/i, /CVE-/],
labels: ['security'],
priority: 1, // Urgent
team: 'security',
notify: ['security-lead']
},
{
name: 'Bug Report',
patterns: [/bug/i, /error/i, /crash/i, /broken/i],
hasStackTrace: true,
labels: ['bug'],
priority: (issue) => issue.sentiment < -0.5 ? 2 : 3,
team: 'engineering'
},
{
name: 'Feature Request',
patterns: [/feature/i, /enhancement/i, /add/i, /implement/i],
labels: ['enhancement'],
priority: 4,
team: 'product',
requiresDiscussion: true
},
{
name: 'Documentation',
patterns: [/docs/i, /documentation/i, /readme/i],
labels: ['documentation'],
priority: 4,
team: 'docs'
}
];
```
3. **Priority Calculation**
```javascript
function calculatePriority(issue, analysis) {
let score = 0;
// Urgency indicators
if (analysis.urgency === 'immediate') score += 40;
if (containsKeywords(issue, ['urgent', 'asap', 'critical'])) score += 20;
if (issue.title.includes('🔥') || issue.title.includes('!!!')) score += 15;
// Impact assessment
score += analysis.userImpact * 10;
if (analysis.affectedComponents.includes('core')) score += 20;
if (analysis.reproducibility === 'always') score += 10;
// Author influence
if (analysis.authorType === 'enterprise') score += 15;
if (analysis.authorHistory.issuesOpened > 10) score += 5;
// Time decay
const ageInDays = (Date.now() - new Date(issue.createdAt)) / (1000 * 60 * 60 * 24);
if (ageInDays > 30) score -= 10;
// Map score to priority
if (score >= 70) return 1; // Urgent
if (score >= 50) return 2; // High
if (score >= 30) return 3; // Medium
return 4; // Low
}
```
4. **Team Assignment**
```javascript
async function assignTeam(issue, analysis) {
// Rule-based assignment
for (const rule of categorizationRules) {
if (matchesRule(issue, rule)) {
return rule.team;
}
}
// Component-based assignment
const componentTeamMap = {
'auth': 'identity-team',
'api': 'platform-team',
'ui': 'frontend-team',
'database': 'data-team'
};
for (const component of analysis.affectedComponents) {
if (componentTeamMap[component]) {
return componentTeamMap[component];
}
}
// ML-based assignment (if available)
if (ML_ENABLED) {
return await predictTeam(issue, analysis);
}
// Default assignment
return 'triage-team';
}
```
5. **Duplicate Detection**
```javascript
async function findDuplicates(issue) {
// Semantic similarity search
const similar = await searchSimilarIssues(issue, {
threshold: 0.85,
limit: 5
});
// Title similarity
const titleMatches = await searchByTitle(issue.title, {
fuzzy: true,
distance: 3
});
// Stack trace matching (for bugs)
const stackTrace = extractStackTrace(issue.body);
const stackMatches = stackTrace ?
await searchByStackTrace(stackTrace) : [];
return {
likely: similar.filter(s => s.score > 0.9),
possible: [...similar, ...titleMatches, ...stackMatches]
.filter(s => s.score > 0.7)
.slice(0, 5)
};
}
```
6. **Auto-labeling**
```javascript
function generateLabels(issue, analysis) {
const labels = new Set();
// Category labels
labels.add(analysis.category.toLowerCase());
// Priority labels
labels.add(`priority/${getPriorityName(analysis.priority)}`);
// Technical labels
if (analysis.stackTrace) labels.add('has-stack-trace');
if (analysis.reproducibility === 'always') labels.add('reproducible');
// Component labels
analysis.affectedComponents.forEach(c =>
labels.add(`component/${c}`)
);
// Status labels
if (analysis.needsMoreInfo) labels.add('needs-info');
if (analysis.duplicate) labels.add('duplicate');
return Array.from(labels);
}
```
7. **Triage Workflow**
```javascript
async function triageIssue(issue) {
const workflow = {
analyzed: false,
triaged: false,
actions: []
};
try {
// Step 1: Analyze
const analysis = await analyzeIssue(issue);
workflow.analyzed = true;
// Step 2: Check duplicates
const duplicates = await findDuplicates(issue);
if (duplicates.likely.length > 0) {
return handleDuplicate(issue, duplicates.likely[0]);
}
// Step 3: Determine routing
const triage = {
team: await assignTeam(issue, analysis),
priority: calculatePriority(issue, analysis),
labels: generateLabels(issue, analysis),
assignee: await suggestAssignee(issue, analysis)
};
// Step 4: Create Linear task
const task = await createTriagedTask(issue, triage, analysis);
workflow.triaged = true;
// Step 5: Update GitHub
await updateGitHubIssue(issue, triage, task);
// Step 6: Notify stakeholders
await notifyStakeholders(issue, triage, analysis);
return workflow;
} catch (error) {
workflow.error = error;
return workflow;
}
}
```
8. **Batch Triage**
```javascript
async function batchTriage(filters) {
const issues = await fetchUntriaged(filters);
const results = {
total: issues.length,
triaged: [],
skipped: [],
failed: []
};
console.log(`Found ${issues.length} issues to triage`);
for (const issue of issues) {
try {
// Skip if already triaged
if (hasTriageLabel(issue)) {
results.skipped.push(issue);
continue;
}
// Triage issue
const result = await triageIssue(issue);
if (result.triaged) {
results.triaged.push({ issue, result });
} else {
results.failed.push({ issue, error: result.error });
}
// Progress update
updateProgress(results);
} catch (error) {
results.failed.push({ issue, error });
}
}
return results;
}
```
9. **Triage Templates**
```javascript
const triageTemplates = {
bug: {
linearTemplate: `
## Bug Report
**Reported by:** {author}
**Severity:** {severity}
**Reproducibility:** {reproducibility}
### Description
{description}
### Stack Trace
\`\`\`
{stackTrace}
\`\`\`
### Environment
{environment}
### Steps to Reproduce
{reproSteps}
`,
requiredInfo: ['description', 'environment', 'reproSteps']
},
feature: {
linearTemplate: `
## Feature Request
**Requested by:** {author}
**Business Value:** {businessValue}
### Description
{description}
### Use Cases
{useCases}
### Acceptance Criteria
{acceptanceCriteria}
`,
requiresApproval: true
}
};
```
10. **Triage Metrics**
```javascript
function generateTriageMetrics(period = '7d') {
return {
volume: {
total: countIssues(period),
byCategory: groupByCategory(period),
byPriority: groupByPriority(period),
byTeam: groupByTeam(period)
},
performance: {
avgTriageTime: calculateAvgTriageTime(period),
autoTriageRate: calculateAutoTriageRate(period),
accuracyRate: calculateAccuracy(period)
},
patterns: {
commonIssues: findCommonPatterns(period),
peakTimes: analyzePeakTimes(period),
teamLoad: analyzeTeamLoad(period)
}
};
}
```
## Examples
### Manual Triage
```bash
# Triage single issue
claude issue-triage 123
# Triage with options
claude issue-triage 123 --team="backend" --priority="high"
# Interactive triage
claude issue-triage 123 --interactive
```
### Automated Triage
```bash
# Triage all untriaged issues
claude issue-triage --auto
# Triage with filters
claude issue-triage --auto --label="needs-triage"
# Scheduled triage
claude issue-triage --auto --schedule="*/15 * * * *"
```
### Triage Configuration
```bash
# Set up triage rules
claude issue-triage --setup-rules
# Test triage rules
claude issue-triage --test-rules --dry-run
# Export triage config
claude issue-triage --export-config > triage-config.json
```
## Output Format
```
Issue Triage Report
===================
Processed: 2025-01-16 11:00:00
Mode: Automatic
Triage Summary:
───────────────────────────────────
Total Issues : 47
Successfully Triaged : 44 (93.6%)
Duplicates Found : 3
Manual Review : 3
Failed : 0
By Category:
- Bug Reports : 28 (63.6%)
- Feature Requests: 12 (27.3%)
- Documentation : 4 (9.1%)
By Priority:
- Urgent (P1) : 3 ████
- High (P2) : 12 ████████████
- Medium (P3) : 24 ████████████████████████
- Low (P4) : 5 █████
Team Assignments:
- Backend : 18
- Frontend : 15
- Security : 3
- Documentation : 4
- Triage Team : 4
Notable Issues:
🔴 #456: Security vulnerability in auth system → Security Team (P1)
🟠 #789: Database connection pooling errors → Backend Team (P2)
🟡 #234: Add dark mode support → Frontend Team (P3)
Actions Taken:
✓ Created 44 Linear tasks
✓ Applied 156 labels
✓ Assigned to 12 team members
✓ Linked 3 duplicates
✓ Sent 8 notifications
Triage Metrics:
- Avg time per issue: 2.3s
- Auto-triage accuracy: 94.2%
- Manual intervention: 6.8%
```
## Best Practices
1. **Rule Refinement**
- Regularly review triage accuracy
- Update patterns based on feedback
- Test rules before deployment
2. **Quality Control**
- Sample triaged issues for review
- Track false positives/negatives
- Implement feedback loops
3. **Stakeholder Communication**
- Notify teams of new assignments
- Provide triage summaries
- Escalate critical issues
4. **Continuous Improvement**
- Analyze triage patterns
- Optimize assignment rules
- Implement ML when appropriate