docs(readme): per-installer and per-OS download-breakdown badges#72
Conversation
Adds two new badge groups to README.md mirroring the layout
cmeans/mcp-clipboard adopted after the upstream pypi-winnow-downloads
service grew its installer/OS endpoints.
Group 1: pip, pipenv, pipx, uv, poetry, pdm 30d non-CI download
counts (installer-{installer}-30d-non-ci.json endpoints).
Group 2: linux, macos, windows 30d non-CI download counts
(os-{os}-30d-non-ci.json endpoints).
All nine new badges link to cmeans/pypi-winnow-downloads (the
dogfooded service) rather than to PyPI itself — consistent with the
existing aggregate Downloads badge from PR #62. Keeps the "powered
by" attribution implicit and gives a curious reader a single click
into the data source.
Verified the endpoints are live for mcp-synology
(installer-pip-30d-non-ci.json returns the expected schemaVersion-1
payload). README-only change; no code or tests touched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
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 Round 1 — PASS
Docs-only addition of 9 README badges (6 installer + 3 OS) linking to cmeans/pypi-winnow-downloads. Clean.
Verification
I went past the PR body's two-endpoint spot-check and pulled all nine. All return valid schemaVersion: 1 payloads with the expected labels:
| Endpoint | Live response |
|---|---|
installer-pip-30d-non-ci.json |
pip (30d) = 52 (blue) |
installer-pipenv-30d-non-ci.json |
pipenv (30d) = 0 (lightgrey) |
installer-pipx-30d-non-ci.json |
pipx (30d) = 0 (lightgrey) |
installer-uv-30d-non-ci.json |
uv (30d) = 108 (blue) |
installer-poetry-30d-non-ci.json |
poetry (30d) = 0 (lightgrey) |
installer-pdm-30d-non-ci.json |
pdm (30d) = 0 (lightgrey) |
os-linux-30d-non-ci.json |
linux (30d) = 47 (blue) |
os-macos-30d-non-ci.json |
macos (30d) = 64 (blue) |
os-windows-30d-non-ci.json |
windows (30d) = 49 (blue) |
Four of the six installer badges currently render lightgrey (0 count for pipenv, pipx, poetry, pdm). That's expected upstream behavior of pypi-winnow-downloads and not this PR's concern — and there's already an open intention code-review-2026-04-26-07-lightgrey-under-10-contradicts-thesis tracking the threshold question on the upstream service.
Other checks:
| Check | Result |
|---|---|
| Link targets | All 9 new badges correctly point at https://github.com/cmeans/pypi-winnow-downloads per the PR's explicit ask. Counted 10 total link targets to that URL in README.md (1 existing aggregate Downloads badge from #62 + 9 new). |
Layout vs cmeans/mcp-clipboard |
Same 9 badges, same order, same labels. Minor presentation difference (not a finding): this PR splits the 9 into two visual blocks separated by a blank line per the "Group 1 / Group 2" language in the PR body; mcp-clipboard puts all 9 in one block. Intentional design choice. |
| CHANGELOG | New ### Added subsection under ## Unreleased (this is the first PR adding the section since the last release). Well-formed entry, references #72 + #62. |
| Existing badge group above the new ones | Untouched. |
Required CI on f03dc795 |
13/13 green (vdsm completed SUCCESS). |
| Local stack (sanity) | 528 passed, 96.18% coverage, ruff/mypy clean. Nothing broke despite no code changes. |
PR-body manual tests 1–4 all checked.
Verdict
Ready for QA Signoff. No findings. Final maintainer call.
|
Applying Ready for QA Signoff as the final act of round 1. All 9 endpoints verified live (not just the 2 spot-checks), all link targets correct, layout matches mcp-clipboard's pattern (with intentional Group 1/Group 2 visual split), CHANGELOG well-formed, 13/13 CI green. Zero findings. Final maintainer call. |
## Summary Patch release rolling up the post-0.5.0 fixes. Five PRs land in this release: - **#69** — Atomic state-file writes (closes #36). New `core/fs.py::atomic_write_text` helper; `save_state` and `_save_global_state` route through it. Eliminates torn-write windows on `state.yaml` / `global.yaml`. - **#71** — Atomic write for `cli/setup.py` interactive config (closes #70). Last user-visible non-atomic write site cascaded onto the same helper. - **#72** — README per-installer and per-OS download-breakdown badges. Mirrors mcp-clipboard's layout; all 9 new badges link to `cmeans/pypi-winnow-downloads` (the dogfooded service). - **#73** — Recycle-bin status probed per share (closes #37). Lazy `ensure_recycle_status` helper; self-correct on observation; clear-on-reauth via new `AuthManager.add_on_reauth_callback` API. Fixes incorrect "Recycle bin is enabled" messaging on shares with `#recycle` disabled. - **#77** — Per-path serial for multi-path `getinfo` and `delete` (closes #68). **Critical: fixes a v0.5.0 silent-no-op regression on `delete_files` with multi-path arrays** — caller would see `[+] Deleted N item(s)` listing every path, but none were actually deleted on real DSM 7.x. Same root cause on `get_file_info` (single synthetic record with comma-joined `path`). Both tools now issue one DSM call per input path. ## Files touched (per CLAUDE.md release procedure) - `pyproject.toml`: 0.5.0 → 0.5.1 - `server.json`: synced via `scripts/sync-server-json.py` (top-level + `packages[0].version`) - `uv.lock`: refreshed via `uv lock` - `CHANGELOG.md`: `## Unreleased` renamed to `## 0.5.1 (2026-05-01)`; fresh empty `## Unreleased` added above for the next cycle ## QA ### Manual tests 1. - [x] `python scripts/sync-server-json.py --check` — reports "in sync (0.5.1)". 2. - [x] `uv run pytest` — 550 passed, 96.13% coverage. 3. - [x] `uv run ruff check src/ tests/ scripts/` — clean. 4. - [x] `uv run ruff format --check src/ tests/ scripts/` — clean. 5. - [x] `uv run mypy src/ scripts/` — clean. 6. - [x] CHANGELOG diff is exactly: `## Unreleased` → `## 0.5.1 (2026-05-01)`, plus a fresh empty `## Unreleased` heading inserted above. No content was moved or rewritten — every entry under `## 0.5.1` already lived under `## Unreleased` on `main`. 7. - [x] After merge: tag-push triggers `publish.yml`. The `awk` extractor on `## <version>( |\()` matches `## 0.5.1 (2026-05-01)` correctly and the new empty `## Unreleased` is harmlessly walked past. ### Verification I already ran | Check | Result | |---|---| | `python scripts/sync-server-json.py --check` | in sync (0.5.1) | | `uv run pytest` | 550 passed, 100 deselected, 96.13% coverage | | `uv run ruff check src/ tests/ scripts/` | clean | | `uv run ruff format --check src/ tests/ scripts/` | 72 files already formatted | | `uv run mypy src/ scripts/` | clean (30 files, strict-mode) | | `git diff --stat HEAD~1` | 4 files: CHANGELOG.md, pyproject.toml, server.json, uv.lock | 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: cmeans-claude-dev[bot] <272174644+cmeans-claude-dev[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Summary
Adds two new badge groups to
README.mdmirroring the layoutcmeans/mcp-clipboardadopted after the upstreamcmeans/pypi-winnow-downloadsservice grew its installer/OS endpoints.pip,pipenv,pipx,uv,poetry,pdm— each linked viainstaller-{installer}-30d-non-ci.json.linux,macos,windows— each linked viaos-{os}-30d-non-ci.json.All nine new badges link to
cmeans/pypi-winnow-downloads(the dogfooded service) rather than PyPI itself. This is the explicit ask on this PR and is consistent with the existing aggregate Downloads badge from PR #62 — keeps the "powered by" attribution implicit and gives a curious reader a single click into the data source.Endpoint verification
Pre-push sanity check that the endpoints are live for
mcp-synology:```
$ curl -sf https://pypi-badges.intfar.com/mcp-synology/installer-pip-30d-non-ci.json
{"schemaVersion": 1, "label": "pip (30d)", "message": "52", "color": "blue"}
$ curl -sf https://pypi-badges.intfar.com/mcp-synology/os-linux-30d-non-ci.json
{"schemaVersion": 1, "label": "linux (30d)", "message": "47", "color": "blue"}
```
Diff at a glance
```markdown

+








+
+
+
+
+
+
+
+
+
MCP server for Synology NAS devices. ...
```
QA
Manual tests
uvfrom installer group,macosfrom OS group) and confirm both land onhttps://github.com/cmeans/pypi-winnow-downloads, NOT on PyPI.cmeans/mcp-clipboard's README — same badge set, same ordering, same labels. Only difference: link targets here point to the upstream repo per the explicit instruction; mcp-clipboard's installer/OS badges currently link to its own PyPI page.Verification I already ran
installer-pipos-linuxgit diff --statNo code, test, or workflow changes. CI on this PR is informational (lint/test/typecheck/vdsm should still pass since nothing in
src/ortests/changed).🤖 Generated with Claude Code