@atlashub/smartstack-cli 3.17.0 → 3.19.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/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/agents/gitflow/start.md +2 -2
- package/templates/skills/business-analyse/SKILL.md +5 -5
- package/templates/skills/business-analyse/_shared.md +46 -20
- package/templates/skills/business-analyse/html/ba-interactive.html +57 -107
- package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +13 -0
- package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +1 -1
- package/templates/skills/business-analyse/html/src/scripts/03-render-cadrage.js +11 -20
- package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +1 -3
- package/templates/skills/business-analyse/html/src/template.html +31 -83
- package/templates/skills/business-analyse/patterns/suggestion-catalog.md +71 -3
- package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +11 -8
- package/templates/skills/business-analyse/references/cadrage-structure-cards.md +7 -5
- package/templates/skills/business-analyse/references/deploy-data-build.md +42 -14
- package/templates/skills/business-analyse/references/deploy-modes.md +1 -1
- package/templates/skills/business-analyse/references/entity-architecture-decision.md +218 -0
- package/templates/skills/business-analyse/references/robustness-checks.md +2 -1
- package/templates/skills/business-analyse/references/spec-auto-inference.md +70 -16
- package/templates/skills/business-analyse/references/ui-resource-cards.md +149 -0
- package/templates/skills/business-analyse/steps/step-00-init.md +23 -5
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +220 -32
- package/templates/skills/business-analyse/steps/step-02-decomposition.md +35 -26
- package/templates/skills/business-analyse/steps/step-03a1-setup.md +122 -32
- package/templates/skills/business-analyse/steps/step-03a2-analysis.md +8 -0
- package/templates/skills/business-analyse/steps/step-03b-ui.md +68 -5
- package/templates/skills/business-analyse/steps/step-03d-validate.md +34 -1
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +99 -2
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +44 -8
- package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +226 -41
- package/templates/skills/business-analyse/steps/step-06-review.md +2 -1
- package/templates/skills/business-analyse/templates/tpl-handoff.md +5 -4
- package/templates/skills/business-analyse/templates/tpl-launch-displays.md +4 -1
- package/templates/skills/business-analyse/templates-frd.md +5 -4
- package/templates/skills/gitflow/references/start-local-config.md +6 -3
- package/templates/skills/gitflow/steps/step-start.md +2 -2
- package/templates/skills/ralph-loop/SKILL.md +41 -1
- package/templates/skills/ralph-loop/references/category-rules.md +96 -2
- package/templates/skills/ralph-loop/references/compact-loop.md +85 -24
- package/templates/skills/ralph-loop/steps/step-00-init.md +30 -54
- package/templates/skills/ralph-loop/steps/step-01-task.md +102 -1
- package/templates/skills/ralph-loop/steps/step-04-check.md +87 -40
package/package.json
CHANGED
|
@@ -70,8 +70,8 @@ git fetch origin $FULL_BRANCH:refs/remotes/origin/$FULL_BRANCH --force --quiet
|
|
|
70
70
|
- Add `Local` profile to `launchSettings.json`
|
|
71
71
|
|
|
72
72
|
**Frontend (web project detected):**
|
|
73
|
-
- Create `.env.
|
|
74
|
-
- Add `npm run local` script if missing
|
|
73
|
+
- Create `.env.standalone` pointing to the API port (Vite 7+ forbids "local" as mode name)
|
|
74
|
+
- Add `npm run local` script if missing (uses `--mode standalone`)
|
|
75
75
|
|
|
76
76
|
**Port allocation:** Hash branch name for unique ports (API: 5200+, Web: 5300+)
|
|
77
77
|
|
|
@@ -209,7 +209,7 @@ When step-00 detects that the description matches an existing application:
|
|
|
209
209
|
| 04c | `steps/step-04c-decide.md` | Opus | Final approval, write consolidation, proceed to handoff |
|
|
210
210
|
| 05a | `steps/step-05a-handoff.md` | Sonnet | Handoff: file mapping (7 categories), BR-to-code mapping, API summary, write handoff |
|
|
211
211
|
| 05b | `steps/step-05b-deploy.md` | Sonnet | Deploy: prd.json, progress.txt, manifest, ba-interactive.html |
|
|
212
|
-
| 05c | `steps/step-05c-ralph-readiness.md` |
|
|
212
|
+
| 05c | `steps/step-05c-ralph-readiness.md` | Opus | ULTRATHINK quality review + ralph readiness gate (MANDATORY) |
|
|
213
213
|
| 06 | `steps/step-06-review.md` | Opus | Apply review corrections, create new version, regenerate all artifacts |
|
|
214
214
|
|
|
215
215
|
</step_files>
|
|
@@ -252,10 +252,10 @@ Load ONLY relevant categories based on feature type:
|
|
|
252
252
|
| -------- | ----------------------------------- | ------------ |
|
|
253
253
|
| schema | `schemas/feature-schema.json` | All steps |
|
|
254
254
|
| spec | `templates/tpl-frd.md` | 02 |
|
|
255
|
-
| handoff | `templates/tpl-handoff.md` |
|
|
255
|
+
| handoff | `templates/tpl-handoff.md` | 05a |
|
|
256
256
|
| suggestions | `patterns/suggestion-catalog.md` | 01 |
|
|
257
|
-
| interactive | `html/ba-interactive.html` | 03d (incremental),
|
|
258
|
-
| mapping | `references/html-data-mapping.md` | 03d,
|
|
257
|
+
| interactive | `html/ba-interactive.html` | 03d (incremental), 05b (final deploy) |
|
|
258
|
+
| mapping | `references/html-data-mapping.md` | 03d, 05b (FEATURE_DATA + EMBEDDED_ARTIFACTS mapping) |
|
|
259
259
|
|
|
260
260
|
</template_files>
|
|
261
261
|
|
|
@@ -280,7 +280,7 @@ Load ONLY relevant categories based on feature type:
|
|
|
280
280
|
- Each module specified iteratively with client validation
|
|
281
281
|
- ASCII/SVG mockups proposed for each module's sections
|
|
282
282
|
- Cross-module consolidation passed (step-04)
|
|
283
|
-
- Development handoff ready for `/ralph-loop
|
|
283
|
+
- Development handoff ready for `/ralph-loop`
|
|
284
284
|
- Ralph Loop prd.json generated (per module or consolidated)
|
|
285
285
|
- All outputs renderable by SmartStack app viewer at `/docs/business/{app}/`
|
|
286
286
|
</success_criteria>
|
|
@@ -59,16 +59,19 @@ The BA aligns with the SmartStack navigation hierarchy:
|
|
|
59
59
|
Level 1: Context (business)
|
|
60
60
|
Level 2: Application (Sales)
|
|
61
61
|
Level 3: Module (Customers)
|
|
62
|
-
Level 4: Section (list)
|
|
63
|
-
Level 5:
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
62
|
+
Level 4: Section (list) ← sidebar nav
|
|
63
|
+
Level 5: Resource (customer-grid)
|
|
64
|
+
Level 5: Resource (customer-filters)
|
|
65
|
+
Level 4: Section (detail) [hidden] ← reached by row click, route :id
|
|
66
|
+
Level 5: Resource (customer-detail-header)
|
|
67
|
+
Level 5: Resource (customer-detail-tabs)
|
|
68
|
+
Level 5: Resource (customer-info-card)
|
|
69
|
+
Level 5: Resource (customer-orders-grid) ← relation tab
|
|
70
|
+
Level 5: Resource (customer-history) ← audit tab
|
|
67
71
|
Level 3: Module (Orders)
|
|
68
|
-
Level 4: Section (list)
|
|
69
|
-
Level 4: Section (detail)
|
|
70
|
-
Level 4: Section (
|
|
71
|
-
Level 4: Section (approve)
|
|
72
|
+
Level 4: Section (list) ← sidebar nav
|
|
73
|
+
Level 4: Section (detail) [hidden] ← reached by row click
|
|
74
|
+
Level 4: Section (approve) ← sidebar nav (workflow)
|
|
72
75
|
```
|
|
73
76
|
|
|
74
77
|
| BA Phase | Levels treated | What is defined |
|
|
@@ -79,22 +82,45 @@ Level 1: Context (business)
|
|
|
79
82
|
| Consolidation (step-04) | Cross-module | Interactions, permission coherence, E2E flows |
|
|
80
83
|
| Handoff (step-05) | All levels | Implementation mapping, prd.json |
|
|
81
84
|
|
|
82
|
-
### Route
|
|
85
|
+
### Route patterns
|
|
83
86
|
```
|
|
84
|
-
/business/{application}/{module}/{section}
|
|
87
|
+
/business/{application}/{module}/{section} ← sidebar sections (list, dashboard, approve, etc.)
|
|
88
|
+
/business/{application}/{module}/detail/:id ← detail page (hidden from sidebar, reached by row click)
|
|
85
89
|
```
|
|
86
90
|
|
|
91
|
+
**Detail page routing:**
|
|
92
|
+
- The detail page uses a parameterized route with `:id`
|
|
93
|
+
- It is NOT registered as a sidebar navigation entry (`navigation: "hidden"`)
|
|
94
|
+
- It is reached by clicking a row in the `list` section (action: `navigate:detail`)
|
|
95
|
+
- The back button navigates to `/business/{application}/{module}/list`
|
|
96
|
+
- Route MUST be registered in frontend routing (App.tsx) alongside the list route
|
|
97
|
+
|
|
87
98
|
### Standard Sections per Module
|
|
99
|
+
|
|
100
|
+
> **RULE: Sections are functional zones, NOT CRUD operations.**
|
|
101
|
+
> `create` and `edit` are ACTIONS within the `list` page (modal/drawer).
|
|
102
|
+
> `detail` is a page with tabs accessible by clicking a row in `list` (not a standalone nav section).
|
|
103
|
+
|
|
88
104
|
| Section | Purpose | Typical Components |
|
|
89
105
|
|---------|---------|-------------------|
|
|
90
|
-
| `list` | Main entity
|
|
91
|
-
| `detail` |
|
|
92
|
-
| `
|
|
93
|
-
| `
|
|
94
|
-
| `
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
|
|
106
|
+
| `list` | **Main page**: entity grid + create action (modal/drawer) + click to detail | DataGrid, FilterBar, Pagination, CreateForm |
|
|
107
|
+
| `detail` | **Reached from list** (hidden nav, route `:id`): tabbed view of entity details + edit capability | BackButton, DetailHeader, StatusBadge, TabPanel, DetailCard, SmartForm (edit), SmartTable (relations), Timeline (history) |
|
|
108
|
+
| `dashboard` | Module overview/KPIs (if analytics needed) | Charts, StatCards, RecentActivity |
|
|
109
|
+
| `approve` | Approval workflow queue (if validation workflow) | ApprovalPanel, StatusTimeline |
|
|
110
|
+
| `import` | Bulk data import (if volume > 100) | FileUpload, MappingTable, Preview |
|
|
111
|
+
| `rapport` | Module-specific reporting | ReportBuilder, ExportPanel |
|
|
112
|
+
| `planning` | Calendar/planning view (if time-based data) | Calendar, GanttChart, TimelineView |
|
|
113
|
+
|
|
114
|
+
**What is NEVER a section:**
|
|
115
|
+
|
|
116
|
+
| NOT a sidebar section | What it really is |
|
|
117
|
+
|---------------|-------------------|
|
|
118
|
+
| `create` | Action button in `list` page → opens Form in modal/drawer |
|
|
119
|
+
| `edit` | Action in detail page → switches fields to edit mode |
|
|
120
|
+
| `delete` | Action with confirmation dialog in `list` or detail |
|
|
121
|
+
| `search` | FilterBar component integrated in the `list` section |
|
|
122
|
+
|
|
123
|
+
> **Note on `detail`:** The detail page IS a `specification.sections[]` entry (with `navigation: "hidden"`) so it gets a wireframe, resources, and route. But it is NOT shown in the sidebar — it is reached by clicking a row in `list`. Every module with a `list` section MUST have a companion `detail` section.
|
|
98
124
|
|
|
99
125
|
---
|
|
100
126
|
|
|
@@ -148,7 +174,7 @@ docs/
|
|
|
148
174
|
|
|
149
175
|
```
|
|
150
176
|
.ralph/
|
|
151
|
-
prd.json # Task breakdown derived from handoff (for /ralph-loop
|
|
177
|
+
prd.json # Task breakdown derived from handoff (for /ralph-loop)
|
|
152
178
|
progress.txt # Links back to BA feature documents
|
|
153
179
|
logs/
|
|
154
180
|
reports/
|
|
@@ -1515,14 +1515,8 @@ body {
|
|
|
1515
1515
|
<!-- Phase 1 : Cadrage -->
|
|
1516
1516
|
<div class="nav-group">
|
|
1517
1517
|
<div class="nav-group-title">1. Cadrage</div>
|
|
1518
|
-
<a class="nav-item active" onclick="showSection('cadrage-
|
|
1519
|
-
<span class="nav-icon">●</span>
|
|
1520
|
-
</a>
|
|
1521
|
-
<a class="nav-item" onclick="showSection('cadrage-current')" data-section="cadrage-current" data-vibe-hide>
|
|
1522
|
-
<span class="nav-icon">●</span> Situation actuelle
|
|
1523
|
-
</a>
|
|
1524
|
-
<a class="nav-item" onclick="showSection('cadrage-vision')" data-section="cadrage-vision" data-vibe-hide>
|
|
1525
|
-
<span class="nav-icon">●</span> Situation souhaitee
|
|
1518
|
+
<a class="nav-item active" onclick="showSection('cadrage-context')" data-section="cadrage-context">
|
|
1519
|
+
<span class="nav-icon">●</span> Contexte
|
|
1526
1520
|
</a>
|
|
1527
1521
|
<a class="nav-item" onclick="showSection('cadrage-stakeholders')" data-section="cadrage-stakeholders">
|
|
1528
1522
|
<span class="nav-icon">●</span> Parties prenantes
|
|
@@ -1589,84 +1583,38 @@ body {
|
|
|
1589
1583
|
============================================ -->
|
|
1590
1584
|
<main class="main" id="mainContent">
|
|
1591
1585
|
|
|
1592
|
-
<!-- SECTION:
|
|
1593
|
-
<div class="section" id="cadrage-
|
|
1594
|
-
<h2 class="section-title">
|
|
1595
|
-
<p class="section-subtitle">
|
|
1596
|
-
|
|
1597
|
-
<div
|
|
1598
|
-
<div class="card
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1602
|
-
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
</div>
|
|
1606
|
-
|
|
1607
|
-
<div class="card" data-vibe-hide>
|
|
1608
|
-
<div class="card-label">Depuis quand ce probleme existe-t-il ?</div>
|
|
1609
|
-
<div class="editable" contenteditable="true" data-field="problem.history" data-placeholder="Depuis combien de temps ce probleme existe-t-il ? A-t-il empire recemment ?"></div>
|
|
1610
|
-
</div>
|
|
1611
|
-
|
|
1612
|
-
<div class="card">
|
|
1613
|
-
<div class="card-label">Evenement declencheur</div>
|
|
1614
|
-
<div class="editable" contenteditable="true" data-field="problem.trigger" data-placeholder="Qu'est-ce qui a declenche cette demande maintenant ? Pourquoi pas il y a 6 mois ?"></div>
|
|
1615
|
-
</div>
|
|
1616
|
-
|
|
1617
|
-
<div class="card" data-vibe-hide>
|
|
1618
|
-
<div class="card-label">Consequences si le projet n'est pas realise</div>
|
|
1619
|
-
<div class="editable" contenteditable="true" data-field="problem.consequences" data-placeholder="Que se passerait-il si ce projet n'etait PAS realise ? Quelles consequences a court et moyen terme ?"></div>
|
|
1620
|
-
</div>
|
|
1621
|
-
</div>
|
|
1622
|
-
|
|
1623
|
-
<!-- SECTION: Situation actuelle -->
|
|
1624
|
-
<div class="section" id="cadrage-current" style="display:none;" data-vibe-hide>
|
|
1625
|
-
<h2 class="section-title">Situation actuelle</h2>
|
|
1626
|
-
<p class="section-subtitle">Comment les choses se passent aujourd'hui, concretement.</p>
|
|
1627
|
-
|
|
1628
|
-
<div class="card">
|
|
1629
|
-
<div class="card-label">Outils et methodes utilises aujourd'hui</div>
|
|
1630
|
-
<div class="editable" contenteditable="true" data-field="current.tools" data-placeholder="Comment gerez-vous ce sujet aujourd'hui ? Avec quels outils (tableur, email, papier, logiciel) ?"></div>
|
|
1631
|
-
</div>
|
|
1632
|
-
|
|
1633
|
-
<div class="card">
|
|
1634
|
-
<div class="card-label">Processus actuel, etape par etape</div>
|
|
1635
|
-
<div id="processFlow" class="process-flow">
|
|
1636
|
-
<!-- Populated dynamically -->
|
|
1586
|
+
<!-- SECTION: Contexte (merged: problem + current + vision) -->
|
|
1587
|
+
<div class="section" id="cadrage-context">
|
|
1588
|
+
<h2 class="section-title">Contexte du projet</h2>
|
|
1589
|
+
<p class="section-subtitle">Vue synthetique du besoin : probleme, situation actuelle et objectif vise.</p>
|
|
1590
|
+
|
|
1591
|
+
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.5rem;">
|
|
1592
|
+
<div class="card" style="border-left:3px solid #f87171;">
|
|
1593
|
+
<div class="card-label" style="color:#f87171;">Probleme identifie</div>
|
|
1594
|
+
<div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel probleme ce projet doit-il resoudre ?"></div>
|
|
1595
|
+
<div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
|
|
1596
|
+
<strong>Declencheur :</strong>
|
|
1597
|
+
<div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="Evenement declencheur" style="display:inline;"></div>
|
|
1598
|
+
</div>
|
|
1637
1599
|
</div>
|
|
1638
|
-
<button class="add-btn" onclick="addProcessStep()">+ Ajouter une etape au processus</button>
|
|
1639
|
-
</div>
|
|
1640
|
-
|
|
1641
|
-
<div class="card">
|
|
1642
|
-
<div class="card-label">Etapes les plus penibles ou les plus longues</div>
|
|
1643
|
-
<div class="editable" contenteditable="true" data-field="current.painPoints" data-placeholder="Quelles sont les etapes les plus penibles ou les plus longues dans ce processus ?"></div>
|
|
1644
|
-
</div>
|
|
1645
|
-
|
|
1646
|
-
<div class="card">
|
|
1647
|
-
<div class="card-label">Erreurs ou problemes recurrents</div>
|
|
1648
|
-
<div class="editable" contenteditable="true" data-field="current.errors" data-placeholder="Quelles erreurs ou problemes reviennent regulierement ? Donnez 2 a 3 exemples concrets."></div>
|
|
1649
|
-
</div>
|
|
1650
|
-
</div>
|
|
1651
|
-
|
|
1652
|
-
<!-- SECTION: Situation souhaitee -->
|
|
1653
|
-
<div class="section" id="cadrage-vision" style="display:none;" data-vibe-hide>
|
|
1654
|
-
<h2 class="section-title">Situation souhaitee</h2>
|
|
1655
|
-
<p class="section-subtitle">Ce que le client veut obtenir, pas ce qu'il veut construire.</p>
|
|
1656
1600
|
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
</div>
|
|
1601
|
+
<div class="card" style="border-left:3px solid #facc15;">
|
|
1602
|
+
<div class="card-label" style="color:#facc15;">Aujourd'hui</div>
|
|
1603
|
+
<div class="editable" contenteditable="true" data-field="context.currentSituation" data-placeholder="Comment les choses fonctionnent actuellement ?"></div>
|
|
1604
|
+
<div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
|
|
1605
|
+
<strong>Points douleur :</strong>
|
|
1606
|
+
<div class="editable" contenteditable="true" data-field="context.painPoints" data-placeholder="Problemes recurrents" style="display:inline;"></div>
|
|
1607
|
+
</div>
|
|
1608
|
+
</div>
|
|
1666
1609
|
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1610
|
+
<div class="card" style="border-left:3px solid #4ade80;">
|
|
1611
|
+
<div class="card-label" style="color:#4ade80;">Objectif</div>
|
|
1612
|
+
<div class="editable" contenteditable="true" data-field="context.desiredSituation" data-placeholder="Que doit permettre le systeme cible ?"></div>
|
|
1613
|
+
<div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
|
|
1614
|
+
<strong>Criteres :</strong>
|
|
1615
|
+
<div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="Criteres de succes" style="display:inline;"></div>
|
|
1616
|
+
</div>
|
|
1617
|
+
</div>
|
|
1670
1618
|
</div>
|
|
1671
1619
|
</div>
|
|
1672
1620
|
|
|
@@ -2113,6 +2061,19 @@ data.cadrage.risks = data.cadrage.risks || [];
|
|
|
2113
2061
|
data.consolidation = data.consolidation || {};
|
|
2114
2062
|
data.consolidation.e2eFlows = data.consolidation.e2eFlows || [];
|
|
2115
2063
|
|
|
2064
|
+
// Backward compat: merge old problem/current/vision into context
|
|
2065
|
+
if (!data.cadrage.context) {
|
|
2066
|
+
data.cadrage.context = {
|
|
2067
|
+
problem: data.cadrage.problem?.description || data.cadrage.problem || '',
|
|
2068
|
+
trigger: data.cadrage.problem?.trigger || '',
|
|
2069
|
+
currentSituation: data.cadrage.current?.tools || '',
|
|
2070
|
+
desiredSituation: data.cadrage.vision?.changes || '',
|
|
2071
|
+
painPoints: data.cadrage.current?.painPoints || (data.cadrage.stakeholders || []).flatMap(s => (s.frustrations || '').split('\n').filter(Boolean)).join('\n'),
|
|
2072
|
+
acceptanceCriteria: data.cadrage.vision?.results || (data.cadrage.criteria || []).map(c => c.text).join('\n')
|
|
2073
|
+
};
|
|
2074
|
+
}
|
|
2075
|
+
data.cadrage.context = data.cadrage.context || { problem: '', trigger: '', currentSituation: '', desiredSituation: '', painPoints: '', acceptanceCriteria: '' };
|
|
2076
|
+
|
|
2116
2077
|
// Initialize comments array
|
|
2117
2078
|
data.comments = data.comments || [];
|
|
2118
2079
|
|
|
@@ -2233,7 +2194,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
|
|
2233
2194
|
/* ============================================
|
|
2234
2195
|
NAVIGATION
|
|
2235
2196
|
============================================ */
|
|
2236
|
-
let currentSectionId = 'cadrage-
|
|
2197
|
+
let currentSectionId = 'cadrage-context';
|
|
2237
2198
|
|
|
2238
2199
|
function showSection(sectionId) {
|
|
2239
2200
|
currentSectionId = sectionId;
|
|
@@ -2441,27 +2402,18 @@ function renderRisks() {
|
|
|
2441
2402
|
}
|
|
2442
2403
|
|
|
2443
2404
|
/* ============================================
|
|
2444
|
-
|
|
2405
|
+
CONTEXT RENDERING (merged problem/current/vision)
|
|
2445
2406
|
============================================ */
|
|
2446
|
-
function
|
|
2447
|
-
|
|
2448
|
-
|
|
2449
|
-
|
|
2450
|
-
|
|
2451
|
-
|
|
2452
|
-
|
|
2453
|
-
|
|
2454
|
-
|
|
2455
|
-
|
|
2456
|
-
const container = document.getElementById('processFlow');
|
|
2457
|
-
const steps = data.cadrage.current.steps || [];
|
|
2458
|
-
container.innerHTML = steps.map((step, i) => `
|
|
2459
|
-
<div class="process-step">
|
|
2460
|
-
<div class="process-step-number">Etape ${i + 1}</div>
|
|
2461
|
-
<div class="process-step-label">${step}</div>
|
|
2462
|
-
</div>
|
|
2463
|
-
${i < steps.length - 1 ? '<div class="process-arrow">→</div>' : ''}
|
|
2464
|
-
`).join('');
|
|
2407
|
+
function renderContext() {
|
|
2408
|
+
// context fields are handled by initEditableFields() via data-field="context.*"
|
|
2409
|
+
// This function ensures backward compat data is displayed as strings
|
|
2410
|
+
const ctx = data.cadrage.context || {};
|
|
2411
|
+
if (Array.isArray(ctx.painPoints)) {
|
|
2412
|
+
data.cadrage.context.painPoints = ctx.painPoints.join('\n');
|
|
2413
|
+
}
|
|
2414
|
+
if (Array.isArray(ctx.acceptanceCriteria)) {
|
|
2415
|
+
data.cadrage.context.acceptanceCriteria = ctx.acceptanceCriteria.join('\n');
|
|
2416
|
+
}
|
|
2465
2417
|
}
|
|
2466
2418
|
|
|
2467
2419
|
|
|
@@ -4029,9 +3981,7 @@ function renderReviewPanel() {
|
|
|
4029
3981
|
|
|
4030
3982
|
function getSectionLabel(sectionId) {
|
|
4031
3983
|
const labels = {
|
|
4032
|
-
'cadrage-
|
|
4033
|
-
'cadrage-current': 'Situation actuelle',
|
|
4034
|
-
'cadrage-vision': 'Vision',
|
|
3984
|
+
'cadrage-context': 'Contexte',
|
|
4035
3985
|
'cadrage-stakeholders': 'Parties prenantes',
|
|
4036
3986
|
'cadrage-scope': 'Perimetre',
|
|
4037
3987
|
'cadrage-risks': 'Risques',
|
|
@@ -16,6 +16,19 @@ data.cadrage.risks = data.cadrage.risks || [];
|
|
|
16
16
|
data.consolidation = data.consolidation || {};
|
|
17
17
|
data.consolidation.e2eFlows = data.consolidation.e2eFlows || [];
|
|
18
18
|
|
|
19
|
+
// Backward compat: merge old problem/current/vision into context
|
|
20
|
+
if (!data.cadrage.context) {
|
|
21
|
+
data.cadrage.context = {
|
|
22
|
+
problem: data.cadrage.problem?.description || data.cadrage.problem || '',
|
|
23
|
+
trigger: data.cadrage.problem?.trigger || '',
|
|
24
|
+
currentSituation: data.cadrage.current?.tools || '',
|
|
25
|
+
desiredSituation: data.cadrage.vision?.changes || '',
|
|
26
|
+
painPoints: data.cadrage.current?.painPoints || (data.cadrage.stakeholders || []).flatMap(s => (s.frustrations || '').split('\n').filter(Boolean)).join('\n'),
|
|
27
|
+
acceptanceCriteria: data.cadrage.vision?.results || (data.cadrage.criteria || []).map(c => c.text).join('\n')
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
data.cadrage.context = data.cadrage.context || { problem: '', trigger: '', currentSituation: '', desiredSituation: '', painPoints: '', acceptanceCriteria: '' };
|
|
31
|
+
|
|
19
32
|
// Initialize comments array
|
|
20
33
|
data.comments = data.comments || [];
|
|
21
34
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/* ============================================
|
|
2
2
|
NAVIGATION
|
|
3
3
|
============================================ */
|
|
4
|
-
let currentSectionId = 'cadrage-
|
|
4
|
+
let currentSectionId = 'cadrage-context';
|
|
5
5
|
|
|
6
6
|
function showSection(sectionId) {
|
|
7
7
|
currentSectionId = sectionId;
|
|
@@ -184,25 +184,16 @@ function renderRisks() {
|
|
|
184
184
|
}
|
|
185
185
|
|
|
186
186
|
/* ============================================
|
|
187
|
-
|
|
187
|
+
CONTEXT RENDERING (merged problem/current/vision)
|
|
188
188
|
============================================ */
|
|
189
|
-
function
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
const container = document.getElementById('processFlow');
|
|
200
|
-
const steps = data.cadrage.current.steps || [];
|
|
201
|
-
container.innerHTML = steps.map((step, i) => `
|
|
202
|
-
<div class="process-step">
|
|
203
|
-
<div class="process-step-number">Etape ${i + 1}</div>
|
|
204
|
-
<div class="process-step-label">${step}</div>
|
|
205
|
-
</div>
|
|
206
|
-
${i < steps.length - 1 ? '<div class="process-arrow">→</div>' : ''}
|
|
207
|
-
`).join('');
|
|
189
|
+
function renderContext() {
|
|
190
|
+
// context fields are handled by initEditableFields() via data-field="context.*"
|
|
191
|
+
// This function ensures backward compat data is displayed as strings
|
|
192
|
+
const ctx = data.cadrage.context || {};
|
|
193
|
+
if (Array.isArray(ctx.painPoints)) {
|
|
194
|
+
data.cadrage.context.painPoints = ctx.painPoints.join('\n');
|
|
195
|
+
}
|
|
196
|
+
if (Array.isArray(ctx.acceptanceCriteria)) {
|
|
197
|
+
data.cadrage.context.acceptanceCriteria = ctx.acceptanceCriteria.join('\n');
|
|
198
|
+
}
|
|
208
199
|
}
|
|
@@ -100,9 +100,7 @@ function renderReviewPanel() {
|
|
|
100
100
|
|
|
101
101
|
function getSectionLabel(sectionId) {
|
|
102
102
|
const labels = {
|
|
103
|
-
'cadrage-
|
|
104
|
-
'cadrage-current': 'Situation actuelle',
|
|
105
|
-
'cadrage-vision': 'Vision',
|
|
103
|
+
'cadrage-context': 'Contexte',
|
|
106
104
|
'cadrage-stakeholders': 'Parties prenantes',
|
|
107
105
|
'cadrage-scope': 'Perimetre',
|
|
108
106
|
'cadrage-risks': 'Risques',
|
|
@@ -51,14 +51,8 @@
|
|
|
51
51
|
<!-- Phase 1 : Cadrage -->
|
|
52
52
|
<div class="nav-group">
|
|
53
53
|
<div class="nav-group-title">1. Cadrage</div>
|
|
54
|
-
<a class="nav-item active" onclick="showSection('cadrage-
|
|
55
|
-
<span class="nav-icon">●</span>
|
|
56
|
-
</a>
|
|
57
|
-
<a class="nav-item" onclick="showSection('cadrage-current')" data-section="cadrage-current" data-vibe-hide>
|
|
58
|
-
<span class="nav-icon">●</span> Situation actuelle
|
|
59
|
-
</a>
|
|
60
|
-
<a class="nav-item" onclick="showSection('cadrage-vision')" data-section="cadrage-vision" data-vibe-hide>
|
|
61
|
-
<span class="nav-icon">●</span> Situation souhaitee
|
|
54
|
+
<a class="nav-item active" onclick="showSection('cadrage-context')" data-section="cadrage-context">
|
|
55
|
+
<span class="nav-icon">●</span> Contexte
|
|
62
56
|
</a>
|
|
63
57
|
<a class="nav-item" onclick="showSection('cadrage-stakeholders')" data-section="cadrage-stakeholders">
|
|
64
58
|
<span class="nav-icon">●</span> Parties prenantes
|
|
@@ -125,84 +119,38 @@
|
|
|
125
119
|
============================================ -->
|
|
126
120
|
<main class="main" id="mainContent">
|
|
127
121
|
|
|
128
|
-
<!-- SECTION:
|
|
129
|
-
<div class="section" id="cadrage-
|
|
130
|
-
<h2 class="section-title">
|
|
131
|
-
<p class="section-subtitle">
|
|
132
|
-
|
|
133
|
-
<div
|
|
134
|
-
<div class="card
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
</div>
|
|
142
|
-
|
|
143
|
-
<div class="card" data-vibe-hide>
|
|
144
|
-
<div class="card-label">Depuis quand ce probleme existe-t-il ?</div>
|
|
145
|
-
<div class="editable" contenteditable="true" data-field="problem.history" data-placeholder="Depuis combien de temps ce probleme existe-t-il ? A-t-il empire recemment ?"></div>
|
|
146
|
-
</div>
|
|
147
|
-
|
|
148
|
-
<div class="card">
|
|
149
|
-
<div class="card-label">Evenement declencheur</div>
|
|
150
|
-
<div class="editable" contenteditable="true" data-field="problem.trigger" data-placeholder="Qu'est-ce qui a declenche cette demande maintenant ? Pourquoi pas il y a 6 mois ?"></div>
|
|
151
|
-
</div>
|
|
152
|
-
|
|
153
|
-
<div class="card" data-vibe-hide>
|
|
154
|
-
<div class="card-label">Consequences si le projet n'est pas realise</div>
|
|
155
|
-
<div class="editable" contenteditable="true" data-field="problem.consequences" data-placeholder="Que se passerait-il si ce projet n'etait PAS realise ? Quelles consequences a court et moyen terme ?"></div>
|
|
156
|
-
</div>
|
|
157
|
-
</div>
|
|
158
|
-
|
|
159
|
-
<!-- SECTION: Situation actuelle -->
|
|
160
|
-
<div class="section" id="cadrage-current" style="display:none;" data-vibe-hide>
|
|
161
|
-
<h2 class="section-title">Situation actuelle</h2>
|
|
162
|
-
<p class="section-subtitle">Comment les choses se passent aujourd'hui, concretement.</p>
|
|
163
|
-
|
|
164
|
-
<div class="card">
|
|
165
|
-
<div class="card-label">Outils et methodes utilises aujourd'hui</div>
|
|
166
|
-
<div class="editable" contenteditable="true" data-field="current.tools" data-placeholder="Comment gerez-vous ce sujet aujourd'hui ? Avec quels outils (tableur, email, papier, logiciel) ?"></div>
|
|
167
|
-
</div>
|
|
168
|
-
|
|
169
|
-
<div class="card">
|
|
170
|
-
<div class="card-label">Processus actuel, etape par etape</div>
|
|
171
|
-
<div id="processFlow" class="process-flow">
|
|
172
|
-
<!-- Populated dynamically -->
|
|
122
|
+
<!-- SECTION: Contexte (merged: problem + current + vision) -->
|
|
123
|
+
<div class="section" id="cadrage-context">
|
|
124
|
+
<h2 class="section-title">Contexte du projet</h2>
|
|
125
|
+
<p class="section-subtitle">Vue synthetique du besoin : probleme, situation actuelle et objectif vise.</p>
|
|
126
|
+
|
|
127
|
+
<div style="display:grid;grid-template-columns:repeat(3,1fr);gap:1rem;margin-bottom:1.5rem;">
|
|
128
|
+
<div class="card" style="border-left:3px solid #f87171;">
|
|
129
|
+
<div class="card-label" style="color:#f87171;">Probleme identifie</div>
|
|
130
|
+
<div class="editable" contenteditable="true" data-field="context.problem" data-placeholder="Quel probleme ce projet doit-il resoudre ?"></div>
|
|
131
|
+
<div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
|
|
132
|
+
<strong>Declencheur :</strong>
|
|
133
|
+
<div class="editable" contenteditable="true" data-field="context.trigger" data-placeholder="Evenement declencheur" style="display:inline;"></div>
|
|
134
|
+
</div>
|
|
173
135
|
</div>
|
|
174
|
-
<button class="add-btn" onclick="addProcessStep()">+ Ajouter une etape au processus</button>
|
|
175
|
-
</div>
|
|
176
|
-
|
|
177
|
-
<div class="card">
|
|
178
|
-
<div class="card-label">Etapes les plus penibles ou les plus longues</div>
|
|
179
|
-
<div class="editable" contenteditable="true" data-field="current.painPoints" data-placeholder="Quelles sont les etapes les plus penibles ou les plus longues dans ce processus ?"></div>
|
|
180
|
-
</div>
|
|
181
|
-
|
|
182
|
-
<div class="card">
|
|
183
|
-
<div class="card-label">Erreurs ou problemes recurrents</div>
|
|
184
|
-
<div class="editable" contenteditable="true" data-field="current.errors" data-placeholder="Quelles erreurs ou problemes reviennent regulierement ? Donnez 2 a 3 exemples concrets."></div>
|
|
185
|
-
</div>
|
|
186
|
-
</div>
|
|
187
136
|
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
</div>
|
|
197
|
-
|
|
198
|
-
<div class="card">
|
|
199
|
-
<div class="card-label">Resultats attendus (mesurables)</div>
|
|
200
|
-
<div class="editable" contenteditable="true" data-field="vision.results" data-placeholder="Quels resultats concrets attendez-vous ? Citez 2 a 3 ameliorations mesurables."></div>
|
|
201
|
-
</div>
|
|
137
|
+
<div class="card" style="border-left:3px solid #facc15;">
|
|
138
|
+
<div class="card-label" style="color:#facc15;">Aujourd'hui</div>
|
|
139
|
+
<div class="editable" contenteditable="true" data-field="context.currentSituation" data-placeholder="Comment les choses fonctionnent actuellement ?"></div>
|
|
140
|
+
<div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
|
|
141
|
+
<strong>Points douleur :</strong>
|
|
142
|
+
<div class="editable" contenteditable="true" data-field="context.painPoints" data-placeholder="Problemes recurrents" style="display:inline;"></div>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
202
145
|
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
146
|
+
<div class="card" style="border-left:3px solid #4ade80;">
|
|
147
|
+
<div class="card-label" style="color:#4ade80;">Objectif</div>
|
|
148
|
+
<div class="editable" contenteditable="true" data-field="context.desiredSituation" data-placeholder="Que doit permettre le systeme cible ?"></div>
|
|
149
|
+
<div style="margin-top:0.75rem;font-size:0.8rem;color:var(--text-muted);">
|
|
150
|
+
<strong>Criteres :</strong>
|
|
151
|
+
<div class="editable" contenteditable="true" data-field="context.acceptanceCriteria" data-placeholder="Criteres de succes" style="display:inline;"></div>
|
|
152
|
+
</div>
|
|
153
|
+
</div>
|
|
206
154
|
</div>
|
|
207
155
|
</div>
|
|
208
156
|
|