@atlashub/smartstack-cli 3.8.0 → 3.9.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 (120) hide show
  1. package/dist/index.js +365 -2
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -1
  4. package/templates/agents/action.md +1 -0
  5. package/templates/agents/ba-writer.md +33 -0
  6. package/templates/agents/explore-codebase.md +1 -0
  7. package/templates/agents/explore-docs.md +1 -0
  8. package/templates/agents/fix-grammar.md +1 -0
  9. package/templates/agents/snipper.md +1 -0
  10. package/templates/skills/admin/SKILL.md +6 -0
  11. package/templates/skills/ai-prompt/SKILL.md +32 -136
  12. package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -0
  13. package/templates/skills/apex/SKILL.md +120 -0
  14. package/templates/skills/apex/_shared.md +86 -0
  15. package/templates/skills/apex/references/agent-teams-protocol.md +164 -0
  16. package/templates/skills/apex/references/smartstack-layers.md +173 -0
  17. package/templates/skills/apex/steps/step-00-init.md +156 -0
  18. package/templates/skills/apex/steps/step-01-analyze.md +169 -0
  19. package/templates/skills/apex/steps/step-02-plan.md +160 -0
  20. package/templates/skills/apex/steps/step-03-execute.md +166 -0
  21. package/templates/skills/apex/steps/step-04-validate.md +138 -0
  22. package/templates/skills/apex/steps/step-05-examine.md +124 -0
  23. package/templates/skills/apex/steps/step-06-resolve.md +105 -0
  24. package/templates/skills/apex/steps/step-07-tests.md +130 -0
  25. package/templates/skills/apex/steps/step-08-run-tests.md +115 -0
  26. package/templates/skills/application/SKILL.md +10 -0
  27. package/templates/skills/application/references/backend-controller-hierarchy.md +58 -0
  28. package/templates/skills/application/references/backend-entity-seeding.md +72 -0
  29. package/templates/skills/application/references/backend-verification.md +88 -0
  30. package/templates/skills/application/references/frontend-verification.md +111 -0
  31. package/templates/skills/application/references/nav-fallback-procedure.md +200 -0
  32. package/templates/skills/application/references/provider-template.md +134 -0
  33. package/templates/skills/application/references/test-frontend.md +73 -0
  34. package/templates/skills/application/references/test-prerequisites.md +72 -0
  35. package/templates/skills/application/steps/step-01-navigation.md +7 -198
  36. package/templates/skills/application/steps/step-03b-provider.md +4 -128
  37. package/templates/skills/application/steps/step-04-backend.md +20 -350
  38. package/templates/skills/application/steps/step-05-frontend.md +12 -101
  39. package/templates/skills/application/steps/step-07-tests.md +12 -132
  40. package/templates/skills/business-analyse/SKILL.md +11 -2
  41. package/templates/skills/business-analyse/html/ba-interactive.html +176 -14
  42. package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +1 -0
  43. package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +16 -4
  44. package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +7 -2
  45. package/templates/skills/business-analyse/html/src/scripts/09-export.js +103 -0
  46. package/templates/skills/business-analyse/html/src/scripts/10-comments.js +12 -6
  47. package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +24 -2
  48. package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +12 -0
  49. package/templates/skills/business-analyse/html/src/template.html +1 -0
  50. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +78 -0
  51. package/templates/skills/business-analyse/references/cadrage-vibe-coding.md +97 -0
  52. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +92 -0
  53. package/templates/skills/business-analyse/references/deploy-data-build.md +121 -0
  54. package/templates/skills/business-analyse/references/deploy-modes.md +49 -0
  55. package/templates/skills/business-analyse/references/handoff-file-templates.md +119 -0
  56. package/templates/skills/business-analyse/references/handoff-mappings.md +81 -0
  57. package/templates/skills/business-analyse/references/html-data-mapping.md +10 -2
  58. package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -0
  59. package/templates/skills/business-analyse/references/review-data-mapping.md +363 -0
  60. package/templates/skills/business-analyse/references/spec-auto-inference.md +57 -0
  61. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -0
  62. package/templates/skills/business-analyse/references/ui-resource-cards.md +110 -0
  63. package/templates/skills/business-analyse/references/validate-incremental-html.md +55 -0
  64. package/templates/skills/business-analyse/steps/step-00-init.md +35 -68
  65. package/templates/skills/business-analyse/steps/step-01-cadrage.md +5 -194
  66. package/templates/skills/business-analyse/steps/step-03a-data.md +6 -49
  67. package/templates/skills/business-analyse/steps/step-03b-ui.md +12 -178
  68. package/templates/skills/business-analyse/steps/step-03d-validate.md +3 -48
  69. package/templates/skills/business-analyse/steps/step-04-consolidation.md +9 -104
  70. package/templates/skills/business-analyse/steps/step-05a-handoff.md +25 -441
  71. package/templates/skills/business-analyse/steps/step-05b-deploy.md +19 -187
  72. package/templates/skills/business-analyse/steps/step-06-review.md +277 -0
  73. package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -0
  74. package/templates/skills/cc-agent/steps/step-02-generate.md +5 -78
  75. package/templates/skills/check-version/SKILL.md +7 -0
  76. package/templates/skills/controller/references/controller-code-templates.md +159 -0
  77. package/templates/skills/controller/references/permission-sync-templates.md +152 -0
  78. package/templates/skills/controller/steps/step-03-generate.md +6 -158
  79. package/templates/skills/controller/steps/step-04-perms.md +5 -144
  80. package/templates/skills/debug/SKILL.md +7 -0
  81. package/templates/skills/explore/SKILL.md +6 -0
  82. package/templates/skills/feature-full/SKILL.md +39 -142
  83. package/templates/skills/feature-full/steps/step-01-implementation.md +120 -0
  84. package/templates/skills/gitflow/references/init-config-template.md +135 -0
  85. package/templates/skills/gitflow/references/init-name-normalization.md +103 -0
  86. package/templates/skills/gitflow/references/plan-template.md +69 -0
  87. package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -0
  88. package/templates/skills/gitflow/references/start-local-config.md +110 -0
  89. package/templates/skills/gitflow/steps/step-init.md +18 -289
  90. package/templates/skills/gitflow/steps/step-plan.md +6 -63
  91. package/templates/skills/gitflow/steps/step-start.md +16 -126
  92. package/templates/skills/mcp/SKILL.md +9 -213
  93. package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -0
  94. package/templates/skills/mcp/steps/step-02-tools.md +73 -0
  95. package/templates/skills/notification/SKILL.md +7 -0
  96. package/templates/skills/quick-search/SKILL.md +5 -0
  97. package/templates/skills/ralph-loop/SKILL.md +99 -381
  98. package/templates/skills/ralph-loop/references/category-rules.md +259 -0
  99. package/templates/skills/ralph-loop/references/compact-loop.md +182 -0
  100. package/templates/skills/ralph-loop/references/task-transform-legacy.md +259 -0
  101. package/templates/skills/ralph-loop/references/team-orchestration.md +189 -0
  102. package/templates/skills/ralph-loop/steps/step-00-init.md +111 -383
  103. package/templates/skills/ralph-loop/steps/step-01-task.md +79 -896
  104. package/templates/skills/ralph-loop/steps/step-02-execute.md +68 -680
  105. package/templates/skills/ralph-loop/steps/step-03-commit.md +47 -277
  106. package/templates/skills/ralph-loop/steps/step-04-check.md +124 -607
  107. package/templates/skills/ralph-loop/steps/step-05-report.md +68 -367
  108. package/templates/skills/refactor/SKILL.md +12 -176
  109. package/templates/skills/refactor/steps/step-01-discover.md +60 -0
  110. package/templates/skills/refactor/steps/step-02-execute.md +67 -0
  111. package/templates/skills/review-code/SKILL.md +19 -257
  112. package/templates/skills/review-code/steps/step-01-smartstack.md +96 -0
  113. package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -0
  114. package/templates/skills/review-code/steps/step-03-react.md +44 -0
  115. package/templates/skills/ui-components/SKILL.md +7 -0
  116. package/templates/skills/utils/SKILL.md +6 -0
  117. package/templates/skills/validate/SKILL.md +6 -0
  118. package/templates/skills/validate-feature/SKILL.md +8 -0
  119. package/templates/skills/workflow/SKILL.md +40 -118
  120. package/templates/skills/workflow/steps/step-01-implementation.md +84 -0
