@atlashub/smartstack-cli 4.29.0 → 4.31.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 (58) hide show
  1. package/.documentation/business-analyse.html +217 -0
  2. package/dist/index.js +17 -4
  3. package/dist/index.js.map +1 -1
  4. package/package.json +1 -1
  5. package/templates/skills/apex/references/code-generation.md +1 -1
  6. package/templates/skills/apex/references/person-extension-pattern.md +23 -2
  7. package/templates/skills/apex/references/post-checks.md +52 -0
  8. package/templates/skills/apex/references/smartstack-api.md +111 -0
  9. package/templates/skills/apex/references/smartstack-frontend.md +25 -2
  10. package/templates/skills/apex/references/smartstack-layers.md +1 -0
  11. package/templates/skills/apex/steps/step-03-execute.md +110 -7
  12. package/templates/skills/application/templates-frontend.md +1 -1
  13. package/templates/skills/ba-generate-html/SKILL.md +1 -1
  14. package/templates/skills/ba-generate-html/html/ba-interactive.html +234 -262
  15. package/templates/skills/ba-generate-html/html/src/partials/cadrage-context.html +9 -9
  16. package/templates/skills/ba-generate-html/html/src/partials/cadrage-scope.html +17 -39
  17. package/templates/skills/ba-generate-html/html/src/partials/cadrage-stakeholders.html +7 -7
  18. package/templates/skills/ba-generate-html/html/src/partials/cadrage-success.html +13 -13
  19. package/templates/skills/ba-generate-html/html/src/partials/consol-datamodel.html +4 -4
  20. package/templates/skills/ba-generate-html/html/src/partials/consol-flows.html +5 -5
  21. package/templates/skills/ba-generate-html/html/src/partials/consol-interactions.html +2 -2
  22. package/templates/skills/ba-generate-html/html/src/partials/consol-permissions.html +4 -4
  23. package/templates/skills/ba-generate-html/html/src/partials/decomp-dependencies.html +11 -11
  24. package/templates/skills/ba-generate-html/html/src/partials/decomp-modules.html +8 -16
  25. package/templates/skills/ba-generate-html/html/src/partials/handoff-summary.html +5 -5
  26. package/templates/skills/ba-generate-html/html/src/scripts/01-data-init.js +29 -21
  27. package/templates/skills/ba-generate-html/html/src/scripts/02-navigation.js +10 -10
  28. package/templates/skills/ba-generate-html/html/src/scripts/03-render-cadrage.js +5 -4
  29. package/templates/skills/ba-generate-html/html/src/scripts/04-render-modules.js +4 -6
  30. package/templates/skills/ba-generate-html/html/src/scripts/05-render-specs.js +57 -57
  31. package/templates/skills/ba-generate-html/html/src/scripts/06-render-consolidation.js +4 -4
  32. package/templates/skills/ba-generate-html/html/src/scripts/06-render-mockups.js +5 -5
  33. package/templates/skills/ba-generate-html/html/src/scripts/07-render-handoff.js +9 -12
  34. package/templates/skills/ba-generate-html/html/src/scripts/08-editing.js +3 -3
  35. package/templates/skills/ba-generate-html/html/src/scripts/09-export.js +2 -2
  36. package/templates/skills/ba-generate-html/html/src/scripts/10-comments.js +3 -3
  37. package/templates/skills/ba-generate-html/html/src/scripts/11-review-panel.js +8 -8
  38. package/templates/skills/ba-generate-html/html/src/styles/03-navigation.css +1 -1
  39. package/templates/skills/ba-generate-html/html/src/styles/04-cards.css +2 -4
  40. package/templates/skills/ba-generate-html/html/src/template.html +93 -123
  41. package/templates/skills/ba-generate-html/references/data-build.md +4 -9
  42. package/templates/skills/ba-generate-html/references/data-mapping.md +2 -7
  43. package/templates/skills/ba-generate-html/references/output-modes.md +1 -1
  44. package/templates/skills/ba-generate-html/steps/step-02-build-data.md +8 -7
  45. package/templates/skills/ba-generate-html/steps/step-04-verify.md +2 -2
  46. package/templates/skills/ba-review/references/review-data-mapping.md +4 -6
  47. package/templates/skills/ba-review/steps/step-01-apply.md +2 -4
  48. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +4 -4
  49. package/templates/skills/business-analyse/questionnaire.md +1 -1
  50. package/templates/skills/business-analyse/react/schema.md +2 -7
  51. package/templates/skills/business-analyse/schemas/application-schema.json +2 -9
  52. package/templates/skills/business-analyse/schemas/project-schema.json +4 -8
  53. package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +1 -3
  54. package/templates/skills/business-analyse/steps/step-01-cadrage.md +5 -12
  55. package/templates/skills/business-analyse/steps/step-02-structure.md +3 -5
  56. package/templates/skills/dev-start/SKILL.md +242 -0
  57. package/templates/skills/ui-components/SKILL.md +1 -1
  58. package/templates/skills/ui-components/patterns/data-table.md +1 -1
@@ -1,15 +1,15 @@
1
1
  <!-- SECTION: Contexte (merged: problem + current + vision) -->
2
2
  <div class="section" id="cadrage-context">
3
3
  <h2 class="section-title">Contexte du projet</h2>
4
- <p class="section-subtitle">Vue synthetique du besoin : probleme, situation actuelle et objectif vise.</p>
4
+ <p class="section-subtitle">Vue synthétique du besoin : problème, situation actuelle et objectif visé.</p>
5
5
 
6
6
  <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.5rem;">
7
7
  <div class="card" style="border-left:3px solid #f87171;">
