@atlashub/smartstack-cli 1.14.1 → 1.14.2

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.
@@ -12,7 +12,7 @@
12
12
  <header class="global-header">
13
13
  <div class="logo">SS</div>
14
14
  <span class="site-title">SmartStack CLI</span>
15
- <span class="version-badge">v1.14.0</span>
15
+ <span class="version-badge">v1.14.1</span>
16
16
  <div class="header-divider"></div>
17
17
  <span class="page-title">GitFlow Workflow</span>
18
18
  <nav class="breadcrumb">
@@ -82,6 +82,7 @@
82
82
  </a>
83
83
  <nav class="sidebar-toc">
84
84
  <a href="#introduction" class="sidebar-toc-link">Introduction</a>
85
+ <a href="#quick-start" class="sidebar-toc-link">Quick Start</a>
85
86
  <a href="#concepts" class="sidebar-toc-link">
86
87
  <span data-lang="fr">Concepts cles</span>
87
88
  <span data-lang="en">Key Concepts</span>
@@ -186,6 +187,174 @@
186
187
  </div>
187
188
  </section>
188
189
 
190
+ <!-- Quick Start -->
191
+ <section id="quick-start">
192
+ <h2>Quick Start</h2>
193
+
194
+ <div class="alert alert-info">
195
+ <span class="alert-icon">&#128640;</span>
196
+ <div class="alert-content">
197
+ <h5 data-lang="fr">Commandes essentielles</h5>
198
+ <h5 data-lang="en">Essential Commands</h5>
199
+ <p data-lang="fr">Les commandes les plus utilisees pour demarrer rapidement.</p>
200
+ <p data-lang="en">The most commonly used commands to get started quickly.</p>
201
+ </div>
202
+ </div>
203
+
204
+ <div class="table-container">
205
+ <table>
206
+ <thead>
207
+ <tr>
208
+ <th>
209
+ <span data-lang="fr">Action</span>
210
+ <span data-lang="en">Action</span>
211
+ </th>
212
+ <th>
213
+ <span data-lang="fr">Commande</span>
214
+ <span data-lang="en">Command</span>
215
+ </th>
216
+ <th>
217
+ <span data-lang="fr">Raccourci</span>
218
+ <span data-lang="en">Shorthand</span>
219
+ </th>
220
+ </tr>
221
+ </thead>
222
+ <tbody>
223
+ <tr>
224
+ <td>
225
+ <span data-lang="fr">Demarrer feature</span>
226
+ <span data-lang="en">Start feature</span>
227
+ </td>
228
+ <td><code>/gitflow start feature xxx</code></td>
229
+ <td><code>/gitflow -f xxx</code></td>
230
+ </tr>
231
+ <tr>
232
+ <td>
233
+ <span data-lang="fr">Demarrer release</span>
234
+ <span data-lang="en">Start release</span>
235
+ </td>
236
+ <td><code>/gitflow start release 2.0.0</code></td>
237
+ <td><code>/gitflow -r 2.0.0</code></td>
238
+ </tr>
239
+ <tr>
240
+ <td>
241
+ <span data-lang="fr">Demarrer hotfix</span>
242
+ <span data-lang="en">Start hotfix</span>
243
+ </td>
244
+ <td><code>/gitflow start hotfix xxx</code></td>
245
+ <td><code>/gitflow -h xxx</code></td>
246
+ </tr>
247
+ <tr>
248
+ <td>Commit</td>
249
+ <td><code>/gitflow commit</code></td>
250
+ <td><code>/gitflow -a commit "msg"</code></td>
251
+ </tr>
252
+ <tr>
253
+ <td>
254
+ <span data-lang="fr">Creer PR</span>
255
+ <span data-lang="en">Create PR</span>
256
+ </td>
257
+ <td><code>/gitflow pr</code></td>
258
+ <td>-</td>
259
+ </tr>
260
+ <tr>
261
+ <td>Merge</td>
262
+ <td><code>/gitflow merge</code></td>
263
+ <td>-</td>
264
+ </tr>
265
+ <tr>
266
+ <td>
267
+ <span data-lang="fr">Finaliser</span>
268
+ <span data-lang="en">Finish</span>
269
+ </td>
270
+ <td><code>/gitflow finish</code></td>
271
+ <td>-</td>
272
+ </tr>
273
+ <tr>
274
+ <td>Status</td>
275
+ <td><code>/gitflow status</code></td>
276
+ <td><code>/gitflow -s</code></td>
277
+ </tr>
278
+ </tbody>
279
+ </table>
280
+ </div>
281
+
282
+ <h3>
283
+ <span data-lang="fr">Flags disponibles</span>
284
+ <span data-lang="en">Available Flags</span>
285
+ </h3>
286
+
287
+ <div class="table-container">
288
+ <table>
289
+ <thead>
290
+ <tr>
291
+ <th>Flag</th>
292
+ <th>Long</th>
293
+ <th>Description</th>
294
+ </tr>
295
+ </thead>
296
+ <tbody>
297
+ <tr>
298
+ <td><code>-f</code></td>
299
+ <td><code>--feature</code></td>
300
+ <td>
301
+ <span data-lang="fr">Workflow feature (cible: develop)</span>
302
+ <span data-lang="en">Feature workflow (target: develop)</span>
303
+ </td>
304
+ </tr>
305
+ <tr>
306
+ <td><code>-r</code></td>
307
+ <td><code>--release</code></td>
308
+ <td>
309
+ <span data-lang="fr">Workflow release (cible: main, merge-back develop)</span>
310
+ <span data-lang="en">Release workflow (target: main, merge-back develop)</span>
311
+ </td>
312
+ </tr>
313
+ <tr>
314
+ <td><code>-h</code></td>
315
+ <td><code>--hotfix</code></td>
316
+ <td>
317
+ <span data-lang="fr">Workflow hotfix (cible: main, merge-back develop)</span>
318
+ <span data-lang="en">Hotfix workflow (target: main, merge-back develop)</span>
319
+ </td>
320
+ </tr>
321
+ <tr>
322
+ <td><code>-a</code></td>
323
+ <td><code>--auto</code></td>
324
+ <td>
325
+ <span data-lang="fr">Mode autonome: sauter les confirmations</span>
326
+ <span data-lang="en">Autonomous mode: skip confirmations</span>
327
+ </td>
328
+ </tr>
329
+ <tr>
330
+ <td><code>-s</code></td>
331
+ <td><code>--status</code></td>
332
+ <td>
333
+ <span data-lang="fr">Mode status: afficher l'etat uniquement</span>
334
+ <span data-lang="en">Status mode: show state only</span>
335
+ </td>
336
+ </tr>
337
+ <tr>
338
+ <td><code>-v</code></td>
339
+ <td><code>--verbose</code></td>
340
+ <td>
341
+ <span data-lang="fr">Sortie detaillee</span>
342
+ <span data-lang="en">Verbose output</span>
343
+ </td>
344
+ </tr>
345
+ <tr>
346
+ <td><code></code></td>
347
+ <td><code>--dry-run</code></td>
348
+ <td>
349
+ <span data-lang="fr">Previsualiser sans executer</span>
350
+ <span data-lang="en">Preview actions without executing</span>
351
+ </td>
352
+ </tr>
353
+ </tbody>
354
+ </table>
355
+ </div>
356
+ </section>
357
+
189
358
  <!-- Key Concepts -->
190
359
  <section id="concepts">
191
360
  <h2>
@@ -390,7 +559,7 @@
390
559
  <div class="tooltip-cmd"></div>
391
560
  </div>
392
561
 
393
- <svg viewBox="0 0 900 320" xmlns="http://www.w3.org/2000/svg" style="font-family: 'Inter', system-ui, sans-serif;">
562
+ <svg viewBox="0 0 900 320" xmlns="http://www.w3.org/2000/svg" style="font-family: 'Inter', system-ui, sans-serif; width: 100%; max-width: 1800px; height: auto; display: block; margin: 0 auto;">
394
563
  <!-- Definitions -->
395
564
  <defs>
396
565
  <marker id="arrow" markerWidth="10" markerHeight="10" refX="9" refY="3" orient="auto" markerUnits="strokeWidth">
@@ -861,7 +1030,7 @@
861
1030
 
862
1031
  <!-- Decision Flowchart SVG - Responsive -->
