Release 2.1.27 (2026-06-11)¶
Features¶
- add vergil ecosystem updater and per-run selector (#1601)
- refactor(update-deps): rename python-uv updater to python
Simplify updater identifiers to the bare language name for the upcoming --only/--skip selector. Ref #1591
- feat(update-deps): add per-run updater selector (--only/--skip)
select_updaters filters the registry by name (--only / --skip, mutually exclusive, unknown name fails loud), composed before the applies() filter. CLI exposes --only/--skip as a mutually exclusive group; the names are threaded through UpdateDepsState. Default (neither) keeps the bundled all-applicable behavior. Ref #1591
- feat(update-deps): thread --vergil bump target (implies only the vergil updater)
--vergil X.Y is the deliberate ecosystem-upgrade flag: mutually exclusive with --only/--skip, it scopes the run to only the vergil updater and carries the bump target through UpdateDepsState and ctx.vergil_bump (set in preflight). Normal runs leave it unset, running vergil in normalize mode. Ref #1591
- feat(update-deps): add vergil version helpers and ref rewriting
format_version normalizes X.Y/vX.Y to vX.Y; read_source_version reads [dependencies].vergil; set_source_version rewrites that line (idempotent); normalize_refs rewrites drifting 'uses: vergil-*@vX.Y' workflow refs to the target while leaving third-party actions alone (format-preserving, idempotent). Ref #1591
- feat(update-deps): add vergil ecosystem updater and register it
VergilUpdater (name 'vergil') normalizes drifting workflow refs to the vergil.toml source-of-truth on a normal run, and on --vergil X.Y rewrites the source then normalizes (bump). Operates on the worktree. Registered in DEFAULT_REGISTRY after python. Ref #1591
- refactor(update-deps): satisfy mypy and ty typecheck gates
Accept Sequence[Updater] (covariant) in the registry selectors so a list of concrete updaters type-checks under ty; annotate the tomllib-read vergil version as str so mypy does not see an Any return. Ref #1591
- allow read-only git subcommands and read-only reflog (#1604) Admit the full set of purely read-only git subcommands (blame, annotate, grep, ls-files, ls-tree, cat-file, rev-list, merge-base, name-rev, for-each-ref, show-ref, show-branch, cherry, describe, shortlog, whatchanged, count-objects, verify-commit, verify-tag, var, and the plumbing diffs) to the vrg-git allowlist so agents have maximum read-only access for triage and debugging.
Promote reflog from blanket-denied to read-only gating: the read-only forms (bare invocation, show, exists) are allowed while the mutating sub-operations expire and delete remain denied.
The remaining dual-mode commands are left denied for now: config has a broad mutating-flag surface whose read-only forms (--get/--list) need a careful flag allowlist, and tag/notes share the bare-default-writes ambiguity. These are deferred to a dedicated follow-up rather than risking a loosened write path.
Update the permission-model guide allowlist table to match.
- VM-local Claude plugin lifecycle and .claude share-set cleanup (#1605)
- docs(specs): .claude share-set audit design (#1603)
Approved brainstorming design: remove the vestigial sessions mount, document the projects-vs-sessions persistence model (code comment plus a docs guide), and define the human-run plugins EXDEV experiment that seeds a follow-up decision. No plugins wiring in this issue.
Refactoring¶
- run vrg-release in a managed worktree (#1600)
- refactor(worktree): extract shared managed-worktree helper into lib/managed_worktree
vrg-update-deps introduced the managed-worktree create/remove logic under lib/update_deps/worktree.py, coupled to UpdateDepsError. Promote it to a neutral lib/managed_worktree module that raises a generic ManagedWorktreeError, so vrg-release can adopt the same mechanism (#1578) without importing update-deps internals. Each caller translates the error into its own pipeline error type at the boundary.
- refactor(release): perform all release branch work in a managed worktree (#1578)
vrg-release switched HEAD in the root checkout across develop -> release/
Preflight now creates a managed worktree on release/