@atlashub/smartstack-cli 3.8.0 → 3.9.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.
Files changed (120) hide show
  1. package/dist/index.js +365 -2
  2. package/dist/index.js.map +1 -1
  3. package/package.json +2 -1
  4. package/templates/agents/action.md +1 -0
  5. package/templates/agents/ba-writer.md +33 -0
  6. package/templates/agents/explore-codebase.md +1 -0
  7. package/templates/agents/explore-docs.md +1 -0
  8. package/templates/agents/fix-grammar.md +1 -0
  9. package/templates/agents/snipper.md +1 -0
  10. package/templates/skills/admin/SKILL.md +6 -0
  11. package/templates/skills/ai-prompt/SKILL.md +32 -136
  12. package/templates/skills/ai-prompt/steps/step-01-implementation.md +122 -0
  13. package/templates/skills/apex/SKILL.md +120 -0
  14. package/templates/skills/apex/_shared.md +86 -0
  15. package/templates/skills/apex/references/agent-teams-protocol.md +164 -0
  16. package/templates/skills/apex/references/smartstack-layers.md +173 -0
  17. package/templates/skills/apex/steps/step-00-init.md +156 -0
  18. package/templates/skills/apex/steps/step-01-analyze.md +169 -0
  19. package/templates/skills/apex/steps/step-02-plan.md +160 -0
  20. package/templates/skills/apex/steps/step-03-execute.md +166 -0
  21. package/templates/skills/apex/steps/step-04-validate.md +138 -0
  22. package/templates/skills/apex/steps/step-05-examine.md +124 -0
  23. package/templates/skills/apex/steps/step-06-resolve.md +105 -0
  24. package/templates/skills/apex/steps/step-07-tests.md +130 -0
  25. package/templates/skills/apex/steps/step-08-run-tests.md +115 -0
  26. package/templates/skills/application/SKILL.md +10 -0
  27. package/templates/skills/application/references/backend-controller-hierarchy.md +58 -0
  28. package/templates/skills/application/references/backend-entity-seeding.md +72 -0
  29. package/templates/skills/application/references/backend-verification.md +88 -0
  30. package/templates/skills/application/references/frontend-verification.md +111 -0
  31. package/templates/skills/application/references/nav-fallback-procedure.md +200 -0
  32. package/templates/skills/application/references/provider-template.md +134 -0
  33. package/templates/skills/application/references/test-frontend.md +73 -0
  34. package/templates/skills/application/references/test-prerequisites.md +72 -0
  35. package/templates/skills/application/steps/step-01-navigation.md +7 -198
  36. package/templates/skills/application/steps/step-03b-provider.md +4 -128
  37. package/templates/skills/application/steps/step-04-backend.md +20 -350
  38. package/templates/skills/application/steps/step-05-frontend.md +12 -101
  39. package/templates/skills/application/steps/step-07-tests.md +12 -132
  40. package/templates/skills/business-analyse/SKILL.md +11 -2
  41. package/templates/skills/business-analyse/html/ba-interactive.html +176 -14
  42. package/templates/skills/business-analyse/html/src/scripts/01-data-init.js +1 -0
  43. package/templates/skills/business-analyse/html/src/scripts/05-render-specs.js +16 -4
  44. package/templates/skills/business-analyse/html/src/scripts/06-render-consolidation.js +7 -2
  45. package/templates/skills/business-analyse/html/src/scripts/09-export.js +103 -0
  46. package/templates/skills/business-analyse/html/src/scripts/10-comments.js +12 -6
  47. package/templates/skills/business-analyse/html/src/scripts/11-review-panel.js +24 -2
  48. package/templates/skills/business-analyse/html/src/styles/08-review-panel.css +12 -0
  49. package/templates/skills/business-analyse/html/src/template.html +1 -0
  50. package/templates/skills/business-analyse/references/cadrage-structure-cards.md +78 -0
  51. package/templates/skills/business-analyse/references/cadrage-vibe-coding.md +97 -0
  52. package/templates/skills/business-analyse/references/consolidation-structural-checks.md +92 -0
  53. package/templates/skills/business-analyse/references/deploy-data-build.md +121 -0
  54. package/templates/skills/business-analyse/references/deploy-modes.md +49 -0
  55. package/templates/skills/business-analyse/references/handoff-file-templates.md +119 -0
  56. package/templates/skills/business-analyse/references/handoff-mappings.md +81 -0
  57. package/templates/skills/business-analyse/references/html-data-mapping.md +10 -2
  58. package/templates/skills/business-analyse/references/init-schema-deployment.md +65 -0
  59. package/templates/skills/business-analyse/references/review-data-mapping.md +363 -0
  60. package/templates/skills/business-analyse/references/spec-auto-inference.md +57 -0
  61. package/templates/skills/business-analyse/references/ui-dashboard-spec.md +85 -0
  62. package/templates/skills/business-analyse/references/ui-resource-cards.md +110 -0
  63. package/templates/skills/business-analyse/references/validate-incremental-html.md +55 -0
  64. package/templates/skills/business-analyse/steps/step-00-init.md +35 -68
  65. package/templates/skills/business-analyse/steps/step-01-cadrage.md +5 -194
  66. package/templates/skills/business-analyse/steps/step-03a-data.md +6 -49
  67. package/templates/skills/business-analyse/steps/step-03b-ui.md +12 -178
  68. package/templates/skills/business-analyse/steps/step-03d-validate.md +3 -48
  69. package/templates/skills/business-analyse/steps/step-04-consolidation.md +9 -104
  70. package/templates/skills/business-analyse/steps/step-05a-handoff.md +25 -441
  71. package/templates/skills/business-analyse/steps/step-05b-deploy.md +19 -187
  72. package/templates/skills/business-analyse/steps/step-06-review.md +277 -0
  73. package/templates/skills/cc-agent/references/agent-behavior-patterns.md +95 -0
  74. package/templates/skills/cc-agent/steps/step-02-generate.md +5 -78
  75. package/templates/skills/check-version/SKILL.md +7 -0
  76. package/templates/skills/controller/references/controller-code-templates.md +159 -0
  77. package/templates/skills/controller/references/permission-sync-templates.md +152 -0
  78. package/templates/skills/controller/steps/step-03-generate.md +6 -158
  79. package/templates/skills/controller/steps/step-04-perms.md +5 -144
  80. package/templates/skills/debug/SKILL.md +7 -0
  81. package/templates/skills/explore/SKILL.md +6 -0
  82. package/templates/skills/feature-full/SKILL.md +39 -142
  83. package/templates/skills/feature-full/steps/step-01-implementation.md +120 -0
  84. package/templates/skills/gitflow/references/init-config-template.md +135 -0
  85. package/templates/skills/gitflow/references/init-name-normalization.md +103 -0
  86. package/templates/skills/gitflow/references/plan-template.md +69 -0
  87. package/templates/skills/gitflow/references/start-efcore-preflight.md +70 -0
  88. package/templates/skills/gitflow/references/start-local-config.md +110 -0
  89. package/templates/skills/gitflow/steps/step-init.md +18 -289
  90. package/templates/skills/gitflow/steps/step-plan.md +6 -63
  91. package/templates/skills/gitflow/steps/step-start.md +16 -126
  92. package/templates/skills/mcp/SKILL.md +9 -213
  93. package/templates/skills/mcp/steps/step-01-healthcheck.md +108 -0
  94. package/templates/skills/mcp/steps/step-02-tools.md +73 -0
  95. package/templates/skills/notification/SKILL.md +7 -0
  96. package/templates/skills/quick-search/SKILL.md +5 -0
  97. package/templates/skills/ralph-loop/SKILL.md +99 -381
  98. package/templates/skills/ralph-loop/references/category-rules.md +259 -0
  99. package/templates/skills/ralph-loop/references/compact-loop.md +182 -0
  100. package/templates/skills/ralph-loop/references/task-transform-legacy.md +259 -0
  101. package/templates/skills/ralph-loop/references/team-orchestration.md +189 -0
  102. package/templates/skills/ralph-loop/steps/step-00-init.md +111 -383
  103. package/templates/skills/ralph-loop/steps/step-01-task.md +79 -896
  104. package/templates/skills/ralph-loop/steps/step-02-execute.md +68 -680
  105. package/templates/skills/ralph-loop/steps/step-03-commit.md +47 -277
  106. package/templates/skills/ralph-loop/steps/step-04-check.md +124 -607
  107. package/templates/skills/ralph-loop/steps/step-05-report.md +68 -367
  108. package/templates/skills/refactor/SKILL.md +12 -176
  109. package/templates/skills/refactor/steps/step-01-discover.md +60 -0
  110. package/templates/skills/refactor/steps/step-02-execute.md +67 -0
  111. package/templates/skills/review-code/SKILL.md +19 -257
  112. package/templates/skills/review-code/steps/step-01-smartstack.md +96 -0
  113. package/templates/skills/review-code/steps/step-02-detailed-review.md +80 -0
  114. package/templates/skills/review-code/steps/step-03-react.md +44 -0
  115. package/templates/skills/ui-components/SKILL.md +7 -0
  116. package/templates/skills/utils/SKILL.md +6 -0
  117. package/templates/skills/validate/SKILL.md +6 -0
  118. package/templates/skills/validate-feature/SKILL.md +8 -0
  119. package/templates/skills/workflow/SKILL.md +40 -118
  120. package/templates/skills/workflow/steps/step-01-implementation.md +84 -0
