Two kinds of release come out of this repository: a plugin release, which publishes one plugin's new version through the marketplace, and an installer release, which publishes robotframework-plugins to PyPI with a snapshot of the catalogue. They are independent: a plugin can release many times between installer releases.
| What | Version scheme | Source of truth | Tag |
|---|---|---|---|
Each plugin (rf-core, rf-web, …, the rf-agentskills bundle) |
SemVer | plugins/<plugin>/.claude-plugin/plugin.json |
<plugin>--v<version>, for example rf-core--v1.0.0 |
The installer robotframework-plugins |
CalVer YYYY.M.PATCH |
installer/pyproject.toml |
robotframework-plugins-v<version>, for example robotframework-plugins-v2026.11.0 |
rf-skill-eval (internal) |
SemVer | root pyproject.toml |
none; never published |
The marketplace entries carry no version: Claude Code reads it from plugin.json. CONTRIBUTING.md ("Versions") explains which number to bump.
Older tags stay where they are: v1.1.0 to v3.0.0 are rf-agentskills content releases, and rf-agentskills-v0.3.0 to rf-agentskills-v0.8.0 are the installer under its old name. Old marketplace pins to them keep working.
- Bump the version and regenerate:
A change to a bundled plugin also changes the
scripts/bump-version.sh <plugin> <major|minor|patch> python scripts/build-catalog.py
rf-agentskillsbundle's copy; release the bundle too (scripts/bump-version.sh rf-agentskills …). - Add the release to
plugins/<plugin>/CHANGELOG.md. - Merge the PR. Then tag the merge commit and push the tag:
git tag <plugin>--v<version> && git push origin <plugin>--v<version>
release.ymlchecks that the tag matches the plugin'splugin.json, builds the plugin's archives, attaches them to a GitHub release and moves thestableandlatestbranches.
Before step 3, check the skills on Claude. CI evaluates PRs on DeepSeek V4.1 Flash, through OpenRouter, so run a manual Claude evaluation of the release candidate's branch and check its gate against the Claude baselines:
gh workflow run skill-evaluation.yml --ref <branch> \
-f provider=claude -f model=claude-sonnet-5-5 -f tiers=narrow,realistic -f arms=treatment,baselineA pushed tag is the ref users pin a marketplace to: never move or delete one.
The installer version is the year and month of the release, then a patch number: the first release, in November 2026, is 2026.11.0, a fix in the same month 2026.11.1.
- Set
versionininstaller/pyproject.tomland__version__ininstaller/src/robotframework_plugins/__init__.py, and add the release toinstaller/CHANGELOG.md. - Regenerate the version table in the README and
docs/catalog.md:python scripts/build-catalog.py. - Merge the PR, then tag and push
robotframework-plugins-v<version>. release.ymlchecks that the tag matchespyproject.tomland the current month, builds the wheel and sdist, and creates the GitHub release. Its notes start with the table of bundled plugin versions (python scripts/build-catalog.py --version-table), then the changelog section.- The publish job uploads to PyPI with trusted publishing: PyPI accepts the upload from this repository's workflow, in the protected
pypienvironment, without a token. Nobody handles a PyPI token. A maintainer approves thepypienvironment's deployment in the workflow run. - Check the published package:
uvx --refresh robotframework-plugins@<version> version
A release candidate (2026.11.0rc1) goes through the same steps; it publishes to TestPyPI first, to check the flow.
Each installer release bundles the active and deprecated plugins at their current versions. build-catalog.py writes that table into the README and docs/catalog.md, and robotframework-plugins catalog --json and robotframework-plugins version print it:
$ robotframework-plugins version
robotframework-plugins 2026.11.0
bundled plugins: rf-agentskills 4.0.0, rf-api 1.0.0, rf-core 1.0.0, rf-desktop 1.0.0, rf-mobile 1.0.0, rf-web 1.0.0So a user who reports a problem with "the installer from December" can be told exactly which plugin versions they have.
- A plugin release lists its changes from the plugin's changelog.
- An installer release starts with the version table, then lists the installer changes, and names every plugin that was added, deprecated, demoted or removed since the previous installer release (GOVERNANCE.md).