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.
- ksef_mcp-0.1.1/.bumpversion.toml +23 -0
- ksef_mcp-0.1.1/.claude/agents/reviewer-docs.md +76 -0
- ksef_mcp-0.1.1/.claude/agents/reviewer-generic.md +68 -0
- ksef_mcp-0.1.1/.claude/agents/reviewer-infra.md +80 -0
- ksef_mcp-0.1.1/.claude/agents/reviewer-security.md +64 -0
- ksef_mcp-0.1.1/.claude/agents/reviewer-test-patterns.md +86 -0
- ksef_mcp-0.1.1/.claude/rules/INDEX.md +73 -0
- ksef_mcp-0.1.1/.claude/skills/release/SKILL.md +158 -0
- ksef_mcp-0.1.1/.claude/skills/release-notes/SKILL.md +165 -0
- ksef_mcp-0.1.1/.github/pull_request_template.md +55 -0
- ksef_mcp-0.1.1/.github/workflows/adr-numbering.yml +28 -0
- ksef_mcp-0.1.1/.github/workflows/adr-provenance-drift.yml +54 -0
- ksef_mcp-0.1.1/.github/workflows/adr-rederivation.yml +217 -0
- ksef_mcp-0.1.1/.github/workflows/claude-adr-review.yml +363 -0
- ksef_mcp-0.1.1/.github/workflows/claude-code-review.yml +218 -0
- ksef_mcp-0.1.1/.github/workflows/claude-memory-review.yml +318 -0
- ksef_mcp-0.1.1/.github/workflows/claude-pr-hygiene.yml +171 -0
- ksef_mcp-0.1.1/.github/workflows/claude.yml +98 -0
- ksef_mcp-0.1.1/.github/workflows/git.yml +30 -0
- ksef_mcp-0.1.1/.github/workflows/pypi-publish.yml +76 -0
- ksef_mcp-0.1.1/.github/workflows/pytest.yml +102 -0
- ksef_mcp-0.1.1/.gitignore +225 -0
- ksef_mcp-0.1.1/.gitlint +18 -0
- ksef_mcp-0.1.1/.node-version +1 -0
- ksef_mcp-0.1.1/.pre-commit-config.yaml +28 -0
- ksef_mcp-0.1.1/.python-version +1 -0
- ksef_mcp-0.1.1/CHANGELOG.md +86 -0
- ksef_mcp-0.1.1/CLAUDE.md +196 -0
- ksef_mcp-0.1.1/LICENSE +661 -0
- ksef_mcp-0.1.1/Makefile +55 -0
- ksef_mcp-0.1.1/PKG-INFO +200 -0
- ksef_mcp-0.1.1/README.md +178 -0
- ksef_mcp-0.1.1/bin/check-adr-drift.py +84 -0
- ksef_mcp-0.1.1/bin/check-adr-numbers.py +61 -0
- ksef_mcp-0.1.1/bin/decision_provenance.py +98 -0
- ksef_mcp-0.1.1/bin/rederive-sample.py +214 -0
- ksef_mcp-0.1.1/bin/release.py +490 -0
- ksef_mcp-0.1.1/bin/test_check_adr_drift.py +108 -0
- ksef_mcp-0.1.1/bin/test_decision_provenance.py +132 -0
- ksef_mcp-0.1.1/bin/test_rederive_sample.py +187 -0
- ksef_mcp-0.1.1/bin/test_release.py +568 -0
- ksef_mcp-0.1.1/docs/adr/100-decision-provenance-and-adversarial-re-derivation.md +119 -0
- ksef_mcp-0.1.1/docs/adr/TEMPLATE.md +70 -0
- ksef_mcp-0.1.1/docs/domain/README.md +27 -0
- ksef_mcp-0.1.1/docs/domain/decisions.md +1362 -0
- ksef_mcp-0.1.1/docs/domain/epics.md +261 -0
- ksef_mcp-0.1.1/docs/domain/glossary.md +24 -0
- ksef_mcp-0.1.1/docs/domain/model.md +161 -0
- ksef_mcp-0.1.1/docs/domain/stress-tests.md +183 -0
- ksef_mcp-0.1.1/docs/domain/workshops/001-mvp-odczyt-faktur.md +150 -0
- ksef_mcp-0.1.1/docs/domain/workshops/TEMPLATE.md +11 -0
- ksef_mcp-0.1.1/pyproject.toml +74 -0
- ksef_mcp-0.1.1/references/git-commits.md +113 -0
- ksef_mcp-0.1.1/references/git-jtbd.md +171 -0
- ksef_mcp-0.1.1/references/git-pr.md +188 -0
- ksef_mcp-0.1.1/references/review-checks-common.md +189 -0
- ksef_mcp-0.1.1/references/review-guidelines.md +211 -0
- ksef_mcp-0.1.1/requirements/base.txt +32 -0
- ksef_mcp-0.1.1/requirements/development.txt +14 -0
- ksef_mcp-0.1.1/src/ksef_mcp/__init__.py +4 -0
- ksef_mcp-0.1.1/src/ksef_mcp/cli.py +464 -0
- ksef_mcp-0.1.1/src/ksef_mcp/config.py +117 -0
- ksef_mcp-0.1.1/src/ksef_mcp/ksef_port.py +129 -0
- ksef_mcp-0.1.1/src/ksef_mcp/metadata.py +11 -0
- ksef_mcp-0.1.1/src/ksef_mcp/preflight.py +143 -0
- ksef_mcp-0.1.1/src/ksef_mcp/server.py +21 -0
- ksef_mcp-0.1.1/src/ksef_mcp/token_store.py +117 -0
- ksef_mcp-0.1.1/tests/conftest.py +6 -0
- ksef_mcp-0.1.1/tests/test_cli.py +765 -0
- ksef_mcp-0.1.1/tests/test_config.py +96 -0
- ksef_mcp-0.1.1/tests/test_ksef_port.py +268 -0
- ksef_mcp-0.1.1/tests/test_preflight.py +247 -0
- ksef_mcp-0.1.1/tests/test_server.py +50 -0
- ksef_mcp-0.1.1/tests/test_token_store.py +210 -0
- 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
|