@@ -7,7 +7,7 @@ description: |
7
7
  - User mentions "oneshot", "complete feature", "full-stack"
8
8
  - Creating a module with notifications, workflows and/or AI
9
9
  - Need for complete user experience
10
- Scope: Domain Application Infrastructure API Web + Notifications + Workflows + AI
10
+ Scope: Domain -> Application -> Infrastructure -> API -> Web + Notifications + Workflows + AI
11
11
  disable-model-invocation: true
12
12
  ---
13
13
 
@@ -17,7 +17,7 @@ disable-model-invocation: true
17
17
 
18
18
  **Reference:** [_shared.md](../_shared.md) for architecture, permissions, i18n
19
19
 
20
- ## WHEN THIS SKILL ACTIVATES
20
+ ## When This Skill Activates
21
21
 
22
22
  | Trigger | Example |
23
23
  |---------|---------|
@@ -25,173 +25,62 @@ disable-model-invocation: true
25
25
  | Full-stack | "Create the backend and frontend for..." |
26
26
  | Integration | "With notifications and automated emails" |
27
27
 
28
- ## COMPLETE FLOW
28
+ ## Complete Flow
29
29
 
30
30
  ```
31
- DOMAIN APPLICATION INFRASTRUCTURE API WEB
31
+ DOMAIN -> APPLICATION -> INFRASTRUCTURE -> API -> WEB
32
32
  + NOTIFICATIONS + WORKFLOWS + AI
33
33
  ```
