@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.
Files changed (228) hide show
  1. package/dist/index.js +16 -24
  2. package/dist/index.js.map +1 -1
  3. package/dist/mcp-entry.mjs +235 -265
  4. package/dist/mcp-entry.mjs.map +1 -1
  5. package/package.json +1 -1
  6. package/scripts/extract-api-endpoints.ts +5 -5
  7. package/scripts/generate-doc-with-mock-ui.ts +10 -17
  8. package/templates/agents/ba-reader.md +9 -9
  9. package/templates/agents/ba-writer.md +12 -15
  10. package/templates/agents/code-reviewer.md +1 -1
  11. package/templates/agents/docs-context-reader.md +1 -1
  12. package/templates/agents/efcore/scan.md +3 -1
  13. package/templates/agents/gitflow/commit.md +74 -0
  14. package/templates/agents/gitflow/finish.md +5 -2
  15. package/templates/agents/gitflow/init-clone.md +3 -3
  16. package/templates/agents/gitflow/init-validate.md +3 -2
  17. package/templates/agents/gitflow/merge.md +5 -4
  18. package/templates/agents/gitflow/pr.md +5 -4
  19. package/templates/agents/gitflow/start.md +37 -5
  20. package/templates/hooks/hooks.json +11 -0
  21. package/templates/hooks/wsl-dotnet-cleanup.sh +24 -0
  22. package/templates/mcp-scaffolding/frontend/nav-routes.ts.hbs +20 -20
  23. package/templates/mcp-scaffolding/frontend/routes.tsx.hbs +16 -24
  24. package/templates/mcp-scaffolding/migrations/seed-roles.cs.hbs +2 -2
  25. package/templates/skills/_resources/mcp-validate-documentation-spec.md +3 -3
  26. package/templates/skills/_shared.md +15 -17
  27. package/templates/skills/ai-prompt/SKILL.md +1 -1
  28. package/templates/skills/ai-prompt/steps/step-00-init.md +47 -0
  29. package/templates/skills/apex/SKILL.md +3 -4
  30. package/templates/skills/apex/_shared.md +10 -20
  31. package/templates/skills/apex/references/analysis-methods.md +141 -0
  32. package/templates/skills/apex/references/challenge-questions.md +1 -21
  33. package/templates/skills/apex/references/core-seed-data.md +35 -58
  34. package/templates/skills/apex/references/examine-build-validation.md +82 -0
  35. package/templates/skills/apex/references/execution-frontend-gates.md +177 -0
  36. package/templates/skills/apex/references/execution-frontend-patterns.md +105 -0
  37. package/templates/skills/apex/references/execution-layer1-rules.md +96 -0
  38. package/templates/skills/apex/references/initialization-challenge-flow.md +110 -0
  39. package/templates/skills/apex/references/planning-layer-mapping.md +151 -0
  40. package/templates/skills/apex/references/post-checks.md +145 -40
  41. package/templates/skills/apex/references/smartstack-api.md +35 -51
  42. package/templates/skills/apex/references/smartstack-frontend.md +18 -18
  43. package/templates/skills/apex/references/smartstack-layers.md +38 -62
  44. package/templates/skills/apex/steps/step-00-init.md +14 -26
  45. package/templates/skills/apex/steps/step-01-analyze.md +10 -143
  46. package/templates/skills/apex/steps/step-02-plan.md +10 -92
  47. package/templates/skills/apex/steps/step-03-execute.md +45 -252
  48. package/templates/skills/apex/steps/step-04-examine.md +14 -78
  49. package/templates/skills/apex/steps/step-05-deep-review.md +2 -2
  50. package/templates/skills/apex/steps/step-08-run-tests.md +1 -0
  51. package/templates/skills/application/SKILL.md +241 -242
  52. package/templates/skills/application/references/backend-controller-hierarchy.md +16 -16
  53. package/templates/skills/application/references/backend-seeding-and-dto-output.md +83 -0
  54. package/templates/skills/application/references/backend-table-prefix-mapping.md +79 -0
  55. package/templates/skills/application/references/backend-verification.md +1 -1
  56. package/templates/skills/application/references/frontend-i18n-and-output.md +67 -0
  57. package/templates/skills/application/references/frontend-route-naming.md +117 -0
  58. package/templates/skills/application/references/frontend-route-wiring-app-tsx.md +107 -0
  59. package/templates/skills/application/references/frontend-verification.md +12 -12
  60. package/templates/skills/application/references/init-parameter-detection.md +121 -0
  61. package/templates/skills/application/references/migration-checklist-troubleshooting.md +100 -0
  62. package/templates/skills/application/references/nav-fallback-procedure.md +199 -200
  63. package/templates/skills/application/references/provider-template.md +2 -6
  64. package/templates/skills/application/references/roles-client-project-handling.md +55 -0
  65. package/templates/skills/application/references/roles-fallback-procedure.md +149 -0
  66. package/templates/skills/application/references/test-coverage-requirements.md +213 -0
  67. package/templates/skills/application/references/test-frontend.md +3 -3
  68. package/templates/skills/application/steps/step-00-init.md +130 -260
  69. package/templates/skills/application/steps/step-01-navigation.md +170 -170
  70. package/templates/skills/application/steps/step-02-permissions.md +196 -196
  71. package/templates/skills/application/steps/step-03-roles.md +182 -339
  72. package/templates/skills/application/steps/step-03b-provider.md +133 -134
  73. package/templates/skills/application/steps/step-04-backend.md +174 -265
  74. package/templates/skills/application/steps/step-05-frontend.md +18 -144
  75. package/templates/skills/application/steps/step-06-migration.md +12 -60
  76. package/templates/skills/application/steps/step-07-tests.md +9 -76
  77. package/templates/skills/application/templates-backend.md +29 -27
  78. package/templates/skills/application/templates-frontend.md +49 -49
  79. package/templates/skills/application/templates-seed.md +57 -131
  80. package/templates/skills/business-analyse/SKILL.md +27 -30
  81. package/templates/skills/business-analyse/_architecture.md +6 -6
  82. package/templates/skills/business-analyse/_shared.md +60 -88
  83. package/templates/skills/business-analyse/questionnaire/04-data.md +3 -3
  84. package/templates/skills/business-analyse/questionnaire/06-security.md +1 -1
  85. package/templates/skills/business-analyse/questionnaire/13-cross-module.md +1 -1
  86. package/templates/skills/business-analyse/react/application-viewer.md +12 -12
  87. package/templates/skills/business-analyse/react/components.md +8 -12
  88. package/templates/skills/business-analyse/react/schema.md +836 -836
  89. package/templates/skills/business-analyse/references/agent-module-prompt.md +2 -3
  90. package/templates/skills/business-analyse/references/analysis-semantic-checks.md +190 -0
  91. package/templates/skills/business-analyse/references/cache-warming-strategy.md +2 -2
  92. package/templates/skills/business-analyse/references/cadrage-challenge-patterns.md +41 -0
  93. package/templates/skills/business-analyse/references/cadrage-coverage-matrix.md +74 -0
  94. package/templates/skills/business-analyse/references/cadrage-shared-modules.md +69 -0
  95. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +1 -1
  96. package/templates/skills/business-analyse/references/compilation-structure-cards.md +297 -0
  97. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +2 -2
  98. package/templates/skills/business-analyse/references/deploy-modes.md +5 -5
  99. package/templates/skills/business-analyse/references/detection-strategies.md +7 -7
  100. package/templates/skills/business-analyse/references/handoff-file-templates.md +14 -22
  101. package/templates/skills/business-analyse/references/handoff-mappings.md +4 -4
  102. package/templates/skills/business-analyse/references/handoff-seeddata-generation.md +312 -0
  103. package/templates/skills/business-analyse/references/init-schema-deployment.md +3 -3
  104. package/templates/skills/business-analyse/references/naming-conventions.md +22 -24
  105. package/templates/skills/business-analyse/references/prd-generation.md +2 -2
  106. package/templates/skills/business-analyse/references/review-data-mapping.md +2 -2
  107. package/templates/skills/business-analyse/references/robustness-checks.md +1 -1
  108. package/templates/skills/business-analyse/references/spec-auto-inference.md +3 -3
  109. package/templates/skills/business-analyse/references/team-orchestration.md +49 -6
  110. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +1 -1
  111. package/templates/skills/business-analyse/references/ui-resource-cards.md +18 -18
  112. package/templates/skills/business-analyse/references/validate-incremental-html.md +2 -2
  113. package/templates/skills/business-analyse/references/validation-checklist.md +2 -2
  114. package/templates/skills/business-analyse/schemas/application-schema.json +4 -5
  115. package/templates/skills/business-analyse/schemas/project-schema.json +1 -6
  116. package/templates/skills/business-analyse/schemas/sections/metadata-schema.json +2 -3
  117. package/templates/skills/business-analyse/schemas/sections/specification-schema.json +4 -4
  118. package/templates/skills/business-analyse/steps/step-00-init.md +8 -17
  119. package/templates/skills/business-analyse/steps/step-01-cadrage.md +35 -198
  120. package/templates/skills/business-analyse/steps/step-01b-applications.md +16 -20
  121. package/templates/skills/business-analyse/steps/step-02-decomposition.md +1 -1
  122. package/templates/skills/business-analyse/steps/step-03a1-setup.md +4 -4
  123. package/templates/skills/business-analyse/steps/step-03a2-analysis.md +1 -1
  124. package/templates/skills/business-analyse/steps/step-03b-ui.md +4 -4
  125. package/templates/skills/business-analyse/steps/step-03c-compile.md +66 -140
  126. package/templates/skills/business-analyse/steps/step-03d-validate.md +2 -2
  127. package/templates/skills/business-analyse/steps/step-04a-collect.md +2 -2
  128. package/templates/skills/business-analyse/steps/step-04b-analyze.md +42 -160
  129. package/templates/skills/business-analyse/steps/step-04c-decide.md +1 -1
  130. package/templates/skills/business-analyse/steps/step-05a-handoff.md +74 -104
  131. package/templates/skills/business-analyse/steps/step-05b-deploy.md +13 -11
  132. package/templates/skills/business-analyse/steps/step-06-review.md +3 -3
  133. package/templates/skills/business-analyse/templates/tpl-frd.md +13 -13
  134. package/templates/skills/business-analyse/templates/tpl-handoff.md +12 -12
  135. package/templates/skills/business-analyse/templates/tpl-progress.md +1 -1
  136. package/templates/skills/business-analyse/templates-frd.md +25 -25
  137. package/templates/skills/business-analyse/templates-react.md +15 -21
  138. package/templates/skills/controller/SKILL.md +1 -1
  139. package/templates/skills/controller/postman-templates.md +1 -1
  140. package/templates/skills/controller/references/controller-code-templates.md +2 -2
  141. package/templates/skills/controller/references/mcp-scaffold-workflow.md +209 -0
  142. package/templates/skills/controller/references/permission-sync-templates.md +13 -16
  143. package/templates/skills/controller/steps/step-00-init.md +11 -11
  144. package/templates/skills/controller/steps/step-03-generate.md +64 -103
  145. package/templates/skills/controller/templates.md +67 -71
  146. package/templates/skills/debug/SKILL.md +13 -218
  147. package/templates/skills/debug/steps/step-00-init.md +57 -0
  148. package/templates/skills/debug/steps/step-01-analyze.md +219 -0
  149. package/templates/skills/debug/steps/step-02-resolve.md +85 -0
  150. package/templates/skills/documentation/SKILL.md +49 -345
  151. package/templates/skills/documentation/data-schema.md +11 -8
  152. package/templates/skills/documentation/steps/step-00-init.md +70 -0
  153. package/templates/skills/documentation/steps/step-01-scan.md +113 -0
  154. package/templates/skills/documentation/steps/step-02-generate.md +231 -0
  155. package/templates/skills/documentation/steps/step-03-validate.md +238 -0
  156. package/templates/skills/documentation/templates.md +480 -322
  157. package/templates/skills/efcore/SKILL.md +1 -1
  158. package/templates/skills/efcore/references/both-contexts.md +32 -0
  159. package/templates/skills/efcore/references/database-operations.md +67 -0
  160. package/templates/skills/efcore/references/destructive-operations.md +38 -0
  161. package/templates/skills/efcore/references/reset-operations.md +81 -0
  162. package/templates/skills/efcore/references/seed-methods.md +86 -0
  163. package/templates/skills/efcore/references/shared-init-functions.md +250 -0
  164. package/templates/skills/efcore/references/sql-objects-injection.md +61 -0
  165. package/templates/skills/efcore/references/troubleshooting.md +81 -0
  166. package/templates/skills/efcore/steps/db/step-deploy.md +1 -32
  167. package/templates/skills/efcore/steps/db/step-reset.md +7 -103
  168. package/templates/skills/efcore/steps/db/step-seed.md +10 -132
  169. package/templates/skills/efcore/steps/db/step-status.md +5 -44
  170. package/templates/skills/efcore/steps/migration/step-02-create.md +1 -14
  171. package/templates/skills/efcore/steps/migration/step-03-validate.md +8 -62
  172. package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +1 -57
  173. package/templates/skills/efcore/steps/shared/step-00-init.md +11 -254
  174. package/templates/skills/efcore/steps/squash/step-03-create.md +1 -58
  175. package/templates/skills/feature-full/SKILL.md +1 -1
  176. package/templates/skills/feature-full/steps/step-00-init.md +57 -0
  177. package/templates/skills/feature-full/steps/step-01-implementation.md +1 -1
  178. package/templates/skills/gitflow/SKILL.md +28 -5
  179. package/templates/skills/gitflow/_shared.md +109 -12
  180. package/templates/skills/gitflow/phases/abort.md +4 -0
  181. package/templates/skills/gitflow/phases/cleanup.md +4 -0
  182. package/templates/skills/gitflow/references/commit-message-generation.md +58 -0
  183. package/templates/skills/gitflow/references/commit-migration-validation.md +49 -0
  184. package/templates/skills/gitflow/references/finish-cleanup.md +55 -0
  185. package/templates/skills/gitflow/references/finish-version-bumping.md +45 -0
  186. package/templates/skills/gitflow/references/init-environment-detection.md +41 -0
  187. package/templates/skills/gitflow/references/init-questions.md +185 -0
  188. package/templates/skills/gitflow/references/init-structure-creation.md +75 -0
  189. package/templates/skills/gitflow/references/init-version-detection.md +21 -0
  190. package/templates/skills/gitflow/references/init-workspace-detection.md +43 -0
  191. package/templates/skills/gitflow/references/merge-ci-status.md +36 -0
  192. package/templates/skills/gitflow/references/merge-execution.md +62 -0
  193. package/templates/skills/gitflow/references/merge-pr-context.md +76 -0
  194. package/templates/skills/gitflow/references/pr-build-checks.md +60 -0
  195. package/templates/skills/gitflow/references/pr-generation.md +58 -0
  196. package/templates/skills/gitflow/references/start-branch-normalization.md +28 -0
  197. package/templates/skills/gitflow/references/start-worktree-creation.md +50 -0
  198. package/templates/skills/gitflow/references/sync-push-verify.md +44 -0
  199. package/templates/skills/gitflow/references/sync-rebase-conflicts.md +38 -0
  200. package/templates/skills/gitflow/steps/step-commit.md +12 -91
  201. package/templates/skills/gitflow/steps/step-finish.md +15 -159
  202. package/templates/skills/gitflow/steps/step-init.md +24 -326
  203. package/templates/skills/gitflow/steps/step-merge.md +17 -176
  204. package/templates/skills/gitflow/steps/step-pr.md +10 -116
  205. package/templates/skills/gitflow/steps/step-start.md +16 -109
  206. package/templates/skills/gitflow/steps/step-sync.md +6 -69
  207. package/templates/skills/ralph-loop/SKILL.md +6 -0
  208. package/templates/skills/ralph-loop/references/category-completeness.md +185 -0
  209. package/templates/skills/ralph-loop/references/compact-loop.md +1 -1
  210. package/templates/skills/ralph-loop/references/init-resume-recovery.md +127 -0
  211. package/templates/skills/ralph-loop/references/module-transition.md +151 -0
  212. package/templates/skills/ralph-loop/references/multi-module-queue.md +171 -0
  213. package/templates/skills/ralph-loop/references/parallel-execution.md +246 -0
  214. package/templates/skills/ralph-loop/references/task-transform-legacy.md +6 -9
  215. package/templates/skills/ralph-loop/references/team-orchestration.md +45 -3
  216. package/templates/skills/ralph-loop/steps/step-00-init.md +36 -109
  217. package/templates/skills/ralph-loop/steps/step-01-task.md +15 -163
  218. package/templates/skills/ralph-loop/steps/step-02-execute.md +8 -154
  219. package/templates/skills/ralph-loop/steps/step-04-check.md +20 -73
  220. package/templates/skills/review-code/references/owasp-api-top10.md +5 -5
  221. package/templates/skills/review-code/references/smartstack-conventions.md +568 -568
  222. package/templates/skills/validate-feature/references/api-smoke-tests.md +140 -0
  223. package/templates/skills/validate-feature/references/db-validation-checks.md +180 -0
  224. package/templates/skills/validate-feature/steps/step-01-compile.md +1 -3
  225. package/templates/skills/validate-feature/steps/step-04-api-smoke.md +34 -145
  226. package/templates/skills/validate-feature/steps/step-05-db-validation.md +74 -260
  227. package/templates/skills/workflow/SKILL.md +1 -1
  228. 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 (Context, Application, Module, Section).
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-context levels, find the parent entity GUID:
43
-
44
- | Level | Parent | Where to Find Parent GUID |
45
- |-------|--------|---------------------------|
46
- | application | context | `NavigationContextSeedData.cs` e.g. `PlatformContextId` |
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
- | context | (none) | - |
103
- | application | `ContextId` | NavigationContextSeedData.{Parent}Id |
104
- | module | `ApplicationId` | NavigationApplicationSeedData.{Parent}Id |
105
- | section | `ModuleId` | NavigationModuleSeedData.{Parent}Id |
106
-
107
- **Option B: Project uses inline HasData**
108
-
109
- If no SeedData class exists, add directly to `Navigation{Level}Configuration.cs`:
110
-
111
- ```csharp
112
- // In Configure method, add:
113
- builder.HasData(new {
114
- Id = Guid.Parse("{navigation_guid}"),
115
- // ... same properties as Option A
116
- });
117
- ```
118
-
119
- ## F5. Write Translation Entries
120
-
121
- Add 4 translation entries to `NavigationTranslationConfiguration.cs`:
122
-
123
- 1. Read the file to find the current highest `index` value
124
- 2. Continue from `index + 1`
125
- 3. Use the SAME `GenerateGuid` method already defined in the file:
126
-
127
- ```csharp
128
- // In GetSeedData() method, add at the end before return:
129
-
130
- // {level}: {code} translations
131
- translations.Add(new {
132
- Id = GenerateGuid(index++),
133
- EntityType = NavigationEntityType.{Level},
134
- EntityId = Navigation{Level}SeedData.{PascalCode}Id, // or Guid.Parse("{navigation_guid}")
135
- LanguageCode = "fr",
136
- Label = "{labels.fr}",
137
- Description = "{descriptions.fr}",
138
- CreatedAt = seedDate
139
- });
140
- translations.Add(new {
141
- Id = GenerateGuid(index++),
142
- EntityType = NavigationEntityType.{Level},
143
- EntityId = Navigation{Level}SeedData.{PascalCode}Id,
144
- LanguageCode = "en",
145
- Label = "{labels.en}",
146
- Description = "{descriptions.en}",
147
- CreatedAt = seedDate
148
- });
149
- translations.Add(new {
150
- Id = GenerateGuid(index++),
151
- EntityType = NavigationEntityType.{Level},
152
- EntityId = Navigation{Level}SeedData.{PascalCode}Id,
153
- LanguageCode = "it",
154
- Label = "{labels.it}",
155
- Description = "{descriptions.it}",
156
- CreatedAt = seedDate
157
- });
158
- translations.Add(new {
159
- Id = GenerateGuid(index++),
160
- EntityType = NavigationEntityType.{Level},
161
- EntityId = Navigation{Level}SeedData.{PascalCode}Id,
162
- LanguageCode = "de",
163
- Label = "{labels.de}",
164
- Description = "{descriptions.de}",
165
- CreatedAt = seedDate
166
- });
167
- ```
168
-
169
- ## F6. Store Result
170
-
171
- ```
172
- {navigation_guid} = [generated GUID]
173
- {seed_method} = "fallback" // Indicates MCP was not used
174
- ```
175
-
176
- ## F7. Validation Checklist
177
-
178
- Before proceeding, verify:
179
- - [ ] Deterministic GUID generated (not NewGuid())
180
- - [ ] 4 languages present (fr, en, it, de)
181
- - [ ] Translation index continues existing sequence (no gaps, no collisions)
182
- - [ ] Parent GUID correctly references existing entity
183
- - [ ] Route path matches `/{context}/{app}/{module}` pattern
184
- - [ ] DisplayOrder is consistent with existing entities
185
- - [ ] Code is WRITTEN to files, not just displayed
186
-
187
- ## F8. Present Summary
188
-
189
- ```markdown
190
- ## Navigation Seeds Generated (Fallback)
191
-
192
- **Entity:** {level} - {code}
193
- **GUID:** {navigation_guid}
194
- **Path:** {full_path}
195
-
196
- ### Files Updated
197
-
198
- 1. **Navigation{Level}SeedData.cs** (or Configuration.cs) - New entity entry
199
- 2. **NavigationTranslationConfiguration.cs** - 4 translation entries added
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(Guid.Empty);
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.ContextId, appEntry.Code, appEntry.Label,
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