3.6 KiB
3.6 KiB
Changelog
All notable changes to metin-release-cli are documented here.
Format follows Keep a Changelog. 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.
[Unreleased]
Added
metin_release_mcppackage andmetin-release-mcpconsole script — a thin Model Context Protocol stdio server that wraps the Phase 1release …subcommands as eight MCP tools (release_inspect,release_build_manifest,release_sign,release_diff_remote,release_upload_blobs,release_promote,release_verify_public,release_publish). Each tool's input schema mirrors the CLI's argparse signature 1:1; the wrapper shells out tometin-release <subcommand> --json …and returns the parsed envelope verbatim with zero duplicated business logic.[mcp]optional dependency group pulling in the officialmcpPython SDK.docs/mcp.md— MCP server usage guide.tests/mcp/— 45 new tests covering the CLI runner (success path, error-envelope passthrough, unparseable output, missing binary), tool schemas (mirror checks against each command's argparse), and dispatch translation (booleans, optionals, paths with spaces).
[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-releasecommand,python -m metin_releasemodule entry, andmetin-release --versionresolving viaimportlib.metadata- Top-level and per-subcommand
--json,-v,-qflags (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 + flagsrelease build-manifest— wrapmake-manifest.pyand report manifest statsrelease sign— wrapsign-manifest.pyand verify 64-byte outputrelease diff-remote— HEAD blob URLs and report the missing setrelease upload-blobs— rsync push blobs + archive to a target, with--dry-runand--yes, excludingmanifest.json*so promote stays atomicrelease promote— upload onlymanifest.jsonandmanifest.json.sigrelease verify-public— fetch + Ed25519-verify the published manifest, optional--sample-blobs Nsha256 re-checkrelease publish— composite of build-manifest → sign → upload-blobs → promote → verify-public with per-stage timings and short-circuit on failure- Error hierarchy in
errors.pymapping each exception class to the right exit code and a stableerror_codestring 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.mdman-page-style reference
Notes
- Runtime deps pinned to
cryptographyandrequestsonly. Dev deps arepytest+pytest-mock. make-manifest.pyandsign-manifest.pyare discovered by convention atscripts/make-manifest.py/scripts/sign-manifest.pyrelative to the CLI repo, or overridden viaMETIN_RELEASE_MAKE_MANIFESTandMETIN_RELEASE_SIGN_MANIFESTenv 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.