@atlashub/smartstack-cli 4.47.0 → 4.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/.documentation/testing-ba-e2e.md +76 -24
  2. package/package.json +1 -1
  3. package/templates/agents/gitflow/init.md +26 -0
  4. package/templates/skills/apex/references/parallel-execution.md +22 -4
  5. package/templates/skills/apex/steps/step-00-init.md +38 -0
  6. package/templates/skills/apex/steps/step-03a-layer0-domain.md +21 -0
  7. package/templates/skills/apex/steps/step-03b-layer1-seed.md +60 -0
  8. package/templates/skills/apex/steps/step-03c-layer2-backend.md +124 -13
  9. package/templates/skills/apex/steps/step-03d-layer3-frontend.md +32 -0
  10. package/templates/skills/application/references/backend-controller-hierarchy.md +14 -4
  11. package/templates/skills/business-analyse-design/steps/step-02-wireframes.md +14 -0
  12. package/templates/skills/business-analyse-develop/references/compact-loop.md +15 -1
  13. package/templates/skills/business-analyse-develop/references/module-transition.md +10 -0
  14. package/templates/skills/business-analyse-develop/references/quality-gates.md +91 -1
  15. package/templates/skills/business-analyse-develop/steps/step-00-init.md +57 -0
  16. package/templates/skills/business-analyse-develop/steps/step-01-task.md +151 -2
  17. package/templates/skills/business-analyse-develop/steps/step-02-execute.md +14 -1
  18. package/templates/skills/business-analyse-develop/steps/step-02-v4-verify.md +22 -2
  19. package/templates/skills/business-analyse-develop/steps/step-03-commit.md +1 -1
  20. package/templates/skills/business-analyse-develop/steps/step-04-check.md +4 -1
  21. package/templates/skills/business-analyse-handoff/references/acceptance-criteria.md +53 -1
  22. package/templates/skills/business-analyse-handoff/references/handoff-file-templates.md +42 -0
  23. package/templates/skills/business-analyse-handoff/references/handoff-mappings.md +15 -1
  24. package/templates/skills/business-analyse-handoff/references/prd-generation.md +100 -0
  25. package/templates/skills/business-analyse-handoff/steps/step-01-transform.md +27 -1
  26. package/templates/skills/business-analyse-handoff/steps/step-02-export.md +38 -8
  27. package/templates/skills/business-analyse-html/html/ba-interactive.html +64 -5
  28. package/templates/skills/business-analyse-html/html/src/scripts/02-navigation.js +13 -1
  29. package/templates/skills/business-analyse-html/html/src/scripts/05-render-specs.js +10 -1
  30. package/templates/skills/business-analyse-html/html/src/scripts/06-render-mockups.js +1 -1
  31. package/templates/skills/business-analyse-html/html/src/styles/03-navigation.css +2 -2
  32. package/templates/skills/business-analyse-html/html/src/styles/05-modules.css +38 -0
  33. package/templates/skills/business-analyse-html/steps/step-02-build-data.md +26 -5
  34. package/templates/skills/controller/references/mcp-scaffold-workflow.md +8 -4
  35. package/templates/skills/controller/steps/step-05-validate.md +2 -2
  36. package/templates/skills/controller/templates.md +4 -3
  37. package/templates/skills/feature-full/steps/step-01-implementation.md +18 -5
