[+] CVE backends async, CLI with output formats, status density, ecosystem tracking
1. convert all CVE backends to async (run_in_executor + urllib);
2. base class provides _fetch_url, _post_json, _head_content_length async helpers;
3. NVD rate-limit delays use asyncio.sleep;
4. add --timeout to cve sync via asyncio.wait_for;
5. add cve CLI as apps/cve/cli.py with cve_cli_t class, routed from cli/main.py;
6. main.py uses pr34 parse_args stop_at for proper -h passthrough;
7. add cli_types.py with pydantic models for sync/status/check results;
8. add cli_render.py with txt/json/yaml output renderers;
9. add --format txt|json|yaml flag on cve parser;
10. status shows per-source: entries, last_sync (datetime), fetch_range, density;
11. density computed from date_published (NVD), CVE ID year (arch_tracker);
12. cve_db_t schema v2: add cve_osv_ecosystems table;
13. osv_ecosystems_t fetches from GCS, fixes infinite loop (IsTruncated check);
14. status shows ecosystem counts: total/supported/unsupported per package_map_t;
15. sync stores ecosystems in sqlite, status reads from db only;
16. all print() replaced with logger or stdout render;
17. arch_tracker sync: clean fetch/parsed/ingested logging, no per-100 spam;
18. upsert_entries returns cve_upsert_result_t with received/inserted counts;
19. add cve_date_range_t, cve_upsert_result_t, output_format_t, date_source_t types;