---
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: 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.

### 0.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
```

### 0.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)
    PR_EXISTS=$(gh pr list --head "$BRANCH" --json number --jq '.[0]')

    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:")
  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)
}
```

---

## 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

| Type branche | Format titre |
|--------------|--------------|
| `feature/*` | `feat: {description from branch name}` |
| `hotfix/*` | `fix: {description from branch name}` |
| `release/*` | `release: v{version}` |
| Autre | `{branch name}` |

**Extraction description:**
```
feature/add-user-authentication → "add user authentication"
hotfix/fix-login-bug → "fix login bug"
```

### Description automatique

```markdown
## Summary

{Liste des commits depuis divergence avec develop}

## Changes

- {Fichiers modifies groupes par type}

## Checklist

- [ ] Tests ajoutés/mis à jour
- [ ] Documentation mise à jour
- [ ] Breaking changes documentés
- [ ] Migration EF Core testée (si applicable)

## EF Core Migrations

{Liste des migrations incluses, ou "Aucune migration"}

---
🤖 Generated with GitFlow
```

### Labels automatiques

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

---

## Execution

```bash
gh pr create \
  --base {target} \
  --title "{titre}" \
  --body "{description}" \
  --label "{labels}" \
  --assignee "@me"
```

### Options supplementaires

| Option | Condition | Action |
|--------|-----------|--------|
| `--draft` | Si WIP dans titre | Creer comme draft |
| `--reviewer` | Si configure dans config.json | Ajouter reviewers |
| `--milestone` | Si release | Associer milestone |

---

## Post-creation

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

---

## Resume

```
PULL REQUEST CREEE
────────────────────────────────
PR:      #{number}
Titre:   {titre}
Base:    {target} ← {current}
URL:     {url}

Checks:
  Build:      ✓/✗
  Tests:      ✓/✗
  EF Core:    ✓/✗/N/A
  Conflicts:  ✓/✗

Labels: {labels}
────────────────────────────────
Prochain: /gitflow:8-review #{number}
```

---

## 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 |

## 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.
