Skip to main content

Skill component

Publish an OpenClaw skill as a versioned .skill file in the publishing project's GitLab Package Registry. The component can also publish tagged releases to ClawHub.

Publish a skill​

Place SKILL.md and any scripts, references, or other required files in one directory. The directory name becomes the skill package name. For example, skills/my-skill produces the package skill-my-skill.

Add the component to the publishing project's .gitlab-ci.yml:

include:
- component: $CI_SERVER_FQDN/xrow-public/ci-tools/skill@stable
inputs:
owner: my-owner
slug: my-skill
path: skills/my-skill

Create a tag such as v1.2.3. The job creates release/my-skill-v1.2.3.skill and uploads it as version v1.2.3 of skill-my-skill. The archive is a ZIP file with my-skill/SKILL.md and the skill's supporting files. The job also retains the archive as a pipeline artifact for one week.

The component always publishes the archive to the project's GitLab Package Registry. It also publishes to ClawHub on tagged pipelines when CLAWHUB_TOKEN is set. Set clawhub-enabled: false if ClawHub publishing is not wanted.

The default rules publish only on tags. If custom rules enable a non-tag run, the version is 0.0.0-<short commit SHA>. Only letters, digits, dots, hyphens, and underscores are accepted in the archive name and version. The same version identifies the archive and the registry package. Repeating a publication with identical content succeeds without uploading another copy; different content at the same version fails. Do not reuse a version for changed content.

The archive excludes .git metadata and its generated release/ output. Symlinks are rejected so a package cannot read files outside the selected directory.

Download a specific version​

The package is stored in the publishing project's Package Registry, not its Container Registry. In a CI job with access to that project, set PUBLISHER_PROJECT_ID to its numeric project ID and download the exact version:

PUBLISHER_PROJECT_ID=123456
SKILL_VERSION=v1.2.3
curl --fail --location \
--header "JOB-TOKEN: ${CI_JOB_TOKEN}" \
--output "my-skill-${SKILL_VERSION}.skill" \
"${CI_API_V4_URL}/projects/${PUBLISHER_PROJECT_ID}/packages/generic/skill-my-skill/${SKILL_VERSION}/my-skill-${SKILL_VERSION}.skill"
unzip -l "my-skill-${SKILL_VERSION}.skill"

The listing should contain my-skill/SKILL.md and the supporting files. The consuming project's CI job token must be allowed to read packages from the publishing project. Earlier versions remain available at their own versioned URLs.

Inputs​

NameDescriptionDefaultType
------------
clawhub-enabledPublish tagged skill releases to ClawHub when CLAWHUB_TOKEN is available.trueboolean
display-nameDisplay name for the skill on ClawHub.$CI_PROJECT_TITLEstring
lint-enabledEnable linting of SKILL.md and other skill files.trueboolean
nameName for the skill job.$CI_PROJECT_NAMEstring
needsJobs that this job depends on.[]array
ownerOwner for the skill.string
pathPath to the OpenClaw skill directory. The directory must contain SKILL.md..string
rulesRules for the skill job. Defaults to tag-only publishing.[{"if":"$CI_COMMIT_TAG","when":"on_success"},{"when":"never"}]array
slugSlug for the skill.string
stageThe pipeline stage that the job belongs to.deploystring
tagsThe runners that this job depends on.[]array