Skip to content

tomekjam/hackathon-marcina

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

🔧 Sobotni Hackathon u Marcina — 1-godzinne wyzwanie z Copilotem

       ____________________________
      /                            \
     /   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.


📜 Historia

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.


🎯 Co dziś robisz

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.


⌨️ Skróty — VS Code vs IntelliJ (z Copilot pluginem)

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.


🚀 Konfiguracja (zadanie 0, 5 min)

# W terminalu (lub IntelliJ terminal — Alt+F12)
cd code-challenge
npm install
npm test

Powinieneś 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.json jest pole quote. Możesz spróbować: Jakie jest motto tego projektu? i zobaczyć czy Copilot je znajdzie.


📚 Zadanie 1 — Onboarding kodu i ukryty bug (10 min)

Cel: Poznać kod przez Copilota. Znaleźć i naprawić ukryty bug. Funkcje: Chat (/explain), referencja przez #file:, panel Problems.

1.1 Zrozum istniejący kod

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.

1.2 Znajdź buga

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.

1.3 Napraw bug

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.

✅ Zaliczenie zadania 1

  • Bug znaleziony
  • Bug naprawiony przez /fix
  • Testy pricing przechodzą

Easter egg #2: komentarz // TODO: ASK MARCIN BEFORE TOUCHING nad buggy funkcją to czerwony śledź — Marcin sam nie wie czemu to tam jest.


✍️ Zadanie 2 — Uzupełnij walidatory (10 min)

Cel: Wygenerować ciała funkcji walidacyjnych używając tylko inline suggestions. Funkcje: Ghost text, kontekst pliku, komentarze TODO jako prompty.

2.1 NIP

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ć.

2.2 Telefon

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.

2.3 Generator numeru karty zlecenia

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.

✅ Zaliczenie zadania 2

  • validateNIP zaimplementowane (checksum poprawna)
  • validatePhonePL zaimplementowane
  • generateTicketNumber zaimplementowane

🏗️ Zadanie 3 — Dodaj endpoint w stylu firmy (10 min)

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.

3.1 Przeczytaj konwencje

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.

3.2 Plan Mode — zaprojektuj zmianę

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.ts
  • src/service-order.ts
  • src/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.

3.3 Edytuj plan ręcznie (klucz Plan Mode!)

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.

3.4 Wykonaj plan

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.

✅ Zaliczenie zadania 3

  • 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)

🤖 Zadanie 4 — Agent Mode naprawia testy (10 min)

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.

4.1 Czerwone testy

npm test

Powinieneś nadal mieć dwa nieprzechodzące testy w tests/discount.test.ts (testy ceny powinny już być zielone z zadania 1).

4.2 Agent atakuje

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 test po 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.

4.3 Pozwolenie na terminal

Agent poprosi o pozwolenie na uruchomienie npm test w terminalu. Kliknij Allow (możesz „Always allow for this workspace" jeśli jesteś pewny).

4.4 Obserwuj pętlę

Agent:

  1. Uruchamia testy → widzi failure
  2. Czyta pricing.ts i testy
  3. Edytuje pricing.ts
  4. Ponawia testy
  5. 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).

4.5 Keep all / Undo all

Po zielonym wyniku — pokaż Keep all / Undo all na końcu sesji agenta. Sesja agenta to atomowa transakcja. Jednym klikiem wszystko cofniesz.

✅ Zaliczenie zadania 4

  • Agent uruchomił testy samodzielnie
  • Naprawił calculateDiscount
  • Wszystkie testy zielone
  • Nie zmienił kodu testów (sprawdź git diff)

Easter egg #5: w pricing.ts jest funkcja whatWouldMarcinDo(). Spytaj Copilota co ona robi i czemu zawsze zwraca "Wymień olej.".


🧠 Zadanie 5 — Z notatek Marcina zrób bazę (15 min)

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.

5.1 Materiał źródłowy

Otwórz folder domain-notes/:

  • marcin-voice-memo.md — Marcin nagrał voice memo, Krystyna transkrybowała
  • napis-z-lodowki.md — kartki z lodówki z regułami
  • customer-quirks.md — przykłady dziwnych klientów

Przeczytaj 60 sekund. Notuj w głowie sprzeczności i niedopowiedzenia.

5.2 Wyciągnij wymagania

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

5.3 Najmocniejszy prompt — pytania do experta

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.

5.4 Generuj SQL DDL

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.

5.5 ERD w Mermaid

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.

✅ Zaliczenie zadania 5

  • 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?

🏆 Poziomy osiągnięć

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

🎁 Bonusy (dla szybkich — po wszystkim)

Bonus B1 — Rabat lojalnościowy (10 min)

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).

Bonus B2 — Twój własny prompt file (10 min)

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, …"

Bonus B3 — Security review server.ts

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.

Bonus B4 — Znajdź wszystkie 6 easter eggów

Już znalazłeś niektóre po drodze. Sprawdź czy masz wszystkie 6 (numerki #1-#6 są rozsiane po zadaniach).

Bonus B5 — Copilot pisze dokumentację

@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.


💡 Tips podczas pracy

  • 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.

🆘 Co gdy nie działa

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)

🎬 Po wszystkim

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     │
              └─────────────┘

About

Godzinny code challenge do GitHub Copilot

Resources

Stars

Watchers

Forks

Releases

Packages

Contributors

Languages