---
description: Phase 7 - Create Pull Request with auto-generated description and checks
agent: gitflow-pr
model: haiku
---

# Phase 7: PULL-REQUEST - Creation PR avec checks

Tu es expert GitFlow. Cree une Pull Request avec validation complete.

**Argument:** `$ARGUMENTS` = branche cible (optionnel, **SCAN AUTOMATIQUE** si sur main/develop)

---

## ETAPE 0: DETECTION DU PROVIDER GIT

> **CRITIQUE:** Detecter si le remote est GitHub ou Azure DevOps pour utiliser le bon CLI.

### 0.0 Detection du provider

```bash
REMOTE_URL=$(git remote get-url origin 2>/dev/null || echo "")

if [[ "$REMOTE_URL" == *"dev.azure.com"* ]] || [[ "$REMOTE_URL" == *"visualstudio.com"* ]]; then
  GIT_PROVIDER="azuredevops"
  # Extraire org et project depuis l'URL Azure DevOps
  # Format: https://dev.azure.com/{org}/{project}/_git/{repo}
  # ou: https://{org}@dev.azure.com/{org}/{project}/_git/{repo}
  if [[ "$REMOTE_URL" =~ dev\.azure\.com/([^/]+)/([^/]+)/_git/([^/]+) ]]; then
    AZURE_ORG="${BASH_REMATCH[1]}"
    AZURE_PROJECT="${BASH_REMATCH[2]}"
    AZURE_REPO="${BASH_REMATCH[3]}"
  fi
  echo "Provider: Azure DevOps (org: $AZURE_ORG, project: $AZURE_PROJECT)"
elif [[ "$REMOTE_URL" == *"github.com"* ]]; then
  GIT_PROVIDER="github"
  echo "Provider: GitHub"
else
  GIT_PROVIDER="unknown"
  echo "⚠️ Provider non reconnu - tentative avec GitHub CLI"
fi
```

### 0.0.1 Verification CLI disponible

```bash
if [ "$GIT_PROVIDER" = "azuredevops" ]; then
  if ! command -v az &> /dev/null; then
    echo "❌ Azure CLI non installe!"
    echo ""
    echo "Installation:"
    echo "  Windows: winget install Microsoft.AzureCLI"
    echo "  macOS:   brew install azure-cli"
    echo "  Linux:   curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash"
    exit 1
  fi
  # Verifier extension devops
  if ! az devops --help &> /dev/null; then
    echo "Installation extension Azure DevOps..."
    az extension add --name azure-devops
  fi
else
  if ! command -v gh &> /dev/null; then
    echo "❌ GitHub CLI non installe!"
    echo ""
    echo "Installation: https://cli.github.com"
    exit 1
  fi
fi
```

---

## ETAPE 1: SCAN PROACTIF (si sur main/develop)

> **COMPORTEMENT PROACTIF:** Si on est sur main ou develop, scanner TOUTES les branches pour proposer celles qui ont besoin d'une PR.

### 1.1 Detection du contexte

```bash
CURRENT=$(git rev-parse --abbrev-ref HEAD)

# Si sur main ou develop → mode scan
if [[ "$CURRENT" == "main" || "$CURRENT" == "develop" ]]; then
  SCAN_MODE=true
else
  SCAN_MODE=false
fi
```

### 1.2 Scanner les branches sans PR (si SCAN_MODE)