863
1032
  <div class="decision-diagram" style="margin: 2rem 0;">
864
- <svg viewBox="0 0 1200 900" preserveAspectRatio="xMidYMid meet" style="width: 100%; height: auto; display: block;">
1033
+ <svg viewBox="0 0 1200 900" preserveAspectRatio="xMidYMid meet" style="width: 100%; max-width: 1800px; height: auto; display: block; margin: 0 auto;">
865
1034
  <!-- Background -->
866
1035
  <rect width="1200" height="900" fill="#0f172a" rx="8"/>
867
1036
 
@@ -878,10 +1047,9 @@
878
1047
  <tspan data-lang="en">Goal</tspan>
879
1048
  </text>
880
1049
 
881
- <!-- FEATURE PATH (Left) - Aligned with Release/Hotfix -->
882
- <line x1="380" y1="130" x2="380" y2="220" stroke="#22c55e" stroke-width="2.5"/>
883
- <line x1="380" y1="220" x2="120" y2="220" stroke="#22c55e" stroke-width="2.5"/>
884
- <line x1="120" y1="220" x2="120" y2="250" stroke="#22c55e" stroke-width="2.5"/>
1050
+ <!-- FEATURE PATH (Left) - Simple: left then down -->
1051
+ <line x1="380" y1="130" x2="120" y2="130" stroke="#22c55e" stroke-width="2.5"/>
1052
+ <line x1="120" y1="130" x2="120" y2="250" stroke="#22c55e" stroke-width="2.5"/>
885
1053
  <polygon points="120,250 114,236 126,236" fill="#22c55e"/>
886
1054
 
887
1055
  <rect x="30" y="255" width="180" height="55" rx="8" fill="#22c55e" fill-opacity="0.15" stroke="#22c55e" stroke-width="2.5"/>
@@ -1282,223 +1450,223 @@
1282
1450
 
1283
1451
  <!-- Command Hierarchy Diagram -->
1284
1452
  <div class="svg-diagram" style="margin: 1.5rem 0 2.5rem 0;">
1285
- <svg viewBox="0 0 1000 400" preserveAspectRatio="xMidYMid meet" style="width: 100%; max-width: 1000px; height: auto;">
1453
+ <svg viewBox="0 0 1200 650" preserveAspectRatio="xMidYMid meet" style="width: 100%; max-width: 1800px; height: auto; display: block; margin: 0 auto;">
1286
1454
  <!-- Title -->
1287
- <text x="500" y="25" text-anchor="middle" fill="#94a3b8" font-size="14" font-weight="500">
1455
+ <text x="600" y="35" text-anchor="middle" fill="#94a3b8" font-size="18" font-weight="600">
1288
1456
  <tspan data-lang="fr">Hierarchie des commandes</tspan>
1289
1457
  <tspan data-lang="en">Command Hierarchy</tspan>
1290
1458
  </text>
1291
1459
 
1292
1460
  <!-- ===== MAIN WORKFLOW (Center) ===== -->
1293
- <text x="500" y="60" text-anchor="middle" fill="#f8fafc" font-size="13" font-weight="600">
1461
+ <text x="600" y="75" text-anchor="middle" fill="#f8fafc" font-size="16" font-weight="600">
1294
1462
  <tspan data-lang="fr">WORKFLOW PRINCIPAL</tspan>
1295
1463
  <tspan data-lang="en">MAIN WORKFLOW</tspan>
1296
1464
  </text>
1297
1465
 
1298
1466
  <!-- Start -->
1299
- <g transform="translate(120, 80)">
1300
- <rect x="0" y="0" width="180" height="50" rx="8" fill="transparent" stroke="#22c55e" stroke-width="2"/>
1301
- <text x="90" y="22" text-anchor="middle" fill="#4ade80" font-size="12" font-weight="600">/gitflow start</text>
1302
- <text x="90" y="40" text-anchor="middle" fill="#64748b" font-size="10">
1467
+ <g transform="translate(150, 100)">
1468
+ <rect x="0" y="0" width="200" height="60" rx="10" fill="transparent" stroke="#22c55e" stroke-width="2.5"/>
1469
+ <text x="100" y="28" text-anchor="middle" fill="#4ade80" font-size="14" font-weight="600">/gitflow start</text>
1470
+ <text x="100" y="46" text-anchor="middle" fill="#64748b" font-size="11">
1303
1471
  <tspan data-lang="fr">Demarrer branche</tspan>
1304
1472
  <tspan data-lang="en">Start branch</tspan>
1305
1473
  </text>
1306
1474
  </g>
1307
1475
 
1308
- <!-- Arrow -->
1309
- <line x1="300" y1="105" x2="380" y2="105" stroke="#475569" stroke-width="2"/>
1310
- <polygon points="380,105 370,100 370,110" fill="#475569"/>
1476
+ <!-- Arrow Start -> Commit -->
1477
+ <line x1="350" y1="130" x2="430" y2="130" stroke="#475569" stroke-width="2.5"/>
1478
+ <polygon points="430,130 418,123 418,137" fill="#475569"/>
1311
1479
 
1312
1480
  <!-- Commit (loop) -->
1313
- <g transform="translate(390, 80)">
1314
- <rect x="0" y="0" width="180" height="50" rx="8" fill="transparent" stroke="#8b5cf6" stroke-width="2"/>
1315
- <text x="90" y="22" text-anchor="middle" fill="#a78bfa" font-size="12" font-weight="600">/gitflow commit</text>
1316
- <text x="90" y="40" text-anchor="middle" fill="#64748b" font-size="10">
1481
+ <g transform="translate(440, 100)">
1482
+ <rect x="0" y="0" width="200" height="60" rx="10" fill="transparent" stroke="#8b5cf6" stroke-width="2.5"/>
1483
+ <text x="100" y="28" text-anchor="middle" fill="#a78bfa" font-size="14" font-weight="600">/gitflow commit</text>
1484
+ <text x="100" y="46" text-anchor="middle" fill="#64748b" font-size="11">
1317
1485
  <tspan data-lang="fr">Commiter (boucle)</tspan>
1318
1486
  <tspan data-lang="en">Commit (loop)</tspan>
1319
1487
  </text>
1320
1488
  <!-- Loop arrow -->
1321
- <path d="M180,25 Q200,25 200,10 Q200,-5 90,-5 Q-10,-5 -10,10 Q-10,25 0,25" stroke="#8b5cf6" stroke-width="1.5" fill="none" stroke-dasharray="4,2"/>
1322
- <polygon points="0,25 8,20 8,30" fill="#8b5cf6"/>
1489
+ <path d="M200,30 Q225,30 225,12 Q225,-8 100,-8 Q-15,-8 -15,12 Q-15,30 0,30" stroke="#8b5cf6" stroke-width="2" fill="none" stroke-dasharray="5,3"/>
1490
+ <polygon points="0,30 10,24 10,36" fill="#8b5cf6"/>
1323
1491
  </g>
1324
1492
 
1325
- <!-- ===== DECISION POINT: Choose integration method ===== -->
1326
- <!-- Arrow to decision -->
1327
- <line x1="570" y1="105" x2="610" y2="105" stroke="#475569" stroke-width="2"/>
1493
+ <!-- Arrow Commit -> Decision -->
1494
+ <line x1="640" y1="130" x2="720" y2="130" stroke="#475569" stroke-width="2.5"/>
1328
1495
 
1329
- <!-- Decision diamond -->
1330
- <polygon points="650,105 690,80 730,105 690,130" fill="transparent" stroke="#6366f1" stroke-width="2"/>
1331
- <text x="690" y="102" text-anchor="middle" fill="#a5b4fc" font-size="8" font-weight="500">
1496
+ <!-- Decision diamond (centered) -->
1497
+ <polygon points="780,130 840,85 900,130 840,175" fill="transparent" stroke="#6366f1" stroke-width="2.5"/>
1498
+ <text x="840" y="125" text-anchor="middle" fill="#a5b4fc" font-size="11" font-weight="500">
1332
1499
  <tspan data-lang="fr">Methode?</tspan>
1333
1500
  <tspan data-lang="en">Method?</tspan>
1334
1501
  </text>
1335
- <text x="690" y="113" text-anchor="middle" fill="#64748b" font-size="7">PR ou Direct</text>
1502
+ <text x="840" y="142" text-anchor="middle" fill="#64748b" font-size="9">PR ou Direct</text>
1336
1503
 
