@atlashub/smartstack-cli 4.41.0 → 4.42.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/apex.html +2 -2
- package/.documentation/business-analyse.html +26 -27
- package/.documentation/commands.html +6 -6
- package/dist/index.js +24 -13
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/templates/agents/ba-reader.md +2 -2
- package/templates/agents/ba-writer.md +44 -9
- package/templates/hooks/stop-hook.sh +6 -6
- package/templates/ralph/README.md +1 -1
- package/templates/scripts/setup-ralph-loop.sh +2 -2
- package/templates/skills/_resources/context-digest-template.md +1 -1
- package/templates/skills/_shared.md +13 -13
- package/templates/skills/apex/SKILL.md +14 -7
- package/templates/skills/apex/_shared.md +1 -1
- package/templates/skills/apex/references/challenge-questions.md +46 -13
- package/templates/skills/apex/references/core-seed-data.md +4 -4
- package/templates/skills/apex/references/error-classification.md +3 -3
- package/templates/skills/apex/references/smartstack-api.md +1 -1
- package/templates/skills/apex/references/smartstack-layers.md +1 -1
- package/templates/skills/apex/steps/step-00-init.md +46 -8
- package/templates/skills/apex/steps/step-01-analyze.md +1 -1
- package/templates/skills/apex/steps/step-02-plan.md +1 -1
- package/templates/skills/apex/steps/step-03-execute.md +1 -1
- package/templates/skills/business-analyse/SKILL.md +83 -22
- package/templates/skills/business-analyse/_shared.md +12 -9
- package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +13 -0
- package/templates/skills/business-analyse/questionnaire/03-data-ui.md +33 -0
- package/templates/skills/business-analyse/questionnaire/04-risks-metrics.md +1 -1
- package/templates/skills/business-analyse/react/components.md +1 -1
- package/templates/skills/business-analyse/react/schema.md +1 -1
- package/templates/skills/business-analyse/references/acceptance-criteria.md +3 -3
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +1 -1
- package/templates/skills/business-analyse/references/detection-strategies.md +2 -2
- package/templates/skills/business-analyse/references/entity-architecture-decision.md +1 -1
- package/templates/skills/business-analyse/references/naming-conventions.md +6 -6
- package/templates/skills/business-analyse/references/robustness-checks.md +4 -4
- package/templates/skills/business-analyse/references/spec-auto-inference.md +2 -2
- package/templates/skills/business-analyse/references/validation-checklist.md +3 -3
- package/templates/skills/business-analyse/schemas/feature-schema.json +1 -1
- package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +2 -2
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +3 -2
- package/templates/skills/business-analyse/steps/step-00-init.md +15 -5
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +14 -5
- package/templates/skills/business-analyse/steps/step-02-structure.md +17 -1
- package/templates/skills/business-analyse/steps/step-03-specify.md +136 -26
- package/templates/skills/business-analyse/steps/step-04-consolidate.md +44 -8
- package/templates/skills/business-analyse/templates/tpl-handoff.md +5 -5
- package/templates/skills/business-analyse/templates/tpl-launch-displays.md +4 -4
- package/templates/skills/business-analyse/templates-frd.md +4 -4
- package/templates/skills/{ba-design-ui → business-analyse-design}/SKILL.md +9 -9
- package/templates/skills/{ba-design-ui → business-analyse-design}/steps/step-01-screens.md +9 -0
- package/templates/skills/{ba-design-ui → business-analyse-design}/steps/step-03-navigation.md +9 -2
- package/templates/skills/business-analyse-develop/SKILL.md +248 -0
- package/templates/skills/{ralph-loop → business-analyse-develop}/references/category-completeness.md +1 -1
- package/templates/skills/{ralph-loop → business-analyse-develop}/references/init-resume-recovery.md +8 -8
- package/templates/skills/{ralph-loop → business-analyse-develop}/references/multi-module-queue.md +1 -1
- package/templates/skills/business-analyse-develop/references/quality-gates.md +70 -0
- package/templates/skills/{ralph-loop → business-analyse-develop}/references/task-transform-legacy.md +1 -1
- package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-00-init.md +20 -4
- package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-01-task.md +3 -2
- package/templates/skills/business-analyse-develop/steps/step-01-v4-execute.md +131 -0
- package/templates/skills/business-analyse-develop/steps/step-02-v4-verify.md +156 -0
- package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-04-check.md +1 -1
- package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-05-report.md +1 -1
- package/templates/skills/{derive-prd → business-analyse-handoff}/SKILL.md +7 -7
- package/templates/skills/{derive-prd → business-analyse-handoff}/references/acceptance-criteria.md +5 -5
- package/templates/skills/{derive-prd → business-analyse-handoff}/references/handoff-file-templates.md +1 -1
- package/templates/skills/{derive-prd → business-analyse-handoff}/references/handoff-mappings.md +1 -1
- package/templates/skills/{derive-prd → business-analyse-handoff}/references/handoff-seeddata-generation.md +2 -2
- package/templates/skills/{derive-prd → business-analyse-handoff}/references/prd-generation.md +14 -14
- package/templates/skills/{derive-prd → business-analyse-handoff}/schemas/handoff-schema.json +2 -2
- package/templates/skills/{derive-prd → business-analyse-handoff}/steps/step-00-validate.md +6 -6
- package/templates/skills/{derive-prd → business-analyse-handoff}/steps/step-01-transform.md +46 -7
- package/templates/skills/{derive-prd → business-analyse-handoff}/steps/step-02-export.md +34 -14
- package/templates/skills/{ba-generate-html → business-analyse-html}/SKILL.md +4 -4
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/ba-interactive.html +709 -277
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/build-html.js +25 -3
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/01-data-init.js +54 -0
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/02-navigation.js +97 -3
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/03-render-cadrage.js +8 -7
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/04-render-modules.js +7 -7
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/05-render-specs.js +188 -85
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/06-render-consolidation.js +15 -14
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/06-render-mockups.js +19 -19
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/07-render-handoff.js +24 -4
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/08-editing.js +6 -2
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/09-export.js +27 -57
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/10-comments.js +67 -45
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/scripts/11-review-panel.js +15 -13
- package/templates/skills/business-analyse-html/html/src/styles/02-layout.css +216 -0
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/05-modules.css +36 -0
- package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/template.html +22 -12
- package/templates/skills/{ba-generate-html → business-analyse-html}/references/data-build.md +1 -1
- package/templates/skills/{ba-generate-html → business-analyse-html}/references/data-mapping.md +5 -1
- package/templates/skills/{ba-generate-html → business-analyse-html}/references/output-modes.md +7 -7
- package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-01-collect.md +25 -1
- package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-02-build-data.md +33 -5
- package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-03-render.md +2 -2
- package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-04-verify.md +2 -2
- package/templates/skills/{ba-review → business-analyse-review}/SKILL.md +11 -10
- package/templates/skills/{ba-review → business-analyse-review}/references/review-data-mapping.md +2 -2
- package/templates/skills/business-analyse-review/steps/step-00-init.md +107 -0
- package/templates/skills/{ba-review → business-analyse-review}/steps/step-01-apply.md +19 -11
- package/templates/skills/business-analyse-status/SKILL.md +118 -0
- package/templates/skills/documentation/SKILL.md +2 -2
- package/templates/skills/sketch/SKILL.md +172 -0
- package/templates/skills/sketch/references/domain-heuristics.md +116 -0
- package/templates/skills/ba-generate-html/html/src/styles/02-layout.css +0 -101
- package/templates/skills/ralph-loop/SKILL.md +0 -240
- /package/templates/skills/{ba-design-ui → business-analyse-design}/steps/step-02-wireframes.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/references/category-rules.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/references/compact-loop.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/references/module-transition.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/references/parallel-execution.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/references/section-splitting.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/references/team-orchestration.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-02-execute.md +0 -0
- /package/templates/skills/{ralph-loop → business-analyse-develop}/steps/step-03-commit.md +0 -0
- /package/templates/skills/{derive-prd → business-analyse-handoff}/references/entity-domain-mapping.md +0 -0
- /package/templates/skills/{derive-prd → business-analyse-handoff}/references/readiness-scoring.md +0 -0
- /package/templates/skills/{derive-prd → business-analyse-handoff}/templates/tpl-progress.md +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-context.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-scope.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-stakeholders.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/cadrage-success.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-datamodel.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-flows.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-interactions.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/consol-permissions.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/decomp-dependencies.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/decomp-modules.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/handoff-summary.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/partials/module-spec-container.html +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/01-variables.css +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/03-navigation.css +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/04-cards.css +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/06-wireframes.css +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/07-comments.css +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/08-review-panel.css +0 -0
- /package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/09-mockups-html.css +0 -0
- /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}', ${
|
|
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,
|
|
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,
|
|
148
|
+
scrollToCommentThread(sectionId, safeElId);
|
|
147
149
|
}, 150);
|
|
148
150
|
} else {
|
|
149
151
|
showSection(sectionId);
|
|
150
|
-
scrollToCommentThread(sectionId,
|
|
152
|
+
scrollToCommentThread(sectionId, safeElId);
|
|
151
153
|
}
|
|
152
154
|
}
|
|
153
155
|
|
|
154
|
-
function scrollToCommentThread(sectionId,
|
|
155
|
-
setTimeout(()
|
|
156
|
-
const thread = document.getElementById('comment-thread-' + sectionId + '-' +
|
|
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(
|
|
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
|
+
}
|
package/templates/skills/{ba-generate-html → business-analyse-html}/html/src/styles/05-modules.css
RENAMED
|
@@ -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
|
-
<
|
|
16
|
+
<header class="header" role="banner">
|
|
17
|
+
<button class="hamburger-btn" onclick="toggleMobileSidebar()" aria-label="Ouvrir le menu de navigation">☰</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
|
-
<
|
|
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">×</button>
|
|
412
|
+
<button class="review-panel-close" onclick="toggleReviewPanel()" title="Fermer" aria-label="Fermer le panneau de review">×</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>
|
package/templates/skills/{ba-generate-html → business-analyse-html}/references/data-build.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# FEATURE_DATA & EMBEDDED_ARTIFACTS Build Reference
|
|
2
2
|
|
|
3
|
-
> Reference for `/
|
|
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
|
package/templates/skills/{ba-generate-html → business-analyse-html}/references/data-mapping.md
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# HTML Data Mapping Reference
|
|
2
2
|
|
|
3
|
-
> **Used by:** `/
|
|
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
|
```
|
package/templates/skills/{ba-generate-html → business-analyse-html}/references/output-modes.md
RENAMED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
# Deploy Mode Support & Troubleshooting
|
|
2
2
|
|
|
3
|
-
> Reference for `/
|
|
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 `/
|
|
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 `/
|
|
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
|
-
**
|
|
99
|
-
- Run `/
|
|
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 `/
|
|
108
|
-
| prd.json generation failed | Run `/
|
|
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. |
|
package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-01-collect.md
RENAMED
|
@@ -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
|
-
|
|
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
|
package/templates/skills/{ba-generate-html → business-analyse-html}/steps/step-02-build-data.md
RENAMED
|
@@ -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:
|
|
40
|
-
trigger:
|
|
41
|
-
currentSituation:
|
|
42
|
-
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/
|
|
22
|
-
2. Fallback: templates/skills/
|
|
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
|
|
80
|
-
5. If
|
|
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
|
```
|