```bash
if [ "$SCAN_MODE" = true ]; then
  git fetch --all --quiet

  # Lister toutes les branches feature/release/hotfix
  FEATURES=$(git branch -r | grep 'origin/feature/' | sed 's|origin/||' | tr -d ' ')
  RELEASES=$(git branch -r | grep 'origin/release/' | sed 's|origin/||' | tr -d ' ')
  HOTFIXES=$(git branch -r | grep 'origin/hotfix/' | sed 's|origin/||' | tr -d ' ')

  ALL_BRANCHES="$FEATURES $RELEASES $HOTFIXES"

  for BRANCH in $ALL_BRANCHES; do
    # Verifier si PR existe (ouverte ou mergee)
    if [ "$GIT_PROVIDER" = "azuredevops" ]; then
      PR_EXISTS=$(az repos pr list --repository "$AZURE_REPO" --source-branch "$BRANCH" --organization "https://dev.azure.com/$AZURE_ORG" --project "$AZURE_PROJECT" --query "[0].pullRequestId" -o tsv 2>/dev/null)
    else
      PR_EXISTS=$(gh pr list --head "$BRANCH" --json number --jq '.[0]')
    fi

    if [ -z "$PR_EXISTS" ]; then
      # Pas de PR → candidat
      # Compter les commits
      if [[ "$BRANCH" == hotfix/* || "$BRANCH" == release/* ]]; then
        BASE="main"
      else
        BASE="develop"
      fi
      COMMITS=$(git rev-list --count origin/$BASE..origin/$BRANCH 2>/dev/null || echo "0")

      if [ "$COMMITS" -gt 0 ]; then
        NEEDS_PR+=("$BRANCH|$COMMITS|$BASE")
      fi
    fi
  done
fi
```

### 0.3 Afficher le tableau des branches sans PR

```
================================================================================
                    GITFLOW PULL-REQUEST - SCAN DES BRANCHES
================================================================================

📋 BRANCHES SANS PR (action recommandee):
┌─────────────────────────────┬───────────┬──────────┬───────────┬─────────────┐
│ Branche                     │ Type      │ Commits  │ Cible     │ Prete?      │
├─────────────────────────────┼───────────┼──────────┼───────────┼─────────────┤
│ feature/add-user-auth       │ feature   │ 5        │ develop   │ ✅ Oui      │
│ feature/wip-refactor        │ feature   │ 2        │ develop   │ ⚠️ Build?   │
│ hotfix/fix-login            │ hotfix    │ 1        │ main      │ ✅ Oui      │
│ release/v1.5.0              │ release   │ 8        │ main      │ ✅ Oui      │
└─────────────────────────────┴───────────┴──────────┴───────────┴─────────────┘

✅ BRANCHES AVEC PR OUVERTE:
┌─────────────────────────────┬───────────┬────────────┬────────────────────────┐
│ Branche                     │ Type      │ PR #       │ Statut                 │
├─────────────────────────────┼───────────┼────────────┼────────────────────────┤
│ feature/add-orders          │ feature   │ #43        │ Review en cours        │
└─────────────────────────────┴───────────┴────────────┴────────────────────────┘

================================================================================
```

### 0.4 Proposition interactive (si SCAN_MODE)

```javascript
if (NEEDS_PR.length > 0) {
  // Trier par priorite: hotfixes > releases > features
  const sorted = NEEDS_PR.sort((a, b) => {
    const priority = { 'hotfix': 0, 'release': 1, 'feature': 2 }
    return priority[getType(a)] - priority[getType(b)]
  })

  AskUserQuestion({
    questions: [{
      question: "Pour quelle branche voulez-vous creer une PR ?",
      header: "PR",
      options: sorted.map(item => {
        const [branch, commits, target] = item.split('|')
        return {
          label: branch,
          description: `${commits} commits → ${target} (${getType(branch)})`
        }
      }),
      multiSelect: false
    }]
  })

  // Switcher vers la branche selectionnee
  // git checkout $SELECTED_BRANCH
  // Puis continuer avec le workflow normal
} else {
  console.log("✅ Toutes les branches ont deja une PR!")
  console.log("")
  console.log("Actions disponibles:")
  if (GIT_PROVIDER === "azuredevops") {
    console.log("  - Voir les PRs:      az repos pr list --repository " + AZURE_REPO)
  } else {
    console.log("  - Voir les PRs:      gh pr list")
  }
  console.log("  - Merger une PR:     /gitflow:9-merge <numero>")
  console.log("  - Finaliser:         /gitflow:11-finish")
  exit(0)
}
```

---

## ETAPE 2: SYNCHRONISATION ET VERIFICATION AHEAD/BEHIND

> **CRITIQUE:** Vérifier la synchronisation avec le remote avant de créer une PR.

