@atlashub/smartstack-cli 4.17.1 → 4.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/package.json +1 -1
  2. package/templates/agents/ba-reader.md +86 -80
  3. package/templates/agents/ba-writer.md +321 -413
  4. package/templates/agents/docs-context-reader.md +3 -3
  5. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -0
  6. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +126 -0
  7. package/templates/skills/apex/SKILL.md +29 -16
  8. package/templates/skills/apex/_shared.md +62 -9
  9. package/templates/skills/apex/references/analysis-methods.md +8 -6
  10. package/templates/skills/apex/references/challenge-questions.md +5 -5
  11. package/templates/skills/apex/references/core-seed-data.md +68 -45
  12. package/templates/skills/apex/references/frontend-route-wiring-app-tsx.md +26 -21
  13. package/templates/skills/apex/references/parallel-execution.md +156 -0
  14. package/templates/skills/apex/references/person-extension-pattern.md +12 -12
  15. package/templates/skills/apex/references/post-checks.md +1748 -1726
  16. package/templates/skills/apex/references/smartstack-api.md +63 -57
  17. package/templates/skills/apex/references/smartstack-frontend-compliance.md +594 -0
  18. package/templates/skills/apex/references/smartstack-frontend.md +1246 -1842
  19. package/templates/skills/apex/references/smartstack-layers.md +98 -145
  20. package/templates/skills/apex/steps/step-00-init.md +30 -6
  21. package/templates/skills/apex/steps/step-01-analyze.md +27 -23
  22. package/templates/skills/apex/steps/step-02-plan.md +12 -12
  23. package/templates/skills/apex/steps/step-03-execute.md +198 -143
  24. package/templates/skills/apex/steps/step-04-examine.md +24 -93
  25. package/templates/skills/apex/steps/step-05-deep-review.md +16 -16
  26. package/templates/skills/apex/steps/step-06-resolve.md +9 -9
  27. package/templates/skills/apex/steps/step-07-tests.md +3 -1
  28. package/templates/skills/apex/steps/step-08-run-tests.md +1 -1
  29. package/templates/skills/business-analyse/SKILL.md +182 -301
  30. package/templates/skills/business-analyse/_shared.md +119 -336
  31. package/templates/skills/business-analyse/html/ba-interactive.html +703 -82
  32. package/templates/skills/business-analyse/html/build-html.js +41 -3
  33. package/templates/skills/business-analyse/html/src/partials/cadrage-context.html +34 -0
  34. package/templates/skills/business-analyse/html/src/partials/cadrage-risks.html +48 -0
  35. package/templates/skills/business-analyse/html/src/partials/cadrage-scope.html +49 -0
  36. package/templates/skills/business-analyse/html/src/partials/cadrage-stakeholders.html +55 -0
  37. package/templates/skills/business-analyse/html/src/partials/cadrage-success.html +34 -0
  38. package/templates/skills/business-analyse/html/src/partials/consol-datamodel.html +8 -0
  39. package/templates/skills/business-analyse/html/src/partials/consol-flows.html +29 -0
  40. package/templates/skills/business-analyse/html/src/partials/consol-interactions.html +8 -0
  41. package/templates/skills/business-analyse/html/src/partials/consol-permissions.html +8 -0
  42. package/templates/skills/business-analyse/html/src/partials/decomp-dependencies.html +38 -0
  43. package/templates/skills/business-analyse/html/src/partials/decomp-modules.html +51 -0
  44. package/templates/skills/business-analyse/html/src/partials/handoff-summary.html +24 -0
  45. package/templates/skills/business-analyse/html/src/partials/module-spec-container.html +4 -0
  46. package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +17 -1
  47. package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +31 -5
  48. package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +100 -63
  49. package/templates/skills/business-analyse/html/src/scripts/06-render-mockups.js +372 -0
  50. package/templates/skills/business-analyse/html/src/scripts/10-comments.js +41 -13
  51. package/templates/skills/business-analyse/html/src/styles/09-mockups-html.css +136 -0
  52. package/templates/skills/business-analyse/patterns/suggestion-catalog.md +7 -5
  53. package/templates/skills/business-analyse/questionnaire/02-stakeholders-scope.md +142 -0
  54. package/templates/skills/business-analyse/questionnaire/03-data-ui.md +94 -0
  55. package/templates/skills/business-analyse/questionnaire/04-risks-metrics.md +150 -0
  56. package/templates/skills/business-analyse/questionnaire/05-cross-module.md +69 -0
  57. package/templates/skills/business-analyse/questionnaire.md +23 -280
  58. package/templates/skills/business-analyse/react/application-viewer.md +2 -2
  59. package/templates/skills/business-analyse/react/components.md +4 -4
  60. package/templates/skills/business-analyse/react/i18n-template.md +1 -1
  61. package/templates/skills/business-analyse/react/schema.md +14 -14
  62. package/templates/skills/business-analyse/references/acceptance-criteria.md +25 -25
  63. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +3 -3
  64. package/templates/skills/business-analyse/references/compilation-structure-cards.md +1 -1
  65. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +7 -7
  66. package/templates/skills/business-analyse/references/deploy-data-build.md +14 -12
  67. package/templates/skills/business-analyse/references/deploy-modes.md +10 -10
  68. package/templates/skills/business-analyse/references/detection-strategies.md +6 -6
  69. package/templates/skills/business-analyse/references/html-data-mapping.md +15 -15
  70. package/templates/skills/business-analyse/references/naming-conventions.md +4 -4
  71. package/templates/skills/business-analyse/references/review-data-mapping.md +29 -29
  72. package/templates/skills/business-analyse/references/robustness-checks.md +36 -33
  73. package/templates/skills/business-analyse/references/spec-auto-inference.md +2 -2
  74. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +1 -1
  75. package/templates/skills/business-analyse/references/ui-resource-cards.md +1 -1
  76. package/templates/skills/business-analyse/references/validation-checklist.md +9 -6
  77. package/templates/skills/business-analyse/references/wireframe-svg-style-guide.md +2 -2
  78. package/templates/skills/business-analyse/schemas/application-schema.json +8 -8
  79. package/templates/skills/business-analyse/schemas/feature-schema.json +3 -3
  80. package/templates/skills/business-analyse/schemas/index-schema.json +47 -0
  81. package/templates/skills/business-analyse/schemas/project-schema.json +6 -6
  82. package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +1 -1
  83. package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +5 -3
  84. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +4 -4
  85. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +1 -1
  86. package/templates/skills/business-analyse/schemas/shared/common-defs.json +4 -3
  87. package/templates/skills/business-analyse/steps/step-00-init.md +93 -134
  88. package/templates/skills/business-analyse/steps/step-01-cadrage.md +136 -172
  89. package/templates/skills/business-analyse/steps/step-02-structure.md +175 -0
  90. package/templates/skills/business-analyse/steps/step-03-specify.md +198 -0
  91. package/templates/skills/business-analyse/steps/step-04-consolidate.md +478 -0
  92. package/templates/skills/business-analyse/steps/step-05-deploy.md +220 -0
  93. package/templates/skills/business-analyse/steps/step-06-review.md +51 -69
  94. package/templates/skills/business-analyse/templates/tpl-frd.md +1 -1
  95. package/templates/skills/business-analyse/templates/tpl-handoff.md +20 -17
  96. package/templates/skills/business-analyse/templates/tpl-launch-displays.md +2 -2
  97. package/templates/skills/business-analyse/templates-react.md +2 -2
  98. package/templates/skills/derive-prd/SKILL.md +92 -0
  99. package/templates/skills/derive-prd/references/acceptance-criteria.md +169 -0
  100. package/templates/skills/derive-prd/references/entity-domain-mapping.md +115 -0
  101. package/templates/skills/{business-analyse → derive-prd}/references/handoff-file-templates.md +131 -120
  102. package/templates/skills/{business-analyse → derive-prd}/references/handoff-mappings.md +95 -95
  103. package/templates/skills/{business-analyse → derive-prd}/references/handoff-seeddata-generation.md +312 -312
  104. package/templates/skills/{business-analyse → derive-prd}/references/prd-generation.md +262 -258
  105. package/templates/skills/derive-prd/references/readiness-scoring.md +104 -0
  106. package/templates/skills/derive-prd/schemas/handoff-schema.json +95 -0
  107. package/templates/skills/derive-prd/steps/step-00-validate.md +130 -0
  108. package/templates/skills/derive-prd/steps/step-01-transform.md +206 -0
  109. package/templates/skills/derive-prd/steps/step-02-export.md +181 -0
  110. package/templates/skills/{business-analyse → derive-prd}/templates/tpl-progress.md +172 -172
  111. package/templates/skills/ralph-loop/SKILL.md +10 -4
  112. package/templates/skills/ralph-loop/references/category-completeness.md +20 -4
  113. package/templates/skills/ralph-loop/references/compact-loop.md +80 -48
  114. package/templates/skills/ralph-loop/references/init-resume-recovery.md +4 -2
  115. package/templates/skills/ralph-loop/references/parallel-execution.md +27 -27
  116. package/templates/skills/ralph-loop/steps/step-00-init.md +19 -9
  117. package/templates/skills/ralph-loop/steps/step-01-task.md +12 -4
  118. package/templates/skills/ralph-loop/steps/step-02-execute.md +9 -4
  119. package/templates/skills/ralph-loop/steps/step-03-commit.md +1 -1
  120. package/templates/skills/ralph-loop/steps/step-04-check.md +5 -21
  121. package/templates/skills/ralph-loop/steps/step-05-report.md +6 -1
  122. package/templates/skills/apex/references/agent-teams-protocol.md +0 -203
  123. package/templates/skills/business-analyse/_architecture.md +0 -124
  124. package/templates/skills/business-analyse/_elicitation.md +0 -206
  125. package/templates/skills/business-analyse/_module-loop.md +0 -115
  126. package/templates/skills/business-analyse/_suggestions.md +0 -34
  127. package/templates/skills/business-analyse/questionnaire/00-application.md +0 -160
  128. package/templates/skills/business-analyse/questionnaire/00b-project.md +0 -85
  129. package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +0 -189
  130. package/templates/skills/business-analyse/questionnaire/03-scope.md +0 -164
  131. package/templates/skills/business-analyse/questionnaire/04-data.md +0 -88
  132. package/templates/skills/business-analyse/questionnaire/05-integrations.md +0 -58
  133. package/templates/skills/business-analyse/questionnaire/06-security.md +0 -68
  134. package/templates/skills/business-analyse/questionnaire/07-ui.md +0 -76
  135. package/templates/skills/business-analyse/questionnaire/08-performance.md +0 -42
  136. package/templates/skills/business-analyse/questionnaire/09-constraints.md +0 -45
  137. package/templates/skills/business-analyse/questionnaire/10-documentation.md +0 -43
  138. package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +0 -59
  139. package/templates/skills/business-analyse/questionnaire/12-migration.md +0 -58
  140. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +0 -69
  141. package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +0 -135
  142. package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +0 -136
  143. package/templates/skills/business-analyse/references/agent-module-prompt.md +0 -362
  144. package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +0 -557
  145. package/templates/skills/business-analyse/references/cache-warming-strategy.md +0 -566
  146. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +0 -41
  147. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +0 -74
  148. package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +0 -115
  149. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +0 -68
  150. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +0 -85
  151. package/templates/skills/business-analyse/references/team-orchestration.md +0 -1022
  152. package/templates/skills/business-analyse/references/validate-incremental-html.md +0 -121
  153. package/templates/skills/business-analyse/steps/step-01b-applications.md +0 -419
  154. package/templates/skills/business-analyse/steps/step-02-decomposition.md +0 -387
  155. package/templates/skills/business-analyse/steps/step-03a-data.md +0 -16
  156. package/templates/skills/business-analyse/steps/step-03a1-setup.md +0 -506
  157. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +0 -301
  158. package/templates/skills/business-analyse/steps/step-03b-ui.md +0 -425
  159. package/templates/skills/business-analyse/steps/step-03c-compile.md +0 -611
  160. package/templates/skills/business-analyse/steps/step-03d-validate.md +0 -783
  161. package/templates/skills/business-analyse/steps/step-04-consolidation.md +0 -17
  162. package/templates/skills/business-analyse/steps/step-04a-collect.md +0 -415
  163. package/templates/skills/business-analyse/steps/step-04b-analyze.md +0 -163
  164. package/templates/skills/business-analyse/steps/step-04c-decide.md +0 -186
  165. package/templates/skills/business-analyse/steps/step-05a-handoff.md +0 -840
  166. package/templates/skills/business-analyse/steps/step-05b-deploy.md +0 -522
  167. package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +0 -703
