docs(readme): add per-installer and per-OS download badge breakouts#99
Conversation
Adds two new badge rows under the existing hero Downloads badge: "By installer:" (pip, pipenv, pipx, uv, poetry, pdm) and "By OS:" (linux, macos, windows). Powered by the per-installer (v0.2.0) and per-OS (v0.3.0) endpoints from pypi-winnow-downloads. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Codecov Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
cmeans
left a comment
There was a problem hiding this comment.
QA Review — PR #99
Verdict: Ready for QA Signoff. Zero findings.
Verification
| Gate | Result |
|---|---|
uv run pytest |
488 passed, 6 deselected (integration marker, expected), 5 xfailed |
uv run ruff check src/ tests/ |
All checks passed |
uv run ruff format --check src/ tests/ |
9 files already formatted |
uv run mypy src/mcp_clipboard/ |
Success: no issues found in 4 source files |
| Live endpoints (10/10) | All return HTTP 200 with valid shields.io endpoint JSON |
| Internal arithmetic | per-installer sum = per-OS sum = hero badge count (106) — consistent |
| CHANGELOG conformance | Under [Unreleased] → ### Added, accurate description |
| Repo-wide drift grep | README and the prior PR #98 CHANGELOG line are the only files referencing pypi-badges.intfar.com; no drift |
| CI rollup | All success (lint, typecheck, test 3.11/3.12/3.13, codecov/patch, on-push, qa-approved) |
Endpoint sample
| Endpoint | Label | Count |
|---|---|---|
installer-pip-30d-non-ci.json |
pip (30d) |
80 |
installer-uv-30d-non-ci.json |
uv (30d) |
26 |
installer-pipenv/pipx/poetry/pdm |
each | 0 (lightgrey) |
os-linux-30d-non-ci.json |
linux (30d) |
78 |
os-macos-30d-non-ci.json |
macos (30d) |
24 |
os-windows-30d-non-ci.json |
windows (30d) |
4 |
Hero downloads-30d-non-ci.json |
pip*/uv/poetry/pdm (30d) |
106 |
pip + uv = 106 and linux + macos + windows = 106 — both breakouts agree with the hero total.
Awaiting maintainer QA Approved.
|
Adding Ready for QA Signoff — all gates pass, zero findings on review. CI green, all 10 badge endpoints live and self-consistent (per-installer + per-OS sums match hero total of 106). Awaiting maintainer QA Approved. |
Each badge already self-documents (e.g. pip (30d), linux (30d)) and the blank line between rows provides visual grouping. The labels added a verbal handle for something the eye already groups. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
cmeans
left a comment
There was a problem hiding this comment.
QA Review — Round 2 (head fa2ff87)
Verdict: QA Failed — 1 substantive finding (PR body drift).
Re-verification (all green)
| Gate | Result |
|---|---|
uv run pytest |
488 passed, 6 deselected, 5 xfailed |
uv run ruff check src/ tests/ |
clean |
uv run ruff format --check src/ tests/ |
9 files already formatted |
uv run mypy src/mcp_clipboard/ |
no issues, 4 source files |
| CI rollup | all SUCCESS (lint, typecheck, test 3.11/3.12/3.13, codecov/patch, on-push) |
| Endpoints | unchanged from round 1 — all 10 still HTTP 200 |
Finding
F1 (substantive) — PR body drift after label removal. The round-2 commit fa2ff87 removes the **By installer:** and **By OS:** section labels from the README, but the PR body still references them in two places:
- Summary, bullet 1: "Add By installer: badge row (pip, pipenv, pipx, uv, poetry, pdm) and By OS: badge row (linux, macos, windows)..." — these row labels no longer exist in the README.
- Test plan, last item: "README renders correctly on GitHub (badges visible, labels read 'By installer:' and 'By OS:'')" — the labelled-row assertion can no longer be verified because there are no labels.
PR descriptions live forever as historical record once merged, so a present-tense Summary that contradicts the actual diff is worth fixing in the same cycle.
Suggested edits (no new commit needed — just a body edit):
- Bullet 1: drop the
**By installer:**/**By OS:**framing, e.g. "Add per-installer download badges (pip, pipenv, pipx, uv, poetry, pdm) and per-OS download badges (linux, macos, windows) under the existing hero Downloads badge." - Test plan rendering item: rephrase as "README renders correctly on GitHub (all 9 new badges visible)".
CHANGELOG entry is fine as-is — it describes the breakouts conceptually without referencing the bold section labels.
Render observation (not a finding)
With the section labels removed, the three badge groups are now separated only by blank lines. On GitHub render this still produces visible vertical spacing, and the badge labels themselves (pip (30d), linux (30d), …) carry the meaning, so the grouping is recoverable. Not blocking — flagging only because if you reconsider the round-2 simplification, this is the trade-off.
Next step
Fix the PR body, then re-apply Ready for QA.
|
Applying QA Failed — round 2 (head fa2ff87) introduced PR body drift: Summary and Test plan still reference |
cmeans
left a comment
There was a problem hiding this comment.
QA Review — Round 3 (head fa2ff87, body edit only)
Verdict: Ready for QA Signoff. F1 from round 2 closed.
F1 (substantive): PR body drift — fixed
Both Summary bullet 1 and the Test plan rendering item now read cleanly:
- Bullet 1: "Add per-installer download badges ... and per-OS download badges ..." — no longer references the removed bold section labels.
- Test plan: "README renders correctly on GitHub (all 9 new badges visible)" — the assertion now matches what's actually in the README.
Re-verification (head unchanged, re-run anyway)
| Gate | Result |
|---|---|
uv run pytest |
488 passed, 6 deselected, 5 xfailed |
uv run ruff check src/ tests/ |
clean |
uv run ruff format --check src/ tests/ |
9 files already formatted |
uv run mypy src/mcp_clipboard/ |
no issues, 4 source files |
| CI rollup | all SUCCESS |
Awaiting maintainer QA Approved.
|
Applying Ready for QA Signoff — F1 closed via body edit, all four gates re-verified green on unchanged head fa2ff87. Awaiting maintainer QA Approved. |
Bump pyproject.toml 2.2.1 -> 2.3.0 and convert the [Unreleased] block into [2.3.0] - 2026-05-02. A fresh empty [Unreleased] section sits above for the next cycle. 13 PRs aggregated since v2.2.1: #88, #92, #93, #94, #95, #96, #98, #99, #100, #101, #102, #103, #104. Tag-push (v2.3.0) after merge triggers .github/workflows/publish.yml. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
pypi-badges.intfar.com.Downloadsbadge unchanged.Test plan
uv run pytestruff checkruff format --checkmypyCHANGELOG
## [Unreleased] → ### Added.🤖 Generated with Claude Code