@atlashub/smartstack-cli 4.41.0 → 4.43.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 (142) hide show
  1. package/.documentation/apex.html +2 -2
  2. package/.documentation/business-analyse.html +26 -27
  3. package/.documentation/commands.html +6 -6
  4. package/dist/index.js +24 -13
  5. package/dist/index.js.map +1 -1
  6. package/package.json +2 -2
  7. package/templates/agents/ba-reader.md +2 -2
  8. package/templates/agents/ba-writer.md +44 -9
  9. package/templates/hooks/stop-hook.sh +6 -6
  10. package/templates/ralph/README.md +1 -1
  11. package/templates/scripts/setup-ralph-loop.sh +2 -2
  12. package/templates/skills/_resources/context-digest-template.md +1 -1
  13. package/templates/skills/_shared.md +13 -13
  14. package/templates/skills/apex/SKILL.md +14 -7
  15. package/templates/skills/apex/_shared.md +1 -1
  16. package/templates/skills/apex/references/challenge-questions.md +46 -13
  17. package/templates/skills/apex/references/core-seed-data.md +4 -4
  18. package/templates/skills/apex/references/error-classification.md +3 -3
  19. package/templates/skills/apex/references/smartstack-api.md +1 -1
  20. package/templates/skills/apex/references/smartstack-layers.md +1 -1
  21. package/templates/skills/apex/steps/step-00-init.md +46 -8
  22. package/templates/skills/apex/steps/step-01-analyze.md +1 -1
  23. package/templates/skills/apex/steps/step-02-plan.md +1 -1
  24. package/templates/skills/apex/steps/step-03-execute.md +1 -1
  25. package/templates/skills/business-analyse/SKILL.md +83 -22
  26. package/templates/skills/business-analyse/_shared.md +12 -9
  27. package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +24 -9
  28. package/templates/skills/business-analyse/questionnaire/03-data-ui.md +33 -0
  29. package/templates/skills/business-analyse/questionnaire/04-risks-metrics.md +1 -1
  30. package/templates/skills/business-analyse/react/components.md +1 -22
  31. package/templates/skills/business-analyse/react/schema.md +1 -1
  32. package/templates/skills/business-analyse/references/acceptance-criteria.md +3 -3
  33. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +1 -1
  34. package/templates/skills/business-analyse/references/detection-strategies.md +2 -2
  35. package/templates/skills/business-analyse/references/entity-architecture-decision.md +1 -1
  36. package/templates/skills/business-analyse/references/naming-conventions.md +6 -6
  37. package/templates/skills/business-analyse/references/robustness-checks.md +4 -4
  38. package/templates/skills/business-analyse/references/spec-auto-inference.md +2 -2
  39. package/templates/skills/business-analyse/references/validation-checklist.md +3 -3
  40. package/templates/skills/business-analyse/schemas/feature-schema.json +1 -1
  41. package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +2 -2
  42. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +3 -2
  43. package/templates/skills/business-analyse/steps/step-00-init.md +15 -5
  44. package/templates/skills/business-analyse/steps/step-01-cadrage.md +15 -6
  45. package/templates/skills/business-analyse/steps/step-02-structure.md +17 -1
  46. package/templates/skills/business-analyse/steps/step-03-specify.md +136 -26
  47. package/templates/skills/business-analyse/steps/step-04-consolidate.md +44 -8
  48. package/templates/skills/business-analyse/templates/tpl-handoff.md +5 -5
  49. package/templates/skills/business-analyse/templates/tpl-launch-displays.md +4 -4
  50. package/templates/skills/business-analyse/templates-frd.md +4 -4
  51. package/templates/skills/{ba-design-ui → business-analyse-design}/SKILL.md +9 -9
  52. package/templates/skills/{ba-design-ui → business-analyse-design}/steps/step-01-screens.md +9 -0
  53. package/templates/skills/{ba-design-ui → business-analyse-design}/steps/step-03-navigation.md +9 -2
  54. package/templates/skills/business-analyse-develop/SKILL.md +248 -0
  55. package/templates/skills/{ralph-loop → business-analyse-develop}/references/category-completeness.md +1 -1
  56. package/templates/skills/{ralph-loop → business-analyse-develop}/references/init-resume-recovery.md +8 -8
  57. package/templates/skills/{ralph-loop → business-analyse-develop}/references/multi-module-queue.md +1 -1
  58. package/templates/skills/business-analyse-develop/references/quality-gates.md +70 -0
  59. package/templates/skills/{ralph-loop → business-analyse-develop}/references/task-transform-legacy.md +1 -1
  60. package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-00-init.md +20 -4
  61. package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-01-task.md +3 -2
  62. package/templates/skills/business-analyse-develop/steps/step-01-v4-execute.md +131 -0
  63. package/templates/skills/business-analyse-develop/steps/step-02-v4-verify.md +156 -0
  64. package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-04-check.md +1 -1
  65. package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-05-report.md +1 -1
  66. package/templates/skills/{derive-prd → business-analyse-handoff}/SKILL.md +7 -7
  67. package/templates/skills/{derive-prd → business-analyse-handoff}/references/acceptance-criteria.md +5 -5
  68. package/templates/skills/{derive-prd → business-analyse-handoff}/references/handoff-file-templates.md +1 -1
  69. package/templates/skills/{derive-prd → business-analyse-handoff}/references/handoff-mappings.md +1 -1
  70. package/templates/skills/{derive-prd → business-analyse-handoff}/references/handoff-seeddata-generation.md +2 -2
  71. package/templates/skills/{derive-prd → business-analyse-handoff}/references/prd-generation.md +14 -14
  72. package/templates/skills/{derive-prd → business-analyse-handoff}/schemas/handoff-schema.json +2 -2
  73. package/templates/skills/{derive-prd → business-analyse-handoff}/steps/step-00-validate.md +7 -7
  74. package/templates/skills/{derive-prd → business-analyse-handoff}/steps/step-01-transform.md +50 -11
  75. package/templates/skills/{derive-prd → business-analyse-handoff}/steps/step-02-export.md +36 -16
  76. package/templates/skills/{ba-generate-html → business-analyse-html}/SKILL.md +4 -4
  77. package/templates/skills/{ba-generate-html → business-analyse-html}/html/ba-interactive.html +714 -286
  78. package/templates/skills/{ba-generate-html → business-analyse-html}/html/build-html.js +25 -3
  79. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/01-data-init.js +54 -0
  80. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/02-navigation.js +102 -12
  81. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/03-render-cadrage.js +8 -7
  82. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/04-render-modules.js +7 -7
  83. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/05-render-specs.js +188 -85
  84. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/06-render-consolidation.js +15 -14
  85. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/06-render-mockups.js +19 -19
  86. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/07-render-handoff.js +24 -4
  87. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/08-editing.js +6 -2
  88. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/09-export.js +27 -57
  89. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/10-comments.js +67 -45
  90. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/11-review-panel.js +15 -13
  91. package/templates/skills/business-analyse-html/html/src/styles/02-layout.css +216 -0
  92. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/05-modules.css +36 -0
  93. package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/template.html +22 -12
  94. package/templates/skills/{ba-generate-html → business-analyse-html}/references/data-build.md +1 -1
  95. package/templates/skills/{ba-generate-html → business-analyse-html}/references/data-mapping.md +5 -1
  96. package/templates/skills/{ba-generate-html → business-analyse-html}/references/output-modes.md +7 -7
  97. package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-01-collect.md +25 -1
  98. package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-02-build-data.md +33 -5
  99. package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-03-render.md +2 -2
  100. package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-04-verify.md +2 -2
  101. package/templates/skills/{ba-review → business-analyse-review}/SKILL.md +11 -10
  102. package/templates/skills/{ba-review → business-analyse-review}/references/review-data-mapping.md +2 -2
  103. package/templates/skills/business-analyse-review/steps/step-00-init.md +107 -0
  104. package/templates/skills/{ba-review → business-analyse-review}/steps/step-01-apply.md +19 -11
  105. package/templates/skills/business-analyse-status/SKILL.md +118 -0
  106. package/templates/skills/documentation/SKILL.md +2 -2
  107. package/templates/skills/sketch/SKILL.md +172 -0
  108. package/templates/skills/sketch/references/domain-heuristics.md +116 -0
  109. package/templates/skills/ba-generate-html/html/src/styles/02-layout.css +0 -101
  110. package/templates/skills/ralph-loop/SKILL.md +0 -240
  111. /package/templates/skills/{ba-design-ui → business-analyse-design}/steps/step-02-wireframes.md +0 -0
  112. /package/templates/skills/{ralph-loop → business-analyse-develop}/references/category-rules.md +0 -0
  113. /package/templates/skills/{ralph-loop → business-analyse-develop}/references/compact-loop.md +0 -0
  114. /package/templates/skills/{ralph-loop → business-analyse-develop}/references/module-transition.md +0 -0
  115. /package/templates/skills/{ralph-loop → business-analyse-develop}/references/parallel-execution.md +0 -0
  116. /package/templates/skills/{ralph-loop → business-analyse-develop}/references/section-splitting.md +0 -0
  117. /package/templates/skills/{ralph-loop → business-analyse-develop}/references/team-orchestration.md +0 -0
  118. /package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-02-execute.md +0 -0
  119. /package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-03-commit.md +0 -0
  120. /package/templates/skills/{derive-prd → business-analyse-handoff}/references/entity-domain-mapping.md +0 -0
  121. /package/templates/skills/{derive-prd → business-analyse-handoff}/references/readiness-scoring.md +0 -0
  122. /package/templates/skills/{derive-prd → business-analyse-handoff}/templates/tpl-progress.md +0 -0
  123. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-context.html +0 -0
  124. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-scope.html +0 -0
  125. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-stakeholders.html +0 -0
  126. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-success.html +0 -0
  127. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-datamodel.html +0 -0
  128. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-flows.html +0 -0
  129. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-interactions.html +0 -0
  130. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-permissions.html +0 -0
  131. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/decomp-dependencies.html +0 -0
  132. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/decomp-modules.html +0 -0
  133. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/handoff-summary.html +0 -0
  134. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/module-spec-container.html +0 -0
  135. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/01-variables.css +0 -0
  136. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/03-navigation.css +0 -0
  137. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/04-cards.css +0 -0
  138. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/06-wireframes.css +0 -0
  139. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/07-comments.css +0 -0
  140. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/08-review-panel.css +0 -0
  141. /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/09-mockups-html.css +0 -0
  142. /package/templates/skills/{ba-generate-html → business-analyse-html}/references/wireframe-svg-style-guide.md +0 -0