@@ -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
- > **STRUCTURE CARD: specification.sections[]** Resources MUST include full depth definitions.
126
- > ```json
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
- > **STRUCTURE CARD: specification.uiWireframes[]** ALL fields below are MANDATORY.
222
- > ```json
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
- When a "dashboard" section is selected, capture structured KPI and chart data **in addition** to the standard ASCII mockup.
317
-
318
- 1. **Ask client for KPIs** via AskUserQuestion (batch):
319
- - KPI name and metric description
320
- - Visualization type: `kpi-card`, `bar`, `line`, `pie`, `area`, `donut`, `stacked-bar`
321
- - Data source entity
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
 
@@ -228,56 +228,11 @@ ba-writer.updateModuleStatus({feature_id}, {currentModule.code}, "specified")
228
228
  ### 11-bis. Deploy Incremental Interactive HTML (MANDATORY)
229
229
 
230
230
  > **After each module is specified, deploy/update the interactive HTML document with all available data.**
231
- > This allows the client to review completed modules while the next module is being specified.
232
- > The HTML is incrementally enriched: after module 1, only module 1 specs appear; after module 2, both appear; etc.
231
+ > The client can review completed modules while the next module is being specified.
233
232
 
234
- **Source:** `html/ba-interactive.html` (relative to skill root = `~/.claude/skills/business-analyse/html/`)
233
+ See [references/validate-incremental-html.md](../references/validate-incremental-html.md) for the complete deployment process (read sources, build FEATURE_DATA, replace placeholders, write HTML).
235
234
 