8
- <div class="card-label" style="color:#f87171;">Probleme identifie</div>
9
- <div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel probleme ce projet doit-il resoudre ?"></div>
8
+ <div class="card-label" style="color:#f87171;">Problème identifié</div>
9
+ <div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel problème ce projet doit-il résoudre ?"></div>
10
10
  <div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
11
- <strong>Declencheur :</strong>
12
- <div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="Evenement declencheur" style="display:inline;"></div>
11
+ <strong>Déclencheur :</strong>
12
+ <div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="Événement déclencheur" style="display:inline;"></div>
13
13
  </div>
14
14
  </div>
15
15
 
@@ -18,16 +18,16 @@
18
18
  <div class="editable" contenteditable="true" data-field="context.currentSituation" data-placeholder="Comment les choses fonctionnent actuellement ?"></div>
19
19
  <div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
20
20
  <strong>Points douleur :</strong>
21
- <div class="editable" contenteditable="true" data-field="context.painPoints" data-placeholder="Problemes recurrents" style="display:inline;"></div>
21
+ <div class="editable" contenteditable="true" data-field="context.painPoints" data-placeholder="Problèmes récurrents" style="display:inline;"></div>
22
22
  </div>
23
23
  </div>
24
24
 
25
25
  <div class="card" style="border-left:3px solid #4ade80;">
26
26
  <div class="card-label" style="color:#4ade80;">Objectif</div>
27
- <div class="editable" contenteditable="true" data-field="context.desiredSituation" data-placeholder="Que doit permettre le systeme cible ?"></div>
27
+ <div class="editable" contenteditable="true" data-field="context.desiredSituation" data-placeholder="Que doit permettre le système cible ?"></div>
28
28
  <div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
29
- <strong>Criteres :</strong>
30
- <div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="Criteres de succes" style="display:inline;"></div>
29
+ <strong>Critères :</strong>
30
+ <div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="Critères de succès" style="display:inline;"></div>
31
31
  </div>
32
32
  </div>
33
33
  </div>
@@ -1,49 +1,27 @@
1
- <!-- SECTION: Perimetre fonctionnel -->
1
+ <!-- SECTION: Périmètre fonctionnel -->
2
2
  <div class="section" id="cadrage-scope" style="display:none;">
3
- <h2 class="section-title">Perimetre fonctionnel</h2>
4
- <p class="section-subtitle">Ce que le systeme doit faire et ne pas faire, par ordre de priorite.</p>
3
+ <h2 class="section-title">Périmètre fonctionnel</h2>
4
+ <p class="section-subtitle">Ce que le système doit faire et ne pas faire.</p>
5
5
 
6
6
  <h3 style="color: var(--text-bright); font-size: 1rem; margin-bottom: 0.75rem;">
7
- <span style="color: #f87171;">&#9632;</span> Fonctionnalites indispensables
7
+ <span style="color: #60a5fa;">&#9632;</span> Dans le périmètre
8
8
  </h3>
9
- <div id="scopeVital" class="uc-list"></div>
10
- <button class="add-btn" onclick="toggleForm('addScopeForm-vital')">+ Ajouter une fonctionnalite indispensable</button>
11
- <div class="inline-form" id="addScopeForm-vital">
12
- <div class="form-group"><label class="form-label">Nom de la fonctionnalite</label><input type="text" class="form-input" id="scope-name-vital" placeholder="Ex: Gestion des commandes"></div>
13
- <div class="form-group"><label class="form-label">Description (optionnel)</label><input type="text" class="form-input" id="scope-desc-vital" placeholder="Courte description"></div>
14
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-vital')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('vital')">Ajouter</button></div>
9
+ <div id="scopeInScope" class="uc-list"></div>
10
+ <button class="add-btn" onclick="toggleForm('addScopeForm-inscope')">+ Ajouter une fonctionnalité</button>
11
+ <div class="inline-form" id="addScopeForm-inscope">
12
+ <div class="form-group"><label class="form-label">Nom de la fonctionnalité</label><input type="text" class="form-input" id="scope-name-inscope" placeholder="Ex: Gestion des commandes"></div>
13
+ <div class="form-group"><label class="form-label">Description (optionnel)</label><input type="text" class="form-input" id="scope-desc-inscope" placeholder="Courte description"></div>
14
+ <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-inscope')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('inscope')">Ajouter</button></div>
15
15
  </div>
16
16
 
17
17
  <h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
18
- <span style="color: #facc15;">&#9632;</span> Fonctionnalites importantes
18
+ <span style="color: #94a3b8;">&#9632;</span> Hors périmètre
19
19
  </h3>
