Issue #551: Releases from 0.1: crates.io under the nikaia_ prefix, then GitHub releases with the binary and one container image (ADR-336 D2, D3)

Open and answer this issue on GitHub.

tools, ready · opened 2026-10-08 · updated 2026-10-08 · 0 comments

ADR-336 decides which channels exist and when:

This issue carries D2 and D3.

Crate names: the nikaia_ prefix, with no exception (decided)

ADR-286 D23 already makes a published Nikaia package x the crate nikaia_x. The tools add the prefix and remove it again (D24’s rename), so it is never written in a .nika file. The owner’s decision (2026-10-08) is that this holds for everything the project publishes, the same as for a user’s package:

crates.io does not tell - from _ (checked: serde-json resolves to serde_json). The compiler crate nikaia is not under the prefix. Two consequences:

Where the sysroot is when it is not a checkout (to be tried, not asked)

Today the compiler finds std in NIKAIA_SYSROOT, or else in the source tree it was built from (Part III 13.2b; crates/nikaia/src/sysroot.rs). The path is compiled into the binary. With cargo install --git (#541) that tree is Cargo’s checkout. Checked on 2026-10-08: install, then a hello world, both work.

Neither D2 nor D3 has such a tree:

The candidates are:

Each is tried against what cargo publish --dry-run packages and an unpacked archive actually leave on disk, and Part III 13.2b’s rule is written from what works.

To build

  1. Names: the publish step renames every crate of the workspace to nikaia_<name> (except the compiler crate nikaia), and the path dependencies between them follow. Test: cargo publish --dry-run for each crate passes and shows the prefixed name.
  2. winnow-grammar on crates.io, under the same rule: it is a git dependency today, which crates.io refuses. The workspace depends on the published version.
  3. The sysroot, tried: each candidate above against a dry-run package installed with cargo install --path from the packaged sources, and against an unpacked archive. Write 13.2b’s rule from the one that works in both (a specification change, so the version moves). Test: a hello world builds from each layout with NIKAIA_SYSROOT unset.
  4. From 0.1: publish, and Getting started gets cargo install nikaia as its first line.
  5. From 0.2: a workflow on the version tag builds the release binary per target (x86_64-linux, aarch64-linux), the archive with bin/nikaia and the sysroot, and its SHA-256, and attaches them to a GitHub release.
  6. From 0.2: one container image with nikaia, the Rust toolchain from rust-toolchain.toml and std compiled into the cache, pushed to GitHub’s container registry and then to Docker Hub. Test: docker run --rm -v $PWD:/work -w /work <image> nikaia run hello.nika prints the greeting and compiles only the program.

Back to Open Issues