Skip to content

release.version

The version the crate manifest declares, the version the shell tool prints, and whether they agree — the same question `scripts/release-version --check` gates on. Then the bump the conventional commits since the last release imply, the version it would produce, and the commits themselves as the evidence for it.

The version the crate manifest declares, the version the shell tool prints, and whether they agree — the same question `scripts/release-version --check` gates on. Then the bump the conventional commits since the last release imply, the version it would produce, and the commits themselves as the evidence for it.

Exposure

Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.

surfaceas
MCPtool majordomus_release_version
HTTPGET /api/v1/release/version operationId release.version
command line

Schemas

The canonical input and output, from the Rust types; the MCP tool schema and the OpenAPI parameters and responses are derived from these.

input · Empty

No input.

No properties: the capability takes no input.

JSON Schema
{
  "additionalProperties": false,
  "description": "No input.",
  "title": "Empty",
  "type": "object"
}

output · ReleaseVersionReport

What the version is, and what the commits since the last release imply it should become.

propertytyperequireddescription
agree boolean yes Whether the two agree. `scripts/release-version --check` is the gate; this is the same question asked by the executable, so every surface can show the answer.
bump string yes What the commits since it imply: `major`, `minor`, `patch`, or `none`.
changes array yes How many commits since the last release, and of what kind — the evidence for the bump, so that a surprising answer can be checked rather than believed.
declared string yes The version the crate manifest declares — the authority.
last_release string | null no The last release the layer records.
next string | null no The version that bump would produce.
tool string yes The version `bin/majordomus` prints.
JSON Schema
{
  "$defs": {
    "ReleaseChange": {
      "description": "One change, from one commit.",
      "properties": {
        "breaking": {
          "description": "Whether the commit marked itself breaking, with `!` or a `BREAKING CHANGE:` trailer.",
          "type": "boolean"
        },
        "commit": {
          "description": "The abbreviated commit.",
          "type": "string"
        },
        "kind": {
          "$ref": "#/$defs/ReleaseChangeKind",
          "description": "What it did."
        },
        "references": {
          "description": "The records of the layer this commit names — issues, milestones — resolved against\nwhat the layer actually holds.",
          "items": {
            "$ref": "#/$defs/ReleaseReference"
          },
          "type": "array"
        },
        "scope": {
          "description": "The area it did it in, when the subject named one: `commands`, `ci`, `site`.",
          "type": [
            "string",
            "null"
          ]
        },
        "subject": {
          "description": "The subject, without the type and scope that prefixed it.",
          "type": "string"
        },
        "url": {
          "description": "Where that commit can be read, when the repository's own URL is known. Derived from\n`about::REPOSITORY`, never written beside each entry.",
          "type": [
            "string",
            "null"
          ]
        }
      },
      "required": [
        "kind",
        "subject",
        "breaking",
        "commit"
      ],
      "type": "object"
    },
    "ReleaseChangeKind": {
      "description": "What a conventional commit says it did.\n\nThe set is the one the repository's own commit convention uses; a commit whose subject\ndoes not parse is [`ChangeKind::Other`] and still appears, because a changelog that\nsilently drops what it cannot classify is a changelog that lies by omission.",
      "oneOf": [
        {
          "const": "feat",
          "description": "A capability a person did not have before.",
          "type": "string"
        },
        {
          "const": "fix",
          "description": "Behaviour that was wrong and is not any more.",
          "type": "string"
        },
        {
          "const": "perf",
          "description": "Performance, with the behaviour unchanged.",
          "type": "string"
        },
        {
          "const": "refactor",
          "description": "Structure, with the behaviour unchanged.",
          "type": "string"
        },
        {
          "const": "docs",
          "description": "Documentation.",
          "type": "string"
        },
        {
          "const": "test",
          "description": "Tests.",
          "type": "string"
        },
        {
          "const": "chore",
          "description": "The build, the pipeline, the tooling.",
          "type": "string"
        },
        {
          "const": "ci",
          "description": "Continuous integration.",
          "type": "string"
        },
        {
          "const": "style",
          "description": "Formatting, with the behaviour unchanged.",
          "type": "string"
        },
        {
          "const": "build",
          "description": "The build system or its dependencies.",
          "type": "string"
        },
        {
          "const": "revert",
          "description": "A change that undoes another.",
          "type": "string"
        },
        {
          "const": "other",
          "description": "A commit whose subject does not parse as a conventional commit.",
          "type": "string"
        }
      ]
    },
    "ReleaseReference": {
      "description": "A record of the layer that a commit names in its own text.\n\nInferred, never declared beside the commit: an issue id or a milestone id appearing in a\nsubject or a body is a reference, and the layer already holds the object it refers to. A\nreference to something the layer does not have is not carried — a link to a record that\ndoes not exist is worse than no link, because the reader cannot tell until they follow it.\n\n```\nuse majordomus_cli::release::model::Reference;\nlet r = Reference {\n    kind: \"issue\".into(),\n    id: \"I1305\".into(),\n    title: \"An observed contract has a fingerprint\".into(),\n    route: Some(\"/plan/i1305/\".into()),\n};\nlet json = serde_json::to_value(&r).unwrap();\nassert_eq!(json[\"id\"], \"I1305\");\nassert_eq!(json[\"route\"], \"/plan/i1305/\");\n// a reference the site has no page for carries no route rather than an invented one\nlet bare = Reference { route: None, ..r };\nassert!(serde_json::to_value(&bare).unwrap().get(\"route\").is_none());\n```",
      "properties": {
        "id": {
          "description": "`I1305`, `M000`.",
          "type": "string"
        },
        "kind": {
          "description": "`issue` or `milestone`.",
          "type": "string"
        },
        "route": {
          "description": "Where it is published on this site, when it has a page.",
          "type": [
            "string",
            "null"
          ]
        },
        "title": {
          "description": "What it is, from the record itself.",
          "type": "string"
        }
      },
      "required": [
        "kind",
        "id",
        "title"
      ],
      "type": "object"
    }
  },
  "description": "What the version is, and what the commits since the last release imply it should become.",
  "properties": {
    "agree": {
      "description": "Whether the two agree. `scripts/release-version --check` is the gate; this is the\nsame question asked by the executable, so every surface can show the answer.",
      "type": "boolean"
    },
    "bump": {
      "description": "What the commits since it imply: `major`, `minor`, `patch`, or `none`.",
      "type": "string"
    },
    "changes": {
      "description": "How many commits since the last release, and of what kind — the evidence for the\nbump, so that a surprising answer can be checked rather than believed.",
      "items": {
        "$ref": "#/$defs/ReleaseChange"
      },
      "type": "array"
    },
    "declared": {
      "description": "The version the crate manifest declares — the authority.",
      "type": "string"
    },
    "last_release": {
      "description": "The last release the layer records.",
      "type": [
        "string",
        "null"
      ]
    },
    "next": {
      "description": "The version that bump would produce.",
      "type": [
        "string",
        "null"
      ]
    },
    "tool": {
      "description": "The version `bin/majordomus` prints.",
      "type": "string"
    }
  },
  "required": [
    "declared",
    "tool",
    "agree",
    "bump",
    "changes"
  ],
  "title": "ReleaseVersionReport",
  "type": "object"
}

Policies

benchmark
required — a target on every transport the exposure declares; the cases are the input type's
cache
disabled — every call runs the handler

Benchmark targets

Derived from the registry for this repository: one requirement per transport, and the cases the input type provides. The whole matrix is on the benchmarks page.

transportstatecasestargets
directcovered1default
mcpcovered1default
httpcovered1default