Przejdź do głównej zawartości

Pair programming z agentem Cursora

Pair programming z agentem Cursora to sesja, w której programista i agent dzielą się rolami kierowcy i nawigatora przez całą jedną funkcję. Plan Mode ustala projekt, Agent mode buduje po jednym wycinku, zaczynając od testu, a debugowanie zaczyna się od padającego testu. Programista odpowiada za kryteria akceptacji i dowody; agent pisze większość kodu.

Ta strona jest dla programistów, którzy używają już agenta Cursora do pojedynczych zadań (zobacz Praca z czatem agenta w Cursorze) i chcą z nim przejść przez całą funkcję. Sytuacja: budujesz preferencje powiadomień z ustawieniami per kanał, domyślnymi wartościami organizacji, które użytkownik może nadpisać, i oknami dostarczania zależnymi od strefy czasowej. Podstawowy scenariusz zajmuje jedno popołudnie. Przypadki brzegowe to miejsce, gdzie wszystko się sypie, a jeden długi prompt „zbuduj całość” zwraca 600 linii, których nie da się sprawdzić.

  • Tabelę ról, która mówi, kto prowadzi w każdej fazie i jaki dowód ją zamyka
  • Cztery prompty do skopiowania: sesję projektową, rozstrzygnięcie rozwidlenia projektu bez edycji, wycinek budowany od testu i objazd debugowania oparty na dowodach
  • Kontrolę po każdym kroku (czerwony test, zielony test, diff w granicach planu, jeden commit), która zastępuje czytanie każdej linii
  • Sposób, żeby ta sama poprawka nie wracała, i sposób na przeniesienie sesji do nowego czatu
  • Kroki naprawcze dla sześciu typowych awarii sesji w parze

Kto prowadzi, gdy programujesz w parze z agentem Cursora?

Dział zatytułowany „Kto prowadzi, gdy programujesz w parze z agentem Cursora?”

W klasycznym pair programmingu kierowca pisze, a nawigator pilnuje kierunku. Z agentem to agent wykonuje niemal każde naciśnięcie klawisza, więc ty na stałe siadasz w fotelu nawigatora: wyznaczasz kierunek, definiujesz „gotowe” dla każdego kroku i sprawdzasz dowody. Tabela to cała metoda; kolejne sekcje ją rozwijają.

FazaAgent prowadziTy nawigujeszDowód, który zamyka fazę
ProjektCzyta kod, proponuje plan, zadaje pytaniaOdpowiadasz, wybierasz na każdym rozwidleniu, tniesz zakresZapisany plan: ponumerowane wycinki, lista plików, jeden test na kryterium akceptacji
Budowa wycinkaPisze test, potem kod, potem uruchamia kontroleNazywasz wycinek, pliki i to, czego nie wolno zmienićNowy test najpierw padał, a teraz przechodzi; polecenie weryfikacji jest zielone; diff mieści się w liście plików
Objazd debugowaniaOdtwarza błąd w teście, stawia hipotezy, dodaje logowanieWybierasz hipotezę do sprawdzenia; odrzucasz poprawki przed dowodemPadający test albo linia logu, która potwierdza jedną przyczynę
PrzekazaniePisze krótką notatkę o stanieSprawdzasz notatkę w 30 sekundNotatka z decyzjami, gotowymi wycinkami i następnym krokiem
Pull requestPodsumowuje, co i dlaczego się zmieniłoCzytasz testy i każdy plik wskazany przez dowodyZielone CI, rozwiązane komentarze z review

Jedna zasada stoi za tą tabelą: żaden wycinek nie kończy się na słowie agenta. Każdy kończy się poleceniem, które ty albo CI możecie uruchomić ponownie.

