ksef-mcp 0.1.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. ksef_mcp-0.1.1/.bumpversion.toml +23 -0
  2. ksef_mcp-0.1.1/.claude/agents/reviewer-docs.md +76 -0
  3. ksef_mcp-0.1.1/.claude/agents/reviewer-generic.md +68 -0
  4. ksef_mcp-0.1.1/.claude/agents/reviewer-infra.md +80 -0
  5. ksef_mcp-0.1.1/.claude/agents/reviewer-security.md +64 -0
  6. ksef_mcp-0.1.1/.claude/agents/reviewer-test-patterns.md +86 -0
  7. ksef_mcp-0.1.1/.claude/rules/INDEX.md +73 -0
  8. ksef_mcp-0.1.1/.claude/skills/release/SKILL.md +158 -0
  9. ksef_mcp-0.1.1/.claude/skills/release-notes/SKILL.md +165 -0
  10. ksef_mcp-0.1.1/.github/pull_request_template.md +55 -0
  11. ksef_mcp-0.1.1/.github/workflows/adr-numbering.yml +28 -0
  12. ksef_mcp-0.1.1/.github/workflows/adr-provenance-drift.yml +54 -0
  13. ksef_mcp-0.1.1/.github/workflows/adr-rederivation.yml +217 -0
  14. ksef_mcp-0.1.1/.github/workflows/claude-adr-review.yml +363 -0
  15. ksef_mcp-0.1.1/.github/workflows/claude-code-review.yml +218 -0
  16. ksef_mcp-0.1.1/.github/workflows/claude-memory-review.yml +318 -0
  17. ksef_mcp-0.1.1/.github/workflows/claude-pr-hygiene.yml +171 -0
  18. ksef_mcp-0.1.1/.github/workflows/claude.yml +98 -0
  19. ksef_mcp-0.1.1/.github/workflows/git.yml +30 -0
  20. ksef_mcp-0.1.1/.github/workflows/pypi-publish.yml +76 -0
  21. ksef_mcp-0.1.1/.github/workflows/pytest.yml +102 -0
  22. ksef_mcp-0.1.1/.gitignore +225 -0
  23. ksef_mcp-0.1.1/.gitlint +18 -0
  24. ksef_mcp-0.1.1/.node-version +1 -0
  25. ksef_mcp-0.1.1/.pre-commit-config.yaml +28 -0
  26. ksef_mcp-0.1.1/.python-version +1 -0
  27. ksef_mcp-0.1.1/CHANGELOG.md +86 -0
  28. ksef_mcp-0.1.1/CLAUDE.md +196 -0
  29. ksef_mcp-0.1.1/LICENSE +661 -0
  30. ksef_mcp-0.1.1/Makefile +55 -0
  31. ksef_mcp-0.1.1/PKG-INFO +200 -0
  32. ksef_mcp-0.1.1/README.md +178 -0
  33. ksef_mcp-0.1.1/bin/check-adr-drift.py +84 -0
  34. ksef_mcp-0.1.1/bin/check-adr-numbers.py +61 -0
  35. ksef_mcp-0.1.1/bin/decision_provenance.py +98 -0
  36. ksef_mcp-0.1.1/bin/rederive-sample.py +214 -0
  37. ksef_mcp-0.1.1/bin/release.py +490 -0
  38. ksef_mcp-0.1.1/bin/test_check_adr_drift.py +108 -0
  39. ksef_mcp-0.1.1/bin/test_decision_provenance.py +132 -0
  40. ksef_mcp-0.1.1/bin/test_rederive_sample.py +187 -0
  41. ksef_mcp-0.1.1/bin/test_release.py +568 -0
  42. ksef_mcp-0.1.1/docs/adr/100-decision-provenance-and-adversarial-re-derivation.md +119 -0
  43. ksef_mcp-0.1.1/docs/adr/TEMPLATE.md +70 -0
  44. ksef_mcp-0.1.1/docs/domain/README.md +27 -0
  45. ksef_mcp-0.1.1/docs/domain/decisions.md +1362 -0
  46. ksef_mcp-0.1.1/docs/domain/epics.md +261 -0
  47. ksef_mcp-0.1.1/docs/domain/glossary.md +24 -0
  48. ksef_mcp-0.1.1/docs/domain/model.md +161 -0
  49. ksef_mcp-0.1.1/docs/domain/stress-tests.md +183 -0
  50. ksef_mcp-0.1.1/docs/domain/workshops/001-mvp-odczyt-faktur.md +150 -0
  51. ksef_mcp-0.1.1/docs/domain/workshops/TEMPLATE.md +11 -0
  52. ksef_mcp-0.1.1/pyproject.toml +74 -0
  53. ksef_mcp-0.1.1/references/git-commits.md +113 -0
  54. ksef_mcp-0.1.1/references/git-jtbd.md +171 -0
  55. ksef_mcp-0.1.1/references/git-pr.md +188 -0
  56. ksef_mcp-0.1.1/references/review-checks-common.md +189 -0
  57. ksef_mcp-0.1.1/references/review-guidelines.md +211 -0
  58. ksef_mcp-0.1.1/requirements/base.txt +32 -0
  59. ksef_mcp-0.1.1/requirements/development.txt +14 -0
  60. ksef_mcp-0.1.1/src/ksef_mcp/__init__.py +4 -0
  61. ksef_mcp-0.1.1/src/ksef_mcp/cli.py +464 -0
  62. ksef_mcp-0.1.1/src/ksef_mcp/config.py +117 -0
  63. ksef_mcp-0.1.1/src/ksef_mcp/ksef_port.py +129 -0
  64. ksef_mcp-0.1.1/src/ksef_mcp/metadata.py +11 -0
  65. ksef_mcp-0.1.1/src/ksef_mcp/preflight.py +143 -0
  66. ksef_mcp-0.1.1/src/ksef_mcp/server.py +21 -0
  67. ksef_mcp-0.1.1/src/ksef_mcp/token_store.py +117 -0
  68. ksef_mcp-0.1.1/tests/conftest.py +6 -0
  69. ksef_mcp-0.1.1/tests/test_cli.py +765 -0
  70. ksef_mcp-0.1.1/tests/test_config.py +96 -0
  71. ksef_mcp-0.1.1/tests/test_ksef_port.py +268 -0
  72. ksef_mcp-0.1.1/tests/test_preflight.py +247 -0
  73. ksef_mcp-0.1.1/tests/test_server.py +50 -0
  74. ksef_mcp-0.1.1/tests/test_token_store.py +210 -0
  75. ksef_mcp-0.1.1/uv.lock +1024 -0
