Słownik¶
Słownictwo używane w tej dokumentacji. Terminy architektoniczne znaczą to, co zwykle znaczą w literaturze o DDD i czystej architekturze. Tam, gdzie Inwards używa słowa w węższym sensie, hasło o tym mówi. Hasła są w kolejności alfabetycznej oryginału angielskiego, a angielski termin podano w nawiasie.
Jak łączą się terminy architektoniczne¶
flowchart TB
subgraph outer["Interfejs / adaptery (warstwa najbardziej zewnętrzna)"]
root["Korzeń kompozycji<br/><small>łączy adaptery z portami</small>"]
api["Handlery HTTP, CLI, konsumenci"]
subgraph infra["Infrastruktura"]
db["Repozytoria SQL, klienci HTTP"]
subgraph app["Aplikacja"]
uc["Przypadki użycia / komendy"]
subgraph dom["Domena (warstwa najbardziej wewnętrzna)"]
ent["Encje, obiekty wartości"]
port["Porty (Protocols)"]
end
end
end
end
api --> uc
uc --> ent
uc --> port
db -. "implementuje" .-> port
root --> api
root --> db
Strzałki wskazują kierunek importów. Każda ciągła strzałka wskazuje do środka i to jest reguła, której pilnuje INW001. Przerywana strzałka to „implementuje”: klasa z infrastruktury spełnia Protocol, który należy do domeny.
Terminy architektoniczne¶
- Adapter
- Kod, który łączy port z prawdziwą technologią: repozytorium SQL, klient HTTP, konsument wiadomości. Adaptery żyją w warstwach zewnętrznych.
- Kontekst ograniczony (bounded context)
- Część systemu z własnym modelem i własnym językiem (DDD). W kodzie Pythona zwykle pakiet najwyższego poziomu, taki jak
billingalboshipping. Konteksty deklaruje się w[[tool.inwards.contexts]]; INW002 pozwala jednemu importować inny tylko wtedy, gdy deklaruje go jegodepends-on. - Czysta architektura (Clean Architecture)
- Podział na warstwy według Roberta C. Martina: encje w centrum, potem przypadki użycia, potem adaptery interfejsu, potem frameworki. Jej reguła zależności mówi, że zależności w kodzie źródłowym wskazują tylko do środka.
- Korzeń kompozycji (composition root)
- Jedyne miejsce, w najbardziej zewnętrznej warstwie, gdzie tworzy się konkretne adaptery i przekazuje je kodowi, który ich potrzebuje. Kroki naprawy Inwards kierują tu łączenie zależności.
- Reguła zależności (dependency rule)
- Warstwy wewnętrzne nie mogą wiedzieć o zewnętrznych. INW001 to ta reguła zastosowana do importów.
- Warstwa domeny (domain layer)
- Reguły biznesowe i słownictwo problemu, wolne od frameworków i operacji wejścia-wyjścia. W konfiguracjach Inwards zwykle wymieniana jako pierwsza.
- Architektura heksagonalna / porty i adaptery (hexagonal architecture / ports and adapters)
- Styl Alistaira Cockburna: rdzeń aplikacji rozmawia ze światem tylko przez porty, a adaptery się do nich podłączają. Inwards traktuje go jako konfigurację warstwową, w której warstwa wewnętrzna jest właścicielem portów.
- Warstwa (layer)
- W Inwards nazwany zbiór prefiksów modułów w
[tool.inwards].layers. Kolejność na liście to kolejność od środka na zewnątrz. - Port
- Interfejs, którego właścicielem jest kod wewnętrzny, a który implementuje kod zewnętrzny. W Pythonie zwykle
typing.Protocol. - Pionowy wycinek (vertical slice)
- Organizowanie kodu według funkcji (
orders/,invoices/), a nie według warstwy technicznej, przy czym każdy wycinek ma własne handlery i dostęp do danych. Wycinki nie powinny sięgać do siebie nawzajem. Każdy wycinek można zadeklarować jako kontekst, a INW002 trzyma wycinki osobno, chyba żedepends-onmówi inaczej; warstwa może objąć każdy wycinek jednym selektorem, takim jakshop.*.domain.
Terminy Inwards¶
- Hook agenta (agent hook)
- Polecenie, które narzędzie AI do kodowania uruchamia automatycznie wokół własnych działań, na przykład hooki
PostToolUseiStopw Claude Code. Główny punkt integracji Inwards.inwards init --agent claudeinstaluje cztery takie hooki. Zobacz rozdział 4. - Baseline
- Naruszenia, które projekt już miał, gdy wdrożył Inwards, zapisane przez
inwards baselinewinwards-baseline.jsonobokpyproject.toml. Nie oblewają sprawdzenia; nowe naruszenia oblewają (UC6). Wpisy są dopasowywane po regule, module i komunikacie, a nie po linii. - Config guard
- Hook
PreToolUse, który z góry odrzuca edycje agenta w[tool.inwards], w.inwards/, winwards-baseline.jsoni w ustawieniach Claude Code zawierających hooki Inwards. Zobacz rozdział 4. - Parsowanie potwierdzające (confirming parse)
- Pełne parsowanie tree-sitterem, które silnik uruchamia, gdy szkielet importów zgłasza naruszenie, żeby zgłaszane były wyłącznie prawdziwe importy. Zobacz ADR-004.
- Diagnostyka (diagnostic)
- Jedno zgłoszone naruszenie: kod, położenie, komunikat, poprawka i link do dokumentacji. Serializowana jako część
inwards/diagnostics@1. - Test różnicowy (differential test)
src/core/scripts/prescan-diff.ts. Porównuje importy znalezione przez szkielet z importami znalezionymi przez pełne parsowanie na korpusie i kończy się błędem, jeśli szkielet któryś pominie.- Silnik (engine)
@inwards/core. Czysty TypeScript, który zamienia tekst źródłowy, konfigurację i gramatyki w diagnostyki. Nie wykonuje żadnych operacji wejścia-wyjścia (ADR-006).- Eskalacja (escalation)
- To, co robią hooki, gdy to samo naruszenie przetrwa
escalate-afterprób (domyślnie 3): edycja, która osiąga limit, nie jest blokowana, Stop gate pozwala zakończyć turę po swojej ostatniej blokadzie, agent dostaje polecenie, żeby zapytać użytkownika, a to, co nierozwiązane, trafia do użytkownika i do następnej sesji. Eskalacja nie jest trwała: następna edycja z tym naruszeniem znowu jest blokowana. Zobacz rozdział 4. - Obejście (evasion)
- Zmiana kodu przez agenta, po której sprawdzenie milknie, choć projekt nie został naprawiony, na przykład przeniesienie importu do funkcji. Rozdział 4 wymienia obejścia, z którymi radzi sobie Inwards.
- Pamięć podręczna ekstrakcji (extraction cache)
.inwards/cache: to, coinwards checkiinwards baselineodczytują z każdego pliku (szkielet importów, importy statyczne i komentarze wyciszające), pod kluczem z hasha jego treści, nazwy modułu i reguł ekstrakcji. Hooki nigdy jej nie czytają; serwer języka trzyma własną w pamięci.--no-cachealboINWARDS_NO_CACHE=1ją wyłącza. Zobacz ADR-031.- Fingerprint
- 16-cyfrowy szesnastkowy hash kodu reguły, modułu i komunikatu naruszenia. Stan sesji i run log używają go, żeby rozpoznać to samo naruszenie w kolejnych edycjach, niezależnie od numeru linii.
- Kroki naprawy (fix steps)
- Uporządkowane, konkretne instrukcje naprawy dołączone do każdej diagnostyki, zbudowane z faktycznych nazw modułów i warstw.
- GrammarBinaries
- Port, przez który adaptery przekazują silnikowi środowisko uruchomieniowe tree-sittera i gramatykę Pythona jako bajty.
- Zmyślony moduł (hallucinated module)
- Import własnego modułu, który nie istnieje, taki jak
shop.domain.pricing, gdy nie ma żadnegopricing. Agenci tworzą takie importy, bo nazwa wygląda wiarygodnie. INW010 wyłapuje je na podstawie indeksu modułów, zanim uruchomi się jakikolwiek test. - Daemon hooków (hook daemon)
inwards daemon(#60): proces dla każdego użytkownika i projektu, który trzyma silnik w gotowości dla hooka PostToolUse i odpowiada mu przez lokalne gniazdo (na Windows przez nazwany potok). Hook uruchamia go na żądanie i działa jednorazowo zawsze, gdy nie może się z nim połączyć; daemon kończy pracę po 10 minutach bezczynności. Pozostałe hooki nigdy z niego nie korzystają, a serwer języka to osobny proces. Zobacz ADR-039.- Szkielet importów (import skeleton)
- Kopia pliku, w której każda linia niebędąca importem jest pusta, a linie importów mają usunięte wcięcie. Numery linii są zachowane, a parsuje się ją dużo szybciej niż cały plik.
- Indeks modułów (module index)
- To, jak silnik widzi własne moduły projektu (
Engine.index); każdy adapter przekazuje go do każdego sprawdzenia: właściciel importu, lista modułów oraz moduły importujące dowolny moduł, każde z nich wyliczane na żądanie. INW006 korzysta z właściciela; INW010 korzysta z właściciela, żeby ustalić, czy moduł istnieje, a z zawartości pakietu, w którym by się znajdował, żeby podpowiedzieć najbliższe prawdziwe moduły. - Odmowa prescanu (prescan refusal)
- Prescan rezygnuje z pliku, bo
importpojawia się w miejscu, którego nie umie wyjaśnić. Plik dostaje wtedy pełne parsowanie. Odmowę dostaje 8,3 % plików biblioteki standardowej CPythona. - Kod reguły (rule code)
INWalbo prefiks rodziny, np.FAPI(reguły FastAPI), i trzy cyfry. Kody nigdy nie są używane ponownie, a wycofana reguła zachowuje swój numer.- Release PR
- Pull request, który release-please utrzymuje otwarty z następną wersją i jej changelogiem. Scalenie go tworzy wydanie (ADR-016).
- Run log
.inwards/runs.jsonl: przy włączonym logu jedna linia na każde uruchomienie hooka alboinwards check;inwards check --logdopisuje linię nawet wtedy, gdy log jest wyłączony. Każda linia zawiera czas, zdarzenie, pliki, dodane i usunięte linie, fingerprinty naruszeń, kod wyjścia i czas trwania. Lokalny i domyślnie wyłączony. Zasila metryki design partnerów. Zobacz rozdział 8.- Stan sesji (session state)
- To, co hooki Claude Code zapisują dla każdej sesji w
.inwards/state/: migawkę stanu początkowego (HEAD, każdą tabelę[tool.inwards], hash każdego pliku Pythona) i jedną linię na edycję. Zawsze włączony i lokalny. Czytają go Stop gate i eskalacja. - Stop gate
- Sprawdzenie uruchamiane z hooka
Stopagenta. Sprawdza każdy plik Pythona zmieniony w sesji oraz to, czy konfiguracja i hooki są wciąż nienaruszone, i nie pozwala agentowi zakończyć tury, dopóki tak nie jest. - Wyciszenie (suppression)
- Komentarz w linii, na którą wskazuje diagnostyka,
# inwards: ignore[INW001] reason="why", który ukrywa tę diagnostykę. Powód jest obowiązkowy, każdy raport liczy wyciszenia, a hooki Claude Code domyślnie pomijają wyciszenie dodane przez agenta w trakcie sesji. Zobacz ADR-028.
Terminy narzędziowe¶
- Model C4 (C4 model)
- Cztery poziomy diagramów architektury według Simona Browna: kontekst, kontenery, komponenty, kod. Ta dokumentacja używa pierwszych trzech.
- LSP
- Language Server Protocol. Przez niego rozszerzenie VS Code dostaje diagnostyki z serwera języka Inwards.
inwards serverobsługuje go przez stdio z pliku binarnego, dla każdego edytora; rozszerzenie przełączy się na niego w #64. Zobacz ADR-041. - MCP
- Model Context Protocol. Pozwala agentowi AI wywoływać zewnętrzne narzędzia.
inwards mcpudostępnia trzy z nich przez stdio:check_files,explain_ruleiwhere_should_this_go(poradnik). - SARIF
- Static Analysis Results Interchange Format 2.1.0, format JSON dla wyników analizy. Przyjmuje go GitHub code scanning.
- tree-sitter
- Generator parserów przyrostowych z gramatykami dla wielu języków. Inwards używa jego wersji WASM (
web-tree-sitter) ztree-sitter-python. - Zensical
- Generator stron statycznych, który buduje tę dokumentację, od zespołu stojącego za Material for MkDocs.