@atlashub/smartstack-cli 4.35.0 → 4.37.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/dist/index.js +54 -100
- package/dist/index.js.map +1 -1
- package/dist/mcp-entry.mjs +54 -11
- package/dist/mcp-entry.mjs.map +1 -1
- package/package.json +1 -1
- package/templates/agents/efcore/migration.md +43 -0
- package/templates/agents/efcore/rebase-snapshot.md +36 -0
- package/templates/agents/efcore/squash.md +36 -0
- package/templates/skills/apex/references/checks/seed-checks.sh +1 -1
- package/templates/skills/apex/references/core-seed-data.md +39 -21
- package/templates/skills/application/references/application-roles-template.md +14 -8
- package/templates/skills/application/references/provider-template.md +32 -20
- package/templates/skills/application/templates-frontend.md +294 -2
- package/templates/skills/application/templates-seed.md +23 -11
- package/templates/skills/audit-route/SKILL.md +107 -0
- package/templates/skills/audit-route/references/routing-pattern.md +129 -0
- package/templates/skills/audit-route/steps/step-00-init.md +128 -0
- package/templates/skills/audit-route/steps/step-01-inventory.md +157 -0
- package/templates/skills/audit-route/steps/step-02-conformity.md +193 -0
- package/templates/skills/audit-route/steps/step-03-report.md +201 -0
- package/templates/skills/dev-start/SKILL.md +12 -2
- package/templates/skills/efcore/SKILL.md +219 -67
- package/templates/agents/efcore/conflicts.md +0 -114
- package/templates/agents/efcore/db-deploy.md +0 -86
- package/templates/agents/efcore/db-reset.md +0 -98
- package/templates/agents/efcore/db-seed.md +0 -73
- package/templates/agents/efcore/db-status.md +0 -97
- package/templates/agents/efcore/scan.md +0 -124
- package/templates/skills/efcore/references/both-contexts.md +0 -32
- package/templates/skills/efcore/references/destructive-operations.md +0 -38
- package/templates/skills/efcore/steps/db/step-deploy.md +0 -217
- package/templates/skills/efcore/steps/db/step-reset.md +0 -186
- package/templates/skills/efcore/steps/db/step-seed.md +0 -166
- package/templates/skills/efcore/steps/db/step-status.md +0 -173
- package/templates/skills/efcore/steps/migration/step-00-init.md +0 -102
- package/templates/skills/efcore/steps/migration/step-01-check.md +0 -164
- package/templates/skills/efcore/steps/migration/step-02-create.md +0 -160
- package/templates/skills/efcore/steps/migration/step-03-validate.md +0 -168
- package/templates/skills/efcore/steps/rebase-snapshot/step-00-init.md +0 -173
- package/templates/skills/efcore/steps/rebase-snapshot/step-01-backup.md +0 -100
- package/templates/skills/efcore/steps/rebase-snapshot/step-02-fetch.md +0 -115
- package/templates/skills/efcore/steps/rebase-snapshot/step-03-create.md +0 -112
- package/templates/skills/efcore/steps/rebase-snapshot/step-04-validate.md +0 -157
- package/templates/skills/efcore/steps/shared/step-00-init.md +0 -131
- package/templates/skills/efcore/steps/squash/step-00-init.md +0 -141
- package/templates/skills/efcore/steps/squash/step-01-backup.md +0 -120
- package/templates/skills/efcore/steps/squash/step-02-fetch.md +0 -168
- package/templates/skills/efcore/steps/squash/step-03-create.md +0 -184
- package/templates/skills/efcore/steps/squash/step-04-validate.md +0 -174
|
@@ -180,12 +180,22 @@ Use `Bash(run_in_background=true)` so it runs in background.
|
|
|
180
180
|
2. If `--reset` OR no stored password:
|
|
181
181
|
a. If backend was just launched, wait for it to be UP first:
|
|
182
182
|
```bash
|
|
183
|
-
#
|
|
183
|
+
# Phase 1: Wait for port to be bound (up to 30s)
|
|
184
184
|
for i in $(seq 1 10); do
|
|
185
185
|
netstat.exe -ano | grep ":${API_PORT} .*LISTENING" && break
|
|
186
186
|
sleep 3
|
|
187
187
|
done
|
|
188
188
|
```
|
|
189
|
+
```bash
|
|
190
|
+
# Phase 2: Wait for API to actually respond to HTTP requests (up to 30s)
|
|
191
|
+
# Kestrel binds the port BEFORE the app is fully initialized.
|
|
192
|
+
# We must confirm the API actually responds before resetting the password.
|
|
193
|
+
for i in $(seq 1 10); do
|
|
194
|
+
curl -s -o /dev/null -w "%{http_code}" "http://localhost:${API_PORT}/scalar" 2>/dev/null | grep -q "200" && break
|
|
195
|
+
sleep 3
|
|
196
|
+
done
|
|
197
|
+
```
|
|
198
|
+
If `/scalar` does not return 200 after 30s, warn the user and attempt the reset anyway.
|
|
189
199
|
b. Run: `smartstack admin reset --force --json`
|
|
190
200
|
c. Parse JSON output to extract email and password
|
|
191
201
|
d. Write `.claude/dev-session.json`:
|
|
@@ -224,7 +234,7 @@ Use `Bash(run_in_background=true)` so it runs in background.
|
|
|
224
234
|
|
|
225
235
|
<important_notes>
|
|
226
236
|
|
|
227
|
-
1. **Backend must be
|
|
237
|
+
1. **Backend must be READY before admin reset** - First poll the port (netstat), then poll the `/health` endpoint (HTTP 200) to confirm the API is fully initialized. Kestrel binds the port before the app finishes starting, so port-only checks are insufficient.
|
|
228
238
|
2. **Cross-worktree support** - Detect the correct API directory regardless of which worktree we're in
|
|
229
239
|
3. **No MCP required** - This skill only uses bash commands and the `smartstack` CLI
|
|
230
240
|
4. **Config coherence is critical** - Mismatched ports between backend/frontend is the #1 cause of "it doesn't work" issues
|
|
@@ -9,92 +9,244 @@ disable-model-invocation: true
|
|
|
9
9
|
- Preflight: !`if [ -f .git ] && grep -q '^gitdir: [A-Za-z]:' .git 2>/dev/null && grep -qi microsoft /proc/version 2>/dev/null; then p=$(sed 's/^gitdir: //' .git | tr -d '\r\n'); d=$(echo "${p:0:1}" | tr A-Z a-z); r="${p:2}"; r="${r//\\//}"; printf 'gitdir: %s\n' "$(realpath -m --relative-to="$(pwd)" "/mnt/$d$r")" > .git && echo "repaired"; else echo "ok"; fi`
|
|
10
10
|
- Branch: !`git branch --show-current 2>/dev/null || echo "UNAVAILABLE"`
|
|
11
11
|
|
|
12
|
-
<
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
<routing>
|
|
13
|
+
|
|
14
|
+
Parse `$ARGUMENTS` to determine the command:
|
|
15
|
+
|
|
16
|
+
| Command | Execution | Model |
|
|
17
|
+
|---------|-----------|-------|
|
|
18
|
+
| `db-status` | **Inline** `<command-db-status>` | — |
|
|
19
|
+
| `db-deploy` | **Inline** `<command-db-deploy>` | — |
|
|
20
|
+
| `db-reset` | **Inline** `<command-db-reset>` | — |
|
|
21
|
+
| `db-seed` | **Inline** `<command-db-seed>` | — |
|
|
22
|
+
| `scan` | **Inline** `<command-scan>` | — |
|
|
23
|
+
| `conflicts` | **Inline** `<command-conflicts>` | — |
|
|
24
|
+
| `migration` | **Agent** `efcore-migration` | sonnet |
|
|
25
|
+
| `squash` | **Agent** `efcore-squash` | sonnet |
|
|
26
|
+
| `rebase-snapshot` | **Agent** `efcore-rebase-snapshot` | sonnet |
|
|
27
|
+
|
|
28
|
+
**Inline commands:** Execute directly following the matching `<command-*>` section below.
|
|
29
|
+
**Agent commands:** Delegate via Agent tool:
|
|
30
|
+
```
|
|
31
|
+
Agent(
|
|
32
|
+
subagent_type: "{agent_name}",
|
|
33
|
+
model: "sonnet",
|
|
34
|
+
prompt: "Execute /efcore {command} in {cwd}. Branch: {branch}. Flags: {flags}. Description: {description}"
|
|
35
|
+
)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Flags:** `--context <name>` (CoreDbContext/ExtensionsDbContext), `--force` (skip confirmations)
|
|
39
|
+
|
|
40
|
+
</routing>
|
|
41
|
+
|
|
42
|
+
<shared>
|
|
43
|
+
|
|
44
|
+
### WSL Preflight (MANDATORY before any git command)
|
|
15
45
|
|
|
16
|
-
<quick_start>
|
|
17
|
-
**Database operations:**
|
|
18
46
|
```bash
|
|
19
|
-
/
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
47
|
+
if [ -f .git ] && grep -q '^gitdir: [A-Za-z]:' .git 2>/dev/null && grep -qi microsoft /proc/version 2>/dev/null; then
|
|
48
|
+
p=$(sed 's/^gitdir: //' .git | tr -d '\r\n'); d=$(echo "${p:0:1}" | tr A-Z a-z); r="${p:2}"; r="${r//\\//}"
|
|
49
|
+
printf 'gitdir: %s\n' "$(realpath -m --relative-to="$(pwd)" "/mnt/$d$r")" > .git
|
|
50
|
+
fi
|
|
23
51
|
```
|
|
24
52
|
|
|
25
|
-
|
|
53
|
+
### dotnet-ef PATH fix (MANDATORY before any dotnet ef command)
|
|
54
|
+
|
|
26
55
|
```bash
|
|
27
|
-
|
|
28
|
-
/
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
/
|
|
56
|
+
if ! dotnet ef --version &>/dev/null; then
|
|
57
|
+
for TOOLS_DIR in "$USERPROFILE/.dotnet/tools" "$HOME/.dotnet/tools" "$LOCALAPPDATA/Microsoft/dotnet/tools"; do
|
|
58
|
+
[ -n "$TOOLS_DIR" ] && [ -d "$TOOLS_DIR" ] && export PATH="$TOOLS_DIR:$PATH"
|
|
59
|
+
done
|
|
60
|
+
dotnet ef --version &>/dev/null || { echo "ERROR: dotnet-ef not found. Install: dotnet tool install --global dotnet-ef"; exit 1; }
|
|
61
|
+
fi
|
|
32
62
|
```
|
|
33
|
-
</quick_start>
|
|
34
63
|
|
|
35
|
-
|
|
36
|
-
| Flag | Description |
|
|
37
|
-
|------|-------------|
|
|
38
|
-
| `--context <name>` | Specify DbContext (CoreDbContext/ExtensionsDbContext) |
|
|
39
|
-
| `--force` | Skip confirmations |
|
|
40
|
-
</flags>
|
|
64
|
+
### Dual DbContext Architecture
|
|
41
65
|
|
|
42
|
-
|
|
66
|
+
| Context | DbContext | Schema | History Table |
|
|
67
|
+
|---------|-----------|--------|---------------|
|
|
68
|
+
| `core` | `CoreDbContext` | `core` | `core.__EFMigrationsHistory` |
|
|
69
|
+
| `extensions` | `ExtensionsDbContext` | `extensions` | `extensions.__EFMigrationsHistory` |
|
|
70
|
+
|
|
71
|
+
**Deploy order:** Core FIRST, then Extensions (FK dependency).
|
|
72
|
+
Both contexts share the same physical database but use different schemas.
|
|
73
|
+
|
|
74
|
+
### Safety Rules
|
|
43
75
|
|
|
44
|
-
**
|
|
76
|
+
1. **Production BLOCKED** — Never run on production
|
|
77
|
+
2. **Backup MANDATORY** for destructive operations (db-reset, squash)
|
|
78
|
+
3. **1 migration per feature** — Recreate, don't accumulate
|
|
79
|
+
4. **MCP for naming** — Never hardcode migration names
|
|
80
|
+
|
|
81
|
+
### Migration Naming (MCP MANDATORY)
|
|
82
|
+
|
|
83
|
+
Pattern: `{context}_v{version}_{sequence}_{Description}`
|
|
84
|
+
**FORBIDDEN:** Manual name calculation. Always use `mcp__smartstack__suggest_migration`.
|
|
45
85
|
|
|
46
|
-
|
|
86
|
+
</shared>
|
|
47
87
|
|
|
48
|
-
|
|
49
|
-
|---------|----------------------------|-------|-------------|
|
|
50
|
-
| `db-status` | `efcore-db-status` | haiku | Fast migration state check |
|
|
51
|
-
| `db-deploy` | `efcore-db-deploy` | haiku | Apply pending migrations |
|
|
52
|
-
| `db-reset` | `efcore-db-reset` | haiku | Drop + recreate database |
|
|
53
|
-
| `db-seed` | `efcore-db-seed` | haiku | Populate with test data |
|
|
54
|
-
| `migration` | `efcore-migration` | sonnet | Create/recreate migration (MCP) |
|
|
55
|
-
| `squash` | `efcore-squash` | sonnet | Consolidate migrations (MCP) |
|
|
56
|
-
| `rebase-snapshot` | `efcore-rebase-snapshot` | sonnet | Sync snapshot with parent (MCP) |
|
|
57
|
-
| `scan` | `efcore-scan` | haiku | Cross-branch conflict scan |
|
|
58
|
-
| `conflicts` | `efcore-conflicts` | haiku | Conflict analysis |
|
|
88
|
+
<command-db-status>
|
|
59
89
|
|
|
60
|
-
|
|
90
|
+
## db-status — Fast migration state check
|
|
91
|
+
|
|
92
|
+
**READ-ONLY: Never modify database or migrations.**
|
|
93
|
+
|
|
94
|
+
1. Call MCP `mcp__smartstack__check_migrations` with `branch: {current_branch}`
|
|
95
|
+
2. If MCP unavailable, fallback: `dotnet ef migrations list --no-build --context {Context}` per context
|
|
96
|
+
3. Display compact summary
|
|
61
97
|
|
|
62
98
|
```
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
99
|
+
EF CORE — DATABASE STATUS
|
|
100
|
+
──────────────────────────
|
|
101
|
+
CORE (CoreDbContext)
|
|
102
|
+
Migrations: {applied}/{total} | {pending} pending
|
|
103
|
+
|
|
104
|
+
EXTENSIONS (ExtensionsDbContext)
|
|
105
|
+
Migrations: {applied}/{total} | {pending} pending
|
|
106
|
+
|
|
107
|
+
BRANCH: {branch}
|
|
108
|
+
Naming: {ok|warnings}
|
|
109
|
+
1-migration rule: {ok|warning}
|
|
68
110
|
```
|
|
69
111
|
|
|
70
|
-
|
|
71
|
-
- Current working directory (absolute path)
|
|
72
|
-
- Current branch name
|
|
73
|
-
- Any flags (--context, --force)
|
|
74
|
-
- User's description (for migration command)
|
|
112
|
+
</command-db-status>
|
|
75
113
|
|
|
76
|
-
|
|
114
|
+
<command-db-deploy>
|
|
77
115
|
|
|
78
|
-
|
|
79
|
-
SmartStack uses **two separate DbContexts**:
|
|
116
|
+
## db-deploy — Apply pending migrations
|
|
80
117
|
|
|
81
|
-
|
|
82
|
-
|---------|-----------|--------|---------------|
|
|
83
|
-
| `core` | `CoreDbContext` | `core` | `core.__EFMigrationsHistory` |
|
|
84
|
-
| `extensions` | `ExtensionsDbContext` | `extensions` | `extensions.__EFMigrationsHistory` |
|
|
85
|
-
</dual_dbcontext>
|
|
118
|
+
**ONLY runs `dotnet ef database update`. Never creates/deletes migrations.**
|
|
86
119
|
|
|
87
|
-
|
|
88
|
-
|
|
120
|
+
1. Verify `appsettings.Local.json` exists in the API project
|
|
121
|
+
2. Apply Core: `dotnet ef database update --context CoreDbContext --verbose`
|
|
122
|
+
3. Apply Extensions: `dotnet ef database update --context ExtensionsDbContext --verbose`
|
|
89
123
|
|
|
90
|
-
|
|
124
|
+
If connection fails: suggest verifying SQL Server, appsettings.Local.json, or `/efcore db-reset`.
|
|
91
125
|
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
126
|
+
```
|
|
127
|
+
DB DEPLOY
|
|
128
|
+
Config: appsettings.Local.json
|
|
129
|
+
CORE: {n} migration(s) applied — {success|error}
|
|
130
|
+
EXTENSIONS: {n} migration(s) applied — {success|error|skipped}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
</command-db-deploy>
|
|
134
|
+
|
|
135
|
+
<command-db-reset>
|
|
136
|
+
|
|
137
|
+
## db-reset — Drop + recreate database (DESTRUCTIVE)
|
|
138
|
+
|
|
139
|
+
**ONLY operates on database. Never creates/deletes migration files.**
|
|
140
|
+
|
|
141
|
+
1. **Confirm** (MANDATORY unless `--force`):
|
|
142
|
+
```
|
|
143
|
+
AskUserQuestion({ question: "DELETE the database? All data will be lost.", options: ["Yes, delete", "No, cancel"] })
|
|
144
|
+
```
|
|
145
|
+
2. **Backup** (optional): `sqlcmd -S "$SERVER" -E -Q "BACKUP DATABASE [$DB] TO DISK='$FILE' WITH FORMAT, INIT, COMPRESSION"`
|
|
146
|
+
3. **Drop**: `dotnet ef database drop --force`
|
|
147
|
+
4. **Recreate Core**: `dotnet ef database update --context CoreDbContext`
|
|
148
|
+
5. **Recreate Extensions**: `dotnet ef database update --context ExtensionsDbContext`
|
|
149
|
+
6. **Ask** if user wants `/efcore db-seed`
|
|
150
|
+
|
|
151
|
+
Block if ASPNETCORE_ENVIRONMENT=Production.
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
DB RESET
|
|
155
|
+
Backup: {path|none}
|
|
156
|
+
CORE: {n} migrations applied — {success|error}
|
|
157
|
+
EXTENSIONS: {n} migrations applied — {success|error}
|
|
158
|
+
|
|
159
|
+
Next: /efcore db-status, /efcore db-seed
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
</command-db-reset>
|
|
163
|
+
|
|
164
|
+
<command-db-seed>
|
|
165
|
+
|
|
166
|
+
## db-seed — Populate test data
|
|
167
|
+
|
|
168
|
+
**Never drop or recreate database.**
|
|
169
|
+
|
|
170
|
+
1. **Detect** seeding method:
|
|
171
|
+
- `HasData()` in EF configs → apply via `dotnet ef database update --context {Context}`
|
|
172
|
+
- `IDataSeeder` / `--seed` CLI arg → `dotnet run --project {startup} -- --seed`
|
|
173
|
+
- SQL script `scripts/seed.sql` → **WARNING**: forbidden by conventions, suggest HasData migration
|
|
174
|
+
2. **Execute** the detected method
|
|
175
|
+
3. **Verify** insertion
|
|
176
|
+
|
|
177
|
+
```
|
|
178
|
+
DB SEED
|
|
179
|
+
Method: {hasdata|cli-seed|seeder-class}
|
|
180
|
+
Status: {success|error}
|
|
181
|
+
Records: {n} inserted (if available)
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
</command-db-seed>
|
|
185
|
+
|
|
186
|
+
<command-scan>
|
|
187
|
+
|
|
188
|
+
## scan — Cross-branch migration scanner
|
|
189
|
+
|
|
190
|
+
**READ-ONLY. Uses MCP to detect conflicts across branches.**
|
|
191
|
+
|
|
192
|
+
1. List active worktrees: `git worktree list`
|
|
193
|
+
2. For each branch, determine base:
|
|
194
|
+
- `feature/*` → `develop`
|
|
195
|
+
- `release/*` / `hotfix/*` / `develop` → `main`
|
|
196
|
+
3. Call MCP `mcp__smartstack__check_migrations` with `branch` + `compareBranch` for each
|
|
197
|
+
4. Aggregate risks and recommend merge order
|
|
198
|
+
|
|
199
|
+
| MCP Type | Level | Action |
|
|
200
|
+
|----------|-------|--------|
|
|
201
|
+
| (none) | NONE | Merge OK |
|
|
202
|
+
| `naming` | LOW | Merge OK |
|
|
203
|
+
| `order` | MEDIUM | Attention |
|
|
204
|
+
| `dependency` | HIGH | Rebase required |
|
|
205
|
+
| `snapshot` | CRITICAL | Manual intervention |
|
|
206
|
+
|
|
207
|
+
Fallback (MCP unavailable): `git worktree list` + `md5sum Migrations/*ModelSnapshot.cs`
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
EF CORE CROSS-BRANCH SCAN
|
|
211
|
+
──────────────────────────
|
|
212
|
+
BRANCHES ({n})
|
|
213
|
+
{branch} | {count} migrations | Risk: {level}
|
|
214
|
+
|
|
215
|
+
RECOMMENDED MERGE ORDER
|
|
216
|
+
1. {branch} (reason)
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
</command-scan>
|
|
220
|
+
|
|
221
|
+
<command-conflicts>
|
|
222
|
+
|
|
223
|
+
## conflicts — Migration conflict analyzer (BLOCKING)
|
|
224
|
+
|
|
225
|
+
**READ-ONLY. Blocks on HIGH/CRITICAL conflicts.**
|
|
226
|
+
|
|
227
|
+
1. Determine base branch: `feature/*` → `develop`, others → `main`
|
|
228
|
+
2. Call MCP `mcp__smartstack__check_migrations` with `branch` + `compareBranch`
|
|
229
|
+
3. Display results. **EXIT CODE 1** if HIGH or CRITICAL.
|
|
230
|
+
|
|
231
|
+
| Type | Level | Exit |
|
|
232
|
+
|------|-------|------|
|
|
233
|
+
| (none) | NONE | 0 |
|
|
234
|
+
| `naming` | LOW | 0 |
|
|
235
|
+
| `order` | MEDIUM | 0 (warning) |
|
|
236
|
+
| `dependency` | HIGH | 1 (BLOCK) |
|
|
237
|
+
| `snapshot` | CRITICAL | 1 (BLOCK) |
|
|
238
|
+
|
|
239
|
+
Fallback (MCP unavailable): `diff` on ModelSnapshot files.
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
EF CORE CONFLICT ANALYSIS
|
|
243
|
+
─────────────────────────
|
|
244
|
+
STATUS: {OK|WARNING|CONFLICT}
|
|
245
|
+
EXIT CODE: {0|1}
|
|
246
|
+
|
|
247
|
+
If conflict:
|
|
248
|
+
/efcore rebase-snapshot (recommended)
|
|
249
|
+
/efcore squash (alternative)
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
</command-conflicts>
|
|
@@ -1,114 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: efcore-conflicts
|
|
3
|
-
description: EF Core conflict analyzer - BLOCKING if conflict detected
|
|
4
|
-
color: red
|
|
5
|
-
model: haiku
|
|
6
|
-
tools: Bash, Glob, Read
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# EF Core Conflicts Agent
|
|
10
|
-
|
|
11
|
-
Analyzes migration conflicts between branches using **SmartStack MCP**. **BLOCKING** if conflict detected.
|
|
12
|
-
|
|
13
|
-
## WSL Preflight (MANDATORY - run BEFORE any git command)
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
# Repair worktree .git file if Windows path detected under WSL
|
|
17
|
-
if [ -f .git ] && grep -q '^gitdir: [A-Za-z]:' .git 2>/dev/null && grep -qi microsoft /proc/version 2>/dev/null; then
|
|
18
|
-
p=$(sed 's/^gitdir: //' .git | tr -d '\r\n'); d=$(echo "${p:0:1}" | tr A-Z a-z); r="${p:2}"; r="${r//\\//}"
|
|
19
|
-
printf 'gitdir: %s\n' "$(realpath -m --relative-to="$(pwd)" "/mnt/$d$r")" > .git
|
|
20
|
-
echo "Worktree .git path repaired for WSL"
|
|
21
|
-
fi
|
|
22
|
-
```
|
|
23
|
-
|
|
24
|
-
## Mission
|
|
25
|
-
|
|
26
|
-
1. **Invoke MCP** `check_migrations` for structured analysis
|
|
27
|
-
2. **Parse** conflict types from response
|
|
28
|
-
3. **Display** results in standard format
|
|
29
|
-
4. **Block** if HIGH or CRITICAL conflict
|
|
30
|
-
|
|
31
|
-
## Base Branch Determination
|
|
32
|
-
|
|
33
|
-
**BEFORE calling MCP, determine the correct base branch:**
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
# Determine base branch based on current branch type:
|
|
37
|
-
# feature/* → compareBranch: "develop"
|
|
38
|
-
# release/* → compareBranch: "main"
|
|
39
|
-
# hotfix/* → compareBranch: "main"
|
|
40
|
-
# develop → compareBranch: "main"
|
|
41
|
-
CURRENT_BRANCH=$(git branch --show-current)
|
|
42
|
-
case "$CURRENT_BRANCH" in
|
|
43
|
-
feature/*) COMPARE_BRANCH="develop" ;;
|
|
44
|
-
release/*) COMPARE_BRANCH="main" ;;
|
|
45
|
-
hotfix/*) COMPARE_BRANCH="main" ;;
|
|
46
|
-
develop) COMPARE_BRANCH="main" ;;
|
|
47
|
-
*) COMPARE_BRANCH="develop" ;;
|
|
48
|
-
esac
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## MCP Integration
|
|
52
|
-
|
|
53
|
-
**Primary method:** Use MCP tool for analysis with the **correct base branch**
|
|
54
|
-
|
|
55
|
-
```
|
|
56
|
-
CALL mcp__smartstack__check_migrations WITH:
|
|
57
|
-
- branch: {current_branch}
|
|
58
|
-
- compareBranch: {COMPARE_BRANCH}
|
|
59
|
-
```
|
|
60
|
-
|
|
61
|
-
**Response structure:**
|
|
62
|
-
|
|
63
|
-
```typescript
|
|
64
|
-
{
|
|
65
|
-
hasConflicts: boolean;
|
|
66
|
-
migrations: MigrationInfo[];
|
|
67
|
-
conflicts: MigrationConflict[];
|
|
68
|
-
suggestions: string[];
|
|
69
|
-
}
|
|
70
|
-
```
|
|
71
|
-
|
|
72
|
-
## Conflict Levels (from MCP)
|
|
73
|
-
|
|
74
|
-
| MCP Type | Level | Exit Code |
|
|
75
|
-
|----------|-------|-----------|
|
|
76
|
-
| - | NONE | 0 |
|
|
77
|
-
| `naming` | LOW | 0 |
|
|
78
|
-
| `order` | MEDIUM | 0 (warning) |
|
|
79
|
-
| `dependency` | HIGH | 1 (BLOCK) |
|
|
80
|
-
| `snapshot` | CRITICAL | 1 (BLOCK) |
|
|
81
|
-
|
|
82
|
-
## Fallback (if MCP unavailable)
|
|
83
|
-
|
|
84
|
-
```bash
|
|
85
|
-
# Compare snapshots directly
|
|
86
|
-
diff develop/Snapshot.cs local/Snapshot.cs
|
|
87
|
-
|
|
88
|
-
# Extract tables
|
|
89
|
-
grep -oE 'ToTable\("([^"]+)"' Snapshot.cs
|
|
90
|
-
|
|
91
|
-
# Extract columns
|
|
92
|
-
grep -oE 'Property<[^>]+>\("([^"]+)"' Snapshot.cs
|
|
93
|
-
```
|
|
94
|
-
|
|
95
|
-
## Required Output
|
|
96
|
-
|
|
97
|
-
```
|
|
98
|
-
================================================================================
|
|
99
|
-
EF CORE CONFLICT ANALYSIS (via MCP)
|
|
100
|
-
================================================================================
|
|
101
|
-
|
|
102
|
-
STATUS: {OK|WARNING|CONFLICT}
|
|
103
|
-
EXIT CODE: {0|1}
|
|
104
|
-
|
|
105
|
-
If conflict:
|
|
106
|
-
RESOLUTION:
|
|
107
|
-
/efcore rebase-snapshot (recommended)
|
|
108
|
-
/efcore conflicts --force (not recommended)
|
|
109
|
-
================================================================================
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
## Priority
|
|
113
|
-
|
|
114
|
-
Correctness > Speed. Never ignore HIGH/CRITICAL conflicts.
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: efcore-db-deploy
|
|
3
|
-
description: EF Core database deploy - apply pending migrations
|
|
4
|
-
color: green
|
|
5
|
-
model: haiku
|
|
6
|
-
tools: Bash, Glob
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# EF Core Database Deploy Agent
|
|
10
|
-
|
|
11
|
-
Applies pending migrations to the local database.
|
|
12
|
-
|
|
13
|
-
## FORBIDDEN
|
|
14
|
-
|
|
15
|
-
- **NEVER** create, delete, modify, or recreate migrations (`dotnet ef migrations add/remove` is FORBIDDEN)
|
|
16
|
-
- **NEVER** modify `.cs` files in the Migrations directory
|
|
17
|
-
- This agent ONLY runs `dotnet ef database update` to apply existing migrations
|
|
18
|
-
|
|
19
|
-
## WSL Preflight (MANDATORY - run BEFORE any git command)
|
|
20
|
-
|
|
21
|
-
```bash
|
|
22
|
-
# Repair worktree .git file if Windows path detected under WSL
|
|
23
|
-
if [ -f .git ] && grep -q '^gitdir: [A-Za-z]:' .git 2>/dev/null && grep -qi microsoft /proc/version 2>/dev/null; then
|
|
24
|
-
p=$(sed 's/^gitdir: //' .git | tr -d '\r\n'); d=$(echo "${p:0:1}" | tr A-Z a-z); r="${p:2}"; r="${r//\\//}"
|
|
25
|
-
printf 'gitdir: %s\n' "$(realpath -m --relative-to="$(pwd)" "/mnt/$d$r")" > .git
|
|
26
|
-
echo "Worktree .git path repaired for WSL"
|
|
27
|
-
fi
|
|
28
|
-
```
|
|
29
|
-
|
|
30
|
-
## Workflow
|
|
31
|
-
|
|
32
|
-
1. **Verify** appsettings.Local.json exists
|
|
33
|
-
2. **Detect** available DbContexts (CoreDbContext, ExtensionsDbContext)
|
|
34
|
-
3. **Count** pending migrations per context
|
|
35
|
-
4. **Apply** migrations in order: Core first, then Extensions
|
|
36
|
-
5. **Confirm** success
|
|
37
|
-
|
|
38
|
-
## Dual DbContext Order
|
|
39
|
-
|
|
40
|
-
**IMPORTANT:** Migrations must be applied in order:
|
|
41
|
-
1. **CoreDbContext** first (SmartStack platform tables)
|
|
42
|
-
2. **ExtensionsDbContext** second (client tables that may reference Core)
|
|
43
|
-
|
|
44
|
-
This ensures FK references from Extensions to Core work correctly.
|
|
45
|
-
|
|
46
|
-
## Commands
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
# Verify config
|
|
50
|
-
test -f appsettings.Local.json && echo "OK" || echo "MISSING"
|
|
51
|
-
|
|
52
|
-
# Apply Core migrations first
|
|
53
|
-
dotnet ef database update --context CoreDbContext --verbose
|
|
54
|
-
|
|
55
|
-
# Then apply Extensions migrations
|
|
56
|
-
dotnet ef database update --context ExtensionsDbContext --verbose
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Output Format
|
|
60
|
-
|
|
61
|
-
```
|
|
62
|
-
DB DEPLOY
|
|
63
|
-
Config: appsettings.Local.json
|
|
64
|
-
|
|
65
|
-
CORE CONTEXT
|
|
66
|
-
Applied: {n} migration(s)
|
|
67
|
-
Status: {success|error}
|
|
68
|
-
|
|
69
|
-
EXTENSIONS CONTEXT
|
|
70
|
-
Applied: {n} migration(s)
|
|
71
|
-
Status: {success|error|skipped}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Error Handling
|
|
75
|
-
|
|
76
|
-
If connection error:
|
|
77
|
-
```
|
|
78
|
-
ERROR: Database connection failed
|
|
79
|
-
→ Verify SQL Server is running
|
|
80
|
-
→ Verify appsettings.Local.json
|
|
81
|
-
→ /efcore db-reset to create DB
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
## Priority
|
|
85
|
-
|
|
86
|
-
Speed > Verbosity. Minimal output if successful.
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: efcore-db-reset
|
|
3
|
-
description: EF Core database reset - drop and recreate (DESTRUCTIVE)
|
|
4
|
-
color: red
|
|
5
|
-
model: haiku
|
|
6
|
-
tools: Bash, Glob, Read
|
|
7
|
-
---
|
|
8
|
-
|
|
9
|
-
# EF Core Database Reset Agent
|
|
10
|
-
|
|
11
|
-
**WARNING: Destructive operation - deletes all data!**
|
|
12
|
-
|
|
13
|
-
## FORBIDDEN
|
|
14
|
-
|
|
15
|
-
- **NEVER** create, delete, modify, or recreate migrations (`dotnet ef migrations add/remove` is FORBIDDEN)
|
|
16
|
-
- **NEVER** modify `.cs` files in the Migrations directory
|
|
17
|
-
- **NEVER** run `dotnet ef migrations` commands of any kind
|
|
18
|
-
- This agent ONLY operates on the **database**, not on migration files
|
|
19
|
-
|
|
20
|
-
## WSL Preflight (MANDATORY - run BEFORE any git command)
|
|
21
|
-
|
|
22
|
-
```bash
|
|
23
|
-
# Repair worktree .git file if Windows path detected under WSL
|
|
24
|
-
if [ -f .git ] && grep -q '^gitdir: [A-Za-z]:' .git 2>/dev/null && grep -qi microsoft /proc/version 2>/dev/null; then
|
|
25
|
-
p=$(sed 's/^gitdir: //' .git | tr -d '\r\n'); d=$(echo "${p:0:1}" | tr A-Z a-z); r="${p:2}"; r="${r//\\//}"
|
|
26
|
-
printf 'gitdir: %s\n' "$(realpath -m --relative-to="$(pwd)" "/mnt/$d$r")" > .git
|
|
27
|
-
echo "Worktree .git path repaired for WSL"
|
|
28
|
-
fi
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
> **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.
|
|
32
|
-
|
|
33
|
-
## Workflow
|
|
34
|
-
|
|
35
|
-
1. **CONFIRM** with user (mandatory)
|
|
36
|
-
2. **Backup** automatic via sqlcmd (ask user)
|
|
37
|
-
3. **Drop** database
|
|
38
|
-
4. **Recreate** with all migrations
|
|
39
|
-
5. **Seed** optional
|
|
40
|
-
|
|
41
|
-
## Mandatory Confirmation
|
|
42
|
-
|
|
43
|
-
```javascript
|
|
44
|
-
AskUserQuestion({
|
|
45
|
-
question: "DELETE the database? (data loss)",
|
|
46
|
-
options: ["Yes, delete", "No, cancel"]
|
|
47
|
-
})
|
|
48
|
-
```
|
|
49
|
-
|
|
50
|
-
## Commands
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
# Backup (before drop - recommended)
|
|
54
|
-
BACKUP_DIR=".claude/gitflow/backup/database"
|
|
55
|
-
mkdir -p "$BACKUP_DIR"
|
|
56
|
-
BACKUP_FILE="${BACKUP_DIR}/${DATABASE_NAME}_$(date +%Y%m%d_%H%M%S).bak"
|
|
57
|
-
sqlcmd -S "$SERVER_NAME" -E -Q "BACKUP DATABASE [$DATABASE_NAME] TO DISK='$BACKUP_FILE' WITH FORMAT, INIT, COMPRESSION"
|
|
58
|
-
|
|
59
|
-
# Drop (single database, both schemas)
|
|
60
|
-
dotnet ef database drop --force
|
|
61
|
-
|
|
62
|
-
# Recreate - apply Core first, then Extensions
|
|
63
|
-
dotnet ef database update --context CoreDbContext
|
|
64
|
-
dotnet ef database update --context ExtensionsDbContext
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
## Dual DbContext Notes
|
|
68
|
-
|
|
69
|
-
When resetting the database:
|
|
70
|
-
1. **Drop** removes both schemas (core and extensions)
|
|
71
|
-
2. **Recreate Core first** - platform tables
|
|
72
|
-
3. **Then Extensions** - client tables that may reference Core
|
|
73
|
-
|
|
74
|
-
Both contexts share the same physical database but use different schemas.
|
|
75
|
-
|
|
76
|
-
## Output Format
|
|
77
|
-
|
|
78
|
-
```
|
|
79
|
-
DB RESET
|
|
80
|
-
Action: Drop + Recreate
|
|
81
|
-
Backup: {.claude/gitflow/backup/database/DB_YYYYMMDD_HHMMSS.bak|none}
|
|
82
|
-
|
|
83
|
-
CORE CONTEXT
|
|
84
|
-
Migrations: {n} applied
|
|
85
|
-
Schema: core
|
|
86
|
-
Status: {success|error}
|
|
87
|
-
|
|
88
|
-
EXTENSIONS CONTEXT
|
|
89
|
-
Migrations: {n} applied
|
|
90
|
-
Schema: extensions
|
|
91
|
-
Status: {success|error}
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
## Safety
|
|
95
|
-
|
|
96
|
-
- ALWAYS ask for confirmation
|
|
97
|
-
- Propose backup
|
|
98
|
-
- Block if ASPNETCORE_ENVIRONMENT=Production
|