Przejdź do głównej zawartości

Strategia dla dużej bazy kodu w Cursorze zawęża to, co widzi agent, do wycinka, którego dotyczy zadanie: otwiera się pakiet zamiast korzenia monorepo, .cursorignore odcina śledzony szum, konwencje ładują się przez reguły z globami, a zmiany między pakietami dzieli się na zaplanowane kroki. Każdy krok kończy kontrola zakresu, licznik pozostałości starego wzorca i testy pakietów zależnych.

Ta strona jest dla deweloperów i tech leadów pracujących w repozytorium powyżej mniej więcej 100 000 linii, zwykle w monorepo w TypeScripcie. Prosisz agenta o endpoint preferencji powiadomień, a on pisze nowy serwis od zera, zamiast użyć tego, który leży trzy katalogi niżej. Kopiuje wzorzec z packages/legacy-billing/, którego nikt nie ruszał od dwóch lat. W połowie zmiany nazwy zapomina, które pakiety już skończył. To nie jest błąd Cursora. Agent czyta wycinek repozytorium, a w dużym repozytorium domyślny wycinek jest zły.

Co zyskujesz, zawężając Cursora do dużej bazy kodu

Dział zatytułowany „Co zyskujesz, zawężając Cursora do dużej bazy kodu”
  • Sposób otwierania dużego repozytorium, dzięki któremu wyszukiwanie agenta zaczyna się we właściwym pakiecie.
  • .cursorignore wymierzony w pliki, których .gitignore jeszcze nie obejmuje.
  • Regułę-mapę w korzeniu, reguły pakietów z globami i streszczenia modułów, które mówią agentowi to, czego nie pokazuje kod.
  • Cztery prompty do skopiowania: mapa obszaru, plan zmiany między pakietami, wykonanie jednego kroku i audyt nieaktualnych reguł.
  • Bramkę verify-change.sh, która sprawdza, czy zmiana nie wyszła poza zakres, czy jest kompletna i czy pakiety zależne nadal działają, bez czytania zmiany linia po linii.

Dlaczego agent Cursora działa gorzej, gdy repozytorium rośnie?

Dział zatytułowany „Dlaczego agent Cursora działa gorzej, gdy repozytorium rośnie?”

Agent odpowiada na podstawie tego, co przeczytał, a czyta ułamek repozytorium. W dużej bazie kodu psują się trzy rzeczy i każda ma własne lekarstwo.

ObjawPrzyczynaLekarstwo na tej stronie
Kopiuje wycofany moduł, cytuje kod generowanyWyszukiwanie najpierw trafia na złe plikiOtwórz pakiet i odfiltruj śledzony szum
Pisze nową funkcję pomocniczą zamiast użyć twojejKonwencje żyją w głowach ludzi, nie w kodzieReguły z zakresem i streszczenia modułów
Zapomina wcześniejsze decyzje, powtarza pracęJeden czat niesie za dużo historiiZaplanowane kroki, każdy w osobnym czacie

Większe okno kontekstu nie usuwa żadnej z tych przyczyn. Więcej miejsca pozwala agentowi zmieścić więcej złych plików. To, które pliki dołączać, a kiedy pozwolić agentowi szukać samemu, opisuje zarządzanie kontekstem w Cursorze; ta strona przenosi te nawyki na repozytoria, które nie mieszczą się w żadnym oknie kontekstu.

Otwieraj pakiet, w którym pracujesz, nie korzeń monorepo

Dział zatytułowany „Otwieraj pakiet, w którym pracujesz, nie korzeń monorepo”

