@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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlashub/smartstack-cli",
3
- "version": "1.9.0",
3
+ "version": "1.10.1",
4
4
  "description": "SmartStack Claude Code automation toolkit - GitFlow, APEX, EF Core migrations, prompts and more",
5
5
  "author": {
6
6
  "name": "SmartStack",
@@ -264,12 +264,65 @@ az devops project show --project "$AZ_PROJECT" > /dev/null 2>&1 || {
264
264
 
265
265
  ---
266
266
 
267
+ ### ÉTAPE 7.6 : Configuration de la langue
268
+
269
+ > **IMPORTANT:** La langue choisie s'applique UNIQUEMENT au contenu descriptif :
270
+ > - Description des features/hotfixes (partie apres `feature/` ou `hotfix/`)
271
+ > - Messages de commit (partie apres le prefix `feat:`, `fix:`, etc.)
272
+ > - Description dans les titres de PR
273
+ >
274
+ > **NON AFFECTE par la langue (toujours en anglais):**
275
+ > - Prefixes de branches: `feature/`, `release/`, `hotfix/`
276
+ > - Prefixes de commits: `feat:`, `fix:`, `chore:`, etc.
277
+ > - Structure GitFlow
278
+
279
+ ```javascript
280
+ AskUserQuestion({
281
+ questions: [{
282
+ question: "Quelle langue utiliser pour les descriptions ?",
283
+ header: "Langue",
284
+ options: [
285
+ { label: "English (Recommended)", description: "Feature descriptions, commit messages in English" },
286
+ { label: "Francais", description: "Descriptions en francais (prefixes restent en anglais)" }
287
+ ],
288
+ multiSelect: false
289
+ }]
290
+ })
291
+ ```
292
+
293
+ **Exemple selon la langue:**
294
+
295
+ | Element | English | Francais |
296
+ |---------|---------|----------|
297
+ | Branche | `feature/add-user-auth` | `feature/ajouter-auth-utilisateur` |
298
+ | Commit | `feat: add user authentication` | `feat: ajouter authentification utilisateur` |
299
+ | PR Title | `feat: Add User Authentication` | `feat: Ajouter Authentification Utilisateur` |
300
+ | Prefixes | `feature/`, `feat:` (inchange) | `feature/`, `feat:` (inchange) |
301
+
302
+ **Stocker le resultat dans la config:**
303
+ - `language.code`: "en" ou "fr"
304
+ - `language.descriptions`: dictionnaire des verbes d'action traduits (pour suggestions)
305
+
306
+ ---
307
+
267
308
  ### ÉTAPE 8 : Configuration
268
309
 
269
310
  ```json
270
311
  {
271
- "version": "1.4.0",
312
+ "version": "1.5.0",
272
313
  "initMode": "clone",
314
+ "language": {
315
+ "code": "en",
316
+ "descriptions": {
317
+ "add": "add",
318
+ "update": "update",
319
+ "fix": "fix",
320
+ "refactor": "refactor",
321
+ "remove": "remove",
322
+ "improve": "improve",
323
+ "implement": "implement"
324
+ }
325
+ },
273
326
  "repository": {
274
327
  "name": "{repo_name}",
275
328
  "remoteUrl": "{REPO_URL}",
@@ -867,11 +920,31 @@ parent/
867
920
 
868
921
  ### Config.json structure
869
922
 
870
- #### Organized Mode (v1.3)
923
+ #### Organized Mode (v1.5)
871
924
  ```json
872
925
  {
873
- "version": "1.4.0",
926
+ "version": "1.5.0",
874
927
  "initMode": "organized",
928
+ "language": {
929
+ "code": "en",
930
+ "descriptions": {
931
+ "add": "add",
932
+ "update": "update",
933
+ "fix": "fix",
934
+ "refactor": "refactor",
935
+ "remove": "remove",
936
+ "improve": "improve",
937
+ "implement": "implement"
938
+ }
939
+ },
940
+ "naming": {
941
+ "normalize": true,
942
+ "maxLength": 50,
943
+ "separator": "-",
944
+ "lowercase": true,
945
+ "removeAccents": true,
946
+ "allowedChars": "a-z0-9-"
947
+ },
875
948
  "repository": { "name": "", "defaultBranch": "main", "remoteUrl": "" },
876
949
  "versioning": { "strategy": "semver", "current": "0.1.0", "source": "auto", "sourceFile": "", "tagPrefix": "v", "autoIncrement": { "feature": "minor", "hotfix": "patch", "release": "manual" } },
877
950
  "git": { "branches": { "main": "main", "develop": "develop", "feature": "feature/", "release": "release/", "hotfix": "hotfix/" }, "mergeStrategy": "--no-ff", "protectedBranches": ["main", "develop"] },
@@ -921,6 +994,96 @@ parent/
921
994
  }
922
995
  ```
923
996
 
997
+ ### Language & Naming Configuration (NEW in v1.5)
998
+
999
+ La section `language` definit la langue pour le **contenu descriptif uniquement**.
1000
+
1001
+ > **IMPORTANT - Ce qui ne change PAS selon la langue:**
1002
+ > - Prefixes de branches: `feature/`, `release/`, `hotfix/` (toujours en anglais)
1003
+ > - Prefixes de commits: `feat:`, `fix:`, `chore:`, `docs:`, etc. (Conventional Commits)
1004
+ > - Structure GitFlow (worktrees, config, etc.)
1005
+
1006
+ | Parametre | Description | Defaut |
1007
+ |-----------|-------------|--------|
1008
+ | `code` | Code langue (en, fr) | `en` |
1009
+ | `descriptions` | Verbes d'action pour suggestions | voir ci-dessous |
1010
+
1011
+ **Verbes d'action suggeres par langue:**
1012
+
1013
+ | Action | English | Francais |
1014
+ |--------|---------|----------|
1015
+ | Ajouter | `add` | `ajouter` |
1016
+ | Modifier | `update` | `modifier` |
1017
+ | Corriger | `fix` | `corriger` |
1018
+ | Refactorer | `refactor` | `refactorer` |
1019
+ | Supprimer | `remove` | `supprimer` |
1020
+ | Ameliorer | `improve` | `ameliorer` |
1021
+ | Implementer | `implement` | `implementer` |
1022
+
1023
+ **Exemples concrets:**
1024
+
1025
+ | Element | English (code: "en") | Francais (code: "fr") |
1026
+ |---------|---------------------|----------------------|
1027
+ | Branche feature | `feature/add-user-auth` | `feature/ajouter-auth-utilisateur` |
1028
+ | Branche hotfix | `hotfix/fix-login-bug` | `hotfix/corriger-bug-login` |
1029
+ | Commit | `feat: add user authentication` | `feat: ajouter authentification` |
1030
+ | Titre PR | `feat: Add User Auth` | `feat: Ajouter Auth Utilisateur` |
1031
+
1032
+ > Note: Le prefix `feature/` et `feat:` restent TOUJOURS en anglais.
1033
+
1034
+ La section `naming` configure la normalisation automatique des noms.
1035
+
1036
+ | Parametre | Description | Defaut |
1037
+ |-----------|-------------|--------|
1038
+ | `normalize` | Activer la normalisation automatique | `true` |
1039
+ | `maxLength` | Longueur max des noms de branches | `50` |
1040
+ | `separator` | Separateur entre les mots | `-` |
1041
+ | `lowercase` | Forcer en minuscules | `true` |
1042
+ | `removeAccents` | Supprimer les accents | `true` |
1043
+ | `allowedChars` | Caracteres autorises (regex) | `a-z0-9-` |
1044
+
1045
+ **Fonction de normalisation (utilisee partout):**
1046
+
1047
+ ```bash
1048
+ normalize_name() {
1049
+ local input="$1"
1050
+ local max_length="${2:-50}"
1051
+
1052
+ # 1. Convertir en minuscules
1053
+ local result=$(echo "$input" | tr '[:upper:]' '[:lower:]')
1054
+
1055
+ # 2. Supprimer les accents
1056
+ result=$(echo "$result" | sed 'y/àâäéèêëïîôùûüç/aaaeeeeiioouuc/')
1057
+
1058
+ # 3. Remplacer les espaces et underscores par des tirets
1059
+ result=$(echo "$result" | sed 's/[ _]/-/g')
1060
+
1061
+ # 4. Supprimer les caracteres speciaux (garder uniquement a-z, 0-9, -)
1062
+ result=$(echo "$result" | sed 's/[^a-z0-9-]//g')
1063
+
1064
+ # 5. Supprimer les tirets multiples
1065
+ result=$(echo "$result" | sed 's/--*/-/g')
1066
+
1067
+ # 6. Supprimer les tirets en debut/fin
1068
+ result=$(echo "$result" | sed 's/^-//;s/-$//')
1069
+
1070
+ # 7. Tronquer a la longueur max
1071
+ result=$(echo "$result" | cut -c1-$max_length)
1072
+
1073
+ # 8. Supprimer le tiret final apres troncature
1074
+ result=$(echo "$result" | sed 's/-$//')
1075
+
1076
+ echo "$result"
1077
+ }
1078
+
1079
+ # Exemples:
1080
+ # "Ajouter l'authentification utilisateur" → "ajouter-lauthentification-utilisateur"
1081
+ # "Fix: Bug dans le login !!" → "fix-bug-dans-le-login"
1082
+ # "Ajout_Feature_Test" → "ajout-feature-test"
1083
+ ```
1084
+
1085
+ ---
1086
+
924
1087
  ### Azure DevOps Configuration (NEW in v1.4)
925
1088
 
926
1089
  La section `azureDevOps` configure l'integration avec Azure DevOps CLI pour les PR, work items et boards:
@@ -12,6 +12,14 @@ Tu es expert GitFlow. Cree une branche dans un **worktree separe** (par defaut).
12
12
 
13
13
  **Argument:** `$ARGUMENTS` = `{type} {name} [--no-worktree]`
14
14
 
15
+ **FLUX D'EXECUTION:**
16
+ ```
17
+ AVEC arguments: ETAPE 1 → ETAPE 5 → ETAPE 6 → ETAPE 7 → ETAPE 8
18
+ SANS arguments: ETAPE 1 → ETAPE 2 → ETAPE 3 → ETAPE 4 → ETAPE 5 → ETAPE 6 → ETAPE 7 → ETAPE 8
19
+
20
+ TOUJOURS OBLIGATOIRE
21
+ ```
22
+
15
23
  ---
16
24
 
17
25
  ## ETAPE 1: Analyser le contexte
@@ -77,14 +85,16 @@ EF CORE (si projet .NET)
77
85
 
78
86
  ## ETAPE 3: Questions dynamiques selon contexte
79
87
 
80
- ### Si `$ARGUMENTS` fourni → Parser et executer directement
88
+ ### Si `$ARGUMENTS` fourni → Parser et aller aux verifications
81
89
 
82
90
  ```
83
91
  $ARGUMENTS = "feature add-user-auth"
84
92
  → TYPE = "feature", NAME = "add-user-auth"
85
- → Sauter les questions, executer directement
93
+ → Sauter les questions (ETAPES 3-4), aller directement a ETAPE 5 (verifications)
86
94
  ```
87
95
 
96
+ **IMPORTANT:** Meme avec des arguments, tu DOIS executer l'ETAPE 5 (verifications) avant de creer la branche.
97
+
88
98
  ### Si PAS d'arguments → Questionnaire dynamique
89
99
 
90
100
  **Construire les options selon le contexte:**
@@ -148,22 +158,132 @@ AskUserQuestion({
148
158
 
149
159
  ### Si FEATURE selectionne:
150
160
 
161
+ **Lire la configuration de langue:**
162
+
163
+ ```bash
164
+ # ═══════════════════════════════════════════════════════════════
165
+ # CONFIGURATION DE LANGUE
166
+ # ═══════════════════════════════════════════════════════════════
167
+ CONFIG_FILE=".claude/gitflow/config.json"
168
+ LANG_CODE="en"
169
+ if [ -f "$CONFIG_FILE" ]; then
170
+ LANG_CODE=$(grep -oP '"code":\s*"\K[^"]+' "$CONFIG_FILE" 2>/dev/null | head -1)
171
+ LANG_CODE=${LANG_CODE:-en}
172
+ fi
173
+ echo "Langue configuree: $LANG_CODE"
174
+ ```
175
+
176
+ **Demander la description selon la langue configuree:**
177
+
178
+ > **NOTE:** Le prefix `feature/` reste TOUJOURS en anglais.
179
+ > Seule la partie descriptive (apres `feature/`) utilise la langue configuree.
180
+
151
181
  ```javascript
182
+ // Lire la config de langue
183
+ const langConfig = readConfig()?.language || { code: "en" }
184
+ const isEnglish = langConfig.code === "en"
185
+
186
+ // Suggestions de verbes d'action selon la langue
187
+ // Le prefix de branche "feature/" ne change PAS
188
+ const featureOptions = isEnglish ? [
189
+ { label: "add-", description: "Add a new feature → feature/add-..." },
190
+ { label: "update-", description: "Update existing → feature/update-..." },
191
+ { label: "fix-", description: "Fix a bug → feature/fix-..." },
192
+ { label: "refactor-", description: "Refactor code → feature/refactor-..." },
193
+ { label: "improve-", description: "Improve perf/UX → feature/improve-..." }
194
+ ] : [
195
+ { label: "ajouter-", description: "Nouvelle fonctionnalite → feature/ajouter-..." },
196
+ { label: "modifier-", description: "Modifier existant → feature/modifier-..." },
197
+ { label: "corriger-", description: "Corriger un bug → feature/corriger-..." },
198
+ { label: "refactorer-", description: "Refactorer du code → feature/refactorer-..." },
199
+ { label: "ameliorer-", description: "Ameliorer perf/UX → feature/ameliorer-..." }
200
+ ]
201
+
152
202
  AskUserQuestion({
153
203
  questions: [{
154
- question: "Decrivez la feature (utilisé pour le nom de branche)",
204
+ question: isEnglish
205
+ ? "Describe the feature (branch will be feature/your-description)"
206
+ : "Decrivez la feature (branche sera feature/votre-description)",
155
207
  header: "Feature",
156
- options: [
157
- { label: "add-", description: "Ajouter une nouvelle fonctionnalite" },
158
- { label: "update-", description: "Ameliorer une fonctionnalite existante" },
159
- { label: "refactor-", description: "Refactoring de code" }
160
- ],
208
+ options: featureOptions,
161
209
  multiSelect: false
162
210
  }]
163
211
  })
164
- // Puis demander le nom complet en texte libre
212
+ // L'utilisateur complete via "Other" pour le nom complet
213
+ ```
214
+
215
+ **Normaliser le nom saisi:**
216
+
217
+ ```bash
218
+ # ═══════════════════════════════════════════════════════════════
219
+ # FONCTION DE NORMALISATION DES NOMS DE BRANCHES
220
+ # ═══════════════════════════════════════════════════════════════
221
+ normalize_branch_name() {
222
+ local input="$1"
223
+ local max_length="${2:-50}"
224
+
225
+ # 1. Convertir en minuscules
226
+ local result=$(echo "$input" | tr '[:upper:]' '[:lower:]')
227
+
228
+ # 2. Supprimer les accents (francais et autres)
229
+ result=$(echo "$result" | sed 'y/àâäéèêëïîôùûüçœæÀÂÄÉÈÊËÏÎÔÙÛÜÇŒÆ/aaaeeeeiioouucoaAAaEeeeIIOOuucoa/')
230
+
231
+ # 3. Remplacer espaces, underscores, apostrophes par des tirets
232
+ result=$(echo "$result" | sed "s/[ _']/-/g")
233
+
234
+ # 4. Supprimer les caracteres non autorises
235
+ result=$(echo "$result" | sed 's/[^a-z0-9-]//g')
236
+
237
+ # 5. Supprimer les tirets multiples
238
+ result=$(echo "$result" | sed 's/--*/-/g')
239
+
240
+ # 6. Supprimer les tirets en debut/fin
241
+ result=$(echo "$result" | sed 's/^-//;s/-$//')
242
+
243
+ # 7. Tronquer a la longueur max
244
+ result=$(echo "$result" | cut -c1-$max_length)
245
+
246
+ # 8. Supprimer le tiret final apres troncature
247
+ result=$(echo "$result" | sed 's/-$//')
248
+
249
+ echo "$result"
250
+ }
251
+
252
+ # Normaliser le nom fourni par l'utilisateur
253
+ RAW_NAME="$USER_INPUT"
254
+ FEATURE_NAME=$(normalize_branch_name "$RAW_NAME" 50)
255
+
256
+ # Afficher si normalisation appliquee
257
+ if [ "$RAW_NAME" != "$FEATURE_NAME" ]; then
258
+ echo ""
259
+ echo "┌──────────────────────────────────────────────────────────────────────────────┐"
260
+ echo "│ ℹ️ NOM NORMALISE │"
261
+ echo "├──────────────────────────────────────────────────────────────────────────────┤"
262
+ echo "│ Saisi: $RAW_NAME"
263
+ echo "│ Normalise: $FEATURE_NAME"
264
+ echo "├──────────────────────────────────────────────────────────────────────────────┤"
265
+ echo "│ Raisons possibles: │"
266
+ echo "│ - Accents supprimes (e→e, a→a) │"
267
+ echo "│ - Espaces remplaces par tirets │"
268
+ echo "│ - Caracteres speciaux supprimes │"
269
+ echo "│ - Majuscules converties en minuscules │"
270
+ echo "└──────────────────────────────────────────────────────────────────────────────┘"
271
+ fi
272
+
273
+ BRANCH_NAME="feature/$FEATURE_NAME"
274
+ echo "Branche: $BRANCH_NAME"
165
275
  ```
166
276
 
277
+ **Exemples de normalisation:**
278
+
279
+ | Entree utilisateur | Resultat normalise |
280
+ |--------------------|-------------------|
281
+ | "Ajouter l'authentification" | `ajouter-lauthentification` |
282
+ | "Add User Auth !!" | `add-user-auth` |
283
+ | "Améliorer_Performance_API" | `ameliorer-performance-api` |
284
+ | "fix: Bug dans le login" | `fix-bug-dans-le-login` |
285
+ | "FEATURE majuscules" | `feature-majuscules` |
286
+
167
287
  ### Si RELEASE selectionne:
168
288
 
169
289
  **Etape A: Verifier l'etat de main**
@@ -240,26 +360,62 @@ AskUserQuestion({
240
360
  **⚠️ NOTE VERSIONING:** La version sera automatiquement incrementee (PATCH) lors du `/gitflow:11-finish`.
241
361
  Exemple: `1.7.1` → `1.7.2`. Pas besoin de faire `npm version patch` manuellement.
242
362
 
363
+ **Demander la description selon la langue configuree:**
364
+
365
+ > **NOTE:** Le prefix `hotfix/` reste TOUJOURS en anglais.
366
+ > Seule la partie descriptive utilise la langue configuree.
367
+
243
368
  ```javascript
369
+ // Lire la config de langue
370
+ const langConfig = readConfig()?.language || { code: "en" }
371
+ const isEnglish = langConfig.code === "en"
372
+
373
+ // Suggestions selon la langue (prefix hotfix/ ne change pas)
374
+ const hotfixOptions = isEnglish ? [
375
+ { label: "fix-", description: "Bug fix → hotfix/fix-..." },
376
+ { label: "security-", description: "Security fix → hotfix/security-..." },
377
+ { label: "revert-", description: "Revert a change → hotfix/revert-..." },
378
+ { label: "patch-", description: "Quick patch → hotfix/patch-..." }
379
+ ] : [
380
+ { label: "corriger-", description: "Correction bug → hotfix/corriger-..." },
381
+ { label: "securite-", description: "Correction securite → hotfix/securite-..." },
382
+ { label: "annuler-", description: "Annuler changement → hotfix/annuler-..." },
383
+ { label: "patch-", description: "Correctif rapide → hotfix/patch-..." }
384
+ ]
385
+
244
386
  AskUserQuestion({
245
387
  questions: [{
246
- question: "Decrivez le hotfix (utilisé pour le nom de branche)",
388
+ question: isEnglish
389
+ ? "Describe the hotfix (branch will be hotfix/your-description)"
390
+ : "Decrivez le hotfix (branche sera hotfix/votre-description)",
247
391
  header: "Hotfix",
248
- options: [
249
- { label: "fix-", description: "Correction de bug" },
250
- { label: "security-", description: "Correction de securite" },
251
- { label: "revert-", description: "Annuler un changement" }
252
- ],
392
+ options: hotfixOptions,
253
393
  multiSelect: false
254
394
  }]
255
395
  })
256
- // Puis demander le nom complet en texte libre
396
+ ```
397
+
398
+ **Normaliser le nom (meme fonction que feature):**
399
+
400
+ ```bash
401
+ # Utiliser la meme fonction normalize_branch_name definie plus haut
402
+ RAW_NAME="$USER_INPUT"
403
+ HOTFIX_NAME=$(normalize_branch_name "$RAW_NAME" 50)
404
+
405
+ if [ "$RAW_NAME" != "$HOTFIX_NAME" ]; then
406
+ echo "Nom normalise: '$RAW_NAME' → '$HOTFIX_NAME'"
407
+ fi
408
+
409
+ BRANCH_NAME="hotfix/$HOTFIX_NAME"
410
+ echo "Branche: $BRANCH_NAME"
257
411
  ```
258
412
 
259
413
  ---
260
414
 
261
415
  ## ETAPE 5: Verifications pre-creation
262
416
 
417
+ > **OBLIGATOIRE:** Cette etape doit TOUJOURS etre executee, meme quand des arguments sont fournis via `$ARGUMENTS`. Ne JAMAIS sauter cette etape.
418
+
263
419
  | Check | Commande | Action si echec |
264
420
  |-------|----------|-----------------|
265
421
  | Working tree clean | `git status --porcelain` | Proposer stash ou commit |
@@ -22,6 +22,39 @@ Tu es expert GitFlow. Finalise une branche apres merge de la PR.
22
22
 
23
23
  ---
24
24
 
25
+ ## ETAPE 0: SYNCHRONISATION AVEC REMOTE
26
+
27
+ > **CRITIQUE:** Toujours synchroniser avec le remote avant toute opération de finish.
28
+
29
+ ```bash
30
+ echo "Synchronisation avec remote..."
31
+ git fetch --all --quiet
32
+
33
+ # Vérifier l'état de synchronisation des branches principales
34
+ echo ""
35
+ echo "État des branches principales:"
36
+
37
+ # Vérifier develop
38
+ DEVELOP_BEHIND=$(git rev-list --count develop..origin/develop 2>/dev/null || echo "?")
39
+ DEVELOP_AHEAD=$(git rev-list --count origin/develop..develop 2>/dev/null || echo "?")
40
+ echo " develop: AHEAD=$DEVELOP_AHEAD, BEHIND=$DEVELOP_BEHIND"
41
+
42
+ # Vérifier main
43
+ MAIN_BEHIND=$(git rev-list --count main..origin/main 2>/dev/null || echo "?")
44
+ MAIN_AHEAD=$(git rev-list --count origin/main..main 2>/dev/null || echo "?")
45
+ echo " main: AHEAD=$MAIN_AHEAD, BEHIND=$MAIN_BEHIND"
46
+
47
+ # Avertissement si branches principales non synchronisées
48
+ if [ "$DEVELOP_BEHIND" != "0" ] && [ "$DEVELOP_BEHIND" != "?" ]; then
49
+ echo "⚠️ develop est en retard de $DEVELOP_BEHIND commit(s) - sera mis à jour automatiquement"
50
+ fi
51
+ if [ "$MAIN_BEHIND" != "0" ] && [ "$MAIN_BEHIND" != "?" ]; then
52
+ echo "⚠️ main est en retard de $MAIN_BEHIND commit(s) - sera mis à jour automatiquement"
53
+ fi
54
+ ```
55
+
56
+ ---
57
+
25
58
  ## ETAPE 1: SCAN PROACTIF (si pas d'argument)
26
59
 
27
60
  > **COMPORTEMENT PROACTIF:** Si aucun argument fourni, scanner TOUTES les branches pour proposer celles qui sont pretes a finaliser.
@@ -29,7 +62,7 @@ Tu es expert GitFlow. Finalise une branche apres merge de la PR.
29
62
  ### 1.1 Scanner toutes les branches GitFlow
30
63
 
31
64
  ```bash
32
- git fetch --all --quiet
65
+ # Note: git fetch déjà effectué dans ETAPE 0
33
66
 
34
67
  # Lister toutes les branches feature/release/hotfix
35
68
  FEATURES=$(git branch -r | grep 'origin/feature/' | sed 's|origin/||' | tr -d ' ')