Repository-wide coding conventions live in docs/CODING_GUIDE.md.
Follow them for extension-api/, runtime-api/, and golemcore/* modules unless a module documents stricter rules.
- Each plugin is versioned independently with SemVer.
- The source of truth for the current plugin version is the child module
pom.xml. plugin.yamlandregistry/metadata must match the module version.- Shared repository APIs use the repository-level
plugin.api.version. They do not automatically follow individual plugin release bumps. - Released plugin versions are immutable. Never replace the jar, checksum, or metadata of an already released
registry/<owner>/<plugin>/versions/<released>.yaml. - Code changes to a released plugin must ship as a new SemVer version. Do not rewrite the checksum of an existing released version in a PR.
- The checksum recorded in
registry/<owner>/<plugin>/versions/<new-version>.yamlis derived from the artifact built by the release workflow from the repository state on the default branch. - Parent
pom.xmlis repository-level and is not used for plugin release numbering. extension-api/producesme.golemcore.plugins:golemcore-plugin-extension-api, the extension contract shared by all plugins in this repository.runtime-api/producesme.golemcore.plugins:golemcore-plugin-runtime-api, the isolated engine-provided runtime interface layer consumed by plugins.extension-api/must contain only extension-facing contracts: SPI, extension ports, and shared event/DTO types that are part of the plugin execution contract.runtime-api/must contain only runtime-facing interfaces and DTOs. Engine implementation classes and plugin-internal helpers must never live there.- Plugin-internal helpers, validators, runtime behavior, and test support must stay inside the owning plugin module.
- Java formatting is mandatory for
extension-api/,runtime-api/, andgolemcore/*plugin modules. External contributor modules are not forced to use the formatter by default.
Release tag format:
<owner>-<plugin>-v<version>
Examples:
golemcore-telegram-v1.2.0golemcore-whisper-v2.0.1
Use conventional commit titles for every PR and for commits that land on the default branch.
Supported types:
featfixperfrefactorbuildcidocstestchorerevertrelease
Release bump rules:
feat->minorfix,perf,refactor,build,revert->patch!orBREAKING CHANGE:->majorci,docs,test,chore,releasedo not trigger an automatic plugin version bump
Examples:
feat(golemcore/telegram): add callback retry backofffix(golemcore/whisper): reject empty STT responsesbuild(repo): align plugin packaging with shaded jars
Breaking changes must use ! or a BREAKING CHANGE: footer.
Examples:
feat(golemcore/telegram)!: replace invite payload formatrefactor(golemcore/elevenlabs): rename provider idsBREAKING CHANGE: old provider aliases were removed
- Prefer squash merge.
- The PR title must already be a valid conventional commit because the squash commit becomes the release signal on
main.
The repository pipelines are:
Semantic PR Title- enforces a conventional PR title for squash merges
Conventional Commits- validates commit subjects in PRs and on
main
- validates commit subjects in PRs and on
CI- validates repository structure and builds
extension-api/,runtime-api/, and all plugins
- validates repository structure and builds
CI / release_main- after a merge to the default branch, determines which plugins require a release, bumps versions, and publishes release artifacts
Release Plugin- manually backfills or forces one plugin release from the default branch
The CI pipeline validates:
- repository structure and registry consistency
golemcore-plugin-extension-apicompile-time contract availabilitygolemcore-plugin-runtime-apiruntime boundary availability- mandatory formatter wiring for
extension-api/,runtime-api/, andgolemcore/* - plugin manifest and module version alignment
- Maven build/tests plus mandatory PMD and SpotBugs checks (
-P strict verify) - plugin package and shaded artifact generation
The normal PR/build pipeline does not compare locally built jars against checksums of already released versions in registry/. That checksum is release metadata, not a PR maintenance task.
CI builds golemcore-plugin-extension-api inside the same reactor, so the plugins repository no longer needs to check out or install golemcore-bot during verification.
Normal plugin releases are produced automatically after a merge to the default branch. The CI / release_main job:
- determines which plugins need a release from the merged commit range
- derives the SemVer bump from conventional commits since the last plugin tag
- bumps the plugin version
- packages the plugin from the repository state on the default branch
- writes fresh
registry/metadata, including checksum and published timestamp, from that built artifact - publishes the jar to GitHub Packages
- commits release metadata, tags the release, and publishes the jar plus checksum file to GitHub Releases
The manual GitHub Actions workflow Release Plugin exists for backfills or exceptional releases from the default branch. It follows the same packaging and checksum rules as the automatic release flow.
For local marketplace development after rebuilding plugin jars without a version bump, refresh registry metadata with:
python3 scripts/plugins_repo.py sync-local-registry
Then verify the result with:
python3 scripts/plugins_repo.py validate --check-local-artifacts
This local registry sync is only for local development or unreleased artifacts. Do not use it to rewrite the checksum of an already released version in a PR.
For normal releases use bump=auto. It derives major / minor / patch from conventional commits since the last plugin tag.
Use version_override only for backfills or exceptional releases.