Paweł Łukasiewicz: programista blogger
Paweł Łukasiewicz
2026-04-01
Paweł Łukasiewicz: programista blogger
Paweł Łukasiewicz
2026-04-01
Udostępnij Udostępnij Kontakt
Wprowadzenie

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 mergemWorkflow 1: Code Review
Posprzątać stary lub chaotyczny kodWorkflow 2: Refactoring
Znaleźć i naprawić bugaWorkflow 3: Debugging
Wygenerować testy dla istniejącego koduWorkflow 4: Generowanie testów
Pisać lepsze commity i opisy PRWorkflow 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
1Zrozum buga[opis objawu] @plik.cs Zanalizuj przyczynę
2NaprawNapraw [konkretny problem]
3Wygeneruj testyWygeneruj testy xUnit dla [scenariuszy]
4Review/review
5Commitcopilot -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.

Do zobaczenia w artykule 04! 🚀