1337
- <!-- ===== PATH 1: PR FLOW (Up) ===== -->
1338
- <line x1="690" y1="80" x2="690" y2="55" stroke="#06b6d4" stroke-width="2"/>
1339
- <polygon points="690,55 685,65 695,65" fill="#06b6d4"/>
1504
+ <!-- ===== PATH 1: PR FLOW (Right) ===== -->
1505
+ <!-- Arrow right from decision -->
1506
+ <line x1="900" y1="130" x2="980" y2="130" stroke="#06b6d4" stroke-width="2.5"/>
1507
+ <text x="940" y="118" text-anchor="middle" fill="#06b6d4" font-size="10" font-weight="600">PR</text>
1340
1508
 
1341
1509
  <!-- PR Flow label -->
1342
- <text x="770" y="50" text-anchor="start" fill="#06b6d4" font-size="9" font-weight="600">
1510
+ <text x="1090" y="115" text-anchor="middle" fill="#06b6d4" font-size="12" font-weight="600">
1343
1511
  <tspan data-lang="fr">METHODE PR</tspan>
1344
1512
  <tspan data-lang="en">PR METHOD</tspan>
1345
1513
  </text>
1346
- <text x="770" y="62" text-anchor="start" fill="#64748b" font-size="7">
1347
- <tspan data-lang="fr">Equipe, review, CI/CD</tspan>
1348
- <tspan data-lang="en">Team, review, CI/CD</tspan>
1514
+ <text x="1090" y="132" text-anchor="start" fill="#64748b" font-size="9">
1515
+ <tspan data-lang="fr">Equipe / Review</tspan>
1516
+ <tspan data-lang="en">Team / Review</tspan>
1349
1517
  </text>
1350
1518
 
1351
- <!-- PR Flow box -->
1352
- <g transform="translate(580, 160)">
1353
- <rect x="0" y="0" width="380" height="95" rx="8" fill="#06b6d4" fill-opacity="0.05" stroke="#06b6d4" stroke-width="1.5"/>
1354
- <text x="190" y="18" text-anchor="middle" fill="#22d3ee" font-size="10" font-weight="600">
1519
+ <!-- Arrow down to PR box -->
1520
+ <path d="M 980 130 L 1040 130 L 1040 200" stroke="#06b6d4" stroke-width="2.5" fill="none"/>
1521
+ <polygon points="1040,200 1034,188 1046,188" fill="#06b6d4"/>
1522
+
1523
+ <!-- PR Flow box (Right side) -->
1524
+ <g transform="translate(640, 210)">
1525
+ <rect x="0" y="0" width="520" height="130" rx="12" fill="#06b6d4" fill-opacity="0.05" stroke="#06b6d4" stroke-width="2"/>
1526
+ <text x="260" y="25" text-anchor="middle" fill="#22d3ee" font-size="13" font-weight="600">
1355
1527
  <tspan data-lang="fr">PR FLOW : Equipe / Review / CI</tspan>
1356
1528
  <tspan data-lang="en">PR FLOW: Team / Review / CI</tspan>
1357
1529
  </text>
1358
1530
 
1359
1531
  <!-- PR -->
1360
- <g transform="translate(15, 35)">
1361
- <rect x="0" y="0" width="85" height="45" rx="5" fill="transparent" stroke="#06b6d4" stroke-width="2"/>
1362
- <text x="42" y="20" text-anchor="middle" fill="#22d3ee" font-size="8" font-weight="600">/gitflow pr</text>
1363
- <text x="42" y="35" text-anchor="middle" fill="#64748b" font-size="7">Creer PR</text>
1532
+ <g transform="translate(25, 45)">
1533
+ <rect x="0" y="0" width="110" height="60" rx="8" fill="transparent" stroke="#06b6d4" stroke-width="2.5"/>
1534
+ <text x="55" y="26" text-anchor="middle" fill="#22d3ee" font-size="11" font-weight="600">/gitflow pr</text>
1535
+ <text x="55" y="44" text-anchor="middle" fill="#64748b" font-size="9">
1536
+ <tspan data-lang="fr">Creer PR</tspan>
1537
+ <tspan data-lang="en">Create PR</tspan>
1538
+ </text>
1364
1539
  </g>
1365
1540
 
1366
1541
  <!-- Arrow -->
1367
- <line x1="100" y1="57" x2="115" y2="57" stroke="#06b6d4" stroke-width="1.5"/>
1368
- <polygon points="115,57 108,53 108,61" fill="#06b6d4"/>
1542
+ <line x1="135" y1="75" x2="160" y2="75" stroke="#06b6d4" stroke-width="2"/>
1543
+ <polygon points="160,75 150,70 150,80" fill="#06b6d4"/>
1369
1544
 
1370
1545
  <!-- Merge GitHub -->
1371
- <g transform="translate(120, 35)">
1372
- <rect x="0" y="0" width="85" height="45" rx="5" fill="#334155" fill-opacity="0.5" stroke="#64748b" stroke-width="1.5"/>
1373
- <text x="42" y="20" text-anchor="middle" fill="#94a3b8" font-size="8" font-weight="500">Merge</text>
1374
- <text x="42" y="35" text-anchor="middle" fill="#64748b" font-size="7">sur GitHub</text>
1546
+ <g transform="translate(165, 45)">
1547
+ <rect x="0" y="0" width="110" height="60" rx="8" fill="#334155" fill-opacity="0.5" stroke="#64748b" stroke-width="2"/>
1548
+ <text x="55" y="26" text-anchor="middle" fill="#94a3b8" font-size="10" font-weight="500">Merge</text>
1549
+ <text x="55" y="44" text-anchor="middle" fill="#64748b" font-size="9">
1550
+ <tspan data-lang="fr">sur GitHub</tspan>
1551
+ <tspan data-lang="en">on GitHub</tspan>
1552
+ </text>
1375
1553
  </g>
1376
1554
 
1377
1555
  <!-- Arrow -->
1378
- <line x1="205" y1="57" x2="220" y2="57" stroke="#06b6d4" stroke-width="1.5"/>
1379
- <polygon points="220,57 213,53 213,61" fill="#06b6d4"/>
1556
+ <line x1="275" y1="75" x2="300" y2="75" stroke="#06b6d4" stroke-width="2"/>
1557
+ <polygon points="300,75 290,70 290,80" fill="#06b6d4"/>
1380
1558
 
1381
1559
  <!-- Finish -->
1382
- <g transform="translate(225, 35)">
1383
- <rect x="0" y="0" width="85" height="45" rx="5" fill="transparent" stroke="#22c55e" stroke-width="2"/>
1384
- <text x="42" y="20" text-anchor="middle" fill="#4ade80" font-size="8" font-weight="600">/gitflow finish</text>
1385
- <text x="42" y="35" text-anchor="middle" fill="#64748b" font-size="7">tag + cleanup</text>
1560
+ <g transform="translate(305, 45)">
1561
+ <rect x="0" y="0" width="110" height="60" rx="8" fill="transparent" stroke="#22c55e" stroke-width="2.5"/>
1562
+ <text x="55" y="26" text-anchor="middle" fill="#4ade80" font-size="11" font-weight="600">/gitflow finish</text>
1563
+ <text x="55" y="44" text-anchor="middle" fill="#64748b" font-size="9">tag + cleanup</text>
1386
1564
  </g>
1387
1565
 
1388
1566
  <!-- Result -->
1389
- <line x1="310" y1="57" x2="325" y2="57" stroke="#22c55e" stroke-width="1.5"/>
1390
- <polygon points="325,57 318,53 318,61" fill="#22c55e"/>
1391
- <text x="340" y="55" text-anchor="start" fill="#22c55e" font-size="8">
1392
- <tspan data-lang="fr">Done</tspan>
1393
- <tspan data-lang="en">Done</tspan>
1394
- </text>
1395
- <text x="340" y="67" text-anchor="start" fill="#64748b" font-size="6">(branche remote)</text>
1567
+ <line x1="415" y1="75" x2="440" y2="75" stroke="#22c55e" stroke-width="2"/>
1568
+ <polygon points="440,75 430,70 430,80" fill="#22c55e"/>
1569
+ <text x="455" y="72" text-anchor="start" fill="#22c55e" font-size="10" font-weight="500">Done</text>
1570
+ <text x="455" y="86" text-anchor="start" fill="#64748b" font-size="8">(remote)</text>
1396
1571
  </g>
