@atlashub/smartstack-cli 4.32.0 → 4.34.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/.documentation/index.html +2 -2
  2. package/.documentation/init.html +358 -174
  3. package/dist/index.js +45 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/mcp-entry.mjs +271 -44
  6. package/dist/mcp-entry.mjs.map +1 -1
  7. package/package.json +1 -1
  8. package/templates/mcp-scaffolding/controller.cs.hbs +54 -128
  9. package/templates/project/README.md +19 -0
  10. package/templates/project/claude-md/api.CLAUDE.md.template +315 -0
  11. package/templates/project/claude-md/application.CLAUDE.md.template +181 -0
  12. package/templates/project/claude-md/domain.CLAUDE.md.template +125 -0
  13. package/templates/project/claude-md/infrastructure.CLAUDE.md.template +168 -0
  14. package/templates/project/claude-md/root.CLAUDE.md.template +339 -0
  15. package/templates/project/claude-md/web.CLAUDE.md.template +339 -0
  16. package/templates/skills/apex/SKILL.md +16 -10
  17. package/templates/skills/apex/_shared.md +1 -1
  18. package/templates/skills/apex/references/checks/architecture-checks.sh +154 -0
  19. package/templates/skills/apex/references/checks/backend-checks.sh +194 -0
  20. package/templates/skills/apex/references/checks/frontend-checks.sh +448 -0
  21. package/templates/skills/apex/references/checks/infrastructure-checks.sh +255 -0
  22. package/templates/skills/apex/references/checks/security-checks.sh +153 -0
  23. package/templates/skills/apex/references/checks/seed-checks.sh +536 -0
  24. package/templates/skills/apex/references/frontend-route-wiring-app-tsx.md +49 -192
  25. package/templates/skills/apex/references/post-checks.md +124 -2156
  26. package/templates/skills/apex/references/smartstack-api.md +160 -957
  27. package/templates/skills/apex/references/smartstack-frontend.md +134 -1022
  28. package/templates/skills/apex/references/smartstack-layers.md +12 -6
  29. package/templates/skills/apex/steps/step-00-init.md +81 -238
  30. package/templates/skills/apex/steps/step-03-execute.md +25 -752
  31. package/templates/skills/apex/steps/step-03a-layer0-domain.md +118 -0
  32. package/templates/skills/apex/steps/step-03b-layer1-seed.md +91 -0
  33. package/templates/skills/apex/steps/step-03c-layer2-backend.md +240 -0
  34. package/templates/skills/apex/steps/step-03d-layer3-frontend.md +300 -0
  35. package/templates/skills/apex/steps/step-03e-layer4-devdata.md +44 -0
  36. package/templates/skills/apex/steps/step-04-examine.md +70 -150
  37. package/templates/skills/application/references/frontend-i18n-and-output.md +2 -2
  38. package/templates/skills/application/references/frontend-route-naming.md +5 -1
  39. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +49 -198
  40. package/templates/skills/application/references/frontend-verification.md +11 -11
  41. package/templates/skills/application/steps/step-05-frontend.md +26 -15
  42. package/templates/skills/application/templates-frontend.md +4 -0
  43. package/templates/skills/cli-app-sync/SKILL.md +2 -2
  44. package/templates/skills/cli-app-sync/references/comparison-map.md +1 -1
  45. package/templates/skills/controller/references/controller-code-templates.md +70 -67
  46. package/templates/skills/controller/references/mcp-scaffold-workflow.md +5 -1
@@ -89,8 +89,8 @@
89
89
  </a>
90
90
  <a href="#structure" class="sidebar-toc-link">Structure</a>
91
91
  <a href="#development" class="sidebar-toc-link">
92
- <span data-lang="fr">Cycle de dev</span>
93
- <span data-lang="en">Dev cycle</span>
92
+ <span data-lang="fr">Quel skill ?</span>
93
+ <span data-lang="en">Which skill?</span>
94
94
  </a>
95
95
  <a href="#maintenance" class="sidebar-toc-link">Maintenance</a>
96
96
  <a href="#first-steps" class="sidebar-toc-link">
@@ -170,100 +170,111 @@
170
170
  ============================================ -->
171
171
  <section id="introduction">
172
172
  <h2>
173
- <span data-lang="fr">Qu'est-ce qu'un projet client SmartStack ?</span>
174
- <span data-lang="en">What is a SmartStack client project?</span>
173
+ <span data-lang="fr">Qu'est-ce qu'une application SmartStack ?</span>
174
+ <span data-lang="en">What is a SmartStack application?</span>
175
175
  </h2>
176
176
 
177
177
  <p data-lang="fr">
178
- Un projet client SmartStack est une application metier construite sur les fondations du socle SmartStack. Le socle fournit tout ce qui est commun a une application professionnelle &mdash; authentification JWT, gestion des roles (RBAC via HasData), isolation multi-tenant, communication temps reel (SignalR), notifications et audit. Votre projet se concentre exclusivement sur <strong>votre logique metier</strong> : vos entites, vos services, vos pages.
178
+ Une application SmartStack s'organise en <strong>4 niveaux</strong> : <strong>Application &rarr; Module &rarr; Section &rarr; Resource</strong>. Chaque niveau genere automatiquement sa navigation, ses permissions et ses roles.
179
179
  </p>
180
180
  <p data-lang="en">
181
- A SmartStack client project is a business application built on top of the SmartStack foundation. The foundation provides everything common to a professional application &mdash; JWT authentication, role management (RBAC via HasData), multi-tenant isolation, real-time communication (SignalR), notifications and auditing. Your project focuses exclusively on <strong>your business logic</strong>: your entities, your services, your pages.
181
+ A SmartStack application is organized in <strong>4 levels</strong>: <strong>Application &rarr; Module &rarr; Section &rarr; Resource</strong>. Each level automatically generates its navigation, permissions and roles.
182
182
  </p>
183
183
 
