0.21.0
Released 2026-10-06
Added
viv isolate <package>andextra.viv.isolateprefix a plugin's bundled libraries with php-scoper on the pinned PHP, so a WordPress plugin that ships its own Guzzle or AWS SDK stops clashing with the site's copy. viv lints the scoped tree eight-wide, boots it against the real WordPress stubs, and writescomposer.jsononly after that check passes; a failed check keeps the plain tree.viv installreports a bundled library that clashes with the site's own copy (#350, #351, #352, #354, #357)viv completions <shell>prints a completion script for bash, zsh or fish. The.deb, the release tarballs and the Homebrew formula now install the completions and man pages forvivand each subcommand (#335, #336)- Native adapters for the Altis plugins
altis/cms-installer,altis/coreandaltis/dev-tools-command:viv installon an Altis site runs without--no-plugins(#355)
Changed
viv xruns a tool on the project's pinned PHP, not the firstphponPATH(#353)composer --versionthrough the shim prints viv's version and exits 0 when no real Composer is installed.make installalso refreshes an installed shim, so the two binaries stay on the same version
Fixed
- Parallel viv processes no longer race on a git mirror's config (
could not lock config file) (#349) viv lock mergeremembers a pinned commit that is gone upstream instead of fetching it again on every run, and adev-*record one side removed and the other moved now names the package and both sides (#348, #297)
Research
- Candidate 3.2, per-plugin isolation: built opt-in. On the site whose AWS SDK plugin caused the clash, php-scoper takes 4.6 s, the lint 51 s, and the plugin loads; 87 s cold. A re-run of the five-site survey after counting plugins in plain
vendor/finds 41 clashes in 295 directories, no conclusion changed (#346, #310)