@atlashub/smartstack-cli 3.5.0 → 3.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -0
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/skills/business-analyse/SKILL.md +24 -19
- package/templates/skills/business-analyse/_architecture.md +1 -1
- package/templates/skills/business-analyse/_elicitation.md +1 -1
- package/templates/skills/business-analyse/_module-loop.md +4 -4
- package/templates/skills/business-analyse/html/ba-interactive.html +39 -10
- package/templates/skills/business-analyse/questionnaire/06-security.md +1 -1
- package/templates/skills/business-analyse/questionnaire.md +2 -2
- package/templates/skills/business-analyse/references/html-data-mapping.md +3 -2
- package/templates/skills/business-analyse/schemas/feature-schema.json +1 -1
- package/templates/skills/business-analyse/schemas/sections/analysis-schema.json +1 -1
- package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +1 -0
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +1 -1
- package/templates/skills/business-analyse/steps/step-00-init.md +37 -1
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +166 -6
- package/templates/skills/business-analyse/steps/step-02-decomposition.md +4 -4
- package/templates/skills/business-analyse/steps/{step-03a-specify.md → step-03a-data.md} +10 -359
- package/templates/skills/business-analyse/steps/step-03b-ui.md +414 -0
- package/templates/skills/business-analyse/steps/step-03c-compile.md +343 -0
- package/templates/skills/business-analyse/steps/{step-03b-compile.md → step-03d-validate.md} +26 -308
- package/templates/skills/business-analyse/steps/step-04-consolidation.md +23 -2
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +66 -46
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +262 -212
- package/templates/skills/business-analyse/templates/tpl-frd.md +1 -1
- package/templates/skills/business-analyse/templates/tpl-launch-displays.md +1 -1
- package/templates/skills/controller/steps/step-03-generate.md +2 -1
- package/templates/skills/ralph-loop/SKILL.md +20 -5
- package/templates/skills/ralph-loop/references/core-seed-data.md +538 -0
- package/templates/skills/ralph-loop/steps/step-00-init.md +79 -1
- package/templates/skills/ralph-loop/steps/step-01-task.md +25 -2
- package/templates/skills/ralph-loop/steps/step-02-execute.md +39 -15
- package/templates/skills/ralph-loop/steps/step-04-check.md +87 -4
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: step-05a-handoff
|
|
3
|
-
description: Build handoff data
|
|
3
|
+
description: Build development handoff data, map business rules to code, write handoff to feature.json
|
|
4
4
|
model: sonnet
|
|
5
5
|
next_step: steps/step-05b-deploy.md
|
|
6
6
|
---
|
|
@@ -21,7 +21,7 @@ next_step: steps/step-05b-deploy.md
|
|
|
21
21
|
|
|
22
22
|
## YOUR TASK
|
|
23
23
|
|
|
24
|
-
Build the development handoff data
|
|
24
|
+
Build the development handoff data: verify consolidation, choose implementation strategy, calculate complexity, map specification to files (7 categories), map business rules to code, generate API endpoint summary, and write handoff to EACH module feature.json.
|
|
25
25
|
|
|
26
26
|
---
|
|
27
27
|
|
|
@@ -122,6 +122,26 @@ Example:
|
|
|
122
122
|
|
|
123
123
|
For **EACH module** in topological order:
|
|
124
124
|
|
|
125
|
+
> **PATH HIERARCHY CONVENTION:** All backend file paths MUST include the context and application hierarchy.
|
|
126
|
+
> Derive from module feature.json metadata:
|
|
127
|
+
> - `{ContextPascal}` = PascalCase of `metadata.context` (e.g., `"business"` → `"Business"`)
|
|
128
|
+
> - `{ApplicationName}` = `metadata.application` (e.g., `"HumanResources"`)
|
|
129
|
+
> - `{ModuleName}` = `metadata.module` (e.g., `"Projects"`)
|
|
130
|
+
>
|
|
131
|
+
> **Controller context-to-folder mapping (`{ContextShort}`):**
|
|
132
|
+
> | metadata.context | Controller Folder |
|
|
133
|
+
> |-----------------|-------------------|
|
|
134
|
+
> | `business` | `Business` |
|
|
135
|
+
> | `platform` | `Admin` |
|
|
136
|
+
> | `personal` | `User` |
|
|
137
|
+
>
|
|
138
|
+
> **Example** for context=business, application=HumanResources, module=Projects:
|
|
139
|
+
> - Domain: `src/Domain/Entities/Business/HumanResources/Projects/Project.cs`
|
|
140
|
+
> - Application: `src/Application/Services/Business/HumanResources/Projects/ProjectService.cs`
|
|
141
|
+
> - Infrastructure: `src/Infrastructure/Persistence/Configurations/Business/HumanResources/Projects/ProjectConfiguration.cs`
|
|
142
|
+
> - API: `src/API/Controllers/Business/HumanResources/ProjectsController.cs`
|
|
143
|
+
> - Tests: `src/Tests/Unit/Domain/Business/HumanResources/Projects/ProjectTests.cs`
|
|
144
|
+
|
|
125
145
|
#### 4.1 Domain Files
|
|
126
146
|
|
|
127
147
|
From `analysis.entities[]` of the module:
|
|
@@ -129,7 +149,7 @@ From `analysis.entities[]` of the module:
|
|
|
129
149
|
```json
|
|
130
150
|
"domain": [
|
|
131
151
|
{
|
|
132
|
-
"path": "src/Domain/Entities/{ModuleName}/{EntityName}.cs",
|
|
152
|
+
"path": "src/Domain/Entities/{ContextPascal}/{ApplicationName}/{ModuleName}/{EntityName}.cs",
|
|
133
153
|
"type": "Entity",
|
|
134
154
|
"linkedFRs": ["FR-001", "FR-002"],
|
|
135
155
|
"linkedUCs": ["UC-001"],
|
|
@@ -139,9 +159,9 @@ From `analysis.entities[]` of the module:
|
|
|
139
159
|
```
|
|
140
160
|
|
|
141
161
|
Include:
|
|
142
|
-
- Value objects referenced by entities
|
|
143
|
-
- Enums used in domain
|
|
144
|
-
- Domain exceptions specific to module
|
|
162
|
+
- Value objects referenced by entities (`src/Domain/Entities/{ContextPascal}/{ApplicationName}/{ModuleName}/{ValueObject}.cs`)
|
|
163
|
+
- Enums used in domain (`src/Domain/Enums/{ContextPascal}/{ApplicationName}/{ModuleName}/{EnumName}.cs`)
|
|
164
|
+
- Domain exceptions specific to module (`src/Domain/Exceptions/{ContextPascal}/{ApplicationName}/{ModuleName}/{ExceptionName}.cs`)
|
|
145
165
|
|
|
146
166
|
#### 4.2 Application Files
|
|
147
167
|
|
|
@@ -150,20 +170,20 @@ From `analysis.useCases[]` of the module:
|
|
|
150
170
|
```json
|
|
151
171
|
"application": [
|
|
152
172
|
{
|
|
153
|
-
"path": "src/Application/Services/{ModuleName}/{ServiceName}Service.cs",
|
|
173
|
+
"path": "src/Application/Services/{ContextPascal}/{ApplicationName}/{ModuleName}/{ServiceName}Service.cs",
|
|
154
174
|
"type": "Service",
|
|
155
175
|
"linkedFRs": ["FR-001"],
|
|
156
176
|
"linkedUCs": ["UC-001", "UC-002"],
|
|
157
177
|
"module": "{moduleCode}"
|
|
158
178
|
},
|
|
159
179
|
{
|
|
160
|
-
"path": "src/Application/DTOs/{ModuleName}/{DtoName}Dto.cs",
|
|
180
|
+
"path": "src/Application/DTOs/{ContextPascal}/{ApplicationName}/{ModuleName}/{DtoName}Dto.cs",
|
|
161
181
|
"type": "Dto",
|
|
162
182
|
"linkedUCs": ["UC-001"],
|
|
163
183
|
"module": "{moduleCode}"
|
|
164
184
|
},
|
|
165
185
|
{
|
|
166
|
-
"path": "src/Application/Validators/{ModuleName}/{ValidatorName}Validator.cs",
|
|
186
|
+
"path": "src/Application/Validators/{ContextPascal}/{ApplicationName}/{ModuleName}/{ValidatorName}Validator.cs",
|
|
167
187
|
"type": "Validator",
|
|
168
188
|
"linkedFRs": ["FR-001"],
|
|
169
189
|
"module": "{moduleCode}"
|
|
@@ -184,24 +204,18 @@ From `analysis.entities[]` of the module:
|
|
|
184
204
|
```json
|
|
185
205
|
"infrastructure": [
|
|
186
206
|
{
|
|
187
|
-
"path": "src/Infrastructure/
|
|
188
|
-
"type": "
|
|
207
|
+
"path": "src/Infrastructure/Persistence/Configurations/{ContextPascal}/{ApplicationName}/{ModuleName}/{EntityName}Configuration.cs",
|
|
208
|
+
"type": "EFConfiguration",
|
|
189
209
|
"linkedFRs": ["FR-001"],
|
|
190
210
|
"module": "{moduleCode}"
|
|
191
|
-
},
|
|
192
|
-
{
|
|
193
|
-
"path": "src/Infrastructure/Persistence/{ModuleName}DbContext.cs",
|
|
194
|
-
"type": "DbContext",
|
|
195
|
-
"linkedFRs": ["FR-001", "FR-002"],
|
|
196
|
-
"module": "{moduleCode}"
|
|
197
211
|
}
|
|
198
212
|
]
|
|
199
213
|
```
|
|
200
214
|
|
|
201
215
|
Include:
|
|
202
|
-
-
|
|
203
|
-
-
|
|
204
|
-
-
|
|
216
|
+
- EF Core configuration per entity (`Persistence/Configurations/{ContextPascal}/{ApplicationName}/{ModuleName}/`)
|
|
217
|
+
- DbSet registration in `IExtensionsDbContext` / `ExtensionsDbContext`
|
|
218
|
+
- DI registration in `DependencyInjection.cs`
|
|
205
219
|
- Specifications if complex queries
|
|
206
220
|
|
|
207
221
|
#### 4.4 API Files
|
|
@@ -211,7 +225,7 @@ From `specification.apiEndpoints[]` of the module:
|
|
|
211
225
|
```json
|
|
212
226
|
"api": [
|
|
213
227
|
{
|
|
214
|
-
"path": "src/API/Controllers/{
|
|
228
|
+
"path": "src/API/Controllers/{ContextShort}/{ApplicationName}/{EntityName}Controller.cs",
|
|
215
229
|
"type": "ApiController",
|
|
216
230
|
"linkedUCs": ["UC-001", "UC-002"],
|
|
217
231
|
"linkedFRs": ["FR-001"],
|
|
@@ -220,6 +234,8 @@ From `specification.apiEndpoints[]` of the module:
|
|
|
220
234
|
]
|
|
221
235
|
```
|
|
222
236
|
|
|
237
|
+
> **Context-to-folder mapping (`{ContextShort}`):** `business` → `Business`, `platform` → `Admin`, `personal` → `User`
|
|
238
|
+
|
|
223
239
|
Include:
|
|
224
240
|
- One controller per domain aggregate root (or logical grouping)
|
|
225
241
|
- Include all HTTP methods (GET, POST, PUT, DELETE, PATCH)
|
|
@@ -415,26 +431,26 @@ Business categories (from specification.seedDataBusiness):
|
|
|
415
431
|
```json
|
|
416
432
|
"tests": [
|
|
417
433
|
{
|
|
418
|
-
"path": "src/Tests/Unit/Domain/{ModuleName}/{Entity}Tests.cs",
|
|
434
|
+
"path": "src/Tests/Unit/Domain/{ContextPascal}/{ApplicationName}/{ModuleName}/{Entity}Tests.cs",
|
|
419
435
|
"type": "UnitTests",
|
|
420
436
|
"linkedFRs": ["FR-001"],
|
|
421
437
|
"module": "{moduleCode}"
|
|
422
438
|
},
|
|
423
439
|
{
|
|
424
|
-
"path": "src/Tests/Unit/Application/{ModuleName}/{ServiceName}ServiceTests.cs",
|
|
440
|
+
"path": "src/Tests/Unit/Application/{ContextPascal}/{ApplicationName}/{ModuleName}/{ServiceName}ServiceTests.cs",
|
|
425
441
|
"type": "UnitTests",
|
|
426
442
|
"linkedFRs": ["FR-001"],
|
|
427
443
|
"linkedUCs": ["UC-001"],
|
|
428
444
|
"module": "{moduleCode}"
|
|
429
445
|
},
|
|
430
446
|
{
|
|
431
|
-
"path": "src/Tests/Integration/{ModuleName}/{ApiControllerName}ControllerTests.cs",
|
|
447
|
+
"path": "src/Tests/Integration/{ContextPascal}/{ApplicationName}/{ModuleName}/{ApiControllerName}ControllerTests.cs",
|
|
432
448
|
"type": "IntegrationTests",
|
|
433
449
|
"linkedUCs": ["UC-001"],
|
|
434
450
|
"module": "{moduleCode}"
|
|
435
451
|
},
|
|
436
452
|
{
|
|
437
|
-
"path": "src/Tests/Security/{ModuleName}/{ModuleName}SecurityTests.cs",
|
|
453
|
+
"path": "src/Tests/Security/{ContextPascal}/{ApplicationName}/{ModuleName}/{ModuleName}SecurityTests.cs",
|
|
438
454
|
"type": "SecurityTests",
|
|
439
455
|
"linkedFRs": ["FR-001"],
|
|
440
456
|
"module": "{moduleCode}"
|
|
@@ -595,17 +611,18 @@ Total endpoints = count of specification.apiEndpoints[] across all modules.
|
|
|
595
611
|
#### 7a. Module Handoff Loop (MANDATORY)
|
|
596
612
|
|
|
597
613
|
> **STRUCTURE CARD: handoff** — Field names are EXACT. Include ALL fields below.
|
|
614
|
+
> **PATH RULE:** All backend paths MUST include `{ContextPascal}/{ApplicationName}/` hierarchy (see section 4).
|
|
598
615
|
> ```json
|
|
599
616
|
> {
|
|
600
617
|
> "complexity": "simple|medium|complex",
|
|
601
618
|
> "filesToCreate": {
|
|
602
|
-
> "domain": [{"path": "
|
|
603
|
-
> "application": [{"path": "
|
|
604
|
-
> "infrastructure": [{"path": "
|
|
605
|
-
> "api": [{"path": "
|
|
606
|
-
> "frontend": [{"path": "
|
|
607
|
-
> "seedData": [{"path": "
|
|
608
|
-
> "tests": [{"path": "
|
|
619
|
+
> "domain": [{"path": "src/Domain/Entities/{Ctx}/{App}/{Mod}/{Entity}.cs", "type": "Entity|ValueObject|Enum", "linkedFRs": [], "linkedUCs": [], "module": "..."}],
|
|
620
|
+
> "application": [{"path": "src/Application/Services/{Ctx}/{App}/{Mod}/{Svc}Service.cs", "type": "Service|Dto|Validator", "linkedFRs": [], "linkedUCs": [], "module": "..."}],
|
|
621
|
+
> "infrastructure": [{"path": "src/Infrastructure/Persistence/Configurations/{Ctx}/{App}/{Mod}/{Entity}Configuration.cs", "type": "EFConfiguration", "linkedFRs": [], "module": "..."}],
|
|
622
|
+
> "api": [{"path": "src/API/Controllers/{CtxShort}/{App}/{Entity}Controller.cs", "type": "ApiController", "linkedUCs": [], "linkedFRs": [], "module": "..."}],
|
|
623
|
+
> "frontend": [{"path": "src/pages/{Mod}/{Page}Page.tsx", "type": "Page|Component|Hook|DashboardPage", "linkedUCs": [], "linkedWireframes": [], "module": "..."}],
|
|
624
|
+
> "seedData": [{"path": "src/Infrastructure/Persistence/Seeding/Data/{Mod}/...SeedData.cs", "type": "SeedData", "category": "core|business", "source": "...", "module": "..."}],
|
|
625
|
+
> "tests": [{"path": "src/Tests/Unit/Domain/{Ctx}/{App}/{Mod}/{Entity}Tests.cs", "type": "UnitTests|IntegrationTests|SecurityTests", "linkedFRs": [], "linkedUCs": [], "module": "..."}]
|
|
609
626
|
> },
|
|
610
627
|
> "brToCodeMapping": [{"ruleId": "BR-...", "files": ["path1", "path2"], "implementation": "description"}],
|
|
611
628
|
> "apiEndpointSummary": [{"method": "GET|POST|PUT|DELETE", "path": "/api/...", "permission": "business.{app}.{module}.{action}", "linkedUC": "UC-..."}],
|
|
@@ -625,10 +642,10 @@ Total endpoints = count of specification.apiEndpoints[] across all modules.
|
|
|
625
642
|
2. moduleFeatureId = modules[i].featureJsonPath or find via ba-reader.findFeature()
|
|
626
643
|
3. Read the module feature.json via ba-reader.findFeature(moduleFeatureId)
|
|
627
644
|
4. Build the handoff payload for THIS module:
|
|
628
|
-
- complexity (from
|
|
629
|
-
- filesToCreate (full 7-category structure from
|
|
630
|
-
- brToCodeMapping (from
|
|
631
|
-
- apiEndpointSummary (from
|
|
645
|
+
- complexity (from section 3 calculation)
|
|
646
|
+
- filesToCreate (full 7-category structure from section 4, filtered for this module)
|
|
647
|
+
- brToCodeMapping (from section 5, filtered for this module)
|
|
648
|
+
- apiEndpointSummary (from section 6, filtered for this module)
|
|
632
649
|
- prdFile path
|
|
633
650
|
- totalFiles count
|
|
634
651
|
- totalTasks count
|
|
@@ -696,29 +713,32 @@ FOR each module in modules[]:
|
|
|
696
713
|
IF count < modules.length:
|
|
697
714
|
→ BLOCKING ERROR: {modules.length - count} modules missing handoff
|
|
698
715
|
→ List the missing modules by name
|
|
699
|
-
→ DO NOT proceed to step
|
|
700
|
-
→ Return to
|
|
716
|
+
→ DO NOT proceed to step-05b
|
|
717
|
+
→ Return to 7a for missing modules only
|
|
701
718
|
|
|
702
719
|
IF count === modules.length:
|
|
703
720
|
ba-writer.updateStatus({feature_id}, "handed-off")
|
|
704
721
|
Display: "✓ Handoff complet: {count}/{modules.length} modules avec handoff valide"
|
|
705
722
|
```
|
|
706
723
|
|
|
707
|
-
Status journey: analyze → consolidate →
|
|
724
|
+
Status journey: analyze → consolidate → handed-off
|
|
708
725
|
|
|
709
726
|
---
|
|
710
727
|
|
|
711
|
-
## SELF-VERIFICATION
|
|
728
|
+
## SELF-VERIFICATION
|
|
712
729
|
|
|
713
730
|
Before proceeding to step-05b-deploy.md, VERIFY:
|
|
714
731
|
|
|
715
|
-
1. **
|
|
716
|
-
2. **
|
|
717
|
-
3. **
|
|
718
|
-
4. **
|
|
719
|
-
5. **
|
|
732
|
+
1. **filesToCreate** has all 7 categories populated (domain, application, infrastructure, api, frontend, seedData, tests) for each module
|
|
733
|
+
2. **Complexity** calculated for all modules
|
|
734
|
+
3. **Implementation strategy** chosen (for multi-module features)
|
|
735
|
+
4. **ALL module feature.json** have `handoff.brToCodeMapping.length > 0`
|
|
736
|
+
5. **ALL module feature.json** have `handoff.apiEndpointSummary.length > 0`
|
|
737
|
+
6. **ALL module feature.json** status = "handed-off"
|
|
738
|
+
7. **Master feature.json** has `handoff` section with implementationStrategy, moduleOrder, totalFilesToCreate
|
|
739
|
+
8. **Master status** = "handed-off"
|
|
720
740
|
|
|
721
|
-
**IF any check fails → FIX before proceeding.**
|
|
741
|
+
**IF any check fails → FIX before proceeding.**
|
|
722
742
|
|
|
723
743
|
---
|
|
724
744
|
|