Prawo polskie z oficjalnego API ELI Sejmu
Skill do pracy z prawem polskim — przy każdym pytaniu prawnym oraz przy tworzeniu i analizie umów
i pism procesowych: wszędzie tam, gdzie trzeba przywołać przepis, zweryfikować podstawę prawną, termin
lub procedurę. Cytowanie przepisów z pamięci albo z nieoficjalnych portali jest zawodne (zmiany,
nowelizacje, błędne sygnatury) — ten skill sięga do źródła pierwotnego: oficjalnego API ELI Sejmu
(https://api.sejm.gov.pl/eli), czyli Dziennika Ustaw (DU) i Monitora Polskiego (MP).
Używaj go, zanim podasz brzmienie przepisu, sygnaturę albo stwierdzisz, że coś „obowiązuje".
Kolejność źródeł (przepis ≠ internet)
- Treść przepisu — wyłącznie z ELI. Nigdy nie cytuj brzmienia polskiego przepisu z pamięci ani
z portali (arslege.pl, lexlege.pl, infor.pl, LEX itp.). Jeśli wynik wyszukiwania internetowego
podał brzmienie przepisu — zweryfikuj je przez
eli.py, zanim go użyjesz w odpowiedzi.
- Internet — tylko do orzecznictwa, doktryny i identyfikacji aktów. Komentarze, wyroki, nazwy
ustaw — tak; po identyfikacji wróć do ELI po tekst przepisu.
- Pytanie bez wskazanego przepisu („czy jest podstawa, by…", „czy mogę wnieść o…", „jaki mam
termin na…") to też zadanie dla tego skilla — nie zaczynaj od wyszukiwarki. Najpierw ustal
WŁAŚCIWĄ PROCEDURĘ z rodzaju sprawy (pozew/pozwany → k.p.c.; oskarżony/akt oskarżenia → k.p.k.;
decyzja organu → k.p.a.; podatki → Ordynacja podatkowa), pobierz kandydackie przepisy z ELI
(
struktura --filtr, tekst --fragment), dopiero potem ewentualnie internet po orzecznictwo.
Pomylenie procedury (np. art. 37 k.p.k. w sprawie cywilnej zamiast art. 44¹ k.p.c.) to typowy
skutek zaczynania od wyszukiwarki — portale rankują pod hasła, nie pod rodzaj sprawy.
- Delegując research subagentowi, wpisz do jego promptu: „treść polskich przepisów pobieraj
wyłącznie przez
scripts/eli.py (skill prawo-pl-eli); internet tylko do orzecznictwa i doktryny".
Narzędzie
Wszystko robi helper scripts/eli.py (tylko biblioteka standardowa Pythona — bez instalacji; opcjonalnie
program pdftotext z pakietu poppler w PATH — potrzebny TYLKO do aktów, dla których API nie ma HTML, np.
Konstytucja i świeże teksty jednolite; bez niego działa --pdf).
Skrypt leży obok tego pliku SKILL.md (<katalog skilla>/scripts/eli.py) — NIE zakładaj, że to
~/.claude/skills/prawo-pl-eli (skill zainstalowany jako plugin leży w katalogu pluginów; w Claude
Code: ${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-eli). Uruchamiaj wyłącznie helper z bieżącego pakietu:
# 1) Claude Code: przy ładowaniu skilla podstawia ${CLAUDE_PLUGIN_ROOT} (pełna ścieżka poniżej).
ELI="${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-eli/scripts/eli.py"
# 2) Codex / Claude Desktop / instalacja ręczna: katalog TEGO pliku SKILL.md (Claude Code podaje go
# jako „Base directory for this skill”, Codex w liście skilli) — podstaw go zamiast <katalog skilla>.
[ -f "$ELI" ] || ELI="<katalog skilla>/scripts/eli.py"
# 3) Piaskownica (Cowork, czat z code execution): katalog pluginu bywa NIEWIDOCZNY dla powłoki — wtedy
# pobierz DOKŁADNIE tę wersję helpera (tag = wersja z nagłówka tego pliku). Suma SHA-256 jest
# sprawdzana w kodzie przed zapisem i przed każdym uruchomieniem; niezgodna = helper nie startuje.
[ -f "$ELI" ] || ELI=$(python3 - <<'EOF'
import hashlib, os, sys, urllib.request
WERSJA, SHA256 = "2.0.1", "8e7538bd55620b0c8ba33f9e67e227c0a403440923f1bd917e6f3e2eb9199604"
URL = f"https://raw.githubusercontent.com/jamarpl21/prawo-pl-eli/v{WERSJA}/plugins/prawo-pl-eli/skills/prawo-pl-eli/scripts/eli.py"
p = os.path.join(os.environ.get("TMPDIR", "/tmp"), f"prawo-pl-eli-{WERSJA}", "eli.py")
try:
dane = open(p, "rb").read() if os.path.exists(p) else urllib.request.urlopen(URL, timeout=30).read()
except Exception as e:
sys.exit(f"BŁĄD: nie udało się pobrać helpera ({e}). Bez helpera NIE cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")
if hashlib.sha256(dane).hexdigest() != SHA256:
os.path.exists(p) and os.remove(p)
sys.exit("BŁĄD: suma SHA-256 helpera nie zgadza się z SKILL.md — helper NIE zostanie uruchomiony. Nie cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")
os.makedirs(os.path.dirname(p), exist_ok=True); open(p, "wb").write(dane); print(p)
EOF
) && [ -f "$ELI" ] || exit 1
python3 "$ELI" <komenda> [...]
Nie szukaj helpera przez find po katalogach użytkownika ani systemu i nie pobieraj go z żadnego innego źródła niż przypięty tag z sumą wyżej (żadnego main, żadnej innej wersji z cache) — inna wersja helpera to inne wyniki.
(W przykładach niżej python3 scripts/eli.py oznacza python3 "$ELI", jeśli nie jesteś w katalogu skilla.)
Sygnaturę można podać w wielu formach: DU 2000 1037, DU/2024/18, "Dz.U. 2024 poz. 18",
"Dz.U. 1997 nr 78 poz. 483", WDU20240000018, albo DU/2000/1037 (ELI).
Komendy
- szukaj — znajdź akt po tytule/typie/roku/haśle:
python3 scripts/eli.py szukaj "Kodeks spółek handlowych" --typ Ustawa --limit 5
(opcje: --typ, --rok, --wyd DU|MP, --haslo, --obowiazujace, --limit, --offset)
- meta — metadane aktu (tytuł, typ, status, daty, czy obowiązuje, hasła, ELI, pliki tekstu):
python3 scripts/eli.py meta DU 2000 1037
Daty są rozdzielone, bo API ma dwa różne pola: „Data aktu" (announcementDate = data wydania,
„z dnia …" w tytule) i „Ogłoszono" (promulgation = publikacja w Dz.U./M.P. — od niej liczy się
vacatio legis); dalej „WEJŚCIE W ŻYCIE", „Stan prawny na" (legalStatusDate, tylko t.j.) i
„Uwagi" (comments — np. „art. 5 ust. 4 … wchodzą w życie z dniem 25 grudnia 2024 r.", czyli RÓŻNE
daty wejścia w życie dla różnych jednostek; czytaj je zawsze).
- tj — znajdź AKTUALNY TEKST JEDNOLITY dla aktu (posortowane, najnowszy oznaczony; na starym t.j. ostrzega o nowszym):
python3 scripts/eli.py tj DU 2000 1037
- tekst — treść aktu (z
text.html → czysty tekst; gdy API nie ma HTML dla aktu — textHTML=false,
np. Konstytucja, k.c. DU 2026 795 — z jego WŁASNEGO urzędowego PDF przez pdftotext -layout, z nagłówkiem
„tekst z urzędowego PDF przez pdftotext" i linią ELI_TEXT_SOURCE_PDF=…). Do pojedynczego przepisu używaj --fragment
(wycina tylko jednostki z frazą — pełny kodeks to setki tysięcy znaków):
python3 scripts/eli.py tekst DU 2024 18 --fragment "art. 299" (trafia w nagłówek artykułu, nie w odesłania)
python3 scripts/eli.py tekst DU 2024 18 --fragment "przedawnienie" (wyszukiwanie pełnotekstowe)
--pdf ŚCIEŻKA zapisuje urzędowy PDF (preferuje tekst jednolity). Indeks górny podawaj w nawiasie
albo unicodem: art. 299¹ → --fragment "art. 299(1)" lub "art. 299¹"; sufiks literowy normalnie:
"art. 66c". Nagłówki przepisów niedawno dodanych lub zmienionych mają w tekście jednolitym
odsyłacz do przypisu („Art. 66c 6)Dodany przez…") — --fragment to obsługuje.
„Nie znaleziono frazy" NIE znaczy, że przepisu nie ma w akcie (zwłaszcza przy nietypowym
oznaczeniu jednostki): sprawdź jeszcze samym numerem (--fragment "66c") albo słowem z treści,
zanim napiszesz, że przepis nie istnieje. Gdy nagłówka nie ma, narzędzie samo pokazuje trafienia
pełnotekstowe z ostrzeżeniem — mogą to być odesłania z innych przepisów, nie sam przepis.
- struktura — spis jednostek redakcyjnych (tytuły/działy/rozdziały/artykuły):
python3 scripts/eli.py struktura DU 2024 18 --filtr "Art. 299" (opcje: --filtr, --poziom N)
- odniesienia — powiązania: nowelizacje, podstawa prawna, tekst jednolity, akty wykonawcze:
python3 scripts/eli.py odniesienia DU 2024 18
- każda komenda przyjmuje
--json oraz --strict; obie flagi działają przed komendą i po niej.
Zero trafień / nierozpoznana odpowiedź API kończą się komunikatem i kodem wyjścia ≠ 0 — także z --json
(nie dostaniesz pustego JSON-a, który wyglądałby jak „sprawdzone, nic nie ma”); szukaj pokazuje
totalCount z API („Znaleziono: 58 (pokazuję 10, offset 0)") i jak stronicować (--offset/--limit) —
akt bazowy bywa na KOŃCU listy, za nowelizacjami.
Co sprawdza --strict (wszystko PRZED wypisaniem czegokolwiek; niepowodzenie = komunikat, kod ≠ 0,
pusty stdout): (1) istnieje nowszy t.j. niż podany → blokada; (2) odniesień lub aktu bazowego nie dało się
pobrać (awaria sieci/zapory) → blokada; (3) text.html puste i tekst pochodziłby ze STARSZEGO t.j. albo
pdftotext zawiódł → blokada (tekst z własnego urzędowego PDF aktu PRZECHODZI); (4) listy nowelizacji
nie dało się uzupełnić z aktu bazowego → blokada. Czego --strict NIE sprawdza: czy przepis został
zmieniony PO stanie prawnym t.j. — to wiesz tylko z sekcji „Nowelizacje po tekście jednolitym" (czytaj ją
i sprawdzaj „wejście w życie zmiany" względem daty sprawy); nie sprawdza też obcięcia listy szukaj
(to jest jawnie wypisane) ani opóźnień indeksacji API.
Narzędzie samo ostrzega: tekst na akcie, który ma tekst jednolity, każe cytować z najnowszego t.j.;
na tekście jednolitym wypisuje „Nowelizacje po tekście jednolitym" — własną listę t.j. UZUPEŁNIONĄ o
„Akty zmieniające" aktu bazowego ogłoszone lub wchodzące w życie po legalStatusDate t.j. (Sejm nie
synchronizuje obu list; każda pozycja ma osobno „data aktu", „ogłoszono", „wejście w życie zmiany") —
a na STARSZYM t.j. (np. z pamięci) — „NIEAKTUALNY tekst jednolity, istnieje NOWSZY" (sprawdza to na akcie
bazowym). Gdy text.html jest puste w API (textHTML=false), narzędzie czyta WŁASNY urzędowy PDF aktu
(pdftotext); tylko bez pdftotext sięga po najnowszy STARSZY t.j. z HTML — wtedy nagłówek mówi
„NIEAKTUALNE BRZMIENIE MOŻLIWE", wymienia pominięte t.j. i wypisuje INLINE zmiany aktu bazowego po stanie
prawnym tego starszego t.j., które trzeba nałożyć samemu. Nie ignoruj tych ostrzeżeń.
Akty bazowe głównych kodeksów (pomiń szukaj)
Sygnatury aktów bazowych są niezmienne — dla poniższych zaczynaj od razu od tj <sygnatura>,
potem tekst <t.j.> --fragment "art. N" (dwie komendy zamiast trzech):
| Akt |
Sygnatura bazowa |
Konstytucja RP (tekst wprost, bez tj; API nie ma HTML — tekst … --fragment "Art. 45" czyta urzędowy PDF przez pdftotext, bez niego tylko --pdf) |
DU 1997 483 |
| Kodeks cywilny (k.c.) |
DU 1964 93 |
| Kodeks postępowania cywilnego (k.p.c.) |
DU 1964 296 |
| Kodeks rodzinny i opiekuńczy (k.r.o.) |
DU 1964 59 |
| Kodeks karny (k.k.) |
DU 1997 553 |
| Kodeks postępowania karnego (k.p.k.) |
DU 1997 555 |
| Kodeks wykroczeń (k.w.) |
DU 1971 114 |
| Kodeks postępowania administracyjnego (k.p.a.) |
DU 1960 168 |
| Kodeks pracy (k.p.) |
DU 1974 141 |
| Kodeks spółek handlowych (k.s.h.) |
DU 2000 1037 |
| Ordynacja podatkowa |
DU 1997 926 |
Zasady (ważne — dlaczego)
- Najpierw znajdź właściwy akt, potem cytuj. Typowy przepływ:
szukaj → ustal sygnaturę → tj
(aktualny tekst jednolity) → tekst <t.j.> --fragment "art. N". Dla kodeksów z tabeli wyżej pomiń
szukaj i zacznij od tj. Cytowanie starej wersji to częsty błąd.
- Sprawdź NOWELIZACJE i ich WEJŚCIE W ŻYCIE (najczęstsze źródło błędu).
meta pokazuje „Ogłoszono"
(publikacja w Dz.U. — od niej liczy się vacatio legis; NIE myl z „Data aktu"), „WEJŚCIE W ŻYCIE" i
„Uwagi" (różne daty dla różnych jednostek); odniesienia — zmiany; „Nowelizacje po tekście jednolitym"
oznacza, że nawet t.j. bywa już nieaktualny. Zanim powiesz „przepis brzmi…":
- Akt OGŁOSZONY ≠ OBOWIĄZUJĄCY. W nowelizacji sprawdź artykuł „wchodzi w życie" — możliwe vacatio
legis oraz RÓŻNE daty dla różnych jednostek redakcyjnych — i odnieś do DATY zdarzenia/sprawy
(przepis sprzed/po zmianie). Tekst jednolity oddaje stan na
legalStatusDate; pozycje z listy
„Nowelizacje po tekście jednolitym" z „wejście w życie zmiany" po tej dacie trzeba nałożyć ręcznie
i sprawdzić, czy już obowiązują — --strict tego NIE robi za Ciebie.
- Baza może NIE mieć najświeższej zmiany. Brak nowelizacji w API ≠ pewność, że jej nie ma
(indeksacja bywa opóźniona). Przy sprawie na konkretną datę zweryfikuj dodatkowo (np. najnowsze
pozycje
dziennikustaw.gov.pl, proces legislacyjny), a w odpowiedzi zaznacz:
„stan prawny na dzień X wg ELI — do potwierdzenia".
- NIGDY nie twierdź, że przepisu nie ma, na podstawie pustego
--fragment. Pusty wynik to brak
dopasowania frazy, nie dowód nieistnienia przepisu — a najczęściej zawodzi przy przepisach ŚWIEŻO
dodanych lub zmienionych (nietypowe oznaczenie jednostki, odsyłacz do przypisu, indeks górny).
Zanim postawisz twierdzenie negatywne o prawie, przeszukaj pełny tekst aktu liniowo:
python3 scripts/eli.py tekst <akt> | grep -n -i "<fraza>" — i dopiero zero trafień tam jest
podstawą do „brak takiego przepisu w tym akcie". Sprawdź też, czy pytasz o WŁAŚCIWY akt: sankcja
za naruszenie obowiązku zwykle stoi w k.w./k.k., a nie w ustawie, która ten obowiązek nakłada.
- Do DOSŁOWNEGO cytatu w umowie/piśmie/sądzie używaj urzędowego PDF (
tekst … --pdf), bo
text.html po konwersji bywa zlepiony, a tekst z PDF ma automatycznie sklejone wiersze i dzielone
wyrazy; --fragment jest świetny do szybkiego odczytu i analizy.
Linia zaczynająca się od [przypis N)] to komentarz redakcyjny tekstu jednolitego (kiedy przepis
dodano lub zmieniono, z jaką datą wejścia w życie), a NIE treść normy — nigdy jej nie cytuj jako
przepisu; sam numer odsyłacza nie wchodzi już w numer jednostki („§ 1.", „pkt 2)").
- Zawsze podawaj sygnaturę Dz.U./M.P. i ELI przy cytacie (np. „art. 299 § 1 k.s.h., Dz.U. 2024
poz. 18"). To pozwala odbiorcy zweryfikować źródło.
- Pełna lista endpointów i parametrów:
references/api.md (czytaj przy zapytaniach spoza powyższych
komend — np. słowniki typów/haseł, listowanie roczników, akty zmieniające w okresie).
Czego ten skill NIE obejmuje
- prawa UE (rozporządzenia, dyrektywy — użyj skilla prawo-eu-eurlex, EUR-Lex/CELLAR),
prawa MIEJSCOWEGO (uchwały gmin/powiatów, dzienniki wojewódzkie → skill
prawo-pl-edzienniki) i dzienników resortowych,
- orzecznictwa sądów (SN/TK/sądy powszechne/KIO → skill prawo-pl-saos; sądy
administracyjne NSA/WSA → skill prawo-pl-cbosa; decyzje UODO → prawo-pl-uodo;
TSUE → prawo-eu-eurlex; w Dz.U. są tylko wyroki TK i to jako pozycje dziennika),
- projektów ustaw w toku procesu legislacyjnego (to inne API Sejmu),
- treści umów stron, KRS, ksiąg wieczystych.
Jeśli zagadnienie wymaga tych źródeł — powiedz to wprost, nie udawaj, że ELI je pokryje.
Przykładowy przepływ
Pytanie (np. przy analizie pozwu przeciwko członkowi zarządu sp. z o.o.): „co dokładnie mówi art. 299 § 1
Kodeksu spółek handlowych i czy to aktualne?" (przykład — stan na czerwiec 2026):
szukaj "Kodeks spółek handlowych" --typ Ustawa → akt bazowy ELI DU/2000/1037.
tj DU 2000 1037 → najnowszy tekst jednolity DU/2024/18 (Dz.U. 2024 poz. 18), oznaczony „AKTUALNY".
tekst DU 2024 18 --fragment "art. 299" → treść artykułu + automatyczne ostrzeżenie o nowelizacjach
po t.j. (tu 4: Dz.U. 2024 poz. 96 — wyrok TK K 29/23, oraz z aktu bazowego Dz.U. 2026 poz. 176, 187,
644 z „wejście w życie zmiany" 2027–2030). Odnieś każdą do daty sprawy; indeksacja API bywa opóźniona,
więc przy sprawie na konkretną datę dopytaj jeszcze szukajiem.
- W odpowiedzi: zacytuj przepis, podaj sygnaturę i datę stanu prawnego.
1---2name: prawo-pl-eli3description: Odpytuje OFICJALNE API ELI Sejmu (api.sejm.gov.pl/eli) — źródło pierwotne prawa polskiego (Dziennik Ustaw, Monitor Polski): wyszukiwanie aktów, TEKST JEDNOLITY, pojedyncze artykuły, metadane, nowelizacje, podstawa prawna, sygnatury Dz.U./M.P. Używaj przy KAŻDYM pytaniu z prawa polskiego — TAKŻE gdy przepis nie jest jeszcze znany (ustalenie podstawy prawnej: właściwość sądu, wyłączenie sędziego, przekazanie sprawy, przesłanki wniosku lub pozwu, terminy) — oraz ZAWSZE przy TWORZENIU lub ANALIZIE UMÓW i PISM PROCESOWYCH. Wywołuj PRZED wyszukiwaniem w internecie: treść polskiego przepisu cytuj WYŁĄCZNIE z ELI, nigdy z pamięci ani z portali (arslege, lexlege, infor, LEX); internet służy tylko do orzecznictwa i doktryny. Wyzwalaj też przy: „co mówi ustawa o…", „art. X ustawy…", „Dz.U. {rok} poz. {nr}", „tekst jednolity", „czy przepis obowiązuje", „czy był nowelizowany". Polish primary law (statutes, codes, regulations) from the official Sejm ELI API — always use for Polish law questions BEFORE web search.4---56# Prawo polskie z oficjalnego API ELI Sejmu78Skill do pracy z prawem polskim — przy **każdym pytaniu prawnym** oraz przy **tworzeniu i analizie umów9i pism procesowych**: wszędzie tam, gdzie trzeba przywołać przepis, zweryfikować podstawę prawną, termin10lub procedurę. Cytowanie przepisów z pamięci albo z nieoficjalnych portali jest zawodne (zmiany,11nowelizacje, błędne sygnatury) — ten skill sięga do **źródła pierwotnego**: oficjalnego API ELI Sejmu12(`https://api.sejm.gov.pl/eli`), czyli Dziennika Ustaw (DU) i Monitora Polskiego (MP).13Używaj go, zanim podasz brzmienie przepisu, sygnaturę albo stwierdzisz, że coś „obowiązuje".1415## Kolejność źródeł (przepis ≠ internet)16171. **Treść przepisu — wyłącznie z ELI.** Nigdy nie cytuj brzmienia polskiego przepisu z pamięci ani18 z portali (arslege.pl, lexlege.pl, infor.pl, LEX itp.). Jeśli wynik wyszukiwania internetowego19 podał brzmienie przepisu — zweryfikuj je przez `eli.py`, zanim go użyjesz w odpowiedzi.202. **Internet — tylko do orzecznictwa, doktryny i identyfikacji aktów.** Komentarze, wyroki, nazwy21 ustaw — tak; po identyfikacji wróć do ELI po tekst przepisu.223. **Pytanie bez wskazanego przepisu** („czy jest podstawa, by…", „czy mogę wnieść o…", „jaki mam23 termin na…") to też zadanie dla tego skilla — nie zaczynaj od wyszukiwarki. Najpierw ustal24 WŁAŚCIWĄ PROCEDURĘ z rodzaju sprawy (pozew/pozwany → k.p.c.; oskarżony/akt oskarżenia → k.p.k.;25 decyzja organu → k.p.a.; podatki → Ordynacja podatkowa), pobierz kandydackie przepisy z ELI26 (`struktura --filtr`, `tekst --fragment`), dopiero potem ewentualnie internet po orzecznictwo.27 Pomylenie procedury (np. art. 37 k.p.k. w sprawie cywilnej zamiast art. 44¹ k.p.c.) to typowy28 skutek zaczynania od wyszukiwarki — portale rankują pod hasła, nie pod rodzaj sprawy.294. **Delegując research subagentowi**, wpisz do jego promptu: „treść polskich przepisów pobieraj30 wyłącznie przez `scripts/eli.py` (skill prawo-pl-eli); internet tylko do orzecznictwa i doktryny".3132## Narzędzie3334Wszystko robi helper `scripts/eli.py` (tylko biblioteka standardowa Pythona — bez instalacji; opcjonalnie35program `pdftotext` z pakietu poppler w PATH — potrzebny TYLKO do aktów, dla których API nie ma HTML, np.36Konstytucja i świeże teksty jednolite; bez niego działa `--pdf`).37Skrypt leży **obok tego pliku SKILL.md** (`<katalog skilla>/scripts/eli.py`) — NIE zakładaj, że to38`~/.claude/skills/prawo-pl-eli` (skill zainstalowany jako plugin leży w katalogu pluginów; w Claude39Code: `${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-eli`). Uruchamiaj wyłącznie helper z bieżącego pakietu:4041```42# 1) Claude Code: przy ładowaniu skilla podstawia ${CLAUDE_PLUGIN_ROOT} (pełna ścieżka poniżej).43ELI="${CLAUDE_PLUGIN_ROOT}/skills/prawo-pl-eli/scripts/eli.py"44# 2) Codex / Claude Desktop / instalacja ręczna: katalog TEGO pliku SKILL.md (Claude Code podaje go45# jako „Base directory for this skill”, Codex w liście skilli) — podstaw go zamiast <katalog skilla>.46[ -f "$ELI" ] || ELI="<katalog skilla>/scripts/eli.py"47# 3) Piaskownica (Cowork, czat z code execution): katalog pluginu bywa NIEWIDOCZNY dla powłoki — wtedy48# pobierz DOKŁADNIE tę wersję helpera (tag = wersja z nagłówka tego pliku). Suma SHA-256 jest49# sprawdzana w kodzie przed zapisem i przed każdym uruchomieniem; niezgodna = helper nie startuje.50[ -f "$ELI" ] || ELI=$(python3 - <<'EOF'51import hashlib, os, sys, urllib.request52WERSJA, SHA256 = "2.0.1", "8e7538bd55620b0c8ba33f9e67e227c0a403440923f1bd917e6f3e2eb9199604"53URL = f"https://raw.githubusercontent.com/jamarpl21/prawo-pl-eli/v{WERSJA}/plugins/prawo-pl-eli/skills/prawo-pl-eli/scripts/eli.py"54p = os.path.join(os.environ.get("TMPDIR", "/tmp"), f"prawo-pl-eli-{WERSJA}", "eli.py")55try:56 dane = open(p, "rb").read() if os.path.exists(p) else urllib.request.urlopen(URL, timeout=30).read()57except Exception as e:58 sys.exit(f"BŁĄD: nie udało się pobrać helpera ({e}). Bez helpera NIE cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")59if hashlib.sha256(dane).hexdigest() != SHA256:60 os.path.exists(p) and os.remove(p)61 sys.exit("BŁĄD: suma SHA-256 helpera nie zgadza się z SKILL.md — helper NIE zostanie uruchomiony. Nie cytuj prawa z pamięci ani z portali — poinformuj użytkownika.")62os.makedirs(os.path.dirname(p), exist_ok=True); open(p, "wb").write(dane); print(p)63EOF64) && [ -f "$ELI" ] || exit 165python3 "$ELI" <komenda> [...]66```6768Nie szukaj helpera przez `find` po katalogach użytkownika ani systemu i nie pobieraj go z żadnego innego źródła niż przypięty tag z sumą wyżej (żadnego `main`, żadnej innej wersji z cache) — inna wersja helpera to inne wyniki.6970(W przykładach niżej `python3 scripts/eli.py` oznacza `python3 "$ELI"`, jeśli nie jesteś w katalogu skilla.)7172Sygnaturę można podać w wielu formach: `DU 2000 1037`, `DU/2024/18`, `"Dz.U. 2024 poz. 18"`,73`"Dz.U. 1997 nr 78 poz. 483"`, `WDU20240000018`, albo `DU/2000/1037` (ELI).7475### Komendy7677- **szukaj** — znajdź akt po tytule/typie/roku/haśle:78 `python3 scripts/eli.py szukaj "Kodeks spółek handlowych" --typ Ustawa --limit 5`79 (opcje: `--typ`, `--rok`, `--wyd DU|MP`, `--haslo`, `--obowiazujace`, `--limit`, `--offset`)80- **meta** — metadane aktu (tytuł, typ, status, daty, czy obowiązuje, hasła, ELI, pliki tekstu):81 `python3 scripts/eli.py meta DU 2000 1037`82 Daty są rozdzielone, bo API ma dwa różne pola: **„Data aktu"** (`announcementDate` = data wydania,83 „z dnia …" w tytule) i **„Ogłoszono"** (`promulgation` = publikacja w Dz.U./M.P. — od niej liczy się84 vacatio legis); dalej **„WEJŚCIE W ŻYCIE"**, **„Stan prawny na"** (`legalStatusDate`, tylko t.j.) i85 **„Uwagi"** (`comments` — np. „art. 5 ust. 4 … wchodzą w życie z dniem 25 grudnia 2024 r.", czyli RÓŻNE86 daty wejścia w życie dla różnych jednostek; czytaj je zawsze).87- **tj** — znajdź AKTUALNY TEKST JEDNOLITY dla aktu (posortowane, najnowszy oznaczony; na starym t.j. ostrzega o nowszym):88 `python3 scripts/eli.py tj DU 2000 1037`89- **tekst** — treść aktu (z `text.html` → czysty tekst; gdy API nie ma HTML dla aktu — `textHTML=false`,90 np. Konstytucja, k.c. DU 2026 795 — z jego WŁASNEGO urzędowego PDF przez `pdftotext -layout`, z nagłówkiem91 „tekst z urzędowego PDF przez pdftotext" i linią `ELI_TEXT_SOURCE_PDF=…`). **Do pojedynczego przepisu używaj `--fragment`**92 (wycina tylko jednostki z frazą — pełny kodeks to setki tysięcy znaków):93 `python3 scripts/eli.py tekst DU 2024 18 --fragment "art. 299"` (trafia w nagłówek artykułu, nie w odesłania)94 `python3 scripts/eli.py tekst DU 2024 18 --fragment "przedawnienie"` (wyszukiwanie pełnotekstowe)95 `--pdf ŚCIEŻKA` zapisuje urzędowy PDF (preferuje tekst jednolity). Indeks górny podawaj w nawiasie96 albo unicodem: art. 299¹ → `--fragment "art. 299(1)"` lub `"art. 299¹"`; sufiks literowy normalnie:97 `"art. 66c"`. Nagłówki przepisów niedawno dodanych lub zmienionych mają w tekście jednolitym98 odsyłacz do przypisu („Art. 66c 6)Dodany przez…") — `--fragment` to obsługuje.99 **„Nie znaleziono frazy" NIE znaczy, że przepisu nie ma w akcie** (zwłaszcza przy nietypowym100 oznaczeniu jednostki): sprawdź jeszcze samym numerem (`--fragment "66c"`) albo słowem z treści,101 zanim napiszesz, że przepis nie istnieje. Gdy nagłówka nie ma, narzędzie samo pokazuje trafienia102 pełnotekstowe z ostrzeżeniem — mogą to być odesłania z innych przepisów, nie sam przepis.103- **struktura** — spis jednostek redakcyjnych (tytuły/działy/rozdziały/artykuły):104 `python3 scripts/eli.py struktura DU 2024 18 --filtr "Art. 299"` (opcje: `--filtr`, `--poziom N`)105- **odniesienia** — powiązania: nowelizacje, podstawa prawna, tekst jednolity, akty wykonawcze:106 `python3 scripts/eli.py odniesienia DU 2024 18`107- każda komenda przyjmuje `--json` oraz `--strict`; obie flagi działają przed komendą i po niej.108 Zero trafień / nierozpoznana odpowiedź API kończą się komunikatem i kodem wyjścia ≠ 0 — także z `--json`109 (nie dostaniesz pustego JSON-a, który wyglądałby jak „sprawdzone, nic nie ma”); `szukaj` pokazuje110 `totalCount` z API („Znaleziono: 58 (pokazuję 10, offset 0)") i jak stronicować (`--offset`/`--limit`) —111 akt bazowy bywa na KOŃCU listy, za nowelizacjami.112113**Co sprawdza `--strict`** (wszystko PRZED wypisaniem czegokolwiek; niepowodzenie = komunikat, kod ≠ 0,114pusty stdout): (1) istnieje nowszy t.j. niż podany → blokada; (2) odniesień lub aktu bazowego nie dało się115pobrać (awaria sieci/zapory) → blokada; (3) `text.html` puste i tekst pochodziłby ze STARSZEGO t.j. albo116`pdftotext` zawiódł → blokada (tekst z własnego urzędowego PDF aktu PRZECHODZI); (4) listy nowelizacji117nie dało się uzupełnić z aktu bazowego → blokada. **Czego `--strict` NIE sprawdza:** czy przepis został118zmieniony PO stanie prawnym t.j. — to wiesz tylko z sekcji „Nowelizacje po tekście jednolitym" (czytaj ją119i sprawdzaj „wejście w życie zmiany" względem daty sprawy); nie sprawdza też obcięcia listy `szukaj`120(to jest jawnie wypisane) ani opóźnień indeksacji API.121122Narzędzie samo ostrzega: `tekst` na akcie, który ma tekst jednolity, każe cytować z najnowszego t.j.;123na tekście jednolitym wypisuje „Nowelizacje po tekście jednolitym" — własną listę t.j. UZUPEŁNIONĄ o124„Akty zmieniające" aktu bazowego ogłoszone lub wchodzące w życie po `legalStatusDate` t.j. (Sejm nie125synchronizuje obu list; każda pozycja ma osobno „data aktu", „ogłoszono", „wejście w życie zmiany") —126a na STARSZYM t.j. (np. z pamięci) — „NIEAKTUALNY tekst jednolity, istnieje NOWSZY" (sprawdza to na akcie127bazowym). Gdy `text.html` jest puste w API (`textHTML=false`), narzędzie czyta WŁASNY urzędowy PDF aktu128(`pdftotext`); tylko bez `pdftotext` sięga po najnowszy STARSZY t.j. z HTML — wtedy nagłówek mówi129„NIEAKTUALNE BRZMIENIE MOŻLIWE", wymienia pominięte t.j. i wypisuje INLINE zmiany aktu bazowego po stanie130prawnym tego starszego t.j., które trzeba nałożyć samemu. Nie ignoruj tych ostrzeżeń.131132### Akty bazowe głównych kodeksów (pomiń `szukaj`)133134Sygnatury aktów bazowych są niezmienne — dla poniższych zaczynaj od razu od `tj <sygnatura>`,135potem `tekst <t.j.> --fragment "art. N"` (dwie komendy zamiast trzech):136137| Akt | Sygnatura bazowa |138|---|---|139| Konstytucja RP (tekst wprost, bez `tj`; API nie ma HTML — `tekst … --fragment "Art. 45"` czyta urzędowy PDF przez `pdftotext`, bez niego tylko `--pdf`) | `DU 1997 483` |140| Kodeks cywilny (k.c.) | `DU 1964 93` |141| Kodeks postępowania cywilnego (k.p.c.) | `DU 1964 296` |142| Kodeks rodzinny i opiekuńczy (k.r.o.) | `DU 1964 59` |143| Kodeks karny (k.k.) | `DU 1997 553` |144| Kodeks postępowania karnego (k.p.k.) | `DU 1997 555` |145| Kodeks wykroczeń (k.w.) | `DU 1971 114` |146| Kodeks postępowania administracyjnego (k.p.a.) | `DU 1960 168` |147| Kodeks pracy (k.p.) | `DU 1974 141` |148| Kodeks spółek handlowych (k.s.h.) | `DU 2000 1037` |149| Ordynacja podatkowa | `DU 1997 926` |150151## Zasady (ważne — dlaczego)1521531. **Najpierw znajdź właściwy akt, potem cytuj.** Typowy przepływ: `szukaj` → ustal sygnaturę → `tj`154 (aktualny tekst jednolity) → `tekst <t.j.> --fragment "art. N"`. Dla kodeksów z tabeli wyżej pomiń155 `szukaj` i zacznij od `tj`. Cytowanie starej wersji to częsty błąd.1562. **Sprawdź NOWELIZACJE i ich WEJŚCIE W ŻYCIE** (najczęstsze źródło błędu). `meta` pokazuje „Ogłoszono"157 (publikacja w Dz.U. — od niej liczy się vacatio legis; NIE myl z „Data aktu"), „WEJŚCIE W ŻYCIE" i158 „Uwagi" (różne daty dla różnych jednostek); `odniesienia` — zmiany; „Nowelizacje po tekście jednolitym"159 oznacza, że nawet t.j. bywa już nieaktualny. Zanim powiesz „przepis brzmi…":160 - **Akt OGŁOSZONY ≠ OBOWIĄZUJĄCY.** W nowelizacji sprawdź artykuł „wchodzi w życie" — możliwe vacatio161 legis oraz RÓŻNE daty dla różnych jednostek redakcyjnych — i odnieś do **DATY zdarzenia/sprawy**162 (przepis sprzed/po zmianie). Tekst jednolity oddaje stan na `legalStatusDate`; pozycje z listy163 „Nowelizacje po tekście jednolitym" z „wejście w życie zmiany" po tej dacie trzeba nałożyć ręcznie164 i sprawdzić, czy już obowiązują — `--strict` tego NIE robi za Ciebie.165 - **Baza może NIE mieć najświeższej zmiany.** Brak nowelizacji w API ≠ pewność, że jej nie ma166 (indeksacja bywa opóźniona). Przy sprawie na konkretną datę zweryfikuj dodatkowo (np. najnowsze167 pozycje `dziennikustaw.gov.pl`, proces legislacyjny), a w odpowiedzi zaznacz:168 „stan prawny na dzień X wg ELI — do potwierdzenia".1693. **NIGDY nie twierdź, że przepisu nie ma, na podstawie pustego `--fragment`.** Pusty wynik to brak170 dopasowania frazy, nie dowód nieistnienia przepisu — a najczęściej zawodzi przy przepisach ŚWIEŻO171 dodanych lub zmienionych (nietypowe oznaczenie jednostki, odsyłacz do przypisu, indeks górny).172 Zanim postawisz twierdzenie negatywne o prawie, przeszukaj pełny tekst aktu liniowo:173 `python3 scripts/eli.py tekst <akt> | grep -n -i "<fraza>"` — i dopiero zero trafień tam jest174 podstawą do „brak takiego przepisu w tym akcie". Sprawdź też, czy pytasz o WŁAŚCIWY akt: sankcja175 za naruszenie obowiązku zwykle stoi w k.w./k.k., a nie w ustawie, która ten obowiązek nakłada.1764. **Do DOSŁOWNEGO cytatu w umowie/piśmie/sądzie** używaj urzędowego PDF (`tekst … --pdf`), bo177 `text.html` po konwersji bywa zlepiony, a tekst z PDF ma automatycznie sklejone wiersze i dzielone178 wyrazy; `--fragment` jest świetny do szybkiego odczytu i analizy.179 Linia zaczynająca się od `[przypis N)]` to **komentarz redakcyjny tekstu jednolitego** (kiedy przepis180 dodano lub zmieniono, z jaką datą wejścia w życie), a NIE treść normy — nigdy jej nie cytuj jako181 przepisu; sam numer odsyłacza nie wchodzi już w numer jednostki („§ 1.", „pkt 2)").1825. **Zawsze podawaj sygnaturę Dz.U./M.P. i ELI** przy cytacie (np. „art. 299 § 1 k.s.h., Dz.U. 2024183 poz. 18"). To pozwala odbiorcy zweryfikować źródło.1846. Pełna lista endpointów i parametrów: `references/api.md` (czytaj przy zapytaniach spoza powyższych185 komend — np. słowniki typów/haseł, listowanie roczników, akty zmieniające w okresie).186187## Czego ten skill NIE obejmuje188189- **prawa UE** (rozporządzenia, dyrektywy — użyj skilla **prawo-eu-eurlex**, EUR-Lex/CELLAR),190 **prawa MIEJSCOWEGO** (uchwały gmin/powiatów, dzienniki wojewódzkie → skill191 **prawo-pl-edzienniki**) i **dzienników resortowych**,192- **orzecznictwa sądów** (SN/TK/sądy powszechne/KIO → skill **prawo-pl-saos**; sądy193 administracyjne NSA/WSA → skill **prawo-pl-cbosa**; decyzje UODO → **prawo-pl-uodo**;194 TSUE → **prawo-eu-eurlex**; w Dz.U. są tylko wyroki TK i to jako pozycje dziennika),195- **projektów ustaw** w toku procesu legislacyjnego (to inne API Sejmu),196- treści umów stron, KRS, ksiąg wieczystych.197Jeśli zagadnienie wymaga tych źródeł — powiedz to wprost, nie udawaj, że ELI je pokryje.198199## Przykładowy przepływ200201Pytanie (np. przy analizie pozwu przeciwko członkowi zarządu sp. z o.o.): „co dokładnie mówi art. 299 § 1202Kodeksu spółek handlowych i czy to aktualne?" (przykład — stan na czerwiec 2026):2031. `szukaj "Kodeks spółek handlowych" --typ Ustawa` → akt bazowy ELI `DU/2000/1037`.2042. `tj DU 2000 1037` → najnowszy tekst jednolity `DU/2024/18` (Dz.U. 2024 poz. 18), oznaczony „AKTUALNY".2053. `tekst DU 2024 18 --fragment "art. 299"` → treść artykułu + automatyczne ostrzeżenie o nowelizacjach206 po t.j. (tu 4: Dz.U. 2024 poz. 96 — wyrok TK K 29/23, oraz z aktu bazowego Dz.U. 2026 poz. 176, 187,207 644 z „wejście w życie zmiany" 2027–2030). Odnieś każdą do daty sprawy; indeksacja API bywa opóźniona,208 więc przy sprawie na konkretną datę dopytaj jeszcze `szukaj`iem.2094. W odpowiedzi: zacytuj przepis, podaj sygnaturę i datę stanu prawnego.