184
- <p data-lang="fr">
185
- La separation est stricte : vous n'avez jamais besoin de toucher au code du socle. Vous <em>etendez</em> SmartStack en ajoutant vos propres couches, et le socle evolue independamment via les mises a jour (<code>ss upgrade</code>).
186
- </p>
187
- <p data-lang="en">
188
- The separation is strict: you never need to touch the foundation code. You <em>extend</em> SmartStack by adding your own layers, and the foundation evolves independently through updates (<code>ss upgrade</code>).
189
- </p>
190
-
191
- <!-- SVG: Foundation Layers -->
184
+ <!-- SVG: Hierarchy + 3 pillars -->
192
185
  <div class="svg-diagram">
193
- <svg viewBox="0 0 780 255" xmlns="http://www.w3.org/2000/svg" style="font-family: 'Inter', system-ui, sans-serif; width: 100%; max-width: 780px; height: auto; display: block; margin: 1.5rem auto;">
194
- <defs>
195
- <marker id="arrowDown" markerWidth="8" markerHeight="8" refX="4" refY="4" orient="auto">
196
- <path d="M0,0 L8,4 L0,8 z" fill="#8a9bb0"/>
197
- </marker>
198
- </defs>
199
-
200
- <!-- Your Project (top) -->
201
- <rect x="20" y="8" width="740" height="92" rx="10" fill="#1e293b" stroke="#f97316" stroke-width="2"/>
202
- <text x="390" y="32" text-anchor="middle" fill="#f97316" font-weight="700" font-size="13" data-lang="fr">VOTRE CODE METIER</text>
203
- <text x="390" y="32" text-anchor="middle" fill="#f97316" font-weight="700" font-size="13" data-lang="en">YOUR BUSINESS CODE</text>
204
-
205
- <!-- Your Project pills -->
206
- <rect x="52" y="48" width="100" height="32" rx="6" fill="#334155"/>
207
- <text x="102" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11" data-lang="fr">Entites</text>
208
- <text x="102" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11" data-lang="en">Entities</text>
209
-
210
- <rect x="168" y="48" width="100" height="32" rx="6" fill="#334155"/>
211
- <text x="218" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11">Services</text>
212
-
213
- <rect x="284" y="48" width="100" height="32" rx="6" fill="#334155"/>
214
- <text x="334" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11">Controllers</text>
215
-
216
- <rect x="400" y="48" width="110" height="32" rx="6" fill="#334155"/>
217
- <text x="455" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11">Pages React</text>
218
-
219
- <rect x="526" y="48" width="110" height="32" rx="6" fill="#334155"/>
220
- <text x="581" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11" data-lang="fr">Vos tables</text>
221
- <text x="581" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11" data-lang="en">Your tables</text>
222
-
223
- <rect x="652" y="48" width="80" height="32" rx="6" fill="#334155"/>
224
- <text x="692" y="69" text-anchor="middle" fill="#c8d0dc" font-size="11">Tests</text>
225
-
226
- <!-- Arrow: extends -->
227
- <line x1="390" y1="108" x2="390" y2="148" stroke="#8a9bb0" stroke-width="1.5" stroke-dasharray="5,4"/>
228
- <polygon points="384,144 390,155 396,144" fill="#8a9bb0"/>
229
- <text x="390" y="136" text-anchor="middle" fill="#8a9bb0" font-size="11" font-style="italic" data-lang="fr">etend / utilise</text>
230
- <text x="390" y="136" text-anchor="middle" fill="#8a9bb0" font-size="11" font-style="italic" data-lang="en">extends / uses</text>
231
-
232
- <!-- SmartStack (bottom) -->
233
- <rect x="20" y="158" width="740" height="88" rx="10" fill="#1e293b" stroke="#6366f1" stroke-width="2"/>
234
- <text x="390" y="180" text-anchor="middle" fill="#6366f1" font-weight="700" font-size="13">SMARTSTACK (SOCLE)</text>
235
-
236
- <!-- SmartStack pills -->
237
- <rect x="40" y="194" width="92" height="32" rx="6" fill="#312e81"/>
238
- <text x="86" y="215" text-anchor="middle" fill="#c4b5fd" font-size="11">Auth JWT</text>
239
-
240
- <rect x="146" y="194" width="100" height="32" rx="6" fill="#312e81"/>
241
- <text x="196" y="215" text-anchor="middle" fill="#c4b5fd" font-size="11">RBAC</text>
242
-
243
- <rect x="260" y="194" width="108" height="32" rx="6" fill="#312e81"/>
244
- <text x="314" y="215" text-anchor="middle" fill="#c4b5fd" font-size="11">Multi-tenant</text>
186
+ <svg viewBox="0 0 780 310" xmlns="http://www.w3.org/2000/svg" style="font-family: 'Inter', system-ui, sans-serif; width: 100%; max-width: 780px; height: auto; display: block; margin: 1.5rem auto;">
187
+ <!-- Hierarchy tree -->
188
+ <text x="390" y="25" text-anchor="middle" fill="#94a3b8" font-size="11" font-weight="500">
189
+ <tspan data-lang="fr">Exemple : Gestion RH</tspan>
190
+ <tspan data-lang="en">Example: HR Management</tspan>
191
+ </text>
192
+
193
+ <!-- Application level -->
194
+ <rect x="290" y="38" width="200" height="36" rx="8" fill="#1e293b" stroke="#6366f1" stroke-width="2.5"/>
195
+ <text x="390" y="61" text-anchor="middle" fill="#c4b5fd" font-size="12" font-weight="600">
196
+ <tspan data-lang="fr">&#9881; Application : RH</tspan>
197
+ <tspan data-lang="en">&#9881; Application: HR</tspan>
198
+ </text>
199
+
200
+ <!-- Branches down -->
201
+ <line x1="340" y1="74" x2="340" y2="95" stroke="#475569" stroke-width="1.5"/>
202
+ <line x1="440" y1="74" x2="440" y2="95" stroke="#475569" stroke-width="1.5"/>
203
+
204
+ <!-- Module level -->
205
+ <rect x="220" y="98" width="170" height="36" rx="8" fill="#1e293b" stroke="#3b82f6" stroke-width="2"/>
206
+ <text x="305" y="121" text-anchor="middle" fill="#93c5fd" font-size="11" font-weight="600">
207
+ <tspan data-lang="fr">&#128194; Module : Employes</tspan>
208
+ <tspan data-lang="en">&#128194; Module: Employees</tspan>
209
+ </text>
210
+
211
+ <rect x="420" y="98" width="170" height="36" rx="8" fill="#1e293b" stroke="#3b82f6" stroke-width="2"/>
212
+ <text x="505" y="121" text-anchor="middle" fill="#93c5fd" font-size="11" font-weight="600">
213
+ <tspan data-lang="fr">&#128194; Module : Conges</tspan>
214
+ <tspan data-lang="en">&#128194; Module: Leave</tspan>
215
+ </text>
216
+
217
+ <!-- Branch down from Employes -->
218
+ <line x1="305" y1="134" x2="305" y2="155" stroke="#475569" stroke-width="1.5"/>
219
+
220
+ <!-- Section level -->
221
+ <rect x="210" y="158" width="190" height="36" rx="8" fill="#1e293b" stroke="#06b6d4" stroke-width="2"/>
222
+ <text x="305" y="181" text-anchor="middle" fill="#67e8f9" font-size="11" font-weight="600">
223
+ <tspan data-lang="fr">&#128196; Section : Contrats</tspan>
224
+ <tspan data-lang="en">&#128196; Section: Contracts</tspan>
225
+ </text>
226
+
227
+ <!-- Branch down from Section -->
228
+ <line x1="305" y1="194" x2="305" y2="215" stroke="#475569" stroke-width="1.5"/>
229
+
230
+ <!-- Resource level -->
231
+ <rect x="195" y="218" width="220" height="36" rx="8" fill="#1e293b" stroke="#22c55e" stroke-width="2"/>
232
+ <text x="305" y="241" text-anchor="middle" fill="#86efac" font-size="11" font-weight="600">
233
+ <tspan data-lang="fr">&#128203; Resource : TypeContrat</tspan>
234
+ <tspan data-lang="en">&#128203; Resource: ContractType</tspan>
235
+ </text>
245
236
 
