@atlashub/smartstack-cli 4.62.0 → 4.63.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.
@@ -40,7 +40,9 @@ const FEATURE_DATA = {
40
40
  frequency: s.frequency || "",
41
41
  access: s.involvement || "",
42
42
  frustrations: (s.painPoints || []).join("\n")
43
- }))
43
+ })),
44
+ // CRITERIA: acceptance criteria (fallback: validation.json if cadrage is empty)
45
+ criteria: [/* { text, validated, module?, type? } — see step-02-build-data.md */]
44
46
  },
45
47
  modules: [
46
48
  // FOR EACH module in master.modules[]:
@@ -64,7 +64,8 @@ ELSE:
64
64
  collected_data = {
65
65
  master: {
66
66
  index: READ(index.json), // metadata, modules[], consolidation, handoff
67
- cadrage: READ(cadrage.json) // context, stakeholders, scope
67
+ cadrage: READ(cadrage.json), // context, stakeholders, scope
68
+ validation: READ(validation.json) || null // acceptance criteria (fallback for cadrage.criteria)
68
69
  },
69
70
  modules: {}
70
71
  }
@@ -80,6 +80,27 @@ scope: {
80
80
 
81
81
  > Safety net: also check `master.cadrage.coverageMatrix` as alternative source for scope items.
82
82
 
83
+ **cadrage.criteria** (acceptance criteria with validation.json fallback):
84
+ ```javascript
85
+ // Build structured criteria for the checklist UI
86
+ let criteria = (master.cadrage.acceptanceCriteria || []).map(ac => ({
87
+ text: ac.criterion || ac.text || "",
88
+ validated: false
89
+ }));
90
+
91
+ // FALLBACK: if cadrage has no criteria, use validation.json acceptance criteria
92
+ if (criteria.length === 0 && collected_data.master.validation) {
93
+ const valAC = collected_data.master.validation.acceptanceCriteria || [];
94
+ criteria = valAC.map(ac => ({
95
+ text: (ac.module ? '[' + ac.module + '] ' : '') + (ac.criteria || ac.criterion || ac.text || ""),
96
+ validated: false,
97
+ module: ac.module || null,
98
+ type: ac.type || null
99
+ }));
100
+ }
101
+
102
+ cadrage.criteria = criteria;
103
+ ```
83
104
 
84
105
  **modules[]:**
85
106
  ```javascript
@@ -192,6 +213,15 @@ function normalizeAction(a) {
192
213
  return a.code || a.id || a.label || a.actionCode || "";
193
214
  }
194
215
 
216
+ // Helper: normalize a chart definition
217
+ function normalizeChart(c) {
218
+ if (typeof c === 'string') return { type: 'bar', label: c };
219
+ return {
220
+ type: c.type || c.chartType || 'bar',
221
+ label: c.label || c.displayName || c.title || 'Graphique'
222
+ };
223
+ }
224
+
195
225
  // Helper: normalize a KPI — replace formula values with sample display values
196
226
  function normalizeKpi(k) {
197
227
  if (typeof k !== 'object') return { label: String(k), value: "0" };
@@ -238,6 +268,7 @@ if (flatScr.length > 0) {
238
268
  })),
239
269
  actions: (s.actions || []).map(normalizeAction),
240
270
  kpis: (s.kpis || []).map(normalizeKpi),
271
+ charts: (s.charts || []).map(normalizeChart),
241
272
  options: s.options || [],
242
273
  permission: s.permission || "",
243
274
  notes: s.description || s.sectionDescription || ""
@@ -267,6 +298,7 @@ if (flatScr.length > 0) {
267
298
  })),
268
299
  actions: (res.actions || []).map(normalizeAction),
269
300
  kpis: (res.kpis || []).map(normalizeKpi),
301
+ charts: (res.charts || []).map(normalizeChart),
270
302
  options: res.options || [],
271
303
  permission: res.permission || "",
272
304
  notes: res.notes || res.description || ""
@@ -297,6 +329,7 @@ if (flatScr.length > 0) {
297
329
  })),
298
330
  actions: (sec.actions || []).map(normalizeAction),
299
331
  kpis: (sec.kpis || []).map(normalizeKpi),
332
+ charts: (sec.charts || []).map(normalizeChart),
300
333
  options: sec.options || [],
301
334
  permission: (typeof sec.permissions === 'object' ? sec.permissions?.view : sec.permission) || "",
302
335
  notes: sec.description || ""