Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]
Added
- Multi-layer package push and pull.
ocx package pushnow accepts multiple layer arguments, each either a file path or asha256:<hex>.tar.gzdigest reference. (package) - Layered configuration from
/etc/ocx/config.toml,~/.config/ocx/config.toml,$OCX_HOME/config.tomlwith--config/OCX_CONFIGoverrides andOCX_NO_CONFIGkill-switch. (config) - Typed
ExitCodetaxonomy aligned with BSD sysexits (64/65/69/74/75/77/78/79/80/81). Scripts can nowcase $?reliably. (cli) entrypointsfield in package metadata. Publishers declare named launchers (e.g.cmake,ctest);ocx installgenerates per-platform launchers under<package>/entrypoints/<name>(POSIX) and<package>/entrypoints/<name>.cmd(Windows) that delegate toocx execagainst a bakedfile://<package-root>URI. (package)${deps.NAME.installPath}template interpolation in env-var values. Entrypointtargetstrings and env modifier values can now reference dependency install paths. Unrecognized${...}tokens are rejected at publish time. (package)namefield onDependency. Lets a package import a dependency under a different name, disambiguating basename collisions when two deps would otherwise resolve to the same launcher slot. (package)ocx execaccepts afile://<absolute-package-root>URI. Generated entrypoint launchers bake this URI into a singleocx exec 'file://<root>' -- "$(basename $0)"form so they survive a re-selectto a different version (the symlink target moves; the URI does not). (cli)- Flat install layout:
currentandcandidates/{tag}target the package root, so generated launchers are reachable throughcurrent/entrypoints/. The previousentrypoints-currentsymlink is gone; selection state lives on a single per-repocurrentanchor. (file-structure) ValidMetadatatypestate on package metadata. Publish-time validation rejects bundles with malformed entry points, undeclared dep references, or duplicate launcher names; downstream code consumes only validated metadata. (package)EntrypointNameCollisionstructured error atinstall --select/selectand at consumption time (ocx env,ocx exec) when two packages in the same visible closure declare the same entrypointname. Surfaces with exit code 65 (DataError); recovery: deselect one package before selecting the other. (package-manager)- Synthetic
PATH ⊳ <pkg-root>/entrypointsentry emitted per visible package with a non-emptyentrypointsarray, so generated launchers are reachable throughocx env/ocx exec/ocx shell envwithout manual PATH wiring. (env) - Windows-only synthetic
PATHEXT ⊳ .CMDprepend onocx envand auto-injected byocx execso generated.cmdlaunchers are discoverable when the host shell'sPATHEXTdoes not already include.CMD. Consumer-boundary commands (install,select,shell env,ci export,shell profile load) emit a stderr warning whenPATHEXTis missing.CMD. (cli)
Changed
- Breaking:
--remote/OCX_REMOTEsemantics narrowed — tag and catalog lookups now bypass the local tag store and query the registry directly, but digest-addressed blob reads still use the local cache with write-through to$OCX_HOME/blobs/. Previously,--remoterouted all operations to the registry. Only$OCX_HOME/tags/is no longer updated under--remote. (oci) - Breaking:
ocx index updateno longer pre-fetches manifest or layer blobs. It writes only tag→digest pointers to$OCX_HOME/tags/. Runocx install <pkg>online first to populate the blob cache before using--offline. (index) - Breaking:
ocx env --format jsonandocx ci export --format jsonnow emit{"entries": [{"key": ..., "value": ..., "type": ...}, ...]}(canonical envelope) instead of a bare top-level array. Update consumers that deserialize JSON output to read theentriesfield. The shape is shared across env-related JSON outputs for forward compatibility. (cli) - Error messages normalized across 11 modules per Rust API Guidelines
C-GOOD-ERR(lowercase, no trailing punctuation). (error)
Breaking
- Breaking: Package metadata field renamed from
entry_pointstoentrypoints. Publishers must updatemetadata.jsonfiles; bundles using the old field name fail validation atpackage create. (package) - Breaking: Dependency JSON field key renamed from
aliastoname. Existing bundles must be re-published with"name"in place of"alias". The${deps.NAME.installPath}template token is unchanged —NAMEwas always the placeholder keyword, never the literal field name. (package) - Breaking:
ocx-mirrorexit codes changed from0/2/3/4to0/65/79/1/69to align with the sysexits-based taxonomy. Wrapper scripts matching historic codes must be updated. (mirror)
Fixed
ocx --offline install <pkg>after a bareocx index update <pkg>now fails with a clearOfflineManifestMissingerror naming the missing digest instead of a silent failure. Recovery: runocx install <pkg>online to populate the blob cache. (oci)
Security
- Pulled layer blobs are verified against the claimed digest before extraction; mismatched blobs are deleted and fail the pull with a clear error. (oci)
- Hardened the Windows
.cmdlauncher template by addingDisableDelayedExpansionto theSETLOCALdirective to mitigate registry-level!-expansion vectors when forwarding untrusted argv (BatBadButinterim mitigation). The%*parameter remains unescaped at the.cmdlevel — see.claude/artifacts/adr_windows_cmd_argv_injection.mdfor the threat model and tracked compiled-shim follow-up. (package)
Breaking (v2 schema and exec-mode defaults)
- Breaking:
Var.visibilityfield added to package metadataenventries. Default is"private"— env entries declared without an explicitvisibilityfield are now treated as private (self-mode only) in consumer-mode execution. Publishers must add"visibility": "public"to any env entry meant to be visible to direct consumers (ocx exec PKG -- cmd,ocx env PKG). (package) - Breaking:
ExecMode::Consumeris now the default forocx exec,ocx env,ocx shell env,ocx shell profile load,ocx ci export, andocx deps. The previous behavior was a union of all non-sealed visibility levels (equivalent to--mode=full). Packages that relied on private dep env being visible at direct exec must either declare those binaries as entry points (which routes through--mode=selfautomatically) or elevate the relevant dep tovisibility: "public". (cli)
0.2.1 - 2026-03-24
Added
- Colorize JSON output and deduplicate table rendering (cli)
- Enable parallel XZ compression by default (compression)
- Auto-detect progress indicators based on stderr TTY (cli)
- Add progress bar to package create (bundle)
- Add transfer progress bars to push and pull operations (oci)
- Replace upstream Platform with owned OperatingSystem and Architecture enums (oci)
- Add package variant support
Changed
- Rename Reportable to Printable and move JSON printing to Printer (cli)
- Increase default push chunk size to 16 MiB (oci)
- Migrate to thiserror with typed subsystem errors (error)
Fixed
- Use glibc bun builds and update musl guidance (mirror)
- Skip missing logo gracefully in package info (cli)
- Stub of java -version (docs)
- Ensure authentication before all transport operations (oci)
- Split repository path segments for correct Windows paths (fs)
- Clean up partial output file on failed package create (bundle)
- Resolve context menu shadow and sidebar shift on catalog detail page
0.2.0 - 2026-03-16
Added
- Separate strip_components for rebundling and support multiple --version flags (mirror)
- Add package pull, ci export command, and setup-ocx GitHub Action (ci)
- Add package describe and package info commands
- Add package catalog with build-time data generation (website)
- Add bun and git-cliff mirrors, restructure mirror layout (mirror)
- Add shell profile management commands (shell)
- Replace hello-world with realistic packages in recordings and docs (docs)
- Add per-platform strip_components config (mirror)
- Add shellcheck and uv mirrors (mirror)
- Add generator-based url_index sources (mirror)
- Support tag-scoped index update (index)
- Add cache, github, and text utility modules (mirror-sdk)
- Add spec extends, --latest flag, and backfill order (mirror)
- Add corretto mirror configuration (mirror)
- Add --color flag with NO_COLOR/CLICOLOR support (cli)
- Add asset_type config with binary support and shfmt mirror (mirror)
- Align recordings with real-world packages (recordings)
Changed
- Rename OCX_DISABLE_CODESIGN to OCX_NO_CODESIGN
- Rework table printer styling and clean up idioms (cli)
Fixed
- Install scripts use --remote for bootstrap and improve UX
- Add SBOM generation to website deploy pipeline (ci)
- Add catalog generation to deploy website workflow (ci)
- Pipe PowerShell Invoke-Expression through Out-String (install)
- Filter internal tags at IndexImpl level (index)
- Correct RUST_LOG empty-string check (log)
- Resolve shellcheck warnings in shell scripts (lint)
- Buffer env var writes in ci export to fix path accumulation (ci)
- Handle ANSI escape sequences in table realignment (recordings)
- Use musl target for Linux in setup-ocx (action)
- Correct inaccuracies across docs and CLI help text (docs)
0.1.0 - 2026-03-13
Added
- Initial commit
- Support catalog for local index
- Add env command
- Support symlink paths for env and shell env
- Add select command
- Add initial reference manager
- Add deselect, uninstall, and clean commands
- Add find command
- Add Vue components for website
- Add command line docs and fix xz bundling
- Support bundling of single files
- Add warning when using tags with --current
- Add acceptance test suite and fix initial bugs
- Add terminal recordings
- Add macOS code signing
- Add website searchbar
- Add --index flag and OCX_INDEX env var
- Make cascade push platform-aware
- Use underscore as build separator
- Add JSON Schema generation for metadata.json (schema)
- Redesign info command with logo, color, and format support (cli)
- Add zip format support and symlink security hardening (archive)
- Add workspace version (0.1.0) and shared version utility
- Add git-cliff config and initial CHANGELOG.md
- Add Taskfile release commands (changelog, preview, prepare)
- Add install.sh bootstrap script for Unix/macOS
- Add install.ps1 bootstrap script for Windows
- Initialize cargo-dist for release builds
- Add update check notification on CLI startup
- Add SBOM generation and dependency explorer page
- Add ocx-mirror prototype for mirroring GitHub releases to OCI registries
Changed
- Find_or_install
- Adapt env command and extract modifier
- Consistent naming of api data
- Extract symlink handling into file_structure
- Index structure
- Migrate install and select to reference manager
- Extract CLI tasks into library
- OCI client
- Pre-fetch terminal recordings
- Standardize CLI API data types with single-table pattern
- Replace oci_spec::Reference with custom Identifier
- Move website help examples into documentation skill
Documentation
- Add initial documentation
- Symlink management
- File structure
- Versioning
- Improve content path documentation
- Add user-guide for indices
- Add getting started guide
- Add design records and pitch guide
- Add release plan
- Add changelog page to website with sidebar entry
- Add installation page, README install section, and home quick start
- Shorten website feature cards
- Rewrite README for public launch
Fixed
- Fetching of just pushed manifest
- Flaky tests relying on env variables
- Package manager task stability and error handling
- Website
- Windows symlinks with junctions
- Tree component hover behavior
- Path and exec resolution on Windows
- Formatting and linter issues
- Improve CLI output consistency across commands
- Temp dir leftovers after install
- MacOS codesigning, sign per-file, drop --deep and CS_RUNTIME flags
- User-guide typo
- Discord notification website link
- Allow all tools in Claude Code Action workflow (ci)
- Fix changelog template formatting
- Bootstrap OCX via self-install instead of manual file copy
- Correct auth env vars in publish workflow and remove double update check
- Align cargo-dist config with workflow filename and pin action versions
- Add rust-toolchain.toml to pin Rust 1.94.0 for CI builds
- Exclude LFS assets from source tarball and reduce CI targets
- Add required type and version fields to packaging metadata
- Add required field to path env var in packaging metadata
- Website deploy pipeline and install script improvements
- Correct checksum filename and parsing in install scripts
- Clippy warning, test build target, and mirror test assertions
- Restore Python language skill to correct location
- Restore crate-level allow(deprecated) for clippy -D warnings
- Build and upload ocx-mirror binary in CI acceptance tests
- Replace ring with aws-lc-rs to fix aarch64-pc-windows-msvc release build
- Add contents:read permission to verify-deep workflow (ci)
- Build ocx-mirror in verify-deep and fix discord webhook (ci)
- Remove push-to-main Discord notifications (ci)