{"id":49955384,"url":"https://github.com/stanislawbartkowski/ksef_cli","last_synced_at":"2026-05-17T23:04:42.181Z","repository":{"id":328556327,"uuid":"1115378506","full_name":"stanislawbartkowski/ksef_cli","owner":"stanislawbartkowski","description":null,"archived":false,"fork":false,"pushed_at":"2026-05-16T23:11:24.000Z","size":257,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-17T00:48:08.393Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/stanislawbartkowski.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-12T19:14:18.000Z","updated_at":"2026-05-16T23:11:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/stanislawbartkowski/ksef_cli","commit_stats":null,"previous_names":["stanislawbartkowski/ksef_cli"],"tags_count":10,"template":false,"template_full_name":null,"purl":"pkg:github/stanislawbartkowski/ksef_cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanislawbartkowski%2Fksef_cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanislawbartkowski%2Fksef_cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanislawbartkowski%2Fksef_cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanislawbartkowski%2Fksef_cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/stanislawbartkowski","download_url":"https://codeload.github.com/stanislawbartkowski/ksef_cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/stanislawbartkowski%2Fksef_cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33158772,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"ssl_error","status_checked_at":"2026-05-17T22:39:10.741Z","response_time":107,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2026-05-17T23:04:36.497Z","updated_at":"2026-05-17T23:04:37.722Z","avatar_url":"https://github.com/stanislawbartkowski.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"## Opis\n\nJest to \"command line\" rozszerzenie rozwiązania: https://github.com/stanislawbartkowski/ksef_pyth. Umożliwia komunikację z systemem KSeF z poprzez wywołanie python3. Daje to możliwość integracji z systemami, które nie są oparte w Python.\n\nDodatkowe cechy rozwiązania:\n\n* Konfiguracje metody autentykacji: token lub certyfikat na podstawie pliku konfiguracyjnego\n* Tworzenie dziennika i logów, historii wykonywanych operacji.\n* Możliwość wywołania funkcjonalności z poziomu bash lub bezpośrednio jako komenda python3\n\n## Python\n\nTestowane dla wersji: 3.10, 3.11 i 3.12\n\nTestowane w testowym środowisku KSeF 2.0. Jest także wykorzystywane w produkcyjnym środowisku.\n\n## Konfiguracja\n\nZmienne środowiskowe\n\n* KSEFCONF - plik zawierający listę dopuszczalnych NIPów oraz tokenów związanych z NIPami. Zawiera także definicje obsługiwanego środowiska KSeF 2.0 - deweloperskie/testowe, przedprodukcyjne oraz produkcyjne.\n* KSEFDIR - katalog na logi operacji\n\n## Instalacja\n\u003e pip install git+https://github.com/stanislawbartkowski/ksef_cli.git\u003cbr\u003e\n\nlub\n\n\u003e pip install ksef2.0-cli\n\n\n\u003e python\u003cbr\u003e\n\u003e import ksef_cli\u003cbr\u003e\n\n## Konfiguracja NIP oraz metody autentykacji\n\nPlik jest wskazywany przez zmienną środowiskową *KSEFCONF*. Jest to plik w formacie YAML.\n\n```\ntokens:\n  NIP{nip}:\n    token: {token dla NIP}\n    env: prod|demo|test  (produkcyjne, demo, testowe)\n```\n\n### Token\n\nPrzykład: \u003cbr\u003e\nNIP - 7497725064 \u003cbr\u003e\nWartość tokena dostępowego dla NIP \u003cbr\u003e\nŚrodowisko testowe \u003cbr\u003e\n\n```YAML\n  NIP7497725064:\n    token: 20251116-EC-0317C65000-2CA83C40D9-73|nip-7497725064|80be6cfced7f44eb860aeeb644e8cffdd59bbad9e218415296db90a39e6e5370\n    env: test\n```\n\n### Certyfikat\n\nPrzykład: \u003cbr\u003e\nNIP - 7497725064 \u003cbr\u003e\nŚrodowisko testowe \u003cbr\u003e\nPlik p12 z certyfikatami: keyStore.p12\u003cbr\u003e\nHasło odczytu: 1234\n\n```YAML\n  NIP7497725064:\n    env: test\n    password: \"1234\"\n    p12: keyStore.p12\n```\n\nDodatkowa informacja dotycząca certyfikatów.\n\nTesty były przeprowadzane tylko dla tylko dla testowych certyfikatów generowanych poprzez testowe środowisko KSeF 2.0\n\nParametr p12 wskazuje na plik w formacie P12 zawierający wygenerowany klucz i certyfikat.\n\nPrzykładowa komenda tworząca plik P12. Pliki CertyfikatKSEF zawierają pliki utworzone przez KSeF 2.0\n\n\u003e openssl pkcs12 -export -out keyStore.p12 -inkey CertyfikatKSEF.key  -in CertyfikatKSEF.crt\n\n## NIP\nNIP przekazywany jako parametr do wszystkich wywołań może przybierać dwie postacie:\n\n* NIP\n* NIP$podkatalog\n\nW drugim przypadku po symbolu NIP są dodane separator $ oraz nazwa podkatalogu. Podkatalog ma znaczenie dla tworzenia struktury logów oraz miejsca składowania faktur/UPO. Bez podkatalogu miejscem jest zawsze symbol NIP. Z podkatalogiem do NIP jest dodawany podkatalog. \nTen sam symbol NIP może być wywoływany z różnymi podkatalogami. Przykład:\n* 7497725064, miejscem składowania jest NIP 7497725064\n* 7497725064$ROK2025, miejscem składowania jest 7497725064/ROK2025  \n\n## Struktura kodu w Python\n\n* ksef_cli\n  * ksef_cli.py Dostępna funkcjonalność\n  * ksef_conf.py Wykorzystywany wewnętrznie, konfiguracja\n  * ksef_log.py Wykorzystywany wewnętrznie, tworzenie dziennika\n  * ksef_tokens.py Wykorzystywany wewnętrznie, tokeny i środowiska\n* tests  Unit test suite\n\n## Struktura katalogu z logami i dziennikiem\n\nKatalog jest wskazywany przez zmienną środowiskową *KSEFDIR*. Dane są logowane na poziomie wspólnym i na poziomie NIP. Dodatkowo każda wysłana faktura tworzy podkatalog z numerem KSeF nadanym po wysłaniu, gdzie zawarty jest odczytany plik UPO oraz wysłana faktura. Zapamietywane są tylko faktury zaakceptowane w KSeF 2.0 i mające nadany numer KSeF.\n\n* KSEFDIR\n  * events.csv Plik w formacie tekstowym CSV z historią operacji. Pamiętane są operacje zakończone sukcesem oraz operacje, które nie zostały wykonane z opisem błędu.\n  * ksef.log Zawiera dane logging z wykonywania\n  * {nip}\n    * events.csv Plik w formacie tekstowym CSV z historią operacji. Zawiera te same dane co plik event.csv w katalogu KSEFDIR, ale tylko dla danego NIP\n    * ksef.log Zawiera dane logging z wykonywania, Zawiera te same dane co plik ksef.log w katalog KSEFDIR, ale tylko dla operacji związanych z danym NIP\n    * {ksef_number} Dla każdej wysłanej i zaakceptowanej faktury z danego NIP\n      * upo.xml Plik UPO\n      * faktura.xml Wysłana faktura\n\nPrzykładowy fragment pliku events.csv\n```csv\n2025-12-16T20:49:42.166316,2025-12-16T20:49:42.917164,0.75,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() got an unexpected keyword argument 'run_func',7497725064,\n2025-12-16T20:50:30.552768,2025-12-16T20:50:31.310412,0.76,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() got an unexpected keyword argument 'run_func',7497725064,\n2025-12-16T20:53:06.316936,2025-12-16T20:53:07.139957,0.82,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,\n2025-12-16T20:54:07.355882,2025-12-16T20:54:08.150260,0.79,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,\n2025-12-16T20:54:08.754346,2025-12-16T20:54:09.493529,0.74,1,Czytanie faktur zakupowych,FAIL,KSEFCLI._czytaj_faktury_zakupe_action() missing 1 required positional argument: 'K',7497725064,\n2025-12-16T20:54:54.710717,2025-12-16T20:54:55.807550,1.10,1,Czytanie faktur zakupowych,OK,,7497725064,2025-12-11 - 2025-12-18\n2025-12-16T20:54:55.809410,2025-12-16T20:54:56.915264,1.11,4,Weź fakturę z KSeF,OK,,7497725064,\n2025-12-16T20:58:32.052180,2025-12-16T20:58:35.711541,3.66,2,Wyślij fakture do KSeF,FAIL,Nieprawidłowy zakres uprawnień Kontekst 7497725064 nie jest uprawniony do wystawienia faktury w imieniu sprzedawcy (NIP: 7952809480),7497725064,\n2025-12-16T20:58:36.123971,2025-12-16T20:58:38.096498,1.97,1,Czytanie faktur zakupowych,OK,,7497725064,2025-12-11 - 2025-12-18\n```\n## Przyrostowe odczytywanie faktur zakupowych\n\nDostępne są trzy dodatkowe funkcjonalności, bardziej szczegółowy opis w sekcji *Operacje*\n\n* daj_zakupowe_bufor Odczytuje listę metadanych aktualnie zapisanych z buforze\n* uaktualnij_zakupowe_bufor Uaktualnia bufor o faktury,które się pojawiły od poprzedniej aktualizacji\n* wez_faktura_bufor Ścieżka dostęu do faktury zakupowej XML w buforze\n\nFaktury zakupowe są zapisywane w katalogu {KSEFDIR}-zakupowe - ścieżka wskazywana przez zmienną KSEFDIR z dodanym przyrostkiem -zakupowe.\u003cbr\u003e\nKażda faktura zakupowa jest trzymana w osobnym katalogu z zawierającym dwa pliki:\u003cbr\u003e\n* {KSEF-DIR}-zakupowe\n  * \\/numer nip\\/\n    * \\/numer ksef\\/\n      * faktura.xml Faktura KSeF jako XML\n      * metadane.json Dane z opisem faktury w formacie JSON\n     \n## Operacje\n\nWywołanie:\n\n\u003e python -m ksef_cli \u003cakcja\u003e \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cdodatkowe_parametry\u003e\n\nakcja, dopuszczalne wartości:\n* wyslij_fakture Wysłanie faktury do system KSeF 2.0\n* odczytaj_upo Odczytaj plik UPO do wysłanej i zaakceptowanej faktury\n* pobierz_zakupowe Odczytaj nagłówki (metadata) faktur zakupowych\n* odczytaj_fakture Odczytaj fakturę na podstawie nadanego numeru KSeF\n* wyslij_wsadowo Wysyła paczkę faktur w sesji wsadowej\n\nnip:\n* Numer NIP użytkownika KSeF 2.0. Numer NIP musi być zawarty w pliku *KSEFCONF*. Z pliku konfiguracyjnego jest odczytywany odpowiedni token służący do autentykacji.\n\nplik_na_wynik:\n* Nazwa pliku, gdzie będzie zapisany wynik akcji. Wynik jest zapisany w formacie JSON.\n\nPlik zawiera zawsze dwa pola oraz dodatkowe pola zależne od akcji\n* OK: true/false Akcja zakończona sukcesem lub niepowodzeniem\n* errmess: Jeśli akcja zakończona niepowodzeniem, to informacja o błędzie\n\nDziałanie:\n* Odczytuje NIP oraz wyszukuje metodę autentykacji (token lub certyfikat) w pliku *KSEFCONF*\n* Autentykacja z użyciem NIP oraz poprzez token lub certyfikat\n* Wykonuje akcję na podstawie podanych paeametrów\n* Uzupełnia dziennik oraz logging w katalogu *KSEFDIR*\n* Zapisuje plik *plik_na_wynik* w formacie JSON z wynikiem akcji\n\nDodatkowa uwaga:\n\nWywołanie nie zwraca znaczącego *exit code*. Wynik akcji, także niepowodzenie, trzeba odczytać z pliku *plik_na_wynik*\n\n## wyslij_fakture\n\n[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#wys%C5%82anie-faktury)\n\n\u003e python -m ksef_cli wyslij_fakture \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cplik XML z fakturą do wysłania\u003e\n\nZwracana wartość w pliku *plik_na_wynik*\n* OK\n* errmess\n* numer_ksef Jeśli faktura jest zaakceptowana w systemie KSeF 2.0, to nadany przez KSeF 2.0 numer\n\n## wyslij_wsadowo\n[link](https://github.com/stanislawbartkowski/ksef_pyth/tree/main?tab=readme-ov-file#wys%C5%82anie-paczki-faktur-w-trybie-wsadowym)\n\n\u003e python -m ksef_cli wyslij_wsadowo \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003ckatalog z paczką faktur\u003e\n\n* \\\u003ckatalog z paczką faktur\\\u003e. Katalog w którym znajdują się faktury XML gotowe do wysłania do systemu KSeF. Wysyłane są tylko pliki z rozszerzeniem \\.xml, inne pliki są ignorowane. UWAGA: w środowisku testowym akceptowanych jest tylko pierwsze 10 faktur, pozostałe są ignorowane bez sygnalizowania żadnego błędu.\n\nDziałanie:\n* Faktury z katalogu są pakowane w formacie ZIP i wysyłane do systemu KSeF zgodnie ze specyfikacją API. Jeśli rozmiar po spakowaniu przekracza 100MB, to dane są odpowiednio dzielone na poszczególne paczki.\n\nZwracana wartość w pliku *plik_na_wynik*\n* OK\n* errmess\n* invoices Lista wysłanych faktur z nadanym numerem KSeF. Jeden element listy zawiera następujące informacje:\n  * ok True/False True jeśli faktura została zaakceptowana w KSeF 2.0 i ma nadany numer KSeF\n  * msg Jeśli ok=False, to komunikat o błędzie\n  * ordinalNumber Numer kolejny faktury w paczce faktur (od 1)\n  * invoiceNumber Numer faktury pobrany ze źródłowego pliku XML\n  * ksefNumber Jeśli faktura jest zaakceptowana, to nadany numer KSeF\n  \n\n## odczytaj_upo\n\n[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-upo)\n\n\u003e python -m ksef_cli odczytaj_upo  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cnumer_ksef\u003e\n\nZwracana wartość w pliku *plik_na_wynik*\n* OK\n* errmess\n* upo Nazwa pliku zawierającego UPO w formacie XML\n\nUWAGA: UPO jest odczytywane bezpośrednio po wysłaniu faktury *wyslij_fakture* i zapamiętane w katalogu *KSEFDIR*/nip/numer_ksef. Wywołanie *odczytaj_upo* zwraca link do tego pliku, nie jest uruchamiana komunikacja z KSeF.\n\n## odczytaj_fakture\n\n[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-faktury-wed%C5%82ug-numeru-ksef)\n\n\u003e python -m ksef_cli odczytaj_fakture  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cnumer_ksef\u003e\n\nZwracana wartość w pliku *plik_na_wynik*\n* OK\n* errmess\n* invoice Nazwa plik z odczytaną fakturą w formacie XML\n\n## pobierz_zakupowe\n\n[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-nag%C5%82%C3%B3wk%C3%B3w-faktur-zakupowych-na-podstawie-dat)\n\n\u003e python -m ksef_cli pobierz_zakupowe  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cdata_od\u003e \u003cdata_do\u003e\n\nOdczytuje faktury zakupowe w przedziale dat. Daty muszą być w formacie YYYY-MM-DD\n\nZwracana wartość w pliku *plik_na_wynik*\n* OK\n* errmess\n* faktury Lista zawierająca odczytane nagłówki faktur zakupowych z podanego zakresu dat.\n\n## pobierz_sprzedazowe\n\n[link](https://github.com/stanislawbartkowski/ksef_pyth/tree/main?tab=readme-ov-file#odczytanie-nag%C5%82%C3%B3wk%C3%B3w-faktur-na-podstawie-dat)\n\n\u003e python -m ksef_cli pobierz_sprzedazowe  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cdata_od\u003e \u003cdata_do\u003e\n\nOdczytuje faktury sprzedażowe w przedziale dat. Daty muszą być w formacie YYYY-MM-DD\n\nZwracana wartość w pliku *plik_na_wynik*\n* OK\n* errmess\n* faktury Lista zawierająca odczytane nagłówki faktur sprzedażowych z podanego zakresu dat.\n\n## pobierz_zbiorczo\n\n[link](https://github.com/stanislawbartkowski/ksef_pyth?tab=readme-ov-file#odczytanie-paczki-faktur)\n\n\u003e python -m ksef_cli pobierz_zbiorczo  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e \u003cdata_od\u003e \u003cdata_do\u003e \\\u003csubject\\\u003e\n\n\nZwraca w plik_na_wynik\n  * OK: true/false\n  * errmess\n  * katalog: Katalog tymczasowy, gdzie znajdują się odczytane faktury lub None, jeśli nic nie odczytano. Jeśli odczytano faktury, to w katalogu pojawi się także plik _metadata.json zawierający zbiorczą informację o odczytanych fakturach.\n  * liczba_faktur: Liczba odczytanych faktur. Liczba może być 0, wówczas katalog jest None\n  * subject:\n    * Subject1\tPodmiot 1 - sprzedawca\n    * Subject2\tPodmiot 2 - nabywca\n    * Subject3\tPodmiot 3\n    * SubjectAuthorized\tPodmiot upoważniony\n\n## daj_konfiguracje\n\nPozwala sprawdzić, czy NIP jest skonfigurowany do komunikacji z systemem KSeF 2.0\n\n\u003e python -m ksef_cli daj_konfiguracje  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e\n\nZwraca w plik_na_wynik\n  * OK: true/false\n  * errmess\n  * mess, Dodatkowy komunikat\n  * auth, Dwa wartości, token lub certyfikat\n  * env, Środowisko: prod, demo lub test. Wartość z pliku kseftoken\n  * files:\n    * ksef_conf, wartość zmiennej konfiguracyjnej KSEFCONF\n    * work_dir, ścieżka katalogu z danymi dla NIP. Jest to podkatalog WORKDIR dla danego NIP\n    * log_file, ścieżka do pliku z logami tworzonymi w trakcie wykonywania operacji\n    * events_file, ścieżka do pliku z dziennikiem operacji dla danego NIP\n\n## daj_zakupowe_bufor\n\nOdczytuje aktualną zawartość bufora faktur zakupowych z katalogu {KSEFDIR}-zakupowe. Odczytywane są pliki metadata.json dla każdej faktury, nie jest tutaj nawiązywana komunikacja z systemem KSeF 2.0\n\n\u003e python -m ksef_cli daj_zakupowe_bufor  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e\n\nZwraca w plik_na_wynik\n  * OK: true/false\n  * errmess\n  * invoices Lista metadada.json faktur zakupowych znajdujących się w buforze. UWAGA: zwracane są metadata.json. Fakturę w postaci XML należy odczytać za pomocą wywołania wez_faktura_bufor\n  * ostatnia_data Data (timestamp) najpóźniejszej faktury znajdującej sie w buforze\n\n## uaktualnij_zakupowe_bufor\n\nAktualizuje bufor faktur zakupowych o nowe faktury. Możliwe są dwa przypadki:\n* Bufor jest pusty. Odczytywane są faktury z zakresu 2 miesiące wstecz do daty dzisiejszej\n* Bufor zawiera faktury. Odczytywane są faktury z KSeF od najpóźniejszej daty faktury z bufora do daty dzisiejszej. Dodawane są tylko nowe faktury, jeśli w odczytane faktury z KSeF nakładają się na istniejące w buforze, to takie faktury są pomijane.\n\n\u003e python -m ksef_cli uaktualnij_zakupowe_bufor  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e\n\nZwraca w plik_na_wynik\n  * OK: true/false\n  * errmess\n  * liczba_faktur Liczba nowo znalezionych faktur. Liczba może być równa 0, jeśi nic sie nie zmieniło od ostatniej aktualizacji\n\n## wez_faktura_bufor\n\nZwraca ścieżkę dostępu do pliku XML z fakturą KSeF\n\n\u003e python -m ksef_cli wez_faktura_bufor  \\\u003cnip\\\u003e \u003cplik_na_wynik\u003e\n\nZwraca w plik_na_wynik\n  * OK: true/false\n  * errmess\n  * faktura_path Ścieżka dostępu do pliku XML z zawartością faktury zakupowej KSeF w buforze.\n  \n\n## Przykładowe wywołanie\n\u003e export KSEFCONF=/ścieżka/ \u003cbr\u003e\n\u003e export KSEFDIR=/ścieżka/ \u003cbr\u003e\n\u003e python -m ksef_cli /parametry/ \u003cbr\u003e\n\n## Dev environment, happy coding\n\u003e source .venv/bin/activate\u003cbr\u003e\n\u003e git clone https://github.com/stanislawbartkowski/ksef_cli.git\u003cbr\u003e\n\u003e pip install -e \".[dev]\"\u003cbr\u003e\n\u003e code .\u003cbr\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstanislawbartkowski%2Fksef_cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fstanislawbartkowski%2Fksef_cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fstanislawbartkowski%2Fksef_cli/lists"}