Przejdź do głównej zawartości

Strategie dla dużych baz kodu: Wskazówki 76-90

Twój projekt osiągnął 200 000 linii kodu. Indeksowanie Cursor trwa 20 minut, odpowiedzi agenta odwołują się do plików sprzed dwóch lat, a sugestie Tab pobierają wzorce z przestarzałych modułów. Narzędzie, które przyspieszyło cię w małych projektach, teraz zwalnia cię w projekcie, który się liczy. Te 15 wskazówek rozwiązuje problem skalowania.

  • Strategię indeksowania, która utrzymuje Cursor szybkim na bazach kodu powyżej 500k linii
  • Zarządzanie budżetem kontekstu, które zapobiega topieniu się agenta w nieistotnych plikach
  • Konfiguracje wielokorzeniowych obszarów roboczych dla monorepo i konfiguracji multi-repo
  • Techniki ograniczonego wyszukiwania i nawigacji, które znajdują właściwy kod w sekundy, nie minuty
  • Prompty analizy architektonicznej, które pomagają zrozumieć nieznane obszary dużej bazy kodu

Wskazówka 76: Skonfiguruj wykluczenia przed otwarciem dużego projektu

Dział zatytułowany „Wskazówka 76: Skonfiguruj wykluczenia przed otwarciem dużego projektu”

Przy pierwszym otwarciu dużego projektu Cursor indeksuje wszystko. Jeśli twój node_modules ma 100 000 plików, to 100 000 plików zużywających pamięć i CPU, zanim napiszesz choćby jedną linię kodu. Najpierw skonfiguruj wykluczenia:

Utwórz lub zaktualizuj .cursorignore w katalogu głównym projektu (działa jak .gitignore):

# Artefakty buildów
dist/
build/
.next/
out/
coverage/
# Zależności
node_modules/
vendor/
.pnp/
# Wygenerowany kod
*.generated.ts
*.generated.js
prisma/generated/
graphql/generated/
# Duże pliki binarne
*.wasm
*.map
*.min.js
*.min.css
*.bundle.js
# Pliki lock (ogromne, rzadko użyteczne dla AI)
package-lock.json
pnpm-lock.yaml
yarn.lock

Wskazówka 77: Otwieraj konkretne pakiety zamiast katalogu głównego monorepo

Dział zatytułowany „Wskazówka 77: Otwieraj konkretne pakiety zamiast katalogu głównego monorepo”

W monorepo z 20 pakietami otwarcie katalogu głównego zmusza Cursor do indeksowania wszystkiego. Zamiast tego otwórz tylko pakiety, nad którymi aktywnie pracujesz:

Okno terminala
# Zamiast:
cursor ~/projects/big-monorepo
# Otwórz konkretne pakiety jako wielokorzeniowy obszar roboczy:
cursor ~/projects/big-monorepo/packages/web \
~/projects/big-monorepo/packages/api \
~/projects/big-monorepo/packages/shared

Lub utwórz plik obszaru roboczego dla częstych kombinacji:

// web-api.code-workspace
{
"folders": [
{ "path": "packages/web", "name": "Web App" },
{ "path": "packages/api", "name": "API Server" },
{ "path": "packages/shared", "name": "Shared Types" },
{ "path": "packages/config", "name": "Config" }
]
}

Wskazówka 78: Monitoruj i zarządzaj zdrowiem indeksowania

Dział zatytułowany „Wskazówka 78: Monitoruj i zarządzaj zdrowiem indeksowania”

Regularnie sprawdzaj status indeksowania w Ustawienia > Indexing and Docs. Zdrowe wskaźniki:

Rozmiar bazy koduOczekiwany czas indeksowaniaRozmiar indeksu
Poniżej 10k plików1-3 minutyPoniżej 500 MB
10k-50k plików3-10 minut500 MB - 2 GB
50k-200k plików10-30 minut2-5 GB
Powyżej 200k plikówUżywaj wykluczeń agresywnieCeluj poniżej 5 GB

Jeśli indeksowanie przekracza te czasy, twoje wykluczenia wymagają pracy. Najczęstsi winowajcy: niewykluczony node_modules, duże wygenerowane pliki lub binarne zasoby w drzewie źródłowym.

Wskazówka 79: Myśl w kategoriach budżetów kontekstu

Dział zatytułowany „Wskazówka 79: Myśl w kategoriach budżetów kontekstu”

Każda konwersacja z agentem ma skończone okno kontekstowe. W dużej bazie kodu szybko osiągniesz ten limit, jeśli odniesiesz się do zbyt wielu plików. Myśl o kontekście jak o budżecie:

  • Budżet: ~200k tokenów na konwersację (różni się w zależności od modelu i trybu)
  • Koszt na plik: Typowy 200-liniowy plik TypeScript kosztuje ~1000-2000 tokenów
  • Koszt na katalog: Odniesienie się do @src/ w projekcie z 500 plikami kosztuje cały twój budżet

Dyscyplina: odnoszenie się do minimalnej liczby plików potrzebnych do zadania. Zacznij wąsko i rozszerzaj tylko wtedy, gdy agent powie, że potrzebuje więcej kontekstu.