20
- <div id="scopeImportant" class="uc-list"></div>
21
- <button class="add-btn" onclick="toggleForm('addScopeForm-important')">+ Ajouter une fonctionnalite importante</button>
22
- <div class="inline-form" id="addScopeForm-important">
23
- <div class="form-group"><label class="form-label">Nom de la fonctionnalite</label><input type="text" class="form-input" id="scope-name-important" placeholder="Ex: Export PDF"></div>
24
- <div class="form-group"><label class="form-label">Description (optionnel)</label><input type="text" class="form-input" id="scope-desc-important" placeholder="Courte description"></div>
25
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-important')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('important')">Ajouter</button></div>
26
- </div>
27
-
28
- <h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
29
- <span style="color: #4ade80;">&#9632;</span> Fonctionnalites optionnelles
30
- </h3>
31
- <div id="scopeOptional" class="uc-list"></div>
32
- <button class="add-btn" onclick="toggleForm('addScopeForm-optional')">+ Ajouter une fonctionnalite optionnelle</button>
33
- <div class="inline-form" id="addScopeForm-optional">
34
- <div class="form-group"><label class="form-label">Nom de la fonctionnalite</label><input type="text" class="form-input" id="scope-name-optional" placeholder="Ex: Calendrier partage"></div>
35
- <div class="form-group"><label class="form-label">Description (optionnel)</label><input type="text" class="form-input" id="scope-desc-optional" placeholder="Courte description"></div>
36
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-optional')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('optional')">Ajouter</button></div>
37
- </div>
38
-
39
- <h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
40
- <span style="color: #94a3b8;">&#9632;</span> Hors perimetre
41
- </h3>
42
- <div id="scopeExcluded" class="uc-list"></div>
43
- <button class="add-btn" onclick="toggleForm('addScopeForm-excluded')">+ Ajouter une exclusion</button>
44
- <div class="inline-form" id="addScopeForm-excluded">
45
- <div class="form-group"><label class="form-label">Element hors perimetre</label><input type="text" class="form-input" id="scope-name-excluded" placeholder="Ex: Gestion de la paie"></div>
46
- <div class="form-group"><label class="form-label">Raison (optionnel)</label><input type="text" class="form-input" id="scope-desc-excluded" placeholder="Pourquoi hors perimetre"></div>
47
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-excluded')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('excluded')">Ajouter</button></div>
20
+ <div id="scopeOutOfScope" class="uc-list"></div>
21
+ <button class="add-btn" onclick="toggleForm('addScopeForm-outofscope')">+ Ajouter une exclusion</button>
22
+ <div class="inline-form" id="addScopeForm-outofscope">
23
+ <div class="form-group"><label class="form-label">Élément hors périmètre</label><input type="text" class="form-input" id="scope-name-outofscope" placeholder="Ex: Gestion de la paie"></div>
24
+ <div class="form-group"><label class="form-label">Raison (optionnel)</label><input type="text" class="form-input" id="scope-desc-outofscope" placeholder="Pourquoi hors périmètre"></div>
25
+ <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-outofscope')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('outofscope')">Ajouter</button></div>
48
26
  </div>
49
27
  </div>
@@ -1,7 +1,7 @@
1
1
  <!-- SECTION: Parties prenantes -->
2
2
  <div class="section" id="cadrage-stakeholders" style="display:none;">
3
3
  <h2 class="section-title">Parties prenantes</h2>
4
- <p class="section-subtitle">Toutes les personnes concernees par ce projet et leurs besoins.</p>
4
+ <p class="section-subtitle">Toutes les personnes concernées par ce projet et leurs besoins.</p>
5
5
 
6
6
  <div class="stakeholder-grid" id="stakeholderGrid">
7
7
  <!-- Populated dynamically -->
@@ -20,12 +20,12 @@
20
20
  <input type="text" class="form-input" id="sh-function" placeholder="Ce qu'il fait dans l'organisation">
21
21
  </div>
22
22
  <div class="form-group">
23
- <label class="form-label">Taches principales (une par ligne)</label>
24
- <textarea class="form-textarea" id="sh-tasks" placeholder="Tache 1&#10;Tache 2&#10;Tache 3"></textarea>
23
+ <label class="form-label">Tâches principales (une par ligne)</label>
24
+ <textarea class="form-textarea" id="sh-tasks" placeholder="Tâche 1&#10;Tâche 2&#10;Tâche 3"></textarea>
25
25
  </div>
26
26
  <div class="form-row">
27
27
  <div class="form-group">
28
- <label class="form-label">Frequence d'utilisation</label>
28
+ <label class="form-label">Fréquence d'utilisation</label>
29
29
  <select class="form-select" id="sh-frequency">
30
30
  <option value="daily">Quotidienne</option>
31
31
  <option value="weekly">Hebdomadaire</option>
@@ -34,9 +34,9 @@
34
34
  </select>
35
35
  </div>
36
36
  <div class="form-group">
37
- <label class="form-label">Niveau d'acces</label>
37
+ <label class="form-label">Niveau d'accès</label>
38
38
  <select class="form-select" id="sh-access">
39
- <option value="admin">Administration complete</option>
39
+ <option value="admin">Administration complète</option>
40
40
  <option value="manager">Supervision et validation</option>
41
41
  <option value="contributor">Saisie et modification</option>
42
42
  <option value="viewer">Consultation seule</option>
@@ -45,7 +45,7 @@
45
45
  </div>
46
46
  <div class="form-group">
47
47
  <label class="form-label">Frustrations actuelles</label>
48
- <textarea class="form-textarea" id="sh-frustrations" placeholder="Quelles sont les 2-3 plus grandes frustrations de ce profil avec la facon de travailler actuelle ?"></textarea>
48
+ <textarea class="form-textarea" id="sh-frustrations" placeholder="Quelles sont les 2-3 plus grandes frustrations de ce profil avec la façon de travailler actuelle ?"></textarea>
49
49
  </div>
50
50
  <div class="form-actions">
51
51
  <button class="btn" onclick="toggleForm('addStakeholderForm')">Annuler</button>
@@ -1,34 +1,34 @@
1
- <!-- SECTION: Criteres de reussite -->
1
+ <!-- SECTION: Critères de réussite -->
2
2
  <div class="section" id="cadrage-success" style="display:none;">
3
- <h2 class="section-title">Criteres de reussite</h2>
4
- <p class="section-subtitle">Comment mesurer objectivement que le projet est un succes.</p>
3
+ <h2 class="section-title">Critères de réussite</h2>
4
+ <p class="section-subtitle">Comment mesurer objectivement que le projet est un succès.</p>
5
5
 
