AgentSkillsCN

git:branch

以结构化的流程创建 Git 分支

SKILL.md
--- frontmatter
name: git:branch
description: Création de branche Git avec workflow structuré
model: haiku
allowed-tools: [Bash, AskUserQuestion]
argument-hint: <source-branch> [issue-number-or-text]
version: 1.0.0
license: MIT
hooks:
  PreToolUse:
    - matcher: "Bash(git checkout:*)"
      hooks:
        - type: command
          command: |
            # Hook 1: Bloquer si modifications non commitées
            if ! git diff --quiet || ! git diff --cached --quiet; then
              echo "❌ ERREUR : Modifications non commitées détectées"
              echo ""
              echo "Fichiers modifiés :"
              git status --short
              echo ""
              echo "Vous devez commit ou stash avant de créer une branche"
              exit 1
            fi
          once: true
    - matcher: "Bash(git branch:*)"
      hooks:
        - type: command
          command: |
            # Hook 2: Validation branche source existe (détection du premier argument)
            SOURCE_BRANCH=$(echo "$ARGUMENTS" | awk '{print $1}')
            if [ -n "$SOURCE_BRANCH" ] && ! git rev-parse --verify "$SOURCE_BRANCH" >/dev/null 2>&1; then
              echo "❌ ERREUR : La branche source '$SOURCE_BRANCH' n'existe pas"
              echo ""
              echo "Branches disponibles :"
              git branch -a
              exit 1
            fi
          once: true
  PostToolUse:
    - matcher: "Bash(git checkout -b:*)"
      hooks:
        - type: command
          command: |
            # Hook 3: Feedback création
            BRANCH=$(git branch --show-current)
            echo "✅ Branche créée : $BRANCH"
            echo "📝 Le tracking sera configuré automatiquement au premier commit"
          once: false

Configuration de sortie

IMPORTANT : Cette skill effectue une opération Git rapide et nécessite un format de sortie spécifique.

Lis le frontmatter de cette skill. Si un champ output-style est présent, exécute immédiatement :

code
/output-style <valeur-du-champ>

Note : Une fois que le champ output-style sera supporté nativement par Claude Code, cette instruction pourra être supprimée.

Création de branche Git

Créer une nouvelle branche Git de manière structurée avec support des issues GitHub.

Variables

  • SOURCE_BRANCH: Premier argument ($1) - branche source depuis laquelle créer
  • ISSUE_OR_TEXT: Second argument ($2) - numéro d'issue GitHub ou texte descriptif

Relevant Files

  • @.git/config
  • @.gitignore
  • @docs/README.md

Instructions à Exécuter

IMPORTANT : Exécute ce workflow étape par étape :

🚨 ÉTAPE CRITIQUE : CHECKOUT VERS SOURCE D'ABORD 🚨

1. Vérifier que SOURCE_BRANCH est fourni

  • Extrais SOURCE_BRANCH depuis $ARGUMENTS (premier argument)
  • Si SOURCE_BRANCH n'est pas fourni, utilise AskUserQuestion pour demander :
    code
    Question: "Depuis quelle branche veux-tu créer la nouvelle branche ?"
    Options: ["main", "master", "develop", "Autre"]
    

2. Valider que SOURCE_BRANCH existe localement

  • Exécute git branch --list "$SOURCE_BRANCH" avec Bash
  • Si le résultat est vide, affiche :
    code
    ❌ ERREUR : La branche source '$SOURCE_BRANCH' n'existe pas localement
    
    Branches disponibles :
    
    • Puis exécute git branch -a pour lister les branches
    • Arrête le workflow

3. 🔴 CHECKOUT VERS SOURCE_BRANCH AVANT TOUT 🔴

  • Exécute git checkout $SOURCE_BRANCH avec Bash
  • Exécute git branch --show-current pour vérifier qu'on est bien dessus
  • CRITIQUE : Cette étape garantit qu'on crée depuis un point propre

4. 🔴 PULL POUR METTRE À JOUR SOURCE_BRANCH 🔴

  • Exécute git pull origin $SOURCE_BRANCH avec Bash
  • CRITIQUE : Garantit qu'on part du dernier commit de origin
  • Évite de créer depuis un point obsolète

5. Générer le nom de la nouvelle branche

  • Extrais ISSUE_OR_TEXT depuis $ARGUMENTS (second argument)

Si ISSUE_OR_TEXT est fourni :