```bash
# Fetch pour avoir les dernières infos (si pas déjà fait en scan mode)
git fetch origin --quiet

CURRENT=$(git rev-parse --abbrev-ref HEAD)

# Déterminer la branche cible
if [[ "$CURRENT" == hotfix/* || "$CURRENT" == release/* ]]; then
  TARGET="main"
else
  TARGET="develop"
fi

# Vérifier synchronisation de la branche source
AHEAD=$(git rev-list --count origin/$CURRENT..HEAD 2>/dev/null || echo "0")
BEHIND=$(git rev-list --count HEAD..origin/$CURRENT 2>/dev/null || echo "0")

echo ""
echo "SYNCHRONISATION"
echo "───────────────────────────────────────"
echo "  Branche: $CURRENT → $TARGET"
echo "  AHEAD:   $AHEAD commit(s) non poussé(s)"
echo "  BEHIND:  $BEHIND commit(s) non récupéré(s)"
echo ""

# Avertissements
if [ "$BEHIND" -gt 0 ]; then
  echo "⚠️ ATTENTION: Votre branche locale est en retard de $BEHIND commit(s)"
  echo "→ Recommandation: git pull origin $CURRENT avant de créer la PR"
  echo ""
fi

if [ "$AHEAD" -eq 0 ]; then
  echo "ℹ️ Tous vos commits sont déjà poussés sur origin"
fi

# Vérifier si branche à jour par rapport à la cible
BEHIND_TARGET=$(git rev-list --count HEAD..origin/$TARGET 2>/dev/null || echo "0")
if [ "$BEHIND_TARGET" -gt 0 ]; then
  echo "⚠️ Votre branche est en retard de $BEHIND_TARGET commit(s) par rapport à $TARGET"
  echo "→ Recommandation: git rebase origin/$TARGET pour intégrer les derniers changements"
  echo ""
fi
```

| État | Signification | Action |
|------|---------------|--------|
| AHEAD > 0, BEHIND = 0 | Commits prêts à être dans la PR | ✅ Continuer |
| BEHIND > 0 | Commits remote non récupérés | `git pull origin {branch}` |
| BEHIND_TARGET > 0 | Branche cible a avancé | `git rebase origin/{target}` |

---

## Pre-checks obligatoires

### 1. Validation branche et detection cible

```bash
# Branche courante (ou selectionnee depuis scan)
CURRENT=$(git rev-parse --abbrev-ref HEAD)

# Verifier que ce n'est pas main/develop (sauf si scan mode a selectionne une branche)
if [[ "$CURRENT" == "main" || "$CURRENT" == "develop" ]]; then
  if [ "$SCAN_MODE" = true ] && [ -n "$SELECTED_BRANCH" ]; then
    # On a selectionne une branche depuis le scan, switcher
    git checkout "$SELECTED_BRANCH"
    CURRENT="$SELECTED_BRANCH"
  else
    echo "⚠️ Vous etes sur '$CURRENT' - impossible de creer une PR depuis cette branche."
    echo ""
    echo "→ Utilisez cette commande depuis une branche feature/release/hotfix"
    echo "   ou executez-la depuis main/develop pour scanner les branches disponibles."
    exit 1
  fi
fi

# ============================================
# DETECTION AUTOMATIQUE DE LA CIBLE
# ============================================
# GitFlow standard:
#   - feature/* → develop
#   - release/* → main (puis merge back to develop apres)
#   - hotfix/*  → main (puis merge back to develop apres)
# ============================================

if [[ -n "$ARGUMENTS" && "$ARGUMENTS" != "--"* ]]; then
  # Cible explicite fournie par l'utilisateur
  TARGET="$ARGUMENTS"
else
  # Detection automatique selon le type de branche
  if [[ "$CURRENT" == hotfix/* ]]; then
    TARGET="main"
    echo "Hotfix detecte → PR vers main (GitFlow standard)"
  elif [[ "$CURRENT" == release/* ]]; then
    TARGET="main"
    echo "Release detectee → PR vers main (GitFlow standard)"
  else
    TARGET="develop"
    echo "Feature/autre → PR vers develop"
  fi
fi

echo "Cible: $TARGET"
```

**Cibles par defaut (GitFlow standard):**

