Pod koniec marca 2026 do sieci wyciekł kod źródłowy Claude Code - narzędzia CLI Anthropic do kodowania z AI. Wyciek wywołał sporo dyskusji, ale przede wszystkim pozwolił zajrzeć pod maskę najlepszego agenta kodującego na rynku.
Jak doszło do wycieku
Ktoś z Anthropic chciał usunąć wersję pakietu z rejestru NPM, ale zamiast npm unpublish użył npm deprecate. Różnica jest kluczowa - unpublish usuwa pakiet, deprecate tylko oznacza go jako przestarzały, ale pliki zostają. W paczce znajdował się plik source map (.map), który zawierał pełny kod źródłowy.
Ironia losu - prawdopodobnie komendę wykonał agent AI, który wybrał bezpieczniejszą opcję (deprecate) zamiast destrukcyjnej (unpublish). Idealny przykład tego, jak AI czasem interpretuje polecenia po swojemu.
Skala projektu
Kod ujawnił projekt znacznie większy niż ktokolwiek zakładał:
- Ponad 500 000 linii kodu TypeScript
- 564 plików narzędziowych, 389 komponentów, 189 komend
- 50+ narzędzi wbudowanych (tools)
- 72 komendy slash
- Dla porównania - OpenCode (open-source’owy odpowiednik) to ok. 113 000 linii
Agent loop - jak działa pod spodem
Każda wiadomość w Claude Code przechodzi przez 11-etapową pętlę:
- Użytkownik wpisuje tekst (komponent Ink/React do ANSI)
- Wiadomość jest formatowana z kontekstem
- Historia konwersacji jest ładowana i filtrowana
- System prompt jest składany (CLAUDE.md, reguły, pamięć)
- Request leci do API
- Tokeny są streamowane
- Model decyduje czy użyć narzędzia
- Jeśli tak - narzędzie się wykonuje i pętla wraca do kroku 5
- Odpowiedź jest renderowana (React -> ANSI, ~16ms frame budget jak w grze)
- Hooki się odpalają (pre/post tool call)
- Czeka na kolejny input
To bardziej przypomina mały silnik gry niż typowe CLI.
System narzędzi
Narzędzia podzielone na kategorie:
Operacje na plikach - FileRead, FileEdit, FileWrite, Glob, Grep, NotebookEdit
Wykonywanie kodu - Bash, PowerShell, REPL
Wyszukiwanie - WebFetch, WebSearch, ToolSearch
Agenci i zadania - Agent (subagenty), SendMessage, TaskCreate/Update/Stop, TeamCreate, ListPeers
Planowanie - EnterPlanMode, ExitPlanMode, EnterWorktree (izolowane git worktree), ExitWorktree
MCP - pełna obsługa Model Context Protocol
System - AskUserQuestion, TodoWrite, Skill, Config, RemoteTrigger, Cron
Kluczowa decyzja architektoniczna - narzędzia po stronie klienta są proste i generyczne. Cała inteligencja siedzi w system prompcie i po stronie serwera. Dzięki temu mogą dodawać nowe zachowania bez aktualizacji klienta.
Zarządzanie kontekstem
Jeden z najbardziej dopracowanych elementów. Trzy poziomy kompakcji:
- Pełna kompakcja z podsumowaniem przez API (gdy kontekst się zapełnia)
- Kompakcja pamięci sesji z wyciąganiem kluczowych informacji
- Mikrokompakcja - czyści stare wyniki narzędzi po >1 godzinie bezczynności
Pełna historia jest zapisywana lokalnie w plikach JSONL (append-only), ale do API lecą tylko wiadomości po ostatniej kompakcji. Flagi na wiadomościach (isCompactSummary, isVisibleInTranscriptOnly, isMeta) kontrolują co widzi API, a co zostaje lokalne.
Nieujawnione funkcje
W kodzie znaleziono kilka niewyslanych ficzerów:
- Kairos - tryb persystentny z konsolidacją pamięci między sesjami i autonomicznymi akcjami w tle
- Buddy - wirtualny zwierzak w terminalu (tamagotchi). Gatunek i rzadkość zależą od ID konta
- UltraPlan - długie sesje planowania na modelach klasy Opus, do 30 minut wykonania
- Coordinator Mode - główny agent rozbija zadanie na części, odpala równoległych workerów w izolowanych git worktree, zbiera wyniki
- Bridge - zdalne sterowanie Claude Code z telefonu lub przeglądarki, z zatwierdzaniem uprawnień
-
Daemon Mode - sesje w tle przez tmux (
--bg) - Auto-Dream - między sesjami AI przegląda co się wydarzyło i organizuje wiedzę
- Undercover Mode - ukrywa informacje o AI w commitach i PR-ach
Jakość kodu
Tu było sporo kontrowersji. Główny plik src/cli/print.ts ma jedną funkcję na 3167 linii obsługującą pętlę agenta, autentykację, rate limiting i zarządzanie pluginami. 12 poziomów zagnieżdżenia, cyklomatyczna złożoność ~486.
Część komentatorów twierdzi, że to efekt “vibe codingu” - kod generowany przez AI, który działa ale jest ciężki do utrzymania. Inni argumentują, że przy probabilistycznym LLM-ie trzeba mieć tony defensywnego kodu - regexy na frustrację, sanitizery kontekstu, pętle retry narzędzi, rollbacki stanu. Pragmatycy zwracają uwagę, że produkt działa i jest najlepszy na rynku, więc jakość kodu jest drugorzędna.
Czym Claude Code różni się od open-source’owych alternatyw
Po zobaczeniu kodu widać kilka kluczowych przewag:
Zarządzanie kontekstem jest o klasę lepsze. OpenCode czy Aider nie mają wielopoziomowej kompakcji ani inteligentnego filtrowania historii. Claude Code traktuje okno kontekstowe jak zasób do zarządzania, nie jako prostą kolejkę wiadomości.
System subagentów pozwala na równoległe wykonywanie zadań w izolowanych worktree. Open-source’owe narzędzia działają sekwencyjnie.
Hooki (pre/post tool call) dają użytkownikowi kontrolę bez modyfikacji kodu. W OpenCode trzeba forkować repo.
Orkiestracja narzędzi - 50+ narzędzi z granularnym systemem uprawnień, lazy loading schematów (ToolSearch), integracja z MCP. OpenCode ma ich kilkanaście.
UI jako silnik gry - rendering React do ANSI z 16ms budżetem na klatkę. Inne CLI-owe agenty używają prostego stdout.
Z drugiej strony, OpenCode ma 4.5x mniejszy codebase i jest łatwiejszy do zrozumienia i modyfikacji. Dla kogoś kto chce pełnej kontroli nad narzędziem, open-source nadal ma sens.
Reakcja Anthropic
Anthropic nie skomentował wycieku oficjalnie. Przedstawiciel firmy na HN potwierdził jedynie, że kontrowersyjny “undercover mode” można wyłączyć w ustawieniach i że istnieją uzasadnione powody jego istnienia (np. integracja Claude Code w własnych serwisach).
Claude Code vs OpenCode - porównanie funkcji
Po wycieku kodu widać dokładnie, co Claude Code ma pod maską i gdzie się różni od OpenCode (open-source’owa alternatywa w Go).
Dane ogólne
| — | Claude Code | OpenCode |
|---|---|---|
| Język | TypeScript (500K LOC) | Go (113K LOC) |
| UI | React/Ink -> ANSI (~16ms frame budget) | Bubble Tea TUI |
| Baza danych | JSONL (append-only, lokalne pliki) | SQLite |
| Licencja | Proprietary | MIT |
| Providery | Tylko Anthropic | OpenAI, Anthropic, Google, Groq, AWS Bedrock, Azure, GitHub Copilot |
| Status | Aktywny rozwój | Archiwum (kontynuacja jako Crush) |
Funkcje - punkt po punkcie
| Funkcja | Claude Code | OpenCode | CC | OC |
|---|---|---|---|---|
| Edycja plików | FileEdit z diff-based patching, FileWrite, NotebookEdit | Edycja plików przez narzędzia AI | 9 | 6 |
| Wyszukiwanie w kodzie | Glob + Grep + ToolSearch (lazy loading schematów) | Wyszukiwanie plików | 9 | 5 |
| Wykonywanie komend | Bash + PowerShell + REPL, granularne uprawnienia | Bash/shell z dialogiem uprawnień | 8 | 6 |
| Zarządzanie kontekstem | 3 poziomy kompakcji (pełna, pamięć sesji, mikro). Flagi na wiadomościach, append-only JSONL | Auto-kompakcja przy 95% okna kontekstowego | 10 | 5 |
| System subagentów | Agent tool - równoległe zadania w izolowanych git worktree, SendMessage między agentami | Brak subagentów | 9 | 0 |
| Planowanie | EnterPlanMode, ExitPlanMode, worktree do izolacji, UltraPlan (do 30 min) | Brak dedykowanego trybu planowania | 9 | 0 |
| MCP (Model Context Protocol) | Pełna obsługa - narzędzia, zasoby, auth | Obsługa serwerów stdio z env variables | 8 | 5 |
| LSP (Language Server) | Eksperymentalne (flagowane) | Wbudowane, konfigurowalne per język | 4 | 7 |
| Hooki (pre/post tool) | Tak - definiowalne w ustawieniach, blokują lub modyfikują wywołania | Brak | 8 | 0 |
| Pamięć między sesjami | CLAUDE.md + memory system + Auto-Dream (niewyslany) | SQLite z historią sesji | 8 | 4 |
| System uprawnień | Granularny - per narzędzie, per wzorzec komendy, allowlist/denylist | Dialog allow/deny per wywołanie | 9 | 5 |
| Komendy slash | 72 komendy (/compact, /plan, /commit, /review, /voice…) | Komendy przez Ctrl+K dialog | 9 | 4 |
| Tryb nieinteraktywny | Tak (piped stdin) | Tak (-p flag, JSON output) | 7 | 7 |
| Integracja z Git | /commit, /diff, /pr_comments, /branch, izolowane worktree | Brak natywnej integracji | 9 | 0 |
| Web fetch/search | WebFetch + WebSearch wbudowane | Brak (możliwe przez MCP) | 7 | 2 |
| Wybór modelu | Ograniczony do Claude (Opus, Sonnet, Haiku) | Dowolny provider, konfigurowalne per agent | 3 | 9 |
| Konfiguracja | CLAUDE.md + settings.json + rules/ | .opencode.json, wielopoziomowa (home/XDG/local) | 7 | 7 |
| Rendering UI | React do ANSI z budżetem klatek, markdown w terminalu | Bubble Tea z vim-like edytorem | 8 | 7 |
| Praca zdalna | Bridge (telefon/przeglądarka), Daemon mode (tmux) | Brak | 7 | 0 |
Podsumowanie ocen
| — | Claude Code | OpenCode |
|---|---|---|
| Średnia ocena | 7.8 / 10 | 3.8 / 10 |
| Najsilniejsze strony | Kontekst, subagenty, planowanie, git, hooki | Multi-provider, LSP, prostota, otwartość kodu |
| Najsłabsze strony | Tylko modele Claude, closed-source | Brak agentów, planowania, hooków, gita |
Claude Code wygrywa zdecydowanie w złożonych scenariuszach - tam gdzie trzeba rozdzielić pracę na subagentów, zaplanować wieloetapowe zadanie albo utrzymać kontekst przez długą sesję. OpenCode jest prostszy i bardziej elastyczny jeśli chodzi o wybór modelu, ale brakuje mu zaawansowanych mechanizmów które robią różnicę przy dużych projektach.
OpenCode istnieje w dwóch wersjach - oryginalna (opencode-ai) została zarchiwizowana i kontynuowana jako Crush, ale aktywna wersja od Anomaly (anomalyco/opencode) ma 135K gwiazdek i jest rozwijana.
Źródła
- Wątek HN - źródło wycieku
- Dyskusja o architekturze
- Analiza undercover mode
- Claude Code Unpacked - interaktywna wizualizacja architektury
- OpenCode - strona projektu OpenCode
- OpenCode repo - kod źródłowy (135K gwiazdek)
- OpenCode (starsza wersja) - archiwum, kontynuacja jako Crush