@atlashub/smartstack-cli 1.9.0 → 1.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -199,6 +199,63 @@ if (NEEDS_PR.length > 0) {
199
199
 
200
200
  ---
201
201
 
202
+ ## ETAPE 2: SYNCHRONISATION ET VERIFICATION AHEAD/BEHIND
203
+
204
+ > **CRITIQUE:** Vérifier la synchronisation avec le remote avant de créer une PR.
205
+
206
+ ```bash
207
+ # Fetch pour avoir les dernières infos (si pas déjà fait en scan mode)
208
+ git fetch origin --quiet
209
+
210
+ CURRENT=$(git rev-parse --abbrev-ref HEAD)
211
+
212
+ # Déterminer la branche cible
213
+ if [[ "$CURRENT" == hotfix/* || "$CURRENT" == release/* ]]; then
214
+ TARGET="main"
215
+ else
216
+ TARGET="develop"
217
+ fi
218
+
219
+ # Vérifier synchronisation de la branche source
220
+ AHEAD=$(git rev-list --count origin/$CURRENT..HEAD 2>/dev/null || echo "0")
221
+ BEHIND=$(git rev-list --count HEAD..origin/$CURRENT 2>/dev/null || echo "0")
222
+
223
+ echo ""
224
+ echo "SYNCHRONISATION"
225
+ echo "───────────────────────────────────────"
226
+ echo " Branche: $CURRENT → $TARGET"
227
+ echo " AHEAD: $AHEAD commit(s) non poussé(s)"
228
+ echo " BEHIND: $BEHIND commit(s) non récupéré(s)"
229
+ echo ""
230
+
231
+ # Avertissements
232
+ if [ "$BEHIND" -gt 0 ]; then
233
+ echo "⚠️ ATTENTION: Votre branche locale est en retard de $BEHIND commit(s)"
234
+ echo "→ Recommandation: git pull origin $CURRENT avant de créer la PR"
235
+ echo ""
236
+ fi
237
+
238
+ if [ "$AHEAD" -eq 0 ]; then
239
+ echo "ℹ️ Tous vos commits sont déjà poussés sur origin"
240
+ fi
241
+
242
+ # Vérifier si branche à jour par rapport à la cible
243
+ BEHIND_TARGET=$(git rev-list --count HEAD..origin/$TARGET 2>/dev/null || echo "0")
244
+ if [ "$BEHIND_TARGET" -gt 0 ]; then
245
+ echo "⚠️ Votre branche est en retard de $BEHIND_TARGET commit(s) par rapport à $TARGET"
246
+ echo "→ Recommandation: git rebase origin/$TARGET pour intégrer les derniers changements"
247
+ echo ""
248
+ fi
249
+ ```
250
+
251
+ | État | Signification | Action |
252
+ |------|---------------|--------|
253
+ | AHEAD > 0, BEHIND = 0 | Commits prêts à être dans la PR | ✅ Continuer |
254
+ | BEHIND > 0 | Commits remote non récupérés | `git pull origin {branch}` |
255
+ | BEHIND_TARGET > 0 | Branche cible a avancé | `git rebase origin/{target}` |
256
+
257
+ ---
258
+
202
259
  ## Pre-checks obligatoires
203
260
 
204
261
  ### 1. Validation branche et detection cible
@@ -289,45 +346,237 @@ echo "Cible: $TARGET"
289
346
 
290
347
  ### Titre automatique
291
348
 
292
- | Type branche | Format titre |
293
- |--------------|--------------|
294
- | `feature/*` | `feat: {description from branch name}` |
295
- | `hotfix/*` | `fix: {description from branch name}` |
296
- | `release/*` | `release: v{version}` |
297
- | Autre | `{branch name}` |
349
+ > **IMPORTANT:** Le titre de PR doit etre standardise et sans fautes d'orthographe.
350
+ >
351
+ > **Prefixes TOUJOURS en anglais (Conventional Commits):**
352
+ > - `feat:` pour les features (jamais "fonctionnalite:")
353
+ > - `fix:` pour les corrections (jamais "corriger:")
354
+ > - `release:` pour les releases
355
+ >
356
+ > Seule la **description** (apres le prefix) utilise la langue configuree.
357
+
358
+ | Type branche | Format titre | Exemple FR |
359
+ |--------------|--------------|------------|
360
+ | `feature/*` | `feat: {description}` | `feat: Ajouter Authentification` |
361
+ | `hotfix/*` | `fix: {description}` | `fix: Corriger Bug Login` |
362
+ | `release/*` | `release: v{version}` | `release: v1.5.0` |
363
+
364
+ **Extraction et normalisation de la description:**
298
365
 
299
- **Extraction description:**
366
+ ```bash
367
+ # ═══════════════════════════════════════════════════════════════
368
+ # EXTRACTION DU TITRE DE PR DEPUIS LE NOM DE BRANCHE
369
+ # ═══════════════════════════════════════════════════════════════
370
+
371
+ # Fonction pour convertir le nom de branche en titre lisible
372
+ branch_to_title() {
373
+ local branch="$1"
374
+
375
+ # Extraire la partie apres feature/, hotfix/, release/
376
+ local name=$(echo "$branch" | sed 's|^[^/]*/||')
377
+
378
+ # Remplacer les tirets par des espaces
379
+ local title=$(echo "$name" | tr '-' ' ')
380
+
381
+ # Mettre en majuscule la premiere lettre de chaque mot significatif
382
+ # (garder les mots courts comme "de", "le", "la" en minuscules si FR)
383
+ title=$(echo "$title" | sed 's/\b\(.\)/\u\1/g')
384
+
385
+ echo "$title"
386
+ }
387
+
388
+ # Exemples:
389
+ # feature/add-user-authentication → "Add User Authentication"
390
+ # hotfix/fix-login-bug → "Fix Login Bug"
391
+ # feature/ameliorer-performance-api → "Ameliorer Performance Api"
300
392
  ```
301
- feature/add-user-authentication → "add user authentication"
302
- hotfix/fix-login-bug "fix login bug"
393
+
394
+ **Generer le titre selon la langue configuree:**
395
+
396
+ ```bash
397
+ # Lire la configuration de langue
398
+ CONFIG_FILE=".claude/gitflow/config.json"
399
+ LANG_CODE="en"
400
+ if [ -f "$CONFIG_FILE" ]; then
401
+ LANG_CODE=$(grep -oP '"code":\s*"\K[^"]+' "$CONFIG_FILE" 2>/dev/null | head -1)
402
+ LANG_CODE=${LANG_CODE:-en}
403
+ fi
404
+
405
+ # Extraire le type de branche
406
+ if [[ "$CURRENT" == feature/* ]]; then
407
+ BRANCH_TYPE="feature"
408
+ PREFIX="feat"
409
+ elif [[ "$CURRENT" == hotfix/* ]]; then
410
+ BRANCH_TYPE="hotfix"
411
+ PREFIX="fix"
412
+ elif [[ "$CURRENT" == release/* ]]; then
413
+ BRANCH_TYPE="release"
414
+ PREFIX="release"
415
+ # Pour les releases, extraire la version
416
+ VERSION=$(echo "$CURRENT" | sed 's|release/v\?||')
417
+ fi
418
+
419
+ # Generer le titre
420
+ if [ "$BRANCH_TYPE" = "release" ]; then
421
+ PR_TITLE="${PREFIX}: v${VERSION}"
422
+ else
423
+ DESCRIPTION=$(branch_to_title "$CURRENT")
424
+ PR_TITLE="${PREFIX}: ${DESCRIPTION}"
425
+ fi
426
+
427
+ echo "Titre PR genere: $PR_TITLE"
428
+ ```
429
+
430
+ **Validation du titre:**
431
+
432
+ ```bash
433
+ # ═══════════════════════════════════════════════════════════════
434
+ # VALIDATION DU TITRE DE PR
435
+ # ═══════════════════════════════════════════════════════════════
436
+ # Regles:
437
+ # - Longueur max: 72 caracteres
438
+ # - Format: {prefix}: {description}
439
+ # - Pas de caracteres speciaux interdits
440
+ # - Premiere lettre de description en majuscule
441
+ # ═══════════════════════════════════════════════════════════════
442
+
443
+ validate_pr_title() {
444
+ local title="$1"
445
+
446
+ # 1. Verifier la longueur
447
+ if [ ${#title} -gt 72 ]; then
448
+ echo "⚠️ Titre trop long (${#title} > 72 chars), sera tronque"
449
+ title=$(echo "$title" | cut -c1-72)
450
+ fi
451
+
452
+ # 2. Verifier le format prefix:
453
+ if ! echo "$title" | grep -qE '^(feat|fix|release|chore|docs|refactor|test|perf|ci):'; then
454
+ echo "⚠️ Titre sans prefix valide, ajout de 'feat:'"
455
+ title="feat: $title"
456
+ fi
457
+
458
+ # 3. S'assurer que la description commence par une majuscule
459
+ title=$(echo "$title" | sed 's/: \([a-z]\)/: \U\1/')
460
+
461
+ echo "$title"
462
+ }
463
+
464
+ PR_TITLE=$(validate_pr_title "$PR_TITLE")
303
465
  ```
304
466
 
305
467
  ### Description automatique
306
468
 
469
+ > **CLAUDE INSTRUCTION - REDACTION EXPERTE DES PR**
470
+ >
471
+ > La description de PR doit etre **auto-explicative** et permettre a un reviewer de comprendre:
472
+ > 1. **Le contexte** - Pourquoi ce changement?
473
+ > 2. **La solution** - Quelle approche technique?
474
+ > 3. **L'impact** - Quel benefice concret?
475
+ >
476
+ > **Chaque point majeur = 1 paragraphe autonome** (comprehensible sans lire le reste)
477
+
478
+ #### Format expert de description PR
479
+
307
480
  ```markdown
308
- ## Summary
481
+ ## Resume
309
482
 
310
- {Liste des commits depuis divergence avec develop}
483
+ {1 phrase: Quoi + Pourquoi - pas de liste, juste l'essentiel}
311
484
 
312
- ## Changes
485
+ ## Changements
313
486
 
314
- - {Fichiers modifies groupes par type}
487
+ {Pour CHAQUE modification majeure, un paragraphe structure:}
315
488
 
316
- ## Checklist
489
+ ### {Nom du changement 1}
490
+
491
+ **CONTEXTE:** {Situation problematique avant - quel etait le manque ou le bug?}
492
+
493
+ **SOLUTION:** {Approche technique choisie - comment ca fonctionne maintenant?}
494
+
495
+ **BENEFICE:** {Impact concret mesurable - qu'est-ce que l'utilisateur/dev gagne?}
496
+
497
+ ### {Nom du changement 2}
498
+
499
+ **CONTEXTE:** {Description de la situation initiale}
500
+
501
+ **SOLUTION:** {Implementation technique}
502
+
503
+ **BENEFICE:** {Gain apporte}
504
+
505
+ ## Fichiers cles
506
+
507
+ | Fichier | Role |
508
+ |---------|------|
509
+ | `path/file1.ext` | {role en 5 mots max} |
510
+ | `path/file2.ext` | {role en 5 mots max} |
317
511
 
318
- - [ ] Tests ajoutés/mis à jour
319
- - [ ] Documentation mise à jour
320
- - [ ] Breaking changes documentés
321
- - [ ] Migration EF Core testée (si applicable)
512
+ ## Migrations EF Core
322
513
 
323
- ## EF Core Migrations
514
+ {Si applicable:}
515
+ | Migration | Apport |
516
+ |-----------|--------|
517
+ | `{Timestamp}_{Name}` | {Ce qu'elle ajoute/modifie} |
324
518
 
325
- {Liste des migrations incluses, ou "Aucune migration"}
519
+ {Sinon: "Aucune migration incluse"}
520
+
521
+ ## Test
522
+
523
+ {Comment valider que ca fonctionne - etapes concretes}
524
+
525
+ ## Checklist
526
+
527
+ - [ ] Tests ajoutes/mis a jour
528
+ - [ ] Documentation mise a jour si necessaire
529
+ - [ ] Breaking changes documentes
530
+ - [ ] Migration EF Core testee (si applicable)
326
531
 
327
532
  ---
328
533
  🤖 Generated with GitFlow
329
534
  ```
330
535
 
536
+ #### Regles de redaction PR
537
+
538
+ | Principe | Application |
539
+ |----------|-------------|
540
+ | **Contexte d'abord** | Toujours expliquer le POURQUOI avant le COMMENT |
541
+ | **Paragraphes autonomes** | Chaque section comprehensible independamment |
542
+ | **Impact mesurable** | Benefices concrets, pas de vagues "ameliorations" |
543
+ | **Fichiers avec role** | Pas juste la liste, mais CE QUE fait chaque fichier |
544
+ | **Zero jargon sans explication** | Si terme technique, l'expliquer brievement |
545
+
546
+ #### Verbes d'impact pour titres de sections
547
+
548
+ | Eviter | Utiliser |
549
+ |--------|----------|
550
+ | "Ajout de X" | "Implemente X pour permettre Y" |
551
+ | "Modification de X" | "Optimise X - gain de Y" |
552
+ | "Correction de X" | "Resout X qui causait Y" |
553
+ | "Mise a jour de X" | "Ameliore X en ajoutant Y" |
554
+
555
+ #### Exemples de paragraphes bien rediges
556
+
557
+ **BON:**
558
+ ```
559
+ ### Rescue to Feature
560
+
561
+ **CONTEXTE:** Les developpeurs qui commitaient par erreur sur develop perdaient
562
+ leur travail lors du reset, sans moyen simple de le recuperer.
563
+
564
+ **SOLUTION:** Detection automatique des modifications sur develop (commits,
565
+ fichiers stages, untracked) avec creation d'un tag de sauvegarde avant toute
566
+ operation destructive, puis migration transparente vers une feature branch.
567
+
568
+ **BENEFICE:** Zero perte de travail - meme en cas d'erreur de workflow,
569
+ le code est preserve et accessible via le tag rescue.
570
+ ```
571
+
572
+ **MAUVAIS:**
573
+ ```
574
+ ### Rescue to Feature
575
+
576
+ Ajout d'une fonctionnalite de rescue. Permet de sauvegarder le travail.
577
+ Modifie plusieurs fichiers.
578
+ ```
579
+
331
580
  ### Labels automatiques
332
581
 
333
582
  | Condition | Label |
@@ -37,6 +37,42 @@ fi
37
37
 
38
38
  ---
39
39
 
40
+ ## ETAPE 0.5: SYNCHRONISATION AVEC REMOTE
41
+
42
+ > **CRITIQUE:** Toujours synchroniser avec le remote avant toute opération de merge.
43
+
44
+ ```bash
45
+ echo "Synchronisation avec remote..."
46
+ git fetch --all --quiet
47
+
48
+ # Vérifier l'état de synchronisation
49
+ CURRENT=$(git rev-parse --abbrev-ref HEAD)
50
+ echo "Branche courante: $CURRENT"
51
+
52
+ # Afficher état AHEAD/BEHIND pour information
53
+ if [[ "$CURRENT" != "main" && "$CURRENT" != "develop" ]]; then
54
+ AHEAD=$(git rev-list --count origin/$CURRENT..HEAD 2>/dev/null || echo "0")
55
+ BEHIND=$(git rev-list --count HEAD..origin/$CURRENT 2>/dev/null || echo "0")
56
+
57
+ if [ "$BEHIND" -gt 0 ]; then
58
+ echo "⚠️ Attention: Votre branche locale est en retard de $BEHIND commit(s)"
59
+ echo "→ Recommandation: git pull origin $CURRENT"
60
+ fi
61
+
62
+ if [ "$AHEAD" -gt 0 ]; then
63
+ echo "ℹ️ Votre branche locale a $AHEAD commit(s) non poussé(s)"
64
+ fi
65
+ fi
66
+ ```
67
+
68
+ | État | Signification | Action recommandée |
69
+ |------|---------------|-------------------|
70
+ | BEHIND > 0 | Commits remote non récupérés | `git pull origin {branch}` |
71
+ | AHEAD > 0 | Commits locaux non poussés | `git push origin {branch}` |
72
+ | BEHIND = AHEAD = 0 | Parfaitement synchronisé | ✅ Prêt |
73
+
74
+ ---
75
+
40
76
  ## ETAPE 1: SCAN PROACTIF (si pas d'argument)
41
77
 
42
78
  > **COMPORTEMENT PROACTIF:** Si aucun numero de PR fourni, scanner TOUTES les PRs ouvertes pour proposer celles qui sont pretes a merger.