236
- **Destination:** `docs/business/{app}/business-analyse/v{version}/ba-interactive.html`
237
-
238
- **Steps:**
239
-
240
- 1. **Read sources:**
241
- - Read the HTML template from skill directory
242
- - Read the master feature.json (application level — now updated with current module status)
243
- - Read EACH completed module's feature.json (including the one just specified)
244
-
245
- 2. **Build FEATURE_DATA object:**
246
-
247
- > **Use the EXACT SAME mapping defined in step-05b-deploy.md and references/html-data-mapping.md.**
248
- > The mapping is identical — the only difference is that `moduleSpecs` only includes completed modules.
249
- > Modules not yet specified will NOT appear in `moduleSpecs` (their entry in `modules[]` will show `status: "pending"`).
250
-
251
- Follow step-05 section 9d "Step 2: Build FEATURE_DATA object" for the complete mapping pseudocode:
252
- - `metadata`, `cadrage`, `modules[]`, `dependencies[]` → from master feature.json
253
- - `moduleSpecs[moduleCode]` → only for modules with status "specified" (completed so far)
254
- - `consolidation` → empty `{ interactions: [], e2eFlows: [] }` (not yet consolidated)
255
- - `handoff` → empty `{}` (not yet handed off)
256
-
257
- 3. **Replace placeholders in template:**
258
- - Serialize the FEATURE_DATA object as JSON (2-space indentation)
259
- - Replace `{{FEATURE_DATA}}` with the serialized JSON
260
- - Replace `{{APPLICATION_NAME}}` → `{application_name}`
261
- - Replace `{{APPLICATION_ID}}` → `{feature_id}`
262
- - Replace `{{VERSION}}` → `{version}`
263
- - Replace `{{CREATED_AT}}` → `{ISO timestamp}`
264
-
265
- 4. **Write and confirm:**
266
-
267
- ```
268
- ✓ Interactive HTML updated (incremental):
269
- Path: docs/business/{app}/business-analyse/v{version}/ba-interactive.html
270
- Modules included: {completedModules.length}/{totalModules} specified
271
- - {completedModule1}: {uc_count} UCs, {br_count} BRs, {entity_count} entities
272
- - {completedModule2}: ...
273
- Remaining: {pendingModules.join(', ')} (will be added after specification)
274
- → Client can open in browser to review completed modules now.
275
- ```
276
-
277
- > **WHY incremental?** The client doesn't have to wait until handoff to start reviewing.
278
- > While module 2 is being specified, the client can already give feedback on module 1.
279
- > Each incremental deployment OVERWRITES the previous HTML (latest state always).
280
- > The FINAL deployment at step-05 (handoff) will include consolidation and handoff data.
235
+ Uses the **same mapping** as step-05b-deploy.md — only difference is `moduleSpecs` only includes completed modules.
281
236
 
