SkillHub

Versions & dist-tags

How immutable semver versions and mutable dist-tags work, how to set them, and how installs resolve ranges versus channels.

Every publish creates an immutable version. Dist-tags are the mutable pointers that name the channels people install from. Understanding the split is the key to a clean release process.

Immutable versions

Each publish produces a content-hashed (sha256) tarball snapshot at an exact semver version. Once published, a version never changes — the bytes behind @studio/design-systems/tokens-workflow@1.2.0 are frozen forever. History is linear per skill: no branches, no merges, just an ordered list of versions.

Because versions are content-hashed, installs can verify the exact bytes they resolved match what the registry recorded.

Setting the version

The version comes from your SKILL.md metadata by default. Override it for a single publish with --version:

skillhub publish --version 2.0.0 --to @studio/design-systems

--version can't be combined with a bulk multi-directory publish — an exact version only makes sense for one skill at a time.

Dist-tags

A dist-tag is a named, movable pointer to a version. The common ones are latest and beta, and you can create custom tags too. Tags are how consumers subscribe to a channel without pinning to an exact version.

By default, a successful publish moves latest to the new version. Point it somewhere else with --tag:

skillhub publish --tag beta --to @studio/design-systems

To move a tag onto an already-published version, use skillhub tag:

skillhub tag @studio/design-systems/tokens-workflow@1.2.3 latest
skillhub tag @studio/meta/changelog-writer@2.1.0 beta

The result reports where the tag landed and where it pointed before:

{
  "ok": true,
  "data": {
    "ref": "@studio/design-systems/tokens-workflow",
    "tag": "latest",
    "version": "1.2.3",
    "previousVersion": "1.2.2"
  }
}

On a registry that requires review, publishers can only move prerelease tags — promoting a version to latest is an admin action. See Review-required flow.

The skill page mirrors this split: the Versions tab lists every immutable version on a timeline with the dist-tags that currently point at each one.

The Versions tab of a skill page: a timeline of published versions annotated with the dist-tags pointing at each release

How installs resolve versions

When someone installs your skill, they resolve either a dist-tag or a semver range:

  • A dist-tag (@beta) tracks a channel — it follows wherever the tag moves.
  • A range (@^1.2.0) tracks the newest version inside the range.
  • An exact version (@1.2.0) or --pin locks to one version that never moves without explicit action.
skillhub install @studio/design-systems/tokens-workflow@beta
skillhub install @studio/design-systems/tokens-workflow@^1.2.0
skillhub install @studio/design-systems/tokens-workflow@1.2.0 --pin

This is why the version/tag split matters: publishing a new version doesn't break anyone until you move a tag or they widen a range. You can ship 2.0.0 under beta, let it settle, then promote it to latest when you're confident.

A typical release cadence

Publish the next version under a prerelease tag:

skillhub publish --version 2.0.0-rc.1 --tag beta --to @studio/design-systems

Let beta subscribers try it.

When it's ready, promote it to latest:

skillhub tag @studio/design-systems/tokens-workflow@2.0.0-rc.1 latest

On this page