Wszystkie wpisy

Claude Code - agent w terminalu, nie autocomplete w IDE

Inna filozofia niż Copilot i Cursor. Pełnoprawny agent w CLI, który czyta, pisze, uruchamia testy i sam dochodzi do zielonych checków.


Trzy filozofie pracy z AI w kodzie #

W 2026 roku narzędzia do pracy z AI w kodzie dzielą się na trzy obozy, które różnią się gdzie żyje agent.

GitHub Copilot to autocomplete na sterydach. Model siedzi w IDE i podpowiada kolejne linijki, które programista akceptuje tabem. Doskonały do drobnych operacji, słaby do dużych zmian.

Cursor to fork VS Code, który wokół AI zbudował całe środowisko. Model widzi otwarte pliki, ma czat w bocznym panelu i tryb agentowy, który może edytować wiele plików naraz - ale wszystko nadal dzieje się w obrębie edytora.

Claude Code poszedł w trzecią stronę. To nie wtyczka i nie IDE. To autonomiczny agent w wierszu poleceń, który integruje się z resztą stosu programistycznego przez to, co programiści i tak już mają: terminal, gita, basha, pliki na dysku.

To jest filozofia Unixa - jedno narzędzie, które robi jedną rzecz dobrze i daje się składać z innymi przez stdin/stdout.

Co znaczy „autonomiczny agent” #

Claude Code nie tylko generuje tekst. Ma dostęp do konkretnych operacji na twoim systemie, które wykonuje sam, w ramach jednego logicznego zadania:

  • Czytanie - skanuje strukturę projektu, otwiera dowolne pliki, przeszukuje regexy, analizuje git diff.
  • Pisanie - tworzy nowe pliki, modyfikuje istniejące, refaktoruje kilkanaście naraz w spójny sposób.
  • Wykonywanie - odpala bash. Kompiluje, uruchamia testy, włącza lintera, czyta exit code.
  • Łączenie - przez standard MCP (Model Context Protocol) gada z zewnętrznymi systemami: Jirą, GitHubem, Slackiem, bazą danych.

Każde z tych uprawnień wymaga zgody użytkownika za pierwszym razem (i można je dowolnie przyciąć). Ale w praktyce, po przykryciu jednorazowymi zgodami, agent porusza się po projekcie tak swobodnie, jak ty.

Pętla agenta - jak naprawdę pracuje #

Typowe zadanie nie jest wykonywane „jednym promptem → jedną odpowiedzią”. Wygląda jak iteracja:

Faza 1: Rekonesans. Dostaje zadanie - na przykład „zmigruj moduł płatności z biblioteki X do Y”. Zanim cokolwiek napisze, czyta. Otwiera package.json, szuka miejsc importujących X, czyta dokumentację Y (jeśli ma podpięte MCP do strony z docsami), patrzy na testy. Buduje sobie obraz projektu.

Faza 2: Plan. Zwraca ci propozycję działania. „Znalazłem 12 plików importujących X. Proponuję zmienić importy + dostosować 3 wywołania (różne sygnatury) + zaktualizować snapshot testy.” Tu możesz powiedzieć „idź” albo „nie, zacznij od czegoś innego”.

Faza 3: Wykonanie. Edytuje pliki - po kolei, krok po kroku, pokazując ci diff. Po skończeniu uruchamia testy.

Faza 4: Naprawa. Jeśli testy padły, czyta stack trace, identyfikuje przyczynę, wprowadza poprawkę i odpala testy znowu. Tę pętlę zamyka sam, bez twojego udziału, dopóki nie dochodzi do zielonego stanu. Dopiero wtedy zwraca pracę.

To jest fundamentalnie inna pętla niż Copilot, gdzie ty akceptujesz każdą linijkę. Tu akceptujesz rezultat - albo procentowy stan w pętli, jeśli zaglądasz w trakcie.

Gdzie to ma sens, a gdzie nie #

Bardzo dobry fit #

