RELEASE.md
This document explains the release goals, version and tag conventions, primary release flows, republishing paths, and verification steps for the OpenViking repository. It is based on the tracked GitHub Actions workflows, build configuration, and package configuration in this repository.
OpenViking does not release a single artifact. A release publishes a set of related assets for different usage paths:
openviking Python package: for users who need the local runtime, server, CLI, and full feature set.openviking-sdk: for lightweight HTTP clients that call an existing OpenViking server.ov CLI through npm.openviking[bot] and the official Docker image; historical standalone release entries are documented separately to avoid misuse.A formal main-package release should keep the Python package, Docker images, and TOS assets on the same main release tag. SDK, CLI, and ClawHub plugin releases use their own tag or version namespaces.
Use the following tag conventions:
| Artifact | Recommended tag / version | Notes |
|---|---|---|
openviking main package | vX.Y.Z | Main release tag, for example v0.3.26. |
openviking-sdk | [email protected] | SDK-only tag, for example [email protected]. |
| Rust CLI / npm CLI | [email protected] | CLI-only tag, for example [email protected]. |
| ClawHub plugin latest | YYYY.M.D or YYYY.M.D-N | Generated by the workflow or specified manually. |
| ClawHub plugin dev | YYYY.M.D-dev.N | Used for the dev channel. |
The main package version is resolved from Git tags through setuptools_scm; formal main releases should use vX.Y.Z. The SDK also uses setuptools_scm, but it only matches python-sdk@* tags so it does not conflict with main package tags.
Formal main package releases go through GitHub Releases in the root repository:
v0.3.26.03. Release workflow runs when the Release is published._Build Distribution to build the sdist and multi-platform wheels.Release TOS Upload workflow uploads the source archive and installation scripts to TOS.A formal main release publishes to:
openvikingghcr.io/<owner>/<repo><dockerhub-user>/openvikinglatest stable pathsThe root release workflow also supports manual dispatch with these targets:
none: build only, without publishing.testpypi: publish to TestPyPI.pypi: publish to PyPI.both: publish to both TestPyPI and PyPI.If Python distributions were built successfully but publishing failed, use the _Publish Distribution workflow with the relevant build run id. This path is intended for recovery and republishing, not as the normal release entry point.
During a formal main release, Docker images are built and published by the main release workflow. Images are pushed to GHCR and Docker Hub with the release version tag and latest tag.
The repository also provides a standalone Build and Push Docker Image workflow for:
main branch.Note: the standalone Docker workflow currently also runs on v*.*.* tag pushes. The formal GitHub Release source of truth is still the 03. Release workflow; treat the standalone Docker workflow as an image-specific build or republish path to avoid confusing it with the formal release artifact set.
To avoid duplicate publishing, use the main release workflow for formal versions. Use the standalone Docker workflow only for image republishing or special verification.
The TOS release flow creates a source archive and uploads these assets:
releases/<tag>/openviking-<tag>-source.zipFormal GitHub Releases trigger the TOS upload automatically. Manual republishing can specify a tag and use update_latest to decide whether to overwrite stable paths.
If TOS secrets are not fully configured, the workflow skips uploading and reports it in the step summary without failing the whole workflow.
The Python SDK lives under sdk/python, and its PyPI package name is openviking-sdk. SDK releases use an independent tag namespace:
Typical flow:
[email protected].Python SDK Release workflow runs from the tag.setuptools_scm.python-sdk@<resolved-version>.sdk/python and publishes it to PyPI.The SDK workflow also supports manual dispatch with testpypi, pypi, or both. Manual dispatch is useful for validation and recovery; formal SDK releases should use [email protected] tags.
The Rust CLI tag format is:
After a cli@* tag is pushed, the Rust CLI Build workflow builds the ov binary for multiple platforms and publishes npm packages:
@openviking/cli-linux-x64, @openviking/cli-linux-arm64, @openviking/cli-darwin-x64, @openviking/cli-darwin-arm64, @openviking/cli-win32-x64@openviking/cliThe workflow injects the version from the tag into the platform packages and wrapper package. If the same version already exists on npm, the workflow skips the already published package.
The OpenClaw plugin is published manually through the ClawHub release (OpenViking plugin) workflow. Inputs include:
version: optional; when empty, the workflow generates a date-based version.channel: auto, dev, or latest.changelog: release notes for the plugin release.The workflow resolves the channel and version, packs examples/openclaw-plugin, pushes a generated package branch, and then calls ClawHub's official trusted publishing workflow.
Recommended usage:
latest or auto for the formal channel.dev for development validation.version manually, ensure it matches the required format for the selected channel.VikingBot is no longer maintained as a recommended standalone PyPI release path. The current distribution model is through the main package:
pip install "openviking[bot]".uv pip install -e ".[bot]".--without-bot or OPENVIKING_WITH_BOT=0.The root repository still contains a First Release to PyPI workflow, but it builds an independent Python package from the bot directory. The current bot/ directory does not contain an independent pyproject.toml, setup.py, or setup.cfg, so this workflow should be treated as historical leftover configuration and should not be used for new VikingBot releases.
The file bot/.github/workflows/release.yml lives under the bot subdirectory. Treat it as a historical bot subproject or split-repository release reference, not as a GitHub Actions workflow that the current root repository can directly trigger. Restoring an independent vikingbot package would first require adding standalone Python package metadata, a versioning strategy, and a publishing credential strategy under bot/.
Before releasing, confirm that:
After releasing, verify that:
pip install openviking==<version> or pip install openviking-sdk==<version> succeeds.latest / main tag.latest, main, and manually specified tags can be rebuilt through the image republishing workflow, but keep released version tags traceable.