Poprzednie artykuły zbudowały fundament: instalacja, trzy tryby pracy, zarządzanie kontekstem i sesjami. Czas wejść do warsztatu i zobaczyć jak Copilot CLI wpisuje się w codzienną pracę developera.
Ten artykuł to pięć niezależnych workflow: code review, refactoring, debugging, generowanie testów i integracja z gitem. Możesz przeczytać je wszystkie po kolei albo wskoczyć od razu w ten który Cię interesuje – każdy jest kompletny sam w sobie.
🔍 Mapa tego artykułu
Chcę…
Przejdź do
Robić code review przed mergem
Workflow 1: Code Review
Posprzątać stary lub chaotyczny kod
Workflow 2: Refactoring
Znaleźć i naprawić buga
Workflow 3: Debugging
Wygenerować testy dla istniejącego kodu
Workflow 4: Generowanie testów
Pisać lepsze commity i opisy PR
Workflow 5: Integracja z gitem
Workflow 1: Code Review
Code review z Copilot CLI to nie "znajdź bugi w tym pliku". To ukierunkowana analiza konkretnych obszarów – im bardziej precyzyjny prompt, tym bardziej użyteczna odpowiedź.
Podstawowy przegląd pliku
copilot
> Przejrzyj @Program.cs pod kątem jakości kodu
Przegląd ukierunkowany na konkretny obszar
> Przejrzyj @TaskService.cs pod kątem problemów z walidacją wejścia.
Sprawdź: brakującą walidację, luki w obsłudze błędów, edge cases
Przegląd całego projektu z checklistą
> @TaskList/ Przejrzyj cały projekt. Stwórz checklistę Markdown problemów
skategoryzowanych według priorytetu:
- Krytyczne (ryzyko utraty danych, crashe)
- Wysokie (bugi, niepoprawne zachowanie)
- Średnie (wydajność, łatwość utrzymania)
- Niskie (styl, drobne ulepszenia)
Interaktywny code review – wieloetapowo
copilot
> @Program.cs @TaskService.cs Przejrzyj te pliki pod kątem:
- walidacji wejścia
- obsługi błędów
- spójności stylu
> Obsługa błędów w TaskService – czy są jakieś edge cases których nie uwzględniłem?
> Stwórz checklistę wszystkich znalezionych problemów posortowaną według priorytetu
🔍 Komenda /review – kiedy zamiast promptu?
Copilot CLI ma wbudowany agent do code review uruchamiany przez /review. Różnica między /review a ręcznym promptem jest subtelna ale ważna: /review jest zoptymalizowany pod staged/unstaged zmiany w gicie i daje wysoki stosunek sygnału do szumu – mniej gadania, więcej konkretnych obserwacji.
copilot
> /review # przegląd staged/unstaged zmian
> /review Sprawdź bezpieczeństwo # przegląd z konkretnym focusem
Używaj /review gdy masz konkretne zmiany do sprawdzenia przed commitem. Używaj ręcznego promptu z @plik gdy analizujesz istniejący kod bez kontekstu gita.
⚠️ Vague prompts = vague answers
Słabo:> Przejrzyj ten kod → dostaniesz ogólne uwagi które mógłbyś wyczytać z dowolnego artykułu o clean code.
Dobrze:> Przejrzyj @TaskService.cs pod kątem thread safety, brakującej walidacji null i niespójnej obsługi wyjątków → dostaniesz konkretne wskazania z numerami linii.
Workflow 2: Refactoring
Refactoring z Copilot CLI działa najlepiej iteracyjnie – małe kroki, każdy weryfikowalny. Nie próbuj przepisać całego pliku jednym promptem.
Prosty refactoring – konkretna zmiana
copilot
# switch w Program.cs zastąp słownikiem delegatów
> @Program.cs Obsługa komend używa switch/case. Zrefaktoryzuj to
na wzorzec słownika delegatów (dictionary dispatch).
# dodaj type annotations
> @TaskService.cs Dodaj XML documentation do wszystkich metod publicznych
# wydziel logikę
> @Program.cs Wydziel logikę wyświetlania zadań do osobnej klasy DisplayService
Separacja odpowiedzialności między plikami
> @Program.cs @TaskService.cs
Program.cs ma logikę wyświetlania zmieszaną z logiką aplikacji.
Zrefaktoryzuj żeby wyświetlanie było w osobnej klasie.
Spójna obsługa błędów
> @Program.cs @TaskService.cs
Te pliki mają niespójną obsługę błędów – jeden rzuca wyjątkami,
drugi zwraca bool. Zaproponuj ujednolicone podejście
z custom exceptions.
🌟 Złota zasada bezpiecznego refactoringu: najpierw testy
Zanim zaczniesz refactoring – poproś Copilota o wygenerowanie testów dla bieżącego zachowania. Masz wtedy siatkę bezpieczeństwa która wyłapie każde niezamierzone regresje.
copilot
# Krok 1: testy PRZED refactoringiem
> @TaskService.cs Wygeneruj testy xUnit dla bieżącego zachowania wszystkich metod
# Krok 2: refactoring z zabezpieczeniem
> Teraz zrefaktoryzuj klasę TaskService żeby używała wzorca Result zamiast
rzucania wyjątków. Testy powinny nadal przechodzić.
To podejście jest szczególnie cenne przy odziedziczonym kodzie bez testów – budujesz siatkę zanim zaczniesz zmieniać.
🔍 Wzorzec Result w C# – kiedy warto zastosować
Jedną z najczęstszych niespójności w starszych projektach .NET jest mieszanie konwencji zwracania błędów: część metod rzuca wyjątki, część zwraca bool, część zwraca null. Copilot CLI świetnie radzi sobie z migracją do wzorca Result<T> (popularnego np. przez bibliotekę CSharpFunctionalExtensions). Wystarczy opisać obecny problem i wskazać docelowy wzorzec – Copilot przeprowadzi migrację zachowując logikę biznesową.
Workflow 3: Debugging
Klucz do skutecznego debugowania z Copilot CLI: opisuj objaw (co widzisz) i oczekiwanie (co powinno się dziać). Copilot sam znajdzie przyczynę.
Podstawowe wzorce debugowania
copilot
# Wzorzec: "oczekiwałem X, dostałem Y"
> @TaskService.cs Użytkownicy zgłaszają że wyszukiwanie zadań po tytule
nie działa dla małych liter. Debug: dlaczego "zakupy" nie znajduje "Zakupy"?
# Wzorzec: "nieoczekiwane zachowanie"
> @Program.cs Gdy podaję numer zadania który nie istnieje, aplikacja
mówi że usunęła zadanie. Znajdź dlaczego.
# Wzorzec: "błędne wyniki"
> @TaskService.cs Gdy oznaczam jedno zadanie jako wykonane,
wszystkie zadania są oznaczane. Co jest bugiem?
Wklejanie stack trace bezpośrednio do sesji
> Dostaję taki błąd:
System.NullReferenceException: Object reference not set to an instance of an object.
at TaskService.MarkDone(Int32 number) in TaskService.cs:line 24
at Program.<Main>$(String[] args) in Program.cs:line 18
@TaskService.cs Wyjaśnij dlaczego i jak to naprawić
🌟 "Bug Detective" – Copilot znajduje bugi których nie szukałeś
Ponieważ Copilot CLI analizuje cały plik, często przy okazji naprawiania zgłoszonego buga wykrywa inne powiązane problemy. Celowo wbudujmy dwa bugi w TaskService i zobaczmy co się stanie:
// Wersja z bugami – dodaj do TaskService.cs na potrzeby ćwiczenia
public bool Remove(int number)
{
// Bug 1: brak walidacji zakresu
_tasks.RemoveAt(number); // number zamiast number-1, bez sprawdzenia zakresu
return true;
}
public IEnumerable<TaskItem> Search(string query)
{
// Bug 2: case-sensitive porównanie
return _tasks.Where(t => t.Title == query);
}
copilot
> @TaskService.cs Użytkownicy zgłaszają że wyszukiwanie nie zwraca
wyników dla zapytania "zakupy" mimo że takie zadanie istnieje. Debug.
Copilot znajdzie bug w Search (case-sensitive) ale przy okazji powinien też zauważyć problem w Remove – brak walidacji zakresu i off-by-one. To jest wartość analizy całego pliku.
Śledzenie problemu przez wiele plików
> Numeracja zadań na liście zaczyna się od 0 zamiast od 1.
@Program.cs @TaskService.cs
Prześledź przepływ wyświetlania listy i wskaż gdzie leży problem
Problemy z plikiem danych
> @Program.cs @tasks.json
Czasem plik tasks.json jest uszkodzony i aplikacja crashuje.
Jak obsłużyć to bezpiecznie?
🔍 Debugging .NET: specyfika dla C#
Kilka wzorców szczególnie użytecznych przy debugowaniu kodu .NET z Copilot CLI:
Async/await bugi – > @Service.cs Czy są problemy z async/await? Sprawdź deadlocki i brakujące ConfigureAwait
Null reference – > @Service.cs Wskaż wszystkie miejsca gdzie może wystąpić NullReferenceException
LINQ – > @Service.cs Ta kwerenda LINQ zwraca złe wyniki dla pustej kolekcji. Debug.
EF Core – > @DbContext.cs @Service.cs Mam N+1 problem w tym zapytaniu. Pokaż jak to naprawić przez Include()
Workflow 4: Generowanie testów
Ręcznie pisząc testy, większość z nas tworzy 2–3 przypadki: happy path, jeden błędny input, jeden edge case. Copilot CLI generuje 15+ testów w 30 sekund – w tym te których sami byśmy nie wymyślili.
Kompleksowe testy xUnit dla całej klasy
copilot
> @TaskService.cs Wygeneruj kompleksowe testy xUnit dla klasy TaskService. Uwzględnij:
- Dodawanie zadań
- Usuwanie zadań
- Oznaczanie jako wykonane
- Wyszukiwanie
- Edge cases z pustą kolekcją
- Nieprawidłowe numery zadań
Przykładowy output – zwróć uwagę na edge cases których pewnie byś nie uwzględnił ręcznie:
public class TaskServiceTests
{
// Happy path
[Fact]
public void Add_ValidTitle_AddsTaskToCollection() { }
[Fact]
public void MarkDone_ValidNumber_SetsTaskAsDone() { }
// Edge cases – to jest wartość AI
[Fact]
public void MarkDone_NumberZero_ThrowsArgumentOutOfRangeException() { }
[Fact]
public void MarkDone_NumberGreaterThanCount_ThrowsArgumentOutOfRangeException() { }
[Fact]
public void Remove_LastTask_LeavesEmptyCollection() { }
[Fact]
public void Search_CaseInsensitive_FindsTask() { }
[Fact]
public void Search_EmptyQuery_ReturnsAllTasks() { }
[Fact]
public void Search_NoMatches_ReturnsEmptyCollection() { }
// Persistence
[Fact]
public void LoadTasks_FileNotFound_ReturnsEmptyList() { }
[Fact]
public void LoadTasks_CorruptedJson_HandlesGracefully() { }
// Concurrent modifications
[Fact]
public void Add_MultipleItems_PreservesOrder() { }
}
Testy dla konkretnej metody z edge cases
> @TaskService.cs Wygeneruj testy xUnit dla metody Remove() pokrywające:
- Usunięcie istniejącego zadania
- Usunięcie pierwszego zadania (indeks graniczny)
- Usunięcie ostatniego zadania (indeks graniczny)
- Numer poniżej 1
- Numer powyżej liczby zadań
- Usunięcie z pustej kolekcji
Uruchomienie wygenerowanych testów
> Jak uruchomić testy? Pokaż mi komendy dotnet test.
# Copilot odpowie:
# dotnet test – wszystkie testy
# dotnet test --verbosity normal – z opisem każdego testu
# dotnet test --filter "MarkDone" – tylko testy zawierające "MarkDone" w nazwie
# dotnet test --logger "trx" – z raportem XML (przydatne w CI)
🔍 Specyfikowanie frameworka i stylu testów
Domyślnie Copilot wybierze styl testów sam – może trafić na xUnit, NUnit albo MSTest zależnie od kontekstu. Jeśli masz preferencje, powiedz wprost:
> Wygeneruj testy używając xUnit z FluentAssertions zamiast standardowych asercji
> Wygeneruj testy w stylu BDD (Given/When/Then) z xUnit
> Użyj Moq do mockowania ITaskRepository w testach TaskService
Im więcej kontekstu podasz o stacku testowym, tym bardziej "wklejalne" będą wygenerowane testy.
⚠️ Weryfikuj wygenerowane testy zanim zrobisz commit
Copilot CLI generuje testy na podstawie kodu który widzi – jeśli kod ma buga, testy mogą testować błędne zachowanie jako poprawne. Zawsze uruchom wygenerowane testy i przejrzyj asercje. Szczególna uwaga na testy które zawsze przechodzą (asercja zawsze true) lub nigdy nie mogą failować.
Workflow 5: Integracja z gitem
Copilot CLI i git razem to jeden z najbardziej praktycznych workflow w całej serii. Generowanie commit messages, opisów PR i przegląd zmian przed pushem – wszystko z terminala.
Generowanie commit messages
# Podejrzyj co zmieniłeś
git diff --staged
# Wygeneruj conventional commit message
copilot -p "Wygeneruj conventional commit message dla: $(git diff --staged)"
# Przykładowy output:
# feat(tasks): dodaj wyszukiwanie bez rozróżnienia wielkości liter
#
# - Zmień porównanie w Search() na case-insensitive
# - Zaktualizuj testy żeby pokrywały oba przypadki
# - Popraw komunikat błędu gdy brak wyników
🔍 Conventional Commits – dlaczego warto
Conventional Commits to konwencja formatowania wiadomości commitów: typ(scope): opis. Typy to m.in. feat, fix, refactor, test, docs. Dlaczego to ważne: narzędzia jak semantic-release czy conventional-changelog potrafią automatycznie generować CHANGELOG i zarządzać wersjami semver na podstawie tych commitów. Jeśli pracujesz w projekcie który to używa – Copilot CLI może generować poprawne commity za Ciebie.
Opis PR z logu commitów
copilot -p "Wygeneruj opis pull requesta dla tych zmian:
$(git log main..HEAD --oneline)
Uwzględnij:
- Podsumowanie zmian
- Dlaczego te zmiany były potrzebne
- Co zostało przetestowane
- Czy są breaking changes? (tak/nie)"
Szybki review przed pushem
# Ostatnie sprawdzenie przed git push
copilot -p "Przejrzyj te zmiany pod kątem problemów zanim pushnę:
$(git diff main..HEAD)"
Komenda /pr w trybie interaktywnym
copilot
> /pr # auto-decyduje: view/create/fix na podstawie stanu brancha
> /pr create # tworzy nowego PR
> /pr view # podgląd istniejącego PR dla bieżącego brancha
Podgląd zmian z bieżącej sesji
copilot
# Po wprowadzeniu zmian w sesji...
> /diff # pokazuje visual diff wszystkiego co zmieniono w tej sesji
🔍 /delegate – delegowanie zadania do agenta w tle
Komenda /delegate (lub skrót &) przekazuje dobrze zdefiniowane zadanie do Copilot Coding Agent na GitHubie. Agent commituje zmiany na nowy branch, otwiera draft PR i pracuje w tle. Ty dostajesz powiadomienie gdy skończy i czeka na Twój review.
copilot
> /delegate Dodaj walidację do wszystkich metod publicznych w TaskService.cs
# lub skrótowo:
> & Napraw literówkę w README
Idealne dla dobrze zdefiniowanych, izolowanych zadań które chcesz zlecić gdy zajmujesz się czymś innym. Wymaga połączenia z repozytorium GitHub.
Kompletny workflow: od buga do commita
Zobaczmy jak pięć workflow łączy się w jeden spójny proces. Scenariusz: użytkownicy zgłaszają że wyszukiwanie zadań nie działa dla małych liter.
copilot
# 1. Zrozum problem
> Użytkownicy zgłaszają: "wyszukiwanie zadania 'zakupy' nie działa
mimo że zadanie 'Zakupy' istnieje"
@TaskService.cs Zanalizuj i znajdź prawdopodobną przyczynę
# 2. Debug (kontynuując tę samą sesję)
> Pokaż mi metodę Search() i wyjaśnij problem
> Napraw metodę Search() żeby działała case-insensitively
# 3. Generuj testy dla fixa
> Wygeneruj testy xUnit konkretnie dla:
- Szukanie dokładną nazwą
- Szukanie małymi literami
- Szukanie częścią nazwy
- Szukanie gdy brak wyników
# 4. Review fixa
> /review
# 5. Commit
> /exit
# Poza sesją – commit
git add .
copilot -p "Wygeneruj conventional commit message dla: $(git diff --staged)"
# Output: "fix(tasks): popraw wyszukiwanie zadań na case-insensitive"
Krok
Akcja
Komenda Copilot
1
Zrozum buga
[opis objawu] @plik.cs Zanalizuj przyczynę
2
Napraw
Napraw [konkretny problem]
3
Wygeneruj testy
Wygeneruj testy xUnit dla [scenariuszy]
4
Review
/review
5
Commit
copilot -p "... $(git diff --staged)"
Budowanie własnego workflow
Nie ma jednego właściwego sposobu używania Copilot CLI. Kilka obserwacji które pomogą Ci wypracować własny styl:
Zacznij od /plan przy wszystkim co nie jest trywialne. Dobry plan prowadzi do lepszych wyników niż improwizowany refactoring.
Zapisuj prompty które działają. Gdy znajdziesz formułę która daje świetne wyniki dla Twojego projektu – zapisz ją. W artykule 06 omówimy jak zamienić je w Skills ładowane automatycznie.
Eksperymentuj ze stylem. Niektórzy wolą długie, szczegółowe prompty. Inni krótkie z wieloma followupami. Oba podejścia działają – znajdź swoje.
Używaj /research przed kodowaniem. Jeśli nie jesteś pewny jak podejść do problemu – /research przeszuka GitHub i sieć i da Ci podsumowanie z referencjami zanim zaczniesz pisać kod.
Podsumowanie
Pięć workflow które omówiliśmy to rdzeń codziennej pracy z Copilot CLI. Kluczowe wnioski:
Code review – im bardziej ukierunkowany prompt, tym konkretniejszy feedback; /review dla zmian gitowych
Refactoring – najpierw generuj testy, potem refaktoryzuj; iteruj małymi krokami
Debugging – opisuj objawy i oczekiwanie; Copilot znajdzie przyczynę i często wykryje powiązane bugi
Testy – specyfikuj framework i styl; weryfikuj asercje zanim zrobisz commit
Git – $(git diff --staged) w trybie -p to jeden z najpraktyczniejszych wzorców całej serii
W następnym artykule wyjdziemy poza standardowe użycie: stworzysz własnych agentów AI wyspecjalizowanych w Twoim projekcie i skonfigurujesz custom instructions które Copilot będzie ładował automatycznie.