multirelease
"Main is the kitchen. Tags are the restaurant menu. The customer never sees the kitchen."
Work In Progress
multirelease is a proof of concept. The RFC defines the capabilities. The implementation is catching up.
What
multirelease is the publish-state creator — one of four tools in the multimod ecosystem. It transforms dev-state go.mod files into publish-state, creates a detached git commit, and tags it for release.
Zero knowledge of multimod. multirelease reads a JSON module map from stdin and a version string from arguments. It doesn't know how modules were discovered. It doesn't import multimod code. The JSON contract is the only interface.
How It Works
# Dry-run: show the plan, touch nothing
multimod modules | multirelease v1.2.3
# Local: create detached commit + tags on your machine
multimod modules | multirelease v1.2.3 --write
# CI: create + push
multimod modules | multirelease v1.2.3 --write --pushWhat happens with --write:
- Tag current HEAD as
v1.2.3-dev(traceability) git checkout --detach(main is never touched)- Strip internal
replacedirectives from all sub-modulego.mod - Pin internal
requireversions tov1.2.3 - Commit:
chore(release): v1.2.3 [multirelease] - Tag:
v1.2.3(root) +otel/v1.2.3(each sub) git checkout main(return to dev-state)
Main never leaves dev-state. The publish-state commit is detached — accessible only via tag.
Three Levels of Trust
| Mode | What happens | Who uses |
|---|---|---|
| (default) | Dry-run: show plan, touch nothing | Developer verification |
--write | Local: detached commit + tags | Developer local testing |
--write --push | Commit + tags + push to origin | CI pipeline |
Input Contract
multirelease reads the Module Map JSON from stdin:
{
"version": 1,
"root": {"path": "github.com/example/project", "dir": "/abs/path"},
"subs": [
{"path": "github.com/example/project/otel", "dir": "/abs/path/otel",
"requires": ["github.com/example/project"], "workspace_only": false}
]
}Any tool that produces this JSON can drive multirelease. multimod modules is the default producer, but a jq script works too.
See Also
- multimod — the dev-state half of the ecosystem
- Pipe Ecosystem — how all four tools work together
- RFC-001 — the architectural source of truth
- FAQ — "Detached commits are bad practice!" and other angry questions