1397
1572
 
1398
- <!-- Connect decision to PR flow -->
1399
- <path d="M 690 80 L 690 55 L 770 55 L 770 160" stroke="#06b6d4" stroke-width="1.5" fill="none"/>
1400
- <polygon points="770,160 765,150 775,150" fill="#06b6d4"/>
1573
+ <!-- ===== PATH 2: DIRECT MERGE (Left) ===== -->
1574
+ <!-- Arrow left from decision -->
1575
+ <line x1="780" y1="130" x2="700" y2="130" stroke="#f97316" stroke-width="2.5"/>
1576
+ <text x="740" y="118" text-anchor="middle" fill="#f97316" font-size="10" font-weight="600">Direct</text>
1401
1577
 
1402
- <!-- ===== PATH 2: DIRECT MERGE (Down) ===== -->
1403
- <line x1="690" y1="130" x2="690" y2="155" stroke="#f97316" stroke-width="2"/>
1404
- <polygon points="690,155 685,145 695,145" fill="#f97316"/>
1578
+ <!-- Direct Flow label -->
1579
+ <text x="110" y="115" text-anchor="middle" fill="#f97316" font-size="12" font-weight="600">
1580
+ <tspan data-lang="fr">METHODE DIRECTE</tspan>
1581
+ <tspan data-lang="en">DIRECT METHOD</tspan>
1582
+ </text>
1583
+ <text x="110" y="132" text-anchor="middle" fill="#64748b" font-size="9">
1584
+ <tspan data-lang="fr">Solo / Pas de review</tspan>
1585
+ <tspan data-lang="en">Solo / No review</tspan>
1586
+ </text>
1405
1587
 
1406
- <!-- Direct Flow box -->
1407
- <g transform="translate(40, 160)">
1408
- <rect x="0" y="0" width="380" height="95" rx="8" fill="#f97316" fill-opacity="0.05" stroke="#f97316" stroke-width="1.5"/>
1409
- <text x="190" y="18" text-anchor="middle" fill="#fb923c" font-size="10" font-weight="600">
1588
+ <!-- Arrow down to Direct box -->
1589
+ <path d="M 700 130 L 160 130 L 160 200" stroke="#f97316" stroke-width="2.5" fill="none"/>
1590
+ <polygon points="160,200 154,188 166,188" fill="#f97316"/>
1591
+
1592
+ <!-- Direct Flow box (Left side) -->
1593
+ <g transform="translate(40, 210)">
1594
+ <rect x="0" y="0" width="480" height="130" rx="12" fill="#f97316" fill-opacity="0.05" stroke="#f97316" stroke-width="2"/>
1595
+ <text x="240" y="25" text-anchor="middle" fill="#fb923c" font-size="13" font-weight="600">
1410
1596
  <tspan data-lang="fr">DIRECT MERGE : Solo / Pas de review</tspan>
1411
1597
  <tspan data-lang="en">DIRECT MERGE: Solo / No review</tspan>
1412
1598
  </text>
1413
1599
 
1414
1600
  <!-- Plan -->
1415
- <g transform="translate(60, 35)">
1416
- <rect x="0" y="0" width="100" height="45" rx="5" fill="transparent" stroke="#f97316" stroke-width="2"/>
1417
- <text x="50" y="20" text-anchor="middle" fill="#fb923c" font-size="8" font-weight="600">/gitflow plan</text>
1418
- <text x="50" y="35" text-anchor="middle" fill="#64748b" font-size="7">Analyse conflits</text>
1601
+ <g transform="translate(60, 45)">
1602
+ <rect x="0" y="0" width="130" height="60" rx="8" fill="transparent" stroke="#f97316" stroke-width="2.5"/>
1603
+ <text x="65" y="26" text-anchor="middle" fill="#fb923c" font-size="11" font-weight="600">/gitflow plan</text>
1604
+ <text x="65" y="44" text-anchor="middle" fill="#64748b" font-size="9">
1605
+ <tspan data-lang="fr">Analyse conflits</tspan>
1606
+ <tspan data-lang="en">Analyze conflicts</tspan>
1607
+ </text>
1419
1608
  </g>
1420
1609
 
1421
1610
  <!-- Arrow -->
1422
- <line x1="160" y1="57" x2="180" y2="57" stroke="#f97316" stroke-width="1.5"/>
1423
- <polygon points="180,57 173,53 173,61" fill="#f97316"/>
1424
-
1425
- <!-- Exec -->
1426
- <g transform="translate(185, 35)">
1427
- <rect x="0" y="0" width="100" height="45" rx="5" fill="transparent" stroke="#f97316" stroke-width="2"/>
1428
- <text x="50" y="20" text-anchor="middle" fill="#fb923c" font-size="8" font-weight="600">/gitflow merge</text>
1429
- <text x="50" y="35" text-anchor="middle" fill="#64748b" font-size="7">Merge local</text>
1611
+ <line x1="190" y1="75" x2="220" y2="75" stroke="#f97316" stroke-width="2"/>
1612
+ <polygon points="220,75 210,70 210,80" fill="#f97316"/>
1613
+
1614
+ <!-- Merge -->
1615
+ <g transform="translate(225, 45)">
1616
+ <rect x="0" y="0" width="130" height="60" rx="8" fill="transparent" stroke="#f97316" stroke-width="2.5"/>
1617
+ <text x="65" y="26" text-anchor="middle" fill="#fb923c" font-size="11" font-weight="600">/gitflow merge</text>
1618
+ <text x="65" y="44" text-anchor="middle" fill="#64748b" font-size="9">Merge local</text>
1430
1619
  </g>
1431
1620
 
1432
1621
  <!-- Result -->
1433
- <line x1="285" y1="57" x2="305" y2="57" stroke="#f97316" stroke-width="1.5"/>
1434
- <polygon points="305,57 298,53 298,61" fill="#f97316"/>
1435
- <text x="315" y="55" text-anchor="start" fill="#fb923c" font-size="8">
1436
- <tspan data-lang="fr">Done</tspan>
1437
- <tspan data-lang="en">Done</tspan>
1438
- </text>
1439
- <text x="315" y="67" text-anchor="start" fill="#64748b" font-size="6">(branche locale)</text>
1622
+ <line x1="355" y1="75" x2="385" y2="75" stroke="#f97316" stroke-width="2"/>
1623
+ <polygon points="385,75 375,70 375,80" fill="#f97316"/>
1624
+ <text x="400" y="72" text-anchor="start" fill="#fb923c" font-size="10" font-weight="500">Done</text>
1625
+ <text x="400" y="86" text-anchor="start" fill="#64748b" font-size="8">(local)</text>
1440
1626
  </g>
1441
1627
 
1442
- <!-- Connect decision to Direct flow -->
1443
- <path d="M 690 155 L 690 175 L 420 175 L 420 160" stroke="#f97316" stroke-width="1.5" fill="none"/>
1444
- <polygon points="420,160 415,170 425,170" fill="#f97316"/>
1445
-
1446
1628
  <!-- ===== UTILITIES ===== -->
1447
- <text x="500" y="295" text-anchor="middle" fill="#64748b" font-size="12" font-weight="500">
1629
+ <text x="600" y="400" text-anchor="middle" fill="#64748b" font-size="14" font-weight="500">
1448
1630
  <tspan data-lang="fr">UTILITAIRES (independants)</tspan>
1449
1631
  <tspan data-lang="en">UTILITIES (standalone)</tspan>
1450
1632
  </text>
1451
1633
 
1452
- <g transform="translate(80, 310)">
1453
- <rect x="0" y="0" width="120" height="35" rx="5" fill="transparent" stroke="#475569" stroke-width="1.5" stroke-dasharray="3,2"/>
1454
- <text x="60" y="22" text-anchor="middle" fill="#64748b" font-size="10">/gitflow init</text>
1634
+ <!-- Utilities in two rows -->
1635
+ <g transform="translate(100, 420)">
1636
+ <rect x="0" y="0" width="150" height="45" rx="8" fill="transparent" stroke="#475569" stroke-width="2" stroke-dasharray="5,3"/>
1637
+ <text x="75" y="28" text-anchor="middle" fill="#64748b" font-size="11">/gitflow init</text>
1455
1638
  </g>