To, gdzie otworzysz Cursora, decyduje, gdzie zaczyna się wyszukiwanie agenta i które reguły się ładują. Mechanizm ładowania reguł w @cursor/sdk 1.0.32 zawsze czyta .cursor/rules/ w otwartym katalogu i w każdym katalogu nad nim. Otwarcie packages/api/ ładuje więc reguły samego pakietu API i reguły z korzenia repozytorium, a wyszukiwanie startuje wśród plików API.

  1. Przy pracy w jednym pakiecie otwórz jako folder katalog tego pakietu.

  2. Przy pracy obejmującej dwa lub trzy pakiety utwórz w korzeniu repozytorium plik workspace’u wielofolderowego i otwórz go zamiast folderu głównego. Cursor jako fork VS Code otwiera wielofolderowe pliki .code-workspace z VS Code; potwierdź to w swojej wersji:

    // api-web.code-workspace
    {
    "folders": [
    { "path": "packages/api", "name": "api" },
    { "path": "packages/web", "name": "web" },
    { "path": "packages/shared", "name": "shared" }
    ]
    }
  3. Commituj pliki workspace’ów, których zespół używa wielokrotnie, po jednym na częste zestawienie, i nazywaj je od zadania (api-web.code-workspace, nie workspace2.code-workspace).

  4. Cały korzeń otwieraj tylko przy zadaniach z natury przekrojowych, jak zmiana nazwy w całym repozytorium, i łącz je z planem z sekcji Wprowadzaj zmianę między pakietami w zaplanowanych krokach.

Przy osobnych repozytoriach, a nie pakietach jednego repo, ta sama idea rozszerza się na reguły kontraktów i przepływ „najpierw kontrakt”; zobacz pracę z wieloma repozytoriami w Cursorze.

Odetnij śledzony szum od wyszukiwania agenta przez .cursorignore

Dział zatytułowany „Odetnij śledzony szum od wyszukiwania agenta przez .cursorignore”

Agent Cursora, przechodząc po workspace’ie, czyta zarówno .gitignore, jak i .cursorignore, a oba pliki mają tę samą składnię (sprawdzone w @cursor/sdk 1.0.32). Wszystko, co już jest w .gitignore, na przykład node_modules/ czy dist/, jest wykluczone bez drugiego wpisu. .cursorignore służy plikom, które są zacommitowane, ale których agent nigdy nie powinien kopiować:

# .cursorignore: zacommitowane pliki, których agent nie może czytać ani naśladować
# Kod generowany trzymany w repozytorium
packages/api/src/generated/
packages/web/src/__generated__/
*.generated.ts
# Wycofane moduły, trzymane tylko do końca migracji
packages/legacy-billing/
# Kod zewnętrzny wkopiowany do repo i duże fixture'y
vendor/
packages/api/test/fixtures/large/
# Lockfile'y i zminifikowane bundle
pnpm-lock.yaml
*.min.js

Dwie zasady utrzymują ten plik w dobrej formie. Nigdy nie wykluczaj żywego kodu, testów ani konfiguracji, bo agent potrzebuje ich, żeby trzymać się twoich wzorców. Wpis dla wycofanego modułu traktuj jako tymczasowy: usuń go, gdy moduł zniknie, bo inaczej agent nie pomoże w migracji, która go usuwa. Ścieżka zablokowana w ten sposób kończy się błędem wskazującym .cursorignore, gdy agent próbuje ją przeczytać, więc błędny wpis łatwo zauważyć.

Jak zmierzyć wpływ zmiany w pliku ignorowania na indeksowanie i szybkość wyszukiwania, z liczbami przed i po, pokazuje strojenie Cursora pod duże repozytoria. Zastosowanie tego samego pliku do bezpieczeństwa opisuje strona o prywatności i bezpieczeństwie Cursora w zespole.

Nowa osoba w zespole potrzebuje mapy i kilku zasad obowiązujących w zespole, zanim dotknie repozytorium na 300 000 linii. Agent też. Reguły projektu to pliki .mdc w .cursor/rules/. Zwykły plik .md w tym katalogu mechanizm ładowania reguł pomija (sprawdzone w @cursor/sdk 1.0.32), więc nic nie sygnalizuje błędu; dokumentacja Cursora mówi to samo (sprawdzone 2026-10-12). Dużą bazę kodu pokrywają trzy warstwy.

1. Jedna krótka, zawsze aktywna mapa w korzeniu. Tylko to, czego potrzebuje każde zadanie: gdzie co leży, co jest wycofane i jakie są polecenia bramek.

