@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,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**
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Display migrations and database status
|
|
3
|
+
agent: efcore-db-status
|
|
4
|
+
model: haiku
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# EF Core Database Status
|
|
8
|
+
|
|
9
|
+
Displays the complete status of EF Core migrations and database connection.
|
|
10
|
+
|
|
11
|
+
**Quick command, read-only, no modifications.**
|
|
12
|
+
|
|
13
|
+
---
|
|
14
|
+
|
|
15
|
+
## STEP 1: Detect configuration
|
|
16
|
+
|
|
17
|
+
```bash
|
|
18
|
+
# Check config files
|
|
19
|
+
CONFIG_LOCAL="appsettings.Local.json"
|
|
20
|
+
CONFIG_DEV="appsettings.Development.json"
|
|
21
|
+
CONFIG_DEFAULT="appsettings.json"
|
|
22
|
+
|
|
23
|
+
if [ -f "$CONFIG_LOCAL" ]; then
|
|
24
|
+
CONFIG_USED="$CONFIG_LOCAL"
|
|
25
|
+
elif [ -f "$CONFIG_DEV" ]; then
|
|
26
|
+
CONFIG_USED="$CONFIG_DEV"
|
|
27
|
+
else
|
|
28
|
+
CONFIG_USED="$CONFIG_DEFAULT"
|
|
29
|
+
fi
|
|
30
|
+
|
|
31
|
+
# Detect EF Core project
|
|
32
|
+
CSPROJ=$(find . -name "*.csproj" -exec grep -l "Microsoft.EntityFrameworkCore" {} \; | head -1)
|
|
33
|
+
PROJECT_DIR=$(dirname "$CSPROJ")
|
|
34
|
+
PROJECT_NAME=$(basename "$CSPROJ" .csproj)
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
---
|
|
38
|
+
|
|
39
|
+
## STEP 2: Test connection
|
|
40
|
+
|
|
41
|
+
```bash
|
|
42
|
+
cd "$PROJECT_DIR"
|
|
43
|
+
|
|
44
|
+
# Test connection with EF Core
|
|
45
|
+
CONNECTION_OK=$(dotnet ef database list 2>&1)
|
|
46
|
+
if echo "$CONNECTION_OK" | grep -q "error\|Error\|failed"; then
|
|
47
|
+
CONNECTION_STATUS="❌ Failed"
|
|
48
|
+
CONNECTION_ERROR="$CONNECTION_OK"
|
|
49
|
+
else
|
|
50
|
+
CONNECTION_STATUS="✓ OK"
|
|
51
|
+
fi
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## STEP 3: List migrations
|
|
57
|
+
|
|
58
|
+
```bash
|
|
59
|
+
# Migrations in code
|
|
60
|
+
CODE_MIGRATIONS=$(dotnet ef migrations list 2>/dev/null | grep -v "^Build" | grep -v "^$")
|
|
61
|
+
TOTAL_MIGRATIONS=$(echo "$CODE_MIGRATIONS" | wc -l)
|
|
62
|
+
|
|
63
|
+
# Applied vs pending migrations
|
|
64
|
+
APPLIED=$(dotnet ef migrations list 2>/dev/null | grep "(Pending)" -v | grep -v "^Build" | wc -l)
|
|
65
|
+
PENDING=$(dotnet ef migrations list 2>/dev/null | grep "(Pending)" | wc -l)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## STEP 4: Display report
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
================================================================================
|
|
74
|
+
EF CORE - DATABASE STATUS
|
|
75
|
+
================================================================================
|
|
76
|
+
|
|
77
|
+
PROJECT
|
|
78
|
+
Name: {PROJECT_NAME}
|
|
79
|
+
Config: {CONFIG_USED}
|
|
80
|
+
DbContext: {CONTEXT_NAME}
|
|
81
|
+
|
|
82
|
+
CONNECTION
|
|
83
|
+
Status: {CONNECTION_STATUS}
|
|
84
|
+
Server: {SERVER}
|
|
85
|
+
Database: {DATABASE}
|
|
86
|
+
|
|
87
|
+
MIGRATIONS
|
|
88
|
+
Total: {TOTAL_MIGRATIONS}
|
|
89
|
+
Applied: {APPLIED} ✓
|
|
90
|
+
Pending: {PENDING} {⚠️ if > 0}
|
|
91
|
+
|
|
92
|
+
================================================================================
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
**If pending migrations:**
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
PENDING MIGRATIONS
|
|
99
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
100
|
+
1. {MigrationName1} (Pending)
|
|
101
|
+
2. {MigrationName2} (Pending)
|
|
102
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
103
|
+
|
|
104
|
+
→ Use /efcore:db-deploy to apply migrations
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
**If connection error:**
|
|
108
|
+
|
|
109
|
+
```
|
|
110
|
+
⚠️ CONNECTION PROBLEM
|
|
111
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
112
|
+
{CONNECTION_ERROR}
|
|
113
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
114
|
+
|
|
115
|
+
CHECKS:
|
|
116
|
+
1. Is SQL Server running?
|
|
117
|
+
2. Is appsettings.Local.json configured?
|
|
118
|
+
3. Does the database exist?
|
|
119
|
+
|
|
120
|
+
COMMANDS:
|
|
121
|
+
/efcore:db-reset → Create/recreate database
|
|
122
|
+
/gitflow:10-start → Configure appsettings.Local.json
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
---
|
|
126
|
+
|
|
127
|
+
## STEP 4.5: Check "1 migration per feature" rule
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
# Current branch
|
|
131
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
132
|
+
|
|
133
|
+
# Extract branch type
|
|
134
|
+
if [[ "$CURRENT_BRANCH" == feature/* ]]; then
|
|
135
|
+
BRANCH_TYPE="Feature"
|
|
136
|
+
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/feature\///' | sed 's/-/_/g')
|
|
137
|
+
elif [[ "$CURRENT_BRANCH" == hotfix/* ]]; then
|
|
138
|
+
BRANCH_TYPE="Hotfix"
|
|
139
|
+
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/hotfix\///' | sed 's/-/_/g')
|
|
140
|
+
else
|
|
141
|
+
BRANCH_TYPE=""
|
|
142
|
+
fi
|
|
143
|
+
|
|
144
|
+
# If on a feature/hotfix, count migrations for this branch
|
|
145
|
+
if [ -n "$BRANCH_TYPE" ]; then
|
|
146
|
+
# Search for migrations matching the branch pattern
|
|
147
|
+
BRANCH_MIGRATIONS=$(find "$MIGRATIONS_DIR" -name "*.cs" 2>/dev/null | grep -iE "${BRANCH_TYPE}.*${BRANCH_NAME}" | grep -v "Designer" | grep -v "Snapshot" | wc -l)
|
|
148
|
+
fi
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**Display verification:**
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
"1 MIGRATION PER FEATURE" RULE
|
|
155
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
156
|
+
Branch: {CURRENT_BRANCH}
|
|
157
|
+
Migrations: {BRANCH_MIGRATIONS} for this branch
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
**If BRANCH_MIGRATIONS > 1:**
|
|
161
|
+
|
|
162
|
+
```
|
|
163
|
+
⚠️ WARNING: {BRANCH_MIGRATIONS} migrations detected for this branch!
|
|
164
|
+
Rule: 1 migration only per feature/hotfix
|
|
165
|
+
|
|
166
|
+
RECOMMENDED ACTION:
|
|
167
|
+
/efcore:migration → Recreate as single migration
|
|
168
|
+
|
|
169
|
+
Multiple migrations cause problems during merge.
|
|
170
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
**If BRANCH_MIGRATIONS == 1:**
|
|
174
|
+
|
|
175
|
+
```
|
|
176
|
+
✓ Rule respected: 1 migration for this branch
|
|
177
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
**If BRANCH_MIGRATIONS == 0 and pending modifications:**
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
○ No migrations for this branch
|
|
184
|
+
→ Use /efcore:migration if you modified the model
|
|
185
|
+
────────────────────────────────────────────────────────────────────────────────
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
|
|
190
|
+
## STEP 5: Additional info (optional)
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# Database size (if connection OK)
|
|
194
|
+
DB_SIZE=$(sqlcmd -S "$SERVER" -E -Q "SELECT CAST(SUM(size * 8 / 1024.0) AS DECIMAL(10,2)) AS 'MB' FROM sys.master_files WHERE database_id = DB_ID('$DATABASE')" -h -1 2>/dev/null)
|
|
195
|
+
|
|
196
|
+
# Number of tables
|
|
197
|
+
TABLE_COUNT=$(sqlcmd -S "$SERVER" -E -d "$DATABASE" -Q "SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE'" -h -1 2>/dev/null)
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
```
|
|
201
|
+
STATISTICS
|
|
202
|
+
Size: {DB_SIZE} MB
|
|
203
|
+
Tables: {TABLE_COUNT}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## Options
|
|
209
|
+
|
|
210
|
+
| Option | Description |
|
|
211
|
+
|--------|-------------|
|
|
212
|
+
| `--verbose` | Display all migrations with details |
|
|
213
|
+
| `--json` | JSON output for scripting |
|
|
214
|
+
| `--context {name}` | Specify the DbContext |
|