246
- <rect x="382" y="194" width="90" height="32" rx="6" fill="#312e81"/>
247
- <text x="427" y="215" text-anchor="middle" fill="#c4b5fd" font-size="11">SignalR</text>
248
-
249
- <rect x="486" y="194" width="115" height="32" rx="6" fill="#312e81"/>
250
- <text x="543" y="215" text-anchor="middle" fill="#c4b5fd" font-size="11">Notifications</text>
251
-
252
- <rect x="615" y="194" width="80" height="32" rx="6" fill="#312e81"/>
253
- <text x="655" y="215" text-anchor="middle" fill="#c4b5fd" font-size="11">Audit</text>
237
+ <!-- Separator -->
238
+ <line x1="450" y1="158" x2="450" y2="290" stroke="#334155" stroke-width="1" stroke-dasharray="4,4"/>
239
+
240
+ <!-- What gets generated (right side) -->
241
+ <text x="615" y="170" text-anchor="middle" fill="#94a3b8" font-size="10" font-weight="500">
242
+ <tspan data-lang="fr">Genere automatiquement :</tspan>
243
+ <tspan data-lang="en">Automatically generated:</tspan>
244
+ </text>
245
+
246
+ <!-- Navigation pill -->
247
+ <rect x="480" y="185" width="115" height="28" rx="6" fill="#6366f1" fill-opacity="0.15" stroke="#6366f1" stroke-width="1.5"/>
248
+ <text x="537" y="204" text-anchor="middle" fill="#c4b5fd" font-size="10" font-weight="600">&#9776; Navigation</text>
249
+
250
+ <!-- Permissions pill -->
251
+ <rect x="605" y="185" width="115" height="28" rx="6" fill="#22c55e" fill-opacity="0.15" stroke="#22c55e" stroke-width="1.5"/>
252
+ <text x="662" y="204" text-anchor="middle" fill="#86efac" font-size="10" font-weight="600">&#128274; Permissions</text>
253
+
254
+ <!-- Roles pill -->
255
+ <rect x="540" y="222" width="115" height="28" rx="6" fill="#f97316" fill-opacity="0.15" stroke="#f97316" stroke-width="1.5"/>
256
+ <text x="597" y="241" text-anchor="middle" fill="#fdba74" font-size="10" font-weight="600">
257
+ <tspan data-lang="fr">&#128101; Roles</tspan>
258
+ <tspan data-lang="en">&#128101; Roles</tspan>
259
+ </text>
260
+
261
+ <!-- Bottom: concrete example -->
262
+ <rect x="20" y="270" width="740" height="32" rx="6" fill="#334155" fill-opacity="0.5"/>
263
+ <text x="390" y="291" text-anchor="middle" fill="#94a3b8" font-size="10">
264
+ <tspan data-lang="fr">Permission generee : <tspan fill="#86efac" font-family="monospace">RH.Employes.Contrats.TypeContrat.Create / Read / Update / Delete</tspan></tspan>
265
+ <tspan data-lang="en">Generated permission: <tspan fill="#86efac" font-family="monospace">HR.Employees.Contracts.ContractType.Create / Read / Update / Delete</tspan></tspan>
266
+ </text>
254
267
  </svg>
255
268
  </div>
256
269
 
257
270
  <div class="alert alert-info">
258
271
  <span class="alert-icon">&#128161;</span>
259
272
  <div class="alert-content">
260
- <h5 data-lang="fr">Principe fondamental</h5>
261
- <h5 data-lang="en">Core principle</h5>
262
273
  <p data-lang="fr">
263
- Vous ne modifiez jamais les internes de SmartStack. Vous etendez le socle en ajoutant vos entites dans le Domain, vos services dans Application, vos tables dans votre propre DbContext. Quand SmartStack evolue, un simple <code>ss upgrade</code> met a jour les fondations sans toucher a votre code.
274
+ Vous decrivez votre besoin (ex: <em>&laquo; Creer un module Employes avec gestion des contrats &raquo;</em>), SmartStack genere le code full-stack : entite, API, pages React, navigation dans le menu, permissions CRUD et assignation aux roles. Voir <a href="#development">l'arbre de decision</a> pour choisir le bon skill.
264
275
  </p>
