@atlashub/smartstack-cli 1.9.0 → 1.10.1
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.
- package/dist/index.js +8 -4
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/commands/gitflow/1-init.md +166 -3
- package/templates/commands/gitflow/10-start.md +172 -16
- package/templates/commands/gitflow/11-finish.md +34 -1
- package/templates/commands/gitflow/3-commit.md +470 -5
- package/templates/commands/gitflow/7-pull-request.md +269 -20
- package/templates/commands/gitflow/9-merge.md +36 -0
- package/templates/commands/gitflow/rescue.md +867 -0
|
@@ -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
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
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
|
-
|
|
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
|
-
|
|
302
|
-
|
|
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
|
-
##
|
|
481
|
+
## Resume
|
|
309
482
|
|
|
310
|
-
{
|
|
483
|
+
{1 phrase: Quoi + Pourquoi - pas de liste, juste l'essentiel}
|
|
311
484
|
|
|
312
|
-
##
|
|
485
|
+
## Changements
|
|
313
486
|
|
|
314
|
-
|
|
487
|
+
{Pour CHAQUE modification majeure, un paragraphe structure:}
|
|
315
488
|
|
|
316
|
-
|
|
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
|
-
|
|
319
|
-
- [ ] Documentation mise à jour
|
|
320
|
-
- [ ] Breaking changes documentés
|
|
321
|
-
- [ ] Migration EF Core testée (si applicable)
|
|
512
|
+
## Migrations EF Core
|
|
322
513
|
|
|
323
|
-
|
|
514
|
+
{Si applicable:}
|
|
515
|
+
| Migration | Apport |
|
|
516
|
+
|-----------|--------|
|
|
517
|
+
| `{Timestamp}_{Name}` | {Ce qu'elle ajoute/modifie} |
|
|
324
518
|
|
|
325
|
-
{
|
|
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.
|