Labeling & Assignment
Buddy provides intelligent labeling and team assignment features to ensure proper pull request categorization and review workflows.
Dynamic Labeling
Buddy automatically applies contextual labels based on package characteristics, update types, and change scope.
Default Label Categories
Update Type Labels
patch-update
- Patch version updates (bug fixes)minor-update
- Minor version updates (new features)major-update
- Major version updates (breaking changes)security-update
- Security-related updatesdependencies
- General dependency label
Package Ecosystem Labels
react-ecosystem
- React and related packagesvue-ecosystem
- Vue.js and related packagesangular-ecosystem
- Angular framework packagestypescript
- TypeScript and type definitionstesting
- Testing frameworks and utilitiesbuild-tools
- Build and bundling toolsdev-dependencies
- Development-only packages
Scope Labels
single-package
- Updates affecting one packagemulti-package
- Updates affecting multiple packagesmonorepo-update
- Monorepo workspace updatesbreaking-changes
- Updates with breaking changes
Configuration
typescript
export default {
pullRequest: {
labels: {
// Static labels (always applied)
static: ['dependencies', 'automated'],
// Dynamic labeling rules
dynamic: {
enabled: true,
// Update type labeling
updateType: {
patch: 'patch-update',
minor: 'minor-update',
major: 'major-update',
security: 'security-update'
},
// Package ecosystem detection
ecosystems: {
react: ['react*', '@types/react*'],
vue: ['vue*', '@vue/*'],
angular: ['@angular/*'],
typescript: ['typescript', '@types/*'],
testing: ['jest', 'vitest', '@testing-library/*']
},
// Custom label rules
rules: [
{
condition: 'packages.includes("@types/")',
label: 'type-definitions'
},
{
condition: 'packageCount > 5',
label: 'large-update'
},
{
condition: 'hasBreakingChanges',
label: 'breaking-changes'
}
]
}
}
}
} satisfies BuddyBotConfig
Custom Label Rules
Pattern-Based Labeling
typescript
const patternLabeling = {
pullRequest: {
labels: {
patterns: {
'@types/*': ['type-definitions', 'typescript'],
'eslint*': ['linting', 'code-quality'],
'babel*': ['build-tools', 'transpilation'],
'*test*': ['testing'],
'*security*': ['security']
}
}
}
}
Conditional Labeling
typescript
const conditionalLabeling = {
pullRequest: {
labels: {
conditions: [
{
when: pr => pr.packages.length === 1,
apply: ['single-package']
},
{
when: pr => pr.packages.some(p => p.hasBreakingChanges),
apply: ['breaking-changes', 'requires-review']
},
{
when: pr => pr.updateType === 'security',
apply: ['security', 'high-priority']
},
{
when: pr => pr.packages.every(p => p.isDevDependency),
apply: ['dev-only', 'low-risk']
}
]
}
}
}
Team Assignment
Intelligent assignment of reviewers and assignees based on package ownership and team structure.
Reviewer Assignment
Global Reviewers
typescript
export default {
pullRequest: {
reviewers: ['tech-lead', 'senior-dev'],
// Review requirements
reviewRequirements: {
required: 1, // Minimum required reviews
teamReviews: true, // Count team reviews
dismissStale: true // Dismiss stale reviews
}
}
} satisfies BuddyBotConfig
Package-Based Assignment
typescript
const packageBasedAssignment = {
pullRequest: {
packageOwners: {
'react': ['frontend-team', 'react-expert'],
'vue': ['vue-team'],
'@types/*': ['typescript-team'],
'eslint*': ['code-quality-team'],
'jest': ['testing-team'],
'webpack': ['build-team'],
'@company/*': ['platform-team']
},
// Fallback reviewers
fallbackReviewers: ['tech-lead', 'senior-dev']
}
}
Team-Based Assignment
typescript
const teamBasedAssignment = {
pullRequest: {
teams: {
frontend: {
members: ['alice', 'bob', 'charlie'],
packages: ['react*', 'vue*', '@types/react*'],
requiredReviews: 2
},
backend: {
members: ['david', 'eve'],
packages: ['express*', '@types/node*'],
requiredReviews: 1
},
devtools: {
members: ['frank', 'grace'],
packages: ['eslint*', 'prettier*', 'webpack*'],
autoAssign: true
}
}
}
}
Assignee Management
Automatic Assignment
typescript
export default {
pullRequest: {
assignees: {
// Static assignees
static: ['maintainer'],
// Dynamic assignment rules
rules: [
{
condition: 'updateType === "security"',
assignees: ['security-team']
},
{
condition: 'packages.includes("react")',
assignees: ['frontend-lead']
},
{
condition: 'packageCount > 10',
assignees: ['tech-lead']
}
],
// Assignment limits
maxAssignees: 3,
requiresAssignee: true
}
}
} satisfies BuddyBotConfig
CLI Label Management
Manage labels and assignments via CLI:
bash
# List current labels
buddy-bot labels list
# Create custom label
buddy-bot labels create "custom-label" --color "ff0000" --description "Custom label"
# Assign reviewers to PR
buddy-bot assign 123 --reviewers alice,bob --assignees charlie
# Update PR labels
buddy-bot labels update 123 --add security --remove low-priority
Automation Examples
Security-First Assignment
typescript
export default {
pullRequest: {
labels: {
rules: [
{
condition: 'isSecurityUpdate',
labels: ['security', 'high-priority', 'auto-merge-approved']
}
]
},
assignees: {
rules: [
{
condition: 'isSecurityUpdate',
assignees: ['security-team'],
reviewers: ['security-lead', 'tech-lead'],
urgency: 'high'
}
]
}
}
} satisfies BuddyBotConfig
Development Workflow
typescript
export default {
pullRequest: {
labels: {
rules: [
{
condition: 'isDevDependency && updateType === "patch"',
labels: ['dev-only', 'auto-merge', 'low-risk']
},
{
condition: 'isProductionDependency && updateType === "major"',
labels: ['production', 'breaking-changes', 'requires-testing']
}
]
},
assignees: {
rules: [
{
condition: 'isDevDependency',
assignees: ['dev-lead'],
reviewers: ['senior-dev']
},
{
condition: 'isProductionDependency',
assignees: ['tech-lead'],
reviewers: ['tech-lead', 'senior-dev-1', 'senior-dev-2']
}
]
}
}
} satisfies BuddyBotConfig
See Pull Request Generation for more details on how labeling and assignment integrate with the overall PR workflow.