@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.
- package/.documentation/testing-ba-e2e.md +76 -24
- package/package.json +1 -1
- package/templates/agents/gitflow/init.md +26 -0
- package/templates/skills/apex/references/parallel-execution.md +22 -4
- package/templates/skills/apex/steps/step-00-init.md +38 -0
- package/templates/skills/apex/steps/step-03a-layer0-domain.md +21 -0
- package/templates/skills/apex/steps/step-03b-layer1-seed.md +60 -0
- package/templates/skills/apex/steps/step-03c-layer2-backend.md +124 -13
- package/templates/skills/apex/steps/step-03d-layer3-frontend.md +32 -0
- package/templates/skills/application/references/backend-controller-hierarchy.md +14 -4
- package/templates/skills/business-analyse-design/steps/step-02-wireframes.md +14 -0
- package/templates/skills/business-analyse-develop/references/compact-loop.md +15 -1
- package/templates/skills/business-analyse-develop/references/module-transition.md +10 -0
- package/templates/skills/business-analyse-develop/references/quality-gates.md +91 -1
- package/templates/skills/business-analyse-develop/steps/step-00-init.md +57 -0
- package/templates/skills/business-analyse-develop/steps/step-01-task.md +151 -2
- package/templates/skills/business-analyse-develop/steps/step-02-execute.md +14 -1
- package/templates/skills/business-analyse-develop/steps/step-02-v4-verify.md +22 -2
- package/templates/skills/business-analyse-develop/steps/step-03-commit.md +1 -1
- package/templates/skills/business-analyse-develop/steps/step-04-check.md +4 -1
- package/templates/skills/business-analyse-handoff/references/acceptance-criteria.md +53 -1
- package/templates/skills/business-analyse-handoff/references/handoff-file-templates.md +42 -0
- package/templates/skills/business-analyse-handoff/references/handoff-mappings.md +15 -1
- package/templates/skills/business-analyse-handoff/references/prd-generation.md +100 -0
- package/templates/skills/business-analyse-handoff/steps/step-01-transform.md +27 -1
- package/templates/skills/business-analyse-handoff/steps/step-02-export.md +38 -8
- package/templates/skills/business-analyse-html/html/ba-interactive.html +64 -5
- package/templates/skills/business-analyse-html/html/src/scripts/02-navigation.js +13 -1
- package/templates/skills/business-analyse-html/html/src/scripts/05-render-specs.js +10 -1
- package/templates/skills/business-analyse-html/html/src/scripts/06-render-mockups.js +1 -1
- package/templates/skills/business-analyse-html/html/src/styles/03-navigation.css +2 -2
- package/templates/skills/business-analyse-html/html/src/styles/05-modules.css +38 -0
- package/templates/skills/business-analyse-html/steps/step-02-build-data.md +26 -5
- package/templates/skills/controller/references/mcp-scaffold-workflow.md +8 -4
- package/templates/skills/controller/steps/step-05-validate.md +2 -2
- package/templates/skills/controller/templates.md +4 -3
- 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
|
-
//
|
|
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]:
|
|
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
|
|
223
|
+
// Manually add — REPLACE [Route] with [NavRoute], do NOT keep both (causes 404s):
|
|
224
224
|
[ApiController]
|
|
225
|
-
[
|
|
226
|
-
[
|
|
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
|
-
|
|
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
|
-
|
|
|
44
|
-
| Authorize attribute | `[Authorize]`
|
|
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
|
-
[
|
|
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
|
|
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]
|
|
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
|
-
|
|
65
|
-
|
|
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]
|
|
69
|
-
[
|
|
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
|
```
|