Pięć minut przygotowań sprawia, że każdy późniejszy krok da się sprawdzić.

  1. Utwórz gałąź z czystego drzewa roboczego: git switch -c feat/notification-prefs. Trzymaj otwarty własny terminal do kontroli; wynik w terminalu agenta to jego raport, a nie twój dowód.
  2. Znaj swoje polecenie weryfikacji, to samo, które uruchamia CI: na przykład npm run verify, obejmujące sprawdzanie typów, lint i testy. Jeśli repozytorium go nie ma, napisz je przed sesją, bo każdy wycinek poniżej na nim się kończy.
  3. Zapisz kryteria akceptacji, zanim agent zobaczy zadanie, zwykłymi zdaniami, które da się zamienić w testy: „Użytkownik bez własnych preferencji dostaje domyślne ustawienie organizacji dla każdego kanału”. Jeśli jeszcze nie potrafisz ich napisać, powstaną w sesji projektowej opisanej niżej. Format pokazuje strona Wykonywalne kryteria akceptacji.
  4. Sprawdź, czy reguły projektu opisują logowanie, obsługę błędów i dostęp do danych, żeby nie poprawiać tego samego wzorca w każdym wycinku. Położenie plików i tryby ładowania opisuje strona Reguły projektu w Cursorze.

Plan Mode, słowami Cursora, „creates detailed implementation plans before writing any code”, czyli tworzy szczegółowy plan implementacji, zanim powstanie jakikolwiek kod (dokumentacja Plan Mode, zweryfikowano 28 sierpnia 2026). To pierwsze zadanie nawigatora: uzgodnić trasę, zanim ktokolwiek ruszy. Otwórz nowy czat, uruchom czat w Plan Mode i wklej prompt.

Podważaj plan tak, jak podważałbyś propozycję kolegi z zespołu. Wytnij wycinek, który istnieje tylko „dla przyszłej elastyczności”. Zapytaj, po co nowa tabela, skoro istniejąca mogłaby dostać kolumnę. Gdy pytanie ma dwie rozsądne odpowiedzi, nie pozwól agentowi wybrać po cichu: poproś o porównanie, w którym nie wolno mu niczego edytować.

Decyzję podejmujesz ty, a plik planu ją zapisuje. Jeśli twoja wersja Cursora oferuje tryb Ask tylko do odczytu, pasuje do tego promptu; linia „do not edit” zabezpiecza prompt w każdym trybie. Szerzej o doborze trybu pisze strona Tryby agenta w Cursorze.

Gdy plan jest ostateczny, zacommituj go we własnym terminalu i oznacz tagiem punkt odniesienia, z którym porównuje się każda kontrola zakresu. Tag, w odróżnieniu od zmiennej powłoki, przetrwa zamknięcie terminala i przejście do nowego czatu:

Okno terminala
git add docs/plans && git commit -m "docs: notification preferences plan"
git tag -f plan-base # durable base; survives a closed terminal

Przełącz się na Agent mode i przekaż jeden wycinek. Wycinek kończy się jednym nowym, przechodzącym testem i zielonym poleceniem weryfikacji, dzięki czemu każdy diff jest na tyle mały, że kontrola opisana niżej ma sens.

Zatrzymanie po padającym teście to najcenniejsza pauza w całej sesji. Test, który pada z właściwego powodu, dowodzi, że coś sprawdza; test napisany po kodzie często przechodzi niezależnie od tego, co kod robi. Czytaj test, a nie implementację: ma 20 linii i jest specyfikacją, z której kod będzie rozliczany.

Gdy agent zgłasza zielony wynik, sprawdź dowody sam, zanim przejdziesz do następnego wycinka:

Okno terminala
# Run in your terminal, not the agent's.
npm run verify # the same gate CI runs
git add -A # stage everything, new files included
git diff --cached --stat # size and spread of the change
git diff --cached --name-only plan-base -- . ':!docs/plans' ':!docs/handoff' \
| grep -vxF -f docs/plans/notification-preferences.files
git commit -m "feat(prefs): slice 1 - preferences model"

