Publishing a skill¶
Publishing turns a built dist/<name>/ into GitHub release
assets, following the release model. It is
driven by a GitHub Actions workflow in the skill's source repository — one
build-*skill*.yaml per repo today, all repeating the same logic.
What the workflow does¶
For each skill it publishes, the workflow:
- Computes build identity — short SHA, generation date, the rolling tag
<prefix>-YYYY.MM.DD-<sha7>, and the assetsha256. - Packages the
dist/<name>/tree into a.tar.gzand.zip. - Emits a manifest — the
version.json/latest.jsonpayload ({tag, source_commit, generated, sha256, asset_url}). - Publishes in the appropriate mode:
- rolling — create the dated prerelease, update the
<prefix>-latestpointer, and prune old rolling builds toKEEP_ROLLING; - tagged, repo-coupled — attach the assets to the repo's
v…release; - tagged, independently-versioned — publish under the skill's own
<skill>-vX.Y.Ztag namespace.
Which tag a tagged release lands on¶
This is the one decision that varies, and it follows the skill's versioning (see the release model):
| Skill versioning | Trigger | Tag the snapshot lands on |
|---|---|---|
| Repo-coupled | repo release: published |
the repo's own v… tag |
| Independently-versioned | the skill's own curated release | <skill>-vX.Y.Z (the skill's namespace) |
A client never has to care which of the two it is: any non-rolling tag
carrying the skill's asset tarball is simply a "release". The per-skill
prefix / rolling_re / pointer_tag in
SkillSpec already namespace everything per skill, so
independent tagged releases slot in without special handling.
Library boundary¶
Library boundary
The publishing orchestration stays in the workflow YAML — it is where
GitHub credentials, the releases API, and pruning naturally live. What the
library factors out are the reusable primitives the workflow currently
open-codes in bash/jq:
- the manifest schema and (de)serialization —
manifest.ReleaseManifest; - reading the build identity (
source_commit) back from a built skill —metadata.read_source_commit; - rolling-vs-release tag classification —
releases.classify.
In short: the library provides the manifest/identity primitives; the workflow orchestrates. This keeps the workflow thin and ensures the publisher and the client agree on one manifest shape.