16 Commits
Author SHA1 Message Date
Vinta ChenandClaude 3322bb3ce7 feat: add betterleaks to Supply Chain Security > Secret Scanning
Leaked secrets are a supply chain risk that dependency audits don't cover, so Supply Chain Security splits into Dependency Audits and Secret Scanning.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-16 17:26:54 +08:00
Vinta ChenandClaude 9a0040257b feat: add mise to Environment Management
Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-16 17:26:23 +08:00
Vinta ChenandClaude 187b25bb1d audit: remove jev-ultrafast from Web Scraping > Frameworks
Removed: jev-ultrafast (no PyPI download signal; not published on PyPI): its README calls it an MVP and it needs a hosted API key, so the challenger slot goes to scrapling in the next commit. This overrides the Challenger Exception recorded 2026-10-02.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-16 17:26:03 +08:00
Vinta ChenandClaude 80b502d672 feat: add wshobson-agents to AI and Agents > Agent Skills
Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-14 23:08:36 +08:00
Vinta ChenandClaude 265c7b73fb feat: add scientific-agent-skills to AI and Agents > Agent Skills
Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-14 23:08:12 +08:00
Vinta ChenandClaude d3a685415b refactor: remove unused warehouse PyPI override
Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-02 14:45:50 +08:00
Vinta ChenandClaude 97c1a0dff2 style: rename the mock entry to unittest.mock
The Mock entry was named `mock`, the PyPI backport package, while it links to and describes the standard-library `unittest.mock` module.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-02 14:43:33 +08:00
Vinta ChenandClaude 1236c5c5ab fix: map graphify to its graphifyy PyPI package
graphify's PyPI override was null (GitHub-only), so the site showed no download count although the project now publishes on PyPI as graphifyy.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-02 13:08:32 +08:00
Vinta ChenandClaude 5bfafbde72 fix: add null pypi override for jev-ultrafast
jev-ultrafast is not published on PyPI but had no null override, so every download sweep queried PyPI for it and recorded NOT_FOUND.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-02 12:53:14 +08:00
Vinta ChenandClaude 462dc31d98 fix: add null pypi overrides for conda and pyodide
The download sweep queried PyPI by display name, but PyPI conda is a stale 2017 upload and PyPI pyodide is a 0.0.2 placeholder, so the site showed unrelated packages' download counts for both entries.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-10-02 12:50:41 +08:00
Vinta ChenandClaude 8e7d2bc62c fix: add null pypi override for uv-audit
Renaming the entry from "uv audit" to "uv-audit" made the name PyPI-shaped: normalize() leaves spaces alone, so "uv audit" failed PYPI_NAME_RE and collect_names skipped it, but "uv-audit" passes, so the next sweep would have queried PyPI for it.

A uv-audit package does exist on PyPI, but it is version 0.1.9 by Alekse Marusich of rocshers, an unrelated third-party tool whose summary ("uv Tool for checking dependencies for vulnerabilities") is close enough to be mistaken for Astral's built-in uv audit subcommand. Without the override the entry would have shown that stranger's download count and lost its Bundled badge.

The sweep now writes uv-audit as NOT_FOUND, which load_downloads skips, so the badge is unaffected.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-23 01:30:53 +08:00
Vinta ChenandClaude 0f677911f0 feat: add "Multiple on PyPI" badge for SDK monorepos
azure-sdk-for-python and google-cloud-python were rendering "Not on
PyPI", which is misleading. Both do ship on PyPI, just as many
per-service packages (azure-identity, azure-storage-blob,
google-cloud-storage, etc.) rather than under the repo name.

pypi_name_overrides.json already recorded that distinction in its
reason field; those two entries now carry an optional "badge" value
that build.py reads into the PyPI Downloads column. The other sixteen
no-count entries (cpython, renpy, agent skill repos, etc.) keep
"Not on PyPI" since that remains accurate for them.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-23 01:28:33 +08:00
Vinta ChenandClaude b841db68ba refactor: make pypi_name_overrides.json entries self-documenting
Every entry is now {"package": str|null, "reason": str|null} instead of
a bare string/null. Reasons are required for null packages, explaining
why the name must never be queried (squatted name, stdlib module,
monorepo umbrella, GitHub-only project, and so on). Reasons are
optional for remaps and kept only on the six non-obvious ones: pytorch
(squatter), jinja (jinja is Jinja1), strawberry (unrelated bookmarking
service), django-rules (abandoned fork), django-rest-framework (dead
alias), and devpi (deprecated metapackage); plain publishes-as-X
remaps get a null reason.

load_overrides() in the clickpy fetcher now extracts the package field
from each entry; resolve() and the pepy/bigquery cross-check scripts
are unchanged since they consume load_overrides()'s output.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-16 19:08:55 +08:00
Vinta ChenandClaude fcfc65df00 data: record all remaining NOT_FOUND names as explicit null overrides
Every queried name now resolves 447/447. Adds 23 explicit null
overrides so squatters can never silently attach a PyPI number to
these names later: stdlib-named entries (concurrent-futures, difflib,
mimetypes, sqlite3, tkinter, tomllib, zoneinfo), interpreters
(micropython, pypy), monorepo umbrellas (azure-sdk-for-python,
google-cloud-python), self-hosted or distro-installed projects (odoo,
cloud-init, warehouse), GitHub-only projects (thealgorithms,
geodjango, django-db-models, django-ai-plugins, graphify,
sentry-skills, social-engineer-toolkit, trailofbits-skills), and
httpx-url (a class within httpx, not a package).

Caveat: graphify and django-ai-plugins are young projects that may
legitimately publish to PyPI later — flip their null to a remap
during a future audit if they do.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-16 18:57:13 +08:00
Vinta ChenandClaude f3ff733fd7 fix: add three more PyPI name remaps for NOT_FOUND triage
autobahn-python publishes as autobahn (7.1M/mo), pangu-py as pangu, and
strawberry-django as strawberry-graphql-django (1.5M/mo). httpx.URL is
left unmapped deliberately since it's a class within the httpx package,
not a package of its own.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-16 18:54:58 +08:00
Vinta ChenandClaude b440e64cd0 fix: resolve PyPI download counts through curated package overrides
A pypi.org identity sweep of all 438 cached rows (project_urls/home_page
vs entry GitHub URL) found download counts were looked up by README
display name, so entries whose name differs from the canonical package
silently measured squatters or dead predecessors: pytorch measured a
squatter (169,737/mo vs torch's 94M), jinja measured Jinja1 (3,168 vs
jinja2's 736M), django-rest-framework a dead alias package (real:
djangorestframework), django-rules an abandoned fork (real: rules),
strawberry an unrelated bookmarking service (real: strawberry-graphql),
devpi a deprecated metapackage (mapped to devpi-server).

New curated website/data/pypi_name_overrides.json maps normalized
README name to the real package, or null for projects not
pip-installable whose name is squatted or a relic (cpython, pyenv,
renpy, python-patterns, winpython); also maps mem0 to mem0ai, fasthtml
to python-fasthtml, and playwright-python to playwright.

All three fetch scripts resolve names through it; the clickpy TSV
cache gains a package column recording what each row actually
measured. .gitignore switches website/data/ to website/data/* with a
negation so the curated overrides file is tracked while caches stay
ignored.

Co-Authored-By: Claude <noreply@anthropic.com>
2026-08-16 17:51:11 +08:00