Install
openclaw skills install @elisabeth15501/version-decideDecide the NEXT SemVer version number from the SCOPE OF CODE CHANGES for an upcoming release, and output a single, unambiguous recommendation with cited standard clauses. Use only when the user is deciding which version to assign to a release they are about to cut (e.g. "what version should this release be", "major or minor or patch", "what to bump in 0.x", "how to advance alpha/beta/rc", "is this breaking"). NOT for: looking up an already-published version, asking the install command, CalVer/date-based versioning, or general release/project-management questions. Ships a deterministic arithmetic core: same input always yields the same output.
openclaw skills install @elisabeth15501/version-decideGive developers (especially beginners) a single, unambiguous version-number recommendation, with the reasoning behind it.
These 5 rules apply in every turn of the conversation. If this section is no longer visible in context, re-read this file.
scripts/semver_check.py; never do it by hand. If the script fails, show the raw error to the user verbatim — never fabricate a version number.SKILL.md and references/ are English by default (ClawHub Natural Language Policy: English default).scripts/semver_check.py localizes its reasons / error messages / level descriptions via --lang en|zh|auto. auto detects LC_ALL/LC_MESSAGES/LANG and falls back to en. JSON keys (current/next/level/...) stay English; values follow --lang.scripts/semver_check.py (zero-dependency Python) computes every version via deterministic arithmetic. The model must never compute a version by hand; if the script errors, show the raw error and ask, do not fabricate a number.scripts/measure_skill.py (SKILL.md compliance metrics) and scripts/test_semver_check.py (regression tests) are maintenance tools, not part of the runtime decision flow. They are never invoked to answer a release-decision question.LC_ALL / LC_MESSAGES / LANG environment variables, and only to choose output language. It does not read secrets, network configuration, or any other environment data.package.json, pyproject.toml, git tag). No package installation, no repository mutation, no file deletion, no network calls. The declared tools are used solely for version discovery and running this skill's own scripts; this skill does not grant — and you should not grant — write, network, or package-management permissions on its behalf.One execution = Step 1 → 5. Each step has its own fallback; never skip a step, and never rely on a later turn to re-read this file.
| Input | How to get it | Fallback when missing |
|---|---|---|
| Current version | Inspect the project (commands below) | Ask: "Which version is currently released?" |
| Public API boundary | Library: read exports. App: ask "what is used externally" | If never declared → tell the user "define the public API first"; give no number this round |
| Change list + breaking? | Use AskUserQuestion or ask directly | If the user is vague → ask concrete questions one by one; never assume "probably not breaking" |
| Target ecosystem / channel | Ask | If the user doesn't care → assume npm semantics, but state this assumption in the output |
Commands to find the version (by priority):
cat package.json 2>/dev/null | grep '"version"' # npm / Node
cat pyproject.toml 2>/dev/null | grep -i version # Python
grep -m1 '^VERSION' Makefile 2>/dev/null # C/C++
git tag --sort=-v:refname 2>/dev/null | head -5 # git tag
grep -rnoE "v[0-9]+\.[0-9]+\.[0-9]+" --include=*.md . | head # version comments / docs
Six breaking-change checks (ask each; never default to "not breaking"): ① Public export removed/renamed? ② Function signature changed (params added/removed/reordered/typed/returned)? ③ Does a previously-successful call now fail or throw? ④ Config/env/CLI arg/default changed? ⑤ Minimum dependency version raised? ⑥ Type or field narrowed?
Item ⑥ is the easiest to miss — narrowing generics or input types is breaking even if it still compiles. Item ③ is the easiest to understate — semantic change is sneakier than a signature change.
⛔ If Step 1 reveals the project is CalVer (major segment ≥ 20 and looks like a year, e.g. 26.04): stop and tell the user this skill does not apply; do not force SemVer rules on it.
| Change | Level |
|---|---|
| Remove/rename public export, signature change, behavior change, config change, module deletion | major |
| Deprecate (still usable), add public API, relax dependency constraint | minor |
| Internal refactor, perf (behavior preserved), bug fix, security fix (no API change) | patch |
| Docs / tests / CI / formatting only | none (no release) |
Same batch is graded by major > minor > patch precedence: feat + fix → minor; feat + break → major.
Deprecation must be minor (SemVer §7 mandates it), even before removal.
Full table and gray zones: references/decision-tables.md.
Fallback: if unsure whether something is breaking → grade it major and state "if confirmed not breaking, downgrade to minor", handing the decision back to the user rather than assuming the optimistic case.
python scripts/semver_check.py analyze <current> --changes "change1" "change2" ...
Change-spec syntax (the actual format of scripts/semver_check.py):
| Form | Level |
|---|---|
feat: add JSON output / feature: | minor |
fix: / bugfix: / perf: / security: / refactor: | patch |
docs: / test: / ci: / chore: / style: / build: | none |
deprecate: mark old API deprecated | minor |
revert: revert style tweak | patch |
revertbreak: undo 2.0 field rename | major |
break: parse() arg order changed | forces major |
feat@break: swap the underlying driver | forces major |
Flags: --pre alpha|beta|rc (open/advance pre-release) | --pre alpha.2 (explicit sequence) | --build 20261008.a1 (build metadata, no precedence effect) | --rebase (target a different version number within a pre-release line)
Other subcommands: check <ver> (validate + ecosystem hints) | next <ver> --level <lvl> (lvl includes stable for 0.x graduation) | explain (reasoning chain only) | compare a b (precedence)
Add --lang en|zh|auto to any subcommand to localize the output.
Fallback: if the script errors, show the raw error and fix the input per the message — never bypass the script and compute by hand (that is exactly the uncertainty this skill removes).
Fixed four-part form: conclusion → reasoning → to confirm → next command.
Version recommendation: 1.3.3 -> 1.4.0
Decision: minor (backward-compatible new feature)
Reasoning:
- Add character Yang Tinghe -> new content, backward-compatible, minor (SemVer §7)
- Add achievement system -> same
- By major > minor > patch precedence -> minor, patch reset to zero
Need your confirmation:
- Does the new achievement reuse the existing localStorage key? (reuse would corrupt old players' progress and may be breaking)
Next step:
- python scripts/semver_check.py next 1.4.0 --level minor
Unconfirmed gray zones (security fix, perf refactor, raised env requirement, save-format change) must be called out; see §4 of references/decision-tables.md.
references/standards-comparison.md; don't re-repeat this file.| Situation | Conclusion |
|---|---|
| 0.x stage | Use npm/Cargo semantics: a minor bump IS the breaking boundary (^0.2.3 caps at 0.3.0). So 0.3.1 + feature → 0.4.0, not 0.3.2 |
| 0.x → 1.0.0 | Not auto-derived. It is the explicit graduation action --level stable, meaning "API is stable from now on"; a human must confirm the API is frozen |
| Within a pre-release line | core unchanged (SemVer §9: pre-release not guaranteed to satisfy the normal version's compatibility) → keep breaking during alpha without raising major. Only alpha→beta→rc→stable, step by step; skipping is rejected by the script |
| Revert a non-breaking change | patch |
| Revert a breaking change | major — compatibility is broken a second time; dependents just recovered and are broken again |
| Deprecate an API | minor (spec-mandated); major when actually removed. Gives downstream a minor cycle as migration window |
| Edit README / comments | no release needed |
| Change an already-published version | forbidden (§3); only release a new version |
| Coexist multiple majors | Go v2+ must change the module path (/v2); npm uses dist-tag (next/beta); Python relies on virtualenvs; Rust resolves multiple versions under one package name |
1.0.0rc1, not 1.0.0-rc.1. check detects this. epoch (1!1.0) only when switching numbering schemes.| File | Purpose | When to read |
|---|---|---|
references/decision-tables.md (EN) / decision-tables.zh.md | Full decision table, confirmation checklist, edge cases, gray zones | when a grading is unclear |
references/standards-comparison.md (EN) / standards-comparison.zh.md | SemVer / Conventional Commits / PEP 440 / Cargo / Go / CalVer official text and conflicts | when the user asks for the basis |
references/i18n-plan.md | i18n implementation plan (ClawHub NL-policy compliance) | when changing languages/structure |
scripts/semver_check.py | Decision arithmetic core (zero-dependency) | required in Step 3 |
scripts/test_semver_check.py | 37 regression tests | after editing the script |
scripts/measure_skill.py | Measures this file's compliance metrics | after editing this file |
locales/en.json / locales/zh.json | User-facing copy tables | when adding/changing messages |