Przejdź do głównej zawartości

Przepływy wielu plików

Musisz przemianować pole, które przewija się przez kilkanaście plików — model, serwis, trzy kontrolery, migrację, kontrakt API i ścianę testów. Zrób to ręcznie, a przeoczysz dwóch wywołujących i wypuścisz błąd 500. To dokładnie ten rodzaj zmiany, do którego stworzono Claude Code: śledzi graf zależności, edytuje każdy plik spójnie i aktualizuje testy w tym samym przebiegu. Cała sztuka polega na tym, by sterować nim tak, aby zachował dokładność na całym obszarze rażenia.

  • Prompt zaczynający od planu, który zmusza Claude do zmapowania obszaru rażenia, zanim dotknie choćby jednego pliku
  • Powtarzalny wzorzec bezpiecznego, kompatybilnego wstecznie przemianowywania pól i API
  • Gotowe do wklejenia prompty do refaktoryzacji przekrojowych (wyciąganie wspólnej logiki, propagacja typów, śledzenie zależności)
  • Prawdziwy sposób na równoległe uruchamianie niezależnych zadań wieloplikowych przy użyciu git worktrees
  • Plan odzyskiwania na wypadek, gdy edycja wielu plików pójdzie nie tak w trakcie

Największy pojedynczy zysk dokładności przy zmianach wieloplikowych to oddzielenie planowania od edycji. Najpierw uruchom Claude w trybie planowania (claude --permission-mode plan lub naciśnij Shift+Tab, aby się do niego przełączyć), pozwól mu eksplorować i zaproponować rozwiązanie, a potem zatwierdź zanim zapisany zostanie jakikolwiek plik.

  1. Poproś o plan zmiany, a nie o samą zmianę. Claude eksploruje bazę kodu i raportuje, czego zamierza dotknąć — bez edytowania.

  2. Przejrzyj obszar rażenia. To tutaj wyłapiesz brakujące pliki lub błędne założenia, gdy poprawienie ich jest darmowe, zamiast w diffie 40 plików.

  3. Dopracuj, potem zatwierdź. Dodaj wszystko, co pominął, a następnie pozwól mu wykonać zatwierdzony plan warstwa po warstwie.

Tryb planowania jest z założenia tylko do odczytu, więc można go bezpiecznie uruchomić nawet na main. Gdy plan wygląda dobrze, zatwierdź go, a Claude przełączy się na wykonanie.

Przed przemianowaniem lub zmianą schematu każ Claude wydobyć wszystko, co zależy od rzeczy, którą zaraz przeniesiesz. To szybsze i bardziej niezawodne niż grep, bo podąża za importami i typami, a nie tylko za tekstem.

Użyj zwróconej listy kontrolnej jako kontraktu dla przebiegu edycji. Jeśli Claude później zedytuje plik, którego nie było na liście, to sygnał, by się zatrzymać i ponownie sprawdzić plan.

Przemianowanie wygląda na błahostkę, dopóki nie chodzi o publiczne pole, od którego zależą zewnętrzni klienci. Wzorzec, który przeżyje na produkcji, to dodaj-potem-wycofaj, a nie wyrwij-i-zastąp.

  1. Dodaj nową nazwę obok starej. Niech obie działają, żeby nic się nie zepsuło przy wdrożeniu.

  2. Zmigruj wewnętrznych wywołujących na nową nazwę, podczas gdy API nadal akceptuje starą.

  3. Oznacz starą nazwę jako przestarzałą z ostrzeżeniem, żebyś widział pozostałe użycia.

  4. Usuń starą nazwę, gdy telemetria potwierdzi brak aktywnych wywołujących.

W językach typowanych oprzyj się na zdolności Claude do propagowania typów, zamiast ręcznie gonić za błędami kompilatora:

Gdy logika jest zduplikowana w kontrolerach lub serwisach, poproś Claude o jej skonsolidowanie z zachowaniem istniejących publicznych interfejsów — konsolidacja powinna być niewidoczna dla wywołujących.

Extract the validation logic duplicated in UserController, OrderController, and
ProductController into a single ValidationService. Keep each controller's existing
method signatures unchanged. Add unit tests for the extracted service.

Gdy refaktoryzacja dotyka systemu połączonego przez MCP — na przykład przemianowania kolumny istniejącej w Twojej rzeczywistej bazie danych — podłączenie serwera MCP Postgres pozwala Claude odczytać żywy schemat zamiast zgadywać z migracji. Ten przepływ opisuje lekcja o wzorcach refaktoryzacji.