34
34
 
35
- ## CREATION WORKFLOW
35
+ ## Phase 1: Analysis
36
36
 
37
- ### PHASE 1: ANALYSIS
38
-
39
- ```
40
- □ Module/functionality?
41
- □ Entities? CRUD operations? Business rules?
42
- □ Notifications required? Automated emails? AI?
43
- □ Display: Cards/Table/Kanban? Permissions?
44
- ```
45
-
46
- ### PHASE 2: DOMAIN
47
-
48
- ```csharp
49
- // {Entity}.cs - Factory Method + Behaviors
50
- public class {Entity} : BaseEntity, IAuditableEntity
51
- {
52
- public string Name { get; private set; }
53
- public {Entity}Status Status { get; private set; }
54
- private {Entity}() { }
55
- public static {Entity} Create(string name, Guid createdById) =>
56
- new { Id = Guid.NewGuid(), Name = name, Status = {Entity}Status.Active, ... };
57
- public void Update(string name) => Name = name ?? throw new DomainException("Name required");
58
- }
59
-
60
- // {Entity}Status.cs
61
- public enum {Entity}Status { Active = 0, Inactive = 1, Archived = 2 }
62
- ```
63
-
64
- ### PHASE 3: APPLICATION
65
-
66
- ```csharp
67
- // I{Entity}Service.cs
68
- Task<PagedResult<{Entity}Dto>> GetAllAsync(...);
69
- Task<{Entity}Dto> CreateAsync(Create{Entity}Request request, CancellationToken ct);
70
-
71
- // DTOs
72
- public record {Entity}Dto(Guid Id, string Name, string Status, DateTime CreatedAt);
73
- public record Create{Entity}Request(string Name, string? Description);
74
-
75
- // Permissions.cs + PermissionConfiguration.cs (2 files!)
76
- public const string View = "{context}.{area}.{module}.read";
77
- ```
78
-
79
- ### PHASE 4: INFRASTRUCTURE
80
-
81
- ```csharp
82
- // {Entity}Configuration.cs
83
- builder.ToTable("{Entity}s", "{schema}");
84
- builder.Property(x => x.Name).HasMaxLength(200).IsRequired();
85
-
86
- // {Entity}Service.cs with Notifications
87
- public async Task<{Entity}Dto> CreateAsync(...) {
88
- var entity = {Entity}.Create(request.Name, _currentUser.Id);
89
- _context.{Entity}s.Add(entity);
90
- await _context.SaveChangesAsync(ct);
91
- await _notificationService.SendNotificationAsync(_currentUser.Id,
92
- NotificationType.{Entity}Created, "Created", $"{entity.Name} created",
93
- relatedEntityType: nameof({Entity}), relatedEntityId: entity.Id, ct);
94
- return MapToDto(entity);
95
- }
96
-
97
- // DependencyInjection.cs
98
- services.AddScoped<I{Entity}Service, {Entity}Service>();
99
37
  ```
100
-
101
- ### PHASE 5: API
102
-
103
- ```csharp
104
- [ApiController][Route("api/{area}/{module}")][Authorize]
105
- public class {Entity}Controller : ControllerBase
106
- {
107
- [HttpGet][RequirePermission(Permissions.{Area}.{Module}.View)]
108
- [ProducesResponseType(typeof(PagedResult<{Entity}Dto>), 200)]
109
- public async Task<ActionResult<PagedResult<{Entity}Dto>>> GetAll(...);
110
-
111
- [HttpPost][RequirePermission(Permissions.{Area}.{Module}.Create)]
112
- [ProducesResponseType(typeof({Entity}Dto), 201)]
113
- public async Task<ActionResult<{Entity}Dto>> Create([FromBody] request, CancellationToken ct);
114
- }
38
+ - Module/functionality?
39
+ - Entities? CRUD operations? Business rules?
40
+ - Notifications required? Automated emails? AI?
41
+ - Display: Cards/Table/Kanban? Permissions?
115
42
  ```
116
43
 
117
- ### PHASE 6: FRONTEND
118
-
119
- ```typescript
120
- // {module}Api.ts
121
- export const {module}Api = {
122
- getAll: (page, pageSize, search?) => apiClient.get<PagedResult<{Entity}Dto>>('/{area}/{module}', { params }),
123
- create: (data) => apiClient.post<{Entity}Dto>('/{area}/{module}', data),
124
- };
125
-
126
- // use{Module}.ts with SignalR
127
- export function use{Module}() {
128
- const queryClient = useQueryClient();
129
- useSignalR({ onNotification: (n) => {
130
- if (n.relatedEntityType === '{Entity}') queryClient.invalidateQueries(['{module}']);
131
- }});
132
- const createMutation = useMutation({ mutationFn: {module}Api.create, onSuccess: () => ... });
133
- return { create: createMutation.mutate, ... };
134
- }
135
-
136
- // {Module}Page.tsx with EntityCard
137
- <EntityCard title={item.name} actions={[{ label: 'View', onClick: () => navigate(...) }]} />
138
-
139
- // Routes (nested mandatory)
140
- <Route path="{area}"><Route path="{module}"><Route index element={<{Module}Page />} /></Route></Route>
141
- ```
44
+ ## Phases 2-7: Implementation
142
45
 
