Project: Versioning Policy
Show or change which targets of this repository skip a GitHub tag, a release or a changelog, in .claude/versioning.json
Files1
View on GitHubSKILL.mdskills/project-versioning_policy/SKILL.md
GitHubProject: Versioning Policy
One file says which targets skip which release surface: .claude/versioning.json at the repository root, read by safe-version-next.sh (tags), pr-land (tags and releases) and doc-changelog (releases and changelogs). This skill is its setter. The script is ~/.claude/library/scripts/versioning-policy.py; every write goes through it, never by hand, so the file stays in its canonical form.
{
"omit-gh-tag": [],
"omit-release": ["root"],
"omit-changelog": []
}
A target is root or a plugin's name from .claude-plugin/marketplace.json; the script refuses any other name when that manifest exists. Two rules the readers apply: a target in omit-gh-tag gets no release either, since a release is created on a tag; a changelog stands alone, so a target keeps its changelog with no tag, or its tag with no changelog.
Arguments
Parse show | omit <tag|release|changelog> <target> [local] | allow <tag|release|changelog> <target> [local] as whitespace-separated words:
| Form | Does |
|---|---|
show, or nothing |
prints the merged policy: the tracked file plus the local twin |
omit <kind> <target> |
adds the target to that kind's list |
allow <kind> <target> |
removes it |
a trailing local |
writes the local twin instead of the tracked file, for a policy that is one machine's and not the repository's. The twin is versioning.local.json inside the repository's git directory (.git/versioning.local.json for a plain checkout), so every worktree shares it and nothing can commit it |
<kind> is tag, release or changelog. Any other first word is an error, never a guess.
Steps
python3 ~/.claude/library/scripts/versioning-policy.py showfirst, whatever the arguments, so the change is shown against what stands; when the checkout is not on main,git fetch origin mainand thenshow --ref origin/mainbeside it, since that is the policy the next landing reads; a repository with noorigingetsunknown ref origin/mainfrom the script, which is reported as it stands, not retried.- For
omitorallow: say in one line what will change and what it means at the next landing (omit release root: the root keeps itsv*tags and its changelog, andpr-landcreates no GitHub release for it), then runpython3 ~/.claude/library/scripts/versioning-policy.py set <omit|allow> <kind> <target> [--local]. The script prints what it wrote, or that nothing changed; relay it, and relay its note when a tag omission still covers a release the user just allowed. - Show the file as it now stands (
git diff -- .claude/versioning.jsonfor the tracked file). The write is the user's to commit: a policy change is achore(versioning): ...commit on its own, and it reachesmainthe way any change to this repository does.
Output
## Versioning Policy
| List | Targets |
|---|---|
| omit-gh-tag | (none) |
| omit-release | root |
| omit-changelog | (none) |
followed by the one-line change and the script's own output when something was written.
Never
Edit .claude/versioning.json by hand; add a key the script does not know; put the policy in settings.json, which is Claude Code's own file with its own schema; delete a tag or a release here (that is a separate, deliberate act, never a side effect of changing the policy).