| Type branche | Cible PR | Raison |
|--------------|----------|--------|
| `feature/*` | `develop` | Features integrees sur develop |
| `release/*` | `main` | Releases deployees sur main |
| `hotfix/*` | `main` | Hotfixes appliques sur main d'abord |

### 2. Synchronisation

| Check | Commande | Action si echec |
|-------|----------|-----------------|
| Fetch | `git fetch origin` | - |
| A jour vs target | `git rev-list --count HEAD..origin/{target}` | `git rebase origin/{target}` |
| Pas de conflits | `git merge-tree` | Resoudre conflits d'abord |

### 3. Qualite code

| Check | Commande | Bloquant |
|-------|----------|----------|
| Build | `dotnet build` | OUI |
| Tests | `dotnet test` | OUI |
| Format | `dotnet format --verify-no-changes` | NON (warning) |

### 4. EF Core (si applicable)

| Check | Validation |
|-------|------------|
| Migrations completes | 3 fichiers (Migration + Designer + ModelSnapshot) |
| Build avec migrations | `dotnet ef migrations script --idempotent` |
| Pas de pending | Toutes migrations commitees |

---

## Generation PR

### Titre automatique

> **IMPORTANT:** Le titre de PR doit etre standardise et sans fautes d'orthographe.
>
> **Prefixes TOUJOURS en anglais (Conventional Commits):**
> - `feat:` pour les features (jamais "fonctionnalite:")
> - `fix:` pour les corrections (jamais "corriger:")
> - `release:` pour les releases
>
> Seule la **description** (apres le prefix) utilise la langue configuree.

| Type branche | Format titre | Exemple FR |
|--------------|--------------|------------|
| `feature/*` | `feat: {description}` | `feat: Ajouter Authentification` |
| `hotfix/*` | `fix: {description}` | `fix: Corriger Bug Login` |
| `release/*` | `release: v{version}` | `release: v1.5.0` |

**Extraction et normalisation de la description:**

```bash
# ═══════════════════════════════════════════════════════════════
# EXTRACTION DU TITRE DE PR DEPUIS LE NOM DE BRANCHE
# ═══════════════════════════════════════════════════════════════

# Fonction pour convertir le nom de branche en titre lisible
branch_to_title() {
  local branch="$1"

  # Extraire la partie apres feature/, hotfix/, release/
  local name=$(echo "$branch" | sed 's|^[^/]*/||')

  # Remplacer les tirets par des espaces
  local title=$(echo "$name" | tr '-' ' ')

  # Mettre en majuscule la premiere lettre de chaque mot significatif
  # (garder les mots courts comme "de", "le", "la" en minuscules si FR)
  title=$(echo "$title" | sed 's/\b\(.\)/\u\1/g')

  echo "$title"
}

# Exemples:
# feature/add-user-authentication → "Add User Authentication"
# hotfix/fix-login-bug → "Fix Login Bug"
# feature/ameliorer-performance-api → "Ameliorer Performance Api"
```

**Generer le titre selon la langue configuree:**

```bash
# Lire la configuration de langue
CONFIG_FILE=".claude/gitflow/config.json"
LANG_CODE="en"
if [ -f "$CONFIG_FILE" ]; then
  LANG_CODE=$(grep -oP '"code":\s*"\K[^"]+' "$CONFIG_FILE" 2>/dev/null | head -1)
  LANG_CODE=${LANG_CODE:-en}
fi

# Extraire le type de branche
if [[ "$CURRENT" == feature/* ]]; then
  BRANCH_TYPE="feature"
  PREFIX="feat"
elif [[ "$CURRENT" == hotfix/* ]]; then
  BRANCH_TYPE="hotfix"
  PREFIX="fix"
elif [[ "$CURRENT" == release/* ]]; then
  BRANCH_TYPE="release"
  PREFIX="release"
  # Pour les releases, extraire la version
  VERSION=$(echo "$CURRENT" | sed 's|release/v\?||')
fi

# Generer le titre
if [ "$BRANCH_TYPE" = "release" ]; then
  PR_TITLE="${PREFIX}: v${VERSION}"
else
  DESCRIPTION=$(branch_to_title "$CURRENT")
  PR_TITLE="${PREFIX}: ${DESCRIPTION}"
fi

echo "Titre PR genere: $PR_TITLE"
```

