@atlashub/smartstack-cli 1.5.0 → 1.5.2
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 +920 -916
- package/.documentation/apex.html +1022 -1018
- package/.documentation/business-analyse.html +1505 -1501
- package/.documentation/commands.html +684 -680
- package/.documentation/css/styles.css +2168 -2168
- package/.documentation/efcore.html +2509 -2505
- package/.documentation/gitflow.html +2622 -2618
- package/.documentation/hooks.html +417 -413
- package/.documentation/index.html +327 -323
- package/.documentation/init.html +565 -0
- package/.documentation/installation.html +548 -462
- package/.documentation/js/app.js +794 -794
- package/.documentation/ralph-loop.html +534 -530
- package/.documentation/test-web.html +517 -513
- package/config/default-config.json +86 -86
- package/config/settings.json +53 -53
- package/config/settings.local.example.json +16 -16
- package/dist/index.js +18 -8
- package/dist/index.js.map +1 -1
- package/package.json +88 -88
- package/templates/agents/action.md +36 -36
- package/templates/agents/efcore/conflicts.md +84 -84
- package/templates/agents/efcore/db-deploy.md +51 -51
- package/templates/agents/efcore/db-reset.md +59 -59
- package/templates/agents/efcore/db-seed.md +56 -56
- package/templates/agents/efcore/db-status.md +64 -64
- package/templates/agents/efcore/migration.md +85 -85
- package/templates/agents/efcore/rebase-snapshot.md +62 -62
- package/templates/agents/efcore/scan.md +90 -90
- package/templates/agents/efcore/squash.md +67 -67
- package/templates/agents/explore-codebase.md +65 -65
- package/templates/agents/explore-docs.md +97 -97
- package/templates/agents/fix-grammar.md +49 -49
- package/templates/agents/gitflow/abort.md +45 -45
- package/templates/agents/gitflow/cleanup.md +85 -85
- package/templates/agents/gitflow/commit.md +40 -40
- package/templates/agents/gitflow/exec.md +48 -48
- package/templates/agents/gitflow/finish.md +92 -92
- package/templates/agents/gitflow/init.md +139 -139
- package/templates/agents/gitflow/merge.md +62 -62
- package/templates/agents/gitflow/plan.md +42 -42
- package/templates/agents/gitflow/pr.md +78 -78
- package/templates/agents/gitflow/review.md +49 -49
- package/templates/agents/gitflow/start.md +61 -61
- package/templates/agents/gitflow/status.md +32 -32
- package/templates/agents/snipper.md +36 -36
- package/templates/agents/websearch.md +46 -46
- package/templates/commands/_resources/formatting-guide.md +124 -124
- package/templates/commands/ai-prompt.md +315 -315
- package/templates/commands/apex/1-analyze.md +100 -100
- package/templates/commands/apex/2-plan.md +145 -145
- package/templates/commands/apex/3-execute.md +171 -171
- package/templates/commands/apex/4-examine.md +116 -116
- package/templates/commands/apex/5-tasks.md +209 -209
- package/templates/commands/apex.md +76 -76
- package/templates/commands/application/create.md +362 -362
- package/templates/commands/application/templates-backend.md +463 -463
- package/templates/commands/application/templates-frontend.md +517 -517
- package/templates/commands/application/templates-i18n.md +478 -478
- package/templates/commands/application/templates-seed.md +362 -362
- package/templates/commands/application.md +303 -303
- package/templates/commands/business-analyse/0-orchestrate.md +640 -640
- package/templates/commands/business-analyse/1-init.md +269 -269
- package/templates/commands/business-analyse/2-discover.md +520 -520
- package/templates/commands/business-analyse/3-analyse.md +408 -408
- package/templates/commands/business-analyse/4-specify.md +598 -598
- package/templates/commands/business-analyse/5-validate.md +326 -326
- package/templates/commands/business-analyse/6-handoff.md +746 -746
- package/templates/commands/business-analyse/7-doc-html.md +602 -602
- package/templates/commands/business-analyse/bug.md +325 -325
- package/templates/commands/business-analyse/change-request.md +368 -368
- package/templates/commands/business-analyse/hotfix.md +200 -200
- package/templates/commands/business-analyse.md +640 -640
- package/templates/commands/controller/create.md +216 -216
- package/templates/commands/controller/postman-templates.md +528 -528
- package/templates/commands/controller/templates.md +600 -600
- package/templates/commands/controller.md +337 -337
- package/templates/commands/create/agent.md +138 -138
- package/templates/commands/create/command.md +166 -166
- package/templates/commands/create/hook.md +234 -234
- package/templates/commands/create/plugin.md +329 -329
- package/templates/commands/create/project.md +507 -507
- package/templates/commands/create/skill.md +199 -199
- package/templates/commands/create.md +220 -220
- package/templates/commands/debug.md +95 -95
- package/templates/commands/documentation/module.md +202 -202
- package/templates/commands/documentation/templates.md +432 -432
- package/templates/commands/documentation.md +190 -190
- package/templates/commands/efcore/_env-check.md +153 -153
- package/templates/commands/efcore/conflicts.md +186 -186
- package/templates/commands/efcore/db-deploy.md +193 -193
- package/templates/commands/efcore/db-reset.md +426 -426
- package/templates/commands/efcore/db-seed.md +326 -326
- package/templates/commands/efcore/db-status.md +226 -226
- package/templates/commands/efcore/migration.md +400 -400
- package/templates/commands/efcore/rebase-snapshot.md +264 -264
- package/templates/commands/efcore/scan.md +198 -198
- package/templates/commands/efcore/squash.md +298 -298
- package/templates/commands/efcore.md +224 -224
- package/templates/commands/epct.md +69 -69
- package/templates/commands/explain.md +186 -186
- package/templates/commands/explore.md +45 -45
- package/templates/commands/feature-full.md +267 -267
- package/templates/commands/gitflow/1-init.md +1038 -1038
- package/templates/commands/gitflow/10-start.md +768 -768
- package/templates/commands/gitflow/11-finish.md +457 -457
- package/templates/commands/gitflow/12-cleanup.md +276 -276
- package/templates/commands/gitflow/13-sync.md +216 -216
- package/templates/commands/gitflow/14-rebase.md +251 -251
- package/templates/commands/gitflow/2-status.md +277 -277
- package/templates/commands/gitflow/3-commit.md +344 -344
- package/templates/commands/gitflow/4-plan.md +145 -145
- package/templates/commands/gitflow/5-exec.md +147 -147
- package/templates/commands/gitflow/6-abort.md +344 -344
- package/templates/commands/gitflow/7-pull-request.md +453 -355
- package/templates/commands/gitflow/8-review.md +240 -176
- package/templates/commands/gitflow/9-merge.md +451 -365
- package/templates/commands/gitflow.md +128 -128
- package/templates/commands/implement.md +663 -663
- package/templates/commands/init.md +567 -562
- package/templates/commands/mcp-integration.md +330 -330
- package/templates/commands/notification.md +129 -129
- package/templates/commands/oneshot.md +57 -57
- package/templates/commands/quick-search.md +72 -72
- package/templates/commands/ralph-loop/cancel-ralph.md +18 -18
- package/templates/commands/ralph-loop/help.md +126 -126
- package/templates/commands/ralph-loop/ralph-loop.md +18 -18
- package/templates/commands/review.md +106 -106
- package/templates/commands/utils/test-web-config.md +160 -160
- package/templates/commands/utils/test-web.md +151 -151
- package/templates/commands/validate.md +233 -233
- package/templates/commands/workflow.md +193 -193
- package/templates/gitflow/config.json +138 -138
- package/templates/hooks/ef-migration-check.md +139 -139
- package/templates/hooks/hooks.json +25 -25
- package/templates/hooks/stop-hook.sh +177 -177
- package/templates/skills/ai-prompt/SKILL.md +778 -778
- package/templates/skills/application/SKILL.md +563 -563
- package/templates/skills/application/templates-backend.md +450 -450
- package/templates/skills/application/templates-frontend.md +531 -531
- package/templates/skills/application/templates-i18n.md +520 -520
- package/templates/skills/application/templates-seed.md +647 -647
- package/templates/skills/business-analyse/SKILL.md +191 -191
- package/templates/skills/business-analyse/questionnaire.md +283 -283
- package/templates/skills/business-analyse/templates-frd.md +477 -477
- package/templates/skills/business-analyse/templates-react.md +580 -580
- package/templates/skills/controller/SKILL.md +240 -240
- package/templates/skills/controller/postman-templates.md +614 -614
- package/templates/skills/controller/templates.md +1468 -1468
- package/templates/skills/documentation/SKILL.md +133 -133
- package/templates/skills/documentation/templates.md +476 -476
- package/templates/skills/feature-full/SKILL.md +838 -838
- package/templates/skills/notification/SKILL.md +555 -555
- package/templates/skills/ui-components/SKILL.md +870 -870
- package/templates/skills/workflow/SKILL.md +582 -582
- package/templates/test-web/api-health.json +38 -38
- package/templates/test-web/minimal.json +19 -19
- package/templates/test-web/npm-package.json +46 -46
- package/templates/test-web/seo-check.json +54 -54
|
@@ -1,326 +1,326 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Populate database with test or initial data
|
|
3
|
-
agent: efcore-db-seed
|
|
4
|
-
model: haiku
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# EF Core Database Seed
|
|
8
|
-
|
|
9
|
-
Inserts test or initial data into the database using EF Core HasData() or Seeder classes.
|
|
10
|
-
|
|
11
|
-
> **CLAUDE INSTRUCTION:** The `AskUserQuestion({...})` blocks are instructions to use the `AskUserQuestion` tool in an **interactive** manner. You MUST execute the tool with these parameters to get the user's response BEFORE continuing.
|
|
12
|
-
|
|
13
|
-
---
|
|
14
|
-
|
|
15
|
-
## RÈGLES DE CONFORMITÉ (OBLIGATOIRE)
|
|
16
|
-
|
|
17
|
-
> **INTERDIT - Violations CLAUDE.md:**
|
|
18
|
-
> - ❌ Scripts SQL (.sql files) dans le repository
|
|
19
|
-
> - ❌ Utilisation de `sqlcmd` avec SQL brut
|
|
20
|
-
> - ❌ `migrationBuilder.Sql()` avec INSERT statements
|
|
21
|
-
>
|
|
22
|
-
> **OBLIGATOIRE - Méthodes autorisées:**
|
|
23
|
-
> - ✅ `HasData()` dans les configurations EF Core
|
|
24
|
-
> - ✅ Classes `IDataSeeder` exécutées au démarrage
|
|
25
|
-
> - ✅ Migrations EF Core avec données typées
|
|
26
|
-
>
|
|
27
|
-
> **Contact support:** support@atlshub.ch
|
|
28
|
-
|
|
29
|
-
---
|
|
30
|
-
|
|
31
|
-
## STEP 0: Verification environnement et connexion
|
|
32
|
-
|
|
33
|
-
> **Include:** `_env-check.md` (etapes 0.1 a 0.5)
|
|
34
|
-
|
|
35
|
-
### 0.1 Detecter et afficher l'environnement
|
|
36
|
-
|
|
37
|
-
```bash
|
|
38
|
-
# Scanner les fichiers appsettings
|
|
39
|
-
API_DIR=$(find . -type d -name "*.Api" | head -1)
|
|
40
|
-
[ -z "$API_DIR" ] && API_DIR="src/SmartStack.Api"
|
|
41
|
-
|
|
42
|
-
# Selectionner l'environnement
|
|
43
|
-
ENV_FLAG="${1#--env=}"
|
|
44
|
-
if [ -n "$ENV_FLAG" ] && [ "$ENV_FLAG" != "$1" ]; then
|
|
45
|
-
SELECTED_ENV="appsettings.${ENV_FLAG}.json"
|
|
46
|
-
elif [ -f "$API_DIR/appsettings.Local.json" ]; then
|
|
47
|
-
SELECTED_ENV="appsettings.Local.json"
|
|
48
|
-
else
|
|
49
|
-
echo "ERROR: Aucun fichier appsettings trouve"
|
|
50
|
-
exit 1
|
|
51
|
-
fi
|
|
52
|
-
|
|
53
|
-
# Extraire connection string
|
|
54
|
-
CONNECTION_STRING=$(powershell -Command "
|
|
55
|
-
\$json = Get-Content '$API_DIR/$SELECTED_ENV' | ConvertFrom-Json
|
|
56
|
-
\$json.ConnectionStrings.DefaultConnection
|
|
57
|
-
")
|
|
58
|
-
|
|
59
|
-
DATABASE_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Database=\K[^;]+')
|
|
60
|
-
SERVER_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Server=\K[^;]+')
|
|
61
|
-
|
|
62
|
-
# Protection Production
|
|
63
|
-
if [[ "$SELECTED_ENV" == *"Production"* ]]; then
|
|
64
|
-
echo "BLOQUE: Seed interdit en environnement Production"
|
|
65
|
-
exit 1
|
|
66
|
-
fi
|
|
67
|
-
```
|
|
68
|
-
|
|
69
|
-
### 0.2 Afficher le resume
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
================================================================================
|
|
73
|
-
EF CORE - DATABASE SEED
|
|
74
|
-
================================================================================
|
|
75
|
-
|
|
76
|
-
ENVIRONNEMENT: {SELECTED_ENV}
|
|
77
|
-
|
|
78
|
-
BASE DE DONNEES CIBLE:
|
|
79
|
-
Server: {SERVER_NAME}
|
|
80
|
-
Database: {DATABASE_NAME}
|
|
81
|
-
|
|
82
|
-
================================================================================
|
|
83
|
-
```
|
|
84
|
-
|
|
85
|
-
---
|
|
86
|
-
|
|
87
|
-
## STEP 1: Detect available seeding methods
|
|
88
|
-
|
|
89
|
-
```bash
|
|
90
|
-
# Search for COMPLIANT seed methods only
|
|
91
|
-
SEED_METHODS=""
|
|
92
|
-
|
|
93
|
-
# 1. DbSeeder or DataSeeder class
|
|
94
|
-
if grep -rq "class.*Seeder\|class.*Seed\|IDataSeeder" . --include="*.cs" 2>/dev/null; then
|
|
95
|
-
SEED_METHODS="$SEED_METHODS seeder-class"
|
|
96
|
-
fi
|
|
97
|
-
|
|
98
|
-
# 2. HasData() in configurations (RECOMMENDED)
|
|
99
|
-
if grep -rq "\.HasData(" . --include="*.cs" 2>/dev/null; then
|
|
100
|
-
SEED_METHODS="$SEED_METHODS hasdata"
|
|
101
|
-
fi
|
|
102
|
-
|
|
103
|
-
# 3. --seed argument in Program.cs
|
|
104
|
-
if grep -q "\-\-seed" ./Program.cs 2>/dev/null; then
|
|
105
|
-
SEED_METHODS="$SEED_METHODS cli-argument"
|
|
106
|
-
fi
|
|
107
|
-
|
|
108
|
-
# WARNING: Detect forbidden SQL scripts
|
|
109
|
-
if [ -f "./scripts/seed.sql" ] || [ -f "./Data/seed.sql" ]; then
|
|
110
|
-
echo "⚠️ WARNING: SQL seed scripts detected - FORBIDDEN by CLAUDE.md"
|
|
111
|
-
echo " Please migrate to HasData() in EF Core configurations"
|
|
112
|
-
echo " Contact: support@atlshub.ch"
|
|
113
|
-
fi
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
---
|
|
117
|
-
|
|
118
|
-
## STEP 2: Display options
|
|
119
|
-
|
|
120
|
-
```
|
|
121
|
-
================================================================================
|
|
122
|
-
EF CORE - DATABASE SEED
|
|
123
|
-
================================================================================
|
|
124
|
-
|
|
125
|
-
DETECTED METHODS:
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
**If methods found:**
|
|
129
|
-
|
|
130
|
-
```javascript
|
|
131
|
-
// Build options dynamically - ONLY COMPLIANT METHODS
|
|
132
|
-
options = []
|
|
133
|
-
|
|
134
|
-
if (SEED_METHODS.includes("hasdata")) {
|
|
135
|
-
options.push({
|
|
136
|
-
label: "HasData (Recommended)",
|
|
137
|
-
description: "Data seeded via EF Core migrations - compliant"
|
|
138
|
-
})
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (SEED_METHODS.includes("seeder-class")) {
|
|
142
|
-
options.push({
|
|
143
|
-
label: "Seeder Class",
|
|
144
|
-
description: "Execute DbSeeder/DataSeeder class at startup"
|
|
145
|
-
})
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
if (SEED_METHODS.includes("cli-argument")) {
|
|
149
|
-
options.push({
|
|
150
|
-
label: "CLI --seed",
|
|
151
|
-
description: "Launch app with --seed argument"
|
|
152
|
-
})
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
AskUserQuestion({
|
|
156
|
-
questions: [{
|
|
157
|
-
question: "Which seeding method to use?",
|
|
158
|
-
header: "Seed",
|
|
159
|
-
options: options,
|
|
160
|
-
multiSelect: false
|
|
161
|
-
}]
|
|
162
|
-
})
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
**If no method found:**
|
|
166
|
-
|
|
167
|
-
```
|
|
168
|
-
⚠️ No seeding method detected
|
|
169
|
-
|
|
170
|
-
SOLUTION RECOMMANDÉE - HasData():
|
|
171
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
172
|
-
Ajoutez HasData() dans vos fichiers *Configuration.cs :
|
|
173
|
-
|
|
174
|
-
public class UserConfiguration : IEntityTypeConfiguration<User>
|
|
175
|
-
{
|
|
176
|
-
public void Configure(EntityTypeBuilder<User> builder)
|
|
177
|
-
{
|
|
178
|
-
builder.HasData(new User
|
|
179
|
-
{
|
|
180
|
-
Id = Guid.Parse("7f3c9a2e-8d1b-4e5f-a6c8-9b4d2f7e1a3c"), // Random GUID
|
|
181
|
-
Name = "Admin",
|
|
182
|
-
Email = "admin@example.com",
|
|
183
|
-
CreatedAt = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)
|
|
184
|
-
});
|
|
185
|
-
}
|
|
186
|
-
}
|
|
187
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
188
|
-
|
|
189
|
-
Puis créez une migration:
|
|
190
|
-
dotnet ef migrations add SeedInitialData
|
|
191
|
-
|
|
192
|
-
ALTERNATIVE - Seeder Class:
|
|
193
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
194
|
-
public interface IDataSeeder
|
|
195
|
-
{
|
|
196
|
-
Task SeedAsync(CancellationToken ct = default);
|
|
197
|
-
}
|
|
198
|
-
|
|
199
|
-
public class DatabaseSeeder : IDataSeeder
|
|
200
|
-
{
|
|
201
|
-
private readonly ApplicationDbContext _context;
|
|
202
|
-
|
|
203
|
-
public async Task SeedAsync(CancellationToken ct = default)
|
|
204
|
-
{
|
|
205
|
-
if (!await _context.Users.AnyAsync(ct))
|
|
206
|
-
{
|
|
207
|
-
_context.Users.Add(new User { ... });
|
|
208
|
-
await _context.SaveChangesAsync(ct);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
213
|
-
|
|
214
|
-
❌ INTERDIT: Création de scripts SQL (.sql files)
|
|
215
|
-
Contact: support@atlshub.ch
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
---
|
|
219
|
-
|
|
220
|
-
## STEP 3: Execute seeding
|
|
221
|
-
|
|
222
|
-
### Option A: HasData (via migrations)
|
|
223
|
-
|
|
224
|
-
```bash
|
|
225
|
-
# Les données sont déjà dans les migrations
|
|
226
|
-
# Simplement appliquer les migrations
|
|
227
|
-
STARTUP_PROJECT=$(find . -name "*.Api.csproj" -o -name "*Web.csproj" | head -1)
|
|
228
|
-
INFRA_PROJECT=$(find . -name "*Infrastructure.csproj" | head -1)
|
|
229
|
-
|
|
230
|
-
dotnet ef database update \
|
|
231
|
-
--project "$INFRA_PROJECT" \
|
|
232
|
-
--startup-project "$STARTUP_PROJECT"
|
|
233
|
-
|
|
234
|
-
echo "✓ HasData() seed applied via migrations"
|
|
235
|
-
```
|
|
236
|
-
|
|
237
|
-
### Option B: Seeder Class
|
|
238
|
-
|
|
239
|
-
```bash
|
|
240
|
-
# Detect startup project
|
|
241
|
-
STARTUP_PROJECT=$(find . -name "*.csproj" -exec grep -l "Microsoft.AspNetCore" {} \; | head -1)
|
|
242
|
-
|
|
243
|
-
# Execute with seed option
|
|
244
|
-
dotnet run --project "$STARTUP_PROJECT" -- --seed
|
|
245
|
-
|
|
246
|
-
echo "✓ Seeder class executed"
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
### Option C: CLI --seed
|
|
250
|
-
|
|
251
|
-
```bash
|
|
252
|
-
STARTUP_PROJECT=$(find . -name "*.csproj" -exec grep -l "Microsoft.AspNetCore" {} \; | head -1)
|
|
253
|
-
dotnet run --project "$STARTUP_PROJECT" -- --seed
|
|
254
|
-
```
|
|
255
|
-
|
|
256
|
-
---
|
|
257
|
-
|
|
258
|
-
## STEP 4: Verification
|
|
259
|
-
|
|
260
|
-
```bash
|
|
261
|
-
# Verify seeding via EF Core context
|
|
262
|
-
STARTUP_PROJECT=$(find . -name "*.csproj" -exec grep -l "Microsoft.AspNetCore" {} \; | head -1)
|
|
263
|
-
|
|
264
|
-
# Run verification endpoint or check via application
|
|
265
|
-
echo "Verification: Launch application and check data"
|
|
266
|
-
echo " dotnet run --project $STARTUP_PROJECT"
|
|
267
|
-
echo ""
|
|
268
|
-
echo "Or check via EF Core:"
|
|
269
|
-
echo " dotnet ef dbcontext info"
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
---
|
|
273
|
-
|
|
274
|
-
## STEP 5: Summary
|
|
275
|
-
|
|
276
|
-
```
|
|
277
|
-
================================================================================
|
|
278
|
-
SEEDING COMPLETE
|
|
279
|
-
================================================================================
|
|
280
|
-
|
|
281
|
-
METHOD: {method used}
|
|
282
|
-
COMPLIANT: ✓ EF Core native (no raw SQL)
|
|
283
|
-
|
|
284
|
-
✓ Database populated successfully
|
|
285
|
-
|
|
286
|
-
NEXT COMMANDS:
|
|
287
|
-
/efcore:db-status → Check status
|
|
288
|
-
dotnet run → Launch application
|
|
289
|
-
|
|
290
|
-
================================================================================
|
|
291
|
-
```
|
|
292
|
-
|
|
293
|
-
---
|
|
294
|
-
|
|
295
|
-
## Migration de scripts SQL existants
|
|
296
|
-
|
|
297
|
-
Si vous avez des scripts SQL legacy, migrez-les vers HasData():
|
|
298
|
-
|
|
299
|
-
```
|
|
300
|
-
AVANT (INTERDIT):
|
|
301
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
302
|
-
-- scripts/seed.sql
|
|
303
|
-
INSERT INTO Users (Id, Name, Email) VALUES (1, 'Admin', 'admin@test.com');
|
|
304
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
305
|
-
|
|
306
|
-
APRÈS (CORRECT):
|
|
307
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
308
|
-
// UserConfiguration.cs
|
|
309
|
-
builder.HasData(new User
|
|
310
|
-
{
|
|
311
|
-
Id = Guid.Parse("7f3c9a2e-8d1b-4e5f-a6c8-9b4d2f7e1a3c"),
|
|
312
|
-
Name = "Admin",
|
|
313
|
-
Email = "admin@test.com"
|
|
314
|
-
});
|
|
315
|
-
────────────────────────────────────────────────────────────────────────────────
|
|
316
|
-
|
|
317
|
-
Puis: dotnet ef migrations add MigrateSeedData
|
|
318
|
-
```
|
|
319
|
-
|
|
320
|
-
---
|
|
321
|
-
|
|
322
|
-
## Support
|
|
323
|
-
|
|
324
|
-
> **Questions ou problèmes avec le seeding EF Core?**
|
|
325
|
-
>
|
|
326
|
-
> 📧 **support@atlshub.ch**
|
|
1
|
+
---
|
|
2
|
+
description: Populate database with test or initial data
|
|
3
|
+
agent: efcore-db-seed
|
|
4
|
+
model: haiku
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# EF Core Database Seed
|
|
8
|
+
|
|
9
|
+
Inserts test or initial data into the database using EF Core HasData() or Seeder classes.
|
|
10
|
+
|
|
11
|
+
> **CLAUDE INSTRUCTION:** The `AskUserQuestion({...})` blocks are instructions to use the `AskUserQuestion` tool in an **interactive** manner. You MUST execute the tool with these parameters to get the user's response BEFORE continuing.
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## RÈGLES DE CONFORMITÉ (OBLIGATOIRE)
|
|
16
|
+
|
|
17
|
+
> **INTERDIT - Violations CLAUDE.md:**
|
|
18
|
+
> - ❌ Scripts SQL (.sql files) dans le repository
|
|
19
|
+
> - ❌ Utilisation de `sqlcmd` avec SQL brut
|
|
20
|
+
> - ❌ `migrationBuilder.Sql()` avec INSERT statements
|
|
21
|
+
>
|
|
22
|
+
> **OBLIGATOIRE - Méthodes autorisées:**
|
|
23
|
+
> - ✅ `HasData()` dans les configurations EF Core
|
|
24
|
+
> - ✅ Classes `IDataSeeder` exécutées au démarrage
|
|
25
|
+
> - ✅ Migrations EF Core avec données typées
|
|
26
|
+
>
|
|
27
|
+
> **Contact support:** support@atlshub.ch
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
|
|
31
|
+
## STEP 0: Verification environnement et connexion
|
|
32
|
+
|
|
33
|
+
> **Include:** `_env-check.md` (etapes 0.1 a 0.5)
|
|
34
|
+
|
|
35
|
+
### 0.1 Detecter et afficher l'environnement
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
# Scanner les fichiers appsettings
|
|
39
|
+
API_DIR=$(find . -type d -name "*.Api" | head -1)
|
|
40
|
+
[ -z "$API_DIR" ] && API_DIR="src/SmartStack.Api"
|
|
41
|
+
|
|
42
|
+
# Selectionner l'environnement
|
|
43
|
+
ENV_FLAG="${1#--env=}"
|
|
44
|
+
if [ -n "$ENV_FLAG" ] && [ "$ENV_FLAG" != "$1" ]; then
|
|
45
|
+
SELECTED_ENV="appsettings.${ENV_FLAG}.json"
|
|
46
|
+
elif [ -f "$API_DIR/appsettings.Local.json" ]; then
|
|
47
|
+
SELECTED_ENV="appsettings.Local.json"
|
|
48
|
+
else
|
|
49
|
+
echo "ERROR: Aucun fichier appsettings trouve"
|
|
50
|
+
exit 1
|
|
51
|
+
fi
|
|
52
|
+
|
|
53
|
+
# Extraire connection string
|
|
54
|
+
CONNECTION_STRING=$(powershell -Command "
|
|
55
|
+
\$json = Get-Content '$API_DIR/$SELECTED_ENV' | ConvertFrom-Json
|
|
56
|
+
\$json.ConnectionStrings.DefaultConnection
|
|
57
|
+
")
|
|
58
|
+
|
|
59
|
+
DATABASE_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Database=\K[^;]+')
|
|
60
|
+
SERVER_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Server=\K[^;]+')
|
|
61
|
+
|
|
62
|
+
# Protection Production
|
|
63
|
+
if [[ "$SELECTED_ENV" == *"Production"* ]]; then
|
|
64
|
+
echo "BLOQUE: Seed interdit en environnement Production"
|
|
65
|
+
exit 1
|
|
66
|
+
fi
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
### 0.2 Afficher le resume
|
|
70
|
+
|
|
71
|
+
```
|
|
72
|
+
================================================================================
|
|
73
|
+
EF CORE - DATABASE SEED
|
|
74
|
+
================================================================================
|
|
75
|
+
|
|
76
|
+
ENVIRONNEMENT: {SELECTED_ENV}
|
|
77
|
+
|
|
78
|
+
BASE DE DONNEES CIBLE:
|
|
79
|
+
Server: {SERVER_NAME}
|
|
80
|
+
Database: {DATABASE_NAME}
|
|
81
|
+
|
|
82
|
+
================================================================================
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
## STEP 1: Detect available seeding methods
|
|
88
|
+
|
|
89
|
+
```bash
|
|
90
|
+
# Search for COMPLIANT seed methods only
|
|
91
|
+
SEED_METHODS=""
|
|
92
|
+
|
|
93
|
+
# 1. DbSeeder or DataSeeder class
|
|
94
|
+
if grep -rq "class.*Seeder\|class.*Seed\|IDataSeeder" . --include="*.cs" 2>/dev/null; then
|
|
95
|
+
SEED_METHODS="$SEED_METHODS seeder-class"
|
|
96
|
+
fi
|
|
97
|
+
|
|
98
|
+
# 2. HasData() in configurations (RECOMMENDED)
|
|
99
|
+
if grep -rq "\.HasData(" . --include="*.cs" 2>/dev/null; then
|
|
100
|
+
SEED_METHODS="$SEED_METHODS hasdata"
|
|
101
|
+
fi
|
|
102
|
+
|
|
103
|
+
# 3. --seed argument in Program.cs
|
|
104
|
+
if grep -q "\-\-seed" ./Program.cs 2>/dev/null; then
|
|
105
|
+
SEED_METHODS="$SEED_METHODS cli-argument"
|
|
106
|
+
fi
|
|
107
|
+
|
|
108
|
+
# WARNING: Detect forbidden SQL scripts
|
|
109
|
+
if [ -f "./scripts/seed.sql" ] || [ -f "./Data/seed.sql" ]; then
|
|
110
|
+
echo "⚠️ WARNING: SQL seed scripts detected - FORBIDDEN by CLAUDE.md"
|
|
111
|
+
echo " Please migrate to HasData() in EF Core configurations"
|
|
112
|
+
echo " Contact: support@atlshub.ch"
|
|
113
|
+
fi
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## STEP 2: Display options
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
================================================================================
|
|
122
|
+
EF CORE - DATABASE SEED
|
|
123
|
+
================================================================================
|
|
124
|
+
|
|
125
|
+
DETECTED METHODS:
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
**If methods found:**
|
|
129
|
+
|
|
130
|
+
```javascript
|
|
131
|
+
// Build options dynamically - ONLY COMPLIANT METHODS
|
|
132
|
+
options = []
|
|
133
|
+
|
|
134
|
+
if (SEED_METHODS.includes("hasdata")) {
|
|
135
|
+
options.push({
|
|
136
|
+
label: "HasData (Recommended)",
|
|
137
|
+
description: "Data seeded via EF Core migrations - compliant"
|
|
138
|
+
})
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (SEED_METHODS.includes("seeder-class")) {
|
|
142
|
+
options.push({
|
|
143
|
+
label: "Seeder Class",
|
|
144
|
+
description: "Execute DbSeeder/DataSeeder class at startup"
|
|
145
|
+
})
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
if (SEED_METHODS.includes("cli-argument")) {
|
|
149
|
+
options.push({
|
|
150
|
+
label: "CLI --seed",
|
|
151
|
+
description: "Launch app with --seed argument"
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
AskUserQuestion({
|
|
156
|
+
questions: [{
|
|
157
|
+
question: "Which seeding method to use?",
|
|
158
|
+
header: "Seed",
|
|
159
|
+
options: options,
|
|
160
|
+
multiSelect: false
|
|
161
|
+
}]
|
|
162
|
+
})
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
**If no method found:**
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
⚠️ No seeding method detected
|
|
169
|
+
|
|
170
|
+
SOLUTION RECOMMANDÉE - HasData():
|
|
171
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
172
|
+
Ajoutez HasData() dans vos fichiers *Configuration.cs :
|
|
173
|
+
|
|
174
|
+
public class UserConfiguration : IEntityTypeConfiguration<User>
|
|
175
|
+
{
|
|
176
|
+
public void Configure(EntityTypeBuilder<User> builder)
|
|
177
|
+
{
|
|
178
|
+
builder.HasData(new User
|
|
179
|
+
{
|
|
180
|
+
Id = Guid.Parse("7f3c9a2e-8d1b-4e5f-a6c8-9b4d2f7e1a3c"), // Random GUID
|
|
181
|
+
Name = "Admin",
|
|
182
|
+
Email = "admin@example.com",
|
|
183
|
+
CreatedAt = new DateTime(2024, 1, 1, 0, 0, 0, DateTimeKind.Utc)
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
188
|
+
|
|
189
|
+
Puis créez une migration:
|
|
190
|
+
dotnet ef migrations add SeedInitialData
|
|
191
|
+
|
|
192
|
+
ALTERNATIVE - Seeder Class:
|
|
193
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
194
|
+
public interface IDataSeeder
|
|
195
|
+
{
|
|
196
|
+
Task SeedAsync(CancellationToken ct = default);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
public class DatabaseSeeder : IDataSeeder
|
|
200
|
+
{
|
|
201
|
+
private readonly ApplicationDbContext _context;
|
|
202
|
+
|
|
203
|
+
public async Task SeedAsync(CancellationToken ct = default)
|
|
204
|
+
{
|
|
205
|
+
if (!await _context.Users.AnyAsync(ct))
|
|
206
|
+
{
|
|
207
|
+
_context.Users.Add(new User { ... });
|
|
208
|
+
await _context.SaveChangesAsync(ct);
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
213
|
+
|
|
214
|
+
❌ INTERDIT: Création de scripts SQL (.sql files)
|
|
215
|
+
Contact: support@atlshub.ch
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
---
|
|
219
|
+
|
|
220
|
+
## STEP 3: Execute seeding
|
|
221
|
+
|
|
222
|
+
### Option A: HasData (via migrations)
|
|
223
|
+
|
|
224
|
+
```bash
|
|
225
|
+
# Les données sont déjà dans les migrations
|
|
226
|
+
# Simplement appliquer les migrations
|
|
227
|
+
STARTUP_PROJECT=$(find . -name "*.Api.csproj" -o -name "*Web.csproj" | head -1)
|
|
228
|
+
INFRA_PROJECT=$(find . -name "*Infrastructure.csproj" | head -1)
|
|
229
|
+
|
|
230
|
+
dotnet ef database update \
|
|
231
|
+
--project "$INFRA_PROJECT" \
|
|
232
|
+
--startup-project "$STARTUP_PROJECT"
|
|
233
|
+
|
|
234
|
+
echo "✓ HasData() seed applied via migrations"
|
|
235
|
+
```
|
|
236
|
+
|
|
237
|
+
### Option B: Seeder Class
|
|
238
|
+
|
|
239
|
+
```bash
|
|
240
|
+
# Detect startup project
|
|
241
|
+
STARTUP_PROJECT=$(find . -name "*.csproj" -exec grep -l "Microsoft.AspNetCore" {} \; | head -1)
|
|
242
|
+
|
|
243
|
+
# Execute with seed option
|
|
244
|
+
dotnet run --project "$STARTUP_PROJECT" -- --seed
|
|
245
|
+
|
|
246
|
+
echo "✓ Seeder class executed"
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### Option C: CLI --seed
|
|
250
|
+
|
|
251
|
+
```bash
|
|
252
|
+
STARTUP_PROJECT=$(find . -name "*.csproj" -exec grep -l "Microsoft.AspNetCore" {} \; | head -1)
|
|
253
|
+
dotnet run --project "$STARTUP_PROJECT" -- --seed
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
---
|
|
257
|
+
|
|
258
|
+
## STEP 4: Verification
|
|
259
|
+
|
|
260
|
+
```bash
|
|
261
|
+
# Verify seeding via EF Core context
|
|
262
|
+
STARTUP_PROJECT=$(find . -name "*.csproj" -exec grep -l "Microsoft.AspNetCore" {} \; | head -1)
|
|
263
|
+
|
|
264
|
+
# Run verification endpoint or check via application
|
|
265
|
+
echo "Verification: Launch application and check data"
|
|
266
|
+
echo " dotnet run --project $STARTUP_PROJECT"
|
|
267
|
+
echo ""
|
|
268
|
+
echo "Or check via EF Core:"
|
|
269
|
+
echo " dotnet ef dbcontext info"
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
---
|
|
273
|
+
|
|
274
|
+
## STEP 5: Summary
|
|
275
|
+
|
|
276
|
+
```
|
|
277
|
+
================================================================================
|
|
278
|
+
SEEDING COMPLETE
|
|
279
|
+
================================================================================
|
|
280
|
+
|
|
281
|
+
METHOD: {method used}
|
|
282
|
+
COMPLIANT: ✓ EF Core native (no raw SQL)
|
|
283
|
+
|
|
284
|
+
✓ Database populated successfully
|
|
285
|
+
|
|
286
|
+
NEXT COMMANDS:
|
|
287
|
+
/efcore:db-status → Check status
|
|
288
|
+
dotnet run → Launch application
|
|
289
|
+
|
|
290
|
+
================================================================================
|
|
291
|
+
```
|
|
292
|
+
|
|
293
|
+
---
|
|
294
|
+
|
|
295
|
+
## Migration de scripts SQL existants
|
|
296
|
+
|
|
297
|
+
Si vous avez des scripts SQL legacy, migrez-les vers HasData():
|
|
298
|
+
|
|
299
|
+
```
|
|
300
|
+
AVANT (INTERDIT):
|
|
301
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
302
|
+
-- scripts/seed.sql
|
|
303
|
+
INSERT INTO Users (Id, Name, Email) VALUES (1, 'Admin', 'admin@test.com');
|
|
304
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
305
|
+
|
|
306
|
+
APRÈS (CORRECT):
|
|
307
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
308
|
+
// UserConfiguration.cs
|
|
309
|
+
builder.HasData(new User
|
|
310
|
+
{
|
|
311
|
+
Id = Guid.Parse("7f3c9a2e-8d1b-4e5f-a6c8-9b4d2f7e1a3c"),
|
|
312
|
+
Name = "Admin",
|
|
313
|
+
Email = "admin@test.com"
|
|
314
|
+
});
|
|
315
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
316
|
+
|
|
317
|
+
Puis: dotnet ef migrations add MigrateSeedData
|
|
318
|
+
```
|
|
319
|
+
|
|
320
|
+
---
|
|
321
|
+
|
|
322
|
+
## Support
|
|
323
|
+
|
|
324
|
+
> **Questions ou problèmes avec le seeding EF Core?**
|
|
325
|
+
>
|
|
326
|
+
> 📧 **support@atlshub.ch**
|