6
6
  <div class="card">
7
- <div class="card-label">Definition du succes</div>
8
- <div class="editable" contenteditable="true" data-field="success.definition" data-placeholder="Comment saurez-vous que le projet est un succes ? Quel changement concret observerez-vous ?"></div>
7
+ <div class="card-label">Définition du succès</div>
8
+ <div class="editable" contenteditable="true" data-field="success.definition" data-placeholder="Comment saurez-vous que le projet est un succès ? Quel changement concret observerez-vous ?"></div>
9
9
  </div>
10
10
 
11
11
  <div class="card" data-vibe-hide>
12
12
  <div class="card-label">Objectifs mesurables</div>
13
- <div class="editable" contenteditable="true" data-field="success.metrics" data-placeholder="Quels chiffres presenteriez-vous a votre direction pour prouver le succes ? (temps, erreurs, satisfaction...)"></div>
13
+ <div class="editable" contenteditable="true" data-field="success.metrics" data-placeholder="Quels chiffres présenteriez-vous à votre direction pour prouver le succès ? (temps, erreurs, satisfaction...)"></div>
14
14
  </div>
15
15
 
16
16
  <div class="card" data-vibe-hide>
17
- <div class="card-label">Delai d'evaluation</div>
18
- <div class="editable" contenteditable="true" data-field="success.timeline" data-placeholder="Au bout de combien de temps pourrez-vous juger si ca fonctionne ? 1 semaine ? 1 mois ? 3 mois ?"></div>
17
+ <div class="card-label">Délai d'évaluation</div>
18
+ <div class="editable" contenteditable="true" data-field="success.timeline" data-placeholder="Au bout de combien de temps pourrez-vous juger si ça fonctionne ? 1 semaine ? 1 mois ? 3 mois ?"></div>
19
19
  </div>
20
20
 
21
21
  <div class="card" data-vibe-hide>
22
22
  <div class="card-label">Conditions minimales de mise en service</div>
23
- <div class="editable" contenteditable="true" data-field="success.minimumConditions" data-placeholder="Quelles conditions minimales pour mettre le systeme en service ? (fonctionnalites presentes, donnees migrees, formation faite...)"></div>
23
+ <div class="editable" contenteditable="true" data-field="success.minimumConditions" data-placeholder="Quelles conditions minimales pour mettre le système en service ? (fonctionnalités présentes, données migrées, formation faite...)"></div>
24
24
  </div>
25
25
 
26
- <h3 style="color: var(--text-bright); font-size: 1rem; margin: 2rem 0 0.75rem;">Criteres d'acceptation</h3>
27
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Criteres concrets et mesurables pour valider le succes du projet.</p>
26
+ <h3 style="color: var(--text-bright); font-size: 1rem; margin: 2rem 0 0.75rem;">Critères d'acceptation</h3>
27
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Critères concrets et mesurables pour valider le succès du projet.</p>
28
28
  <div id="criteriaList" class="uc-list"></div>
29
- <button class="add-btn" onclick="toggleForm('addCriterionForm')">+ Ajouter un critere d'acceptation</button>
29
+ <button class="add-btn" onclick="toggleForm('addCriterionForm')">+ Ajouter un critère d'acceptation</button>
30
30
  <div class="inline-form" id="addCriterionForm">
31
- <div class="form-group"><label class="form-label">Critere (mesurable)</label><input type="text" class="form-input" id="criterion-text" placeholder="Ex: 80% des employes saisissent leurs heures chaque semaine"></div>
31
+ <div class="form-group"><label class="form-label">Critère (mesurable)</label><input type="text" class="form-input" id="criterion-text" placeholder="Ex: 80% des employés saisissent leurs heures chaque semaine"></div>
32
32
  <div class="form-actions"><button class="btn" onclick="toggleForm('addCriterionForm')">Annuler</button><button class="btn btn-primary" onclick="addCriterion()">Ajouter</button></div>
33
33
  </div>
34
34
  </div>
@@ -1,8 +1,8 @@
1
- <!-- SECTION: Modele de donnees -->
1
+ <!-- SECTION: Modèle de données -->
2
2
  <div class="section" id="consol-datamodel" style="display:none;">
3
- <h2 class="section-title">Modele de donnees</h2>
4
- <p class="section-subtitle">Vue d'ensemble de toutes les entites metier, leurs attributs et leurs relations entre domaines.</p>
3
+ <h2 class="section-title">Modèle de données</h2>
4
+ <p class="section-subtitle">Vue d'ensemble de toutes les entités métier, leurs attributs et leurs relations entre domaines.</p>
5
5
  <div id="dataModelContainer">
6
- <p style="color:var(--text-muted);text-align:center;padding:2rem;">Le modele de donnees sera genere a partir des specifications de chaque domaine.</p>
6
+ <p style="color:var(--text-muted);text-align:center;padding:2rem;">Le modèle de données sera généré à partir des spécifications de chaque domaine.</p>
7
7
  </div>
8
8
  </div>
@@ -1,7 +1,7 @@
1
1
  <!-- SECTION: Parcours bout en bout -->
2
2
  <div class="section" id="consol-flows" style="display:none;">
3
3
  <h2 class="section-title">Parcours bout en bout</h2>
4
- <p class="section-subtitle">Les processus metier qui traversent plusieurs domaines, de bout en bout.</p>
4
+ <p class="section-subtitle">Les processus métier qui traversent plusieurs domaines, de bout en bout.</p>
5
5
 
6
6
  <div id="e2eFlowsList"></div>
7
7
 
@@ -10,16 +10,16 @@
10
10
  <div class="inline-form" id="addFlowForm">
