Claude Code w dużych monorepo może się rozjeżdżać, gdy repozytorium jest ogromne. Naucz się ustawiać granice, tworzyć lokalne podsumowania i powtarzalne workflow, aby utrzymać precyzyjne odpowiedzi.

payments używany przez inne aplikacje, bo nie widział opakowania specyficznego dla danej aplikacji, które powinno zostać zmienione.\n\nCelem nie jest pokazanie Claude'owi całego monorepo. Celem jest dostarczenie mniejszych, przemyślanych wejść, które nadal odpowiadają na pytanie: pakiet, który zmieniasz, jego bezpośrednie zależności i jednen lub dwa „źródła prawdy” dla typów i konfiguracji. Wskaż też obszary „nie dotykać” (inne aplikacje, infra, pliki generowane) i potwierdź, który pakiet jest właścicielem zachowania.\n\n## Zacznij od zdefiniowania zadania, nie repo\n\nDokładność zależy mniej od tego, ile kodu wkleisz, a bardziej od tego, jak jasno opiszesz zadanie.\n\nZacznij od rezultatu, którego oczekujesz: konkretnej poprawki, refaktoru lub odpowiedzi. „Pytanie o kod” może być ogólne. Prośba o „wprowadzenie zmiany” wymaga granic, wejść i kryteriów sukcesu.\n\nPrzed udostępnieniem czegokolwiek, napisz jedno zdanie kończące tę frazę: „Po skończeniu powinienem móc…”. Na przykład: „uruchomić testy jednostkowe pakietu X bez błędów” albo „zobaczyć nowe pole w odpowiedzi API dla endpointu Y”. To zdanie staje się gwiazdą północną, gdy repo jest ogromne.\n\nDla zmian udostępnij najmniejszy zestaw artefaktów, który może udowodnić poprawność zmiany: punkty wejścia, odpowiednie typy/interfejsy lub schemat, jeden nieudany test albo krok repro z oczekiwanym rezultatem oraz wszelką konfigurację wpływającą na tę ścieżkę (routing, feature flagi, build lub lint). Jeśli to pomaga, dodaj krótki mapę folderów pakietu, aby Claude zrozumiał, do czego służy każdy katalog.\n\nBądź wyraźny co do tego, czego nie trzeba przeglądać. Napisz: „Ignoruj pliki generowane, foldery vendor, pliki build, snapshoty i lockfile, chyba że poproszę.” To zapobiega marnowaniu czasu i edycjom miejsc, których nie przejrzysz.\n\nUstal także oczekiwania co do niepewności. Poproś Claude'a, by oznaczał założenia i nieznane zamiast zgadywać. Na przykład: „Jeśli nie widzisz, gdzie ta funkcja jest wywoływana, powiedz to i zaproponuj 2 sposoby jej zlokalizowania.”\n\n## Wyznacz jasne granice, których Claude nie powinien przekraczać\n\nW dużym monorepo dokładność spada, gdy model zaczyna „pomocniczo” wciągać pobliski kod, który nie jest częścią zadania. Naprawa jest prosta: zdefiniuj, co jest w zakresie, a co poza nim, zanim poprosisz o zmiany.\n\nZacznij od granicy odpowiadającej organizacji repo: pakiet, serwis, aplikacja lub biblioteka współdzielona. Jeśli zmiana to „aktualizacja UI checkout”, granicą jest prawdopodobnie jeden pakiet aplikacji, a nie każde miejsce, gdzie występuje słowo „checkout”.\n\nSygnalizatory pomagające Claude'owi pozostać w miejscu to konwencje folderów (apps/, services/, packages/, libs/), manifesty pakietów (eksporty i zależności), publiczne punkty wejścia (pliki index, eksportowane komponenty, handlery) i testy (często ujawniają oczekiwaną powierzchnię). README wewnątrz folderu może być najszybszym markerem granicy.\n\nGranice działają najlepiej, gdy nazwiesz mosty między nimi. Wymień konkretne interfejsy, których Claude może dotykać, a traktuj wszystko inne jako poza zakresem. Typowe mosty to kontrakty HTTP API, tematy i payloady zdarzeń, współdzielone typy lub mały zestaw eksportowanych funkcji.\n\nRównież wskaż strefy „nie dotykać” zawsze, gdy zmiana nie ma ich obejmować. Typowe to konfiguracje infrastruktury i wdrożeń, logika bezpieczeństwa i autoryzacji, rozliczenia i płatności, migracje danych i schematy produkcyjne oraz biblioteki współdzielone używane przez wiele zespołów.\n\nSzczegół, który pomaga w promptcie:\n\n„Wprowadzaj zmiany tylko w packages/cart/ i jego testach. Możesz czytać shared types w packages/types/, ale ich nie modyfikuj. Nie edytuj infra, auth ani billing.”\n\n## Jak pisać użyteczne lokalne podsumowania\n\nDokładność rośnie, gdy dostarczysz małą, stabilną mapę obszaru, który chcesz zmienić. „Lokalne podsumowanie” to ta mapa: na tyle krótkie, by przeczytać szybko, na tyle konkretne, by zapobiec zgadywaniu.\n\nUtrzymuj każde podsumowanie w 10–20 liniach. Pisz tak, jakbyś przekazywał kod nowemu koledze, który musi dotknąć tylko tej granicy, nie całego repo. Używaj prostego języka i prawdziwych nazw z kodu: folderów, pakietów, eksportowanych funkcji.\n\nUżyteczne lokalne podsumowanie odpowiada na pięć pytań:\n\n- Do czego służy ten pakiet/serwis i do czego nie służy (zakres)\n- Gdzie zaczyna się praca (punkty wejścia jak pliki, trasy, komendy lub komponenty)\n- Co można bezpiecznie wywołać z zewnątrz (publiczne API, eksporty, zdarzenia, endpointy)\n- Od czego zależy (bazy danych, kolejki, cache, konfiguracja, usługi zewnętrzne)\n- Jakie zasady tu obowiązują (wzorce nazewnictwa, styl błędów, logowanie, sposób pisania testów)\n\nDodaj jedną linię „gotchas”. To miejsce na zapobieganie kosztownym pomyłkom: ukryte cache, feature flagi, kroki migracji i wszystko, co może psuć się bez śladu.\n\nOto zwięzły szablon, który możesz skopiować:\n\n```textLocal summary: <package/service name> Purpose: <1 sentence> Scope: <what to touch> | Not: <what not to change> Entry points: <files/routes/commands> Public surface: <exports/endpoints/events> Data sources: <tables/collections/queues/caches> Conventions: errors=<how>, logging=<how>, tests=<where/how> Gotchas: <flags/caching/migrations/edge cases>
\nNastępnie trzymaj pętlę krótką:\n\n1. Mapa: „Ta zmiana jest ograniczona do CartPage i ikon ui-kit. Bez edycji checkout/auth.”\n2. Założenia: wymagaj listy założeń i poczekaj na potwierdzenie.\n3. Prośby o pliki: zatwierdź tylko kilka plików, których naprawdę potrzebuje (, , ikony ui-kit, ui-kit index).\n4. Plan: potwierdź, że mieści się w granicach.\n5. Edycje: zrób najmniejszy diff, potem poproś o zaktualizowane testy.\n\nPo zmianie udokumentuj ją, by przyszły kontekst pozostał mały:\n\n- Zaktualizuj oba lokalne podsumowania o nowy eksport i dokładne pliki, które dotknięto.\n- Dodaj krótki komentarz w nagłówku strony koszyka: co robi przycisk i gdzie obsługiwany jest stan.\n- Zanotuj polecenia testów, które przeszły (i wszelkie snapshoty zaktualizowane).\n\n## Następne kroki: jak uczynić to powtarzalnym dla zespołu\n\nJeśli działa dobrze dla jednej osoby, ale nie dla reszty zespołu, brakujący element to zwykle powtarzalność. Uczyń „dobrą higienę kontekstową” domyślną, nie osobistym nawykiem.\n\n### Zamień najlepsze prompt’y w szablon zespołowy\n\nZapisz jeden szkielet promptu, który każdy może skopiować i wypełnić. Trzymaj go krótko, ale surowo. Uwzględnij cel (co oznacza „skończone”), dozwolony zakres, twarde granice (i dlaczego), lokalne podsumowanie oraz kontrakt wyjściowy (najpierw plan, potem diff i testy).\n\n### Utrzymuj podsumowania aktualne lekkim rytuałem\n\nPomiń wielkie comiesięczne przeglądy, które nikt nie robi. Dołącz aktualizacje podsumowania do normalnej pracy: gdy zmiana zmienia zachowanie, zależności lub API, zaktualizuj lokalne podsumowanie w tym samym PR.\n\nProsta zasada: jeśli kolega zapytałby „gdzie to leży?” albo „co na tym polega?”, podsumowanie jest przestarzałe.\n\nJeśli wolisz workflow oparty na chacie, Koder.ai może pomóc uczynić iteracje bezpieczniejszymi. Planning mode pomaga uzgodnić zakres i granice zanim zaczną się edycje, a snapshoty z możliwością rollbacku pozwalają próbować zmian bez utknięcia, gdy przypuszczenie okaże się błędne.
Claude staje się mniej dokładny, gdy nie „widzi” prawdziwego źródła prawdy.
W dużym monorepo model często pomija plik zależności, myli podobne pakiety lub kopiuje starszy wzorzec, bo właśnie takie pliki miał w kontekście.
Nie próbuj dołączać całego repozytorium. Zacznij od najmniejszego zestawu, który może udowodnić, że zmiana jest poprawna.
Dobry domyślny zestaw to:
Udostępnij pliki, które kotwiczą zachowanie, a nie wszystkie pliki o podobnej nazwie.
Praktyczny zestaw to:
Wybierz jedną granicę zgodną z organizacją repo: pakiet, aplikacja lub serwis.
Następnie określ ją wprost, włączając, co jest poza zakresem. Przykładowe ograniczenia:
packages/cart/ i ich testy.”Bo monorepo często zawiera podobne moduły (ui, ui-kit, shared-ui) i zduplikowane pomocniki (date.ts w różnych miejscach).
Claude może zastosować poprawny pomysł w złym pakiecie albo zaimportować z „prawie właściwej” nazwy modułu. Zapobiegaj temu, nazywając dokładnie pakiet i punkty wejścia, które masz na myśli.
Lokalne podsumowanie to krótka mapa obszaru, który chcesz zmienić, zwykle 10–20 linii.
Zawiera:
Umieść je obok kodu, którego dotyczą, żeby były łatwe do znalezienia i aktualizacji.
Proste domyślne podejście:
SUMMARY.md lub krótka sekcja w README.md pakietuPowiedz Claude z góry, żeby oznaczał założenia i nieznane zamiast zgadywać.
Użyteczna zasada:
Używaj krótkiej pętli, która wymusza zdobywanie kontekstu kawałek po kawałku:
Napisz mini „kontrakt” w promptcie i upewnij się, że da się go egzekwować:
To ułatwia review i zmniejsza przypadkowe edycje między pakietami.
\nPrzykład: jeśli edytujesz pakiet billing, zanotuj dokładną funkcję tworzącą faktury, nazwy tabel, do których pisze, i regułę dla błędów podlegających ponownym próbom. Wtedy Claude może skupić się na tej granicy zamiast błądzić po shared auth, config czy niepowiązanych pakietach.\n\n## Gdzie trzymać podsumowania i jak utrzymywać je aktualne\n\nNajlepsze podsumowanie to takie, które Claude widzi, gdy go potrzebuje. Umieść je obok kodu, którego dotyczy, żeby trudno je było zignorować i łatwo zaktualizować. Na przykład trzymaj krótkie `SUMMARY.md` (lub sekcję w `README.md`) w każdym folderze pakietu, serwisu lub aplikacji zamiast jednego wielkiego dokumentu w katalogu głównym repo.\n\nProsta, powtarzalna struktura pomaga. Trzymaj to na tyle krótkie, by ludzie chcieli to utrzymywać:\n\n- Co robi ten folder (1–2 zdania)\n- Publiczna powierzchnia (główne punkty wejścia, eksportowane moduły, API)
- Kluczowe zależności (wewnętrzne i zewnętrzne)
- Granice (czego nie powinien importować ani modyfikować)
- Jak testować (najszybsza lokalna kontrola)
- Last updated: `YYYY-MM-DD - <what changed in one sentence>`\n\nPodsumowania starzeją się z przewidywalnych powodów. Traktuj ich aktualizację jak aktualizację definicji typu: część zakończenia pracy, nie osobne zadanie.\n\nZaktualizuj podsumowanie, gdy refactor zmienia strukturę lub nazwy, gdy nowy moduł staje się główną drogą do wykonania czegoś, gdy API/event/schemat się zmienia (nawet jeśli testy nadal przechodzą), gdy granice przesuwają się między pakietami lub gdy zależność jest usuwana albo zastępowana.\n\nPraktyczny nawyk: gdy scalasz zmianę, dodaj jedną linię „Last updated” z opisem, co się zmieniło. Narzędzia takie jak Koder.ai mogą przyspieszyć pracę nad zmianą kodu, ale to podsumowanie utrzymuje przyszłe zmiany w zgodnym kontekście.\n\n## Krok po kroku: workflow, który trzyma w odpowiednim kontekście\n\nDokładność często zależy od tempa rozmowy. Wymuszaj, żeby Claude „zasłużył” na kontekst małymi porcjami, zamiast zgadywać na podstawie ogromnego zrzutu.\n\n### Krok 1: Najpierw poproś o szybką mapę\n\nZanim zaczniesz edycje, poproś Claude'a, by opisał, co widzi i czego potrzebuje. Dobra mapa jest krótka: kluczowe pakiety zaangażowane, punkt wejścia dla przepływu i gdzie są testy lub typy.\n\nPrompt:\n\n„Create a map of this change: packages involved, main flow, and likely touch points. Do not propose code yet.”\n\n### Krok 2: Zacznij od jednego wycinka i jednej granicy\n\nWybierz wąski wycinek: jedną funkcję, jeden pakiet, jeden przepływ użytkownika. Określ granicę wyraźnie (np.: „Zmiany tylko w `packages/billing-api`. Nie ruszaj `shared-ui` ani `infra`. ”).\n\nWorkflow, który daje kontrolę:\n\n- Zdefiniuj cel i granicę w jednym zdaniu.
- Wymagaj założeń i nieznanych (Claude musi je wypisać).
- Poproś, by wskazał dokładne pliki, których potrzebuje następnie (ogranicz do 3–6).
- Dostarcz tylko te pliki, potem powtarzaj.
- Wymagaj krótkiego planu przed jakąkolwiek łatką.\n\n### Krok 3: Wymuś jawne założenia i listy plików\n\nJeśli czegoś brakuje, Claude powinien to powiedzieć. Poproś go, by napisał: (1) założenia, które przyjmuje, (2) co by je podważyło, i (3) następne pliki potrzebne do potwierdzenia.\n\nPrzykład: trzeba dodać pole do odpowiedzi `Invoice` w jednym pakiecie. Claude poprosi o handler, definicję DTO/typu i jeden test. Udostępniasz tylko te pliki. W narzędziu chatowym takim jak Koder.ai ta sama zasada ma zastosowanie: podaj najmniejszy zestaw źródeł, potem rozszerzaj wyłącznie, gdy naprawdę potrzeba.\n\n## Używaj ograniczeń i kontraktów w promptach\n\nNajlepsza obrona przed błędnymi edycjami to mały „kontrakt” wpisany w prompt: co Claude może dotknąć, jak oceniasz sukces i jakie reguły musi przestrzegać.\n\nZacznij od granicy łatwej do przestrzegania i weryfikacji. Bądź eksplicytny, gdzie można wprowadzać zmiany i wskaż strefy „nie dotykać”, żeby nie było pokusy wędrowania.\n\nSzablon kontraktu:\n\n- Modyfikuj tylko pliki pod `packages/payments/`.
- Nie edytuj `packages/auth/`, `infra/` ani współdzielonych konfiguracji.
- Jeśli potrzebujesz zmian poza zakresem, zatrzymaj się i zapytaj.
- Zachowaj minimalizm zmian: napraw błąd, unikaj refaktorów.\n\nNastępnie zdefiniuj kryteria akceptacji. Bez nich Claude może wygenerować kod, który wygląda dobrze, ale łamie realne zasady repo.\n\n- Uruchom testy jednostkowe dla pakietu (podaj polecenie).
- Uruchom lint/format (wskaż narzędzie lub „użyj istniejącej konfiguracji”).
- Uruchom typecheck/build dla pakietu.
- Potwierdź, że aplikacja się uruchamia (wystarczy proste polecenie run).\n\nZasady stylu też się liczą. Powiedz Claude'owi, jakich wzorców używać i jakich unikać, bazując na tym, co już robi baza kodu. Na przykład: „Używaj istniejących helperów błędów w tym pakiecie; nie dodawaj nowych zależności; trzymaj nazwy funkcji w camelCase; nie wprowadzaj nowej warstwy architektonicznej.”\n\nWreszcie, wymagaj krótkiego planu przed edycjami:\n\n„Zanim edytujesz, wypisz 3–5 plików, które zamierzasz zmienić, i dokładną zmianę zachowania. Poczekaj na zatwierdzenie.”\n\nPrzykład:\n\n„Popraw zaokrąglanie w sumach faktur. Edytuj tylko `packages/billing/src/` i testy pod `packages/billing/test/`. Akceptacja: `pnpm -C packages/billing test` i typecheck. Użyj istniejących money utils; nie przepisuj typów API. Najpierw daj 4-etapowy plan.”\n\n## Typowe pułapki powodujące dryf i błędne edycje\n\nNajszybszy sposób na błędne edycje w monorepo to podanie Claude'owi zbyt wiele naraz. Gdy wklejasz dużą kupę kodu, często wraca do ogólnych wzorców zamiast konkretnego projektu, którego używa Twoje repo.\n\nInna pułapka to pozwolenie mu zgadywać architekturę. Jeśli nie pokażesz prawdziwych punktów wejścia, może wybrać pierwszy plik, który wygląda wiarygodnie, i tam wprowadzić logikę. W praktyce dokładność pochodzi z małej liczby „źródeł prawdy” (moduły wejściowe, routery, rejestry serwisów, dokumenty granic pakietu). Jeśli ich nie ma w kontekście, model wypełnia luki.\n\nNazwy też mogą go zwieść. Monorepo mają często pakiety typu `ui`, `ui-kit`, `shared-ui` albo zduplikowane helpery `date.ts` w dwóch miejscach. Jeśli pomieszasz fragmenty z obu, Claude może poprawić jeden plik, myśląc o innym. Przykład: prosisz o zmianę stylu przycisku, a on edytuje `packages/ui/Button.tsx`, podczas gdy aplikacja importuje `packages/ui-kit/Button.tsx`. Diff wygląda dobrze, ale nic się nie zmienia w produkcji.\n\nKonfiguracja to kolejne źródło cichego dryfu. Zachowanie może zależeć od zmiennych środowiskowych, feature flagów, ustawień builda lub narzędzi workspace. Jeśli o tym nie wspomnisz, Claude może usunąć „dziwną” kontrolę, która ma znaczenie tylko przy włączonej fladze, lub dodać kod psujący krok builda.\n\nCzerwone flagi dryfu:\n\n- Odpowiedź mówi o „typowych wzorcach” bez wskazania twoich plików\n- Wprowadza nowy shared utility zamiast użyć istniejącego\n- Zmienia importy między pakietami\n- Ignoruje feature flagi lub gałęzie specyficzne dla env\n- Sugeruje dodanie zależności do centralnego pakietu\n\nTraktuj importy między pakietami jako decyzję, nie domyślną. Trzymaj edycje lokalne, chyba że celowo rozszerzysz zakres.\n\n## Szybka lista kontrolna przed poproszeniem Claude'a o cokolwiek\n\nNajszybszy sposób na poprawne edycje to zaczynać od ograniczeń, nie od objętości. Dobry prompt jest trochę surowy: mówi Claude'owi, gdzie patrzeć, czego ignorować i co oznacza „skończone”.\n\nPrzed wklejeniem kodu, napisz krótką prefację przypinającą pracę do jednego miejsca w repo. Nazwij pakiet, dokładny folder i konkretny cel. Następnie dołącz lokalne podsumowanie (cel, kluczowe zależności, ważne konwencje) i plik wejściowy, który kotwiczy zmianę.\n\nLista kontrolna:\n\n- Boundary: Pracuj tylko w `\u003cpackage\u003e/\u003cpath\u003e`. Cel: `\u003cone sentence\u003e`. Ignoruj resztę chyba że poproszę.\n- Context starter: Lokalny skrót: `\u003c5-10 lines\u003e`. Plik wejściowy: `\u003cpath/to/file\u003e`.\n- Constraints: Dozwolone foldery: `\u003c...\u003e`. Nie zmieniać: `\u003cfolders/files or APIs\u003e`. Zachować zachowanie: `\u003cwhat must stay true\u003e`.\n- File requests first: „Zanim zaproponujesz zmiany, wypisz minimalne pliki, które chcesz zobaczyć (max 5) i dlaczego.”\n- Output format: „Odpowiedz najpierw krótkim planem. Po moim potwierdzeniu daj sugestie w stylu patcha po plikach.”\n\nJeśli Claude zaproponuje zmiany poza twoją granicą, potraktuj to jako sygnał: albo doprecyzuj prompt, albo świadomie rozszerz zakres i powtórz zasady.\n\n## Przykład: zmiana w jednym pakiecie bez budzenia całego monorepo\n\nZałóżmy, że w monorepo masz `apps/web-store` (aplikacja React) i `packages/ui-kit` (wspólne przyciski, inputy i style). Chcesz jedną małą funkcję: dodać przycisk „Save for later” na stronie koszyka, używając nowej ikony `SaveIcon` z `ui-kit`. Nic więcej nie powinno się zmienić.\n\nZanim poprosisz o edycje, stwórz dwa lokalne podsumowania, które działają jak granice. Trzymaj je krótkie, konkretne i nacechowane tym, co istotne.\n\n```text
# apps/web-store/LOCAL_SUMMARY.md
Purpose: Customer shopping UI.
Entry points: src/routes.tsx, src/pages/cart/CartPage.tsx
Cart rules: cart state lives in src/cart/useCart.ts
Do not touch: checkout flow (src/pages/checkout), payments, auth.
Tests: npm test -w apps/web-store
# packages/ui-kit/LOCAL_SUMMARY.md
Purpose: shared UI components.
Exports: src/index.ts
Icons: src/icons/*, add new icons by exporting from index.
Do not touch: theming tokens, build config.
Tests: npm test -w packages/ui-kit
CartPageuseCart