π View Full Changelog on X-CMD Website
π Version compare: v0.9.13...v0.9.14
β Upgrade Guide
x upgrade π Changelog
cve
- A coworker drops a CVE ID and asks: "Is this thing actually being exploited in the wild?"
Ten seconds ago you'd open five tabs β cve.org for the description, cvelistV5 for affected products, NVD for CVSS, EPSS for exploitation probability, CISA KEV for in-the-wild confirmation. Now it's one x cve:
x cveβ TTY β fzf picker / pipe β TSV, newest firstx cve info CVE-2024-3094β quick fields by id (cvss / description / year); batched and parallel across years via HTTP/2 multiplexx cve detail CVE-2024-3094β full cvelistV5 record (affected products, CWE, references, ADP, metrics, timeline)x cve year 2024β browse by year;--score 9/--grep chromiumto filterx shodan CVE-2024-3094β straight to the deeper stuff: EPSS, KEV listing, exploit writeups, vendor advisories (the upstream CVE record doesn't carry these). Crucially no Shodan API key needed β it hitscvedb.shodan.io's public endpoint, so you skip the token gate thatx shodan searchrequires
Data pulls from daily xz-compressed TSVs at x-cmd/cve, cached locally β 1-day TTL for the current year, 180 days for older ones (they barely change). Cache hits from the second call. No API key, no sudo, no daemons.
# A coworker drops a CVE on you
x cve info CVE-2024-3094
# Want the full upstream record
x cve detail CVE-2024-3094
# Is this thing actually being exploited? (no Shodan token needed)
x shodan CVE-2024-3094
# What's landed lately
x cve-
x cve la / lsβ both "fast" and "doesn't feel stuck" got attention this round. -
Streams years in reverse, stores rows newest-first on disk, no
tacat read time; walks the filesystem directly, noindex.tsvround-trip -
Older-year TTL bumped 30 β 180 days; older data barely changes, fewer round-trips, less waiting
-
Synchronous refresh with a log line per download β cache misses no longer feel like a hang; you see what's happening next
-
stalled github.com timeout tightened 5s β 2s, falls back to the mirror faster
-
Missing years auto-fill from the manifest; no flags, no special case
-
fz picker: id column colored by score bucket (was only the score column), preview pane fixed to 9 columns (was 6, showed score as desc), CRITICALβmagenta / MEDIUMβcyan / unrated only gets red β the sea of red is gone
x cve
x cve lscwe
- Got the CVE but still want to know which weakness class it falls under? MITRE's CWE catalog has 969+ entries β flipping through pages is slow.
x cwe pulls the MITRE catalog directly (2000.csv.zip, ~640 KB), caches locally, parses in pure POSIX awk β zero dependencies. The commands you'll actually use:
x cwe info CWE-79β full record by id (description, related weaknesses, mitigations, consequences, observed examples), batchedx cwe/x cwe lsβ TTY β fzf / pipe β TSVx cwe fzβ interactive pickerx cwe updateβ force-refresh (30-day TTL by default)
For offline use, set X_CMD_CWE_OFFLINE=1 to stay on cache only. Behind a proxy, HTTP_PROXY / HTTPS_PROXY are honored transparently through ___x_cmd curl.
# What does XSS as a class actually say?
x cwe info CWE-79
# Shorthand
x cwe CWE-89
# Browse / pick
x cwe
x cwe fz
# Force refresh
x cwe update-
x cwe infooutput is sturdier andx cwe fzpreview is cleaner. -
Renderer rewritten end-to-end: info render + fz preview collapse into a single awk pass
-
YAML emission now uses block scalars, so fields with colons / quotes / commas parse correctly
-
Plain / double-quoted scalars supported; keys are colored so you can scan field names at a glance
-
x cwe recentremoved (MITRE's CSV has nolastModifiedcolumn β keeping it was misleading)
x cwe info CWE-79
x cwe fz
### [coin](https://x-cmd.com/mod/coin)
- Fixed `x coin` exiting with `I|tui: The CSV table is empty` because the upstream API died.
The old source, `https://api.coincap.io/v2/assets`, is gone at the DNS level β not just unreachable from China, `curl` reports `Could not resolve host` from Europe and US vantage points too. Result: empty CSV piped into the TUI, TUI bails out immediately.
Now points at `https://api.coinpaprika.com/v1/tickers?limit=100` β top 100 by market cap, free, no registration, no API key, served via Cloudflare so it's reachable from more places than the old source. CoinPaprika returns a top-level array, so the `jo .data` step is dropped; field mapping is realigned: `priceUsd` β `quotes.USD.price`, `marketCapUsd` β `quotes.USD.market_cap`, `supply` β `total_supply`, `volumeUsd24Hr` β `quotes.USD.volume_24h`, `changePercent24Hr` β `quotes.USD.percent_change_24h`.
CoinPaprika's keyless tier doesn't expose VWAP, so the TUI table's `VWAP(24Hr)` column becomes `Change(7d)` (`quotes.USD.percent_change_7d`, which returns real values on the keyless tier). Still 7 columns, still 100 rows.
```bash
x coin
x coin --csv
x coin --rawThanks @donbagger for the suggestion and the reproducible test report!