Wskazówka 80: Używaj plików podsumowujących dla dużych modułów

Dział zatytułowany „Wskazówka 80: Używaj plików podsumowujących dla dużych modułów”

Dla modułów zbyt dużych, aby odwoływać się do nich bezpośrednio, utwórz plik podsumowujący, do którego agent może się zamiast tego odwołać:

src/payments/ARCHITECTURE.md
# Architektura modułu płatności
## Kluczowe pliki
- `service.ts` - Główne przetwarzanie płatności (integracja Stripe)
- `webhook.ts` - Handlery webhooków dla zdarzeń płatności
- `types.ts` - Interfejsy TypeScript dla encji płatności
- `repository.ts` - Operacje bazodanowe (PostgreSQL przez Drizzle)
## Przepływ danych
1. Klient wywołuje POST /api/payments/checkout
2. service.ts tworzy sesję Stripe
3. Stripe wysyła webhook do webhook.ts
4. webhook.ts aktualizuje status płatności przez repository.ts
5. WebSocket powiadamia klienta o zmianie statusu
## Kluczowe ograniczenia
- Wszystkie kwoty w centach (integer, nigdy float)
- Klucze idempotentności wymagane dla wszystkich wywołań Stripe
- Weryfikacja webhooka musi nastąpić przed przetworzeniem

Teraz zamiast @src/payments/ (co może zużyć 50k tokenów), odwołaj się do @src/payments/ARCHITECTURE.md (2k tokenów) i pobieraj konkretne pliki tylko w razie potrzeby.

Wskazówka 81: Używaj ograniczonych konwersacji z agentem

Dział zatytułowany „Wskazówka 81: Używaj ograniczonych konwersacji z agentem”

Dla dużych baz kodu ograniczaj każdą konwersację z agentem do konkretnego obszaru:

Wyraźny zakres zapobiega wędrówkom agenta do niepowiązanych modułów i zużywaniu twojego budżetu kontekstu na nieistotny kod.

Wskazówka 82: Łącz wyszukiwanie semantyczne z Grep dla precyzji

Dział zatytułowany „Wskazówka 82: Łącz wyszukiwanie semantyczne z Grep dla precyzji”

W dużej bazie kodu ani wyszukiwanie semantyczne, ani wyszukiwanie tekstowe samo w sobie nie jest wystarczające:

  • Wyszukiwanie semantyczne znajduje kod konceptualnie powiązany, ale może zwrócić wyniki z przestarzałych modułów
  • Wyszukiwanie tekstowe (grep) znajduje dokładne dopasowania, ale pomija kod, który robi to samo różnymi nazwami

Połączony przepływ pracy:

Znajdź cały kod, który obsługuje odnowienie subskrypcji. Użyj wyszukiwania
semantycznego do identyfikacji odpowiednich modułów, następnie grep dla
konkretnych wywołań funkcji 'renewSubscription', 'processRenewal' i
'handleRenewalWebhook'. Pokaż mi wyniki tylko z aktywnej bazy kodu --
ignoruj wszystko w src/legacy/ lub src/deprecated/.

Wskazówka 83: Użyj wyszukiwania @codebase dla zrozumienia międzymodułowego

Dział zatytułowany „Wskazówka 83: Użyj wyszukiwania @codebase dla zrozumienia międzymodułowego”

Gdy potrzebujesz zrozumieć, jak koncepcja rozciąga się na wiele modułów:

Ten prompt uruchamia semantyczne zrozumienie całej zaindeksowanej bazy kodu przez Cursor. Jest wolniejszy niż wyszukiwania ograniczone, ale daje pełny obraz, gdy potrzebujesz zrozumieć przekrojowe kwestie.

Przy onboardingu do dużej bazy kodu użyj agenta do zbudowania uporządkowanego zrozumienia:

  1. “Jakie są katalogi najwyższego poziomu i za co każdy z nich odpowiada?”
  2. “Pokaż mi główne punkty wejścia — gdzie przychodzą żądania HTTP i gdzie zaczynają się zaplanowane zadania?”
  3. “Jakie są główne modele domenowe i jak się do siebie odnoszą?”
  4. “Od jakich zewnętrznych serwisów zależy ta aplikacja? (bazy danych, API, kolejki wiadomości)”
  5. “Gdzie są najbardziej złożone części bazy kodu? Które pliki mają najwięcej zależności?”

Każde pytanie buduje na poprzednich odpowiedziach, dając ci uporządkowaną mapę mentalną w ciągu 30 minut.

Wskazówka 85: Używaj zasad specyficznych dla obszaru roboczego w monorepo

Dział zatytułowany „Wskazówka 85: Używaj zasad specyficznych dla obszaru roboczego w monorepo”

W monorepo różne pakiety często mają różne konwencje. Utwórz zasady specyficzne dla pakietów:

packages/web/.cursor/rules/web.md # Konwencje React
packages/api/.cursor/rules/api.md # Konwencje Express
packages/shared/.cursor/rules/shared.md # Czyste zasady TypeScript
packages/mobile/.cursor/rules/mobile.md # Konwencje React Native

