@atlashub/smartstack-cli 3.39.0 → 3.41.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.documentation/apex.html +644 -644
- package/.documentation/css/styles.css +2320 -2320
- package/.documentation/init.html +1377 -1377
- package/.documentation/js/app.js +780 -780
- package/.documentation/prd-json-v2.0.0.md +396 -396
- package/.documentation/testing-ba-e2e.md +462 -462
- package/config/default-config.json +95 -95
- package/config/mcp-defaults.json +62 -62
- package/config/settings.json +53 -53
- package/config/settings.local.example.json +16 -16
- package/dist/index.js +6 -3
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +6 -4
- package/dist/mcp-entry.mjs.map +1 -1
- package/package.json +115 -115
- package/scripts/extract-api-endpoints.ts +325 -325
- package/scripts/extract-business-rules.ts +440 -440
- package/scripts/generate-doc-with-mock-ui.ts +804 -804
- package/scripts/health-check.sh +168 -168
- package/scripts/postinstall.js +18 -18
- package/templates/agents/action.md +37 -37
- package/templates/agents/ba-reader.md +378 -378
- package/templates/agents/ba-writer.md +861 -861
- package/templates/agents/code-reviewer.md +163 -163
- package/templates/agents/db-reader.md +149 -149
- package/templates/agents/docs-context-reader.md +143 -143
- package/templates/agents/docs-sync-checker.md +122 -122
- package/templates/agents/efcore/conflicts.md +95 -84
- package/templates/agents/efcore/db-deploy.md +85 -74
- package/templates/agents/efcore/db-reset.md +96 -85
- package/templates/agents/efcore/db-seed.md +72 -61
- package/templates/agents/efcore/db-status.md +97 -86
- package/templates/agents/efcore/migration.md +197 -186
- package/templates/agents/efcore/rebase-snapshot.md +119 -108
- package/templates/agents/efcore/scan.md +103 -92
- package/templates/agents/efcore/squash.md +172 -161
- package/templates/agents/explore-codebase.md +66 -66
- package/templates/agents/explore-docs.md +98 -98
- package/templates/agents/fix-grammar.md +50 -50
- package/templates/agents/gitflow/abort.md +45 -45
- package/templates/agents/gitflow/cleanup.md +96 -96
- package/templates/agents/gitflow/commit.md +236 -236
- package/templates/agents/gitflow/exec.md +48 -48
- package/templates/agents/gitflow/finish.md +146 -146
- package/templates/agents/gitflow/init-clone.md +199 -199
- package/templates/agents/gitflow/init-detect.md +137 -137
- package/templates/agents/gitflow/init-validate.md +225 -225
- package/templates/agents/gitflow/init.md +340 -340
- package/templates/agents/gitflow/merge.md +145 -145
- package/templates/agents/gitflow/plan.md +42 -42
- package/templates/agents/gitflow/pr.md +191 -191
- package/templates/agents/gitflow/review.md +49 -49
- package/templates/agents/gitflow/start.md +147 -147
- package/templates/agents/gitflow/status.md +95 -95
- package/templates/agents/mcp-healthcheck.md +163 -163
- package/templates/agents/snipper.md +37 -37
- package/templates/agents/websearch.md +46 -46
- package/templates/hooks/appsettings-guard.sh +76 -76
- package/templates/hooks/docs-drift-check.md +96 -96
- package/templates/hooks/ef-migration-check.md +139 -139
- package/templates/hooks/hooks.json +58 -58
- package/templates/hooks/mcp-check.md +64 -64
- package/templates/hooks/ralph-mcp-logger.sh +46 -46
- package/templates/hooks/ralph-session-end.sh +69 -69
- package/templates/hooks/stop-hook.sh +177 -177
- package/templates/hooks/wsl-dotnet-cleanup.sh +24 -24
- package/templates/mcp-scaffolding/component.tsx.hbs +318 -318
- package/templates/mcp-scaffolding/controller.cs.hbs +192 -192
- package/templates/mcp-scaffolding/entity-extension.cs.hbs +239 -239
- package/templates/mcp-scaffolding/frontend/api-client.ts.hbs +116 -116
- package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +133 -133
- package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +126 -126
- package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +261 -261
- package/templates/mcp-scaffolding/service-extension.cs.hbs +53 -53
- package/templates/mcp-scaffolding/tests/controller.test.cs.hbs +436 -436
- package/templates/mcp-scaffolding/tests/entity.test.cs.hbs +239 -239
- package/templates/mcp-scaffolding/tests/repository.test.cs.hbs +441 -441
- package/templates/mcp-scaffolding/tests/security.test.cs.hbs +442 -442
- package/templates/mcp-scaffolding/tests/service.test.cs.hbs +402 -402
- package/templates/mcp-scaffolding/tests/validator.test.cs.hbs +428 -428
- package/templates/project/DependencyInjection.Application.cs.template +25 -25
- package/templates/project/DependencyInjection.Infrastructure.cs.template +61 -61
- package/templates/project/DesignTimeExtensionsDbContextFactory.cs.template +70 -70
- package/templates/project/ExampleEntity.cs.template +116 -116
- package/templates/project/ExampleEntityConfiguration.cs.template +64 -64
- package/templates/project/ExampleService.cs.template +146 -146
- package/templates/project/ExtensionsDbContext.cs.template +41 -41
- package/templates/project/IExtensionsDbContext.cs.template +22 -22
- package/templates/project/Program.cs.template +47 -47
- package/templates/project/README.md +79 -79
- package/templates/project/api.ts.template +12 -12
- package/templates/project/appsettings.json.template +170 -170
- package/templates/project/claude-settings.json.template +5 -5
- package/templates/project/test-frontend/msw/handlers.ts +58 -58
- package/templates/project/test-frontend/msw/server.ts +25 -25
- package/templates/project/test-frontend/setup.ts +16 -16
- package/templates/project/test-frontend/test-utils.tsx +59 -59
- package/templates/project/test-frontend/vitest.config.ts +31 -31
- package/templates/ralph/README.md +93 -93
- package/templates/ralph/ralph.config.yaml +113 -113
- package/templates/scripts/setup-ralph-loop.sh +173 -173
- package/templates/skills/_resources/config-safety.md +61 -61
- package/templates/skills/_resources/context-digest-template.md +53 -53
- package/templates/skills/_resources/doc-context-cache.md +60 -60
- package/templates/skills/_resources/docs-manifest-schema.md +155 -155
- package/templates/skills/_resources/formatting-guide.md +124 -124
- package/templates/skills/_resources/mcp-validate-documentation-spec.md +181 -181
- package/templates/skills/_shared.md +228 -228
- package/templates/skills/admin/SKILL.md +48 -48
- package/templates/skills/ai-prompt/SKILL.md +107 -107
- package/templates/skills/ai-prompt/steps/step-00-init.md +47 -47
- package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -122
- package/templates/skills/apex/SKILL.md +168 -168
- package/templates/skills/apex/_shared.md +141 -141
- package/templates/skills/apex/references/agent-teams-protocol.md +164 -164
- package/templates/skills/apex/references/analysis-methods.md +141 -141
- package/templates/skills/apex/references/challenge-questions.md +145 -145
- package/templates/skills/apex/references/code-generation.md +412 -412
- package/templates/skills/apex/references/core-seed-data.md +1437 -1437
- package/templates/skills/apex/references/error-classification.md +144 -144
- package/templates/skills/apex/references/examine-build-validation.md +82 -82
- package/templates/skills/apex/references/execution-frontend-gates.md +177 -177
- package/templates/skills/apex/references/execution-frontend-patterns.md +105 -105
- package/templates/skills/apex/references/execution-layer1-rules.md +96 -96
- package/templates/skills/apex/references/initialization-challenge-flow.md +110 -110
- package/templates/skills/apex/references/planning-layer-mapping.md +151 -151
- package/templates/skills/apex/references/post-checks.md +1584 -1584
- package/templates/skills/apex/references/smartstack-api.md +1053 -1053
- package/templates/skills/apex/references/smartstack-frontend.md +1571 -1571
- package/templates/skills/apex/references/smartstack-layers.md +402 -402
- package/templates/skills/apex/steps/step-00-init.md +307 -307
- package/templates/skills/apex/steps/step-01-analyze.md +165 -165
- package/templates/skills/apex/steps/step-02-plan.md +144 -144
- package/templates/skills/apex/steps/step-03-execute.md +328 -328
- package/templates/skills/apex/steps/step-04-examine.md +263 -263
- package/templates/skills/apex/steps/step-05-deep-review.md +129 -129
- package/templates/skills/apex/steps/step-06-resolve.md +101 -101
- package/templates/skills/apex/steps/step-07-tests.md +238 -238
- package/templates/skills/apex/steps/step-08-run-tests.md +125 -125
- package/templates/skills/application/SKILL.md +4 -4
- package/templates/skills/application/references/application-roles-template.md +227 -227
- package/templates/skills/application/references/backend-controller-hierarchy.md +58 -58
- package/templates/skills/application/references/backend-entity-seeding.md +72 -72
- package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -83
- package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -79
- package/templates/skills/application/references/backend-verification.md +88 -88
- package/templates/skills/application/references/frontend-i18n-and-output.md +67 -67
- package/templates/skills/application/references/frontend-route-naming.md +117 -117
- package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -107
- package/templates/skills/application/references/frontend-verification.md +156 -156
- package/templates/skills/application/references/migration-checklist-troubleshooting.md +1 -1
- package/templates/skills/application/references/provider-template.md +177 -177
- package/templates/skills/application/references/roles-client-project-handling.md +55 -55
- package/templates/skills/application/references/roles-fallback-procedure.md +149 -149
- package/templates/skills/application/references/test-coverage-requirements.md +213 -213
- package/templates/skills/application/references/test-frontend.md +73 -73
- package/templates/skills/application/references/test-prerequisites.md +72 -72
- package/templates/skills/application/steps/step-05-frontend.md +176 -176
- package/templates/skills/application/steps/step-06-migration.md +193 -193
- package/templates/skills/application/steps/step-07-tests.md +356 -356
- package/templates/skills/application/steps/step-08-documentation.md +137 -137
- package/templates/skills/application/templates-backend.md +463 -463
- package/templates/skills/application/templates-frontend.md +685 -685
- package/templates/skills/application/templates-i18n.md +520 -520
- package/templates/skills/application/templates-seed.md +1096 -1096
- package/templates/skills/business-analyse/SKILL.md +327 -327
- package/templates/skills/business-analyse/_architecture.md +123 -123
- package/templates/skills/business-analyse/_elicitation.md +206 -206
- package/templates/skills/business-analyse/_module-loop.md +115 -115
- package/templates/skills/business-analyse/_shared.md +383 -383
- package/templates/skills/business-analyse/_suggestions.md +34 -34
- package/templates/skills/business-analyse/html/ba-interactive.html +4477 -4477
- package/templates/skills/business-analyse/html/build-html.js +77 -77
- package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +150 -150
- package/templates/skills/business-analyse/html/src/scripts/02-navigation.js +227 -227
- package/templates/skills/business-analyse/html/src/scripts/03-render-cadrage.js +199 -199
- package/templates/skills/business-analyse/html/src/scripts/04-render-modules.js +205 -205
- package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +647 -647
- package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +195 -195
- package/templates/skills/business-analyse/html/src/scripts/07-render-handoff.js +92 -92
- package/templates/skills/business-analyse/html/src/scripts/08-editing.js +135 -135
- package/templates/skills/business-analyse/html/src/scripts/09-export.js +168 -168
- package/templates/skills/business-analyse/html/src/scripts/10-comments.js +171 -171
- package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +166 -166
- package/templates/skills/business-analyse/html/src/styles/01-variables.css +38 -38
- package/templates/skills/business-analyse/html/src/styles/02-layout.css +101 -101
- package/templates/skills/business-analyse/html/src/styles/03-navigation.css +120 -120
- package/templates/skills/business-analyse/html/src/styles/04-cards.css +196 -196
- package/templates/skills/business-analyse/html/src/styles/05-modules.css +454 -454
- package/templates/skills/business-analyse/html/src/styles/06-wireframes.css +272 -272
- package/templates/skills/business-analyse/html/src/styles/07-comments.css +184 -184
- package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +241 -241
- package/templates/skills/business-analyse/html/src/template.html +516 -516
- package/templates/skills/business-analyse/patterns/suggestion-catalog.md +546 -546
- package/templates/skills/business-analyse/questionnaire/00-application.md +160 -160
- package/templates/skills/business-analyse/questionnaire/00b-project.md +85 -85
- package/templates/skills/business-analyse/questionnaire/01-context.md +185 -185
- package/templates/skills/business-analyse/questionnaire/02-stakeholders.md +189 -189
- package/templates/skills/business-analyse/questionnaire/03-scope.md +164 -164
- package/templates/skills/business-analyse/questionnaire/04-data.md +88 -88
- package/templates/skills/business-analyse/questionnaire/05-integrations.md +58 -58
- package/templates/skills/business-analyse/questionnaire/06-security.md +68 -68
- package/templates/skills/business-analyse/questionnaire/07-ui.md +76 -76
- package/templates/skills/business-analyse/questionnaire/08-performance.md +42 -42
- package/templates/skills/business-analyse/questionnaire/09-constraints.md +45 -45
- package/templates/skills/business-analyse/questionnaire/10-documentation.md +43 -43
- package/templates/skills/business-analyse/questionnaire/11-data-lifecycle.md +59 -59
- package/templates/skills/business-analyse/questionnaire/12-migration.md +58 -58
- package/templates/skills/business-analyse/questionnaire/13-cross-module.md +69 -69
- package/templates/skills/business-analyse/questionnaire/14-risk-assumptions.md +135 -135
- package/templates/skills/business-analyse/questionnaire/15-success-metrics.md +136 -136
- package/templates/skills/business-analyse/questionnaire.md +337 -337
- package/templates/skills/business-analyse/react/application-viewer.md +242 -242
- package/templates/skills/business-analyse/react/components.md +551 -551
- package/templates/skills/business-analyse/react/i18n-template.md +306 -306
- package/templates/skills/business-analyse/references/acceptance-criteria.md +169 -169
- package/templates/skills/business-analyse/references/agent-module-prompt.md +362 -362
- package/templates/skills/business-analyse/references/agent-pooling-best-practices.md +557 -557
- package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -190
- package/templates/skills/business-analyse/references/cache-warming-strategy.md +566 -566
- package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -41
- package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -74
- package/templates/skills/business-analyse/references/cadrage-pre-analysis.md +115 -115
- package/templates/skills/business-analyse/references/cadrage-shared-modules.md +68 -69
- package/templates/skills/business-analyse/references/cadrage-structure-cards.md +85 -85
- package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -297
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +107 -107
- package/templates/skills/business-analyse/references/deploy-data-build.md +180 -180
- package/templates/skills/business-analyse/references/deploy-modes.md +118 -118
- package/templates/skills/business-analyse/references/detection-strategies.md +424 -424
- package/templates/skills/business-analyse/references/entity-architecture-decision.md +218 -218
- package/templates/skills/business-analyse/references/handoff-file-templates.md +120 -120
- package/templates/skills/business-analyse/references/handoff-mappings.md +81 -81
- package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -312
- package/templates/skills/business-analyse/references/html-data-mapping.md +299 -299
- package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -65
- package/templates/skills/business-analyse/references/naming-conventions.md +243 -243
- package/templates/skills/business-analyse/references/prd-generation.md +258 -258
- package/templates/skills/business-analyse/references/review-data-mapping.md +363 -363
- package/templates/skills/business-analyse/references/robustness-checks.md +542 -542
- package/templates/skills/business-analyse/references/spec-auto-inference.md +111 -111
- package/templates/skills/business-analyse/references/team-orchestration.md +1022 -1022
- package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -85
- package/templates/skills/business-analyse/references/ui-resource-cards.md +259 -259
- package/templates/skills/business-analyse/references/validate-incremental-html.md +121 -121
- package/templates/skills/business-analyse/references/validation-checklist.md +347 -347
- package/templates/skills/business-analyse/references/wireframe-svg-style-guide.md +335 -335
- package/templates/skills/business-analyse/schemas/application-schema.json +453 -453
- package/templates/skills/business-analyse/schemas/feature-schema.json +53 -53
- package/templates/skills/business-analyse/schemas/project-schema.json +485 -485
- package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +201 -201
- package/templates/skills/business-analyse/schemas/sections/discovery-schema.json +82 -82
- package/templates/skills/business-analyse/schemas/sections/handoff-schema.json +80 -80
- package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +70 -70
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +547 -547
- package/templates/skills/business-analyse/schemas/sections/validation-schema.json +93 -93
- package/templates/skills/business-analyse/schemas/shared/common-defs.json +226 -226
- package/templates/skills/business-analyse/steps/step-00-init.md +575 -576
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +767 -767
- package/templates/skills/business-analyse/steps/step-01b-applications.md +419 -419
- package/templates/skills/business-analyse/steps/step-02-decomposition.md +387 -387
- package/templates/skills/business-analyse/steps/step-03a-data.md +16 -16
- package/templates/skills/business-analyse/steps/step-03a1-setup.md +506 -506
- package/templates/skills/business-analyse/steps/step-03a2-analysis.md +252 -252
- package/templates/skills/business-analyse/steps/step-03b-ui.md +425 -425
- package/templates/skills/business-analyse/steps/step-03c-compile.md +611 -611
- package/templates/skills/business-analyse/steps/step-03d-validate.md +783 -783
- package/templates/skills/business-analyse/steps/step-04-consolidation.md +17 -17
- package/templates/skills/business-analyse/steps/step-04a-collect.md +415 -415
- package/templates/skills/business-analyse/steps/step-04b-analyze.md +163 -163
- package/templates/skills/business-analyse/steps/step-04c-decide.md +186 -186
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +840 -840
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +522 -522
- package/templates/skills/business-analyse/steps/step-05c-ralph-readiness.md +703 -703
- package/templates/skills/business-analyse/steps/step-06-review.md +278 -278
- package/templates/skills/business-analyse/templates/tpl-frd.md +168 -168
- package/templates/skills/business-analyse/templates/tpl-handoff.md +186 -186
- package/templates/skills/business-analyse/templates/tpl-launch-displays.md +59 -59
- package/templates/skills/business-analyse/templates/tpl-progress.md +172 -172
- package/templates/skills/business-analyse/templates-frd.md +476 -476
- package/templates/skills/business-analyse/templates-react.md +574 -574
- package/templates/skills/cc-agent/SKILL.md +129 -129
- package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -95
- package/templates/skills/cc-agent/references/agent-frontmatter.md +213 -213
- package/templates/skills/cc-agent/references/permission-modes.md +102 -102
- package/templates/skills/cc-agent/references/tools-reference.md +144 -144
- package/templates/skills/cc-agent/steps/step-00-init.md +134 -134
- package/templates/skills/cc-agent/steps/step-01-design.md +186 -186
- package/templates/skills/cc-agent/steps/step-02-generate.md +131 -131
- package/templates/skills/cc-agent/steps/step-03-validate.md +130 -130
- package/templates/skills/cc-agent/templates/agent-categorized.md +67 -67
- package/templates/skills/cc-agent/templates/agent-standalone.md +56 -56
- package/templates/skills/cc-agent/templates/agent-with-skills.md +94 -94
- package/templates/skills/cc-audit/SKILL.md +108 -108
- package/templates/skills/cc-audit/references/agent-checklist.md +91 -91
- package/templates/skills/cc-audit/references/hook-checklist.md +110 -110
- package/templates/skills/cc-audit/references/skill-checklist.md +70 -70
- package/templates/skills/cc-audit/steps/step-00-init.md +98 -98
- package/templates/skills/cc-audit/steps/step-01-scan.md +142 -142
- package/templates/skills/cc-audit/steps/step-02-analyze.md +158 -158
- package/templates/skills/cc-audit/steps/step-03-report.md +142 -142
- package/templates/skills/cc-skill/SKILL.md +134 -134
- package/templates/skills/cc-skill/references/best-practices.md +167 -167
- package/templates/skills/cc-skill/references/frontmatter-reference.md +182 -182
- package/templates/skills/cc-skill/references/skill-patterns.md +199 -199
- package/templates/skills/cc-skill/steps/step-00-init.md +119 -119
- package/templates/skills/cc-skill/steps/step-01-design.md +199 -199
- package/templates/skills/cc-skill/steps/step-02-generate.md +145 -145
- package/templates/skills/cc-skill/steps/step-03-steps.md +151 -151
- package/templates/skills/cc-skill/steps/step-04-validate.md +124 -124
- package/templates/skills/cc-skill/templates/skill-forked.md +85 -85
- package/templates/skills/cc-skill/templates/skill-progressive.md +102 -102
- package/templates/skills/cc-skill/templates/skill-simple.md +75 -75
- package/templates/skills/cc-skill/templates/step-template.md +82 -82
- package/templates/skills/check-version/SKILL.md +196 -196
- package/templates/skills/controller/SKILL.md +162 -162
- package/templates/skills/controller/postman-templates.md +614 -614
- package/templates/skills/controller/references/controller-code-templates.md +159 -159
- package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -209
- package/templates/skills/controller/references/permission-sync-templates.md +149 -149
- package/templates/skills/controller/steps/step-00-init.md +193 -191
- package/templates/skills/controller/steps/step-01-analyze.md +146 -146
- package/templates/skills/controller/steps/step-02-plan.md +176 -176
- package/templates/skills/controller/steps/step-03-generate.md +189 -189
- package/templates/skills/controller/steps/step-04-perms.md +80 -80
- package/templates/skills/controller/steps/step-05-validate.md +107 -107
- package/templates/skills/controller/templates.md +1555 -1555
- package/templates/skills/debug/SKILL.md +70 -70
- package/templates/skills/debug/references/team-protocol.md +232 -232
- package/templates/skills/debug/steps/step-00-init.md +57 -57
- package/templates/skills/debug/steps/step-01-analyze.md +219 -219
- package/templates/skills/debug/steps/step-02-resolve.md +85 -85
- package/templates/skills/documentation/SKILL.md +132 -132
- package/templates/skills/documentation/data-schema.md +227 -227
- package/templates/skills/documentation/steps/step-00-init.md +70 -70
- package/templates/skills/documentation/steps/step-01-scan.md +113 -113
- package/templates/skills/documentation/steps/step-02-generate.md +231 -231
- package/templates/skills/documentation/steps/step-03-validate.md +251 -238
- package/templates/skills/documentation/templates.md +662 -663
- package/templates/skills/efcore/SKILL.md +168 -167
- package/templates/skills/efcore/references/both-contexts.md +32 -32
- package/templates/skills/efcore/references/database-operations.md +67 -67
- package/templates/skills/efcore/references/destructive-operations.md +38 -38
- package/templates/skills/efcore/references/reset-operations.md +81 -81
- package/templates/skills/efcore/references/seed-methods.md +86 -86
- package/templates/skills/efcore/references/shared-init-functions.md +250 -250
- package/templates/skills/efcore/references/sql-objects-injection.md +61 -61
- package/templates/skills/efcore/references/troubleshooting.md +81 -81
- package/templates/skills/efcore/references/zero-downtime-patterns.md +227 -227
- package/templates/skills/efcore/steps/db/step-deploy.md +217 -217
- package/templates/skills/efcore/steps/db/step-reset.md +186 -186
- package/templates/skills/efcore/steps/db/step-seed.md +166 -166
- package/templates/skills/efcore/steps/db/step-status.md +173 -173
- package/templates/skills/efcore/steps/migration/step-00-init.md +102 -102
- package/templates/skills/efcore/steps/migration/step-01-check.md +164 -164
- package/templates/skills/efcore/steps/migration/step-02-create.md +160 -160
- package/templates/skills/efcore/steps/migration/step-03-validate.md +168 -168
- package/templates/skills/efcore/steps/rebase-snapshot/step-00-init.md +173 -173
- package/templates/skills/efcore/steps/rebase-snapshot/step-01-backup.md +100 -100
- package/templates/skills/efcore/steps/rebase-snapshot/step-02-fetch.md +115 -115
- package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +112 -112
- package/templates/skills/efcore/steps/rebase-snapshot/step-04-validate.md +157 -157
- package/templates/skills/efcore/steps/shared/step-00-init.md +131 -131
- package/templates/skills/efcore/steps/squash/step-00-init.md +141 -141
- package/templates/skills/efcore/steps/squash/step-01-backup.md +120 -120
- package/templates/skills/efcore/steps/squash/step-02-fetch.md +168 -168
- package/templates/skills/efcore/steps/squash/step-03-create.md +184 -184
- package/templates/skills/efcore/steps/squash/step-04-validate.md +174 -174
- package/templates/skills/explore/SKILL.md +98 -98
- package/templates/skills/feature-full/SKILL.md +111 -111
- package/templates/skills/feature-full/steps/step-00-init.md +57 -57
- package/templates/skills/feature-full/steps/step-01-implementation.md +120 -120
- package/templates/skills/gitflow/SKILL.md +377 -377
- package/templates/skills/gitflow/_shared.md +620 -620
- package/templates/skills/gitflow/phases/abort.md +189 -189
- package/templates/skills/gitflow/phases/cleanup.md +234 -234
- package/templates/skills/gitflow/phases/status.md +192 -192
- package/templates/skills/gitflow/references/commit-message-generation.md +58 -58
- package/templates/skills/gitflow/references/commit-migration-validation.md +49 -49
- package/templates/skills/gitflow/references/finish-cleanup.md +55 -55
- package/templates/skills/gitflow/references/finish-version-bumping.md +45 -45
- package/templates/skills/gitflow/references/init-config-template.md +135 -135
- package/templates/skills/gitflow/references/init-environment-detection.md +41 -41
- package/templates/skills/gitflow/references/init-name-normalization.md +103 -103
- package/templates/skills/gitflow/references/init-questions.md +185 -185
- package/templates/skills/gitflow/references/init-structure-creation.md +75 -75
- package/templates/skills/gitflow/references/init-version-detection.md +21 -21
- package/templates/skills/gitflow/references/init-workspace-detection.md +43 -43
- package/templates/skills/gitflow/references/merge-ci-status.md +36 -36
- package/templates/skills/gitflow/references/merge-execution.md +62 -62
- package/templates/skills/gitflow/references/merge-pr-context.md +76 -76
- package/templates/skills/gitflow/references/plan-template.md +69 -69
- package/templates/skills/gitflow/references/pr-build-checks.md +60 -60
- package/templates/skills/gitflow/references/pr-generation.md +58 -58
- package/templates/skills/gitflow/references/start-branch-normalization.md +28 -28
- package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -70
- package/templates/skills/gitflow/references/start-local-config.md +113 -113
- package/templates/skills/gitflow/references/start-worktree-creation.md +50 -50
- package/templates/skills/gitflow/references/sync-push-verify.md +44 -44
- package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -38
- package/templates/skills/gitflow/steps/step-commit.md +199 -199
- package/templates/skills/gitflow/steps/step-finish.md +147 -147
- package/templates/skills/gitflow/steps/step-init.md +190 -190
- package/templates/skills/gitflow/steps/step-merge.md +85 -85
- package/templates/skills/gitflow/steps/step-plan.md +151 -151
- package/templates/skills/gitflow/steps/step-pr.md +199 -199
- package/templates/skills/gitflow/steps/step-start.md +195 -195
- package/templates/skills/gitflow/steps/step-sync.md +161 -161
- package/templates/skills/gitflow/templates/config.json +72 -72
- package/templates/skills/mcp/SKILL.md +62 -62
- package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -108
- package/templates/skills/mcp/steps/step-02-tools.md +73 -73
- package/templates/skills/notification/SKILL.md +173 -173
- package/templates/skills/quick-search/SKILL.md +99 -99
- package/templates/skills/ralph-loop/SKILL.md +234 -234
- package/templates/skills/ralph-loop/references/category-completeness.md +185 -185
- package/templates/skills/ralph-loop/references/category-rules.md +96 -96
- package/templates/skills/ralph-loop/references/compact-loop.md +300 -300
- package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -127
- package/templates/skills/ralph-loop/references/module-transition.md +151 -151
- package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -171
- package/templates/skills/ralph-loop/references/parallel-execution.md +246 -246
- package/templates/skills/ralph-loop/references/section-splitting.md +439 -439
- package/templates/skills/ralph-loop/references/task-transform-legacy.md +256 -256
- package/templates/skills/ralph-loop/references/team-orchestration.md +547 -547
- package/templates/skills/ralph-loop/steps/step-00-init.md +150 -150
- package/templates/skills/ralph-loop/steps/step-01-task.md +174 -174
- package/templates/skills/ralph-loop/steps/step-02-execute.md +177 -177
- package/templates/skills/ralph-loop/steps/step-03-commit.md +92 -92
- package/templates/skills/ralph-loop/steps/step-04-check.md +207 -207
- package/templates/skills/ralph-loop/steps/step-05-report.md +175 -175
- package/templates/skills/refactor/SKILL.md +56 -56
- package/templates/skills/refactor/steps/step-01-discover.md +60 -60
- package/templates/skills/refactor/steps/step-02-execute.md +67 -67
- package/templates/skills/review-code/SKILL.md +95 -94
- package/templates/skills/review-code/references/clean-code-principles.md +292 -292
- package/templates/skills/review-code/references/code-quality-metrics.md +174 -174
- package/templates/skills/review-code/references/feedback-patterns.md +149 -149
- package/templates/skills/review-code/references/owasp-api-top10.md +243 -243
- package/templates/skills/review-code/references/security-checklist.md +212 -212
- package/templates/skills/review-code/steps/step-01-smartstack.md +96 -96
- package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -80
- package/templates/skills/review-code/steps/step-03-react.md +44 -44
- package/templates/skills/ui-components/SKILL.md +137 -137
- package/templates/skills/ui-components/accessibility.md +170 -170
- package/templates/skills/ui-components/patterns/dashboard-chart.md +327 -327
- package/templates/skills/ui-components/patterns/data-table.md +39 -39
- package/templates/skills/ui-components/patterns/entity-card.md +77 -77
- package/templates/skills/ui-components/patterns/grid-layout.md +91 -91
- package/templates/skills/ui-components/patterns/kanban.md +43 -43
- package/templates/skills/ui-components/responsive-guidelines.md +278 -278
- package/templates/skills/ui-components/style-guide.md +113 -113
- package/templates/skills/utils/SKILL.md +44 -44
- package/templates/skills/utils/subcommands/test-web-config.md +152 -152
- package/templates/skills/utils/subcommands/test-web.md +123 -123
- package/templates/skills/validate/SKILL.md +181 -181
- package/templates/skills/validate-feature/SKILL.md +101 -101
- package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -140
- package/templates/skills/validate-feature/references/db-validation-checks.md +180 -180
- package/templates/skills/validate-feature/steps/step-00-dependencies.md +121 -121
- package/templates/skills/validate-feature/steps/step-01-compile.md +39 -39
- package/templates/skills/validate-feature/steps/step-02-unit-tests.md +45 -45
- package/templates/skills/validate-feature/steps/step-03-integration-tests.md +53 -53
- package/templates/skills/validate-feature/steps/step-04-api-smoke.md +94 -94
- package/templates/skills/validate-feature/steps/step-05-db-validation.md +149 -149
- package/templates/skills/workflow/SKILL.md +127 -127
- package/templates/skills/workflow/steps/step-00-init.md +57 -57
- package/templates/skills/workflow/steps/step-01-implementation.md +84 -84
- package/templates/test-web/api-health.json +38 -38
- package/templates/test-web/minimal.json +19 -19
- package/templates/test-web/npm-package.json +46 -46
- package/templates/test-web/seo-check.json +54 -54
|
@@ -1,611 +1,611 @@
|
|
|
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`
|
|
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`
|