Overview
Skills are reusable prompt packages that live as directories — each containing aSKILL.md file with frontmatter and supporting files. Publish a skill once and your team can install the same vetted, version-controlled instructions into Claude Code, Cursor, and other clients. 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
The directory path (e.g.
skills/ticket-triage) is the stable sync key. Renaming the directory creates a new skill; changing name in frontmatter updates the display name.
Supported UTF-8 text file types: .css, .csv, .html, .js, .json, .md, .markdown, .py, .sh, .svg, .ts, .txt, .xml, .yaml, .yml. CSV files have table previews; isolated HTML/SVG previews require a low-risk security scan. Binary files such as PNGs and PDFs are not supported.
Publishing
Push skills from a local directory to the Runlayer API.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.
Creating from the web UI
From the Skills page, click Add skill. You can:- Import from GitHub — paste a public GitHub repo URL (e.g.
github.com/owner/repoorgithub.com/owner/repo/tree/branch/path). Runlayer discovers skill directories (each with aSKILL.md) and lets you choose which to import. Imported skills are linked to their source URL and can be re-synced when the upstream changes. - Upload files — drag a
.zip/.skillarchive (must contain aSKILL.mdat the top or inside a single root folder), a single.md/.markdownfile (treated asSKILL.md), or a folder. - Use a template — start from a pre-built skill template.
Using skills in AI clients
Open a skill and click Add to Client. If the skill is included in Runlayer Plugin, Runlayer recommends that shared connection first. Click Connect to use Runlayer Plugin, or continue with the client-specific instructions to install the skill directly. To work with several skills at once:- Open Skills and select the skill cards.
- Click Add to Client in the selection bar.
- Use Runlayer Plugin, add the skills to an editable Plugin, or create a new Plugin.
Security scanning
When you upload or update skill files — via the CLI (skills push), web import from GitHub, 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.
After upload, the skill detail page displays the overall security score and per-file risk indicators. Click the score badge to open a dialog showing per-file findings — grouped by concern level — so you can review exactly which lines triggered each score.
If a skill was created before security scanning was enabled, or if you want to re-evaluate after updating files, skill owners and admins can trigger a manual rescan from the skill detail page using the Scan security button.
The platform enforces a configurable skill risk policy based on the scan result. By default, high-risk skills are blocked and medium-risk skills show a warning. Admins can adjust these actions in Settings → Security Scanners. See ToolGuard Models — Skill Risk Policy for details.
Why a skill gets blocked
The scan combines ToolGuard’s ML threat classification with additional deterministic checks. Each finding appears in the findings dialog with a severity, the matched content, and a line reference, and is tagged with a risk category from the ToolGuard threat taxonomy (for example Data Exfiltration, Privilege Escalation, Context Poisoning, Destructive Action, or Guardrail Bypass) — so reviewers see what was flagged and why, not just a score. Per-file results map to the same risk tiers used across ToolGuard. A serious finding raises the file to High risk — rejected by the default policy — while lower-severity findings surface as a Medium-risk warning and import with a warning by default. Typical High-risk triggers include hidden-character obfuscation, piping downloads into a shell, and referencing credential material; typical warnings include network access, destructive commands, dynamic code execution, and encoded payloads. When an admin accepts a medium-risk warning, the acceptance is recorded in the Audit Log.Scanning from the CLI
You can also scan one skill, or a folder containing many skills, on-demand before publishing:
This calls the same ToolGuard security scan API used by
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.
CI gate example
Run the scan as a required check on pull requests so a risky skill never reachesmain:
--fail-on block exits non-zero when any skill classifies as block-level risk, failing the check; use --fail-on warn to also fail on medium-risk warnings. The scan only evaluates files — it does not upload or publish — so pair it with the push workflow above (scan on pull_request, publish on push to main).
Installing
Add published skills from the Runlayer API to your local project or global config.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:
Goose, VS Code, and OpenCode read from the canonical directory directly — no symlinks are created for these clients.
A lockfile at
.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, Codex, 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.Managing installed skills
List
list, update, and remove are scoped to the selected --client.
Update
Pull the latest versions of installed skills from the API.Do installed skills auto-update? No. Files written by
skills add are pinned in the lockfile (.runlayer/skill-lock.yml) and do not change until you run skills update (or re-run runlayer setup sync, which your MDM can schedule). If you connect the org-wide Runlayer Plugin instead of installing files, the skills a user can access are resolved on each request, so published changes are reflected automatically with no reinstall.Remove
Remove examples
From repo to Claude and Cursor
How a skill authored in a repo ends up in a teammate’s Claude Code or Cursor session, end to end:- Author & publish — write skills under
skills/in your repo and push them withuvx runlayer skills push --namespace <org/repo>, typically from CI (see GitHub Actions above). Every upload is security scanned before it is accepted. - (Optional) Bundle into a plugin — select skills on the Skills page and click Add to Client, create a Plugin from the Plugins page, or use
uvx runlayer plugins push. See Plugins. - Install on dev machines — each developer runs
skills addorplugins add, which writes files into the client-specific directories (.claude/skills/,.cursor/skills/, etc. — see File layout) so the client picks them up. - Or roll out org-wide — admins enable Auto Sync on connectors or plugins in the dashboard; developers (or your MDM) run
uvx runlayer setup sync, which auto-detects installed clients (Claude Desktop, Claude Code, Cursor, VS Code, and more) and writes the config. See Auto-Sync to Clients. - Or use Runlayer Plugin — instead of installing skills file-by-file, connect the org-wide Runlayer Plugin MCP entrypoint, which exposes every skill the user can access through search tools.
Related Resources
Plugins
Bundle skills and connectors into a single reusable toolset
Agents
Attach skills to agents to extend what they can do
ToolGuard
How skill files are scanned for security risks
Connectors
Add and manage MCP servers your skills can use