@atlashub/smartstack-cli 3.37.0 → 3.39.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 +16 -24
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +235 -265
- package/dist/mcp-entry.mjs.map +1 -1
- package/package.json +1 -1
- package/scripts/extract-api-endpoints.ts +5 -5
- package/scripts/generate-doc-with-mock-ui.ts +10 -17
- package/templates/agents/ba-reader.md +9 -9
- package/templates/agents/ba-writer.md +12 -15
- package/templates/agents/code-reviewer.md +1 -1
- package/templates/agents/docs-context-reader.md +1 -1
- package/templates/agents/efcore/scan.md +3 -1
- package/templates/agents/gitflow/commit.md +74 -0
- package/templates/agents/gitflow/finish.md +5 -2
- package/templates/agents/gitflow/init-clone.md +3 -3
- package/templates/agents/gitflow/init-validate.md +3 -2
- package/templates/agents/gitflow/merge.md +5 -4
- package/templates/agents/gitflow/pr.md +5 -4
- package/templates/agents/gitflow/start.md +37 -5
- package/templates/hooks/hooks.json +11 -0
- package/templates/hooks/wsl-dotnet-cleanup.sh +24 -0
- package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +20 -20
- package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +16 -24
- package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +2 -2
- package/templates/skills/_resources/mcp-validate-documentation-spec.md +3 -3
- package/templates/skills/_shared.md +15 -17
- package/templates/skills/ai-prompt/SKILL.md +1 -1
- package/templates/skills/ai-prompt/steps/step-00-init.md +47 -0
- package/templates/skills/apex/SKILL.md +3 -4
- package/templates/skills/apex/_shared.md +10 -20
- package/templates/skills/apex/references/analysis-methods.md +141 -0
- package/templates/skills/apex/references/challenge-questions.md +1 -21
- package/templates/skills/apex/references/core-seed-data.md +35 -58
- package/templates/skills/apex/references/examine-build-validation.md +82 -0
- package/templates/skills/apex/references/execution-frontend-gates.md +177 -0
- package/templates/skills/apex/references/execution-frontend-patterns.md +105 -0
- package/templates/skills/apex/references/execution-layer1-rules.md +96 -0
- package/templates/skills/apex/references/initialization-challenge-flow.md +110 -0
- package/templates/skills/apex/references/planning-layer-mapping.md +151 -0
- package/templates/skills/apex/references/post-checks.md +145 -40
- package/templates/skills/apex/references/smartstack-api.md +35 -51
- package/templates/skills/apex/references/smartstack-frontend.md +18 -18
- package/templates/skills/apex/references/smartstack-layers.md +38 -62
- package/templates/skills/apex/steps/step-00-init.md +14 -26
- package/templates/skills/apex/steps/step-01-analyze.md +10 -143
- package/templates/skills/apex/steps/step-02-plan.md +10 -92
- package/templates/skills/apex/steps/step-03-execute.md +45 -252
- package/templates/skills/apex/steps/step-04-examine.md +14 -78
- package/templates/skills/apex/steps/step-05-deep-review.md +2 -2
- package/templates/skills/apex/steps/step-08-run-tests.md +1 -0
- package/templates/skills/application/SKILL.md +241 -242
- package/templates/skills/application/references/backend-controller-hierarchy.md +16 -16
- package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -0
- package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -0
- package/templates/skills/application/references/backend-verification.md +1 -1
- package/templates/skills/application/references/frontend-i18n-and-output.md +67 -0
- package/templates/skills/application/references/frontend-route-naming.md +117 -0
- package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -0
- package/templates/skills/application/references/frontend-verification.md +12 -12
- package/templates/skills/application/references/init-parameter-detection.md +121 -0
- package/templates/skills/application/references/migration-checklist-troubleshooting.md +100 -0
- package/templates/skills/application/references/nav-fallback-procedure.md +199 -200
- package/templates/skills/application/references/provider-template.md +2 -6
- package/templates/skills/application/references/roles-client-project-handling.md +55 -0
- package/templates/skills/application/references/roles-fallback-procedure.md +149 -0
- package/templates/skills/application/references/test-coverage-requirements.md +213 -0
- package/templates/skills/application/references/test-frontend.md +3 -3
- package/templates/skills/application/steps/step-00-init.md +130 -260
- package/templates/skills/application/steps/step-01-navigation.md +170 -170
- package/templates/skills/application/steps/step-02-permissions.md +196 -196
- package/templates/skills/application/steps/step-03-roles.md +182 -339
- package/templates/skills/application/steps/step-03b-provider.md +133 -134
- package/templates/skills/application/steps/step-04-backend.md +174 -265
- package/templates/skills/application/steps/step-05-frontend.md +18 -144
- package/templates/skills/application/steps/step-06-migration.md +12 -60
- package/templates/skills/application/steps/step-07-tests.md +9 -76
- package/templates/skills/application/templates-backend.md +29 -27
- package/templates/skills/application/templates-frontend.md +49 -49
- package/templates/skills/application/templates-seed.md +57 -131
- package/templates/skills/business-analyse/SKILL.md +27 -30
- package/templates/skills/business-analyse/_architecture.md +6 -6
- package/templates/skills/business-analyse/_shared.md +60 -88
- package/templates/skills/business-analyse/questionnaire/04-data.md +3 -3
- package/templates/skills/business-analyse/questionnaire/06-security.md +1 -1
- package/templates/skills/business-analyse/questionnaire/13-cross-module.md +1 -1
- package/templates/skills/business-analyse/react/application-viewer.md +12 -12
- package/templates/skills/business-analyse/react/components.md +8 -12
- package/templates/skills/business-analyse/react/schema.md +836 -836
- package/templates/skills/business-analyse/references/agent-module-prompt.md +2 -3
- package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -0
- package/templates/skills/business-analyse/references/cache-warming-strategy.md +2 -2
- package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -0
- package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -0
- package/templates/skills/business-analyse/references/cadrage-shared-modules.md +69 -0
- package/templates/skills/business-analyse/references/cadrage-structure-cards.md +1 -1
- package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -0
- package/templates/skills/business-analyse/references/consolidation-structural-checks.md +2 -2
- package/templates/skills/business-analyse/references/deploy-modes.md +5 -5
- package/templates/skills/business-analyse/references/detection-strategies.md +7 -7
- package/templates/skills/business-analyse/references/handoff-file-templates.md +14 -22
- package/templates/skills/business-analyse/references/handoff-mappings.md +4 -4
- package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -0
- package/templates/skills/business-analyse/references/init-schema-deployment.md +3 -3
- package/templates/skills/business-analyse/references/naming-conventions.md +22 -24
- package/templates/skills/business-analyse/references/prd-generation.md +2 -2
- package/templates/skills/business-analyse/references/review-data-mapping.md +2 -2
- package/templates/skills/business-analyse/references/robustness-checks.md +1 -1
- package/templates/skills/business-analyse/references/spec-auto-inference.md +3 -3
- package/templates/skills/business-analyse/references/team-orchestration.md +49 -6
- package/templates/skills/business-analyse/references/ui-dashboard-spec.md +1 -1
- package/templates/skills/business-analyse/references/ui-resource-cards.md +18 -18
- package/templates/skills/business-analyse/references/validate-incremental-html.md +2 -2
- package/templates/skills/business-analyse/references/validation-checklist.md +2 -2
- package/templates/skills/business-analyse/schemas/application-schema.json +4 -5
- package/templates/skills/business-analyse/schemas/project-schema.json +1 -6
- package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +2 -3
- package/templates/skills/business-analyse/schemas/sections/specification-schema.json +4 -4
- package/templates/skills/business-analyse/steps/step-00-init.md +8 -17
- package/templates/skills/business-analyse/steps/step-01-cadrage.md +35 -198
- package/templates/skills/business-analyse/steps/step-01b-applications.md +16 -20
- package/templates/skills/business-analyse/steps/step-02-decomposition.md +1 -1
- package/templates/skills/business-analyse/steps/step-03a1-setup.md +4 -4
- package/templates/skills/business-analyse/steps/step-03a2-analysis.md +1 -1
- package/templates/skills/business-analyse/steps/step-03b-ui.md +4 -4
- package/templates/skills/business-analyse/steps/step-03c-compile.md +66 -140
- package/templates/skills/business-analyse/steps/step-03d-validate.md +2 -2
- package/templates/skills/business-analyse/steps/step-04a-collect.md +2 -2
- package/templates/skills/business-analyse/steps/step-04b-analyze.md +42 -160
- package/templates/skills/business-analyse/steps/step-04c-decide.md +1 -1
- package/templates/skills/business-analyse/steps/step-05a-handoff.md +74 -104
- package/templates/skills/business-analyse/steps/step-05b-deploy.md +13 -11
- package/templates/skills/business-analyse/steps/step-06-review.md +3 -3
- package/templates/skills/business-analyse/templates/tpl-frd.md +13 -13
- package/templates/skills/business-analyse/templates/tpl-handoff.md +12 -12
- package/templates/skills/business-analyse/templates/tpl-progress.md +1 -1
- package/templates/skills/business-analyse/templates-frd.md +25 -25
- package/templates/skills/business-analyse/templates-react.md +15 -21
- package/templates/skills/controller/SKILL.md +1 -1
- package/templates/skills/controller/postman-templates.md +1 -1
- package/templates/skills/controller/references/controller-code-templates.md +2 -2
- package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -0
- package/templates/skills/controller/references/permission-sync-templates.md +13 -16
- package/templates/skills/controller/steps/step-00-init.md +11 -11
- package/templates/skills/controller/steps/step-03-generate.md +64 -103
- package/templates/skills/controller/templates.md +67 -71
- package/templates/skills/debug/SKILL.md +13 -218
- package/templates/skills/debug/steps/step-00-init.md +57 -0
- package/templates/skills/debug/steps/step-01-analyze.md +219 -0
- package/templates/skills/debug/steps/step-02-resolve.md +85 -0
- package/templates/skills/documentation/SKILL.md +49 -345
- package/templates/skills/documentation/data-schema.md +11 -8
- package/templates/skills/documentation/steps/step-00-init.md +70 -0
- package/templates/skills/documentation/steps/step-01-scan.md +113 -0
- package/templates/skills/documentation/steps/step-02-generate.md +231 -0
- package/templates/skills/documentation/steps/step-03-validate.md +238 -0
- package/templates/skills/documentation/templates.md +480 -322
- package/templates/skills/efcore/SKILL.md +1 -1
- package/templates/skills/efcore/references/both-contexts.md +32 -0
- package/templates/skills/efcore/references/database-operations.md +67 -0
- package/templates/skills/efcore/references/destructive-operations.md +38 -0
- package/templates/skills/efcore/references/reset-operations.md +81 -0
- package/templates/skills/efcore/references/seed-methods.md +86 -0
- package/templates/skills/efcore/references/shared-init-functions.md +250 -0
- package/templates/skills/efcore/references/sql-objects-injection.md +61 -0
- package/templates/skills/efcore/references/troubleshooting.md +81 -0
- package/templates/skills/efcore/steps/db/step-deploy.md +1 -32
- package/templates/skills/efcore/steps/db/step-reset.md +7 -103
- package/templates/skills/efcore/steps/db/step-seed.md +10 -132
- package/templates/skills/efcore/steps/db/step-status.md +5 -44
- package/templates/skills/efcore/steps/migration/step-02-create.md +1 -14
- package/templates/skills/efcore/steps/migration/step-03-validate.md +8 -62
- package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +1 -57
- package/templates/skills/efcore/steps/shared/step-00-init.md +11 -254
- package/templates/skills/efcore/steps/squash/step-03-create.md +1 -58
- package/templates/skills/feature-full/SKILL.md +1 -1
- package/templates/skills/feature-full/steps/step-00-init.md +57 -0
- package/templates/skills/feature-full/steps/step-01-implementation.md +1 -1
- package/templates/skills/gitflow/SKILL.md +28 -5
- package/templates/skills/gitflow/_shared.md +109 -12
- package/templates/skills/gitflow/phases/abort.md +4 -0
- package/templates/skills/gitflow/phases/cleanup.md +4 -0
- package/templates/skills/gitflow/references/commit-message-generation.md +58 -0
- package/templates/skills/gitflow/references/commit-migration-validation.md +49 -0
- package/templates/skills/gitflow/references/finish-cleanup.md +55 -0
- package/templates/skills/gitflow/references/finish-version-bumping.md +45 -0
- package/templates/skills/gitflow/references/init-environment-detection.md +41 -0
- package/templates/skills/gitflow/references/init-questions.md +185 -0
- package/templates/skills/gitflow/references/init-structure-creation.md +75 -0
- package/templates/skills/gitflow/references/init-version-detection.md +21 -0
- package/templates/skills/gitflow/references/init-workspace-detection.md +43 -0
- package/templates/skills/gitflow/references/merge-ci-status.md +36 -0
- package/templates/skills/gitflow/references/merge-execution.md +62 -0
- package/templates/skills/gitflow/references/merge-pr-context.md +76 -0
- package/templates/skills/gitflow/references/pr-build-checks.md +60 -0
- package/templates/skills/gitflow/references/pr-generation.md +58 -0
- package/templates/skills/gitflow/references/start-branch-normalization.md +28 -0
- package/templates/skills/gitflow/references/start-worktree-creation.md +50 -0
- package/templates/skills/gitflow/references/sync-push-verify.md +44 -0
- package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -0
- package/templates/skills/gitflow/steps/step-commit.md +12 -91
- package/templates/skills/gitflow/steps/step-finish.md +15 -159
- package/templates/skills/gitflow/steps/step-init.md +24 -326
- package/templates/skills/gitflow/steps/step-merge.md +17 -176
- package/templates/skills/gitflow/steps/step-pr.md +10 -116
- package/templates/skills/gitflow/steps/step-start.md +16 -109
- package/templates/skills/gitflow/steps/step-sync.md +6 -69
- package/templates/skills/ralph-loop/SKILL.md +6 -0
- package/templates/skills/ralph-loop/references/category-completeness.md +185 -0
- package/templates/skills/ralph-loop/references/compact-loop.md +1 -1
- package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -0
- package/templates/skills/ralph-loop/references/module-transition.md +151 -0
- package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -0
- package/templates/skills/ralph-loop/references/parallel-execution.md +246 -0
- package/templates/skills/ralph-loop/references/task-transform-legacy.md +6 -9
- package/templates/skills/ralph-loop/references/team-orchestration.md +45 -3
- package/templates/skills/ralph-loop/steps/step-00-init.md +36 -109
- package/templates/skills/ralph-loop/steps/step-01-task.md +15 -163
- package/templates/skills/ralph-loop/steps/step-02-execute.md +8 -154
- package/templates/skills/ralph-loop/steps/step-04-check.md +20 -73
- package/templates/skills/review-code/references/owasp-api-top10.md +5 -5
- package/templates/skills/review-code/references/smartstack-conventions.md +568 -568
- package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -0
- package/templates/skills/validate-feature/references/db-validation-checks.md +180 -0
- package/templates/skills/validate-feature/steps/step-01-compile.md +1 -3
- package/templates/skills/validate-feature/steps/step-04-api-smoke.md +34 -145
- package/templates/skills/validate-feature/steps/step-05-db-validation.md +74 -260
- package/templates/skills/workflow/SKILL.md +1 -1
- package/templates/skills/workflow/steps/step-00-init.md +57 -0
|
@@ -1,200 +1,199 @@
|
|
|
1
|
-
# Navigation: Fallback Procedure (When MCP Unavailable)
|
|
2
|
-
|
|
3
|
-
> Reference for step-01-navigation.md — generates navigation seeds following SmartStack.app patterns.
|
|
4
|
-
> Reference: `templates-seed.md` for code templates.
|
|
5
|
-
>
|
|
6
|
-
> **Branch by Project Type:**
|
|
7
|
-
> - If `{seeding_strategy}` = "hasdata" (core project): Follow F1-F8 below
|
|
8
|
-
> - If `{seeding_strategy}` = "provider" (client project): Follow **CLIENT PROJECT HANDLING** in step file
|
|
9
|
-
|
|
10
|
-
## F1. Read Existing Configuration Files
|
|
11
|
-
|
|
12
|
-
**CRITICAL:** Before generating any code, read existing files to determine state:
|
|
13
|
-
|
|
14
|
-
1. **Find the Navigation Configuration directory:**
|
|
15
|
-
```
|
|
16
|
-
Glob: **/Persistence/Configurations/Navigation/Navigation*Configuration.cs
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
2. **Read NavigationTranslationConfiguration.cs** - Find the last GUID index:
|
|
20
|
-
```
|
|
21
|
-
Search for: the last call to GenerateGuid(index++)
|
|
22
|
-
The index variable starts at 1 and increments per translation entry.
|
|
23
|
-
Your new translations MUST continue from the next index value.
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
3. **Read Navigation{Level}Configuration.cs** - Check existing entities:
|
|
27
|
-
```
|
|
28
|
-
Read the Configuration for the target level (
|
|
29
|
-
Check if it already references a SeedData class: builder.HasData(Navigation{Level}SeedData.GetSeedData())
|
|
30
|
-
If yes: Read the corresponding SeedData class to find existing entries.
|
|
31
|
-
If no: You will need to add HasData() call.
|
|
32
|
-
```
|
|
33
|
-
|
|
34
|
-
4. **Read existing SeedData files** (if they exist):
|
|
35
|
-
```
|
|
36
|
-
Glob: **/Seeding/Data/Navigation/Navigation{Level}SeedData.cs
|
|
37
|
-
Check for existing entity IDs to avoid collisions.
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## F2. Determine Parent GUID
|
|
41
|
-
|
|
42
|
-
For non-
|
|
43
|
-
|
|
44
|
-
| Level | Parent | Where to Find Parent GUID |
|
|
45
|
-
|-------|--------|---------------------------|
|
|
46
|
-
| application |
|
|
47
|
-
| module | application | `NavigationApplicationSeedData.cs` → e.g. `AdministrationAppId` |
|
|
48
|
-
| section | module | `NavigationModuleSeedData.cs` → e.g. `UsersModuleId` |
|
|
49
|
-
|
|
50
|
-
Read the parent SeedData class and find the GUID matching `{parent_path}`.
|
|
51
|
-
|
|
52
|
-
## F3. Generate Navigation Entity GUID
|
|
53
|
-
|
|
54
|
-
Generate a deterministic GUID for the new navigation entity:
|
|
55
|
-
|
|
56
|
-
```csharp
|
|
57
|
-
// Use SHA256 hash of the full_path for deterministic generation
|
|
58
|
-
using var sha256 = System.Security.Cryptography.SHA256.Create();
|
|
59
|
-
var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes("navigation-{level}-{full_path}"));
|
|
60
|
-
var guid = new Guid(hash.Take(16).ToArray());
|
|
61
|
-
```
|
|
62
|
-
|
|
63
|
-
**Rules:**
|
|
64
|
-
- NEVER use `Guid.NewGuid()`
|
|
65
|
-
- Read existing SeedData GUIDs to verify no collision
|
|
66
|
-
- Store result as `{navigation_guid}`
|
|
67
|
-
|
|
68
|
-
## F4. Write Navigation Entity Seed
|
|
69
|
-
|
|
70
|
-
Based on `{level}`, write the seed entry.
|
|
71
|
-
|
|
72
|
-
**Option A: Project uses SeedData classes (SmartStack.app pattern)**
|
|
73
|
-
|
|
74
|
-
If `Navigation{Level}SeedData.cs` exists, add the new entity:
|
|
75
|
-
|
|
76
|
-
```csharp
|
|
77
|
-
// In Infrastructure/Persistence/Seeding/Data/Navigation/Navigation{Level}SeedData.cs
|
|
78
|
-
|
|
79
|
-
// Add static GUID field
|
|
80
|
-
public static readonly Guid {PascalCode}Id = Guid.Parse("{navigation_guid}");
|
|
81
|
-
|
|
82
|
-
// Add to GetSeedData() return array
|
|
83
|
-
new {
|
|
84
|
-
Id = {PascalCode}Id,
|
|
85
|
-
ParentFk = Navigation{ParentLevel}SeedData.{ParentPascalCode}Id, // FK varies by level
|
|
86
|
-
Code = "{code}",
|
|
87
|
-
Label = "{labels.en}",
|
|
88
|
-
Description = "{descriptions.en}",
|
|
89
|
-
Icon = "{icon}",
|
|
90
|
-
IconType = IconType.Lucide,
|
|
91
|
-
Route = "/{full_path_with_slashes}",
|
|
92
|
-
DisplayOrder = {display_order},
|
|
93
|
-
IsActive = true,
|
|
94
|
-
CreatedAt = SeedConstants.SeedDate
|
|
95
|
-
}
|
|
96
|
-
```
|
|
97
|
-
|
|
98
|
-
**FK property by level:**
|
|
99
|
-
|
|
100
|
-
| Level | FK Property | References |
|
|
101
|
-
|-------|-------------|------------|
|
|
102
|
-
|
|
|
103
|
-
|
|
|
104
|
-
|
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
{
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
- [ ]
|
|
180
|
-
- [ ]
|
|
181
|
-
- [ ]
|
|
182
|
-
- [ ]
|
|
183
|
-
- [ ]
|
|
184
|
-
- [ ]
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
**
|
|
193
|
-
**
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
```
|
|
1
|
+
# Navigation: Fallback Procedure (When MCP Unavailable)
|
|
2
|
+
|
|
3
|
+
> Reference for step-01-navigation.md — generates navigation seeds following SmartStack.app patterns.
|
|
4
|
+
> Reference: `templates-seed.md` for code templates.
|
|
5
|
+
>
|
|
6
|
+
> **Branch by Project Type:**
|
|
7
|
+
> - If `{seeding_strategy}` = "hasdata" (core project): Follow F1-F8 below
|
|
8
|
+
> - If `{seeding_strategy}` = "provider" (client project): Follow **CLIENT PROJECT HANDLING** in step file
|
|
9
|
+
|
|
10
|
+
## F1. Read Existing Configuration Files
|
|
11
|
+
|
|
12
|
+
**CRITICAL:** Before generating any code, read existing files to determine state:
|
|
13
|
+
|
|
14
|
+
1. **Find the Navigation Configuration directory:**
|
|
15
|
+
```
|
|
16
|
+
Glob: **/Persistence/Configurations/Navigation/Navigation*Configuration.cs
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. **Read NavigationTranslationConfiguration.cs** - Find the last GUID index:
|
|
20
|
+
```
|
|
21
|
+
Search for: the last call to GenerateGuid(index++)
|
|
22
|
+
The index variable starts at 1 and increments per translation entry.
|
|
23
|
+
Your new translations MUST continue from the next index value.
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
3. **Read Navigation{Level}Configuration.cs** - Check existing entities:
|
|
27
|
+
```
|
|
28
|
+
Read the Configuration for the target level (Application, Module, Section, Resource).
|
|
29
|
+
Check if it already references a SeedData class: builder.HasData(Navigation{Level}SeedData.GetSeedData())
|
|
30
|
+
If yes: Read the corresponding SeedData class to find existing entries.
|
|
31
|
+
If no: You will need to add HasData() call.
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
4. **Read existing SeedData files** (if they exist):
|
|
35
|
+
```
|
|
36
|
+
Glob: **/Seeding/Data/Navigation/Navigation{Level}SeedData.cs
|
|
37
|
+
Check for existing entity IDs to avoid collisions.
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
## F2. Determine Parent GUID
|
|
41
|
+
|
|
42
|
+
For non-application levels, find the parent entity GUID:
|
|
43
|
+
|
|
44
|
+
| Level | Parent | Where to Find Parent GUID |
|
|
45
|
+
|-------|--------|---------------------------|
|
|
46
|
+
| application | (none — top level) | — |
|
|
47
|
+
| module | application | `NavigationApplicationSeedData.cs` → e.g. `AdministrationAppId` |
|
|
48
|
+
| section | module | `NavigationModuleSeedData.cs` → e.g. `UsersModuleId` |
|
|
49
|
+
|
|
50
|
+
Read the parent SeedData class and find the GUID matching `{parent_path}`.
|
|
51
|
+
|
|
52
|
+
## F3. Generate Navigation Entity GUID
|
|
53
|
+
|
|
54
|
+
Generate a deterministic GUID for the new navigation entity:
|
|
55
|
+
|
|
56
|
+
```csharp
|
|
57
|
+
// Use SHA256 hash of the full_path for deterministic generation
|
|
58
|
+
using var sha256 = System.Security.Cryptography.SHA256.Create();
|
|
59
|
+
var hash = sha256.ComputeHash(Encoding.UTF8.GetBytes("navigation-{level}-{full_path}"));
|
|
60
|
+
var guid = new Guid(hash.Take(16).ToArray());
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Rules:**
|
|
64
|
+
- NEVER use `Guid.NewGuid()`
|
|
65
|
+
- Read existing SeedData GUIDs to verify no collision
|
|
66
|
+
- Store result as `{navigation_guid}`
|
|
67
|
+
|
|
68
|
+
## F4. Write Navigation Entity Seed
|
|
69
|
+
|
|
70
|
+
Based on `{level}`, write the seed entry.
|
|
71
|
+
|
|
72
|
+
**Option A: Project uses SeedData classes (SmartStack.app pattern)**
|
|
73
|
+
|
|
74
|
+
If `Navigation{Level}SeedData.cs` exists, add the new entity:
|
|
75
|
+
|
|
76
|
+
```csharp
|
|
77
|
+
// In Infrastructure/Persistence/Seeding/Data/Navigation/Navigation{Level}SeedData.cs
|
|
78
|
+
|
|
79
|
+
// Add static GUID field
|
|
80
|
+
public static readonly Guid {PascalCode}Id = Guid.Parse("{navigation_guid}");
|
|
81
|
+
|
|
82
|
+
// Add to GetSeedData() return array
|
|
83
|
+
new {
|
|
84
|
+
Id = {PascalCode}Id,
|
|
85
|
+
ParentFk = Navigation{ParentLevel}SeedData.{ParentPascalCode}Id, // FK varies by level
|
|
86
|
+
Code = "{code}",
|
|
87
|
+
Label = "{labels.en}",
|
|
88
|
+
Description = "{descriptions.en}",
|
|
89
|
+
Icon = "{icon}",
|
|
90
|
+
IconType = IconType.Lucide,
|
|
91
|
+
Route = "/{full_path_with_slashes}",
|
|
92
|
+
DisplayOrder = {display_order},
|
|
93
|
+
IsActive = true,
|
|
94
|
+
CreatedAt = SeedConstants.SeedDate
|
|
95
|
+
}
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
**FK property by level:**
|
|
99
|
+
|
|
100
|
+
| Level | FK Property | References |
|
|
101
|
+
|-------|-------------|------------|
|
|
102
|
+
| application | (none — top level) | — |
|
|
103
|
+
| module | `ApplicationId` | NavigationApplicationSeedData.{Parent}Id |
|
|
104
|
+
| section | `ModuleId` | NavigationModuleSeedData.{Parent}Id |
|
|
105
|
+
|
|
106
|
+
**Option B: Project uses inline HasData**
|
|
107
|
+
|
|
108
|
+
If no SeedData class exists, add directly to `Navigation{Level}Configuration.cs`:
|
|
109
|
+
|
|
110
|
+
```csharp
|
|
111
|
+
// In Configure method, add:
|
|
112
|
+
builder.HasData(new {
|
|
113
|
+
Id = Guid.Parse("{navigation_guid}"),
|
|
114
|
+
// ... same properties as Option A
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## F5. Write Translation Entries
|
|
119
|
+
|
|
120
|
+
Add 4 translation entries to `NavigationTranslationConfiguration.cs`:
|
|
121
|
+
|
|
122
|
+
1. Read the file to find the current highest `index` value
|
|
123
|
+
2. Continue from `index + 1`
|
|
124
|
+
3. Use the SAME `GenerateGuid` method already defined in the file:
|
|
125
|
+
|
|
126
|
+
```csharp
|
|
127
|
+
// In GetSeedData() method, add at the end before return:
|
|
128
|
+
|
|
129
|
+
// {level}: {code} translations
|
|
130
|
+
translations.Add(new {
|
|
131
|
+
Id = GenerateGuid(index++),
|
|
132
|
+
EntityType = NavigationEntityType.{Level},
|
|
133
|
+
EntityId = Navigation{Level}SeedData.{PascalCode}Id, // or Guid.Parse("{navigation_guid}")
|
|
134
|
+
LanguageCode = "fr",
|
|
135
|
+
Label = "{labels.fr}",
|
|
136
|
+
Description = "{descriptions.fr}",
|
|
137
|
+
CreatedAt = seedDate
|
|
138
|
+
});
|
|
139
|
+
translations.Add(new {
|
|
140
|
+
Id = GenerateGuid(index++),
|
|
141
|
+
EntityType = NavigationEntityType.{Level},
|
|
142
|
+
EntityId = Navigation{Level}SeedData.{PascalCode}Id,
|
|
143
|
+
LanguageCode = "en",
|
|
144
|
+
Label = "{labels.en}",
|
|
145
|
+
Description = "{descriptions.en}",
|
|
146
|
+
CreatedAt = seedDate
|
|
147
|
+
});
|
|
148
|
+
translations.Add(new {
|
|
149
|
+
Id = GenerateGuid(index++),
|
|
150
|
+
EntityType = NavigationEntityType.{Level},
|
|
151
|
+
EntityId = Navigation{Level}SeedData.{PascalCode}Id,
|
|
152
|
+
LanguageCode = "it",
|
|
153
|
+
Label = "{labels.it}",
|
|
154
|
+
Description = "{descriptions.it}",
|
|
155
|
+
CreatedAt = seedDate
|
|
156
|
+
});
|
|
157
|
+
translations.Add(new {
|
|
158
|
+
Id = GenerateGuid(index++),
|
|
159
|
+
EntityType = NavigationEntityType.{Level},
|
|
160
|
+
EntityId = Navigation{Level}SeedData.{PascalCode}Id,
|
|
161
|
+
LanguageCode = "de",
|
|
162
|
+
Label = "{labels.de}",
|
|
163
|
+
Description = "{descriptions.de}",
|
|
164
|
+
CreatedAt = seedDate
|
|
165
|
+
});
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
## F6. Store Result
|
|
169
|
+
|
|
170
|
+
```
|
|
171
|
+
{navigation_guid} = [generated GUID]
|
|
172
|
+
{seed_method} = "fallback" // Indicates MCP was not used
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## F7. Validation Checklist
|
|
176
|
+
|
|
177
|
+
Before proceeding, verify:
|
|
178
|
+
- [ ] Deterministic GUID generated (not NewGuid())
|
|
179
|
+
- [ ] 4 languages present (fr, en, it, de)
|
|
180
|
+
- [ ] Translation index continues existing sequence (no gaps, no collisions)
|
|
181
|
+
- [ ] Parent GUID correctly references existing entity
|
|
182
|
+
- [ ] Route path matches `/{app}/{module}` pattern
|
|
183
|
+
- [ ] DisplayOrder is consistent with existing entities
|
|
184
|
+
- [ ] Code is WRITTEN to files, not just displayed
|
|
185
|
+
|
|
186
|
+
## F8. Present Summary
|
|
187
|
+
|
|
188
|
+
```markdown
|
|
189
|
+
## Navigation Seeds Generated (Fallback)
|
|
190
|
+
|
|
191
|
+
**Entity:** {level} - {code}
|
|
192
|
+
**GUID:** {navigation_guid}
|
|
193
|
+
**Path:** {full_path}
|
|
194
|
+
|
|
195
|
+
### Files Updated
|
|
196
|
+
|
|
197
|
+
1. **Navigation{Level}SeedData.cs** (or Configuration.cs) - New entity entry
|
|
198
|
+
2. **NavigationTranslationConfiguration.cs** - 4 translation entries added
|
|
199
|
+
```
|
|
@@ -31,7 +31,7 @@ public class {AppPascalName}SeedDataProvider : IClientSeedDataProvider
|
|
|
31
31
|
public async Task SeedNavigationAsync(ICoreDbContext context, CancellationToken ct)
|
|
32
32
|
{
|
|
33
33
|
// --- Application (idempotent — reuse if already exists) ---
|
|
34
|
-
var appEntry = NavigationApplicationSeedData.GetApplicationEntry(
|
|
34
|
+
var appEntry = NavigationApplicationSeedData.GetApplicationEntry();
|
|
35
35
|
var existingApp = await context.NavigationApplications
|
|
36
36
|
.FirstOrDefaultAsync(a => a.Code == appEntry.Code, ct);
|
|
37
37
|
|
|
@@ -42,12 +42,8 @@ public class {AppPascalName}SeedDataProvider : IClientSeedDataProvider
|
|
|
42
42
|
}
|
|
43
43
|
else
|
|
44
44
|
{
|
|
45
|
-
var parentContext = await context.NavigationContexts
|
|
46
|
-
.FirstAsync(c => c.Code == "{context_code}", ct);
|
|
47
|
-
|
|
48
|
-
appEntry = NavigationApplicationSeedData.GetApplicationEntry(parentContext.Id);
|
|
49
45
|
app = NavigationApplication.Create(
|
|
50
|
-
appEntry.
|
|
46
|
+
appEntry.Code, appEntry.Label,
|
|
51
47
|
appEntry.Description, appEntry.Icon, appEntry.IconType,
|
|
52
48
|
appEntry.Route, appEntry.DisplayOrder);
|
|
53
49
|
context.NavigationApplications.Add(app);
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
# Step 3: Client Project Handling (seeding_strategy = "provider")
|
|
2
|
+
|
|
3
|
+
> Referenced from `steps/step-03-roles.md` — Specific handling for client projects.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## ApplicationRolesSeedData.cs (ONCE per application)
|
|
8
|
+
|
|
9
|
+
**File:** `Infrastructure/Persistence/Seeding/Data/ApplicationRolesSeedData.cs`
|
|
10
|
+
|
|
11
|
+
**Purpose:** Defines the 4 standard application-scoped roles (Admin, Manager, Contributor, Viewer) with valid `Code` values.
|
|
12
|
+
|
|
13
|
+
**CRITICAL:** Without this file, role-permission mappings in `SeedRolePermissionsAsync()` will fail silently because `roles.FirstOrDefault(r => r.Code == mapping.RoleCode)` will return null.
|
|
14
|
+
|
|
15
|
+
See [references/application-roles-template.md](../references/application-roles-template.md) for the complete template.
|
|
16
|
+
|
|
17
|
+
**Key requirements:**
|
|
18
|
+
- Deterministic GUIDs based on `role-{applicationId}-{roleType}`
|
|
19
|
+
- 4 roles: Admin, Manager, Contributor, Viewer
|
|
20
|
+
- Each role has a valid `Code` property ("admin", "manager", "contributor", "viewer")
|
|
21
|
+
- `ApplicationId` references the navigation application GUID
|
|
22
|
+
- `IsSystem = false` (application-scoped, not system roles)
|
|
23
|
+
|
|
24
|
+
**Detection:** Check if ApplicationRolesSeedData.cs exists. If yes, skip creation (already exists from Module 1). If no, create it.
|
|
25
|
+
|
|
26
|
+
---
|
|
27
|
+
|
|
28
|
+
## {Module}RolePermissionSeedData.cs (PER module)
|
|
29
|
+
|
|
30
|
+
**File:** `Infrastructure/Persistence/Seeding/Data/{Domain}/{Module}RolePermissionSeedData.cs`
|
|
31
|
+
|
|
32
|
+
**Purpose:** Maps permissions to roles by Code (e.g., "admin" → "{navRoute}.*").
|
|
33
|
+
|
|
34
|
+
Content: static class with method `GetRolePermissionEntries()` that returns the role-permission mapping data.
|
|
35
|
+
These entries will be consumed by the `IClientSeedDataProvider` at step 03b.
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## Default Role Mapping Table
|
|
40
|
+
|
|
41
|
+
Based on navigation application prefix:
|
|
42
|
+
|
|
43
|
+
| Application prefix | PlatformAdmin | TenantAdmin | StandardUser |
|
|
44
|
+
|---------|---------------|-------------|--------------|
|
|
45
|
+
| `administration.*` | Full CRUD | Read only | None |
|
|
46
|
+
| `*` (business apps) | Full CRUD | Full CRUD | Read only |
|
|
47
|
+
| `myspace.*` | None | Full CRUD | Full CRUD |
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Summary
|
|
52
|
+
|
|
53
|
+
After creating both files:
|
|
54
|
+
- Proceed to step-03b-provider.md (which will skip for core projects)
|
|
55
|
+
- The provider will consume these SeedData files to seed roles and permissions at runtime
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# Role-Permission Generation: Fallback Procedure (When MCP Unavailable)
|
|
2
|
+
|
|
3
|
+
> Reference for step-03-roles.md — Generates role-permission HasData entries following SmartStack.app patterns.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## F1. Read Existing RolePermissionConfiguration.cs
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
Glob: **/Persistence/Configurations/Authorization/RolePermissionConfiguration.cs
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Read the file to determine:
|
|
14
|
+
- Existing role-permission mappings
|
|
15
|
+
- The GetSeedData() method structure
|
|
16
|
+
- Which roles already have which permissions
|
|
17
|
+
- The GUID generation method used (deterministic or hardcoded)
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
## F2. Read Role GUIDs
|
|
22
|
+
|
|
23
|
+
**System-level roles** (well-known GUIDs):
|
|
24
|
+
|
|
25
|
+
| Role | GUID |
|
|
26
|
+
|------|------|
|
|
27
|
+
| SuperAdmin | `11111111-1111-1111-1111-111111111111` |
|
|
28
|
+
| PlatformAdmin | `22222222-2222-2222-2222-222222222222` |
|
|
29
|
+
| TenantAdmin | `33333333-3333-3333-3333-333333333333` |
|
|
30
|
+
| StandardUser | `44444444-4444-4444-4444-444444444444` |
|
|
31
|
+
|
|
32
|
+
**IMPORTANT:** Read the actual `RoleSeedData.cs` or `RoleConfiguration.cs` in the target project to confirm the actual role GUIDs. The above are defaults; the project may use different values.
|
|
33
|
+
|
|
34
|
+
**Application-scoped roles** (deterministic GUIDs based on application):
|
|
35
|
+
|
|
36
|
+
```csharp
|
|
37
|
+
// Read the existing GenerateDeterministicGuid method in RolePermissionConfiguration.cs
|
|
38
|
+
// Typically uses MD5 hash:
|
|
39
|
+
private static Guid GenerateDeterministicGuid(Guid applicationId, string roleType)
|
|
40
|
+
{
|
|
41
|
+
using var md5 = System.Security.Cryptography.MD5.Create();
|
|
42
|
+
var input = $"{applicationId}-{roleType}";
|
|
43
|
+
var hash = md5.ComputeHash(System.Text.Encoding.UTF8.GetBytes(input));
|
|
44
|
+
return new Guid(hash);
|
|
45
|
+
}
|
|
46
|
+
// roleType values: "admin", "manager", "contributor", "viewer"
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
Find the `applicationId` from `NavigationApplicationSeedData.cs` matching `{full_path}`.
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## F3. Determine Application-Based Default Mappings
|
|
54
|
+
|
|
55
|
+
Based on `{full_path}` application prefix:
|
|
56
|
+
|
|
57
|
+
| Application Prefix | SuperAdmin | PlatformAdmin | App Admin | App Manager | App Contributor | App Viewer |
|
|
58
|
+
|----------------|------------|---------------|-----------|-------------|-----------------|------------|
|
|
59
|
+
| `administration.*` | wildcard | Full CRUD | Full CRUD | CRU | CR | R |
|
|
60
|
+
| `*` (business apps) | wildcard | Full CRUD | Full CRUD | CRU | CR | R |
|
|
61
|
+
| `myspace.*` | wildcard | None | Full CRUD | CRU | CR | R |
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## F4. Generate RolePermission HasData Entries
|
|
66
|
+
|
|
67
|
+
Using `{permission_guids}` from step-02:
|
|
68
|
+
|
|
69
|
+
```csharp
|
|
70
|
+
// In RolePermissionConfiguration.cs - GetSeedData() method
|
|
71
|
+
var seedDate = SeedConstants.SeedDate;
|
|
72
|
+
|
|
73
|
+
// ============================================================
|
|
74
|
+
// {MODULE_NAME} PERMISSIONS
|
|
75
|
+
// ============================================================
|
|
76
|
+
|
|
77
|
+
// SuperAdmin: already has *.* wildcard - no individual entries needed
|
|
78
|
+
|
|
79
|
+
// PlatformAdmin (for platform.* context)
|
|
80
|
+
rolePermissions.Add(new { RoleId = platformAdminRoleId, PermissionId = {permission_guids.read}, AssignedAt = seedDate });
|
|
81
|
+
rolePermissions.Add(new { RoleId = platformAdminRoleId, PermissionId = {permission_guids.create}, AssignedAt = seedDate });
|
|
82
|
+
rolePermissions.Add(new { RoleId = platformAdminRoleId, PermissionId = {permission_guids.update}, AssignedAt = seedDate });
|
|
83
|
+
rolePermissions.Add(new { RoleId = platformAdminRoleId, PermissionId = {permission_guids.delete}, AssignedAt = seedDate });
|
|
84
|
+
|
|
85
|
+
// Application-scoped: Admin → wildcard
|
|
86
|
+
rolePermissions.Add(new { RoleId = appAdminRoleId, PermissionId = {permission_guids.wildcard}, AssignedAt = seedDate });
|
|
87
|
+
|
|
88
|
+
// Application-scoped: Manager → CRU (read + create + update — no delete)
|
|
89
|
+
rolePermissions.Add(new { RoleId = appManagerRoleId, PermissionId = {permission_guids.read}, AssignedAt = seedDate });
|
|
90
|
+
rolePermissions.Add(new { RoleId = appManagerRoleId, PermissionId = {permission_guids.create}, AssignedAt = seedDate });
|
|
91
|
+
rolePermissions.Add(new { RoleId = appManagerRoleId, PermissionId = {permission_guids.update}, AssignedAt = seedDate });
|
|
92
|
+
|
|
93
|
+
// Application-scoped: Contributor → CR
|
|
94
|
+
rolePermissions.Add(new { RoleId = appContributorRoleId, PermissionId = {permission_guids.read}, AssignedAt = seedDate });
|
|
95
|
+
rolePermissions.Add(new { RoleId = appContributorRoleId, PermissionId = {permission_guids.create}, AssignedAt = seedDate });
|
|
96
|
+
|
|
97
|
+
// Application-scoped: Viewer → R
|
|
98
|
+
rolePermissions.Add(new { RoleId = appViewerRoleId, PermissionId = {permission_guids.read}, AssignedAt = seedDate });
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## F5. Write Code to RolePermissionConfiguration.cs
|
|
104
|
+
|
|
105
|
+
**CRITICAL:** Do NOT just display code. WRITE it to the actual file.
|
|
106
|
+
|
|
107
|
+
1. Open `RolePermissionConfiguration.cs`
|
|
108
|
+
2. Find the `GetSeedData()` method
|
|
109
|
+
3. Add the new role-permission entries to the list
|
|
110
|
+
4. Add necessary permission GUID references (import from PermissionConfiguration or use inline)
|
|
111
|
+
5. Add comments grouping the new entries: `// {MODULE_NAME} PERMISSIONS`
|
|
112
|
+
|
|
113
|
+
---
|
|
114
|
+
|
|
115
|
+
## F6. Present Summary
|
|
116
|
+
|
|
117
|
+
```markdown
|
|
118
|
+
## Role-Permission Mappings Generated (Fallback)
|
|
119
|
+
|
|
120
|
+
| Role | Permissions |
|
|
121
|
+
|------|-------------|
|
|
122
|
+
| SuperAdmin | Already has wildcard access |
|
|
123
|
+
| PlatformAdmin | {full_path}.read, .create, .update, .delete |
|
|
124
|
+
| App Admin | {full_path}.* (wildcard) |
|
|
125
|
+
| App Manager | {full_path}.read, .create, .update |
|
|
126
|
+
| App Contributor | {full_path}.read, .create |
|
|
127
|
+
| App Viewer | {full_path}.read |
|
|
128
|
+
|
|
129
|
+
Written to: RolePermissionConfiguration.cs
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## F7. Offer User Adjustment
|
|
135
|
+
|
|
136
|
+
If user selects "Custom adjustments", ask which roles/permissions to change and update the file accordingly.
|
|
137
|
+
|
|
138
|
+
---
|
|
139
|
+
|
|
140
|
+
## Validation Checklist
|
|
141
|
+
|
|
142
|
+
Before marking as completed, verify:
|
|
143
|
+
|
|
144
|
+
- [ ] All role GUIDs correctly identified (system and application-scoped)
|
|
145
|
+
- [ ] Role-permission mappings follow application hierarchy
|
|
146
|
+
- [ ] Code WRITTEN to files (not just displayed)
|
|
147
|
+
- [ ] Permission GUID references correct
|
|
148
|
+
- [ ] Comments added for module grouping
|
|
149
|
+
- [ ] No gaps or missing permissions
|