Przy dużych zmianach prowadź Claude przez stos po kolei, zamiast prosić o wszystko naraz. Wąskie, sekwencyjne prompty utrzymują skupiony kontekst i sprawiają, że każdy diff da się przejrzeć.

1. "List every file that needs to change for user roles, grouped by layer."
2. "Implement the database migration and model changes only."
3. "Now the role-check middleware and the protected routes."
4. "Now the role-management UI."
5. "Now update and run the tests."

Między niepowiązanymi fazami uruchom /clear, aby porzucić przestarzały kontekst, lub /compact Focus on the role-check seam and the files we've already changed, aby podsumować, zachowując to, co istotne. Użyj /context, aby zobaczyć, co naprawdę zjada okno, oraz /cost, aby obserwować wydatki. To prawdziwe interaktywne polecenia ze slashem — uruchamiaj je wewnątrz REPL claude, a nie jako flagi terminala.

Jeśli masz kilka naprawdę niezależnych strumieni pracy — nowy system uwierzytelniania, przepisanie płatności, przegląd analityki — uruchom każdy we własnym git worktree, aby dostały odizolowane katalogi robocze i gałęzie. To udokumentowany sposób na równoległość i utrzymuje kontekst każdego zadania w czystości.

Okno terminala
# Jedno worktree (i gałąź) na strumień pracy
git worktree add ../feature-auth feature/authentication
git worktree add ../feature-payments feature/payments
git worktree add ../feature-analytics feature/analytics
# Uruchom Claude Code w każdym worktree (osobne terminale lub panele tmux)
tmux new-session -d -s auth 'cd ../feature-auth && claude'
tmux new-session -d -s payments 'cd ../feature-payments && claude'
tmux new-session -d -s analytics 'cd ../feature-analytics && claude'

Każda sesja to własna rozmowa względem własnego checkoutu, więc edycje nigdy nie kolidują. Gdy skończysz z danym drzewem, użyj git worktree remove ../feature-auth.

Wybierz właściwy mechanizm równoległości:

MechanizmNajlepsze do
Git worktrees + jeden claude na drzewoNiezależne zadania na osobnych gałęziach, które nie mogą dotykać swoich plików.
SubagentyWyspecjalizowani pomocnicy w jednej sesji (czysty pod-kontekst, szybkie handoffy) — uruchamiani flagą --agents lub definiowani w .claude/agents/.
Agent teamsWielu agentów, którzy się koordynują i wymieniają wiadomości; ustaw --teammate-mode i włącz przez CLAUDE_CODE_EXPERIMENTAL_AGENT_TEAMS=1.

Jeśli zamiast tego potrzebujesz, by Claude czytał z kilku katalogów w jednej sesji (aplikacja monorepo plus wspólna biblioteka), nie używaj worktrees — dodaj katalogi przez --add-dir:

Okno terminala
claude --add-dir ../apps ../lib "Update the shared logger and every app that imports it"

Claude pracuje nad jednym repozytorium naraz, więc zmiany między repozytoriami są sekwencyjne. Najpierw poprowadź producenta, potem każdego konsumenta, i przypnij kontrakt w pliku CLAUDE.md każdego repo, aby przyszłe sesje wiedziały, co się zmieniło.

Okno terminala
cd api-service
claude "Update the /users endpoint to return clientId instead of customerId,
but keep accepting customerId on input for one release."
cd ../frontend-app
claude "The /users API now returns clientId (customerId is deprecated).
Update all calls and data handling to read clientId."
cd ../mobile-app
claude "Update to read clientId from the /users API, keeping a fallback to
customerId so older app builds keep working."

Zapisz migrację w każdym repo, aby następna sesja miała kontekst:

<!-- in each repo's CLAUDE.md -->
## Recent migrations
- clientId replaces customerId in /users responses; customerId still accepted on input until v3.

Edycje wielu plików zawodzą w przewidywalny sposób. Oto jak wyłapać i odzyskać każdy z nich.

Gdy przebieg edycji pójdzie nie tak, git jest Twoim cofnięciem:

Okno terminala
git status # zobacz wszystko, co się zmieniło
git diff # przejrzyj, zanim czemukolwiek zaufasz
git checkout -- path/to/file.ts # cofnij pojedynczy plik
git reset --hard HEAD # skasuj wszystkie niezacommitowane zmiany i zacznij od nowa

Przy częściowym odzyskiwaniu — zachowaj dobre, porzuć zepsute — opisz to precyzyjnie:

Commituj w logicznych fazach w miarę postępów (po migracji, po middleware, po UI). Małe, częste commity zamieniają „cała zmiana jest zepsuta” w „ostatni commit jest zepsuty”.