@@ -198,13 +198,34 @@ handoff: {
198
198
 
199
199
  ```javascript
200
200
  const mod = collected_data.modules[moduleCode];
201
- const screens = mod.screens?.screens || [];
202
201
 
203
- // Extract wireframes from screens that have mockup/wireframe data
202
+ // STEP 1: Collect wireframe sources from BOTH flat and nested structures
203
+ // Flat: mod.screens.screens[] with mockupFormat/mockup at top level
204
+ // Nested: mod.screens.sections[].resources[].wireframe (design step output)
205
+ let rawWireframes = [];
206
+
207
+ // Source A: flat screens[] array (original BA output or manually enriched)
208
+ const flatScreens = mod.screens?.screens || [];
209
+ rawWireframes.push(...flatScreens.filter(s => s.mockup || s.mockupFormat));
210
+
211
+ // Source B: nested sections[].resources[].wireframe (design step output)
212
+ const sections = mod.screens?.sections || [];
213
+ for (const section of sections) {
214
+ for (const resource of (section.resources || [])) {
215
+ if (resource.wireframe) {
216
+ // Unwrap nested wireframe and add section context
217
+ rawWireframes.push({
218
+ ...resource.wireframe,
219
+ section: resource.wireframe.section || section.sectionCode || "",
220
+ screen: resource.wireframe.screen || `${section.sectionCode}-${resource.code}` || ""
221
+ });
222
+ }
223
+ }
224
+ }
225
+
226
+ // STEP 2: Map to HTML format (RENAME: mockupFormat → format, mockup → content)
204
227
  wireframes: {
205
- [moduleCode]: screens
206
- .filter(s => s.wireframe || s.mockup || s.mockupFormat)
207
- .map(wf => ({
228
+ [moduleCode]: rawWireframes.map(wf => ({
208
229
  screen: wf.screen || wf.name || wf.title || wf.id || "",
209
230
  section: wf.section || "",
210
231
  format: wf.mockupFormat || "ascii", // RENAME: mockupFormat → format
@@ -220,14 +220,18 @@ console.log(`✅ All checks passed — controller ready for step-04`);
220
220
  If MCP doesn't generate [NavRoute] attribute:
221
221
 
222
222
  ```csharp
223
- // Manually add if missing:
223
+ // Manually add REPLACE [Route] with [NavRoute], do NOT keep both (causes 404s):
224
224
  [ApiController]
225
- [Route("api/[controller]")]
226
- [NavRoute("app.module.resource")] // <-- Add this line
225
+ [NavRoute("app.module.resource")]
226
+ [Microsoft.AspNetCore.Authorization.Authorize]
227
+ [Produces("application/json")]
228
+ [Tags("{EntityNamePlural}")]
227
229
  public class {EntityName}Controller : ControllerBase
228
230
  {
229
231
  // ...
230
232
  }
231
233
  ```
232
234
 
233
- But this indicates MCP failure and should not be needed in normal operation.
235
+ **CRITICAL:** Remove `[Route("api/...")]` if present combining `[Route]` and `[NavRoute]` causes 404 errors.
236
+
237
+ This indicates MCP failure and should not be needed in normal operation.
@@ -40,8 +40,8 @@ mcp__smartstack__validate_conventions:
40
40
 
41
41
  | Convention | Check | Status |
42
42
  |------------|-------|--------|
43
- | Route attribute | `[Route("api/{area}/[controller]")]` | ✅/❌ |
44
- | Authorize attribute | `[Authorize]` present | ✅/❌ |
43
+ | NavRoute attribute | `[NavRoute("{app}.{module}")]` present (NOT `[Route]`) | ✅/❌ |
44
+ | Authorize attribute | `[Microsoft.AspNetCore.Authorization.Authorize]` (fully qualified) | ✅/❌ |
45
45
  | RequirePermission | Uses `Permissions.*` constants | ✅/❌ |
46
46
  | ProducesResponseType | All endpoints documented | ✅/❌ |
47
47
  | Logging | All CRUD operations logged | ✅/❌ |
@@ -30,12 +30,13 @@ using SmartStack.Domain.{DomainNamespace};
30
30
  namespace SmartStack.Api.Controllers.{Area};
31
31
 
32
32
  [ApiController]
33
- [Route("api/{area-kebab}/{module-kebab}")]
34
- [Authorize]
33
+ [NavRoute("{area}.{module}")]
34
+ [Microsoft.AspNetCore.Authorization.Authorize]
35
+ [Produces("application/json")]
35
36
  [Tags("{Module}")]
36
37
  public class {Module}Controller : ControllerBase
37
38
  {
38
- private readonly IApplicationDbContext _context;
39
+ private readonly ISender _mediator; // MediatR — NOT IApplicationDbContext
39
40
  private readonly ICurrentUserService _currentUser;
40
41
  private readonly ILogger<{Module}Controller> _logger;
41
42
 
@@ -58,15 +58,28 @@ services.AddScoped<I{Entity}Service, {Entity}Service>();
58
58
  ## Phase 5: API
59
59
 
60
60
  ```csharp
61
- [ApiController][Route("api/{area}/{module}")][Authorize]
61
+ [ApiController]
62
+ [NavRoute("{area}.{module}")]
63
+ [Microsoft.AspNetCore.Authorization.Authorize]
64
+ [Produces("application/json")]
65
+ [Tags("{EntityPlural}")]
62
66
  public class {Entity}Controller : ControllerBase
63
67
  {
64
- [HttpGet][RequirePermission(Permissions.{Area}.{Module}.View)]
65
- [ProducesResponseType(typeof(PaginatedResult<{Entity}Dto>), 200)]
68
+ private readonly ISender _mediator;
69
+
70
+ [HttpGet]
71
+ [RequirePermission(Permissions.{Area}.{Module}.View)]
72
+ [ProducesResponseType(typeof(PaginatedResult<{Entity}Dto>), StatusCodes.Status200OK)]
73
+ [ProducesResponseType(StatusCodes.Status401Unauthorized)]
74
+ [ProducesResponseType(StatusCodes.Status403Forbidden)]
66
75
  public async Task<ActionResult<PaginatedResult<{Entity}Dto>>> GetAll(...);
67
76
 
68
- [HttpPost][RequirePermission(Permissions.{Area}.{Module}.Create)]
69
- [ProducesResponseType(typeof({Entity}Dto), 201)]
77
+ [HttpPost]
78
+ [RequirePermission(Permissions.{Area}.{Module}.Create)]
79
+ [ProducesResponseType(typeof({Entity}Dto), StatusCodes.Status201Created)]
80
+ [ProducesResponseType(StatusCodes.Status400BadRequest)]
81
+ [ProducesResponseType(StatusCodes.Status401Unauthorized)]
82
+ [ProducesResponseType(StatusCodes.Status403Forbidden)]
70
83
  public async Task<ActionResult<{Entity}Dto>> Create([FromBody] request, CancellationToken ct);
71
84
  }
72
85
  ```