11
11
  <div class="inline-form-title">Nouveau parcours bout en bout</div>
12
12
  <div class="form-group">
13
- <label class="form-label">Nom du parcours (exemple : De la commande a la facture)</label>
13
+ <label class="form-label">Nom du parcours (exemple : De la commande à la facture)</label>
14
14
  <input type="text" class="form-input" id="flow-name" placeholder="Nom descriptif du parcours">
15
15
  </div>
16
16
  <div class="form-group">
17
- <label class="form-label">Etapes du parcours (une par ligne : Domaine - Action)</label>
18
- <textarea class="form-textarea" id="flow-steps" placeholder="Clients - Le client existe dans le systeme&#10;Commandes - Creer la commande&#10;Commandes - Valider la commande&#10;Factures - Generer la facture"></textarea>
17
+ <label class="form-label">Étapes du parcours (une par ligne : Domaine - Action)</label>
18
+ <textarea class="form-textarea" id="flow-steps" placeholder="Clients - Le client existe dans le système&#10;Commandes - Créer la commande&#10;Commandes - Valider la commande&#10;Factures - Générer la facture"></textarea>
19
19
  </div>
20
20
  <div class="form-group">
21
21
  <label class="form-label">Qui intervient dans ce parcours ?</label>
22
- <input type="text" class="form-input" id="flow-actors" placeholder="Exemple : Contributeur (creation), Responsable (validation)">
22
+ <input type="text" class="form-input" id="flow-actors" placeholder="Exemple : Contributeur (création), Responsable (validation)">
23
23
  </div>
24
24
  <div class="form-actions">
25
25
  <button class="btn" onclick="toggleForm('addFlowForm')">Annuler</button>
@@ -1,8 +1,8 @@
1
1
  <!-- SECTION: Interactions cross-module -->
2
2
  <div class="section" id="consol-interactions" style="display:none;">
3
3
  <h2 class="section-title">Interactions entre domaines</h2>
4
- <p class="section-subtitle">Vue d'ensemble de la facon dont les domaines communiquent et partagent des donnees.</p>
4
+ <p class="section-subtitle">Vue d'ensemble de la façon dont les domaines communiquent et partagent des données.</p>
5
5
  <div id="consolInteractions">
6
- <p style="color:var(--text-muted);text-align:center;padding:2rem;">Les interactions seront calculees automatiquement a partir des dependances et des donnees partagees entre domaines.</p>
6
+ <p style="color:var(--text-muted);text-align:center;padding:2rem;">Les interactions seront calculées automatiquement à partir des dépendances et des données partagées entre domaines.</p>
7
7
  </div>
8
8
  </div>
@@ -1,8 +1,8 @@
1
- <!-- SECTION: Coherence des acces -->
1
+ <!-- SECTION: Cohérence des accès -->
2
2
  <div class="section" id="consol-permissions" style="display:none;">
3
- <h2 class="section-title">Coherence des droits d'acces</h2>
4
- <p class="section-subtitle">Verification que les profils utilisateurs ont des droits coherents dans tous les domaines.</p>
3
+ <h2 class="section-title">Cohérence des droits d'accès</h2>
4
+ <p class="section-subtitle">Vérification que les profils utilisateurs ont des droits cohérents dans tous les domaines.</p>
5
5
  <div id="consolPermissions">
6
- <p style="color:var(--text-muted);text-align:center;padding:2rem;">La coherence sera verifiee quand les permissions de chaque domaine seront definies.</p>
6
+ <p style="color:var(--text-muted);text-align:center;padding:2rem;">La cohérence sera vérifiée quand les permissions de chaque domaine seront définies.</p>
7
7
  </div>
8
8
  </div>
@@ -1,38 +1,38 @@
1
- <!-- SECTION: Dependances -->
1
+ <!-- SECTION: Dépendances -->
2
2
  <div class="section" id="decomp-dependencies" style="display:none;">
3
- <h2 class="section-title">Dependances entre domaines</h2>
4
- <p class="section-subtitle">Indiquez quels domaines dependent d'autres domaines. Par exemple, les Commandes dependent des Clients et des Produits.</p>
3
+ <h2 class="section-title">Dépendances entre domaines</h2>
4
+ <p class="section-subtitle">Indiquez quels domaines dépendent d'autres domaines. Par exemple, les Commandes dépendent des Clients et des Produits.</p>
5
5
 
6
6
  <div id="depGraphContainer">
7
7
  <div class="dep-graph" id="depGraph">
8
- <p style="color:var(--text-muted);text-align:center;padding:2rem;">Ajoutez des domaines fonctionnels pour visualiser les dependances.</p>
8
+ <p style="color:var(--text-muted);text-align:center;padding:2rem;">Ajoutez des domaines fonctionnels pour visualiser les dépendances.</p>
9
9
  </div>
10
10
  </div>
11
11
 
12
12
  <div style="margin-top:1.5rem;">
13
- <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ajouter une dependance</h3>
13
+ <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ajouter une dépendance</h3>
14
14
  <div class="form-row">
15
15
  <div class="form-group">
16
16
  <label class="form-label">Ce domaine...</label>
17
17
  <select class="form-select" id="dep-from"></select>
18
18
  </div>
19
19
  <div class="form-group">
20
- <label class="form-label">...depend de</label>
20
+ <label class="form-label">...dépend de</label>
21
21
  <select class="form-select" id="dep-to"></select>
22
22
  </div>
23
23
  </div>
24
24
  <div class="form-group">
