Release Process
Ark uses dist for release automation. Tagging triggers builds for every supported target, GitHub Releases publication, and npm package publishing. The book deploys to GitHub Pages on the same tag.
Configuration
Cargo.toml's [workspace.metadata.dist]:
[workspace.metadata.dist]
cargo-dist-version = "0.30.3"
ci = "github"
allow-dirty = ["ci"]
installers = ["shell", "powershell", "npm"]
npm-package = "ark"
npm-scope = "@anekoique"
pr-run-mode = "skip"
publish-jobs = ["npm"]
targets = [
"aarch64-apple-darwin",
"aarch64-unknown-linux-gnu",
"x86_64-apple-darwin",
"x86_64-unknown-linux-gnu",
"x86_64-pc-windows-msvc",
]
install-path = "CARGO_HOME"
install-updater = false
The dist-generated workflow is at .github/workflows/release.yml — don't hand-edit unless you know what you're doing (the workflow is regenerated by dist generate).
Cutting a release
- Bump version. Edit
[workspace.package].versioninCargo.toml. Both crates inherit from the workspace; you bump once. - Update lockfile.
cargo build --workspace(or any cargo command that touches the lockfile). - Commit.
git commit -am "chore: bump to vX.Y.Z". - Tag.
git tag vX.Y.Z. The leadingvmatters — the book deploy workflow triggers onv*. - Push.
git push && git push --tags.
The push of the tag triggers two GitHub Actions workflows:
release.yml(dist) — builds binaries for every target, publishes a GitHub Release with all artifacts attached, publishes the npm package.book.yml— buildsdocs/book/with mdBook, deploys to GitHub Pages.
Verifying
After CI completes:
- The Releases page should list the new tag with shell/powershell/npm installers.
npm view @anekoique/ark versionshould return the new version.https://anekoique.github.io/ark/should show the new book.npm install -g @anekoique/ark@<version>thenark --versionshould return the new version.
Versioning policy
Ark follows semver. The visible CLI surface — ark init, ark load, ark unload, ark remove, ark upgrade, ark context — is covered. ark agent is not.
What counts as a breaking change for the visible surface:
- Removing or renaming a flag.
- Changing JSON output schema in a non-additive way (rename, type change). Adding fields is fine.
- Changing the on-disk format of
.ark/.installed.jsonor.ark.dbin a way that older versions can't read. - Changing the file layout of
.ark/,.claude/commands/ark/,.codex/skills/, or.opencode/commands/ark/.
What's not breaking:
- Adding a new top-level command.
- Adding a new flag.
- Changing slash-command body content (templates).
- Changing the internal
ark agentnamespace at all. - Adding a new platform.
When in doubt, bump major. The cost of an over-eager major bump is small; the cost of breaking users on a minor is large.
Pre-release checklist
Before tagging:
cargo build --workspace
cargo test --workspace
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
mdbook build docs/book # confirm book builds clean
Plus the smoke test:
cargo build --release
TMP=$(mktemp -d)
./target/release/ark load --dir "$TMP"
./target/release/ark unload --dir "$TMP"
./target/release/ark load --dir "$TMP"
./target/release/ark remove --dir "$TMP"
rm -rf "$TMP"
After release
- If you bumped the embedded template version (template files added/removed), tell users to run
ark upgradein their projects. The CLAUDE.md / AGENTS.md managed blocks and the SessionStart hooks are re-applied unconditionally, but template files honor the user-modification protocol — seeark upgradefor the conflict-resolution policy. - Watch the Issues page for the first 24 hours. Common reports after a release: install path issues, hook contract changes (Claude / Codex / OpenCode upstream changes),
npm installissues on M1.
One-time GitHub Pages setup
The book.yml workflow uses actions/deploy-pages@v4, which requires Pages to be enabled in repo settings:
- Go to
Settings→Pages. - Set
SourcetoGitHub Actions(notDeploy from a branch). - Save.
This is a one-time manual step. Once enabled, every tag push deploys the book automatically.