0.14.0
Released 2026-09-18
Added
viv validate --fixapplies the findings that have one answer — a package in bothrequireandrequire-dev, aprovide/replaceentry for a package the root also requires,scripts-descriptions/scripts-aliasesentries for scripts that don't exist, a self-require, a name that isn't lower-cased-with-dashes, and a stale lockcontent-hash— writescomposer.jsonthrough the normaliser, and re-validates. Without--fix, a plainviv validatesays after Composer's findings how many of them--fixwould handle; the findings themselves stay byte-identical to Composer's (#262)- A GitHub Actions setup action,
svandragt/vivace/action@v0, putsvivand thecomposershim on a runner from oneuses:line; it downloads the release tarball for the runner's OS and architecture and checks it against the release'sSHA256SUMS.with: { version: vX.Y.Z }pins a release,shim: falseskips the shim (#263) - The Homebrew formula is back in the release workflow and publishes to the
svandragt/homebrew-taptap on every tag (#222) - Every tag is published to crates.io, so
cargo install vivaceandcargo binstall vivacework as an install and update path (#166) - Issue templates,
SECURITY.md, and a Support page on the site that says what maintenance to expect (#264)
Fixed
- A lock
dist.urlcarrying Composer's%package%,%version%,%prettyVersion%,%reference%or%type%placeholders is expanded before the download instead of requested literally; BookStack's Codeberg dist failed on it (#257) - A root requirement that a locked package satisfies through
replaceorprovidecounts as present in the lock; HumHub'scodeception/phpunit-wrapper, replaced bycodeception/codeception, was reported as a merge-conflict lock (#258) autoload_files.phporders packages the way Composer's install transaction does, including on arequirescycle, and a package's declaredbingets its execute bits; akaunting'svendor/differed on both (#259)- A partial update (
viv update <package>) failed when a held, unlisted dependency was locked at a dev branch such asdev-main. The branch'sextra.branch-aliasis now loaded as a second package beside the base, the way Composer does and the full update already did, so a caret requirement on the held package matches. Before this every held package requiring the branch by version was reported as a typo (#267) - An inferred stability flag equal to
minimum-stabilitywas dropped, so adev-*require underminimum-stability: devwrote an emptystability-flagsmap where Composer writes20. The lock is now byte-identical (#261)
Changed
- Offline
viv updateis faster: on the Laravel bench lock, 215 ms to 131 ms (hyperfine, 10 runs). Provider-file versions stay raw JSON until a delta is replayed, and a version's merged object is only materialised when something reads it. The lock written is byte-identical (#268)