Omena Rust crate train 0.5.0
Linked emission, canonical identity, typed exports, and content-bound cache correctness in the 0.5.0 crate, CLI, and npm train.
Omena 0.5.0 advances the coordinated Rust crate train, CLI binaries, generated
WASM and N-API bindings, and release-managed build integrations from one
immutable source revision. The editor extension remains on its separate version
axis: vscode-v5.5.0 is a follow-up train verified from this release commit,
not part of the release-v0.5.0 publication.
Platform surface
Linked emission is the sole default
Linked-order emission is now the default on every product surface: Rust, CLI, N-API, WASM, the JavaScript build adapter, Vite, and PostCSS all select import-order-preserving emission with resolved dependencies when callers do not make an explicit choice. The previous import-inline model remains reachable only through an explicitly deprecated legacy opt-in scheduled for removal before 1.0.
The complete 24-fixture corpus records every intentional output-CSS difference
between linked and legacy emission. Asset URLs, including URLs inside
@font-face, are rewritten relative to their linked source module, and the
CLI, N-API, WASM, and JavaScript adapter produce byte-identical output for the
same input.
Typed CSS Modules export namespaces
Class exports and ICSS :export values no longer share one untyped key space.
Every host surface exposes distinct class and value export families, same-name
collisions produce a diagnostic instead of silent last-writer-wins behavior,
and class rewrites derive only from class exports.
Explicit opt-ins
The previous import-inline emission model remains available only through its explicitly named, deprecated legacy compatibility option. A linked-planning refusal remains a typed error and never silently falls back to legacy output. The legacy option is scheduled for removal before 1.0.
The editor extension remains an independent release axis. No extension version
or marketplace artifact is published by this crate tag; vscode-v5.5.0 is a
separate follow-up verified from the same immutable release commit.
Behavior corrections
Escape-faithful property and selector identity
Custom-property and selector identity now use sealed canonical keys throughout
parsing, indexing, query, rename, and host projections. Escape-equivalent
spellings such as \2d\2d foo and --foo, or .a\2e b and its decoded
selector identity, join and deduplicate as one symbol while every authored
spelling remains byte-for-byte intact on public wires.
Content-bound adapter caching
The build adapter cache is keyed by a snapshot digest of the content the build actually reads: target inputs, transitive style sources, package manifests, and static configuration, together with resolver, target-plan, engine, pass-plan, and emission-mode identities. Editing a dependency behind an unchanged path list can no longer serve a stale build, including in watch mode.
Sharper analysis internals
- Resolver identity indices are built once per workspace invocation on both diagnostics planes.
- Source-map receipts name exactly the passes that ran.
- Identifier-authority checks use compile barriers, a class-modeled escape census, and counted decrease-only disclosure of what remains outside their observation boundary.
- Read-set caching preserves unchanged work without confusing a rolling verification revision with the last actual source change.
Version scope
This is a pre-1.0 minor-breaking Rust release. The declared compatibility changes include the linked-emission default flip, export-namespace separation, canonical occurrence identity, and sealed selector/property carrier types. Each change is backed by measured byte-difference disclosure, an explicit deprecation path, or both. Callers that require the former emission model must select the deprecated legacy compatibility option explicitly.
The train contains 51 publishable Rust crates. Live registry classification
found all 51 names already registered at 0.4.0, including omena-reactive,
so the 0.5.0 train used workflow-bound trusted publishing throughout; no
bootstrap authentication was required.