From 6e71ddb6355ced58ba6864798ff75d5e3c4084da Mon Sep 17 00:00:00 2001 From: Jan Nedbal Date: Tue, 14 Apr 2026 19:21:55 +0200 Subject: [PATCH] docs: add changelog with phase 1 notes Seed CHANGELOG.md in Keep a Changelog format, document every Phase 1 subcommand plus the --json flag placement fix as the initial 0.1.0 entry. Future minors and patches add sections above this one. --- CHANGELOG.md | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..611b702 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,50 @@ +# 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.