143
- ### PHASE 7: INTEGRATIONS
46
+ See [steps/step-01-implementation.md](steps/step-01-implementation.md) for detailed code templates covering:
47
+ - Phase 2: Domain (Entity + Factory + Behaviors + Enum)
48
+ - Phase 3: Application (Interface + DTOs + Permissions)
49
+ - Phase 4: Infrastructure (EF Config + Service + DI)
50
+ - Phase 5: API (Controller + Authorize + RequirePermission)
51
+ - Phase 6: Frontend (API + Hook + Page + Routes)
52
+ - Phase 7: Integrations (Notifications + Workflows + AI)
144
53
 
145
- #### Notifications
146
- ```csharp
147
- await _notificationService.SendNotificationAsync(userId, NotificationType.{Entity}Created,
148
- title, message, relatedEntityType: nameof({Entity}), relatedEntityId: entity.Id, actionUrl);
149
- ```
150
-
151
- #### Workflow Email
152
- ```csharp
153
- // 1. WorkflowTriggerConfiguration.cs: new { Code = "{entity}.created", ... }
154
- // 2. WorkflowConfiguration.cs: new { TriggerId = ..., ... }
155
- // 3. Service:
156
- await _workflowService.TriggerAsync("{entity}.created", new Dictionary<string, object>{...});
157
- ```
158
-
159
- #### AI
160
- ```csharp
161
- var result = await _aiCompletionService.ExecutePromptByCodeWithValidationAsync<{Entity}AnalysisResult>(
162
- "{entity}-analyzer", new Dictionary<string, object>{ ["name"] = entity.Name }, ct);
163
- ```
164
-
165
- ## COMPLETE CHECKLIST
54
+ ## Complete Checklist
166
55
 
167
56
  ### Backend
168
57
  ```
169
- Domain: Entity + Factory + Behaviors + Enum + IAuditableEntity
170
- Application: Interface + DTOs + Permissions (2 files!)
171
- Infrastructure: EF Config + Service + DI + DbSet + Migration
172
- API: Controller + Authorize + RequirePermission + ProducesResponseType
58
+ - Domain: Entity + Factory + Behaviors + Enum + IAuditableEntity
59
+ - Application: Interface + DTOs + Permissions (2 files!)
60
+ - Infrastructure: EF Config + Service + DI + DbSet + Migration
61
+ - API: Controller + Authorize + RequirePermission + ProducesResponseType
173
62
  ```
174
63
 
175
64
  ### Frontend
176
65
  ```
177
- {module}Api.ts + use{Module}.ts (with SignalR) + {Module}Page.tsx + {Module}Form.tsx
178
- i18n: fr, en, it, de
179
- Nested routes in App.tsx
66
+ - {module}Api.ts + use{Module}.ts (with SignalR) + {Module}Page.tsx + {Module}Form.tsx
67
+ - i18n: fr, en, it, de
68
+ - Nested routes in App.tsx
180
69
  ```
181
70
 
182
71
  ### Integrations
183
72
  ```
184
- Notifications: NotificationType + SendNotificationAsync + useSignalR
185
- Workflows: Trigger + Workflow + TriggerAsync
186
- AI: Prompt + OutputSchema + ExecutePromptAsync
73
+ - Notifications: NotificationType + SendNotificationAsync + useSignalR
74
+ - Workflows: Trigger + Workflow + TriggerAsync
75
+ - AI: Prompt + OutputSchema + ExecutePromptAsync
187
76
  ```
188
77
 
189
78
  ### Validation
190
79
  ```
191
- dotnet build + npm run build + npm run lint OK
80
+ - dotnet build + npm run build + npm run lint OK
192
81
  ```
193
82
 
194
- ## ORCHESTRATED SKILLS
83
+ ## Orchestrated Skills
195
84
 
196
85
  | Skill | Phase |
197
86
  |-------|-------|