1456
1639
 
1457
- <g transform="translate(220, 310)">
1458
- <rect x="0" y="0" width="130" height="35" rx="5" fill="transparent" stroke="#3b82f6" stroke-width="1.5"/>
1459
- <text x="65" y="22" text-anchor="middle" fill="#60a5fa" font-size="10">/gitflow status</text>
1640
+ <g transform="translate(280, 420)">
1641
+ <rect x="0" y="0" width="160" height="45" rx="8" fill="transparent" stroke="#3b82f6" stroke-width="2"/>
1642
+ <text x="80" y="28" text-anchor="middle" fill="#60a5fa" font-size="11">/gitflow status</text>
1460
1643
  </g>
1461
1644
 
1462
- <g transform="translate(370, 310)">
1463
- <rect x="0" y="0" width="120" height="35" rx="5" fill="transparent" stroke="#ef4444" stroke-width="1.5"/>
1464
- <text x="60" y="22" text-anchor="middle" fill="#f87171" font-size="10">/gitflow abort</text>
1645
+ <g transform="translate(470, 420)">
1646
+ <rect x="0" y="0" width="150" height="45" rx="8" fill="transparent" stroke="#ef4444" stroke-width="2"/>
1647
+ <text x="75" y="28" text-anchor="middle" fill="#f87171" font-size="11">/gitflow abort</text>
1465
1648
  </g>
1466
1649
 
1467
- <g transform="translate(510, 310)">
1468
- <rect x="0" y="0" width="140" height="35" rx="5" fill="transparent" stroke="#f97316" stroke-width="1.5"/>
1469
- <text x="70" y="22" text-anchor="middle" fill="#fb923c" font-size="10">/gitflow cleanup</text>
1650
+ <g transform="translate(650, 420)">
1651
+ <rect x="0" y="0" width="160" height="45" rx="8" fill="transparent" stroke="#f97316" stroke-width="2"/>
1652
+ <text x="80" y="28" text-anchor="middle" fill="#fb923c" font-size="11">/gitflow cleanup</text>
1470
1653
  </g>
1471
1654
 
1472
- <g transform="translate(670, 310)">
1473
- <rect x="0" y="0" width="140" height="35" rx="5" fill="transparent" stroke="#22c55e" stroke-width="1.5"/>
1474
- <text x="70" y="22" text-anchor="middle" fill="#4ade80" font-size="10">/gitflow finish</text>
1655
+ <g transform="translate(840, 420)">
1656
+ <rect x="0" y="0" width="160" height="45" rx="8" fill="transparent" stroke="#22c55e" stroke-width="2"/>
1657
+ <text x="80" y="28" text-anchor="middle" fill="#4ade80" font-size="11">/gitflow finish</text>
1475
1658
  </g>
1476
1659
 
1477
- <!-- Legend -->
1478
- <g transform="translate(40, 370)">
1479
- <rect x="0" y="-8" width="16" height="16" rx="3" fill="#06b6d4" fill-opacity="0.1" stroke="#06b6d4" stroke-width="1.5"/>
1480
- <text x="25" y="4" fill="#06b6d4" font-size="9">
1481
- <tspan data-lang="fr">PR Flow (recommande)</tspan>
1482
- <tspan data-lang="en">PR Flow (recommended)</tspan>
1483
- </text>
1484
-
1485
- <rect x="180" y="-8" width="16" height="16" rx="3" fill="#f97316" fill-opacity="0.1" stroke="#f97316" stroke-width="1.5"/>
1486
- <text x="205" y="4" fill="#fb923c" font-size="9">
1487
- <tspan data-lang="fr">Direct Merge (solo)</tspan>
1488
- <tspan data-lang="en">Direct Merge (solo)</tspan>
1489
- </text>
1490
-
1491
- <rect x="360" y="-8" width="16" height="16" rx="3" fill="#334155" fill-opacity="0.5" stroke="#64748b" stroke-width="1"/>
1492
- <text x="385" y="4" fill="#64748b" font-size="9">
1493
- <tspan data-lang="fr">Action externe (GitHub)</tspan>
1494
- <tspan data-lang="en">External action (GitHub)</tspan>
1495
- </text>
1660
+ <!-- Sync utility -->
1661
+ <g transform="translate(390, 485)">
1662
+ <rect x="0" y="0" width="150" height="45" rx="8" fill="transparent" stroke="#a855f7" stroke-width="2"/>
1663
+ <text x="75" y="28" text-anchor="middle" fill="#c084fc" font-size="11">/gitflow sync</text>
1664
+ </g>
1496
1665
 
1497
- <polygon points="558,-8 570,0 558,8 546,0" fill="transparent" stroke="#6366f1" stroke-width="1.5"/>
1498
- <text x="580" y="4" fill="#64748b" font-size="9">
1499
- <tspan data-lang="fr">Decision</tspan>
1500
- <tspan data-lang="en">Decision</tspan>
1501
- </text>
1666
+ <!-- Review utility -->
1667
+ <g transform="translate(570, 485)">
1668
+ <rect x="0" y="0" width="160" height="45" rx="8" fill="transparent" stroke="#14b8a6" stroke-width="2"/>
1669
+ <text x="80" y="28" text-anchor="middle" fill="#2dd4bf" font-size="11">/gitflow review</text>
1502
1670
  </g>
1503
1671
  </svg>
1504
1672
  </div>
@@ -1691,38 +1859,38 @@
1691
1859
  </p>
1692
1860
  </div>
1693
1861
 
1694
- <!-- gitflow:13-sync -->
1862
+ <!-- gitflow sync -->
1695
1863
  <div class="command-card" style="background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem; border-left: 4px solid #14b8a6;">
1696
1864
  <div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem;">
1697
1865
  <code style="background: #14b8a6; color: #0f172a; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.85rem;">/gitflow sync</code>
1866
+ <span class="tag tag-workflow">Sync</span>
1698
1867
  </div>
1699
1868
  <h5 style="color: #c8d0dc; margin: 0 0 0.5rem 0; font-size: 0.95rem;">
1700
- <span data-lang="fr">Synchroniser avec le remote</span>
1701
- <span data-lang="en">Sync with Remote</span>
1702
- </h5>
1703
- <p style="color: #94a3b8; font-size: 0.85rem; margin: 0; line-height: 1.5;">
1704
- <span data-lang="fr">Synchronise la branche locale avec sa remote tracking. Detecte automatiquement si pull ou push est necessaire et gere les divergences.</span>
1705
- <span data-lang="en">Synchronizes local branch with remote tracking. Automatically detects if pull or push is needed and handles divergence.</span>
1706
- </p>
1707
- </div>
1708
-
1709
- <!-- gitflow:14-rebase -->
1710
- <div class="command-card" style="background: var(--bg-card); border: 1px solid var(--border); border-radius: 8px; padding: 1.25rem; border-left: 4px solid #a855f7;">
1711
- <div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem;">
1712
- <code style="background: #a855f7; color: #f8fafc; padding: 0.25rem 0.5rem; border-radius: 4px; font-size: 0.85rem;">/gitflow sync</code>
1713
- </div>
1714
- <h5 style="color: #c8d0dc; margin: 0 0 0.5rem 0; font-size: 0.95rem;">
1715
- <span data-lang="fr">Rebase sur branche cible</span>
1716
- <span data-lang="en">Rebase on Target Branch</span>
1869
+ <span data-lang="fr">Synchroniser et Rebase</span>
1870
+ <span data-lang="en">Sync and Rebase</span>
1717
1871
  </h5>
1718
- <p style="color: #94a3b8; font-size: 0.85rem; margin: 0 0 0.5rem 0; line-height: 1.5;">
1719
- <span data-lang="fr">Rebase la branche courante sur develop (ou branche specifiee) :</span>
1720
- <span data-lang="en">Rebases current branch on develop (or specified branch):</span>
1872
+ <p style="color: #94a3b8; font-size: 0.85rem; margin: 0 0 0.75rem 0; line-height: 1.5;">
1873
+ <span data-lang="fr">Synchronise la branche locale avec le remote et rebase sur la branche de base si necessaire.</span>
1874
+ <span data-lang="en">Synchronizes local branch with remote and rebases on base branch if needed.</span>
1721
1875
  </p>
