@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
@@ -3,7 +3,7 @@
3
3
  <head>
4
4
  <meta charset="UTF-8">
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
- <title>{{APPLICATION_NAME}} - Analyse metier</title>
6
+ <title>{{APPLICATION_NAME}} - Analyse métier</title>
7
7
  <style>
8
8
  /* --- 01-variables.css --- */
9
9
  /* ============================================
@@ -171,7 +171,7 @@ body {
171
171
  text-overflow: ellipsis;
172
172
  }
173
173
 
174
- /* Nav groups (top-level: Cadrage, Modules, Consolidation, Synthese) */
174
+ /* Nav groups (top-level: Cadrage, Modules, Consolidation, Synthèse) */
175
175
  .nav-group { padding: 0.4rem 0; }
176
176
  .nav-group + .nav-group { border-top: 1px solid var(--border); }
177
177
 
@@ -356,10 +356,8 @@ body {
356
356
  text-transform: uppercase;
357
357
  letter-spacing: 0.05em;
358
358
  }
359
- .priority-vital { background: rgba(239,68,68,0.15); color: #f87171; border: 1px solid rgba(239,68,68,0.3); }
360
- .priority-important { background: rgba(234,179,8,0.15); color: #facc15; border: 1px solid rgba(234,179,8,0.3); }
361
- .priority-optional { background: rgba(34,197,94,0.15); color: #4ade80; border: 1px solid rgba(34,197,94,0.3); }
362
- .priority-excluded { background: rgba(100,116,139,0.15); color: #94a3b8; border: 1px solid rgba(100,116,139,0.3); }
359
+ .priority-inscope { background: rgba(59,130,246,0.15); color: #60a5fa; border: 1px solid rgba(59,130,246,0.3); }
360
+ .priority-outofscope { background: rgba(100,116,139,0.15); color: #94a3b8; border: 1px solid rgba(100,116,139,0.3); }
363
361
 
364
362
  /* ============================================
365
363
  STATUS BADGES
@@ -1772,15 +1770,15 @@ body {
1772
1770
  ============================================ -->
1773
1771
  <header class="header">
1774
1772
  <div class="header-logo">BA</div>
1775
- <span class="header-title">Analyse metier</span>
1773
+ <span class="header-title">Analyse métier</span>
1776
1774
  <div class="header-sep"></div>
1777
1775
  <span class="header-app-name" id="appName">{{APPLICATION_NAME}}</span>
1778
1776
  <div class="header-spacer"></div>
1779
1777
  <div class="header-actions">
1780
- <button class="btn btn-sm" onclick="resetToEmbedded()" title="Reinitialiser depuis les donnees d'origine (supprime les modifications locales)">Reset</button>
1778
+ <button class="btn btn-sm" onclick="resetToEmbedded()" title="Réinitialiser depuis les données d'origine (supprime les modifications locales)">Reset</button>
1781
1779
  <button class="btn btn-sm" onclick="saveToLocalStorage()" title="Sauvegarder les modifications dans le navigateur">Sauvegarder</button>
1782
- <button class="btn btn-sm btn-review" onclick="saveReviewJSON()" title="Sauvegarder les corrections pour creer une nouvelle version">Sauvegarder corrections</button>
1783
- <button class="btn btn-sm btn-primary" onclick="exportJSON()" title="Exporter les donnees au format JSON pour l'extraction">Exporter JSON</button>
1780
+ <button class="btn btn-sm btn-review" onclick="saveReviewJSON()" title="Sauvegarder les corrections pour créer une nouvelle version">Sauvegarder corrections</button>
1781
+ <button class="btn btn-sm btn-primary" onclick="exportJSON()" title="Exporter les données au format JSON pour l'extraction">Exporter JSON</button>
1784
1782
  <button class="btn btn-sm review-toggle-btn" id="reviewToggleBtn" onclick="toggleReviewPanel()" title="Ouvrir/fermer le panneau de review">
1785
1783
  Review
1786
1784
  <span class="review-badge hidden" id="reviewBadge">0</span>
@@ -1790,7 +1788,7 @@ body {
1790
1788
 
1791
1789
  <div class="body" id="appBody">
1792
1790
  <!-- ============================================
1793
- SIDEBAR - Navigation hierarchique
1791
+ SIDEBAR - Navigation hiérarchique
1794
1792
  ============================================ -->
1795
1793
  <aside class="sidebar">
1796
1794
  <!-- Application Name -->
@@ -1811,15 +1809,15 @@ body {
1811
1809
  <!-- SECTION: Contexte (merged: problem + current + vision) -->
1812
1810
  <div class="section" id="cadrage-context">
1813
1811
  <h2 class="section-title">Contexte du projet</h2>
1814
- <p class="section-subtitle">Vue synthetique du besoin : probleme, situation actuelle et objectif vise.</p>
1812
+ <p class="section-subtitle">Vue synthétique du besoin : problème, situation actuelle et objectif visé.</p>
1815
1813
 
1816
1814
  <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.5rem;">
1817
1815
  <div class="card" style="border-left:3px solid #f87171;">
1818
- <div class="card-label" style="color:#f87171;">Probleme identifie</div>
1819
- <div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel probleme ce projet doit-il resoudre ?"></div>
1816
+ <div class="card-label" style="color:#f87171;">Problème identifié</div>
1817
+ <div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel problème ce projet doit-il résoudre ?"></div>
1820
1818
  <div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
1821
- <strong>Declencheur :</strong>
1822
- <div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="Evenement declencheur" style="display:inline;"></div>
1819
+ <strong>Déclencheur :</strong>
1820
+ <div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="Événement déclencheur" style="display:inline;"></div>
1823
1821
  </div>
1824
1822
  </div>
1825
1823
 
@@ -1834,10 +1832,10 @@ body {
1834
1832
 
1835
1833
  <div class="card" style="border-left:3px solid #4ade80;">
1836
1834
  <div class="card-label" style="color:#4ade80;">Objectif</div>
1837
- <div class="editable" contenteditable="true" data-field="context.desiredSituation" data-placeholder="Que doit permettre le systeme cible ?"></div>
1835
+ <div class="editable" contenteditable="true" data-field="context.desiredSituation" data-placeholder="Que doit permettre le système cible ?"></div>
1838
1836
  <div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
1839
- <strong>Criteres :</strong>
1840
- <div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="Criteres de succes" style="display:inline;"></div>
1837
+ <strong>Critères :</strong>
1838
+ <div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="Critères de succès" style="display:inline;"></div>
1841
1839
  </div>
1842
1840
  </div>
1843
1841
  </div>
@@ -1846,7 +1844,7 @@ body {
1846
1844
  <!-- SECTION: Parties prenantes -->
1847
1845
  <div class="section" id="cadrage-stakeholders" style="display:none;">
1848
1846
  <h2 class="section-title">Parties prenantes</h2>
1849
- <p class="section-subtitle">Toutes les personnes concernees par ce projet et leurs besoins.</p>
1847
+ <p class="section-subtitle">Toutes les personnes concernées par ce projet et leurs besoins.</p>
1850
1848
 
1851
1849
  <div class="stakeholder-grid" id="stakeholderGrid">
1852
1850
  <!-- Populated dynamically -->
@@ -1865,12 +1863,12 @@ body {
1865
1863
  <input type="text" class="form-input" id="sh-function" placeholder="Ce qu'il fait dans l'organisation">
1866
1864
  </div>
1867
1865
  <div class="form-group">
1868
- <label class="form-label">Taches principales (une par ligne)</label>
1869
- <textarea class="form-textarea" id="sh-tasks" placeholder="Tache 1&#10;Tache 2&#10;Tache 3"></textarea>
1866
+ <label class="form-label">Tâches principales (une par ligne)</label>
1867
+ <textarea class="form-textarea" id="sh-tasks" placeholder="Tâche 1&#10;Tâche 2&#10;Tâche 3"></textarea>
1870
1868
  </div>
1871
1869
  <div class="form-row">
1872
1870
  <div class="form-group">
1873
- <label class="form-label">Frequence d'utilisation</label>
1871
+ <label class="form-label">Fréquence d'utilisation</label>
1874
1872
  <select class="form-select" id="sh-frequency">
1875
1873
  <option value="daily">Quotidienne</option>
1876
1874
  <option value="weekly">Hebdomadaire</option>
@@ -1879,9 +1877,9 @@ body {
1879
1877
  </select>
1880
1878
  </div>
1881
1879
  <div class="form-group">
1882
- <label class="form-label">Niveau d'acces</label>
1880
+ <label class="form-label">Niveau d'accès</label>
1883
1881
  <select class="form-select" id="sh-access">
1884
- <option value="admin">Administration complete</option>
1882
+ <option value="admin">Administration complète</option>
1885
1883
  <option value="manager">Supervision et validation</option>
1886
1884
  <option value="contributor">Saisie et modification</option>
1887
1885
  <option value="viewer">Consultation seule</option>
@@ -1890,7 +1888,7 @@ body {
1890
1888
  </div>
1891
1889
  <div class="form-group">
1892
1890
  <label class="form-label">Frustrations actuelles</label>
1893
- <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>
1891
+ <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>
1894
1892
  </div>
1895
1893
  <div class="form-actions">
1896
1894
  <button class="btn" onclick="toggleForm('addStakeholderForm')">Annuler</button>
@@ -1899,87 +1897,65 @@ body {
1899
1897
  </div>
1900
1898
  </div>
1901
1899
 
1902
- <!-- SECTION: Perimetre fonctionnel -->
1900
+ <!-- SECTION: Périmètre fonctionnel -->
1903
1901
  <div class="section" id="cadrage-scope" style="display:none;">
1904
- <h2 class="section-title">Perimetre fonctionnel</h2>
1905
- <p class="section-subtitle">Ce que le systeme doit faire et ne pas faire, par ordre de priorite.</p>
1902
+ <h2 class="section-title">Périmètre fonctionnel</h2>
1903
+ <p class="section-subtitle">Ce que le système doit faire et ne pas faire.</p>
1906
1904
 
1907
1905
  <h3 style="color: var(--text-bright); font-size: 1rem; margin-bottom: 0.75rem;">
1908
- <span style="color: #f87171;">&#9632;</span> Fonctionnalites indispensables
1906
+ <span style="color: #60a5fa;">&#9632;</span> Dans le périmètre
1909
1907
  </h3>
1910
- <div id="scopeVital" class="uc-list"></div>
1911
- <button class="add-btn" onclick="toggleForm('addScopeForm-vital')">+ Ajouter une fonctionnalite indispensable</button>
1912
- <div class="inline-form" id="addScopeForm-vital">
1913
- <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>
1914
- <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>
1915
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-vital')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('vital')">Ajouter</button></div>
1908
+ <div id="scopeInScope" class="uc-list"></div>
1909
+ <button class="add-btn" onclick="toggleForm('addScopeForm-inscope')">+ Ajouter une fonctionnalité</button>
1910
+ <div class="inline-form" id="addScopeForm-inscope">
1911
+ <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>
1912
+ <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>
1913
+ <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-inscope')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('inscope')">Ajouter</button></div>
1916
1914
  </div>
1917
1915
 
1918
1916
  <h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
1919
- <span style="color: #facc15;">&#9632;</span> Fonctionnalites importantes
1917
+ <span style="color: #94a3b8;">&#9632;</span> Hors périmètre
1920
1918
  </h3>
1921
- <div id="scopeImportant" class="uc-list"></div>
1922
- <button class="add-btn" onclick="toggleForm('addScopeForm-important')">+ Ajouter une fonctionnalite importante</button>
1923
- <div class="inline-form" id="addScopeForm-important">
1924
- <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>
1925
- <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>
1926
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-important')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('important')">Ajouter</button></div>
1927
- </div>
1928
-
1929
- <h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
1930
- <span style="color: #4ade80;">&#9632;</span> Fonctionnalites optionnelles
1931
- </h3>
1932
- <div id="scopeOptional" class="uc-list"></div>
1933
- <button class="add-btn" onclick="toggleForm('addScopeForm-optional')">+ Ajouter une fonctionnalite optionnelle</button>
1934
- <div class="inline-form" id="addScopeForm-optional">
1935
- <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>
1936
- <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>
1937
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-optional')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('optional')">Ajouter</button></div>
1938
- </div>
1939
-
1940
- <h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
1941
- <span style="color: #94a3b8;">&#9632;</span> Hors perimetre
1942
- </h3>
1943
- <div id="scopeExcluded" class="uc-list"></div>
1944
- <button class="add-btn" onclick="toggleForm('addScopeForm-excluded')">+ Ajouter une exclusion</button>
1945
- <div class="inline-form" id="addScopeForm-excluded">
1946
- <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>
1947
- <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>
1948
- <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-excluded')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('excluded')">Ajouter</button></div>
1919
+ <div id="scopeOutOfScope" class="uc-list"></div>
1920
+ <button class="add-btn" onclick="toggleForm('addScopeForm-outofscope')">+ Ajouter une exclusion</button>
1921
+ <div class="inline-form" id="addScopeForm-outofscope">
1922
+ <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>
1923
+ <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>
1924
+ <div class="form-actions"><button class="btn" onclick="toggleForm('addScopeForm-outofscope')">Annuler</button><button class="btn btn-primary" onclick="addScopeItem('outofscope')">Ajouter</button></div>
1949
1925
  </div>
1950
1926
  </div>
1951
1927
 
1952
- <!-- SECTION: Criteres de reussite -->
1928
+ <!-- SECTION: Critères de réussite -->
1953
1929
  <div class="section" id="cadrage-success" style="display:none;">
1954
- <h2 class="section-title">Criteres de reussite</h2>
1955
- <p class="section-subtitle">Comment mesurer objectivement que le projet est un succes.</p>
1930
+ <h2 class="section-title">Critères de réussite</h2>
1931
+ <p class="section-subtitle">Comment mesurer objectivement que le projet est un succès.</p>
1956
1932
 
1957
1933
  <div class="card">
1958
- <div class="card-label">Definition du succes</div>
1959
- <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>
1934
+ <div class="card-label">Définition du succès</div>
1935
+ <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>
1960
1936
  </div>
1961
1937
 
1962
1938
  <div class="card" data-vibe-hide>
1963
1939
  <div class="card-label">Objectifs mesurables</div>
1964
- <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>
1940
+ <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>
1965
1941
  </div>
1966
1942
 
1967
1943
  <div class="card" data-vibe-hide>
1968
- <div class="card-label">Delai d'evaluation</div>
1969
- <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>
1944
+ <div class="card-label">Délai d'évaluation</div>
1945
+ <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>
1970
1946
  </div>
1971
1947
 
1972
1948
  <div class="card" data-vibe-hide>
1973
1949
  <div class="card-label">Conditions minimales de mise en service</div>
1974
- <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>
1950
+ <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>
1975
1951
  </div>
1976
1952
 
1977
- <h3 style="color: var(--text-bright); font-size: 1rem; margin: 2rem 0 0.75rem;">Criteres d'acceptation</h3>
1978
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Criteres concrets et mesurables pour valider le succes du projet.</p>
1953
+ <h3 style="color: var(--text-bright); font-size: 1rem; margin: 2rem 0 0.75rem;">Critères d'acceptation</h3>
1954
+ <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>
1979
1955
  <div id="criteriaList" class="uc-list"></div>
1980
- <button class="add-btn" onclick="toggleForm('addCriterionForm')">+ Ajouter un critere d'acceptation</button>
1956
+ <button class="add-btn" onclick="toggleForm('addCriterionForm')">+ Ajouter un critère d'acceptation</button>
1981
1957
  <div class="inline-form" id="addCriterionForm">
1982
- <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>
1958
+ <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>
1983
1959
  <div class="form-actions"><button class="btn" onclick="toggleForm('addCriterionForm')">Annuler</button><button class="btn btn-primary" onclick="addCriterion()">Ajouter</button></div>
1984
1960
  </div>
1985
1961
  </div>
@@ -1991,7 +1967,7 @@ body {
1991
1967
  <!-- SECTION: Domaines fonctionnels -->
1992
1968
  <div class="section" id="decomp-modules" style="display:none;">
1993
1969
  <h2 class="section-title">Domaines fonctionnels</h2>
1994
- <p class="section-subtitle">Identifiez les grands domaines de votre application. Chaque domaine regroupe des fonctionnalites coherentes et independantes.</p>
1970
+ <p class="section-subtitle">Identifiez les grands domaines de votre application. Chaque domaine regroupe des fonctionnalités cohérentes et indépendantes.</p>
1995
1971
 
1996
1972
  <div class="module-grid" id="moduleGrid">
1997
1973
  <!-- Populated dynamically -->
@@ -2007,30 +1983,22 @@ body {
2007
1983
  </div>
2008
1984
  <div class="form-group">
2009
1985
  <label class="form-label">Description en une ou deux phrases</label>
2010
- <textarea class="form-textarea" id="mod-desc" placeholder="A quoi sert ce domaine ? Quel probleme resout-il ?"></textarea>
1986
+ <textarea class="form-textarea" id="mod-desc" placeholder="À quoi sert ce domaine ? Quel problème résout-il ?"></textarea>
2011
1987
  </div>
2012
1988
  <div class="form-row">
2013
1989
  <div class="form-group">
2014
1990
  <label class="form-label">Type de domaine</label>
2015
1991
  <select class="form-select" id="mod-type">
2016
- <option value="data-centric">Gestion de donnees (listes, fiches, formulaires)</option>
2017
- <option value="workflow">Processus metier (etapes, validations, approbations)</option>
1992
+ <option value="data-centric">Gestion de données (listes, fiches, formulaires)</option>
1993
+ <option value="workflow">Processus métier (étapes, validations, approbations)</option>
2018
1994
  <option value="reporting">Tableaux de bord et rapports</option>
2019
- <option value="integration">Integration avec des systemes externes</option>
2020
- <option value="full-module">Domaine complet (donnees + processus + rapports)</option>
2021
- </select>
2022
- </div>
2023
- <div class="form-group">
2024
- <label class="form-label">Priorite</label>
2025
- <select class="form-select" id="mod-priority">
2026
- <option value="must">Indispensable</option>
2027
- <option value="should">Important</option>
2028
- <option value="could">Optionnel</option>
1995
+ <option value="integration">Intégration avec des systèmes externes</option>
1996
+ <option value="full-module">Domaine complet (données + processus + rapports)</option>
2029
1997
  </select>
2030
1998
  </div>
2031
1999
  </div>
2032
2000
  <div class="form-group">
2033
- <label class="form-label">Principales donnees gerees (une par ligne)</label>
2001
+ <label class="form-label">Principales données gérées (une par ligne)</label>
2034
2002
  <textarea class="form-textarea" id="mod-entities" placeholder="Commande&#10;Ligne de commande&#10;Facture"></textarea>
2035
2003
  </div>
2036
2004
  <div class="form-actions">
@@ -2040,41 +2008,41 @@ body {
2040
2008
  </div>
2041
2009
  </div>
2042
2010
 
2043
- <!-- SECTION: Dependances -->
2011
+ <!-- SECTION: Dépendances -->
2044
2012
  <div class="section" id="decomp-dependencies" style="display:none;">
2045
- <h2 class="section-title">Dependances entre domaines</h2>
2046
- <p class="section-subtitle">Indiquez quels domaines dependent d'autres domaines. Par exemple, les Commandes dependent des Clients et des Produits.</p>
2013
+ <h2 class="section-title">Dépendances entre domaines</h2>
2014
+ <p class="section-subtitle">Indiquez quels domaines dépendent d'autres domaines. Par exemple, les Commandes dépendent des Clients et des Produits.</p>
2047
2015
 
2048
2016
  <div id="depGraphContainer">
2049
2017
  <div class="dep-graph" id="depGraph">
2050
- <p style="color:var(--text-muted);text-align:center;padding:2rem;">Ajoutez des domaines fonctionnels pour visualiser les dependances.</p>
2018
+ <p style="color:var(--text-muted);text-align:center;padding:2rem;">Ajoutez des domaines fonctionnels pour visualiser les dépendances.</p>
2051
2019
  </div>
2052
2020
  </div>
2053
2021
 
2054
2022
  <div style="margin-top:1.5rem;">
2055
- <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ajouter une dependance</h3>
2023
+ <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ajouter une dépendance</h3>
2056
2024
  <div class="form-row">
2057
2025
  <div class="form-group">
2058
2026
  <label class="form-label">Ce domaine...</label>
2059
2027
  <select class="form-select" id="dep-from"></select>
2060
2028
  </div>
2061
2029
  <div class="form-group">
2062
- <label class="form-label">...depend de</label>
2030
+ <label class="form-label">...dépend de</label>
2063
2031
  <select class="form-select" id="dep-to"></select>
2064
2032
  </div>
2065
2033
  </div>
2066
2034
  <div class="form-group">
2067
- <label class="form-label">Nature de la dependance</label>
2068
- <input type="text" class="form-input" id="dep-desc" placeholder="Exemple : La commande reference un client existant">
2035
+ <label class="form-label">Nature de la dépendance</label>
2036
+ <input type="text" class="form-input" id="dep-desc" placeholder="Exemple : La commande référence un client existant">
2069
2037
  </div>
2070
- <button class="btn btn-primary" onclick="addDependency()" style="margin-top:0.5rem;">Ajouter cette dependance</button>
2038
+ <button class="btn btn-primary" onclick="addDependency()" style="margin-top:0.5rem;">Ajouter cette dépendance</button>
2071
2039
  </div>
2072
2040
 
2073
2041
  <div id="depList" style="margin-top:1.5rem;"></div>
2074
2042
 
2075
2043
  <div style="margin-top:2rem;">
2076
- <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ordre de traitement propose</h3>
2077
- <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>
2044
+ <h3 style="color:var(--text-bright);font-size:1rem;margin-bottom:0.75rem;">Ordre de traitement proposé</h3>
2045
+ <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>
2078
2046
  <div id="processingOrder" class="process-flow"></div>
2079
2047
  </div>
2080
2048
  </div>
@@ -2092,37 +2060,37 @@ body {
2092
2060
  PHASE 4 : CONSOLIDATION
2093
2061
  ================================================================ -->
2094
2062
 
2095
- <!-- SECTION: Modele de donnees -->
2063
+ <!-- SECTION: Modèle de données -->
2096
2064
  <div class="section" id="consol-datamodel" style="display:none;">
2097
- <h2 class="section-title">Modele de donnees</h2>
2098
- <p class="section-subtitle">Vue d'ensemble de toutes les entites metier, leurs attributs et leurs relations entre domaines.</p>
2065
+ <h2 class="section-title">Modèle de données</h2>
2066
+ <p class="section-subtitle">Vue d'ensemble de toutes les entités métier, leurs attributs et leurs relations entre domaines.</p>
2099
2067
  <div id="dataModelContainer">
2100
- <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>
2068
+ <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>
2101
2069
  </div>
2102
2070
  </div>
2103
2071
 
2104
2072
  <!-- SECTION: Interactions cross-module -->
2105
2073
  <div class="section" id="consol-interactions" style="display:none;">
2106
2074
  <h2 class="section-title">Interactions entre domaines</h2>
2107
- <p class="section-subtitle">Vue d'ensemble de la facon dont les domaines communiquent et partagent des donnees.</p>
2075
+ <p class="section-subtitle">Vue d'ensemble de la façon dont les domaines communiquent et partagent des données.</p>
2108
2076
  <div id="consolInteractions">
2109
- <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>
2077
+ <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>
2110
2078
  </div>
2111
2079
  </div>
2112
2080
 
2113
- <!-- SECTION: Coherence des acces -->
2081
+ <!-- SECTION: Cohérence des accès -->
2114
2082
  <div class="section" id="consol-permissions" style="display:none;">
2115
- <h2 class="section-title">Coherence des droits d'acces</h2>
2116
- <p class="section-subtitle">Verification que les profils utilisateurs ont des droits coherents dans tous les domaines.</p>
2083
+ <h2 class="section-title">Cohérence des droits d'accès</h2>
2084
+ <p class="section-subtitle">Vérification que les profils utilisateurs ont des droits cohérents dans tous les domaines.</p>
2117
2085
  <div id="consolPermissions">
2118
- <p style="color:var(--text-muted);text-align:center;padding:2rem;">La coherence sera verifiee quand les permissions de chaque domaine seront definies.</p>
2086
+ <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>
2119
2087
  </div>
2120
2088
  </div>
2121
2089
 
2122
2090
  <!-- SECTION: Parcours bout en bout -->
2123
2091
  <div class="section" id="consol-flows" style="display:none;">
2124
2092
  <h2 class="section-title">Parcours bout en bout</h2>
2125
- <p class="section-subtitle">Les processus metier qui traversent plusieurs domaines, de bout en bout.</p>
2093
+ <p class="section-subtitle">Les processus métier qui traversent plusieurs domaines, de bout en bout.</p>
2126
2094
 
2127
2095
  <div id="e2eFlowsList"></div>
2128
2096
 
@@ -2131,16 +2099,16 @@ body {
2131
2099
  <div class="inline-form" id="addFlowForm">
2132
2100
  <div class="inline-form-title">Nouveau parcours bout en bout</div>
2133
2101
  <div class="form-group">
2134
- <label class="form-label">Nom du parcours (exemple : De la commande a la facture)</label>
2102
+ <label class="form-label">Nom du parcours (exemple : De la commande à la facture)</label>
2135
2103
  <input type="text" class="form-input" id="flow-name" placeholder="Nom descriptif du parcours">
2136
2104
  </div>
2137
2105
  <div class="form-group">
2138
- <label class="form-label">Etapes du parcours (une par ligne : Domaine - Action)</label>
2139
- <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>
2106
+ <label class="form-label">Étapes du parcours (une par ligne : Domaine - Action)</label>
2107
+ <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>
2140
2108
  </div>
2141
2109
  <div class="form-group">
2142
2110
  <label class="form-label">Qui intervient dans ce parcours ?</label>
2143
- <input type="text" class="form-input" id="flow-actors" placeholder="Exemple : Contributeur (creation), Responsable (validation)">
2111
+ <input type="text" class="form-input" id="flow-actors" placeholder="Exemple : Contributeur (création), Responsable (validation)">
2144
2112
  </div>
2145
2113
  <div class="form-actions">
2146
2114
  <button class="btn" onclick="toggleForm('addFlowForm')">Annuler</button>
@@ -2154,8 +2122,8 @@ body {
2154
2122
  ================================================================ -->
2155
2123
 
2156
2124
  <div class="section" id="handoff-summary" style="display:none;">
2157
- <h2 class="section-title">Synthese de l'analyse</h2>
2158
- <p class="section-subtitle">Vue d'ensemble de toute l'analyse metier, prete pour le developpement.</p>
2125
+ <h2 class="section-title">Synthèse de l'analyse</h2>
2126
+ <p class="section-subtitle">Vue d'ensemble de toute l'analyse métier, prête pour le développement.</p>
2159
2127
 
2160
2128
  <div class="stat-grid" id="handoffStats">
2161
2129
  <!-- Populated dynamically -->
@@ -2172,9 +2140,9 @@ body {
2172
2140
  </div>
2173
2141
 
2174
2142
  <div style="margin-top:2rem;padding:1.5rem;background:var(--bg-card);border:1px solid var(--border);border-radius:10px;text-align:center;">
2175
- <p style="color:var(--text-bright);font-size:1.1rem;font-weight:600;margin-bottom:0.5rem;">Analyse prete pour l'extraction</p>
2176
- <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>
2177
- <button class="btn btn-primary" onclick="exportJSON()" style="font-size:0.9rem;padding:0.6rem 1.5rem;">Exporter l'analyse complete en JSON</button>
2143
+ <p style="color:var(--text-bright);font-size:1.1rem;font-weight:600;margin-bottom:0.5rem;">Analyse prête pour l'extraction</p>
2144
+ <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>
2145
+ <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>
2178
2146
  </div>
2179
2147
  </div>
2180
2148
 
@@ -2190,8 +2158,8 @@ body {
2190
2158
  </div>
2191
2159
  <div class="review-filters">
2192
2160
  <button class="review-filter-btn active" onclick="filterReviewComments('all')" data-filter="all">Tous</button>
2193
- <button class="review-filter-btn" onclick="filterReviewComments('to-review')" data-filter="to-review">A revoir</button>
2194
- <button class="review-filter-btn" onclick="filterReviewComments('validated')" data-filter="validated">Valides</button>
2161
+ <button class="review-filter-btn" onclick="filterReviewComments('to-review')" data-filter="to-review" revoir</button>
2162
+ <button class="review-filter-btn" onclick="filterReviewComments('validated')" data-filter="validated">Validés</button>
2195
2163
  </div>
2196
2164
  <div class="review-comments" id="reviewCommentsList">
2197
2165
  <div class="review-empty">Aucun commentaire pour le moment.</div>
@@ -2203,11 +2171,11 @@ body {
2203
2171
  </div>
2204
2172
  <div class="review-stat">
2205
2173
  <div class="review-stat-value" id="reviewStatToReview">0</div>
2206
- <div class="review-stat-label">A revoir</div>
2174
+ <div class="review-stat-label" revoir</div>
2207
2175
  </div>
2208
2176
  <div class="review-stat">
2209
2177
  <div class="review-stat-value" id="reviewStatValidated">0</div>
2210
- <div class="review-stat-label">Valides</div>
2178
+ <div class="review-stat-label">Validés</div>
2211
2179
  </div>
2212
2180
  </div>
2213
2181
  </aside>
@@ -2257,23 +2225,27 @@ data.comments = data.comments || [];
2257
2225
 
2258
2226
  // Defensive mapping: globalScope (JSON format) -> scope (HTML format)
2259
2227
  // Handles cases where FEATURE_DATA contains raw globalScope instead of pre-mapped scope
2260
- if (!data.cadrage.scope || (!data.cadrage.scope.vital?.length && data.cadrage.globalScope)) {
2228
+ if (!data.cadrage.scope || (!data.cadrage.scope.inscope?.length && data.cadrage.globalScope)) {
2261
2229
  const gs = data.cadrage.globalScope || {};
2262
- data.cadrage.scope = {
2263
- vital: (gs.mustHave || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
2264
- important: (gs.shouldHave || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
2265
- optional: (gs.couldHave || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
2266
- excluded: (gs.outOfScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s)
2267
- };
2230
+ // Backward compat: merge old MoSCoW into binary scope
2231
+ if (gs.mustHave || gs.shouldHave || gs.couldHave) {
2232
+ data.cadrage.scope = {
2233
+ inscope: [...(gs.mustHave || []), ...(gs.shouldHave || []), ...(gs.couldHave || [])].map(s => typeof s === 'string' ? { name: s, description: '' } : s),
2234
+ outofscope: (gs.outOfScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s)
2235
+ };
2236
+ } else {
2237
+ data.cadrage.scope = {
2238
+ inscope: (gs.inScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s),
2239
+ outofscope: (gs.outOfScope || []).map(s => typeof s === 'string' ? { name: s, description: '' } : s)
2240
+ };
2241
+ }
2268
2242
  }
2269
- data.cadrage.scope = data.cadrage.scope || { vital: [], important: [], optional: [], excluded: [] };
2243
+ data.cadrage.scope = data.cadrage.scope || { inscope: [], outofscope: [] };
2270
2244
 
2271
- // Backward compat: mustHave/shouldHave/couldHave/wontHave vital/important/optional/excluded
2272
- if (data.cadrage.scope.mustHave && !data.cadrage.scope.vital?.length) {
2273
- data.cadrage.scope.vital = data.cadrage.scope.mustHave;
2274
- data.cadrage.scope.important = data.cadrage.scope.shouldHave || data.cadrage.scope.important || [];
2275
- data.cadrage.scope.optional = data.cadrage.scope.couldHave || data.cadrage.scope.optional || [];
2276
- data.cadrage.scope.excluded = data.cadrage.scope.wontHave || data.cadrage.scope.excluded || [];
2245
+ // Backward compat: old vital/important/optional/excluded → inscope/outofscope
2246
+ if (data.cadrage.scope.vital && !data.cadrage.scope.inscope?.length) {
2247
+ data.cadrage.scope.inscope = [...(data.cadrage.scope.vital || []), ...(data.cadrage.scope.important || []), ...(data.cadrage.scope.optional || [])];
2248
+ data.cadrage.scope.outofscope = data.cadrage.scope.excluded || data.cadrage.scope.outofscope || [];
2277
2249
  }
2278
2250
 
2279
2251
  // Defensive init: moduleSpecs (may be missing if LLM didn't follow mapping)
@@ -2292,6 +2264,14 @@ data.moduleSpecs = data.moduleSpecs || {};
2292
2264
  }
2293
2265
  });
2294
2266
 
2267
+ // Defensive: normalize stakeholder tasks (string → array)
2268
+ (data.cadrage.stakeholders || []).forEach(function(s) {
2269
+ if (typeof s.tasks === 'string') {
2270
+ s.tasks = s.tasks.split(',').map(t => t.trim()).filter(Boolean);
2271
+ }
2272
+ s.tasks = s.tasks || [];
2273
+ });
2274
+
2295
2275
  // Vibe coding mode: hide non-relevant sections
2296
2276
  const isVibeCoding = data.metadata?.vibeCoding === true;
2297
2277
  if (isVibeCoding) {
@@ -2344,7 +2324,7 @@ function formatAccess(a) {
2344
2324
  }
2345
2325
 
2346
2326
  function formatPriority(p) {
2347
- return { vital: 'Indispensable', important: 'Important', optional: 'Optionnel', excluded: 'Hors perimetre' }[p] || p;
2327
+ return { inscope: 'Dans le périmètre', outofscope: 'Hors périmètre' }[p] || p;
2348
2328
  }
2349
2329
 
2350
2330
  function formatLevel(l) {
@@ -2352,11 +2332,7 @@ function formatLevel(l) {
2352
2332
  }
2353
2333
 
2354
2334
  function formatModuleType(t) {
2355
- return { 'data-centric': 'Donnees', 'workflow': 'Processus', 'reporting': 'Rapports', 'integration': 'Integration', 'full-module': 'Complet' }[t] || t;
2356
- }
2357
-
2358
- function formatModulePriority(p) {
2359
- return { must: 'Indispensable', should: 'Important', could: 'Optionnel' }[p] || p;
2335
+ return { 'data-centric': 'Données', 'workflow': 'Processus', 'reporting': 'Rapports', 'integration': 'Intégration', 'full-module': 'Complet' }[t] || t;
2360
2336
  }
2361
2337
 
2362
2338
  /* ============================================
@@ -2463,13 +2439,13 @@ function buildNavTree() {
2463
2439
  });
2464
2440
  html += renderNavGroup('modules-other', 'Autres modules (' + orphanModules.length + ')', orphanItems);
2465
2441
  }
2466
- html += renderNavItem('decomp-dependencies', 'Dependances', data.dependencies.length);
2442
+ html += renderNavItem('decomp-dependencies', 'Dépendances', data.dependencies.length);
2467
2443
  } else {
2468
2444
  html += renderNavGroup('modules', 'Modules (' + data.modules.length + ')', buildModuleItems());
2469
2445
  }
2470
2446
 
2471
2447
  html += renderNavGroup('consolidation', 'Consolidation', buildConsolidationItems());
2472
- html += renderNavGroup('synthese', 'Synthese', buildSyntheseItems());
2448
+ html += renderNavGroup('synthese', 'Synthèse', buildSyntheseItems());
2473
2449
 
2474
2450
  nav.innerHTML = html;
2475
2451
  restoreNavState();
@@ -2501,8 +2477,8 @@ function renderNavItem(sectionId, label, badge) {
2501
2477
  function buildCadrageItems() {
2502
2478
  return renderNavItem('cadrage-context', 'Contexte') +
2503
2479
  renderNavItem('cadrage-stakeholders', 'Parties prenantes', data.cadrage.stakeholders.length) +
2504
- renderNavItem('cadrage-scope', 'Perimetre fonctionnel') +
2505
- renderNavItem('cadrage-success', 'Criteres de reussite');
2480
+ renderNavItem('cadrage-scope', 'Périmètre fonctionnel') +
2481
+ renderNavItem('cadrage-success', 'Critères de réussite');
2506
2482
  }
2507
2483
 
2508
2484
  function buildModuleItems() {
@@ -2512,7 +2488,7 @@ function buildModuleItems() {
2512
2488
  });
2513
2489
  // Global module views at bottom
2514
2490
  html += renderNavItem('decomp-modules', 'Vue d\'ensemble', data.modules.length);
2515
- html += renderNavItem('decomp-dependencies', 'Dependances', data.dependencies.length);
2491
+ html += renderNavItem('decomp-dependencies', 'Dépendances', data.dependencies.length);
2516
2492
  return html;
2517
2493
  }
2518
2494
 
@@ -2520,9 +2496,9 @@ function buildConsolidationItems() {
2520
2496
  var totalEntities = data.modules.reduce(function(sum, m) {
2521
2497
  return sum + (data.moduleSpecs[m.code]?.entities || []).length;
2522
2498
  }, 0);
2523
- return renderNavItem('consol-datamodel', 'Modele de donnees', totalEntities) +
2499
+ return renderNavItem('consol-datamodel', 'Modèle de données', totalEntities) +
2524
2500
  renderNavItem('consol-interactions', 'Interactions') +
2525
- renderNavItem('consol-permissions', 'Coherence des acces') +
2501
+ renderNavItem('consol-permissions', 'Cohérence des accès') +
2526
2502
  renderNavItem('consol-flows', 'Parcours bout en bout', data.consolidation.e2eFlows.length);
2527
2503
  }
2528
2504
 
@@ -2553,9 +2529,9 @@ function renderModuleNavItem(mod) {
2553
2529
  // Children: tabs
2554
2530
  html += '<div class="nav-children"' + (collapsed ? ' style="display:none;"' : '') + '>';
2555
2531
  html += renderModuleTabNavItem(code, 'uc', 'Cas d\'utilisation', ucCount);
2556
- html += renderModuleTabNavItem(code, 'br', 'Regles metier', brCount);
2557
- html += renderModuleTabNavItem(code, 'ent', 'Donnees', entCount);
2558
- html += renderModuleTabNavItem(code, 'perm', 'Droits d\'acces');
2532
+ html += renderModuleTabNavItem(code, 'br', 'Règles métier', brCount);
2533
+ html += renderModuleTabNavItem(code, 'ent', 'Données', entCount);
2534
+ html += renderModuleTabNavItem(code, 'perm', 'Droits d\'accès');
2559
2535
  html += renderModuleTabNavItem(code, 'mock', 'Maquettes');
2560
2536
  html += renderModuleTabNavItem(code, 'struct', 'Structure', sections.length);
2561
2537
 
@@ -2691,7 +2667,7 @@ function renderStakeholders() {
2691
2667
  </div>
2692
2668
  <div class="stakeholder-function">${s.function || ''}</div>
2693
2669
  <ul class="stakeholder-tasks">
2694
- ${(s.tasks || []).map(t => '<li>' + t + '</li>').join('')}
2670
+ ${(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('')}
2695
2671
  </ul>
2696
2672
  <div class="stakeholder-meta">
2697
2673
  <span>${formatFrequency(s.frequency)}</span>
@@ -2726,9 +2702,10 @@ function addScopeItem(priority) {
2726
2702
  }
2727
2703
 
2728
2704
  function renderScope() {
2729
- ['vital', 'important', 'optional', 'excluded'].forEach(p => {
2730
- const container = document.getElementById('scope' + p.charAt(0).toUpperCase() + p.slice(1));
2731
- container.innerHTML = data.cadrage.scope[p].map((item, i) => `
2705
+ ['inscope', 'outofscope'].forEach(p => {
2706
+ const container = document.getElementById('scope' + (p === 'inscope' ? 'InScope' : 'OutOfScope'));
2707
+ if (!container) return;
2708
+ container.innerHTML = (data.cadrage.scope[p] || []).map((item, i) => `
2732
2709
  <div class="uc-item">
2733
2710
  <div class="uc-header">
2734
2711
  <span class="priority priority-${p}">${formatPriority(p)}</span>
@@ -2818,7 +2795,6 @@ function addModule() {
2818
2795
  name: name,
2819
2796
  description: document.getElementById('mod-desc').value.trim(),
2820
2797
  featureType: document.getElementById('mod-type').value,
2821
- priority: document.getElementById('mod-priority').value,
2822
2798
  entities: document.getElementById('mod-entities').value.split('\n').filter(e => e.trim()),
2823
2799
  anticipatedSections: [],
2824
2800
  status: 'pending'
@@ -2868,12 +2844,11 @@ function renderModules() {
2868
2844
  </div>
2869
2845
  <div class="module-card-desc">${m.description || ''}</div>
2870
2846
  <div class="module-card-meta">
2871
- <span class="priority priority-${m.priority === 'must' ? 'vital' : m.priority === 'should' ? 'important' : 'optional'}">${formatModulePriority(m.priority)}</span>
2872
- <span>${(m.entities || []).length} donnees</span>
2847
+ <span>${(m.entities || []).length} données</span>
2873
2848
  <span>${(data.moduleSpecs[m.code]?.useCases || []).length} cas d'utilisation</span>
2874
2849
  </div>
2875
2850
  </div>
2876
- `).join('') || '<p style="color:var(--text-muted);text-align:center;padding:2rem;grid-column:1/-1;">Aucun domaine fonctionnel defini. Cliquez sur le bouton ci-dessous pour commencer.</p>';
2851
+ `).join('') || '<p style="color:var(--text-muted);text-align:center;padding:2rem;grid-column:1/-1;">Aucun domaine fonctionnel défini. Cliquez sur le bouton ci-dessous pour commencer.</p>';
2877
2852
  }
2878
2853
 
2879
2854
  function updateModulesNav() {
@@ -2946,7 +2921,7 @@ function renderDepGraph() {
2946
2921
 
2947
2922
  const layers = computeTopologicalLayers();
2948
2923
  if (!layers) {
2949
- graph.innerHTML = '<p style="color:var(--error);text-align:center;padding:1rem;">Dependance circulaire detectee ! Corrigez les dependances.</p>';
2924
+ graph.innerHTML = '<p style="color:var(--error);text-align:center;padding:1rem;">Dépendance circulaire détectée ! Corrigez les dépendances.</p>';
2950
2925
  return;
2951
2926
  }
2952
2927
 
@@ -3003,7 +2978,7 @@ function renderProcessingOrder() {
3003
2978
  const m = data.modules.find(mod => mod.code === code);
3004
2979
  return `
3005
2980
  <div class="process-step">
3006
- <div class="process-step-number">Etape ${i + 1}</div>
2981
+ <div class="process-step-number">Étape ${i + 1}</div>
3007
2982
  <div class="process-step-label">${m ? (m.name || m.code) : code}</div>
3008
2983
  </div>
3009
2984
  ${i < order.length - 1 ? '<div class="process-arrow">&#8594;</div>' : ''}
@@ -3043,13 +3018,13 @@ function renderModuleSpecSection(mod) {
3043
3018
  return `
3044
3019
  <div class="section" id="module-spec-${code}" style="display:none;">
3045
3020
  <h2 class="section-title">${mod.name}</h2>
3046
- <p class="section-subtitle">${mod.description || 'Specification detaillee de ce domaine fonctionnel.'}</p>
3021
+ <p class="section-subtitle">${mod.description || 'Spécification détaillée de ce domaine fonctionnel.'}</p>
3047
3022
 
3048
3023
  <div class="tab-bar">
3049
3024
  <button class="tab-btn active" onclick="switchTab('${code}', 'uc')">Cas d'utilisation</button>
3050
- <button class="tab-btn" onclick="switchTab('${code}', 'br')">Regles metier</button>
3051
- <button class="tab-btn" onclick="switchTab('${code}', 'ent')">Donnees</button>
3052
- <button class="tab-btn" onclick="switchTab('${code}', 'perm')">Droits d'acces</button>
3025
+ <button class="tab-btn" onclick="switchTab('${code}', 'br')">Règles métier</button>
3026
+ <button class="tab-btn" onclick="switchTab('${code}', 'ent')">Données</button>
3027
+ <button class="tab-btn" onclick="switchTab('${code}', 'perm')">Droits d'accès</button>
3053
3028
  <button class="tab-btn" onclick="switchTab('${code}', 'mock')">Maquettes</button>
3054
3029
  <button class="tab-btn" onclick="switchTab('${code}', 'notes')">Notes</button>
3055
3030
  <button class="tab-btn" onclick="switchTab('${code}', 'struct')">Structure</button>
@@ -3057,7 +3032,7 @@ function renderModuleSpecSection(mod) {
3057
3032
 
3058
3033
  <!-- TAB: Cas d'utilisation -->
3059
3034
  <div class="tab-panel active" id="tab-${code}-uc">
3060
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Decrivez ce que chaque type d'utilisateur peut faire dans ce domaine. Un cas d'utilisation = une action concrete.</p>
3035
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Décrivez ce que chaque type d'utilisateur peut faire dans ce domaine. Un cas d'utilisation = une action concrète.</p>
3061
3036
  <div id="ucList-${code}" class="uc-list">
3062
3037
  ${spec.useCases.map((uc, i) => renderUseCase(code, uc, i)).join('')}
3063
3038
  </div>
@@ -3065,20 +3040,20 @@ function renderModuleSpecSection(mod) {
3065
3040
  <div class="inline-form" id="addUcForm-${code}">
3066
3041
  <div class="inline-form-title">Nouveau cas d'utilisation</div>
3067
3042
  <div class="form-group">
3068
- <label class="form-label">Que fait l'utilisateur ? (exemple : Creer une commande)</label>
3069
- <input type="text" class="form-input" id="uc-name-${code}" placeholder="Action concrete de l'utilisateur">
3043
+ <label class="form-label">Que fait l'utilisateur ? (exemple : Créer une commande)</label>
3044
+ <input type="text" class="form-input" id="uc-name-${code}" placeholder="Action concrète de l'utilisateur">
3070
3045
  </div>
3071
3046
  <div class="form-group">
3072
- <label class="form-label">Qui realise cette action ? (profil utilisateur)</label>
3047
+ <label class="form-label">Qui réalise cette action ? (profil utilisateur)</label>
3073
3048
  <input type="text" class="form-input" id="uc-actor-${code}" placeholder="Exemple : Responsable de production">
3074
3049
  </div>
3075
3050
  <div class="form-group">
3076
- <label class="form-label">Deroulement normal, etape par etape (une par ligne)</label>
3077
- <textarea class="form-textarea" id="uc-steps-${code}" placeholder="1. L'utilisateur ouvre la page de creation&#10;2. Il remplit les champs obligatoires&#10;3. Il valide le formulaire&#10;4. Le systeme enregistre et confirme"></textarea>
3051
+ <label class="form-label">Déroulement normal, étape par étape (une par ligne)</label>
3052
+ <textarea class="form-textarea" id="uc-steps-${code}" placeholder="1. L'utilisateur ouvre la page de création&#10;2. Il remplit les champs obligatoires&#10;3. Il valide le formulaire&#10;4. Le système enregistre et confirme"></textarea>
3078
3053
  </div>
3079
3054
  <div class="form-group">
3080
3055
  <label class="form-label">Que se passe-t-il si quelque chose ne va pas ? (optionnel)</label>
3081
- <textarea class="form-textarea" id="uc-alt-${code}" placeholder="Exemple : Si les donnees sont incorrectes, le systeme affiche un message d'erreur" style="min-height:50px;"></textarea>
3056
+ <textarea class="form-textarea" id="uc-alt-${code}" placeholder="Exemple : Si les données sont incorrectes, le système affiche un message d'erreur" style="min-height:50px;"></textarea>
3082
3057
  </div>
3083
3058
  <div class="form-actions">
3084
3059
  <button class="btn" onclick="toggleForm('addUcForm-${code}')">Annuler</button>
@@ -3087,36 +3062,36 @@ function renderModuleSpecSection(mod) {
3087
3062
  </div>
3088
3063
  </div>
3089
3064
 
3090
- <!-- TAB: Regles metier -->
3065
+ <!-- TAB: Règles métier -->
3091
3066
  <div class="tab-panel" id="tab-${code}-br">
3092
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Les regles que le systeme doit respecter. Formulez-les sous forme de conditions : "Si... alors... sinon..."</p>
3067
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Les règles que le système doit respecter. Formulez-les sous forme de conditions : "Si... alors... sinon..."</p>
3093
3068
  <div id="brList-${code}">
3094
3069
  ${spec.businessRules.map((br, i) => renderBusinessRule(code, br, i)).join('')}
3095
3070
  </div>
3096
- <button class="add-btn" onclick="toggleForm('addBrForm-${code}')">+ Ajouter une regle metier</button>
3071
+ <button class="add-btn" onclick="toggleForm('addBrForm-${code}')">+ Ajouter une règle métier</button>
3097
3072
  <div class="inline-form" id="addBrForm-${code}">
3098
- <div class="inline-form-title">Nouvelle regle metier</div>
3073
+ <div class="inline-form-title">Nouvelle règle métier</div>
3099
3074
  <div class="form-group">
3100
- <label class="form-label">Nom court de la regle</label>
3101
- <input type="text" class="form-input" id="br-name-${code}" placeholder="Exemple : Verification du budget disponible">
3075
+ <label class="form-label">Nom court de la règle</label>
3076
+ <input type="text" class="form-input" id="br-name-${code}" placeholder="Exemple : Vérification du budget disponible">
3102
3077
  </div>
3103
3078
  <div class="form-group">
3104
- <label class="form-label">Categorie</label>
3079
+ <label class="form-label">Catégorie</label>
3105
3080
  <select class="form-select" id="br-cat-${code}">
3106
- <option value="validation">Verification (le systeme verifie que...)</option>
3107
- <option value="calculation">Calcul (le systeme calcule...)</option>
3081
+ <option value="validation">Vérification (le système vérifie que...)</option>
3082
+ <option value="calculation">Calcul (le système calcule...)</option>
3108
3083
  <option value="workflow">Processus (quand X se produit, alors...)</option>
3109
- <option value="security">Securite (seul... peut...)</option>
3110
- <option value="data">Donnees (les donnees doivent...)</option>
3084
+ <option value="security">Sécurité (seul... peut...)</option>
3085
+ <option value="data">Données (les données doivent...)</option>
3111
3086
  </select>
3112
3087
  </div>
3113
3088
  <div class="form-group">
3114
- <label class="form-label">Formulation de la regle (Si... alors... sinon...)</label>
3115
- <textarea class="form-textarea" id="br-statement-${code}" placeholder="Si le montant de la commande depasse le budget du client, alors la commande est refusee et un message d'erreur s'affiche"></textarea>
3089
+ <label class="form-label">Formulation de la règle (Si... alors... sinon...)</label>
3090
+ <textarea class="form-textarea" id="br-statement-${code}" placeholder="Si le montant de la commande dépasse le budget du client, alors la commande est refusée et un message d'erreur s'affiche"></textarea>
3116
3091
  </div>
3117
3092
  <div class="form-group">
3118
3093
  <label class="form-label">Exemple concret (optionnel)</label>
3119
- <input type="text" class="form-input" id="br-example-${code}" placeholder="Exemple : Commande de 5000 CHF, budget de 2000 CHF -> refusee">
3094
+ <input type="text" class="form-input" id="br-example-${code}" placeholder="Exemple : Commande de 5000 CHF, budget de 2000 CHF -> refusée">
3120
3095
  </div>
3121
3096
  <div class="form-actions">
3122
3097
  <button class="btn" onclick="toggleForm('addBrForm-${code}')">Annuler</button>
@@ -3125,34 +3100,34 @@ function renderModuleSpecSection(mod) {
3125
3100
  </div>
3126
3101
  </div>
3127
3102
 
3128
- <!-- TAB: Donnees (Entites) -->
3103
+ <!-- TAB: Données (Entités) -->
3129
3104
  <div class="tab-panel" id="tab-${code}-ent">
3130
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Les types de donnees que ce domaine gere. Decrivez les informations importantes a enregistrer pour chaque type.</p>
3105
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Les types de données que ce domaine gère. Décrivez les informations importantes à enregistrer pour chaque type.</p>
3131
3106
  <div id="entList-${code}">
3132
3107
  ${spec.entities.length > 0
3133
3108
  ? spec.entities.map((ent, i) => renderEntity(code, ent, i)).join('')
3134
3109
  : (mod.entities || []).length > 0
3135
- ? '<div class="card" style="color:var(--text-muted);padding:1.5rem;"><p style="margin-bottom:0.75rem;">Les schemas detailles ne sont pas encore disponibles. Entites identifiees :</p><ul style="list-style:disc;padding-left:1.5rem;">' + mod.entities.map(e => '<li>' + e + '</li>').join('') + '</ul><p style="font-size:0.8rem;margin-top:0.75rem;font-style:italic;">Utilisez le bouton ci-dessous pour ajouter les schemas detailles.</p></div>'
3110
+ ? '<div class="card" style="color:var(--text-muted);padding:1.5rem;"><p style="margin-bottom:0.75rem;">Les schémas détaillés ne sont pas encore disponibles. Entités identifiées :</p><ul style="list-style:disc;padding-left:1.5rem;">' + mod.entities.map(e => '<li>' + e + '</li>').join('') + '</ul><p style="font-size:0.8rem;margin-top:0.75rem;font-style:italic;">Utilisez le bouton ci-dessous pour ajouter les schémas détaillés.</p></div>'
3136
3111
  : ''
3137
3112
  }
3138
3113
  </div>
3139
- <button class="add-btn" onclick="toggleForm('addEntForm-${code}')">+ Ajouter un type de donnees</button>
3114
+ <button class="add-btn" onclick="toggleForm('addEntForm-${code}')">+ Ajouter un type de données</button>
3140
3115
  <div class="inline-form" id="addEntForm-${code}">
3141
- <div class="inline-form-title">Nouveau type de donnees</div>
3116
+ <div class="inline-form-title">Nouveau type de données</div>
3142
3117
  <div class="form-group">
3143
3118
  <label class="form-label">Nom (exemple : Commande, Client, Facture)</label>
3144
- <input type="text" class="form-input" id="ent-name-${code}" placeholder="Nom du type de donnees">
3119
+ <input type="text" class="form-input" id="ent-name-${code}" placeholder="Nom du type de données">
3145
3120
  </div>
3146
3121
  <div class="form-group">
3147
- <label class="form-label">Description : a quoi sert cette donnee ?</label>
3148
- <textarea class="form-textarea" id="ent-desc-${code}" placeholder="En une ou deux phrases, decrivez ce que represente cette donnee dans votre activite" style="min-height:50px;"></textarea>
3122
+ <label class="form-label">Description : à quoi sert cette donnée ?</label>
3123
+ <textarea class="form-textarea" id="ent-desc-${code}" placeholder="En une ou deux phrases, décrivez ce que représente cette donnée dans votre activité" style="min-height:50px;"></textarea>
3149
3124
  </div>
3150
3125
  <div class="form-group">
3151
- <label class="form-label">Informations a enregistrer (une par ligne : Nom - Description)</label>
3152
- <textarea class="form-textarea" id="ent-attrs-${code}" placeholder="Numero - Identifiant unique de la commande&#10;Date - Date de creation de la commande&#10;Montant total - Somme des lignes&#10;Statut - Brouillon, Envoyee, Validee, Refusee"></textarea>
3126
+ <label class="form-label">Informations à enregistrer (une par ligne : Nom - Description)</label>
3127
+ <textarea class="form-textarea" id="ent-attrs-${code}" placeholder="Numero - Identifiant unique de la commande&#10;Date - Date de création de la commande&#10;Montant total - Somme des lignes&#10;Statut - Brouillon, Envoyée, Validée, Refusée"></textarea>
3153
3128
  </div>
3154
3129
  <div class="form-group">
3155
- <label class="form-label">Relations avec d'autres donnees (optionnel, une par ligne)</label>
3130
+ <label class="form-label">Relations avec d'autres données (optionnel, une par ligne)</label>
3156
3131
  <textarea class="form-textarea" id="ent-rels-${code}" placeholder="Client - Chaque commande appartient a un client&#10;Ligne de commande - Une commande contient plusieurs lignes" style="min-height:50px;"></textarea>
3157
3132
  </div>
3158
3133
  <div class="form-actions">
@@ -3162,20 +3137,20 @@ function renderModuleSpecSection(mod) {
3162
3137
  </div>
3163
3138
  </div>
3164
3139
 
3165
- <!-- TAB: Droits d'acces -->
3140
+ <!-- TAB: Droits d'accès -->
3166
3141
  <div class="tab-panel" id="tab-${code}-perm">
3167
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Definissez qui peut faire quoi dans ce domaine. Cochez les actions autorisees pour chaque profil.</p>
3142
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Définissez qui peut faire quoi dans ce domaine. Cochez les actions autorisées pour chaque profil.</p>
3168
3143
  <div id="permGrid-${code}">
3169
3144
  ${renderPermissionGrid(code)}
3170
3145
  </div>
3171
3146
  <div style="display:flex;gap:0.75rem;margin-top:1rem;flex-wrap:wrap;">
3172
- <button class="add-btn" onclick="toggleForm('addRoleForm-${code}')" style="flex:1;min-width:200px;">+ Ajouter un role</button>
3147
+ <button class="add-btn" onclick="toggleForm('addRoleForm-${code}')" style="flex:1;min-width:200px;">+ Ajouter un rôle</button>
3173
3148
  <button class="add-btn" onclick="toggleForm('addActionForm-${code}')" style="flex:1;min-width:200px;">+ Ajouter une action</button>
3174
3149
  </div>
3175
3150
  <div class="inline-form" id="addRoleForm-${code}">
3176
- <div class="inline-form-title">Nouveau role</div>
3151
+ <div class="inline-form-title">Nouveau rôle</div>
3177
3152
  <div class="form-group">
3178
- <label class="form-label">Nom du role</label>
3153
+ <label class="form-label">Nom du rôle</label>
3179
3154
  <input type="text" class="form-input" id="role-name-${code}" placeholder="Exemple : Superviseur, Auditeur...">
3180
3155
  </div>
3181
3156
  <div class="form-actions">
@@ -3198,7 +3173,7 @@ function renderModuleSpecSection(mod) {
3198
3173
 
3199
3174
  <!-- TAB: Maquettes -->
3200
3175
  <div class="tab-panel" id="tab-${code}-mock">
3201
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Maquettes validees lors de l'analyse. Ces wireframes montrent la structure exacte des ecrans de ce domaine.</p>
3176
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Maquettes validées lors de l'analyse. Ces wireframes montrent la structure exacte des écrans de ce domaine.</p>
3202
3177
  <div id="mockupContainer-${code}">
3203
3178
  ${renderModuleMockups(code)}
3204
3179
  </div>
@@ -3206,15 +3181,15 @@ function renderModuleSpecSection(mod) {
3206
3181
 
3207
3182
  <!-- TAB: Notes -->
3208
3183
  <div class="tab-panel" id="tab-${code}-notes">
3209
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Notes libres, questions en suspens, elements a clarifier pour ce domaine.</p>
3184
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Notes libres, questions en suspens, éléments à clarifier pour ce domaine.</p>
3210
3185
  <div class="card">
3211
- <div class="editable" contenteditable="true" data-module-code="${code}" data-module-field="notes" data-placeholder="Notez ici tout ce qui concerne ce domaine : questions, precisions, contraintes particulieres...">${spec.notes || ''}</div>
3186
+ <div class="editable" contenteditable="true" data-module-code="${code}" data-module-field="notes" data-placeholder="Notez ici tout ce qui concerne ce domaine : questions, précisions, contraintes particulières...">${spec.notes || ''}</div>
3212
3187
  </div>
3213
3188
  </div>
3214
3189
 
3215
3190
  <!-- TAB: Structure (sections/resources) -->
3216
3191
  <div class="tab-panel" id="tab-${code}-struct">
3217
- <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Organisation des ecrans et ressources de ce domaine. Structure hierarchique : sections regroupant des ressources.</p>
3192
+ <p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">Organisation des écrans et ressources de ce domaine. Structure hiérarchique : sections regroupant des ressources.</p>
3218
3193
  <div id="structContainer-${code}">
3219
3194
  ${renderModuleStructure(code)}
3220
3195
  </div>
@@ -3233,8 +3208,8 @@ function renderUseCase(code, uc, index) {
3233
3208
  </div>
3234
3209
  </div>
3235
3210
  <div class="uc-actors"><div class="uc-actor">${uc.actor}</div></div>
3236
- ${uc.steps ? `<div class="uc-detail-label">Deroulement</div><div class="uc-detail">${uc.steps.replace(/\n/g, '<br>')}</div>` : ''}
3237
- ${uc.alternative ? `<div class="uc-detail-label">En cas de probleme</div><div class="uc-detail" style="color:var(--warning);">${uc.alternative}</div>` : ''}
3211
+ ${uc.steps ? `<div class="uc-detail-label">Déroulement</div><div class="uc-detail">${uc.steps.replace(/\n/g, '<br>')}</div>` : ''}
3212
+ ${uc.alternative ? `<div class="uc-detail-label">En cas de problème</div><div class="uc-detail" style="color:var(--warning);">${uc.alternative}</div>` : ''}
3238
3213
  <div style="padding:0.5rem 0.75rem;border-top:1px solid var(--border);background:var(--bg-input);border-radius:0 0 8px 8px;">
3239
3214
  <label style="font-size:0.75rem;color:var(--text-muted);display:block;margin-bottom:0.25rem;">Commentaire / Feedback :</label>
3240
3215
  <textarea class="form-textarea" placeholder="Ajouter un commentaire sur ce cas d'utilisation..."
@@ -3270,7 +3245,7 @@ function removeUseCase(code, index) {
3270
3245
 
3271
3246
  function renderBusinessRule(code, br, index) {
3272
3247
  const catColors = { validation: 'br-cat-validation', calculation: 'br-cat-calculation', workflow: 'br-cat-workflow', security: 'br-cat-security', data: 'br-cat-data' };
3273
- const catLabels = { validation: 'Verification', calculation: 'Calcul', workflow: 'Processus', security: 'Securite', data: 'Donnees' };
3248
+ const catLabels = { validation: 'Vérification', calculation: 'Calcul', workflow: 'Processus', security: 'Sécurité', data: 'Données' };
3274
3249
  return `
3275
3250
  <div style="margin-bottom:0.5rem;">
3276
3251
  <div class="br-item" style="margin-bottom:0;border-radius:8px 8px 0 0;">
@@ -3283,7 +3258,7 @@ function renderBusinessRule(code, br, index) {
3283
3258
  <button class="btn btn-sm" onclick="removeBusinessRule('${code}',${index})" style="opacity:0.5;flex-shrink:0;">&#10005;</button>
3284
3259
  </div>
3285
3260
  <div style="padding:0.4rem 0.75rem 0.6rem;background:var(--bg-input);border:1px solid var(--border);border-top:0;border-radius:0 0 8px 8px;">
3286
- <textarea class="form-textarea" placeholder="Commentaire sur cette regle..."
3261
+ <textarea class="form-textarea" placeholder="Commentaire sur cette règle..."
3287
3262
  onblur="updateSpecComment('${code}','br',${index},this.value)"
3288
3263
  style="min-height:35px;font-size:0.8rem;resize:vertical;">${getSpecComment(code, 'br', index)}</textarea>
3289
3264
  </div>
@@ -3338,7 +3313,7 @@ function renderEntity(code, ent, index) {
3338
3313
  </div>` : ''}
3339
3314
  <div style="padding:0.4rem 0.75rem 0.6rem;background:var(--bg-input);border-top:1px solid var(--border);border-radius:0 0 8px 8px;">
3340
3315
  <label style="font-size:0.75rem;color:var(--text-muted);display:block;margin-bottom:0.25rem;">Commentaire :</label>
3341
- <textarea class="form-textarea" placeholder="Commentaire sur cette entite..."
3316
+ <textarea class="form-textarea" placeholder="Commentaire sur cette entité..."
3342
3317
  onblur="updateSpecComment('${code}','ent',${index},this.value)"
3343
3318
  style="min-height:35px;font-size:0.8rem;resize:vertical;">${getSpecComment(code, 'ent', index)}</textarea>
3344
3319
  </div>
@@ -3431,7 +3406,7 @@ function renderModuleMockups(code) {
3431
3406
  return `
3432
3407
  <div class="card" style="text-align:center;padding:2rem;color:var(--text-muted);">
3433
3408
  <p>Aucune maquette disponible pour ce module.</p>
3434
- <p style="font-size:0.85rem;margin-top:0.5rem;">Les maquettes seront generees lors de la specification detaillee.</p>
3409
+ <p style="font-size:0.85rem;margin-top:0.5rem;">Les maquettes seront générées lors de la spécification détaillée.</p>
3435
3410
  </div>`;
3436
3411
  }
3437
3412
 
@@ -3480,7 +3455,7 @@ function renderWireframeMockup(code, wf, i) {
3480
3455
  <details class="wireframe-details">
3481
3456
  <summary>Mapping composants SmartStack</summary>
3482
3457
  <table class="mapping-table">
3483
- <thead><tr><th>Element maquette</th><th>Composant React</th></tr></thead>
3458
+ <thead><tr><th>Élément maquette</th><th>Composant React</th></tr></thead>
3484
3459
  <tbody>
3485
3460
  ${mappings.map(m =>
3486
3461
  '<tr><td>' + (m.wireframeElement || '') + '</td><td><code>' + (m.reactComponent || '') + '</code></td></tr>'
@@ -3494,7 +3469,7 @@ function renderWireframeMockup(code, wf, i) {
3494
3469
  <textarea class="form-textarea"
3495
3470
  data-module="${code}"
3496
3471
  data-screen="${wf.screen}"
3497
- placeholder="Ajouter un commentaire sur cette maquette (ex: deplacer ce bouton, ajouter une colonne...)"
3472
+ placeholder="Ajouter un commentaire sur cette maquette (ex: déplacer ce bouton, ajouter une colonne...)"
3498
3473
  onblur="updateWireframeComment('${code}', '${wf.screen}', this.value)"
3499
3474
  style="min-height:60px;font-size:0.85rem;resize:vertical;"
3500
3475
  >${getWireframeComment(code, wf.screen)}</textarea>
@@ -3542,7 +3517,7 @@ function getPermRoles() {
3542
3517
  }
3543
3518
 
3544
3519
  function getPermActions() {
3545
- const baseActions = ['Consulter', 'Creer', 'Modifier', 'Supprimer', 'Valider', 'Exporter'];
3520
+ const baseActions = ['Consulter', 'Créer', 'Modifier', 'Supprimer', 'Valider', 'Exporter'];
3546
3521
  return [...baseActions, ...(data.customActions || [])];
3547
3522
  }
3548
3523
 
@@ -3563,7 +3538,7 @@ function renderPermissionGrid(code) {
3563
3538
  <tbody>
3564
3539
  ${roles.map((role, ri) => `
3565
3540
  <tr>
3566
- <td style="font-weight:500;color:var(--text-bright);">${role}${ri >= baseRolesCount ? ' <span onclick="removeCustomRole('+`'${code}','${role}'`+')" style="cursor:pointer;color:var(--danger);font-size:0.7rem;" title="Supprimer ce role">&#10005;</span>' : ''}</td>
3541
+ <td style="font-weight:500;color:var(--text-bright);">${role}${ri >= baseRolesCount ? ' <span onclick="removeCustomRole('+`'${code}','${role}'`+')" style="cursor:pointer;color:var(--danger);font-size:0.7rem;" title="Supprimer ce rôle">&#10005;</span>' : ''}</td>
3567
3542
  ${actions.map(action => {
3568
3543
  const key = role + '|' + action;
3569
3544
  const wildcardKey = role + '|*';
@@ -3650,8 +3625,8 @@ function renderModuleStructure(code) {
3650
3625
 
3651
3626
  if (sections.length === 0) {
3652
3627
  return '<div class="card" style="text-align:center;padding:2rem;color:var(--text-muted);">' +
3653
- '<p>Aucune section definie pour ce module.</p>' +
3654
- '<p style="font-size:0.85rem;margin-top:0.5rem;">Les sections et ressources seront identifiees lors de l\'analyse approfondie.</p>' +
3628
+ '<p>Aucune section définie pour ce module.</p>' +
3629
+ '<p style="font-size:0.85rem;margin-top:0.5rem;">Les sections et ressources seront identifiées lors de l\'analyse approfondie.</p>' +
3655
3630
  '</div>';
3656
3631
  }
3657
3632
 
@@ -3725,7 +3700,7 @@ function renderDataModel() {
3725
3700
  });
3726
3701
 
3727
3702
  if (allEntities.length === 0) {
3728
- container.innerHTML = '<p style="color:var(--text-muted);text-align:center;padding:2rem;">Aucune entite definie. Specifiez les donnees dans chaque domaine (Phase 3 > onglet Donnees).</p>';
3703
+ container.innerHTML = '<p style="color:var(--text-muted);text-align:center;padding:2rem;">Aucune entité définie. Spécifiez les données dans chaque domaine (Phase 3 > onglet Données).</p>';
3729
3704
  return;
3730
3705
  }
3731
3706
 
@@ -3741,7 +3716,7 @@ function renderDataModel() {
3741
3716
  const relCount = allEntities.reduce((sum, e) => sum + (e.relationships || []).length, 0);
3742
3717
  html += `
3743
3718
  <div class="dm-summary">
3744
- <div class="dm-summary-item"><span class="dm-summary-value">${allEntities.length}</span><span class="dm-summary-label">Entites</span></div>
3719
+ <div class="dm-summary-item"><span class="dm-summary-value">${allEntities.length}</span><span class="dm-summary-label">Entités</span></div>
3745
3720
  <div class="dm-summary-item"><span class="dm-summary-value">${moduleCount}</span><span class="dm-summary-label">Domaines</span></div>
3746
3721
  <div class="dm-summary-item"><span class="dm-summary-value">${relCount}</span><span class="dm-summary-label">Relations</span></div>
3747
3722
  </div>`;
@@ -3755,7 +3730,7 @@ function renderDataModel() {
3755
3730
  html += `<div class="dm-module-group">`;
3756
3731
  html += `<div class="dm-module-header">
3757
3732
  <span class="dm-module-name">${m.name || m.code}</span>
3758
- <span class="dm-module-count">${entities.length} entite${entities.length > 1 ? 's' : ''}</span>
3733
+ <span class="dm-module-count">${entities.length} entité${entities.length > 1 ? 's' : ''}</span>
3759
3734
  </div>`;
3760
3735
 
3761
3736
  html += `<div class="dm-entity-grid">`;
@@ -3804,7 +3779,7 @@ function renderConsolInteractions() {
3804
3779
  <span style="font-weight:600;color:var(--text-bright);">${fromName}</span>
3805
3780
  <span class="interaction-arrow">&#8594;</span>
3806
3781
  <span style="font-weight:600;color:var(--text-bright);">${toName}</span>
3807
- <span class="interaction-type">Dependance</span>
3782
+ <span class="interaction-type">Dépendance</span>
3808
3783
  <span style="flex:1;font-size:0.8rem;color:var(--text-muted);">${d.description || ''}</span>
3809
3784
  </div>`;
3810
3785
  }).join('');
@@ -3986,7 +3961,7 @@ function renderResourceMockup(code, sectionCode, res, index) {
3986
3961
  /* ---------- SmartTable ---------- */
3987
3962
  function renderSmartTableMockup(res) {
3988
3963
  var columns = res.columns || [];
3989
- if (columns.length === 0) return '<div style="padding:2rem;text-align:center;color:var(--text-muted);">Table sans colonnes definies</div>';
3964
+ if (columns.length === 0) return '<div style="padding:2rem;text-align:center;color:var(--text-muted);">Table sans colonnes définies</div>';
3990
3965
 
3991
3966
  var html = '';
3992
3967
 
@@ -4043,7 +4018,7 @@ function renderSmartTableMockup(res) {
4043
4018
 
4044
4019
  // Pagination
4045
4020
  html += '<div style="display:flex;justify-content:space-between;align-items:center;padding:0.75rem 0;font-size:0.8rem;color:var(--text-muted);">';
4046
- html += '<span>1-4 sur 24 resultats</span>';
4021
+ html += '<span>1-4 sur 24 résultats</span>';
4047
4022
  html += '<div style="display:flex;gap:0.3rem;">';
4048
4023
  html += '<span class="mock-btn" style="background:var(--primary);font-size:0.75rem;padding:0.2rem 0.5rem;">1</span>';
4049
4024
  html += '<span class="mock-btn" style="background:var(--bg-hover);font-size:0.75rem;padding:0.2rem 0.5rem;">2</span>';
@@ -4059,7 +4034,7 @@ function renderSmartFormMockup(res) {
4059
4034
  if (tabs.length === 0 && res.fields) {
4060
4035
  tabs = [{ label: 'Informations', fields: res.fields }];
4061
4036
  }
4062
- if (tabs.length === 0) return '<div style="padding:2rem;text-align:center;color:var(--text-muted);">Formulaire sans champs definis</div>';
4037
+ if (tabs.length === 0) return '<div style="padding:2rem;text-align:center;color:var(--text-muted);">Formulaire sans champs définis</div>';
4063
4038
 
4064
4039
  var html = '';
4065
4040
 
@@ -4167,7 +4142,7 @@ function renderSmartCardMockup(res) {
4167
4142
 
4168
4143
  /* ---------- SmartKanban ---------- */
4169
4144
  function renderSmartKanbanMockup(res) {
4170
- var options = res.options || res.columns || ['A faire', 'En cours', 'Termine'];
4145
+ var options = res.options || res.columns || ['À faire', 'En cours', 'Terminé'];
4171
4146
  var html = '<div class="mock-header"><span class="mock-title">' + (res.label || 'Kanban') + '</span></div>';
4172
4147
  html += '<div style="display:flex;gap:1rem;overflow-x:auto;padding-bottom:0.5rem;">';
4173
4148
 
@@ -4179,7 +4154,7 @@ function renderSmartKanbanMockup(res) {
4179
4154
  html += '</div>';
4180
4155
  for (var j = 0; j < Math.max(1, 3 - ci); j++) {
4181
4156
  html += '<div style="background:var(--bg-card);border:1px solid var(--border);border-radius:6px;padding:0.5rem;margin-bottom:0.5rem;font-size:0.8rem;">';
4182
- html += '<div style="color:var(--text-bright);font-weight:500;">Element ' + (j + 1) + '</div>';
4157
+ html += '<div style="color:var(--text-bright);font-weight:500;">Élément ' + (j + 1) + '</div>';
4183
4158
  html += '<div style="color:var(--text-muted);font-size:0.7rem;margin-top:0.25rem;">Description...</div>';
4184
4159
  html += '</div>';
4185
4160
  }
@@ -4293,10 +4268,10 @@ function renderHandoffStats() {
4293
4268
  container.innerHTML = `
4294
4269
  <div class="stat-card"><div class="stat-value">${data.modules.length}</div><div class="stat-label">Domaines fonctionnels</div></div>
4295
4270
  <div class="stat-card"><div class="stat-value">${totalUCs}</div><div class="stat-label">Cas d'utilisation</div></div>
4296
- <div class="stat-card"><div class="stat-value">${totalBRs}</div><div class="stat-label">Regles metier</div></div>
4297
- <div class="stat-card"><div class="stat-value">${totalEnts}</div><div class="stat-label">Types de donnees</div></div>
4271
+ <div class="stat-card"><div class="stat-value">${totalBRs}</div><div class="stat-label">Règles métier</div></div>
4272
+ <div class="stat-card"><div class="stat-value">${totalEnts}</div><div class="stat-label">Types de données</div></div>
4298
4273
  <div class="stat-card"><div class="stat-value">${totalStakeholders}</div><div class="stat-label">Profils utilisateurs</div></div>
4299
- <div class="stat-card"><div class="stat-value">${data.dependencies.length}</div><div class="stat-label">Dependances</div></div>
4274
+ <div class="stat-card"><div class="stat-value">${data.dependencies.length}</div><div class="stat-label">Dépendances</div></div>
4300
4275
  <div class="stat-card"><div class="stat-value">${data.consolidation.e2eFlows.length}</div><div class="stat-label">Parcours bout en bout</div></div>
4301
4276
  `;
4302
4277
  }
@@ -4322,10 +4297,9 @@ function renderHandoffModules() {
4322
4297
  </div>
4323
4298
  <div style="display:flex;gap:1rem;font-size:0.75rem;color:var(--text-muted);">
4324
4299
  <span>${(spec.useCases || []).length} cas d'utilisation</span>
4325
- <span>${(spec.businessRules || []).length} regles</span>
4326
- <span>${(spec.entities || []).length} donnees</span>
4300
+ <span>${(spec.businessRules || []).length} règles</span>
4301
+ <span>${(spec.entities || []).length} données</span>
4327
4302
  </div>
4328
- <span class="priority priority-${m.priority === 'must' ? 'vital' : m.priority === 'should' ? 'important' : 'optional'}">${formatModulePriority(m.priority)}</span>
4329
4303
  </div>
4330
4304
  </div>`;
4331
4305
  }).join('');
@@ -4335,23 +4309,21 @@ function renderCoverageMatrix() {
4335
4309
  const container = document.getElementById('coverageMatrix');
4336
4310
  if (!container) return;
4337
4311
 
4338
- const allScope = ['vital', 'important', 'optional'].flatMap(p =>
4339
- (data.cadrage.scope[p] || []).map(item => ({ ...item, priority: p }))
4340
- );
4312
+ const allScope = (data.cadrage.scope.inscope || []).map(item => ({ ...item, priority: 'inscope' }));
4341
4313
 
4342
4314
  if (allScope.length === 0) {
4343
- container.innerHTML = '<p style="color:var(--text-muted);font-style:italic;">Aucun element de perimetre defini dans le cadrage.</p>';
4315
+ container.innerHTML = '<p style="color:var(--text-muted);font-style:italic;">Aucun élément de périmètre défini dans le cadrage.</p>';
4344
4316
  return;
4345
4317
  }
4346
4318
 
4347
4319
  container.innerHTML = `
4348
4320
  <table class="mock-table" style="background:var(--bg-card);border-radius:8px;overflow:hidden;">
4349
- <thead><tr><th>Besoin</th><th>Priorite</th><th>Domaine</th><th>Couvert</th></tr></thead>
4321
+ <thead><tr><th>Besoin</th><th>Périmètre</th><th>Domaine</th><th>Couvert</th></tr></thead>
4350
4322
  <tbody>
4351
4323
  ${allScope.map(item => {
4352
4324
  const moduleName = item.module
4353
4325
  ? (data.modules.find(m => m.code === item.module)?.name || item.module)
4354
- : (data.modules.length > 0 ? data.modules.map(m => m.name).join(', ') : 'A definir');
4326
+ : (data.modules.length > 0 ? data.modules.map(m => m.name).join(', ') : 'À définir');
4355
4327
  return `
4356
4328
  <tr>
4357
4329
  <td>${item.name}</td>
@@ -4376,11 +4348,11 @@ function autoSave() {
4376
4348
 
4377
4349
  function saveToLocalStorage() {
4378
4350
  autoSave();
4379
- showNotification('Modifications sauvegardees');
4351
+ showNotification('Modifications sauvegardées');
4380
4352
  }
4381
4353
 
4382
4354
  function resetToEmbedded() {
4383
- if (!confirm('Reinitialiser toutes les donnees depuis la version d\'origine ? Vos modifications locales (commentaires, notes) seront perdues.')) return;
4355
+ if (!confirm('Réinitialiser toutes les données depuis la version d\'origine ? Vos modifications locales (commentaires, notes) seront perdues.')) return;
4384
4356
  localStorage.removeItem(APP_KEY);
4385
4357
  // Restore data from ORIGINAL_DATA
4386
4358
  Object.keys(data).forEach(k => delete data[k]);
@@ -4398,7 +4370,7 @@ function resetToEmbedded() {
4398
4370
  renderE2EFlows();
4399
4371
  updateCounts();
4400
4372
  renderReviewPanel();
4401
- showNotification('Donnees reinitialisees depuis la version d\'origine');
4373
+ showNotification('Données réinitialisées depuis la version d\'origine');
4402
4374
  }
4403
4375
 
4404
4376
  function loadFromLocalStorage() {
@@ -4565,7 +4537,7 @@ function exportJSON() {
4565
4537
  a.download = (data.metadata.applicationId || 'analyse') + '-export.json';
4566
4538
  a.click();
4567
4539
  URL.revokeObjectURL(url);
4568
- showNotification('Export JSON telecharge');
4540
+ showNotification('Export JSON téléchargé');
4569
4541
  }
4570
4542
 
4571
4543
  /* ============================================
@@ -4668,7 +4640,7 @@ function saveReviewJSON() {
4668
4640
  a.download = 'ba-review.json';
4669
4641
  a.click();
4670
4642
  URL.revokeObjectURL(url);
4671
- showNotification('ba-review.json telecharge — sauvegardez-le a cote du HTML');
4643
+ showNotification('ba-review.json téléchargé — sauvegardez-le à côté du HTML');
4672
4644
  }
4673
4645
 
4674
4646
 
@@ -4723,7 +4695,7 @@ function initInlineComments() {
4723
4695
  });
4724
4696
 
4725
4697
  // Scope items
4726
- ['scopeVital', 'scopeImportant', 'scopeOptional', 'scopeExcluded'].forEach(function(containerId) {
4698
+ ['scopeInScope', 'scopeOutOfScope'].forEach(function(containerId) {
4727
4699
  var container = document.getElementById(containerId);
4728
4700
  if (!container) return;
4729
4701
  container.querySelectorAll('.uc-item').forEach(function(item, index) {
@@ -4796,11 +4768,11 @@ function renderCommentItems(sectionId, cardIndex) {
4796
4768
  <span class="comment-author">${c.author || 'Utilisateur'}</span>
4797
4769
  <span class="comment-date">${date}</span>
4798
4770
  <span class="comment-category comment-category-${c.category}">${c.category}</span>
4799
- <span class="comment-status comment-status-${c.status}">${c.status === 'validated' ? 'Valide' : 'A revoir'}</span>
4771
+ <span class="comment-status comment-status-${c.status}">${c.status === 'validated' ? 'Validé' : 'À revoir'}</span>
4800
4772
  </div>
4801
4773
  <div class="comment-text">${c.content}</div>
4802
4774
  <div class="comment-actions">
4803
- <button class="comment-action-btn" onclick="toggleCommentStatus(${globalIndex})">${c.status === 'validated' ? 'Remettre a revoir' : 'Valider'}</button>
4775
+ <button class="comment-action-btn" onclick="toggleCommentStatus(${globalIndex})">${c.status === 'validated' ? 'Remettre à revoir' : 'Valider'}</button>
4804
4776
  <button class="comment-action-btn" onclick="deleteComment(${globalIndex})" style="color:var(--error);">Supprimer</button>
4805
4777
  </div>
4806
4778
  </div>
@@ -4960,8 +4932,8 @@ function renderReviewPanel() {
4960
4932
  <div class="review-comment-actions">
4961
4933
  <button class="review-action-btn ${c.status === 'validated' ? 'reject' : 'validate'}"
4962
4934
  onclick="event.stopPropagation();toggleCommentStatus(${globalIndex})"
4963
- title="${c.status === 'validated' ? 'Remettre a revoir' : 'Valider'}">
4964
- ${c.status === 'validated' ? 'A revoir' : 'Valider'}
4935
+ title="${c.status === 'validated' ? 'Remettre à revoir' : 'Valider'}">
4936
+ ${c.status === 'validated' ? 'À revoir' : 'Valider'}
4965
4937
  </button>
4966
4938
  <button class="review-action-btn delete"
4967
4939
  onclick="event.stopPropagation();deleteComment(${globalIndex})"
@@ -4979,14 +4951,14 @@ function getSectionLabel(sectionId) {
4979
4951
  const labels = {
4980
4952
  'cadrage-context': 'Contexte',
4981
4953
  'cadrage-stakeholders': 'Parties prenantes',
4982
- 'cadrage-scope': 'Perimetre',
4983
- 'cadrage-success': 'Criteres',
4954
+ 'cadrage-scope': 'Périmètre',
4955
+ 'cadrage-success': 'Critères',
4984
4956
  'decomp-modules': 'Domaines',
4985
- 'decomp-dependencies': 'Dependances',
4957
+ 'decomp-dependencies': 'Dépendances',
4986
4958
  'consol-interactions': 'Interactions',
4987
- 'consol-permissions': 'Acces',
4959
+ 'consol-permissions': 'Accès',
4988
4960
  'consol-flows': 'Parcours',
4989
- 'handoff-summary': 'Synthese'
4961
+ 'handoff-summary': 'Synthèse'
4990
4962
  };
4991
4963
  if (labels[sectionId]) return labels[sectionId];
4992
4964
  if (sectionId.startsWith('module-spec-')) {
@@ -5004,7 +4976,7 @@ function getSectionLabel(sectionId) {
5004
4976
  // Handle list-based sectionIds (ucList-*, brList-*, entList-*)
5005
4977
  const listMatch = sectionId.match(/^(uc|br|ent)List-(.+)$/);
5006
4978
  if (listMatch) {
5007
- const tabLabels = { uc: 'Cas d\'utilisation', br: 'Regles metier', ent: 'Donnees' };
4979
+ const tabLabels = { uc: 'Cas d\'utilisation', br: 'Règles métier', ent: 'Données' };
5008
4980
  const mod = data.modules.find(m => m.code === listMatch[2]);
5009
4981
  const modName = mod ? mod.name : listMatch[2];
5010
4982
  return modName + ' > ' + (tabLabels[listMatch[1]] || listMatch[1]);