**Validation du titre:**

```bash
# ═══════════════════════════════════════════════════════════════
# VALIDATION DU TITRE DE PR
# ═══════════════════════════════════════════════════════════════
# Regles:
# - Longueur max: 72 caracteres
# - Format: {prefix}: {description}
# - Pas de caracteres speciaux interdits
# - Premiere lettre de description en majuscule
# ═══════════════════════════════════════════════════════════════

validate_pr_title() {
  local title="$1"

  # 1. Verifier la longueur
  if [ ${#title} -gt 72 ]; then
    echo "⚠️ Titre trop long (${#title} > 72 chars), sera tronque"
    title=$(echo "$title" | cut -c1-72)
  fi

  # 2. Verifier le format prefix:
  if ! echo "$title" | grep -qE '^(feat|fix|release|chore|docs|refactor|test|perf|ci):'; then
    echo "⚠️ Titre sans prefix valide, ajout de 'feat:'"
    title="feat: $title"
  fi

  # 3. S'assurer que la description commence par une majuscule
  title=$(echo "$title" | sed 's/: \([a-z]\)/: \U\1/')

  echo "$title"
}

PR_TITLE=$(validate_pr_title "$PR_TITLE")
```

### Description automatique

> **CLAUDE INSTRUCTION - REDACTION EXPERTE DES PR**
>
> La description de PR doit etre **auto-explicative** et permettre a un reviewer de comprendre:
> 1. **Le contexte** - Pourquoi ce changement?
> 2. **La solution** - Quelle approche technique?
> 3. **L'impact** - Quel benefice concret?
>
> **Chaque point majeur = 1 paragraphe autonome** (comprehensible sans lire le reste)

#### Format expert de description PR

```markdown
## Resume

{1 phrase: Quoi + Pourquoi - pas de liste, juste l'essentiel}

## Changements

{Pour CHAQUE modification majeure, un paragraphe structure:}

### {Nom du changement 1}

**CONTEXTE:** {Situation problematique avant - quel etait le manque ou le bug?}

**SOLUTION:** {Approche technique choisie - comment ca fonctionne maintenant?}

**BENEFICE:** {Impact concret mesurable - qu'est-ce que l'utilisateur/dev gagne?}

### {Nom du changement 2}

**CONTEXTE:** {Description de la situation initiale}

**SOLUTION:** {Implementation technique}

**BENEFICE:** {Gain apporte}

## Fichiers cles

| Fichier | Role |
|---------|------|
| `path/file1.ext` | {role en 5 mots max} |
| `path/file2.ext` | {role en 5 mots max} |

## Migrations EF Core

{Si applicable:}
| Migration | Apport |
|-----------|--------|
| `{Timestamp}_{Name}` | {Ce qu'elle ajoute/modifie} |

{Sinon: "Aucune migration incluse"}

## Test

{Comment valider que ca fonctionne - etapes concretes}

## Checklist

- [ ] Tests ajoutes/mis a jour
- [ ] Documentation mise a jour si necessaire
- [ ] Breaking changes documentes
- [ ] Migration EF Core testee (si applicable)

---
🤖 Generated with GitFlow
```

#### Regles de redaction PR

| Principe | Application |
|----------|-------------|
| **Contexte d'abord** | Toujours expliquer le POURQUOI avant le COMMENT |
| **Paragraphes autonomes** | Chaque section comprehensible independamment |
| **Impact mesurable** | Benefices concrets, pas de vagues "ameliorations" |
| **Fichiers avec role** | Pas juste la liste, mais CE QUE fait chaque fichier |
| **Zero jargon sans explication** | Si terme technique, l'expliquer brievement |

#### Verbes d'impact pour titres de sections

| Eviter | Utiliser |
|--------|----------|
| "Ajout de X" | "Implemente X pour permettre Y" |
| "Modification de X" | "Optimise X - gain de Y" |
| "Correction de X" | "Resout X qui causait Y" |
| "Mise a jour de X" | "Ameliore X en ajoutant Y" |