1722
- <ul style="color: #94a3b8; font-size: 0.8rem; margin: 0; padding-left: 1.25rem; line-height: 1.6;">
1723
- <li><code style="color: #a855f7;">/gitflow sync</code> <span data-lang="fr">→ rebase sur develop</span><span data-lang="en">→ rebase on develop</span></li>
1724
- <li><code style="color: #a855f7;">/gitflow sync main</code> <span data-lang="fr">→ rebase sur main</span><span data-lang="en">→ rebase on main</span></li>
1876
+ <h6 style="color: #c8d0dc; margin: 0.75rem 0 0.5rem 0; font-size: 0.85rem;">
1877
+ <span data-lang="fr">Fonctionnalites</span>
1878
+ <span data-lang="en">Features</span>
1879
+ </h6>
1880
+ <ul style="color: #94a3b8; font-size: 0.8rem; margin: 0 0 0.75rem 0; padding-left: 1.25rem; line-height: 1.6;">
1881
+ <li><span data-lang="fr">Fetch depuis le remote</span><span data-lang="en">Fetch from remote</span></li>
1882
+ <li><span data-lang="fr">Calcul de divergence (ahead/behind)</span><span data-lang="en">Divergence calculation (ahead/behind)</span></li>
1883
+ <li><span data-lang="fr">Push des commits locaux</span><span data-lang="en">Push local commits</span></li>
1884
+ <li><span data-lang="fr">Pull avec gestion automatique du stash</span><span data-lang="en">Pull with automatic stash handling</span></li>
1885
+ <li><span data-lang="fr">Rebase sur branche de base si behind</span><span data-lang="en">Rebase on base branch if behind</span></li>
1886
+ <li><span data-lang="fr">Gestion des conflits de migration EF Core</span><span data-lang="en">EF Core migration conflict handling</span></li>
1887
+ <li><span data-lang="fr">Force push avec <code>--force-with-lease</code> apres rebase</span><span data-lang="en">Force push with <code>--force-with-lease</code> after rebase</span></li>
1725
1888
  </ul>
1889
+ <div class="code-block" style="margin-top: 0.75rem;">
1890
+ <button class="copy-btn">Copy</button>
1891
+ <pre><code>/gitflow sync # Sync + rebase on base branch
1892
+ /gitflow sync --dry-run # Preview without executing</code></pre>
1893
+ </div>
1726
1894
  </div>
1727
1895
  </div>
1728
1896
  </section>
@@ -1746,7 +1914,7 @@
1746
1914
 
1747
1915
  <!-- Worktree Structure SVG Diagram -->
1748
1916
  <div class="svg-diagram" style="margin: 1.5rem 0;">
1749
- <svg viewBox="0 0 1100 520" preserveAspectRatio="xMidYMid meet" style="width: 100%; max-width: 1100px; height: auto; display: block; margin: 0 auto;">
1917
+ <svg viewBox="0 0 1100 520" preserveAspectRatio="xMidYMid meet" style="width: 100%; max-width: 1800px; height: auto; display: block; margin: 0 auto;">
1750
1918
  <!-- Definitions for folder icons -->
1751
1919
  <defs>
1752
1920
  <linearGradient id="folderGradient" x1="0%" y1="0%" x2="0%" y2="100%">
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlashub/smartstack-cli",
3
- "version": "1.14.1",
3
+ "version": "1.14.2",
4
4
  "description": "SmartStack Claude Code automation toolkit - GitFlow, APEX, EF Core migrations, prompts and more",
