0.15.0
Released 2026-09-23
Added
viv lock converttranslates an existingcomposer.lockinto chapter 1'sviv.lockwithout re-solving (#273)viv lock mergeis a git merge driver forcomposer.lock/viv.lock: it merges the three inputs by name-keyed package record instead of by text line.--no-resolveskips the divergent-name re-solve,--as-ofpins that re-solve's registry view to an RFC 3339 timestamp (#275)viv update --lock nativesolves normally and, alongside the unchangedcomposer.lock, writesviv.lockin chapter 1's research format (#272)viv workspace listdiscovers a repository'sextra.viv.workspacemembers and reports each one's name, version, path and inter-member requirements (#276)packagerepositories: packages declared inline incomposer.jsonrather than fetched from a registry (#294)viv lock mergere-solves what diverged in three rungs, the divergent closure, then pinned packages that directly require it, then a full solve that prefers every locked version;--max-scopecaps it and the report names the rung and every package that moved (#296).viv.lockinputs re-solve the same way, taking the pinned set's requires from the siblingcomposer.lock(#295)viv installreadsviv.lockbesidecomposer.lockwhen present and refuses if the two disagree in either direction;viv updateimplies--lock nativeonceviv.lockexists (#297)viv installon a lock left with git conflict markers names the file, the first marker's line and the packages in conflict (#274); inside a git checkout mid-merge it resolves the conflict itself from the index stages, the same way the merge driver would, and continues (#299)viv initwritescomposer.lock merge=vivandviv.lock merge=vivto.gitattributes;viv installsetsmerge.viv.driverin any clone whose.gitattributesnames it, so git merges locks through viv without a manual step (#298)make bench-ab BEFORE=<bin> AFTER=<bin>grades a pull request's own binary againstmain's, viv against itself, as a pre-merge gate;make bench-checknow runs onbench/laravelandmake bench-smokecovers the runner-sized monolog fixture CI actually gates on (#293)