|
| 1 | +# SPDX-License-Identifier: PMPL-1.0-or-later |
| 2 | +# Registry API Changelog and Monitoring |
| 3 | + |
| 4 | +Tracks API version targets, upcoming deprecations, and monitoring priorities |
| 5 | +for OPSM's 103 registry adapters. |
| 6 | + |
| 7 | +Author: Jonathan D.A. Jewell |
| 8 | +Last updated: 2026-03-10 |
| 9 | + |
| 10 | +## Registry Adapter Count |
| 11 | + |
| 12 | +OPSM has **103 registry adapters** in `opsm_ex/lib/opsm/registries/`. |
| 13 | + |
| 14 | +## Major Registry API Versions |
| 15 | + |
| 16 | +| Registry | Adapter File | API Version / Endpoint | Notes | |
| 17 | +|----------|-------------|----------------------|-------| |
| 18 | +| **npm** | `npm.ex` | `registry.npmjs.org` (v1 packument + v1 search) | Uses `/-/v1/search` endpoint | |
| 19 | +| **PyPI** | `pypi.ex` | `pypi.org/pypi/{name}/json` (JSON API) | XML-RPC search deprecated; search is non-functional | |
| 20 | +| **crates.io** | `crates.ex` | `crates.io/api/v1` | Requires User-Agent header | |
| 21 | +| **Hex.pm** | `hex.ex` | `hex.pm/api` (v1) + `repo.hex.pm` (tarballs) | Fetches release-specific deps | |
| 22 | +| **RubyGems** | `rubygems.ex` | `rubygems.org/api/v1` | Stable | |
| 23 | +| **Docker Hub** | `docker_hub.ex` | `registry.hub.docker.com/v2` | Token auth required | |
| 24 | +| **NuGet** | `nuget.ex` | `api.nuget.org/v3` | Service index discovery | |
| 25 | +| **Maven Central** | `maven.ex` | `search.maven.org/solrsearch` | Solr-based | |
| 26 | +| **Go Modules** | `go_modules.ex` | `proxy.golang.org` | Module proxy protocol | |
| 27 | +| **Packagist** | `packagist.ex` | `packagist.org/p2` | v2 metadata endpoint | |
| 28 | +| **pub.dev** | `pub_dev.ex` | `pub.dev/api` | Dart/Flutter | |
| 29 | +| **CocoaPods** | `cocoapods.ex` | `cdn.cocoapods.org` | CDN-based | |
| 30 | +| **JSR** | `jsr.ex` | `jsr.io/api` | Deno/JS registry | |
| 31 | +| **Homebrew** | `homebrew.ex` | `formulae.brew.sh/api` | JSON API | |
| 32 | + |
| 33 | +## Known API Deprecations and Changes |
| 34 | + |
| 35 | +### CRITICAL (action required) |
| 36 | + |
| 37 | +| Registry | Deprecation | Impact | Deadline | |
| 38 | +|----------|-------------|--------|----------| |
| 39 | +| **PyPI** | XML-RPC search (`search()`) fully removed | `Opsm.Registries.Pypi.search/2` already returns placeholder; no functional search | Already deprecated | |
| 40 | +| **Docker Hub** | Rate limiting tightened (100 pulls/6h anonymous) | May need authenticated pulls for high-volume resolution | Ongoing | |
| 41 | + |
| 42 | +### WARNING (monitor closely) |
| 43 | + |
| 44 | +| Registry | Change | Impact | Timeline | |
| 45 | +|----------|--------|--------|----------| |
| 46 | +| **npm** | Registry v2 discussions | Packument format may change; OPSM uses v1 packument | No firm date | |
| 47 | +| **crates.io** | Sparse index as default | `crates.ex` uses HTTP API (not git index), so minimal impact | Already default in cargo | |
| 48 | +| **NuGet** | v3 service index evolution | New resource types may be added | Rolling | |
| 49 | +| **Maven Central** | Central Portal replacing OSSRH | Publishing changes; read API stable | 2025+ rollout | |
| 50 | +| **Homebrew** | API versioning | `formulae.brew.sh` may version endpoints | No firm date | |
| 51 | +| **Go Modules** | GONOSUMCHECK patterns | Checksum database changes | Ongoing | |
| 52 | + |
| 53 | +### LOW RISK (stable) |
| 54 | + |
| 55 | +- **Hex.pm**: Stable API, well-documented |
| 56 | +- **RubyGems**: v1 API stable for years |
| 57 | +- **CPAN**: MetaCPAN API stable |
| 58 | +- **Hackage**: Stable API |
| 59 | +- **Elm packages**: Simple Git-based registry, unlikely to change |
| 60 | +- **pub.dev**: Google-maintained, stable |
| 61 | + |
| 62 | +## Rate Limiting Summary |
| 63 | + |
| 64 | +| Registry | Limit | Auth Helps? | |
| 65 | +|----------|-------|-------------| |
| 66 | +| npm | No published limit (fair use) | N/A | |
| 67 | +| PyPI | ~100 req/min (JSON API) | No | |
| 68 | +| crates.io | 1 req/sec (requires User-Agent) | No | |
| 69 | +| Hex.pm | No published limit | N/A | |
| 70 | +| Docker Hub | 100 pulls/6h (anon), 200 (auth) | Yes | |
| 71 | +| RubyGems | 10 req/sec | API key for higher | |
| 72 | +| NuGet | No published limit | N/A | |
| 73 | +| Go Modules | No published limit | N/A | |
| 74 | +| GitHub Packages | 5000 req/hr (auth) | Required | |
| 75 | +| GitLab Packages | Varies by instance | Required | |
| 76 | + |
| 77 | +## Monitoring Checklist |
| 78 | + |
| 79 | +### Tier 1 — Monitor Weekly (high traffic, critical) |
| 80 | + |
| 81 | +These are the most-used registries and the ones most likely to have API changes: |
| 82 | + |
| 83 | +- [ ] npm (`npm.ex`) — Check for registry v2 announcements |
| 84 | +- [ ] PyPI (`pypi.ex`) — Monitor for new search API replacement |
| 85 | +- [ ] crates.io (`crates.ex`) — Rate limit / sparse index changes |
| 86 | +- [ ] Hex.pm (`hex.ex`) — API changes |
| 87 | +- [ ] Docker Hub (`docker_hub.ex`) — Rate limiting changes |
| 88 | +- [ ] RubyGems (`rubygems.ex`) — API deprecations |
| 89 | +- [ ] NuGet (`nuget.ex`) — v3 resource changes |
| 90 | +- [ ] Maven Central (`maven.ex`) — Central Portal migration |
| 91 | +- [ ] Go Modules (`go_modules.ex`) — Proxy protocol changes |
| 92 | +- [ ] JSR (`jsr.ex`) — New registry, API may evolve rapidly |
| 93 | + |
| 94 | +### Tier 2 — Monitor Monthly (moderate traffic) |
| 95 | + |
| 96 | +- [ ] Packagist, pub.dev, CocoaPods, Homebrew, Homebrew Cask |
| 97 | +- [ ] Conda, CRAN, Hackage, Stackage |
| 98 | +- [ ] Helm, Terraform, Pulumi |
| 99 | +- [ ] VS Code Marketplace, JetBrains |
| 100 | + |
| 101 | +### Tier 3 — Monitor Quarterly (low traffic, stable) |
| 102 | + |
| 103 | +- [ ] All Linux distribution registries (apt, rpm, alpine, AUR, etc.) |
| 104 | +- [ ] Niche language registries (Nim, Raku, Chicken, etc.) |
| 105 | +- [ ] OPSM-specific registries (agentic, eclexia, error_lang, etc.) |
| 106 | +- [ ] Archive/legacy registries (Bower, PEAR, PECL) |
| 107 | + |
| 108 | +## Adapter Architecture Notes |
| 109 | + |
| 110 | +All adapters follow a consistent pattern: |
| 111 | +- `fetch_package(name, version)` — returns `{:ok, %ResolvedPackage{}}` or `{:error, reason}` |
| 112 | +- `search(query, opts)` — returns `{:ok, [results]}` or `{:error, reason}` |
| 113 | +- `exists?(name)` — returns boolean |
| 114 | +- `versions(name)` — returns `{:ok, [version_strings]}` |
| 115 | +- `tarball_url(name, version)` — returns `{:ok, url}` |
| 116 | + |
| 117 | +HTTP calls go through `Opsm.Verified.Http` (aliased as `VerifiedHttp`) which |
| 118 | +handles TLS verification, timeouts, and response parsing. |
0 commit comments