Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 8 additions & 3 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ name: Release
# Release pipeline. See docs/release-runbook.md.
#
# Triggers:
# - Tag push (vX.Y.Z) — automatic publish.
# - workflow_dispatch — manual fallback / dry-run support.
# - Tag push (vX.Y.Z, stable only) — automatic publish.
# - workflow_dispatch — manual fallback, dry-runs, and pre-release tags
# (vX.Y.Z-rcN). Pre-release tags deliberately do NOT auto-publish; see
# docs/release-runbook.md §Release candidates.
#
# Pre-flight (done before tagging):
# - main is green
Expand All @@ -14,11 +16,14 @@ name: Release
on:
push:
tags:
# Stable tags only. A vX.Y.Z-rcN tag does NOT match and will not publish —
# publish rcs via workflow_dispatch instead (v0.1.0-rc1 once silently
# did nothing because of this pattern; the exclusion is now intentional).
- 'v[0-9]+.[0-9]+.[0-9]+'
workflow_dispatch:
inputs:
version:
description: 'Release version (e.g. 0.1.0). Must match a pushed tag vX.Y.Z.'
description: 'Release version (e.g. 0.1.0 or 0.1.0-rc2). Must match a pushed tag vX.Y.Z or vX.Y.Z-rcN.'
required: true
type: string
dry_run:
Expand Down
23 changes: 19 additions & 4 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,24 @@ Versions follow [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [Unreleased]

### Added

### Changed

### Removed

### Fixed

## [0.1.0] — 2026-07-16

First published release (Maven Central). Everything under [0.1.0-rc1] below is included; the
sections here cover the rc cycle — changes between `v0.1.0-rc1` and `v0.1.0`.

### Breaking

Pre-1.0 policy: breaking changes ship in a MINOR bump (0.2.0). Nothing below has ever been
published to Maven Central (0.1.0 was tagged `rc1` only), so these break no external consumer.
Breaking relative to the unpublished `v0.1.0-rc1` tag only. Pre-1.0 policy would put breaking
changes in a MINOR bump (see `docs/versioning.md`), but nothing has ever been published to
Maven Central, so these break no external consumer and ship in 0.1.0.

- **`RadioClient.close()` / `AutoCloseable` removed** — the blocking bridge
(`runBlocking { disconnect() }`) was an ANR/deadlock trap on Android and iOS main threads.
Expand Down Expand Up @@ -94,9 +108,10 @@ published to Maven Central (0.1.0 was tagged `rc1` only), so these break no exte
- **docs(SPEC.md):** Bumped spec from v2.1 to v2.2 — full post-audit sync aligning spec with shipped implementation. Key areas synchronized: AdminApi expansion (~15 → ~45 methods), `StoreForwardApi`, presence tracking (`WentOffline`/`CameOnline`), `AutoReconnectConfig`, `CongestionWarning`/`ExternalConfigChange`/`StorageDegraded` MeshEvent variants, send DSL, `connectAndAwaitReady()`, `SessionPasskey`, `ConfigBundle.deviceUIConfig`, `SendFailure.IdCollision`/`AckTimeout`/`HandshakeFailed`, `AdminResult` extensions, `ConnectionState` extensions, `MeshtasticException` context fields, convention plugin + version catalog correction (JVM 17→21, Android SDK→36, Kotlin 2.3.20).
- **docs:** Synchronized `api-reference.md`, `error-taxonomy.md`, `roadmap.md`, `module-graph.md`, `README.md`, `CONTRIBUTING.md` with spec v2.2 changes.

## [0.1.0] — 2026-05-01
## [0.1.0-rc1] — 2026-05-01

Initial release of the Meshtastic Kotlin Multiplatform SDK.
Initial release candidate of the Meshtastic Kotlin Multiplatform SDK (internal team-share;
never published to Maven Central).

### Highlights

Expand Down
43 changes: 30 additions & 13 deletions docs/release-runbook.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,11 @@ git commit -s -m "docs(changelog): prepare vX.Y.Z release notes"

## Tag and push

axion-release derives the version from the most recent annotated tag:
axion-release derives the version from the most recent annotated tag. Tags
are signed (the Release workflow header documents the same convention):

```bash
git tag -a vX.Y.Z -m "vX.Y.Z"
git tag -s vX.Y.Z -m "vX.Y.Z"
git push origin main --tags
```

Expand All @@ -95,21 +96,37 @@ suffix) on the tagged commit.

## Publish

Stable releases publish via the manual `release` workflow in
[`.github/workflows/`](../.github/workflows/) — trigger it via
`gh workflow run release.yml -f version=X.Y.Z` or the GitHub Actions UI.
Pushing a stable `vX.Y.Z` tag triggers the `release` workflow in
[`.github/workflows/release.yml`](../.github/workflows/release.yml)
automatically. `workflow_dispatch` remains as a manual fallback and
dry-run path — `gh workflow run release.yml -f version=X.Y.Z
[-f dry_run=true]` or the GitHub Actions UI.

> **Currently disabled.** All workflows are suffixed `.yml.disabled` for
> the internal 0.1.0 team-share; until they're re-enabled, run the
> publish steps locally (`./gradlew publish`) per the workflow's
> intended sequence below.
### Release candidates

The tag-push trigger matches **stable tags only** — pushing a `vX.Y.Z-rcN`
tag does not start the workflow. This is deliberate: Maven Central is
immutable, so pre-release publishes should be an explicit act, not a tag
side-effect. (`v0.1.0-rc1` was pushed expecting auto-publish and silently
did nothing; the exclusion is now documented rather than accidental.)

To publish an rc, push the tag and dispatch the workflow with the rc
version:

```bash
gh workflow run release.yml -f version=X.Y.Z-rcN
```

The workflow's "Verify version matches tag" step confirms axion resolves
the rc tag to `X.Y.Z-rcN`; if it does not, the run fails before anything
is published.

The workflow:

1. Re-runs `./gradlew check`.
2. Runs `./gradlew publishAggregationToCentralPortal` (per
[`docs/ci-cd.md`](ci-cd.md)).
3. Promotes the staged release on Sonatype Central Portal.
1. Builds all artifacts (`./gradlew assemble`) and re-runs `./gradlew check`.
2. Runs `./gradlew publishAndReleaseToMavenCentral` (per
[`docs/ci-cd.md`](ci-cd.md)), which publishes and promotes the release
on Sonatype Central Portal.

Snapshot releases publish automatically on every push to `main` — no
manual step needed.
Expand Down