@@ -1,611 +0,0 @@
1
- ---
2
- name: step-03c-compile
3
- description: Module specification compilation - actors, use cases, FRs, permissions, navigation, seed data, Gherkin, i18n
4
- model: opus
5
- next_step: steps/step-03d-validate.md
6
- ---
7
-
8
- > **Context files:** `_shared.md` | `_module-loop.md`
9
-
10
- # Step 3c: Specification Compilation
11
-
12
- ## MANDATORY EXECUTION RULES
13
-
14
- - ALWAYS use ULTRATHINK mode
15
- - This step COMPILES the specification from the interactive phase (step-03a) into feature.json
16
- - ALWAYS validate specification completeness before writing
17
- - ALL communication in `{language}`
18
- - NEVER skip per-module validation
19
- - **ID NAMING RULE (MANDATORY, NO EXCEPTION):**
20
- All IDs MUST include a module prefix to guarantee application-wide uniqueness.
21
- The prefix is derived from the module code initials (2-4 chars):
22
- UserManagement → UM | VehicleManagement → VM | PartsInventory → PI
23
- RepairManagement → RM | MaintenanceSchedule → MS | DataSync → DS
24
- Notifications → NT | Dashboard → DB | Orders → OR | Customers → CU
25
-
26
- Patterns:
27
- UC-{PREFIX}-{NNN} → UC-RM-001, UC-PI-003
28
- BR-{CAT}-{PREFIX}-{NNN} → BR-VAL-RM-001, BR-CALC-PI-002
29
- FR-{PREFIX}-{NNN} → FR-RM-001
30
- OBJ-{PREFIX}-{NNN} → OBJ-RM-001
31
- AC-{PREFIX}-{NNN} → AC-RM-001
32
- RISK-{PREFIX}-{NNN} → RISK-RM-001
33
-
34
- NEVER use bare IDs (UC-001, BR-VAL-001) in multi-module mode.
35
- - **SCHEMA CONFORMITY RULE:**
36
- ALL data MUST fit within the defined feature-schema.json structure.
37
- NEVER create custom top-level fields (KPIDefinitions, ChartConfigurations, etc.)
38
- Dashboard modules MUST use specification.dashboards[] (it exists in the schema).
39
- If truly needed, use specification.extensions: {} (additionalProperties: true).
40
-
41
- ## YOUR TASK
42
-
43
- Compile all data collected in step-03a (data) and step-03b (UI) into the module specification: generate actors, use cases, functional requirements, permission matrix, navigation, seed data, Gherkin scenarios, validations, messages, lifecycle, API endpoints, and i18n keys.
44
-
45
- ---
46
-
47
- ### 8. Full Specification
48
-
49
- Generate the complete specification for this module. **Each subsection below includes a STRUCTURE CARD showing the EXACT JSON format. Follow them precisely.**
50
-
51
- > **Reference:** Load `references/compilation-structure-cards.md` for all STRUCTURE CARD definitions and type inference guidance.
52
-
53
- #### ENTITY ATTRIBUTE SCHEMA (MANDATORY — applies to ALL entities in section 6b of step-03a)
54
-
55
- > **CRITICAL:** Entity attributes MUST use STRUCTURED properties, not free-text validation strings.
56
- > The ralph-loop needs parseable types to generate correct C# code.
57
-
58
- **MANDATORY fields:** `name`, `type`
59
- **type values:** `string`, `int`, `long`, `decimal`, `double`, `bool`, `DateTime`, `DateOnly`, `TimeOnly`, `Guid`, `enum:{EnumName}`, `byte[]`
60
-
61
- The reference includes:
62
- - Detailed STRUCTURE CARD for entity attributes (with FK examples)
63
- - Type inference priority table for auto-fixing missing types
64
- - BaseEntity inheritance rules (tenantId, createdAt, updatedAt, createdBy, updatedBy)
65
-
66
- #### ENTITY ATTRIBUTE FORMAT POST-CHECK (BLOCKING — runs for EVERY module including the first)
67
-
68
- > **CRITICAL:** This check ensures EVERY entity attribute has a structured `type` field.
69
- > It runs for ALL modules, not just modules 2+. The first module is NOT exempt.
70
- > Without `type`, ralph-loop cannot generate correct C# properties, EF configurations, or validators.
71
-
72
- **Reference:** Load `references/compilation-structure-cards.md` § "Type Inference Priority Table" for the complete auto-fix logic and inference patterns.
73
-
74
- After compiling entities for this module:
75
- 1. Verify every entity attribute has a `type` field (not free-text only)
76
- 2. Apply auto-fix logic (infer from validation string or attribute name patterns)
77
- 3. Normalize free-text validation into structured maxLength/validation properties
78
- 4. Ensure required defaults to true if absent
79
-
80
- ---
81
-
82
- #### 8a-8l. Specification Structure Cards
83
-
84
- > **Reference:** Load `references/compilation-structure-cards.md` for all STRUCTURE CARD definitions.
85
-
86
- The reference includes detailed JSON templates for:
87
- - **8a. Actors** — role and permissions mapping
88
- - **8b. Use Cases** — UC-{PREFIX}-NNN format with scenarios
89
- - **8c. Functional Requirements** — FR-{PREFIX}-NNN format
90
- - **8d. Permission Matrix** — role assignments and paths
91
- - **8e. Navigation** — module, sections, and resources
92
- - **8f. SeedData Core** — 9 mandatory arrays
93
- - **8g. Gherkin Scenarios** — BDD format (MUST be array)
94
- - **8h. Validations** — field rules and error keys
95
- - **8i. Messages** — success/error/warning/info types
96
- - **8j. Entity Lifecycle** — state machines
97
- - **8k. API Endpoints** — RESTful routes
98
- - **8l. i18n Keys** — 4 languages (fr, en, it, de)
99
-
100
- #### 8b. Use Cases (UC-{PREFIX}-NNN)
101
-
102
- Per section: list, create, read, update, delete, approve, etc.
103
-
104
- > **STRUCTURE CARD: specification.useCases[]**
105
- > ```json
106
- > {
107
- > "id": "UC-{PREFIX}-001",
108
- > "name": "Create Order",
109
- > "primaryActor": "Sales Representative",
110
- > "permission": "{app}.{module}.create",
111
- > "preconditions": ["Customer exists", "Products in stock"],
112
- > "postconditions": ["Order created with Draft status"],
113
- > "mainScenario": [
114
- > "1. User navigates to creation form",
115
- > "2. User fills in required fields",
116
- > "3. System validates data (BR-VAL-{PREFIX}-001)",
117
- > "4. System creates the record",
118
- > "5. System displays confirmation"
119
- > ],
120
- > "alternativeScenarios": [
121
- > { "name": "Validation failure", "steps": ["1. System detects invalid data", "2. System highlights errors"] }
122
- > ],
123
- > "errorScenarios": [
124
- > { "name": "Server error", "steps": ["1. System shows error message", "2. Data preserved for retry"] }
125
- > ],
126
- > "linkedRules": ["BR-VAL-{PREFIX}-001", "BR-WF-{PREFIX}-002"]
127
- > }
128
- > ```
129
- > **MANDATORY fields:** `id`, `name`, `primaryActor`, `permission`, `mainScenario`, `linkedRules`
130
- > **FORBIDDEN fields:** Do NOT use `actor` (use `primaryActor`), `linkedBRs` (use `linkedRules`), `linkedFRs` (not in UC, FRs link to UCs instead)
131
-
132
- #### 8c. Functional Requirements (FR-{PREFIX}-NNN)
133
-
134
- Linked to BRs and UCs.
135
-
136
- > **STRUCTURE CARD: specification.functionalRequirements[]**
137
- > ```json
138
- > {
139
- > "id": "FR-{PREFIX}-001",
140
- > "statement": "System MUST validate customer budget before order creation",
141
- > "priority": "must|should|could",
142
- > "linkedRules": ["BR-VAL-{PREFIX}-001"],
143
- > "linkedUseCases": ["UC-{PREFIX}-001"],
144
- > "acceptanceCriteria": [
145
- > "Order rejected if total > budget",
146
- > "Error message displayed with remaining budget"
147
- > ]
148
- > }
149
- > ```
150
- > **MANDATORY fields:** `id`, `statement`, `priority`, `linkedUseCases`
151
- > **FORBIDDEN fields:** Do NOT use `name`/`description` (use `statement` with System MUST/SHOULD/COULD format), `linkedUCs` (use `linkedUseCases`), `linkedBRs` (use `linkedRules`)
152
-
153
- #### 8d. Permission Matrix
154
-
155
- Roles × resources × operations with full paths.
156
-
157
- > **STRUCTURE CARD: specification.permissionMatrix**
158
- > ```json
159
- > {
160
- > "permissions": [
161
- > { "path": "{app}.{module}.read", "action": "read", "description": "View records" },
162
- > { "path": "{app}.{module}.create", "action": "create", "description": "Create new records" },
163
- > { "path": "{app}.{module}.update", "action": "update", "description": "Update existing records" },
164
- > { "path": "{app}.{module}.delete", "action": "delete", "description": "Delete records" },
165
- > { "path": "{app}.{module}.export", "action": "export", "description": "Export data" },
166
- > { "path": "{app}.{module}.dashboard.read", "action": "read", "description": "View dashboard (section-level)" }
167
- > ],
168
- > "roleAssignments": [
169
- > { "role": "{App} Admin", "permissions": ["{app}.{module}.read", "{app}.{module}.create", "{app}.{module}.update", "{app}.{module}.delete", "{app}.{module}.export", "{app}.{module}.dashboard.read"] },
170
- > { "role": "{App} Manager", "permissions": ["{app}.{module}.read", "{app}.{module}.create", "{app}.{module}.update", "{app}.{module}.dashboard.read"] },
171
- > { "role": "{App} Viewer", "permissions": ["{app}.{module}.read"] }
172
- > ]
173
- > }
174
- > ```
175
- > **STRUCTURE:** Object with 2 arrays: `permissions[]` and `roleAssignments[]`
176
- > **Permission levels:** Module-level = `{app}.{module}.{action}` (3 segments). Section-level = `{app}.{module}.{section}.{action}` (4 segments, for sections needing distinct access like dashboard, approve, import).
177
- > **FORBIDDEN:** Do NOT use a flat array with `resource`/`roles` fields. Always use the nested structure above.
178
-
179
- #### 8e. Navigation
180
-
181
- Module → Sections → Resources (levels 2-3-4 of the hierarchy).
182
-
183
- > **STRUCTURE CARD: specification.navigation**
184
- > ```json
185
- > {
186
- > "entries": [
187
- > { "level": "module", "code": "{module}", "labels": {"fr": "...", "en": "...", "it": "...", "de": "..."}, "route": "/{app}/{module}", "icon": "list" },
188
- > { "level": "section", "code": "list", "labels": {"fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste"}, "route": "/{app}/{module}", "icon": "list" },
189
- > { "level": "section", "code": "dashboard", "labels": {"fr": "Tableau de bord", "en": "Dashboard", "it": "Cruscotto", "de": "Dashboard"}, "route": "/{app}/{module}/dashboard", "icon": "chart-bar", "isNew": true }
190
- > ]
191
- > }
192
- > ```
193
-
194
- #### 8e-POST-CHECK: Navigation Enforcement (BLOCKING)
195
-
196
- > **CRITICAL:** `specification.navigation.entries[]` is MANDATORY. If absent, auto-generate from sections.
197
-
198
- ```javascript
199
- const nav = specification.navigation;
200
- if (!nav || !nav.entries || nav.entries.length === 0) {
201
- console.warn('AUTO-FIX: navigation.entries is empty — generating from sections');
202
- const sections = specification.sections || [];
203
- const entries = [
204
- { level: "module", code: "{module}", labels: {fr: "{ModuleName}", en: "{ModuleName}", it: "{ModuleName}", de: "{ModuleName}"}, route: "/{app}/{module}", icon: "list" }
205
- ];
206
- for (const section of sections) {
207
- entries.push({
208
- level: "section",
209
- code: section.code,
210
- labels: {fr: section.name || section.code, en: section.name || section.code, it: section.name || section.code, de: section.name || section.code},
211
- route: section.route || `/{app}/{module}/${section.code}`,
212
- icon: section.icon || "file-text"
213
- });
214
- }
215
- specification.navigation = { entries };
216
- }
217
- // Verify ALL entries have 4 languages
218
- for (const entry of specification.navigation.entries) {
219
- for (const lang of ['fr', 'en', 'it', 'de']) {
220
- if (!entry.labels[lang]) {
221
- entry.labels[lang] = entry.labels['en'] || entry.labels['fr'] || entry.code;
222
- console.warn(`AUTO-FIX: navigation entry "${entry.code}" missing ${lang} label — copied from fallback`);
223
- }
224
- }
225
- }
226
- ```
227
-
228
- #### 8f. SeedData Core
229
-
230
- 9 MANDATORY typed arrays — each with structured objects, NOT flat strings or objects.
231
-
232
- > **STRUCTURE CARD: specification.seedDataCore**
233
- > ```json
234
- > {
235
- > "navigationApplications": [
236
- > { "code": "{app}", "label": "{Application Name}", "icon": "{icon}", "route": "/{app-kebab}", "sort": 1 }
237
- > ],
238
- > "applicationRoles": [
239
- > { "code": "admin", "name": "{App} Admin", "permissions": "*" },
240
- > { "code": "manager", "name": "{App} Manager", "permissions": "CRU" },
241
- > { "code": "contributor", "name": "{App} Contributor", "permissions": "CR" },
242
- > { "code": "viewer", "name": "{App} Viewer", "permissions": "R" }
243
- > ],
244
- > "navigationModules": [
245
- > { "code": "{module}", "label": "{Module Name}", "icon": "list", "route": "/{app}/{module}", "parentCode": "{app}", "sort": 1 }
246
- > ],
247
- > "navigationSections": [
248
- > { "code": "list", "label": "Liste", "icon": "List", "route": "/{app}/{module}", "parentCode": "{module}", "permission": "{app}.{module}.read", "sort": 1 },
249
- > { "code": "detail", "label": "Détail", "icon": "FileText", "route": "/{app}/{module}/:id", "parentCode": "{module}", "permission": "{app}.{module}.read", "sort": 2, "navigation": "hidden" },
250
- > { "code": "dashboard", "label": "Dashboard", "icon": "BarChart", "route": "/{app}/{module}/dashboard", "parentCode": "{module}", "permission": "{app}.{module}.dashboard.read", "sort": 3 }
251
- > ],
252
- > "navigationResources": [
253
- > { "code": "{module}-grid", "type": "SmartTable", "entity": "{Entity}", "parentCode": "list", "permission": "{app}.{module}.read" },
254
- > { "code": "{module}-detail-card", "type": "DetailCard", "entity": "{Entity}", "parentCode": "detail", "permission": "{app}.{module}.read" }
255
- > ],
256
- > "navigationTranslations": [
257
- > { "moduleCode": "{module}", "language": "fr", "label": "..." },
258
- > { "moduleCode": "{module}", "language": "en", "label": "..." },
259
- > { "moduleCode": "{module}", "language": "it", "label": "..." },
260
- > { "moduleCode": "{module}", "language": "de", "label": "..." }
261
- > ],
262
- > "permissions": [
263
- > { "path": "{app}.{module}.read", "action": "read", "description": "View {module}" },
264
- > { "path": "{app}.{module}.create", "action": "create", "description": "Create {module}" },
265
- > { "path": "{app}.{module}.dashboard.read", "action": "read", "description": "View {module} dashboard (section-level)" }
266
- > ],
267
- > "rolePermissions": [
268
- > { "role": "{App} Admin", "permissionPath": "{app}.{module}.*" },
269
- > { "role": "{App} Manager", "permissionPath": "{app}.{module}.read" }
270
- > ],
271
- > "permissionConstants": [
272
- > { "constantName": "{Module}Read", "path": "{app}.{module}.read" },
273
- > { "constantName": "{Module}Create", "path": "{app}.{module}.create" }
274
- > ]
275
- > }
276
- > ```
277
- > **MANDATORY:** All 9 arrays must be present. Each element must be an object, NOT a string.
278
- > **NOTE:** `navigationApplications` and `applicationRoles` are populated from the application identity confirmed in step-01b. They are written ONCE for the first module processed and remain empty `[]` for subsequent modules.
279
- > **CRITICAL:** `navigationSections` and `navigationResources` are DERIVED from `specification.sections[]` — use the transform algorithm below (section 8f-bis).
280
- > **IMPORTANT:** `create` and `edit` are NEVER sections — they are action pages reached via buttons. Do NOT include them in `navigationSections`. Only include actual sidebar sections (list, dashboard, approve, import, etc.) and hidden route sections (detail).
281
- > **FORBIDDEN:** Do NOT use `navigationModule` (singular string), `permissions` as flat string array, `rolePermissions` as flat object, `permissionsConstants` as comma-separated string.
282
- >
283
- > **FORBIDDEN in navigation routes:**
284
- > - `/{app}/{module}/list` → use `/{app}/{module}` (list IS the module route)
285
- > - `/{app}/{module}/detail/:id` → use `/{app}/{module}/:id`
286
- > - Navigation routes must match React Router paths exactly
287
-
288
- #### 8f-bis. Transform Sections into Navigation SeedData
289
-
290
- > **CRITICAL:** `navigationSections` and `navigationResources` must be generated from `specification.sections[]`.
291
- > This ensures the navigation hierarchy (Module → Section → Resource) is complete in the database.
292
-
293
- **Transform algorithm:**
294
-
295
- ```javascript
296
- // 1. Transform specification.sections[] into navigationSections
297
- const navigationSections = specification.sections.map((section, index) => ({
298
- code: section.code, // e.g., "list", "detail", "dashboard"
299
- label: section.labels.fr, // Default language (fr)
300
- icon: section.icon, // Lucide icon name
301
- route: section.route, // Full route path
302
- parentCode: metadata.module, // Module code (parent)
303
- permission: section.permission, // Required permission
304
- sort: index + 1 // Display order (1-based)
305
- }));
306
-
307
- // 2. Transform specification.sections[].resources[] into navigationResources
308
- const navigationResources = specification.sections.flatMap(section =>
309
- section.resources.map(resource => ({
310
- code: resource.code, // e.g., "employees-grid"
311
- type: resource.type, // e.g., "SmartTable", "SmartForm"
312
- entity: resource.entity, // e.g., "Employee"
313
- parentCode: section.code, // Section code (parent)
314
- permission: resource.permission // Optional (can inherit from section)
315
- }))
316
- );
317
- ```
318
-
319
- **Write seedDataCore to specification:**
320
-
321
- ```
322
- ba-writer.enrichSection({
323
- feature_id,
324
- section: "specification",
325
- data: {
326
- seedDataCore: {
327
- navigationApplications: [ ... ], // FROM step-01b identity (only for first module, else [])
328
- applicationRoles: [ ... ], // FROM cadrage.applicationRoles (only for first module, else [])
329
- navigationModules: [ ... ],
330
- navigationSections: navigationSections, // DERIVED
331
- navigationResources: navigationResources, // DERIVED
332
- navigationTranslations: [ ... ],
333
- permissions: [ ... ],
334
- rolePermissions: [ ... ],
335
- permissionConstants: [ ... ]
336
- }
337
- }
338
- })
339
- ```
340
-
341
- > **NOTE:** This step writes ONLY seedDataCore. The FULL specification write (actors, useCases, wireframes, sections, etc.) happens in step-03d section 11.
342
- > ALL data from 8a-8l MUST be carried forward to step-03d. Do NOT discard in-memory data.
343
-
344
- **Validation:**
345
-
346
- - EVERY section in `specification.sections[]` MUST appear in `navigationSections`
347
- - EVERY resource in `specification.sections[].resources[]` MUST appear in `navigationResources`
348
- - Total count: `navigationSections.length === specification.sections.length`
349
- - Total count: `navigationResources.length === sum(sections[].resources.length)`
350
-
351
- #### 8g. Gherkin Scenarios
352
-
353
- BDD acceptance tests per UC.
354
-
355
- > **STRUCTURE CARD: specification.gherkinScenarios[]**
356
- > ```json
357
- > {
358
- > "feature": "{Module} Management",
359
- > "scenarios": [
360
- > {
361
- > "name": "Create a new record with valid data",
362
- > "tags": ["@{module}", "@create", "@smoke"],
363
- > "given": ["An authenticated user with role Manager", "No existing record with code 'TEST-001'"],
364
- > "when": ["The user fills the creation form", "The user submits the form"],
365
- > "then": ["The record is created with Draft status", "A success message is displayed"]
366
- > }
367
- > ]
368
- > }
369
- > ```
370
- > **STRUCTURE:** MUST be an ARRAY of objects (NOT a single object). Each object has `feature` string + `scenarios[]` array. Each scenario has `given`, `when`, `then` as ARRAYS of strings.
371
- > **FORBIDDEN:** Do NOT use flat arrays of `{uc, scenario, given, when, then}` where given/when/then are single strings.
372
- > **FORBIDDEN:** Do NOT use a single object `{feature, scenarios}` — MUST be an ARRAY `[{feature, scenarios}]` even with one feature.
373
-
374
- #### 8h. Validations
375
-
376
- Field validation rules per entity.
377
-
378
- > **STRUCTURE CARD: specification.validations[]**
379
- > ```json
380
- > {
381
- > "entity": "Order",
382
- > "field": "amount",
383
- > "rules": ["required", "decimal", "min:0.01", "max:999999.99"],
384
- > "errorMessageKey": "validation.{module}.amount.invalid"
385
- > }
386
- > ```
387
- > **MANDATORY fields:** `entity`, `field`, `rules` (array), `errorMessageKey`
388
- > **FORBIDDEN fields:** Do NOT use `rule` (singular string) or `message` (use `errorMessageKey`).
389
-
390
- #### 8i. Business Messages
391
-
392
- Minimum 4: success, error CRUD, error validation, error permission.
393
-
394
- > **STRUCTURE CARD: specification.messages[]**
395
- > ```json
396
- > {
397
- > "code": "{MODULE}-SUCCESS-CREATE",
398
- > "type": "success|error|warning|info",
399
- > "title": "Record Created",
400
- > "message": "The record {code} has been created successfully.",
401
- > "i18nKey": "message.{module}.created"
402
- > }
403
- > ```
404
- > **MANDATORY fields:** `code`, `type`, `message`, `i18nKey`
405
- > **FORBIDDEN:** Do NOT omit `title` or `i18nKey`. Every message MUST have an i18n key.
406
-
407
- #### 8j. Entity Lifecycle
408
-
409
- State machines for entities with status/state.
410
- **Note:** If depth = full and 3a-state was executed, lifeCycles are already defined. Verify completeness and add any missing states/transitions.
411
-
412
- > **STRUCTURE CARD: specification.lifeCycles[]**
413
- > ```json
414
- > {
415
- > "entity": "Order",
416
- > "field": "status",
417
- > "initialState": "draft",
418
- > "states": [
419
- > { "id": "draft", "displayName": "Brouillon", "color": "gray", "allowedTransitions": ["submitted"], "isTerminal": false },
420
- > { "id": "submitted", "displayName": "Soumis", "color": "blue", "allowedTransitions": ["approved", "rejected"], "isTerminal": false },
421
- > { "id": "approved", "displayName": "Approuvé", "color": "green", "allowedTransitions": ["archived"], "isTerminal": false },
422
- > { "id": "rejected", "displayName": "Rejeté", "color": "red", "allowedTransitions": [], "isTerminal": true },
423
- > { "id": "archived", "displayName": "Archivé", "color": "purple", "allowedTransitions": [], "isTerminal": true }
424
- > ],
425
- > "transitions": [
426
- > {
427
- > "from": "draft", "to": "submitted", "action": "submit",
428
- > "label": { "fr": "Soumettre", "en": "Submit" },
429
- > "permission": "{app}.{module}.update",
430
- > "guards": ["BR-VAL-{PREFIX}-001"],
431
- > "effects": [{ "type": "notification", "target": "role:manager", "template": "{module}-submitted" }],
432
- > "confirm": true
433
- > }
434
- > ]
435
- > }
436
- > ```
437
- > **MANDATORY:** `states` MUST be an array of OBJECTS with `id`, `displayName`, `color`, `allowedTransitions`, `isTerminal`. NEVER use flat string arrays.
438
- > **Colors:** gray (draft/new), blue (in-progress), green (active/approved), yellow (warning/pending), orange (review), red (error/rejected), purple (archived/terminal)
439
- > **FORBIDDEN:** Do NOT use `states: ["Active", "Inactive"]` (flat strings), `terminalStates` (use `isTerminal: true` on each state).
440
-
441
- #### 8k. API Endpoints
442
-
443
- RESTful routes following SmartStack patterns.
444
-
445
- > **STRUCTURE CARD: specification.apiEndpoints[]**
446
- > ```json
447
- > {
448
- > "method": "GET|POST|PUT|PATCH|DELETE",
449
- > "path": "/api/{app}/{module}",
450
- > "permission": "{app}.{module}.read",
451
- > "requestDto": "Get{Module}Query",
452
- > "responseDto": "{Module}Dto[]",
453
- > "description": "List all records with pagination and filters"
454
- > }
455
- > ```
456
- > **MANDATORY fields:** `method`, `path`, `permission`, `description`
457
- > **Recommended:** Include `requestDto` and `responseDto` for implementation clarity.
458
-
459
- #### 8l. i18n Keys
460
-
461
- Translation keys for all UI text (4 languages: fr, en, it, de).
462
-
463
- > **STRUCTURE CARD: specification.i18nKeys**
464
- > **CRITICAL:** ALL leaf translation keys MUST have 4 languages (fr, en, it, de). IT/DE can use shorter translations but MUST exist.
465
- > ```json
466
- > {
467
- > "title": { "fr": "{Module}", "en": "{Module}", "it": "{Module}", "de": "{Module}" },
468
- > "list": {
469
- > "title": { "fr": "Liste", "en": "List", "it": "Elenco", "de": "Liste" },
470
- > "empty": { "fr": "Aucun enregistrement", "en": "No records", "it": "Nessun record", "de": "Keine Einträge" }
471
- > },
472
- > "create": { "title": { "fr": "Nouveau", "en": "New", "it": "Nuovo", "de": "Neu" } },
473
- > "detail": { "title": { "fr": "Détail", "en": "Detail", "it": "Dettaglio", "de": "Detail" } },
474
- > "buttons": {
475
- > "create": { "fr": "Créer", "en": "Create", "it": "Crea", "de": "Erstellen" },
476
- > "edit": { "fr": "Modifier", "en": "Edit", "it": "Modifica", "de": "Bearbeiten" },
477
- > "delete": { "fr": "Supprimer", "en": "Delete", "it": "Elimina", "de": "Löschen" },
478
- > "save": { "fr": "Enregistrer", "en": "Save", "it": "Salva", "de": "Speichern" },
479
- > "cancel": { "fr": "Annuler", "en": "Cancel", "it": "Annulla", "de": "Abbrechen" }
480
- > },
481
- > "validation": {
482
- > "required": { "fr": "Ce champ est requis", "en": "This field is required", "it": "Campo obbligatorio", "de": "Pflichtfeld" }
483
- > }
484
- > }
485
- > ```
486
-
487
- #### 8l-POST-CHECK: i18n 4 Languages Enforcement (BLOCKING)
488
-
489
- > **CRITICAL:** i18n keys with missing IT/DE translations are a recurring issue.
490
- > This POST-CHECK walks ALL leaf keys and auto-fills missing translations.
491
-
492
- ```javascript
493
- const i18n = specification.i18nKeys || {};
494
- const REQUIRED_LANGS = ['fr', 'en', 'it', 'de'];
495
- let missingCount = 0;
496
-
497
- function walkI18n(obj, path) {
498
- if (typeof obj !== 'object' || obj === null) return;
499
- // Leaf node: has at least 'fr' or 'en' as direct string properties
500
- const hasLangKey = REQUIRED_LANGS.some(l => typeof obj[l] === 'string');
501
- if (hasLangKey) {
502
- for (const lang of REQUIRED_LANGS) {
503
- if (!obj[lang] || typeof obj[lang] !== 'string') {
504
- // Fallback: copy from en > fr > first available
505
- obj[lang] = obj['en'] || obj['fr'] || Object.values(obj).find(v => typeof v === 'string') || path;
506
- missingCount++;
507
- }
508
- }
509
- } else {
510
- // Branch node: recurse
511
- for (const key of Object.keys(obj)) {
512
- walkI18n(obj[key], `${path}.${key}`);
513
- }
514
- }
515
- }
516
- walkI18n(i18n, 'i18nKeys');
517
- if (missingCount > 0) {
518
- console.warn(`AUTO-FIX: filled ${missingCount} missing i18n translations (IT/DE fallbacks from EN/FR)`);
519
- }
520
- ```
521
-
522
- ---
523
-
524
- ## SELF-VERIFICATION (MANDATORY before loading next step)
525
-
526
- Before loading step-03d-validate, verify all 12 subsections (8a-8l) are populated:
527
-
528
- 1. **8a. Actors** - At least 2 roles with permissions
529
- 2. **8b. Use Cases** - At least 2 UCs with complete structure
530
- 3. **8c. Functional Requirements** - At least 4 FRs with linked UCs and BRs
531
- 4. **8d. Permission Matrix** - Resources and role assignments defined
532
- 5. **8e. Navigation** - Module, sections, and resource routes specified
533
- 6. **8f. SeedData Core** - All 7 arrays populated with structured objects (navigationModules, navigationSections, navigationResources, navigationTranslations, permissions, rolePermissions, permissionConstants)
534
- 7. **8g. Gherkin Scenarios** - BDD scenarios for each major UC
535
- 8. **8h. Validations** - Field rules with error message keys
536
- 9. **8i. Business Messages** - Minimum 4 messages (success, error CRUD, validation, permission)
537
- 10. **8j. Entity Lifecycle** - State machines with transitions if entity has status
538
- 11. **8k. API Endpoints** - RESTful routes with permissions
539
- 12. **8l. i18n Keys** - Translation keys in 4 languages (fr, en, it, de)
540
-
541
- 13. **Wireframes present** — `(specification.uiWireframes || specification.wireframes || []).length >= 1` (BLOCKING)
542
- Quick check: the wireframe data from step-03b MUST still be in memory OR persisted to feature.json
543
-
544
- 14. **Wireframes create/edit** — For each data-centric section with a create form, a wireframe `{section}-create` MUST exist (BLOCKING).
545
- For each modifiable entity, a wireframe `{section}-edit` SHOULD exist (WARNING if absent).
546
- Create/edit wireframes are action-page wireframes — they are NOT separate navigation sections.
547
- They describe the full-page form layout (fields, validation, submit/cancel buttons).
548
- (step-03b now writes wireframes intermediately). If wireframes are empty:
549
- - First, re-read the module feature.json to check if step-03b wrote them
550
- - If present in file but not in memory → load them from file
551
- - If absent everywhere → **STOP** and reload step-03b to regenerate wireframes
552
-
553
- **IF any subsection is missing → STOP and request the missing data before proceeding.**
554
-
555
- **ABSOLUTE FORMAT CHECKS (apply to ALL modules, including the first):**
556
-
557
- > These checks validate against the canonical schema — NOT comparatively against another module.
558
- > They run BEFORE the SCHEMA UNIFORMITY comparative check, ensuring the first module has the
559
- > correct format before being used as baseline for subsequent modules.
560
-
561
- ```javascript
562
- // Gherkin MUST be array (not single object)
563
- if (!Array.isArray(specification.gherkinScenarios)) {
564
- console.warn('AUTO-FIX: gherkinScenarios is object, wrapping in array');
565
- specification.gherkinScenarios = [specification.gherkinScenarios];
566
- }
567
-
568
- // Validations[].rules MUST be array (not singular rule string)
569
- for (const v of specification.validations || []) {
570
- if (typeof v.rules === 'string') { v.rules = [v.rules]; }
571
- if (v.rule && !v.rules) {
572
- v.rules = Array.isArray(v.rule) ? v.rule : [v.rule];
573
- delete v.rule;
574
- }
575
- }
576
-
577
- // Messages MUST have "message" field (not only "description")
578
- for (const m of specification.messages || []) {
579
- if (!m.message && m.description) { m.message = m.description; }
580
- }
581
-
582
- // Wireframes MUST use canonical field names
583
- const wireframes = specification.uiWireframes || specification.wireframes || [];
584
- for (const wf of wireframes) {
585
- if (wf.title && !wf.screen) { wf.screen = wf.title; delete wf.title; }
586
- if (wf.ascii && !wf.mockup) { wf.mockup = wf.ascii; delete wf.ascii; }
587
- if (wf.content && !wf.mockup) { wf.mockup = wf.content; delete wf.content; }
588
- if (wf.name && !wf.screen) { wf.screen = wf.name; delete wf.name; }
589
- }
590
- specification.uiWireframes = wireframes;
591
-
592
- // Entity attributes MUST have "type" field (already checked in ENTITY ATTRIBUTE FORMAT POST-CHECK above)
593
- ```
594
-
595
- **SCHEMA UNIFORMITY CHECK (multi-module mode):**
596
- IF this is NOT the first module in moduleOrder:
597
- Compare THIS module's specification structure against the FIRST specified module:
598
- - `gherkinScenarios` MUST be array (not object) in ALL modules
599
- - `validations[].rules` MUST be array (not singular `rule`) in ALL modules
600
- - `messages[]` MUST have `message` field in ALL modules
601
- - `specification.apiEndpoints[]` MUST be present in ALL modules
602
- - `specification.i18nKeys` MUST be present in ALL modules
603
- - `analysis.entities[].attributes[].type` MUST be present on ALL attributes in ALL modules
604
- - IF first module has free-text-only attributes without `type` field → AUTO-FIX with type inference
605
- IF any structural divergence detected → AUTO-FIX to match the canonical format before proceeding.
606
-
607
- ---
608
-
609
- ## NEXT STEP
610
-
611
- Load: `steps/step-03d-validate.md`