Gdy agent edytuje pliki w packages/web/, pobiera zasady specyficzne dla React. Gdy edytuje packages/api/, otrzymuje zasady specyficzne dla Express. Zapobiega to stosowaniu przez agenta wzorców React do twojego kodu API lub vice versa.

Wskazówka 86: Obsługuj zależności międzypakietowe wyraźnie

Dział zatytułowany „Wskazówka 86: Obsługuj zależności międzypakietowe wyraźnie”

Gdy zmiana w jednym pakiecie wymaga aktualizacji w innym, bądź wyraźny co do łańcucha zależności:

Wskazówka 87: Używaj ukierunkowanej refaktoryzacji w pakietach

Dział zatytułowany „Wskazówka 87: Używaj ukierunkowanej refaktoryzacji w pakietach”

Przy refaktoryzacji wspólnego typu lub interfejsu promień rażenia może obejmować całe monorepo. Kontroluj to:

Zmień nazwę typu "UserRole" na "AccountRole" w @packages/shared/src/types.ts.
Następnie znajdź i zaktualizuj każdy import i użycie we wszystkich pakietach.
Uruchom pnpm run typecheck w katalogu głównym monorepo po zmianie nazwy,
aby zweryfikować, że nie ma złamanych odniesień.

Z włączonym trybem YOLO agent dokonuje zmiany nazwy, uruchamia TypeScript, widzi ewentualne pozostałe złamane odniesienia i naprawia je iteracyjnie.

Wskazówka 88: Zamykaj pliki, których aktywnie nie edytujesz

Dział zatytułowany „Wskazówka 88: Zamykaj pliki, których aktywnie nie edytujesz”

Cursor używa otwartych plików jako kontekstu wysokiego priorytetu. W dużej bazie kodu możesz łatwo zgromadzić ponad 30 otwartych zakładek, z których większość jest nieistotna dla twojego bieżącego zadania. Degraduje to:

  • Jakość przewidywania Tab (zbyt wiele zaszumionego kontekstu)
  • Czas odpowiedzi agenta (więcej plików do rozważenia)
  • Użycie pamięci (Cursor przechowuje otwarte pliki w pamięci)

Zamykaj zakładki agresywnie. Używaj Cmd+P do przeskakiwania do plików, gdy ich potrzebujesz, zamiast trzymać je permanentnie otwarte.

Wskazówka 89: Używaj trybu Max selektywnie dla analizy dużych plików

Dział zatytułowany „Wskazówka 89: Używaj trybu Max selektywnie dla analizy dużych plików”

Tryb Max daje rozszerzone okna kontekstowe przy wyższym koszcie. W dużej bazie kodu kuszące jest, aby zawsze go włączać. Nie rób tego. Włączaj tryb Max tylko dla:

  • Analizowania pojedynczych plików powyżej 3000 linii
  • Zrozumienia złożonych łańcuchów zależności obejmujących 10+ plików
  • Planowania zmian architektonicznych wymagających utrzymania całej struktury modułu w kontekście

Dla wszystkiego innego — implementowania funkcji, naprawiania błędów, pisania testów — tryb standardowy jest wystarczający i znacznie tańszy.

Wskazówka 90: Utwórz ściągę “Szybkiego kontekstu” dla swojego projektu

Dział zatytułowany „Wskazówka 90: Utwórz ściągę “Szybkiego kontekstu” dla swojego projektu”

Dla baz kodu, nad którymi pracujesz codziennie, utwórz plik referencyjny, który daje agentowi natychmiastowy kontekst:

Odwołaj się do tego pliku na początku złożonych konwersacji z agentem, aby dać natychmiastowy, efektywny tokenowo kontekst.

Indeksowanie utknęło na procencie i nie postępuje: Zazwyczaj pojedynczy duży plik blokuje indekser. Sprawdź wygenerowane pliki (GraphQL codegen, klient Prisma, skompilowane zasoby), które prześlizgnęły się przez twoje wykluczenia. Dodaj je do .cursorignore i zrestartuj indeks.

Agent daje odpowiedzi o niewłaściwej części bazy kodu: W monorepo agent czasami myli podobnie nazwane pliki w pakietach. Bądź wyraźny co do tego, który pakiet: “@packages/api/src/users.ts — nie ten w packages/web.”

Sugestie Tab są wolne w dużych projektach: Zmniejsz liczbę otwartych zakładek, zamknij nieistotne pliki i zweryfikuj, że twoje wykluczenia działają. Szybkość Tab jest bezpośrednio proporcjonalna do ilości kontekstu, który musi przetworzyć.

Jakość odpowiedzi agenta spada w środku konwersacji: Nasycenie kontekstu. Rozpocznij nową konwersację. W dużych bazach kodu konwersacje z agentem powinny być krótsze i bardziej skoncentrowane niż w małych projektach. Dąż do maksymalnie 5-10 wymian przed rozpoczęciem od nowa.

Teraz możesz obsługiwać bazy kodu w każdej skali. Przejdź do Zaawansowanych technik (Wskazówki 91-105), aby poznać integrację serwera MCP, agentów w tle, niestandardowe automatyzacje i funkcje poziomu eksperta, które pchają Cursor do jego granic.