@atlashub/smartstack-cli 3.53.0 → 4.0.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 +1748 -780
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +1353 -158
- package/dist/mcp-entry.mjs.map +1 -1
- package/package.json +115 -115
- package/templates/skills/apex/SKILL.md +11 -9
- package/templates/skills/apex/references/agent-teams-protocol.md +32 -16
- package/templates/skills/apex/references/core-seed-data.md +27 -1
- package/templates/skills/apex/references/smartstack-api.md +40 -0
- package/templates/skills/apex/references/smartstack-layers.md +125 -118
- package/templates/skills/apex/steps/step-02-plan.md +33 -18
- package/templates/skills/apex/steps/step-03-execute.md +297 -120
- package/templates/skills/apex/steps/step-04-examine.md +15 -6
- package/templates/skills/apex/steps/step-07-tests.md +60 -40
- package/templates/skills/apex/steps/step-08-run-tests.md +5 -3
- package/templates/skills/application/references/backend-table-prefix-mapping.md +1 -0
- package/templates/skills/business-analyse/patterns/suggestion-catalog.md +2 -0
package/package.json
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@atlashub/smartstack-cli",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "SmartStack Claude Code automation toolkit - GitFlow, EF Core migrations, prompts and more",
|
|
5
|
-
"author": {
|
|
6
|
-
"name": "SmartStack",
|
|
7
|
-
"email": "contact@smartstack.app",
|
|
8
|
-
"url": "https://smartstack.app"
|
|
9
|
-
},
|
|
10
|
-
"license": "MIT",
|
|
11
|
-
"private": false,
|
|
12
|
-
"type": "commonjs",
|
|
13
|
-
"main": "./dist/index.js",
|
|
14
|
-
"types": "./dist/index.d.ts",
|
|
15
|
-
"bin": {
|
|
16
|
-
"smartstack": "./dist/index.js",
|
|
17
|
-
"ss": "./dist/index.js",
|
|
18
|
-
"smartstack-mcp": "./dist/mcp-entry.mjs"
|
|
19
|
-
},
|
|
20
|
-
"files": [
|
|
21
|
-
"dist",
|
|
22
|
-
"templates",
|
|
23
|
-
"config",
|
|
24
|
-
"scripts",
|
|
25
|
-
".documentation"
|
|
26
|
-
],
|
|
27
|
-
"engines": {
|
|
28
|
-
"node": ">=18.0.0"
|
|
29
|
-
},
|
|
30
|
-
"publishConfig": {
|
|
31
|
-
"registry": "https://registry.npmjs.org",
|
|
32
|
-
"access": "public"
|
|
33
|
-
},
|
|
34
|
-
"repository": {
|
|
35
|
-
"type": "git",
|
|
36
|
-
"url": "git+https://dev.azure.com/AtlasHub/SmartStack/_git/SmartStack.cli"
|
|
37
|
-
},
|
|
38
|
-
"homepage": "https://smartstack.app",
|
|
39
|
-
"keywords": [
|
|
40
|
-
"smartstack",
|
|
41
|
-
"claude",
|
|
42
|
-
"claude-code",
|
|
43
|
-
"gitflow",
|
|
44
|
-
"efcore",
|
|
45
|
-
"entity-framework",
|
|
46
|
-
"migrations",
|
|
47
|
-
"cli",
|
|
48
|
-
"automation",
|
|
49
|
-
"anthropic",
|
|
50
|
-
"dotnet",
|
|
51
|
-
"prompts",
|
|
52
|
-
"ai-tools"
|
|
53
|
-
],
|
|
54
|
-
"scripts": {
|
|
55
|
-
"postinstall": "node scripts/postinstall.js || exit 0",
|
|
56
|
-
"dev": "tsup --watch",
|
|
57
|
-
"build:html": "node templates/skills/business-analyse/html/build-html.js",
|
|
58
|
-
"build": "npm run build:html && npx tsup",
|
|
59
|
-
"lint": "eslint src --ext .ts",
|
|
60
|
-
"format": "prettier --write \"src/**/*.ts\"",
|
|
61
|
-
"prepublishOnly": "npm run build",
|
|
62
|
-
"test": "node --test",
|
|
63
|
-
"link": "npm run build && npm link",
|
|
64
|
-
"install:local": "npm run build && node dist/index.js install --local --force",
|
|
65
|
-
"install:global": "npm run build && node dist/index.js install --force",
|
|
66
|
-
"status:local": "node dist/index.js status --local --verbose",
|
|
67
|
-
"status:global": "node dist/index.js status --verbose",
|
|
68
|
-
"doctor": "node dist/index.js doctor",
|
|
69
|
-
"check-mcp": "node dist/index.js check-mcp",
|
|
70
|
-
"ralph:start": "node dist/index.js ralph start",
|
|
71
|
-
"ralph:status": "node dist/index.js ralph status",
|
|
72
|
-
"ralph:logs": "node dist/index.js ralph logs",
|
|
73
|
-
"health": "node dist/index.js doctor --json",
|
|
74
|
-
"test:mcp": "vitest run --config vitest.mcp.config.ts",
|
|
75
|
-
"test:mcp:watch": "vitest --config vitest.mcp.config.ts",
|
|
76
|
-
"test:mcp:coverage": "vitest run --config vitest.mcp.config.ts --coverage",
|
|
77
|
-
"test:ba": "vitest run --config vitest.ba.config.ts",
|
|
78
|
-
"test:ba:watch": "vitest --config vitest.ba.config.ts",
|
|
79
|
-
"test:ba:coverage": "vitest run --config vitest.ba.config.ts --coverage",
|
|
80
|
-
"test:all": "npm run test:mcp && npm run test:ba"
|
|
81
|
-
},
|
|
82
|
-
"dependencies": {
|
|
83
|
-
"@atlashub/smartstack-cli": "file:",
|
|
84
|
-
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
85
|
-
"axios": "^1.7.0",
|
|
86
|
-
"bcryptjs": "^2.4.3",
|
|
87
|
-
"chalk": "^5.3.0",
|
|
88
|
-
"cli-table3": "^0.6.3",
|
|
89
|
-
"commander": "^12.0.0",
|
|
90
|
-
"fs-extra": "^11.2.0",
|
|
91
|
-
"glob": "^13.0.1",
|
|
92
|
-
"handlebars": "^4.7.8",
|
|
93
|
-
"inquirer": "^9.2.12",
|
|
94
|
-
"jsonwebtoken": "^9.0.3",
|
|
95
|
-
"mssql": "^11.0.1",
|
|
96
|
-
"ora": "^8.0.1",
|
|
97
|
-
"zod": "^3.25.0"
|
|
98
|
-
},
|
|
99
|
-
"devDependencies": {
|
|
100
|
-
"@types/bcryptjs": "^2.4.6",
|
|
101
|
-
"@types/fs-extra": "^11.0.4",
|
|
102
|
-
"@types/inquirer": "^9.0.7",
|
|
103
|
-
"@types/jsonwebtoken": "^9.0.10",
|
|
104
|
-
"@types/mssql": "^9.1.5",
|
|
105
|
-
"@types/node": "^20.10.6",
|
|
106
|
-
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
|
107
|
-
"@typescript-eslint/parser": "^6.18.0",
|
|
108
|
-
"@vitest/coverage-v8": "^2.1.0",
|
|
109
|
-
"eslint": "^8.56.0",
|
|
110
|
-
"prettier": "^3.2.4",
|
|
111
|
-
"tsup": "^8.0.1",
|
|
112
|
-
"typescript": "^5.3.3",
|
|
113
|
-
"vitest": "^2.1.0"
|
|
114
|
-
}
|
|
115
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "@atlashub/smartstack-cli",
|
|
3
|
+
"version": "4.0.0",
|
|
4
|
+
"description": "SmartStack Claude Code automation toolkit - GitFlow, EF Core migrations, prompts and more",
|
|
5
|
+
"author": {
|
|
6
|
+
"name": "SmartStack",
|
|
7
|
+
"email": "contact@smartstack.app",
|
|
8
|
+
"url": "https://smartstack.app"
|
|
9
|
+
},
|
|
10
|
+
"license": "MIT",
|
|
11
|
+
"private": false,
|
|
12
|
+
"type": "commonjs",
|
|
13
|
+
"main": "./dist/index.js",
|
|
14
|
+
"types": "./dist/index.d.ts",
|
|
15
|
+
"bin": {
|
|
16
|
+
"smartstack": "./dist/index.js",
|
|
17
|
+
"ss": "./dist/index.js",
|
|
18
|
+
"smartstack-mcp": "./dist/mcp-entry.mjs"
|
|
19
|
+
},
|
|
20
|
+
"files": [
|
|
21
|
+
"dist",
|
|
22
|
+
"templates",
|
|
23
|
+
"config",
|
|
24
|
+
"scripts",
|
|
25
|
+
".documentation"
|
|
26
|
+
],
|
|
27
|
+
"engines": {
|
|
28
|
+
"node": ">=18.0.0"
|
|
29
|
+
},
|
|
30
|
+
"publishConfig": {
|
|
31
|
+
"registry": "https://registry.npmjs.org",
|
|
32
|
+
"access": "public"
|
|
33
|
+
},
|
|
34
|
+
"repository": {
|
|
35
|
+
"type": "git",
|
|
36
|
+
"url": "git+https://dev.azure.com/AtlasHub/SmartStack/_git/SmartStack.cli"
|
|
37
|
+
},
|
|
38
|
+
"homepage": "https://smartstack.app",
|
|
39
|
+
"keywords": [
|
|
40
|
+
"smartstack",
|
|
41
|
+
"claude",
|
|
42
|
+
"claude-code",
|
|
43
|
+
"gitflow",
|
|
44
|
+
"efcore",
|
|
45
|
+
"entity-framework",
|
|
46
|
+
"migrations",
|
|
47
|
+
"cli",
|
|
48
|
+
"automation",
|
|
49
|
+
"anthropic",
|
|
50
|
+
"dotnet",
|
|
51
|
+
"prompts",
|
|
52
|
+
"ai-tools"
|
|
53
|
+
],
|
|
54
|
+
"scripts": {
|
|
55
|
+
"postinstall": "node scripts/postinstall.js || exit 0",
|
|
56
|
+
"dev": "tsup --watch",
|
|
57
|
+
"build:html": "node templates/skills/business-analyse/html/build-html.js",
|
|
58
|
+
"build": "npm run build:html && npx tsup",
|
|
59
|
+
"lint": "eslint src --ext .ts",
|
|
60
|
+
"format": "prettier --write \"src/**/*.ts\"",
|
|
61
|
+
"prepublishOnly": "npm run build",
|
|
62
|
+
"test": "node --test",
|
|
63
|
+
"link": "npm run build && npm link",
|
|
64
|
+
"install:local": "npm run build && node dist/index.js install --local --force",
|
|
65
|
+
"install:global": "npm run build && node dist/index.js install --force",
|
|
66
|
+
"status:local": "node dist/index.js status --local --verbose",
|
|
67
|
+
"status:global": "node dist/index.js status --verbose",
|
|
68
|
+
"doctor": "node dist/index.js doctor",
|
|
69
|
+
"check-mcp": "node dist/index.js check-mcp",
|
|
70
|
+
"ralph:start": "node dist/index.js ralph start",
|
|
71
|
+
"ralph:status": "node dist/index.js ralph status",
|
|
72
|
+
"ralph:logs": "node dist/index.js ralph logs",
|
|
73
|
+
"health": "node dist/index.js doctor --json",
|
|
74
|
+
"test:mcp": "vitest run --config vitest.mcp.config.ts",
|
|
75
|
+
"test:mcp:watch": "vitest --config vitest.mcp.config.ts",
|
|
76
|
+
"test:mcp:coverage": "vitest run --config vitest.mcp.config.ts --coverage",
|
|
77
|
+
"test:ba": "vitest run --config vitest.ba.config.ts",
|
|
78
|
+
"test:ba:watch": "vitest --config vitest.ba.config.ts",
|
|
79
|
+
"test:ba:coverage": "vitest run --config vitest.ba.config.ts --coverage",
|
|
80
|
+
"test:all": "npm run test:mcp && npm run test:ba"
|
|
81
|
+
},
|
|
82
|
+
"dependencies": {
|
|
83
|
+
"@atlashub/smartstack-cli": "file:",
|
|
84
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
85
|
+
"axios": "^1.7.0",
|
|
86
|
+
"bcryptjs": "^2.4.3",
|
|
87
|
+
"chalk": "^5.3.0",
|
|
88
|
+
"cli-table3": "^0.6.3",
|
|
89
|
+
"commander": "^12.0.0",
|
|
90
|
+
"fs-extra": "^11.2.0",
|
|
91
|
+
"glob": "^13.0.1",
|
|
92
|
+
"handlebars": "^4.7.8",
|
|
93
|
+
"inquirer": "^9.2.12",
|
|
94
|
+
"jsonwebtoken": "^9.0.3",
|
|
95
|
+
"mssql": "^11.0.1",
|
|
96
|
+
"ora": "^8.0.1",
|
|
97
|
+
"zod": "^3.25.0"
|
|
98
|
+
},
|
|
99
|
+
"devDependencies": {
|
|
100
|
+
"@types/bcryptjs": "^2.4.6",
|
|
101
|
+
"@types/fs-extra": "^11.0.4",
|
|
102
|
+
"@types/inquirer": "^9.0.7",
|
|
103
|
+
"@types/jsonwebtoken": "^9.0.10",
|
|
104
|
+
"@types/mssql": "^9.1.5",
|
|
105
|
+
"@types/node": "^20.10.6",
|
|
106
|
+
"@typescript-eslint/eslint-plugin": "^6.18.0",
|
|
107
|
+
"@typescript-eslint/parser": "^6.18.0",
|
|
108
|
+
"@vitest/coverage-v8": "^2.1.0",
|
|
109
|
+
"eslint": "^8.56.0",
|
|
110
|
+
"prettier": "^3.2.4",
|
|
111
|
+
"tsup": "^8.0.1",
|
|
112
|
+
"typescript": "^5.3.3",
|
|
113
|
+
"vitest": "^2.1.0"
|
|
114
|
+
}
|
|
115
|
+
}
|
|
@@ -91,8 +91,8 @@ Execute incremental SmartStack development using the APEX methodology. This skil
|
|
|
91
91
|
| 04 | `steps/step-04-examine.md` | Opus | eXamine: MCP validation, build, 44 POST-CHECKs, acceptance criteria |
|
|
92
92
|
| 05 | `steps/step-05-deep-review.md` | Opus | Deep Review: adversarial code review (if -x) |
|
|
93
93
|
| 06 | `steps/step-06-resolve.md` | Opus | Fix BLOCKING findings (if any) |
|
|
94
|
-
| 07 | `steps/step-07-tests.md` | Opus |
|
|
95
|
-
| 08 | `steps/step-08-run-tests.md` | Opus | Run
|
|
94
|
+
| 07 | `steps/step-07-tests.md` | Opus | Final Test Sweep: security tests, coverage, remaining failures |
|
|
95
|
+
| 08 | `steps/step-08-run-tests.md` | Opus | Run Final Test Sweep until 100% pass |
|
|
96
96
|
</step_files>
|
|
97
97
|
|
|
98
98
|
<apex_phases>
|
|
@@ -103,11 +103,11 @@ Execute incremental SmartStack development using the APEX methodology. This skil
|
|
|
103
103
|
| *Init* | 00 | Yes | Setup, hierarchy, challenge the need, **scope guard** (skipped in `-d` delegate mode) |
|
|
104
104
|
| **A** — Analyze | 01 | Yes | Explore existing code |
|
|
105
105
|
| **P** — Plan | 02 | Yes | File-by-file plan with skill/MCP mapping |
|
|
106
|
-
| **E** — Execute | 03 | Yes | Orchestrate creation via skills and MCP |
|
|
106
|
+
| **E** — Execute | 03 | Yes | Orchestrate creation via skills and MCP (5 layers: domain, seed, backend, frontend, devdata) |
|
|
107
107
|
| **X** — eXamine | 04 | Yes | 3 MCP tools + 50 POST-CHECKs (6 security + 44 convention), build, acceptance criteria |
|
|
108
108
|
| *Deep Review* | 05 (if -x) | No | Adversarial code review beyond automated checks |
|
|
109
109
|
| *Resolve* | 06 (if BLOCKING) | No | Fix BLOCKING findings |
|
|
110
|
-
| *
|
|
110
|
+
| *Final Test Sweep* | 07-08 | **Yes** | Security tests, coverage sweep, remaining failures |
|
|
111
111
|
</apex_phases>
|
|
112
112
|
|
|
113
113
|
<reference_files>
|
|
@@ -119,7 +119,7 @@ Execute incremental SmartStack development using the APEX methodology. This skil
|
|
|
119
119
|
| `references/smartstack-layers.md` | Layer rules, skill/MCP mapping, planning templates, delegate fast path | step-02 | step-03 (do NOT re-read) |
|
|
120
120
|
| `references/smartstack-frontend.md` | Frontend patterns, EntityLookup, i18n, compliance gates (sections 1-9) | step-03 | step-04 |
|
|
121
121
|
| `references/challenge-questions.md` | Hierarchy rules, challenge questions, delegate mode skip | step-00 | — |
|
|
122
|
-
| `references/core-seed-data.md` | Comprehensive seed data templates (navigation, permissions, roles) | step-03 (
|
|
122
|
+
| `references/core-seed-data.md` | Comprehensive seed data templates (navigation, permissions, roles) | step-03 (ALWAYS for Layer 1) | — |
|
|
123
123
|
| `references/error-classification.md` | Build error diagnosis categories A-F | step-03 (build failure), step-04 | — |
|
|
124
124
|
| `references/agent-teams-protocol.md` | TeamCreate, coordination, shutdown protocol | step-01, step-03 (if NOT economy_mode) | — |
|
|
125
125
|
| `references/post-checks.md` | 6 security + 44 convention bash checks (MCP tools run first) | step-04 | — |
|
|
@@ -133,8 +133,9 @@ Execute incremental SmartStack development using the APEX methodology. This skil
|
|
|
133
133
|
- **ORCHESTRATE, never generate** - All SmartStack code via skills (/controller, /application, etc.) or MCP tools
|
|
134
134
|
- **MCP-first** - Use MCP scaffold/validate tools before manual approaches
|
|
135
135
|
- **Verify MCP at startup** - step-00 checks MCP availability
|
|
136
|
-
- **Layer order** -
|
|
137
|
-
- **Agent Teams** - Parallel execution for scan (step-01) and Layer
|
|
136
|
+
- **Layer order** - Layer 0 (domain+infra+migration) → Layer 1 (seed data) → Layer 2 (backend+tests) → Layer 3 (frontend+tests) → Layer 4 (devdata)
|
|
137
|
+
- **Agent Teams** - Parallel execution for scan (step-01) and within Layer 2/3 (step-03) for multi-entity, unless economy_mode
|
|
138
|
+
- **Tests inline** - Backend tests run after Layer 2, frontend tests run after Layer 3 (max 3 fix iterations each). Step-07 = final sweep (security + coverage).
|
|
138
139
|
- **Save outputs** if `{save_mode}` = true
|
|
139
140
|
- **Commits per layer** - Atomic commits after each execution layer
|
|
140
141
|
- **Delegate mode** (`-d`): Read PRD context, skip challenge questions, auto+economy mode implied. Used when `/ralph-loop` delegates code generation to `/apex`.
|
|
@@ -168,7 +169,8 @@ Execute incremental SmartStack development using the APEX methodology. This skil
|
|
|
168
169
|
- Code created/corrected via existing skills and MCP (no direct generation)
|
|
169
170
|
- MCP validate_conventions: 0 errors
|
|
170
171
|
- Build: dotnet build PASS + npm run typecheck PASS (if frontend)
|
|
171
|
-
- Seed data complete (navigation, permissions, roles, provider)
|
|
172
|
-
- Tests:
|
|
172
|
+
- Seed data complete as dedicated Layer 1 (navigation, permissions, roles, provider) — impossible to skip
|
|
173
|
+
- Tests inline: backend tests after Layer 2, frontend tests after Layer 3
|
|
174
|
+
- Final test sweep: security tests + coverage >= 80% + 100% pass rate
|
|
173
175
|
- Commits atomic per layer
|
|
174
176
|
</success_criteria>
|
|
@@ -10,7 +10,7 @@
|
|
|
10
10
|
|
|
11
11
|
```yaml
|
|
12
12
|
TeamCreate:
|
|
13
|
-
team_name: "apex-{phase}" # e.g., "apex-analyze", "apex-
|
|
13
|
+
team_name: "apex-{phase}" # e.g., "apex-analyze", "apex-layer2", "apex-layer3"
|
|
14
14
|
description: "{phase purpose}" # e.g., "Scan SmartStack project for existing code"
|
|
15
15
|
```
|
|
16
16
|
|
|
@@ -24,7 +24,7 @@ Always provide both `team_name` and `description`.
|
|
|
24
24
|
Task:
|
|
25
25
|
subagent_type: "Explore" | "general-purpose" # See assignment table below
|
|
26
26
|
team_name: "apex-{phase}" # Must match TeamCreate
|
|
27
|
-
name: "{teammate-name}" # e.g., "scan-backend", "
|
|
27
|
+
name: "{teammate-name}" # e.g., "scan-backend", "entity-employee"
|
|
28
28
|
model: "sonnet" | "opus" # sonnet for scan, opus for dev (T02/T06)
|
|
29
29
|
mode: "bypassPermissions"
|
|
30
30
|
prompt: "{detailed task prompt}"
|
|
@@ -87,14 +87,24 @@ scan-frontend : src/pages/ + src/components/ + src/locales/
|
|
|
87
87
|
scan-context : .ralph/ + docs/business/
|
|
88
88
|
```
|
|
89
89
|
|
|
90
|
-
### Step-03 Execute: Split by
|
|
90
|
+
### Step-03 Execute: Split by entity WITHIN a layer
|
|
91
|
+
|
|
92
|
+
> **Cross-layer parallelism is FORBIDDEN.** Layers execute sequentially: 0 → 1 → 2 → 3 → 4.
|
|
93
|
+
> Agent teams parallelize **multi-entity work within a single layer.**
|
|
91
94
|
|
|
92
95
|
```
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
Layer 2 (Backend) — if multiple entities:
|
|
97
|
+
entity-{name1} : Service + DTO + Controller for Entity1
|
|
98
|
+
entity-{name2} : Service + DTO + Controller for Entity2
|
|
99
|
+
...
|
|
100
|
+
|
|
101
|
+
Layer 3 (Frontend) — if multiple entities:
|
|
102
|
+
entity-{name1} : Pages + i18n + routes for Entity1
|
|
103
|
+
entity-{name2} : Pages + i18n + routes for Entity2
|
|
104
|
+
...
|
|
95
105
|
```
|
|
96
106
|
|
|
97
|
-
Each teammate has an **isolated scope** (C02):
|
|
107
|
+
Each teammate has an **isolated scope** (C02): handles one entity end-to-end within the layer.
|
|
98
108
|
|
|
99
109
|
---
|
|
100
110
|
|
|
@@ -108,15 +118,20 @@ Each teammate has an **isolated scope** (C02): backend never touches frontend.
|
|
|
108
118
|
3. Lead merges into unified analysis
|
|
109
119
|
```
|
|
110
120
|
|
|
111
|
-
### Step-03: Lead verifies between layers
|
|
121
|
+
### Step-03: Lead verifies between ALL 5 layers
|
|
112
122
|
|
|
113
123
|
```
|
|
114
124
|
1. Layer 0: lead executes (domain + infra + migration)
|
|
115
|
-
2. Build gate: dotnet build
|
|
116
|
-
3. Layer 1:
|
|
117
|
-
4.
|
|
118
|
-
5.
|
|
119
|
-
6.
|
|
125
|
+
2. Build gate: dotnet build → MUST PASS
|
|
126
|
+
3. Layer 1: lead executes (seed data — sequential, no teams)
|
|
127
|
+
4. Build gate: dotnet build → MUST PASS
|
|
128
|
+
5. Layer 2: spawn entity teammates (if multi-entity) OR lead executes (if single entity)
|
|
129
|
+
6. Build gate: dotnet build → MUST PASS
|
|
130
|
+
7. Backend tests inline (scaffold + run + fix max 3)
|
|
131
|
+
8. Layer 3: spawn entity teammates (if multi-entity) OR lead executes (if single entity)
|
|
132
|
+
9. Compliance gate: 5 frontend checks → MUST PASS
|
|
133
|
+
10. Frontend tests inline (scaffold + run + fix max 3)
|
|
134
|
+
11. Layer 4 (optional): lead executes DevData
|
|
120
135
|
```
|
|
121
136
|
|
|
122
137
|
---
|
|
@@ -158,7 +173,8 @@ TeamDelete
|
|
|
158
173
|
| Condition | Action |
|
|
159
174
|
|-----------|--------|
|
|
160
175
|
| economy_mode = true | NO teams, all sequential |
|
|
161
|
-
|
|
|
162
|
-
|
|
|
163
|
-
|
|
|
164
|
-
|
|
|
176
|
+
| Single entity (any layer) | NO teams, agent principal handles all |
|
|
177
|
+
| Multiple entities, Layer 2 | Teams: one teammate per entity (service + controller) |
|
|
178
|
+
| Multiple entities, Layer 3 | Teams: one teammate per entity (pages + i18n) |
|
|
179
|
+
| Layer 0, Layer 1, Layer 4 | NO teams (sequential by nature) |
|
|
180
|
+
| Analysis phase (step-01) | Teams: scan-backend + scan-frontend + scan-context |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Core Seed Data - Execution Reference
|
|
2
2
|
|
|
3
|
-
> **Loaded by:** apex step-03-execute (
|
|
3
|
+
> **Loaded by:** apex step-03-execute (ALWAYS for Layer 1) and step-04-examine
|
|
4
4
|
> **Condition:** Seed data generation — infrastructure or seedData category tasks
|
|
5
5
|
> **Applies to:** Client projects only (seeding_strategy = "provider", ExtensionsDbContext)
|
|
6
6
|
>
|
|
@@ -1390,3 +1390,29 @@ public class {Module}DevDataSeeder : IDevDataSeeder
|
|
|
1390
1390
|
> **Pipeline validation:**
|
|
1391
1391
|
> - ralph-loop POST-CHECK warns if GUID not found in project config
|
|
1392
1392
|
> - validate-feature step-05 verifies FK exists in real database via SQL query
|
|
1393
|
+
|
|
1394
|
+
---
|
|
1395
|
+
|
|
1396
|
+
## DataExportEndpoint Seed Data Pattern
|
|
1397
|
+
|
|
1398
|
+
When adding a new export endpoint, add seed data in `DataExportEndpointConfiguration.cs`:
|
|
1399
|
+
|
|
1400
|
+
```csharp
|
|
1401
|
+
builder.HasData(new {
|
|
1402
|
+
Id = new Guid("{random-guid}"),
|
|
1403
|
+
NavigationApplicationId = NavigationApplicationSeedData.{App}AppId,
|
|
1404
|
+
NavigationModuleId = NavigationModuleSeedData.{Module}ModuleId,
|
|
1405
|
+
Code = "{entity-code}",
|
|
1406
|
+
Name = "{Entity} Export",
|
|
1407
|
+
Description = "Export {entity} data with metadata",
|
|
1408
|
+
RouteTemplate = "/api/v1/export/{entity-code}",
|
|
1409
|
+
RequiredPermission = "{app}.{module}.export",
|
|
1410
|
+
EntityType = "{Entity}",
|
|
1411
|
+
IsActive = true,
|
|
1412
|
+
DefaultRateLimitPerMinute = 60,
|
|
1413
|
+
DefaultMaxPageSize = 1000,
|
|
1414
|
+
CreatedAt = seedDate
|
|
1415
|
+
});
|
|
1416
|
+
```
|
|
1417
|
+
|
|
1418
|
+
Requires matching controller in `Controllers/DataExport/v1/Export{Entity}Controller.cs`.
|
|
@@ -810,6 +810,46 @@ services.AddValidatorsFromAssemblyContaining<Create{Name}DtoValidator>();
|
|
|
810
810
|
|
|
811
811
|
---
|
|
812
812
|
|
|
813
|
+
## External Application & Data Export Pattern
|
|
814
|
+
|
|
815
|
+
### Entities
|
|
816
|
+
|
|
817
|
+
| Entity | Table | Description |
|
|
818
|
+
|--------|-------|-------------|
|
|
819
|
+
| `ExternalApplication` | `auth_ExternalApplications` | Machine-to-machine API account (ClientId, ClientSecret, IsActive, IP whitelist) |
|
|
820
|
+
| `ExternalApplicationRole` | `auth_ExternalApplicationRoles` | Role assignment per app (AppId, RoleId, optional TenantId) |
|
|
821
|
+
| `ExternalApplicationExportAccess` | `auth_ExternalApplicationExportAccesses` | Per-app access to specific export endpoint (IsEnabled, RateLimitPerMinute, MaxPageSize) |
|
|
822
|
+
| `DataExportEndpoint` | `auth_DataExportEndpoints` | Registry of available export APIs (Code, RouteTemplate, RequiredPermission, EntityType) |
|
|
823
|
+
| `ExternalAppAuditLog` | `auth_ExternalAppAuditLogs` | Audit trail for all API calls (Authentication, DataExport actions) |
|
|
824
|
+
|
|
825
|
+
### Architecture (3-layer security)
|
|
826
|
+
|
|
827
|
+
1. **Authentication** — JWT assertion signed with ClientSecret → ExternalApplicationAuthService validates → generates SmartStack JWT with permissions resolved via ExternalApplicationRole → Role → RolePermission chain
|
|
828
|
+
2. **Authorization** — RequirePermissionFilter checks JWT claims (e.g., `administration.users.export`)
|
|
829
|
+
3. **Access Control** — DataExportAccessMiddleware verifies per-app endpoint access in ExternalApplicationExportAccess table
|
|
830
|
+
|
|
831
|
+
### Rate Limiting
|
|
832
|
+
|
|
833
|
+
ExternalAppRateLimitPolicy resolves limits: app override → endpoint default → 60/min fallback.
|
|
834
|
+
Partition key: `{clientId}:{endpointCode}`.
|
|
835
|
+
|
|
836
|
+
### Seed Data
|
|
837
|
+
|
|
838
|
+
DataExportEndpoints are seeded in DataExportEndpointConfiguration.cs with FK to NavigationApplication and NavigationModule. Each endpoint maps to a controller in `Controllers/DataExport/v1/`.
|
|
839
|
+
|
|
840
|
+
### Controller Pattern
|
|
841
|
+
|
|
842
|
+
Export controllers: `[Route("api/v1/export")]` + `[RequirePermission]` + `[EnableRateLimiting]`
|
|
843
|
+
|
|
844
|
+
**Query Parameters (all export endpoints except Navigation):**
|
|
845
|
+
- `tenantId` (UUID, required) — Scopes the export to the specified tenant's data
|
|
846
|
+
|
|
847
|
+
Example: `GET /api/v1/export/users?tenantId=550e8400-e29b-41d4-a716-446655440000&page=1&pageSize=50`
|
|
848
|
+
|
|
849
|
+
Management controllers: `[NavRoute("api.accounts")]` with CustomSegment
|
|
850
|
+
|
|
851
|
+
---
|
|
852
|
+
|
|
813
853
|
## PaginatedResult Pattern
|
|
814
854
|
|
|
815
855
|
> **Canonical type for ALL paginated responses.** One name, one contract, everywhere.
|