---
description: Repository map and gates for the acme monorepo
alwaysApply: true
---
- pnpm monorepo. Live packages: packages/api (Fastify), packages/web (Next.js),
packages/shared (types only, no runtime code).
- packages/legacy-billing is deprecated. Never import from it or copy its patterns;
the replacement is packages/api/src/billing.
- Before reporting a task done, run for each package you touched:
pnpm --filter <package> run typecheck && pnpm --filter <package> test

2. Reguły pakietów z globami. Reguła z globs ładuje się, gdy w kontekście jest pasujący plik, więc konwencje API nigdy nie trafiają do pracy nad frontendem. Umieść ją w pakiecie, którego dotyczy, na przykład packages/api/.cursor/rules/api-conventions.mdc, a glob zapisz względem korzenia pakietu, czyli folderu, który otwierasz. Sprawdź, czy pasuje, procedurą próbną z poradnika o własnych regułach:

---
description: HTTP handler conventions for packages/api
globs: src/**/*.ts
alwaysApply: false
---
- Handlers call services; services call repositories. No SQL in handlers.
- Validate input with the Zod schemas in packages/api/src/schemas/.
- Errors use AppError from packages/api/src/errors.ts, never a bare throw.
- Canonical example: packages/api/src/routes/users/index.ts

3. Plik streszczenia dla każdego dużego modułu. Dla modułu zbyt dużego, żeby go dołączyć, jednostronicowy ARCHITECTURE.md daje agentowi mapę za ułamek tokenów. Odwołaj się do niego w regule modułu, żeby agent przeczytał go przed otwieraniem pojedynczych plików:

packages/api/src/payments/ARCHITECTURE.md
# Payments
- service.ts: checkout and refunds (Stripe). repository.ts: Drizzle queries.
- webhook.ts: verifies the signature, then updates status via repository.ts.
- Invariants: amounts are integer cents; every Stripe call sends an idempotency key.

