@atlashub/smartstack-cli 1.3.0 → 1.4.1
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 +916 -912
- package/.documentation/apex.html +1018 -1014
- package/.documentation/business-analyse.html +1501 -1074
- package/.documentation/commands.html +680 -676
- package/.documentation/css/styles.css +2168 -2030
- package/.documentation/efcore.html +2505 -2501
- package/.documentation/gitflow.html +2618 -2053
- package/.documentation/hooks.html +413 -409
- package/.documentation/index.html +323 -319
- package/.documentation/installation.html +462 -458
- package/.documentation/js/app.js +794 -794
- package/.documentation/ralph-loop.html +530 -0
- package/.documentation/test-web.html +513 -509
- package/README.md +52 -10
- package/dist/index.js +6 -6
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/templates/commands/business-analyse/0-orchestrate.md +640 -0
- package/templates/commands/business-analyse.md +84 -3
- package/templates/commands/create/agent.md +138 -0
- package/templates/commands/create/command.md +166 -0
- package/templates/commands/create/hook.md +234 -0
- package/templates/commands/create/plugin.md +329 -0
- package/templates/commands/create/project.md +507 -0
- package/templates/commands/create/skill.md +199 -0
- package/templates/commands/create.md +220 -0
|
@@ -0,0 +1,507 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create a full-stack SmartStack project (Clean Architecture .NET + React/Vite/Tailwind)
|
|
3
|
+
argument-hint: <project-name> [description]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Create SmartStack Project
|
|
7
|
+
|
|
8
|
+
Scaffold a complete full-stack project with:
|
|
9
|
+
- **Backend**: .NET 10 Clean Architecture (Domain, Application, Infrastructure, Api)
|
|
10
|
+
- **Frontend**: React 19 + TypeScript + Vite + Tailwind CSS
|
|
11
|
+
|
|
12
|
+
## Arguments
|
|
13
|
+
|
|
14
|
+
Parse from `$ARGUMENTS`:
|
|
15
|
+
- **name** (required): Project name in PascalCase (e.g., `MyProject`)
|
|
16
|
+
- **description** (optional): Project description
|
|
17
|
+
|
|
18
|
+
## Project Structure
|
|
19
|
+
|
|
20
|
+
```
|
|
21
|
+
{ProjectName}/
|
|
22
|
+
├── .gitignore
|
|
23
|
+
├── .claudeignore
|
|
24
|
+
├── README.md
|
|
25
|
+
├── CLAUDE.md
|
|
26
|
+
├── LICENSE
|
|
27
|
+
├── Directory.Build.props
|
|
28
|
+
├── {ProjectName}.sln
|
|
29
|
+
│
|
|
30
|
+
├── src/
|
|
31
|
+
│ ├── {ProjectName}.Domain/
|
|
32
|
+
│ │ ├── {ProjectName}.Domain.csproj
|
|
33
|
+
│ │ ├── Common/
|
|
34
|
+
│ │ │ ├── BaseEntity.cs
|
|
35
|
+
│ │ │ ├── IAuditableEntity.cs
|
|
36
|
+
│ │ │ └── IDomainEvent.cs
|
|
37
|
+
│ │ ├── Entities/
|
|
38
|
+
│ │ ├── Enums/
|
|
39
|
+
│ │ ├── Exceptions/
|
|
40
|
+
│ │ │ └── DomainException.cs
|
|
41
|
+
│ │ └── ValueObjects/
|
|
42
|
+
│ │
|
|
43
|
+
│ ├── {ProjectName}.Application/
|
|
44
|
+
│ │ ├── {ProjectName}.Application.csproj
|
|
45
|
+
│ │ ├── Common/
|
|
46
|
+
│ │ │ ├── Behaviors/
|
|
47
|
+
│ │ │ │ ├── ValidationBehavior.cs
|
|
48
|
+
│ │ │ │ └── LoggingBehavior.cs
|
|
49
|
+
│ │ │ ├── Interfaces/
|
|
50
|
+
│ │ │ │ ├── IApplicationDbContext.cs
|
|
51
|
+
│ │ │ │ └── ICurrentUserService.cs
|
|
52
|
+
│ │ │ └── Models/
|
|
53
|
+
│ │ │ └── Result.cs
|
|
54
|
+
│ │ ├── Features/
|
|
55
|
+
│ │ │ └── .gitkeep
|
|
56
|
+
│ │ └── DependencyInjection.cs
|
|
57
|
+
│ │
|
|
58
|
+
│ ├── {ProjectName}.Infrastructure/
|
|
59
|
+
│ │ ├── {ProjectName}.Infrastructure.csproj
|
|
60
|
+
│ │ ├── Persistence/
|
|
61
|
+
│ │ │ ├── ApplicationDbContext.cs
|
|
62
|
+
│ │ │ ├── Configurations/
|
|
63
|
+
│ │ │ │ └── .gitkeep
|
|
64
|
+
│ │ │ ├── Migrations/
|
|
65
|
+
│ │ │ │ └── .gitkeep
|
|
66
|
+
│ │ │ └── Seeding/
|
|
67
|
+
│ │ │ └── DatabaseSeeder.cs
|
|
68
|
+
│ │ ├── Services/
|
|
69
|
+
│ │ │ └── DateTimeService.cs
|
|
70
|
+
│ │ └── DependencyInjection.cs
|
|
71
|
+
│ │
|
|
72
|
+
│ ├── {ProjectName}.Api.Core/
|
|
73
|
+
│ │ ├── {ProjectName}.Api.Core.csproj
|
|
74
|
+
│ │ ├── Controllers/
|
|
75
|
+
│ │ │ └── BaseApiController.cs
|
|
76
|
+
│ │ ├── Extensions/
|
|
77
|
+
│ │ │ └── ServiceCollectionExtensions.cs
|
|
78
|
+
│ │ ├── Middleware/
|
|
79
|
+
│ │ │ └── ExceptionHandlingMiddleware.cs
|
|
80
|
+
│ │ └── Hubs/
|
|
81
|
+
│ │ └── NotificationHub.cs
|
|
82
|
+
│ │
|
|
83
|
+
│ └── {ProjectName}.Api/
|
|
84
|
+
│ ├── {ProjectName}.Api.csproj
|
|
85
|
+
│ ├── Properties/
|
|
86
|
+
│ │ └── launchSettings.json
|
|
87
|
+
│ ├── appsettings.json
|
|
88
|
+
│ ├── appsettings.Development.json
|
|
89
|
+
│ ├── appsettings.Production.json
|
|
90
|
+
│ └── Program.cs
|
|
91
|
+
│
|
|
92
|
+
├── web/
|
|
93
|
+
│ └── {project-name}-web/
|
|
94
|
+
│ ├── package.json
|
|
95
|
+
│ ├── tsconfig.json
|
|
96
|
+
│ ├── tsconfig.app.json
|
|
97
|
+
│ ├── tsconfig.node.json
|
|
98
|
+
│ ├── vite.config.ts
|
|
99
|
+
│ ├── eslint.config.mjs
|
|
100
|
+
│ ├── tailwind.config.js
|
|
101
|
+
│ ├── postcss.config.js
|
|
102
|
+
│ ├── index.html
|
|
103
|
+
│ ├── .env.example
|
|
104
|
+
│ └── src/
|
|
105
|
+
│ ├── main.tsx
|
|
106
|
+
│ ├── App.tsx
|
|
107
|
+
│ ├── index.css
|
|
108
|
+
│ ├── vite-env.d.ts
|
|
109
|
+
│ ├── components/
|
|
110
|
+
│ │ ├── layout/
|
|
111
|
+
│ │ │ ├── Header.tsx
|
|
112
|
+
│ │ │ ├── Sidebar.tsx
|
|
113
|
+
│ │ │ └── Footer.tsx
|
|
114
|
+
│ │ └── ui/
|
|
115
|
+
│ │ ├── Button.tsx
|
|
116
|
+
│ │ └── Card.tsx
|
|
117
|
+
│ ├── pages/
|
|
118
|
+
│ │ ├── HomePage.tsx
|
|
119
|
+
│ │ └── NotFoundPage.tsx
|
|
120
|
+
│ ├── hooks/
|
|
121
|
+
│ │ └── useApi.ts
|
|
122
|
+
│ ├── contexts/
|
|
123
|
+
│ │ ├── AuthContext.tsx
|
|
124
|
+
│ │ └── ThemeContext.tsx
|
|
125
|
+
│ ├── services/
|
|
126
|
+
│ │ └── api/
|
|
127
|
+
│ │ └── client.ts
|
|
128
|
+
│ ├── types/
|
|
129
|
+
│ │ └── index.ts
|
|
130
|
+
│ ├── utils/
|
|
131
|
+
│ │ └── helpers.ts
|
|
132
|
+
│ └── config/
|
|
133
|
+
│ └── constants.ts
|
|
134
|
+
│
|
|
135
|
+
├── tests/
|
|
136
|
+
│ └── {ProjectName}.Tests/
|
|
137
|
+
│ └── {ProjectName}.Tests.csproj
|
|
138
|
+
│
|
|
139
|
+
└── tools/
|
|
140
|
+
└── .gitkeep
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Workflow
|
|
144
|
+
|
|
145
|
+
### 1. PARSE & VALIDATE
|
|
146
|
+
|
|
147
|
+
Extract from `$ARGUMENTS`:
|
|
148
|
+
```
|
|
149
|
+
name: PascalCase project name (e.g., "MyProject")
|
|
150
|
+
description: Optional description
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
Validate:
|
|
154
|
+
- Name is PascalCase: `^[A-Z][a-zA-Z0-9]*$`
|
|
155
|
+
- Directory doesn't exist
|
|
156
|
+
- Name is not a reserved word
|
|
157
|
+
|
|
158
|
+
### 2. CREATE ROOT STRUCTURE
|
|
159
|
+
|
|
160
|
+
Use Bash to create directories:
|
|
161
|
+
```bash
|
|
162
|
+
mkdir -p {ProjectName}/src
|
|
163
|
+
mkdir -p {ProjectName}/web
|
|
164
|
+
mkdir -p {ProjectName}/tests
|
|
165
|
+
mkdir -p {ProjectName}/tools
|
|
166
|
+
mkdir -p {ProjectName}/scripts
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
### 3. GENERATE BACKEND FILES
|
|
170
|
+
|
|
171
|
+
For each backend project, use Write tool to create:
|
|
172
|
+
|
|
173
|
+
#### 3.1 Directory.Build.props
|
|
174
|
+
```xml
|
|
175
|
+
<Project>
|
|
176
|
+
<PropertyGroup>
|
|
177
|
+
<TargetFramework>net10.0</TargetFramework>
|
|
178
|
+
<ImplicitUsings>enable</ImplicitUsings>
|
|
179
|
+
<Nullable>enable</Nullable>
|
|
180
|
+
<TreatWarningsAsErrors>false</TreatWarningsAsErrors>
|
|
181
|
+
<Version>1.0.0</Version>
|
|
182
|
+
<Authors>{Author}</Authors>
|
|
183
|
+
<Company>{Company}</Company>
|
|
184
|
+
</PropertyGroup>
|
|
185
|
+
</Project>
|
|
186
|
+
```
|
|
187
|
+
|
|
188
|
+
#### 3.2 Solution File ({ProjectName}.sln)
|
|
189
|
+
Use `dotnet new sln` and `dotnet sln add` commands.
|
|
190
|
+
|
|
191
|
+
#### 3.3 Domain Project
|
|
192
|
+
- Create .csproj with MediatR.Contracts
|
|
193
|
+
- Create BaseEntity.cs, IDomainEvent.cs
|
|
194
|
+
- Create folder structure
|
|
195
|
+
|
|
196
|
+
#### 3.4 Application Project
|
|
197
|
+
- Create .csproj with MediatR, FluentValidation
|
|
198
|
+
- Create Result.cs, ValidationBehavior.cs
|
|
199
|
+
- Create DependencyInjection.cs
|
|
200
|
+
|
|
201
|
+
#### 3.5 Infrastructure Project
|
|
202
|
+
- Create .csproj with EF Core, SqlServer
|
|
203
|
+
- Create ApplicationDbContext.cs
|
|
204
|
+
- Create DependencyInjection.cs
|
|
205
|
+
|
|
206
|
+
#### 3.6 Api.Core Project
|
|
207
|
+
- Create .csproj with ASP.NET Core
|
|
208
|
+
- Create BaseApiController.cs
|
|
209
|
+
- Create ExceptionHandlingMiddleware.cs
|
|
210
|
+
|
|
211
|
+
#### 3.7 Api Project
|
|
212
|
+
- Create .csproj as entry point
|
|
213
|
+
- Create Program.cs with full bootstrap
|
|
214
|
+
- Create appsettings.json files
|
|
215
|
+
|
|
216
|
+
### 4. GENERATE FRONTEND FILES
|
|
217
|
+
|
|
218
|
+
#### 4.1 package.json
|
|
219
|
+
```json
|
|
220
|
+
{
|
|
221
|
+
"name": "{project-name}-web",
|
|
222
|
+
"private": true,
|
|
223
|
+
"version": "1.0.0",
|
|
224
|
+
"type": "module",
|
|
225
|
+
"scripts": {
|
|
226
|
+
"dev": "vite",
|
|
227
|
+
"build": "tsc -b && vite build",
|
|
228
|
+
"lint": "eslint .",
|
|
229
|
+
"preview": "vite preview"
|
|
230
|
+
},
|
|
231
|
+
"dependencies": {
|
|
232
|
+
"react": "^19.0.0",
|
|
233
|
+
"react-dom": "^19.0.0",
|
|
234
|
+
"react-router-dom": "^7.0.0",
|
|
235
|
+
"axios": "^1.7.0",
|
|
236
|
+
"@microsoft/signalr": "^8.0.0",
|
|
237
|
+
"lucide-react": "^0.400.0"
|
|
238
|
+
},
|
|
239
|
+
"devDependencies": {
|
|
240
|
+
"@types/react": "^19.0.0",
|
|
241
|
+
"@types/react-dom": "^19.0.0",
|
|
242
|
+
"@vitejs/plugin-react": "^4.3.0",
|
|
243
|
+
"typescript": "~5.6.0",
|
|
244
|
+
"vite": "^6.0.0",
|
|
245
|
+
"tailwindcss": "^4.0.0",
|
|
246
|
+
"@tailwindcss/vite": "^4.0.0",
|
|
247
|
+
"eslint": "^9.0.0"
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
#### 4.2 vite.config.ts
|
|
253
|
+
```typescript
|
|
254
|
+
import { defineConfig } from 'vite'
|
|
255
|
+
import react from '@vitejs/plugin-react'
|
|
256
|
+
import tailwindcss from '@tailwindcss/vite'
|
|
257
|
+
|
|
258
|
+
export default defineConfig({
|
|
259
|
+
plugins: [react(), tailwindcss()],
|
|
260
|
+
server: {
|
|
261
|
+
port: 5173,
|
|
262
|
+
proxy: {
|
|
263
|
+
'/api': 'http://localhost:5000'
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
})
|
|
267
|
+
```
|
|
268
|
+
|
|
269
|
+
#### 4.3 React Components
|
|
270
|
+
- Create App.tsx with router setup
|
|
271
|
+
- Create basic layout components
|
|
272
|
+
- Create context providers
|
|
273
|
+
- Create API client
|
|
274
|
+
|
|
275
|
+
### 5. GENERATE CONFIGURATION FILES
|
|
276
|
+
|
|
277
|
+
#### .gitignore
|
|
278
|
+
```
|
|
279
|
+
# .NET
|
|
280
|
+
bin/
|
|
281
|
+
obj/
|
|
282
|
+
*.user
|
|
283
|
+
*.suo
|
|
284
|
+
appsettings.Local.json
|
|
285
|
+
|
|
286
|
+
# Node
|
|
287
|
+
node_modules/
|
|
288
|
+
dist/
|
|
289
|
+
.env.local
|
|
290
|
+
|
|
291
|
+
# IDE
|
|
292
|
+
.vs/
|
|
293
|
+
.vscode/
|
|
294
|
+
.idea/
|
|
295
|
+
|
|
296
|
+
# OS
|
|
297
|
+
.DS_Store
|
|
298
|
+
Thumbs.db
|
|
299
|
+
|
|
300
|
+
# Logs
|
|
301
|
+
*.log
|
|
302
|
+
logs/
|
|
303
|
+
```
|
|
304
|
+
|
|
305
|
+
#### CLAUDE.md
|
|
306
|
+
```markdown
|
|
307
|
+
# {ProjectName} Architecture Memory
|
|
308
|
+
|
|
309
|
+
## Project Overview
|
|
310
|
+
{description}
|
|
311
|
+
|
|
312
|
+
## Technology Stack
|
|
313
|
+
- Backend: .NET 10, EF Core, Clean Architecture
|
|
314
|
+
- Frontend: React 19, TypeScript, Vite, Tailwind CSS
|
|
315
|
+
- Database: SQL Server
|
|
316
|
+
|
|
317
|
+
## Architecture
|
|
318
|
+
Clean Architecture with CQRS pattern.
|
|
319
|
+
|
|
320
|
+
## Conventions
|
|
321
|
+
- Use MediatR for commands/queries
|
|
322
|
+
- Use FluentValidation for validation
|
|
323
|
+
- Use Result<T> for operation results
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
### 6. INITIALIZE GIT & DOTNET
|
|
327
|
+
|
|
328
|
+
```bash
|
|
329
|
+
cd {ProjectName}
|
|
330
|
+
git init
|
|
331
|
+
dotnet new sln -n {ProjectName}
|
|
332
|
+
dotnet sln add src/{ProjectName}.Domain
|
|
333
|
+
dotnet sln add src/{ProjectName}.Application
|
|
334
|
+
dotnet sln add src/{ProjectName}.Infrastructure
|
|
335
|
+
dotnet sln add src/{ProjectName}.Api.Core
|
|
336
|
+
dotnet sln add src/{ProjectName}.Api
|
|
337
|
+
dotnet restore
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
### 7. DISPLAY SUCCESS
|
|
341
|
+
|
|
342
|
+
```
|
|
343
|
+
╔═══════════════════════════════════════════════════════════════╗
|
|
344
|
+
║ SMARTSTACK PROJECT CREATED ║
|
|
345
|
+
╠═══════════════════════════════════════════════════════════════╣
|
|
346
|
+
║ Name: {ProjectName} ║
|
|
347
|
+
║ Location: {full-path} ║
|
|
348
|
+
╠═══════════════════════════════════════════════════════════════╣
|
|
349
|
+
║ Backend: ║
|
|
350
|
+
║ ✓ {ProjectName}.Domain (Core entities) ║
|
|
351
|
+
║ ✓ {ProjectName}.Application (CQRS, Use cases) ║
|
|
352
|
+
║ ✓ {ProjectName}.Infrastructure (EF Core, Services) ║
|
|
353
|
+
║ ✓ {ProjectName}.Api.Core (Controllers, Middleware) ║
|
|
354
|
+
║ ✓ {ProjectName}.Api (Entry point) ║
|
|
355
|
+
╠═══════════════════════════════════════════════════════════════╣
|
|
356
|
+
║ Frontend: ║
|
|
357
|
+
║ ✓ {project-name}-web (React + Vite + Tailwind) ║
|
|
358
|
+
╠═══════════════════════════════════════════════════════════════╣
|
|
359
|
+
║ Next steps: ║
|
|
360
|
+
║ 1. cd {ProjectName} ║
|
|
361
|
+
║ 2. dotnet build ║
|
|
362
|
+
║ 3. cd web/{project-name}-web && npm install ║
|
|
363
|
+
║ 4. Configure appsettings.Local.json ║
|
|
364
|
+
║ 5. dotnet ef database update ║
|
|
365
|
+
║ 6. dotnet run --project src/{ProjectName}.Api ║
|
|
366
|
+
║ 7. npm run dev (in web folder) ║
|
|
367
|
+
╚═══════════════════════════════════════════════════════════════╝
|
|
368
|
+
```
|
|
369
|
+
|
|
370
|
+
## File Templates
|
|
371
|
+
|
|
372
|
+
### Domain/BaseEntity.cs
|
|
373
|
+
```csharp
|
|
374
|
+
namespace {ProjectName}.Domain.Common;
|
|
375
|
+
|
|
376
|
+
public abstract class BaseEntity
|
|
377
|
+
{
|
|
378
|
+
public Guid Id { get; protected set; } = Guid.NewGuid();
|
|
379
|
+
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
|
|
380
|
+
public DateTime? UpdatedAt { get; set; }
|
|
381
|
+
public string? CreatedBy { get; set; }
|
|
382
|
+
public string? UpdatedBy { get; set; }
|
|
383
|
+
}
|
|
384
|
+
```
|
|
385
|
+
|
|
386
|
+
### Application/Result.cs
|
|
387
|
+
```csharp
|
|
388
|
+
namespace {ProjectName}.Application.Common.Models;
|
|
389
|
+
|
|
390
|
+
public class Result<T>
|
|
391
|
+
{
|
|
392
|
+
public bool IsSuccess { get; }
|
|
393
|
+
public T? Value { get; }
|
|
394
|
+
public string? Error { get; }
|
|
395
|
+
|
|
396
|
+
private Result(bool isSuccess, T? value, string? error)
|
|
397
|
+
{
|
|
398
|
+
IsSuccess = isSuccess;
|
|
399
|
+
Value = value;
|
|
400
|
+
Error = error;
|
|
401
|
+
}
|
|
402
|
+
|
|
403
|
+
public static Result<T> Success(T value) => new(true, value, null);
|
|
404
|
+
public static Result<T> Failure(string error) => new(false, default, error);
|
|
405
|
+
}
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
### Infrastructure/ApplicationDbContext.cs
|
|
409
|
+
```csharp
|
|
410
|
+
using Microsoft.EntityFrameworkCore;
|
|
411
|
+
using {ProjectName}.Application.Common.Interfaces;
|
|
412
|
+
|
|
413
|
+
namespace {ProjectName}.Infrastructure.Persistence;
|
|
414
|
+
|
|
415
|
+
public class ApplicationDbContext : DbContext, IApplicationDbContext
|
|
416
|
+
{
|
|
417
|
+
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
|
|
418
|
+
: base(options)
|
|
419
|
+
{
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
|
423
|
+
{
|
|
424
|
+
modelBuilder.ApplyConfigurationsFromAssembly(typeof(ApplicationDbContext).Assembly);
|
|
425
|
+
base.OnModelCreating(modelBuilder);
|
|
426
|
+
}
|
|
427
|
+
}
|
|
428
|
+
```
|
|
429
|
+
|
|
430
|
+
### Api/Program.cs
|
|
431
|
+
```csharp
|
|
432
|
+
using {ProjectName}.Application;
|
|
433
|
+
using {ProjectName}.Infrastructure;
|
|
434
|
+
using {ProjectName}.Api.Core.Extensions;
|
|
435
|
+
|
|
436
|
+
var builder = WebApplication.CreateBuilder(args);
|
|
437
|
+
|
|
438
|
+
// Add services
|
|
439
|
+
builder.Services.AddApplication();
|
|
440
|
+
builder.Services.AddInfrastructure(builder.Configuration);
|
|
441
|
+
builder.Services.AddApiCore();
|
|
442
|
+
|
|
443
|
+
builder.Services.AddControllers();
|
|
444
|
+
builder.Services.AddEndpointsApiExplorer();
|
|
445
|
+
builder.Services.AddSwaggerGen();
|
|
446
|
+
builder.Services.AddSignalR();
|
|
447
|
+
|
|
448
|
+
var app = builder.Build();
|
|
449
|
+
|
|
450
|
+
// Configure pipeline
|
|
451
|
+
if (app.Environment.IsDevelopment())
|
|
452
|
+
{
|
|
453
|
+
app.UseSwagger();
|
|
454
|
+
app.UseSwaggerUI();
|
|
455
|
+
}
|
|
456
|
+
|
|
457
|
+
app.UseHttpsRedirection();
|
|
458
|
+
app.UseAuthentication();
|
|
459
|
+
app.UseAuthorization();
|
|
460
|
+
app.MapControllers();
|
|
461
|
+
app.MapHub<NotificationHub>("/hubs/notifications");
|
|
462
|
+
|
|
463
|
+
app.Run();
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### Frontend/App.tsx
|
|
467
|
+
```tsx
|
|
468
|
+
import { BrowserRouter, Routes, Route } from 'react-router-dom';
|
|
469
|
+
import { AuthProvider } from './contexts/AuthContext';
|
|
470
|
+
import { ThemeProvider } from './contexts/ThemeContext';
|
|
471
|
+
import HomePage from './pages/HomePage';
|
|
472
|
+
import NotFoundPage from './pages/NotFoundPage';
|
|
473
|
+
|
|
474
|
+
function App() {
|
|
475
|
+
return (
|
|
476
|
+
<ThemeProvider>
|
|
477
|
+
<AuthProvider>
|
|
478
|
+
<BrowserRouter>
|
|
479
|
+
<Routes>
|
|
480
|
+
<Route path="/" element={<HomePage />} />
|
|
481
|
+
<Route path="*" element={<NotFoundPage />} />
|
|
482
|
+
</Routes>
|
|
483
|
+
</BrowserRouter>
|
|
484
|
+
</AuthProvider>
|
|
485
|
+
</ThemeProvider>
|
|
486
|
+
);
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
export default App;
|
|
490
|
+
```
|
|
491
|
+
|
|
492
|
+
## Execution Rules
|
|
493
|
+
|
|
494
|
+
1. **ALWAYS** create all directories before files
|
|
495
|
+
2. **USE** Write tool for each file (not batch)
|
|
496
|
+
3. **USE** Bash for dotnet commands
|
|
497
|
+
4. **VALIDATE** project name is PascalCase
|
|
498
|
+
5. **NEVER** overwrite existing directories
|
|
499
|
+
6. Create files in this order: root → backend → frontend → config
|
|
500
|
+
|
|
501
|
+
## Priority
|
|
502
|
+
|
|
503
|
+
Correctness > Completeness > Speed
|
|
504
|
+
|
|
505
|
+
---
|
|
506
|
+
|
|
507
|
+
User: $ARGUMENTS
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: Create a SmartStack skill extension project with multi-phase workflow
|
|
3
|
+
argument-hint: <name> [phases] [description]
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Create Skill Extension
|
|
7
|
+
|
|
8
|
+
Scaffold a complete SmartStack **skill** extension with multi-phase workflow.
|
|
9
|
+
|
|
10
|
+
## What is a Skill?
|
|
11
|
+
|
|
12
|
+
A skill is a complex multi-phase orchestrator:
|
|
13
|
+
- Manages workflows with multiple phases
|
|
14
|
+
- Each phase can use different models (cost optimization)
|
|
15
|
+
- Contains templates, questionnaires, validation gates
|
|
16
|
+
- Produces structured output (documentation, code, etc.)
|
|
17
|
+
|
|
18
|
+
## Arguments
|
|
19
|
+
|
|
20
|
+
Parse from `$ARGUMENTS`:
|
|
21
|
+
- **name** (required): Skill name in kebab-case
|
|
22
|
+
- **phases** (optional): Number of phases (default: 5)
|
|
23
|
+
- **description** (optional): What the skill does
|
|
24
|
+
|
|
25
|
+
## Project Structure
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
smartstack-{name}/
|
|
29
|
+
├── package.json
|
|
30
|
+
├── tsconfig.json
|
|
31
|
+
├── tsup.config.ts
|
|
32
|
+
├── README.md
|
|
33
|
+
├── .gitignore
|
|
34
|
+
├── src/
|
|
35
|
+
│ └── index.ts
|
|
36
|
+
└── templates/
|
|
37
|
+
└── skills/
|
|
38
|
+
└── {name}/
|
|
39
|
+
├── SKILL.md # Main skill definition
|
|
40
|
+
├── 1-setup.md # Phase 1
|
|
41
|
+
├── 2-analyze.md # Phase 2
|
|
42
|
+
├── 3-design.md # Phase 3
|
|
43
|
+
├── 4-execute.md # Phase 4
|
|
44
|
+
├── 5-validate.md # Phase 5
|
|
45
|
+
└── templates.md # Shared templates
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Generated SKILL.md
|
|
49
|
+
|
|
50
|
+
```markdown
|
|
51
|
+
---
|
|
52
|
+
name: {name}
|
|
53
|
+
description: |
|
|
54
|
+
{description}
|
|
55
|
+
Use when:
|
|
56
|
+
- User needs {name} functionality
|
|
57
|
+
- User mentions related keywords
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
# {PascalCaseName} Skill
|
|
61
|
+
|
|
62
|
+
{description}
|
|
63
|
+
|
|
64
|
+
## Overview
|
|
65
|
+
|
|
66
|
+
Multi-phase workflow for {name} operations.
|
|
67
|
+
|
|
68
|
+
## Phase Summary
|
|
69
|
+
|
|
70
|
+
| Phase | Command | Description | Model | Cost |
|
|
71
|
+
|-------|---------|-------------|-------|------|
|
|
72
|
+
| 1 | `/{name}:1-setup` | Initial setup and configuration | Haiku | ~$0.02 |
|
|
73
|
+
| 2 | `/{name}:2-analyze` | Analysis and discovery | Sonnet | ~$0.10 |
|
|
74
|
+
| 3 | `/{name}:3-design` | Design and planning | Sonnet | ~$0.10 |
|
|
75
|
+
| 4 | `/{name}:4-execute` | Implementation | Opus | ~$0.30 |
|
|
76
|
+
| 5 | `/{name}:5-validate` | Validation and testing | Sonnet | ~$0.10 |
|
|
77
|
+
| **Total** | | | | ~$0.62 |
|
|
78
|
+
|
|
79
|
+
## Workflow Diagram
|
|
80
|
+
|
|
81
|
+
╔═══════════╗ ╔═══════════╗ ╔═══════════╗
|
|
82
|
+
║ 1-SETUP ║ ──▶ ║ 2-ANALYZE ║ ──▶ ║ 3-DESIGN ║
|
|
83
|
+
║ (Haiku) ║ ║ (Sonnet) ║ ║ (Sonnet) ║
|
|
84
|
+
╚═══════════╝ ╚═══════════╝ ╚═══════════╝
|
|
85
|
+
│
|
|
86
|
+
╔═══════════╗ ╔═══════════╗ ▼
|
|
87
|
+
║ COMPLETE ║ ◀── ║ 5-VALIDATE║ ◀── ╔═══════════╗
|
|
88
|
+
║ ║ ║ (Sonnet) ║ ║ 4-EXECUTE ║
|
|
89
|
+
╚═══════════╝ ╚═══════════╝ ║ (Opus) ║
|
|
90
|
+
╚═══════════╝
|
|
91
|
+
|
|
92
|
+
## Output Location
|
|
93
|
+
|
|
94
|
+
Generated files go to:
|
|
95
|
+
- Working directory: `./{name}/`
|
|
96
|
+
- Or specified output path
|
|
97
|
+
|
|
98
|
+
## Available Commands
|
|
99
|
+
|
|
100
|
+
| Command | Description |
|
|
101
|
+
|---------|-------------|
|
|
102
|
+
| `/{name}` | Run complete workflow (all phases) |
|
|
103
|
+
| `/{name}:1-setup` | Run setup phase only |
|
|
104
|
+
| `/{name}:2-analyze` | Run analysis phase only |
|
|
105
|
+
| `/{name}:3-design` | Run design phase only |
|
|
106
|
+
| `/{name}:4-execute` | Run execution phase only |
|
|
107
|
+
| `/{name}:5-validate` | Run validation phase only |
|
|
108
|
+
|
|
109
|
+
## Absolute Rules
|
|
110
|
+
|
|
111
|
+
1. **NEVER** skip phases in sequence mode
|
|
112
|
+
2. **ALWAYS** validate before proceeding
|
|
113
|
+
3. **PRESERVE** existing configurations
|
|
114
|
+
4. **DOCUMENT** all decisions
|
|
115
|
+
5. **COST-OPTIMIZE** model selection
|
|
116
|
+
|
|
117
|
+
## Context Variables
|
|
118
|
+
|
|
119
|
+
Available in all phases:
|
|
120
|
+
- `$NAME` - Skill name
|
|
121
|
+
- `$PHASE` - Current phase number
|
|
122
|
+
- `$OUTPUT_DIR` - Output directory
|
|
123
|
+
- `$ARGUMENTS` - User arguments
|
|
124
|
+
|
|
125
|
+
## Priority
|
|
126
|
+
|
|
127
|
+
Quality > Cost > Speed
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
## Generated Phase Template (example: 1-setup.md)
|
|
131
|
+
|
|
132
|
+
```markdown
|
|
133
|
+
---
|
|
134
|
+
description: Phase 1 - Setup and configuration
|
|
135
|
+
argument-hint: [output-dir]
|
|
136
|
+
---
|
|
137
|
+
|
|
138
|
+
# Phase 1: Setup
|
|
139
|
+
|
|
140
|
+
## Objective
|
|
141
|
+
|
|
142
|
+
Initialize the {name} workflow environment.
|
|
143
|
+
|
|
144
|
+
## Prerequisites
|
|
145
|
+
|
|
146
|
+
- None (this is the first phase)
|
|
147
|
+
|
|
148
|
+
## Steps
|
|
149
|
+
|
|
150
|
+
### 1.1 Parse Arguments
|
|
151
|
+
- Extract output directory from `$ARGUMENTS`
|
|
152
|
+
- Default to `./{name}/` if not specified
|
|
153
|
+
|
|
154
|
+
### 1.2 Create Directory Structure
|
|
155
|
+
```
|
|
156
|
+
{output-dir}/
|
|
157
|
+
├── config/
|
|
158
|
+
├── output/
|
|
159
|
+
└── logs/
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
### 1.3 Initialize Configuration
|
|
163
|
+
- Create default config file
|
|
164
|
+
- Set up logging
|
|
165
|
+
|
|
166
|
+
## Output
|
|
167
|
+
|
|
168
|
+
- Directory structure created
|
|
169
|
+
- Configuration initialized
|
|
170
|
+
- Ready for Phase 2
|
|
171
|
+
|
|
172
|
+
## Validation Checklist
|
|
173
|
+
|
|
174
|
+
- [ ] Output directory exists
|
|
175
|
+
- [ ] Config file created
|
|
176
|
+
- [ ] No errors encountered
|
|
177
|
+
|
|
178
|
+
## Next Phase
|
|
179
|
+
|
|
180
|
+
Proceed to: `/{name}:2-analyze`
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
User: $ARGUMENTS
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Workflow
|
|
188
|
+
|
|
189
|
+
1. Parse arguments (name, phases, description)
|
|
190
|
+
2. Validate name format
|
|
191
|
+
3. Create project directory
|
|
192
|
+
4. Generate SKILL.md
|
|
193
|
+
5. Generate each phase template
|
|
194
|
+
6. Generate templates.md
|
|
195
|
+
7. Display success message
|
|
196
|
+
|
|
197
|
+
---
|
|
198
|
+
|
|
199
|
+
User: $ARGUMENTS
|