# Release

> Prepare a Kora release PR. Bumps Rust crate versions (kora-lib + kora-cli), optionally bumps the TypeScript SDK, generates CHANGELOG, and opens a PR against main. Use when the user says 'prepare a release', 'cut a release', or 'release version X.Y.Z'.

- Skill: `solana-foundation/release` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add solana-foundation/release`
- Raw SKILL.md: https://api.skillmd.com/api/skills/solana-foundation/release/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Coding & Dev Tools
- Author: solana-foundation (https://skillmd.com/u/solana-foundation)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/solana-foundation/release

---


# Kora Release Preparation

Bump versions, generate the CHANGELOG, open a PR against `main`. Publishing happens after merge
via CI — see the `complete-release` skill.

## Decide first

Read current versions, then ask the user which components to release and at what versions:

```bash
cargo metadata --no-deps --format-version 1 | jq -r '.packages[] | select(.name=="kora-lib") | .version'
node -p "require('./sdks/ts/package.json').version"
```

Rust and TypeScript release independently. Prereleases use semver suffixes (`2.3.0-beta.1`).

Work on a `chore/release-v${VERSION}` branch off `main` with a clean tree.

## Bump only kora-lib and kora-cli

**Do not run `cargo set-version --workspace`.** The workspace also contains `crates/kora-deploy`
(published separately, currently on its own `0.x` line) and `examples/devnet-deploy-paymaster`.
A workspace-wide bump drags both onto the Kora version and `kora-deploy` has no `publish = false`
to stop it reaching crates.io.

Four places move together, and `kora-lib` + `kora-cli` always share one version:

```bash
cargo set-version -p kora-lib -p kora-cli "${RUST_VERSION}"
```

Then edit by hand in the root `Cargo.toml`:
- `[workspace.package] version` — `tests` inherits this
- the `kora-lib = { path = "crates/lib", version = "..." }` pin in `[workspace.dependencies]`

Confirm nothing else moved before committing:

```bash
git diff --stat
grep -rn '^version' crates/*/Cargo.toml Cargo.toml
```

`crates/kora-deploy/Cargo.toml` must be untouched.

## CHANGELOG

git-cliff appends rather than regenerates, and the invocation differs depending on whether a
previous tag and CHANGELOG exist. See [references/changelog.md](references/changelog.md).

## TypeScript

```bash
npm version "${TS_VERSION}" --no-git-tag-version --prefix sdks/ts
```

## Commit and PR

Commit message: `chore: release v${RUST_VERSION}`, plus ` rust + ts-sdk v${TS_VERSION}` when both
move. PR targets `main`, reviewers `dev-jodee,amilz`. Body should list the crates and versions
being released and point at the `complete-release` skill for publishing.

## Constraints

- Release PRs always target `main`, regardless of the current branch.
- Hotfix patches publish from `hotfix/*` *before* merge-back to `main`.
- Never call `just release` or `just release-ts-sdk` — both are interactive and will hang.
- Tags (`v{VERSION}`, `kora-lib-v{VERSION}`, `kora-cli-v{VERSION}`) are created by CI after merge,
  not here.

