The Docker updater watches image plus version, the repository updater repository plus ref. Twelve pins fell outside both - an app_version, a release, a tag in a registry neither speaks - so nothing ever told anyone they had gone stale. Such a pin now names its upstream next to itself in an `update:` block: git_tags, registry_tags, npm, http_regex or a role-local script, with `match` selecting a tag flavour and `strip` removing a prefix the pin does not carry. utils/update/source.py resolves them beside the two existing updaters, `python -m cli.contributing.update.source` bumps them, the update-version-sources job opens one PR per role, and tests/external/update/source warns while a bump is pending. Two lints hold the rule: every semver pin is watched by one of the three updaters or opted out with a reason, and a semver only ever sits behind `version`, `<what>_version` or `ref` - which renames moodle's release to app_version and simpleicons' local_version to local_tag, the latter being the tag of a locally built image rather than an upstream version. A declaration naming a key the entity does not carry, or a type the resolver does not know, fails the lint instead of resolving nothing in silence. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Update 🔄
Repository-side version maintenance: scan role configuration files for declared upstream versions and bump them in lockstep with new releases.
Declared version sources
A pin the Docker updater (image + version) and the repository updater
(repository + ref) do not reach names its upstream next to itself:
lmstudio:
app_version: 0.0.25-1
update:
key: app_version
type: http_regex
url: https://lmstudio.ai/install.sh
pattern: 'APP_VERSION="([0-9][0-9.-]*)"'
key names the pinned key and defaults to version; an entity with several
pins declares a list of such blocks. Types:
type |
Fields | Reads |
|---|---|---|
git_tags |
repository |
git ls-remote --tags |
registry_tags |
image |
the registry's v2 tag list |
npm |
package |
the npm registry |
http_regex |
url, pattern |
the first capture group of each match |
script |
path |
a role-local script printing versions |
match keeps only the versions carrying that prefix (and filters server-side
on Docker Hub), strip: true removes it again so a pin without the upstream's
v stays without it.
Run python -m cli.contributing.update.source --dry-run to list pending bumps;
the update-version-sources job of .github/workflows/cron-update.yml opens
the PRs, and tests/external/update/source/ warns about them.