Spraw, by kod generowany przez AI nadawał się do przeglądu: uporządkuj strukturę folderów, nazewnictwo i zapisane inwarianty, żeby zespół mógł bezpiecznie przejąć projekt i wdrażać zmiany.

userId vs userid vs user_id), co utrudnia wyszukiwanie i zwiększa ryzyko błędów.\n- Konfiguracja i „magic values” się duplikują.\n- Obsługa błędów i walidacja dryfują, więc przypadki brzegowe zachowują się inaczej na różnych ekranach czy endpointach.\n\nMałe niespójności mnożą czas utrzymania, bo wymuszają powtarzające się decyzje. Jeśli każdy nowy ekran ma trochę inne miejsce w folderze, nazwę komponentu i styl pobierania danych, recenzenci nie mogą zbudować stabilnego modelu mentalnego. Muszą uczyć się kodu od nowa za każdym razem.\n\nRealistyczny przykład: nietechniczna założycielka używa narzędzia vibe-coding, żeby szybko postawić prosty CRM. Działa w demo, ale gdy mały zespół przejmuje projekt, znajduje trzy różne sposoby przechowywania stanu auth, dwa style nazewnictwa komponentów React i reguły biznesowe rozsiane między UI a backendem. Nic nie jest „zepsute”, ale każda zmiana wydaje się ryzykowna, bo nikt nie wie, które wzorce są właściwe.\n\nPrzekaz ułatwia się, gdy zmniejszysz liczbę wyborów. Zespoły pracują szybciej, gdy baza kodu konsekwentnie podpowiada, co robić dalej.\n\n## Co oznacza „przeglądalne” w praktyce\n\n„Przeglądalne” oznacza, że nowy deweloper może otworzyć repo, znaleźć właściwe miejsce do zmiany, wprowadzić zmianę i potwierdzić, że nic innego nie przestało działać. To podstawowe, i właśnie tego wiele prototypów AI nie zapewnia.\n\nAby uczynić kod generowany przez AI przeglądalnym, skup się mniej na sprycie, a bardziej na tym, jak bezpiecznie człowiek może go dotknąć. Przeglądalność to obniżenie ryzyka zmiany.\n\n### Co recenzenci muszą szybko zobaczyć\n\nGdy ktoś przegląda pull request, stara się szybko odpowiedzieć na kilka pytań:\n\n- Po co ta zmiana, prosto i po ludzku?\n- Gdzie żyje to zachowanie (UI, API, baza danych) i dlaczego tam?\n- Jakie są granice (czego ta zmiana nie powinna dotykać)?\n\n- Jak to zweryfikować (testy, kroki ręczne, albo jedno i drugie)?\n- Jaki jest plan rollbacku, jeśli coś pójdzie nie tak?\n\nMałe diffy pomagają, ale „małe” to nie tylko liczba linii. To też stabilne granice: zmiana w jednym obszarze nie powinna wymagać ruszania niepowiązanych plików.\n\n### Znaki, że baza kodu jest przeglądalna\n\nNie potrzebujesz perfekcji. Potrzebujesz konwencji, odrobiny dokumentacji, kilku testów i zabezpieczeń zapobiegających dryfowi.\n\nRecenzent czuje się bezpieczniej, gdy szybko dostrzeże:\n\n- Przewidywalną strukturę i nazwy.\n- Jasną intencję funkcji i komponentów (bez tajemniczych helperów).\n- Krótki README opisujący uruchamianie, testowanie i typowe workflow.\n- Kilka wysokowartościowych testów wokół krytycznych przepływów.\n- Jawne zasady dot. zachowań „nie do złamania” (inwarianty).\n\nPrzykład: zbudowałeś frontend w React i API w Go. Prototyp działa, ale przepływ „create customer” jest rozbity między UI, handlerami API i wywołaniami bazy z nieco różnymi nazwami pól. Uczynienie tego przeglądalnym to wyrównanie nazw, utrzymanie jasnej granicy API i zapisanie zasad (np. „email musi być unikalny” i „status może być tylko active lub paused”).\n\nNie dąż do przepisywania wszystkiego, aż będzie jak z podręcznika. Kod gotowy do przekazania jest jasny, spójny i bezpieczny do zmiany, nawet jeśli nie jest najładniejszy.\n\n## Struktura folderów, która ułatwia nawigację\n\nZespół wybaczy niedoskonały kod. Trudniej mu jednak, gdy nie wie, gdzie coś się znajduje. Jeśli chcesz, żeby kod generowany przez AI był przeglądalny, ułatw skanowanie projektu: kilka najwyższych folderów, spójne nazwy i jedno oczywiste miejsce na konfigurację.\n\n### Prosta struktura, którą można dostosować\n\nUtrzymaj mapę top-level stabilną w miarę rozwoju aplikacji. Wiele przekazań kończy się niepowodzeniem, bo pojawiają się nowe foldery dla każdego eksperymentu. Zamiast tego oddziel trzy obszary: składanie aplikacji (ekrany, routy), podstawowe reguły biznesowe i infrastrukturę.\n\nOto praktyczny wzór, który możesz zaadaptować (przykład aplikacji webowej):\n\n```text/ /app # routes/pages and UI composition /core # domain logic: entities, rules, use-cases /ui # reusable components, styles, design tokens /infra # db, api clients, queues, auth adapters /config # env schema, feature flags, app settings /scripts # local tooling, seed data, one-off tasks /docs # handoff notes, invariants, decisions ```\n\nJeśli pierwsza wersja została wygenerowana szybko, zachowaj tę separację widoczną. Umieść moduły generowane w czymś w rodzaju , a moduły edytowane ręcznie w lub . Chodzi o to, żeby uniknąć przypadkowych edycji kodu, który możesz później zregenerować.\n\n### Spraw, by odpowiedź na „gdzie to się znajduje?” była możliwa w 10 sekund\n\nPrzed przekazaniem zrób szybki test nawigacji z współpracownikiem (albo z przyszłym sobą). Zapytaj, gdzie jest UI logowania, gdzie są reguły autoryzacji, gdzie zdefiniowano dostęp do bazy danych, gdzie ustawiane są base URL API i feature flagi oraz gdzie znajdują się „specjalne” skrypty.\n\nJeśli któraś odpowiedź zaczyna się od „to zależy” albo „wyszukaj to”, popraw strukturę, aż każdy temat będzie miał jedno, nudne miejsce. Ten nudny porządek to właśnie to, co przyspiesza i zabezpiecza utrzymanie.\n\n## Konwencje nazewnictwa, którym ludzie mogą zaufać\n\nKonwencja nazewnictwa to obietnica: recenzent powinien być w stanie odgadnąć, czym jest plik, gdzie się znajduje i jak się używa, zanim go otworzy.\n\nZacznij od nazw plików i trzymaj się jednego stylu w całym repo. Prosty domyślny wybór to: foldery w kebab-case, komponenty React w PascalCase, a pliki TypeScript niebędące komponentami w camelCase. Łam regułę tylko wtedy, gdy środowisko tego wymaga (np. konwencje Fluttera lub standardowe pliki jak README).\n\nNazwy powinny ujawniać intencję, nie implementację:\n\n- Dobrze: (co reprezentuje)\n- Ryzykownie: (wiąże się z dostawcą)\n- Ryzykownie: (opisuje jak, a nie po co)\n\nBądź surowy wobec niejasnych kubełków. Pliki nazwane , czy szybko stają się szufladami ze śmieciami, szczególnie gdy kod jest generowany etapami. Jeśli potrzebujesz współdzielonego kodu, nazwij go według zakresu i celu, np. lub .\n\n### Foldery funkcjonalne vs techniczne\n\nFoldery funkcjonalne opisują przestrzeń problemu użytkownika. Foldery techniczne opisują przekrojową infrastrukturę. Mieszanie ich zaciera granice.\n\nPraktyczny podział to funkcje jak , , , oraz obszary techniczne jak , , , . Gdy masz wielu klientów (web, server, mobile), trzymanie tych samych nazw funkcji w warstwach ułatwia śledzenie zmian.\n\n### Krótka zasada nazewnictwa dla recenzentów\n\nUżyj tej krótkiej listy w przeglądzie kodu:\n\n- Czy widać, czym jest element w 3 sekundy po nazwie?\n- Czy nazwa pasuje do poziomu (nazwy funkcji dla logiki biznesowej, nazwy techniczne dla infrastruktury)?\n- Czy nazwa nadal miałaby sens, gdyby implementacja się zmieniła?\n- Czy jest spójna z sąsiednimi plikami i folderami?\n\nPrzemianuj wcześnie. Zmiany nazw są tanie podczas przekazywania i drogie, gdy zespół zbuduje już na bazie niejasności.\n\n## Dokumentuj inwarianty (reguły, które muszą pozostać prawdziwe)\n\nInwariant to reguła, od której zależy poprawność aplikacji, nawet gdy funkcje się zmieniają. Kod generowany przez AI często „działa”, bo generator założył zestaw reguł, ale reguły te mogą istnieć jedynie w promptach lub w czyjejś głowie. Zapisz je, żeby recenzenci wiedzieli, co nie może się potajemnie zmienić.\n\nDobre inwarianty są nudne, konkretne i testowalne. Unikaj ogólników typu „waliduj wejścia”. Powiedz dokładnie, co jest dozwolone, kto może co robić i co się dzieje, gdy reguła zostanie naruszona.\n\n### Przykłady użytecznych inwariantów (na które recenzenci zwracają uwagę)\n\nWiększość problemów przy przekazywaniu pochodzi z tych samych obszarów:\n\n- Uprawnienia: „Tylko właściciele projektu mogą zapraszać członków; admini mogą usuwać członków; zwykli członkowie mogą przeglądać, ale nie edytować rozliczeń.”\n- Własność danych: „Każde Zadanie należy do dokładnie jednego Projektu. Użytkownik ma dostęp tylko do Zadań w projektach, których jest członkiem.”\n- Reguły ID i formatów: „Publiczne ID to stringi UUIDv4. Wewnętrzne identyfikatory numeryczne nigdy nie wychodzą w odpowiedziach serwera.”\n- Przejścia stanów: "Status zamówienia może przechodzić draft -> paid -> shipped. shipped nigdy nie wraca do paid."\n- Integralność danych: "Email jest unikalny (case-insensitive). Usuwanie projektu robi soft-delete zadań; zadania nigdy nie są hard-deleted."\n\nJeśli możesz zamienić zdanie w test jednostkowy lub test API, to właściwy poziom szczegółowości.\n\n### Gdzie dokumentować inwarianty, żeby były przeglądane\n\nUmieść inwarianty tam, gdzie ludzie naturalnie patrzą podczas przeglądu:\n\n- W README repo: krótka sekcja „System rules” z najważniejszymi inwariantami.\n- Obok kodu, który je wymusza: krótkie komentarze przy sprawdzeniach auth, walidacji i przejściach stanów.\n- W krótkiej notatce decyzyjnej dla dużych reguł: model auth, wybory modelu danych, stany workflow.\n\nUnikaj chowających się inwariantów w długich dokumentach, których nikt nie otwiera. Jeśli nie pokazują się podczas zwykłego przeglądu PR, zostaną pominięte.\n\n### Jak pisać inwarianty (i jak je bezpiecznie zmieniać)\n\nFormułuj każdy inwariant z zakresem, regułą i punktem wymuszania. Przykład: "Dla wszystkich endpointów pod /api/projects/:id, requester musi być członkiem projektu; wymuszane w middleware auth i sprawdzane ponownie przy aktualizacjach zadań."\n\nGdy inwariant się zmienia, zrób to jawnie. Zaktualizuj linię w dokumencie, wskaż miejsca w kodzie, które się zmieniły, i dodaj lub zaktualizuj test, który by padł przy starej regule. W przeciwnym razie zespół będzie trzymał połowę starego zachowania i połowę nowego.\n\nJeśli używasz platformy vibe-coding jak Koder.ai, jednym z użytecznych kroków przy przekazaniu jest poproszenie jej o listę inwariantów, które przyjęła podczas generowania aplikacji. Zamień tę listę w zestaw testowalnych reguł, które zespół może przeglądać i utrzymywać.\n\n## Krok po kroku: jak zamienić prototyp w kod gotowy do przekazania\n\nPrzekazanie to nie to samo co "działa na moim komputerze". Celem jest uczynienie projektu czytelnym, bezpiecznym do zmiany i przewidywalnym dla kogoś nowego, kto go otworzy.\n\nZacznij od zamrożenia zakresu. Wybierz datę i krótką listę, co musi być stabilne (kluczowe ekrany, główne przepływy, integracje). Zapisz też, co jest wyraźnie poza zakresem, żeby nikt nie dopisywał funkcji podczas porządków.\n\nNastępnie zrób porządki, zanim dodasz cokolwiek nowego. Tu zaczyna się przeglądalność: repo zachowuje się jak produkt, a nie demo.\n\nPraktyczna sekwencja:\n\n- Zamroź zakres przekazania: 3–5 kluczowych ścieżek użytkownika, które muszą działać, plus 3–5 rzeczy, których nie dotykamy.\n- Ujednolić foldery i nazwy: przenieś pliki do przewidywalnej struktury, zmień nazwy niejasnych modułów, usuń martwy kod.\n- Dodaj krótkie notatki przy modułach: „Co to robi” i „Czego nie powinno robić”, po kilka linijek.\n- Umieść inwarianty obok miejsc ich wymuszania: napisz regułę nad funkcją, zapytaniem lub komponentem, który ją realizuje.\n- Stwórz minimalny plan testów dymowych: krótka checklista odpowiadająca zamrożonemu zakresowi i inwariantom.\n\nTrzymaj plan testów krótki, ale realny. Dla aplikacji React z API w Go i Postgres to może być: zaloguj się, utwórz rekord, odśwież, potwierdź, że utrzymał się w bazie, i potwierdź, że akcja z ograniczonym dostępem kończy się błędem.\n\nZrób jedną rundę przeglądu skupioną na czytelności, nie na funkcjach. Poproś współpracownika, aby przez 30 minut odpowiadał na pytania: „Czy mogę znaleźć rzeczy?” „Czy nazwy pasują do zachowania?” „Czy inwarianty są oczywiste?” Popraw to, co ich spowalnia, a potem przestań.\n\n## Szybkie sprawdzenia przed przekazaniem zespołowi\n\nPrzed przekazaniem wykonaj test „świeżych oczu”. Poproś kogoś, kto nie budował prototypu, aby otworzył repo i na głos opowiedział, co myśli, że projekt robi. Jeśli nie potrafi szybko znaleźć punktów startowych, zespół poniesie ten koszt przy każdej zmianie.\n\nProsta zasada: nowy deweloper powinien odnaleźć główne punkty wejścia w mniej niż dwie minuty. To zwykle oznacza jasne README wskazujące jedno lub dwa miejsca startowe (wejście aplikacji web, wejście API, konfiguracja) i że te pliki nie są ukryte.\n\nSprawdź też rozmiar przeglądów. Jeśli kluczowe moduły wymagają niekończącego się scrollowania, recenzenci przestają wyłapywać problemy. Dziel długie pliki tak, aby każdy miał jedną odpowiedzialność i dało się go zrozumieć w jednym podejściu.\n\nKrótka lista kontrolna przekazania:\n\n- Punkty wejścia są oczywiste: gdzie startuje aplikacja, gdzie są trasy, gdzie czytane są ustawienia środowiska.\n- Pliki mieszczą się w kawałkach: większość mieści się na jednym lub dwóch ekranach; brak „plików-bogów”.\n- Nazwy odpowiadają zachowaniu: waliduje, nie zapisuje do bazy.\n- Inwarianty są blisko kodu: komentarz lub mały blok dokumentujący reguły, które muszą pozostać prawdziwe.\n- Każdą zmianę łatwo zweryfikować: szybki test potwierdzający, że kluczowe przepływy dalej działają.\n\n## Realistyczny scenariusz przekazania\n\nMaya to nietechniczna założycielka. Zbudowała MVP opisując produkt w czacie: prosty CRM dla małej firmy usługowej. Działa: logowanie, klienci, transakcje, notatki i podstawowy ekran admina. Po kilku tygodniach zatrudnia dwóch deweloperów, żeby przekształcić to z „działa na moim laptopie” w coś, na czym firma może polegać.\n\nPierwszego dnia nie zaczynają od przepisywania. Zaczynają od uczynienia kodu przeglądalnym. Pierwszy ruch to mapowanie aplikacji na dwie grupy: moduły core (rzeczy, od których zależy wszystko) i funkcje (ekrany i przepływy, których używają użytkownicy). Dzięki temu wiedzą, gdzie podejmować decyzje, a gdzie wprowadzać zmiany.\n\nUzgadniają prostą mapę funkcji: core (auth, dostęp do bazy, uprawnienia, logowanie, komponenty UI) i funkcje (customers, deals, notes, admin).\n\nPotem dostosowują foldery do tej mapy. Wcześniej pliki były rozrzucone, z mieszanym nazewnictwem jak , i . Po zmianach każda funkcja ma swój dom, a core jest wyraźnie oddzielone. Przeglądy przyspieszają, bo PR-y zwykle mieszczą się w jednym folderze funkcji, a zmiany w core stają się widoczne.\n\nMała zasada nazewnictwa robi większość pracy: „foldery to rzeczowniki, komponenty w PascalCase, funkcje to czasowniki i nie skracamy”. Więc staje się , a zmienia się na .\n\n### Jeden inwariant, który zapobiega cichym błędom\n\nZapisują jedną kluczową regułę i umieszczają ją w krótkim w folderze funkcji.\n\nPrzykładowy inwariant dla CRM:\n\nTylko właściciel transakcji lub admin może edytować transakcję. Wszyscy inni mogą ją oglądać, ale nie zmieniać statusu, wartości ani notatek.\n\nTo zdanie prowadzi backendowe sprawdzenia, zapytania do bazy i stany UI na froncie. Gdy ktoś później doda „edycję wsadową”, recenzenci od razu wiedzą, co nie może zostać złamane.\n\n### Jak wygląda „wystarczająco dobre” po tygodniu\n\nPo tygodniu kod nie jest idealny, ale przekaz jest realny:\n\n- Każda funkcja żyje w jednym folderze z przewidywalnymi nazwami plików.\n- Core jest oddzielone i wielokrotnie używane, a nie kopiowane.\n- Inwarianty są tam, gdzie zachodzą zmiany, a nie w historii czatu.\n- Nowe zmiany trafiają przez małe PR-y, które łatwo przeglądać.\n\n## Typowe błędy, które czynią kod AI kruchym\n\nAI może szybko doprowadzić do działającego prototypu. Problem w tym, że „działa” często opiera się na ukrytych założeniach. Gdy zespół dotyka kodu później, małe zmiany psują rzeczy w zaskakujących miejscach.\n\nJednym z częstych błędów jest refaktoryzacja wszystkiego naraz. Duże porządki dają satysfakcję, ale utrudniają śledzenie, co i dlaczego się zmieniło. Ustal najpierw granice: które moduły są stabilne, gdzie wolno dodawać nowy kod i jakie zachowania nie mogą się zmienić. Potem poprawiaj pojedyncze obszary.\n\nInnym częstym problemem są zdublowane koncepcje z różnymi nazwami. AI chętnie stworzy zarówno , jak i dla tej samej roli, albo vs dla jednego pomysłu. Wybierz jedną nazwę dla kluczowych pojęć i ujednolić ją w UI, API i bazie.\n\nUkryte reguły to też główne źródło kruchości. Jeśli prawdziwa logika biznesowa żyje w promptach lub historii czatu, repo staje się trudne w utrzymaniu. Umieść reguły w repo jako jasne komentarze, testy lub krótki dokument inwariantów.\n\nKatalogi typu , czy cicho stają się szufladą z zaległościami. Jeśli potrzebujesz modułów współdzielonych, określ, za co odpowiadają (wejścia, wyjścia, odpowiedzialności) i utrzymuj je wąskie.\n\nMieszanie reguł biznesowych w kodzie UI to kolejna pułapka. Szybkie warunkowe w komponencie React staje się jedynym miejscem, gdzie istnieje reguła cenowa. Później aplikacja mobilna lub backend mają inne zachowanie. Trzymaj reguły biznesowe w jednej warstwie (zwykle backend lub moduł domenowy) i niech UI je wywołuje, zamiast implementować od nowa.\n\nNa koniec — kruchy kod często wynika z pomijania norm przeglądu. Zespoły potrzebują małych diffów, jasnych commitów i przejrzystych intencji. Nawet jeśli zmiany wygenerował generator, traktuj je jak normalny PR: trzymaj zakres mały, wyjaśnij, co się zmieniło i ułatw weryfikację.\n\n## Kolejne kroki: uczynić utrzymanie normalnym workflow\n\nTraktuj przekazanie jako początek utrzymania, a nie kres drogi. Cel pozostaje prosty: nowa osoba powinna móc wprowadzić małą zmianę bez łamania ukrytych reguł.\n\nPrzekształć preferencje zespołu w kilka zapisanych domyślnych zasad: jedna mapa folderów, jeden styl nazewnictwa i jeden szablon inwariantów. Gdy reguły są uzgodnione z góry, komentarze w przeglądzie przestają być subiektywną opinią i stają się spójnymi kontrolami.\n\nTrzymaj „handoff README”, które wskazuje kilka istotnych miejsc: gdzie są inwarianty, jak uruchomić aplikację, jak dodać funkcję bezpiecznie i czego nie zmieniać bez dyskusji. Nowy współpracownik powinien znaleźć odpowiedzi w mniej niż pięć minut.\n\nJeśli Twój workflow wspiera odwracalność, korzystaj z niej. Na przykład Koder.ai wspiera snapshoty i rollback, co może być prostą siatką bezpieczeństwa przed refaktorami lub upgrade’em zależności. Gdy jesteś gotowy przekazać właścicielstwo, eksport źródeł z koder.ai daje zespołowi czysty punkt startowy do normalnej pracy z Gitem.
Zacznij od uczynienia kodu przewidywalnym. Wyrównaj strukturę folderów, nazewnictwo i granice, żeby współpracownik mógł zgadnąć, gdzie coś się znajduje i jak się zachowuje, bez przeszukiwania całego repozytorium.
Wybierz jeden wzorzec dla każdej powtarzalnej odpowiedzialności (stan uwierzytelnienia, pobieranie danych, walidacja, obsługa błędów) i zastosuj go wszędzie. Cel nie jest w „najlepszym”, tylko w „spójnym”, aby recenzenci nie musieli za każdym razem uczyć się aplikacji od nowa.
Repozytorium nadające się do przeglądu pozwala nowemu deweloperowi znaleźć właściwe miejsce do zmiany, wprowadzić małą poprawkę i bezpiecznie ją zweryfikować. Jeśli zmiany regularnie rozlewają się na niepowiązane pliki lub wymagają zgadywania reguł, to nadal nie jest przeglądalne.
Użyj małego, stabilnego zestawu top-level folderów i trzymaj każdą odpowiedzialność w jednym, oczywistym miejscu. Oddziel skladanie aplikacji (routes/screens), główne reguły domeny i infrastrukturę, aby nawigacja zajmowała sekundy, a nie detektywne śledztwo.
Umieść kod, który możesz chcieć wygenerować ponownie, w jasnym folderze, np. /generated, a kod edytowany ręcznie trzymaj w stabilnych obszarach jak /core czy /app. To zapobiega przypadkowym edycjom, które mogłyby zostać nadpisane i ułatwia ustalenie właściciela podczas przeglądu.
Wybierz jedną konwencję i egzekwuj ją wszędzie: spójne formatowanie wielkości liter dla folderów i plików, spójne nazewnictwo komponentów i spójne nazwy pól w UI, API i bazie danych. Spójność ułatwia wyszukiwanie i zmniejsza subtelne błędy wynikające z niezgodnych nazw.
Inwarianty to reguły, które muszą pozostać prawdziwe w miarę rozwoju produktu — na przykład uprawnienia, unikalne ograniczenia czy dozwolone przejścia stanów. Zapisanie ich zamienia ukryte założenia w widoczne warunki, które recenzenci mogą chronić.
Trzymaj je tam, gdzie ludzie faktycznie je zobaczą: krótka sekcja w README oraz krótkie notatki bezpośrednio obok kodu, który narzuca regułę. Jeśli reguła nie pojawia się podczas normalnego przeglądu PR, zostanie zapomniana.
Zamroź najpierw zakres pracy, wybierając niewielką liczbę kluczowych ścieżek użytkownika, które muszą działać, oraz to, co jest wyraźnie poza zakresem. Następnie ujednolić foldery i nazwy, usunąć nieużywany kod, dodać minimalną checklistę testów dymowych i przeprowadzić jedną rundę przeglądu skupioną na czytelności.
Unikaj dużych refaktorów obejmujących wszystko naraz, katalogów typu utils jako złomowisk, reguł biznesowych ukrytych w warstwie UI oraz zdublowanych pojęć z różnymi nazwami. Obserwuj rozbieżności w walidacji i obsłudze błędów między endpointami i ekranami.
/generated/core/appBillingSummaryCard.tsxStripeCard.tsxRenderBilling.tsxutilshelperscommonauth/tokenStorage.tsbilling/billingCalculations.tsbillingonboardinginventoryapidbroutingdesign-systemvalidateUserCustomerPage.tsxcustomer_view.tsxcustPageNew.tsxcustPageNew.tsxCustomerDetailsPage.tsxdoStuff()saveCustomerNote()INVARIANTS.mdUserServiceAccountManagerplanpricingTiersharedcommonutils