Pre-publish packaging sanity scanner — verify PEP 621 metadata, license, changelog/version match, README links, and that every declared entry point actually imports and runs.
Project description
pkgcheck
Pre-publish packaging sanity scanner for Python packages.
twine check validates metadata syntax. It does not verify that your
declared console scripts actually import and run. pkgcheck does — it builds
your wheel and actually imports and invokes every entry point, so an
ImportError or a broken CLI surfaces before you ship a broken sdist to
PyPI.
Part of the Kryptorious developer tool fleet.
What it checks
| Check | Severity | Catches |
|---|---|---|
| PEP 621 fields | error/warning | Missing name, version, readme, requires-python, etc. |
| License file | error | license declared but no LICENSE at repo root |
| Changelog vs version | error | Top CHANGELOG entry doesn't match pyproject version |
| README links | warning | Dead URLs (opt-in, --check-links) |
| Entry-point resolvability | error | module.attr target doesn't import (module or symbol missing) |
| Entry-point callable | error | Target resolves to a non-callable |
| Package importable | error | Top-level package raises on import (e.g. bad __init__) |
| CLI actually runs | error | CLI produces no output when invoked (--help) |
The last four are the differentiator: pkgcheck builds a wheel into a temp dir
and imports from it, so it catches publish-breaking bugs that static metadata
checks miss.
Install
pip install kryptorious-pkgcheck
Usage
# Scan the current package (builds a wheel and tests entry points)
pkgcheck check
# Scan a specific path
pkgcheck check ./my-package
# Machine-readable output for CI — exits non-zero if not publish-ready
pkgcheck check --json
# Skip building a wheel (uses the installed/editable package instead)
pkgcheck check --no-build
# Probe README URLs over the network
pkgcheck check --check-links
In CI
- name: Packaging gate
run: pkgcheck check --json
pkgcheck exits 0 only when the package is publish_ready (no errors,
no blocking issues). Wire it as a required status check before your publish job.
Exit codes
0— publish ready (or--jsonwith zero blocking issues)1— not publish ready (errors present) or human report has errors1— CI JSON mode with blocking issues
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file kryptorious_pkgcheck-1.0.0.tar.gz.
File metadata
- Download URL: kryptorious_pkgcheck-1.0.0.tar.gz
- Upload date:
- Size: 11.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
256f98ff6bbd10cfd2747cffdaac867d522a37bf33ca80f8f5c2808536d1e664
|
|
| MD5 |
1a73ff81c87bdfdefa849ede2a1d29c4
|
|
| BLAKE2b-256 |
51d7323d4a184e1a4406f32699f78ce9a7d128d3fce9025ac26194ebb86812dc
|
File details
Details for the file kryptorious_pkgcheck-1.0.0-py3-none-any.whl.
File metadata
- Download URL: kryptorious_pkgcheck-1.0.0-py3-none-any.whl
- Upload date:
- Size: 11.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
957b4a342d68530e0f365066205a38fdbd19e01918b97adf4cc9085c26bc0b74
|
|
| MD5 |
8e3c6c4f817ffcc5e55200771bb15dc7
|
|
| BLAKE2b-256 |
335536a229d2585089723dcab3c8b42f8d2bf9c3ae52a217409f549d961ffebf
|