Pusty wynik linii z grep oznacza, że każdy zmieniony plik jest w planie. Dwa wzorce :! pomijają same pliki planu i notatki przekazania, więc dopisanie luki do planu albo późniejsza notatka przekazania nie pojawią się jako dryf. Lista .files obejmuje całą funkcję, więc ta kontrola dowodzi, że zmiana mieści się w planie, a nie w wycinku 1; do tego porównaj wynik --stat z sekcją wycinka 1 w planie. Wypisana ścieżka to albo prawdziwa luka, którą dopisujesz do pliku planu, albo dryf, który wycofujesz poleceniem git restore --staged --worktree PATH (a w przypadku nowego pliku git rm --cached PATH i usunięciem go). Commituj każdy zielony wycinek: każdy commit to znany, dobry punkt, do którego możesz wrócić, i oddziela diff następnego wycinka. Jeśli twoja wersja Cursora zapisuje własne checkpointy, strona Checkpointy i gałęzie wyjaśnia, jak uzupełniają one te commity.

Jeśli coś jest nie tak, powiedz dokładnie co i dlaczego, w jednej wiadomości:

The migration stores delivery_window_start as a timestamp with timezone.
Use a plain time column, because the timezone lives in its own column.
Add a unique constraint on (scope_type, scope_id, channel). Re-run the
slice 1 test and npm run verify, and change nothing else.

Agent, który wykonuje większość pracy przy klawiaturze, dryfuje w przewidywalny sposób: nowa biblioteka do dat, drugi styl logowania, zapytanie, o którym plan nie wspominał. Trzy nawyki trzymają go na twojej drodze.

Ogradzaj każdy wycinek tym, czego nie wolno zrobić. Ograniczenia negatywne są tanie i agent łatwo się do nich stosuje:

Implement the delivery-window check in src/services/preferences.ts. Do NOT:
- add a date library; use the helpers in src/lib/time.ts
- add a database query; use the preferences already loaded by the caller
- change the signature of isWithinDeliveryWindow()

Wskaż przykład zamiast go opisywać. Follow the error handling in @src/services/orders.ts działa lepiej niż akapit o twoich klasach błędów. Wybór tego jednego wzorcowego pliku opisuje strona Zarządzanie kontekstem w Cursorze.

Zamień powtarzaną poprawkę w regułę. Gdy drugi raz piszesz „użyj loggera z src/lib/logger.ts, nie console.log”, przerwij sesję na dwie minuty i poproś agenta o szkic reguły projektu z tą linią. Przejrzyj ją, zacommituj, a poprawka przestanie wracać w tym czacie i w czatach twoich kolegów. Strona Reguły projektu w Cursorze pokazuje, jak zadaniem-sondą sprawdzić, że reguła się ładuje.

Błędy wychodzą w połowie funkcji. Pułapka polega na tym, że pozwalasz agentowi „spróbować poprawki” na podstawie domysłu: będzie produkował wiarygodnie wyglądające zmiany, aż któraś przypadkiem przejdzie, a sesja zgubi plan. Niech objazd zaczyna się od dowodów i ma wyraźne granice.

Gdy dowody potwierdzą przyczynę, napisz „fix it”, a padający test stanie się dowodem poprawki. Poproś agenta o usunięcie tymczasowego logowania, uruchom polecenie weryfikacji i zacommituj poprawkę jako osobny commit, zanim wrócisz do wycinka 5. Jeśli twoja wersja Cursora oferuje Debug Mode, prowadzi on podobną pętlę hipotez i logowania; powyższy prompt działa w Agent mode niezależnie od tego. Dłuższe dochodzenia opisuje strona Debugowanie z AI w Cursorze.

Funkcja może trwać dłużej, niż jeden czat pozostaje użyteczny. Objawy: agent powtarza błąd, który już poprawiłeś, albo zapomina decyzję sprzed godziny. Nie kłóć się z długą historią. Zamknij czat notatką przekazania i kontynuuj w nowym, według promptu przekazania ze strony Zarządzanie kontekstem w Cursorze. Stan niosą plik planu, zacommitowane wycinki i notatka, więc nowy czat zaczyna się od:

