SkillHub

Review changes before they ship

How a review-required SkillHub registry holds a version's dist-tags until a reviewer approves — reviewing the SKILL.md diff like code.

On a review-required registry, publishing and promoting are two separate acts. A publish still creates the immutable, content-hashed version — the bytes are stored and addressable. But the version's dist-tag (usually latest) is withheld: it stays null until an admin reviews the change and approves the promotion. Nobody, not even the person who published, can move latest themselves.

This guide walks the whole loop across both surfaces: a publisher ships a version from the CLI, an admin reads the server-computed diff in the dashboard review queue, and the tag lands only on approval. If you want the concept first, read Review-required registries; this page is the hands-on walkthrough.

Review is a registry-level setting. A registry either requires review or it doesn't — you don't opt in per publish. See Registries for where the setting lives.

The two halves of a review-required publish

A normal registry moves the tag the moment a publish finalizes. A review-required registry splits that in two:

  1. Publish creates the version and stores its bytes. This part is unchanged — same skillhub publish command, same immutable snapshot.
  2. Promotion — moving latest (or any release tag) onto that version — is held back for a reviewer. Until an admin approves, the tag is null.

The version is safe and durable the instant publish succeeds. It just isn't the one your teammates install yet, because latest hasn't moved.

A publisher can never move latest on a review-required registry. The version publishes, but its release tag stays withheld until an admin approves it. This is the guarantee the whole flow rests on — there is no --force around it and no CLI approve command.

Step 1 — Publish into a review-required registry

Publish the version

Publish exactly as you always would. A single-directory publish runs promptless — validate, scan, pack, upload, finalize:

skillhub publish --to @studio/design-systems

On a review-required registry the version is created and stored, but the requested release tag does not move.

Read the withheld tag in the output

The withholding is visible, not silent. In --json, the per-skill tag field comes back null — the version published, but the tag stayed put — and scanStatus may read pending while the server-side scan finishes:

skillhub publish --to @studio/design-systems --json
{
  "ok": true,
  "data": {
    "published": [
      {
        "ref": "@studio/design-systems/tokens-workflow",
        "version": "2.1.0",
        "tag": null,
        "scanStatus": "pending",
        "warnings": []
      }
    ],
    "skipped": []
  }
}

A null tag here is not an error. It means "the version is up, awaiting review." (For the full shape of this payload, see the publish CLI reference.)

Optionally publish under a prerelease tag

Publishers can move prerelease tags themselves (like beta) — only the release channel is gated. If you want teammates to be able to opt into the unreviewed build by tag while it waits, publish it under a prerelease:

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

That prerelease tag moves immediately; latest still needs an admin.

Step 2 — Find the version in the review queue

Review and promotion are a dashboard flow — there is no CLI review or approve command. Open the registry's dashboard page to reach its queue. You can jump straight there from the terminal:

skillhub open @studio/design-systems

The review queue is a registry-level list of the prerelease versions awaiting promotion. The just-published version shows up here as an awaiting submission:

The dashboard review queue for a registry, listing a newly published version awaiting promotion, with its skill name, submitted version, and a review action.

The review queue showing one awaiting submission: the pending version, who published it, and the entry point to read its diff before approving.

Step 3 — Read the change as a diff, like code

Because every version is a content-hashed snapshot, a reviewer can read the change between the pending version and what's currently promoted as a server-computed red/green diff — reviewing a skill update exactly like a code review. Open the pending version's comparison to see what actually moved.

The diff has two layouts, and you can toggle between them:

  • Unified — additions and removals interleaved in one column.
  • Split — the old version on the left, the new on the right, side by side.

Toggling a skill's version diff between Unified and Split layouts, showing the same SKILL.md change rendered both ways.

The unified view stacks the change inline — quickest for a short SKILL.md edit, where you just want to read the removed lines against the added ones:

A server-computed unified diff of the changed SKILL.md between two versions, red removals above green additions, with a files-changed summary.

The diff is server-computed from the two stored snapshots — it's the same content the registry hashed on publish, not a re-render. Reviewing versions this way is the subject of its own guide: Browse and compare versions.

Step 4 — Approve (or request changes)

From the queue, an admin acts on the pending version:

  • Approve — moves the release tag onto the version, optionally with a comment. This is the promotion that makes it the new latest.
  • Request changes — notifies the publisher that the version needs work before it can be promoted.

Approval is a dist-tag move: latest lands on the approved version in the registry's version timeline, exactly like a manual tag move from the Versions tab.

A skill's Versions tab: the version timeline with the latest dist-tag pinned to the newly approved version, showing where tags move on the skill page.

The whole chain — publish, review, and the approval or change request — is recorded in the registry's audit log. Nothing about a promotion is silent; there's a durable record of who approved what, and when.

The CLI side of the two roles

There's no approve subcommand, but the CLI still has a role on each side of the gate. The publisher publishes; an admin can move the tag from the terminal once a version is approved, which is the same dist-tag move the dashboard performs on approval.

Publish the version (and, if useful, tag it as a prerelease for early adopters). The release tag stays withheld regardless:

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

You can watch a version's promotion state after the fact from the installed side, too — skillhub list reports the resolved version and its ref for what a scope actually pulled in.

Whether a registry requires review is a property of the registry, surfaced as reviewRequired in its data (visible via skillhub registry list and on the dashboard). Set it when you create the registry or manage it from the dashboard — you can't toggle it on a single publish.

Where to go next

On this page