CI/CD i naprawa zepsutych pipeline’ów. GitHub Actions wywaliło build na nightly? Agent pobiera logi (przez gh run view), znajduje błąd, analizuje, czy to regression w kodzie czy flaky test, naprawia, otwiera PR-a.

Onboarding do dużego repo. Nowy programista dostaje pytanie „jak działa autoryzacja w tym projekcie?” - agent w kilka minut przechodzi od LoginController przez middleware, JWT validation, role mapping, aż do testów integracyjnych - i pisze podsumowanie z linkami do plików.

Refactor na skalę całego repo. „Zamień wszystkie console.log na strukturalny logger” - 200 plików, kilkadziesiąt subtelnych różnic w kontekstach, ręcznie pełen dzień, agentem 20 minut.

Rutynowe operacje gita. „Zrób PR-a z branchowi feature/X, opisz zmiany na podstawie diffa, dodaj reviewerów Y i Z.” Bez przełączania kontekstu, bez pisania komendy gh ręcznie.

Słaby fit #

Eksploracyjne pisanie kodu. Kiedy sam nie wiesz, jak ma wyglądać rozwiązanie, lepiej pisać małe kawałki w IDE z autocomplete’em (Copilot/Cursor) i widzieć po linijce, jak to się układa.

Praca w nieswoich projektach z brakiem zaufania do agenta. Agent który ma dostęp do basha i pisania plików może narobić bigosu, jeśli nie skontrolujesz uprawnień. Dla cudzych prywatnych repo - lepiej środowisko piaskownicy (Cursor, ChatGPT z plikiem, dev container).

Bardzo małe zmiany. „Zmień typeof na instanceof w jednej linijce” - tu autocomplete jest szybsze niż prompt do agenta.

Zmiana roli programisty #

Z perspektywy codziennej pracy: Claude Code przesuwa twoją rolę z wykonawcy w stronę architekta i orkiestratora. To zaczyna brzmieć jak puste hasło z prezentacji, ale w praktyce wygląda tak:

Zamiast pisać setki linijek, spędzasz więcej czasu na definiowaniu problemu („potrzebuję, żeby ten endpoint zwracał paginację cursor-based, kompatybilną wstecz z offsetową”), na projektowaniu kontraktów („oto schema bazy, oto API”), na kontrolowaniu jakości (czytanie diffów, decyzje o trade-offach).

Czarna robota - skanowanie repo, mechaniczne edycje, dopinanie testów - schodzi do agenta. Twoja wartość jako inżyniera nie spada, ale przesuwa się na decyzje wyższego poziomu.

To nie jest zagrożenie zawodu. To jest jego kolejna iteracja. Tak samo jak w 2010 nie pisałeś już własnego ORM-a, tylko korzystałeś z gotowego, w 2030 nie będziesz pisał ręcznie 80% kodu, tylko będziesz dyrygował agentem, który go pisze - a wartość będzie w tym, czym dyrygujesz i jak weryfikujesz wynik.

Skrótowo #

Claude Code to autonomiczny agent w terminalu, nie wtyczka do IDE. Ma uprawnienia czytać, pisać, uruchamiać i łączyć się z zewnętrznymi narzędziami. Pracuje w pętli rekonesans → plan → wykonanie → naprawa, aż do zielonego stanu testów. Najlepsze fity: CI/CD, refaktor wieloplikowy, onboarding, rutynowe operacje gita. Słabszy fit: eksploracja, mikro-zmiany. To nie zastępuje IDE, ale dopełnia stack - i przesuwa programistę z wykonawcy do architekta.

Pozycjonowanie w stosie narzędzi #

Claude CodeCursorCopilot
FormaCLIFork VS CodeIDE plugin
Granularnośćcałe zadaniecałe pliki / projektlinijka / blok
Tryb pracyautonomiczny agentagent + chat + autocompleteautocomplete + chat
Integracjaterminal, bash, MCPwbudowane w IDEwbudowane w IDE
Akceptacja zmianrezultat całego zadaniaper-edit lub per-taskper-suggestion