25
- <label class="form-label">Nature de la dependance</label>
26
- <input type="text" class="form-input" id="dep-desc" placeholder="Exemple : La commande reference un client existant">
25
+ <label class="form-label">Nature de la dépendance</label>
26
+ <input type="text" class="form-input" id="dep-desc" placeholder="Exemple : La commande référence un client existant">
27
27
  </div>
28
- <button class="btn btn-primary" onclick="addDependency()" style="margin-top:0.5rem;">Ajouter cette dependance</button>
28
+ <button class="btn btn-primary" onclick="addDependency()" style="margin-top:0.5rem;">Ajouter cette dépendance</button>
29
29
  </div>
30
30
 
31
31
  <div id="depList" style="margin-top:1.5rem;"></div>
32
32
 
33
33
  <div style="margin-top:2rem;">
34
- <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ordre de traitement propose</h3>
35
- <p class="section-subtitle">Les domaines sont traites dans l'ordre de leurs dependances : les fondations d'abord, puis les domaines qui en dependent.</p>
34
+ <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ordre de traitement proposé</h3>
35
+ <p class="section-subtitle">Les domaines sont traités dans l'ordre de leurs dépendances : les fondations d'abord, puis les domaines qui en dépendent.</p>
36
36
  <div id="processingOrder" class="process-flow"></div>
37
37
  </div>
38
38
  </div>
@@ -1,7 +1,7 @@
1
1
  <!-- SECTION: Domaines fonctionnels -->
2
2
  <div class="section" id="decomp-modules" style="display:none;">
3
3
  <h2 class="section-title">Domaines fonctionnels</h2>
4
- <p class="section-subtitle">Identifiez les grands domaines de votre application. Chaque domaine regroupe des fonctionnalites coherentes et independantes.</p>
4
+ <p class="section-subtitle">Identifiez les grands domaines de votre application. Chaque domaine regroupe des fonctionnalités cohérentes et indépendantes.</p>
5
5
 
6
6
  <div class="module-grid" id="moduleGrid">
7
7
  <!-- Populated dynamically -->
@@ -17,31 +17,23 @@
17
17
  </div>
18
18
  <div class="form-group">
19
19
  <label class="form-label">Description en une ou deux phrases</label>
20
- <textarea class="form-textarea" id="mod-desc" placeholder="A quoi sert ce domaine ? Quel probleme resout-il ?"></textarea>
20
+ <textarea class="form-textarea" id="mod-desc" placeholder="A quoi sert ce domaine ? Quel problème résout-il ?"></textarea>
21
21
  </div>
22
22
  <div class="form-row">
23
23
  <div class="form-group">
24
24
  <label class="form-label">Type de domaine</label>
25
25
  <select class="form-select" id="mod-type">
26
- <option value="data-centric">Gestion de donnees (listes, fiches, formulaires)</option>
27
- <option value="workflow">Processus metier (etapes, validations, approbations)</option>
26
+ <option value="data-centric">Gestion de données (listes, fiches, formulaires)</option>
27
+ <option value="workflow">Processus métier (étapes, validations, approbations)</option>
28
28
  <option value="reporting">Tableaux de bord et rapports</option>
29
- <option value="integration">Integration avec des systemes externes</option>
30
- <option value="full-module">Domaine complet (donnees + processus + rapports)</option>
31
- </select>
32
- </div>
33
- <div class="form-group">
34
- <label class="form-label">Priorite</label>
35
- <select class="form-select" id="mod-priority">
36
- <option value="must">Indispensable</option>
37
- <option value="should">Important</option>
38
- <option value="could">Optionnel</option>
29
+ <option value="integration">Intégration avec des systèmes externes</option>
30
+ <option value="full-module">Domaine complet (données + processus + rapports)</option>
39
31
  </select>
40
32
  </div>
41
33
  </div>
42
34
  <div class="form-group">
43
- <label class="form-label">Principales donnees gerees (une par ligne)</label>
44
- <textarea class="form-textarea" id="mod-entities" placeholder="Commande&#10;Ligne de commande&#10;Facture"></textarea>
35
+ <label class="form-label">Principales données gérées (une par ligne)</label>
36
+ <textarea class="form-textarea" id="mod-entities" placeholder="Principales données gérées&#10;Commande&#10;Ligne de commande&#10;Facture"></textarea>
45
37
  </div>
46
38
  <div class="form-actions">
47
39
  <button class="btn" onclick="toggleForm('addModuleForm')">Annuler</button>
@@ -1,6 +1,6 @@
1
1
  <div class="section" id="handoff-summary" style="display:none;">
2
- <h2 class="section-title">Synthese de l'analyse</h2>
3
- <p class="section-subtitle">Vue d'ensemble de toute l'analyse metier, prete pour le developpement.</p>
2
+ <h2 class="section-title">Synthèse de l'analyse</h2>
3
+ <p class="section-subtitle">Vue d'ensemble de toute l'analyse métier, prête pour le développement.</p>
4
4
 
5
5
  <div class="stat-grid" id="handoffStats">
6
6
  <!-- Populated dynamically -->
@@ -17,8 +17,8 @@
17
17
  </div>
18
18
 
19
19
  <div style="margin-top:2rem;padding:1.5rem;background:var(--bg-card);border:1px solid var(--border);border-radius:10px;text-align:center;">
