@atlashub/smartstack-cli 1.8.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlashub/smartstack-cli",
3
- "version": "1.8.0",
3
+ "version": "1.10.0",
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:
@@ -148,22 +148,132 @@ AskUserQuestion({
148
148
 
149
149
  ### Si FEATURE selectionne:
150
150
 
151
+ **Lire la configuration de langue:**
152
+
153
+ ```bash
154
+ # ═══════════════════════════════════════════════════════════════
155
+ # CONFIGURATION DE LANGUE
156
+ # ═══════════════════════════════════════════════════════════════
157
+ CONFIG_FILE=".claude/gitflow/config.json"
158
+ LANG_CODE="en"
159
+ if [ -f "$CONFIG_FILE" ]; then
160
+ LANG_CODE=$(grep -oP '"code":\s*"\K[^"]+' "$CONFIG_FILE" 2>/dev/null | head -1)
161
+ LANG_CODE=${LANG_CODE:-en}
162
+ fi
163
+ echo "Langue configuree: $LANG_CODE"
164
+ ```
165
+
166
+ **Demander la description selon la langue configuree:**
167
+
168
+ > **NOTE:** Le prefix `feature/` reste TOUJOURS en anglais.
169
+ > Seule la partie descriptive (apres `feature/`) utilise la langue configuree.
170
+
151
171
  ```javascript
172
+ // Lire la config de langue
173
+ const langConfig = readConfig()?.language || { code: "en" }
174
+ const isEnglish = langConfig.code === "en"
175
+
176
+ // Suggestions de verbes d'action selon la langue
177
+ // Le prefix de branche "feature/" ne change PAS
178
+ const featureOptions = isEnglish ? [
179
+ { label: "add-", description: "Add a new feature → feature/add-..." },
180
+ { label: "update-", description: "Update existing → feature/update-..." },
181
+ { label: "fix-", description: "Fix a bug → feature/fix-..." },
182
+ { label: "refactor-", description: "Refactor code → feature/refactor-..." },
183
+ { label: "improve-", description: "Improve perf/UX → feature/improve-..." }
184
+ ] : [
185
+ { label: "ajouter-", description: "Nouvelle fonctionnalite → feature/ajouter-..." },
186
+ { label: "modifier-", description: "Modifier existant → feature/modifier-..." },
187
+ { label: "corriger-", description: "Corriger un bug → feature/corriger-..." },
188
+ { label: "refactorer-", description: "Refactorer du code → feature/refactorer-..." },
189
+ { label: "ameliorer-", description: "Ameliorer perf/UX → feature/ameliorer-..." }
190
+ ]
191
+
152
192
  AskUserQuestion({
153
193
  questions: [{
154
- question: "Decrivez la feature (utilisé pour le nom de branche)",
194
+ question: isEnglish
195
+ ? "Describe the feature (branch will be feature/your-description)"
196
+ : "Decrivez la feature (branche sera feature/votre-description)",
155
197
  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
- ],
198
+ options: featureOptions,
161
199
  multiSelect: false
162
200
  }]
163
201
  })
164
- // Puis demander le nom complet en texte libre
202
+ // L'utilisateur complete via "Other" pour le nom complet
165
203
  ```
166
204
 
205
+ **Normaliser le nom saisi:**
206
+
207
+ ```bash
208
+ # ═══════════════════════════════════════════════════════════════
209
+ # FONCTION DE NORMALISATION DES NOMS DE BRANCHES
210
+ # ═══════════════════════════════════════════════════════════════
211
+ normalize_branch_name() {
212
+ local input="$1"
213
+ local max_length="${2:-50}"
214
+
215
+ # 1. Convertir en minuscules
216
+ local result=$(echo "$input" | tr '[:upper:]' '[:lower:]')
217
+
218
+ # 2. Supprimer les accents (francais et autres)
219
+ result=$(echo "$result" | sed 'y/àâäéèêëïîôùûüçœæÀÂÄÉÈÊËÏÎÔÙÛÜÇŒÆ/aaaeeeeiioouucoaAAaEeeeIIOOuucoa/')
220
+
221
+ # 3. Remplacer espaces, underscores, apostrophes par des tirets
222
+ result=$(echo "$result" | sed "s/[ _']/-/g")
223
+
224
+ # 4. Supprimer les caracteres non autorises
225
+ result=$(echo "$result" | sed 's/[^a-z0-9-]//g')
226
+
227
+ # 5. Supprimer les tirets multiples
228
+ result=$(echo "$result" | sed 's/--*/-/g')
229
+
230
+ # 6. Supprimer les tirets en debut/fin
231
+ result=$(echo "$result" | sed 's/^-//;s/-$//')
232
+
233
+ # 7. Tronquer a la longueur max
234
+ result=$(echo "$result" | cut -c1-$max_length)
235
+
236
+ # 8. Supprimer le tiret final apres troncature
237
+ result=$(echo "$result" | sed 's/-$//')
238
+
239
+ echo "$result"
240
+ }
241
+
242
+ # Normaliser le nom fourni par l'utilisateur
243
+ RAW_NAME="$USER_INPUT"
244
+ FEATURE_NAME=$(normalize_branch_name "$RAW_NAME" 50)
245
+
246
+ # Afficher si normalisation appliquee
247
+ if [ "$RAW_NAME" != "$FEATURE_NAME" ]; then
248
+ echo ""
249
+ echo "┌──────────────────────────────────────────────────────────────────────────────┐"
250
+ echo "│ ℹ️ NOM NORMALISE │"
251
+ echo "├──────────────────────────────────────────────────────────────────────────────┤"
252
+ echo "│ Saisi: $RAW_NAME"
253
+ echo "│ Normalise: $FEATURE_NAME"
254
+ echo "├──────────────────────────────────────────────────────────────────────────────┤"
255
+ echo "│ Raisons possibles: │"
256
+ echo "│ - Accents supprimes (e→e, a→a) │"
257
+ echo "│ - Espaces remplaces par tirets │"
258
+ echo "│ - Caracteres speciaux supprimes │"
259
+ echo "│ - Majuscules converties en minuscules │"
260
+ echo "└──────────────────────────────────────────────────────────────────────────────┘"
261
+ fi
262
+
263
+ BRANCH_NAME="feature/$FEATURE_NAME"
264
+ echo "Branche: $BRANCH_NAME"
265
+ ```
266
+
267
+ **Exemples de normalisation:**
268
+
269
+ | Entree utilisateur | Resultat normalise |
270
+ |--------------------|-------------------|
271
+ | "Ajouter l'authentification" | `ajouter-lauthentification` |
272
+ | "Add User Auth !!" | `add-user-auth` |
273
+ | "Améliorer_Performance_API" | `ameliorer-performance-api` |
274
+ | "fix: Bug dans le login" | `fix-bug-dans-le-login` |
275
+ | "FEATURE majuscules" | `feature-majuscules` |
276
+
167
277
  ### Si RELEASE selectionne:
168
278
 
169
279
  **Etape A: Verifier l'etat de main**
@@ -240,20 +350,54 @@ AskUserQuestion({
240
350
  **⚠️ NOTE VERSIONING:** La version sera automatiquement incrementee (PATCH) lors du `/gitflow:11-finish`.
241
351
  Exemple: `1.7.1` → `1.7.2`. Pas besoin de faire `npm version patch` manuellement.
242
352
 
353
+ **Demander la description selon la langue configuree:**
354
+
355
+ > **NOTE:** Le prefix `hotfix/` reste TOUJOURS en anglais.
356
+ > Seule la partie descriptive utilise la langue configuree.
357
+
243
358
  ```javascript
359
+ // Lire la config de langue
360
+ const langConfig = readConfig()?.language || { code: "en" }
361
+ const isEnglish = langConfig.code === "en"
362
+
363
+ // Suggestions selon la langue (prefix hotfix/ ne change pas)
364
+ const hotfixOptions = isEnglish ? [
365
+ { label: "fix-", description: "Bug fix → hotfix/fix-..." },
366
+ { label: "security-", description: "Security fix → hotfix/security-..." },
367
+ { label: "revert-", description: "Revert a change → hotfix/revert-..." },
368
+ { label: "patch-", description: "Quick patch → hotfix/patch-..." }
369
+ ] : [
370
+ { label: "corriger-", description: "Correction bug → hotfix/corriger-..." },
371
+ { label: "securite-", description: "Correction securite → hotfix/securite-..." },
372
+ { label: "annuler-", description: "Annuler changement → hotfix/annuler-..." },
373
+ { label: "patch-", description: "Correctif rapide → hotfix/patch-..." }
374
+ ]
375
+
244
376
  AskUserQuestion({
245
377
  questions: [{
246
- question: "Decrivez le hotfix (utilisé pour le nom de branche)",
378
+ question: isEnglish
379
+ ? "Describe the hotfix (branch will be hotfix/your-description)"
380
+ : "Decrivez le hotfix (branche sera hotfix/votre-description)",
247
381
  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
- ],
382
+ options: hotfixOptions,
253
383
  multiSelect: false
254
384
  }]
255
385
  })
256
- // Puis demander le nom complet en texte libre
386
+ ```
387
+
388
+ **Normaliser le nom (meme fonction que feature):**
389
+
390
+ ```bash
391
+ # Utiliser la meme fonction normalize_branch_name definie plus haut
392
+ RAW_NAME="$USER_INPUT"
393
+ HOTFIX_NAME=$(normalize_branch_name "$RAW_NAME" 50)
394
+
395
+ if [ "$RAW_NAME" != "$HOTFIX_NAME" ]; then
396
+ echo "Nom normalise: '$RAW_NAME' → '$HOTFIX_NAME'"
397
+ fi
398
+
399
+ BRANCH_NAME="hotfix/$HOTFIX_NAME"
400
+ echo "Branche: $BRANCH_NAME"
257
401
  ```
258
402
 
259
403
  ---
@@ -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 ' ')