@atlashub/smartstack-cli 1.5.1 → 1.5.3
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/css/styles.css +2168 -2168
- package/.documentation/js/app.js +794 -794
- 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 +0 -0
- 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 -567
- 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,400 +1,400 @@
|
|
|
1
|
-
---
|
|
2
|
-
description: Create or recreate the EF Core migration for the current branch (1 migration per feature)
|
|
3
|
-
agent: efcore-migration
|
|
4
|
-
model: sonnet
|
|
5
|
-
---
|
|
6
|
-
|
|
7
|
-
# EF Core Migration - 1 Migration per Feature
|
|
8
|
-
|
|
9
|
-
Creates or recreates the unique migration for the current branch.
|
|
10
|
-
|
|
11
|
-
**GOLDEN RULE: 1 single migration per feature/hotfix. If it already exists, delete and recreate it.**
|
|
12
|
-
|
|
13
|
-
> **CLAUDE INSTRUCTION:** The `AskUserQuestion({...})` blocks are instructions to use the `AskUserQuestion` tool **interactively**. You MUST execute the tool with these parameters to get the user's response BEFORE continuing.
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
## STEP 0: Cross-Branch Validation (v1.2)
|
|
18
|
-
|
|
19
|
-
**NEW:** Before creating a migration, check for conflicts with other branches.
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
# Check if cross-branch validation is enabled
|
|
23
|
-
CROSS_BRANCH_ENABLED=$(git config --get efcore.crossBranch.enabled 2>/dev/null || echo "true")
|
|
24
|
-
BLOCK_ON_CONFLICT=$(git config --get efcore.crossBranch.blockOnConflict 2>/dev/null || echo "true")
|
|
25
|
-
|
|
26
|
-
if [ "$CROSS_BRANCH_ENABLED" = "true" ]; then
|
|
27
|
-
echo "Cross-branch validation..."
|
|
28
|
-
|
|
29
|
-
# Scan other branches via worktrees
|
|
30
|
-
WORKTREE_BASE=$(git config --get gitflow.worktrees.basePath 2>/dev/null || echo "../worktrees")
|
|
31
|
-
|
|
32
|
-
if [ -d "$WORKTREE_BASE/develop" ]; then
|
|
33
|
-
# Compare ModelSnapshot with develop
|
|
34
|
-
LOCAL_SNAPSHOT=$(find . -name "*ModelSnapshot.cs" -not -path "*/node_modules/*" | head -1)
|
|
35
|
-
DEVELOP_SNAPSHOT=$(find "$WORKTREE_BASE/develop" -name "*ModelSnapshot.cs" | head -1)
|
|
36
|
-
|
|
37
|
-
if [ -n "$LOCAL_SNAPSHOT" ] && [ -n "$DEVELOP_SNAPSHOT" ]; then
|
|
38
|
-
if ! diff -q "$LOCAL_SNAPSHOT" "$DEVELOP_SNAPSHOT" > /dev/null 2>&1; then
|
|
39
|
-
# Differences detected - analyze risk level
|
|
40
|
-
DIFF_LINES=$(diff "$DEVELOP_SNAPSHOT" "$LOCAL_SNAPSHOT" 2>/dev/null | wc -l)
|
|
41
|
-
|
|
42
|
-
if [ "$DIFF_LINES" -gt 100 ]; then
|
|
43
|
-
echo ""
|
|
44
|
-
echo "WARNING: CROSS-BRANCH CONFLICT DETECTED"
|
|
45
|
-
echo ""
|
|
46
|
-
echo "Your ModelSnapshot differs significantly from develop."
|
|
47
|
-
echo "Differences: $DIFF_LINES lines"
|
|
48
|
-
echo ""
|
|
49
|
-
echo "RESOLUTIONS:"
|
|
50
|
-
echo " 1. /efcore:rebase-snapshot (recommended)"
|
|
51
|
-
echo " 2. /efcore:conflicts (see details)"
|
|
52
|
-
echo " 3. /efcore:migration --force (not recommended)"
|
|
53
|
-
echo ""
|
|
54
|
-
|
|
55
|
-
if [ "$BLOCK_ON_CONFLICT" = "true" ]; then
|
|
56
|
-
echo "BLOCKED: Use --force to ignore"
|
|
57
|
-
exit 1
|
|
58
|
-
fi
|
|
59
|
-
fi
|
|
60
|
-
fi
|
|
61
|
-
fi
|
|
62
|
-
fi
|
|
63
|
-
|
|
64
|
-
echo "Cross-branch validation: OK"
|
|
65
|
-
fi
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
**Options to ignore:**
|
|
69
|
-
- `--force` : Ignore cross-branch validation
|
|
70
|
-
- `--no-cross-check` : Disable validation for this execution
|
|
71
|
-
- `--rebase-first` : Run rebase-snapshot automatically if conflict
|
|
72
|
-
|
|
73
|
-
---
|
|
74
|
-
|
|
75
|
-
## STEP 1: Analyze Git Context
|
|
76
|
-
|
|
77
|
-
```bash
|
|
78
|
-
# Current branch
|
|
79
|
-
CURRENT_BRANCH=$(git branch --show-current)
|
|
80
|
-
|
|
81
|
-
# Extract type and name
|
|
82
|
-
if [[ "$CURRENT_BRANCH" == feature/* ]]; then
|
|
83
|
-
BRANCH_TYPE="Feature"
|
|
84
|
-
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/feature\///' | sed 's/-/_/g' | sed 's/\b\w/\u&/g')
|
|
85
|
-
elif [[ "$CURRENT_BRANCH" == hotfix/* ]]; then
|
|
86
|
-
BRANCH_TYPE="Hotfix"
|
|
87
|
-
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/hotfix\///' | sed 's/-/_/g' | sed 's/\b\w/\u&/g')
|
|
88
|
-
elif [[ "$CURRENT_BRANCH" == release/* ]]; then
|
|
89
|
-
BRANCH_TYPE="Release"
|
|
90
|
-
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/release\///' | sed 's/v//')
|
|
91
|
-
else
|
|
92
|
-
BRANCH_TYPE="Dev"
|
|
93
|
-
BRANCH_NAME="Manual"
|
|
94
|
-
fi
|
|
95
|
-
|
|
96
|
-
# Current version
|
|
97
|
-
VERSION=$(grep -oP '"version":\s*"\K[^"]+' package.json 2>/dev/null || grep -oP '(?<=<Version>).*(?=</Version>)' *.csproj 2>/dev/null | head -1)
|
|
98
|
-
VERSION_CLEAN=$(echo "$VERSION" | sed 's/\./_/g')
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
---
|
|
102
|
-
|
|
103
|
-
## STEP 2: Detect EF Core Project et Environnement
|
|
104
|
-
|
|
105
|
-
```bash
|
|
106
|
-
# Find the project with EF Core
|
|
107
|
-
CSPROJ=$(find . -name "*.csproj" -exec grep -l "Microsoft.EntityFrameworkCore" {} \; | head -1)
|
|
108
|
-
PROJECT_DIR=$(dirname "$CSPROJ")
|
|
109
|
-
PROJECT_NAME=$(basename "$CSPROJ" .csproj)
|
|
110
|
-
|
|
111
|
-
# Migrations folder
|
|
112
|
-
MIGRATIONS_DIR="$PROJECT_DIR/Migrations"
|
|
113
|
-
|
|
114
|
-
# Detect API project for environment display
|
|
115
|
-
API_DIR=$(find . -type d -name "*.Api" | head -1)
|
|
116
|
-
[ -z "$API_DIR" ] && API_DIR="src/SmartStack.Api"
|
|
117
|
-
|
|
118
|
-
# Detect appsettings to show which DB will be affected on deploy
|
|
119
|
-
SELECTED_ENV="appsettings.Local.json"
|
|
120
|
-
if [ -f "$API_DIR/$SELECTED_ENV" ]; then
|
|
121
|
-
CONNECTION_STRING=$(powershell -Command "
|
|
122
|
-
\$json = Get-Content '$API_DIR/$SELECTED_ENV' -ErrorAction SilentlyContinue | ConvertFrom-Json
|
|
123
|
-
\$json.ConnectionStrings.DefaultConnection
|
|
124
|
-
" 2>/dev/null)
|
|
125
|
-
DATABASE_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Database=\K[^;]+' 2>/dev/null)
|
|
126
|
-
fi
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
**Afficher info environnement (informatif):**
|
|
130
|
-
|
|
131
|
-
```
|
|
132
|
-
NOTE: La migration sera appliquee sur: {DATABASE_NAME:-"(detecte au deploy)"}
|
|
133
|
-
Config: {SELECTED_ENV}
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## STEP 3: Search for Existing Migration for This Branch
|
|
139
|
-
|
|
140
|
-
```bash
|
|
141
|
-
# Search pattern based on branch name
|
|
142
|
-
SEARCH_PATTERN="${BRANCH_TYPE}_.*_${BRANCH_NAME}"
|
|
143
|
-
|
|
144
|
-
# Find matching migration files
|
|
145
|
-
EXISTING_MIGRATIONS=$(find "$MIGRATIONS_DIR" -name "*.cs" | grep -E "$SEARCH_PATTERN" | grep -v "Designer" | grep -v "Snapshot")
|
|
146
|
-
MIGRATION_COUNT=$(echo "$EXISTING_MIGRATIONS" | grep -c "." || echo "0")
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
**Display context:**
|
|
150
|
-
|
|
151
|
-
```
|
|
152
|
-
================================================================================
|
|
153
|
-
EF CORE MIGRATION - CONTEXT
|
|
154
|
-
================================================================================
|
|
155
|
-
|
|
156
|
-
BRANCH
|
|
157
|
-
Current: {CURRENT_BRANCH}
|
|
158
|
-
Type: {BRANCH_TYPE}
|
|
159
|
-
Name: {BRANCH_NAME}
|
|
160
|
-
|
|
161
|
-
VERSION: {VERSION}
|
|
162
|
-
|
|
163
|
-
EXISTING MIGRATIONS FOR THIS BRANCH:
|
|
164
|
-
{MIGRATION_COUNT} migration(s) found
|
|
165
|
-
{File list if > 0}
|
|
166
|
-
|
|
167
|
-
================================================================================
|
|
168
|
-
```
|
|
169
|
-
|
|
170
|
-
---
|
|
171
|
-
|
|
172
|
-
## STEP 4: Decision - Create or Recreate
|
|
173
|
-
|
|
174
|
-
### If existing migration (MIGRATION_COUNT > 0):
|
|
175
|
-
|
|
176
|
-
```javascript
|
|
177
|
-
AskUserQuestion({
|
|
178
|
-
questions: [{
|
|
179
|
-
question: "A migration already exists for this branch. What to do?",
|
|
180
|
-
header: "Migration",
|
|
181
|
-
options: [
|
|
182
|
-
{ label: "Recreate", description: "Delete and recreate the migration (Recommended)" },
|
|
183
|
-
{ label: "Keep", description: "Keep existing, add a new one (Not recommended)" },
|
|
184
|
-
{ label: "Cancel", description: "Do nothing" }
|
|
185
|
-
],
|
|
186
|
-
multiSelect: false
|
|
187
|
-
}]
|
|
188
|
-
})
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
**If Recreate:**
|
|
192
|
-
|
|
193
|
-
```bash
|
|
194
|
-
# 1. List migrations to delete
|
|
195
|
-
echo "Migrations to delete:"
|
|
196
|
-
for file in $EXISTING_MIGRATIONS; do
|
|
197
|
-
echo " - $file"
|
|
198
|
-
# Find associated files (Designer, etc.)
|
|
199
|
-
BASE_NAME=$(basename "$file" .cs)
|
|
200
|
-
rm -f "$MIGRATIONS_DIR/${BASE_NAME}.cs"
|
|
201
|
-
rm -f "$MIGRATIONS_DIR/${BASE_NAME}.Designer.cs"
|
|
202
|
-
done
|
|
203
|
-
|
|
204
|
-
# 2. Rollback in DB if applied
|
|
205
|
-
LAST_GOOD_MIGRATION=$(dotnet ef migrations list 2>/dev/null | grep -v "(Pending)" | tail -2 | head -1)
|
|
206
|
-
if [ -n "$LAST_GOOD_MIGRATION" ]; then
|
|
207
|
-
dotnet ef database update "$LAST_GOOD_MIGRATION" --force
|
|
208
|
-
fi
|
|
209
|
-
```
|
|
210
|
-
|
|
211
|
-
---
|
|
212
|
-
|
|
213
|
-
## STEP 5: Request Description
|
|
214
|
-
|
|
215
|
-
```javascript
|
|
216
|
-
AskUserQuestion({
|
|
217
|
-
questions: [{
|
|
218
|
-
question: "Short migration description (e.g., AddUserRoles, FixEmailIndex)",
|
|
219
|
-
header: "Description",
|
|
220
|
-
options: [
|
|
221
|
-
{ label: "Add", description: "Adding tables/columns" },
|
|
222
|
-
{ label: "Update", description: "Structure modification" },
|
|
223
|
-
{ label: "Fix", description: "Schema correction" },
|
|
224
|
-
{ label: "Remove", description: "Removing elements" }
|
|
225
|
-
],
|
|
226
|
-
multiSelect: false
|
|
227
|
-
}]
|
|
228
|
-
})
|
|
229
|
-
|
|
230
|
-
// Then ask for specific name in free text
|
|
231
|
-
// E.g., "AddUserRoles", "FixEmailNullable", "RemoveObsoleteTable"
|
|
232
|
-
```
|
|
233
|
-
|
|
234
|
-
---
|
|
235
|
-
|
|
236
|
-
## STEP 6: Generate Migration Name
|
|
237
|
-
|
|
238
|
-
```bash
|
|
239
|
-
# Pattern: {context}_v{version}_{sequence}_{Description}
|
|
240
|
-
# Example: core_v1.0.0_001_AddUserRoles
|
|
241
|
-
# This format is aligned with SmartStack MCP conventions
|
|
242
|
-
|
|
243
|
-
# Determine context based on branch type
|
|
244
|
-
if [[ "$BRANCH_TYPE" == "Feature" ]] || [[ "$BRANCH_TYPE" == "Hotfix" ]]; then
|
|
245
|
-
CONTEXT="core" # Default context for feature/hotfix
|
|
246
|
-
else
|
|
247
|
-
CONTEXT="core"
|
|
248
|
-
fi
|
|
249
|
-
|
|
250
|
-
# Get next sequence number
|
|
251
|
-
EXISTING_COUNT=$(find "$MIGRATIONS_DIR" -name "${CONTEXT}_v${VERSION}*.cs" | grep -v "Designer" | grep -v "Snapshot" | wc -l)
|
|
252
|
-
SEQUENCE=$(printf "%03d" $((EXISTING_COUNT + 1)))
|
|
253
|
-
|
|
254
|
-
MIGRATION_NAME="${CONTEXT}_v${VERSION}_${SEQUENCE}_${DESCRIPTION}"
|
|
255
|
-
|
|
256
|
-
# Clean the name (no spaces, no special characters except underscore and dot)
|
|
257
|
-
MIGRATION_NAME=$(echo "$MIGRATION_NAME" | sed 's/[^a-zA-Z0-9_.]//g')
|
|
258
|
-
|
|
259
|
-
echo "Migration name: $MIGRATION_NAME"
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
**Generated name examples (aligned with MCP):**
|
|
263
|
-
|
|
264
|
-
| Context | Version | Sequence | Description | Final Name |
|
|
265
|
-
|---------|---------|----------|-------------|------------|
|
|
266
|
-
| core | 1.2.0 | 001 | AddUserRoles | core_v1.2.0_001_AddUserRoles |
|
|
267
|
-
| core | 1.2.0 | 002 | AddPermissions | core_v1.2.0_002_AddPermissions |
|
|
268
|
-
| extensions | 1.3.0 | 001 | AddCustomFields | extensions_v1.3.0_001_AddCustomFields |
|
|
269
|
-
|
|
270
|
-
---
|
|
271
|
-
|
|
272
|
-
## STEP 7: Create Migration
|
|
273
|
-
|
|
274
|
-
```bash
|
|
275
|
-
cd "$PROJECT_DIR"
|
|
276
|
-
|
|
277
|
-
# Create migration with generated name
|
|
278
|
-
dotnet ef migrations add "$MIGRATION_NAME" --verbose
|
|
279
|
-
|
|
280
|
-
# Verify creation
|
|
281
|
-
if [ $? -eq 0 ]; then
|
|
282
|
-
echo "OK Migration created successfully"
|
|
283
|
-
|
|
284
|
-
# List created files
|
|
285
|
-
NEW_FILES=$(find "$MIGRATIONS_DIR" -name "*${MIGRATION_NAME}*" -type f)
|
|
286
|
-
echo ""
|
|
287
|
-
echo "Created files:"
|
|
288
|
-
for f in $NEW_FILES; do
|
|
289
|
-
echo " - $f"
|
|
290
|
-
done
|
|
291
|
-
else
|
|
292
|
-
echo "ERROR Failed to create migration"
|
|
293
|
-
exit 1
|
|
294
|
-
fi
|
|
295
|
-
```
|
|
296
|
-
|
|
297
|
-
---
|
|
298
|
-
|
|
299
|
-
## STEP 8: Content Validation
|
|
300
|
-
|
|
301
|
-
```bash
|
|
302
|
-
# Display migration preview
|
|
303
|
-
MIGRATION_FILE=$(find "$MIGRATIONS_DIR" -name "*${MIGRATION_NAME}.cs" | grep -v "Designer" | head -1)
|
|
304
|
-
|
|
305
|
-
echo ""
|
|
306
|
-
echo "================================================================================
|
|
307
|
-
MIGRATION PREVIEW
|
|
308
|
-
================================================================================"
|
|
309
|
-
echo ""
|
|
310
|
-
|
|
311
|
-
# Display Up() and Down() methods
|
|
312
|
-
grep -A 20 "protected override void Up" "$MIGRATION_FILE"
|
|
313
|
-
echo ""
|
|
314
|
-
echo "..."
|
|
315
|
-
echo ""
|
|
316
|
-
grep -A 10 "protected override void Down" "$MIGRATION_FILE"
|
|
317
|
-
```
|
|
318
|
-
|
|
319
|
-
**Verify operations:**
|
|
320
|
-
|
|
321
|
-
```javascript
|
|
322
|
-
AskUserQuestion({
|
|
323
|
-
questions: [{
|
|
324
|
-
question: "Does the migration look correct?",
|
|
325
|
-
header: "Validation",
|
|
326
|
-
options: [
|
|
327
|
-
{ label: "Yes, apply", description: "Deploy to local DB" },
|
|
328
|
-
{ label: "Yes, not now", description: "Keep without applying" },
|
|
329
|
-
{ label: "No, delete", description: "Cancel and start over" }
|
|
330
|
-
],
|
|
331
|
-
multiSelect: false
|
|
332
|
-
}]
|
|
333
|
-
})
|
|
334
|
-
```
|
|
335
|
-
|
|
336
|
-
---
|
|
337
|
-
|
|
338
|
-
## STEP 9: Summary
|
|
339
|
-
|
|
340
|
-
```
|
|
341
|
-
================================================================================
|
|
342
|
-
MIGRATION CREATED
|
|
343
|
-
================================================================================
|
|
344
|
-
|
|
345
|
-
NAME: {MIGRATION_NAME}
|
|
346
|
-
BRANCH: {CURRENT_BRANCH}
|
|
347
|
-
VERSION: {VERSION}
|
|
348
|
-
|
|
349
|
-
FILES:
|
|
350
|
-
OK {timestamp}_{MIGRATION_NAME}.cs
|
|
351
|
-
OK {timestamp}_{MIGRATION_NAME}.Designer.cs
|
|
352
|
-
OK ApplicationDbContextModelSnapshot.cs (updated)
|
|
353
|
-
|
|
354
|
-
RULES FOLLOWED:
|
|
355
|
-
OK 1 migration per feature
|
|
356
|
-
OK Standardized naming
|
|
357
|
-
OK Branch/version traceability
|
|
358
|
-
|
|
359
|
-
================================================================================
|
|
360
|
-
NEXT STEPS
|
|
361
|
-
================================================================================
|
|
362
|
-
|
|
363
|
-
1. Review generated code in Migrations/
|
|
364
|
-
2. /efcore:db-deploy -> Apply to local DB
|
|
365
|
-
3. /gitflow:3-commit -> Commit changes
|
|
366
|
-
4. Before merge: rebase on develop + recreate if conflicts
|
|
367
|
-
|
|
368
|
-
================================================================================
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
---
|
|
372
|
-
|
|
373
|
-
## Migration Conflict Handling
|
|
374
|
-
|
|
375
|
-
When you rebase on develop and there are conflicts on ModelSnapshot:
|
|
376
|
-
|
|
377
|
-
```bash
|
|
378
|
-
# 1. Accept develop version for ModelSnapshot
|
|
379
|
-
git checkout --theirs Migrations/ApplicationDbContextModelSnapshot.cs
|
|
380
|
-
|
|
381
|
-
# 2. Delete your migration
|
|
382
|
-
rm Migrations/*_{MIGRATION_NAME}.*
|
|
383
|
-
|
|
384
|
-
# 3. Recreate the migration
|
|
385
|
-
/efcore:migration
|
|
386
|
-
```
|
|
387
|
-
|
|
388
|
-
This command will do it automatically if it detects a conflict.
|
|
389
|
-
|
|
390
|
-
---
|
|
391
|
-
|
|
392
|
-
## Options
|
|
393
|
-
|
|
394
|
-
| Option | Description |
|
|
395
|
-
|--------|-------------|
|
|
396
|
-
| `--name {name}` | Force a specific name |
|
|
397
|
-
| `--no-apply` | Don't offer to apply |
|
|
398
|
-
| `--force` | Delete existing without confirmation |
|
|
399
|
-
| `--no-cross-check` | Disable cross-branch validation |
|
|
400
|
-
| `--rebase-first` | Run rebase-snapshot automatically if conflict |
|
|
1
|
+
---
|
|
2
|
+
description: Create or recreate the EF Core migration for the current branch (1 migration per feature)
|
|
3
|
+
agent: efcore-migration
|
|
4
|
+
model: sonnet
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# EF Core Migration - 1 Migration per Feature
|
|
8
|
+
|
|
9
|
+
Creates or recreates the unique migration for the current branch.
|
|
10
|
+
|
|
11
|
+
**GOLDEN RULE: 1 single migration per feature/hotfix. If it already exists, delete and recreate it.**
|
|
12
|
+
|
|
13
|
+
> **CLAUDE INSTRUCTION:** The `AskUserQuestion({...})` blocks are instructions to use the `AskUserQuestion` tool **interactively**. You MUST execute the tool with these parameters to get the user's response BEFORE continuing.
|
|
14
|
+
|
|
15
|
+
---
|
|
16
|
+
|
|
17
|
+
## STEP 0: Cross-Branch Validation (v1.2)
|
|
18
|
+
|
|
19
|
+
**NEW:** Before creating a migration, check for conflicts with other branches.
|
|
20
|
+
|
|
21
|
+
```bash
|
|
22
|
+
# Check if cross-branch validation is enabled
|
|
23
|
+
CROSS_BRANCH_ENABLED=$(git config --get efcore.crossBranch.enabled 2>/dev/null || echo "true")
|
|
24
|
+
BLOCK_ON_CONFLICT=$(git config --get efcore.crossBranch.blockOnConflict 2>/dev/null || echo "true")
|
|
25
|
+
|
|
26
|
+
if [ "$CROSS_BRANCH_ENABLED" = "true" ]; then
|
|
27
|
+
echo "Cross-branch validation..."
|
|
28
|
+
|
|
29
|
+
# Scan other branches via worktrees
|
|
30
|
+
WORKTREE_BASE=$(git config --get gitflow.worktrees.basePath 2>/dev/null || echo "../worktrees")
|
|
31
|
+
|
|
32
|
+
if [ -d "$WORKTREE_BASE/develop" ]; then
|
|
33
|
+
# Compare ModelSnapshot with develop
|
|
34
|
+
LOCAL_SNAPSHOT=$(find . -name "*ModelSnapshot.cs" -not -path "*/node_modules/*" | head -1)
|
|
35
|
+
DEVELOP_SNAPSHOT=$(find "$WORKTREE_BASE/develop" -name "*ModelSnapshot.cs" | head -1)
|
|
36
|
+
|
|
37
|
+
if [ -n "$LOCAL_SNAPSHOT" ] && [ -n "$DEVELOP_SNAPSHOT" ]; then
|
|
38
|
+
if ! diff -q "$LOCAL_SNAPSHOT" "$DEVELOP_SNAPSHOT" > /dev/null 2>&1; then
|
|
39
|
+
# Differences detected - analyze risk level
|
|
40
|
+
DIFF_LINES=$(diff "$DEVELOP_SNAPSHOT" "$LOCAL_SNAPSHOT" 2>/dev/null | wc -l)
|
|
41
|
+
|
|
42
|
+
if [ "$DIFF_LINES" -gt 100 ]; then
|
|
43
|
+
echo ""
|
|
44
|
+
echo "WARNING: CROSS-BRANCH CONFLICT DETECTED"
|
|
45
|
+
echo ""
|
|
46
|
+
echo "Your ModelSnapshot differs significantly from develop."
|
|
47
|
+
echo "Differences: $DIFF_LINES lines"
|
|
48
|
+
echo ""
|
|
49
|
+
echo "RESOLUTIONS:"
|
|
50
|
+
echo " 1. /efcore:rebase-snapshot (recommended)"
|
|
51
|
+
echo " 2. /efcore:conflicts (see details)"
|
|
52
|
+
echo " 3. /efcore:migration --force (not recommended)"
|
|
53
|
+
echo ""
|
|
54
|
+
|
|
55
|
+
if [ "$BLOCK_ON_CONFLICT" = "true" ]; then
|
|
56
|
+
echo "BLOCKED: Use --force to ignore"
|
|
57
|
+
exit 1
|
|
58
|
+
fi
|
|
59
|
+
fi
|
|
60
|
+
fi
|
|
61
|
+
fi
|
|
62
|
+
fi
|
|
63
|
+
|
|
64
|
+
echo "Cross-branch validation: OK"
|
|
65
|
+
fi
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
**Options to ignore:**
|
|
69
|
+
- `--force` : Ignore cross-branch validation
|
|
70
|
+
- `--no-cross-check` : Disable validation for this execution
|
|
71
|
+
- `--rebase-first` : Run rebase-snapshot automatically if conflict
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## STEP 1: Analyze Git Context
|
|
76
|
+
|
|
77
|
+
```bash
|
|
78
|
+
# Current branch
|
|
79
|
+
CURRENT_BRANCH=$(git branch --show-current)
|
|
80
|
+
|
|
81
|
+
# Extract type and name
|
|
82
|
+
if [[ "$CURRENT_BRANCH" == feature/* ]]; then
|
|
83
|
+
BRANCH_TYPE="Feature"
|
|
84
|
+
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/feature\///' | sed 's/-/_/g' | sed 's/\b\w/\u&/g')
|
|
85
|
+
elif [[ "$CURRENT_BRANCH" == hotfix/* ]]; then
|
|
86
|
+
BRANCH_TYPE="Hotfix"
|
|
87
|
+
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/hotfix\///' | sed 's/-/_/g' | sed 's/\b\w/\u&/g')
|
|
88
|
+
elif [[ "$CURRENT_BRANCH" == release/* ]]; then
|
|
89
|
+
BRANCH_TYPE="Release"
|
|
90
|
+
BRANCH_NAME=$(echo "$CURRENT_BRANCH" | sed 's/release\///' | sed 's/v//')
|
|
91
|
+
else
|
|
92
|
+
BRANCH_TYPE="Dev"
|
|
93
|
+
BRANCH_NAME="Manual"
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
# Current version
|
|
97
|
+
VERSION=$(grep -oP '"version":\s*"\K[^"]+' package.json 2>/dev/null || grep -oP '(?<=<Version>).*(?=</Version>)' *.csproj 2>/dev/null | head -1)
|
|
98
|
+
VERSION_CLEAN=$(echo "$VERSION" | sed 's/\./_/g')
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## STEP 2: Detect EF Core Project et Environnement
|
|
104
|
+
|
|
105
|
+
```bash
|
|
106
|
+
# Find the project with EF Core
|
|
107
|
+
CSPROJ=$(find . -name "*.csproj" -exec grep -l "Microsoft.EntityFrameworkCore" {} \; | head -1)
|
|
108
|
+
PROJECT_DIR=$(dirname "$CSPROJ")
|
|
109
|
+
PROJECT_NAME=$(basename "$CSPROJ" .csproj)
|
|
110
|
+
|
|
111
|
+
# Migrations folder
|
|
112
|
+
MIGRATIONS_DIR="$PROJECT_DIR/Migrations"
|
|
113
|
+
|
|
114
|
+
# Detect API project for environment display
|
|
115
|
+
API_DIR=$(find . -type d -name "*.Api" | head -1)
|
|
116
|
+
[ -z "$API_DIR" ] && API_DIR="src/SmartStack.Api"
|
|
117
|
+
|
|
118
|
+
# Detect appsettings to show which DB will be affected on deploy
|
|
119
|
+
SELECTED_ENV="appsettings.Local.json"
|
|
120
|
+
if [ -f "$API_DIR/$SELECTED_ENV" ]; then
|
|
121
|
+
CONNECTION_STRING=$(powershell -Command "
|
|
122
|
+
\$json = Get-Content '$API_DIR/$SELECTED_ENV' -ErrorAction SilentlyContinue | ConvertFrom-Json
|
|
123
|
+
\$json.ConnectionStrings.DefaultConnection
|
|
124
|
+
" 2>/dev/null)
|
|
125
|
+
DATABASE_NAME=$(echo "$CONNECTION_STRING" | grep -oP 'Database=\K[^;]+' 2>/dev/null)
|
|
126
|
+
fi
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
**Afficher info environnement (informatif):**
|
|
130
|
+
|
|
131
|
+
```
|
|
132
|
+
NOTE: La migration sera appliquee sur: {DATABASE_NAME:-"(detecte au deploy)"}
|
|
133
|
+
Config: {SELECTED_ENV}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
## STEP 3: Search for Existing Migration for This Branch
|
|
139
|
+
|
|
140
|
+
```bash
|
|
141
|
+
# Search pattern based on branch name
|
|
142
|
+
SEARCH_PATTERN="${BRANCH_TYPE}_.*_${BRANCH_NAME}"
|
|
143
|
+
|
|
144
|
+
# Find matching migration files
|
|
145
|
+
EXISTING_MIGRATIONS=$(find "$MIGRATIONS_DIR" -name "*.cs" | grep -E "$SEARCH_PATTERN" | grep -v "Designer" | grep -v "Snapshot")
|
|
146
|
+
MIGRATION_COUNT=$(echo "$EXISTING_MIGRATIONS" | grep -c "." || echo "0")
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
**Display context:**
|
|
150
|
+
|
|
151
|
+
```
|
|
152
|
+
================================================================================
|
|
153
|
+
EF CORE MIGRATION - CONTEXT
|
|
154
|
+
================================================================================
|
|
155
|
+
|
|
156
|
+
BRANCH
|
|
157
|
+
Current: {CURRENT_BRANCH}
|
|
158
|
+
Type: {BRANCH_TYPE}
|
|
159
|
+
Name: {BRANCH_NAME}
|
|
160
|
+
|
|
161
|
+
VERSION: {VERSION}
|
|
162
|
+
|
|
163
|
+
EXISTING MIGRATIONS FOR THIS BRANCH:
|
|
164
|
+
{MIGRATION_COUNT} migration(s) found
|
|
165
|
+
{File list if > 0}
|
|
166
|
+
|
|
167
|
+
================================================================================
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## STEP 4: Decision - Create or Recreate
|
|
173
|
+
|
|
174
|
+
### If existing migration (MIGRATION_COUNT > 0):
|
|
175
|
+
|
|
176
|
+
```javascript
|
|
177
|
+
AskUserQuestion({
|
|
178
|
+
questions: [{
|
|
179
|
+
question: "A migration already exists for this branch. What to do?",
|
|
180
|
+
header: "Migration",
|
|
181
|
+
options: [
|
|
182
|
+
{ label: "Recreate", description: "Delete and recreate the migration (Recommended)" },
|
|
183
|
+
{ label: "Keep", description: "Keep existing, add a new one (Not recommended)" },
|
|
184
|
+
{ label: "Cancel", description: "Do nothing" }
|
|
185
|
+
],
|
|
186
|
+
multiSelect: false
|
|
187
|
+
}]
|
|
188
|
+
})
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
**If Recreate:**
|
|
192
|
+
|
|
193
|
+
```bash
|
|
194
|
+
# 1. List migrations to delete
|
|
195
|
+
echo "Migrations to delete:"
|
|
196
|
+
for file in $EXISTING_MIGRATIONS; do
|
|
197
|
+
echo " - $file"
|
|
198
|
+
# Find associated files (Designer, etc.)
|
|
199
|
+
BASE_NAME=$(basename "$file" .cs)
|
|
200
|
+
rm -f "$MIGRATIONS_DIR/${BASE_NAME}.cs"
|
|
201
|
+
rm -f "$MIGRATIONS_DIR/${BASE_NAME}.Designer.cs"
|
|
202
|
+
done
|
|
203
|
+
|
|
204
|
+
# 2. Rollback in DB if applied
|
|
205
|
+
LAST_GOOD_MIGRATION=$(dotnet ef migrations list 2>/dev/null | grep -v "(Pending)" | tail -2 | head -1)
|
|
206
|
+
if [ -n "$LAST_GOOD_MIGRATION" ]; then
|
|
207
|
+
dotnet ef database update "$LAST_GOOD_MIGRATION" --force
|
|
208
|
+
fi
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## STEP 5: Request Description
|
|
214
|
+
|
|
215
|
+
```javascript
|
|
216
|
+
AskUserQuestion({
|
|
217
|
+
questions: [{
|
|
218
|
+
question: "Short migration description (e.g., AddUserRoles, FixEmailIndex)",
|
|
219
|
+
header: "Description",
|
|
220
|
+
options: [
|
|
221
|
+
{ label: "Add", description: "Adding tables/columns" },
|
|
222
|
+
{ label: "Update", description: "Structure modification" },
|
|
223
|
+
{ label: "Fix", description: "Schema correction" },
|
|
224
|
+
{ label: "Remove", description: "Removing elements" }
|
|
225
|
+
],
|
|
226
|
+
multiSelect: false
|
|
227
|
+
}]
|
|
228
|
+
})
|
|
229
|
+
|
|
230
|
+
// Then ask for specific name in free text
|
|
231
|
+
// E.g., "AddUserRoles", "FixEmailNullable", "RemoveObsoleteTable"
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
---
|
|
235
|
+
|
|
236
|
+
## STEP 6: Generate Migration Name
|
|
237
|
+
|
|
238
|
+
```bash
|
|
239
|
+
# Pattern: {context}_v{version}_{sequence}_{Description}
|
|
240
|
+
# Example: core_v1.0.0_001_AddUserRoles
|
|
241
|
+
# This format is aligned with SmartStack MCP conventions
|
|
242
|
+
|
|
243
|
+
# Determine context based on branch type
|
|
244
|
+
if [[ "$BRANCH_TYPE" == "Feature" ]] || [[ "$BRANCH_TYPE" == "Hotfix" ]]; then
|
|
245
|
+
CONTEXT="core" # Default context for feature/hotfix
|
|
246
|
+
else
|
|
247
|
+
CONTEXT="core"
|
|
248
|
+
fi
|
|
249
|
+
|
|
250
|
+
# Get next sequence number
|
|
251
|
+
EXISTING_COUNT=$(find "$MIGRATIONS_DIR" -name "${CONTEXT}_v${VERSION}*.cs" | grep -v "Designer" | grep -v "Snapshot" | wc -l)
|
|
252
|
+
SEQUENCE=$(printf "%03d" $((EXISTING_COUNT + 1)))
|
|
253
|
+
|
|
254
|
+
MIGRATION_NAME="${CONTEXT}_v${VERSION}_${SEQUENCE}_${DESCRIPTION}"
|
|
255
|
+
|
|
256
|
+
# Clean the name (no spaces, no special characters except underscore and dot)
|
|
257
|
+
MIGRATION_NAME=$(echo "$MIGRATION_NAME" | sed 's/[^a-zA-Z0-9_.]//g')
|
|
258
|
+
|
|
259
|
+
echo "Migration name: $MIGRATION_NAME"
|
|
260
|
+
```
|
|
261
|
+
|
|
262
|
+
**Generated name examples (aligned with MCP):**
|
|
263
|
+
|
|
264
|
+
| Context | Version | Sequence | Description | Final Name |
|
|
265
|
+
|---------|---------|----------|-------------|------------|
|
|
266
|
+
| core | 1.2.0 | 001 | AddUserRoles | core_v1.2.0_001_AddUserRoles |
|
|
267
|
+
| core | 1.2.0 | 002 | AddPermissions | core_v1.2.0_002_AddPermissions |
|
|
268
|
+
| extensions | 1.3.0 | 001 | AddCustomFields | extensions_v1.3.0_001_AddCustomFields |
|
|
269
|
+
|
|
270
|
+
---
|
|
271
|
+
|
|
272
|
+
## STEP 7: Create Migration
|
|
273
|
+
|
|
274
|
+
```bash
|
|
275
|
+
cd "$PROJECT_DIR"
|
|
276
|
+
|
|
277
|
+
# Create migration with generated name
|
|
278
|
+
dotnet ef migrations add "$MIGRATION_NAME" --verbose
|
|
279
|
+
|
|
280
|
+
# Verify creation
|
|
281
|
+
if [ $? -eq 0 ]; then
|
|
282
|
+
echo "OK Migration created successfully"
|
|
283
|
+
|
|
284
|
+
# List created files
|
|
285
|
+
NEW_FILES=$(find "$MIGRATIONS_DIR" -name "*${MIGRATION_NAME}*" -type f)
|
|
286
|
+
echo ""
|
|
287
|
+
echo "Created files:"
|
|
288
|
+
for f in $NEW_FILES; do
|
|
289
|
+
echo " - $f"
|
|
290
|
+
done
|
|
291
|
+
else
|
|
292
|
+
echo "ERROR Failed to create migration"
|
|
293
|
+
exit 1
|
|
294
|
+
fi
|
|
295
|
+
```
|
|
296
|
+
|
|
297
|
+
---
|
|
298
|
+
|
|
299
|
+
## STEP 8: Content Validation
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# Display migration preview
|
|
303
|
+
MIGRATION_FILE=$(find "$MIGRATIONS_DIR" -name "*${MIGRATION_NAME}.cs" | grep -v "Designer" | head -1)
|
|
304
|
+
|
|
305
|
+
echo ""
|
|
306
|
+
echo "================================================================================
|
|
307
|
+
MIGRATION PREVIEW
|
|
308
|
+
================================================================================"
|
|
309
|
+
echo ""
|
|
310
|
+
|
|
311
|
+
# Display Up() and Down() methods
|
|
312
|
+
grep -A 20 "protected override void Up" "$MIGRATION_FILE"
|
|
313
|
+
echo ""
|
|
314
|
+
echo "..."
|
|
315
|
+
echo ""
|
|
316
|
+
grep -A 10 "protected override void Down" "$MIGRATION_FILE"
|
|
317
|
+
```
|
|
318
|
+
|
|
319
|
+
**Verify operations:**
|
|
320
|
+
|
|
321
|
+
```javascript
|
|
322
|
+
AskUserQuestion({
|
|
323
|
+
questions: [{
|
|
324
|
+
question: "Does the migration look correct?",
|
|
325
|
+
header: "Validation",
|
|
326
|
+
options: [
|
|
327
|
+
{ label: "Yes, apply", description: "Deploy to local DB" },
|
|
328
|
+
{ label: "Yes, not now", description: "Keep without applying" },
|
|
329
|
+
{ label: "No, delete", description: "Cancel and start over" }
|
|
330
|
+
],
|
|
331
|
+
multiSelect: false
|
|
332
|
+
}]
|
|
333
|
+
})
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
---
|
|
337
|
+
|
|
338
|
+
## STEP 9: Summary
|
|
339
|
+
|
|
340
|
+
```
|
|
341
|
+
================================================================================
|
|
342
|
+
MIGRATION CREATED
|
|
343
|
+
================================================================================
|
|
344
|
+
|
|
345
|
+
NAME: {MIGRATION_NAME}
|
|
346
|
+
BRANCH: {CURRENT_BRANCH}
|
|
347
|
+
VERSION: {VERSION}
|
|
348
|
+
|
|
349
|
+
FILES:
|
|
350
|
+
OK {timestamp}_{MIGRATION_NAME}.cs
|
|
351
|
+
OK {timestamp}_{MIGRATION_NAME}.Designer.cs
|
|
352
|
+
OK ApplicationDbContextModelSnapshot.cs (updated)
|
|
353
|
+
|
|
354
|
+
RULES FOLLOWED:
|
|
355
|
+
OK 1 migration per feature
|
|
356
|
+
OK Standardized naming
|
|
357
|
+
OK Branch/version traceability
|
|
358
|
+
|
|
359
|
+
================================================================================
|
|
360
|
+
NEXT STEPS
|
|
361
|
+
================================================================================
|
|
362
|
+
|
|
363
|
+
1. Review generated code in Migrations/
|
|
364
|
+
2. /efcore:db-deploy -> Apply to local DB
|
|
365
|
+
3. /gitflow:3-commit -> Commit changes
|
|
366
|
+
4. Before merge: rebase on develop + recreate if conflicts
|
|
367
|
+
|
|
368
|
+
================================================================================
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
---
|
|
372
|
+
|
|
373
|
+
## Migration Conflict Handling
|
|
374
|
+
|
|
375
|
+
When you rebase on develop and there are conflicts on ModelSnapshot:
|
|
376
|
+
|
|
377
|
+
```bash
|
|
378
|
+
# 1. Accept develop version for ModelSnapshot
|
|
379
|
+
git checkout --theirs Migrations/ApplicationDbContextModelSnapshot.cs
|
|
380
|
+
|
|
381
|
+
# 2. Delete your migration
|
|
382
|
+
rm Migrations/*_{MIGRATION_NAME}.*
|
|
383
|
+
|
|
384
|
+
# 3. Recreate the migration
|
|
385
|
+
/efcore:migration
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
This command will do it automatically if it detects a conflict.
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
## Options
|
|
393
|
+
|
|
394
|
+
| Option | Description |
|
|
395
|
+
|--------|-------------|
|
|
396
|
+
| `--name {name}` | Force a specific name |
|
|
397
|
+
| `--no-apply` | Don't offer to apply |
|
|
398
|
+
| `--force` | Delete existing without confirmation |
|
|
399
|
+
| `--no-cross-check` | Disable cross-branch validation |
|
|
400
|
+
| `--rebase-first` | Run rebase-snapshot automatically if conflict |
|