20
- <p style="color:var(--text-bright);font-size:1.1rem;font-weight:600;margin-bottom:0.5rem;">Analyse prete pour l'extraction</p>
21
- <p style="color:var(--text-muted);font-size:0.85rem;margin-bottom:1rem;">Exportez le fichier JSON pour lancer la generation automatique du systeme.</p>
22
- <button class="btn btn-primary" onclick="exportJSON()" style="font-size:0.9rem;padding:0.6rem 1.5rem;">Exporter l'analyse complete en JSON</button>
20
+ <p style="color:var(--text-bright);font-size:1.1rem;font-weight:600;margin-bottom:0.5rem;">Analyse prête pour l'extraction</p>
21
+ <p style="color:var(--text-muted);font-size:0.85rem;margin-bottom:1rem;">Exportez le fichier JSON pour lancer la génération automatique du système.</p>
22
+ <button class="btn btn-primary" onclick="exportJSON()" style="font-size:0.9rem;padding:0.6rem 1.5rem;">Exporter l'analyse complète en JSON</button>
23
23
  </div>
24
24
  </div>
@@ -36,23 +36,27 @@ data.comments = data.comments || [];
36
36
 
37
37
  // Defensive mapping: globalScope (JSON format) -> scope (HTML format)
38
38
  // Handles cases where FEATURE_DATA contains raw globalScope instead of pre-mapped scope
