agentsclimarketplace

Version constraints

Skill scagogogo/versions-skills/skills/version-constraints

AI-native version number toolkit in Go — Skills + MCP + SDK + CLI. Parse, compare, sort, group, check constraints & range-query version numbers. Works with Claude Code, Codex, Cursor, Windsurf, Cline, VS Code Copilot.

Install
npx -y skills add scagogogo/versions-skills --skill version-constraints

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Check whether a version satisfies a constraint expression (caret, tilde, wildcard, range operators). Use when resolving dependency compatibility, filtering versions by semver ranges, or working with constraint expressions that combine AND/OR logic.

SKILL.md

9.5 KB, as published. Nobody here has run it

Version Constraints

Setup: See /installation for one-time SDK/CLI/MCP install.
Layers: SDK (Go) → CLI (shell) → MCP (AI tools) — pick your entry point.

When to Use

  • You need to check if a version satisfies a constraint expression (e.g., ">=1.0.0,<2.0.0")
  • You are resolving dependency version compatibility
  • You need to filter versions by semver ranges (caret ^, tilde ~, wildcards x/*)
  • You are working with constraint expressions that combine AND (comma) / OR (||) logic

Decision Tree

Need to check version against constraints?
├─ Single constraint (e.g., ">=1.0.0")?       → ParseConstraint() + Constraint.Match()
├─ AND logic (comma-separated, e.g., ">=1.0.0,<2.0.0")?
│                                              → ParseConstraintSet() / default CLI
├─ OR logic (||-separated, e.g., ">=1.0.0 || >=3.0.0")?
│                                              → ParseConstraintUnion() / --type union
├─ Quick one-liner (parse + match)?            → Version.Matches(expr)
├─ Version-centric check?                      → Version.Satisfies(constraint)
└─ Filter a collection by constraint?          → FilterByConstraint() / versions filter --constraint

Constraint Operators Reference

OperatorMeaningExampleMatches
=Exact match=1.2.3Only 1.2.3
!=Not equal!=1.2.3Anything except 1.2.3
>Greater than>1.2.31.2.4, 2.0.0, ...
>=Greater or equal>=1.2.31.2.3, 1.2.4, ...
<Less than<2.0.01.9.9, 1.0.0, ...
<=Less or equal<=2.0.02.0.0, 1.9.9, ...
^Caret (compatible)^1.2.3>=1.2.3, <2.0.0
~Tilde (approximate)~1.2.3>=1.2.3, <1.3.0
x/X/*Wildcard1.x>=1.0.0, <2.0.0

Combining: comma , = AND, double-pipe || = OR. Spaces around operators are NOT supported: use >=1.0.0 not >= 1.0.0.

Caret ^ semantics: ^1.2.3 = >=1.2.3,<2.0.0; ^0.2.3 = >=0.2.3,<0.3.0 (more restrictive for 0.x); ^0.0.3 = >=0.0.3,<0.0.4.

Tilde ~ semantics: ~1.2.3 = >=1.2.3,<1.3.0 (patch-level changes only).

Wildcard semantics: 1.x = 1.X = 1.* = >=1.0.0,<2.0.0; 1.2.x = >=1.2.0,<1.3.0.

Task Patterns

Check if a version satisfies a range constraint

Goal: Is "1.5.0" within ">=1.0.0,<2.0.0"?

SDK approach:

cs, _ := versions.ParseConstraintSet(">=1.0.0,<2.0.0")
v := versions.NewVersion("1.5.0")
ok := cs.Satisfies(v) // true

// Or the one-liner:
ok, _ := versions.NewVersion("1.5.0").Matches(">=1.0.0,<2.0.0")

CLI approach:

versions constraint ">=1.0.0,<2.0.0" 1.5.0        # AND logic (default)
versions satisfies 1.5.0 ">=1.0.0,<2.0.0"          # version-centric

MCP approach:

{"tool": "version_constraint_check", "arguments": {"expression": ">=1.0.0,<2.0.0", "version": "1.5.0"}}

Check if a version satisfies OR logic constraints

Goal: Is "3.5.0" within ">=1.0.0,<2.0.0 || >=3.0.0"?

SDK approach:

cu, _ := versions.ParseConstraintUnion(">=1.0.0,<2.0.0 || >=3.0.0")
ok := cu.Satisfies(versions.NewVersion("3.5.0"))  // true
ok = cu.Satisfies(versions.NewVersion("2.5.0"))   // false

CLI approach:

versions constraint ">=1.0.0 || >=3.0.0" 3.5.0 --type union    # match (3.5.0 >= 3.0.0)
versions constraint ">=1.0.0 || >=3.0.0" 2.5.0 --type union    # no match

MCP approach:

{"tool": "version_constraint_check", "arguments": {"expression": ">=1.0.0 || >=3.0.0", "version": "3.5.0", "type": "union"}}

Use caret constraint

Goal: Check if "1.9.9" is compatible with "^1.2.3" (matches >=1.2.3, <2.0.0).

SDK approach:

c, _ := versions.ParseConstraint("^1.2.3")
c.Match(versions.NewVersion("1.9.9"))  // true
c.Match(versions.NewVersion("2.0.0"))  // false

// Caret with 0.x is more restrictive:
c2, _ := versions.ParseConstraint("^0.2.3")  // >=0.2.3, <0.3.0

CLI approach:

versions constraint "^1.2.3" 1.9.9 --type single    # true
versions constraint "^1.2.3" 2.0.0 --type single    # false

MCP approach:

{"tool": "version_constraint_check", "arguments": {"expression": "^1.2.3", "version": "1.9.9", "type": "single"}}

Use tilde constraint

Goal: Check if "1.2.9" is within patch-level range "~1.2.3" (matches >=1.2.3, <1.3.0).

SDK approach:

c, _ := versions.ParseConstraint("~1.2.3")
c.Match(versions.NewVersion("1.2.9"))  // true
c.Match(versions.NewVersion("1.3.0"))  // false

CLI approach:

versions constraint "~1.2.3" 1.2.9 --type single    # true
versions constraint "~1.2.3" 1.3.0 --type single    # false

MCP approach:

{"tool": "version_constraint_check", "arguments": {"expression": "~1.2.3", "version": "1.2.9", "type": "single"}}

Filter a version list by constraint

Goal: From ["0.5.0", "1.0.0", "1.5.0", "2.0.0"], keep only versions matching ">=1.0.0,<2.0.0".

SDK approach:

cs, _ := versions.ParseConstraintSet(">=1.0.0,<2.0.0")
versionList := versions.NewVersions("0.5.0", "1.0.0", "1.5.0", "2.0.0")
filtered := versions.FilterByConstraintSet(versionList, cs)
// filtered = [1.0.0, 1.5.0]

CLI approach:

versions filter --constraint ">=1.0.0,<2.0.0" 0.5.0 1.0.0 1.5.0 2.0.0

MCP approach:

{"tool": "version_filter", "arguments": {"versions": ["0.5.0", "1.0.0", "1.5.0", "2.0.0"], "constraint": ">=1.0.0,<2.0.0"}}

API Reference

SDK — Parsing Functions

// Parse a single constraint expression (e.g. ">=1.0.0", "^1.2.3", "~1.2.3")
func ParseConstraint(expr string) (*Constraint, error)

// Parse comma-separated AND constraints (e.g. ">=1.0.0,<2.0.0")
func ParseConstraintSet(expr string) (*ConstraintSet, error)

// Parse ||-separated OR constraint sets (e.g. ">=1.0.0,<2.0.0 || >=3.0.0")
func ParseConstraintUnion(expr string) (*ConstraintUnion, error)

SDK — Matching Methods

// Single constraint matching
func (c *Constraint) Match(v *Version) bool
func (c *Constraint) String() string

// ConstraintSet (AND logic) — all must match
func (cs *ConstraintSet) Match(v *Version) bool
func (cs *ConstraintSet) Satisfies(v *Version) bool   // alias for Match
func (cs *ConstraintSet) Len() int
func (cs *ConstraintSet) String() string

// ConstraintUnion (OR logic) — any set must match
func (cu *ConstraintUnion) Match(v *Version) bool
func (cu *ConstraintUnion) Satisfies(v *Version) bool // alias for Match
func (cu *ConstraintUnion) String() string

// Version-centric convenience methods
func (v *Version) Satisfies(constraint *Constraint) bool
func (v *Version) Matches(expr string) (bool, error)  // parse + match one-liner

SDK — Filter Functions

func FilterByConstraint(versions []*Version, constraint *Constraint) []*Version
func FilterByConstraintSet(versions []*Version, cs *ConstraintSet) []*Version

CLI Commands

# Check constraint — single type
versions constraint "<expr>" <version> --type single

# Check constraint — ConstraintSet (AND logic, default)
versions constraint "<expr>" <version>

# Check constraint — ConstraintUnion (OR logic)
versions constraint "<expr>" <version> --type union

# Version-centric check (auto-detects type)
versions satisfies <version> "<constraint-expression>"

# Filter by constraint — single
versions filter --constraint "<expr>" --constraint-type single <versions...>

# Filter by constraint — set (default)
versions filter --constraint "<expr>" <versions...>

# Filter by constraint — union
versions filter --constraint "<expr>" --constraint-type union <versions...>

Examples:

versions constraint ">=1.0.0,<2.0.0" 1.5.0         # AND logic
versions constraint ">=1.0.0 || >=3.0.0" 3.5.0 --type union
versions satisfies 1.5.0 ">=1.0.0,<2.0.0"
versions filter --constraint ">=1.0.0,<2.0.0" 0.5.0 1.0.0 1.5.0 2.0.0

MCP Tools

ToolArgumentsReturns
version_constraint_checkexpression: string, version: string, type?: string{matches: bool}
version_filterversions: string[], constraint?: string, stable?: bool, prerelease?: bool, major?: int, minor?: int, patch?: int, prefix?: string, suffix?: stringfiltered list

Cross-References

  • [[version-check]] — for simpler boolean type checks (IsStable, IsBeta, etc.)
  • [[version-comparison]] — for direct pairwise version comparison
  • [[version-range-query]] — for range queries on version collections
  • [[version-parsing]] — for parsing version strings before constraint checking

Important Notes

  • Caret ^ follows npm semver semantics: ^1.2.3 = >=1.2.3,<2.0.0, but ^0.2.3 = >=0.2.3,<0.3.0 (more restrictive for 0.x)
  • Tilde ~ allows patch-level changes only: ~1.2.3 matches 1.2.x but NOT 1.3.0
  • Wildcards x/X/* are equivalent: 1.x = 1.X = 1.*
  • ConstraintSet (comma) = AND, ConstraintUnion (||) = OR
  • Spaces around operators are NOT supported: use >=1.0.0 not >= 1.0.0
  • ParseConstraintSet wraps errors with context (parse constraint "BAD": ...); ParseConstraintUnion does NOT
  • CLI constraint type defaults to "set" (AND); use --type single for single constraint, --type union for OR logic

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.