@atlashub/smartstack-cli 3.8.0 → 3.10.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 +365 -2
- package/dist/index.js.map +1 -1
- package/package.json +2 -1
- package/templates/agents/action.md +1 -0
- package/templates/agents/ba-writer.md +211 -0
- package/templates/agents/explore-codebase.md +1 -0
- package/templates/agents/explore-docs.md +1 -0
- package/templates/agents/fix-grammar.md +1 -0
- package/templates/agents/snipper.md +1 -0
- package/templates/skills/admin/SKILL.md +6 -0
- package/templates/skills/ai-prompt/SKILL.md +32 -136
- package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -0
- package/templates/skills/apex/SKILL.md +120 -0
- package/templates/skills/apex/_shared.md +86 -0
- package/templates/skills/apex/references/agent-teams-protocol.md +164 -0
- package/templates/skills/apex/references/smartstack-layers.md +173 -0
- package/templates/skills/apex/steps/step-00-init.md +156 -0
- package/templates/skills/apex/steps/step-01-analyze.md +169 -0
- package/templates/skills/apex/steps/step-02-plan.md +160 -0
- package/templates/skills/apex/steps/step-03-execute.md +166 -0
- package/templates/skills/apex/steps/step-04-validate.md +138 -0
- package/templates/skills/apex/steps/step-05-examine.md +124 -0
- package/templates/skills/apex/steps/step-06-resolve.md +105 -0
- package/templates/skills/apex/steps/step-07-tests.md +130 -0
- package/templates/skills/apex/steps/step-08-run-tests.md +115 -0
- package/templates/skills/application/SKILL.md +10 -0
- package/templates/skills/application/references/application-roles-template.md +227 -0
- package/templates/skills/application/references/backend-controller-hierarchy.md +58 -0
- package/templates/skills/application/references/backend-entity-seeding.md +72 -0
- package/templates/skills/application/references/backend-verification.md +88 -0
- package/templates/skills/application/references/frontend-verification.md +111 -0
- package/templates/skills/application/references/nav-fallback-procedure.md +200 -0
- package/templates/skills/application/references/provider-template.md +158 -0
- package/templates/skills/application/references/test-frontend.md +73 -0
- package/templates/skills/application/references/test-prerequisites.md +72 -0
- package/templates/skills/application/steps/step-01-navigation.md +7 -198
- package/templates/skills/application/steps/step-03-roles.md +45 -7
- package/templates/skills/application/steps/step-03b-provider.md +15 -132
- package/templates/skills/application/steps/step-04-backend.md +20 -350
- package/templates/skills/application/steps/step-05-frontend.md +12 -101
- package/templates/skills/application/steps/step-07-tests.md +12 -132
- package/templates/skills/business-analyse/SKILL.md +67 -6
- package/templates/skills/business-analyse/html/ba-interactive.html +176 -14
- package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +1 -0
- package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +16 -4
- package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +7 -2
- package/templates/skills/business-analyse/html/src/scripts/09-export.js +103 -0
- package/templates/skills/business-analyse/html/src/scripts/10-comments.js +12 -6
- package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +24 -2
- package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +12 -0
- package/templates/skills/business-analyse/html/src/template.html +1 -0
- package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +477 -0
- package/templates/skills/business-analyse/references/cache-warming-strategy.md +578 -0
- package/templates/skills/business-analyse/references/cadrage-structure-cards.md +78 -0
- package/templates/skills/business-analyse/references/cadrage-vibe-coding.md +97 -0
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +92 -0
- package/templates/skills/business-analyse/references/deploy-data-build.md +121 -0
- package/templates/skills/business-analyse/references/deploy-modes.md +49 -0
- package/templates/skills/business-analyse/references/handoff-file-templates.md +119 -0
- package/templates/skills/business-analyse/references/handoff-mappings.md +81 -0
- package/templates/skills/business-analyse/references/html-data-mapping.md +10 -2
- package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -0
- package/templates/skills/business-analyse/references/review-data-mapping.md +363 -0
- package/templates/skills/business-analyse/references/robustness-checks.md +538 -0
- package/templates/skills/business-analyse/references/spec-auto-inference.md +57 -0
- package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -0
- package/templates/skills/business-analyse/references/ui-resource-cards.md +110 -0
- package/templates/skills/business-analyse/references/validate-incremental-html.md +55 -0
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +33 -1
- package/templates/skills/business-analyse/steps/step-00-init.md +186 -53
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +5 -194
- package/templates/skills/business-analyse/steps/step-03a-data.md +42 -49
- package/templates/skills/business-analyse/steps/step-03b-ui.md +12 -178
- package/templates/skills/business-analyse/steps/step-03c-compile.md +71 -2
- package/templates/skills/business-analyse/steps/step-03d-validate.md +277 -48
- package/templates/skills/business-analyse/steps/step-04-consolidation.md +175 -104
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +66 -438
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +35 -184
- package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +526 -0
- package/templates/skills/business-analyse/steps/step-06-review.md +277 -0
- package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -0
- package/templates/skills/cc-agent/steps/step-02-generate.md +5 -78
- package/templates/skills/check-version/SKILL.md +7 -0
- package/templates/skills/controller/references/controller-code-templates.md +159 -0
- package/templates/skills/controller/references/permission-sync-templates.md +152 -0
- package/templates/skills/controller/steps/step-03-generate.md +166 -158
- package/templates/skills/controller/steps/step-04-perms.md +5 -144
- package/templates/skills/controller/templates.md +11 -2
- package/templates/skills/debug/SKILL.md +7 -0
- package/templates/skills/explore/SKILL.md +6 -0
- package/templates/skills/feature-full/SKILL.md +39 -142
- package/templates/skills/feature-full/steps/step-01-implementation.md +120 -0
- package/templates/skills/gitflow/references/init-config-template.md +135 -0
- package/templates/skills/gitflow/references/init-name-normalization.md +103 -0
- package/templates/skills/gitflow/references/plan-template.md +69 -0
- package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -0
- package/templates/skills/gitflow/references/start-local-config.md +110 -0
- package/templates/skills/gitflow/steps/step-init.md +18 -289
- package/templates/skills/gitflow/steps/step-plan.md +6 -63
- package/templates/skills/gitflow/steps/step-start.md +16 -126
- package/templates/skills/mcp/SKILL.md +9 -213
- package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -0
- package/templates/skills/mcp/steps/step-02-tools.md +73 -0
- package/templates/skills/notification/SKILL.md +7 -0
- package/templates/skills/quick-search/SKILL.md +5 -0
- package/templates/skills/ralph-loop/SKILL.md +99 -381
- package/templates/skills/ralph-loop/references/category-rules.md +259 -0
- package/templates/skills/ralph-loop/references/compact-loop.md +182 -0
- package/templates/skills/ralph-loop/references/core-seed-data.md +173 -21
- package/templates/skills/ralph-loop/references/task-transform-legacy.md +259 -0
- package/templates/skills/ralph-loop/references/team-orchestration.md +189 -0
- package/templates/skills/ralph-loop/steps/step-00-init.md +111 -383
- package/templates/skills/ralph-loop/steps/step-01-task.md +79 -896
- package/templates/skills/ralph-loop/steps/step-02-execute.md +68 -680
- package/templates/skills/ralph-loop/steps/step-03-commit.md +47 -277
- package/templates/skills/ralph-loop/steps/step-04-check.md +124 -607
- package/templates/skills/ralph-loop/steps/step-05-report.md +68 -367
- package/templates/skills/refactor/SKILL.md +12 -176
- package/templates/skills/refactor/steps/step-01-discover.md +60 -0
- package/templates/skills/refactor/steps/step-02-execute.md +67 -0
- package/templates/skills/review-code/SKILL.md +19 -257
- package/templates/skills/review-code/steps/step-01-smartstack.md +96 -0
- package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -0
- package/templates/skills/review-code/steps/step-03-react.md +44 -0
- package/templates/skills/ui-components/SKILL.md +7 -0
- package/templates/skills/utils/SKILL.md +6 -0
- package/templates/skills/validate/SKILL.md +6 -0
- package/templates/skills/validate-feature/SKILL.md +8 -0
- package/templates/skills/workflow/SKILL.md +40 -118
- package/templates/skills/workflow/steps/step-01-implementation.md +84 -0
|
@@ -92,133 +92,10 @@ ELSE:
|
|
|
92
92
|
> Skip organizational questions (adoption, change management, governance, KPIs).
|
|
93
93
|
> Focus on functional decisions and technical challenges.
|
|
94
94
|
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
**
|
|
98
|
-
|
|
99
|
-
Ask via AskUserQuestion (2 questions):
|
|
100
|
-
```
|
|
101
|
-
question: "Quel est le besoin principal de cette application ?"
|
|
102
|
-
header: "Besoin"
|
|
103
|
-
options:
|
|
104
|
-
- label: "Automatiser un processus manuel"
|
|
105
|
-
description: "Remplacer des taches repetitives par une application"
|
|
106
|
-
- label: "Creer un outil manquant"
|
|
107
|
-
description: "Construire quelque chose qui n'existe pas encore"
|
|
108
|
-
- label: "Remplacer un outil existant"
|
|
109
|
-
description: "Remplacer un logiciel ou tableur qui ne convient plus"
|
|
110
|
-
- label: "Centraliser des donnees"
|
|
111
|
-
description: "Rassembler des informations dispersees en un seul endroit"
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
```
|
|
115
|
-
question: "Quelles fonctionnalites sont indispensables pour la V1 ?"
|
|
116
|
-
header: "Indispensable"
|
|
117
|
-
multiSelect: true
|
|
118
|
-
options:
|
|
119
|
-
→ Generate 4 options dynamically from {feature_description}
|
|
120
|
-
→ Each option = one functional area detected in the description
|
|
121
|
-
→ Example for HR app: "Gestion des employes", "Saisie des heures", "Gestion des conges", "Rapports et exports"
|
|
122
|
-
```
|
|
123
|
-
|
|
124
|
-
**Store:**
|
|
125
|
-
```yaml
|
|
126
|
-
problem_type: string (from Q1)
|
|
127
|
-
must_have_features: string[] (from Q2)
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### 4v. Vibe Coding — Lot 2: Users & Permissions
|
|
131
|
-
|
|
132
|
-
**Goal:** Determine access model (solo vs multi-user) and roles.
|
|
133
|
-
|
|
134
|
-
Ask via AskUserQuestion:
|
|
135
|
-
```
|
|
136
|
-
question: "Qui va utiliser cette application ?"
|
|
137
|
-
header: "Utilisateurs"
|
|
138
|
-
options:
|
|
139
|
-
- label: "Moi seul"
|
|
140
|
-
description: "Application mono-utilisateur, je suis l'unique admin"
|
|
141
|
-
- label: "Quelques utilisateurs (2-10)"
|
|
142
|
-
description: "Petite equipe avec des roles differents"
|
|
143
|
-
- label: "Organisation (10+)"
|
|
144
|
-
description: "Deploiement a l'echelle d'une equipe ou entreprise"
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
```
|
|
148
|
-
IF "Moi seul":
|
|
149
|
-
Auto-set:
|
|
150
|
-
applicationRoles = [{ role: "{App} Admin", level: "admin", permissionPattern: "business.{app}.*" }]
|
|
151
|
-
stakeholders = [{ role: "Developpeur", function: "Product owner et developpeur", involvement: "decision-maker", tasks: ["Toutes les operations"] }]
|
|
152
|
-
→ SKIP role question
|
|
153
|
-
|
|
154
|
-
IF "Quelques utilisateurs" or "Organisation":
|
|
155
|
-
Display standard 4-tier roles table, then ask:
|
|
156
|
-
question: "Ces 4 roles (Admin, Manager, Contributor, Viewer) conviennent-ils ?"
|
|
157
|
-
header: "Roles"
|
|
158
|
-
options:
|
|
159
|
-
- label: "Oui, parfait"
|
|
160
|
-
description: "Utiliser les 4 roles standards"
|
|
161
|
-
- label: "Personnaliser"
|
|
162
|
-
description: "Modifier les roles ou permissions"
|
|
163
|
-
|
|
164
|
-
Auto-set stakeholders from user type:
|
|
165
|
-
IF "Quelques utilisateurs":
|
|
166
|
-
stakeholders = [
|
|
167
|
-
{ role: "Administrateur", function: "Gere le systeme et les utilisateurs", involvement: "decision-maker", tasks: ["Configuration", "Gestion utilisateurs"] },
|
|
168
|
-
{ role: "Utilisateur", function: "Utilise le systeme au quotidien", involvement: "end-user", tasks: ["Saisie", "Consultation"] }
|
|
169
|
-
]
|
|
170
|
-
IF "Organisation":
|
|
171
|
-
stakeholders = [
|
|
172
|
-
{ role: "Administrateur", function: "Gere le systeme", involvement: "decision-maker", tasks: ["Configuration", "Gestion"] },
|
|
173
|
-
{ role: "Manager", function: "Supervise et valide", involvement: "approver", tasks: ["Validation", "Reporting"] },
|
|
174
|
-
{ role: "Utilisateur", function: "Operations quotidiennes", involvement: "end-user", tasks: ["Saisie", "Consultation"] }
|
|
175
|
-
]
|
|
176
|
-
```
|
|
177
|
-
|
|
178
|
-
### 5v. Vibe Coding — Lot 3: Technical Challenges
|
|
179
|
-
|
|
180
|
-
**Goal:** Identify technical risks specific to AI-assisted development.
|
|
181
|
-
|
|
182
|
-
Ask via AskUserQuestion:
|
|
183
|
-
```
|
|
184
|
-
question: "Quels defis techniques anticipez-vous ?"
|
|
185
|
-
header: "Defis"
|
|
186
|
-
multiSelect: true
|
|
187
|
-
options:
|
|
188
|
-
- label: "Regles metier complexes"
|
|
189
|
-
description: "Calculs, validations ou workflows difficiles a specifier"
|
|
190
|
-
- label: "Volume de donnees"
|
|
191
|
-
description: "Grandes quantites de donnees a gerer ou migrer"
|
|
192
|
-
- label: "Integrations externes"
|
|
193
|
-
description: "APIs, services tiers ou synchronisation avec d'autres systemes"
|
|
194
|
-
- label: "Interface riche"
|
|
195
|
-
description: "Ecrans avec beaucoup d'interactions, graphiques ou visualisations"
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
**Auto-infer cadrage data (DO NOT ask these — derive from answers):**
|
|
199
|
-
|
|
200
|
-
```yaml
|
|
201
|
-
cadrage.problem: "{feature_description} — {problem_type}"
|
|
202
|
-
cadrage.asIs: "Aucun systeme en place" | "Processus manuel existant" | "Outil existant a remplacer"
|
|
203
|
-
→ Derived from Lot 1 problem_type
|
|
204
|
-
cadrage.toBe: "Application {application_name} couvrant: {must_have_features joined}"
|
|
205
|
-
cadrage.trigger: "Projet vibe coding initie par le developpeur"
|
|
206
|
-
cadrage.risks:
|
|
207
|
-
→ Map each selected technical challenge to a RISK entry:
|
|
208
|
-
- "Regles metier complexes" → RISK-001, type: "technical", probability: "medium", impact: "high"
|
|
209
|
-
- "Volume de donnees" → RISK-002, type: "technical", probability: "low", impact: "medium"
|
|
210
|
-
- "Integrations externes" → RISK-003, type: "technical", probability: "medium", impact: "medium"
|
|
211
|
-
- "Interface riche" → RISK-004, type: "technical", probability: "low", impact: "low"
|
|
212
|
-
→ Add mitigation for each: "Specification detaillee dans step-03 + generation iterative"
|
|
213
|
-
cadrage.acceptanceCriteria:
|
|
214
|
-
- { id: "AC-001", criterion: "Toutes les fonctionnalites must-have implementees et fonctionnelles", validated: false }
|
|
215
|
-
- { id: "AC-002", criterion: "Application deployable et utilisable", validated: false }
|
|
216
|
-
cadrage.globalScope:
|
|
217
|
-
mustHave: {must_have_features}
|
|
218
|
-
shouldHave: [] → Determined later in coverage matrix
|
|
219
|
-
couldHave: [] → Determined later in coverage matrix
|
|
220
|
-
outOfScope: []
|
|
221
|
-
```
|
|
95
|
+
See [references/cadrage-vibe-coding.md](../references/cadrage-vibe-coding.md) for the complete 3-lot questionnaire:
|
|
96
|
+
- **Lot 1 (3v):** Problem & Scope — capture core need + must-have features
|
|
97
|
+
- **Lot 2 (4v):** Users & Permissions — access model (solo/team/org) + roles
|
|
98
|
+
- **Lot 3 (5v):** Technical Challenges — risks specific to AI-assisted dev + auto-inferred cadrage data
|
|
222
99
|
|
|
223
100
|
**After Lot 3:** Go directly to **section 9 (Coverage Matrix)**.
|
|
224
101
|
|
|
@@ -389,73 +266,7 @@ If a feature is in mustHave → it MUST have at least one UC in the correspondin
|
|
|
389
266
|
|
|
390
267
|
Use ba-writer to enrich master feature.json. **Follow the STRUCTURE CARDS below exactly.**
|
|
391
268
|
|
|
392
|
-
|
|
393
|
-
> ```json
|
|
394
|
-
> {
|
|
395
|
-
> "role": "Fleet Manager",
|
|
396
|
-
> "function": "Manages daily fleet operations",
|
|
397
|
-
> "involvement": "decision-maker",
|
|
398
|
-
> "tasks": ["Monitor vehicles", "Approve repairs", "Export reports"],
|
|
399
|
-
> "frequency": "Daily",
|
|
400
|
-
> "painPoints": ["Manual tracking in spreadsheets", "No real-time visibility"]
|
|
401
|
-
> }
|
|
402
|
-
> ```
|
|
403
|
-
> **MANDATORY fields:** `role`, `function`, `involvement`, `tasks`
|
|
404
|
-
> **involvement values:** `approver`, `decision-maker`, `consulted`, `informed`, `end-user`
|
|
405
|
-
> **FORBIDDEN fields:** Do NOT use `expertise`, `systemRole`, `description` (use `function` instead).
|
|
406
|
-
|
|
407
|
-
> **STRUCTURE CARD: cadrage.applicationRoles[]**
|
|
408
|
-
> ```json
|
|
409
|
-
> {
|
|
410
|
-
> "role": "{App} Admin",
|
|
411
|
-
> "description": "Full access to all modules",
|
|
412
|
-
> "level": "admin",
|
|
413
|
-
> "permissionPattern": "business.{app}.*"
|
|
414
|
-
> }
|
|
415
|
-
> ```
|
|
416
|
-
> **MANDATORY fields:** `role`, `level`, `permissionPattern`
|
|
417
|
-
> **level values:** `admin`, `manager`, `contributor`, `viewer`
|
|
418
|
-
> **FORBIDDEN fields:** Do NOT use `permissions` (use `permissionPattern`), `isDefault`.
|
|
419
|
-
|
|
420
|
-
> **STRUCTURE CARD: cadrage.risks[]**
|
|
421
|
-
> ```json
|
|
422
|
-
> {
|
|
423
|
-
> "id": "RISK-001",
|
|
424
|
-
> "type": "business|technical|organizational",
|
|
425
|
-
> "description": "CSV data may contain duplicates and errors",
|
|
426
|
-
> "probability": "high|medium|low",
|
|
427
|
-
> "impact": "high|medium|low",
|
|
428
|
-
> "priority": "critical|medium|low",
|
|
429
|
-
> "mitigation": "Data cleaning phase before import, detailed error reports"
|
|
430
|
-
> }
|
|
431
|
-
> ```
|
|
432
|
-
> **MANDATORY fields:** `id` (pattern: RISK-NNN), `type`, `description`, `mitigation`
|
|
433
|
-
> **FORBIDDEN fields:** Do NOT use `risk` (name), `severity`. Use `id` + `description` + `priority`.
|
|
434
|
-
|
|
435
|
-
> **STRUCTURE CARD: cadrage.acceptanceCriteria[]**
|
|
436
|
-
> ```json
|
|
437
|
-
> { "id": "AC-001", "criterion": "All must-have features delivered and tested", "validated": false }
|
|
438
|
-
> ```
|
|
439
|
-
> **MANDATORY:** This section must NOT be omitted.
|
|
440
|
-
|
|
441
|
-
> **STRUCTURE CARD: cadrage.coverageMatrix[]**
|
|
442
|
-
> ```json
|
|
443
|
-
> {
|
|
444
|
-
> "item": "User management with CRUD",
|
|
445
|
-
> "category": "mustHave|shouldHave|couldHave|outOfScope|implicit",
|
|
446
|
-
> "module": "Users",
|
|
447
|
-
> "ucRef": "UC-UM-001",
|
|
448
|
-
> "notes": "Foundation module, must be implemented first"
|
|
449
|
-
> }
|
|
450
|
-
> ```
|
|
451
|
-
> **MANDATORY fields:** `item`, `category`, `module`
|
|
452
|
-
> **category values:** `mustHave`, `shouldHave`, `couldHave`, `outOfScope`, `implicit` (camelCase)
|
|
453
|
-
> **FORBIDDEN fields:** Do NOT use `id`, `feature`, `priority`. Use `item` + `category`.
|
|
454
|
-
|
|
455
|
-
> **STRUCTURE CARD: cadrage.codebaseContext** — Must be a string, NOT an object.
|
|
456
|
-
> ```json
|
|
457
|
-
> "codebaseContext": "Greenfield project, no existing entities. SmartStack 2.1.0 with Extensions DbContext."
|
|
458
|
-
> ```
|
|
269
|
+
See [references/cadrage-structure-cards.md](../references/cadrage-structure-cards.md) for exact JSON formats of: `stakeholders[]`, `applicationRoles[]`, `risks[]`, `acceptanceCriteria[]`, `coverageMatrix[]`, `codebaseContext`.
|
|
459
270
|
|
|
460
271
|
```
|
|
461
272
|
ba-writer.enrichSection({
|
|
@@ -62,6 +62,42 @@ IF module already specified (status = "specified" in master):
|
|
|
62
62
|
Increment currentModuleIndex, re-check
|
|
63
63
|
IF all modules specified → Load step-04-consolidation.md, STOP
|
|
64
64
|
|
|
65
|
+
### 1b. Cache Warming for Module Loop (FIRST MODULE ONLY)
|
|
66
|
+
|
|
67
|
+
> **Performance Optimization:** Pre-load module specification references to reduce redundant reads across all modules.
|
|
68
|
+
> This step runs ONLY for the FIRST module (currentModuleIndex = 0), not repeated for subsequent modules.
|
|
69
|
+
|
|
70
|
+
```
|
|
71
|
+
IF currentModuleIndex === 0:
|
|
72
|
+
// Pre-load module specification references (Bucket 3)
|
|
73
|
+
const moduleRefs = [
|
|
74
|
+
"~/.claude/skills/business-analyse/references/spec-auto-inference.md",
|
|
75
|
+
"~/.claude/skills/business-analyse/references/ui-resource-cards.md",
|
|
76
|
+
"~/.claude/skills/business-analyse/references/ui-dashboard-spec.md",
|
|
77
|
+
"~/.claude/skills/business-analyse/references/cadrage-vibe-coding.md"
|
|
78
|
+
];
|
|
79
|
+
|
|
80
|
+
for (const file of moduleRefs) {
|
|
81
|
+
read(file); // Pre-load into cache
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
Display: "✓ Cache warmed: module specification references (23KB, 4 files)"
|
|
85
|
+
Display: " Expected token savings: 75% reduction in reference reads across module loop"
|
|
86
|
+
Display: " Retention: until step-04 (after all modules specified)"
|
|
87
|
+
ELSE:
|
|
88
|
+
// Subsequent modules use cached references (no re-load)
|
|
89
|
+
Display: "✓ Using cached module references (from first module)"
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
**Rationale:**
|
|
93
|
+
|
|
94
|
+
- Module specification references are read 2-3× PER MODULE (5 modules = 10-15 reads without caching)
|
|
95
|
+
- Pre-loading once at start of module loop eliminates 75% of redundant reads
|
|
96
|
+
- Token savings: ~10,000 tokens for a 5-module application
|
|
97
|
+
- Cache retained until step-04 (when consolidation starts, references no longer needed)
|
|
98
|
+
|
|
99
|
+
See [references/cache-warming-strategy.md](../references/cache-warming-strategy.md) § Bucket 3 for details.
|
|
100
|
+
|
|
65
101
|
### 2. Initialize Module Feature.json
|
|
66
102
|
|
|
67
103
|
```
|
|
@@ -245,55 +281,12 @@ Display to client:
|
|
|
245
281
|
|
|
246
282
|
**Prerequisites:** Entity attributes must be defined (from step 6) OR anticipated from decomposition.
|
|
247
283
|
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
| enum / status | badge | yes | yes (multi-select) | colorMap from lifeCycles if exists |
|
|
255
|
-
| FK:Entity | text (join .name) | yes | yes (entity-select) | Display related entity name |
|
|
256
|
-
| decimal | currency | yes | no | — |
|
|
257
|
-
| int | number | yes | no | — |
|
|
258
|
-
| datetime | date-relative | yes | yes (date-range) | — |
|
|
259
|
-
| bool | boolean | yes | yes (toggle) | — |
|
|
260
|
-
| text (long) | — | no | no | Hidden in table, visible in detail |
|
|
261
|
-
|
|
262
|
-
**Inference rules - Entity attribute → SmartForm field:**
|
|
263
|
-
|
|
264
|
-
| Attribute Type | Component | Required from | Notes |
|
|
265
|
-
|---|---|---|---|
|
|
266
|
-
| string | Input | entity.required | — |
|
|
267
|
-
| string (multiline) | TextArea | entity.required | rows: 4 |
|
|
268
|
-
| enum | Select | entity.required | source: enum name |
|
|
269
|
-
| FK:Entity | EntitySelect | entity.required | source: target entity, searchable |
|
|
270
|
-
| decimal | NumberInput | entity.required | — |
|
|
271
|
-
| int | NumberInput | entity.required | — |
|
|
272
|
-
| datetime | DatePicker | entity.required | — |
|
|
273
|
-
| bool | Toggle | — | default: false |
|
|
274
|
-
|
|
275
|
-
**Auto-generated sections per featureType:**
|
|
276
|
-
|
|
277
|
-
| featureType | Sections generated |
|
|
278
|
-
|---|---|
|
|
279
|
-
| data-centric | list, create, detail |
|
|
280
|
-
| workflow | list, create, detail, edit |
|
|
281
|
-
| integration | list, detail, config |
|
|
282
|
-
| reporting | dashboard |
|
|
283
|
-
| full-module | list, create, detail, edit, dashboard |
|
|
284
|
-
|
|
285
|
-
**For each auto-generated section:**
|
|
286
|
-
|
|
287
|
-
1. **list section:** SmartTable with all non-long-text attributes as columns (convention or columnDefs based on depth), actions = [view, edit, delete], defaultSort = { createdAt, desc }
|
|
288
|
-
2. **create section:** SmartForm with all writable attributes as fields, component inferred from type
|
|
289
|
-
3. **detail section:** DetailCard with all attributes + child SmartTable for each 1:N relationship
|
|
290
|
-
4. **edit section:** Same as create but pre-filled (mode: edit)
|
|
291
|
-
5. **dashboard section:** Trigger 3d (dashboard specification)
|
|
292
|
-
|
|
293
|
-
**If entity has a status/enum field AND lifeCycles exists:**
|
|
294
|
-
- list section: status column gets `format: badge`, `colorMap: stateMachine:{Entity}`
|
|
295
|
-
- list section: rowActions get `showWhen` conditions based on state machine transitions
|
|
296
|
-
- detail section: add StatusBadge resource + transition action buttons
|
|
284
|
+
See [references/spec-auto-inference.md](../references/spec-auto-inference.md) for complete inference rules:
|
|
285
|
+
- Entity attribute → SmartTable column mapping (9 type rules)
|
|
286
|
+
- Entity attribute → SmartForm field mapping (8 type rules)
|
|
287
|
+
- Auto-generated sections per featureType (5 types)
|
|
288
|
+
- Section generation rules (list, create, detail, edit, dashboard)
|
|
289
|
+
- Status/lifecycle enhancement rules
|
|
297
290
|
|
|
298
291
|
Write auto-generated sections to `specification.sections[]` via ba-writer.enrichSection()
|
|
299
292
|
|
|
@@ -122,72 +122,9 @@ For EACH section confirmed in 3a, build the `specification.sections[]` structure
|
|
|
122
122
|
|
|
123
123
|
4. Build the section object:
|
|
124
124
|
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
> "code": "list",
|
|
129
|
-
> "labels": { "fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste" },
|
|
130
|
-
> "route": "/business/{app}/{module}/list",
|
|
131
|
-
> "icon": "list",
|
|
132
|
-
> "permission": "business.{app}.{module}.read",
|
|
133
|
-
> "wireframe": "{module}-list",
|
|
134
|
-
> "useCases": ["UC-{PREFIX}-001", "UC-{PREFIX}-002"],
|
|
135
|
-
> "businessRules": ["BR-VAL-{PREFIX}-001"],
|
|
136
|
-
> "resources": [
|
|
137
|
-
> {
|
|
138
|
-
> "code": "{module}-grid",
|
|
139
|
-
> "type": "SmartTable",
|
|
140
|
-
> "entity": "{MainEntity}",
|
|
141
|
-
> "permission": "business.{app}.{module}.read",
|
|
142
|
-
> "columns": ["name", "status", "createdAt"],
|
|
143
|
-
> "columnDefs": [
|
|
144
|
-
> { "field": "code", "label": {"fr": "Code", "en": "Code"}, "format": "text", "sortable": true, "filterable": true, "clickAction": "navigate:detail" },
|
|
145
|
-
> { "field": "name", "label": {"fr": "Nom", "en": "Name"}, "format": "text", "sortable": true, "filterable": true },
|
|
146
|
-
> { "field": "status", "label": {"fr": "Statut", "en": "Status"}, "format": "badge", "sortable": true, "filterable": true, "colorMap": "stateMachine:{Entity}" },
|
|
147
|
-
> { "field": "createdAt", "label": {"fr": "Créé le", "en": "Created"}, "format": "date-relative", "sortable": true }
|
|
148
|
-
> ],
|
|
149
|
-
> "actions": ["view", "edit", "delete"],
|
|
150
|
-
> "rowActions": [
|
|
151
|
-
> { "action": "view", "icon": "eye", "permission": "business.{app}.{module}.read" },
|
|
152
|
-
> { "action": "edit", "icon": "edit", "permission": "business.{app}.{module}.update", "showWhen": {"status": ["draft"]} },
|
|
153
|
-
> { "action": "delete", "icon": "trash", "permission": "business.{app}.{module}.delete", "confirm": true }
|
|
154
|
-
> ],
|
|
155
|
-
> "filters": ["status", "dateRange"],
|
|
156
|
-
> "defaultSort": { "field": "createdAt", "direction": "desc" },
|
|
157
|
-
> "defaultPageSize": 20,
|
|
158
|
-
> "emptyState": { "icon": "inbox", "message": {"fr": "Aucun enregistrement", "en": "No records"}, "createAction": true }
|
|
159
|
-
> }
|
|
160
|
-
> ]
|
|
161
|
-
> }
|
|
162
|
-
> ```
|
|
163
|
-
>
|
|
164
|
-
> **SmartForm resource example (for create/edit sections):**
|
|
165
|
-
> ```json
|
|
166
|
-
> {
|
|
167
|
-
> "code": "{module}-form",
|
|
168
|
-
> "type": "SmartForm",
|
|
169
|
-
> "entity": "{MainEntity}",
|
|
170
|
-
> "permission": "business.{app}.{module}.create",
|
|
171
|
-
> "fields": [
|
|
172
|
-
> { "name": "code", "component": "Input", "required": true, "validation": "Unique, auto-generated" },
|
|
173
|
-
> { "name": "name", "component": "Input", "required": true },
|
|
174
|
-
> { "name": "type", "component": "Select", "required": true, "source": "EntityTypeEnum" },
|
|
175
|
-
> { "name": "description", "component": "TextArea", "required": false },
|
|
176
|
-
> { "name": "parentId", "component": "EntitySelect", "source": "ParentEntity", "required": true },
|
|
177
|
-
> { "name": "startDate", "component": "DatePicker", "required": true },
|
|
178
|
-
> { "name": "isActive", "component": "Toggle", "default": true }
|
|
179
|
-
> ],
|
|
180
|
-
> "formLayout": {
|
|
181
|
-
> "type": "tabs",
|
|
182
|
-
> "tabs": [
|
|
183
|
-
> { "code": "general", "label": {"fr": "Général", "en": "General"}, "fields": ["code", "name", "type", "description"] },
|
|
184
|
-
> { "code": "details", "label": {"fr": "Détails", "en": "Details"}, "fields": ["parentId", "startDate", "isActive"] }
|
|
185
|
-
> ]
|
|
186
|
-
> }
|
|
187
|
-
> }
|
|
188
|
-
> ```
|
|
189
|
-
> **MANDATORY for SmartTable:** `columnDefs`, `rowActions`, `defaultSort`, `emptyState`
|
|
190
|
-
> **MANDATORY for SmartForm:** `fields` with `component` type, `formLayout`
|
|
125
|
+
See [references/ui-resource-cards.md](../references/ui-resource-cards.md) for exact JSON formats of `specification.sections[]` (SmartTable + SmartForm resources).
|
|
126
|
+
**MANDATORY for SmartTable:** `columnDefs`, `rowActions`, `defaultSort`, `emptyState`
|
|
127
|
+
**MANDATORY for SmartForm:** `fields` with `component` type, `formLayout`
|
|
191
128
|
|
|
192
129
|
5. Write `specification.sections[]` via ba-writer.enrichSection()
|
|
193
130
|
|
|
@@ -218,39 +155,9 @@ Example for a list section:
|
|
|
218
155
|
|
|
219
156
|
Store in specification.uiWireframes[] (**MANDATORY** for every section):
|
|
220
157
|
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
> "screen": "{module}-{section}",
|
|
225
|
-
> "section": "{section}",
|
|
226
|
-
> "description": "Description of the screen",
|
|
227
|
-
> "mockupFormat": "ascii",
|
|
228
|
-
> "mockup": "╔═══...",
|
|
229
|
-
> "elements": ["DataGrid", "FilterBar", "Pagination", "CreateButton"],
|
|
230
|
-
> "actions": ["filter", "sort", "create", "view-detail"],
|
|
231
|
-
> "permissionsRequired": ["business.{app}.{module}.read"],
|
|
232
|
-
> "componentMapping": [
|
|
233
|
-
> { "wireframeElement": "DataGrid", "reactComponent": "SmartTable" },
|
|
234
|
-
> { "wireframeElement": "FilterBar", "reactComponent": "SmartFilter" },
|
|
235
|
-
> { "wireframeElement": "CreateButton", "reactComponent": "Button" }
|
|
236
|
-
> ],
|
|
237
|
-
> "layout": {
|
|
238
|
-
> "type": "page",
|
|
239
|
-
> "regions": [
|
|
240
|
-
> { "id": "toolbar", "position": "top", "components": [
|
|
241
|
-
> { "type": "FilterBar", "resourceRef": "{module}-filters" },
|
|
242
|
-
> { "type": "ActionMenu", "resourceRef": "{module}-actions", "permission": "business.{app}.{module}.create" }
|
|
243
|
-
> ]},
|
|
244
|
-
> { "id": "content", "position": "main", "span": 12, "components": [
|
|
245
|
-
> { "type": "SmartTable", "resourceRef": "{module}-grid" }
|
|
246
|
-
> ]}
|
|
247
|
-
> ]
|
|
248
|
-
> }
|
|
249
|
-
> }
|
|
250
|
-
> ```
|
|
251
|
-
> **REQUIRED fields:** `screen`, `mockup`, `elements`, `section`, `componentMapping`, `layout` are ALL mandatory.
|
|
252
|
-
> A wireframe without `componentMapping` or `layout` will FAIL validation in step 9.
|
|
253
|
-
> **layout.regions[].components[].resourceRef** MUST match a `sections[].resources[].code`.
|
|
158
|
+
See [references/ui-resource-cards.md](../references/ui-resource-cards.md) for exact JSON format of `specification.uiWireframes[]`.
|
|
159
|
+
**REQUIRED fields:** `screen`, `mockup`, `elements`, `section`, `componentMapping`, `layout` are ALL mandatory.
|
|
160
|
+
A wireframe without `componentMapping` or `layout` will FAIL validation in step 9.
|
|
254
161
|
|
|
255
162
|
Ask client to validate each mockup via AskUserQuestion (batch 2-3 mockups at once if possible).
|
|
256
163
|
|
|
@@ -313,85 +220,12 @@ For each section, identify what resources/components are needed:
|
|
|
313
220
|
|
|
314
221
|
### 3d. Dashboard Specification (if section = dashboard)
|
|
315
222
|
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
- Format: `number`, `currency`, `percent`, `duration`
|
|
323
|
-
- Thresholds (warning/critical) if applicable
|
|
324
|
-
|
|
325
|
-
2. **Ask client for filters:**
|
|
326
|
-
- Date range filter? Default period? (day/week/month/quarter/year)
|
|
327
|
-
- Entity-based filters? (status, category, etc.)
|
|
328
|
-
|
|
329
|
-
3. **Ask client for refresh mode:**
|
|
330
|
-
- Static (load on page open)
|
|
331
|
-
- Polling (periodic refresh)
|
|
332
|
-
- SignalR (real-time push)
|
|
333
|
-
|
|
334
|
-
4. **Store in specification.dashboards[]:**
|
|
335
|
-
|
|
336
|
-
```json
|
|
337
|
-
{
|
|
338
|
-
"code": "{module}-dashboard",
|
|
339
|
-
"title": "{Module} Dashboard",
|
|
340
|
-
"description": "Vue d'ensemble des métriques {module}",
|
|
341
|
-
"linkedUCs": ["UC-XXX"],
|
|
342
|
-
"refreshMode": "static",
|
|
343
|
-
"defaultPeriod": "month",
|
|
344
|
-
"kpis": [
|
|
345
|
-
{
|
|
346
|
-
"code": "total-items",
|
|
347
|
-
"label": "Total Items",
|
|
348
|
-
"metric": "COUNT(entity)",
|
|
349
|
-
"format": "number",
|
|
350
|
-
"visualization": "kpi-card",
|
|
351
|
-
"dataSource": "Entity",
|
|
352
|
-
"thresholds": { "warning": 100, "critical": 50 }
|
|
353
|
-
},
|
|
354
|
-
{
|
|
355
|
-
"code": "items-by-status",
|
|
356
|
-
"label": "Items by Status",
|
|
357
|
-
"metric": "COUNT(entity) GROUP BY status",
|
|
358
|
-
"format": "number",
|
|
359
|
-
"visualization": "pie",
|
|
360
|
-
"dataSource": "Entity",
|
|
361
|
-
"dimensions": ["status"]
|
|
362
|
-
}
|
|
363
|
-
],
|
|
364
|
-
"filters": [
|
|
365
|
-
{ "field": "dateRange", "type": "dateRange", "label": "Période" },
|
|
366
|
-
{ "field": "status", "type": "multiselect", "label": "Statut" }
|
|
367
|
-
],
|
|
368
|
-
"permissionsRequired": ["business.{app}.{module}.read"]
|
|
369
|
-
}
|
|
370
|
-
```
|
|
371
|
-
|
|
372
|
-
5. **ALSO generate the standard ASCII mockup** for the dashboard with KPI cards + chart placeholders:
|
|
373
|
-
|
|
374
|
-
```
|
|
375
|
-
╔═══════════════════════════════════════════════════════════════╗
|
|
376
|
-
║ {Module} > Dashboard Période: [Ce mois ▾] ║
|
|
377
|
-
╠═══════════════════════════════════════════════════════════════╣
|
|
378
|
-
║ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ ║
|
|
379
|
-
║ │ KPI #1 │ │ KPI #2 │ │ KPI #3 │ │ KPI #4 │ ║
|
|
380
|
-
║ │ 1,234 │ │ 567 │ │ 89.2% │ │ 12,400 │ ║
|
|
381
|
-
║ │ ↑ +12% │ │ ↓ -3% │ │ → 0% │ │ ↑ +5% │ ║
|
|
382
|
-
║ └──────────┘ └──────────┘ └──────────┘ └──────────┘ ║
|
|
383
|
-
╠═══════════════════════════════════════════════════════════════╣
|
|
384
|
-
║ ┌─────────────────────────┐ ┌─────────────────────────┐ ║
|
|
385
|
-
║ │ [Bar Chart] │ │ [Pie Chart] │ ║
|
|
386
|
-
║ │ Items by Month │ │ Items by Status │ ║
|
|
387
|
-
║ │ ████ │ │ ████████ │ ║
|
|
388
|
-
║ │ ████ ████ │ │ ███ ███ │ ║
|
|
389
|
-
║ │ ████ ████ ████ │ │ ██ 42% ██ │ ║
|
|
390
|
-
║ └─────────────────────────┘ └─────────────────────────┘ ║
|
|
391
|
-
╚═══════════════════════════════════════════════════════════════╝
|
|
392
|
-
```
|
|
393
|
-
|
|
394
|
-
Store the mockup in specification.wireframes[] AS WELL (for visual reference).
|
|
223
|
+
See [references/ui-dashboard-spec.md](../references/ui-dashboard-spec.md) for the complete dashboard capture process:
|
|
224
|
+
- Ask client for KPIs (name, visualization type, format, thresholds)
|
|
225
|
+
- Ask client for filters (date range, entity-based)
|
|
226
|
+
- Ask client for refresh mode (static/polling/SignalR)
|
|
227
|
+
- Store in `specification.dashboards[]` with full JSON template
|
|
228
|
+
- Generate standard ASCII mockup with KPI cards + chart placeholders
|
|
395
229
|
|
|
396
230
|
---
|
|
397
231
|
|
|
@@ -161,7 +161,7 @@ Module → Sections → Resources (levels 3-4-5 of the hierarchy).
|
|
|
161
161
|
|
|
162
162
|
#### 8f. SeedData Core
|
|
163
163
|
|
|
164
|
-
|
|
164
|
+
7 MANDATORY typed arrays — each with structured objects, NOT flat strings or objects.
|
|
165
165
|
|
|
166
166
|
> **STRUCTURE CARD: specification.seedDataCore**
|
|
167
167
|
> ```json
|
|
@@ -169,6 +169,16 @@ Module → Sections → Resources (levels 3-4-5 of the hierarchy).
|
|
|
169
169
|
> "navigationModules": [
|
|
170
170
|
> { "code": "{module}", "label": "{Module Name}", "icon": "list", "route": "/business/{app}/{module}", "parentCode": "{app}", "sort": 1 }
|
|
171
171
|
> ],
|
|
172
|
+
> "navigationSections": [
|
|
173
|
+
> { "code": "list", "label": "Liste", "icon": "List", "route": "/business/{app}/{module}/list", "parentCode": "{module}", "permission": "business.{app}.{module}.read", "sort": 1 },
|
|
174
|
+
> { "code": "detail", "label": "Détail", "icon": "FileText", "route": "/business/{app}/{module}/detail/:id", "parentCode": "{module}", "permission": "business.{app}.{module}.read", "sort": 2 },
|
|
175
|
+
> { "code": "create", "label": "Créer", "icon": "Plus", "route": "/business/{app}/{module}/create", "parentCode": "{module}", "permission": "business.{app}.{module}.create", "sort": 3 }
|
|
176
|
+
> ],
|
|
177
|
+
> "navigationResources": [
|
|
178
|
+
> { "code": "{module}-grid", "type": "SmartTable", "entity": "{Entity}", "parentCode": "list", "permission": "business.{app}.{module}.read" },
|
|
179
|
+
> { "code": "{module}-form", "type": "SmartForm", "entity": "{Entity}", "parentCode": "create", "permission": "business.{app}.{module}.create" },
|
|
180
|
+
> { "code": "{module}-detail-card", "type": "DetailCard", "entity": "{Entity}", "parentCode": "detail", "permission": "business.{app}.{module}.read" }
|
|
181
|
+
> ],
|
|
172
182
|
> "navigationTranslations": [
|
|
173
183
|
> { "moduleCode": "{module}", "language": "fr", "label": "..." },
|
|
174
184
|
> { "moduleCode": "{module}", "language": "en", "label": "..." },
|
|
@@ -189,9 +199,68 @@ Module → Sections → Resources (levels 3-4-5 of the hierarchy).
|
|
|
189
199
|
> ]
|
|
190
200
|
> }
|
|
191
201
|
> ```
|
|
192
|
-
> **MANDATORY:** All
|
|
202
|
+
> **MANDATORY:** All 7 arrays must be present. Each element must be an object, NOT a string.
|
|
203
|
+
> **CRITICAL:** `navigationSections` and `navigationResources` are DERIVED from `specification.sections[]` — use the transform algorithm below (section 8f-bis).
|
|
193
204
|
> **FORBIDDEN:** Do NOT use `navigationModule` (singular string), `permissions` as flat string array, `rolePermissions` as flat object, `permissionsConstants` as comma-separated string.
|
|
194
205
|
|
|
206
|
+
#### 8f-bis. Transform Sections into Navigation SeedData
|
|
207
|
+
|
|
208
|
+
> **CRITICAL:** `navigationSections` and `navigationResources` must be generated from `specification.sections[]`.
|
|
209
|
+
> This ensures the navigation hierarchy (Module → Section → Resource) is complete in the database.
|
|
210
|
+
|
|
211
|
+
**Transform algorithm:**
|
|
212
|
+
|
|
213
|
+
```javascript
|
|
214
|
+
// 1. Transform specification.sections[] into navigationSections
|
|
215
|
+
const navigationSections = specification.sections.map((section, index) => ({
|
|
216
|
+
code: section.code, // e.g., "list", "detail", "dashboard"
|
|
217
|
+
label: section.labels.fr, // Default language (fr)
|
|
218
|
+
icon: section.icon, // Lucide icon name
|
|
219
|
+
route: section.route, // Full route path
|
|
220
|
+
parentCode: metadata.module, // Module code (parent)
|
|
221
|
+
permission: section.permission, // Required permission
|
|
222
|
+
sort: index + 1 // Display order (1-based)
|
|
223
|
+
}));
|
|
224
|
+
|
|
225
|
+
// 2. Transform specification.sections[].resources[] into navigationResources
|
|
226
|
+
const navigationResources = specification.sections.flatMap(section =>
|
|
227
|
+
section.resources.map(resource => ({
|
|
228
|
+
code: resource.code, // e.g., "employees-grid"
|
|
229
|
+
type: resource.type, // e.g., "SmartTable", "SmartForm"
|
|
230
|
+
entity: resource.entity, // e.g., "Employee"
|
|
231
|
+
parentCode: section.code, // Section code (parent)
|
|
232
|
+
permission: resource.permission // Optional (can inherit from section)
|
|
233
|
+
}))
|
|
234
|
+
);
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
**Write to seedDataCore:**
|
|
238
|
+
|
|
239
|
+
```
|
|
240
|
+
ba-writer.enrichSection({
|
|
241
|
+
feature_id,
|
|
242
|
+
section: "specification",
|
|
243
|
+
data: {
|
|
244
|
+
seedDataCore: {
|
|
245
|
+
navigationModules: [ ... ],
|
|
246
|
+
navigationSections: navigationSections, // DERIVED
|
|
247
|
+
navigationResources: navigationResources, // DERIVED
|
|
248
|
+
navigationTranslations: [ ... ],
|
|
249
|
+
permissions: [ ... ],
|
|
250
|
+
rolePermissions: [ ... ],
|
|
251
|
+
permissionConstants: [ ... ]
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
})
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
**Validation:**
|
|
258
|
+
|
|
259
|
+
- EVERY section in `specification.sections[]` MUST appear in `navigationSections`
|
|
260
|
+
- EVERY resource in `specification.sections[].resources[]` MUST appear in `navigationResources`
|
|
261
|
+
- Total count: `navigationSections.length === specification.sections.length`
|
|
262
|
+
- Total count: `navigationResources.length === sum(sections[].resources.length)`
|
|
263
|
+
|
|
195
264
|
#### 8g. Gherkin Scenarios
|
|
196
265
|
|
|
197
266
|
BDD acceptance tests per UC.
|