39
- if (!data.cadrage.scope || (!data.cadrage.scope.vital?.length && data.cadrage.globalScope)) {
39
+ if (!data.cadrage.scope || (!data.cadrage.scope.inscope?.length && data.cadrage.globalScope)) {
40
40
  const gs = data.cadrage.globalScope || {};
41
- data.cadrage.scope = {
42
- vital: (gs.mustHave || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
43
- important: (gs.shouldHave || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
44
- optional: (gs.couldHave || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
45
- excluded: (gs.outOfScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s)
46
- };
41
+ // Backward compat: merge old MoSCoW into binary scope
42
+ if (gs.mustHave || gs.shouldHave || gs.couldHave) {
43
+ data.cadrage.scope = {
44
+ inscope: [...(gs.mustHave || []), ...(gs.shouldHave || []), ...(gs.couldHave || [])].map(s => typeof s === 'string' ? { name: s, description: '' } : s),
45
+ outofscope: (gs.outOfScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s)
46
+ };
47
+ } else {
48
+ data.cadrage.scope = {
49
+ inscope: (gs.inScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
50
+ outofscope: (gs.outOfScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s)
51
+ };
52
+ }
47
53
  }
48
- data.cadrage.scope = data.cadrage.scope || { vital: [], important: [], optional: [], excluded: [] };
49
-
50
- // Backward compat: mustHave/shouldHave/couldHave/wontHave vital/important/optional/excluded
51
- if (data.cadrage.scope.mustHave && !data.cadrage.scope.vital?.length) {
52
- data.cadrage.scope.vital = data.cadrage.scope.mustHave;
53
- data.cadrage.scope.important = data.cadrage.scope.shouldHave || data.cadrage.scope.important || [];
54
- data.cadrage.scope.optional = data.cadrage.scope.couldHave || data.cadrage.scope.optional || [];
55
- data.cadrage.scope.excluded = data.cadrage.scope.wontHave || data.cadrage.scope.excluded || [];
54
+ data.cadrage.scope = data.cadrage.scope || { inscope: [], outofscope: [] };
55
+
56
+ // Backward compat: old vital/important/optional/excluded → inscope/outofscope
57
+ if (data.cadrage.scope.vital && !data.cadrage.scope.inscope?.length) {
58
+ data.cadrage.scope.inscope = [...(data.cadrage.scope.vital || []), ...(data.cadrage.scope.important || []), ...(data.cadrage.scope.optional || [])];
59
+ data.cadrage.scope.outofscope = data.cadrage.scope.excluded || data.cadrage.scope.outofscope || [];
56
60
  }
57
61
 
58
62
  // Defensive init: moduleSpecs (may be missing if LLM didn't follow mapping)
@@ -71,6 +75,14 @@ data.moduleSpecs = data.moduleSpecs || {};
71
75
  }
72
76
  });
73
77
 
78
+ // Defensive: normalize stakeholder tasks (string → array)
79
+ (data.cadrage.stakeholders || []).forEach(function(s) {
80
+ if (typeof s.tasks === 'string') {
81
+ s.tasks = s.tasks.split(',').map(t => t.trim()).filter(Boolean);
82
+ }
83
+ s.tasks = s.tasks || [];
84
+ });
85
+
74
86
  // Vibe coding mode: hide non-relevant sections
75
87
  const isVibeCoding = data.metadata?.vibeCoding === true;
76
88
  if (isVibeCoding) {
@@ -123,7 +135,7 @@ function formatAccess(a) {
123
135
  }
124
136
 
125
137
  function formatPriority(p) {
126
- return { vital: 'Indispensable', important: 'Important', optional: 'Optionnel', excluded: 'Hors perimetre' }[p] || p;
138
+ return { inscope: 'Dans le périmètre', outofscope: 'Hors périmètre' }[p] || p;
127
139
  }
128
140
 
129
141
  function formatLevel(l) {
@@ -131,11 +143,7 @@ function formatLevel(l) {
131
143
  }
132
144
 
133
145
  function formatModuleType(t) {
134
- return { 'data-centric': 'Donnees', 'workflow': 'Processus', 'reporting': 'Rapports', 'integration': 'Integration', 'full-module': 'Complet' }[t] || t;
135
- }
136
-
137
- function formatModulePriority(p) {
138
- return { must: 'Indispensable', should: 'Important', could: 'Optionnel' }[p] || p;
146
+ return { 'data-centric': 'Données', 'workflow': 'Processus', 'reporting': 'Rapports', 'integration': 'Intégration', 'full-module': 'Complet' }[t] || t;
139
147
  }
140
148
 
141
149
  /* ============================================
@@ -74,13 +74,13 @@ function buildNavTree() {
74
74
  });
75
75
  html += renderNavGroup('modules-other', 'Autres modules (' + orphanModules.length + ')', orphanItems);
76
76
  }
77
- html += renderNavItem('decomp-dependencies', 'Dependances', data.dependencies.length);
77
+ html += renderNavItem('decomp-dependencies', 'Dépendances', data.dependencies.length);
78
78
  } else {
79
79
  html += renderNavGroup('modules', 'Modules (' + data.modules.length + ')', buildModuleItems());
80
80
  }
81
81
 
82
82
  html += renderNavGroup('consolidation', 'Consolidation', buildConsolidationItems());
83
- html += renderNavGroup('synthese', 'Synthese', buildSyntheseItems());
83
+ html += renderNavGroup('synthese', 'Synthèse', buildSyntheseItems());
84
84
 
85
85
  nav.innerHTML = html;
86
86
  restoreNavState();
@@ -112,8 +112,8 @@ function renderNavItem(sectionId, label, badge) {
112
112
  function buildCadrageItems() {
113
113
  return renderNavItem('cadrage-context', 'Contexte') +
114
114
  renderNavItem('cadrage-stakeholders', 'Parties prenantes', data.cadrage.stakeholders.length) +
115
- renderNavItem('cadrage-scope', 'Perimetre fonctionnel') +
116
- renderNavItem('cadrage-success', 'Criteres de reussite');
115
+ renderNavItem('cadrage-scope', 'Périmètre fonctionnel') +
116
+ renderNavItem('cadrage-success', 'Critères de réussite');
117
117
  }
118
118
 
119
119
  function buildModuleItems() {
@@ -123,7 +123,7 @@ function buildModuleItems() {
123
123
  });
124
124
  // Global module views at bottom
125
125
  html += renderNavItem('decomp-modules', 'Vue d\'ensemble', data.modules.length);
126
- html += renderNavItem('decomp-dependencies', 'Dependances', data.dependencies.length);
126
+ html += renderNavItem('decomp-dependencies', 'Dépendances', data.dependencies.length);
127
127
  return html;
128
128
  }
129
129
 
@@ -131,9 +131,9 @@ function buildConsolidationItems() {
131
131
  var totalEntities = data.modules.reduce(function(sum, m) {
132
132
  return sum + (data.moduleSpecs[m.code]?.entities || []).length;
133
133
  }, 0);
134
- return renderNavItem('consol-datamodel', 'Modele de donnees', totalEntities) +
134
+ return renderNavItem('consol-datamodel', 'Modèle de données', totalEntities) +
135
135
  renderNavItem('consol-interactions', 'Interactions') +
136
- renderNavItem('consol-permissions', 'Coherence des acces') +
136
+ renderNavItem('consol-permissions', 'Cohérence des accès') +
137
137
  renderNavItem('consol-flows', 'Parcours bout en bout', data.consolidation.e2eFlows.length);
138
138
  }
139
139
 
@@ -164,9 +164,9 @@ function renderModuleNavItem(mod) {
164
164
  // Children: tabs
165
165
  html += '<div class="nav-children"' + (collapsed ? ' style="display:none;"' : '') + '>';
166
166
  html += renderModuleTabNavItem(code, 'uc', 'Cas d\'utilisation', ucCount);
167
- html += renderModuleTabNavItem(code, 'br', 'Regles metier', brCount);
168
- html += renderModuleTabNavItem(code, 'ent', 'Donnees', entCount);
169
- html += renderModuleTabNavItem(code, 'perm', 'Droits d\'acces');
167
+ html += renderModuleTabNavItem(code, 'br', 'Règles métier', brCount);
168
+ html += renderModuleTabNavItem(code, 'ent', 'Données', entCount);
169
+ html += renderModuleTabNavItem(code, 'perm', 'Droits d\'accès');
170
170
  html += renderModuleTabNavItem(code, 'mock', 'Maquettes');
171
171
  html += renderModuleTabNavItem(code, 'struct', 'Structure', sections.length);
172
172
 
@@ -47,7 +47,7 @@ function renderStakeholders() {
47
47
  </div>
48
48
  <div class="stakeholder-function">${s.function || ''}</div>
49
49
  <ul class="stakeholder-tasks">
50
- ${(s.tasks || []).map(t => '<li>' + t + '</li>').join('')}
50
+ ${(Array.isArray(s.tasks) ? s.tasks : typeof s.tasks === 'string' ? s.tasks.split(',').map(t => t.trim()).filter(Boolean) : []).map(t => '<li>' + t + '</li>').join('')}
51
51
  </ul>
52
52
  <div class="stakeholder-meta">
53
53
  <span>${formatFrequency(s.frequency)}</span>
@@ -82,9 +82,10 @@ function addScopeItem(priority) {
82
82
  }
83
83
 
84
84
  function renderScope() {
85
- ['vital', 'important', 'optional', 'excluded'].forEach(p => {
86
- const container = document.getElementById('scope' + p.charAt(0).toUpperCase() + p.slice(1));
87
- container.innerHTML = data.cadrage.scope[p].map((item, i) => `
85
+ ['inscope', 'outofscope'].forEach(p => {
86
+ const container = document.getElementById('scope' + (p === 'inscope' ? 'InScope' : 'OutOfScope'));
87
+ if (!container) return;
88
+ container.innerHTML = (data.cadrage.scope[p] || []).map((item, i) => `
88
89
  <div class="uc-item">
89
90
  <div class="uc-header">
90
91
  <span class="priority priority-${p}">${formatPriority(p)}</span>