@atlashub/smartstack-cli 4.29.0 → 4.30.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.
- package/.documentation/business-analyse.html +217 -0
- package/package.json +1 -1
- package/templates/skills/ba-generate-html/html/ba-interactive.html +207 -199
- package/templates/skills/ba-generate-html/html/src/partials/cadrage-context.html +9 -9
- package/templates/skills/ba-generate-html/html/src/partials/cadrage-scope.html +15 -15
- package/templates/skills/ba-generate-html/html/src/partials/cadrage-stakeholders.html +7 -7
- package/templates/skills/ba-generate-html/html/src/partials/cadrage-success.html +13 -13
- package/templates/skills/ba-generate-html/html/src/partials/consol-datamodel.html +4 -4
- package/templates/skills/ba-generate-html/html/src/partials/consol-flows.html +5 -5
- package/templates/skills/ba-generate-html/html/src/partials/consol-interactions.html +2 -2
- package/templates/skills/ba-generate-html/html/src/partials/consol-permissions.html +4 -4
- package/templates/skills/ba-generate-html/html/src/partials/decomp-dependencies.html +11 -11
- package/templates/skills/ba-generate-html/html/src/partials/decomp-modules.html +9 -9
- package/templates/skills/ba-generate-html/html/src/partials/handoff-summary.html +5 -5
- package/templates/skills/ba-generate-html/html/src/scripts/01-data-init.js +10 -2
- package/templates/skills/ba-generate-html/html/src/scripts/02-navigation.js +10 -10
- package/templates/skills/ba-generate-html/html/src/scripts/03-render-cadrage.js +1 -1
- package/templates/skills/ba-generate-html/html/src/scripts/04-render-modules.js +4 -4
- package/templates/skills/ba-generate-html/html/src/scripts/05-render-specs.js +57 -57
- package/templates/skills/ba-generate-html/html/src/scripts/06-render-consolidation.js +4 -4
- package/templates/skills/ba-generate-html/html/src/scripts/06-render-mockups.js +5 -5
- package/templates/skills/ba-generate-html/html/src/scripts/07-render-handoff.js +8 -8
- package/templates/skills/ba-generate-html/html/src/scripts/08-editing.js +3 -3
- package/templates/skills/ba-generate-html/html/src/scripts/09-export.js +2 -2
- package/templates/skills/ba-generate-html/html/src/scripts/10-comments.js +2 -2
- package/templates/skills/ba-generate-html/html/src/scripts/11-review-panel.js +8 -8
- package/templates/skills/ba-generate-html/html/src/styles/03-navigation.css +1 -1
- package/templates/skills/ba-generate-html/html/src/template.html +92 -92
- package/templates/skills/ba-generate-html/steps/step-02-build-data.md +5 -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
|
|
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;">
|
|
9
|
-
<div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel
|
|
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>
|
|
12
|
-
<div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="
|
|
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="
|
|
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
|
|
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>
|
|
30
|
-
<div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="
|
|
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,49 @@
|
|
|
1
|
-
<!-- SECTION:
|
|
1
|
+
<!-- SECTION: Périmètre fonctionnel -->
|
|
2
2
|
<div class="section" id="cadrage-scope" style="display:none;">
|
|
3
|
-
<h2 class="section-title">
|
|
4
|
-
<p class="section-subtitle">Ce que le
|
|
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, par ordre de priorité.</p>
|
|
5
5
|
|
|
6
6
|
<h3 style="color: var(--text-bright); font-size: 1rem; margin-bottom: 0.75rem;">
|
|
7
|
-
<span style="color: #f87171;">■</span>
|
|
7
|
+
<span style="color: #f87171;">■</span> Fonctionnalités indispensables
|
|
8
8
|
</h3>
|
|
9
9
|
<div id="scopeVital" class="uc-list"></div>
|
|
10
|
-
<button class="add-btn" onclick="toggleForm('addScopeForm-vital')">+ Ajouter une
|
|
10
|
+
<button class="add-btn" onclick="toggleForm('addScopeForm-vital')">+ Ajouter une fonctionnalité indispensable</button>
|
|
11
11
|
<div class="inline-form" id="addScopeForm-vital">
|
|
12
|
-
<div class="form-group"><label class="form-label">Nom de la
|
|
12
|
+
<div class="form-group"><label class="form-label">Nom de la fonctionnalité</label><input type="text" class="form-input" id="scope-name-vital" placeholder="Ex: Gestion des commandes"></div>
|
|
13
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
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>
|
|
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;">■</span>
|
|
18
|
+
<span style="color: #facc15;">■</span> Fonctionnalités importantes
|
|
19
19
|
</h3>
|
|
20
20
|
<div id="scopeImportant" class="uc-list"></div>
|
|
21
|
-
<button class="add-btn" onclick="toggleForm('addScopeForm-important')">+ Ajouter une
|
|
21
|
+
<button class="add-btn" onclick="toggleForm('addScopeForm-important')">+ Ajouter une fonctionnalité importante</button>
|
|
22
22
|
<div class="inline-form" id="addScopeForm-important">
|
|
23
|
-
<div class="form-group"><label class="form-label">Nom de la
|
|
23
|
+
<div class="form-group"><label class="form-label">Nom de la fonctionnalité</label><input type="text" class="form-input" id="scope-name-important" placeholder="Ex: Export PDF"></div>
|
|
24
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
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
26
|
</div>
|
|
27
27
|
|
|
28
28
|
<h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
|
|
29
|
-
<span style="color: #4ade80;">■</span>
|
|
29
|
+
<span style="color: #4ade80;">■</span> Fonctionnalités optionnelles
|
|
30
30
|
</h3>
|
|
31
31
|
<div id="scopeOptional" class="uc-list"></div>
|
|
32
|
-
<button class="add-btn" onclick="toggleForm('addScopeForm-optional')">+ Ajouter une
|
|
32
|
+
<button class="add-btn" onclick="toggleForm('addScopeForm-optional')">+ Ajouter une fonctionnalité optionnelle</button>
|
|
33
33
|
<div class="inline-form" id="addScopeForm-optional">
|
|
34
|
-
<div class="form-group"><label class="form-label">Nom de la
|
|
34
|
+
<div class="form-group"><label class="form-label">Nom de la fonctionnalité</label><input type="text" class="form-input" id="scope-name-optional" placeholder="Ex: Calendrier partagé"></div>
|
|
35
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
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
37
|
</div>
|
|
38
38
|
|
|
39
39
|
<h3 style="color: var(--text-bright); font-size: 1rem; margin: 1.5rem 0 0.75rem;">
|
|
40
|
-
<span style="color: #94a3b8;">■</span> Hors
|
|
40
|
+
<span style="color: #94a3b8;">■</span> Hors périmètre
|
|
41
41
|
</h3>
|
|
42
42
|
<div id="scopeExcluded" class="uc-list"></div>
|
|
43
43
|
<button class="add-btn" onclick="toggleForm('addScopeForm-excluded')">+ Ajouter une exclusion</button>
|
|
44
44
|
<div class="inline-form" id="addScopeForm-excluded">
|
|
45
|
-
<div class="form-group"><label class="form-label"
|
|
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
|
|
45
|
+
<div class="form-group"><label class="form-label">Élément hors périmètre</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 périmètre"></div>
|
|
47
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>
|
|
48
48
|
</div>
|
|
49
49
|
</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
|
|
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">
|
|
24
|
-
<textarea class="form-textarea" id="sh-tasks" placeholder="
|
|
23
|
+
<label class="form-label">Tâches principales (une par ligne)</label>
|
|
24
|
+
<textarea class="form-textarea" id="sh-tasks" placeholder="Tâche 1 Tâche 2 Tâche 3"></textarea>
|
|
25
25
|
</div>
|
|
26
26
|
<div class="form-row">
|
|
27
27
|
<div class="form-group">
|
|
28
|
-
<label class="form-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'
|
|
37
|
+
<label class="form-label">Niveau d'accès</label>
|
|
38
38
|
<select class="form-select" id="sh-access">
|
|
39
|
-
<option value="admin">Administration
|
|
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
|
|
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:
|
|
1
|
+
<!-- SECTION: Critères de réussite -->
|
|
2
2
|
<div class="section" id="cadrage-success" style="display:none;">
|
|
3
|
-
<h2 class="section-title">
|
|
4
|
-
<p class="section-subtitle">Comment mesurer objectivement que le projet est un
|
|
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">
|
|
8
|
-
<div class="editable" contenteditable="true" data-field="success.definition" data-placeholder="Comment saurez-vous que le projet est un
|
|
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
|
|
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">
|
|
18
|
-
<div class="editable" contenteditable="true" data-field="success.timeline" data-placeholder="Au bout de combien de temps pourrez-vous juger si
|
|
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
|
|
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;">
|
|
27
|
-
<p style="font-size:0.85rem;color:var(--text-muted);margin-bottom:1rem;">
|
|
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
|
|
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">
|
|
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:
|
|
1
|
+
<!-- SECTION: Modèle de données -->
|
|
2
2
|
<div class="section" id="consol-datamodel" style="display:none;">
|
|
3
|
-
<h2 class="section-title">
|
|
4
|
-
<p class="section-subtitle">Vue d'ensemble de toutes les
|
|
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
|
|
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
|
|
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
|
|
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"
|
|
18
|
-
<textarea class="form-textarea" id="flow-steps" placeholder="Clients - Le client existe dans le
|
|
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 Commandes - Créer la commande Commandes - Valider la commande 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 (
|
|
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
|
|
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
|
|
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:
|
|
1
|
+
<!-- SECTION: Cohérence des accès -->
|
|
2
2
|
<div class="section" id="consol-permissions" style="display:none;">
|
|
3
|
-
<h2 class="section-title">
|
|
4
|
-
<p class="section-subtitle">
|
|
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
|
|
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:
|
|
1
|
+
<!-- SECTION: Dépendances -->
|
|
2
2
|
<div class="section" id="decomp-dependencies" style="display:none;">
|
|
3
|
-
<h2 class="section-title">
|
|
4
|
-
<p class="section-subtitle">Indiquez quels domaines
|
|
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
|
|
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
|
|
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">...
|
|
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
|
|
26
|
-
<input type="text" class="form-input" id="dep-desc" placeholder="Exemple : La commande
|
|
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
|
|
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
|
|
35
|
-
<p class="section-subtitle">Les domaines sont
|
|
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
|
|
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,21 +17,21 @@
|
|
|
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
|
|
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
|
|
27
|
-
<option value="workflow">Processus
|
|
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">
|
|
30
|
-
<option value="full-module">Domaine complet (
|
|
29
|
+
<option value="integration">Intégration avec des systèmes externes</option>
|
|
30
|
+
<option value="full-module">Domaine complet (données + processus + rapports)</option>
|
|
31
31
|
</select>
|
|
32
32
|
</div>
|
|
33
33
|
<div class="form-group">
|
|
34
|
-
<label class="form-label">
|
|
34
|
+
<label class="form-label">Priorité</label>
|
|
35
35
|
<select class="form-select" id="mod-priority">
|
|
36
36
|
<option value="must">Indispensable</option>
|
|
37
37
|
<option value="should">Important</option>
|
|
@@ -40,8 +40,8 @@
|
|
|
40
40
|
</div>
|
|
41
41
|
</div>
|
|
42
42
|
<div class="form-group">
|
|
43
|
-
<label class="form-label">Principales
|
|
44
|
-
<textarea class="form-textarea" id="mod-entities" placeholder="Commande Ligne de commande Facture"></textarea>
|
|
43
|
+
<label class="form-label">Principales données gérées (une par ligne)</label>
|
|
44
|
+
<textarea class="form-textarea" id="mod-entities" placeholder="Principales données gérées Commande Ligne de commande Facture"></textarea>
|
|
45
45
|
</div>
|
|
46
46
|
<div class="form-actions">
|
|
47
47
|
<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">
|
|
3
|
-
<p class="section-subtitle">Vue d'ensemble de toute l'analyse
|
|
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
|
|
21
|
-
<p style="color:var(--text-muted);font-size:0.85rem;margin-bottom:1rem;">Exportez le fichier JSON pour lancer la
|
|
22
|
-
<button class="btn btn-primary" onclick="exportJSON()" style="font-size:0.9rem;padding:0.6rem 1.5rem;">Exporter l'analyse
|
|
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>
|
|
@@ -71,6 +71,14 @@ data.moduleSpecs = data.moduleSpecs || {};
|
|
|
71
71
|
}
|
|
72
72
|
});
|
|
73
73
|
|
|
74
|
+
// Defensive: normalize stakeholder tasks (string → array)
|
|
75
|
+
(data.cadrage.stakeholders || []).forEach(function(s) {
|
|
76
|
+
if (typeof s.tasks === 'string') {
|
|
77
|
+
s.tasks = s.tasks.split(',').map(t => t.trim()).filter(Boolean);
|
|
78
|
+
}
|
|
79
|
+
s.tasks = s.tasks || [];
|
|
80
|
+
});
|
|
81
|
+
|
|
74
82
|
// Vibe coding mode: hide non-relevant sections
|
|
75
83
|
const isVibeCoding = data.metadata?.vibeCoding === true;
|
|
76
84
|
if (isVibeCoding) {
|
|
@@ -123,7 +131,7 @@ function formatAccess(a) {
|
|
|
123
131
|
}
|
|
124
132
|
|
|
125
133
|
function formatPriority(p) {
|
|
126
|
-
return { vital: 'Indispensable', important: 'Important', optional: 'Optionnel', excluded: 'Hors
|
|
134
|
+
return { vital: 'Indispensable', important: 'Important', optional: 'Optionnel', excluded: 'Hors périmètre' }[p] || p;
|
|
127
135
|
}
|
|
128
136
|
|
|
129
137
|
function formatLevel(l) {
|
|
@@ -131,7 +139,7 @@ function formatLevel(l) {
|
|
|
131
139
|
}
|
|
132
140
|
|
|
133
141
|
function formatModuleType(t) {
|
|
134
|
-
return { 'data-centric': '
|
|
142
|
+
return { 'data-centric': 'Données', 'workflow': 'Processus', 'reporting': 'Rapports', 'integration': 'Intégration', 'full-module': 'Complet' }[t] || t;
|
|
135
143
|
}
|
|
136
144
|
|
|
137
145
|
function formatModulePriority(p) {
|
|
@@ -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', '
|
|
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', '
|
|
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', '
|
|
116
|
-
renderNavItem('cadrage-success', '
|
|
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', '
|
|
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', '
|
|
134
|
+
return renderNavItem('consol-datamodel', 'Modèle de données', totalEntities) +
|
|
135
135
|
renderNavItem('consol-interactions', 'Interactions') +
|
|
136
|
-
renderNavItem('consol-permissions', '
|
|
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', '
|
|
168
|
-
html += renderModuleTabNavItem(code, 'ent', '
|
|
169
|
-
html += renderModuleTabNavItem(code, 'perm', 'Droits d\'
|
|
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
|
|
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>
|
|
@@ -62,11 +62,11 @@ function renderModules() {
|
|
|
62
62
|
<div class="module-card-desc">${m.description || ''}</div>
|
|
63
63
|
<div class="module-card-meta">
|
|
64
64
|
<span class="priority priority-${m.priority === 'must' ? 'vital' : m.priority === 'should' ? 'important' : 'optional'}">${formatModulePriority(m.priority)}</span>
|
|
65
|
-
<span>${(m.entities || []).length}
|
|
65
|
+
<span>${(m.entities || []).length} données</span>
|
|
66
66
|
<span>${(data.moduleSpecs[m.code]?.useCases || []).length} cas d'utilisation</span>
|
|
67
67
|
</div>
|
|
68
68
|
</div>
|
|
69
|
-
`).join('') || '<p style="color:var(--text-muted);text-align:center;padding:2rem;grid-column:1/-1;">Aucun domaine fonctionnel
|
|
69
|
+
`).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>';
|
|
70
70
|
}
|
|
71
71
|
|
|
72
72
|
function updateModulesNav() {
|
|
@@ -139,7 +139,7 @@ function renderDepGraph() {
|
|
|
139
139
|
|
|
140
140
|
const layers = computeTopologicalLayers();
|
|
141
141
|
if (!layers) {
|
|
142
|
-
graph.innerHTML = '<p style="color:var(--error);text-align:center;padding:1rem;">
|
|
142
|
+
graph.innerHTML = '<p style="color:var(--error);text-align:center;padding:1rem;">Dépendance circulaire détectée ! Corrigez les dépendances.</p>';
|
|
143
143
|
return;
|
|
144
144
|
}
|
|
145
145
|
|
|
@@ -196,7 +196,7 @@ function renderProcessingOrder() {
|
|
|
196
196
|
const m = data.modules.find(mod => mod.code === code);
|
|
197
197
|
return `
|
|
198
198
|
<div class="process-step">
|
|
199
|
-
<div class="process-step-number"
|
|
199
|
+
<div class="process-step-number">Étape ${i + 1}</div>
|
|
200
200
|
<div class="process-step-label">${m ? (m.name || m.code) : code}</div>
|
|
201
201
|
</div>
|
|
202
202
|
${i < order.length - 1 ? '<div class="process-arrow">→</div>' : ''}
|