A. Détecter le type (numéro ou texte)

  • Si ISSUE_OR_TEXT est un entier → c'est un numéro d'issue
  • Sinon → c'est du texte descriptif

B. Si c'est un numéro d'issue :

  • Exécute gh issue view ${ISSUE_OR_TEXT} --json title,labels,body avec Bash
  • Si l'issue n'existe pas, affiche une erreur et arrête

Détermine le préfixe (dans cet ordre de priorité) :

  1. Vérifie les labels de l'issue (priorité haute) :

    • Labels bug, fix, bugfix → préfixe = fix/
    • Labels hotfix, critical, urgent → préfixe = hotfix/
    • Labels feature, enhancement, new-feature → préfixe = feature/
    • Labels chore, maintenance, refactor → préfixe = chore/
    • Labels documentation, docs → préfixe = docs/
    • Labels test, tests → préfixe = test/
  2. Si aucun label pertinent, vérifie la description (case-insensitive) :

    • Contient fix, bug, error, crash → préfixe = fix/
    • Contient hotfix, critical, urgent, production → préfixe = hotfix/
    • Contient feature, add, implement, new → préfixe = feature/
    • Contient refactor, cleanup, improve → préfixe = chore/
  3. Si toujours rien, vérifie le titre de l'issue :

    • Même logique que pour la description
  4. Si aucun indicateur trouvé → préfixe = feature/ (défaut)

  • Nettoie le titre de l'issue :
    • Convertis en minuscules
    • Remplace espaces par tirets
    • Supprime caractères spéciaux
    • Limite à 50 caractères
  • Génère le nom : {prefixe}{ISSUE_OR_TEXT}-{titre-nettoyé}

C. Si c'est du texte descriptif :

  • Analyse le début du texte pour détecter le préfixe :

    • Commence par fix, bug → préfixe = fix/
    • Commence par hotfix → préfixe = hotfix/
    • Commence par chore, refactor → préfixe = chore/
    • Commence par docs, doc → préfixe = docs/
    • Commence par test → préfixe = test/
    • Sinon → préfixe = feature/ (défaut)
  • Nettoie le texte :

    • Retire le préfixe détecté du début
    • Convertis en minuscules
    • Remplace espaces par tirets
    • Supprime caractères spéciaux
  • Génère le nom : {prefixe}{texte-nettoyé}

Si ISSUE_OR_TEXT n'est pas fourni :

  • Utilise AskUserQuestion pour demander le nom de branche

6. Vérifier que la nouvelle branche n'existe pas

  • Exécute git branch --list "$NEW_BRANCH" avec Bash
  • Si le résultat n'est pas vide, affiche :
    code
    ❌ ERREUR : La branche '$NEW_BRANCH' existe déjà
    
    Choisis un autre nom de branche
    
    • Arrête le workflow

7. Créer et checkout la nouvelle branche

  • Exécute git checkout -b $NEW_BRANCH avec Bash
  • La branche est créée depuis SOURCE_BRANCH (car on est dessus)

8. Afficher le résumé

Affiche :

code
✅ Branche créée : $NEW_BRANCH
📝 Préfixe détecté : {source du préfixe (label/description/titre/défaut/texte)}
📍 Depuis : $SOURCE_BRANCH
{Si issue} 🔗 Issue associée : #{ISSUE_OR_TEXT}

📝 Le tracking sera configuré automatiquement au premier commit avec :
   git push -u origin $NEW_BRANCH

⚠️ IMPORTANT - NE PAS configurer de tracking automatiquement :

  • INTERDIT : git branch --set-upstream-to=origin/$SOURCE_BRANCH $NEW_BRANCH
  • ✅ Le tracking sera configuré lors du premier push avec -u
  • RAISON : Configurer le tracking vers SOURCE_BRANCH pousse les commits sur la branche parente au lieu de créer une nouvelle branche distante

Expertise

Conventions de nommage des branches (préfixe détecté automatiquement) :

  • feature/{numéro}-{description} : Nouvelles fonctionnalités
  • fix/{numéro}-{description} : Corrections de bugs
  • hotfix/{numéro}-{description} : Corrections urgentes en production
  • chore/{numéro}-{description} : Maintenance, refactoring
  • docs/{numéro}-{description} : Documentation
  • test/{numéro}-{description} : Tests
  • Utilise des tirets, pas d'espaces ni caractères spéciaux

