Files
jackwener__opencli/docs/adapters/browser/packagist.md
jakevin 498ad3930c feat: 13 read adapters across 6 new sites (round 4) (#1347)
Six new public-API sites — package registries + Docker images + OpenAlex
scholarly works — all unauthenticated, no browser required.

  dockerhub  search image
  rubygems   search gem
  homebrew   formula cask popular
  packagist  search package
  maven      search artifact
  openalex   search work

Conventions held:
  - access: 'read' on every command
  - typed errors (ArgumentError / EmptyResultError / CommandExecutionError)
    instead of generic CliError or silent fallback
  - input validators per site (image slugs, gem names, Composer names,
    Maven coordinates, OpenAlex work-id / DOI normalization)
  - listing rows carry an id-shaped column (image / gem / token / package /
    coordinate / id) that round-trips into the corresponding detail command
  - HTTP 429 surfaces with retry hint, 404 → EmptyResultError

Audits:
  - check:typed-error-lint   → no new violations (baseline 196)
  - check:silent-column-drop → no new violations (baseline 103)
  - advise:listing-id-pairing → unchanged at 13
2026-05-06 13:38:43 +08:00

65 lines
2.2 KiB
Markdown

# Packagist
**Mode**: 🌐 Public · **Domain**: `packagist.org`
Search and inspect PHP / Composer packages on Packagist without auth or browser. Two commands.
## Commands
| Command | Description |
|---------|-------------|
| `opencli packagist search <query>` | Search Packagist (PHP / Composer) packages by keyword |
| `opencli packagist package <name>` | Single-package metadata (version, downloads, license, repo, GitHub stars) |
## Usage Examples
```bash
# Search packages
opencli packagist search symfony --limit 10
opencli packagist search "laravel http" --limit 5
# Single-package metadata (use `package` from search rows; vendor/package required)
opencli packagist package symfony/console
opencli packagist package laravel/framework
opencli packagist package monolog/monolog
# JSON output
opencli packagist search symfony -f json
opencli packagist package symfony/console -f json
```
## Output Columns
| Command | Columns |
|---------|---------|
| `search` | `rank, package, description, downloads, favers, repository, url` |
| `package` | `package, version, releasedAt, license, description, repository, githubStars, favers, downloads, monthlyDownloads, dailyDownloads, url` |
The `package` column from `search` round-trips into `package` exactly.
## Options
### `packagist search`
| Option | Description |
|--------|-------------|
| `query` (positional) | Search keyword |
| `--limit` | Max packages (1-100, default: 30) |
### `packagist package`
| Option | Description |
|--------|-------------|
| `name` (positional) | Composer package `<vendor>/<package>` (`symfony/console`, `monolog/monolog`) |
## Caveats
- Composer names are validated upfront — both `vendor` and `package` segments are required, lowercase letters / digits / `_-.` only, max 100 chars per segment. Bad input raises `ArgumentError`.
- `version` is the newest stable release (skipping `*-dev`, `*-rc*`, `*-beta*`, `*-alpha*`). Falls back to the newest available version if no stable exists.
- `releasedAt` is normalized to second-precision `YYYY-MM-DDTHH:MM:SSZ`.
- Packagist throttles bursts; `HTTP 429` surfaces as a typed `CommandExecutionError` with a retry hint.
## Prerequisites
- No browser required — uses `packagist.org/search.json` and `packagist.org/packages/<vendor>/<package>.json`.