282
237
  ---
283
238
 
@@ -212,112 +212,17 @@ Store results in consolidation.semanticChecks[]:
212
212
 
213
213
  ### 4-bis. Structural Schema Conformity Check (MANDATORY)
214
214
 
215
- > **Post-generation validation.** After semantic checks, verify that ALL module feature.json files conform to the JSON schema structure. This catches field name mismatches, missing sections, and wrong nesting.
216
-
217
- For EACH module feature.json, run these structural checks:
218
-
219
- **A. Required Sections Presence**
220
-
221
- | Section | Required | Check |
222
- |---------|----------|-------|
223
- | `metadata` | YES | Must have: app, module, language, featureDescription, featureType |
224
- | `discovery` | YES | Must exist (even if minimal) |
225
- | `analysis.entities[]` | YES | Must have ≥1 entity |
226
- | `analysis.businessRules[]` | YES | Must have ≥1 BR |
227
- | `analysis.objectives[]` | YES | Must have ≥1 objective |
228
- | `analysis.processFlow` | YES | Must have entryPoints, mainFlow, decisionPoints |
229
- | `analysis.dataLifecycle` | YES | Must have retention, archival, deletion, gdprRelevant |
230
- | `specification.useCases[]` | YES | Must have ≥1 UC |
231
- | `specification.functionalRequirements[]` | YES | Must have ≥1 FR |
232
- | `specification.permissionMatrix` | YES | Must be `{permissions[], roleAssignments[]}` (NOT flat array) |
233
- | `specification.sections[]` | YES | Must have ≥1 section with resources |
234
- | `specification.uiWireframes[]` | YES | Must have ≥1 wireframe with `layout` object |
235
- | `specification.lifeCycles[]` | IF entities have status | States must be objects (NOT strings) |
236
- | `specification.seedDataCore` | YES | Must have 5 arrays: navigationModules, navigationTranslations, permissions, rolePermissions, permissionConstants |
237
- | `specification.gherkinScenarios` | YES | Must be `{feature, scenarios[]}` (NOT flat array) |
238
- | `specification.navigation` | YES | Must have entries[] |
239
- | `specification.i18nKeys[]` | YES | Must have ≥1 key with fr, en, nl, de |
240
- | `validation` | YES | Must have completenessChecks, consistencyChecks, semanticChecks, decision |
241
- | `handoff` | Written by step-05 | Checked post-handoff |
242
-
243
- **B. Field Name Conformity**
244
-
245
- For each section, verify NO FORBIDDEN field names are used:
246
-
247
- | Section | FORBIDDEN fields | Correct fields |
248
- |---------|-----------------|----------------|
249
- | `entities[].attributes[]` | `type`, `values`, `rules` | `description`, `unique`, `validation` |
250
- | `businessRules[]` | `rule`, `condition` (singular), `action` | `name`, `statement`, `conditions[]` |
251
- | `useCases[]` | `actor`, `linkedBRs`, `linkedFRs` | `primaryActor`, `linkedRules` |
252
- | `functionalRequirements[]` | `name`, `description`, `linkedUCs`, `linkedBRs` | `statement`, `linkedUseCases`, `linkedRules` |
253
- | `permissionMatrix` | flat array with `resource`/`roles` | `{permissions[], roleAssignments[]}` |
254
- | `lifeCycles[].states[]` | string values like `"Active"` | objects with `{id, displayName, color, isTerminal}` |
255
- | `seedDataCore` | flat object, string values | 5 typed arrays |
256
- | `gherkinScenarios` | flat scenario array | `{feature, scenarios[]}` nested |
257
-
258
- **C. ID Pattern Conformity**
259
-
260
- | ID Type | Pattern | Example |
261
- |---------|---------|---------|
262
- | BR | `BR-(VAL\|CALC\|WF\|SEC\|DATA)-{PREFIX}-\d{3}` | BR-VAL-RM-001 |
263
- | UC | `UC-{PREFIX}-\d{3}` | UC-RM-001 |
264
- | FR | `FR-{PREFIX}-\d{3}` | FR-RM-001 |
265
- | Permissions | `business.{app}.{module}.{resource}.{action}` | business.freebike.repairs.create |
266
-
267
- Verify all IDs use the correct module prefix (2-4 uppercase letters).
268
-
269
- **D. Cross-Module ID Uniqueness**
270
-
271
- Verify no ID collision across modules:
272
- ```
273
- SET all_ids = {}
274
- FOR each module:
275
- FOR each BR, UC, FR id:
276
- IF id IN all_ids → ERROR: "Duplicate {id} in {module1} and {module2}"
277
- ADD id to all_ids
278
- ```
215
+ > **Post-generation validation.** After semantic checks, verify ALL module feature.json files conform to JSON schema.
279
216
 
