mirror of
https://github.com/jackwener/OpenCLI.git
synced 2026-09-14 18:25:42 +08:00
39943c05e9
* feat: 12 read adapters across 6 new sites + contract tests (round 7) New sites: wikidata, lichess, rest-countries, nuget, flathub, oeis - wikidata: search (wbsearchentities) + entity (Special:EntityData) — Q/P/L ids, localised label/description with English fallback - lichess: user + top (perf rankings) — closed accounts → EmptyResultError, no silent disabled rows; 13 perf types validated - rest-countries: country (substring) + region — population-sorted by default, flattened languages/currencies/capitals - nuget: search + package (full version history) — registration page-walking for 100+ version histories; case-insensitive id with strict shape gate - flathub: search + app — appId reverse-DNS, dual-shape timestamp coercion (search is unix-seconds int, /appstream is ISO string) - oeis: search (paginated) + sequence — A-id zero-padded, 12-term preview with (+N) suffix, surfaces commentCount/formulaCount/etc instead of full graphs Contract tests: 6 files × 7 assertions = 42 contract assertions, all green. Live verified all 12 commands against real APIs. Audits clean: typed-error 196=baseline, silent-column 103=baseline, 0 Round-7 listing-id-pairing violations (all 6 listings carry round-trip ids). * fix(nuget): fail fast on malformed registration pages
3.0 KiB
3.0 KiB
Flathub
Mode: 🌐 Public · Domain: flathub.org
Search the Flathub Linux flatpak app registry and fetch full appstream metadata for any app. Flathub is the canonical flatpak distribution channel for Linux desktop applications.
Commands
| Command | Description |
|---|---|
opencli flathub search <query> |
Search Flathub apps by keyword |
opencli flathub app <appId> |
Full Flathub appstream metadata for an app id |
Usage Examples
# Keyword search
opencli flathub search firefox
opencli flathub search "image editor" --limit 10
opencli flathub search blender
# App detail (appId round-trips from search)
opencli flathub app org.mozilla.firefox
opencli flathub app org.gnome.Calculator
opencli flathub app org.blender.Blender
Output Columns
| Command | Columns |
|---|---|
search |
rank, appId, name, summary, developer, license, isFreeLicense, mainCategories, installsLastMonth, updatedAt, url |
app |
appId, name, summary, developer, license, isFreeLicense, isEol, categories, keywords, latestVersion, latestReleaseDate, homepage, bugtracker, donation, url |
The appId column round-trips between commands.
Options
search
| Option | Description |
|---|---|
query (positional) |
Search keyword |
--limit |
Max apps (1–100, default: 25) |
app
| Option | Description |
|---|---|
appId (positional) |
AppStream id, reverse-DNS form (e.g. org.mozilla.firefox, org.gnome.Calculator) |
Notes
appIdis the reverse-DNS AppStream id (org.mozilla.firefox), not the underscored cache id (org_mozilla_firefox) Flathub returns alongside it. We always emit the dotted form so thesearch → appround-trip works without translation.updatedAtnormalisation: Flathub's/searchendpoint emitsupdated_atas unix-seconds (integer);/appstream/<id>emits it as ISO date strings. The adapter normalises/searchto ISO date (YYYY-MM-DD) so both surfaces look consistent.releases[].timestampis a numeric string, not an int — quirk of the appstream layer. The adapter coerces both shapes when picking the latest release.isEolistruefor end-of-life apps (no longer maintained).isFreeLicenseuses Flathub's classification ofproject_license(e.g.MPL-2.0,GPL-3.0-or-later). Don't use this in lieu of reading the actual license; useful as a quick filter.installsLastMonth(search only) is Flathub's 30-day install count per app. Useful for popularity ranking;nullwhen not yet aggregated.mainCategoriesis a single string in/search(e.g.'network'); on/appstream/<id>the broadercategorieslist is used ('Network, WebBrowser').- No API key required. Flathub's API is public and unauthenticated; bursts →
CommandExecutionError. - Errors. Empty query / bad appId / bad limit →
ArgumentError; unknown appId (HTTP 404) →EmptyResultError; transport / 429 / non-200 →CommandExecutionError.