265
276
  <p data-lang="en">
266
- You never modify SmartStack internals. You extend the foundation by adding your entities in Domain, your services in Application, your tables in your own DbContext. When SmartStack evolves, a simple <code>ss upgrade</code> updates the foundations without touching your code.
277
+ You describe your need (e.g., <em>&laquo; Create an Employees module with contract management &raquo;</em>), SmartStack generates the full-stack code: entity, API, React pages, menu navigation, CRUD permissions and role assignment. See the <a href="#development">decision tree</a> to choose the right skill.
267
278
  </p>
268
279
  </div>
269
280
  </div>
@@ -670,115 +681,288 @@
670
681
  </section>
671
682
 
672
683
  <!-- ============================================
673
- 5. CYCLE DE DEVELOPPEMENT
684
+ 5. QUEL SKILL UTILISER ?
674
685
  ============================================ -->
675
686
  <section id="development">
676
687
  <h2>
677
- <span data-lang="fr">Cycle de developpement</span>
678
- <span data-lang="en">Development cycle</span>
688
+ <span data-lang="fr">Quel skill utiliser ?</span>
689
+ <span data-lang="en">Which skill to use?</span>
679
690
  </h2>
680
691
 
681
692
  <p data-lang="fr">
682
- Voici le flux typique quand vous ajoutez une fonctionnalite a votre projet. Chaque etape a un skill ou un outil dedie qui vous guide :
693
+ Choisissez votre situation, le diagramme vous guide vers le bon parcours.
683
694
  </p>
684
695
  <p data-lang="en">
685
- Here is the typical flow when adding a feature to your project. Each step has a dedicated skill or tool to guide you:
696
+ Choose your situation, the diagram guides you to the right path.
686
697
  </p>
687
698
 
688
- <!-- SVG: Development Pipeline -->
699
+ <!-- SVG: Decision Tree -->
689
700
  <div class="svg-diagram">
