Une commande qui met à jour automatiquement les descriptions et labels de Pull Requests. Analyse les changements Git pour générer et définir des descriptions et labels appropriés.
Automatically updates PR descriptions and labels by analyzing Git changes.
/plugin marketplace add wasabeef/claude-code-cookbook/plugin install cook-fr@claude-code-cookbookUne commande qui met à jour automatiquement les descriptions et labels de Pull Requests. Analyse les changements Git pour générer et définir des descriptions et labels appropriés.
/pr-auto-update [options] [numéro PR]
--pr <number> : Spécifier le numéro de PR cible (détecté automatiquement depuis la branche courante si omis)--description-only : Mettre à jour seulement la description (conserver les labels inchangés)--labels-only : Mettre à jour seulement les labels (conserver la description inchangée)--dry-run : Afficher le contenu généré sans faire de mises à jour réelles--lang <language> : Spécifier la langue (fr, en)# Mise à jour automatique de la PR pour la branche courante
/pr-auto-update
# Mettre à jour une PR spécifique
/pr-auto-update --pr 1234
# Mettre à jour seulement la description
/pr-auto-update --description-only
# Vérifier avec dry-run
/pr-auto-update --dry-run
Détecte automatiquement la PR correspondante depuis la branche courante :
# Rechercher la PR depuis la branche
gh pr list --head $(git branch --show-current) --json number,title,url
Collecte et analyse les informations suivantes :
.github/PULL_REQUEST_TEMPLATE.mdImportant : Ne pas modifier le contenu existant
# Analyser la structure de .github/PULL_REQUEST_TEMPLATE.md
parse_template_structure() {
local template_file="$1"
if [ -f "$template_file" ]; then
# Extraire la structure de section
grep -E '^##|^###' "$template_file"
# Identifier les espaces réservés de commentaires
grep -E '<!--.*-->' "$template_file"
# Suivre complètement la structure du modèle existant
cat "$template_file"
fi
}
Priorité :
.github/labels.yml : Obtenir depuis les définitions de labels spécifiques au projetgh api repos/{OWNER}/{REPO}/labels --jq '.[].name'Basé sur les motifs de fichiers :
*.md, README, docs/ → labels contenant documentation|docs|doctest, spec → labels contenant test|testing.github/, *.yml, Dockerfile → labels contenant ci|build|infra|opspackage.json, pubspec.yaml, requirements.txt → labels contenant dependencies|depsBasé sur le contenu des changements :
fix|bug|error|crash|correction → labels contenant bug|fixfeat|feature|add|implement|new-feature|implementation → labels contenant feature|enhancement|featrefactor|clean|restructure → labels contenant refactor|cleanup|cleanperformance|perf|optimize|optimization → labels contenant performance|perfsecurity|secure|vulnerability → labels contenant securityQuand .github/labels.yml existe :
# Récupération automatique depuis les définitions de labels
grep "^- name:" .github/labels.yml | sed "s/^- name: '\?\([^']*\)'\?/\1/"
# Exemple : Utiliser le système de labels spécifique au projet
Lors de récupération depuis l'API GitHub :
# Obtenir la liste des labels existants
gh api repos/{OWNER}/{REPO}/labels --jq '.[].name'
# Exemple : Utiliser des labels standards comme bug, enhancement, documentation
#!/bin/bash
# 1. Détection et récupération de PR
detect_pr() {
if [ -n "$PR_NUMBER" ]; then
echo $PR_NUMBER
else
gh pr list --head $(git branch --show-current) --json number --jq '.[0].number'
fi
}
# 2. Analyse des changements
analyze_changes() {
local pr_number=$1
# Obtenir les changements de fichiers
gh pr diff $pr_number --name-only
# Analyse du contenu
gh pr diff $pr_number | head -1000
}
# 3. Génération de description
generate_description() {
local pr_number=$1
local changes=$2
# Obtenir la description PR actuelle
local current_body=$(gh pr view $pr_number --json body --jq -r .body)
# Utiliser le contenu existant si disponible
if [ -n "$current_body" ]; then
echo "$current_body"
else
# Générer nouveau depuis le modèle
local template_file=".github/PULL_REQUEST_TEMPLATE.md"
if [ -f "$template_file" ]; then
generate_from_template "$(cat "$template_file")" "$changes"
else
generate_from_template "" "$changes"
fi
fi
}
# Générer depuis le modèle
generate_from_template() {
local template="$1"
local changes="$2"
if [ -n "$template" ]; then
# Utiliser le modèle tel quel (préserver les commentaires HTML)
echo "$template"
else
# Générer en format par défaut
echo "## What does this change?"
echo ""
echo "$changes"
fi
}
# 4. Détermination des labels
determine_labels() {
local changes=$1
local file_list=$2
local pr_number=$3
# Obtenir les labels disponibles
local available_labels=()
if [ -f ".github/labels.yml" ]; then
# Extraire les noms de labels depuis labels.yml
available_labels=($(grep "^- name:" .github/labels.yml | sed "s/^- name: '\?\([^']*\)'\?/\1/"))
else
# Obtenir les labels depuis l'API GitHub
local repo_info=$(gh repo view --json owner,name)
local owner=$(echo "$repo_info" | jq -r .owner.login)
local repo=$(echo "$repo_info" | jq -r .name)
available_labels=($(gh api "repos/$owner/$repo/labels" --jq '.[].name'))
fi
local suggested_labels=()
# Correspondance de motifs générique
analyze_change_patterns "$file_list" "$changes" available_labels suggested_labels
# Limiter à maximum 3
echo "${suggested_labels[@]:0:3}"
}
# Déterminer les labels depuis les motifs de changements
analyze_change_patterns() {
local file_list="$1"
local changes="$2"
local -n available_ref=$3
local -n suggested_ref=$4
# Détermination du type de fichier
if echo "$file_list" | grep -q "\.md$\|README\|docs/"; then
add_matching_label "documentation\|docs\|doc" available_ref suggested_ref
fi
if echo "$file_list" | grep -q "test\|spec"; then
add_matching_label "test\|testing" available_ref suggested_ref
fi
# Détermination du contenu des changements
if echo "$changes" | grep -iq "fix\|bug\|error\|crash\|correction"; then
add_matching_label "bug\|fix" available_ref suggested_ref
fi
if echo "$changes" | grep -iq "feat\|feature\|add\|implement\|new-feature\|implementation"; then
add_matching_label "feature\|enhancement\|feat" available_ref suggested_ref
fi
}
# Ajouter un label correspondant
add_matching_label() {
local pattern="$1"
local -n available_ref=$2
local -n suggested_ref=$3
# Ignorer si on a déjà 3 labels
if [ ${#suggested_ref[@]} -ge 3 ]; then
return
fi
# Ajouter le premier label correspondant au motif
for available_label in "${available_ref[@]}"; do
if echo "$available_label" | grep -iq "$pattern"; then
# Vérifier les doublons
local already_exists=false
for existing in "${suggested_ref[@]}"; do
if [ "$existing" = "$available_label" ]; then
already_exists=true
break
fi
done
if [ "$already_exists" = false ]; then
suggested_ref+=("$available_label")
return
fi
fi
done
}
# Conserver l'ancienne fonction pour compatibilité
find_and_add_label() {
add_matching_label "$@"
}
# 5. Mise à jour PR
update_pr() {
local pr_number=$1
local description="$2"
local labels="$3"
if [ "$DRY_RUN" = "true" ]; then
echo "=== DRY RUN ==="
echo "Description:"
echo "$description"
echo "Labels: $labels"
else
# Obtenir les informations du dépôt
local repo_info=$(gh repo view --json owner,name)
local owner=$(echo "$repo_info" | jq -r .owner.login)
local repo=$(echo "$repo_info" | jq -r .name)
# Mettre à jour le corps en utilisant l'API GitHub (préserver les commentaires HTML)
# Gérer l'échappement JSON correctement
local escaped_body=$(echo "$description" | jq -R -s .)
gh api \
--method PATCH \
"/repos/$owner/$repo/pulls/$pr_number" \
--field body="$description"
# Les labels peuvent être gérés avec la commande gh normale
if [ -n "$labels" ]; then
gh pr edit $pr_number --add-label "$labels"
fi
fi
}
~/.claude/pr-auto-update.config :
{
"language": "fr",
"max_labels": 3
}
## What does this change?
Implémenté {nom de fonctionnalité}. Résout le {problème} utilisateur.
### Changements principaux
- **Implémentation UI** : Créé nouvel {nom d'écran}
- **Gestion d'état** : Ajouté providers Riverpod
- **Intégration API** : Implémenté requêtes et mutations GraphQL
- **Tests** : Ajouté tests de widgets et tests unitaires
### Spécifications techniques
- **Architecture** : {motif utilisé}
- **Dépendances** : {packages nouvellement ajoutés}
- **Performance** : {détails d'optimisation}
## What does this change?
Implémenté endpoint {nom API}. Supporte {cas d'usage}.
### Changements principaux
- **Implémentation API** : Créé nouvel {endpoint}
- **Validation** : Ajouté logique de validation des requêtes
- **Base de données** : Implémenté opérations pour {nom de table}
- **Tests** : Ajouté tests d'intégration et unitaires
### Sécurité
- **Authentification** : Validation de token JWT
- **Autorisation** : Contrôle d'accès basé sur les rôles
- **Validation d'entrée** : Protection contre injection SQL
## What does this change?
Amélioré le workflow GitHub Actions. Obtient {effet}.
### Améliorations
- **Performance** : Réduit le temps de construction de {temps}
- **Fiabilité** : Amélioré la gestion d'erreurs
- **Sécurité** : Amélioré la gestion des secrets
### Détails techniques
- **Parallélisation** : Exécuter {nom de job} en parallèle
- **Mise en cache** : Optimisé la stratégie de cache pour {cible de cache}
- **Surveillance** : Ajouté surveillance pour {métriques}
Préservation complète du contenu existant :
Priorité des modèles :
.github/PULL_REQUEST_TEMPLATE.md > Par défautContraintes de labels :
.github/labels.yml de préférence s'il existeMises à jour sûres :
--dry-runMaintien de cohérence :
<!-- --> en <!-- -->Important : GitHub CLI (gh pr edit) échappe automatiquement les commentaires HTML. De plus, le traitement de redirection du shell peut introduire des chaînes invalides comme EOF < /dev/null.
--field pour un traitement d'échappement approprié# Sortie de journal détaillée (à ajouter lors de l'implémentation)
/pr-auto-update --verbose
/pr-auto-updateComando para atualizar automaticamente a descrição e rótulos de Pull Requests. Analisa as alterações do Git para gerar e definir descrições e rótulos apropriados.