What’s New in v0.4.0
ORAS .NET CLI v0.4.0 marks a major milestone in the project’s journey — all 21 commands are now fully implemented with real OCI registry operations. Previously, only 3 commands (login, logout, version) had working implementations. This release transforms the CLI from a prototype into a production-ready tool with complete parity to the Go ORAS CLI.
🎯 Full Command Implementation
All 18 previously-stub commands now have real implementations calling the official OrasProject.Oras v0.5.0 library:
Artifact Operations
push— Push files to a registry as an OCI artifact usingPacker.PackManifestAsyncandCopyAsyncpull— Pull artifact files from a registry (fetches manifest, downloads layers to disk)attach— Attach files to an existing artifact as a referrer (signatures, SBOMs, attestations)copy— Copy an artifact between registries usingCopyAsyncwith progress trackingdiscover— Discover referrers of a manifest (find attached signatures, SBOMs, etc.)resolve— Resolve a tag to a digest (get the immutable SHA256 reference)tag— Tag a manifest in the registry (add additional tags to existing artifacts)
Manifest Operations
manifest fetch— Fetch manifest content from a registry (supports all OCI media types)manifest push— Push manifest content to a registry from a file or stdinmanifest delete— Delete a manifest from a registry by digestmanifest fetch-config— Fetch the config blob of a manifest
Blob Operations
blob fetch— Fetch raw blob content from a registry by digestblob push— Push blob content to a registry from a file or stdinblob delete— Delete a blob from a registry by digest
Repository Operations
repo ls— List repositories in a registry (catalog API)repo tags— List all tags for a repository
Backup & Restore
backup— Backup artifacts to local OCI layout directoryrestore— Restore artifacts from local OCI layout to a registry
🔐 3-Tier Authentication Waterfall
Introduced a robust RegistryService with intelligent credential resolution:
- Explicit credentials — Use credentials provided via
--username/--passwordflags - Stored credentials — Fall back to credentials from Docker config (
~/.docker/config.json) viaDockerConfigStore - Anonymous access — Fall back to unauthenticated requests for public registries
This waterfall ensures maximum compatibility: explicitly passed credentials take priority, stored credentials are used when available, and public registries work seamlessly without authentication.
📊 Rich Output Models
Added 7 new AOT-compatible output models for structured JSON output:
PushResult— Digest, size, media type for pushed artifactsPullResult— Digest, files downloaded, total sizeAttachResult— Digest of the attached referrer artifactTagResult— Target digest and new tag nameListResult— Repository lists, tag lists with pagination supportDiscoverResult— Referrer manifests with artifact typesDeleteResult— Confirmation of deleted manifest/blob digest
All models use source-generated JSON serialization (JsonSerializerContext) for Native AOT compatibility and fast cold-start performance.
🧩 New Dependencies
Microsoft.Extensions.Caching.Memoryv9.0.0 — Added for OCI registry authentication token caching, reducing redundant auth roundtrips during multi-operation workflows.
📈 Impact
Before v0.4.0:
- ✅ 3 working commands:
login,logout,version - ⚠️ 18 stub commands with no real functionality
After v0.4.0:
- ✅ All 21 commands fully functional with real OCI registry operations
- ✅ Complete Go ORAS CLI parity
- ✅ Production-ready for artifact management workflows
Files Changed: 32 files modified, +2674 lines added, -1800 lines removed
Full Changelog
Upgrading
This is a non-breaking upgrade from v0.3.0. Replace the existing binary with the new v0.4.0 build—no configuration changes are required. All previously working commands (login, logout, version, TUI mode) remain fully compatible.
What’s New:
- All 18 artifact/manifest/blob/repo commands now work with real registries
- Use
--output-format jsonon any command for structured output - Docker credential integration works automatically (no setup needed)