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
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 5,060 | 3,574 | -29% | 1 | 1 | 0% | 908 | 4,358 | +380% | 0 | 0 | — |
case-02 | fail→fail | 5,895 | 3,604 | -39% | 1 | 1 | 0% | 470 | 4,545 | +867% | 0 | 0 | — |
case-03 | fail→fail | 7,741 | 4,411 | -43% | 1 | 1 | 0% | 1,445 | 4,575 | +217% | 0 | 0 | — |
case-04 | fail→pass | 10,053 | 7,788 | -23% | 1 | 1 | 0% | 1,885 | 5,342 | +183% | 0 | 0 | — |
case-05 | fail→pass | 10,068 | 9,378 | -7% | 1 | 1 | 0% | 1,841 | 5,599 | +204% | 0 | 0 | — |
case-06 | pass→pass | 8,474 | 1,951 | -77% | 1 | 1 | 0% | 1,458 | 4,258 | +192% | 0 | 0 | — |
case-07 | pass→pass | 7,573 | 1,735 | -77% | 1 | 1 | 0% | 1,174 | 4,176 | +256% | 0 | 0 | — |
case-08 | pass→pass | 9,335 | 4,094 | -56% | 1 | 1 | 0% | 1,732 | 4,649 | +168% | 0 | 0 | — |
case-09 | pass→pass | 14,357 | 3,581 | -75% | 1 | 1 | 0% | 2,294 | 4,483 | +95% | 0 | 0 | — |
case-10 | pass→pass | 5,385 | 2,432 | -55% | 1 | 1 | 0% | 929 | 4,295 | +362% | 0 | 0 | — |
case-11 | pass→pass | 8,000 | 1,357 | -83% | 1 | 1 | 0% | 1,324 | 4,125 | +212% | 0 | 0 | — |
case-12 | pass→pass | 7,648 | 2,297 | -70% | 1 | 1 | 0% | 1,160 | 4,252 | +267% | 0 | 0 | — |
case-13 | pass→pass | 6,920 | 3,738 | -46% | 1 | 1 | 0% | 1,261 | 4,544 | +260% | 0 | 0 | — |
case-14 | pass→pass | 5,791 | 3,422 | -41% | 1 | 1 | 0% | 987 | 4,450 | +351% | 0 | 0 | — |
case-15 | fail→pass | 10,833 | 3,117 | -71% | 1 | 1 | 0% | 1,933 | 4,425 | +129% | 0 | 0 | — |
case-16 | fail→pass | 10,905 | 2,136 | -80% | 1 | 1 | 0% | 1,889 | 4,308 | +128% | 0 | 0 | — |
case-17 | fail→pass | 9,934 | 1,752 | -82% | 1 | 1 | 0% | 1,657 | 4,175 | +152% | 0 | 0 | — |
case-18 | pass→pass | 10,143 | 3,696 | -64% | 1 | 1 | 0% | 1,522 | 4,572 | +200% | 0 | 0 | — |
case-19 | fail→pass | 5,067 | 1,946 | -62% | 1 | 1 | 0% | 930 | 4,248 | +357% | 0 | 0 | — |
case-20 | pass→pass | 7,101 | 2,337 | -67% | 1 | 1 | 0% | 1,147 | 4,224 | +268% | 0 | 0 | — |
case-21 | pass→pass | 5,023 | 3,259 | -35% | 1 | 1 | 0% | 840 | 4,432 | +428% | 0 | 0 | — |
case-22 | pass→pass | 6,426 | 5,649 | -12% | 1 | 1 | 0% | 1,141 | 4,887 | +328% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +27 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.