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
| Name | Description | Default | Type |
| --- | --- | --- | --- |
| clawhub-enabled | Publish tagged skill releases to ClawHub when CLAWHUB_TOKEN is available. | true | boolean |
| display-name | Display name for the skill on ClawHub. | $CI_PROJECT_TITLE | string |
| lint-enabled | Enable linting of SKILL.md and other skill files. | true | boolean |
| name | Name for the skill job. | $CI_PROJECT_NAME | string |
| needs | Jobs that this job depends on. | [] | array |
| owner | Owner for the skill. | string | |
| path | Path to the OpenClaw skill directory. The directory must contain SKILL.md. | . | string |
| rules | Rules for the skill job. Defaults to tag-only publishing. | [{"if":"$CI_COMMIT_TAG","when":"on_success"},{"when":"never"}] | array |
| slug | Slug for the skill. | string | |
| stage | The pipeline stage that the job belongs to. | deploy | string |
| tags | The runners that this job depends on. | [] | array |