The GitHub account is restored, so github.com/ZacharyZhang-NY/Kigi-CLI is
the canonical repo again. Reverse the 2026-08 Gitea migration:
- .github/workflows/{release,warm-cache}.yml: restore the GitHub-hosted
pipeline dropped in 3e1652c, unchanged — hosted runners, rust-cache,
softprops release with every asset attached atomically.
- .gitea/workflows/release.yml: retire the Gitea edition (the runners are
being deregistered; git.zacharyzhang.com keeps the v0.1.12/v0.1.13
releases for old clients).
- kigi-env: update_base_url now defaults to the GitHub Releases API. The
updater already speaks GitHub wire format and sends a User-Agent; v0.1.14
is published to BOTH forges with identical assets so pre-0.1.14 installs
polling Gitea self-update onto the GitHub channel.
- install.sh / install.ps1: resolve releases from api.github.com.
- feedback, /docs, SECURITY.md, frontend worker + site: repo, issues and
raw-file links point at github.com / raw.githubusercontent.com.
- docs/RELEASE.md: GitHub edition of the checklist; Gitea runner sections
retired.
- version: 0.1.13 -> 0.1.14 (the cross-forge transition release).
Claude-Session: https://claude.ai/code/session_01A6RcwHhhsFYYrNdQB4ASuP
3.7 KiB
Release checklist (PRD F8)
Kigi ships as a single-file binary for five targets, published on this
repo's GitHub Releases by .github/workflows/release.yml. Users install via
install.sh / install.ps1 and stay current through the in-app
self-updater (kigi-update), which resolves the same Releases API.
Cutting a release
-
Bump
[workspace.package] versioninCargo.toml(and refreshCargo.lockwithcargo update --workspace); land the change onmainwith green CI. -
Regenerate the third-party notices (not enforced by CI — this is the step that keeps
THIRD-PARTY-NOTICES.mdfresh):cargo install cargo-about --locked # once cargo about generate about.hbs -o THIRD-PARTY-NOTICES.mdCommit the result if it changed.
-
Tag and push:
git tag vX.Y.Z && git push origin vX.Y.ZThe tag must equal the workspace version (
vX.Y.Z↔X.Y.Z); the workflow fails fast on a mismatch. -
The
Releaseworkflow builds all five targets with the hardenedrelease-distprofile, packageskigi-<version>-<target-triple>.{tar.gz|zip}archives (binary + LICENSE + NOTICE + THIRD-PARTY-NOTICES), generatesSHA256SUMS, and publishes the GitHub Release with every asset attached in one step, soreleases/latestnever serves a release whose checksum manifest is missing. Tags containing-(e.g.v0.2.0-alpha.1) publish as pre-releases, which only thealphaupdate channel picks up. -
Smoke-test an installed artifact:
curl -fsSL https://kigicli.dev/install.sh | sh ~/.kigi/bin/kigi --version
Build runners
All five legs run on GitHub-hosted runners — nothing self-hosted to keep alive:
runs-on |
Builds |
|---|---|
macos-14 (arm64) |
aarch64-apple-darwin, x86_64-apple-darwin (cross) |
ubuntu-24.04 |
x86_64-unknown-linux-gnu |
ubuntu-24.04-arm |
aarch64-unknown-linux-gnu (native) |
windows-2022 |
x86_64-pc-windows-msvc |
warm-cache.yml rebuilds the release-dist profile on main whenever the
dependency graph changes (plus a weekly refresh), so tag builds restore a
warm default-branch cache instead of compiling the workspace cold. Its setup
steps mirror release.yml's build job — keep them in lockstep, or the cache
key stops matching.
History note: between 2026-08 and 2026-09 this pipeline ran as
.gitea/workflows/release.ymlon self-hosted runners againstgit.zacharyzhang.comwhile the GitHub account was unavailable. The Gitea instance still hosts the pre-migration releases (v0.1.12,v0.1.13); everything fromv0.1.14on is built and published here.
Invariants to keep in lockstep
- Asset naming
kigi-<version>-<target-triple>.{tar.gz|zip}and theSHA256SUMSmanifest are consumed by three clients:install.sh,install.ps1, andauto_update::release_asset_name()incrates/codegen/kigi-update. Change one, change all (the kigi-update testtest_release_asset_name_matches_release_workflow_namingpins the Rust side). - Never publish two builds of the same semver version differing only in
build metadata (
+…) — thesemvercrate orders build metadata, so auto-update would bounce users between them. - Rollbacks: deleting the bad release (or re-pointing "latest") is enough — the internal installer treats the Releases API as authoritative and downgrades clients on its own.
- No PyPI/npm packages, ever; in particular never squat the
kimi-clipackage name (PRD F8).