@atlashub/smartstack-cli 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.documentation/agents.html +912 -0
- package/.documentation/apex.html +1014 -0
- package/.documentation/business-analyse.html +1074 -0
- package/.documentation/commands.html +676 -0
- package/.documentation/css/styles.css +2030 -0
- package/.documentation/efcore.html +2501 -0
- package/.documentation/gitflow.html +2053 -0
- package/.documentation/hooks.html +409 -0
- package/.documentation/index.html +319 -0
- package/.documentation/installation.html +458 -0
- package/.documentation/js/app.js +794 -0
- package/.documentation/test-web.html +509 -0
- package/README.md +90 -0
- package/config/default-config.json +86 -0
- package/config/settings.json +53 -0
- package/config/settings.local.example.json +16 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +38198 -0
- package/dist/index.js.map +1 -0
- package/package.json +86 -0
- package/templates/agents/action.md +36 -0
- package/templates/agents/efcore/conflicts.md +57 -0
- package/templates/agents/efcore/db-deploy.md +51 -0
- package/templates/agents/efcore/db-reset.md +59 -0
- package/templates/agents/efcore/db-seed.md +56 -0
- package/templates/agents/efcore/db-status.md +43 -0
- package/templates/agents/efcore/migration.md +85 -0
- package/templates/agents/efcore/rebase-snapshot.md +62 -0
- package/templates/agents/efcore/scan.md +60 -0
- package/templates/agents/efcore/squash.md +67 -0
- package/templates/agents/explore-codebase.md +65 -0
- package/templates/agents/explore-docs.md +97 -0
- package/templates/agents/fix-grammar.md +49 -0
- package/templates/agents/gitflow/abort.md +45 -0
- package/templates/agents/gitflow/cleanup.md +85 -0
- package/templates/agents/gitflow/commit.md +40 -0
- package/templates/agents/gitflow/exec.md +48 -0
- package/templates/agents/gitflow/finish.md +92 -0
- package/templates/agents/gitflow/init.md +139 -0
- package/templates/agents/gitflow/merge.md +62 -0
- package/templates/agents/gitflow/plan.md +42 -0
- package/templates/agents/gitflow/pr.md +78 -0
- package/templates/agents/gitflow/review.md +49 -0
- package/templates/agents/gitflow/start.md +61 -0
- package/templates/agents/gitflow/status.md +32 -0
- package/templates/agents/snipper.md +36 -0
- package/templates/agents/websearch.md +46 -0
- package/templates/commands/_resources/formatting-guide.md +124 -0
- package/templates/commands/ai-prompt.md +315 -0
- package/templates/commands/apex/1-analyze.md +100 -0
- package/templates/commands/apex/2-plan.md +145 -0
- package/templates/commands/apex/3-execute.md +171 -0
- package/templates/commands/apex/4-examine.md +116 -0
- package/templates/commands/apex/5-tasks.md +209 -0
- package/templates/commands/apex.md +76 -0
- package/templates/commands/application/create.md +362 -0
- package/templates/commands/application/templates-backend.md +463 -0
- package/templates/commands/application/templates-frontend.md +517 -0
- package/templates/commands/application/templates-i18n.md +478 -0
- package/templates/commands/application/templates-seed.md +362 -0
- package/templates/commands/application.md +303 -0
- package/templates/commands/business-analyse/1-init.md +269 -0
- package/templates/commands/business-analyse/2-discover.md +520 -0
- package/templates/commands/business-analyse/3-analyse.md +408 -0
- package/templates/commands/business-analyse/4-specify.md +598 -0
- package/templates/commands/business-analyse/5-validate.md +326 -0
- package/templates/commands/business-analyse/6-handoff.md +746 -0
- package/templates/commands/business-analyse/7-doc-html.md +602 -0
- package/templates/commands/business-analyse/bug.md +325 -0
- package/templates/commands/business-analyse/change-request.md +368 -0
- package/templates/commands/business-analyse/hotfix.md +200 -0
- package/templates/commands/business-analyse.md +559 -0
- package/templates/commands/controller/create.md +216 -0
- package/templates/commands/controller/postman-templates.md +528 -0
- package/templates/commands/controller/templates.md +600 -0
- package/templates/commands/controller.md +278 -0
- package/templates/commands/debug.md +95 -0
- package/templates/commands/documentation/module.md +202 -0
- package/templates/commands/documentation/templates.md +432 -0
- package/templates/commands/documentation.md +190 -0
- package/templates/commands/efcore/_env-check.md +153 -0
- package/templates/commands/efcore/conflicts.md +269 -0
- package/templates/commands/efcore/db-deploy.md +193 -0
- package/templates/commands/efcore/db-reset.md +426 -0
- package/templates/commands/efcore/db-seed.md +326 -0
- package/templates/commands/efcore/db-status.md +214 -0
- package/templates/commands/efcore/migration.md +388 -0
- package/templates/commands/efcore/rebase-snapshot.md +264 -0
- package/templates/commands/efcore/scan.md +202 -0
- package/templates/commands/efcore/squash.md +298 -0
- package/templates/commands/efcore.md +176 -0
- package/templates/commands/epct.md +69 -0
- package/templates/commands/explain.md +186 -0
- package/templates/commands/explore.md +45 -0
- package/templates/commands/feature-full.md +267 -0
- package/templates/commands/gitflow/1-init.md +1038 -0
- package/templates/commands/gitflow/10-start.md +768 -0
- package/templates/commands/gitflow/11-finish.md +323 -0
- package/templates/commands/gitflow/12-cleanup.md +276 -0
- package/templates/commands/gitflow/13-sync.md +216 -0
- package/templates/commands/gitflow/14-rebase.md +251 -0
- package/templates/commands/gitflow/2-status.md +167 -0
- package/templates/commands/gitflow/3-commit.md +194 -0
- package/templates/commands/gitflow/4-plan.md +145 -0
- package/templates/commands/gitflow/5-exec.md +147 -0
- package/templates/commands/gitflow/6-abort.md +344 -0
- package/templates/commands/gitflow/7-pull-request.md +226 -0
- package/templates/commands/gitflow/8-review.md +176 -0
- package/templates/commands/gitflow/9-merge.md +224 -0
- package/templates/commands/gitflow.md +128 -0
- package/templates/commands/implement.md +663 -0
- package/templates/commands/notification.md +129 -0
- package/templates/commands/oneshot.md +57 -0
- package/templates/commands/quick-search.md +72 -0
- package/templates/commands/review.md +106 -0
- package/templates/commands/utils/test-web-config.md +160 -0
- package/templates/commands/utils/test-web.md +151 -0
- package/templates/commands/workflow.md +193 -0
- package/templates/gitflow/config.json +138 -0
- package/templates/hooks/ef-migration-check.md +139 -0
- package/templates/hooks/hooks.json +15 -0
- package/templates/skills/ai-prompt/SKILL.md +778 -0
- package/templates/skills/application/SKILL.md +563 -0
- package/templates/skills/application/templates-backend.md +450 -0
- package/templates/skills/application/templates-frontend.md +531 -0
- package/templates/skills/application/templates-i18n.md +520 -0
- package/templates/skills/application/templates-seed.md +647 -0
- package/templates/skills/business-analyse/SKILL.md +191 -0
- package/templates/skills/business-analyse/questionnaire.md +283 -0
- package/templates/skills/business-analyse/templates-frd.md +477 -0
- package/templates/skills/business-analyse/templates-react.md +580 -0
- package/templates/skills/controller/SKILL.md +240 -0
- package/templates/skills/controller/postman-templates.md +614 -0
- package/templates/skills/controller/templates.md +1468 -0
- package/templates/skills/documentation/SKILL.md +133 -0
- package/templates/skills/documentation/templates.md +476 -0
- package/templates/skills/feature-full/SKILL.md +838 -0
- package/templates/skills/notification/SKILL.md +555 -0
- package/templates/skills/ui-components/SKILL.md +870 -0
- package/templates/skills/workflow/SKILL.md +582 -0
- package/templates/test-web/api-health.json +38 -0
- package/templates/test-web/minimal.json +19 -0
- package/templates/test-web/npm-package.json +46 -0
- package/templates/test-web/seo-check.json +54 -0
|
@@ -0,0 +1,362 @@
|
|
|
1
|
+
# Templates DB Seed - Application Skill
|
|
2
|
+
|
|
3
|
+
> Ces templates génèrent les seeds EF Core pour les entités de navigation et leurs traductions.
|
|
4
|
+
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
## RÈGLES DE GÉNÉRATION GUID (SÉCURITÉ CRITIQUE)
|
|
8
|
+
|
|
9
|
+
> **IMPORTANT:** Les GUIDs prévisibles sont une faille de sécurité.
|
|
10
|
+
> Utiliser TOUJOURS des GUIDs aléatoires générés cryptographiquement.
|
|
11
|
+
|
|
12
|
+
### ❌ INTERDIT - Pattern prévisible
|
|
13
|
+
|
|
14
|
+
```csharp
|
|
15
|
+
// JAMAIS FAIRE CECI - Pattern prévisible = faille de sécurité
|
|
16
|
+
private static Guid GenerateGuid(int index)
|
|
17
|
+
{
|
|
18
|
+
return Guid.Parse($"11111111-1111-1111-1111-{index:D12}");
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
### ✅ CORRECT - GUIDs aléatoires
|
|
23
|
+
|
|
24
|
+
```csharp
|
|
25
|
+
// Méthode 1: Génération à la volée (recommandé pour les seeds)
|
|
26
|
+
// Générer les GUIDs avec PowerShell: [guid]::NewGuid().ToString()
|
|
27
|
+
// Ou avec C#: Guid.NewGuid().ToString()
|
|
28
|
+
|
|
29
|
+
// Méthode 2: Cache pour éviter les doublons dans une même exécution
|
|
30
|
+
private static readonly Dictionary<string, Guid> _guidCache = new();
|
|
31
|
+
|
|
32
|
+
private static Guid GetOrCreateGuid(string key)
|
|
33
|
+
{
|
|
34
|
+
if (!_guidCache.TryGetValue(key, out var guid))
|
|
35
|
+
{
|
|
36
|
+
guid = Guid.NewGuid();
|
|
37
|
+
_guidCache[key] = guid;
|
|
38
|
+
}
|
|
39
|
+
return guid;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Usage:
|
|
43
|
+
var contextGuid = GetOrCreateGuid($"context.{contextCode}");
|
|
44
|
+
var appGuid = GetOrCreateGuid($"app.{contextCode}.{appCode}");
|
|
45
|
+
var moduleGuid = GetOrCreateGuid($"module.{contextCode}.{appCode}.{moduleCode}");
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Génération de GUIDs pour les Seeds
|
|
49
|
+
|
|
50
|
+
```powershell
|
|
51
|
+
# PowerShell (Windows) - Exécuter pour chaque entité
|
|
52
|
+
[guid]::NewGuid().ToString()
|
|
53
|
+
|
|
54
|
+
# Exemple de sortie:
|
|
55
|
+
# f7a3c2e8-9d1b-4e5f-a6c8-2b4d9f7e1a3c
|
|
56
|
+
# b2e8d4f6-1c9a-5b7e-8d3f-6a2c9e4b7d1f
|
|
57
|
+
# ... générer autant que nécessaire
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
---
|
|
61
|
+
|
|
62
|
+
## TEMPLATE: CONTEXT
|
|
63
|
+
|
|
64
|
+
> **RAPPEL:** Les contexts (platform, personal, business) sont prédéfinis.
|
|
65
|
+
> Ce template est fourni pour référence mais ne devrait PAS être utilisé pour créer de nouveaux contexts.
|
|
66
|
+
|
|
67
|
+
### Navigation Entity
|
|
68
|
+
|
|
69
|
+
```csharp
|
|
70
|
+
// Dans NavigationContextConfiguration.cs - HasData()
|
|
71
|
+
new {
|
|
72
|
+
Id = Guid.Parse("$CONTEXT_GUID"), // GUID aléatoire généré
|
|
73
|
+
Code = "$CODE", // ex: "business"
|
|
74
|
+
Label = "$LABEL_FR",
|
|
75
|
+
Description = "$DESC_FR",
|
|
76
|
+
Icon = "$ICON",
|
|
77
|
+
IconType = IconType.Lucide,
|
|
78
|
+
Route = "/$CODE",
|
|
79
|
+
DisplayOrder = $ORDER,
|
|
80
|
+
IsActive = true,
|
|
81
|
+
CreatedAt = seedDate
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Translations (4 langues)
|
|
86
|
+
|
|
87
|
+
```csharp
|
|
88
|
+
// Dans NavigationTranslationConfiguration.cs - GetSeedData()
|
|
89
|
+
// Utiliser des GUIDs aléatoires pour chaque traduction
|
|
90
|
+
|
|
91
|
+
translations.Add(new {
|
|
92
|
+
Id = Guid.Parse("$RANDOM_GUID_1"), // Générer avec [guid]::NewGuid()
|
|
93
|
+
EntityType = NavigationEntityType.Context,
|
|
94
|
+
EntityId = $CONTEXT_GUID,
|
|
95
|
+
LanguageCode = "fr",
|
|
96
|
+
Label = "$LABEL_FR",
|
|
97
|
+
Description = "$DESC_FR",
|
|
98
|
+
CreatedAt = seedDate
|
|
99
|
+
});
|
|
100
|
+
translations.Add(new {
|
|
101
|
+
Id = Guid.Parse("$RANDOM_GUID_2"), // Générer avec [guid]::NewGuid()
|
|
102
|
+
EntityType = NavigationEntityType.Context,
|
|
103
|
+
EntityId = $CONTEXT_GUID,
|
|
104
|
+
LanguageCode = "en",
|
|
105
|
+
Label = "$LABEL_EN",
|
|
106
|
+
Description = "$DESC_EN",
|
|
107
|
+
CreatedAt = seedDate
|
|
108
|
+
});
|
|
109
|
+
translations.Add(new {
|
|
110
|
+
Id = Guid.Parse("$RANDOM_GUID_3"), // Générer avec [guid]::NewGuid()
|
|
111
|
+
EntityType = NavigationEntityType.Context,
|
|
112
|
+
EntityId = $CONTEXT_GUID,
|
|
113
|
+
LanguageCode = "it",
|
|
114
|
+
Label = "$LABEL_IT",
|
|
115
|
+
Description = "$DESC_IT",
|
|
116
|
+
CreatedAt = seedDate
|
|
117
|
+
});
|
|
118
|
+
translations.Add(new {
|
|
119
|
+
Id = Guid.Parse("$RANDOM_GUID_4"), // Générer avec [guid]::NewGuid()
|
|
120
|
+
EntityType = NavigationEntityType.Context,
|
|
121
|
+
EntityId = $CONTEXT_GUID,
|
|
122
|
+
LanguageCode = "de",
|
|
123
|
+
Label = "$LABEL_DE",
|
|
124
|
+
Description = "$DESC_DE",
|
|
125
|
+
CreatedAt = seedDate
|
|
126
|
+
});
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
---
|
|
130
|
+
|
|
131
|
+
## TEMPLATE: APPLICATION
|
|
132
|
+
|
|
133
|
+
> **RAPPEL:** Les applications ne peuvent être créées que dans le context `business`.
|
|
134
|
+
|
|
135
|
+
### Navigation Entity
|
|
136
|
+
|
|
137
|
+
```csharp
|
|
138
|
+
// Dans NavigationApplicationConfiguration.cs - HasData()
|
|
139
|
+
new {
|
|
140
|
+
Id = Guid.Parse("$APP_GUID"), // GUID aléatoire
|
|
141
|
+
ContextId = Guid.Parse("$BUSINESS_CONTEXT_GUID"), // Toujours business
|
|
142
|
+
Code = "$CODE",
|
|
143
|
+
Label = "$LABEL_FR",
|
|
144
|
+
Description = "$DESC_FR",
|
|
145
|
+
Icon = "$ICON",
|
|
146
|
+
IconType = IconType.Lucide,
|
|
147
|
+
Route = "/business/$CODE", // Toujours sous /business/
|
|
148
|
+
DisplayOrder = $ORDER,
|
|
149
|
+
IsActive = true,
|
|
150
|
+
CreatedAt = seedDate
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Translations (4 langues)
|
|
155
|
+
|
|
156
|
+
```csharp
|
|
157
|
+
// Application translations - GUIDs aléatoires
|
|
158
|
+
translations.Add(new {
|
|
159
|
+
Id = Guid.Parse("$RANDOM_GUID_1"),
|
|
160
|
+
EntityType = NavigationEntityType.Application,
|
|
161
|
+
EntityId = $APP_GUID,
|
|
162
|
+
LanguageCode = "fr",
|
|
163
|
+
Label = "$LABEL_FR",
|
|
164
|
+
Description = "$DESC_FR",
|
|
165
|
+
CreatedAt = seedDate
|
|
166
|
+
});
|
|
167
|
+
// ... en, it, de avec GUIDs aléatoires
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## TEMPLATE: MODULE
|
|
173
|
+
|
|
174
|
+
### Navigation Entity
|
|
175
|
+
|
|
176
|
+
```csharp
|
|
177
|
+
// Dans NavigationModuleConfiguration.cs - HasData()
|
|
178
|
+
new {
|
|
179
|
+
Id = Guid.Parse("$MODULE_GUID"), // GUID aléatoire
|
|
180
|
+
ApplicationId = Guid.Parse("$APP_GUID"),
|
|
181
|
+
Code = "$CODE",
|
|
182
|
+
Label = "$LABEL_FR",
|
|
183
|
+
Description = "$DESC_FR",
|
|
184
|
+
Icon = "$ICON",
|
|
185
|
+
IconType = IconType.Lucide,
|
|
186
|
+
Route = "/business/$APP/$CODE",
|
|
187
|
+
DisplayOrder = $ORDER,
|
|
188
|
+
IsActive = true,
|
|
189
|
+
CreatedAt = seedDate
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
### Translations (4 langues)
|
|
194
|
+
|
|
195
|
+
```csharp
|
|
196
|
+
// Module translations - GUIDs aléatoires
|
|
197
|
+
translations.Add(new {
|
|
198
|
+
Id = Guid.Parse("$RANDOM_GUID_1"),
|
|
199
|
+
EntityType = NavigationEntityType.Module,
|
|
200
|
+
EntityId = $MODULE_GUID,
|
|
201
|
+
LanguageCode = "fr",
|
|
202
|
+
Label = "$LABEL_FR",
|
|
203
|
+
Description = "$DESC_FR",
|
|
204
|
+
CreatedAt = seedDate
|
|
205
|
+
});
|
|
206
|
+
// ... en, it, de
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## TEMPLATE: SECTION
|
|
212
|
+
|
|
213
|
+
### Navigation Entity
|
|
214
|
+
|
|
215
|
+
```csharp
|
|
216
|
+
// Dans NavigationSectionConfiguration.cs - HasData()
|
|
217
|
+
new {
|
|
218
|
+
Id = Guid.Parse("$SECTION_GUID"), // GUID aléatoire
|
|
219
|
+
ModuleId = Guid.Parse("$MODULE_GUID"),
|
|
220
|
+
Code = "$CODE",
|
|
221
|
+
Label = "$LABEL_FR",
|
|
222
|
+
Description = "$DESC_FR",
|
|
223
|
+
Icon = "$ICON",
|
|
224
|
+
IconType = IconType.Lucide,
|
|
225
|
+
Route = "/business/$APP/$MODULE/$CODE",
|
|
226
|
+
DisplayOrder = $ORDER,
|
|
227
|
+
IsActive = true,
|
|
228
|
+
CreatedAt = seedDate
|
|
229
|
+
}
|
|
230
|
+
```
|
|
231
|
+
|
|
232
|
+
---
|
|
233
|
+
|
|
234
|
+
## TEMPLATE: PERMISSIONS SEED
|
|
235
|
+
|
|
236
|
+
### Permission Entity
|
|
237
|
+
|
|
238
|
+
```csharp
|
|
239
|
+
// Dans PermissionConfiguration.cs - HasData()
|
|
240
|
+
// Pour chaque action CRUD + assign + execute
|
|
241
|
+
// TOUS les GUIDs doivent être aléatoires
|
|
242
|
+
|
|
243
|
+
var seedDate = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc);
|
|
244
|
+
|
|
245
|
+
// Read
|
|
246
|
+
new {
|
|
247
|
+
Id = Guid.Parse("$RANDOM_GUID_READ"), // Générer avec [guid]::NewGuid()
|
|
248
|
+
Code = "business.$APP.$MODULE.read",
|
|
249
|
+
Name = "View $MODULE_LABEL",
|
|
250
|
+
Description = "View $MODULE_LABEL list and details",
|
|
251
|
+
Category = "business.$APP.$MODULE",
|
|
252
|
+
CreatedAt = seedDate
|
|
253
|
+
},
|
|
254
|
+
// Create
|
|
255
|
+
new {
|
|
256
|
+
Id = Guid.Parse("$RANDOM_GUID_CREATE"),
|
|
257
|
+
Code = "business.$APP.$MODULE.create",
|
|
258
|
+
Name = "Create $MODULE_LABEL",
|
|
259
|
+
Description = "Create new $MODULE_LABEL",
|
|
260
|
+
Category = "business.$APP.$MODULE",
|
|
261
|
+
CreatedAt = seedDate
|
|
262
|
+
},
|
|
263
|
+
// Update
|
|
264
|
+
new {
|
|
265
|
+
Id = Guid.Parse("$RANDOM_GUID_UPDATE"),
|
|
266
|
+
Code = "business.$APP.$MODULE.update",
|
|
267
|
+
Name = "Update $MODULE_LABEL",
|
|
268
|
+
Description = "Modify existing $MODULE_LABEL",
|
|
269
|
+
Category = "business.$APP.$MODULE",
|
|
270
|
+
CreatedAt = seedDate
|
|
271
|
+
},
|
|
272
|
+
// Delete
|
|
273
|
+
new {
|
|
274
|
+
Id = Guid.Parse("$RANDOM_GUID_DELETE"),
|
|
275
|
+
Code = "business.$APP.$MODULE.delete",
|
|
276
|
+
Name = "Delete $MODULE_LABEL",
|
|
277
|
+
Description = "Remove $MODULE_LABEL",
|
|
278
|
+
Category = "business.$APP.$MODULE",
|
|
279
|
+
CreatedAt = seedDate
|
|
280
|
+
}
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### RolePermission Seed (Default Roles)
|
|
284
|
+
|
|
285
|
+
```csharp
|
|
286
|
+
// Dans RolePermissionConfiguration.cs - HasData()
|
|
287
|
+
// SuperAdmin gets all permissions automatically (wildcard)
|
|
288
|
+
|
|
289
|
+
// BusinessAdmin - gets all business permissions
|
|
290
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_READ_GUID },
|
|
291
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_CREATE_GUID },
|
|
292
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_UPDATE_GUID },
|
|
293
|
+
new { RoleId = Guid.Parse("...BusinessAdminRoleId..."), PermissionId = $PERM_DELETE_GUID },
|
|
294
|
+
|
|
295
|
+
// StandardUser - read only by default
|
|
296
|
+
new { RoleId = Guid.Parse("...StandardUserRoleId..."), PermissionId = $PERM_READ_GUID }
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
---
|
|
300
|
+
|
|
301
|
+
## EXEMPLE COMPLET: Module "Leads" dans "Business > CRM"
|
|
302
|
+
|
|
303
|
+
### Variables
|
|
304
|
+
|
|
305
|
+
```
|
|
306
|
+
$CONTEXT = business (prédéfini)
|
|
307
|
+
$APP = crm
|
|
308
|
+
$APP_GUID = (générer avec [guid]::NewGuid())
|
|
309
|
+
$MODULE = leads
|
|
310
|
+
$MODULE_GUID = (générer avec [guid]::NewGuid())
|
|
311
|
+
|
|
312
|
+
$LABEL_FR = Prospects
|
|
313
|
+
$LABEL_EN = Leads
|
|
314
|
+
$LABEL_IT = Contatti
|
|
315
|
+
$LABEL_DE = Leads
|
|
316
|
+
|
|
317
|
+
$DESC_FR = Gestion des prospects
|
|
318
|
+
$DESC_EN = Lead management
|
|
319
|
+
$DESC_IT = Gestione contatti
|
|
320
|
+
$DESC_DE = Lead-Verwaltung
|
|
321
|
+
|
|
322
|
+
$ICON = Users
|
|
323
|
+
$ORDER = 1
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### Fichiers à modifier
|
|
327
|
+
|
|
328
|
+
1. `NavigationApplicationConfiguration.cs` - Ajouter application CRM (si nouveau)
|
|
329
|
+
2. `NavigationModuleConfiguration.cs` - Ajouter module Leads
|
|
330
|
+
3. `NavigationTranslationConfiguration.cs` - Ajouter 4 traductions × nombre d'entités
|
|
331
|
+
4. `PermissionConfiguration.cs` - Ajouter permissions CRUD
|
|
332
|
+
5. `RolePermissionConfiguration.cs` - Assigner aux rôles par défaut
|
|
333
|
+
|
|
334
|
+
---
|
|
335
|
+
|
|
336
|
+
## CHECKLIST SEED
|
|
337
|
+
|
|
338
|
+
| Vérification | Status |
|
|
339
|
+
|--------------|--------|
|
|
340
|
+
| ☐ GUIDs aléatoires (PAS de pattern prévisible) | |
|
|
341
|
+
| ☐ Context = "business" (pas platform/personal) | |
|
|
342
|
+
| ☐ 4 langues pour chaque entité | |
|
|
343
|
+
| ☐ Route alignée avec permission path | |
|
|
344
|
+
| ☐ DisplayOrder cohérent | |
|
|
345
|
+
| ☐ Permissions CRUD créées | |
|
|
346
|
+
| ☐ RolePermissions assignés | |
|
|
347
|
+
|
|
348
|
+
---
|
|
349
|
+
|
|
350
|
+
## VALIDATION GUID AVANT COMMIT
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
# Vérifier qu'aucun GUID prévisible n'a été utilisé
|
|
354
|
+
# Ces patterns sont INTERDITS:
|
|
355
|
+
|
|
356
|
+
grep -r "11111111-1111" . # Pattern 1111...
|
|
357
|
+
grep -r "00000000-0000" . # Pattern 0000...
|
|
358
|
+
grep -r "aaaaaaaa-aaaa" . # Pattern répétitif
|
|
359
|
+
grep -r "{index:D12}" . # Génération séquentielle
|
|
360
|
+
|
|
361
|
+
# Si un de ces patterns est trouvé → CORRIGER avant commit
|
|
362
|
+
```
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
# /application - Skill Application SmartStack
|
|
2
|
+
|
|
3
|
+
> **Synergie Skill/Commande:**
|
|
4
|
+
> - **Skill** (`.claude/skills/application/`) → Invocation automatique par Claude
|
|
5
|
+
> - **Commande** (`/application:create`) → Invocation manuelle par l'utilisateur
|
|
6
|
+
> - Templates partagés dans `.claude/skills/application/templates-*.md`
|
|
7
|
+
|
|
8
|
+
---
|
|
9
|
+
|
|
10
|
+
## ARGUMENTS
|
|
11
|
+
|
|
12
|
+
```
|
|
13
|
+
/application:create <level> <parent> <code> [options]
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
| Variable | Description | Valeurs |
|
|
17
|
+
|----------|-------------|---------|
|
|
18
|
+
| `level` | Niveau de navigation | `context`, `application`, `module`, `section` |
|
|
19
|
+
| `parent` | Code du parent | Ex: `platform`, `platform.administration` |
|
|
20
|
+
| `code` | Code de l'entité | Ex: `products`, `crm`, `erp` |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## PHASE 0: VALIDATION CONTEXTES RÉSERVÉS (CRITIQUE)
|
|
25
|
+
|
|
26
|
+
> **SÉCURITÉ:** Cette phase est OBLIGATOIRE avant toute génération.
|
|
27
|
+
> Elle protège les contextes core de SmartStack contre les modifications non autorisées.
|
|
28
|
+
|
|
29
|
+
### Règles de Protection
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
┌─────────────────────────────────────────────────────────────────────────────┐
|
|
33
|
+
│ CONTEXTES RÉSERVÉS (CORE SMARTSTACK) │
|
|
34
|
+
├─────────────────────────────────────────────────────────────────────────────┤
|
|
35
|
+
│ │
|
|
36
|
+
│ 🔒 platform → Administration système, NE PAS MODIFIER │
|
|
37
|
+
│ 🔒 personal → Espace personnel utilisateur, NE PAS MODIFIER │
|
|
38
|
+
│ ✅ business → Applications métier client, ZONE LIBRE │
|
|
39
|
+
│ │
|
|
40
|
+
│ APPLICATIONS RÉSERVÉES: │
|
|
41
|
+
│ 🔒 platform.administration → Admin core SmartStack │
|
|
42
|
+
│ 🔒 personal.myspace → Espace perso core SmartStack │
|
|
43
|
+
│ │
|
|
44
|
+
└─────────────────────────────────────────────────────────────────────────────┘
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
### Validation Automatique
|
|
48
|
+
|
|
49
|
+
```
|
|
50
|
+
AVANT toute génération, VÉRIFIER:
|
|
51
|
+
|
|
52
|
+
1. SI $LEVEL = "context":
|
|
53
|
+
RESERVED_CONTEXTS = ["platform", "personal", "business", "system"]
|
|
54
|
+
SI $CODE IN RESERVED_CONTEXTS:
|
|
55
|
+
❌ ERREUR: "Les contextes sont prédéfinis et ne peuvent pas être créés."
|
|
56
|
+
ABORT
|
|
57
|
+
|
|
58
|
+
2. SI $LEVEL = "application":
|
|
59
|
+
SI $PARENT IN ["platform", "personal"]:
|
|
60
|
+
❌ ERREUR: "Le context '$PARENT' est réservé au core SmartStack."
|
|
61
|
+
❌ ERREUR: "Utilisez le context 'business' pour vos applications métier."
|
|
62
|
+
SUGGÉRER: "/application:create application business $CODE"
|
|
63
|
+
ABORT
|
|
64
|
+
|
|
65
|
+
3. SI $LEVEL = "module":
|
|
66
|
+
SI $PARENT commence par "platform." OU "personal.":
|
|
67
|
+
❌ ERREUR: "Les modules core ne peuvent pas être modifiés."
|
|
68
|
+
❌ ERREUR: "Créez vos modules dans 'business.*'"
|
|
69
|
+
ABORT
|
|
70
|
+
|
|
71
|
+
4. SI tout est OK:
|
|
72
|
+
✅ Continuer vers PHASE 1
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
### Messages d'Erreur Standards
|
|
76
|
+
|
|
77
|
+
| Situation | Message |
|
|
78
|
+
|-----------|---------|
|
|
79
|
+
| Création context réservé | "Les contextes sont prédéfinis (platform, personal, business). Créez vos applications dans 'business'." |
|
|
80
|
+
| Application dans platform | "Le context 'platform' est réservé à l'administration SmartStack. Utilisez 'business' pour vos applications métier." |
|
|
81
|
+
| Application dans personal | "Le context 'personal' est réservé aux fonctionnalités utilisateur core. Utilisez 'business'." |
|
|
82
|
+
| Module dans platform.* | "Les modules platform.* sont gérés par SmartStack. Créez vos modules dans business.*" |
|
|
83
|
+
|
|
84
|
+
---
|
|
85
|
+
|
|
86
|
+
## PHASE 1: PARSING & VALIDATION
|
|
87
|
+
|
|
88
|
+
```
|
|
89
|
+
1. EXTRAIRE level, parent, code des arguments
|
|
90
|
+
2. EXÉCUTER PHASE 0 (validation contextes)
|
|
91
|
+
3. SI validation OK → VALIDER que le parent existe (sauf pour context)
|
|
92
|
+
4. DÉTECTER le context racine
|
|
93
|
+
5. GÉNÉRER les chemins de route et permission
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
## PHASE 2: COLLECTE DES TRADUCTIONS
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
AskUserQuestion({
|
|
102
|
+
questions: [
|
|
103
|
+
{
|
|
104
|
+
header: "Labels FR",
|
|
105
|
+
question: "Libellés en français ?",
|
|
106
|
+
options: [
|
|
107
|
+
{ label: "$CODE_PASCAL", description: "Label par défaut" }
|
|
108
|
+
]
|
|
109
|
+
},
|
|
110
|
+
{
|
|
111
|
+
header: "Icône",
|
|
112
|
+
question: "Quelle icône Lucide ?",
|
|
113
|
+
options: [
|
|
114
|
+
{ label: "Package", description: "Icône produit" },
|
|
115
|
+
{ label: "Folder", description: "Icône générique" },
|
|
116
|
+
{ label: "Settings", description: "Icône configuration" }
|
|
117
|
+
]
|
|
118
|
+
}
|
|
119
|
+
]
|
|
120
|
+
})
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## PHASE 3: GÉNÉRATION DB SEED
|
|
126
|
+
|
|
127
|
+
| Fichier | Action |
|
|
128
|
+
|---------|--------|
|
|
129
|
+
| `Navigation{Level}Configuration.cs` | Ajouter entité |
|
|
130
|
+
| `NavigationTranslationConfiguration.cs` | Ajouter 4 traductions |
|
|
131
|
+
| `PermissionConfiguration.cs` | Ajouter permissions CRUD |
|
|
132
|
+
| `RolePermissionConfiguration.cs` | Assigner aux rôles |
|
|
133
|
+
|
|
134
|
+
**Templates:** → `.claude/skills/application/templates-seed.md`
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## PHASE 4: GÉNÉRATION BACKEND
|
|
139
|
+
|
|
140
|
+
| Fichier | Action |
|
|
141
|
+
|---------|--------|
|
|
142
|
+
| `Permissions.cs` | Ajouter classe permissions |
|
|
143
|
+
| `I{Entity}Service.cs` | Créer interface |
|
|
144
|
+
| `{Entity}Service.cs` | Créer implémentation |
|
|
145
|
+
| `{Entity}Dto.cs` | Créer DTOs |
|
|
146
|
+
| `{Entity}.cs` | Créer entité Domain |
|
|
147
|
+
| `{Entity}Configuration.cs` | Créer config EF |
|
|
148
|
+
| `IApplicationDbContext.cs` | Ajouter DbSet |
|
|
149
|
+
| `DependencyInjection.cs` | Enregistrer service |
|
|
150
|
+
|
|
151
|
+
**Templates:** → `.claude/skills/application/templates-backend.md`
|
|
152
|
+
|
|
153
|
+
**Chaîner:** → `/controller:create $AREA $MODULE $ENTITY`
|
|
154
|
+
|
|
155
|
+
---
|
|
156
|
+
|
|
157
|
+
## PHASE 5: GÉNÉRATION FRONTEND
|
|
158
|
+
|
|
159
|
+
| Fichier | Action |
|
|
160
|
+
|---------|--------|
|
|
161
|
+
| `{Module}Page.tsx` | Créer page principale |
|
|
162
|
+
| `{Module}ListView.tsx` | Créer composant liste |
|
|
163
|
+
| `use{Module}Preferences.ts` | Créer hook préférences |
|
|
164
|
+
| `{module}Api.ts` | Créer service API |
|
|
165
|
+
| `App.tsx` | Ajouter routes |
|
|
166
|
+
|
|
167
|
+
**Templates:** → `.claude/skills/application/templates-frontend.md`
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## PHASE 6: GÉNÉRATION I18N
|
|
172
|
+
|
|
173
|
+
| Fichier | Action |
|
|
174
|
+
|---------|--------|
|
|
175
|
+
| `fr/{module}.json` | Créer traductions FR |
|
|
176
|
+
| `en/{module}.json` | Créer traductions EN |
|
|
177
|
+
| `it/{module}.json` | Créer traductions IT |
|
|
178
|
+
| `de/{module}.json` | Créer traductions DE |
|
|
179
|
+
| `navigation.json` (×4) | Mettre à jour |
|
|
180
|
+
| `i18n/index.ts` | Enregistrer namespace |
|
|
181
|
+
|
|
182
|
+
**Templates:** → `.claude/skills/application/templates-i18n.md`
|
|
183
|
+
|
|
184
|
+
---
|
|
185
|
+
|
|
186
|
+
## PHASE 7: MIGRATION
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
# Chaîner automatiquement
|
|
190
|
+
/efcore:migration Add{Level}{Code}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
|
|
195
|
+
## PHASE 8: VALIDATION
|
|
196
|
+
|
|
197
|
+
```bash
|
|
198
|
+
# Backend
|
|
199
|
+
dotnet build
|
|
200
|
+
dotnet test
|
|
201
|
+
|
|
202
|
+
# Frontend
|
|
203
|
+
cd web/smartstack-web
|
|
204
|
+
npm run build
|
|
205
|
+
npm run lint
|
|
206
|
+
npm run test
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
---
|
|
210
|
+
|
|
211
|
+
## PHASE 9: RÉSUMÉ
|
|
212
|
+
|
|
213
|
+
```markdown
|
|
214
|
+
## ✅ Création terminée
|
|
215
|
+
|
|
216
|
+
### Fichiers créés
|
|
217
|
+
- Backend: X fichiers
|
|
218
|
+
- Frontend: X fichiers
|
|
219
|
+
- i18n: 4 langues
|
|
220
|
+
|
|
221
|
+
### Navigation
|
|
222
|
+
- Route: /$ROUTE
|
|
223
|
+
- Permission: $PERMISSION_PATH.*
|
|
224
|
+
|
|
225
|
+
### Prochaines étapes
|
|
226
|
+
1. Vérifier les seeds générés
|
|
227
|
+
2. Tester avec Swagger
|
|
228
|
+
3. Valider l'UI
|
|
229
|
+
|
|
230
|
+
### Commandes utiles
|
|
231
|
+
- `dotnet ef database update` - Appliquer migration
|
|
232
|
+
- `npm run dev` - Lancer frontend
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
---
|
|
236
|
+
|
|
237
|
+
## RÈGLES ABSOLUES
|
|
238
|
+
|
|
239
|
+
1. **TOUJOURS** exécuter PHASE 0 (validation contextes) en premier
|
|
240
|
+
2. **TOUJOURS** 4 langues (FR, EN, IT, DE)
|
|
241
|
+
3. **TOUJOURS** respecter l'architecture en couches
|
|
242
|
+
4. **TOUJOURS** implémenter les préférences utilisateur (template complet)
|
|
243
|
+
5. **TOUJOURS** chaîner avec `/controller:create` et `/efcore:migration`
|
|
244
|
+
6. **TOUJOURS** utiliser des GUIDs aléatoires (voir templates-seed.md)
|
|
245
|
+
7. **JAMAIS** de violation d'architecture (WEB → Infrastructure)
|
|
246
|
+
8. **JAMAIS** de traduction manquante
|
|
247
|
+
9. **JAMAIS** de création dans les contextes réservés (platform, personal)
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## EXEMPLES VALIDES ET INVALIDES
|
|
252
|
+
|
|
253
|
+
### ✅ VALIDE - Applications métier client
|
|
254
|
+
|
|
255
|
+
```bash
|
|
256
|
+
# Créer une application dans business
|
|
257
|
+
/application:create application business crm
|
|
258
|
+
|
|
259
|
+
# Créer un module dans business.crm
|
|
260
|
+
/application:create module business.crm leads
|
|
261
|
+
|
|
262
|
+
# Créer une section dans business.crm.leads
|
|
263
|
+
/application:create section business.crm.leads import
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
### ❌ INVALIDE - Tentatives sur contextes réservés
|
|
267
|
+
|
|
268
|
+
```bash
|
|
269
|
+
# ERREUR: Création de context
|
|
270
|
+
/application:create context _ erp
|
|
271
|
+
→ "Les contextes sont prédéfinis. Utilisez 'business'."
|
|
272
|
+
|
|
273
|
+
# ERREUR: Application dans platform
|
|
274
|
+
/application:create application platform sales
|
|
275
|
+
→ "Le context 'platform' est réservé. Utilisez 'business'."
|
|
276
|
+
|
|
277
|
+
# ERREUR: Module dans platform.administration
|
|
278
|
+
/application:create module platform.administration custom
|
|
279
|
+
→ "Les modules core ne peuvent pas être modifiés."
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## MAPPING NIVEAU → GÉNÉRATION
|
|
285
|
+
|
|
286
|
+
| Niveau | DB Seed | Backend | Frontend | i18n |
|
|
287
|
+
|--------|---------|---------|----------|------|
|
|
288
|
+
| Context | ❌ (prédéfini) | ❌ | ❌ | ❌ |
|
|
289
|
+
| Application | ✅ | ❌ | ✅ (layout) | ✅ (nav) |
|
|
290
|
+
| Module | ✅ | ✅ (complet) | ✅ (complet) | ✅ (complet) |
|
|
291
|
+
| Section | ✅ | ✅ (optionnel) | ✅ (tabs) | ✅ (nav) |
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## SOURCES DE DONNÉES
|
|
296
|
+
|
|
297
|
+
| Donnée | Source |
|
|
298
|
+
|--------|--------|
|
|
299
|
+
| Navigation entities | `src/SmartStack.Infrastructure/Persistence/Configurations/Navigation/` |
|
|
300
|
+
| Translations | `NavigationTranslationConfiguration.cs` |
|
|
301
|
+
| Permissions | `src/SmartStack.Application/Common/Authorization/Permissions.cs` |
|
|
302
|
+
| i18n locales | `web/smartstack-web/src/i18n/locales/` |
|
|
303
|
+
| Routes | `web/smartstack-web/src/App.tsx` |
|