v0.1.22 — mms host-config management surface (W1+W2+W3)
This release lands the full mms host-config management surface (RFC v0.3 Workstreams 1–3) — mms project, mms import, and the mms host subgroup (status/scan/sync/sync --force). Together they form the read → reconcile → write-back loop for keeping host MCP configs in sync with the mms registry.
W1 — registry foundation
- #278
mms projectsubgroup (init/show/list/enable/disable) + new~/.mms/dotdir withregistry.toml/projects.toml/ per-project.mms/project.toml.mms add↔stm_proxy.jsonandmms import --apply↔registry.tomlare fully disjoint mutation paths in W1. - #279
mms importreads MCP definitions from Claude Code / Cursor / Codex CLI / Claude Desktop. Two-signal secret classification (key pattern OR opaque-token heuristic), dangerous-env-key filter (LD_PRELOAD,NODE_OPTIONS, etc.), first-import-wins reconciliation.--plan/--apply/--show-importedflow.
W2 — drift detection + reconciliation
- #280 Drift-hash foundation. Canonical form (
command + ordered args + key-sorted env, prefix excluded) + sidecar baseline at~/.mms/import_state.toml. Cross-host equivalence is load-bearing — samegithubentry hashes byte-identical across all four host config formats. - #281 Wire drift-hash into
mms import --apply+ idempotent backfill (closes pre-PR2 / crash / manual-delete recovery scenarios; backfillsource_labelreflects the current observing host, asymmetric to fresh-import semantics by design). - #282
mms host status4-state classifier (unchanged/changed/removed_at_host/no_baseline). Read-only, exit 0. JSON 4-key summary frozen as backwards-compat anchor._select_candidate_by_nametwo-pass with baseline-source-label preference (no flicker when entries mirror to a second host). - #283
removed_at_hostpromoted from footer count to main-table row (3 states in main table now). Footer count + template kept as backwards-compat anchor for downstream tooling that grepped PR3's output. - #284
mms host scanhost-side discovery surface. Three columns (NAME / HOST / IN_REGISTRY) + complementary symmetry to status (new_at_host↔removed_at_host). Same-name multi-host = full inventory. - #285
mms host sync --plan/--applywrite-back. Four mutating buckets (ADD / REMOVE / BACKFILL / CLEANUP) — first and only command in mms that deletes from the registry. New TTY+--yesconfirmation pattern;--json+ REMOVE always requires--yes(mixing prompt text with JSON corrupts parsing). Cross-host shape-relocation contract: no silent reshape.
W3 — re-stamp
-
#286
mms host sync --forcere-stampschangedentries as a full reconciliation (registry + sidecar updated atomically; not sidecar-only). Confirmation prompt shows old/new diff per entry (command/args/ env-key set; env values redacted; env keys sorted for diff stability). Env-value-only drift (token rotation: same keys, different values) collapses to a single shape line + explicit(env values redacted; values changed)note.--forceand--yesare orthogonal.Lock-down 6 cross-host partition (BLOCKER from review):
--forceskips entries whose only candidate is at a non-baseline host — adopting a Pass-2 fallback would silently relocate the entry's host-of-record. Cross-host count surfaces in JSONplan.skipped_changed[i].host_relocationand a manual-review footer; when every changed entry is cross-host, the standard "use --force" pointer is suppressed entirely.
JSON shape additions (additive at the entry-field level)
Existing parsers reading summary[k] / plan.<bucket>[i]["name"] keep working.
mms host status --json— entries gaincurrent_hash(host view, uniform across buckets) +baseline_hash+last_imported. Always-emit 4-key summary.mms host scan --json—total/in_registry/new_at_hostsummary (always-emit).mms host sync --json—mode/aborted/plan(7 always-emit arrays) /summary(8 always-emit counts).mms host sync --force --json—summary.restamped: int(always present, default 0);plan.skipped_changed[i]gainssource_label/baseline_hash/current_hash/last_imported/host_relocation.
Backwards-compatibility
All existing CLI commands (mms add, mms init, mms register, mms list, mms health, mms prune) untouched. New ~/.mms/ dotdir is independent of ~/.memtomem/. STM proxy bootstrap (stm_proxy.json) is unaffected.
Install
uv tool install --force memtomem-stm==0.1.22
# or
pipx install --force memtomem-stm==0.1.22Full changelog: https://github.com/memtomem/memtomem-stm/blob/main/CHANGELOG.md#0122--2026-05-02