W poprzednim artykule omówiliśmy czym jest Copilot CLI i co potrafi. Czas przestać czytać, a zacząć działać. W tym wpisie zainstalujemy CLI, zalogujemy się, stworzymy projekt przewodni serii – TaskList – i zobaczymy pierwsze efekty pracy z AI w terminalu.
Na końcu omówimy trzy tryby pracy z Copilot CLI – bez ich zrozumienia trudno wycisnąć z narzędzia więcej niż podstawowe "zapytaj AI o coś".
Instalacja
Copilot CLI można zainstalować na kilka sposobów. Wybierz metodę odpowiednią dla swojego systemu:
Windows (WinGet)
winget install GitHub.Copilot
Windows / wszystkie platformy (npm)
npm install -g @github/copilot
macOS / Linux (Homebrew)
brew install copilot-cli
macOS / Linux (skrypt instalacyjny)
curl -fsSL https://gh.io/copilot-install | bash
⚠️ Windows i PATH – częsty problem
Po instalacji przez npm na Windows zdarza się, że system nie znajduje komendy copilot. Przyczyna: katalog globalnych pakietów npm nie jest w zmiennej PATH. Sprawdź gdzie npm instaluje globalne paczki:
npm config get prefix
Wynik (np. C:\Users\TwojaNazwa\AppData\Roaming\npm) dodaj do PATH w ustawieniach systemu. Po zmianie uruchom nowe okno terminala – PowerShell cache'uje PATH przy starcie sesji.
🔍 Opcja zero-setup: GitHub Codespaces
Jeśli nie chcesz instalować niczego lokalnie – GitHub Codespaces ma Copilot CLI gotowy od razu. Wystarczy sforkować repozytorium kursu i otworzyć Codespace. Świetna opcja żeby najpierw zobaczyć jak to działa, a potem zdecydować o instalacji lokalnej.
Po instalacji uruchom CLI po raz pierwszy. Zostaniesz poproszony o zaufanie katalogowi roboczemu – możesz zatwierdzić jednorazowo lub dla wszystkich przyszłych sesji.
copilot
Następnie zaloguj się do GitHub:
> /login
Co się dzieje pod spodem:
CLI wyświetla jednorazowy kod (np. ABCD-1234)
Otwiera się przeglądarka z formularzem autoryzacji urządzenia na GitHub
Wpisujesz kod, klikasz "Authorize"
Wracasz do terminala – jesteś zalogowany
🔍 Device Authorization Flow – dlaczego tak?
Copilot CLI używa standardu OAuth 2.0 Device Authorization Grant (RFC 8628). To ten sam mechanizm co logowanie do Netflixa na Smart TV – aplikacja nie ma przeglądarki ani możliwości bezpiecznego przekierowania, więc generuje kod który weryfikujesz sam na innym urządzeniu. Twój token jest przechowywany lokalnie i jest ważny do momentu wygaśnięcia lub ręcznego wylogowania (/logout). Nie musisz się logować przy każdej sesji.
Zweryfikuj że wszystko działa:
> Powiedz cześć i opisz krótko do czego możesz mi pomóc
Powinieneś dostać przyjazną odpowiedź opisującą możliwości CLI. Wyjdź z sesji:
> /exit
Projekt przewodni – TaskList
Przez całą serię będziemy pracować na jednej aplikacji: prostej C# Console App do zarządzania listą zadań. Stwórzmy ją teraz – będziemy ją rozbudowywać w kolejnych artykułach.
Stwórz projekt
mkdir tasklist-cli
cd tasklist-cli
dotnet new console -n TaskList
cd TaskList
// TaskList – prosta aplikacja CLI do zarządzania zadaniami
// Projekt przewodni serii "GitHub Copilot CLI" na plukasiewicz.net
using System.Text.Json;
var dataFile = "tasks.json";
var tasks = LoadTasks(dataFile);
if (args.Length == 0)
{
PrintHelp();
return;
}
switch (args[0].ToLower())
{
case "list":
ListTasks(tasks);
break;
case "add":
if (args.Length < 2) { Console.WriteLine("Podaj treść zadania."); break; }
AddTask(tasks, string.Join(" ", args[1..]));
SaveTasks(dataFile, tasks);
break;
case "done":
if (args.Length < 2) { Console.WriteLine("Podaj numer zadania."); break; }
MarkDone(tasks, int.Parse(args[1]));
SaveTasks(dataFile, tasks);
break;
case "remove":
if (args.Length < 2) { Console.WriteLine("Podaj numer zadania."); break; }
RemoveTask(tasks, int.Parse(args[1]));
SaveTasks(dataFile, tasks);
break;
default:
Console.WriteLine($"Nieznana komenda: {args[0]}");
PrintHelp();
break;
}
static List<TaskItem> LoadTasks(string path)
{
if (!File.Exists(path)) return new List<TaskItem>();
var json = File.ReadAllText(path);
return JsonSerializer.Deserialize<List<TaskItem>>(json) ?? new List<TaskItem>();
}
static void SaveTasks(string path, List<TaskItem> tasks)
{
var json = JsonSerializer.Serialize(tasks, new JsonSerializerOptions { WriteIndented = true });
File.WriteAllText(path, json);
}
static void ListTasks(List<TaskItem> tasks)
{
if (tasks.Count == 0) { Console.WriteLine("Brak zadań."); return; }
foreach (var (task, i) in tasks.Select((t, i) => (t, i + 1)))
Console.WriteLine($"{i}. [{(task.Done ? "x" : " ")}] {task.Title}");
}
static void AddTask(List<TaskItem> tasks, string title)
{
tasks.Add(new TaskItem { Title = title });
Console.WriteLine($"Dodano: {title}");
}
static void MarkDone(List<TaskItem> tasks, int number)
{
if (number < 1 || number > tasks.Count) { Console.WriteLine("Nieprawidłowy numer."); return; }
tasks[number - 1].Done = true;
Console.WriteLine($"Oznaczono jako wykonane: {tasks[number - 1].Title}");
}
static void RemoveTask(List<TaskItem> tasks, int number)
{
if (number < 1 || number > tasks.Count) { Console.WriteLine("Nieprawidłowy numer."); return; }
var removed = tasks[number - 1];
tasks.RemoveAt(number - 1);
Console.WriteLine($"Usunięto: {removed.Title}");
}
static void PrintHelp()
{
Console.WriteLine("TaskList – zarządzanie zadaniami");
Console.WriteLine(" list – wyświetl zadania");
Console.WriteLine(" add <treść> – dodaj zadanie");
Console.WriteLine(" done <nr> – oznacz jako wykonane");
Console.WriteLine(" remove <nr> – usuń zadanie");
}
class TaskItem
{
public string Title { get; set; } = "";
public bool Done { get; set; } = false;
}
Sprawdź że aplikacja działa:
dotnet run -- list
dotnet run -- add "Nauczyć się Copilot CLI"
dotnet run -- add "Przeczytać całą serię"
dotnet run -- list
dotnet run -- done 1
dotnet run -- list
🌟 Oczekiwany wynik po powyższych komendach
Brak zadań.
Dodano: Nauczyć się Copilot CLI
Dodano: Przeczytać całą serię
1. [ ] Nauczyć się Copilot CLI
2. [ ] Przeczytać całą serię
Oznaczono jako wykonane: Nauczyć się Copilot CLI
1. [x] Nauczyć się Copilot CLI
2. [ ] Przeczytać całą serię
Mamy działający projekt. Teraz zobaczmy co potrafi Copilot CLI gdy dostanie go do przejrzenia.
Pierwsze demo – Copilot CLI w akcji
Uruchom Copilot CLI z katalogu projektu i poproś o przegląd kodu:
copilot
> Przejrzyj @Program.cs pod kątem jakości kodu i zasugeruj ulepszenia
Copilot przeanalizuje plik i zwróci listę obserwacji – np. brak obsługi wyjątków przy parsowaniu numeru zadania, brak separacji odpowiedzialności, brak komentarzy XML. Odpowiedź będzie inna za każdym razem, ale typ informacji jest przewidywalny: Copilot traktuje Twój kod jak senior developer który robi code review.
🔍 Co oznacza @ przed nazwą pliku?
Symbol @ informuje Copilot CLI że ma wczytać zawartość wskazanego pliku i dołączyć ją do kontekstu rozmowy. Bez @ Copilot nie widzi zawartości pliku – tylko Twoją wiadomość tekstową. Więcej o zarządzaniu kontekstem omówimy szczegółowo w artykule 03.
Spróbuj jeszcze dwóch szybkich demonstracji w tej samej sesji:
> Wyjaśnij w prostych słowach co robi metoda LoadTasks w @Program.cs
> Napisz funkcję C# która przyjmuje listę TaskItem i zwraca statystyki:
łączna liczba zadań, ile wykonanych, ile niewykonanych
To ostatnie zapytanie – generowanie kodu – to scenariusz który w praktyce oszczędza kilka minut googlowania i testowania. Wyjdź z sesji gdy skończyłeś:
> /exit
Trzy tryby pracy z Copilot CLI
Widziałeś już tryb interaktywny w akcji. Czas poznać wszystkie trzy tryby i wiedzieć kiedy którego używać. Kurs oryginalny opisuje je przez analogię do zamawiania jedzenia – i to naprawdę działa:
🔍 Analogia: sposoby zamawiania jedzenia
Tryb
Analogia
Kiedy używać
Interactive
Rozmowa z kelnerem – pytasz, dostajesz feedback, modyfikujesz zamówienie
Eksploracja, iteracja, wieloetapowe rozmowy
Plan
GPS przed wyjazdem – planujesz trasę, akceptujesz, dopiero wtedy jedziesz
Złożone zadania – najpierw plan, potem implementacja
Programmatic
Drive-through – jedno pytanie, jedna odpowiedź, do widzenia
Uruchamiasz go przez samo wpisanie copilot. Kontekst rozmowy narasta – każda wiadomość buduje na poprzednich, dokładnie jak w normalnej rozmowie. To tryb który powinieneś opanować jako pierwszy.
copilot
> Przejrzyj @Program.cs – co można poprawić?
> Dodaj obsługę wyjątków do parsowania numeru zadania
> Dodaj XML docs do wszystkich metod statycznych
> /exit
Zwróć uwagę: każde kolejne polecenie buduje na poprzednim. Nie zaczynasz od nowa – prowadzisz rozmowę.
Tryb 2: Plan – najpierw mapa, potem kod
Uruchamiasz go komendą /plan wewnątrz sesji interaktywnej, lub skrótem Shift+Tab który przełącza między trybami. Copilot układa krok po kroku plan implementacji – Ty go przeglądasz i akceptujesz zanim cokolwiek zostanie napisane.
copilot
> /plan Dodaj komendę "search" która filtruje zadania po fragmencie tytułu
Dostaniesz plan w stylu: krok 1 – dodaj gałąź w switch, krok 2 – zaimplementuj metodę SearchTasks, krok 3 – zaktualizuj help, krok 4 – przetestuj. Możesz zaakceptować, zmodyfikować, albo poprosić o inny podział kroków.
⚠️ Autopilot – tryb dla zaawansowanych
Shift+Tab cyklicznie przełącza między Interactive → Plan → Autopilot. W trybie Autopilot Copilot realizuje cały plan bez czekania na Twoje potwierdzenia przy każdym kroku – jak delegowanie zadania współpracownikowi z hasłem "wróć jak skończysz". Wymaga udzielenia pełnych uprawnień i intensywnie zużywa premium requests. Opanuj najpierw Interactive i Plan – Autopilot zostawiamy na później.
Tryb 3: Programmatic – jedno pytanie, jedna odpowiedź
Flaga -p pozwala zadać pytanie bez wchodzenia w sesję interaktywną. Idealne do skryptów, automatyzacji i szybkich jednorazowych pytań.
# Szybkie pytanie bez sesji
copilot -p "Jak sprawdzić czy plik JSON jest poprawnie sformatowany w C#?"
# Przegląd pliku z automatu
copilot --allow-all -p "Szybki code review @Program.cs – tylko krytyczne problemy"
🔍 Co robi --allow-all?
W trybie programmatic nie ma sesji interaktywnej – Copilot nie może pytać Cię o zgodę na czytanie plików. Flaga --allow-all automatycznie zatwierdza wszystkie takie prośby. Używaj jej wyłącznie z promptami które sam napisałeś i w katalogach którym ufasz. Nigdy z nieznanym inputem.
Tryb programmatic świeci szczególnie w skryptach PowerShell lub bash. Przykład: automatyczny code review wszystkich plików .cs w projekcie:
W trybie interaktywnym masz do dyspozycji komendy slash. Sześć poniższych pokrywa 90% codziennego użycia – resztę możesz odkrywać stopniowo przez /help:
Komenda
Co robi
Kiedy używać
/help
Lista wszystkich dostępnych komend
Gdy nie pamiętasz komendy
/clear
Czyści historię rozmowy, zaczyna od nowa
Zmiana tematu, reset kontekstu
/plan
Przełącza w tryb planowania
Przed złożonymi zadaniami
/model
Pokazuje lub zmienia model AI
Gdy chcesz zmienić model
/context
Pokazuje zużycie context window
Gdy sesja jest długa i chcesz sprawdzić ile zostało
/exit
Kończy sesję
Gdy skończyłeś pracę
🔍 Wybór modelu – na co zwracać uwagę?
Copilot CLI obsługuje modele od OpenAI, Anthropic i Google. Dostępność zależy od poziomu subskrypcji. Modele oznaczone 1x (np. Claude Sonnet) to dobry domyślny wybór – wydajne i nie zużywają szybko limitu premium requests. Modele z wyższym mnożnikiem (np. 5x) są mocniejsze, ale warto je zostawić na zadania które tego naprawdę wymagają. Sprawdź swoje opcje przez /model.
Jedna wskazówka której brakuje w oficjalnej dokumentacji: komendy shell możesz uruchamiać bezpośrednio z sesji bez wychodzenia z CLI, używając prefiksu !:
> !dotnet build
> !dotnet test
> !git status
Copilot CLI wykonuje komendę w tle i wraca do sesji. Przydatne gdy chcesz np. zbudować projekt po sugerowanej zmianie i od razu zapytać o błąd kompilacji.
Typowe błędy na start
Błąd
Co się dzieje
Rozwiązanie
exit zamiast /exit
Copilot traktuje "exit" jako pytanie, nie komendę
Komendy zawsze zaczynają się od /
-p do wieloetapowych rozmów
Każde wywołanie -p nie ma pamięci poprzednich
Do konwersacji używaj trybu interaktywnego
Prompt z $ lub ! bez cudzysłowów
Shell interpretuje znaki specjalne zanim Copilot je zobaczy
Owijaj prompt w cudzysłowy: copilot -p "..."
"Model not available"
Wybrany model niedostępny w Twojej subskrypcji
Użyj /model żeby zobaczyć dostępne opcje
"Context too long"
Sesja wyczerpała context window
/clear albo /compact żeby skompresować historię
Podsumowanie
Mamy zainstalowane CLI, działający projekt TaskList i rozumiemy trzy tryby pracy. To solidna baza.
Kluczowe obserwacje z tego artykułu:
Interactive – do eksploracji i iteracyjnej pracy; kontekst narasta przez całą sesję
Plan – do złożonych zadań; najpierw widzisz plan, potem akceptujesz implementację
Programmatic – do automatyzacji i jednorazowych pytań; wchodzi i wychodzi bez sesji
W następnym artykule zajmiemy się tym co sprawia że Copilot CLI jest naprawdę potężny: zarządzaniem kontekstem. Zobaczysz jak używać @ do przekazywania plików i całych katalogów, jak działa context window pod spodem i dlaczego ta wiedza przekłada się bezpośrednio na jakość odpowiedzi.