Skip to content

Release 2.1.18 (2026-06-08)

Bug fixes

  • stop wrapped lines from overflowing the live viewport (#1518) RichRenderer._visible_window budgets the rolling window in logical lines, but Rich's LiveRender measures physical rows. CI-check rows ending in ~95-char job URLs wrapped to two rows each, pushing the live block past the viewport; Rich then ellipsis-cropped it to the full viewport height, and a full-viewport block scrolls on every repaint, leaking duplicated top rows (the repeated audit lines in vrg-release). Render completed lines, the spinner text, and tail lines with no_wrap + ellipsis so one logical line maps to one physical row and the existing height-margin budget holds. Ref #1517.

  • require forking on org repos; clear error on org fork denial (#1524) Org repos (public and private) now declare allow_forking=True, since the tooling requires repos to be forkable. The previous posture set allow_forking=False for private org repos, which both contradicted that need and could not even be applied: GitHub rejects an allow_forking field in a private repo's settings PATCH with 422 unless the org-level members_can_fork_private_repositories flag is enabled — even when setting it to False. That redundant, unsettable field aborted the whole apply before any real diffs landed.

User-owned repos remain unmanaged (Refs #666).

When the settings PATCH is still rejected for that org-level fork policy (org flag not yet enabled), apply now raises an actionable error pointing to the org-level prerequisite instead of an uncaught traceback. The org-level flag itself is not yet managed by the tool (Refs #1268).

  • require non-empty issue/title/summary/notes; reject folded scalars (#1525) Agents hand-write .vergil/pr-template.yml, and two gaps let empty or garbage PR descriptions reach vrg-submit-pr and the opened PR:

  • read_template validated only field presence, never non-emptiness, and notes was not required at all. A blank or present-but-empty summary/notes passed straight into the PR body.

  • The minimal YAML parser only handled '|' literal blocks. A value written as a folded scalar (summary: >-) was parsed as the literal string '>-', and every indented continuation line was silently dropped — the field became two characters of garbage with no error.

Documentation

  • add forge abstraction strategy (Forgejo/Codeberg) (#1522) Strategy/R&D design for a provider-neutral forge abstraction that decouples the tooling from GitHub and targets Forgejo (self-hosted) and Codeberg. Captures the GitHub exposure map, verified research findings, the abstraction architecture (seam not stubs; two adapters justified by the dual-provider migration; LCD core + capability flags), audit-gate reproduction, CI strategy, per-repo migration, trigger plan, and a phased path. Ref #1521

Features

  • add vrg-whoami identity-mode resolver CLI (#1526)
  • refactor(identity): expose structured resolve() with signal evidence

Add resolve(), Resolution, SignalReading, and the Signal enum to identity_mode, making the five-step fallback chain inspectable: the resolved mode, which signal resolved it, every signal's state, and a disagreement check for when present signals imply conflicting modes.

current_mode() becomes a thin wrapper over resolve(), preserving the single source of truth — no resolution logic is duplicated. This is the substrate for the vrg-whoami CLI's --explain output.