Skip to content

Pipe Ecosystem

"Each tool does one thing. Tools communicate through stdin/stdout/JSON. Any tool is replaceable with an alternative that speaks the same contract." — RFC-001, §3.1

The Full Pipeline

clone → multimod → develop → multimod go → test → release pipeline

                                         version-bumper → multirelease → ghreleaser
bash
# CI release pipeline — one line
multimod modules | multirelease $(version-bumper) --write --push

# Then create GitHub Release
gh release create "$VERSION" --generate-notes

Four Tools, Four Domains

ToolWhat it doesInputOutputStatus
multimodSyncs dev-state, iterates modulesFilesystemSynced FS, JSON module mapPoC
multireleaseCreates publish-stateJSON (stdin) + version (arg)Detached commit + tagsPoC
version-bumperDetermines next versionGit historyVersion string (stdout)Planned
ghreleaserCreates GitHub ReleaseVersion + git historyGitHub ReleasePlanned

The Contract

The Module Map JSON is the primary contract between tools:

bash
multimod modules   # → JSON to stdout
json
{
  "version": 1,
  "root": {"path": "github.com/example/project", "dir": "/abs/path", "go_version": "1.25.0"},
  "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. Any tool that reads it can consume multimod's output. The contract is the interface, not the implementation.

Replaceable Parts

Every tool in the ecosystem can be replaced:

bash
# Replace version-bumper with svu
multimod modules | multirelease $(svu next) --write --push

# Replace version-bumper with cocogitto
multimod modules | multirelease $(cog bump --auto --dry-run) --write --push

# Replace ghreleaser with gh CLI
gh release create v1.2.3 --generate-notes

# Replace ghreleaser with git-cliff + gh
git-cliff -t v1.2.3 | gh release create v1.2.3 --notes-file -

# Replace multimod modules with a jq script
cat my-modules.json | multirelease v1.2.3 --write

Litmus test from the RFC: can a user replace any single tool with a shell script or third-party alternative? If not — the boundary is wrong.

Adoption is Incremental

You don't need all four tools:

  • Just multimod — sync go.work, replaces, go version. Run multimod go test ./.... Never touch release tools.
  • multimod + multirelease — add release automation when ready. Specify version manually.
  • Full pipeline — add version-bumper when you want automated version determination. Add ghreleaser for GitHub Releases.

Each tool is useful in isolation. The ecosystem grows with your needs.

See Also

Apache 2.0 · Built in public · Contributions welcome