Gdy zamiast pakietu otworzysz korzeń monorepo, mechanizm ładowania sięga po reguły zagnieżdżone w packages/*/.cursor/rules/ tylko przy włączonym wykrywaniu reguł zagnieżdżonych (w @cursor/sdk 1.0.32 jest ono domyślnie włączone), a glob liczony od korzenia pakietu może nie pasować z korzenia repozytorium. To, które reguły się ładują, sprawdź procedurą próbną z poradnika o regułach, zamiast zakładać. Tryby ładowania, szablony i test CI, który zawodzi, gdy glob nie pasuje do żadnego pliku, opisuje strona własne reguły i szablony w Cursorze. Jeśli piszesz pierwszą regułę, zacznij od reguł projektu.

AGENTS.md i CLAUDE.md w monorepo. Dokumentacja Cursora (sprawdzone 2026-10-12) podaje, że Cursor obsługuje AGENTS.md w korzeniu projektu i w podkatalogach. Pliki zagnieżdżone są łączone z plikami z katalogów nadrzędnych, a pierwszeństwo mają instrukcje bardziej szczegółowe, więc AGENTS.md w packages/api/ uzupełnia plik z korzenia repozytorium i wygrywa tam, gdzie oba się różnią. Według pomocy Cursora Cursor czyta pliki CLAUDE.md tak samo jak AGENTS.md i stosuje je zawsze, w każdej rozmowie, niezależnie od ustawienia alwaysApply we frontmatterze (sprawdzone 2026-10-12). W Cursorze 3.21 (2026-09-17) reguły zespołu ze wzorcami plików obowiązują tylko dla pasujących plików.

Przed pierwszą edycją w kodzie, którego nie pisałeś, poproś o mapę tylko do odczytu, ze ścieżkami plików. Mapa staje się kontekstem następnego czatu, a jej lista plików staje się zakresem, z którym porównasz zmianę.

Sprawdź odpowiedź w kodzie dwiema lub trzema próbkami: otwórz wskazane pliki we wskazanych liniach. Mapa z błędną ścieżką pliku oznacza, że agent zgadywał, a lekarstwem jest węższe pytanie, nie dłuższe.

Wprowadzaj zmianę między pakietami w zaplanowanych krokach

Dział zatytułowany „Wprowadzaj zmianę między pakietami w zaplanowanych krokach”

Zmiana obejmująca kilka pakietów zawodzi, gdy jeden czat próbuje zrobić wszystko naraz. Zaplanuj ją raz, zapisz plan do pliku i wykonuj po jednym pakiecie na czat, z bramką po każdym kroku.

  1. Przełącz agenta w Plan Mode, który tworzy plan implementacji przed napisaniem kodu, i poproś o plik planu. Przeglądasz plan, nie kod: lista wywołań i kolejność kroków to miejsca, gdzie błędy kosztują najmniej.

  2. Wykonuj jeden krok na czat. Nowy czat dla każdego pakietu trzyma wcześniejsze próby poza kontekstem, a plik planu przenosi decyzje dalej.

  3. Commituj po każdym zielonym kroku. Mały commit to jednostka, którą możesz cofnąć, a następny czat startuje ze sprawdzonego stanu drzewa.

  4. Przy długich migracjach obejmujących wiele pakietów uruchamiaj niezależne kroki równolegle w osobnych worktree albo przekaż je agentom w chmurze (Cloud Agents); zobacz Cloud Agents i automatyzacje.

To, czy agent uruchamia polecenia bramek bez pytania, zależy od trybu uruchamiania (run mode). Skonfiguruj tryby uruchamiania i sandbox tak, jak opisuje strona o prywatności i bezpieczeństwie Cursora w zespole, zamiast zatwierdzać każde polecenie ręcznie.

Jak zweryfikować zmianę w dużej bazie kodu bez czytania każdego diffa?

Dział zatytułowany „Jak zweryfikować zmianę w dużej bazie kodu bez czytania każdego diffa?”

Udowodnij mechanicznie trzy rzeczy, a uwagę człowieka przeznacz na plan i na to, co wskażą kontrole.

PytanieKontrolaZaliczona, gdy…
Czy zmiana została w zakresie?git diff --name-only porównany z listą plików z planuKażdy zmieniony plik jest w planie albo ma podany powód
Czy jest kompletna?Licznik starego wzorca z rgLicznik wynosi 0
Czy każdy konsument nadal działa?Typecheck i testy zmienionych pakietów i pakietów od nich zależnychWszystkie na zielono
#!/usr/bin/env bash
# verify-change.sh: uruchom w terminalu w korzeniu repozytorium po ostatnim kroku
set -euo pipefail
base=origin/main
echo "== Files changed (compare with docs/plans/user-organization-id.md)"
git diff --name-only "$base"...HEAD
echo "== Files changed outside the allowed packages (must be empty)"
outside=$(git diff --name-only "$base"...HEAD \
| grep -v -E '^(packages/(shared|api|web)/|docs/plans/)' || true)
echo "$outside"
test -z "$outside"
echo "== Imports from the deprecated module (must be 0)"
count=$( { rg -n "from ['\"].*legacy-billing" packages/ --type ts --glob '!packages/legacy-billing/**' || true; } | wc -l)
echo "$count"
test "$count" -eq 0
echo "== Typecheck and test every changed package and its dependents"
pnpm --filter "...[$base]" run typecheck
pnpm --filter "...[$base]" test

Filtr ...[origin/main] wybiera pakiety zmienione od origin/main oraz każdy pakiet, który od nich zależy, bo właśnie tam psuje się zmiana współdzielonego typu. Nx (nx affected -t typecheck test) i Turborepo (turbo run typecheck test --filter=...[origin/main]) robią to samo w swoich repozytoriach. Wzorzec w rg zamień na to, co zmiana usuwa: starą nazwę funkcji, pozycyjny styl wywołań, wycofany import.

Uruchamiaj ten sam skrypt w CI, żeby bramka nie zależała od czyjejś pamięci. Potem niech Bugbot przejrzy pull request pod kątem poprawności, a CODEOWNERS skieruje go do właścicieli pakietów, żeby każdy zatwierdził swój wycinek. Właściciel czyta plan i wynik bramek dla swojego pakietu, nie każdą linię. Szerszą konfigurację przeglądu opisuje code review z Cursorem.

Jak utrzymać celność długich sesji w dużym repozytorium

Dział zatytułowany „Jak utrzymać celność długich sesji w dużym repozytorium”
  • Jedno zadanie na czat. Zacznij nowy czat, gdy krok jest zacommitowany, gdy przechodzisz do innego pakietu albo gdy agent powtarza błąd, który już poprawiłeś. Stan przenoś w pliku planu albo w krótkiej notatce przekazania, jak w zarządzaniu kontekstem w Cursorze.
  • Dołączaj jeden kanoniczny przykład, nie folder. @packages/api/src/routes/users/index.ts kosztuje kilka tysięcy tokenów; wzmianka o całym packages/api/src/ może zapełnić okno, zanim agent zacznie pracę. Jak zmierzyć różnicę, pokazuje zarządzanie tokenami w Cursorze.
  • Trzymaj reguły w zgodzie z kodem. Reguła opisująca zeszłoroczną architekturę wprowadza agenta w błąd w każdym czacie, do którego się załaduje. Audytuj reguły po dużych refaktoryzacjach.

Co psuje się w dużej bazie kodu w Cursorze i jak z tego wyjść

Dział zatytułowany „Co psuje się w dużej bazie kodu w Cursorze i jak z tego wyjść”

Wyszukiwanie najpierw trafiło na stary moduł. Jak naprawić: przywróć checkpoint sprzed edycji (zobacz checkpointy i rozgałęzianie), dodaj ścieżkę do .cursorignore albo oznacz ją jako wycofaną w regule w korzeniu i powtórz krok w nowym czacie.

Agent pisze nową funkcję pomocniczą zamiast użyć istniejącej

Dział zatytułowany „Agent pisze nową funkcję pomocniczą zamiast użyć istniejącej”

Konwencja istnieje tylko w głowach ludzi. Jak naprawić: dodaj kanoniczny plik do reguły pakietu z globem i powtórz krok z tym plikiem dołączonym. Jeśli zdarzy się to dwa razy przy tej samej funkcji pomocniczej, dodaj regułę lintera zakazującą duplikatu; linter zatrzymuje CI, reguła tylko prosi.

packages/web/src/user.ts i packages/api/src/user.ts wyglądają dla wyszukiwania tak samo. Jak naprawić: otwieraj pakiet albo jego workspace zamiast korzenia, pisz w prompcie pełne ścieżki i pozwól, żeby kontrola zakresu w verify-change.sh wyłapała zabłąkany plik.

Indeksowanie się nie kończy albo wyszukiwanie jest wolne

Dział zatytułowany „Indeksowanie się nie kończy albo wyszukiwanie jest wolne”

W śledzonym katalogu leży duży plik generowany lub binarny. Jak naprawić: znajdź go poleceniem git ls-files -z | xargs -0 du -k | sort -rn | head -20, dodaj do .cursorignore i przejdź kroki pomiaru ze strojenia Cursora pod duże repozytoria.

Plik zapisano jako .md zamiast .mdc albo jego glob nie pasuje do niczego. Jak naprawić: zmień rozszerzenie, przetestuj glob na wyniku git ls-files i dodaj test CI z własnych reguł i szablonów w Cursorze.

Czat niesie zbyt wiele prób. Jak naprawić: zatrzymaj się, upewnij, że plik planu oznacza wykonane kroki, zacommituj to, co przeszło bramkę, i kontynuuj od pierwszego niedokończonego kroku w nowym czacie.

Jak z dużymi repozytoriami radzą sobie Claude Code i Codex

Dział zatytułowany „Jak z dużymi repozytoriami radzą sobie Claude Code i Codex”

Zasady zawężania są wspólne dla narzędzi, konfiguracja już nie. Claude Code zawęża pracę katalogiem startowym, zagnieżdżonymi plikami CLAUDE.md i regułami odmowy; opisuje to strona duże bazy kodu i monorepo w Claude Code. Codex utrzymuje długie sesje na kursie dzięki plikom AGENTS.md i plikom przekazania; opisuje to zarządzanie kontekstem we wszystkich interfejsach Codeksa. Strategię wspólną dla narzędzi znajdziesz w strategiach dla baz kodu z milionami linii i w pracy z monorepo z asystentami AI.