Nie są to konkurenci, tylko narzędzia o różnej granularności. W praktyce wielu programistów ma wszystkie trzy: Copilot dla autocomplete, Cursor dla eksploracyjnego pisania, Claude Code dla zadań ze zdefiniowanym kryterium sukcesu.

Tool use - co agent może zrobić #

Pod maską Claude Code to model Claude (rodzina Opus / Sonnet) wywoływany przez API w trybie tool use. Każda akcja na systemie to wywołanie konkretnego tool-a:

ToolOpisTypowe użycie
ReadCzyta plikSkanowanie repo, czytanie plików docelowych
WriteTworzy nowy plikGenerowanie testów, scaffold
EditModyfikuje istniejący plik90% codziennej pracy - punktowe zmiany
BashWykonuje shell commandBuild, test, lint, git, dowolne CLI
GlobSzuka plików po wzorcu**/*.cs, src/**/__tests__/*
GrepSzuka treści (ripgrep)Znajdowanie wszystkich użyć symbolu
WebFetchPobiera stronę WWWCzytanie dokumentacji, zewnętrznych specyfikacji
AgentSpawnuje sub-agentaRównoległe niezależne podzadania

Każdy tool zwraca strukturyzowany rezultat (treść pliku, exit code + stdout/stderr, lista paths). Model dostaje to z powrotem jako kontekst następnej iteracji.

Zgody są domyślnie restrykcyjne: pierwsze wywołanie Bash z nową komendą wymaga akceptacji. Można to konfigurować przez plik ~/.claude/settings.json:

// title: settings.json
{
  "permissions": {
    "allow": [
      "Bash(dotnet test:*)",
      "Bash(dotnet build:*)",
      "Bash(git status)",
      "Bash(git diff:*)"
    ],
    "ask": ["Bash(git push:*)"],
    "deny": ["Bash(rm -rf:*)"]
  }
}

allow = wykonuje bez pytania. ask = pyta za każdym razem. deny = blokuje i nie pyta.

MCP - Model Context Protocol #

MCP to otwarty standard (zaproponowany przez Anthropic, adoptowany szerzej) na podpinanie zewnętrznych narzędzi do agentów LLM. Zamiast pisać własne integracje, instalujesz MCP server, który wystawia tooly w sposób zgodny ze specyfikacją - i każdy klient MCP (Claude Code, Cursor, Continue, Zed) potrafi je wywołać.

Praktyczne MCP servery:

  • @modelcontextprotocol/server-filesystem - uniwersalny dostęp do FS (zwykle wbudowany).
  • @modelcontextprotocol/server-postgres - introspect schema, run queries.
  • @modelcontextprotocol/server-github - issue, PR, code search.
  • mcp-server-jira - tickety, opisy, komentarze.
  • mcp-server-slack - wiadomości, wątki.

Konfiguracja w ~/.claude/mcp.json:

// title: mcp.json
{
  "mcpServers": {
    "postgres": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-postgres"],
      "env": {
        "POSTGRES_URL": "postgresql://localhost/devdb"
      }
    },
    "github": {
      "command": "npx",
      "args": ["-y", "@modelcontextprotocol/server-github"],
      "env": {
        "GITHUB_TOKEN": "${GITHUB_TOKEN}"
      }
    }
  }
}

Po dopisaniu MCP serwera, agent dostaje jego tooly do dyspozycji. Zadaniem typu „pobierz opis ticketu PROJ-1234 i zaimplementuj” zacznie od wywołania jira.getIssue, potem przejdzie do Read / Edit / Bash.

Pętla iteracyjna - zasada ReAct #

Claude Code implementuje wariant pętli ReAct (Reason + Act) - klasyczny pattern w agentach LLM:

LOOP:
  Reason: "Co teraz wiem? Co muszę sprawdzić? Jaki jest następny krok?"
  Act: wywołaj tool (Read / Edit / Bash / ...)
  Observe: dostaję rezultat
  Update: rezultat trafia do kontekstu, model przechodzi do kolejnego Reason
UNTIL: kryterium sukcesu spełnione lub max iterations

Na poziomie API to wygląda jak ciąg tool_usetool_result w wiadomościach. Każda iteracja to osobne wywołanie modelu z rosnącą historią.

Krytyczny moment to kryterium sukcesu. Bez jasnego kryterium model „kończy”, kiedy mu się wydaje, że napisał poprawny kod - co bywa daleko od rzeczywistości. Dlatego wymuszanie TDD-loop w CLAUDE.md jest tak skuteczne:

Task is done iff ALL of:
  - just build exits 0
  - just test exits 0 with all tests passing
  - just lint exits 0

Model nie zwraca kontroli, dopóki nie zobaczy trzech zer. Pętla domknięta deterministycznie.

Praktyczne flow #

Naprawa zepsutego CI #

# title: terminal
$ claude
> The CI on PR #234 is failing. Check the logs, identify the issue,
> fix it, push the fix.

[Agent runs: gh pr checks 234 --watch]
[Agent runs: gh run view <run-id> --log-failed]
[Agent reads stderr from failing job]
[Agent runs: git checkout pr-234-branch]
[Agent runs: just test (reproduces locally)]
[Agent identifies: Date.UtcNow vs Date.Now in test that runs in CI's UTC]
[Agent runs: Edit on src/Domain/InvoiceService.cs]
[Agent runs: just test (passes)]
[Agent runs: git add -p && git commit -m "fix: use UtcNow in invoice timestamps"]
[Agent runs: git push]

Done. PR #234 should now be green within ~3 minutes once CI re-runs.

Refactor na skalę #

# title: terminal
> Replace all uses of Console.WriteLine with our Serilog logger
> (ILogger<T> from DI). Skip code under tests/.

[Agent: Glob "**/*.cs" excluding tests/]
[Agent: Grep "Console\\.WriteLine"47 occurrences in 23 files]
[Agent: Read each file to determine class context]
[Agent: For each file → Edit (add ILogger field if missing,
        replace Console.WriteLine with _logger.LogInformation)]
