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.
- query
- implemented
- module release
- #release
- #version
Exposure
Where this one definition is reachable. Absence is explicit: a surface not listed does not carry it.
| surface | as |
|---|---|
| MCP | tool majordomus_release_version |
| HTTP | GET /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.
| property | type | required | description |
|---|---|---|---|
| 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.