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.
[0.6.1] - 2026-09-08
Added
- Expose the transport and candidate APIs signing needs (oci)
- Grant a whole subtree in [shell.consent] paths with a trailing /* (shell) BREAKING
- Describe every report type with JsonSchema (api)
- Publish the --format json report contract (schema)
- Emit an exec-time resolution record (record)
- Add exit code 86 for a forge capability a transport needs (cli)
- Add the git write transport and the forge identity ladder (forge)
- Claim a namespace from the CLI with ocx package claim (package) BREAKING
- Take the package as a positional, add --transport git (announce) BREAKING
- Render a project toolchain home and put it on the session PATH (toolchain) BREAKING
- Let ocx init consent to the project it creates (cli)
- Let a machine caller run without consenting to the project it touches (cli)
- Allow "bin" as a group and tool name again (project)
- Render the tree under links/ and shells/, behind an active link (toolchain) BREAKING
- Report the toolchain launcher directory in
ocx shell state(cli)
Changed
- Expose the ocx crate as a library target (cli)
- Make C-044's per-prompt budget a hard 10 ms ceiling (shell)
- Move the announce clock into oci::index for claim (index)
Documentation
- Size the latency injection against the runner, not the dev box (shell)
- Document HTTP proxy support and the SSRF guard's behaviour behind one (website)
- Document claiming a namespace, its env vars and exit 86 (claim)
- Document toolchain activation, session PATH and the toolchain-dir key (toolchain)
- Fold claiming into the authoring announce guide (announce)
- Document the closed depth-1 tree and read
toolchain_binfor PATH (toolchain) - Name links/<group>/<entry> and active/bin in help text and schemas (toolchain)
- Name active/bin where the sentence names its global sibling (toolchain)
- Point the --pinned help at the links/<group>/<entry> tree (cli)
- Describe the rendered toolchain the same way in lock, update and remove help (cli)
Fixed
- Sweep signs once per subject digest, not once per tag (sign)
- Report a malformed paths entry even when it matches the project (shell)
- Stop an abstaining latency run from reading as PASSED (shell)
- Honour HTTP proxy settings in the SSRF guard so proxied networks can pull (oci)
- Stop at an authoritative index miss instead of falling through to the registry for manifest and blob fetches (oci)
- Exit 69, not 78 or 64, when a guarded registry or Sigstore host does not resolve (oci) BREAKING
- Rebuild a diverged announce branch on the index base instead of reading it as truth (announce)
- Name the per-package patch opt-out no_patches in JSON output (status) BREAKING
- Drop the reserved platform features property and describe AliasTag as a string (schema)
- Widen the non-fast-forward retry to commit and open (announce)
- Run an already-pulled tool offline instead of asking the index where it lives (oci)
- Name the claimed unit the package, not the namespace (claim) BREAKING
- Honour the activate mode at login, not only at the prompt (shell) BREAKING
- Let the global toolchain's ocx pin win over the installed binary (shell) BREAKING
- Resolve script reads against the bundle content, not the store dir (script) BREAKING
- Reconcile a project created where the shell already is (shell)
- Watch the project file OCX_PROJECT names, not a hardcoded ocx.toml (shell)
- Keep write-tree off the network in a blobless checkout (announce)
- Read GitLab through endpoints a CI job token may call (announce)
- Admit a publisher its index allowlists by group (announce)
- Let a CI job token past the scope lists GitLab closes to it (announce)
- Never commit an index root onto a branch head the run did not read (announce)
- Heal a link a copy replaced with a directory, or name the fix (toolchain)
- Exclude both trampoline directory spellings from command lookup (exec)
- Withhold the toolchain PATH entry when
activeis not the derived link (shell) - Retire the stale
<toolchain>/binentry from the session PATH (setup) - Tell the user how to clear a group directory a render cannot prune (toolchain)
- A group dropped from the lock now leaves the rendered tree (toolchain)
- Keep the session PATH store unchanged when
ocx self setupre-runs (setup) - A render never deletes a file ocx did not write from a group (toolchain)
- Keep a foreign file at a pruned toolchain name instead of deleting it silently (toolchain)
- Re-judge the toolchain
links/directory at the moment a link is written (toolchain) - Read a signal-killed push's verdict from the remote, not from the corpse (forge)
- Stop linting docs-quality's fixtures, which are checker inputs (tasks)
[0.6.0] - 2026-08-30
Added
- Keyless Sigstore signing and identity-pinned verification over OCI referrers (sign) BREAKING
- Distribute the Sigstore trusted root through config, the OCX home, and managed config packages (trust)
- Publish and verify DSSE in-toto attestations over OCI referrers (oci)
- Unsigned SBOM referrers with demand/permissive verification on package sbom (oci)
- Accept an include/exclude scope set in a trust policy (trust)
- Add wasm platforms (wasip1/wasm, wasip2/wasm) and enforce supported platform pairs (oci)
- Add
ocx package copyto promote a built artifact between registries (cli) - Support GitLab, self-hosted forges and nested group paths (announce)
- Declare plain HTTP per registry; refuse unsafe destinations with exit 65 (oci) BREAKING
- Reconcile the environment on every prompt, replacing direnv (shell) BREAKING
- Rename run to exec, describe/info to description push/pull (cli) BREAKING
- Sign, attest and verify packages compatibly with cosign (sign)
- Read the signing key from an environment variable with
--key env://VAR(sign) - Carry cosign .sig/.att/.sbom sidecar tags to the destination (copy)
- Exit 65 when a destination sidecar tag is refused (copy) BREAKING
Changed
- Cache and coalesce the registry authentication handshake (oci)
- Make
ocx index syncfast and survive a transient failure (index) - Make a configured index authoritative for its whole registry (oci) BREAKING
- Read a local-file reference through one shared grammar (config)
Documentation
integrationsis not devcontainer'scustomizations(package)- Add Katherine Draheim as Marketing & Community Lead (website)
- Add a self-hosted Sigstore guide covering GitHub and GitLab as OIDC issuers (signing)
- Document attesting, verifying and reading SBOMs with use-case casts (website)
- Document unsigned SBOM attach and the sbom verification modes with casts (website)
- Replace the jfrog placeholder mirror host and document the manifest gate (website)
- Correct index update/sync partial-commit granularity to per-tag (index)
- Say why the owners fixture is the wrong shape (oci/index)
Fixed
- Publish every JSON Schema, not just metadata (website)
- Record casts in the scenario dir, not the repo's test tree (test)
- Fetch Git LFS assets when building the website (ci)
- Refuse a non-manifest registry response with the response named (oci)
- Classify a wire digest mismatch as a data error (oci)
- Name the mirror a failed fetch was routed through (oci)
- Decide mirror provenance from the fetch, not the host (oci)
- Annotate auth and manifest-shape failures with mirror provenance (oci)
- Bound
ocx index catalog --tagsto a fixed number of in-flight listings (cli) - Wait out a contended ocx.toml lock and refuse a symlink planted mid-retry (project)
- Gate the wasm test helper to unix so the Windows build compiles (package)
- Re-sync a fork behind upstream before replaying the commit (announce)
- Cascade into a target repository that does not exist yet (publisher) BREAKING
- Decide any-pin provenance on the canonical registry (publisher) BREAKING
- Hard links resolve under the extraction root, not the host (archive) BREAKING
- Exit 74 when writing the --out tree fails (announce)
- Refuse index = "file:/srv/x" instead of resolving it as a host (index)
- Bound the project walk with a relative OCX_CEILING_PATH (config)
- Resolve the $OCX_HOME default in one place (config)
- Bound every operator-typed trust-root, tags and token file read (verify)
- An unreadable trusted-root path exits 74, not 78 (verify)
- Bound the tags-file read
--tags-filedoes before merging (push) - Resolve each Rekor log key once per run, and cache trust material after a sidecar verify (verify)
- List every SBOM a cosign .sbom tag or referrer manifest carries, not just the first (verify)
- Resolve each swept tag once instead of twice (sign)
- Read a file:// trusted root at every door, not only verify and sbom (trust)
Release
- V0.6.0
[0.5.8] - 2026-08-11
Added
- Snapshot a whole registry into a servable local index (index)
- --json is shorthand for --format json (cli)
- Every
${…}in package metadata follows one grammar (package) BREAKING - Compose vendor-namespaced package integrations with per-package attribution (env)
- -g and -r short forms for --global and --remote (cli)
- Tools can join PATH without downloading their content (lazy) BREAKING
Changed
- Release binary is 44% smaller (33 MB -> 19 MB) (dist)
Documentation
- Address packages by their two-segment hosted-index name everywhere
- Document the unified interpolation token grammar
- Ocx env and which links land on the section they name
Fixed
- Removing a tool no longer warns it was never installed (remove)
- Every generated .exe hardlinks the one shared Windows shim blob (launcher)
- A failed torn-blob repair no longer reports success (shim)
- A nested bar no longer aborts the process when its parent is gone (progress)
- Reconcile the blob-store test seam with main's tests (rebase)
- Three suites still assumed pre-shim shapes and Linux-only errnos (test)
- Package test refuses a layer archive it cannot name a media type for (package)
Release
- V0.5.8
[0.5.7] - 2026-08-07
Added
- Ocx config setup and self setup refresh the managed-config snapshot (config)
- Pin companions in patch state instead of the shared local index (patch)
Documentation
- Setup reconciles the managed tier on every run, not just at adoption (config)
- --frozen is the package tier's freeze, and a companion pins outside the index
Fixed
- Advance a same-tag companion on sync instead of answering from the stale local pin (patch)
- Companions resolve live under --frozen — frozen scopes to the package tier (patch)
- --frozen refuses index update — the package tier's discovery verb (index)
- Snapshot keys companions by tag so two tags of one repository survive a freeze (patch) BREAKING
Release
- V0.5.7
[0.5.6] - 2026-08-06
Added
- Unknown env modifier types fail with an actionable upgrade remedy (package)
- List env modifier — unique append with an explicit separator (package)
- Ocx config test validates a managed-config payload locally (config)
Documentation
- The list env modifier across reference, authoring and in-depth pages
- Record a dedicated patch-test cast and a freeze that pins (patches)
Fixed
- Apply a patch companion once per env compose, not once per matched base (package)
- Patch test works against path-prefixed registries and local companion archives (patch)
- Compose companion overlays for the requested platform, not the host (patch)
Release
- V0.5.6
[0.5.5] - 2026-08-05
Added
- Build receipt replaces the recorded-platform metadata field (package) BREAKING
Documentation
- The push cast records the receipt-driven publish flow (authoring)
Fixed
- Route release discovery through the configured index chain (self)
Release
- V0.5.5
[0.5.4] - 2026-08-05
Added
- Surface cross-repo blob mount through transport and publisher (oci)
- From= layer-ref source and layer push counters (cli)
- Explicit binding names via ocx add NAME=IDENTIFIER (cli)
- Add cascade check and repair for the rolling-tag graph (package)
- Replace the generated catalog with a link to index.ocx.sh (website)
Fixed
- Resolve the physical reference from the local index before the sources (oci)
- Gate the same_file test helper to unix like its callers (lib)
- Allow the package-test scratch roots as shim package roots (shim)
- Retry an unsupported extended spawn without handle/job scoping (shim)
- Read the keyed package-info JSON in the catalog generator (website)
- The local index is the package-tier lock — nothing moves a pin implicitly (index) BREAKING
- Retry temp-directory renames that Windows blocks with access denied (install)
Release
- V0.5.4
[0.5.3] - 2026-08-03
Added
- Retry a blob upload that failed on a transient registry fault (oci)
Fixed
- Exit 75, not 69, when a registry times out or rate-limits (oci) BREAKING
- Exit 75 when a lock resolve gives up on a transient registry fault (project) BREAKING
- Bound the registry connect phase at 30 seconds (oci)
- Resolve commands against the package before the host PATH (cli) BREAKING
Release
- V0.5.3
[0.5.2] - 2026-08-02
Fixed
- Sync the fork before committing, replay transient forge faults (announce)
[0.5.1] - 2026-08-01
Fixed
- Spurious digest mismatch on layer pulls; truncated pulls now exit 75 (oci)
- Bound stalled registry connections with a 120s read timeout (oci)
[0.5.0] - 2026-07-31
Added
- Unified platform model — one relation, one grammar, lock V3 (#212, #215) BREAKING
- Declared binaries — metadata claims, create auto-scan, env report projection (#177)
- One index format — local wire-grammar store + index.ocx.sh client (#215, #217) (index) BREAKING
- Ocx package inspect --closure (cli,lib) BREAKING
- Ocx package announce — curated tag observation into the index (announce)
- Record OCI annotations on the published image index (push)
- User-declarable environment variables in ocx.toml (project)
- Optional type qualifier on ocx run --env (cli)
- Drop --self from ocx run (cli) BREAKING
- --env on every env-composing command (cli)
- Make the reserved-tag verdict one source of truth (tag) BREAKING
- Store OCI image indices verbatim, deleting the invented object (index) BREAKING
- Carry registry bytes verbatim and filter reserved tags once (announce) BREAKING
- Report the canonical tag actually written, and cap manifest bodies (push)
- Ship the ocx.sh index as a compiled-in default tier (config)
- Announce every tag the registry holds (announce)
- Observe __ocx.desc into the index root (announce)
- Check the declared libc against the packaged binaries (create)
- Fail closed when the host cannot scan for the target's executables (package)
- Open the pull request without a fork when the actor can push (announce)
- Remove any recorded variants key from the index root (announce)
- Add ocx status and ocx inspect for toolchain introspection (cli)
- Ship third-party license notices with the binary (dist)
Changed
- Extract the --env and --group seams into options/ (cli)
- PatchScope becomes EnvScope (package-manager)
- Observe curated tags concurrently (announce)
- Move with_os_feature onto Platform, keyed by feature namespace (oci)
- Drop the catalog ETag sidecar (index)
- Reshape ocx package inspect --format json into one envelope (cli) BREAKING
- Exit 65 from ocx package inspect --closure on an unrealizable surface (cli) BREAKING
- Drop closure.deps[].digest from ocx package inspect --closure (cli) BREAKING
Documentation
- --env on both tiers, --self gone from ocx run
- Record the --ci precedence flip and repair the changelog links
- Teach only the current design, and rebuild the binary when sources change
- Bank the live acceptance gate — E1, E2a and E2b all pass (e2e)
- Sync inspect/pull examples with narrowed plain output (cli)
- Realign the index-only dispatch record with the shipped code (adr)
- Correct the D4(b) exit code, four stale anchors and OQ2's closure (adr)
- Retarget seven anchors off doc comments onto the code they name (adr)
- Publish and announce a package (user-guide)
- State the shipped default-index behaviour on the publish path (index)
- Name the package-tier form in prose, not the removed root command
- D5 drops the create-time host platform default (adr)
- Name the declare-vs-assert platform asymmetry at the record site (create)
- The candidate symlink targets the package root, not content/ (storage)
- Record this branch's user-visible changes (changelog)
- Record the ocx.toml preservation fix (changelog)
- Record the catalog ETag sidecar removal
- Retire the conditional GET from the index-indirection record (adr)
- Mark the lock-records-physical-address ADR rejected (adr)
Fixed
- Release binaries no longer self-report as dirty builds (build)
- Let push infer the metadata sidecar instead of deriving it (ci)
- Classify the ambiguous 422 on ref update by reading the ref (forge)
- Align CI path export precedence with ocx run (ci)
- Forward env overrides from every spawning command (cli)
- Stop a singleflight waiter masking the leader's exit code (index)
- Refuse an image index that deserialises but is not a valid one (oci)
- Match CPython's DEL escape in the index wire writer (oci)
- Narrow plain-mode output to human-scannable widths (cli)
- Rebuild from the base when the announce branch is spent (announce)
- Repoint embedded doc links at absolute site URLs (changelog)
- Pin run and PR identity to a freshness floor (e2e)
- Floor run and PR identity on GitHub's own counters (e2e)
- Filter the announce PR window server-side (e2e)
- Let the index declare which names it can serve (index)
- Let the served root, not the declaration, settle jurisdiction (index)
- Keep a failed catalog row retryable instead of silently stale (index)
- Let an operator's [mirrors] entry suppress the built-in index (config)
- Let only local config revoke the verified index path (config)
- Chunk blob uploads under GHCR's 4 MiB per-request cap (oci)
- Stop an oversized blob falling back into the bug it just hit (oci)
- Read and write c/index.json as the versioned envelope (index)
- Wrap the three jurisdiction-test catalogs in the envelope (index)
- Select the index root by shape, not by directory order (test)
- Require --platform with --metadata instead of guessing the host (create)
- The install symlink targets the package root, not content/ (test)
- Title a description from the package's last name segment (announce)
- Reject a logo whose bytes are not the format its extension names (describe)
- Answer the physical transport address from the local index (index)
- Apply the SSRF floor to the local physical answer (index)
- Edit ocx.toml in place instead of re-serializing it (project)
- Decide binding equality by parsing, not by comparing text (project)
- Let the index drift gate see ocx-authored fixtures (test)
- Tolerate unknown keys fleet-wide, gate required on what applied (config)
- Check the duplicate-binding gate against the narrowed tool set (cli)
Release
- V0.5.0
[0.4.3] - 2026-07-10
Added
- Ship unix archives as .tar.gz (release)
- Strip symbols from dist binaries (release)
- Publish official docker images to ghcr (ci)
- Scope
ocx upgradeby name and group (cli) - Rename upgrade to update, resolve against registry by default (cli) BREAKING
- Env + direnv export install on miss by default, --no-pull opts out (cli)
- Add ocx config setup for config-only managed-config adoption (cli)
- Dependency manifest pinning — create resolves, push gates and fans out
Changed
- Split snapshot into metadata + readable config.toml (managed-config)
- Extract shared options::Pull flatten struct (cli)
- Publish apply_managed_config with narrowed params (lib)
Documentation
- Manual install uses .tar.gz assets (website)
- Document reproducible container builds (website)
- Document ocx update and the update family (website)
Fixed
- Seed CA roots at the fork's ClientConfig::default (oci)
- Resolve release archive with gz-then-xz fallback (setup-ocx)
- Bump rust-oci-client to panic-free TLS Client::default (deps)
- Resolve --dry-run previews concurrently (pull)
- Auto-sync patches after a config update (managed-config)
- Place Add and Supported Platforms side by side (website)
Release
- V0.4.3
[0.4.2] - 2026-07-05
Added
- Fluent upload progress via streamed chunked push (oci)
- Differentiate platforms by libc via os.features (oci,cli) BREAKING
- Add corporate managed configuration tier as config-as-package (config)
Fixed
- Bundle CA roots so TLS works without a system trust store (oci)
Release
- V0.4.2
[0.4.1] - 2026-07-03
Added
- Add --registry override to patch publish and test (patches)
- Add --[no-]verify flag to verify credentials before storing (login)
Fixed
- Gate install-time discovery failure on required posture (patches)
- Keep bare host in patch-registry identifier (patches)
- Resolve
anycompanions during patch sync (patches) - Static-link liblzma so the macOS binary is self-contained (build)
- Upload acceptance binary before the test step clobbers the seam (ci)
Release
- V0.4.1
[0.4.0] - 2026-07-03
Added
- Infrastructure patches for toolchain environment overlays (patch)
Fixed
- Canonicalize seeded paths in patch_roots GC tests (gc)
- Converge concurrent junction back-ref race and drive-joined PATH literal (windows)
Release
- V0.4.0
[0.3.12] - 2026-07-02
Added
- Per-layer strip and output prefix via manifest annotations (layer)
Fixed
- Extract layers verbatim, apply strip at assemble time (assemble)
- Race-free host-only install symlinks (#179) (package-manager)
- Serialize layer prefix as forward-slash wire form (layer)
- Correct absolute-path classification and concurrent link race (windows)
- Retry transient lock errors across concurrent junction ops (windows)
- Tolerate concurrent junction teardown in remove_link (windows)
Release
- V0.3.12
[0.3.11] - 2026-07-02
Added
- Accept multiple identifiers across add/remove/inspect/info (cli) BREAKING
- Expose --platform on toolchain-tier commands (cli)
- Scope ocx env composition by group (#176) (cli)
Changed
- Dedup group/platform validation across pull and env (cli)
Documentation
- Adopt setup.ocx.sh as the canonical install path
Fixed
- Self update probes registry by default (self)
- Order batch errors by input index (package-manager)
- Unique temp file per batch live-test invocation (shell)
Release
- V0.3.11
[0.3.10] - 2026-06-30
Added
- Bake entrypoint args with ${installPath} interpolation
- Support tar+zstd layer format (#58)
Changed
- Unify metadata interpolation behind capability-gated engine
Fixed
- Scope host-leaf resolution to named bindings (run)
- Make nushell shim PATH activation parse on nu without get --optional (setup)
- Wire ~/.profile for non-bash POSIX login shells (setup)
- Decouple elvish completion from PATH activation (setup)
Release
- V0.3.10
[0.3.9] - 2026-06-21
Added
- Idempotent move-to-front PATH manipulation (shell)
- Idempotent batch PATH, remove OCX_ACTIVATED for all shells (shell)
Fixed
- Resolve latest through configured index, honour OCX_INDEX (self-update)
- Serialize tag locks with deterministic key order (index)
- Deterministic key order for CLI output structs (cli)
- Repair Windows activation harness to use
ocx self setup(test) - Batch single-statement move-to-front + FOR/F delims= (shell)
- Apply non-POSIX shell activation as data (nushell) + capture elvish eval (shell)
- Break release-readiness concurrency self-deadlock (ci)
Release
- V0.3.9
[0.3.8] - 2026-06-15
Added
- Typed Starlark host API for package testing (script)
ocx package test --scriptembedded Starlark runner (cli)- Pipeline subcommand + per-platform applicability + Discord/JUnit reporting (mirror)
- Drift guard ignores action-pin bumps; SHA-pin setup-ocx (mirror)
- Add --frozen flag to freeze tag resolution to the local index (cli) BREAKING
- Add version pinning to ocx self setup (#156) (cli)
- Per-platform lock pinning with whole-file lock/upgrade model (project) BREAKING
Changed
- Make ChainMode matching exhaustive (oci)
- Move ocx-mirror to its own repository BREAKING
- Quick wins on the install hot path (install)
- Streaming single-pass pull pipeline (oci) BREAKING
- Collapse redundant create_dir_all in tar extraction (archive)
- Parallelize V2 index-retention scan (gc)
Documentation
- Fix digest-verification callout for streaming pull (website)
Fixed
- Stop baking metadata.json into bundle content (mirror)
- Parallelize per-tag digest fetch in index update (oci)
- Fail-safe target-registry reads in discover and sync (mirror)
- Stop prepare legs re-crawling the source (N+1 crawls) (mirror)
- Bound decompression budget and reject zero-size layers (oci)
- Deterministic exit code on concurrent symlink failures (install)
- Route eval-safe-output advisory through the log module (cli)
- Use job-level defaults.run.shell for matrixed Windows shells (ci)
Release
- V0.3.8
[0.3.7] - 2026-06-07
Fixed
- Guard shell activation against an unset OCX_HOME (setup)
[0.3.6] - 2026-06-07
Added
- Show platform icons in package catalog (website)
- Show manifest layers in default package inspect (cli)
- Add setup module for shell scaffold ownership (lib)
- Add ocx self setup command + self-update shim refresh (cli)
Changed
- Share canonical ocx_cli_identifier helper (oci)
- Slim install scripts to delegate to ocx self setup (install)
Documentation
- Document ocx self setup + bare-binary install path (self-setup)
Fixed
- Read remote tag queries through to source (oci)
- Address review-fix loop findings (self-setup)
- Harden ZDOTDIR + document ocx-owned dedicated files (self-setup)
- Report current path on install --select (cli)
- Error on conflicting versions in one environment (package)
Release
- V0.3.6
[0.3.5] - 2026-06-02
Added
- Client-declared registry mirrors via [mirrors] config (oci)
- CI env export via --ci on env / package env (cli,oci)
- Ocx package push emits a structured push report (cli)
Fixed
- Keep zsh completions alive across a late compinit (install)
- Wire both bash and zsh profiles, not just $SHELL (install)
- Authenticate before every registry operation (oci)
- Add short description to package push subcommand (cli)
- Git-style plugin dispatch + correct not-found hint (cli)
- Advance floating prerelease tag on every cascade build (package)
Release
- V0.3.5
[0.3.4] - 2026-05-31
Documentation
- Strip internal design references from --help text (cli)
Fixed
- Escape angle brackets in changelog (release)
- Mark
package testtrailing command as alastpositional (cli) - Emit shell completions inline, ASCII-safe (fixes zsh + PowerShell activation) (cli)
- Cross-platform pwsh env.ps1 + local test-install mode (install)
- Make Windows installers ASCII- and StrictMode-safe (install)
- Keep shell-completion help text ASCII-safe for PowerShell (cli)
Release
- V0.3.4
[0.3.3] - 2026-05-31
Fixed
- Repair Windows PowerShell shell activation (cli)
- Rewrite ocx.toml in place through the lock-owning handle (project)
- Give touch_state_atomic collision-free temp names (update-check)
- Reject a non-regular config path consistently across platforms (config)
- Read ocx.toml through the lock-owning handle (project)
Release
- V0.3.3
[0.3.2] - 2026-05-28
Added
- Enrich
ocx version+ocx aboutwith build provenance (cli) - Dispatch unknown subcommands to ocx-<name> plugins on PATH (cli)
Changed
- Unify on LockedFile primitive (file-lock)
Fixed
- Accept binary-mode sha256.sum (install)
- Support Windows PowerShell 5.1 in install.ps1 (install)
- Write tag store through lock-owning handle on Windows (oci)
- Tolerate populated build-info blocks in CI test (cli)
- Make download tests fast and meaningful (ocx-mirror)
- Emit package root from ocx pull, not content/ subdir (cli)
- Align torn-JSON test with locked-reader contract (auth)
Release
- 0.3.2
[0.3.1] - 2026-05-27
Added
- Direct PATH activation with completions, write both login and rc profiles (install)
- Add
ocx selfcommand group with throttled update checks (cli)
Changed
- Nest ocx mirror as ocx/cli and adopt package install / add CLI
Fixed
- Exclude ocx_shim from cargo-dist plan (release)
- Resolve via current symlink + correct test wire shape (self-update)
- Build smoke artifact with __testing feature; parallelize acceptance tests (ci)
- Blob store locking + path normalization (windows)
Release
- 0.3.1
[0.3.0] - 2026-05-26
Added
- Redesign landing page with feature sections, scroll reveal, and licensed asset pipeline (website)
- Redesign roadmap as standalone page with scroll-driven timeline (website)
- Add package dependency resolution with deps CLI
- Replace export bool with Visibility enum on dependencies
- Per-platform asset_type override + lychee mirror (mirror)
- Three-tier content-addressed storage BREAKING
- Multi-registry support for index catalog command (cli)
- Transparent tag fallback on local index miss (oci)
- Serialise local tag log writes with per-repo lock (oci)
- Chain refs resolution and --remote as CAS cache mode (oci) BREAKING
- Multi-layer package push and pull (#20) (package) BREAKING
- Surface ClientError::BlobNotFound as PackageErrorKind::BlobNotFound (error)
- Support zero-layer config-only OCI artifacts (package)
- List accepted extensions in bare-digest error (publisher)
- Add async layered configuration system with registry resolution (config)
- Typed exit codes and error normalization (cli)
- Add JSON Schema generation and taplo auto-completion for config.toml (config)
- Add /next skill for state-aware next-step suggestions (claude)
- Package entry points (package) BREAKING
- Add dev.ocx.sh staging deploy with banner (website)
- Add ocx package test for local pre-push validation (cli) BREAKING
- Shell-driven scenario harness for acceptance tests (test)
- Project toolchain (ocx.toml + ocx.lock + run/add/remove/init) (project) BREAKING
- --build-timestamp + dev.ocx.sh continuous deploy
- Add ocx login and ocx logout commands (cli) BREAKING
- Add ocx package inspect command (cli)
- Add Entrypoint.command dispatch divergence (package)
- Unify inspect digest rendering across views (cli)
- Windows native .exe shim, .cmd cutover (resolves #66) (launcher) BREAKING
- Publish first-party binaries under ocx/ namespace (release)
- Symlink GC ledger + explicit --global toolchain tier (project) BREAKING
- Toolchain CLI taxonomy + global activation via env exporter (cli) BREAKING
- Doc-script render harness — doc_scripts tree, publish render layer, scenario migration (test,website)
- Decorated table output with per-column/cell styles (cli)
- Activate Nushell + Elvish shells in install.sh (install)
- Readable inspect output — themed root, human sizes, descriptor chain (cli) BREAKING
- Env output format is a context-only concern (cli) BREAKING
- Global toolchain ocx.lock is an implicit GC root (clean)
- Eager pull default for lock/upgrade + --pull/--no-pull pair; pull touches lock for direnv (cli) BREAKING
Changed
- Route archive symlink extraction through symlink::create
- Extract garbage collector with BFS reachability
- Add PinnedIdentifier and decompose OCI pull pipeline
- Drop redundant root identifier from ResolvedPackage (package)
- Offload layer SHA-256 hashing to spawn_blocking (oci)
- Algorithm-typed digest dispatch and enriched BlobNotFound (oci)
- Add path_exists_lossy and adopt across call sites (utility)
- Unify bounded-concurrency fan-out on stream::buffered
- Drop --shell from ocx shell direnv (cli)
- Drop Entrypoint.target, dispatch via composed PATH (package) BREAKING
- Convert entrypoints from array to map shape (package) BREAKING
- Extract config-blob metadata loader into common.rs (package)
- Extract resolve_top_manifest shared helper (package-manager)
- Rename update command to upgrade (cli) BREAKING
- Rename find command to which (cli) BREAKING
- Rename info command to about (cli) BREAKING
- Consolidate direnv into a dedicated ocx direnv group (cli) BREAKING
- Move ocx which under the ocx package group (cli) BREAKING
- Collapse --global to single root-only flag (cli) BREAKING
- Move ocx deps under the ocx package group (cli) BREAKING
- Remove dead static-init/profile/path-strip shell scaffolding
- Remove dead _OCX_APPLIED fingerprint helpers
Documentation
- Correct push layer arguments and digest reference syntax (cli)
- Redesign user guide as use-case-driven walkthrough (website)
- Add package authoring guide (website)
- Soften read-only wording, document command field (package-inspect)
- Signed-off handshake + harden superseded tier ADR (toolchain)
- Shell-profile activation prior-art for handshake §4 (research)
- Retruth shell-activation model — supersede stale ADRs, fix release/arch rules + user docs
- Shell-activation model, global toolchain, inspect chain
Fixed
- Stub missing licensed assets so CI build succeeds (website)
- Preserve original licensed asset URLs in build output (website)
- Add --remote flag to first-run commands (website)
- Enable clippy --all-targets to lint test code
- Cap ProgressWriter write size for smoother download progress
- Update workflow task references to rust: namespace (ci)
- Guard shell RC source line so deleting $OCX_HOME does not error (install)
- Verify pulled layer bytes match claimed digest (oci)
- Make LayerRef media type total via ArchiveMediaType enum (publisher)
- Verify file digest with manifest-declared algorithm (mirror)
- Static commands survive malformed ambient config (cli)
- Harden config loader, fix error chain rendering, and extend exit-code coverage (config,cli)
- Route ChainedIndex catalog and tag list by ChainMode (oci)
- Exclude worktrees from .claude markdown scans (tests)
- Completion error casing, debug log level, install docs (shell)
- Trigger roadmap item fade-in on initial load (website)
- Emit synth-entrypoints PATH after declared bin/ (package-manager)
- Rehydrate package offline from cached blobs and layers (package-manager)
- Relax AC2 disjoint-refs assertion to per-side uniqueness (test)
- Mark recording setup env entries public so consumer view emits PATH (test)
- Zero uid/gid in tar headers for reproducibility (archive)
- Make discord website-deploy notification env-aware (ci)
- Make macOS portable (tests)
- Surface malformed image-index child digest as structured error (cli)
- Refresh drifted Windows shim blobs; align windows acceptance tests (shim)
- Hermetic reproducible cross-build via cargo-zigbuild (shim)
- Reconcile entrypoints schema tests with array contract (test)
- Fail-closed GC ledger + global/project conflict seam (project)
- Adopt install.ps1 to global toolchain model + pwsh shell alias (install)
- Toolchain mutators no longer create candidate symlinks (cli) BREAKING
- Restore entrypoints schema tests to object contract (test)
- Replace nightly windows_by_handle with stable Win32 API (windows)
- Drop deleted synthetic_pathext_entry call + unused-mut/import warnings (windows)
Release
- V0.3.0
[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
- Prevent PowerShell Invoke-Expression error on empty shell output
Release
- V0.2.1
[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)
Release
- V0.2.0
[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)
Release
- V0.1.0 [0.6.1]: https://github.com/ocx-sh/ocx/compare/v0.6.0..v0.6.1 [0.6.0]: https://github.com/ocx-sh/ocx/compare/v0.5.8..v0.6.0 [0.5.8]: https://github.com/ocx-sh/ocx/compare/v0.5.7..v0.5.8 [0.5.7]: https://github.com/ocx-sh/ocx/compare/v0.5.6..v0.5.7 [0.5.6]: https://github.com/ocx-sh/ocx/compare/v0.5.5..v0.5.6 [0.5.5]: https://github.com/ocx-sh/ocx/compare/v0.5.4..v0.5.5 [0.5.4]: https://github.com/ocx-sh/ocx/compare/v0.5.3..v0.5.4 [0.5.3]: https://github.com/ocx-sh/ocx/compare/v0.5.2..v0.5.3 [0.5.2]: https://github.com/ocx-sh/ocx/compare/v0.5.1..v0.5.2 [0.5.1]: https://github.com/ocx-sh/ocx/compare/v0.5.0..v0.5.1 [0.5.0]: https://github.com/ocx-sh/ocx/compare/v0.4.3..v0.5.0 [0.4.3]: https://github.com/ocx-sh/ocx/compare/v0.4.2..v0.4.3 [0.4.2]: https://github.com/ocx-sh/ocx/compare/v0.4.1..v0.4.2 [0.4.1]: https://github.com/ocx-sh/ocx/compare/v0.4.0..v0.4.1 [0.4.0]: https://github.com/ocx-sh/ocx/compare/v0.3.12..v0.4.0 [0.3.12]: https://github.com/ocx-sh/ocx/compare/v0.3.11..v0.3.12 [0.3.11]: https://github.com/ocx-sh/ocx/compare/v0.3.10..v0.3.11 [0.3.10]: https://github.com/ocx-sh/ocx/compare/v0.3.9..v0.3.10 [0.3.9]: https://github.com/ocx-sh/ocx/compare/v0.3.8..v0.3.9 [0.3.8]: https://github.com/ocx-sh/ocx/compare/v0.3.7..v0.3.8 [0.3.7]: https://github.com/ocx-sh/ocx/compare/v0.3.6..v0.3.7 [0.3.6]: https://github.com/ocx-sh/ocx/compare/v0.3.5..v0.3.6 [0.3.5]: https://github.com/ocx-sh/ocx/compare/v0.3.4..v0.3.5 [0.3.4]: https://github.com/ocx-sh/ocx/compare/v0.3.3..v0.3.4 [0.3.3]: https://github.com/ocx-sh/ocx/compare/v0.3.2..v0.3.3 [0.3.2]: https://github.com/ocx-sh/ocx/compare/v0.3.1..v0.3.2 [0.3.1]: https://github.com/ocx-sh/ocx/compare/v0.3.0..v0.3.1 [0.3.0]: https://github.com/ocx-sh/ocx/compare/v0.2.1..v0.3.0 [0.2.1]: https://github.com/ocx-sh/ocx/compare/v0.2.0..v0.2.1 [0.2.0]: https://github.com/ocx-sh/ocx/compare/v0.1.0..v0.2.0 [0.1.0]: https://github.com/ocx-sh/ocx/compare/v0.0.0..v0.1.0