690
- <svg viewBox="0 0 780 170" xmlns="http://www.w3.org/2000/svg" style="font-family: 'Inter', system-ui, sans-serif; width: 100%; max-width: 780px; height: auto; display: block; margin: 1.5rem auto;">
691
- <defs>
692
- <marker id="arrowRight" markerWidth="8" markerHeight="8" refX="7" refY="4" orient="auto">
693
- <path d="M0,0 L8,4 L0,8 z" fill="#475569"/>
694
- </marker>
695
- </defs>
696
-
697
- <!-- Step 1: Entity -->
698
- <rect x="4" y="12" width="108" height="54" rx="8" fill="#1e293b" stroke="#6366f1" stroke-width="2"/>
699
- <text x="58" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5" data-lang="fr">1. Entite</text>
700
- <text x="58" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5" data-lang="en">1. Entity</text>
701
- <text x="58" y="54" text-anchor="middle" fill="#6366f1" font-size="9.5">Domain</text>
702
-
703
- <!-- Arrow 1→2 -->
704
- <line x1="116" y1="39" x2="132" y2="39" stroke="#475569" stroke-width="1.5" marker-end="url(#arrowRight)"/>
705
-
706
- <!-- Step 2: DbContext -->
707
- <rect x="136" y="12" width="108" height="54" rx="8" fill="#1e293b" stroke="#06b6d4" stroke-width="2"/>
708
- <text x="190" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5">2. DbContext</text>
709
- <text x="190" y="54" text-anchor="middle" fill="#06b6d4" font-size="9.5">Infrastructure</text>
710
-
711
- <!-- Arrow 2→3 -->
712
- <line x1="248" y1="39" x2="264" y2="39" stroke="#475569" stroke-width="1.5" marker-end="url(#arrowRight)"/>
713
-
714
- <!-- Step 3: Migration -->
715
- <rect x="268" y="12" width="108" height="54" rx="8" fill="#1e293b" stroke="#22c55e" stroke-width="2"/>
716
- <text x="322" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5">3. Migration</text>
717
- <text x="322" y="54" text-anchor="middle" fill="#22c55e" font-size="9.5">/efcore</text>
718
-
719
- <!-- Arrow 3→4 -->
720
- <line x1="380" y1="39" x2="396" y2="39" stroke="#475569" stroke-width="1.5" marker-end="url(#arrowRight)"/>
721
-
722
- <!-- Step 4: Service -->
723
- <rect x="400" y="12" width="108" height="54" rx="8" fill="#1e293b" stroke="#3b82f6" stroke-width="2"/>
724
- <text x="454" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5">4. Service</text>
725
- <text x="454" y="54" text-anchor="middle" fill="#3b82f6" font-size="9.5">Application</text>
726
-
727
- <!-- Arrow 4→5 -->
728
- <line x1="512" y1="39" x2="528" y2="39" stroke="#475569" stroke-width="1.5" marker-end="url(#arrowRight)"/>
729
-
730
- <!-- Step 5: Controller -->
731
- <rect x="532" y="12" width="108" height="54" rx="8" fill="#1e293b" stroke="#f97316" stroke-width="2"/>
732
- <text x="586" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5">5. Controller</text>
733
- <text x="586" y="54" text-anchor="middle" fill="#f97316" font-size="9.5">Api</text>
734
-
735
- <!-- Arrow 5→6 -->
736
- <line x1="644" y1="39" x2="660" y2="39" stroke="#475569" stroke-width="1.5" marker-end="url(#arrowRight)"/>
737
-
738
- <!-- Step 6: Page -->
739
- <rect x="664" y="12" width="108" height="54" rx="8" fill="#1e293b" stroke="#06b6d4" stroke-width="2"/>
740
- <text x="718" y="36" text-anchor="middle" fill="#c8d0dc" font-weight="600" font-size="11.5">6. Page</text>
741
- <text x="718" y="54" text-anchor="middle" fill="#06b6d4" font-size="9.5">React</text>
742
-
743
- <!-- Bottom: skill labels -->
744
- <text x="58" y="90" text-anchor="middle" fill="#8a9bb0" font-size="9">Product.cs</text>
745
- <text x="190" y="90" text-anchor="middle" fill="#8a9bb0" font-size="9" data-lang="fr">DbSet&lt;Product&gt;</text>
746
- <text x="190" y="90" text-anchor="middle" fill="#8a9bb0" font-size="9" data-lang="en">DbSet&lt;Product&gt;</text>
747
- <text x="322" y="90" text-anchor="middle" fill="#22c55e" font-size="9" font-weight="600">/efcore migration</text>
748
- <text x="322" y="104" text-anchor="middle" fill="#22c55e" font-size="9" font-weight="600">/efcore db-deploy</text>
749
- <text x="454" y="90" text-anchor="middle" fill="#8a9bb0" font-size="9">ProductService</text>
750
- <text x="586" y="90" text-anchor="middle" fill="#8a9bb0" font-size="9">ProductController</text>
751
- <text x="718" y="90" text-anchor="middle" fill="#8a9bb0" font-size="9">ProductPage.tsx</text>
752
-
753
- <!-- Automation bar -->
754
- <rect x="4" y="125" width="772" height="36" rx="8" fill="#1e293b" stroke="#eab308" stroke-width="1.5" stroke-dasharray="6,3"/>
755
- <text x="390" y="148" text-anchor="middle" fill="#eab308" font-size="11" font-weight="600" data-lang="fr">&#9889; /application &mdash; orchestre tout le processus automatiquement</text>
756
- <text x="390" y="148" text-anchor="middle" fill="#eab308" font-size="11" font-weight="600" data-lang="en">&#9889; /application &mdash; orchestrates the entire process automatically</text>
701
+ <svg viewBox="0 0 1200 680" preserveAspectRatio="xMidYMid meet" style="width: 100%; max-width: 1800px; height: auto; display: block; margin: 0 auto;">
702
+ <!-- Background -->
703
+ <rect width="1200" height="680" fill="#0f172a" rx="8"/>
704
+
705
+ <!-- Title -->
706
+ <text x="600" y="35" text-anchor="middle" fill="#f8fafc" font-size="20" font-weight="600">
707
+ <tspan data-lang="fr">Que voulez-vous faire ?</tspan>
708
+ <tspan data-lang="en">What do you want to do?</tspan>
709
+ </text>
710
+
711
+ <!-- Central decision diamond -->
712
+ <polygon points="600,55 720,115 600,175 480,115" fill="transparent" stroke="#6366f1" stroke-width="2.5"/>
713
+ <text x="600" y="120" text-anchor="middle" fill="#f8fafc" font-size="13" font-weight="500">
714
+ <tspan data-lang="fr">Objectif</tspan>
715
+ <tspan data-lang="en">Goal</tspan>
716
+ </text>
717
+
718
+ <!-- ===== PATH 1: NOUVEAU PROJET (green) ===== -->
719
+ <line x1="480" y1="115" x2="120" y2="115" stroke="#22c55e" stroke-width="2.5"/>
720
+ <line x1="120" y1="115" x2="120" y2="195" stroke="#22c55e" stroke-width="2.5"/>
721
+ <polygon points="120,195 114,183 126,183" fill="#22c55e"/>
722
+
723
+ <rect x="30" y="200" width="180" height="50" rx="8" fill="#22c55e" fill-opacity="0.15" stroke="#22c55e" stroke-width="2.5"/>
724
+ <text x="120" y="222" text-anchor="middle" fill="#22c55e" font-size="12" font-weight="600">
725
+ <tspan data-lang="fr">Nouveau projet</tspan>
726
+ <tspan data-lang="en">New project</tspan>
727
+ </text>
728
+ <text x="120" y="240" text-anchor="middle" fill="#94a3b8" font-size="9">
729
+ <tspan data-lang="fr">partir de zero</tspan>
730
+ <tspan data-lang="en">from scratch</tspan>
731
+ </text>
732
+
733
+ <!-- ss init -->
734
+ <line x1="120" y1="250" x2="120" y2="270" stroke="#22c55e" stroke-width="2"/>
735
+ <polygon points="120,270 114,262 126,262" fill="#22c55e"/>
736
+ <g class="cmd-copyable" data-cmd="ss init MyApp" style="cursor:pointer;">
737
+ <rect x="30" y="275" width="180" height="32" rx="6" fill="#0f172a" stroke="#22c55e" stroke-width="2"/>
738
+ <text x="120" y="296" text-anchor="middle" fill="#22c55e" font-size="10" font-family="monospace">ss init MyApp</text>
739
+ </g>
740
+
741
+ <!-- /business-analyse -->
742
+ <line x1="120" y1="307" x2="120" y2="322" stroke="#22c55e" stroke-width="2"/>
743
+ <polygon points="120,322 114,314 126,314" fill="#22c55e"/>
744
+ <g class="cmd-copyable" data-cmd="/business-analyse" style="cursor:pointer;">
745
+ <rect x="30" y="327" width="180" height="32" rx="6" fill="#0f172a" stroke="#22c55e" stroke-width="2"/>
746
+ <text x="120" y="348" text-anchor="middle" fill="#22c55e" font-size="10" font-family="monospace">/business-analyse</text>
747
+ </g>
748
+
749
+ <!-- /derive-prd -->
750
+ <line x1="120" y1="359" x2="120" y2="374" stroke="#22c55e" stroke-width="2"/>
751
+ <polygon points="120,374 114,366 126,366" fill="#22c55e"/>
752
+ <g class="cmd-copyable" data-cmd="/derive-prd" style="cursor:pointer;">
753
+ <rect x="30" y="379" width="180" height="32" rx="6" fill="#0f172a" stroke="#22c55e" stroke-width="2"/>
754
+ <text x="120" y="400" text-anchor="middle" fill="#22c55e" font-size="10" font-family="monospace">/derive-prd</text>
755
+ </g>
756
+
757
+ <!-- /ralph-loop -->
758
+ <line x1="120" y1="411" x2="120" y2="426" stroke="#22c55e" stroke-width="2"/>
759
+ <polygon points="120,426 114,418 126,418" fill="#22c55e"/>
760
+ <g class="cmd-copyable" data-cmd="/ralph-loop" style="cursor:pointer;">
761
+ <rect x="30" y="431" width="180" height="32" rx="6" fill="#0f172a" stroke="#22c55e" stroke-width="2"/>
762
+ <text x="120" y="452" text-anchor="middle" fill="#22c55e" font-size="10" font-family="monospace">/ralph-loop</text>
763
+ </g>
764
+
765
+ <!-- /validate-feature -->
766
+ <line x1="120" y1="463" x2="120" y2="478" stroke="#22c55e" stroke-width="2"/>
767
+ <polygon points="120,478 114,470 126,470" fill="#22c55e"/>
768
+ <g class="cmd-copyable" data-cmd="/validate-feature" style="cursor:pointer;">
769
+ <rect x="30" y="483" width="180" height="32" rx="6" fill="#0f172a" stroke="#22c55e" stroke-width="2"/>
770
+ <text x="120" y="504" text-anchor="middle" fill="#22c55e" font-size="10" font-family="monospace">/validate-feature</text>
771
+ </g>
772
+
773
+ <!-- Result -->
774
+ <line x1="120" y1="515" x2="120" y2="530" stroke="#22c55e" stroke-width="2"/>
775
+ <polygon points="120,530 114,522 126,522" fill="#22c55e"/>
776
+ <rect x="30" y="535" width="180" height="40" rx="8" fill="#22c55e" fill-opacity="0.2" stroke="#22c55e" stroke-width="2.5"/>
777
+ <text x="120" y="555" text-anchor="middle" fill="#22c55e" font-size="10" font-weight="600">
778
+ <tspan data-lang="fr">&#10003; Projet complet</tspan>
779
+ <tspan data-lang="en">&#10003; Complete project</tspan>
780
+ </text>
781
+ <text x="120" y="568" text-anchor="middle" fill="#94a3b8" font-size="8">multi-module, full-stack</text>
782
+
783
+ <!-- ===== PATH 2: MODULE COMPLET (blue) ===== -->
784
+ <line x1="360" y1="115" x2="360" y2="195" stroke="#3b82f6" stroke-width="2.5"/>
785
+ <polygon points="360,195 354,183 366,183" fill="#3b82f6"/>
786
+
787
+ <rect x="270" y="200" width="180" height="50" rx="8" fill="#3b82f6" fill-opacity="0.15" stroke="#3b82f6" stroke-width="2.5"/>
788
+ <text x="360" y="222" text-anchor="middle" fill="#3b82f6" font-size="12" font-weight="600">
789
+ <tspan data-lang="fr">Module complet</tspan>
790
+ <tspan data-lang="en">Complete module</tspan>
791
+ </text>
792
+ <text x="360" y="240" text-anchor="middle" fill="#94a3b8" font-size="9">
793
+ <tspan data-lang="fr">full-stack en 1 commande</tspan>
794
+ <tspan data-lang="en">full-stack in 1 command</tspan>
795
+ </text>
796
+
797
+ <!-- /application -->
798
+ <line x1="360" y1="250" x2="360" y2="270" stroke="#3b82f6" stroke-width="2"/>
799
+ <polygon points="360,270 354,262 366,262" fill="#3b82f6"/>
800
+ <g class="cmd-copyable" data-cmd="/application" style="cursor:pointer;">
801
+ <rect x="270" y="275" width="180" height="32" rx="6" fill="#0f172a" stroke="#3b82f6" stroke-width="2"/>
802
+ <text x="360" y="296" text-anchor="middle" fill="#3b82f6" font-size="10" font-family="monospace">/application</text>
803
+ </g>
804
+
805
+ <!-- /efcore db-deploy -->
806
+ <line x1="360" y1="307" x2="360" y2="322" stroke="#3b82f6" stroke-width="2"/>
807
+ <polygon points="360,322 354,314 366,314" fill="#3b82f6"/>
808
+ <g class="cmd-copyable" data-cmd="/efcore db-deploy" style="cursor:pointer;">
809
+ <rect x="270" y="327" width="180" height="32" rx="6" fill="#0f172a" stroke="#3b82f6" stroke-width="2"/>
810
+ <text x="360" y="348" text-anchor="middle" fill="#3b82f6" font-size="10" font-family="monospace">/efcore db-deploy</text>
811
+ </g>
812
+
813
+ <!-- /validate-feature -->
814
+ <line x1="360" y1="359" x2="360" y2="374" stroke="#3b82f6" stroke-width="2"/>
815
+ <polygon points="360,374 354,366 366,366" fill="#3b82f6"/>
816
+ <g class="cmd-copyable" data-cmd="/validate-feature" style="cursor:pointer;">
817
+ <rect x="270" y="379" width="180" height="32" rx="6" fill="#0f172a" stroke="#3b82f6" stroke-width="2"/>
818
+ <text x="360" y="400" text-anchor="middle" fill="#3b82f6" font-size="10" font-family="monospace">/validate-feature</text>
819
+ </g>
820
+
821
+ <!-- Result -->
822
+ <line x1="360" y1="411" x2="360" y2="426" stroke="#3b82f6" stroke-width="2"/>
823
+ <polygon points="360,426 354,418 366,418" fill="#3b82f6"/>
824
+ <rect x="270" y="431" width="180" height="40" rx="8" fill="#3b82f6" fill-opacity="0.2" stroke="#3b82f6" stroke-width="2.5"/>
825
+ <text x="360" y="448" text-anchor="middle" fill="#3b82f6" font-size="10" font-weight="600">
826
+ <tspan data-lang="fr">&#10003; Nav + API + Pages</tspan>
827
+ <tspan data-lang="en">&#10003; Nav + API + Pages</tspan>
828
+ </text>
829
+ <text x="360" y="462" text-anchor="middle" fill="#94a3b8" font-size="8">+ permissions + roles + tests</text>
830
+
831
+ <!-- ===== PATH 3: FEATURE INCREMENTALE (cyan) ===== -->
832
+ <line x1="600" y1="175" x2="600" y2="195" stroke="#06b6d4" stroke-width="2.5"/>
833
+ <polygon points="600,195 594,183 606,183" fill="#06b6d4"/>
834
+
835
+ <rect x="510" y="200" width="180" height="50" rx="8" fill="#06b6d4" fill-opacity="0.15" stroke="#06b6d4" stroke-width="2.5"/>
836
+ <text x="600" y="222" text-anchor="middle" fill="#06b6d4" font-size="12" font-weight="600">
837
+ <tspan data-lang="fr">Feature incrementale</tspan>
838
+ <tspan data-lang="en">Incremental feature</tspan>
839
+ </text>
840
+ <text x="600" y="240" text-anchor="middle" fill="#94a3b8" font-size="9">
841
+ <tspan data-lang="fr">ajouter a un module existant</tspan>
842
+ <tspan data-lang="en">add to existing module</tspan>
843
+ </text>
844
+
845
+ <!-- /apex -->
846
+ <line x1="600" y1="250" x2="600" y2="270" stroke="#06b6d4" stroke-width="2"/>
847
+ <polygon points="600,270 594,262 606,262" fill="#06b6d4"/>
848
+ <g class="cmd-copyable" data-cmd="/apex" style="cursor:pointer;">
849
+ <rect x="510" y="275" width="180" height="32" rx="6" fill="#0f172a" stroke="#06b6d4" stroke-width="2"/>
850
+ <text x="600" y="296" text-anchor="middle" fill="#06b6d4" font-size="10" font-family="monospace">/apex</text>
851
+ </g>
852
+
853
+ <!-- /validate-feature -->
854
+ <line x1="600" y1="307" x2="600" y2="322" stroke="#06b6d4" stroke-width="2"/>
855
+ <polygon points="600,322 594,314 606,314" fill="#06b6d4"/>
856
+ <g class="cmd-copyable" data-cmd="/validate-feature" style="cursor:pointer;">
857
+ <rect x="510" y="327" width="180" height="32" rx="6" fill="#0f172a" stroke="#06b6d4" stroke-width="2"/>
858
+ <text x="600" y="348" text-anchor="middle" fill="#06b6d4" font-size="10" font-family="monospace">/validate-feature</text>
859
+ </g>
860
+
861
+ <!-- Result -->
862
+ <line x1="600" y1="359" x2="600" y2="374" stroke="#06b6d4" stroke-width="2"/>
863
+ <polygon points="600,374 594,366 606,366" fill="#06b6d4"/>
864
+ <rect x="510" y="379" width="180" height="40" rx="8" fill="#06b6d4" fill-opacity="0.2" stroke="#06b6d4" stroke-width="2.5"/>
865
+ <text x="600" y="404" text-anchor="middle" fill="#06b6d4" font-size="10" font-weight="600">
866
+ <tspan data-lang="fr">&#10003; Feature ajoutee</tspan>
867
+ <tspan data-lang="en">&#10003; Feature added</tspan>
868
+ </text>
869
+
870
+ <!-- ===== PATH 4: CORRIGER UN BUG (red) ===== -->
871
+ <line x1="720" y1="115" x2="840" y2="115" stroke="#ef4444" stroke-width="2.5"/>
872
+ <line x1="840" y1="115" x2="840" y2="195" stroke="#ef4444" stroke-width="2.5"/>
873
+ <polygon points="840,195 834,183 846,183" fill="#ef4444"/>
874
+
875
+ <rect x="750" y="200" width="180" height="50" rx="8" fill="#ef4444" fill-opacity="0.15" stroke="#ef4444" stroke-width="2.5"/>
876
+ <text x="840" y="222" text-anchor="middle" fill="#ef4444" font-size="12" font-weight="600">
877
+ <tspan data-lang="fr">Corriger un bug</tspan>
878
+ <tspan data-lang="en">Fix a bug</tspan>
879
+ </text>
880
+ <text x="840" y="240" text-anchor="middle" fill="#94a3b8" font-size="9">
881
+ <tspan data-lang="fr">investigation + correction</tspan>
882
+ <tspan data-lang="en">investigation + fix</tspan>
883
+ </text>
884
+
885
+ <!-- /debug -->
886
+ <line x1="840" y1="250" x2="840" y2="270" stroke="#ef4444" stroke-width="2"/>
887
+ <polygon points="840,270 834,262 846,262" fill="#ef4444"/>
888
+ <g class="cmd-copyable" data-cmd="/debug" style="cursor:pointer;">
889
+ <rect x="750" y="275" width="180" height="32" rx="6" fill="#0f172a" stroke="#ef4444" stroke-width="2"/>
890
+ <text x="840" y="296" text-anchor="middle" fill="#ef4444" font-size="10" font-family="monospace">/debug</text>
891
+ </g>
892
+
893
+ <!-- /review-code -->
894
+ <line x1="840" y1="307" x2="840" y2="322" stroke="#ef4444" stroke-width="2"/>
895
+ <polygon points="840,322 834,314 846,314" fill="#ef4444"/>
896
+ <g class="cmd-copyable" data-cmd="/review-code" style="cursor:pointer;">
897
+ <rect x="750" y="327" width="180" height="32" rx="6" fill="#0f172a" stroke="#ef4444" stroke-width="2"/>
898
+ <text x="840" y="348" text-anchor="middle" fill="#ef4444" font-size="10" font-family="monospace">/review-code</text>
899
+ </g>
900
+
901
+ <!-- Result -->
902
+ <line x1="840" y1="359" x2="840" y2="374" stroke="#ef4444" stroke-width="2"/>
903
+ <polygon points="840,374 834,366 846,366" fill="#ef4444"/>
904
+ <rect x="750" y="379" width="180" height="40" rx="8" fill="#ef4444" fill-opacity="0.2" stroke="#ef4444" stroke-width="2.5"/>
905
+ <text x="840" y="404" text-anchor="middle" fill="#ef4444" font-size="10" font-weight="600">
906
+ <tspan data-lang="fr">&#10003; Bug corrige</tspan>
907
+ <tspan data-lang="en">&#10003; Bug fixed</tspan>
908
+ </text>
909
+
910
+ <!-- ===== PATH 5: PUBLIER (yellow) ===== -->
911
+ <line x1="840" y1="115" x2="1080" y2="115" stroke="#eab308" stroke-width="2.5"/>
912
+ <line x1="1080" y1="115" x2="1080" y2="195" stroke="#eab308" stroke-width="2.5"/>
913
+ <polygon points="1080,195 1074,183 1086,183" fill="#eab308"/>
914
+
915
+ <rect x="990" y="200" width="180" height="50" rx="8" fill="#eab308" fill-opacity="0.15" stroke="#eab308" stroke-width="2.5"/>
916
+ <text x="1080" y="222" text-anchor="middle" fill="#eab308" font-size="12" font-weight="600">
917
+ <tspan data-lang="fr">Publier une version</tspan>
918
+ <tspan data-lang="en">Publish a release</tspan>
919
+ </text>
920
+ <text x="1080" y="240" text-anchor="middle" fill="#94a3b8" font-size="9">
921
+ <tspan data-lang="fr">release + tag + npm</tspan>
922
+ <tspan data-lang="en">release + tag + npm</tspan>
923
+ </text>
924
+
925
+ <!-- /gitflow -r -->
926
+ <line x1="1080" y1="250" x2="1080" y2="270" stroke="#eab308" stroke-width="2"/>
927
+ <polygon points="1080,270 1074,262 1086,262" fill="#eab308"/>
928
+ <g class="cmd-copyable" data-cmd="/gitflow -r" style="cursor:pointer;">
929
+ <rect x="990" y="275" width="180" height="32" rx="6" fill="#0f172a" stroke="#eab308" stroke-width="2"/>
930
+ <text x="1080" y="296" text-anchor="middle" fill="#eab308" font-size="10" font-family="monospace">/gitflow -r</text>
931
+ </g>
932
+
933
+ <!-- /gitflow finish -->
934
+ <line x1="1080" y1="307" x2="1080" y2="322" stroke="#eab308" stroke-width="2"/>
935
+ <polygon points="1080,322 1074,314 1086,314" fill="#eab308"/>
936
+ <g class="cmd-copyable" data-cmd="/gitflow finish" style="cursor:pointer;">
937
+ <rect x="990" y="327" width="180" height="32" rx="6" fill="#0f172a" stroke="#eab308" stroke-width="2"/>
938
+ <text x="1080" y="348" text-anchor="middle" fill="#eab308" font-size="10" font-family="monospace">/gitflow finish</text>
939
+ </g>
940
+
941
+ <!-- Result -->
942
+ <line x1="1080" y1="359" x2="1080" y2="374" stroke="#eab308" stroke-width="2"/>
943
+ <polygon points="1080,374 1074,366 1086,366" fill="#eab308"/>
944
+ <rect x="990" y="379" width="180" height="40" rx="8" fill="#eab308" fill-opacity="0.2" stroke="#eab308" stroke-width="2.5"/>
945
+ <text x="1080" y="396" text-anchor="middle" fill="#eab308" font-size="10" font-weight="600">
946
+ <tspan data-lang="fr">&#10003; Tag + pipeline</tspan>
947
+ <tspan data-lang="en">&#10003; Tag + pipeline</tspan>
948
+ </text>
949
+ <text x="1080" y="410" text-anchor="middle" fill="#94a3b8" font-size="8">
950
+ <tspan data-lang="fr">publication npm automatique</tspan>
951
+ <tspan data-lang="en">automatic npm publish</tspan>
952
+ </text>
953
+
954
+ <!-- ===== BOTTOM: Common workflow reminder ===== -->
955
+ <rect x="30" y="620" width="1140" height="44" rx="8" fill="#334155" fill-opacity="0.5" stroke="#475569" stroke-width="1"/>
956
+ <text x="600" y="640" text-anchor="middle" fill="#94a3b8" font-size="11">
957
+ <tspan data-lang="fr">&#128260; Toujours dans une branche GitFlow : <tspan fill="#8b5cf6" font-family="monospace">/gitflow start feature {nom}</tspan> &rarr; coder &rarr; <tspan fill="#8b5cf6" font-family="monospace">/gitflow commit</tspan> &rarr; <tspan fill="#8b5cf6" font-family="monospace">/gitflow pr</tspan></tspan>
958
+ <tspan data-lang="en">&#128260; Always in a GitFlow branch: <tspan fill="#8b5cf6" font-family="monospace">/gitflow start feature {name}</tspan> &rarr; code &rarr; <tspan fill="#8b5cf6" font-family="monospace">/gitflow commit</tspan> &rarr; <tspan fill="#8b5cf6" font-family="monospace">/gitflow pr</tspan></tspan>
959
+ </text>
960
+ <text x="600" y="656" text-anchor="middle" fill="#64748b" font-size="9">
961
+ <tspan data-lang="fr">Voir <tspan text-decoration="underline">GitFlow</tspan> pour le detail complet du workflow de branches</tspan>
962
+ <tspan data-lang="en">See <tspan text-decoration="underline">GitFlow</tspan> for the complete branch workflow</tspan>
963
+ </text>
757
964
  </svg>
