@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,193 @@
|
|
|
1
|
+
# /workflow - Gestion Workflows SmartStack
|
|
2
|
+
|
|
3
|
+
> **Synergie Skill/Commande:**
|
|
4
|
+
> - **Skill** (`templates/skills/workflow/`) → Invocation automatique par Claude
|
|
5
|
+
> - **Commande** (`/workflow`) → Invocation manuelle par l'utilisateur
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## ARGUMENTS
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
/workflow <action> [options]
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
| Action | Description |
|
|
16
|
+
|--------|-------------|
|
|
17
|
+
| `create` | Creer un nouveau workflow complet |
|
|
18
|
+
| `trigger` | Ajouter un nouveau trigger |
|
|
19
|
+
| `step` | Ajouter un step a un workflow existant |
|
|
20
|
+
| `template` | Creer un email template |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## WORKFLOW
|
|
25
|
+
|
|
26
|
+
### /workflow create
|
|
27
|
+
|
|
28
|
+
Cree un workflow complet avec trigger et steps.
|
|
29
|
+
|
|
30
|
+
**Questions:**
|
|
31
|
+
1. Code du workflow ? (kebab-case)
|
|
32
|
+
2. Nom descriptif ?
|
|
33
|
+
3. Quel trigger ? (existant ou nouveau)
|
|
34
|
+
4. Quels steps ? (Email, Wait, Condition, Webhook)
|
|
35
|
+
5. Systeme ? (oui/non)
|
|
36
|
+
6. Priorite ? (1-100, defaut 10)
|
|
37
|
+
|
|
38
|
+
**Actions:**
|
|
39
|
+
1. Creer/utiliser le trigger
|
|
40
|
+
2. Ajouter le workflow dans WorkflowConfiguration.cs seed
|
|
41
|
+
3. Ajouter les steps dans WorkflowStepConfiguration.cs seed
|
|
42
|
+
4. Creer les email templates si necessaire
|
|
43
|
+
5. Creer migration EF Core
|
|
44
|
+
|
|
45
|
+
### /workflow trigger
|
|
46
|
+
|
|
47
|
+
Ajoute un nouveau trigger.
|
|
48
|
+
|
|
49
|
+
**Questions:**
|
|
50
|
+
1. Code du trigger ? (format: entity.event)
|
|
51
|
+
2. Nom descriptif ?
|
|
52
|
+
3. Variables disponibles ?
|
|
53
|
+
|
|
54
|
+
**Actions:**
|
|
55
|
+
1. Ajouter dans WorkflowTriggerConfiguration.cs seed
|
|
56
|
+
2. Creer migration EF Core
|
|
57
|
+
|
|
58
|
+
### /workflow step
|
|
59
|
+
|
|
60
|
+
Ajoute un step a un workflow existant.
|
|
61
|
+
|
|
62
|
+
**Questions:**
|
|
63
|
+
1. Quel workflow ?
|
|
64
|
+
2. Type de step ? (SendEmail, Wait, Condition, Webhook)
|
|
65
|
+
3. Configuration specifique selon le type
|
|
66
|
+
|
|
67
|
+
**Actions:**
|
|
68
|
+
1. Ajouter dans WorkflowStepConfiguration.cs seed
|
|
69
|
+
2. Mettre a jour l'ordre des steps
|
|
70
|
+
3. Creer migration EF Core
|
|
71
|
+
|
|
72
|
+
### /workflow template
|
|
73
|
+
|
|
74
|
+
Cree un email template.
|
|
75
|
+
|
|
76
|
+
**Questions:**
|
|
77
|
+
1. Code du template ?
|
|
78
|
+
2. Nom ?
|
|
79
|
+
3. Categorie ? (Transactional, Marketing, System)
|
|
80
|
+
4. Langues ? (fr, en, it, de)
|
|
81
|
+
|
|
82
|
+
**Actions:**
|
|
83
|
+
1. Ajouter dans EmailTemplateConfiguration.cs seed
|
|
84
|
+
2. Ajouter les translations
|
|
85
|
+
3. Creer migration EF Core
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
## TEMPLATES
|
|
90
|
+
|
|
91
|
+
### Template Trigger Seed
|
|
92
|
+
|
|
93
|
+
```csharp
|
|
94
|
+
new
|
|
95
|
+
{
|
|
96
|
+
Id = Guid.Parse("$TRIGGER_GUID"),
|
|
97
|
+
Code = "$ENTITY.$EVENT",
|
|
98
|
+
Name = "$NAME",
|
|
99
|
+
Description = "$DESCRIPTION",
|
|
100
|
+
TriggerType = "$TRIGGER_TYPE",
|
|
101
|
+
AvailableVariablesJson = JsonSerializer.Serialize(new[]
|
|
102
|
+
{
|
|
103
|
+
new { Name = "entityId", Type = "Guid", Description = "Entity ID" },
|
|
104
|
+
new { Name = "entityName", Type = "string", Description = "Entity name" },
|
|
105
|
+
new { Name = "userEmail", Type = "string", Description = "User email" },
|
|
106
|
+
}),
|
|
107
|
+
IsActive = true,
|
|
108
|
+
CreatedAt = seedDate
|
|
109
|
+
},
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
### Template Workflow Seed
|
|
113
|
+
|
|
114
|
+
```csharp
|
|
115
|
+
new
|
|
116
|
+
{
|
|
117
|
+
Id = Guid.Parse("$WORKFLOW_GUID"),
|
|
118
|
+
Code = "$CODE",
|
|
119
|
+
Name = "$NAME",
|
|
120
|
+
Description = "$DESCRIPTION",
|
|
121
|
+
TriggerId = Guid.Parse("$TRIGGER_GUID"),
|
|
122
|
+
ApplicationId = (Guid?)null,
|
|
123
|
+
IsActive = true,
|
|
124
|
+
IsSystem = $IS_SYSTEM,
|
|
125
|
+
Priority = $PRIORITY,
|
|
126
|
+
CreatedAt = seedDate
|
|
127
|
+
},
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Template Step Seed (Email)
|
|
131
|
+
|
|
132
|
+
```csharp
|
|
133
|
+
new
|
|
134
|
+
{
|
|
135
|
+
Id = Guid.Parse("$STEP_GUID"),
|
|
136
|
+
WorkflowId = Guid.Parse("$WORKFLOW_GUID"),
|
|
137
|
+
Name = "$NAME",
|
|
138
|
+
StepType = WorkflowStepType.SendEmail,
|
|
139
|
+
StepOrder = $ORDER,
|
|
140
|
+
EmailTemplateId = Guid.Parse("$TEMPLATE_GUID"),
|
|
141
|
+
IsActive = true,
|
|
142
|
+
CreatedAt = seedDate
|
|
143
|
+
},
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
### Template Step Seed (Wait)
|
|
147
|
+
|
|
148
|
+
```csharp
|
|
149
|
+
new
|
|
150
|
+
{
|
|
151
|
+
Id = Guid.Parse("$STEP_GUID"),
|
|
152
|
+
WorkflowId = Guid.Parse("$WORKFLOW_GUID"),
|
|
153
|
+
Name = "$NAME",
|
|
154
|
+
StepType = WorkflowStepType.Wait,
|
|
155
|
+
StepOrder = $ORDER,
|
|
156
|
+
DelayMinutes = $DELAY_MINUTES,
|
|
157
|
+
IsActive = true,
|
|
158
|
+
CreatedAt = seedDate
|
|
159
|
+
},
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### Template Declenchement
|
|
163
|
+
|
|
164
|
+
```csharp
|
|
165
|
+
await _workflowService.TriggerAsync(
|
|
166
|
+
"$TRIGGER_CODE",
|
|
167
|
+
new Dictionary<string, object>
|
|
168
|
+
{
|
|
169
|
+
["entityId"] = entity.Id,
|
|
170
|
+
["entityName"] = entity.Name,
|
|
171
|
+
["userEmail"] = _currentUser.Email
|
|
172
|
+
},
|
|
173
|
+
language: "fr",
|
|
174
|
+
cancellationToken: ct);
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## FICHIERS CLES
|
|
180
|
+
|
|
181
|
+
| Fichier | Role |
|
|
182
|
+
|---------|------|
|
|
183
|
+
| `Domain/Communications/Workflow.cs` | Entite workflow |
|
|
184
|
+
| `Domain/Communications/WorkflowStep.cs` | Entite step |
|
|
185
|
+
| `Domain/Communications/WorkflowTrigger.cs` | Entite trigger |
|
|
186
|
+
| `Infrastructure/.../WorkflowConfiguration.cs` | Seed workflows |
|
|
187
|
+
| `Infrastructure/.../WorkflowTriggerConfiguration.cs` | Seed triggers |
|
|
188
|
+
| `Infrastructure/.../WorkflowStepConfiguration.cs` | Seed steps |
|
|
189
|
+
| `Infrastructure/Services/Workflow/WorkflowExecutionService.cs` | Execution |
|
|
190
|
+
|
|
191
|
+
---
|
|
192
|
+
|
|
193
|
+
User: $ARGUMENTS
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
{
|
|
2
|
+
"$schema": "https://atlashub.ch/schemas/claude-gitflow-config.json",
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"worktrees": {
|
|
5
|
+
"enabled": true,
|
|
6
|
+
"basePath": "../worktrees",
|
|
7
|
+
"permanent": {
|
|
8
|
+
"main": true,
|
|
9
|
+
"develop": true
|
|
10
|
+
},
|
|
11
|
+
"structure": {
|
|
12
|
+
"features": "features/{name}",
|
|
13
|
+
"releases": "releases/v{version}",
|
|
14
|
+
"hotfixes": "hotfixes/{name}"
|
|
15
|
+
},
|
|
16
|
+
"cleanupOnFinish": true
|
|
17
|
+
},
|
|
18
|
+
"git": {
|
|
19
|
+
"branches": {
|
|
20
|
+
"main": "main",
|
|
21
|
+
"develop": "develop",
|
|
22
|
+
"featurePrefix": "feature/",
|
|
23
|
+
"releasePrefix": "release/",
|
|
24
|
+
"hotfixPrefix": "hotfix/"
|
|
25
|
+
},
|
|
26
|
+
"remote": "origin",
|
|
27
|
+
"mergeStrategy": "--no-ff",
|
|
28
|
+
"tagPrefix": "v",
|
|
29
|
+
"protectedBranches": ["main", "develop"],
|
|
30
|
+
"requireLinearHistory": false
|
|
31
|
+
},
|
|
32
|
+
"efcore": {
|
|
33
|
+
"enabled": true,
|
|
34
|
+
"autoDetect": true,
|
|
35
|
+
"crossBranch": {
|
|
36
|
+
"enabled": true,
|
|
37
|
+
"scanOnMigrationCreate": true,
|
|
38
|
+
"blockOnConflict": true,
|
|
39
|
+
"cacheExpiry": 300
|
|
40
|
+
},
|
|
41
|
+
"contexts": [
|
|
42
|
+
{
|
|
43
|
+
"name": "ApplicationDbContext",
|
|
44
|
+
"projectPath": "auto-detect",
|
|
45
|
+
"startupProject": "auto-detect",
|
|
46
|
+
"migrationsFolder": "Migrations",
|
|
47
|
+
"migrationsAssembly": null
|
|
48
|
+
}
|
|
49
|
+
],
|
|
50
|
+
"database": {
|
|
51
|
+
"configFile": "appsettings.Local.json",
|
|
52
|
+
"connectionStringName": "DefaultConnection",
|
|
53
|
+
"provider": "SqlServer",
|
|
54
|
+
"seedOnDeploy": false,
|
|
55
|
+
"confirmBeforeReset": true,
|
|
56
|
+
"backupBeforeReset": true
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"generateOnRelease": true,
|
|
60
|
+
"generateOnHotfix": true,
|
|
61
|
+
"idempotent": true,
|
|
62
|
+
"outputPath": "./scripts/migrations",
|
|
63
|
+
"namingPattern": "{type}_{version}_{timestamp}.sql"
|
|
64
|
+
},
|
|
65
|
+
"validation": {
|
|
66
|
+
"validateBeforeCommit": true,
|
|
67
|
+
"validateBeforeMerge": true,
|
|
68
|
+
"checkModelSnapshotConflicts": true,
|
|
69
|
+
"crossBranchValidation": true,
|
|
70
|
+
"requireBuildSuccess": true,
|
|
71
|
+
"warnOnPendingMigrations": true
|
|
72
|
+
},
|
|
73
|
+
"backup": {
|
|
74
|
+
"enabled": true,
|
|
75
|
+
"beforeRebase": true,
|
|
76
|
+
"beforeSquash": true,
|
|
77
|
+
"beforeMerge": true,
|
|
78
|
+
"retentionDays": 7,
|
|
79
|
+
"location": ".claude/gitflow/backup/migrations"
|
|
80
|
+
},
|
|
81
|
+
"naming": {
|
|
82
|
+
"migrationPrefix": "",
|
|
83
|
+
"hotfixPrefix": "Hotfix_",
|
|
84
|
+
"timestampFormat": "yyyyMMddHHmmss",
|
|
85
|
+
"pattern": "{BranchType}_{Version}_{BranchName}_{Description}",
|
|
86
|
+
"examples": {
|
|
87
|
+
"feature": "Feature_1.2.0_UserAuth_AddRolesTable",
|
|
88
|
+
"hotfix": "Hotfix_1.2.1_LoginFix_FixNullEmail",
|
|
89
|
+
"release": "Release_1.3.0_Initial"
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
"rules": {
|
|
93
|
+
"oneMigrationPerFeature": true,
|
|
94
|
+
"recreateOnChange": true,
|
|
95
|
+
"requireDescription": true,
|
|
96
|
+
"validateNaming": true
|
|
97
|
+
}
|
|
98
|
+
},
|
|
99
|
+
"workflow": {
|
|
100
|
+
"requireConfirmation": true,
|
|
101
|
+
"autoDeleteBranch": false,
|
|
102
|
+
"createCheckpoints": true,
|
|
103
|
+
"verboseLogging": false,
|
|
104
|
+
"interactiveMode": true,
|
|
105
|
+
"push": {
|
|
106
|
+
"afterCommit": "worktree",
|
|
107
|
+
"modes": {
|
|
108
|
+
"worktree": "Push automatique si worktree détecté",
|
|
109
|
+
"always": "Push automatique après chaque commit",
|
|
110
|
+
"ask": "Demander à l'utilisateur",
|
|
111
|
+
"never": "Ne jamais push automatiquement"
|
|
112
|
+
}
|
|
113
|
+
},
|
|
114
|
+
"commitConventions": {
|
|
115
|
+
"enabled": true,
|
|
116
|
+
"migration": "db(migrations): ",
|
|
117
|
+
"feature": "feat: ",
|
|
118
|
+
"fix": "fix: ",
|
|
119
|
+
"release": "release: ",
|
|
120
|
+
"hotfix": "hotfix: ",
|
|
121
|
+
"chore": "chore: "
|
|
122
|
+
},
|
|
123
|
+
"hooks": {
|
|
124
|
+
"prePlan": null,
|
|
125
|
+
"postPlan": null,
|
|
126
|
+
"preExec": null,
|
|
127
|
+
"postExec": null,
|
|
128
|
+
"preCommit": null,
|
|
129
|
+
"postCommit": null
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
"ui": {
|
|
133
|
+
"colors": true,
|
|
134
|
+
"showProgress": true,
|
|
135
|
+
"compactMode": false,
|
|
136
|
+
"language": "fr"
|
|
137
|
+
}
|
|
138
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Hook pre-commit - Detecte les operations destructives dans les migrations EF Core
|
|
3
|
+
trigger: pre-commit
|
|
4
|
+
blocking: true
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# EF Core Migration Safety Check
|
|
8
|
+
|
|
9
|
+
Scan les migrations EF Core pour detecter les operations destructives.
|
|
10
|
+
|
|
11
|
+
## Patterns BLOQUANTS
|
|
12
|
+
|
|
13
|
+
```
|
|
14
|
+
CRITICAL - Operations destructives :
|
|
15
|
+
├── DropTable(...) → Suppression table entiere
|
|
16
|
+
├── DropColumn(...) → Suppression colonne (perte donnees)
|
|
17
|
+
├── DeleteData(...) → Suppression donnees
|
|
18
|
+
├── DropForeignKey(...) → Casse integrite referentielle
|
|
19
|
+
├── DropIndex(...) → Impact performance
|
|
20
|
+
├── DropPrimaryKey(...) → Casse structure table
|
|
21
|
+
├── DropSchema(...) → Suppression schema entier
|
|
22
|
+
└── migrationBuilder.Sql(...) contenant :
|
|
23
|
+
├── DELETE
|
|
24
|
+
├── DROP
|
|
25
|
+
├── TRUNCATE
|
|
26
|
+
└── ALTER TABLE ... DROP
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## Script de detection
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
# Trouver les migrations modifiees dans ce commit
|
|
33
|
+
MIGRATIONS=$(git diff --cached --name-only --diff-filter=ACMR | grep -E "Migrations/.*\.cs$" | grep -v "Designer\.cs$" | grep -v "Snapshot\.cs$")
|
|
34
|
+
|
|
35
|
+
if [ -z "$MIGRATIONS" ]; then
|
|
36
|
+
echo "✓ Aucune migration detectee"
|
|
37
|
+
exit 0
|
|
38
|
+
fi
|
|
39
|
+
|
|
40
|
+
echo "🔍 Scan des migrations EF Core..."
|
|
41
|
+
echo ""
|
|
42
|
+
|
|
43
|
+
DANGEROUS_FOUND=0
|
|
44
|
+
DANGEROUS_FILES=""
|
|
45
|
+
|
|
46
|
+
for file in $MIGRATIONS; do
|
|
47
|
+
echo "Analyse: $file"
|
|
48
|
+
|
|
49
|
+
# Patterns destructifs EF Core
|
|
50
|
+
DROPS=$(grep -n "DropTable\|DropColumn\|DropIndex\|DropForeignKey\|DropPrimaryKey\|DropSchema\|DeleteData" "$file" 2>/dev/null)
|
|
51
|
+
|
|
52
|
+
# SQL brut dangereux
|
|
53
|
+
SQL_DANGEROUS=$(grep -n "migrationBuilder.Sql" "$file" 2>/dev/null | grep -i "DELETE\|DROP\|TRUNCATE")
|
|
54
|
+
|
|
55
|
+
if [ -n "$DROPS" ] || [ -n "$SQL_DANGEROUS" ]; then
|
|
56
|
+
DANGEROUS_FOUND=1
|
|
57
|
+
DANGEROUS_FILES="$DANGEROUS_FILES\n$file"
|
|
58
|
+
|
|
59
|
+
echo ""
|
|
60
|
+
echo "⚠️ OPERATIONS DESTRUCTIVES DETECTEES dans $file:"
|
|
61
|
+
echo "────────────────────────────────────────────────"
|
|
62
|
+
|
|
63
|
+
if [ -n "$DROPS" ]; then
|
|
64
|
+
echo "$DROPS"
|
|
65
|
+
fi
|
|
66
|
+
|
|
67
|
+
if [ -n "$SQL_DANGEROUS" ]; then
|
|
68
|
+
echo "$SQL_DANGEROUS"
|
|
69
|
+
fi
|
|
70
|
+
|
|
71
|
+
echo "────────────────────────────────────────────────"
|
|
72
|
+
echo ""
|
|
73
|
+
fi
|
|
74
|
+
done
|
|
75
|
+
|
|
76
|
+
if [ $DANGEROUS_FOUND -eq 1 ]; then
|
|
77
|
+
echo ""
|
|
78
|
+
echo "╔══════════════════════════════════════════════════════════╗"
|
|
79
|
+
echo "║ ⛔ COMMIT BLOQUE - OPERATIONS DESTRUCTIVES DETECTEES ║"
|
|
80
|
+
echo "╠══════════════════════════════════════════════════════════╣"
|
|
81
|
+
echo "║ Ces operations peuvent causer une PERTE DE DONNEES : ║"
|
|
82
|
+
echo "║ - DropTable : Supprime une table entiere ║"
|
|
83
|
+
echo "║ - DropColumn : Supprime une colonne et ses donnees ║"
|
|
84
|
+
echo "║ - DeleteData : Supprime des lignes ║"
|
|
85
|
+
echo "║ - SQL DELETE/DROP/TRUNCATE : Operations SQL directes ║"
|
|
86
|
+
echo "╠══════════════════════════════════════════════════════════╣"
|
|
87
|
+
echo "║ ACTIONS REQUISES : ║"
|
|
88
|
+
echo "║ 1. Verifier que vous avez un BACKUP des donnees ║"
|
|
89
|
+
echo "║ 2. Confirmer que cette suppression est intentionnelle ║"
|
|
90
|
+
echo "║ 3. Utiliser --force pour bypasser ce check ║"
|
|
91
|
+
echo "╚══════════════════════════════════════════════════════════╝"
|
|
92
|
+
echo ""
|
|
93
|
+
exit 1
|
|
94
|
+
fi
|
|
95
|
+
|
|
96
|
+
echo "✓ Migrations OK - Aucune operation destructive"
|
|
97
|
+
exit 0
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Integration Claude Code
|
|
101
|
+
|
|
102
|
+
Dans le workflow `/gitflow:3-commit`, avant le commit :
|
|
103
|
+
|
|
104
|
+
```
|
|
105
|
+
1. Detecter migrations modifiees
|
|
106
|
+
2. Scanner patterns dangereux
|
|
107
|
+
3. Si trouve :
|
|
108
|
+
→ Afficher alerte detaillee
|
|
109
|
+
→ Demander confirmation explicite
|
|
110
|
+
→ Logger dans .claude/gitflow/logs/
|
|
111
|
+
4. Si confirme ou rien trouve :
|
|
112
|
+
→ Continuer commit
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
## Bypass (si vraiment necessaire)
|
|
116
|
+
|
|
117
|
+
```bash
|
|
118
|
+
# Option 1 : Flag force
|
|
119
|
+
git commit --no-verify -m "message"
|
|
120
|
+
|
|
121
|
+
# Option 2 : Variable environnement
|
|
122
|
+
EF_MIGRATION_FORCE=1 git commit -m "message"
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
## Log des validations
|
|
126
|
+
|
|
127
|
+
Quand l'utilisateur confirme une operation dangereuse, logger :
|
|
128
|
+
|
|
129
|
+
```json
|
|
130
|
+
{
|
|
131
|
+
"timestamp": "<ISO_DATE>",
|
|
132
|
+
"migration": "<FILENAME>",
|
|
133
|
+
"operations": ["DropTable:Users", "DropColumn:Email"],
|
|
134
|
+
"confirmedBy": "user",
|
|
135
|
+
"commitHash": "<HASH>"
|
|
136
|
+
}
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Fichier : `.claude/gitflow/logs/dangerous-migrations.json`
|