Skip to content

docs(readme): per-installer and per-OS download-breakdown badges#72

Merged
cmeans-claude-dev[bot] merged 2 commits into
mainfrom
fix/readme-installer-os-badges
May 1, 2026
Merged

docs(readme): per-installer and per-OS download-breakdown badges#72
cmeans-claude-dev[bot] merged 2 commits into
mainfrom
fix/readme-installer-os-badges

Conversation

@cmeans-claude-dev
Copy link
Copy Markdown
Contributor

@cmeans-claude-dev cmeans-claude-dev Bot commented May 1, 2026

Summary

Adds two new badge groups to README.md mirroring the layout cmeans/mcp-clipboard adopted after the upstream cmeans/pypi-winnow-downloads service grew its installer/OS endpoints.

  • Group 1 (six badges): pip, pipenv, pipx, uv, poetry, pdm — each linked via installer-{installer}-30d-non-ci.json.
  • Group 2 (three badges): linux, macos, windows — each linked via os-{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
Glama

+pip downloads
+pipenv downloads
+pipx downloads
+uv downloads
+poetry downloads
+pdm downloads
+
+linux downloads
+macos downloads
+windows downloads

MCP server for Synology NAS devices. ...
```

QA

Manual tests

    • View the rendered README on the PR's "Files changed" tab and confirm all 9 new badges render (no broken-image icons). The shields.io endpoint adapter sometimes takes ~30s to fetch a freshly-cached payload — refresh once if any badge is grey.
    • Click through one badge from each group (e.g. uv from installer group, macos from OS group) and confirm both land on https://github.com/cmeans/pypi-winnow-downloads, NOT on PyPI.
    • Compare side-by-side with 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.
    • Spot-check that the existing main badge group (PyPI version, Python versions, License, Tests, Coverage, Downloads, Glama) is unchanged.

Verification I already ran

Check Result
Endpoint live for installer-pip ✅ schemaVersion 1, label "pip (30d)"
Endpoint live for os-linux ✅ schemaVersion 1, label "linux (30d)"
README renders locally (markdown lint) clean
git diff --stat 2 files changed, 15 insertions (README +11, CHANGELOG +4)

No code, test, or workflow changes. CI on this PR is informational (lint/test/typecheck/vdsm should still pass since nothing in src/ or tests/ changed).

🤖 Generated with Claude Code

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>
@github-actions github-actions Bot added the Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA label May 1, 2026
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@github-actions github-actions Bot added Ready for QA Dev work complete — QA can begin review and removed Awaiting CI Dev complete, waiting for CI/Codecov to pass before QA labels May 1, 2026
@codecov-commenter
Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@cmeans cmeans added the QA Active QA is actively reviewing; Dev should not push changes label May 1, 2026
@github-actions github-actions Bot removed the Ready for QA Dev work complete — QA can begin review label May 1, 2026
Copy link
Copy Markdown
Owner

@cmeans cmeans left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@cmeans
Copy link
Copy Markdown
Owner

cmeans commented May 1, 2026

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.

@cmeans cmeans added Ready for QA Signoff QA passed — ready for maintainer final review and merge and removed QA Active QA is actively reviewing; Dev should not push changes labels May 1, 2026
Copy link
Copy Markdown
Owner

@cmeans cmeans left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@cmeans cmeans added QA Approved Manual QA testing completed and passed and removed Ready for QA Signoff QA passed — ready for maintainer final review and merge labels May 1, 2026
@cmeans-claude-dev cmeans-claude-dev Bot merged commit 5e687df into main May 1, 2026
34 checks passed
@cmeans-claude-dev cmeans-claude-dev Bot deleted the fix/readme-installer-os-badges branch May 1, 2026 01:46
@cmeans-claude-dev cmeans-claude-dev Bot mentioned this pull request May 1, 2026
cmeans-claude-dev Bot added a commit that referenced this pull request May 1, 2026
## 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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

QA Approved Manual QA testing completed and passed

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants