plugin-release-check
GitHub检查插件本地版本、GitHub Release与注册表版本的一致性,处理版本漂移。
Trigger Scenarios
Install
npx skills add VoidenHQ/voiden --skill plugin-release-check -g -y
SKILL.md
Frontmatter
{
"name": "plugin-release-check",
"description": "Use whenever a plugin under plugins\/<name> is updated\/pushed, or whenever asked to write a changelog\/release for the app or a plugin. Cross-checks each plugin's local package.json version against its latest GitHub release and the plugin-registry entry, so a bumped-but-unreleased plugin doesn't get silently left behind."
}
Plugin release / registry consistency check
Each directory under plugins/<name>/ is its own independent git repo (its
own GitHub remote, its own versioning, its own release cycle) — separate from
the main Voiden app. The central source of truth for what's actually
installable is plugins/plugin-registry/extensions.json, one object per
plugin, keyed by id, with at least repo (owner/name), version, and
voidenVersion.
These three numbers can drift out of sync:
plugins/<name>/package.json→version(local working tree)- The plugin repo's latest GitHub release tag
plugins/plugin-registry/extensions.json→ that plugin's"version"field
How to check
For each plugin directory with a package.json and a git remote (skip
plugin-registry itself):
# 1. Local version
node -p "require('./plugins/<name>/package.json').version"
# 2. Repo remote -> owner/name
git -C plugins/<name> remote get-url origin # https://github.com/<owner>/<repo>.git
# 3. Latest GitHub release tag for that repo
gh release view --repo <owner>/<repo> --json tagName -q .tagName
# 4. Registry's recorded version for that plugin id
# (read plugins/plugin-registry/extensions.json, find the matching "id")
Strip the leading v from the release tag before comparing against semver
in package.json.
Decision tree per plugin
-
local version > latest release tag → the working tree has unreleased changes. Ask the user to cut a new GitHub release (with the built runner/asset, matching how existing releases for that repo are structured) for that plugin — do not create the release yourself, this is a user-confirmed action. Mention that
extensions.jsonwill also need itsversion(andvoidenVersion, if the plugin's minimum Voiden version requirement changed) updated to match once the release exists. -
local version == latest release tag, but registry version differs → the release exists but the registry hasn't caught up. Update
plugins/plugin-registry/extensions.jsonfor that plugin's entry:version(andvoidenVersionif it changed in this release) — bring it in sync with the actual release tag. This repo is also independent, so committing/pushing there needs the same confirmation as any other push. -
local version < latest release tag → the local checkout is just stale (someone released ahead of what's checked out here). Not actionable — no release or registry change needed, just note it if relevant.
-
all three match → nothing to do.
Notes
- Never create a GitHub release on the user's behalf — always ask first, same as any other push/release action.
extensions.jsonedits are a normal file edit (fine to make directly), but committing/pushing them in theplugin-registryrepo is a separate confirm-first step.- This check pairs naturally with [[release-changelog]] — when asked to write a changelog entry (app or plugin), also run this check so a plugin version bump that shipped code but never got tagged isn't missed.
Version History
- a490675 Current 2026-09-27 21:08