Read @docs/plans/notification-preferences.md and @docs/handoff/notification-prefs.md.
Slices 1-4 are committed (see git log). Continue with slice 5 exactly as planned,
test first, and stop after showing me the failing test.

Każdy skończony wycinek to commit z zielonym poleceniem weryfikacji, więc koniec czatu niczego nie zabiera.

Jak zweryfikować sesję w parze bez czytania każdej linii?

Dział zatytułowany „Jak zweryfikować sesję w parze bez czytania każdej linii?”

Uważnie czytasz trzy rzeczy: plan, każdy nowy test i każdy plik wskazany przez kontrolę zakresu. Resztę pokrywają polecenia, które nie zależą od raportu agenta.

KontrolaKiedyCzego dowodziKto zatwierdza
Test pada, zanim powstanie kodKażdy wycinekTest sprawdza zachowanie, a nie tylko kod, który akurat powstałTy
npm run verify we własnym terminaluKażdy wycinek i w CITypy, lint i cały zestaw testów przechodzą, nie tylko nowy testTy, potem CI
Kontrola zakresu względem listy plików z planuKażdy wycinekAgent nie zmienił niczego, o co go nie proszonoTy
Jeden commit na zielony wycinekKażdy wycinekKażdy krok da się cofnąć osobnoTy
Mapa kryterium → test w opisie PRPull requestKażde kryterium akceptacji ma nazwany testRecenzent, który czyta mapę i testy
Bugbot albo inny agent recenzujący na PRPull requestDrugi czytelnik szukający błędów i problemów bezpieczeństwa w całym diffieRecenzent decyduje, na co zareagować

Bugbot recenzuje pull requesty pod kątem błędów, problemów bezpieczeństwa i jakości kodu, a strona Code review w Cursorze pokazuje, jak połączyć go z recenzentem-człowiekiem. Szerszy argument za tym, by recenzenci czytali dowody zamiast całych diffów, znajdziesz na stronach Czytanie dowodów zamiast kodu i Pakiet dowodów dla pull requestów agenta.

ObjawPrawdopodobna przyczynaNaprawa
Agent improwizuje poza planemPliku planu nie ma w czacie albo wycinek był nieprecyzyjnyWskazuj plan przez @ w każdym prompcie budującym i nazywaj wycinek numerem. Dodatkowe śledzone pliki wycofaj przez git restore --staged --worktree PATH; dodatkowe nowe pliki usuń (po git rm --cached PATH, jeśli są w indeksie)
Prosisz o model danych, a dostajesz model, endpointy i testyPrompt nie miał warunku zatrzymaniaDopisz „Do not create routes, services or UI” i znacznik STOP. Zachowaj tylko pliki wycinka i zacommituj
Agent zapomina o poprawkachHistoria czatu niesie stare próby, które konkurują z twoimi poprawkamiNapisz notatkę przekazania i zacznij nowy czat; zamień poprawkę w regułę projektu
Po trzech promptach okazuje się, że podejście jest złeRozwidlenie projektu rozstrzygnął agent, a nie tyOdrzuć niezacommitowany wycinek przez git restore --staged --worktree ., potem git clean -n pokaże, a git clean -f usunie pozostałe nieśledzone pliki, wróć do promptu o rozwidleniu i popraw plan przed ponowną budową
Testy przechodzą, ale funkcja jest błędnaKryterium akceptacji nie miało testu albo test powstał po kodzieDopisz brakujące kryterium do planu, napisz jego test i zobacz, jak pada, a potem popraw kod
Agent twierdzi, że „wszystkie testy przechodzą”, a CI się nie zgadzaAgent uruchomił część testów albo przeczytał nieaktualny wynikZa dowód uznawaj tylko własny terminal i CI. Poproś agenta o uruchomienie dokładnie polecenia weryfikacji i wklejenie wyniku