cleanlib-cli 0.1.1

Terminal interface to CleanLibrary — query dependency verdicts and scan package manifests for ALLOW / DENY / WARN signals from the terminal or CI pipelines.
# Changelog — cleanlib-cli

All notable changes to the `cleanlib-cli` tool will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this crate adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Planned
- Pre-built cross-platform binaries (Linux, macOS, Windows) so customers without a Rust toolchain can install via `curl | sh` without `cargo install`
- Homebrew tap for `brew install` on macOS

## [0.1.1] — 2026-06-05

### Fixed

- **`cleanlib audit` now reaches the right endpoint.** The transport layer
  hit `/v1/customer/audit` (404 on live App) instead of `/v1/audit` (200 —
  the App's `verbs_router` mount). Verified live against
  cleanapp.clnstrt.dev 2026-06-05; the command was completely broken on
  every prior release. Fix lives in `cleanlib_client::transport::Client::audit`.

### Added

- **Leading `decision:` line** in `cleanlib verdict` text output. The
  at-a-glance signal (ALLOW / WARN / DENY) now appears as the FIRST line,
  styled via the existing `style_decision` palette (green / yellow / red
  on TTY). The detail-level `verdict:` label (VECTOR_VERDICT / ...,
  customer-facing-masked via `mask_engine_tag`) stays as the second line.
  Customers reading from a terminal can scan a wall of `cleanlib verdict`
  output and pick out DENY rows immediately.
- **Multi-line `suggested:` rendering.** Single-action verdicts still
  print inline (`suggested:        <one string>`); multi-action verdicts
  now render as a bulleted list under a bare `suggested:` header. The
  prior semicolon-joined run-on string was unreadable for the
  CLEANLIB-72 populator output (3–4 advice strings per ALLOW_BY_ABSENCE
  / policy-DENY case).
- **`cleanlib scan --packages` accepts JSON-array input.** Auto-detected
  via leading `[` character. Each element is
  `{"name": "...", "version": "..."}`. The text-only `name@version`
  per-line format remains the default. Common customer-facing producer
  paths (`npm ls --json | jq ...`, package-list outputs from CI tools)
  now work without a translation step.

### Notes

- No breaking changes to existing flag surface, exit codes, or env vars.
- `--output json` machine path unchanged; the text-mode `decision:` /
  bulleted `suggested:` adjustments are TTY presentation only.

## [0.1.0] — 2026-06-03

### Added
- Inaugural crates.io release: `cargo install cleanlib-cli`
- Ten commands: `status`, `login`, `logout`, `verdict`, `scan`, `policy preview`, `risk-accept`, `audit`, `fetch`, `config init`
- Four ecosystem wrappers: `cleanlib pip`, `cleanlib npm`, `cleanlib cargo`, `cleanlib go`
- CI-gating exit-code semantics: `rc=0` on `ALLOW`, `rc=1` on `DENY`, `rc=2` on `WARN` with `--strict-warn`
- Cached verdicts with configurable TTL (default 300 seconds)
- Per-ecosystem proxy configuration emission (`.npmrc`, `pip.conf`, Go env)
- Empty-bearer fail-loud at `login` and `config init` (rejects silent-misconfig modes)
- Engine-tag masking at render: AI-derived signal sources surface as `AI-derived` to customers
- Transactional `config init` output (no partial writes on invalid input)

[0.1.0]: https://crates.io/crates/cleanlib-cli/0.1.0