758
965
  </div>
759
-
760
- <p data-lang="fr">
761
- Vous pouvez realiser chaque etape manuellement, ou generer un module complet (entite + service + controller + page) avec <strong><code>/application</code></strong>.
762
- </p>
763
- <p data-lang="en">
764
- You can perform each step manually, or generate a complete module (entity + service + controller + page) with <strong><code>/application</code></strong>.
765
- </p>
766
-
767
- <div class="alert alert-info">
768
- <span class="alert-icon">&#128279;</span>
769
- <div class="alert-content">
770
- <h5 data-lang="fr">Pages liees</h5>
771
- <h5 data-lang="en">Related pages</h5>
772
- <p data-lang="fr">
773
- <a href="efcore.html">EF Core</a> &mdash; workflow complet des migrations (conflits, rebase, squash) &bull;
774
- <a href="gitflow.html">GitFlow</a> &mdash; gestion des branches et versioning
775
- </p>
776
- <p data-lang="en">
777
- <a href="efcore.html">EF Core</a> &mdash; complete migration workflow (conflicts, rebase, squash) &bull;
778
- <a href="gitflow.html">GitFlow</a> &mdash; branch management and versioning
779
- </p>
780
- </div>
781
- </div>
782
966
  </section>
783
967
 
784
968
  <!-- ============================================