@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,463 +1,463 @@
|
|
|
1
|
-
# Templates Backend - Application Skill
|
|
2
|
-
|
|
3
|
-
> These templates generate C# code for new applications/modules.
|
|
4
|
-
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
## TEMPLATE: PERMISSIONS CLASS
|
|
8
|
-
|
|
9
|
-
```csharp
|
|
10
|
-
// Add to src/SmartStack.Application/Common/Authorization/Permissions.cs
|
|
11
|
-
|
|
12
|
-
public static class $APPLICATION_PASCAL
|
|
13
|
-
{
|
|
14
|
-
public const string Access = "$application";
|
|
15
|
-
|
|
16
|
-
public static class $MODULE_PASCAL
|
|
17
|
-
{
|
|
18
|
-
public const string View = "$application.$module.read";
|
|
19
|
-
public const string Create = "$application.$module.create";
|
|
20
|
-
public const string Update = "$application.$module.update";
|
|
21
|
-
public const string Delete = "$application.$module.delete";
|
|
22
|
-
public const string Assign = "$application.$module.assign";
|
|
23
|
-
public const string Execute = "$application.$module.execute";
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
```
|
|
27
|
-
|
|
28
|
-
### Example for Sales > Products
|
|
29
|
-
|
|
30
|
-
```csharp
|
|
31
|
-
public static class Sales
|
|
32
|
-
{
|
|
33
|
-
public const string Access = "sales";
|
|
34
|
-
|
|
35
|
-
public static class Products
|
|
36
|
-
{
|
|
37
|
-
public const string View = "sales.products.read";
|
|
38
|
-
public const string Create = "sales.products.create";
|
|
39
|
-
public const string Update = "sales.products.update";
|
|
40
|
-
public const string Delete = "sales.products.delete";
|
|
41
|
-
public const string Assign = "sales.products.assign";
|
|
42
|
-
public const string Execute = "sales.products.execute";
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
---
|
|
48
|
-
|
|
49
|
-
## TEMPLATE: SERVICE INTERFACE
|
|
50
|
-
|
|
51
|
-
```csharp
|
|
52
|
-
// src/SmartStack.Application/Common/Interfaces/I{Module}Service.cs
|
|
53
|
-
|
|
54
|
-
using SmartStack.Application.$APPLICATION_PASCAL.$MODULE_PASCAL.DTOs;
|
|
55
|
-
|
|
56
|
-
namespace SmartStack.Application.Common.Interfaces;
|
|
57
|
-
|
|
58
|
-
public interface I$MODULE_PASCALService
|
|
59
|
-
{
|
|
60
|
-
Task<PaginatedResult<$ENTITY_PASCALDto>> GetAllAsync(
|
|
61
|
-
$ENTITY_PASCALQueryParameters parameters,
|
|
62
|
-
CancellationToken cancellationToken = default);
|
|
63
|
-
|
|
64
|
-
Task<$ENTITY_PASCALDto?> GetByIdAsync(
|
|
65
|
-
Guid id,
|
|
66
|
-
CancellationToken cancellationToken = default);
|
|
67
|
-
|
|
68
|
-
Task<$ENTITY_PASCALDto> CreateAsync(
|
|
69
|
-
Create$ENTITY_PASCALRequest request,
|
|
70
|
-
CancellationToken cancellationToken = default);
|
|
71
|
-
|
|
72
|
-
Task<$ENTITY_PASCALDto> UpdateAsync(
|
|
73
|
-
Guid id,
|
|
74
|
-
Update$ENTITY_PASCALRequest request,
|
|
75
|
-
CancellationToken cancellationToken = default);
|
|
76
|
-
|
|
77
|
-
Task<bool> DeleteAsync(
|
|
78
|
-
Guid id,
|
|
79
|
-
CancellationToken cancellationToken = default);
|
|
80
|
-
}
|
|
81
|
-
```
|
|
82
|
-
|
|
83
|
-
---
|
|
84
|
-
|
|
85
|
-
## TEMPLATE: SERVICE IMPLEMENTATION
|
|
86
|
-
|
|
87
|
-
> **TENANT ISOLATION RULES (BLOCKING):**
|
|
88
|
-
> - ALL queries MUST include `.Where(x => x.TenantId == _currentUser.TenantId)`
|
|
89
|
-
> - ALL entity creation MUST pass `_currentUser.TenantId` as first parameter to `Entity.Create()`
|
|
90
|
-
> - NEVER use `new Entity { }` without `TenantId =` — always prefer the factory method
|
|
91
|
-
> - NEVER use `Guid.Empty` as a placeholder — resolve the actual value from `_currentUser`
|
|
92
|
-
|
|
93
|
-
```csharp
|
|
94
|
-
// src/SmartStack.Infrastructure/Services/$APPLICATION_PASCAL/$MODULE_PASCAL/$MODULE_PASCALService.cs
|
|
95
|
-
|
|
96
|
-
using Microsoft.EntityFrameworkCore;
|
|
97
|
-
using Microsoft.Extensions.Logging;
|
|
98
|
-
using SmartStack.Application.Common.Interfaces;
|
|
99
|
-
using SmartStack.Application.$APPLICATION_PASCAL.$MODULE_PASCAL.DTOs;
|
|
100
|
-
using SmartStack.Domain.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
101
|
-
|
|
102
|
-
namespace SmartStack.Infrastructure.Services.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
103
|
-
|
|
104
|
-
public class $MODULE_PASCALService : I$MODULE_PASCALService
|
|
105
|
-
{
|
|
106
|
-
private readonly IApplicationDbContext _context;
|
|
107
|
-
private readonly ICurrentUserService _currentUser;
|
|
108
|
-
private readonly ILogger<$MODULE_PASCALService> _logger;
|
|
109
|
-
|
|
110
|
-
public $MODULE_PASCALService(
|
|
111
|
-
IApplicationDbContext context,
|
|
112
|
-
ICurrentUserService currentUser,
|
|
113
|
-
ILogger<$MODULE_PASCALService> logger)
|
|
114
|
-
{
|
|
115
|
-
_context = context;
|
|
116
|
-
_currentUser = currentUser;
|
|
117
|
-
_logger = logger;
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
public async Task<PaginatedResult<$ENTITY_PASCALDto>> GetAllAsync(
|
|
121
|
-
$ENTITY_PASCALQueryParameters parameters,
|
|
122
|
-
CancellationToken cancellationToken = default)
|
|
123
|
-
{
|
|
124
|
-
var query = _context.$ENTITY_PLURAL
|
|
125
|
-
.AsNoTracking()
|
|
126
|
-
.Where(x => x.TenantId == _currentUser.TenantId); // MANDATORY: tenant isolation
|
|
127
|
-
|
|
128
|
-
// Apply filters
|
|
129
|
-
if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
|
|
130
|
-
{
|
|
131
|
-
query = query.Where(x =>
|
|
132
|
-
x.Name.Contains(parameters.SearchTerm) ||
|
|
133
|
-
x.Description.Contains(parameters.SearchTerm));
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// Apply sorting
|
|
137
|
-
query = parameters.SortColumn?.ToLower() switch
|
|
138
|
-
{
|
|
139
|
-
"name" => parameters.SortDirection == "desc"
|
|
140
|
-
? query.OrderByDescending(x => x.Name)
|
|
141
|
-
: query.OrderBy(x => x.Name),
|
|
142
|
-
"createdat" => parameters.SortDirection == "desc"
|
|
143
|
-
? query.OrderByDescending(x => x.CreatedAt)
|
|
144
|
-
: query.OrderBy(x => x.CreatedAt),
|
|
145
|
-
_ => query.OrderByDescending(x => x.CreatedAt)
|
|
146
|
-
};
|
|
147
|
-
|
|
148
|
-
var totalCount = await query.CountAsync(cancellationToken);
|
|
149
|
-
|
|
150
|
-
var items = await query
|
|
151
|
-
.Skip((parameters.Page - 1) * parameters.PageSize)
|
|
152
|
-
.Take(parameters.PageSize)
|
|
153
|
-
.Select(x => new $ENTITY_PASCALDto
|
|
154
|
-
{
|
|
155
|
-
Id = x.Id,
|
|
156
|
-
Name = x.Name,
|
|
157
|
-
Description = x.Description,
|
|
158
|
-
IsActive = x.IsActive,
|
|
159
|
-
CreatedAt = x.CreatedAt,
|
|
160
|
-
UpdatedAt = x.UpdatedAt
|
|
161
|
-
})
|
|
162
|
-
.ToListAsync(cancellationToken);
|
|
163
|
-
|
|
164
|
-
return new PaginatedResult<$ENTITY_PASCALDto>
|
|
165
|
-
{
|
|
166
|
-
Items = items,
|
|
167
|
-
TotalCount = totalCount,
|
|
168
|
-
Page = parameters.Page,
|
|
169
|
-
PageSize = parameters.PageSize
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
|
|
173
|
-
public async Task<$ENTITY_PASCALDto?> GetByIdAsync(
|
|
174
|
-
Guid id,
|
|
175
|
-
CancellationToken cancellationToken = default)
|
|
176
|
-
{
|
|
177
|
-
var entity = await _context.$ENTITY_PLURAL
|
|
178
|
-
.AsNoTracking()
|
|
179
|
-
.Where(x => x.TenantId == _currentUser.TenantId) // MANDATORY: tenant isolation
|
|
180
|
-
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
|
181
|
-
|
|
182
|
-
if (entity == null)
|
|
183
|
-
return null;
|
|
184
|
-
|
|
185
|
-
return new $ENTITY_PASCALDto
|
|
186
|
-
{
|
|
187
|
-
Id = entity.Id,
|
|
188
|
-
Name = entity.Name,
|
|
189
|
-
Description = entity.Description,
|
|
190
|
-
IsActive = entity.IsActive,
|
|
191
|
-
CreatedAt = entity.CreatedAt,
|
|
192
|
-
UpdatedAt = entity.UpdatedAt
|
|
193
|
-
};
|
|
194
|
-
}
|
|
195
|
-
|
|
196
|
-
public async Task<$ENTITY_PASCALDto> CreateAsync(
|
|
197
|
-
Create$ENTITY_PASCALRequest request,
|
|
198
|
-
CancellationToken cancellationToken = default)
|
|
199
|
-
{
|
|
200
|
-
var entity = $ENTITY_PASCAL.Create(
|
|
201
|
-
_currentUser.TenantId, // MANDATORY: tenant isolation — always first parameter
|
|
202
|
-
request.Name,
|
|
203
|
-
request.Description);
|
|
204
|
-
|
|
205
|
-
_context.$ENTITY_PLURAL.Add(entity);
|
|
206
|
-
await _context.SaveChangesAsync(cancellationToken);
|
|
207
|
-
|
|
208
|
-
_logger.LogInformation(
|
|
209
|
-
"User {User} created $ENTITY_PASCAL {Id} ({Name})",
|
|
210
|
-
_currentUser.Email,
|
|
211
|
-
entity.Id,
|
|
212
|
-
entity.Name);
|
|
213
|
-
|
|
214
|
-
return new $ENTITY_PASCALDto
|
|
215
|
-
{
|
|
216
|
-
Id = entity.Id,
|
|
217
|
-
Name = entity.Name,
|
|
218
|
-
Description = entity.Description,
|
|
219
|
-
IsActive = entity.IsActive,
|
|
220
|
-
CreatedAt = entity.CreatedAt
|
|
221
|
-
};
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
public async Task<$ENTITY_PASCALDto> UpdateAsync(
|
|
225
|
-
Guid id,
|
|
226
|
-
Update$ENTITY_PASCALRequest request,
|
|
227
|
-
CancellationToken cancellationToken = default)
|
|
228
|
-
{
|
|
229
|
-
var entity = await _context.$ENTITY_PLURAL
|
|
230
|
-
.Where(x => x.TenantId == _currentUser.TenantId) // MANDATORY: tenant isolation
|
|
231
|
-
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken)
|
|
232
|
-
?? throw new NotFoundException("$ENTITY_PASCAL", id);
|
|
233
|
-
|
|
234
|
-
entity.Update(request.Name, request.Description);
|
|
235
|
-
|
|
236
|
-
await _context.SaveChangesAsync(cancellationToken);
|
|
237
|
-
|
|
238
|
-
_logger.LogInformation(
|
|
239
|
-
"User {User} updated $ENTITY_PASCAL {Id} ({Name})",
|
|
240
|
-
_currentUser.Email,
|
|
241
|
-
entity.Id,
|
|
242
|
-
entity.Name);
|
|
243
|
-
|
|
244
|
-
return new $ENTITY_PASCALDto
|
|
245
|
-
{
|
|
246
|
-
Id = entity.Id,
|
|
247
|
-
Name = entity.Name,
|
|
248
|
-
Description = entity.Description,
|
|
249
|
-
IsActive = entity.IsActive,
|
|
250
|
-
CreatedAt = entity.CreatedAt,
|
|
251
|
-
UpdatedAt = entity.UpdatedAt
|
|
252
|
-
};
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
public async Task<bool> DeleteAsync(
|
|
256
|
-
Guid id,
|
|
257
|
-
CancellationToken cancellationToken = default)
|
|
258
|
-
{
|
|
259
|
-
var entity = await _context.$ENTITY_PLURAL
|
|
260
|
-
.Where(x => x.TenantId == _currentUser.TenantId) // MANDATORY: tenant isolation
|
|
261
|
-
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
|
262
|
-
|
|
263
|
-
if (entity == null)
|
|
264
|
-
return false;
|
|
265
|
-
|
|
266
|
-
_context.$ENTITY_PLURAL.Remove(entity);
|
|
267
|
-
await _context.SaveChangesAsync(cancellationToken);
|
|
268
|
-
|
|
269
|
-
_logger.LogWarning(
|
|
270
|
-
"User {User} deleted $ENTITY_PASCAL {Id} ({Name})",
|
|
271
|
-
_currentUser.Email,
|
|
272
|
-
id,
|
|
273
|
-
entity.Name);
|
|
274
|
-
|
|
275
|
-
return true;
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
```
|
|
279
|
-
|
|
280
|
-
---
|
|
281
|
-
|
|
282
|
-
## TEMPLATE: DTOs
|
|
283
|
-
|
|
284
|
-
```csharp
|
|
285
|
-
// src/SmartStack.Application/$APPLICATION_PASCAL/$MODULE_PASCAL/DTOs/$ENTITY_PASCALDto.cs
|
|
286
|
-
|
|
287
|
-
namespace SmartStack.Application.$APPLICATION_PASCAL.$MODULE_PASCAL.DTOs;
|
|
288
|
-
|
|
289
|
-
public record $ENTITY_PASCALDto
|
|
290
|
-
{
|
|
291
|
-
public Guid Id { get; init; }
|
|
292
|
-
public string Name { get; init; } = null!;
|
|
293
|
-
public string? Description { get; init; }
|
|
294
|
-
public bool IsActive { get; init; }
|
|
295
|
-
public DateTime CreatedAt { get; init; }
|
|
296
|
-
public DateTime? UpdatedAt { get; init; }
|
|
297
|
-
}
|
|
298
|
-
|
|
299
|
-
public record Create$ENTITY_PASCALRequest
|
|
300
|
-
{
|
|
301
|
-
public string Name { get; init; } = null!;
|
|
302
|
-
public string? Description { get; init; }
|
|
303
|
-
}
|
|
304
|
-
|
|
305
|
-
public record Update$ENTITY_PASCALRequest
|
|
306
|
-
{
|
|
307
|
-
public string Name { get; init; } = null!;
|
|
308
|
-
public string? Description { get; init; }
|
|
309
|
-
}
|
|
310
|
-
|
|
311
|
-
public record $ENTITY_PASCALQueryParameters
|
|
312
|
-
{
|
|
313
|
-
public int Page { get; init; } = 1;
|
|
314
|
-
public int PageSize { get; init; } = 10;
|
|
315
|
-
public string? SearchTerm { get; init; }
|
|
316
|
-
public string? SortColumn { get; init; } = "createdAt";
|
|
317
|
-
public string? SortDirection { get; init; } = "desc";
|
|
318
|
-
}
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
---
|
|
322
|
-
|
|
323
|
-
## TEMPLATE: DOMAIN ENTITY
|
|
324
|
-
|
|
325
|
-
```csharp
|
|
326
|
-
// src/SmartStack.Domain/$APPLICATION_PASCAL/$MODULE_PASCAL/$ENTITY_PASCAL.cs
|
|
327
|
-
|
|
328
|
-
using SmartStack.Domain.Common;
|
|
329
|
-
|
|
330
|
-
namespace SmartStack.Domain.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
331
|
-
|
|
332
|
-
public class $ENTITY_PASCAL : BaseEntity
|
|
333
|
-
{
|
|
334
|
-
public string Name { get; private set; } = null!;
|
|
335
|
-
public string? Description { get; private set; }
|
|
336
|
-
public bool IsActive { get; private set; }
|
|
337
|
-
|
|
338
|
-
private $ENTITY_PASCAL() { }
|
|
339
|
-
|
|
340
|
-
public static $ENTITY_PASCAL Create(string name, string? description = null)
|
|
341
|
-
{
|
|
342
|
-
if (string.IsNullOrWhiteSpace(name))
|
|
343
|
-
throw new Exceptions.DomainException("Name is required");
|
|
344
|
-
|
|
345
|
-
return new $ENTITY_PASCAL
|
|
346
|
-
{
|
|
347
|
-
Id = Guid.NewGuid(),
|
|
348
|
-
Name = name,
|
|
349
|
-
Description = description,
|
|
350
|
-
IsActive = true,
|
|
351
|
-
CreatedAt = DateTime.UtcNow
|
|
352
|
-
};
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
public void Update(string name, string? description)
|
|
356
|
-
{
|
|
357
|
-
if (string.IsNullOrWhiteSpace(name))
|
|
358
|
-
throw new Exceptions.DomainException("Name is required");
|
|
359
|
-
|
|
360
|
-
Name = name;
|
|
361
|
-
Description = description;
|
|
362
|
-
UpdatedAt = DateTime.UtcNow;
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
public void Activate() => IsActive = true;
|
|
366
|
-
public void Deactivate() => IsActive = false;
|
|
367
|
-
}
|
|
368
|
-
```
|
|
369
|
-
|
|
370
|
-
---
|
|
371
|
-
|
|
372
|
-
## TEMPLATE: EF CONFIGURATION
|
|
373
|
-
|
|
374
|
-
```csharp
|
|
375
|
-
// src/SmartStack.Infrastructure/Persistence/Configurations/$APPLICATION_PASCAL/$MODULE_PASCAL/$ENTITY_PASCALConfiguration.cs
|
|
376
|
-
|
|
377
|
-
using Microsoft.EntityFrameworkCore;
|
|
378
|
-
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
379
|
-
using SmartStack.Domain.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
380
|
-
|
|
381
|
-
namespace SmartStack.Infrastructure.Persistence.Configurations.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
382
|
-
|
|
383
|
-
public class $ENTITY_PASCALConfiguration : IEntityTypeConfiguration<$ENTITY_PASCAL>
|
|
384
|
-
{
|
|
385
|
-
public void Configure(EntityTypeBuilder<$ENTITY_PASCAL> builder)
|
|
386
|
-
{
|
|
387
|
-
builder.ToTable("$ENTITY_PLURAL", "$SCHEMA");
|
|
388
|
-
|
|
389
|
-
builder.HasKey(x => x.Id);
|
|
390
|
-
|
|
391
|
-
builder.Property(x => x.Name)
|
|
392
|
-
.HasMaxLength(200)
|
|
393
|
-
.IsRequired();
|
|
394
|
-
|
|
395
|
-
builder.Property(x => x.Description)
|
|
396
|
-
.HasMaxLength(1000);
|
|
397
|
-
|
|
398
|
-
builder.HasIndex(x => x.Name)
|
|
399
|
-
.IsUnique();
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
```
|
|
403
|
-
|
|
404
|
-
---
|
|
405
|
-
|
|
406
|
-
## TEMPLATE: DBCONTEXT UPDATE
|
|
407
|
-
|
|
408
|
-
```csharp
|
|
409
|
-
// Ajouter dans IApplicationDbContext.cs
|
|
410
|
-
DbSet<$ENTITY_PASCAL> $ENTITY_PLURAL { get; }
|
|
411
|
-
|
|
412
|
-
// Ajouter dans ApplicationDbContext.cs
|
|
413
|
-
public DbSet<$ENTITY_PASCAL> $ENTITY_PLURAL => Set<$ENTITY_PASCAL>();
|
|
414
|
-
```
|
|
415
|
-
|
|
416
|
-
---
|
|
417
|
-
|
|
418
|
-
## TEMPLATE: DI REGISTRATION
|
|
419
|
-
|
|
420
|
-
```csharp
|
|
421
|
-
// Ajouter dans src/SmartStack.Infrastructure/DependencyInjection.cs
|
|
422
|
-
|
|
423
|
-
services.AddScoped<I$MODULE_PASCALService, $MODULE_PASCALService>();
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
---
|
|
427
|
-
|
|
428
|
-
## CHAINING WITH /controller
|
|
429
|
-
|
|
430
|
-
After backend templates generation, the skill automatically calls:
|
|
431
|
-
|
|
432
|
-
```
|
|
433
|
-
/controller
|
|
434
|
-
```
|
|
435
|
-
|
|
436
|
-
Example:
|
|
437
|
-
```
|
|
438
|
-
/controller
|
|
439
|
-
```
|
|
440
|
-
|
|
441
|
-
This generates:
|
|
442
|
-
- Full CRUD Controller
|
|
443
|
-
- REST Endpoints
|
|
444
|
-
- ProducesResponseType
|
|
445
|
-
- Appropriate logging
|
|
446
|
-
- Postman tests
|
|
447
|
-
|
|
448
|
-
---
|
|
449
|
-
|
|
450
|
-
## BACKEND CHECKLIST
|
|
451
|
-
|
|
452
|
-
| Check | Status |
|
|
453
|
-
|-------|--------|
|
|
454
|
-
| ☐ Permissions.cs updated | |
|
|
455
|
-
| ☐ Service interface created | |
|
|
456
|
-
| ☐ Service implementation created | |
|
|
457
|
-
| ☐ DTOs created | |
|
|
458
|
-
| ☐ Domain entity created | |
|
|
459
|
-
| ☐ EF Configuration created | |
|
|
460
|
-
| ☐ DbContext updated | |
|
|
461
|
-
| ☐ DI registration added | |
|
|
462
|
-
| ☐ /controller:create executed | |
|
|
463
|
-
| ☐ dotnet build successful | |
|
|
1
|
+
# Templates Backend - Application Skill
|
|
2
|
+
|
|
3
|
+
> These templates generate C# code for new applications/modules.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## TEMPLATE: PERMISSIONS CLASS
|
|
8
|
+
|
|
9
|
+
```csharp
|
|
10
|
+
// Add to src/SmartStack.Application/Common/Authorization/Permissions.cs
|
|
11
|
+
|
|
12
|
+
public static class $APPLICATION_PASCAL
|
|
13
|
+
{
|
|
14
|
+
public const string Access = "$application";
|
|
15
|
+
|
|
16
|
+
public static class $MODULE_PASCAL
|
|
17
|
+
{
|
|
18
|
+
public const string View = "$application.$module.read";
|
|
19
|
+
public const string Create = "$application.$module.create";
|
|
20
|
+
public const string Update = "$application.$module.update";
|
|
21
|
+
public const string Delete = "$application.$module.delete";
|
|
22
|
+
public const string Assign = "$application.$module.assign";
|
|
23
|
+
public const string Execute = "$application.$module.execute";
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
### Example for Sales > Products
|
|
29
|
+
|
|
30
|
+
```csharp
|
|
31
|
+
public static class Sales
|
|
32
|
+
{
|
|
33
|
+
public const string Access = "sales";
|
|
34
|
+
|
|
35
|
+
public static class Products
|
|
36
|
+
{
|
|
37
|
+
public const string View = "sales.products.read";
|
|
38
|
+
public const string Create = "sales.products.create";
|
|
39
|
+
public const string Update = "sales.products.update";
|
|
40
|
+
public const string Delete = "sales.products.delete";
|
|
41
|
+
public const string Assign = "sales.products.assign";
|
|
42
|
+
public const string Execute = "sales.products.execute";
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## TEMPLATE: SERVICE INTERFACE
|
|
50
|
+
|
|
51
|
+
```csharp
|
|
52
|
+
// src/SmartStack.Application/Common/Interfaces/I{Module}Service.cs
|
|
53
|
+
|
|
54
|
+
using SmartStack.Application.$APPLICATION_PASCAL.$MODULE_PASCAL.DTOs;
|
|
55
|
+
|
|
56
|
+
namespace SmartStack.Application.Common.Interfaces;
|
|
57
|
+
|
|
58
|
+
public interface I$MODULE_PASCALService
|
|
59
|
+
{
|
|
60
|
+
Task<PaginatedResult<$ENTITY_PASCALDto>> GetAllAsync(
|
|
61
|
+
$ENTITY_PASCALQueryParameters parameters,
|
|
62
|
+
CancellationToken cancellationToken = default);
|
|
63
|
+
|
|
64
|
+
Task<$ENTITY_PASCALDto?> GetByIdAsync(
|
|
65
|
+
Guid id,
|
|
66
|
+
CancellationToken cancellationToken = default);
|
|
67
|
+
|
|
68
|
+
Task<$ENTITY_PASCALDto> CreateAsync(
|
|
69
|
+
Create$ENTITY_PASCALRequest request,
|
|
70
|
+
CancellationToken cancellationToken = default);
|
|
71
|
+
|
|
72
|
+
Task<$ENTITY_PASCALDto> UpdateAsync(
|
|
73
|
+
Guid id,
|
|
74
|
+
Update$ENTITY_PASCALRequest request,
|
|
75
|
+
CancellationToken cancellationToken = default);
|
|
76
|
+
|
|
77
|
+
Task<bool> DeleteAsync(
|
|
78
|
+
Guid id,
|
|
79
|
+
CancellationToken cancellationToken = default);
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
---
|
|
84
|
+
|
|
85
|
+
## TEMPLATE: SERVICE IMPLEMENTATION
|
|
86
|
+
|
|
87
|
+
> **TENANT ISOLATION RULES (BLOCKING):**
|
|
88
|
+
> - ALL queries MUST include `.Where(x => x.TenantId == _currentUser.TenantId)`
|
|
89
|
+
> - ALL entity creation MUST pass `_currentUser.TenantId` as first parameter to `Entity.Create()`
|
|
90
|
+
> - NEVER use `new Entity { }` without `TenantId =` — always prefer the factory method
|
|
91
|
+
> - NEVER use `Guid.Empty` as a placeholder — resolve the actual value from `_currentUser`
|
|
92
|
+
|
|
93
|
+
```csharp
|
|
94
|
+
// src/SmartStack.Infrastructure/Services/$APPLICATION_PASCAL/$MODULE_PASCAL/$MODULE_PASCALService.cs
|
|
95
|
+
|
|
96
|
+
using Microsoft.EntityFrameworkCore;
|
|
97
|
+
using Microsoft.Extensions.Logging;
|
|
98
|
+
using SmartStack.Application.Common.Interfaces;
|
|
99
|
+
using SmartStack.Application.$APPLICATION_PASCAL.$MODULE_PASCAL.DTOs;
|
|
100
|
+
using SmartStack.Domain.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
101
|
+
|
|
102
|
+
namespace SmartStack.Infrastructure.Services.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
103
|
+
|
|
104
|
+
public class $MODULE_PASCALService : I$MODULE_PASCALService
|
|
105
|
+
{
|
|
106
|
+
private readonly IApplicationDbContext _context;
|
|
107
|
+
private readonly ICurrentUserService _currentUser;
|
|
108
|
+
private readonly ILogger<$MODULE_PASCALService> _logger;
|
|
109
|
+
|
|
110
|
+
public $MODULE_PASCALService(
|
|
111
|
+
IApplicationDbContext context,
|
|
112
|
+
ICurrentUserService currentUser,
|
|
113
|
+
ILogger<$MODULE_PASCALService> logger)
|
|
114
|
+
{
|
|
115
|
+
_context = context;
|
|
116
|
+
_currentUser = currentUser;
|
|
117
|
+
_logger = logger;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
public async Task<PaginatedResult<$ENTITY_PASCALDto>> GetAllAsync(
|
|
121
|
+
$ENTITY_PASCALQueryParameters parameters,
|
|
122
|
+
CancellationToken cancellationToken = default)
|
|
123
|
+
{
|
|
124
|
+
var query = _context.$ENTITY_PLURAL
|
|
125
|
+
.AsNoTracking()
|
|
126
|
+
.Where(x => x.TenantId == _currentUser.TenantId); // MANDATORY: tenant isolation
|
|
127
|
+
|
|
128
|
+
// Apply filters
|
|
129
|
+
if (!string.IsNullOrWhiteSpace(parameters.SearchTerm))
|
|
130
|
+
{
|
|
131
|
+
query = query.Where(x =>
|
|
132
|
+
x.Name.Contains(parameters.SearchTerm) ||
|
|
133
|
+
x.Description.Contains(parameters.SearchTerm));
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Apply sorting
|
|
137
|
+
query = parameters.SortColumn?.ToLower() switch
|
|
138
|
+
{
|
|
139
|
+
"name" => parameters.SortDirection == "desc"
|
|
140
|
+
? query.OrderByDescending(x => x.Name)
|
|
141
|
+
: query.OrderBy(x => x.Name),
|
|
142
|
+
"createdat" => parameters.SortDirection == "desc"
|
|
143
|
+
? query.OrderByDescending(x => x.CreatedAt)
|
|
144
|
+
: query.OrderBy(x => x.CreatedAt),
|
|
145
|
+
_ => query.OrderByDescending(x => x.CreatedAt)
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
var totalCount = await query.CountAsync(cancellationToken);
|
|
149
|
+
|
|
150
|
+
var items = await query
|
|
151
|
+
.Skip((parameters.Page - 1) * parameters.PageSize)
|
|
152
|
+
.Take(parameters.PageSize)
|
|
153
|
+
.Select(x => new $ENTITY_PASCALDto
|
|
154
|
+
{
|
|
155
|
+
Id = x.Id,
|
|
156
|
+
Name = x.Name,
|
|
157
|
+
Description = x.Description,
|
|
158
|
+
IsActive = x.IsActive,
|
|
159
|
+
CreatedAt = x.CreatedAt,
|
|
160
|
+
UpdatedAt = x.UpdatedAt
|
|
161
|
+
})
|
|
162
|
+
.ToListAsync(cancellationToken);
|
|
163
|
+
|
|
164
|
+
return new PaginatedResult<$ENTITY_PASCALDto>
|
|
165
|
+
{
|
|
166
|
+
Items = items,
|
|
167
|
+
TotalCount = totalCount,
|
|
168
|
+
Page = parameters.Page,
|
|
169
|
+
PageSize = parameters.PageSize
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
public async Task<$ENTITY_PASCALDto?> GetByIdAsync(
|
|
174
|
+
Guid id,
|
|
175
|
+
CancellationToken cancellationToken = default)
|
|
176
|
+
{
|
|
177
|
+
var entity = await _context.$ENTITY_PLURAL
|
|
178
|
+
.AsNoTracking()
|
|
179
|
+
.Where(x => x.TenantId == _currentUser.TenantId) // MANDATORY: tenant isolation
|
|
180
|
+
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
|
181
|
+
|
|
182
|
+
if (entity == null)
|
|
183
|
+
return null;
|
|
184
|
+
|
|
185
|
+
return new $ENTITY_PASCALDto
|
|
186
|
+
{
|
|
187
|
+
Id = entity.Id,
|
|
188
|
+
Name = entity.Name,
|
|
189
|
+
Description = entity.Description,
|
|
190
|
+
IsActive = entity.IsActive,
|
|
191
|
+
CreatedAt = entity.CreatedAt,
|
|
192
|
+
UpdatedAt = entity.UpdatedAt
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public async Task<$ENTITY_PASCALDto> CreateAsync(
|
|
197
|
+
Create$ENTITY_PASCALRequest request,
|
|
198
|
+
CancellationToken cancellationToken = default)
|
|
199
|
+
{
|
|
200
|
+
var entity = $ENTITY_PASCAL.Create(
|
|
201
|
+
_currentUser.TenantId, // MANDATORY: tenant isolation — always first parameter
|
|
202
|
+
request.Name,
|
|
203
|
+
request.Description);
|
|
204
|
+
|
|
205
|
+
_context.$ENTITY_PLURAL.Add(entity);
|
|
206
|
+
await _context.SaveChangesAsync(cancellationToken);
|
|
207
|
+
|
|
208
|
+
_logger.LogInformation(
|
|
209
|
+
"User {User} created $ENTITY_PASCAL {Id} ({Name})",
|
|
210
|
+
_currentUser.Email,
|
|
211
|
+
entity.Id,
|
|
212
|
+
entity.Name);
|
|
213
|
+
|
|
214
|
+
return new $ENTITY_PASCALDto
|
|
215
|
+
{
|
|
216
|
+
Id = entity.Id,
|
|
217
|
+
Name = entity.Name,
|
|
218
|
+
Description = entity.Description,
|
|
219
|
+
IsActive = entity.IsActive,
|
|
220
|
+
CreatedAt = entity.CreatedAt
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
public async Task<$ENTITY_PASCALDto> UpdateAsync(
|
|
225
|
+
Guid id,
|
|
226
|
+
Update$ENTITY_PASCALRequest request,
|
|
227
|
+
CancellationToken cancellationToken = default)
|
|
228
|
+
{
|
|
229
|
+
var entity = await _context.$ENTITY_PLURAL
|
|
230
|
+
.Where(x => x.TenantId == _currentUser.TenantId) // MANDATORY: tenant isolation
|
|
231
|
+
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken)
|
|
232
|
+
?? throw new NotFoundException("$ENTITY_PASCAL", id);
|
|
233
|
+
|
|
234
|
+
entity.Update(request.Name, request.Description);
|
|
235
|
+
|
|
236
|
+
await _context.SaveChangesAsync(cancellationToken);
|
|
237
|
+
|
|
238
|
+
_logger.LogInformation(
|
|
239
|
+
"User {User} updated $ENTITY_PASCAL {Id} ({Name})",
|
|
240
|
+
_currentUser.Email,
|
|
241
|
+
entity.Id,
|
|
242
|
+
entity.Name);
|
|
243
|
+
|
|
244
|
+
return new $ENTITY_PASCALDto
|
|
245
|
+
{
|
|
246
|
+
Id = entity.Id,
|
|
247
|
+
Name = entity.Name,
|
|
248
|
+
Description = entity.Description,
|
|
249
|
+
IsActive = entity.IsActive,
|
|
250
|
+
CreatedAt = entity.CreatedAt,
|
|
251
|
+
UpdatedAt = entity.UpdatedAt
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
public async Task<bool> DeleteAsync(
|
|
256
|
+
Guid id,
|
|
257
|
+
CancellationToken cancellationToken = default)
|
|
258
|
+
{
|
|
259
|
+
var entity = await _context.$ENTITY_PLURAL
|
|
260
|
+
.Where(x => x.TenantId == _currentUser.TenantId) // MANDATORY: tenant isolation
|
|
261
|
+
.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
|
|
262
|
+
|
|
263
|
+
if (entity == null)
|
|
264
|
+
return false;
|
|
265
|
+
|
|
266
|
+
_context.$ENTITY_PLURAL.Remove(entity);
|
|
267
|
+
await _context.SaveChangesAsync(cancellationToken);
|
|
268
|
+
|
|
269
|
+
_logger.LogWarning(
|
|
270
|
+
"User {User} deleted $ENTITY_PASCAL {Id} ({Name})",
|
|
271
|
+
_currentUser.Email,
|
|
272
|
+
id,
|
|
273
|
+
entity.Name);
|
|
274
|
+
|
|
275
|
+
return true;
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
---
|
|
281
|
+
|
|
282
|
+
## TEMPLATE: DTOs
|
|
283
|
+
|
|
284
|
+
```csharp
|
|
285
|
+
// src/SmartStack.Application/$APPLICATION_PASCAL/$MODULE_PASCAL/DTOs/$ENTITY_PASCALDto.cs
|
|
286
|
+
|
|
287
|
+
namespace SmartStack.Application.$APPLICATION_PASCAL.$MODULE_PASCAL.DTOs;
|
|
288
|
+
|
|
289
|
+
public record $ENTITY_PASCALDto
|
|
290
|
+
{
|
|
291
|
+
public Guid Id { get; init; }
|
|
292
|
+
public string Name { get; init; } = null!;
|
|
293
|
+
public string? Description { get; init; }
|
|
294
|
+
public bool IsActive { get; init; }
|
|
295
|
+
public DateTime CreatedAt { get; init; }
|
|
296
|
+
public DateTime? UpdatedAt { get; init; }
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
public record Create$ENTITY_PASCALRequest
|
|
300
|
+
{
|
|
301
|
+
public string Name { get; init; } = null!;
|
|
302
|
+
public string? Description { get; init; }
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
public record Update$ENTITY_PASCALRequest
|
|
306
|
+
{
|
|
307
|
+
public string Name { get; init; } = null!;
|
|
308
|
+
public string? Description { get; init; }
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
public record $ENTITY_PASCALQueryParameters
|
|
312
|
+
{
|
|
313
|
+
public int Page { get; init; } = 1;
|
|
314
|
+
public int PageSize { get; init; } = 10;
|
|
315
|
+
public string? SearchTerm { get; init; }
|
|
316
|
+
public string? SortColumn { get; init; } = "createdAt";
|
|
317
|
+
public string? SortDirection { get; init; } = "desc";
|
|
318
|
+
}
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
---
|
|
322
|
+
|
|
323
|
+
## TEMPLATE: DOMAIN ENTITY
|
|
324
|
+
|
|
325
|
+
```csharp
|
|
326
|
+
// src/SmartStack.Domain/$APPLICATION_PASCAL/$MODULE_PASCAL/$ENTITY_PASCAL.cs
|
|
327
|
+
|
|
328
|
+
using SmartStack.Domain.Common;
|
|
329
|
+
|
|
330
|
+
namespace SmartStack.Domain.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
331
|
+
|
|
332
|
+
public class $ENTITY_PASCAL : BaseEntity
|
|
333
|
+
{
|
|
334
|
+
public string Name { get; private set; } = null!;
|
|
335
|
+
public string? Description { get; private set; }
|
|
336
|
+
public bool IsActive { get; private set; }
|
|
337
|
+
|
|
338
|
+
private $ENTITY_PASCAL() { }
|
|
339
|
+
|
|
340
|
+
public static $ENTITY_PASCAL Create(string name, string? description = null)
|
|
341
|
+
{
|
|
342
|
+
if (string.IsNullOrWhiteSpace(name))
|
|
343
|
+
throw new Exceptions.DomainException("Name is required");
|
|
344
|
+
|
|
345
|
+
return new $ENTITY_PASCAL
|
|
346
|
+
{
|
|
347
|
+
Id = Guid.NewGuid(),
|
|
348
|
+
Name = name,
|
|
349
|
+
Description = description,
|
|
350
|
+
IsActive = true,
|
|
351
|
+
CreatedAt = DateTime.UtcNow
|
|
352
|
+
};
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
public void Update(string name, string? description)
|
|
356
|
+
{
|
|
357
|
+
if (string.IsNullOrWhiteSpace(name))
|
|
358
|
+
throw new Exceptions.DomainException("Name is required");
|
|
359
|
+
|
|
360
|
+
Name = name;
|
|
361
|
+
Description = description;
|
|
362
|
+
UpdatedAt = DateTime.UtcNow;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
public void Activate() => IsActive = true;
|
|
366
|
+
public void Deactivate() => IsActive = false;
|
|
367
|
+
}
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
---
|
|
371
|
+
|
|
372
|
+
## TEMPLATE: EF CONFIGURATION
|
|
373
|
+
|
|
374
|
+
```csharp
|
|
375
|
+
// src/SmartStack.Infrastructure/Persistence/Configurations/$APPLICATION_PASCAL/$MODULE_PASCAL/$ENTITY_PASCALConfiguration.cs
|
|
376
|
+
|
|
377
|
+
using Microsoft.EntityFrameworkCore;
|
|
378
|
+
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
379
|
+
using SmartStack.Domain.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
380
|
+
|
|
381
|
+
namespace SmartStack.Infrastructure.Persistence.Configurations.$APPLICATION_PASCAL.$MODULE_PASCAL;
|
|
382
|
+
|
|
383
|
+
public class $ENTITY_PASCALConfiguration : IEntityTypeConfiguration<$ENTITY_PASCAL>
|
|
384
|
+
{
|
|
385
|
+
public void Configure(EntityTypeBuilder<$ENTITY_PASCAL> builder)
|
|
386
|
+
{
|
|
387
|
+
builder.ToTable("$ENTITY_PLURAL", "$SCHEMA");
|
|
388
|
+
|
|
389
|
+
builder.HasKey(x => x.Id);
|
|
390
|
+
|
|
391
|
+
builder.Property(x => x.Name)
|
|
392
|
+
.HasMaxLength(200)
|
|
393
|
+
.IsRequired();
|
|
394
|
+
|
|
395
|
+
builder.Property(x => x.Description)
|
|
396
|
+
.HasMaxLength(1000);
|
|
397
|
+
|
|
398
|
+
builder.HasIndex(x => x.Name)
|
|
399
|
+
.IsUnique();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
---
|
|
405
|
+
|
|
406
|
+
## TEMPLATE: DBCONTEXT UPDATE
|
|
407
|
+
|
|
408
|
+
```csharp
|
|
409
|
+
// Ajouter dans IApplicationDbContext.cs
|
|
410
|
+
DbSet<$ENTITY_PASCAL> $ENTITY_PLURAL { get; }
|
|
411
|
+
|
|
412
|
+
// Ajouter dans ApplicationDbContext.cs
|
|
413
|
+
public DbSet<$ENTITY_PASCAL> $ENTITY_PLURAL => Set<$ENTITY_PASCAL>();
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
---
|
|
417
|
+
|
|
418
|
+
## TEMPLATE: DI REGISTRATION
|
|
419
|
+
|
|
420
|
+
```csharp
|
|
421
|
+
// Ajouter dans src/SmartStack.Infrastructure/DependencyInjection.cs
|
|
422
|
+
|
|
423
|
+
services.AddScoped<I$MODULE_PASCALService, $MODULE_PASCALService>();
|
|
424
|
+
```
|
|
425
|
+
|
|
426
|
+
---
|
|
427
|
+
|
|
428
|
+
## CHAINING WITH /controller create
|
|
429
|
+
|
|
430
|
+
After backend templates generation, the skill automatically calls:
|
|
431
|
+
|
|
432
|
+
```
|
|
433
|
+
/controller create $AREA $MODULE $ENTITY
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
Example:
|
|
437
|
+
```
|
|
438
|
+
/controller create Business Products Product
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
This generates:
|
|
442
|
+
- Full CRUD Controller
|
|
443
|
+
- REST Endpoints
|
|
444
|
+
- ProducesResponseType
|
|
445
|
+
- Appropriate logging
|
|
446
|
+
- Postman tests
|
|
447
|
+
|
|
448
|
+
---
|
|
449
|
+
|
|
450
|
+
## BACKEND CHECKLIST
|
|
451
|
+
|
|
452
|
+
| Check | Status |
|
|
453
|
+
|-------|--------|
|
|
454
|
+
| ☐ Permissions.cs updated | |
|
|
455
|
+
| ☐ Service interface created | |
|
|
456
|
+
| ☐ Service implementation created | |
|
|
457
|
+
| ☐ DTOs created | |
|
|
458
|
+
| ☐ Domain entity created | |
|
|
459
|
+
| ☐ EF Configuration created | |
|
|
460
|
+
| ☐ DbContext updated | |
|
|
461
|
+
| ☐ DI registration added | |
|
|
462
|
+
| ☐ /controller:create executed | |
|
|
463
|
+
| ☐ dotnet build successful | |
|