Skip to content

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/ -> develop -> release/post- while running. A parallel agent branching off develop during that window saw the base branch in-flight — bad hygiene and a real collision risk.

Preflight now creates a managed worktree on release/ off develop and chdir's into it, so every commit, push, and PR happens in the worktree and the root checkout's HEAD never moves. prepare no longer creates the branch or checks out develop; back-merge-bump drops its trailing develop checkout/ff (the root's develop is synced later by the finalize cleanup stage, from the root checkout). A new teardown-worktree stage removes the worktree and returns to the root before close-finalize, which runs vrg-finalize-pr — a command that refuses to run outside the main worktree. On a fail-fast abort the worktree is left in place for debugging, matching vrg-update-deps.