entryprobe
Your Python package installed. Its CLI crashed on --help.
Real case: ggml-org/llama.cpp#23740.
uv tool install 'llama-cpp-scripts @ git+https://github.com/ggml-org/llama.cpp.git'
succeeded — then llama-convert-hf-to-gguf --help died immediately:
ModuleNotFoundError: No module named 'conversion'
Root cause: since a refactor, the conversion scripts import from the new
conversion/ package directory, but [tool.poetry] packages still said
[{ include = "*.py", from = "." }] — and a *.py glob does not match
directories. Every install built a wheel whose entry points pointed at code
that wasn't in the wheel. Running the scripts from the source tree worked
(Python resolved conversion/ from the working directory), which is why
nobody noticed. Fixed by PR #23746
(2026-05-27), which added conversion to the packaged files.
A second flavor of the same disease:
SolaceLabs/solace-agent-mesh#1645 —
editable installs generate a broken sam console command. The entry points
target solace_agent_mesh.cli.main:cli, but the CLI source lives in the
top-level cli/ directory; wheel builds force-include it via Hatch, while
editable installs expose only src/. (That repo is deprecated, so this one is
still broken and won't be fixed.)
entryprobe checks that a package's declared console_scripts entry points can actually start — the release-integrity question nobody's CI asks.
Part of the release-integrity series: readmeta (did your README render?), wheeltruth (did your wheel ship complete?), casecrash (will your filenames survive checkout?), tagtruth (does the tag match the release?), wheelreach (can your Python install it?), entryprobe (does the installed CLI start?).
Quickstart
pip install entryprobe # PyPI upload pending; install from source meanwhile
entryprobe check --wheel dist/mypackage-1.0-py3-none-any.whl
entry point target verdict
----------------------- ---------------------- --------------------
llama-convert-hf-to-gguf convert_hf_to_gguf:main UNKNOWN_IMPORT
checked 1 entry point(s), 1 problem(s)
llama-convert-hf-to-gguf: entry point 'llama-convert-hf-to-gguf' (convert_hf_to_gguf)
imports 'conversion': not in the distribution and not matching any declared
dependency -- either a missing first-party module or a third-party import
whose distribution name differs from its import name; review needed
Or check an installed distribution:
entryprobe check --package some-installed-pkg
Exit codes: 0 clean, 1 problems found, 2 errors (bad args, unreadable wheel).
What check actually verifies
For each console_scripts entry point:
- The target module file exists in the distribution (
ENTRY_OKvsENTRY_MISSING_MODULE). - The target's module-level imports that run at import time are accounted
for: stdlib is skipped,
Requires-Distdependencies are expected (plus a small documented alias table for famous dist-name/import-name divergences like Pillow → PIL). Anything else absent from the distribution isUNKNOWN_IMPORT— the tool cannot tell a missing first-party module from a third-party import with a divergent name, so it reports "needs review" instead of guessing. Function-level (lazy) imports,try/except ImportErrorfallbacks,if TYPE_CHECKING:blocks, andif __name__ == "__main__":blocks don't decide whether an entry point starts, so they're ignored.
Opt-in smoke test
check is static: it can't catch import errors inside a present module.
smoke goes one step further — on a local wheel file you explicitly name,
in a fresh temporary venv, running arguments you choose:
entryprobe smoke --wheel dist/mypackage-1.0-py3-none-any.whl -- --help
entry point: mycli --help
verdict: SMOKE_OK
exit code: 0
Safety contract: smoke never downloads or executes arbitrary public packages.
It installs with --no-deps into a throwaway venv (deleted afterwards) and
runs only the command you typed. Verdicts: SMOKE_OK, SMOKE_FAILED
(nonzero exit; traceback tail captured), SMOKE_TIMEOUT.
Two honest caveats. First, a venv is not a security sandbox: smoke runs
real code from the wheel you named, with access to your files and network.
Only smoke-test wheels you trust, and read the caveat as "isolated
environment", not "safe room". Second, --no-deps means a perfectly healthy
CLI can fail smoke from missing declared dependencies — a SMOKE_FAILED
caused by ModuleNotFoundError for a declared dependency says more about
the test environment than the release; the report distinguishes this case.
Verdicts
| Verdict | Meaning | Problem? |
|---|---|---|
ENTRY_OK |
target module present; no missing imports found within static scope (not a proof the module imports successfully) | no |
ENTRY_MISSING_MODULE |
the entry target module itself is absent from the distribution | yes |
UNKNOWN_IMPORT |
an import-time dependency is unverifiable: absent and undeclared — missing first-party module or divergent third-party name; review needed | yes |
NO_ENTRY_POINTS |
no console_scripts declared |
no (informational) |
SMOKE_OK / SMOKE_FAILED / SMOKE_TIMEOUT |
smoke test outcome | failed/timeout: yes |
What entryprobe does not verify
The static check is one import level deep and syntactic: it proves the entry
target and its import-time dependencies are present, not that importing
them succeeds (a module can be present and still raise). Deep runtime
failures are what smoke is for — and smoke only ever runs a local wheel you
name, with arguments you choose. Entry points whose targets are C extensions
or namespace packages are checked for file presence only.
Metadata
Release files for entryprobe 0.1.1
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| entryprobe-0.1.1.tar.gz | 20.6 kB | Without provenance | Details for entryprobe-0.1.1.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| entryprobe-0.1.1-py3-none-any.whl | Python 3 | none | any | Details for entryprobe-0.1.1-py3-none-any.whl |
Total release size: 36.1 kB
Release files / entryprobe-0.1.1.tar.gz
| Download URL | entryprobe-0.1.1.tar.gz |
|---|---|
| Size | 20.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
d8509b47bc1cfcc9192fd7b4502ed0f11f6a77603e8c8d061ea983f6ebd626b8
|
|
BLAKE2b-256 checksum How to use checksums |
8dd49a145b7bbb769d4c055251ba7fc431d595442d22aed000ff2a9e00493f78
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / entryprobe-0.1.1-py3-none-any.whl
| Download URL | entryprobe-0.1.1-py3-none-any.whl |
|---|---|
| Size | 15.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
87492c0111a71a021ca0c3dbab50842718dc05404531dd9a78a2f208c7170444
|
|
BLAKE2b-256 checksum How to use checksums |
877d6ea956de0704788bb90b39331ae626784730618b6e9f43e15e5892a44287
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Security for entryprobe 0.1.1
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.