# m2-market CLI contract v1 The CLI is the only marketplace surface that calls m2-ledger directly. Store, Scout, and Hermes consume the CLI JSON contract. Config: `~/.m2-market/config.toml` mode `0600`. Required keys: `operator_id`, `tenant`, `ledger_url`, `ledger_api_key`, `memory_api_url`, `memory_api_key`, `forgejo_url`, `forgejo_token`, `apply_adapter`. State: `~/.m2-market/state.json`. Install entries MUST store `grant_id` and `tx_group_id`. ## Verbs - `m2-market search [--type solution|capability|resource|service] [--limit N] [--json]` - `m2-market show [--json]` - `m2-market install [--yes] [--json]` - `m2-market uninstall [--yes] [--json]` - `m2-market upgrade [--to ] [--yes] [--json]` - `m2-market wallet [--operator ] [--json]` - `m2-market publish [--tenant-visibility ]` - `m2-market package init|import-fedlearn|validate|build|diff-permissions|evidence-summary|verify-release` - `m2-market reindex` - `m2-market propose "" --tenant --operator --json` - `m2-market evidence capture|submit|show` - `m2-market telemetry submit ` ## Exit codes | Code | Meaning | | --- | --- | | 0 | Success, including idempotent no-op install. | | 1 | Usage error, unsupported operation, or direct install refused for `price.model=job`. | | 2 | Listing, release, license, or local install state not found. | | 3 | Insufficient funds or ledger payment declined before apply. | | 4 | Apply, verify, uninstall, or upgrade failed after settlement; CLI attempted refund when applicable. | | 5 | Schema validation, tenant firewall, secret scan, permissions, or publish gate rejection. | | 6 | External dependency unavailable or deferred adapter path not landed. | ## `show --json` The detail payload is frozen for Store and Scout: ```json { "schema_version": "m2.market.show.v1", "listing": { "schema_version": "m2.listing.v1", "listing_id": "lst_mm-pdf-report", "solution_id": "sol_mm-pdf-report", "solution_version": "1.0.0", "inventory_type": "solution", "name": "MM PDF Report", "summary": "Generate branded PDF reports.", "category": "reporting", "price": {"model": "fixed", "amount": 25, "currency": "m2cr"}, "seller": {"operator_id": "op_m2core", "display_name": "M2 Core"}, "content_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000", "tenant_visibility": ["*"], "status": "published", "install_ref": "lst_mm-pdf-report-v1.0.0" }, "solution": { "schema_version": "m2.solution.v1", "solution_id": "sol_mm-pdf-report", "name": "MM PDF Report", "summary": "Generate branded PDF reports.", "intent": "Turn approved analysis into a styled client-ready PDF report.", "deployment": { "recipe_ref": "recipe.yaml", "entrypoint": "mm-pdf generate ", "verify_command": "mm-pdf --version" }, "applicability": { "image_classes": ["primus", "agent-latest"], "roles": ["operator"], "tool_requirements": ["bash"] }, "tenant_scope": "m2-core", "evidence": [{"source": "forgejo:m2/m2-market/listings/lst_mm-pdf-report/evidence/provenance.jsonl"}], "content_hash": "sha256:0000000000000000000000000000000000000000000000000000000000000000", "price": {"model": "fixed", "amount": 25, "currency": "m2cr"}, "seller": {"operator_id": "op_m2core", "display_name": "M2 Core"}, "license": { "license_id": "lic_m2_market_standard_v1", "terms": "m2-market-standard-v1", "scope": "operator", "major_version_coverage": true, "allows_internal_modification": true, "allows_redistribution": false, "support": "best_effort" } }, "wallet": {"operator_id": "op_chris", "balance": 100, "currency": "m2cr", "as_of": "2026-07-02T00:00:00Z"}, "install_state": { "status": "not_installed", "installed_version": null, "grant_id": null, "tx_group_id": null }, "permissions_diff": { "schema_version": "m2.permissions_diff.v1", "mode": "new_install", "listing_id": "lst_mm-pdf-report", "current_install_ref": null, "target_install_ref": "lst_mm-pdf-report-v1.0.0", "summary": {"added": 2, "removed": 0, "changed": 0, "unchanged": 0, "risk": "medium"}, "items": [ { "permission_id": "fs-write-agent-home", "action": "added", "kind": "filesystem", "access": "write", "scope": "${AGENT_HOME}/.claude/skills/mm-pdf", "target": "skill files", "reason": "install skill files", "risk": "low", "requires_confirmation": false } ] } } ``` `permissions_diff.mode` is one of `new_install`, `upgrade`, `reinstall`, `uninstall`, or `no_change`. `items[].action` is one of `added`, `removed`, `changed`, or `unchanged`.