Détection automatique du préfixe (par priorité) :

  1. Labels de l'issue GitHub
  2. Mots-clés dans la description de l'issue
  3. Mots-clés dans le titre de l'issue
  4. Défaut : feature/ si aucun indicateur trouvé

Template

bash
# Exemple 1 : Issue avec label "bug"
/git:branch main 42
# Résultat :
# - Récupère l'issue #42 (labels: ["bug"])
# - Titre: "Login form crashes on submit"
# - Détecte le préfixe "fix/" via le label
# - Crée la branche: fix/42-login-form-crashes-on-submit

# Exemple 2 : Issue avec label "feature"
/git:branch main 58
# Résultat :
# - Récupère l'issue #58 (labels: ["enhancement"])
# - Titre: "Add dark mode support"
# - Détecte le préfixe "feature/" via le label
# - Crée la branche: feature/58-add-dark-mode-support

# Exemple 3 : Issue sans label, description contient "fix"
/git:branch main 99
# Résultat :
# - Récupère l'issue #99 (labels: [])
# - Description contient "This will fix the error..."
# - Détecte le préfixe "fix/" via la description
# - Crée la branche: fix/99-{titre-simplifie}

# Exemple 4 : Issue sans label, sans description, titre contient "bug"
/git:branch main 123
# Résultat :
# - Récupère l'issue #123 (labels: [], description vide)
# - Titre: "Bug in user profile"
# - Détecte le préfixe "fix/" via le titre
# - Crée la branche: fix/123-bug-in-user-profile

# Exemple 5 : Texte descriptif avec préfixe explicite
/git:branch main "fix login validation"
# Résultat :
# - Détecte "fix" au début du texte
# - Crée la branche: fix/login-validation

# Exemple 6 : Texte descriptif sans préfixe
/git:branch main "Add OAuth support"
# Résultat :
# - Pas de préfixe détecté → défaut "feature/"
# - Crée la branche: feature/add-oauth-support

Examples

bash
# Créer une branche depuis main avec issue GitHub (détection auto du préfixe)
/git:branch main 123
# → Le préfixe sera détecté via labels/description/titre de l'issue

# Créer une branche depuis main avec texte descriptif
/git:branch main "user authentication"
# → Créera: feature/user-authentication (défaut)

# Créer une branche fix depuis main avec texte explicite
/git:branch main "fix login bug"
# → Créera: fix/login-bug (détecté via "fix" au début)

# Créer une branche hotfix depuis main
/git:branch main "hotfix critical payment issue"
# → Créera: hotfix/critical-payment-issue (détecté via "hotfix")

# Créer une branche depuis develop sans argument supplémentaire
/git:branch develop
# → Demandera le nom de branche à l'utilisateur

# Créer une branche depuis une branche existante avec issue
/git:branch feature/api-base 456
# → Préfixe détecté automatiquement depuis l'issue #456

Report

  • Nom de la branche créée
  • Préfixe détecté et sa source (label/description/titre/défaut)
  • Branche source utilisée
  • Issue associée (si applicable)
  • Statut du checkout
  • Note : Le tracking remote sera configuré lors du premier push avec git push -u origin $NEW_BRANCH

Validation

  • SOURCE_BRANCH doit exister localement
  • SOURCE_BRANCH est obligatoire
  • CHECKOUT vers SOURCE_BRANCH AVANT création (CRITIQUE)
  • PULL pour mettre à jour SOURCE_BRANCH (CRITIQUE)
  • ✅ La nouvelle branche ne doit pas déjà exister
  • ✅ Si ISSUE_OR_TEXT est un numéro, l'issue doit exister sur GitHub
  • ✅ Le nom généré respecte les conventions de nommage
  • ✅ Détection automatique entre numéro d'issue et texte descriptif

Pourquoi checkout + pull vers SOURCE_BRANCH d'abord ?

Problème 1 évité :

  • Si on est sur feature/A et on crée feature/B depuis main
  • Sans checkout vers main d'abord, la branche est créée depuis feature/A
  • Les commits de feature/A se retrouvent sur feature/B
  • Résultat : impossible de créer une PR propre

Problème 2 évité :

  • Si main locale est en retard sur origin/main
  • Sans pull, on crée depuis un point obsolète
  • Résultat : commits manquants, conflits, PR avec historique incorrect

Solution :

  1. TOUJOURS faire git checkout $SOURCE_BRANCH
  2. TOUJOURS faire git pull origin $SOURCE_BRANCH
  3. PUIS créer avec git checkout -b $NEW_BRANCH