Skip to content

Releases & Mirroring

ContextUnity is developed in the monorepo. Open packages are mirrored to standalone GitHub repositories and published to PyPI per service, each with its own version.

Sync vs release

LayerTriggerResult
Syncpush to mainMirror changed packages to public repos with path-filtered commit messages
Releaseper-service tagCI gate → PyPI publish → GitHub Release in the mirror repo

A single merge may touch several services. Release only the packages that are ready.

Mirror mapping

Monorepo pathMirror repoPyPI packageRelease tag
packages/core/contextcorecontextunity-corecontextcore-v*
services/brain/contextbraincontextunity-braincontextbrain-v*
services/router/contextroutercontextunity-routercontextrouter-v*
services/worker/contextworkercontextunity-workercontextworker-v*
packages/cli/contextunity-clicontextunity-cli-v*

Mirror commit messages list only commits in the push that touched that service (and packages/core/ when the service depends on core).

Prefer conventional commits with scope: fix(router):, feat(brain):, fix(core):.

Release one service

  1. Bump version in the package pyproject.toml.
  2. Merge to main (mirror runs after CI).
  3. Tag and push:
Terminal window
git tag -a contextrouter-v0.20.1 -m "fix(router): federated skip handling"
git push origin contextrouter-v0.20.1

CI checks the tag against pyproject.toml, runs tests, publishes to PyPI, and opens v0.20.1 in the mirror repo.

Same merge, multiple releases

Terminal window
git tag -a contextrouter-v0.20.1 -m "fix(router): ..."
git push origin contextrouter-v0.20.1
git tag -a contextbrain-v0.15.3 -m "feat(brain): ..."
git push origin contextbrain-v0.15.3

Both tags can point to the same commit.

Tag format

  • Pattern: <service-prefix>-v<semver> (e.g. contextrouter-v0.20.1)
  • Version must match the package pyproject.toml
  • Use annotated tags (-a) so the message becomes release notes