@@ -203,7 +92,7 @@ var result = await _aiCompletionService.ExecutePromptByCodeWithValidationAsync<{
203
92
  | `/ui-components` | 6 |
204
93
  | `/efcore:migration` | 4 |
205
94
 
206
- ## ABSOLUTE RULES
95
+ ## Absolute Rules
207
96
 
208
97
  | DO | DON'T |
209
98
  |----|-------|
@@ -212,3 +101,11 @@ var result = await _aiCompletionService.ExecutePromptByCodeWithValidationAsync<{
212
101
  | Permissions 2 files | Flat routes |
213
102
  | SignalR hooks | Skip i18n 4 languages |
214
103
  | ProducesResponseType | Skip logging |
104
+
105
+ <success_criteria>
106
+ - All layers created: Domain, Infrastructure, Application, API, Frontend
107
+ - Navigation, permissions, and roles seed data generated via MCP
108
+ - EF Core migration created and applied
109
+ - Tests pass (unit + integration)
110
+ - i18n translations in 4 languages
111
+ </success_criteria>
@@ -0,0 +1,120 @@
1
+ # Feature Full - Implementation Phases
2
+
3
+ ## Phase 2: Domain
4
+
5
+ ```csharp
6
+ // {Entity}.cs - Factory Method + Behaviors
7
+ public class {Entity} : BaseEntity, IAuditableEntity
8
+ {
9
+ public string Name { get; private set; }
10
+ public {Entity}Status Status { get; private set; }
11
+ private {Entity}() { }
12
+ public static {Entity} Create(string name, Guid createdById) =>
13
+ new { Id = Guid.NewGuid(), Name = name, Status = {Entity}Status.Active, ... };
14
+ public void Update(string name) => Name = name ?? throw new DomainException("Name required");
15
+ }
16
+
17
+ // {Entity}Status.cs
18
+ public enum {Entity}Status { Active = 0, Inactive = 1, Archived = 2 }
19
+ ```
20
+
21
+ ## Phase 3: Application
22
+
23
+ ```csharp
24
+ // I{Entity}Service.cs
25
+ Task<PagedResult<{Entity}Dto>> GetAllAsync(...);
26
+ Task<{Entity}Dto> CreateAsync(Create{Entity}Request request, CancellationToken ct);
27
+
28
+ // DTOs
29
+ public record {Entity}Dto(Guid Id, string Name, string Status, DateTime CreatedAt);
30
+ public record Create{Entity}Request(string Name, string? Description);
31
+
32
+ // Permissions.cs + PermissionConfiguration.cs (2 files!)
33
+ public const string View = "{context}.{area}.{module}.read";
34
+ ```
35
+
36
+ ## Phase 4: Infrastructure
37
+
38
+ ```csharp
39
+ // {Entity}Configuration.cs
40
+ builder.ToTable("{Entity}s", "{schema}");
41
+ builder.Property(x => x.Name).HasMaxLength(200).IsRequired();
42
+
43
+ // {Entity}Service.cs with Notifications
44
+ public async Task<{Entity}Dto> CreateAsync(...) {
45
+ var entity = {Entity}.Create(request.Name, _currentUser.Id);
46
+ _context.{Entity}s.Add(entity);
47
+ await _context.SaveChangesAsync(ct);
48
+ await _notificationService.SendNotificationAsync(_currentUser.Id,
49
+ NotificationType.{Entity}Created, "Created", $"{entity.Name} created",
50
+ relatedEntityType: nameof({Entity}), relatedEntityId: entity.Id, ct);
51
+ return MapToDto(entity);
52
+ }
53
+
54
+ // DependencyInjection.cs
55
+ services.AddScoped<I{Entity}Service, {Entity}Service>();
56
+ ```
57
+
58
+ ## Phase 5: API
59
+
60
+ ```csharp
61
+ [ApiController][Route("api/{area}/{module}")][Authorize]
62
+ public class {Entity}Controller : ControllerBase
63
+ {
64
+ [HttpGet][RequirePermission(Permissions.{Area}.{Module}.View)]
65
+ [ProducesResponseType(typeof(PagedResult<{Entity}Dto>), 200)]
66
+ public async Task<ActionResult<PagedResult<{Entity}Dto>>> GetAll(...);
67
+
68
+ [HttpPost][RequirePermission(Permissions.{Area}.{Module}.Create)]
69
+ [ProducesResponseType(typeof({Entity}Dto), 201)]
70
+ public async Task<ActionResult<{Entity}Dto>> Create([FromBody] request, CancellationToken ct);
71
+ }
72
+ ```
73
+
74
+ ## Phase 6: Frontend
75
+
76
+ ```typescript
77
+ // {module}Api.ts
78
+ export const {module}Api = {
79
+ getAll: (page, pageSize, search?) => apiClient.get<PagedResult<{Entity}Dto>>('/{area}/{module}', { params }),
80
+ create: (data) => apiClient.post<{Entity}Dto>('/{area}/{module}', data),
81
+ };
82
+
83
+ // use{Module}.ts with SignalR
84
+ export function use{Module}() {
85
+ const queryClient = useQueryClient();
86
+ useSignalR({ onNotification: (n) => {
87
+ if (n.relatedEntityType === '{Entity}') queryClient.invalidateQueries(['{module}']);
88
+ }});
89
+ const createMutation = useMutation({ mutationFn: {module}Api.create, onSuccess: () => ... });
90
+ return { create: createMutation.mutate, ... };
91
+ }
92
+
93
+ // {Module}Page.tsx with EntityCard
94
+ <EntityCard title={item.name} actions={[{ label: 'View', onClick: () => navigate(...) }]} />
95
+
96
+ // Routes (nested mandatory)
97
+ <Route path="{area}"><Route path="{module}"><Route index element={<{Module}Page />} /></Route></Route>
98
+ ```
99
+
100
+ ## Phase 7: Integrations
101
+
102
+ ### Notifications
103
+ ```csharp
104
+ await _notificationService.SendNotificationAsync(userId, NotificationType.{Entity}Created,
105
+ title, message, relatedEntityType: nameof({Entity}), relatedEntityId: entity.Id, actionUrl);
106
+ ```
107
+
108
+ ### Workflow Email
109
+ ```csharp
110
+ // 1. WorkflowTriggerConfiguration.cs: new { Code = "{entity}.created", ... }
111
+ // 2. WorkflowConfiguration.cs: new { TriggerId = ..., ... }
112
+ // 3. Service:
113
+ await _workflowService.TriggerAsync("{entity}.created", new Dictionary<string, object>{...});
114
+ ```
115
+
116
+ ### AI
117
+ ```csharp
118
+ var result = await _aiCompletionService.ExecutePromptByCodeWithValidationAsync<{Entity}AnalysisResult>(
119
+ "{entity}-analyzer", new Dictionary<string, object>{ ["name"] = entity.Name }, ct);
120
+ ```
@@ -0,0 +1,135 @@
1
+ # GitFlow Config Template (v2.1.0)
2
+
3
+ ## Configuration JSON
4
+
5
+ Write `.claude/gitflow/config.json` in develop worktree.
6
+
7
+ **IMPORTANT:** Store paths using `normalize_path_for_storage()` format (Windows-style: `D:/path/to/folder`). The `read_gitflow_config()` in `_shared.md` translates them to platform format at read time.
8
+
9
+ ```json
10
+ {
11
+ "version": "2.1.0",
12
+ "platform": {
13
+ "detected": "{GF_PLATFORM}",
14
+ "shell": "{GF_SHELL}",
15
+ "detectedAt": "{ISO_DATE}"
16
+ },
17
+ "workspace": {
18
+ "path": "{WORKSPACE_DIR_STORAGE_FORMAT}",
19
+ "name": ""
20
+ },
21
+ "repository": {
22
+ "name": "{PROJECT_NAME}",
23
+ "rootFolder": "{ROOT_FOLDER_STORAGE_FORMAT}",
24
+ "nameVariants": {
25
+ "pascalCaseDot": "{PascalCase.Dot}",
26
+ "pascalCase": "{PascalCase}",
27
+ "kebabCase": "{kebab-case}",
28
+ "snakeCase": "{snake_case}",
29
+ "displayName": "{Display Name}"
30
+ },
31
+ "defaultBranch": "main",
32
+ "remoteUrl": "{REPO_URL}"
33
+ },
34
+ "git": {
35
+ "provider": "{GIT_PROVIDER}",
36
+ "branches": {
37
+ "main": "main",
38
+ "develop": "develop"
39
+ },
40
+ "prefixes": {
41
+ "feature": "feature/",
42
+ "release": "release/",
43
+ "hotfix": "hotfix/"
44
+ }
45
+ },
46
+ "worktrees": {
47
+ "enabled": true,
48
+ "mode": "{WORKTREE_MODE}",
49
+ "structure": {
50
+ "main": "{ROOT_FOLDER_STORAGE_FORMAT}/01-Main",
51
+ "develop": "{ROOT_FOLDER_STORAGE_FORMAT}/02-Develop",
52
+ "features": "{ROOT_FOLDER_STORAGE_FORMAT}/features",
53
+ "releases": "{ROOT_FOLDER_STORAGE_FORMAT}/releases",
54
+ "hotfixes": "{ROOT_FOLDER_STORAGE_FORMAT}/hotfixes"
55
+ }
56
+ },
57
+ "versioning": {
58
+ "strategy": "semver",
59
+ "current": "{VERSION}",
60
+ "tagPrefix": "v",
61
+ "sources": ["csproj", "package.json", "VERSION"]
62
+ },
63
+ "efcore": {
64
+ "enabled": true,
65
+ "validateOnCommit": true,
66
+ "blockDestructive": true,
67
+ "migrationNaming": "{context}_v{version}_{sequence}_{Description}"
68
+ },
69
+ "workflow": {
70
+ "push": { "afterCommit": "worktree" },
71
+ "pr": { "autoLabels": true, "requireReview": true }
72
+ },
73
+ "language": { "code": "{GF_LANG}" }
74
+ }
75
+ ```
76
+
77
+ ## Path Storage Convention
78
+
79
+ - `{ROOT_FOLDER_STORAGE_FORMAT}` = result of `normalize_path_for_storage("{ROOT_FOLDER}")`
80
+ - On WSL: `/mnt/d/projects/MyApp` -> stored as `D:/projects/MyApp`
81
+ - On Windows: `D:\projects\MyApp` -> stored as `D:/projects/MyApp`
82
+ - On Linux/macOS: `/home/user/projects/MyApp` -> stored as-is
83
+
84
+ ## Post-Init Validation
85
+
86
+ ```bash
87
+ PROJECT_BASE="{ROOT_FOLDER}"
88
+ MAIN_DIR=$([ "$WORKTREE_MODE" = "organized" ] && echo "01-Main" || echo "main")
89
+ DEVELOP_DIR=$([ "$WORKTREE_MODE" = "organized" ] && echo "02-Develop" || echo "develop")
90
+ ERRORS=0
91
+
92
+ # Verify bare repo
93
+ [ -f "$PROJECT_BASE/.bare/HEAD" ] && echo "OK .bare/HEAD" || { echo "FAIL .bare/HEAD missing"; ERRORS=$((ERRORS+1)); }
94
+
95
+ # Verify worktrees on correct branches
96
+ MAIN_BRANCH=$(git -C "$PROJECT_BASE/$MAIN_DIR" branch --show-current 2>/dev/null)
97
+ [ "$MAIN_BRANCH" = "main" ] && echo "OK $MAIN_DIR on main" || { echo "FAIL $MAIN_DIR on '$MAIN_BRANCH'"; ERRORS=$((ERRORS+1)); }
98
+
99
+ DEVELOP_BRANCH=$(git -C "$PROJECT_BASE/$DEVELOP_DIR" branch --show-current 2>/dev/null)
100
+ [ "$DEVELOP_BRANCH" = "develop" ] && echo "OK $DEVELOP_DIR on develop" || { echo "FAIL $DEVELOP_DIR on '$DEVELOP_BRANCH'"; ERRORS=$((ERRORS+1)); }
101
+
102
+ # Verify directories
103
+ for subdir in features releases hotfixes; do
104
+ [ -d "$PROJECT_BASE/$subdir" ] && echo "OK $subdir/" || { echo "FAIL $subdir/ missing"; ERRORS=$((ERRORS+1)); }
105
+ done
106
+
107
+ # Verify config directory
108
+ [ -d "$PROJECT_BASE/$DEVELOP_DIR/.claude/gitflow" ] && echo "OK .claude/gitflow/" || { echo "FAIL .claude/gitflow/ missing"; ERRORS=$((ERRORS+1)); }
109
+
110
+ echo ""
111
+ [ "$ERRORS" -eq 0 ] && echo "VALIDATION: ALL CHECKS PASSED" || echo "VALIDATION: $ERRORS error(s) detected"
112
+ ```
113
+
114
+ ## Workspace Mode (`--workspace`)
115
+
116
+ When called with `init --workspace`, batch-initialize all repos in a workspace.
117
+
118
+ ### Workspace Execution Sequence:
119
+
120
+ 1. **Ask workspace directory** (AskUserQuestion: parent folder or custom path)
121
+ 2. **Detect or ask for repos** (scan workspace for git repos or enter URLs)
122
+ 3. **Create `.smartstack-workspace.json`:**
123
+ ```json
124
+ {
125
+ "version": "1.0.0",
126
+ "name": "{WORKSPACE_NAME}",
127
+ "createdAt": "{ISO_DATE}",
128
+ "updatedAt": "{ISO_DATE}",
129
+ "platform": { "detected": "{GF_PLATFORM}", "shell": "{GF_SHELL}" },
130
+ "repositories": [],
131
+ "defaults": { "provider": "{GIT_PROVIDER}", "worktreeMode": "organized", "language": "en" }
132
+ }
133
+ ```
134
+ 4. **Loop: For each repo, run Steps 1-10b with workspace defaults pre-populated.**
135
+ 5. **Display global summary** with all repos initialized.
@@ -0,0 +1,103 @@
1
+ # Project Name Normalization (INTELLIGENT)
2
+
3
+ **ALWAYS normalize, even if user chose the detected name.**
4
+
5
+ ## Step 1: Parse input into words
6
+
7
+ Split the raw input on any separator: spaces, hyphens, underscores, dots, camelCase boundaries.
8
+
9
+ | Raw input | Parsed words |
10
+ |-----------|-------------|
11
+ | `mon super projet` | `["mon", "super", "projet"]` |
12
+ | `gestion-des-stocks` | `["gestion", "des", "stocks"]` |
13
+ | `my_awesome_app` | `["my", "awesome", "app"]` |
14
+ | `SmartStack.App` | `["Smart", "Stack", "App"]` |
15
+ | `userManagement` | `["user", "Management"]` |
16
+
17
+ ## Step 2: Language detection and spell check
18
+
19
+ For EACH word, you MUST:
20
+ 1. **Detect the language** (French, English, or technical/proper noun)
21
+ 2. **Check spelling** - flag obvious typos
22
+ 3. **Suggest corrections** if misspelled
23
+
24
+ | Word | Language | Spelling | Suggestion |
25
+ |------|----------|----------|------------|
26
+ | `gestion` | FR | OK | - |
27
+ | `gestoin` | FR | typo | -> `gestion` |
28
+ | `managment` | EN | typo | -> `management` |
29
+ | `SmartStack` | Proper noun | OK | - |
30
+ | `auth` | EN (abbreviation) | OK | - |
31
+
32
+ **If typos detected**, ask the user BEFORE generating variants:
33
+
34
+ ```yaml
35
+ AskUserQuestion:
36
+ - header: "Spelling"
37
+ question: "Corrections detected. Accept?"
38
+ options:
39
+ - label: "Accept corrections (Recommended)"
40
+ description: "'gestoin' -> 'gestion', 'managment' -> 'management'"
41
+ - label: "Keep original"
42
+ description: "Use the name as typed"
43
+ multiSelect: false
44
+ ```
45
+
46
+ ## Step 3: Generate all name variants
47
+
48
+ From the cleaned words, generate ALL variants:
49
+
50
+ | Variant | Format | Best for |
51
+ |---------|--------|----------|
52
+ | PascalCase.Dot | `Gestion.Des.Stocks` | .NET namespace, C# project, folder name |
53
+ | PascalCase | `GestionDesStocks` | Class name, assembly name |
54
+ | kebab-case | `gestion-des-stocks` | Git repo, npm package, URL slug |
55
+ | snake_case | `gestion_des_stocks` | Database, Python, file system |
56
+
57
+ ## Step 4: Ask user to choose the PRIMARY format
58
+
59
+ ```yaml
60
+ AskUserQuestion:
61
+ - header: "Format"
62
+ question: "Which format for the project name?"
63
+ options:
64
+ - label: "PascalCase.Dot (Recommended)"
65
+ description: "{PascalCase.Dot variant} - .NET convention"
66
+ - label: "PascalCase"
67
+ description: "{PascalCase variant} - single word"
68
+ - label: "kebab-case"
69
+ description: "{kebab-case variant} - git/npm convention"
70
+ - label: "snake_case"
71
+ description: "{snake_case variant} - database/python convention"
72
+ multiSelect: false
73
+ ```
74
+
75
+ ## Step 5: Store all derived names
76
+
77
+ Regardless of the chosen primary format, ALL variants are generated and stored:
78
+
79
+ ```json
80
+ {
81
+ "PROJECT_NAME": "{chosen format}",
82
+ "PROJECT_VARIANTS": {
83
+ "pascalCaseDot": "Gestion.Des.Stocks",
84
+ "pascalCase": "GestionDesStocks",
85
+ "kebabCase": "gestion-des-stocks",
86
+ "snakeCase": "gestion_des_stocks",
87
+ "displayName": "Gestion Des Stocks",
88
+ "words": ["gestion", "des", "stocks"],
89
+ "language": "fr"
90
+ }
91
+ }
92
+ ```
93
+
94
+ ## Real-world examples
95
+
96
+ | User types | PascalCase.Dot | kebab-case | PascalCase |
97
+ |-----------|---------------|------------|------------|
98
+ | `smart stack app` | `SmartStack.App` | `smart-stack-app` | `SmartStackApp` |
99
+ | `gestion-des-stocks` | `Gestion.Des.Stocks` | `gestion-des-stocks` | `GestionDesStocks` |
100
+ | `Mon Projet V2` | `Mon.Projet.V2` | `mon-projet-v2` | `MonProjetV2` |
101
+ | `user auth module` | `User.Auth.Module` | `user-auth-module` | `UserAuthModule` |
102
+ | `PROJET TEST` | `Projet.Test` | `projet-test` | `ProjetTest` |
103
+ | `e-commerce platform` | `ECommerce.Platform` | `e-commerce-platform` | `ECommercePlatform` |
@@ -0,0 +1,69 @@
1
+ # Integration Plan Document Template
2
+
3
+ > Referenced from `steps/step-plan.md` — Markdown template for generated plan documents.
4
+
5
+ **Write to:** `.claude/gitflow/plans/{branch-name}_{date}.md`
6
+
7
+ ---
8
+
9
+ ```markdown
10
+ # Integration Plan: {CURRENT} → {BASE_BRANCH}
11
+
12
+ **Generated:** {timestamp}
13
+ **Status:** PENDING
14
+
15
+ ## Summary
16
+
17
+ | Field | Value |
18
+ |-------|-------|
19
+ | Source | {CURRENT} |
20
+ | Target | {BASE_BRANCH} |
21
+ | Commits | {COMMITS} |
22
+ | Strategy | {MERGE_STRATEGY} |
23
+ | Merge Back | {MERGE_BACK or "N/A"} |
24
+
25
+ ## Commits to Integrate
26
+
27
+ {COMMIT_LIST}
28
+
29
+ ## EF Core Analysis
30
+
31
+ | Check | Status |
32
+ |-------|--------|
33
+ | Branch migrations | {count} |
34
+ | Base migrations | {count} |
35
+ | Snapshot diverged | {yes/no} |
36
+ | Conflict type | {none/migration/code/both} |
37
+
38
+ ## Pre-Integration Steps
39
+
40
+ {if migration conflict}
41
+ 1. [ ] Run `/efcore:rebase-snapshot`
42
+ 2. [ ] Verify migration generates same schema
43
+ 3. [ ] Run `/gitflow sync`
44
+ {endif}
45
+
46
+ {if code conflict}
47
+ 1. [ ] Run `/gitflow sync` (includes rebase)
48
+ 2. [ ] Resolve conflicts manually
49
+ 3. [ ] Verify build passes
50
+ {endif}
51
+
52
+ ## Integration Steps
53
+
54
+ 1. [ ] Create PR: `/gitflow pr`
55
+ 2. [ ] Review and approve
56
+ 3. [ ] Merge: `/gitflow merge`
57
+ {if release or hotfix}
58
+ 4. [ ] Merge back to develop
59
+ 5. [ ] Create tag: v{VERSION}
60
+ {endif}
61
+ 6. [ ] Cleanup: `/gitflow finish`
62
+
63
+ ## Post-Integration
64
+
65
+ - [ ] Verify CI/CD passes
66
+ - [ ] Verify migrations applied
67
+ - [ ] Delete source branch
68
+ - [ ] Remove worktree
69
+ ```