# Changelog All notable changes to `metin-release-cli` are documented here. Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Versions follow semantic versioning: major for incompatible CLI or JSON contract changes, minor for new subcommands or additive flags, patch for fixes that preserve the contract. ## [0.1.0] - 2026-04-14 First Phase 1 drop. Implements the minimum asset release path the `metin-release-cli-plan.md` calls for — everything the launcher contract needs to publish a signed manifest and content-addressed blob tree. ### Added - `metin-release` command, `python -m metin_release` module entry, and `metin-release --version` resolving via `importlib.metadata` - Top-level and per-subcommand `--json`, `-v`, `-q` flags (both placements work) - Structured result envelope and exit-code contract (`0/1/2/3/4`) from the plan - `release inspect` — scan a client source root and report counts + flags - `release build-manifest` — wrap `make-manifest.py` and report manifest stats - `release sign` — wrap `sign-manifest.py` and verify 64-byte output - `release diff-remote` — HEAD blob URLs and report the missing set - `release upload-blobs` — rsync push blobs + archive to a target, with `--dry-run` and `--yes`, excluding `manifest.json*` so promote stays atomic - `release promote` — upload only `manifest.json` and `manifest.json.sig` - `release verify-public` — fetch + Ed25519-verify the published manifest, optional `--sample-blobs N` sha256 re-check - `release publish` — composite of build-manifest → sign → upload-blobs → promote → verify-public with per-stage timings and short-circuit on failure - Error hierarchy in `errors.py` mapping each exception class to the right exit code and a stable `error_code` string for machine parsing - pytest suite with 18 tests covering dispatch, inspect, build-manifest, sign, diff-remote (via a local HTTPServer fixture), and the full publish composite against a local rsync target - `docs/cli.md` man-page-style reference ### Notes - Runtime deps pinned to `cryptography` and `requests` only. Dev deps are `pytest` + `pytest-mock`. - `make-manifest.py` and `sign-manifest.py` are discovered by convention at `scripts/make-manifest.py` / `scripts/sign-manifest.py` relative to the CLI repo, or overridden via `METIN_RELEASE_MAKE_MANIFEST` and `METIN_RELEASE_SIGN_MANIFEST` env vars. - Phase 2 (`erp …` subcommands), Phase 3 (MCP wrapper), Phase 4 (`m2pack …` subcommands) and Phase 5 (`launcher publish`) are explicitly out of scope for this release and will land in future minors.