You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
mms prune + mms init --prune-originals collapse dual-registration (#241) — mms init --mcp claude (and mms add --import without --prune) intentionally leaves source-client registrations in place, so upstreams end up registered both directly in the source client and through STM. Tool calls bypass STM's compression, caching, and LTM surfacing whenever the direct path is taken. Two opt-in entry points now collapse the dual path, both built on the existing _handle_source_prune / _prune_imported_candidates pipeline from #226: (1) mms prune [NAMES...] [--all] [--yes] [--dry-run] is a standalone post-hoc pruner — refuses to run without explicit scope (--all or NAMES), aborts on unknown names before any writes, requires --yes on non-TTY, exits non-zero with a per-row manual-command fallback on partial failures; (2) mms init --prune-originals is the opt-in flag for scripted onboarding, with a single y/N prompt (default No) on TTY. Non-TTY without the flag preserves the #203 hint-only default (regression-guarded). _find_dual_registered matches on name plus_server_signature (mirroring _add_from_clients dedup in the opposite direction); a source-client entry sharing a name with an STM upstream but wired to a different command / URL is rejected with a "divergent identity" error rather than clobbered. The preview surfaces each source entry's command or URL via _format_candidate_detail so users can verify what will be removed before consenting. STM's own stm_proxy.json is never touched; only source-client files change. mms init remains bootstrap-only — the new flag adds a post-save step, not a re-entry into the wizard.
Internal
init_langfuse drops three type: ignore[union-attr] via walrus (#239) — init_langfuse takes config: object (duck-typed so any settings source can be passed), so mypy can't prove config.public_key / .secret_key / .host exist after a getattr(config, name, "") truthy check — the check narrows a local, not the attribute on config. Folded each guard-plus-usage pair into a single walrus assignment (if public_key := getattr(config, "public_key", ""):) so the checked value is also the one assigned, dropping all three # type: ignore[union-attr] suppressions. No runtime behavior change: each attribute is read exactly once, kwargs contains the same keys for the same inputs, and falsy-skip semantics ("" / None / missing) are preserved. Keeps the config: object duck-typing contract — no import of a concrete LangfuseConfig type, no isinstance narrowing branch.
Docs
docs/cli.md catches up v0.1.9–v0.1.16 reference drift (#237) — the v0.1.8 docs audit closed before v0.1.9 shipped; eight point releases later four user-facing changes were live in CHANGELOG but had never been mirrored into the per-feature reference docs. Synced: v0.1.12 #213stm_progressive_stats brings the observability-tool count 6 → 7 (docs/configuration.md prose + tests/test_server_tools.py comment); v0.1.14 #227mms add --import --prune flag documented (docs/cli.md options table + paragraph + example); v0.1.15 #231 proxied tool annotations.title[server] tagging explained (docs/cli.md §MCP Tools); v0.1.16 #234LangfuseConfig fail-fast on missing [langfuse] extra surfaced (docs/configuration.md §Langfuse). No code changes — the sibling test-comment fix updates a stale literal next to the correct _OBSERVABILITY_TOOLS set.
CONTRIBUTING.md pytest command matches CI + docs/cli.md flags macOS-only Claude Desktop discovery (#238) — two small doc drifts fixed together with regression tests pinned to the respective sources of truth, so they can't silently reappear. CONTRIBUTING previously quoted pytest -m "not ollama" while CI's test job runs pytest -m "not ollama and not bench_qa_meta and not bench_qa_llm_judge" — new contributors hit the bench_qa_meta self-tests (intentional failures per marker design) and bench_qa_llm_judge scenarios (require OPENAI_API_KEY / ANTHROPIC_API_KEY), both looking like real regressions. docs/cli.md described the mms add --import Claude Desktop scan as "(OS-appropriate)" — but the discovery helper _desktop_config_path() is macOS-only (v0.1.13's #219 only fixed the paste hints, not discovery); Linux/Windows callers silently saw zero Desktop candidates. New tests/test_docs_sync.py::test_contributing_pytest_command_matches_ci extracts the CI filter with a regex and asserts CONTRIBUTING quotes it; test_cli_docs_flag_desktop_discovery_is_macos_only checks the helper remains macOS-only and if so requires docs/cli.md to keep a macOS[- ]only caveat.
docs/cli.mdlist subcommand section added to fix broken #list anchor (#240) — L74 referenced [`list`](#list) from the init description but no matching ### list heading existed, only a mms list example inside the shared Examples block. Added a ### list section between ### add and ### Examples, matching the register / health pattern: Usage block plus a one-paragraph description covering read-only behavior, --json output shape, and the config_not_found JSON branch scripting callers can key off. Scope is limited to the one broken anchor surfaced by an internal link audit (12 tracked .md files scanned; this was the sole finding).