____________________________
/ \
/ MARCIN AUTO-SERWIS \
/ ___________________________ \
/ / \ \
/ / "Tu się remontuje auta \ \
| | a nie wymyśla kółka." | |
\ \ — Marcin, 2024 / /
\ \_________________________/ /
\ /
___\__()______________________()/____
| / \ / \ |
| | | | | |
\___\__/______________________\__/_/
Kawa w warsztacie kosztuje 3 zł. Twój czas: 1 godzina.
Marcin prowadzi warsztat samochodowy. Krystyna (jego żona, księgowa) we środę napisała na lokalnej grupie facebookowej: „Szukam programisty, mąż się topi w papierach, płacę kawą i czasem oponami."
Odpowiedziałaś/odpowiedziałeś. Jest sobota rano. Za 1 godzinę Marcin otwiera warsztat. Trzeba w godzinę zbudować mu MVP backendu żeby przetrwał weekend bez utopienia się w karteczkach.
Masz: laptopa, Copilota, kawę (3 zł), starter project. Idziemy.
Sześć zadań, ~10 minut każde. Każde zadanie używa innej funkcjonalności Copilota, ale wszystkie składają się w działający backend warsztatu.
| # | Zadanie | Funkcjonalność Copilota | Czas |
|---|---|---|---|
| 0 | Konfiguracja i pierwszy kontakt | Chat | 5 min |
| 1 | Onboarding kodu + ukryty bug | Chat (/explain, #file:, #problems) |
10 min |
| 2 | Uzupełnij stuby walidatorów | Inline suggestions (ghost text) | 10 min |
| 3 | Dodaj nowy endpoint w stylu firmy | copilot-instructions.md + Plan Mode | 10 min |
| 4 | Napraw failing testy | Agent Mode | 10 min |
| 5 | Z notatek Marcina zrób bazę danych | Wiedza domenowa + SQL DDL | 15 min |
Łącznie: 60 min + bonusy dla szybkich.
| Akcja | VS Code | IntelliJ IDEA / WebStorm |
|---|---|---|
| Otwórz Copilot Chat | ⌃⌘I (mac) / Ctrl+Alt+I (Win) |
Ctrl+Shift+G lub Tools → GitHub Copilot → Open Chat |
| Przyjmij ghost text | Tab |
Tab |
| Odrzuć ghost text | Esc |
Esc |
| Następna sugestia inline | Option+] / Alt+] |
Alt+] |
| Command palette / Find Action | ⇧⌘P / Ctrl+Shift+P |
Shift+Shift (Search Everywhere) lub Ctrl+Shift+A |
| Markdown preview | ⇧⌘V / Ctrl+Shift+V |
Klik ikony 🌐 nad edytorem markdown |
| Output / Konsola | ⇧⌘U / Ctrl+Shift+U |
Alt+4 (Run) / Alt+5 (Debug) |
| Otwórz panel Problems | ⇧⌘M / Ctrl+Shift+M |
Alt+6 (Problems Tool Window) |
| Split editor | ⌘\ / Ctrl+\ |
Shift+Drag zakładki w bok |
Tryby Chat: VS Code w 2025+ ma w panelu Chat dropdown z trybami Ask / Plan / Agent. IntelliJ Copilot plugin ma podobny przełącznik — nazwy mogą się różnić w zależności od wersji wtyczki. Jeśli nie masz Plan — użyj Ask dla zadania 3, ale ręcznie skopiuj plan do
output/plan.mdżeby zobaczyć go jako artefakt.Agent Mode w IntelliJ ma czasem ograniczenia (np. brak terminala) — jeśli to twoja sytuacja, w zadaniu 4 użyj Chat + ręcznie uruchom
npm test.
# W terminalu (lub IntelliJ terminal — Alt+F12)
cd code-challenge
npm install
npm testPowinieneś zobaczyć czerwone testy w pricing.test.ts. To celowe.
Otwórz Copilot Chat. Pierwszy prompt — sprawdź czy żyje:
W jakim projekcie jestem? Sprawdź package.json i powiedz jednym zdaniem.
Jeśli Copilot odpowiedział sensownie — zaczynamy.
Easter egg #1: w
package.jsonjest polequote. Możesz spróbować:Jakie jest motto tego projektu?i zobaczyć czy Copilot je znajdzie.
Cel: Poznać kod przez Copilota. Znaleźć i naprawić ukryty bug.
Funkcje: Chat (/explain), referencja przez #file:, panel Problems.
Otwórz src/pricing.ts. Plik wygląda niewinnie ale…
W Copilot Chat zaznacz całą funkcję calculateInvoiceTotal i wpisz:
/explain
Czytaj wynik. Nie czytaj na głos całego — wybierz najważniejsze zdanie.
Wciąż w pricing.ts. W Chat:
Czy są jakieś bugi w #file:pricing.ts? Bądź konkretny i podaj numery linii.
Hint dla początkujących:
#file:to referencja do pliku w workspace. Copilot wczyta cały plik nawet jeśli nie jest aktywny.
Powinno znaleźć co najmniej jedną kalkulację która używa złego operatora.
Zaznacz buggy funkcję. W Chat:
/fix
Pokażą się dwa przyciski nad blokiem kodu w odpowiedzi:
- Apply in Editor — smart merge, znajdzie miejsce w pliku
- Insert at Cursor — wklejenie głupie
⚠️ Klasyczna pułapka: użycie Insert at Cursor z kursorem w środku innej funkcji robi nieczytelny salat. Używaj Apply in Editor.
Zaakceptuj fix. Uruchom npm test jeszcze raz — sprawdź czy zielone.
- Bug znaleziony
- Bug naprawiony przez
/fix - Testy pricing przechodzą
Easter egg #2: komentarz
// TODO: ASK MARCIN BEFORE TOUCHINGnad buggy funkcją to czerwony śledź — Marcin sam nie wie czemu to tam jest.
Cel: Wygenerować ciała funkcji walidacyjnych używając tylko inline suggestions. Funkcje: Ghost text, kontekst pliku, komentarze TODO jako prompty.
Otwórz src/customer-store.ts. Znajdź pustą funkcję validateNIP. Komentarz
nad nią opisuje czego oczekujesz.
Ustaw kursor wewnątrz {, naciśnij Enter, odczekaj 2 sekundy w ciszy.
Pojawi się szary tekst (ghost text). Tab żeby zaakceptować.
VS Code/IntelliJ: to dokładnie tak samo działa. Jeśli ghost text się nie pojawia po 5 sekundach — kliknij gdziekolwiek w pliku, ustaw kursor ponownie, naciśnij
Esc+ Enter. Czasem trzeba zresetować.
Pod walidatorem NIP, napisz ręcznie sygnaturę:
export function validatePhonePL(input: string): boolean {Naciśnij Enter, czekaj. Copilot rozpozna wzorzec z validateNIP i zaproponuje
spójny styl.
Dopisz JSDoc komentarz nad pustą funkcją generateTicketNumber:
/**
* Generate a ticket number for a service order.
* Format: YYYY-NNNN where NNNN is zero-padded sequential number for the year.
* E.g., "2025-0042" for the 42nd order in 2025.
*/
export function generateTicketNumber(year: number, sequence: number): string {Tab. Powinno działać od ręki.
Easter egg #3: dopisz nad jakąkolwiek funkcją komentarz
// Ulubiona funkcja Marcina. Zobacz co Copilot zaproponuje.
-
validateNIPzaimplementowane (checksum poprawna) -
validatePhonePLzaimplementowane -
generateTicketNumberzaimplementowane
Cel: Wykorzystać copilot-instructions.md żeby Copilot generował kod
zgodnie z konwencjami projektu. Plus pierwsze użycie Plan Mode.
Funkcje: copilot-instructions.md, Plan Mode (lub Ask), wieloplikowy task.
Otwórz .github/copilot-instructions.md. Przeczytaj. Zwróć uwagę na:
- Architektura warstwowa
Result<T, E>zamiast wyjątków- Pieniądze jako BIGINT w groszach
- Branded types (
CustomerId,OrderId)
🤫 Tajna sekcja: w pliku konwencji jest sekcja oznaczona
# 🍕. Jeśli ją znajdziesz — zobaczysz co Marcin zamawia kiedy zostaje po godzinach.
Otwórz Copilot Chat. Przełącz tryb na Plan (jeśli dostępne). W IntelliJ — jeśli Plan niedostępne, użyj Ask ale przed wykonaniem dopisz w prompcie: „Najpierw przedstaw plan jako markdown checklist. Nie modyfikuj żadnych plików jeszcze."
Dodaj do kontekstu (drag & drop lub Add Files):
src/customer-store.tssrc/service-order.tssrc/server.ts.github/copilot-instructions.md
Prompt:
Dodaj nowy endpoint POST /service-orders/:id/cancel do server.ts.
Wymagania:
- Wyszukaj zlecenie w store (w pamięci)
- Sprawdź że zlecenie jest w stanie 'received' lub 'diagnosis' (nie 'completed' ani 'paid')
- Zmień status na 'cancelled' z powodem z request body
- Zwróć zaktualizowane zlecenie lub typowany błąd
Stosuj WSZYSTKIE konwencje z .github/copilot-instructions.md.
Najpierw przedstaw plan — nie modyfikuj jeszcze żadnych plików.
Co dostaniesz: plan jako markdown checklist z fazami i otwartymi pytaniami.
Zanim Copilot zacznie wykonywać — zmień jedną rzecz w planie:
- Wytnij krok który ci się nie podoba (np. „dodaj wpis do audit log" — dopiszemy później)
- LUB dopisz constraint: „Powód musi mieć 5-500 znaków, z walidacją"
VS Code: edytujesz markdown planu bezpośrednio w czacie. IntelliJ: może wymagać skopiowania planu do nowego pliku, edycji, i wklejenia z powrotem do czata jako kontekst.
Plan wygląda dobrze z moimi poprawkami. Wykonaj go krok po kroku.
Copilot doda kod. Sprawdź czy:
- ✅ Używa
Result<T, OrderError>, nie throw - ✅ snake_case w JSON response
- ✅ Money (jeśli pojawia się) jako BIGINT
- ✅ Używa branded types
- ✅ Status transitions zgodne z domain rules
Easter egg #4: jeśli copilot doda komentarz typu
// TODO: dodać wpis do audit log— gratulacje, przeczytał konwencje uważnie. Tam jest reguła że audit jest mandatoryjny dla każdej mutacji.
- Plan został wygenerowany jako markdown
- Edytowałaś/edytowałeś plan przed wykonaniem
- Endpoint dodany do
server.ts - Kod używa Result, branded types, snake_case (lub uzasadnione odejście)
Cel: Dać Copilotowi autonomiczne narzędzia — niech sam czyta, edytuje i uruchamia testy aż osiągnie cel. Funkcje: Agent Mode, terminal execution, iteracyjna pętla.
npm testPowinieneś nadal mieć dwa nieprzechodzące testy w tests/discount.test.ts
(testy ceny powinny już być zielone z zadania 1).
Otwórz Chat. Przełącz na Agent Mode.
IntelliJ: jeśli Agent niedostępny w twojej wersji wtyczki — użyj Chat (Ask) z poniższym promptem, ale ręcznie uruchamiaj
npm testpo każdej zmianie którą Copilot zasugeruje. Zajmie 2-3 razy więcej iteracji.
Prompt:
Uruchom testy. Zidentyfikuj które testy nie przechodzą w tests/discount.test.ts.
Napraw implementację w src/pricing.ts (funkcja `calculateDiscount`) tak żeby
wszystkie testy przeszły. Potem uruchom testy ponownie żeby potwierdzić.
NIE zmieniaj kodu testów.
Agent poprosi o pozwolenie na uruchomienie npm test w terminalu.
Kliknij Allow (możesz „Always allow for this workspace" jeśli jesteś pewny).
Agent:
- Uruchamia testy → widzi failure
- Czyta
pricing.tsi testy - Edytuje
pricing.ts - Ponawia testy
- Jeśli wciąż failure — iteruje
Twoje zadanie: patrzeć i nie ingerować. Jeśli agent się zatnie po 3 iteracjach, naciśnij Stop i sprawdź dlaczego (czasem prompt jest niejednoznaczny).
Po zielonym wyniku — pokaż Keep all / Undo all na końcu sesji agenta. Sesja agenta to atomowa transakcja. Jednym klikiem wszystko cofniesz.
- Agent uruchomił testy samodzielnie
- Naprawił
calculateDiscount - Wszystkie testy zielone
- Nie zmienił kodu testów (sprawdź git diff)
Easter egg #5: w
pricing.tsjest funkcjawhatWouldMarcinDo(). Spytaj Copilota co ona robi i czemu zawsze zwraca"Wymień olej.".
Cel: Pełen pipeline domain → wymagania → SQL. Najmocniejszy moment hackathonu. Pokażesz że ze 100% niespójnych notatek można w 15 minut wyciągnąć schemat bazy danych. Funkcje: wieloplikowy kontekst, ekstrakcja wymagań, generowanie DDL.
Otwórz folder domain-notes/:
marcin-voice-memo.md— Marcin nagrał voice memo, Krystyna transkrybowałanapis-z-lodowki.md— kartki z lodówki z regułamicustomer-quirks.md— przykłady dziwnych klientów
Przeczytaj 60 sekund. Notuj w głowie sprzeczności i niedopowiedzenia.
Otwórz Chat. Tryb Plan (lub Ask). Dodaj wszystkie 3 pliki z domain-notes/
do kontekstu.
Prompt:
Przeczytaj uważnie wszystkie dołączone notatki domenowe. Wyprodukuj trzy artefakty:
1. Słownik domenowy (ubiquitous language) jako tabela markdown:
termin po polsku | definicja | synonimy | źródło (plik:linia) | niejednoznaczności
2. Lista głównych encji. Dla każdej: PascalCase name + nazwa polska,
kluczowe atrybuty z typami, relacje.
3. Numerowana lista business rules (BR-01, BR-02, ...) z polami:
trigger | warunek | efekt
Zapisz każdy do osobnego pliku w output/:
- output/01-glossary.md
- output/02-entities.md
- output/03-business-rules.md
Wygeneruj numerowaną listę pytań do zadania Marcinowi na kolejnym spotkaniu.
Posortuj po priorytecie: Blokujące / Ważne / Nice-to-have. Dla każdego pytania
wyjaśnij dlaczego jest istotne w jednym zdaniu.
Zapisz do output/04-questions-for-marcin.md.
Otwórz wynik i przeczytaj kilka pytań. To są realne luki w specyfikacji.
Czy widzisz pytanie typu „co to znaczy że klient ma zniżkę 'taką jak zawsze'?" Tak — bo Marcin to powiedział w voice memo. Copilot nie zmyśla.
Na bazie output/02-entities.md i output/03-business-rules.md wygeneruj
PostgreSQL 16 DDL dla wszystkich encji. Konwencje:
- snake_case nazwy tabel i kolumn
- UUID v4 jako PK (gen_random_uuid())
- Wszystkie kwoty pieniędzy jako BIGINT w groszach
- TIMESTAMPTZ dla wszystkich znaczników czasu
- ENUM types dla pól o stałych wartościach
- Foreign keys z jawnym ON DELETE
- Wzorzec dyskryminatora dla Customer (jedna tabela + CHECK constraint)
- Komentarze na każdej tabeli
Zapisz do schema/01-tables.sql.
Wygeneruj diagram Mermaid erDiagram dla schematu który właśnie stworzyłeś.
Pokaż wszystkie tabele z kluczowymi atrybutami i relacjami z kardynalnością.
Zapisz do schema/02-erd.md jako pojedynczy mermaid code block.
Otwórz schema/02-erd.md w VS Code i naciśnij ⇧⌘V (markdown preview).
Mermaid renderuje się natywnie.
IntelliJ: kliknij ikonę 🌐 nad markdown editorem żeby otworzyć preview w przeglądarce. Lub zainstaluj Mermaid plugin z marketplace żeby preview w IDE.
- Słownik wygenerowany (≥15 terminów)
- Encje wygenerowane (≥5 encji)
- Business rules wygenerowane (≥5 BR-XX)
- Pytania do experta — przeczytaj 3, oceń czy są realne luki
- SQL DDL wygenerowany w
schema/01-tables.sql - ERD renderuje się w preview
Easter egg #6: Marcin w voice memo wspomina o jednym kliencie który „zawsze płaci kartą oponiarską". Jeśli twój słownik lub encje tego nie wyłapały — to znaczy że Copilot zignorował szczegół. Wyzwij go:
Czy pominąłeś coś o „karcie oponiarskiej" wspomnianej w marcin-voice-memo.md?
Po skończeniu zadań przelicz:
| Poziom | Wymagania | Tytuł |
|---|---|---|
| 🥉 | Zadania 0-3 zaliczone | Praktykant |
| 🥈 | Zadania 0-4 zaliczone | Mechanik |
| 🥇 | Zadania 0-5 zaliczone | Mistrz Mechaniki |
| 💎 | Wszystko + ≥2 bonusy | Prawa Ręka Marcina |
| 🏆 | Wszystko + wszystkie bonusy + znalazłeś wszystkie 6 easter eggów | Marcin Wewnętrzny |
Dodaj w pricing.ts funkcję calculateLoyaltyDiscount(customer: Customer): number.
Stały klient (>= 3 zakończone zlecenia) dostaje 10% rabatu na robociznę.
Użyj Plan Mode — to zmiana wieloplikowa (model + pricing + testy).
Stwórz .github/prompts/marcin-review.prompt.md z mode: ask. Prompt ma robić
review kodu w stylu Marcina — krótko, dosadnie, z polską frazeologią.
Test: zaznacz dowolny fragment kodu, wpisz /marcin-review w czacie.
Przykład odpowiedzi powinien zaczynać się od: „No to popatrz Pan, …"
W server.ts jest co najmniej jedna podatność. Użyj wbudowanego promptu
/explain lub własnego prompt file z B2 żeby ją znaleźć.
Hint: pomyśl o tym co użytkownik wkleja w request body.
Już znalazłeś niektóre po drodze. Sprawdź czy masz wszystkie 6 (numerki #1-#6 są rozsiane po zadaniach).
@workspace wygeneruj sekcję README.md "Architektura" opisującą warstwową
strukturę tego projektu. Dołącz diagram mermaid warstw.
Dorzuć do README jeśli ci się spodoba.
- Nie pędź. Hackathon ma 60 minut. Pauza po wow-momencie to część frajdy.
- Czytaj odpowiedzi Copilota. Nie akceptuj wszystkiego. 70% kodu Copilota jest dobre. Twoje zadanie — odfiltrować pozostałe 30%.
- Reload czata (
+w panelu) jeśli odpowiedzi zaczynają być dziwne — kontekst się może „zatruć" po długiej sesji. - Sprawdzaj git diff po każdym zadaniu. Spokojniej śpisz.
- Pij wodę. Marcin dba o swoich praktykantów.
| Problem | Reakcja |
|---|---|
| Copilot nie odpowiada | Sprawdź ikonę na pasku statusu. Developer: Reload Window. |
| Ghost text się nie pojawia | Esc, kliknij gdzieś indziej, ustaw kursor ponownie, Enter |
npm test nie działa |
node --version (musi być ≥22.6), npm install jeszcze raz |
| Plan Mode niedostępny | Stara wtyczka. Użyj Ask z prośbą o markdown plan first. |
| Agent nie ma terminala (IntelliJ) | Użyj Ask, uruchamiaj npm test ręcznie |
| Mermaid nie renderuje | Sprawdź pierwsze słowo bloku (mermaid, erDiagram, journey) |
Jeśli skończyłeś — wyślij swój output/ i schema/ na Slacka. Marcin obiecał
kawę gratis dla każdego kto skończył zadanie 5. Krystyna ma listę.
Jeśli skończyłeś wszystko + bonusy + easter eggi — Marcin obiecał stałą zniżkę 15% na wszystkie naprawy w jego warsztacie. Krystyna potwierdza („No w sumie tak, mąż obiecywał, niech będzie.").
Powodzenia!
|
v
┌─────────────┐
│ ☕ KAWA │
│ │
│ 3 zł │
│ │
│ Marcin │
└─────────────┘