Przejdź do treści

INW008 missing-member

Co robi

Zgłasza pakiet, w którym brakuje elementu wymienionego w require jego [[tool.inwards.shape]]. Diagnostyka wskazuje __init__.py pakietu, a gdy go nie ma, jego pierwszy plik. require = ["__init__", "router", "service"] oznacza, że każdy pakiet wybrany przez kształt ma __init__.py, moduł albo podpakiet router i taki sam service; service.py oznacza tylko moduł, service/ tylko podpakiet. Drugi kierunek, elementy, których nie powinno być, zgłasza INW007.

Dlaczego to źle

Wymagany element to zwykle punkt wejścia, na którym polegają inni: korzeń kompozycji (composition root), router pakietu, jego publiczny serwis. Agent może go usunąć, nie dotykając żadnego importu, scalając go z innym modułem albo kasując przez Bash, i nic innego nie zawiedzie aż do uruchomienia. INW008 wyłapuje to na końcu tury, a w edytorze, gdy tylko plik zniknie.

Przykład

Warstwy z INW001, z kształtem, który wymaga modułu place w pakiecie aplikacji:

pyproject.toml
[tool.inwards]
layers = [
  { name = "domain",         modules = ["shop.domain"] },
  { name = "application",    modules = ["shop.application"] },
  { name = "infrastructure", modules = ["shop.infrastructure"] },
]

[[tool.inwards.shape]]
packages = ["shop.application"]
allow = ["cancel"]
require = ["place"]

Agent przenosi place.py do nowego cancel.py i usuwa go:

shop/application/cancel.py
import shop.domain.order
rm shop/application/place.py
inwards check
shop/application/cancel.py:1:1: INW008 Package "shop.application" has no "place" member, which its shape requires.
  fix: Create shop/application/place.py, or put back the one that was removed.
    1. If place.py was moved, renamed or deleted, restore it in shop/application/.
    2. Otherwise create shop/application/place.py for this package's place code.
    3. Don't edit [tool.inwards] yourself. If the package really doesn't need it, ask the user to change `require` in its [[tool.inwards.shape]].
  docs: https://sircypkowskyy.github.io/inwards/rules/INW008/

Po poprawce wymagany moduł wraca.

shop/application/place.py
import shop.domain.order
inwards check

Jak naprawić

  1. Jeśli element przeniesiono, przemianowano albo usunięto, przywróć go.
  2. W przeciwnym razie utwórz go, z kodem, który według roli pakietu tam należy.
  3. Jeśli pakiet naprawdę nie potrzebuje tego elementu, użytkownik zmienia require w jego kształcie. Agent pyta; nie edytuje [tool.inwards].

Bezpieczeństwo poprawki

Brak automatycznej poprawki (autofix: false). Przywrócenie pliku łatwo zautomatyzować, ale tylko człowiek albo agent, który go usunął, wie, jaka treść jest właściwa.

Konfiguracja

Poziom: błąd. require i selektory opisuje Kształt pakietu. [tool.inwards.rules] może wyłączyć regułę albo zmienić ją w ostrzeżenie (Konfiguracja reguł). INW008 nie da się wyciszyć w linii: dotyczy drzewa pakietów, a miejscem na zmianę jest konfiguracja kształtu.

W hookach Claude Code INW008 dla pakietu edytowanego pliku jest zawsze kontekstem, nigdy blokadą: agent tworzący router.py w nowym pakiecie dowiaduje się, że wciąż brakuje service.py, i może go dodać w następnym kroku. Stop gate blokuje na diagnostykach INW008, które pojawiły się od startu sesji, więc usunięcie wymaganego pliku przez Bash zostanie wyłapane. Pakiet, któremu brakowało elementu już na starcie sesji, nie blokuje, chyba że ustawiono stop-gate = "project": wtedy blokuje każda diagnostyka INW008, której nie akceptuje baseline, stara czy nowa.

Znane ograniczenia

  • inwards server zgłasza INW008 w przebiegu całego projektu, który rusza, gdy edytor go uruchamia, przy każdym zapisie i gdy pliki powstają albo znikają, a nie w trakcie pisania.
  • Nazwane szablony, warstwy ról i inwards init --style fastapi są otwarte w #97.

Źródła