W poprzednim wpisie rozmawialiśmy o kontekście – co Copilot widzi, a czego nie. Teraz przechodzimy do praktyki: gdzie i jak skonfigurować Copilota żeby zachowywał się tak jak chcemy – konsekwentnie, w całym teamie, bez konieczności tłumaczenia wszystkiego od nowa przy każdej sesji.
Konfiguracja Copilota w VS Code działa na trzech poziomach: user-level, workspace-level i repository-level. Każdy poziom ma inny zakres, inne pliki i służy do innych celów. Jeśli nie rozumiesz tej hierarchii, bardzo łatwo wpaść w sytuację gdzie "u mnie działa, u kolegi nie" albo "skonfigurowałem to w ustawieniach ale jakoś nie działa" – i tracisz czas na debugowanie czegoś co wynika po prostu z nadpisywania ustawień przez wyższy poziom.
Zanim przejdziemy do konkretnych plików, warto zrozumieć hierarchię – bo ona decyduje co "wygrywa" gdy ustawienia na różnych poziomach są sprzeczne.
🔍 Hierarchia konfiguracji – co nadpisuje co?
USER Ustawienia użytkownika – domyślne dla wszystkich projektów
↓ nadpisywane przez
WORKSPACE Ustawienia workspace – dla aktualnie otwartego folderu
↓ nadpisywane przez
REPOSITORY Pliki w repozytorium – wersjonowane, wspólne dla całego teamu
Najwyższy priorytet ma konfiguracja z repozytorium – jeśli coś jest zdefiniowane tam, żadne ustawienie użytkownika tego nie nadpisze. To ważne dla spójności w teamie.
Omówmy teraz każdy poziom z osobna.
User-level – Twoje osobiste ustawienia
USER Zakres: tylko Twoja maszyna, wszystkie projekty
Ustawienia użytkownika obowiązują globalnie – dla każdego projektu który otworzysz na swojej maszynie, chyba że projekt ma własną konfigurację która je nadpisuje.
Możesz też otworzyć to bezpośrednio przez Ctrl+Shift+P → "Open User Settings (JSON)".
Co tu ustawiać?
Na poziomie użytkownika lądują rzeczy które są osobiste i niezwiązane z konkretnym projektem:
{
// Twój preferred model (może różnić się od teamowego)
"github.copilot.chat.defaultModel": "gpt-4o",
// Język interfejsu chatu
"github.copilot.chat.localeOverride": "pl",
// Czy Copilot ma działać w plikach markdown (np. notatki)
"github.copilot.enable": {
"*": true,
"plaintext": true,
"markdown": true,
"scminput": false
},
// Osobiste preferencje podpowiedzi inline
"github.copilot.editor.enableAutoCompletions": true,
// Globalny plik instrukcji dla wszystkich projektów
// (omówiony niżej)
"github.copilot.chat.codeGeneration.useInstructionFiles": true
}
⚠️ User-level a wrażliwe dane
Plik settings.json użytkownika nie jest commitowany do repozytorium – to dobra wiadomość jeśli chodzi o dane prywatne. Ale to też oznacza że ustawienia użytkownika są niewidoczne dla reszty teamu. Wszystko co powinno być spójne w całym projekcie – przenieś na poziom workspace lub repozytorium.
Globalny plik instrukcji (user-level)
Oprócz settings.json możesz stworzyć globalny plik instrukcji który działa dla wszystkich projektów na Twojej maszynie, niezależnie od repozytorium:
VS Code:~/.config/GitHub Copilot/instructions.md (macOS/Linux) lub %APPDATA%\GitHub Copilot\instructions.md (Windows)
🌟 Przykład: globalny plik instrukcji dla .NET developera
Treść pliku instructions.md na poziomie użytkownika:
Jestem senior .NET developerem. Domyślnie używam:
- C# 13 / .NET 9
- Nazewnictwo: PascalCase dla klas i metod, camelCase dla zmiennych lokalnych
- XML doc comments dla wszystkich publicznych API
- Preferuję record types dla niemutowalnych DTOs
- Nie używam var gdy typ nie jest oczywisty z prawej strony przypisania
Odpowiadaj po polsku jeśli piszę po polsku.
Taki plik sprawia że Copilot "wie" o Twoich preferencjach nawet gdy otwierasz zupełnie nowe repozytorium bez żadnej konfiguracji.
Workspace-level – ustawienia dla projektu
WORKSPACE Zakres: aktualnie otwarty folder / projekt, tylko Twoja maszyna
Ustawienia workspace obowiązują gdy masz otwarty konkretny folder w VS Code. Nadpisują ustawienia użytkownika. Mogą być commitowane do repozytorium przez folder .vscode/ – ale nie są obowiązkowe dla innych developerów.
Gdzie to jest?
Ustawienia workspace siedzą w katalogu .vscode/ w głównym folderze projektu:
.vscode/settings.json – ustawienia VS Code i Copilota dla tego projektu
.vscode/extensions.json – rekomendowane rozszerzenia (VS Code pyta o ich instalację)
.vscode/tasks.json – zadania build / test / run
.vscode/launch.json – konfiguracje debugowania
Co tu ustawiać?
Na poziomie workspace lądują rzeczy specyficzne dla technologii projektu, które chcesz zaproponować teamowi – ale nie wymuszać:
// .vscode/settings.json
{
// Copilot włączony/wyłączony per język dla tego projektu
"github.copilot.enable": {
"*": true,
"env": false,
"dotenv": false
},
// Dla projektu .NET – formatter
"editor.defaultFormatter": "ms-dotnettools.csharp",
"editor.formatOnSave": true,
"editor.tabSize": 4,
// Pliki do zignorowania w przeszukiwaniu
"search.exclude": {
"**/bin": true,
"**/obj": true,
"**/node_modules": true
}
}
To temat który wraca w każdym teamie. Krótka odpowiedź: commituj – ale z głową.
Plik
Commitować?
Dlaczego
settings.json
✅ Tak
Spójne formatowanie i konfiguracja Copilota dla całego teamu
extensions.json
✅ Tak
Nowy developer dostaje propozycję instalacji odpowiednich rozszerzeń od razu
tasks.json
✅ Tak
Wspólne komendy build/test/run
launch.json
✅ Tak (z wyjątkami)
Konfiguracje debugowania – ale unikaj hardcodowanych ścieżek lokalnych
*.code-workspace
⚠️ Zależy
Dla multi-root workspace tak, dla prostych projektów zbędne
Repository-level – wersjonowana konfiguracja dla teamu
REPOSITORY Zakres: wszystkie osoby pracujące przy tym repo, wszystkie maszyny
To najważniejszy poziom z perspektywy pracy zespołowej. Pliki konfiguracyjne siedzą w repozytorium, są wersjonowane razem z kodem i działają dla każdego kto sklonuje projekt – niezależnie od jego lokalnych ustawień.
Struktura katalogu .github/
Wszystkie pliki konfiguracyjne Copilota na poziomie repozytorium siedzą w katalogu .github/:
Plik .github/copilot-instructions.md to serce konfiguracji na poziomie repozytorium. Trafia automatycznie do każdej sesji Copilota w tym projekcie – bez żadnej dodatkowej konfiguracji z Twojej strony.
# Instrukcje dla GitHub Copilot – MyProject API
## Stack technologiczny
- .NET 9, C# 13
- Clean Architecture (Domain / Application / Infrastructure / API)
- Entity Framework Core 9 z PostgreSQL
- MediatR dla CQRS
- FluentValidation dla walidacji requestów
- xUnit + FluentAssertions + NSubstitute dla testów
## Zasady kodowania
- Nigdy nie umieszczaj logiki biznesowej w kontrolerach
- Każdy command/query przechodzi przez MediatR handler
- DTOs to record types – niemutowalne
- Każda metoda publiczna ma XML doc comment
- Nazwy metod asynchronicznych kończą się na Async
## Struktura projektu
- Nowe endpointy: MyProject.API/Controllers/
- Handlery: MyProject.Application/[Feature]/Commands/ lub /Queries/
- Encje: MyProject.Domain/Entities/
- Migracje EF: MyProject.Infrastructure/Migrations/
## Czego unikać
- Nie używaj `var` gdy typ nie wynika jasno z prawej strony
- Nie commituj sekretów – używaj user secrets lub zmiennych środowiskowych
- Nie wyłączaj analizatorów Roslynatora bez uzasadnienia w komentarzu
⚠️ copilot-instructions.md vs .instructions.md – jaka różnica?
To częste źródło zamieszania. Oto prosta zasada:
.github/copilot-instructions.md – jeden plik, globalne instrukcje dla całego repozytorium. Działa dla Copilot Chat, code completions i agent mode.
.github/instructions/*.instructions.md – wiele plików, każdy scopowany do konkretnych plików przez frontmatter applyTo. Precyzyjniejsza kontrola – np. inne instrukcje dla plików C# a inne dla plików testowych.
Zacznij od jednego copilot-instructions.md. Gdy zauważysz że różne części projektu potrzebują różnych instrukcji – wtedy sięgnij po plik.instructions.md z frontmatter (blok metadanych umieszczany na samym początku plików (zazwyczaj Markdown), oddzielony parą trzech myślników (---). Zazwyczaj napisany w formacie YAML, zawiera kluczowe informacje o dokumencie, takie jak tytuł, data, autor czy tagi, ułatwiając zarządzanie treścią w generatorach stron statycznych.).
Szczegółowe instrukcje z frontmatter (applyTo)
Pliki *.instructions.md pozwalają na precyzyjne scopowanie instrukcji za pomocą frontmatter:
---
applyTo: "**/*.cs"
description: "Zasady dla kodu C# w tym projekcie"
---
# Instrukcje C#
Używaj pattern matchingu zamiast długich if/else gdzie to możliwe.
Preferuj `switch` expressions nad `switch` statements.
Dla kolekcji używaj LINQ zamiast ręcznych pętli – ale tylko gdy poprawia czytelność.
---
applyTo: "**/*Tests.cs,**/*Spec.cs"
description: "Zasady dla plików testowych"
---
# Instrukcje dla testów
Wzorzec: Arrange / Act / Assert z komentarzami w każdej sekcji.
Nazwy testów: MethodName_Scenario_ExpectedResult (np. CancelOrder_WhenAlreadyCancelled_ThrowsException).
Jeden Assert per test – jeśli potrzebujesz więcej, rozdziel na osobne testy.
Mocki: tylko NSubstitute, nigdy Moq.
Tabelka porównawcza – co gdzie ustawiać?
To jest właśnie ten dodatek do dokumentacji który chciałem Wam dać. W praktyce najtrudniej jest zdecydować gdzie dane ustawienie powinno trafić. Poniżej zebrałem zasady w jednej tabelce:
Co konfigurujesz
USER
WORKSPACE
REPO
Preferowany model Copilota (gpt-4o, claude...)
✅
-
-
Język chatu (locale)
✅
-
-
Podpowiedzi inline włączone/wyłączone
✅
-
-
Osobiste preferencje stylu kodu
✅
-
-
Formatter i tabSize dla projektu
-
✅
-
Rekomendowane rozszerzenia VS Code
-
✅
-
Konfiguracje debugowania (launch.json)
-
✅
-
Copilot wyłączony dla .env / sekretów
-
✅
✅
Stack technologiczny i architektura projektu
-
-
✅
Zasady i standardy kodowania teamu
-
-
✅
Reguły compliance i bezpieczeństwa
-
-
✅
Agenci, Skills, Prompts
-
-
✅
Decyzje architektoniczne (ADR)
-
-
✅
🔍 Prosta reguła decyzyjna
Gdy zastanawiasz się gdzie coś umieścić, zadaj sobie jedno pytanie: "Czy inny developer w teamie powinien mieć to samo ustawienie?"
Nie (osobiste preferencje) → USER
Tak, ale to kwestia komfortu pracy (formatter, rozszerzenia) → WORKSPACE w .vscode/
Tak, to obowiązuje wszystkich i powinno być wersjonowane → REPO w .github/
Dlaczego to ma znaczenie w teamie?
Wyobraź sobie klasyczny scenariusz onboardingu: nowy developer dołącza do projektu. Klonuje repo, otwiera VS Code i zaczyna pracować z Copilotem. Co dostaje?
🌟 Onboarding – przed i po prawidłowej konfiguracji
❌ Bez konfiguracji repo
✅ Z konfiguracja repo
Copilot generuje kod w stylu który zna z internetu – var wszędzie, Moq zamiast NSubstitute, logika w kontrolerach, brak XML doc.
Developer nie wie jakich rozszerzeń potrzebuje – instaluje za dużo lub za mało.
Pierwsze PR-y wymagają dziesiątek komentarzy o stylu zamiast merytoryki.
VS Code od razu proponuje instalację właściwych rozszerzeń.
Copilot od pierwszej sesji zna architekturę, stack i zasady projektu.
Generowany kod trafia od razu w obowiązujące wzorce – pierwsze PR-y dyskutują o logice, nie o formatowaniu.
Dobrze skonfigurowane repozytorium sprawia że Copilot działa jak senior developer który był przy projekcie od początku – nie jak stażysta który nie czytał żadnej dokumentacji.
💪 Zadanie dla Ciebie – podstawowy setup w 15 minut
Zrób to w swoim aktualnym projekcie:
Stwórz plik .github/copilot-instructions.md i wpisz: stack technologiczny, 3-5 kluczowych zasad kodowania, czego unikać. Nie przesadzaj z długością – 20-30 linii wystarczy na start.
Sprawdź czy masz .vscode/extensions.json z rekomendowanymi rozszerzeniami. Jeśli nie – stwórz go i dodaj przynajmniej github.copilot i github.copilot-chat.
W .vscode/settings.json dodaj "github.copilot.enable": { "env": false, "dotenv": false } – żeby Copilot nie podpowiadał w plikach z sekretami.
Scommituj zmiany i poproś kolegę z teamu żeby sklonował repo od zera i powiedział co widzi. Pierwsze wrażenie nowego developera to najlepsza weryfikacja czy konfiguracja ma sens.
Podsumowanie
Trzy poziomy konfiguracji, trzy różne zastosowania:
✅ USERUser-level – osobiste preferencje, żyje tylko na Twojej maszynie. Model, język, własny styl. Nigdy nie commitowany.
✅ WORKSPACEWorkspace-level – ustawienia projektu w .vscode/. Formatter, rozszerzenia, konfiguracje debugowania. Commituj – ale nie wymuszaj.
✅ REPORepository-level – versjonowana wiedza o projekcie w .github/. Instrukcje, agenci, skille, zasady teamu. Obowiązkowe dla spójnej pracy w grupie.
Im lepiej wypełnisz poziom repozytorium, tym mniej czasu tracisz na tłumaczenie kontekstu – zarówno Copilotowi, jak i nowym developerom w teamie.
W kolejnym wpisie wchodzimy głębiej w temat instrukcji: jak definiować własne instrukcje – jak je pisać żeby działały, czego unikać i jak je scopować do konkretnych części projektu.