280
- **E. Wireframe Layout Completeness**
217
+ See [references/consolidation-structural-checks.md](../references/consolidation-structural-checks.md) for the full 6-category structural check:
218
+ - **A.** Required Sections Presence (18 sections)
219
+ - **B.** Field Name Conformity (forbidden vs correct fields)
220
+ - **C.** ID Pattern Conformity (BR, UC, FR, Permissions)
221
+ - **D.** Cross-Module ID Uniqueness
222
+ - **E.** Wireframe Layout Completeness
223
+ - **F.** SeedDataCore Translation Coverage
281
224
 
282
- For each `uiWireframes[]`:
283
- ```
284
- IF missing componentMapping[] → ERROR
285
- IF missing layout object → ERROR
286
- IF missing layout.regions[] → ERROR
287
- FOR each region in layout.regions[]:
288
- IF missing position → ERROR
289
- IF missing components[] → ERROR
290
- ```
291
-
292
- **F. SeedDataCore Translation Coverage**
293
-
294
- ```
295
- FOR each navigationModules[].code:
296
- FOR each language in [fr, en, nl, de]:
297
- IF NOT EXISTS navigationTranslations[] with moduleCode AND language → ERROR
298
- ```
299
-
300
- **Result aggregation:**
301
- ```json
302
- {
303
- "structuralChecks": [
304
- { "check": "required-sections", "module": "...", "status": "PASS|ERROR", "details": "Missing: analysis.objectives" },
305
- { "check": "field-names", "module": "...", "status": "PASS|ERROR", "details": "businessRules[0] uses 'rule' instead of 'name'+'statement'" },
306
- { "check": "id-patterns", "module": "...", "status": "PASS|ERROR", "details": "BR-001 missing category segment" },
307
- { "check": "id-uniqueness", "module": "...", "status": "PASS|ERROR", "details": "UC-RM-003 duplicated in Vehicles and Repairs" },
308
- { "check": "wireframe-layout", "module": "...", "status": "PASS|ERROR", "details": "Wireframe repairs-list missing layout object" },
309
- { "check": "seeddata-translations", "module": "...", "status": "PASS|ERROR", "details": "Missing nl translation for NavigationModuleRepairs" }
310
- ]
311
- }
312
- ```
313
-
314
- **Blocking rule:**
315
- - 0 ERROR → PASS (merge structuralChecks into consolidation.semanticChecks[])
316
- - ≥1 ERROR → BLOCK. For each ERROR:
317
- 1. Attempt AUTO-FIX (rename fields, restructure)
318
- 2. Re-write the module feature.json with fixes
319
- 3. Re-check
320
- 4. If still ERROR → ask user
225
+ **Blocking rule:** 0 ERROR → PASS. ≥1 ERROR → BLOCK (attempt auto-fix, re-write, re-check).
321
226
 
322
227
  ### 5. End-to-End Flows
323
228