Dwanaście dni od „jeśli tego chcecie" do Tetrisa
Claude Code Mods to moduły TypeScript, które działają wewnątrz silnika Claude Code i podpinają się pod jego zdarzenia jako funkcje. Boris Cherny, który kieruje Claude Code w Anthropic, ogłosił je pięcioma słowami: „Claude mods are landing now". Wpis zebrał 2400 polubień, a ktoś zdążył już zbudować Tetrisa wewnątrz terminala. Tetris, Doom i zwierzak, który rośnie, gdy Claude uruchamia twoje testy — wszystko renderowane nad promptem, przy zerowym zużyciu tokenów.
Ogłoszenie nie odsyła do żadnej strony dokumentacji. Odsyła do zgłoszenia na GitHubie otwartego 12 dni wcześniej przez inżyniera Anthropic, z jednym zastrzeżeniem wpisanym wprost. Alice Poteat napisała, że reakcja społeczności najpewniej zdecyduje, czy funkcja w ogóle trafi do produktu. 177 komentarzy później ludzie przetestowali flagowany plik binarny, zmierzyli jego limity czasowe i zbudowali na nim gry.
| Miara | Wartość |
|---|---|
| Polubienia ogłoszenia | 2400 |
| Komentarze pod zgłoszeniem na GitHubie | 177 |
| Powierzchnia typów w tegotygodniowym buildzie | 10 700 linii |
| Zdarzenia na rzeczownikach (build z wątku zgłoszenia) | 84 na 19 |
| Modów na GitHubie w ciągu 48 godzin | 31 |
Strona dokumentacji w chwili pisania zwraca błąd 404. Ten artykuł omawia cztery sposoby rozszerzania Claude Code, jeden użyteczny Mod zbudowany i celowo zepsuty, oraz to, co wciąż jest niestabilne, zanim wyślesz swój własny.
Mod to funkcja pośrodku
Drzewo źródłowe definiuje go w jednym zdaniu: Mod to plugin Claude Code, którego zachowanie mieszka w module hooks. Jeden wpis rejestrujący podpina zdarzenia silnika jako funkcje. Na dysku to folder pluginu, manifest hooks wskazujący dokładnie jeden moduł i sam moduł.
Każdy hook jest funkcją trzech rzeczy: $, drzwi, przez które przechodzi każdy efekt uboczny; zdarzenia; oraz kontynuacji, czyli reszty łańcucha poniżej ciebie. Hooki zagnieżdżają się jak middleware. Ten zarejestrowany jako pierwszy przejmuje zdarzenie i nic dalej w łańcuchu nie może go zablokować. Ta kolejność jest konfigurowana, nie instalowana. Jak ujęła to Alice Poteat, kolejność ustala konfiguracja, nie moment instalacji.
Nie ma dostępu otoczeniowego. Wszystko, co robi Mod, przechodzi przez $, więc administrator może każde zdarzenie audytować, zezwolić na nie, odmówić lub zalogować. Jeden z komentujących podsumował to tak: to, co zrobił plugin, to dokładnie te wywołania, które wykonał. Pojedynczy hook na * widzi każde zdarzenie, więc dziennik audytu to jedna funkcja. Mod może rysować, bo interfejsem jest React. Działa w procesie na Bunie, przy 50 mikrosekundach na 99. percentylu. Jedna zmienna środowiskowa go włącza. To, co faktycznie znajdzie się na $, wciąż jest projektowane razem z partnerami wczesnego dostępu.
Cztery sposoby na rozszerzenie Claude Code i który do czego
Shell hook to skrypt wywoływany przez silnik w ustalonym momencie. Dostaje JSON na standardowym wejściu i odpowiada kodem wyjścia. Odpowiedź ma sufit: 8000 znaków kontekstu z powrotem, a dla niektórych hooków 2000. Jak ujął to Pratham, na Windowsie potrafią psuć się w dziwaczny sposób.
Plugin to pudełko. Jeden manifest pakuje skills, agentów, hooki i serwery MCP. Instaluje się go z marketplace'u albo ładuje bezpośrednio z folderu na dysku, a jedna komenda waliduje pudełko, zanim cokolwiek się uruchomi.
Skill to proza, którą model czyta, gdy jej potrzebuje. Treść ładuje się tylko wtedy, gdy nadejdzie pasujący prompt. Pozostaje najtańszym sposobem na zmianę zachowania.
Mod to to samo pudełko z jednym plikiem więcej: manifestem hooks wskazującym moduł, a ten moduł jest napisany w TypeScripcie, typowany, działa w procesie, na każdym zdarzeniu silnika. To cała różnica.
| Mechanizm | Czym jest | Działa | Sufit |
|---|---|---|---|
| Shell hook | Skrypt wywoływany w ustalonym momencie | Podproces, kod wyjścia | 8000 znaków z powrotem (2000 dla niektórych hooków) |
| Plugin | Pakiet skills, agentów, hooków, serwerów MCP | Instalowany lub ładowany z dysku | Walidowany przed uruchomieniem |
| Skill | Proza ładowana przy pasującym poleceniu | W kontekście modelu | Najtańsza zmiana |
| Mod | Plugin plus moduł hooks w TypeScripcie | W procesie, na każdym zdarzeniu | Typowany, wczesny dostęp |
Typy pochodzą z jednej komendy slash, która zapisuje pełną listę tego, co oferuje $, bezpośrednio do twojego projektu. Stare shell hooki są opakowane, nie wycofane. Na wczesnym buildzie Spencer Morley zobaczył, jak wrapper nie ładuje się, a mimo to pozostaje zadeklarowany. Zasada kciuka: żeby zmienić, co Claude wie — pisz skill; żeby uruchomić skrypt w danym momencie — shell hook; żeby wysłać pakiet — plugin; żeby usiąść wewnątrz silnika — Mod. Shell hook wciąż działa wszędzie tam, gdzie flaga jest wyłączona.
Trzy własne Modu Anthropic, czytane ze źródła
Trzy Modu są wbudowane w plik binarny, a ich źródło jest na GitHubie: domyślne zabezpieczenie, panel diffów i telemetria.
Domyślne zabezpieczenie siedzi najbardziej na zewnątrz. Na maszynie z zarządzanymi ustawieniami, albo w organizacji Team lub Enterprise, nic, co instaluje osoba, nie może się nad nim znaleźć. Podpina się pod 12 zdarzeń, a każdy hook wykonuje jeden z trzech ruchów: przechodzi dalej poza warstwę użytkownika, odmawia wywołującemu z warstwy użytkownika po nazwie, albo przepuszcza. Zawodzi domknięte, a komentarz w dokumentacji mówi to wprost dwoma słowami. To właśnie ta część interesowała wątek: administrator usuwa uprawnienie z $, i nic zarejestrowanego poniżej nie może go już wywołać. Jak ujął to jeden z komentujących, to kategorycznie coś innego niż proszenie pluginu, żeby czegoś nie robił.
Diff to panel obok transkryptu, pokazujący nie zatwierdzone zmiany sesji plik po pliku, odświeżany w miarę edycji Claude'a. Rejestruje się na starcie sesji i obejmuje 27 plików pomocniczych — to nie jest zabawka.
Telemetria dodaje rzeczownik do $ już z wnętrza tworzenia silnika. Czeka na to, co poniżej, i zwraca to plus siebie samą. Działa tylko w buildach wewnętrznych.
README każe uruchomić jeden mod ze źródła i przetestować jeden ze źródła. Pomoc w dzisiejszym buildzie wymienia validate, eval i details. Na liście nie ma test, mimo że pomoc dla test wciąż odpowiada. Wbudowana warstwa też odrzuca twoją kopię: wyślij plugin pod jedną z tych nazw, a binarka wczyta swoją własną.
Czterdzieści dwie linijki: Mod, który ukrywa sekrety przed modelem
Komenda slash, która zapisuje typy, produkuje w tym buildzie 11 700 linii: 84 zdarzenia na 23 rzeczownikach. Hook wywołania narzędzia odpowiada wynikiem albo odmową, nigdy tekstem. To ustala rdzeń.
Mod to trzy pliki: manifest pluginu, manifest hooks z jedną linią, i sam moduł. Moduł ma 42 linijki. Czeka na to, co poniżej, czyści wynik i oddaje go z powrotem. Cztery wzorce pokrywają dwa kształty kluczy dostawców, token GitHuba i wszystko przypisane do zmiennej o nazwie key, secret albo token.
Validate czyta źródło, zanim się uruchomi. Nazywa zdarzenie, pod które podpina się moduł, i tę jedną rzecz, którą wywołuje na $. Jedynym ostrzeżeniem jest brakujący autor. Załadowany z dysku z włączoną flagą, plik testowy zawiera dwa klucze, oba fałszywe z założenia, a model odczytuje „redacted". Jego własnymi słowami: wartości wróciły jako redacted, więc nie widzi, co w nich jest.
| Miara | Wartość |
|---|---|
| Długość modułu | 42 linijki |
| Opóźnienie skoku, z workerem włącznie | 28 ms |
| Tokeny dodane do sesji | 0 |
Silnik loguje skok jako rozwiązany przez moduł hooks. Inwentarz nie pokazuje żadnych skills, żadnych agentów, nic stale włączonego. Zostaje jedno ograniczenie: ukryte przed modelem nie znaczy ukryte przed ekranem. Transkrypt wciąż pokazuje to, co wydrukowało narzędzie. To już inny Mod, jak zauważył jednym zdaniem Max z Ship Notes.
Zepsuj to: powolny strażnik to ominięty strażnik
Ten sam Mod, jedna dodana linia: 15-sekundowe uśpienie przed wywołaniem tego, co poniżej. Dziesięć sekund później silnik rezygnuje z niego, zgłasza, że hook przekroczył swój budżet i został pominięty, a to, co jest pod nim, uruchamia się na jego miejsce. Komenda i tak się wykonuje i wypisuje „hi".
Zastąp uśpienie rzuceniem wyjątku: 574 milisekundy, ten sam werdykt — pominięty, a komenda się wykonuje.
| Przypadek | Czas | Werdykt |
|---|---|---|
| Zdrowy hook | 28 ms | Rozwiązany |
| Rzucony wyjątek | 574 ms | Pominięty, komenda się wykonała |
| Zawieszenie | ponad 10 s | Pominięty, komenda się wykonała |
Obie awarie kończą się tym samym słowem: pominięty. Wątek zmierzył tę asymetrię tydzień wcześniej. Uprawnienie brakujące przy wczytaniu zawodzi domknięte. Hook, który przekroczył budżet, zawodzi otwarte: głośno, ale ominięty, jak ujął to Spencer Morley. Blokada bez powodu po prostu wysyła model do innego narzędzia. Pratham obserwował, jak model wybiera inne narzędzie i mimo to zapisuje plik.
Odpowiedzią na stole jest catch. Alice Poteat proponuje catch na zwrocie hooka, który uruchamia się, gdy trwa to zbyt długo albo gdy pada wyjątek. Przepisany zapis wciąż potrzebuje notatki dla modelu: widzi on to, co poprosił o zapisanie, z powodów cache'owania, więc dopisujesz linię kontekstu. Budżet to też izolacja. Worker hooków działa osobno, a gdy się wywali, silnik go respawnuje i wyłącza hooki na czas sesji. Naprawą nie jest dłuższy budżet, tylko zadeklarowany catch.
Czterdzieści osiem godzin Modów i co kupuje jedno zdanie
Dwa dni później: Tetris nad promptem i siedem innych gier, grywalnych, podczas gdy Claude pracuje, przy zerowym zużyciu tokenów. Doom, oryginał z 1993 roku, działa we własnym procesie; Mod sięga po niego przez lokalne HTTP i odświeża obraz 10 razy na sekundę. Jest pacer oddechu w spinnerze i model narracyjny z 260 000 parametrów działający wewnątrz workera hooków, przy zerowym zużyciu tokenów API.
Rejestr przeskanował 31 Modów za pomocą validate. 14 z nich potrafi uruchamiać procesy hosta. 13 widzi każde wywołanie narzędzia.
Demo 8 z wątku społeczności obiecywało, że jedno zdanie napisze plugin, który ukrywa sekrety, zanim przeczyta je model. Poprosiliśmy o jedno.
| Miara | Wartość |
|---|---|
| Czas | 4 min |
| Tury | 34 |
| Koszt | 1,23 USD |
| Linijki (plus plik testowy) | 190, wobec naszych 42 |
| Testy | 4 przechodzą w jedną trzecią sekundy |
Etykietuje to, co ukrywa, według rodzaju, waliduje się czysto i nie potrzebuje ani klucza API, ani wywołania modelu. Jedna z odpowiedzi ujęła to tak: listy dozwolonych to produkt, Tetris to demo.
Werdykt: zbuduj jeden teraz, wyślij jeden później
Same liczby z rejestru są ostrzeżeniem. 14 z 31 Modów potrafi uruchamiać procesy hosta, a jedynym sprawdzeniem jest statyczny odcisk. Pomoc eval mówi to wprost: przechodzący zestaw testów to nie audyt bezpieczeństwa.
| Sygnał | Wartość |
|---|---|
| Zdarzenia 8. dnia | 20 |
| Zdarzenia 15. dnia | 84 |
| Wersje CLI w dwa tygodnie | 14 |
| Punkty na Hacker News | 2 |
| Odpowiedzi na pytanie o kompatybilność | 0 |
10-sekundowy budżet mieszka w runtime, nie w typach, jak zauważył Marat. Nie ma linii w changelogu, strony dokumentacji ani posta ogłaszającego. Konkurent twierdzi, że Anthropic to skopiował: Ahmad Awais wskazuje na mody Command Code i pisze ich przykładowy mod, więc oceń to sam. Post „wczesny dostęp, API może się zmienić" zebrał 357 polubień.
Zbuduj jeden teraz, jeśli już piszesz hooki i chcesz audytu, redakcji albo panelu. Poczekaj, jeśli wysyłasz coś do zespołu, zanim kontrakt zostanie spisany. Ta sama otwartość sprawiła, że budżet, który zawodzi otwarte, niezgodność typu wywołania MCP i awaria wrappera zostały znalezione przez użytkowników w ciągu kilku dni.
AIDive