#### Exemples de paragraphes bien rediges

**BON:**
```
### Rescue to Feature

**CONTEXTE:** Les developpeurs qui commitaient par erreur sur develop perdaient
leur travail lors du reset, sans moyen simple de le recuperer.

**SOLUTION:** Detection automatique des modifications sur develop (commits,
fichiers stages, untracked) avec creation d'un tag de sauvegarde avant toute
operation destructive, puis migration transparente vers une feature branch.

**BENEFICE:** Zero perte de travail - meme en cas d'erreur de workflow,
le code est preserve et accessible via le tag rescue.
```

**MAUVAIS:**
```
### Rescue to Feature

Ajout d'une fonctionnalite de rescue. Permet de sauvegarder le travail.
Modifie plusieurs fichiers.
```

### Labels automatiques

| Condition | Label |
|-----------|-------|
| `feature/*` | `enhancement` |
| `hotfix/*` | `bug` |
| `release/*` | `release` |
| Contient migrations | `database` |
| Tests modifies | `tests` |

---

## Execution

### Pour GitHub

```bash
if [ "$GIT_PROVIDER" = "github" ]; then
  gh pr create \
    --base {target} \
    --title "{titre}" \
    --body "{description}" \
    --label "{labels}" \
    --assignee "@me"
fi
```

### Pour Azure DevOps

```bash
if [ "$GIT_PROVIDER" = "azuredevops" ]; then
  az repos pr create \
    --repository "$AZURE_REPO" \
    --source-branch "$CURRENT" \
    --target-branch "{target}" \
    --title "{titre}" \
    --description "{description}" \
    --organization "https://dev.azure.com/$AZURE_ORG" \
    --project "$AZURE_PROJECT"
fi
```

> **Note Azure DevOps:** Les labels et assignees ne sont pas supportes via CLI. Ajoutez-les manuellement via l'interface web si necessaire.

### Options supplementaires

| Option | Condition | GitHub | Azure DevOps |
|--------|-----------|--------|--------------|
| Draft | Si WIP dans titre | `--draft` | `--draft` |
| Reviewer | Si configure | `--reviewer` | Non supporte CLI |
| Milestone | Si release | `--milestone` | Non supporte CLI |

---

## Post-creation

1. Afficher URL de la PR
2. Afficher checklist restante
3. Suggerer `/gitflow:8-review` pour auto-review

---

## Resume

**Afficher un resume adapte au TYPE de branche et au PROVIDER:**

### Si FEATURE:

```
═══════════════════════════════════════════════════════════════════════════════
                         PULL REQUEST CRÉÉE
═══════════════════════════════════════════════════════════════════════════════

PR DETAILS
───────────────────────────────────────────────────────────────────────────────
  • PR:        #{number} - Statut: ACTIVE
  • Branche:   feature/{name} → develop
  • Build:     ✓ Passes (TypeScript types verified)
  • Commits:   {N} commits ({description})

URL DIRECT:
  {url}

WORKFLOW STATUT
───────────────────────────────────────────────────────────────────────────────
  ✓ Branche synchronisée avec develop
  ✓ Build vérifié
  ✓ Tests passés
  ✓ PR créée sur {GitHub|Azure DevOps}
  ✓ Branche poussée à origin

═══════════════════════════════════════════════════════════════════════════════
                         PROCHAINES ÉTAPES
═══════════════════════════════════════════════════════════════════════════════

1. Attendre la review et l'approbation de la PR

2. Merger la PR:
   /gitflow:9-merge {pr_number}

3. Finaliser et nettoyer:
   /gitflow:11-finish feature/{name}
   Cela va:
     ✓ Supprimer la branche feature/{name}
     ✓ Nettoyer le worktree

═══════════════════════════════════════════════════════════════════════════════
```

### Si RELEASE:

```
═══════════════════════════════════════════════════════════════════════════════
                         PULL REQUEST CRÉÉE
═══════════════════════════════════════════════════════════════════════════════

PR DETAILS
───────────────────────────────────────────────────────────────────────────────
  • PR:        #{number} - Statut: ACTIVE
  • Branche:   release/v{version} → main
  • Build:     ✓ Passes (TypeScript types verified)
  • Commits:   {N} commits (version bump + changes)

URL DIRECT:
  {url}

WORKFLOW STATUT
───────────────────────────────────────────────────────────────────────────────
  ✓ Branche synchronisée avec main
  ✓ Build vérifié
  ✓ Tests passés
  ✓ PR créée sur {GitHub|Azure DevOps}
  ✓ Branche poussée à origin

═══════════════════════════════════════════════════════════════════════════════
                         PROCHAINES ÉTAPES
═══════════════════════════════════════════════════════════════════════════════

1. Attendre la review et l'approbation de la PR

2. Merger la PR:
   /gitflow:9-merge {pr_number}

3. Finaliser la release:
   /gitflow:11-finish release/v{version}
   Cela va:
     ✓ Créer le tag v{version}
     ✓ Merger main → develop (merge back)
     ✓ Incrémenter la version sur develop ({version} → {next_minor})
     ✓ Nettoyer le worktree

═══════════════════════════════════════════════════════════════════════════════
```

### Si HOTFIX:

```
═══════════════════════════════════════════════════════════════════════════════
                         PULL REQUEST CRÉÉE
═══════════════════════════════════════════════════════════════════════════════

PR DETAILS
───────────────────────────────────────────────────────────────────────────────
  • PR:        #{number} - Statut: ACTIVE
  • Branche:   hotfix/{name} → main
  • Build:     ✓ Passes (TypeScript types verified)
  • Commits:   {N} commits (bug fixes)

URL DIRECT:
  {url}

WORKFLOW STATUT
───────────────────────────────────────────────────────────────────────────────
  ✓ Branche synchronisée avec main
  ✓ Build vérifié
  ✓ Tests passés
  ✓ PR créée sur {GitHub|Azure DevOps}
  ✓ Branche poussée à origin

═══════════════════════════════════════════════════════════════════════════════
                         PROCHAINES ÉTAPES
═══════════════════════════════════════════════════════════════════════════════

1. Attendre la review et l'approbation de la PR
   ⚠️  HOTFIX: Priorité élevée - review urgente recommandée

2. Merger la PR:
   /gitflow:9-merge {pr_number}

3. Finaliser le hotfix:
   /gitflow:11-finish hotfix/{name}
   Cela va:
     ✓ Incrémenter la version PATCH ({current} → {current+patch})
     ✓ Créer le tag v{new_version}
     ✓ Merger main → develop (merge back)
     ✓ Nettoyer le worktree

═══════════════════════════════════════════════════════════════════════════════
```

---

## Erreurs courantes

| Erreur | Solution |
|--------|----------|
| "No commits between" | Verifier que branche a des commits |
| "Merge conflict" | `git rebase origin/{target}` + resoudre |
| "Build failed" | Corriger erreurs avant PR |
| "PR already exists" | Afficher URL existante |
| "az: command not found" | Installer Azure CLI: `winget install Microsoft.AzureCLI` |
| "gh: command not found" | Installer GitHub CLI: https://cli.github.com |
| "Please run 'az login'" | Authentification requise: `az login` |

## Providers supportes

| Provider | CLI | Detection URL |
|----------|-----|---------------|
| **GitHub** | `gh` | `github.com` |
| **Azure DevOps** | `az repos` | `dev.azure.com` ou `visualstudio.com` |

## Modes

| Commande | Action |
|----------|--------|
| `/gitflow:7-pull-request` | PR vers cible auto-detectee (feature→develop, hotfix/release→main) |
| `/gitflow:7-pull-request develop` | PR vers develop (override) |
| `/gitflow:7-pull-request main` | PR vers main (override) |
| `/gitflow:7-pull-request --draft` | PR en draft |
| `/gitflow:7-pull-request --dry-run` | Simulation |

**Detection automatique de la cible:**

```
feature/*  → develop  (integration continue)
release/*  → main     (deploiement production)
hotfix/*   → main     (correction urgente production)
```

> **Note:** Le merge back vers develop est gere par `/gitflow:11-finish` apres le merge de la PR.
