Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Mise à jour automatique de la description et des labels de PR. Se déclenche avec « mettre à jour la description du PR ».
.claude/skills/wasabeef-mise-a-jour-automatique-de-la-description-et-des-labels-de-pr/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-04 | ✗→✓ | ▲ Improved | 183% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 204% | 0% |
| case-15 | ✗→✓ | ▲ Improved | 129% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 128% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 152% | 0% |
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.
bash/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)bash# 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 :
bash# 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
bash# 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 :
bash# 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 :
bash# Obtenir la liste des labels existants gh api repos/{OWNER}/{REPO}/labels --jq '.[].name' # Exemple : Utiliser des labels standards comme bug, enhancement, documentation
bash#!/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 :
json{ "language": "fr", "max_labels": 3 }
markdown## 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}
markdown## 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
markdown## 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}
.github/PULL_REQUEST_TEMPLATE.md > Par défaut.github/labels.yml de préférence s'il existe--dry-run<!-- --> 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ébash# Sortie de journal détaillée (à ajouter lors de l'implémentation) /pr-auto-update --verbose
Other measured skills in the registry, with their headline benchmark lift.