The require_zigbuild() check was using `cargo zigbuild --version` which
fails because cargo-zigbuild's subcommand doesn't support --version.
Changed to use `cargo-zigbuild --version` which works correctly.
Also reverted integration test changes to keep original behavior.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
Integration tests now skip instead of panicking when Docker or
cargo-zigbuild aren't available. Also removed redundant make test-e2e
step from CI since make test already includes e2e tests.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
- Make zigbuild a hard requirement instead of optional with fallback
- Remove configure_cross_linker and all system linker detection logic
- Remove apt-get install of system cross-linkers from CI
- Remove unused `which` dependency
- Fail fast with clear install instructions if zigbuild is missing
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
The snap install was unreliable and the apt fallback used a
non-existent package name. pip install ziglang is the recommended
way to install zig in CI environments.
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
- Integrate cargo-zigbuild as the default build backend, falling back
to cargo build with best-effort linker detection if not installed
- Auto-install rustup targets when missing (rustup target add)
- Use persistent target/krust/ directory instead of temp dirs so
incremental compilation works across runs
- Remove .cargo/config.toml from repo (add to .gitignore) since
zigbuild handles cross-linker configuration
- Improve error messages: suggest cargo-zigbuild when linker not found
- Simplify CI to use zigbuild instead of per-target system linkers
- Simplify Makefile by removing setup-cross-compile/verify targets
- Update README and CLAUDE.md to reflect new approach
https://claude.ai/code/session_01EcsZDNeWn56wFqryb4Wq7r
cargo-mutants revealed that get_binary_name's --bin/--example argument
parsing and get_binary_subdir had zero test coverage. These new tests
reduce missed mutants in the builder module from 34 to 10 (the remaining
10 are in RustBuilder::build which runs cargo and can't be unit tested).
https://claude.ai/code/session_01W3QJhFvej6fS1GevQm2vp7
- Deduplicate platform parsing: select_platform_manifest now uses
crate::image::parse_platform_string instead of reimplementing
the split/match logic inline
- Fix empty digest fallback: when docker-content-digest header is
missing, compute sha256 digest from the response body instead of
using an empty string
- Surface parse failures: get_image_platforms now returns errors
instead of silently returning Ok(vec![]) when config parsing fails
or the response is an unrecognized format
https://claude.ai/code/session_01RoAUcigxrM6Lz8DESr3SkW
- Fix digest mismatch: select_platform_manifest now returns the
platform-specific digest from docker-content-digest header instead
of reusing the index-level digest
- Fix empty platform list: get_image_platforms fetches config blob for
single-platform images to determine actual os/architecture
- Fix missing Accept header: add Docker manifest list media type
(application/vnd.docker.distribution.manifest.list.v2+json) to
Accept headers for broader registry compatibility
https://claude.ai/code/session_01RoAUcigxrM6Lz8DESr3SkW
Bug fixes:
- Fix platform selection: fetch_image_data now uses the platform parameter
to select the correct manifest from an image index instead of always
picking the first entry
- Fix parse_platform to accept 3-part platforms (linux/arm/v7, linux/arm/v6)
which previously caused a hard error at image creation time
- Fix variant always being None in manifest descriptors, now properly set
for ARM platforms so registries can select the correct image
- Fix auth tests that used matches!() without assert!(), silently passing
- Fix create_test_binary using a dangling path after NamedTempFile drop
Design improvements:
- Implement real platform detection in get_image_platforms by fetching
the image index from the registry instead of returning hardcoded defaults
- Deduplicate Platform type (was defined identically in manifest and registry)
- Extract shared build-and-push logic into build_and_push_platform() and
push_tagged_manifest_list(), eliminating ~100 lines of duplication
between Build and Resolve commands
- Use consistent OCI media types throughout instead of mixing Docker v2
and OCI formats
- Rename config::RegistryAuth to config::RegistryCredential to avoid
naming collision with registry::RegistryAuth
- Simplify push_manifest return type from (location, digest) to just digest
- Remove dead Push command that only printed an error
- Remove unused auth_cache field from RegistryClient
Robustness:
- URL-encode query parameters in token requests using reqwest::Url
- Add connect (30s) and request (300s) timeouts to HTTP client
https://claude.ai/code/session_01RoAUcigxrM6Lz8DESr3SkW