[Agent: just build → 0 errors]
[Agent: just test → all green]

47 replacements across 23 files. All tests pass. Diff in your editor.

Onboarding #

# title: terminal
> Trace the path from clicking "Pay now" on the frontend to the
> payment record being persisted in DB. Write summary in docs/payment-flow.md.

[Agent: Glob "**/PayButton.tsx" or similar]
[Agent: Read PayButton, find onClick handler]
[Agent: Trace API call → finds POST /api/payments]
[Agent: Read PaymentsController]
[Agent: Trace through MediatR handler, domain service, repo]
[Agent: Find Insert SQL]
[Agent: Write docs/payment-flow.md with mermaid diagram + file references]

Anty-wzorce #

  • Brak zaufanego kryterium sukcesu. Agent uznaje zadanie za skończone, choć rzeczywiste zachowanie aplikacji jest popsute. Zawsze podpinaj testy lub jakieś verify w pętli.
  • Za szerokie permissions. Bash(*) to zaproszenie do kłopotów. Zawsze whitelistuj konkretne komendy.
  • Pomijanie diff review. Po zakończeniu zadania git diff w git status -s mówi ci, gdzie naprawdę zaszły zmiany. Czytanie tego trwa kilka minut, ale ratuje od silent regressions.
  • Wielowątkowe zadania bez sub-agentów. Jak prosisz o trzy niezależne rzeczy w jednym promptcie, model to serializuje. Lepiej trzy osobne sesje albo explicit prośba o spawn sub-agentów.
  • Brak CLAUDE.md. Bez kontraktu agent improwizuje. Im większy projekt, tym bardziej CLAUDE.md ratuje czas.

Skrótowo #

Claude Code to klient API Claude w trybie tool use, działający jako autonomiczny CLI agent. Tooly: Read/Write/Edit/Bash/Glob/Grep/WebFetch/Agent + dowolne MCP. Pętla ReAct z kryterium sukcesu domyka zadanie deterministycznie. Najlepiej działa, gdy ma jasne testy/lint/build jako kryteria. Anty-wzorce to brak kryterium, za szerokie permissions, pominięte review diffa.

Podobne wpisy