Overview
Skills are reusable prompt packages that live as directories — each containing aSKILL.md file with frontmatter and supporting files. There are two workflows:
- Author & publish — write skills in your repo, push them to Runlayer with
skills push(typically in CI) - Consume & install — add published skills to your project or global config with
skills add
Authoring skills
Directory structure
SKILL.md frontmatter
| Field | Required | Notes |
|---|---|---|
name | Yes | Human-readable label shown in the UI |
description | No | Short summary, max 1024 characters |
skills/ticket-triage) is the stable sync key. Renaming the directory creates a new skill; changing name in frontmatter updates the display name.
Supported file types: .md, .markdown, .txt, .sh, .py, .js, .ts.
Publishing
Push skills from a local directory to the Runlayer API.| Flag | Description |
|---|---|
--namespace, -N | Required. Groups skills by repo (e.g. myorg/my-repo) |
--public | Publish pushed skills as public |
--host, -H | Runlayer host URL. Also reads RUNLAYER_HOST env var |
--secret, -s | API key override (optional; prefer uvx runlayer login). Also reads RUNLAYER_API_KEY |
--dry-run, -n | Show what would change without making API calls |
--prune | Delete remote skills whose directories no longer exist locally |
PATH | Root directory to scan. Defaults to . |
Examples
How push works
- CLI walks the directory tree looking for
SKILL.mdfiles - Each
SKILL.mdmust havenamein its YAML frontmatter (directories without it are skipped) - The directory path relative to root becomes the skill’s
path— this is the stable key used to match local and remote skills - For each discovered skill:
- New path — creates the skill and uploads all files
- Existing path — compares name, description, and file contents; updates only what changed
- Remote-only path (with
--prune) — deletes the skill from Runlayer
GitHub Actions
RUNLAYER_HOST and RUNLAYER_API_KEY as repository secrets.
The paths filter ensures the workflow only runs when files under skills/ change. The --prune flag removes skills from Runlayer when their directory is deleted from the repo.
Security scanning
When you upload or update skill files — via the CLI (skills push), the API, or the web UI — Runlayer automatically scans each file with ToolGuard. The scan runs before the file is accepted, and the results (per-file risk scores and an overall skill classification) are shown in the skill detail page.
If ToolGuard flags a file at elevated risk, you can review the findings before deciding whether to keep or replace it. See ToolGuard Models for details on risk tiers and configuration.
Scanning from the CLI
You can also scan one skill, or a folder containing many skills, on-demand before publishing:| Flag | Description |
|---|---|
--name | Override skill name sent to the security scan API for single-skill scans only |
--fail-on | Exit non-zero on warn or block result (useful in CI) |
--secret, -s | API key override. Also reads RUNLAYER_API_KEY |
--host, -H | Runlayer host URL. Also reads RUNLAYER_HOST |
skills push, but without uploading. Single-skill scans return one scan object; multi-skill scans return a JSON object with a skills array. Use --fail-on block in CI pipelines to gate merges on security scan results.
Installing
Add published skills from the Runlayer API to your local project or global config.| Flag | Description |
|---|---|
source | Optional when --all is used. Skill UUID or namespace (e.g. Org/Repo) |
--all | Install all accessible skills across namespaces |
--skill | Filter by skill name within a namespace |
--client, -c | Target editor client: claude_code (default), cursor, goose, opencode, vscode |
--global, -g | Install globally instead of project-level |
--dry-run, -n | Show what would be installed without writing files |
--secret, -s | API key override (optional; prefer uvx runlayer login). Also reads RUNLAYER_API_KEY |
--host, -H | Runlayer host URL. Also reads RUNLAYER_HOST env var |
Examples
--all sees the same skill name in multiple namespaces, install fails with an explicit error. Re-run with a namespace SOURCE (or UUID) to disambiguate.
Typical output:
File layout
Skills are written to a canonical directory and, for some clients, an editor-specific directory via symlink:| Scope | Canonical | Claude Code | Cursor | Goose / VS Code / OpenCode |
|---|---|---|---|---|
| Project | .agents/skills/ | .claude/skills/ | .cursor/skills/ | .agents/skills/ (direct) |
| Global | ~/.agents/skills/ | ~/.claude/skills/ | ~/.cursor/skills/ | ~/.agents/skills/ (direct) |
.runlayer/skill-lock.yml (or ~/.runlayer/skill-lock.yml for global) tracks installed skills and versions per client.
Symlink behavior
- Skill files are stored in the canonical directory (
.agents/skills/or~/.agents/skills/). - Claude Code and Cursor directories contain symlinks to the canonical location. Goose, VS Code, and OpenCode use the canonical directory directly.
uvx runlayer skills remove --client <client>removes only that client’s symlink + lockfile entry.- Canonical files are kept while any other client still references the same skill.
- Canonical files are deleted only when the last client reference is removed.
Interactive find
Browse and install skills interactively from the terminal.| Flag | Description |
|---|---|
--secret, -s | API key override. Also reads RUNLAYER_API_KEY |
--host, -H | Runlayer host URL. Also reads RUNLAYER_HOST |
Managing installed skills
List
| Flag | Description |
|---|---|
--client, -c | Target editor client: claude_code (default), cursor, goose, opencode, vscode |
--global, -g | List global skills |
list, update, and remove are scoped to the selected --client.
Update
Pull the latest versions of installed skills from the API.| Flag | Description |
|---|---|
--skill | Update a specific skill only |
--client, -c | Target editor client (default: claude_code) |
--global, -g | Update global skills |
--dry-run, -n | Show what would change without writing files |
--secret, -s | API key override (optional; prefer uvx runlayer login). Also reads RUNLAYER_API_KEY |
--host, -H | Runlayer host URL. Also reads RUNLAYER_HOST env var |
Remove
| Flag | Description |
|---|---|
name | Optional when --all is used. Skill name to remove |
--all | Remove all installed skills in the selected scope |
--yes | Skip confirmation prompt for --all |
--client, -c | Target editor client (default: claude_code) |
--global, -g | Remove from global skills |