Namespace cache entries by repository and fetch ref instead of keying them only
by commit text.
Once tagged fetches are preserved, different repositories can legitimately share
the same tag name. Keying the cache by the bare ref lets unrelated plugins
collide and reuse the wrong prefetched hash. Use repo URI plus tag/commit so
cache hits stay repository-specific.
Let the updater choose between release-tag tracking and commit tracking based on
the repository state instead of forcing a large set of plugins to stay on HEAD.
This keeps plugins without usable releases on unstable versions while allowing
plugins that do publish releases to follow those releases without carrying an
explicit pin in vim-plugin-names.
Compare the current source ref using src.tag when present and fall back to
src.rev otherwise.
nvim-treesitter can now be represented by either a tag or a commit depending on
how the updater selected its target. Comparing only rev makes the special-case
skip logic treat equivalent tagged sources as mismatches.
Keep fetcher tag metadata when reading current plugin state from Nix.
The updater needs to know whether a plugin was fetched by tag or by commit.
Without carrying src.tag through, tagged sources are read back as if rev were
always the canonical source identifier, which breaks tag-aware comparisons and
cache behavior later in the update flow.
When GraphQL is unavailable, use GitHub's tag feed as a cheap ordered source
of recent tags before falling back to git ls-remote.
This preserves the recent-tag selection policy for unauthenticated and
rate-limited runs without cloning repositories or adding another expensive API
path.
Use GitHub's recent-tag GraphQL query as an ordered source of candidate tags
and pick the first acceptable release tag from that list.
This keeps the generic git fallback unchanged while avoiding the older "largest
version wins" behavior on repositories whose newest maintained release has a
lower semantic version than an older historical tag.
Switch the updater from always following HEAD to selecting release tags when a
plugin spec is in auto mode and a usable release tag exists.
Explicit branches remain commit-tracked. Auto-selected release tags still fall
back to unstable commit versions when no usable release exists or when the
current git-tracked plugin is newer than the latest tagged release.
Teach the updater to preserve tagged plugin metadata without changing the
default target-selection policy yet.
This stores explicit versions and optional source tags on Plugin objects,
parses tagged plugin state without assuming unstable versions, and renders tag
fetchers back into Nix when a plugin was selected from a tag.