Skip to main content

entryprobe

License: MIT Python 3.9+ No dependencies

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:

  1. The target module file exists in the distribution (ENTRY_OK vs ENTRY_MISSING_MODULE).
  2. The target's module-level imports that run at import time are accounted for: stdlib is skipped, Requires-Dist dependencies are expected (plus a small documented alias table for famous dist-name/import-name divergences like Pillow → PIL). Anything else absent from the distribution is UNKNOWN_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 ImportError fallbacks, if TYPE_CHECKING: blocks, and if __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)

Source distribution for entryprobe 0.1.1
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)

Table of built distributions (wheels) for entryprobe 0.1.1
File Interpreter ABI Platform Actions
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.

Release history Release notifications | RSS feed

This release

0.1.1 This release

2 release files No provenance

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page