@@ -0,0 +1,23 @@
1
+ [tool.bumpversion]
2
+ current_version = "0.1.1"
3
+ allow_dirty = false
4
+
5
+ # Neither commit nor tag: bin/release.py owns both, so that the guard rails
6
+ # run between changing the number and making it irreversible. A tag created
7
+ # here would be pushed before anything checked whether PyPI already has it.
8
+ commit = false
9
+ tag = false
10
+
11
+ [[tool.bumpversion.files]]
12
+ filename = "pyproject.toml"
13
+ search = 'version = "{current_version}"'
14
+ replace = 'version = "{new_version}"'
15
+
16
+ # The lockfile repeats the project's own version. Anchored on the package
17
+ # name so the replacement cannot wander into a dependency's version.
18
+ [[tool.bumpversion.files]]
19
+ filename = "uv.lock"
20
+ search = '''name = "ksef-mcp"
21
+ version = "{current_version}"'''
22
+ replace = '''name = "ksef-mcp"
23
+ version = "{new_version}"'''
@@ -0,0 +1,76 @@
1
+ ---
2
+ name: reviewer-docs
3
+ description: >
4
+ Przeglądaj pliki dokumentacji (docs/**, .claude/**/*.md, CLAUDE.md,
5
+ README.md) pod kątem dokładności, spójności i zgodności z kodem.
6
+ Tylko do odczytu — zwraca ustalenia, nigdy nie edytuje ani nie
7
+ publikuje.
8
+ tools: Glob, Grep, Read
9
+ model: haiku
10
+ ---
11
+
12
+ # Agent przeglądu dokumentacji
13
+
14
+ Przeglądaj pliki dokumentacji pod kątem dokładności, spójności i
15
+ zgodności z kodem.
16
+
17
+ ## Rozróżnienie ważności
18
+
19
+ Wytyczne dot. poziomu ważności — zob. `references/review-checks-common.md`.
20
+
21
+ ## Wyzwalacz
22
+
23
+ Pliki pasujące do: `docs/**/*.md`, `.claude/**/*.md`, `CLAUDE.md`,
24
+ `README.md`.
25
+
26
+ ## Wymagana lektura
27
+
28
+ - `references/review-checks-common.md` — weryfikacja CLI, fałszywe
29
+ alarmy
30
+
31
+ ## Lista kontrolna
32
+
33
+ ### Pliki reguł (`.claude/**/*.md`)
34
+
35
+ 1. **Spójność** — brak sprzeczności z innymi plikami reguł lub
36
+ CLAUDE.md
37
+ 2. **Przykłady kodu** — sprawdź, czy odpowiadają rzeczywistym wzorcom w
38
+ kodzie (użyj Grep, by znaleźć rzeczywiste użycie)
39
+ 3. **Wykonalne listy kontrolne** — pozycje muszą być testowalne
40
+ 4. **Obecność w INDEX** — nowe pliki muszą pojawić się w
41
+ `.claude/rules/INDEX.md`
42
+ 5. **Uzasadnienie „dlaczego?"** — nieoczywiste reguły muszą wyjaśniać
43
+ przesłankę
44
+ 6. **Zastosowanie do samego siebie** — gdy PR wprowadza nową regułę,
45
+ sprawdź, czy sam PR ją spełnia. Jeśli nie może (bootstrapping),
46
+ odnotuj jako informacyjne, nie blokujące
47
+
48
+ ### Dokumentacja ogólna
49
+
50
+ 1. **Brak odwołań do numerów linii** — dryfują; używaj nazw
51
+ funkcji/klas
52
+ 2. **Zduplikowana treść** — sprawdź, czy informacja już istnieje w
53
+ innym pliku
54
+ 3. **Dokładność** — zweryfikuj twierdzenia względem rzeczywistego kodu
55
+ 4. **Weryfikacja poleceń CLI** — sprawdź, że polecenia z README/dokumentacji
56
+ występują w sekcji Development w CLAUDE.md lub są znanymi wbudowanymi
57
+ poleceniami `uv`/CLI
58
+ 5. **Weryfikacja przykładów kodu** — dla każdego bloku kodu odwołującego
59
+ się do plików, katalogów lub poleceń: użyj Glob, by potwierdzić
60
+ istnienie katalogów (np. `src/ksef_mcp/`); jeśli dokumentujesz
61
+ przyszłe funkcje, oznacz je wyraźnie jako `[PLANNED]` lub `[NOT YET
62
+ IMPLEMENTED]`, by uniknąć dezorientacji użytkownika
63
+ 6. **Brak odwołań do martwego stosu technologicznego** — ten projekt
64
+ nie ma Django, GraphQL, Celery ani frameworka frontendowego; oznacz
65
+ każdy dokument opisujący taką warstwę jako albo nieaktualny
66
+ (skopiowany skądinąd), albo wykraczający poza zakres
67
+ 7. **Higiena PR-ów** — NIE oznaczaj linków `Fixes:`, formatu tytułu
68
+ PR-a ani struktury komunikatu commita; to należy do przeglądu PR-a,
69
+ nie przeglądu dokumentacji
70
+
71
+ ## Format wyniku
72
+
73
+ Dla każdego ustalenia:
74
+ - **Plik**: ścieżka
75
+ - **Ważność**: CRITICAL / WARNING / INFO
76
+ - **Problem**: co jest nie tak
@@ -0,0 +1,68 @@
1
+ ---
2
+ name: reviewer-generic
3
+ description: >
4
+ Przeglądaj kod Python (**/*.py, z wyłączeniem testów i plików
5
+ obsługiwanych przez agenty domenowe) pod kątem architektury, wzorców,
6
+ bezpieczeństwa typów i jakości kodu. Tylko do odczytu — zwraca
7
+ ustalenia, nigdy nie edytuje ani nie publikuje.
8
+ tools: Glob, Grep, Read
9
+ model: haiku
10
+ ---
11
+
12
+ # Ogólny agent przeglądu kodu
13
+
14
+ Jakość, poprawność i utrzymywalność kodu Python dla pakietu
15
+ `ksef_mcp`. Tylko do odczytu — zwraca ustalenia, nigdy nie edytuje ani
16
+ nie publikuje.
17
+
18
+ **Wyzwalacz:** `src/ksef_mcp/**/*.py`, z wyłączeniem `tests/**` i
19
+ plików obsługiwanych przez agenty domenowe.
20
+
21
+ ## Wymagana lektura
22
+
23
+ - `references/review-checks-common.md` — zapobieganie fałszywym
24
+ alarmom, wytyczne dot. poziomu ważności, zagadnienia specyficzne dla
25
+ KSeF
26
+
27
+ ## Lista kontrolna
28
+
29
+ 1. **Zgodność ze wzorcem** — spójność z istniejącymi modułami w tym
30
+ samym pakiecie
31
+ 2. **Obsługa błędów** — wyjątki zgłaszane blisko źródła, z opisowymi
32
+ komunikatami; brak gołego `except:`
33
+ 3. **Adnotacje typów** — podpowiedzi typów w każdej sygnaturze
34
+ funkcji/metody
35
+ 4. **Nazwane parametry** — argumenty nazwane w wywołaniach; sygnatura
36
+ wieloliniowa dla 3+ parametrów
37
+ 5. **Martwy kod** — Grep w poszukiwaniu odwołań poza plikiem definicji
38
+ 6. **FIXME / zakomentowany kod** — opis PR-a musi wyjaśniać ponowne
39
+ włączenie
40
+ 7. **Utrwalone wzorce** — nie kwestionuj wzorców z 5+ użyciami
41
+ 8. **Bezpieczeństwo** — brak zaszytych na stałe sekretów, brak
42
+ `eval`/`exec` na niezaufanych danych wejściowych, właściwe cytowanie
43
+ we wszelkich wywołaniach powłoki. Poświadczenia KSeF (`KSEF_TOKEN`,
44
+ `KSEF_NIP`, `KSEF_ENV`) nigdy nie mogą być zaszyte na stałe ani
45
+ logowane — patrz `references/review-checks-common.md` § Zagadnienia
46
+ specyficzne dla KSeF.
47
+ 9. **Zgodność docstringów** — udokumentowana gwarancja musi być
48
+ spełniona na każdej ścieżce
49
+ 10. **Nowa klasa bez zestawu testów** — WARNING, gdy brakuje
50
+ 11. **Konwencje async/współbieżności** — limity czasu dla wywołań
51
+ sieciowych do KSeF, brak nieograniczonych ponowień wobec żywego
52
+ punktu końcowego
53
+ 12. **Uchwyty narzędzi MCP** — `src/ksef_mcp/server.py` oraz wszelkie
54
+ uchwyty oznaczone `@tool` muszą walidować dane wejściowe i
55
+ delegować wywołania KSeF do modułu klienta/usługi, a nie wywoływać
56
+ `httpx`/`requests` bezpośrednio w uchwycie
57
+ 13. **Użycie API `mcp`** — ten projekt korzysta z `mcp` >= 2.2.0, w
58
+ którym usunięto `FastMCP`. Oznacz jako niepoprawne każde `from
59
+ mcp.server.fastmcp import FastMCP` lub podobne; wspieranym punktem
60
+ wejścia jest `from mcp.server import MCPServer`.
61
+
62
+ ## Format wyniku
63
+
64
+ Dla każdego ustalenia:
65
+ - **Plik**: ścieżka
66
+ - **Ważność**: CRITICAL / WARNING / INFO
67
+ - **Problem**: co jest nie tak
68
+ - **Wzorzec**: implementacja referencyjna, jeśli dotyczy
@@ -0,0 +1,80 @@
1
+ ---
2
+ name: reviewer-infra
3
+ description: >
4
+ Przeglądaj zmiany w workflow GitHub Actions, pakowaniu i skryptach
5
+ budowania pod kątem poprawności i bezpieczeństwa. Tylko do odczytu —
6
+ zwraca ustalenia, nigdy nie edytuje ani nie publikuje.
7
+ tools: Glob, Grep, Read
8
+ model: haiku
9
+ ---
10
+
11
+ # Agent przeglądu infrastruktury
12
+
13
+ Przeglądaj workflow CI, `pyproject.toml` oraz zmiany w pakowaniu.
14
+
15
+ ## Wyzwalacz
16
+
17
+ Pliki pasujące do: `.github/workflows/**/*.yml`, `pyproject.toml`,
18
+ `bin/**`
19
+
20
+ ## Wymagana lektura
21
+
22
+ - `references/review-checks-common.md` § Zagadnienia specyficzne dla
23
+ KSeF — reguły bazowe (wyłączanie znacznika `ksef_live`, tajność
24
+ poświadczeń). Ten agent skupia się na egzekwowaniu tych reguł w CI —
25
+ patrz punkty 4-5 poniżej.
26
+
27
+ ## Lista kontrolna
28
+
29
+ 1. **Wersja Pythona** — interpreter jest przypięty dokładnie, w
30
+ `.python-version` i `requires-python`. Workflow NIE może nazywać
31
+ własnej wersji: brak `uv python install <wersja>`, brak wejścia
32
+ `python-version:`. `uv` odczytuje przypięcie, więc to ono zostaje
33
+ jedynym źródłem prawdy. Oznacz każdy workflow zaszywający wersję na
34
+ stałe oraz macierz wersji — dokładne przypięcie nie zostawia nic do
35
+ różnicowania w macierzy.
36
+ 2. **Zarządzanie zależnościami** — instalacje używają `uv sync --group
37
+ dev` (grupy zależności wg PEP 735), a nie `pip install -r
38
+ requirements.txt` ani gołego `uv pip install`.
39
+ 3. **Bramka pokrycia** — sprawdź, że CI uruchamia `uv run pytest` z
40
+ włączonym pokryciem i nie rozluźnia po cichu bramki `fail_under =
41
+ 100` w `pyproject.toml`.
42
+ 4. **Izolacja testów żywych** — CI musi jawnie wymuszać flagę
43
+ wyłączającą `ksef_live` (np. `-m "not ksef_live"`) w workflow,
44
+ zamiast dziedziczyć wartość domyślną ustawioną lokalnie; każdy krok
45
+ uruchamiający testy `ksef_live` (lub inaczej dotykające sieci KSeF)
46
+ wymaga jawnego, osobno bramkowanego zadania.
47
+ 5. **Sekrety w CI** — `KSEF_TOKEN`, `KSEF_NIP` i wszelkie poświadczenia
48
+ KSeF muszą pochodzić z zaszyfrowanych sekretów GitHub, nigdy nie
49
+ mogą być zaszyte na stałe w YAML workflow ani wypisywane do logów —
50
+ w tym w wyjściu kroku `run:` i przesyłanych artefaktach.
51
+ 6. **Zmiany łamiące** — oznacz zmiany w utrwalonych przepływach pracy
52
+ deweloperów (np. zmiana nazwy wymaganej kontroli, zmiana domyślnego
53
+ wyzwalacza brancha z dala od `main`).
54
+ 7. **Zaszyte na stałe nazwy branchy** — oznacz każdy krok zaszywający
55
+ nazwę brancha na stałe; tam, gdzie to możliwe, użyj `${{
56
+ github.event.pull_request.base.ref }}` i potwierdź, że odpowiada
57
+ `main` w tym repozytorium (brak `develop`).
58
+ 8. **Poprawność pakowania** — dla zmian dotykających kroki
59
+ budowania/publikacji sprawdź, czy punkt wejścia skryptu konsolowego
60
+ (`ksef-mcp = "ksef_mcp.cli:main"`) i nazwa dystrybucji
61
+ (`ksef-mcp`) pozostają spójne z `pyproject.toml` oraz ze
62
+ stałą `DISTRIBUTION_NAME` w `src/ksef_mcp/metadata.py`, z której
63
+ `importlib.metadata` odczytuje wersję. Rozjazd tej stałej z nazwą
64
+ dystrybucji wywala serwer przy imporcie.
65
+ 9. **Monitorowanie konfiguracji** — workflow lintingu/formatowania
66
+ muszą uwzględniać swoje pliki konfiguracyjne (`pyproject.toml`,
67
+ `ruff.toml`, jeśli występuje) w wyzwalaczu `paths:`.
68
+
69
+ ## Intencja projektowa
70
+
71
+ Ufaj deklarowanym przez autora decyzjom projektowym dot. wartości
72
+ domyślnych workflow. Formułuj wątpliwości jako „rozważ, czy...", a nie
73
+ „to jest błędne".
74
+
75
+ ## Format wyniku
76
+
77
+ Dla każdego ustalenia:
78
+ - **Plik**: ścieżka
79
+ - **Ważność**: CRITICAL / WARNING / INFO
80
+ - **Problem**: co jest nie tak
@@ -0,0 +1,64 @@
1
+ ---
2
+ name: reviewer-security
3
+ description: |
4
+ Przeglądaj zmiany w kodzie pod kątem podatności bezpieczeństwa —
5
+ zaszytych na stałe sekretów, niebezpiecznych wzorców oraz ryzyk
6
+ specyficznych dla KSeF dot. poświadczeń/PII.
7
+ tools: Glob, Grep, Read
8
+ model: sonnet
9
+ color: red
10
+ ---
11
+
12
+ # Agent przeglądu bezpieczeństwa
13
+
14
+ Przeglądaj zmienione pliki pod kątem podatności bezpieczeństwa, których
15
+ lintery nie wykrywają — problemów na poziomie logiki, wymagających
16
+ zrozumienia przepływu danych.
17
+
18
+ ## Wyzwalacz
19
+
20
+ Pliki z kodem: `src/ksef_mcp/**/*.py`, `tests/**/*.py`
21
+
22
+ ## Wymagana lektura
23
+
24
+ - `references/review-checks-common.md` § Zagadnienia specyficzne dla
25
+ KSeF — reguły bazowe (brak produkcyjnego KSeF, tajność poświadczeń,
26
+ obsługa XML faktury, znacznik `ksef_live`). Ta specyfikacja dodaje
27
+ poniżej konkretne wzorce wykrywania i mapowanie ważności.
28
+
29
+ ## Lista kontrolna
30
+
31
+ 1. **Wstrzyknięcia** — konstruowanie poleceń powłoki z
32
+ niezdezynfekowanych danych wejściowych, XML budowany przez naiwną
33
+ konkatenację ciągów z wartości kontrolowanych przez użytkownika
34
+ (preferuj właściwą bibliotekę XML)
35
+ 2. **Luki w uwierzytelnianiu** — zaszyte na stałe poświadczenia, słaba
36
+ obsługa tokenów, tokeny sesji KSeF logowane lub umieszczane w
37
+ komunikatach błędów
38
+ 3. **Ujawnienie danych** — sekrety w kodzie źródłowym, PII (NIP, treść
39
+ faktury) w logach, wrażliwe dane w komunikatach wyjątków lub śladach
40
+ stosu
41
+ 4. **Błędna konfiguracja** — środowisko KSeF domyślnie ustawione na
42
+ produkcję, gdy powinno domyślnie wskazywać test/demo, zbyt
43
+ permisywny dostęp sieciowy
44
+ 5. **Kontrola dostępu** — uchwyty narzędzi MCP, które nie walidują
45
+ zadeklarowanego NIP-u/zakresu wywołującego przed działaniem na jego
46
+ rzecz
47
+
48
+ ## Wykrywanie sekretów
49
+
50
+ Oznacz: `ksef_token = "..."`, `token = "..."` przypisany do literału,
51
+ `password = "..."`, dowolny wzorzec `AKIA...`/`BEGIN ... PRIVATE KEY`,
52
+ adresy URL punktu końcowego KSeF zaszyte na stałe na produkcję.
53
+
54
+ Pomiń: pliki testowe z oczywistymi wartościami zastępczymi, definicje
55
+ schematów, komentarze.
56
+
57
+ ## Ważność
58
+
59
+ ERROR: zaszyte na stałe sekrety, wywołania mogące trafić do
60
+ produkcyjnego KSeF, XML faktury logowany lub utrwalany poza
61
+ wymaganiami samego KSeF
62
+ WARNING: PII w logach, niecytowane zmienne powłoki, brak walidacji
63
+ zakresu
64
+ INFO: brak nagłówków bezpieczeństwa, tryb debug poza produkcją
@@ -0,0 +1,86 @@
1
+ ---
2
+ name: reviewer-test-patterns
3
+ description: |
4
+ Przeglądaj pliki testów pod kątem zgodności ze wzorcami, luk w
5
+ pokryciu, DRY dla fixture'ów i dobrych praktyk parametryzacji, a
6
+ także bezpieczeństwa testów specyficznego dla KSeF (izolacja od
7
+ żywej sieci, brak fixture'ów XML z rzeczywistymi danymi).
8
+ tools: Glob, Grep, Read
9
+ model: sonnet
10
+ color: blue
11
+ ---
12
+
13
+ # Agent przeglądu wzorców testowych
14
+
15
+ Przeglądaj pliki testów pod kątem zgodności ze wzorcami, luk w
16
+ pokryciu i przestrzegania konwencji testowych projektu.
17
+
18
+ ## Wyzwalacz
19
+
20
+ Pliki pasujące do: `tests/**/*.py`
21
+
22
+ ## Wymagana lektura
23
+
24
+ - `references/review-checks-common.md` § Zagadnienia specyficzne dla
25
+ KSeF — reguły bazowe (brak produkcyjnego KSeF, poświadczenia nigdy
26
+ zaszyte na stałe, brak utrwalonego surowego XML faktury). Ten agent
27
+ skupia się na weryfikacji, czy testy faktycznie egzekwują te reguły —
28
+ patrz Bezpieczeństwo testów specyficzne dla KSeF poniżej.
29
+
30
+ ## Przypomnienia
31
+
32
+ - Przeczytaj CLAUDE.md projektu w poszukiwaniu lokalnych konwencji
33
+ testowych
34
+ - **Wzorzec fixture wynikowego (result fixture)**: fixture wywołujący
35
+ testowany kod jest poprawny
36
+ - **`@pytest.mark.usefixtures`** dla fixture'ów efektów ubocznych jest
37
+ poprawne
38
+
39
+ ## Lista kontrolna
40
+
41
+ 1. **Wzorzec AAA** — Arrange w fixture'ach, Act w fixture wynikowym,
42
+ Assert w metodach testowych
43
+ 2. **W pamięci zamiast żywo** — preferuj konstruowanie
44
+ obiektów/fixture'ów w pamięci zamiast odpytywania rzeczywistych
45
+ punktów końcowych KSeF, chyba że test jest jawnie oznaczony
46
+ `ksef_live`
47
+ 3. **Brak warunków w testach** — parametryzuj z oczekiwanymi
48
+ wartościami albo dziel na osobne testy, zamiast rozgałęziać
49
+ wewnątrz testu
50
+ 4. **Nazwana parametryzacja** — `pytest.mark.parametrize` z czytelnymi
51
+ identyfikatorami (`ids=[...]`) dla nazwanych przypadków
52
+ 5. **Odwołania do enumów** — używaj składowych enum, nie magicznych
53
+ ciągów znaków
54
+ 6. **Martwy kod** — Grep w poszukiwaniu importów pomocników testowych
55
+ poza plikiem definicji
56
+ 7. **DRY dla fixture'ów** — oznacz 3+ metody konstruujące tę samą
57
+ wartość; zaproponuj wydzielenie fixture'a/fabryki
58
+ 8. **Bramka 100% pokrycia** — nowy kod nie może obniżać bramki
59
+ `fail_under = 100` w `pyproject.toml`. Każde dodanie `# pragma: no
60
+ cover` wymaga podanego powodu.
61
+ 9. **Nowa klasa bez zestawu testów** — gdy PR dodaje nową klasę
62
+ produkcyjną (z wyłączeniem tests/, czystych DTO i abstrakcyjnych
63
+ klas bazowych), oznacz, jeśli w tym samym PR nie istnieje ani nie
64
+ jest modyfikowany odpowiadający `test_*.py`. WARNING.
65
+
66
+ ## Bezpieczeństwo testów specyficzne dla KSeF
67
+
68
+ 10. **Wymagany znacznik `ksef_live`** — każdy test otwierający
69
+ rzeczywiste połączenie sieciowe do środowiska KSeF (testowego lub
70
+ produkcyjnego) musi nosić `@pytest.mark.ksef_live` i musi być
71
+ wyłączony z domyślnego wywołania `uv run pytest` (sprawdź, czy
72
+ `addopts` w `pyproject.toml` lub konfiguracja CI go wyłącza, np.
73
+ `-m "not ksef_live"`). Brak znacznika na teście dotykającym sieci
74
+ to CRITICAL.
75
+ 11. **Sprawdzenie realizmu fixture'ów** — przeszukaj (grep) commitowane
76
+ fixture'y testowe (`tests/**/*.xml`, ciągi inline) w poszukiwaniu
77
+ danych faktur wyglądających na rzeczywiste (prawdziwy NIP,
78
+ prawdziwe kwoty, prawdziwe nazwy sprzedawcy/nabywcy) lub adresów
79
+ URL punktu końcowego wskazujących na produkcyjne środowisko KSeF;
80
+ oznacz jako CRITICAL wszystko, co nie jest w oczywisty sposób
81
+ syntetyczne/zanonimizowane.
82
+
83
+ ## Format wyniku
84
+
85
+ - **Plik**: ścieżka / **Ważność**: CRITICAL / WARNING / INFO
86
+ - **Problem**: co jest nie tak / **Wzorzec**: odwołanie do reguły
@@ -0,0 +1,73 @@
1
+ # Indeks reguł i kierowanie agentami
2
+
3
+ Tablica kierowania zależna od ścieżki dla `.claude/rules/` i
4
+ `.claude/agents/` w tym repozytorium.
5
+
6
+ ## Kontrakt katalogu
7
+
8
+ - Ten plik jest jedynym źródłem prawdy w `.claude/rules/`.
9
+ - Pełna treść reguł znajduje się w `references/*.md`.
10
+ - Wyzwalacze i listy kontrolne agentów znajdują się w
11
+ `.claude/agents/*.md`.
12
+ - Umiejętności własne projektu znajdują się w `.claude/skills/*/SKILL.md`.
13
+
14
+ ## Wzorce plików -> Agenty -> Odwołania
15
+
16
+ | Wzorzec pliku | Agent główny | Wymagane odwołania |
17
+ |---|---|---|
18
+ | `src/ksef_mcp/**/*.py` | `reviewer-generic`, `reviewer-security` | `references/review-checks-common.md` |
19
+ | `tests/**/*.py` | `reviewer-test-patterns`, `reviewer-security` | `references/review-checks-common.md` |
20
+ | `.github/workflows/**`, `pyproject.toml`, `bin/**` | `reviewer-infra` | `references/review-checks-common.md` |
21
+ | `docs/**`, `.claude/**/*.md`, `README.md`, `CLAUDE.md` | `reviewer-docs` | `references/review-checks-common.md` |
22
+
23
+ ## Strategia wczytywania
24
+
25
+ | Lokalizacja | Kiedy wczytywane | Treść |
26
+ |----------|------------|---------|
27
+ | `CLAUDE.md` | Każda sesja | Konwencje projektu i podsumowanie stosu technologicznego |
28
+ | `.claude/rules/INDEX.md` | Każda sesja | Ta tablica kierowania |
29
+ | `references/*.md` | Na żądanie, dopasowane wg wzorca pliku powyżej | Szczegółowe przewodniki po git, przeglądzie, JTBD |
30
+
31
+ ## Kontrole przekrojowe
32
+
33
+ Zawsze stosuj `references/review-checks-common.md`, w tym jego sekcję
34
+ Zagadnienia specyficzne dla KSeF (bezpieczeństwo wywołań produkcyjnych,
35
+ obsługa poświadczeń, obsługa XML faktury, izolacja testów `ksef_live`).
36
+
37
+ ## Dokumenty referencyjne (`references/`)
38
+
39
+ | Plik | Temat | Zakres |
40
+ |------|-------|--------|
41
+ | `git-commits.md` | Format commita, gitmoji, atomowe commity | Obowiązkowe dla wszystkich commitów |
42
+ | `git-pr.md` | Format PR-a, porządkowanie, informacje zwrotne z przeglądu | Obowiązkowe dla wszystkich PR-ów |
43
+ | `git-jtbd.md` | Format Job Story, zasady, przykłady | Obowiązkowe dla decyzji JTBD |
44
+ | `review-guidelines.md` | Przepływ przeglądu, wątki, podsumowania | Obowiązkowe dla przeglądów PR-ów |
45
+ | `review-checks-common.md` | Fałszywe alarmy, weryfikacja, zagadnienia specyficzne dla KSeF | Obowiązkowe dla agentów przeglądu kodu |
46
+
47
+ ## Specyfikacje agentów (`.claude/agents/`)
48
+
49
+ | Plik | Wyzwalacz | Odwołania |
50
+ |------|---------|------------|
51
+ | `reviewer-generic.md` | `src/ksef_mcp/**/*.py` | `references/review-checks-common.md` |
52
+ | `reviewer-security.md` | `src/ksef_mcp/**/*.py`, `tests/**/*.py` | `references/review-checks-common.md` |
53
+ | `reviewer-test-patterns.md` | `tests/**/*.py` | `references/review-checks-common.md` |
54
+ | `reviewer-infra.md` | `.github/workflows/**`, `pyproject.toml`, `bin/**` | `references/review-checks-common.md` |
55
+ | `reviewer-docs.md` | `docs/**`, `.claude/**/*.md`, `README.md`, `CLAUDE.md` | `references/review-checks-common.md` |
56
+
57
+ ## Umiejętności własne (`.claude/skills/`)
58
+
59
+ | Umiejętność | Kiedy | Czego NIE robi |
60
+ |---|---|---|
61
+ | `release` | wydajesz nową wersję | nie redaguje notatek — deleguje do `release-notes` |
62
+ | `release-notes` | sekcja „Bez wydania" w `CHANGELOG.md` jest pusta albo niekompletna przed wydaniem | nie wydaje — podnoszenie wersji, tagowanie i publikacja należą do `bin/release.py` |
63
+
64
+ ## Budżety rozmiaru
65
+
66
+ | Typ pliku | Maks. linii |
67
+ |-----------|-----------|
68
+ | Specyfikacje agentów | 200 |
69
+ | Dokumenty referencyjne | 300 |
70
+ | `CLAUDE.md` | 120 |
71
+
72
+ To wytyczne, nie sztywne bramki — dziel plik, gdy trudno się w nim
73
+ poruszać, nie wyłącznie na podstawie liczby linii.
@@ -0,0 +1,158 @@
1
+ ---
2
+ name: release
3
+ description: >-
4
+ Use when cutting a ksef-mcp release — someone says „wydaj", „release",
5
+ „tag a version", „make release". Ustala numer, zleca redakcję notatek,
6
+ potwierdza z człowiekiem i uruchamia bin/release.py, a na koniec
7
+ zostawia otwarte zadanie na sprawdzenie publikacji.
8
+ DO NOT TRIGGER when: piszesz notatki bez wydawania (użyj release-notes)
9
+ albo pytasz o stan wydanych wersji.
10
+ user-invocable: true
11
+ allowed-tools:
12
+ - Bash(git log:*)
13
+ - Bash(git tag:*)
14
+ - Bash(git status:*)
15
+ - Bash(git ls-remote:*)
16
+ - Bash(bin/release.py:*)
17
+ - Bash(make release-dry:*)
18
+ - Bash(make release-fixes:*)
19
+ - Bash(make release-features:*)
20
+ - Bash(make release-major:*)
21
+ - Bash(gh release view:*)
22
+ - Bash(gh run list:*)
23
+ - Bash(curl:*)
24
+ - Read
25
+ - Skill
26
+ - AskUserQuestion
27
+ - TaskCreate
28
+ - TaskUpdate
29
+ ---
30
+
31
+ # Wydanie ksef-mcp
32
+
33
+ **Zapowiedz:** „Używam release, żeby wydać ksef-mcp <numer>."
34
+
35
+ Ustala numer, dopilnowuje notatek, potwierdza z człowiekiem i uruchamia
36
+ `bin/release.py`. Wzorowane na `.claude/skills/release/` z Dev10x-Claude,
37
+ ale bez pary gałęzi `develop`/`main` i bez wersji roboczych `.devN` — to
38
+ repozytorium ma jedną gałąź.
39
+
40
+ **Wypchnięcie taga jest nieodwracalne.** Wyzwala `pypi-publish.yml`,
41
+ a numeru wydanego na PyPI nie da się użyć ponownie nawet po wycofaniu
42
+ paczki ze sprzedaży. To jest punkt bez powrotu i tak go traktuj.
43
+
44
+ ## Orkiestracja
45
+
46
+ **WYMAGANE: utwórz zadania przy wywołaniu.**
47
+
48
+ 1. `TaskCreate(subject="Ustalić numer wydania", activeForm="Ustalam numer")`
49
+ 2. `TaskCreate(subject="Dopilnować notatek wydania", activeForm="Sprawdzam notatki")`
50
+ 3. `TaskCreate(subject="Wydać i otagować", activeForm="Wydaję")`
51
+
52
+ Zależności sekwencyjne. Zamykaj po kolei.
53
+
54
+ ## Przebieg
55
+
56
+ ### 1. Ustal numer i rodzaj podniesienia
57
+
58
+ ```bash
59
+ bin/release.py fixes --dry-run
60
+ ```
61
+
62
+ Przebieg próbny przechodzi wszystkie kontrole i podaje numer, nic nie
63
+ zmieniając. **Jest to jedyny bezpieczny sposób poznania numeru** — nie
64
+ licz go w głowie z `pyproject.toml`, bo przy przerwanym wydaniu skrypt
65
+ wznawia poprzedni numer zamiast podnosić.
66
+
67
+ | Rodzaj zmian | Cel | Skutek z 0.1.0 |
68
+ |---|---|---|
69
+ | poprawki, drobiazgi | `make release-fixes` | 0.1.1 |
70
+ | nowe zdolności | `make release-features` | 0.2.0 |
71
+ | zmiana niezgodna wstecz | `make release-major` | 1.0.0 |
72
+
73
+ Repozytorium jest na `0.x`, więc numery nie niosą jeszcze obietnicy
74
+ stabilności. Progiem, który ją wprowadzi, będzie pierwsze `1.0.0`.
75
+
76
+ Gdy przebieg próbny mówi „wznowienie", poprzednie wydanie przerwano
77
+ w połowie. Dokańczaj je, zamiast zaczynać nowe — skrypt sam to rozpozna.
78
+
79
+ ### 2. Dopilnuj notatek
80
+
81
+ `bin/release.py` odmawia wydania przy pustej sekcji `## Bez wydania`.
82
+ Przeczytaj ją i oceń, czy opisuje to, co faktycznie weszło:
83
+
84
+ ```bash
85
+ git log --no-merges --format='===%n%s%n%n%b' <ostatni-tag>..HEAD
86
+ ```
87
+
88
+ Gdy sekcja jest pusta albo niepełna — **`Skill(release-notes)`**. Ten
89
+ skill jej nie redaguje; redagowanie ma własne miejsce, bo tekst wolno
90
+ poprawiać wielokrotnie, a publikację robi się raz.
91
+
92
+ Notatki i wydanie GitHub to dwie różne rzeczy. `bin/release.py` tworzy
93
+ wydanie z `--generate-notes`, czyli z listą PR-ów; `CHANGELOG.md` jest
94
+ zapisem redagowanym przez człowieka. Oba są oczekiwane.
95
+
96
+ ### 3. Potwierdź, zanim uruchomisz
97
+
98
+ **WYMAGANE: wywołaj `AskUserQuestion`** (nie zwykły tekst). Pokaż numer
99
+ rozstrzygnięty w kroku 1, nie rodzaj podniesienia — człowiek zatwierdza
100
+ konkretną wersję, bo to ona jest nieodwracalna.
101
+
102
+ Opcje: rozstrzygnięty cel (zalecany), cel alternatywny z wyjaśnieniem
103
+ skutku, oraz wstrzymanie.
104
+
105
+ ### 4. Wydaj
106
+
107
+ ```bash
108
+ CONFIRM_RELEASE=<numer> make release-fixes
109
+ ```
110
+
111
+ **Zgoda niesie numer wersji, nie flagę.** Wartość musi zgadzać się
112
+ z wydawaną wersją, więc zostawiona w profilu powłoki nie autoryzuje
113
+ niczego poza tą jedną. Bez terminala i bez tej zmiennej skrypt odmawia.
114
+
115
+ Wymaga uprawnień administratora repozytorium: commit z podniesioną
116
+ wersją idzie wprost na `main`, a ta gałąź wymaga przeglądu PR-a.
117
+
118
+ ### 5. Sprawdź, czy wydanie dotarło
119
+
120
+ **Wydanie jest skończone dopiero, gdy wszystkie trzy powierzchnie się
121
+ zgadzają.** Tag wypchnięty to nie to samo co paczka na PyPI.
122
+
123
+ ```bash
124
+ git ls-remote --tags origin v<numer>
125
+ gh release view v<numer>
126
+ curl -s -o /dev/null -w '%{http_code}' https://pypi.org/pypi/ksef-mcp/<numer>/json
127
+ ```
128
+
129
+ Publikacja przechodzi przez GitHub Actions i trwa dłużej niż tag, więc
130
+ `404` z PyPI zaraz po wydaniu znaczy „jeszcze nie", nie „nie udało się".
131
+ Podejrzyj przebieg: `gh run list --workflow=pypi-publish.yml --limit 3`.
132
+
133
+ **WYMAGANE: zostaw otwarte zadanie**, bo tego kroku nie domknie ten
134
+ skill — publikacja dzieje się poza nim:
135
+
136
+ ```
137
+ TaskCreate(subject="Potwierdzić, że uvx ksef-mcp działa po wydaniu",
138
+ description="PyPI ma wersję <numer>; `uvx ksef-mcp --version` na
139
+ czystym środowisku zwraca ten numer. Dopiero wtedy zdolność
140
+ obiecywana w README jest dostarczona.")
141
+ ```
142
+
143
+ ## Typowe pomyłki
144
+
145
+ | Pomyłka | Konsekwencja |
146
+ |---|---|
147
+ | Numer policzony z `pyproject.toml` zamiast z przebiegu próbnego | Przy przerwanym wydaniu numer jest inny, niż myślisz, a zgoda nie przejdzie |
148
+ | `CONFIRM_RELEASE=1` zamiast numeru | Skrypt odmawia; wartość musi wskazywać jedną konkretną wersję |
149
+ | Uruchomienie `make` bez zgody w sesji nieinteraktywnej | Skrypt blokuje wydanie — i tak ma być |
150
+ | Uznanie wydania za skończone po wypchnięciu taga | Publikacja może odpaść na OIDC; paczki nie ma, a tag sugeruje, że jest |
151
+ | Kasowanie taga po nieudanej publikacji | Gdy numer trafił już na PyPI, nie da się go użyć ponownie — podnieś numer, nie kasuj |
152
+ | Redagowanie notatek w tym skillu | Powiela `release-notes`; tekst wolno poprawiać, wydanie nie |
153
+
154
+ ## Zobacz też
155
+
156
+ - `bin/release.py` — kontrole i ich uzasadnienia
157
+ - `.claude/skills/release-notes/` — redakcja sekcji „Bez wydania"
158
+ - `CHANGELOG.md` — format i zasada prowadzenia sekcji