@@ -69,17 +69,19 @@ function renderReviewPanel() {
69
69
  return;
70
70
  }
71
71
 
72
- container.innerHTML = filtered.map((c, i) => {
72
+ container.innerHTML = filtered.map(function(c, i) {
73
73
  const globalIndex = data.comments.indexOf(c);
74
74
  const sectionLabel = getSectionLabel(c.sectionId);
75
75
  const date = c.timestamp ? new Date(c.timestamp).toLocaleDateString('fr-FR', { day: '2-digit', month: '2-digit' }) : '';
76
+ var elId = c.elementId || c.cardIndex;
77
+ var safeElId = String(elId).replace(/[^a-zA-Z0-9_-]/g, '_');
76
78
 
77
79
  return `
78
- <div class="review-comment-item" onclick="navigateToComment('${c.sectionId}', ${c.cardIndex})">
79
- <div class="review-comment-section">${sectionLabel}</div>
80
- <div class="review-comment-text">${c.content}</div>
80
+ <div class="review-comment-item" onclick="navigateToComment('${c.sectionId}', '${safeElId}')">
81
+ <div class="review-comment-section">${escapeHtml(sectionLabel)}</div>
82
+ <div class="review-comment-text">${escapeHtml(c.content)}</div>
81
83
  <div class="review-comment-footer">
82
- <span class="review-comment-author">${c.author || 'Utilisateur'} - ${date}</span>
84
+ <span class="review-comment-author">${escapeHtml(c.author || 'Utilisateur')} - ${escapeHtml(date)}</span>
83
85
  <div class="review-comment-actions">
84
86
  <button class="review-action-btn ${c.status === 'validated' ? 'reject' : 'validate'}"
85
87
  onclick="event.stopPropagation();toggleCommentStatus(${globalIndex})"
@@ -135,29 +137,29 @@ function getSectionLabel(sectionId) {
135
137
  return sectionId;
136
138
  }
137
139
 
138
- function navigateToComment(sectionId, cardIndex) {
140
+ function navigateToComment(sectionId, safeElId) {
139
141
  // Handle list-based sectionIds (ucList-*, brList-*, entList-*) → navigate to module + tab
140
142
  const listMatch = sectionId.match(/^(uc|br|ent)List-(.+)$/);
141
143
  if (listMatch) {
142
144
  const [, tabType, moduleCode] = listMatch;
143
145
  showSection('module-spec-' + moduleCode);
144
- setTimeout(() => {
146
+ setTimeout(function() {
145
147
  switchTab(moduleCode, tabType);
146
- scrollToCommentThread(sectionId, cardIndex);
148
+ scrollToCommentThread(sectionId, safeElId);
147
149
  }, 150);
148
150
  } else {
149
151
  showSection(sectionId);
150
- scrollToCommentThread(sectionId, cardIndex);
152
+ scrollToCommentThread(sectionId, safeElId);
151
153
  }
152
154
  }
153
155
 
154
- function scrollToCommentThread(sectionId, cardIndex) {
155
- setTimeout(() => {
156
- const thread = document.getElementById('comment-thread-' + sectionId + '-' + cardIndex);
156
+ function scrollToCommentThread(sectionId, safeElId) {
157
+ setTimeout(function() {
158
+ const thread = document.getElementById('comment-thread-' + sectionId + '-' + safeElId);
157
159
  if (thread && !thread.classList.contains('visible')) {
158
160
  thread.classList.add('visible');
159
161
  }
160
- const container = document.querySelector(`.comment-btn-container[data-section-id="${sectionId}"][data-card-index="${cardIndex}"]`);
162
+ const container = document.querySelector('.comment-btn-container[data-section-id="' + sectionId + '"][data-element-id]');
161
163
  if (container) {
162
164
  container.scrollIntoView({ behavior: 'smooth', block: 'center' });
163
165
  }
@@ -0,0 +1,216 @@
1
+ /* ============================================
2
+ LAYOUT
3
+ ============================================ */
4
+ .app { display: flex; flex-direction: column; min-height: 100vh; }
5
+
6
+ .header {
7
+ background: var(--bg-card);
8
+ border-bottom: 1px solid var(--border);
9
+ height: var(--header-height);
10
+ display: flex;
11
+ align-items: center;
12
+ padding: 0 1.5rem;
13
+ gap: 1rem;
14
+ position: sticky;
15
+ top: 0;
16
+ z-index: 100;
17
+ }
18
+
19
+ .header-logo {
20
+ width: 32px; height: 32px;
21
+ background: linear-gradient(135deg, var(--primary), var(--secondary));
22
+ border-radius: 6px;
23
+ display: flex; align-items: center; justify-content: center;
24
+ font-weight: 700; font-size: 0.85rem; color: #fff;
25
+ flex-shrink: 0;
26
+ }
27
+
28
+ .header-title { font-size: 1rem; font-weight: 600; color: var(--text-bright); }
29
+ .header-sep { width: 1px; height: 24px; background: var(--border); }
30
+ .header-app-name { font-size: 0.9rem; color: var(--primary-light); font-weight: 500; }
31
+ .header-spacer { flex: 1; }
32
+
33
+ .header-actions { display: flex; gap: 0.5rem; }
34
+
35
+ .body { display: flex; flex: 1; }
36
+
37
+ /* ============================================
38
+ SIDEBAR - Container
39
+ ============================================ */
40
+ .sidebar {
41
+ width: var(--sidebar-width);
42
+ background: var(--bg-card);
43
+ border-right: 1px solid var(--border);
44
+ overflow-y: auto;
45
+ height: calc(100vh - var(--header-height));
46
+ position: sticky;
47
+ top: var(--header-height);
48
+ flex-shrink: 0;
49
+ }
50
+
51
+ .sidebar::-webkit-scrollbar { width: 4px; }
52
+ .sidebar::-webkit-scrollbar-thumb { background: var(--border); border-radius: 4px; }
53
+
54
+ /* ============================================
55
+ MAIN CONTENT - FULL WIDTH
56
+ ============================================ */
57
+ .main {
58
+ flex: 1;
59
+ padding: 2rem 3rem;
60
+ overflow-y: auto;
61
+ height: calc(100vh - var(--header-height));
62
+ }
63
+
64
+ .section { margin-bottom: 4rem; }
65
+ .section-title {
66
+ font-size: 1.4rem;
67
+ color: var(--text-bright);
68
+ font-weight: 600;
69
+ margin-bottom: 0.5rem;
70
+ padding-bottom: 0.5rem;
71
+ border-bottom: 2px solid var(--primary);
72
+ }
73
+ .section-subtitle {
74
+ font-size: 0.9rem;
75
+ color: var(--text-muted);
76
+ margin-bottom: 1.5rem;
77
+ }
78
+
79
+ /* ============================================
80
+ RESPONSIVE
81
+ ============================================ */
82
+ .hamburger-btn {
83
+ display: none;
84
+ background: none;
85
+ border: 1px solid var(--border);
86
+ border-radius: 6px;
87
+ color: var(--text);
88
+ font-size: 1.2rem;
89
+ padding: 0.2rem 0.5rem;
90
+ cursor: pointer;
91
+ flex-shrink: 0;
92
+ }
93
+ .sidebar-overlay {
94
+ display: none;
95
+ position: fixed;
96
+ inset: 0;
97
+ background: rgba(0,0,0,0.5);
98
+ z-index: 149;
99
+ }
100
+ .sidebar-overlay.visible { display: block; }
101
+
102
+ @media (max-width: 768px) {
103
+ .hamburger-btn { display: block; }
104
+ .sidebar {
105
+ display: none;
106
+ position: fixed;
107
+ top: 0;
108
+ left: 0;
109
+ height: 100vh;
110
+ z-index: 150;
111
+ box-shadow: 4px 0 24px rgba(0,0,0,0.3);
112
+ }
113
+ .sidebar.mobile-open { display: block; }
114
+ .main { padding: 1rem; }
115
+ .form-row { grid-template-columns: 1fr; }
116
+ .stakeholder-grid { grid-template-columns: 1fr; }
117
+ .module-grid { grid-template-columns: 1fr; }
118
+ .stat-grid { grid-template-columns: repeat(2, 1fr); }
119
+ .dm-entity-grid { grid-template-columns: 1fr; }
120
+ .mock-form-row { grid-template-columns: 1fr; }
121
+ .mock-kpi-grid { grid-template-columns: repeat(2, 1fr); }
122
+ .header-actions { gap: 0.25rem; }
123
+ .header-actions .btn-sm { padding: 0.2rem 0.4rem; font-size: 0.7rem; }
124
+ .header-title { display: none; }
125
+ .header-sep { display: none; }
126
+ }
127
+
128
+ /* ============================================
129
+ SEARCH
130
+ ============================================ */
131
+ .sidebar-search {
132
+ padding: 0.5rem 0.75rem;
133
+ border-bottom: 1px solid var(--border);
134
+ }
135
+ .sidebar-search input {
136
+ width: 100%;
137
+ padding: 0.4rem 0.6rem;
138
+ background: var(--bg-input);
139
+ border: 1px solid var(--border);
140
+ border-radius: 6px;
141
+ color: var(--text);
142
+ font-size: 0.8rem;
143
+ font-family: inherit;
144
+ }
145
+ .sidebar-search input:focus {
146
+ outline: none;
147
+ border-color: var(--primary);
148
+ }
149
+ .nav-item.search-hidden { display: none; }
150
+ .nav-group.search-hidden { display: none; }
151
+ .search-highlight { background: rgba(234,179,8,0.3); border-radius: 2px; }
152
+
153
+ /* ============================================
154
+ PROGRESS INDICATOR
155
+ ============================================ */
156
+ .progress-bar-container {
157
+ width: 100%;
158
+ height: 8px;
159
+ background: var(--bg-hover);
160
+ border-radius: 4px;
161
+ overflow: hidden;
162
+ margin-bottom: 0.5rem;
163
+ }
164
+ .progress-bar-fill {
165
+ height: 100%;
166
+ background: linear-gradient(90deg, var(--primary), var(--success));
167
+ border-radius: 4px;
168
+ transition: width 0.5s ease;
169
+ }
170
+ .progress-label {
171
+ font-size: 0.8rem;
172
+ color: var(--text-muted);
173
+ margin-bottom: 0.75rem;
174
+ }
175
+ .progress-checks {
176
+ display: grid;
177
+ grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
178
+ gap: 0.3rem;
179
+ }
180
+ .progress-check {
181
+ font-size: 0.8rem;
182
+ color: var(--text-muted);
183
+ display: flex;
184
+ align-items: center;
185
+ gap: 0.4rem;
186
+ }
187
+ .progress-check.done { color: var(--success); }
188
+ .progress-check-icon { font-size: 0.9rem; width: 16px; text-align: center; }
189
+
190
+ /* ============================================
191
+ PRINT
192
+ ============================================ */
193
+ @media print {
194
+ .sidebar, .header-actions, .add-btn, .uc-actions, .inline-form, .module-card-remove, .hamburger-btn, .sidebar-search { display: none !important; }
195
+ .main { max-width: 100%; padding: 0.5cm; height: auto; overflow: visible; }
196
+ .body { display: block; }
197
+ .section { display: block !important; page-break-inside: avoid; margin-bottom: 1cm; }
198
+ .section + .section { page-break-before: auto; }
199
+ body { background: #fff !important; color: #1a1a1a !important; }
200
+ * { color-adjust: exact; -webkit-print-color-adjust: exact; }
201
+ .card, .uc-item, .br-item, .module-card, .entity-block, .interaction-item {
202
+ border-color: #ddd !important;
203
+ background: #fff !important;
204
+ color: #1a1a1a !important;
205
+ }
206
+ .card-label, .uc-detail-label, .section-subtitle, .form-label { color: #666 !important; }
207
+ .section-title { color: #1a1a1a !important; border-bottom-color: #333 !important; }
208
+ .tab-panel { display: block !important; page-break-inside: avoid; }
209
+ .tab-bar { display: none !important; }
210
+ .review-panel, .comment-btn-container, .notification, .wireframe-comment, [contenteditable] { display: none !important; }
211
+ .editable { border: none !important; padding: 0 !important; }
212
+ .header { position: static; background: #fff !important; border-bottom-color: #ddd !important; }
213
+ .header-logo { background: #333 !important; }
214
+ .header-title, .header-app-name { color: #1a1a1a !important; }
215
+ a { text-decoration: none !important; color: inherit !important; }
216
+ }
@@ -442,3 +442,39 @@
442
442
  font-size: 0.8rem;
443
443
  color: var(--text-muted);
444
444
  }
445
+
446
+ /* ============================================
447
+ SECTION GROUPS (Hierarchical Mode)
448
+ ============================================ */
449
+ .section-group {
450
+ margin-bottom: 1.5rem;
451
+ border-left: 3px solid var(--primary);
452
+ padding-left: 0;
453
+ }
454
+ .section-group-header {
455
+ display: flex;
456
+ align-items: center;
457
+ gap: 0.5rem;
458
+ padding: 0.5rem 0.75rem;
459
+ background: rgba(99,102,241,0.05);
460
+ border-bottom: 1px solid var(--border);
461
+ margin-bottom: 0.5rem;
462
+ border-radius: 0 6px 0 0;
463
+ }
464
+ .section-group-icon {
465
+ font-size: 0.6rem;
466
+ color: var(--primary-light);
467
+ }
468
+ .section-group-label {
469
+ font-weight: 600;
470
+ color: var(--primary-light);
471
+ font-size: 0.9rem;
472
+ }
473
+ .section-group-route {
474
+ font-size: 0.7rem;
475
+ color: var(--text-muted);
476
+ font-family: 'Courier New', monospace;
477
+ background: var(--bg-input);
478
+ padding: 0.1rem 0.4rem;
479
+ border-radius: 3px;
480
+ }
@@ -13,20 +13,21 @@
13
13
  <!-- ============================================
14
14
  HEADER
15
15
  ============================================ -->
16
- <header class="header">
17
- <div class="header-logo">BA</div>
16
+ <header class="header" role="banner">
17
+ <button class="hamburger-btn" onclick="toggleMobileSidebar()" aria-label="Ouvrir le menu de navigation">&#9776;</button>
18
+ <div class="header-logo" aria-hidden="true">BA</div>
18
19
  <span class="header-title">Analyse métier</span>
19
20
  <div class="header-sep"></div>
20
21
  <span class="header-app-name" id="appName">{{APPLICATION_NAME}}</span>
21
22
  <div class="header-spacer"></div>
22
23
  <div class="header-actions">
23
- <button class="btn btn-sm" onclick="resetToEmbedded()" title="Réinitialiser depuis les données d'origine (supprime les modifications locales)">Reset</button>
24
- <button class="btn btn-sm" onclick="saveToLocalStorage()" title="Sauvegarder les modifications dans le navigateur">Sauvegarder</button>
25
- <button class="btn btn-sm btn-review" onclick="saveReviewJSON()" title="Sauvegarder les corrections pour créer une nouvelle version">Sauvegarder corrections</button>
26
- <button class="btn btn-sm btn-primary" onclick="exportJSON()" title="Exporter les données au format JSON pour l'extraction">Exporter JSON</button>
27
- <button class="btn btn-sm review-toggle-btn" id="reviewToggleBtn" onclick="toggleReviewPanel()" title="Ouvrir/fermer le panneau de review">
24
+ <button class="btn btn-sm" onclick="resetToEmbedded()" title="Réinitialiser depuis les données d'origine (supprime les modifications locales)" aria-label="Réinitialiser les données">Reset</button>
25
+ <button class="btn btn-sm" onclick="saveToLocalStorage()" title="Sauvegarder les modifications dans le navigateur" aria-label="Sauvegarder">Sauvegarder</button>
26
+ <button class="btn btn-sm btn-review" onclick="saveReviewJSON()" title="Sauvegarder les corrections pour créer une nouvelle version" aria-label="Sauvegarder les corrections">Sauvegarder corrections</button>
27
+ <button class="btn btn-sm btn-primary" onclick="exportJSON()" title="Exporter les données au format JSON pour l'extraction" aria-label="Exporter en JSON">Exporter JSON</button>
28
+ <button class="btn btn-sm review-toggle-btn" id="reviewToggleBtn" onclick="toggleReviewPanel()" title="Ouvrir/fermer le panneau de review" aria-label="Panneau de review">
28
29
  Review
29
- <span class="review-badge hidden" id="reviewBadge">0</span>
30
+ <span class="review-badge hidden" id="reviewBadge" aria-live="polite">0</span>
30
31
  </button>
31
32
  </div>
32
33
  </header>
@@ -35,11 +36,16 @@
35
36
  <!-- ============================================
36
37
  SIDEBAR - Navigation hiérarchique
37
38
  ============================================ -->
38
- <aside class="sidebar">
39
+ <div class="sidebar-overlay" id="sidebarOverlay" onclick="toggleMobileSidebar()"></div>
40
+ <aside class="sidebar" id="sidebarAside" role="navigation" aria-label="Navigation principale">
39
41
  <!-- Application Name -->
40
42
  <div class="sidebar-header">
41
43
  <span class="sidebar-app-name" id="sidebarAppName">{{APPLICATION_NAME}}</span>
42
44
  </div>
45
+ <!-- Search -->
46
+ <div class="sidebar-search">
47
+ <input type="search" id="sidebarSearchInput" placeholder="Rechercher..." oninput="filterNavItems(this.value)" aria-label="Rechercher dans le document">
48
+ </div>
43
49
  <!-- Dynamic Tree Navigation -->
44
50
  <div id="sidebarNav">
45
51
  <!-- Populated by buildNavTree() -->
@@ -49,7 +55,7 @@
49
55
  <!-- ============================================
50
56
  MAIN CONTENT
51
57
  ============================================ -->
52
- <main class="main" id="mainContent">
58
+ <main class="main" id="mainContent" role="main">
53
59
 
54
60
  <!-- SECTION: Contexte (merged: problem + current + vision) -->
55
61
  <div class="section" id="cadrage-context">
@@ -370,6 +376,10 @@
370
376
  <h2 class="section-title">Synthèse de l'analyse</h2>
371
377
  <p class="section-subtitle">Vue d'ensemble de toute l'analyse métier, prête pour le développement.</p>
372
378
 
379
+ <div class="card" style="margin-bottom:1.5rem;" id="progressIndicator">
380
+ <!-- Populated by renderProgressIndicator() -->
381
+ </div>
382
+
373
383
  <div class="stat-grid" id="handoffStats">
374
384
  <!-- Populated dynamically -->
375
385
  </div>
@@ -396,10 +406,10 @@
396
406
  <!-- ============================================
397
407
  REVIEW PANEL (right sidebar)
398
408
  ============================================ -->
399
- <aside class="review-panel" id="reviewPanel">
409
+ <aside class="review-panel" id="reviewPanel" role="complementary" aria-label="Panneau de review">
400
410
  <div class="review-panel-header">
401
411
  <span class="review-panel-title">Review</span>
402
- <button class="review-panel-close" onclick="toggleReviewPanel()" title="Fermer">&times;</button>
412
+ <button class="review-panel-close" onclick="toggleReviewPanel()" title="Fermer" aria-label="Fermer le panneau de review">&times;</button>
403
413
  </div>
404
414
  <div class="review-filters">
405
415
  <button class="review-filter-btn active" onclick="filterReviewComments('all')" data-filter="all">Tous</button>
@@ -1,6 +1,6 @@
1
1
  # FEATURE_DATA & EMBEDDED_ARTIFACTS Build Reference
2
2
 
3
- > Reference for `/ba-generate-html` skill (step-02-build-data) — complete mapping specification for the interactive HTML.
3
+ > Reference for `/business-analyse-html` skill (step-02-build-data) — complete mapping specification for the interactive HTML.
4
4
  > **Canonical field mapping reference:** See also `data-mapping.md` for the authoritative field name mapping between module JSON files and HTML data objects.
5
5
 
6
6
  ## FEATURE_DATA Object
@@ -1,6 +1,6 @@
1
1
  # HTML Data Mapping Reference
2
2
 
3
- > **Used by:** `/ba-generate-html` skill (step-02-build-data)
3
+ > **Used by:** `/business-analyse-html` skill (step-02-build-data)
4
4
  > **Purpose:** Exact mapping from module JSON files to HTML FEATURE_DATA and EMBEDDED_ARTIFACTS objects
5
5
 
6
6
  ---
@@ -102,6 +102,7 @@ const mod = collected_data.modules[moduleCode];
102
102
  moduleSpecs[moduleCode] = {
103
103
  useCases: (mod.usecases?.useCases || []).map(uc => ({
104
104
  name: uc.name,
105
+ sectionCode: uc.sectionCode || "", // links UC to anticipatedSections[].code
105
106
  actor: uc.primaryActor,
106
107
  steps: (uc.mainScenario || []).join("\n"), // array → newline-separated string
107
108
  alternative: (uc.alternativeScenarios || [])
@@ -109,6 +110,7 @@ moduleSpecs[moduleCode] = {
109
110
  })),
110
111
  businessRules: (mod.rules?.rules || []).map(br => ({
111
112
  name: br.name,
113
+ sectionCode: br.sectionCode || "", // links BR to anticipatedSections[].code
112
114
  category: br.category, // "validation"|"calculation"|"workflow"|"security"|"data"
113
115
  statement: br.statement,
114
116
  example: (br.examples || []).map(e => e.input + " → " + e.expected).join("; ")
@@ -164,6 +166,8 @@ function buildPermissionKeys(permissionsData) {
164
166
  }
165
167
  ```
166
168
 
169
+ > **Language handling:** The actionMap should use `metadata.language` to select the correct labels. For `fr`: Consulter/Créer/Modifier/Supprimer. For `en`: Read/Create/Update/Delete. Default to English if language is unknown.
170
+
167
171
  ### Frequency Mapping
168
172
 
169
173
  ```
@@ -1,12 +1,12 @@
1
1
  # Deploy Mode Support & Troubleshooting
2
2
 
3
- > Reference for `/ba-generate-html` skill (HTML deployment) and `/derive-prd` skill (handoff + PRD generation) — mode variations and common issues.
3
+ > Reference for `/business-analyse-html` skill (HTML deployment) and `/business-analyse-handoff` skill (handoff + PRD generation) — mode variations and common issues.
4
4
 
5
5
  ## Mode Support
6
6
 
7
7
  ### Standard Mode
8
8
 
9
- Full handoff with all implementation details (via `/derive-prd`):
9
+ Full handoff with all implementation details (via `/business-analyse-handoff`):
10
10
  - All 8 file categories (including documentation)
11
11
  - Complete BR-to-code mapping
12
12
  - Full API endpoint summary
@@ -20,7 +20,7 @@ Simplified handoff with minimal scope:
20
20
  - 3 core SeedData entries (omit some optional ones)
21
21
  - Basic prd.json with simplified sections
22
22
  - Lightweight progress.txt
23
- - Display `/ralph-loop` command for later use
23
+ - Display `/business-analyse-develop` command for later use
24
24
 
25
25
  ### Delta Mode (use_case = refactoring)
26
26
 
@@ -95,8 +95,8 @@ Full handoff across multiple applications within a project:
95
95
  - `rolePermissions[]` are scoped per application (same role can have different permissions per app)
96
96
  - Seed data order: applications in topological order, then modules within each application
97
97
 
98
- **ralph-loop execution (recommended):**
99
- - Run `/ralph-loop` once per application (module-by-module within each app)
98
+ **business-analyse-develop execution (recommended):**
99
+ - Run `/business-analyse-develop` once per application (module-by-module within each app)
100
100
  - Cross-application PRD runs last after all applications are implemented
101
101
  - Application order follows `applicationDependencyGraph.topologicalOrder`
102
102
 
@@ -104,8 +104,8 @@ Full handoff across multiple applications within a project:
104
104
 
105
105
  | Issue | Resolution |
106
106
  |-------|-----------|
107
- | All modules missing handoff data | Run `/derive-prd` skill. Handoff MUST be written to each module's handoff.json. |
108
- | prd.json generation failed | Run `/derive-prd`. Verify ss derive-prd command is installed and index.json path is correct. |
107
+ | All modules missing handoff data | Run `/business-analyse-handoff` skill. Handoff MUST be written to each module's handoff.json. |
108
+ | prd.json generation failed | Run `/business-analyse-handoff`. Verify ss business-analyse-handoff command is installed and index.json path is correct. |
109
109
  | progress.txt incomplete | Ensure all CORE SeedData entries are present: 2 app-level (NavigationApplication + ApplicationRoles) + per module (NavigationModule + NavigationSections + Permissions + Roles). Check topological order. |
110
110
  | BA manifest not found | Create docs/index.json if missing. Use schema provided in section 3. |
111
111
  | Manifest entries incorrect | Verify appCode, moduleCode, and version match index.json metadata exactly. |
@@ -72,14 +72,36 @@ FOR each module in master.index.modules[]:
72
72
  moduleIndex = READ(moduleDir + "index.json")
73
73
 
74
74
  // Read ALL flat files from module directory
75
- collected_data.modules[module.code] = {
75
+ const moduleData = {
76
76
  index: moduleIndex,
77
77
  entities: READ(moduleDir + "entities.json") || { entities: [] },
78
78
  rules: READ(moduleDir + "rules.json") || { rules: [] },
79
79
  usecases: READ(moduleDir + "usecases.json") || { useCases: [] },
80
80
  permissions: READ(moduleDir + "permissions.json") || { roles: [], permissions: [], matrix: [] },
81
81
  screens: READ(moduleDir + "screens.json") || { screens: [] }
82
+ };
83
+
84
+ // POST-COLLECT VALIDATION: detect missing mandatory data for specified modules
85
+ const moduleStatus = moduleIndex?.metadata?.status || moduleIndex?.status || "unknown";
86
+ const warnings = [];
87
+ if (["specified", "consolidated", "designed", "reviewed", "handed-off"].includes(moduleStatus)) {
88
+ if ((moduleData.entities.entities || []).length === 0)
89
+ warnings.push("entities.json is EMPTY for specified module " + module.code);
90
+ if ((moduleData.usecases.useCases || []).length === 0)
91
+ warnings.push("usecases.json is EMPTY for specified module " + module.code);
92
+ if ((moduleData.rules.rules || []).length === 0)
93
+ warnings.push("rules.json is EMPTY for specified module " + module.code);
82
94
  }
95
+ if (warnings.length > 0) {
96
+ Display("⚠ WARNING — Missing data for module " + module.code + ":");
97
+ warnings.forEach(w => Display(" - " + w));
98
+ Display("The HTML document will have incomplete sections for this module.");
99
+ }
100
+
101
+ collected_data.modules[module.code] = moduleData;
102
+
103
+ // Read navigation.json if present (written by /business-analyse-design)
104
+ collected_data.navigation = READ(docs_dir + '/navigation.json') || null;
83
105
  ```
84
106
 
85
107
  ### 5. Display Collection Summary
@@ -88,6 +110,7 @@ FOR each module in master.index.modules[]:
88
110
  JSON collected:
89
111
  Master: index.json + cadrage.json
90
112
  Modules: {module_count} modules (flat files: entities, rules, usecases, permissions, screens)
113
+ Warnings: {total_warnings} (see above if any)
91
114
  → Proceeding to data build...
92
115
  ```
93
116
 
@@ -97,6 +120,7 @@ JSON collected:
97
120
 
98
121
  - BLOCK if index.json absent
99
122
  - BLOCK if 0 modules found
123
+ - WARN (non-blocking) if specified module has empty mandatory files
100
124
  - BLOCK if feature not consolidated
101
125
 
102
126
  ## NEXT STEP
@@ -33,13 +33,22 @@ metadata: {
33
33
  }
34
34
  ```
35
35
 
36
- **cadrage.context** (lean format):
36
+ **cadrage.context** (lean format — MANDATORY fields logged if empty):
37
37
  ```javascript
38
+ const problem = master.cadrage.problem || "";
39
+ const trigger = master.cadrage.trigger || "";
40
+ const currentSituation = master.cadrage.asIs || "";
41
+ const desiredSituation = master.cadrage.toBe || "";
42
+
43
+ // MANDATORY field check — warn if core cadrage data is empty
44
+ if (!problem) console.warn("⚠ cadrage.problem is empty — HTML will show blank problem section");
45
+ if (!currentSituation && !desiredSituation) console.warn("⚠ cadrage has no current/desired situation");
46
+
38
47
  context: {
39
- problem: master.cadrage.problem || "",
40
- trigger: master.cadrage.trigger || "",
41
- currentSituation: master.cadrage.asIs || "", // asIs → currentSituation
42
- desiredSituation: master.cadrage.toBe || "", // toBe → desiredSituation
48
+ problem: problem,
49
+ trigger: trigger,
50
+ currentSituation: currentSituation, // asIs → currentSituation
51
+ desiredSituation: desiredSituation, // toBe → desiredSituation
43
52
  painPoints: (master.cadrage.stakeholders || []).flatMap(s => s.painPoints || []).join("\n"),
44
53
  acceptanceCriteria: (master.cadrage.acceptanceCriteria || []).map(ac => ac.criterion).join("\n")
45
54
  }
@@ -101,12 +110,14 @@ const mod = collected_data.modules[moduleCode];
101
110
  moduleSpecs[moduleCode] = {
102
111
  useCases: (mod.usecases?.useCases || []).map(uc => ({
103
112
  name: uc.name,
113
+ sectionCode: uc.sectionCode || "",
104
114
  actor: uc.primaryActor,
105
115
  steps: (uc.mainScenario || []).join("\n"),
106
116
  alternative: (uc.alternativeScenarios || []).map(a => a.name + ": " + (a.steps || []).join(", ")).join("\n")
107
117
  })),
108
118
  businessRules: (mod.rules?.rules || []).map(br => ({
109
119
  name: br.name,
120
+ sectionCode: br.sectionCode || "",
110
121
  category: br.category,
111
122
  statement: br.statement,
112
123
  example: (br.examples || []).map(e => e.input + " → " + e.expected).join("; ")
@@ -128,6 +139,23 @@ moduleSpecs[moduleCode] = {
128
139
 
129
140
  > See `references/data-mapping.md` for `buildPermissionKeys()` implementation.
130
141
 
142
+ **Enrich anticipatedSections with section-level UC/BR (AFTER moduleSpecs is built):**
143
+
144
+ ```javascript
145
+ // Post-processing: populate each section's useCases[] and businessRules[]
146
+ // using the sectionCode field from moduleSpecs
147
+ FEATURE_DATA.modules.forEach(m => {
148
+ const spec = FEATURE_DATA.moduleSpecs[m.code];
149
+ if (!spec) return;
150
+ (m.anticipatedSections || []).forEach(section => {
151
+ section.useCases = (spec.useCases || []).filter(uc => uc.sectionCode === section.code);
152
+ section.businessRules = (spec.businessRules || []).filter(br => br.sectionCode === section.code);
153
+ });
154
+ });
155
+ ```
156
+
157
+ > This step is CRITICAL for the HTML viewer to display UC/BR grouped by section.
158
+
131
159
  **consolidation:**
132
160
  ```javascript
133
161
  consolidation: {
@@ -18,8 +18,8 @@ Inject FEATURE_DATA and EMBEDDED_ARTIFACTS into the HTML template and write the
18
18
  ### 1. Locate Template
19
19
 
20
20
  ```
21
- 1. Primary: ~/.claude/skills/ba-generate-html/html/ba-interactive.html
22
- 2. Fallback: templates/skills/ba-generate-html/html/ba-interactive.html (project CLI path)
21
+ 1. Primary: ~/.claude/skills/business-analyse-html/html/ba-interactive.html
22
+ 2. Fallback: templates/skills/business-analyse-html/html/ba-interactive.html (project CLI path)
23
23
  3. IF neither found → BLOCKING ERROR: "HTML template not found"
24
24
  ```
25
25
 
@@ -76,8 +76,8 @@ Modules: {count} ({names})
76
76
  1. Open ba-interactive.html in browser
77
77
  2. Review all modules, use cases, business rules
78
78
  3. Validate wireframes and permissions
79
- 4. If OK: /derive-prd then /ralph-loop to begin development
80
- 5. If changes needed: /business-analyse to iterate
79
+ 4. If approved: /business-analyse-handoff then /business-analyse-develop to begin development
80
+ 5. If corrections needed: export ba-review.json from the HTML, then run /business-analyse-review
81
81
 
82
82
  ══════════════════════════════════════════════════════════════
83
83
  ```