To serce całej konfiguracji. Stwórz te pliki w VS Code – możesz użyć terminala lub File Explorer po lewej.
Utwórz plik .github/copilot-instructions.md:
# Instrukcje – TaskFlow API
## Stack technologiczny
- .NET 9, C# 13
- ASP.NET Core Minimal API
- Entity Framework Core 9 + SQLite
- MediatR + FluentValidation + Ardalis.Result
- xUnit + FluentAssertions + NSubstitute
## Architektura – Clean Architecture
- `src/TaskFlow.Domain` – encje Project i TaskItem, interfejsy repozytoriów
- `src/TaskFlow.Application` – commandy, query, handlery MediatR, validatory
- `src/TaskFlow.Infrastructure` – EF Core DbContext, repozytoria
- `src/TaskFlow.API` – Minimal API endpoints, rejestracja DI
## Kluczowe konwencje
- Warstwa Application NIGDY nie używa DbContext bezpośrednio
- Każdy endpoint używa ISender (MediatR), nie serwisów bezpośrednio
- Handlery zwracają Ardalis.Result
- Async wszędzie – brak .Result i .Wait()
- CancellationToken jako ostatni parametr każdej metody async
## Nazewnictwo
- Commandy: [Akcja][Encja]Command (CreateProjectCommand)
- Query: Get[Encja]Query, Get[Encja]sQuery
- Handlery: [Nazwa]Handler
- Walidatory: [Nazwa]Validator
- Testy: [Klasa]Tests, metody: [Metoda]_When[Warunek]_Should[Wynik]
## Stack testowy
- xUnit 2, FluentAssertions, NSubstitute
- Wzorzec AAA z komentarzami // Arrange // Act // Assert
- Mockuj NSubstitute: _repo = Substitute.For()
- Testuj zachowanie (wynik), nie implementację (wywołania mocków)
## Czego NIE rób
- Nie dodawaj NuGet bez pytania
- Nie używaj DbContext w warstwie Application
- Nie hardcoduj connection strings
- Nie twórz kontrolerów MVC – tylko Minimal API
Utwórz plik .github/instructions/tests.instructions.md:
---
description: Standardy testów jednostkowych TaskFlow
applyTo: "**/*Tests.cs, **/Tests/**/*.cs"
---
# Testy jednostkowe – TaskFlow
Używaj xUnit 2, FluentAssertions i NSubstitute. Wzorzec AAA.
Konwencja nazewnictwa: [Metoda]_When[Warunek]_Should[Wynik]
Szablon klasy testowej:
```csharp
public class [Klasa]Tests
{
private readonly I[Dep] _dep = Substitute.For();
private readonly [Klasa] _sut;
public [Klasa]Tests() => _sut = new [Klasa](_dep);
}
```
Utwórz plik .github/copilot-setup-steps.yml:
steps:
- name: Setup .NET 9
uses: actions/setup-dotnet@v4
with:
dotnet-version: '9.0.x'
- name: Restore packages
run: dotnet restore TaskFlow.sln
- name: Build
run: dotnet build TaskFlow.sln --no-restore
- name: Run tests (baseline)
run: dotnet test TaskFlow.sln --no-build --verbosity normal
continue-on-error: true
Utwórz plik .github/hooks/quality-gate.json:
{
"hooks": [
{
"event": "agentStop",
"command": {
"windows": "powershell -ExecutionPolicy Bypass -File .github/hooks/quality-gate.ps1",
"linux": "bash .github/hooks/quality-gate.sh",
"mac": "bash .github/hooks/quality-gate.sh"
}
}
]
}
Utwórz plik .github/hooks/quality-gate.sh:
#!/usr/bin/env bash
set -euo pipefail
ERRORS=0
echo "🔬 TaskFlow Quality Gate"
echo "▶ [1/2] dotnet format..."
if ! dotnet format TaskFlow.sln --verify-no-changes 2>&1; then
echo "❌ Błędy formatowania – uruchom: dotnet format TaskFlow.sln"
ERRORS=$((ERRORS+1))
else echo "✅ Format OK"; fi
echo "▶ [2/2] dotnet build (analyzers)..."
if ! dotnet build TaskFlow.sln --no-restore -p:TreatWarningsAsErrors=true --verbosity quiet 2>&1; then
echo "❌ Build / analyzery nieudane"
ERRORS=$((ERRORS+1))
else echo "✅ Build OK"; fi
[ "$ERRORS" -gt 0 ] && { echo "🚫 Quality gate NIEUDANY ($ERRORS problem(y))"; exit 1; }
echo "✅ Quality gate ZALICZONY"
Utwórz plik .github/hooks/quality-gate.ps1 (Windows):
$errors = 0
Write-Host "🔬 TaskFlow Quality Gate"
dotnet format TaskFlow.sln --verify-no-changes
if ($LASTEXITCODE -ne 0) { Write-Host "❌ Format"; $errors++ } else { Write-Host "✅ Format OK" }
dotnet build TaskFlow.sln --no-restore -p:TreatWarningsAsErrors=true --verbosity quiet
if ($LASTEXITCODE -ne 0) { Write-Host "❌ Build"; $errors++ } else { Write-Host "✅ Build OK" }
if ($errors -gt 0) { Write-Host "🚫 NIEUDANY ($errors)"; exit 1 }
Write-Host "✅ ZALICZONY"
Scommituj wszystko:
git add .
git commit -m "Add Copilot configuration: instructions, setup steps, quality gate hook"
git push
✅ Efekt
Repozytorium ma folder
.github/ z czterema plikami konfiguracyjnymi. Copilot jest gotowy – zna architekturę, stack testowy i standardy projektu.