5
5
  "author": {
6
6
  "name": "SmartStack",
@@ -109,9 +109,32 @@ if (entity.UserType == UserType.System || entity.UserType == UserType.LocalAdmin
109
109
 
110
110
  ## MCP Tools References
111
111
 
112
- | Tool | Usage |
113
- |------|-------|
114
- | `mcp__smartstack__validate_conventions` | Validate conventions |
115
- | `mcp__smartstack__scaffold_extension` | Code generation |
116
- | `mcp__smartstack__check_migrations` | Check migrations |
117
- | `mcp__smartstack__scaffold_tests` | Generate tests |
112
+ ### Outils Core
113
+
114
+ | Tool | Usage | Step APEX |
115
+ |------|-------|-----------|
116
+ | `mcp__smartstack__validate_conventions` | Valider conventions SmartStack (tables, migrations, services, namespaces, entities, tenants, controllers) | step-04-validate |
117
+ | `mcp__smartstack__scaffold_extension` | Génération code (feature, entity, service, controller, component, dto, validator, repository) | step-03-execute |
118
+ | `mcp__smartstack__check_migrations` | Analyser migrations EF Core (conflits, ordre, ModelSnapshot) | step-04-validate |
119
+ | `mcp__smartstack__api_docs` | Documentation API depuis Swagger/OpenAPI ou controllers | step-01-analyze |
120
+ | `mcp__smartstack__suggest_migration` | Suggérer nom migration ({context}_v{version}_{sequence}_{Description}) | step-03-execute |
121
+ | `mcp__smartstack__generate_permissions` | Générer permissions RBAC depuis NavRoute | step-03-execute |
122
+
123
+ ### Outils Tests
124
+
125
+ | Tool | Usage | Step APEX |
126
+ |------|-------|-----------|
127
+ | `mcp__smartstack__scaffold_tests` | Générer tests unitaires/intégration/sécurité | step-07-tests |
128
+ | `mcp__smartstack__analyze_test_coverage` | Analyser couverture de tests du projet | step-07-tests |
129
+ | `mcp__smartstack__validate_test_conventions` | Valider conventions de nommage des tests | step-07-tests |
130
+ | `mcp__smartstack__suggest_test_scenarios` | Suggérer scénarios de test basés sur le code | step-07-tests |
131
+
132
+ ### Outils Frontend
133
+
134
+ | Tool | Usage | Step APEX |
135
+ |------|-------|-----------|
136
+ | `mcp__smartstack__scaffold_api_client` | Générer client TypeScript avec NavRoute | step-03-execute |
137
+ | `mcp__smartstack__scaffold_routes` | Générer React Router depuis NavRoute backend | step-03-execute |
138
+ | `mcp__smartstack__validate_frontend_routes` | Valider synchronisation routes frontend/backend | step-04-validate |
139
+ | `mcp__smartstack__scaffold_frontend_extension` | Générer infrastructure extension frontend | step-03-execute |
140
+ | `mcp__smartstack__analyze_extension_points` | Analyser points d'extension dans les pages React | step-01-analyze |
@@ -225,6 +225,62 @@ When provided, step-00 will:
225
225
  - **Use parallel agents** for independent exploration tasks (unless economy_mode)
226
226
  </execution_rules>
227
227
 
228
+ <mcp_requirements>
229
+ **SmartStack MCP Integration:**
230
+
231
+ APEX est fortement couplé au développement SmartStack via les outils MCP.
232
+ Référence complète dans `_shared.md` section "MCP Tools References".
233
+
234
+ ### Outils obligatoires (chaque exécution APEX)
235
+
236
+ | Tool | Quand | Step |
237
+ |------|-------|------|
238
+ | `mcp__smartstack__api_docs` | Analyse contexte API existant | step-01-analyze |
239
+ | `mcp__smartstack__validate_conventions` | Validation finale du code généré | step-04-validate |
240
+
241
+ ### Outils conditionnels (step-03-execute)
242
+
243
+ | Tool | Condition |
244
+ |------|-----------|
245
+ | `mcp__smartstack__scaffold_extension` | Génération entités/services/controllers |
246
+ | `mcp__smartstack__suggest_migration` | Création nouvelle migration EF Core |
247
+ | `mcp__smartstack__generate_permissions` | Génération permissions RBAC |
248
+ | `mcp__smartstack__scaffold_api_client` | Génération client TypeScript |
249
+ | `mcp__smartstack__scaffold_routes` | Génération routes React Router |
250
+
251
+ ### Outils conditionnels (step-04-validate)
252
+
253
+ | Tool | Condition |
254
+ |------|-----------|
255
+ | `mcp__smartstack__check_migrations` | Si modifications EF Core détectées |
256
+ | `mcp__smartstack__validate_frontend_routes` | Si code frontend généré |
257
+
258
+ ### Outils tests (step-07-tests, si `-t`)
259
+
260
+ | Tool | Usage |
261
+ |------|-------|
262
+ | `mcp__smartstack__scaffold_tests` | Générer tests unitaires/intégration |
263
+ | `mcp__smartstack__suggest_test_scenarios` | Suggérer scénarios de test |
264
+ | `mcp__smartstack__analyze_test_coverage` | Analyser couverture existante |
265
+
266
+ ### Outils analyse (step-01-analyze)
267
+
268
+ | Tool | Usage |
269
+ |------|-------|
270
+ | `mcp__smartstack__analyze_extension_points` | Identifier points d'extension React |
271
+
272
+ ### Vérification MCP (step-00)
273
+
274
+ Au démarrage, vérifier la disponibilité du MCP SmartStack :
275
+ - Si disponible : utiliser les outils MCP pour génération et validation
276
+ - Si indisponible : avertir l'utilisateur, continuer en mode dégradé (outils manuels)
277
+
278
+ ### Mode économie (`-e`)
279
+
280
+ En mode économie, les outils MCP restent disponibles mais les subagents sont désactivés.
281
+ Privilégier les outils MCP (`scaffold_*`) pour la génération plutôt que l'écriture manuelle.
282
+ </mcp_requirements>
283
+
228
284
  <success_criteria>
229
285
 
230
286
  - Each step loaded progressively
@@ -50,7 +50,24 @@ From the task description, identify:
50
50
 
51
51
  These keywords guide exploration - NOT planning.
52
52
 
53
- ### 2. Explore Codebase
53
+ ### 2. SmartStack MCP Context (if available)
54
+
55
+ **Use MCP tools for SmartStack-specific context:**
56
+
57
+ ```
58
+ mcp__smartstack__api_docs:
59
+ format: "markdown"
60
+ # Récupère la documentation API existante
61
+ # Identifie les endpoints, DTOs, et patterns utilisés
62
+ ```
63
+
64
+ This provides:
65
+ - Existing API endpoints and their structure
66
+ - DTOs and request/response models
67
+ - Controller patterns and conventions
68
+ - NavRoute hierarchy
69
+
70
+ ### 3. Explore Codebase
54
71
 
55
72
  **If `{economy_mode}` = true:**
56
73
 
@@ -98,7 +115,7 @@ Find:
98
115
  3. Known pitfalls or gotchas
99
116
  ```
100
117
 
101
- ### 3. Synthesize Findings
118
+ ### 4. Synthesize Findings
102
119
 
103
120
  Combine results into structured context:
104
121
 
@@ -140,7 +157,7 @@ Combine results into structured context:
140
157
  - Use httpOnly cookies for tokens
141
158
  ```
142
159
 
143
- ### 4. Infer Acceptance Criteria
160
+ ### 5. Infer Acceptance Criteria
144
161
 
145
162
  Based on task and context, infer success criteria:
146
163
 
@@ -156,7 +173,7 @@ Based on "{task_description}" and existing patterns:
156
173
  _These will be refined in the planning step._
157
174
  ```
158
175
 
159
- ### 5. Save Output (if save_mode)
176
+ ### 6. Save Output (if save_mode)
160
177
 
161
178
  **If `{save_mode}` = true:**
162
179
 
@@ -165,7 +182,7 @@ Write findings to `{output_dir}/01-analyze.md`:
165
182
  - Add timestamp at the end
166
183
  - Update 00-context.md Progress table: 01-analyze -> Complete
167
184
 
168
- ### 6. Present Context Summary
185
+ ### 7. Present Context Summary
169
186
 
170
187
  ```
171
188
  **Context Gathering Complete**
@@ -85,7 +85,33 @@ pnpm run test
85
85
  3. Fix the root cause
86
86
  4. Re-run until passing
87
87
 
88
- ### 3. Self-Audit Checklist
88
+ ### 3. SmartStack Convention Validation (if MCP available)
89
+
90
+ **Use MCP to validate SmartStack conventions:**
91
+
92
+ ```
93
+ mcp__smartstack__validate_conventions:
94
+ checks: ["all"]
95
+ # Valide: tables, migrations, services, namespaces, entities, tenants, controllers
96
+ ```
97
+
98
+ **If EF Core changes detected, also run:**
99
+
100
+ ```
101
+ mcp__smartstack__check_migrations:
102
+ # Vérifie conflits, ordre chronologique, ModelSnapshot
103
+ ```
104
+
105
+ **MCP validation checks:**
106
+ - [ ] Table naming (domain prefixes: auth_, nav_, cfg_, etc.)
107
+ - [ ] Migration naming ({context}_v{version}_{sequence}_{Description})
108
+ - [ ] Service interfaces (I*Service pattern)
109
+ - [ ] Namespace structure (Domain → Application → Infrastructure → API)
110
+ - [ ] Entity conventions (base classes, soft delete, audit)
111
+ - [ ] Tenant isolation (ITenantEntity where required)
112
+ - [ ] Controller routes (NavRoute attributes)
113
+
114
+ ### 4. Self-Audit Checklist
89
115
 
90
116
  Verify each item:
91
117
 
@@ -109,14 +135,14 @@ Verify each item:
109
135
  - [ ] Error handling consistent
110
136
  - [ ] Naming conventions match
111
137
 
112
- ### 4. Format Code
138
+ ### 5. Format Code
113
139
 
114
140
  If format command available:
115
141
  ```bash
116
142
  pnpm run format
117
143
  ```
118
144
 
119
- ### 5. Final Verification
145
+ ### 6. Final Verification
120
146
 
121
147
  Re-run all checks:
122
148
  ```bash
@@ -125,7 +151,7 @@ pnpm run typecheck && pnpm run lint
125
151
 
126
152
  Both MUST pass.
127
153
 
128
- ### 6. Present Validation Results
154
+ ### 7. Present Validation Results
129
155
 
130
156
  ```
131
157
  **Validation Complete**
@@ -144,7 +170,7 @@ Both MUST pass.
144
170
  **Summary:** All checks passing, ready for next step.
145
171
  ```
146
172
 
147
- ### 7. Save Output (if save_mode)
173
+ ### 8. Save Output (if save_mode)
148
174
 
149
175
  **If `{save_mode}` = true:**
150
176
 
@@ -154,7 +180,7 @@ Write to `{output_dir}/04-validate.md`:
154
180
  - Timestamp
155
181
  - Update 00-context.md Progress table: 04-validate -> Complete
156
182
 
157
- ### 8. Determine Next Step
183
+ ### 9. Determine Next Step
158
184
 
159
185
  **Decision tree:**
160
186
 
@@ -70,12 +70,12 @@ import { EntityCard, ProviderCard, TemplateCard } from '@/components/ui/EntityCa
70
70
  | `links` | `Array<{ icon, label, href?, onClick? }>` |
71
71
  | `actions` | `Array<{ label, href?, onClick?, variant, icon?, disabled? }>` |
72
72
 
73
- ### Action Variants
73
+ ### Action Variants (EntityCard)
74
74
  | Variant | Style |
75
75
  |---------|-------|
76
- | `primary` | `bg-accent-500 text-white` |
77
- | `secondary` | `bg-accent-700 text-white` |
78
- | `ghost` | `border bg-transparent` |
76
+ | `primary` | `bg-[var(--color-accent-600)] text-white` |
77
+ | `secondary` | `bg-[var(--bg-secondary)] text-[var(--text-secondary)]` |
78
+ | `ghost` | `text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]` (NO border!) |
79
79
 
80
80
  ## RESPONSIVE GRID
81
81
 
@@ -159,12 +159,174 @@ const canExecute = hasPermission('module.action.execute');
159
159
  | Catalogs | Cards with complex interactive states |
160
160
  | Clickable grids | Cards with integrated forms |
161
161
 
162
+ ## CRITICAL: CSS VARIABLES (NEVER HARDCODE COLORS)
163
+
164
+ **NEVER use hardcoded Tailwind colors.** ALWAYS use CSS variables for theme compliance.
165
+
166
+ ### Status Colors
167
+ | Status | Background | Text | Border | Dot (solid) |
168
+ |--------|------------|------|--------|-------------|
169
+ | **Info** (Pending, Business) | `--info-bg` | `--info-text` | `--info-border` | `--info-dot` |
170
+ | **Success** (Active) | `--success-bg` | `--success-text` | `--success-border` | `--success-dot` |
171
+ | **Warning** (Suspended, Owner) | `--warning-bg` | `--warning-text` | `--warning-border` | `--warning-dot` |
172
+ | **Error** (Danger, Archive) | `--error-bg` | `--error-text` | `--error-border` | `--error-dot` |
173
+ | **Accent** (Personal, Primary) | `--accent-bg` | `--accent-text` | `--accent-border` | `--color-accent-500` |
174
+
175
+ ### Badge Pattern
176
+ ```tsx
177
+ // ✅ CORRECT - Uses CSS variables
178
+ <span className="px-2 py-0.5 text-xs rounded-[var(--radius-badge)] bg-[var(--info-bg)] text-[var(--info-text)]">
179
+ Info Badge
180
+ </span>
181
+
182
+ // ❌ WRONG - Hardcoded Tailwind colors
183
+ <span className="bg-blue-500/10 text-blue-500">Info Badge</span>
184
+ ```
185
+
186
+ ### Status Config Pattern
187
+ ```tsx
188
+ // ✅ CORRECT
189
+ const STATUS_CONFIG = {
190
+ Pending: { bgColor: 'bg-[var(--info-bg)]', color: 'text-[var(--info-text)]', borderColor: 'border-[var(--info-border)]' },
191
+ Active: { bgColor: 'bg-[var(--success-bg)]', color: 'text-[var(--success-text)]', borderColor: 'border-[var(--success-border)]' },
192
+ Suspended: { bgColor: 'bg-[var(--warning-bg)]', color: 'text-[var(--warning-text)]', borderColor: 'border-[var(--warning-border)]' },
193
+ Archived: { bgColor: 'bg-[var(--bg-tertiary)]', color: 'text-[var(--text-tertiary)]', borderColor: 'border-[var(--border-color)]' }
194
+ };
195
+
196
+ // ❌ WRONG - dark: variants are obsolete
197
+ const STATUS_CONFIG = {
198
+ Active: { bgColor: 'bg-emerald-50 dark:bg-emerald-900/20', ... }
199
+ };
200
+ ```
201
+
202
+ ## BUTTON VARIANTS
203
+
204
+ ### Action Buttons (Status changes)
205
+ ```tsx
206
+ // Success action (Activate)
207
+ <button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--success-dot)] text-white hover:opacity-90">
208
+ Activate
209
+ </button>
210
+
211
+ // Warning action (Suspend)
212
+ <button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--warning-dot)] text-white hover:opacity-90">
213
+ Suspend
214
+ </button>
215
+
216
+ // Danger action (Archive/Delete)
217
+ <button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--error-dot)] text-white hover:opacity-90">
218
+ Archive
219
+ </button>
220
+
221
+ // Primary action
222
+ <button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--color-accent-600)] text-white hover:bg-[var(--color-accent-700)]">
223
+ Save
224
+ </button>
225
+
226
+ // Ghost action (NO BORDER!)
227
+ <button className="px-4 py-2 rounded-[var(--radius-button)] text-[var(--text-secondary)] hover:text-[var(--text-primary)] hover:bg-[var(--bg-hover)]">
228
+ Refresh
229
+ </button>
230
+
231
+ // Secondary action
232
+ <button className="px-4 py-2 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]">
233
+ Cancel
234
+ </button>
235
+ ```
236
+
237
+ ### Button Rules
238
+ | Variant | Background | Text | Border | Hover |
239
+ |---------|------------|------|--------|-------|
240
+ | **Primary** | `--color-accent-600` | `white` | none | `--color-accent-700` |
241
+ | **Success** | `--success-dot` | `white` | none | `opacity-90` |
242
+ | **Warning** | `--warning-dot` | `white` | none | `opacity-90` |
243
+ | **Danger** | `--error-dot` | `white` | none | `opacity-90` |
244
+ | **Secondary** | `--bg-secondary` | `--text-secondary` | none | `--bg-hover` |
245
+ | **Ghost** | transparent | `--text-secondary` | **NONE** | `--bg-hover` |
246
+
247
+ ## DETAIL PAGE TEMPLATE
248
+
249
+ ### Structure
250
+ ```tsx
251
+ <div className="container mx-auto px-4 py-6 max-w-7xl space-y-6">
252
+ {/* Header */}
253
+ <div className="flex items-center gap-4">
254
+ <button onClick={() => navigate(-1)} className="p-2 rounded-[var(--radius-button)] hover:bg-[var(--bg-hover)]">
255
+ <ArrowLeft className="w-5 h-5 text-[var(--text-secondary)]" />
256
+ </button>
257
+ <div className="flex-1">
258
+ <h1 className="text-xl sm:text-2xl font-bold text-[var(--text-primary)]">{title}</h1>
259
+ <p className="text-sm text-[var(--text-secondary)]">{subtitle}</p>
260
+ </div>
261
+ <div className="flex items-center gap-2">
262
+ {/* Status badges */}
263
+ </div>
264
+ </div>
265
+
266
+ {/* Pill Tabs */}
267
+ <div className="flex gap-1 p-1 bg-[var(--bg-secondary)] rounded-[var(--radius-card)] border border-[var(--border-color)]">
268
+ {tabs.map(tab => (
269
+ <button
270
+ key={tab.id}
271
+ className={`px-4 py-2 rounded-[var(--radius-button)] font-medium ${
272
+ activeTab === tab.id
273
+ ? 'bg-[var(--color-accent-600)] text-white'
274
+ : 'text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]'
275
+ }`}
276
+ >
277
+ {tab.label}
278
+ </button>
279
+ ))}
280
+ </div>
281
+
282
+ {/* Tab Content */}
283
+ <div className="min-h-[400px]">{/* ... */}</div>
284
+ </div>
285
+ ```
286
+
287
+ ### Info Card Pattern
288
+ ```tsx
289
+ <div className="p-4 rounded-[var(--radius-card)] bg-[var(--bg-primary)] border border-[var(--border-color)]">
290
+ <div className="flex items-center justify-between mb-4">
291
+ <h3 className="text-lg font-semibold text-[var(--text-primary)] flex items-center gap-2">
292
+ <Icon className="w-5 h-5" />
293
+ {title}
294
+ </h3>
295
+ <button className="flex items-center gap-1 px-3 py-1.5 rounded-[var(--radius-button)] bg-[var(--bg-secondary)] text-[var(--text-secondary)] hover:bg-[var(--bg-hover)]">
296
+ <Edit3 className="w-4 h-4" />
297
+ {t('common:edit')}
298
+ </button>
299
+ </div>
300
+ <div className="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-4 gap-4">
301
+ <div className="p-3 rounded-lg bg-[var(--bg-secondary)]">
302
+ <p className="text-xs text-[var(--text-tertiary)] uppercase tracking-wider mb-1">{label}</p>
303
+ <p className="text-sm text-[var(--text-primary)] font-medium">{value}</p>
304
+ </div>
305
+ </div>
306
+ </div>
307
+ ```
308
+
309
+ ### Error Display Pattern
310
+ ```tsx
311
+ {error && (
312
+ <div className="p-4 rounded-[var(--radius-card)] bg-[var(--error-bg)] border border-[var(--error-border)]">
313
+ <div className="flex items-center gap-2 text-[var(--error-text)]">
314
+ <AlertTriangle className="w-5 h-5" />
315
+ <span>{error}</span>
316
+ </div>
317
+ </div>
318
+ )}
319
+ ```
320
+
162
321
  ## ABSOLUTE RULES
163
322
 
164
323
  | DO | DON'T |
165
324
  |----|-------|
325
+ | CSS variables for ALL colors | Hardcoded Tailwind colors (`bg-blue-500`) |
326
+ | `--success-dot`, `--warning-dot`, `--error-dot` for action buttons | `bg-emerald-500`, `bg-amber-500`, `bg-red-500` |
327
+ | `--info-bg`, `--success-bg`, etc. for badges | `bg-blue-500/10 dark:bg-blue-900/20` |
328
+ | Ghost buttons WITHOUT border | `border border-[var(--border-color)]` on ghost |
166
329
  | EntityCard for entities | Custom cards with manual divs |
167
- | Distinct colored header | rounded-full for avatar (that's table) |
168
330
  | Responsive grid 1→2→3→4 | Fixed non-responsive grid |
169
331
  | h-full + flex-1 + mt-auto | Unaligned buttons in grid |
170
332
  | Empty and loading states | Native HTML tooltip |