This repository uses GitHub Actions workflows to release each implementation.
Releases are triggered manually via workflow_dispatch.
| File | Purpose |
|---|---|
release-python.yml |
Release Python packages (LangChain backend, core libraries) to PyPI + Docker |
release-ballerina.yml |
Release Ballerina interpreter to Docker |
release-docker.yml |
Shared: build, push, and scan Docker images |
release-finalize.yml |
Shared: create tag, release branch, and GitHub Release |
The Python interpreter workspace contains independently versioned packages
released via release-python.yml:
| Package | What it releases | Docker image |
|---|---|---|
afm-core |
afm-core + afm-cli to PyPI |
— |
afm-langchain |
afm-langchain to PyPI |
ghcr.io/wso2/afm-langchain-interpreter |
| Input | Type | Required | Default | Description |
|---|---|---|---|---|
package |
choice | yes | — | afm-core or afm-langchain |
branch |
string | no | main |
Branch to release from |
Trigger: Run release-python.yml → select package and branch.
What happens:
- Reads version from
python-interpreter/packages/<package>/pyproject.toml - Validates tag and release branch don't already exist
- Runs tests (
pytest packages/afm-core/tests/ packages/afm-langchain/tests/) - Builds and publishes to PyPI:
afm-core→ publishesafm-corethenafm-cliafm-langchain→ publishesafm-langchain
- If
afm-langchain: builds and pushes Docker image toghcr.io/wso2/afm-langchain-interpreter:v<version> - Creates tag
<package>-v<version>(e.g.,afm-core-v0.1.0) - Creates release branch and GitHub Release
- Bumps package version to next patch:
afm-core→ bumps bothafm-coreandafm-cliafm-langchain→ bumps onlyafm-langchain
Note: The
:latestDocker tag is only updated when releasing frommainordev.
Released via release-ballerina.yml.
- Docker:
ghcr.io/wso2/afm-ballerina-interpreter
| Input | Type | Required | Default | Description |
|---|---|---|---|---|
branch |
string | no | main |
Branch to release from |
Example: releasing 0.1.0 from main.
Before: Ballerina.toml version = 0.1.0
Trigger: Run release-ballerina.yml → select branch.
What happens:
- Reads version from
Ballerina.toml - Validates tag and release branch don't already exist
- Runs
bal buildandbal test - Builds and pushes Docker image to
ghcr.io/wso2/afm-ballerina-interpreter:v0.1.0and:latest - Creates tag
ballerina-interpreter-v0.1.0 - Creates release branch and GitHub Release
- Bumps
Ballerina.tomlversion to0.1.1
Note: The
:latestDocker tag is only updated when releasing frommainordev.
After:
mainbranch:Ballerina.tomlversion =0.1.1- Branch:
release-ballerina-interpreter-0.1.0 - Tag:
ballerina-interpreter-v0.1.0 - Docker:
ghcr.io/wso2/afm-ballerina-interpreter:v0.1.0
Scenario: main is at 0.2.1, need to patch 0.1.x.
Manual prep:
git checkout -b ballerina-interpreter-v0.1.x ballerina-interpreter-v0.1.0
# Ballerina.toml version = 0.1.0 (from tag)
# Edit Ballerina.toml version to 0.1.1
sed -i 's/^version = ".*"/version = "0.1.1"/' ballerina-interpreter/Ballerina.toml
git add .
git commit -m "Bump version"
git push origin ballerina-interpreter-v0.1.xTrigger: Run release-ballerina.yml workflow with:
- branch:
ballerina-interpreter-v0.1.x
What happens:
- Creates branch
release-ballerina-interpreter-0.1.1 - Builds, tags
ballerina-interpreter-v0.1.1 - On
ballerina-interpreter-v0.1.x: bumps to0.1.2
| Action | Workflow | Publishes to | Docker image | Bumps version |
|---|---|---|---|---|
Release afm-core |
release-python.yml |
PyPI (afm-core + afm-cli) |
— | Yes |
Release afm-langchain |
release-python.yml |
PyPI (afm-langchain) |
afm-langchain-interpreter |
Yes |
| Release Ballerina | release-ballerina.yml |
— | afm-ballerina-interpreter |
Yes |
| Patch release | Same as above (from patch branch) | Same as above | Same as above | Yes |