@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.
- package/.documentation/gitflow.html +330 -162
- package/package.json +1 -1
- package/templates/skills/_shared.md +29 -6
- package/templates/skills/apex/SKILL.md +56 -0
- package/templates/skills/apex/steps/step-01-analyze.md +22 -5
- package/templates/skills/apex/steps/step-04-validate.md +32 -6
- package/templates/skills/ui-components/SKILL.md +167 -5
|
@@ -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.
|
|
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">🚀</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) -
|
|
882
|
-
<line x1="380" y1="130" x2="
|
|
883
|
-
<line x1="
|
|
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
|
|
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="
|
|
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="
|
|
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(
|
|
1300
|
-
<rect x="0" y="0" width="
|
|
1301
|
-
<text x="
|
|
1302
|
-
<text x="
|
|
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="
|
|
1310
|
-
<polygon points="
|
|
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(
|
|
1314
|
-
<rect x="0" y="0" width="
|
|
1315
|
-
<text x="
|
|
1316
|
-
<text x="
|
|
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="
|
|
1322
|
-
<polygon points="0,
|
|
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
|
-
<!--
|
|
1326
|
-
|
|
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="
|
|
1331
|
-
<text x="
|
|
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="
|
|
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 (
|
|
1338
|
-
|
|
1339
|
-
<
|
|
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="
|
|
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="
|
|
1347
|
-
<tspan data-lang="fr">Equipe
|
|
1348
|
-
<tspan data-lang="en">Team
|
|
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
|
|
1352
|
-
<
|
|
1353
|
-
|
|
1354
|
-
|
|
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(
|
|
1361
|
-
<rect x="0" y="0" width="
|
|
1362
|
-
<text x="
|
|
1363
|
-
<text x="
|
|
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="
|
|
1368
|
-
<polygon points="
|
|
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(
|
|
1372
|
-
<rect x="0" y="0" width="
|
|
1373
|
-
<text x="
|
|
1374
|
-
<text x="
|
|
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="
|
|
1379
|
-
<polygon points="
|
|
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(
|
|
1383
|
-
<rect x="0" y="0" width="
|
|
1384
|
-
<text x="
|
|
1385
|
-
<text x="
|
|
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="
|
|
1390
|
-
<polygon points="
|
|
1391
|
-
<text x="
|
|
1392
|
-
|
|
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
|
-
<!--
|
|
1399
|
-
|
|
1400
|
-
<
|
|
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
|
-
<!--
|
|
1403
|
-
<
|
|
1404
|
-
|
|
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
|
|
1407
|
-
<
|
|
1408
|
-
|
|
1409
|
-
|
|
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,
|
|
1416
|
-
<rect x="0" y="0" width="
|
|
1417
|
-
<text x="
|
|
1418
|
-
<text x="
|
|
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="
|
|
1423
|
-
<polygon points="
|
|
1424
|
-
|
|
1425
|
-
<!--
|
|
1426
|
-
<g transform="translate(
|
|
1427
|
-
<rect x="0" y="0" width="
|
|
1428
|
-
<text x="
|
|
1429
|
-
<text x="
|
|
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="
|
|
1434
|
-
<polygon points="
|
|
1435
|
-
<text x="
|
|
1436
|
-
|
|
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="
|
|
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
|
-
|
|
1453
|
-
|
|
1454
|
-
<
|
|
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(
|
|
1458
|
-
<rect x="0" y="0" width="
|
|
1459
|
-
<text x="
|
|
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(
|
|
1463
|
-
<rect x="0" y="0" width="
|
|
1464
|
-
<text x="
|
|
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(
|
|
1468
|
-
<rect x="0" y="0" width="
|
|
1469
|
-
<text x="
|
|
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(
|
|
1473
|
-
<rect x="0" y="0" width="
|
|
1474
|
-
<text x="
|
|
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
|
-
<!--
|
|
1478
|
-
<g transform="translate(
|
|
1479
|
-
<rect x="0" y="
|
|
1480
|
-
<text x="
|
|
1481
|
-
|
|
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
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1500
|
-
|
|
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
|
|
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
|
|
1701
|
-
<span data-lang="en">Sync
|
|
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.
|
|
1719
|
-
<span data-lang="fr">
|
|
1720
|
-
<span data-lang="en">
|
|
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
|
-
<
|
|
1723
|
-
<
|
|
1724
|
-
<
|
|
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:
|
|
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
|
@@ -109,9 +109,32 @@ if (entity.UserType == UserType.System || entity.UserType == UserType.LocalAdmin
|
|
|
109
109
|
|
|
110
110
|
## MCP Tools References
|
|
111
111
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
|
115
|
-
|
|
116
|
-
| `
|
|
117
|
-
| `
|
|
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.
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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.
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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
|
-
###
|
|
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-
|
|
77
|
-
| `secondary` | `bg-
|
|
78
|
-
| `ghost` | `
|
|
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 |
|