skills/ registry. Custom skills work exactly like built-in skills — they are loaded at startup, delivered to the model via the same per-backend mechanisms, and managed with the same slash commands.
Creating a skill
Create the skill directory
Add a new directory under
skills/ using a lowercase, hyphenated identifier. The directory name is used as the fallback skill name if skill.json does not specify one.Create SKILL.md
Create
skills/summarizer/SKILL.md with the instructions the model will read. Include YAML frontmatter with name and description matching skill.json exactly — Pi reads the frontmatter directly.skill.json schema
All fields and their behavior:Field reference
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Lowercase letters, numbers, and hyphens only. Must be unique across all loaded skills. |
description | string | Yes | One-sentence description. Shown in /skills output and in the Codex catalog prompt. |
scope | "one-shot" | "sticky" | No | Defaults to "one-shot". Use "sticky" to keep the skill active for the whole conversation after it triggers. |
triggers | string[] | No | Phrases that auto-activate the skill. Matching is case-insensitive and substring-based. |
requires | string[] | No | Informational tags listing what capabilities the skill needs (e.g. "files", "shell", "memory"). Not enforced at runtime. |
disableModelInvocation | boolean | No | Set to true to hide the skill from the model entirely. The skill is loaded but never included in prompts or catalogs. |
adapters | object | No | Per-backend configuration. Each key is "pi", "codex", or "local". |
adapters.<backend>.enabled | boolean | No | Set to false to exclude this skill for that specific backend. Defaults to true. |
adapters.<backend>.extraPrompt | string | No | Additional instruction appended to the skill’s inline prompt for that backend. Use it to handle backend-specific limitations. |
Scope behavior
one-shot: the skill is included for the single request that matched its trigger. It does not persist to the next message.sticky: the skill is saved to the conversation’sactive-skills.jsonstate file on first trigger and remains active until you run/skill remove <name>or/skill clear.
SKILL.md format
TheSKILL.md file has two parts: YAML frontmatter and a markdown body.
nameanddescriptionmust matchskill.jsonexactly — Pi reads the frontmatter directly and logs a warning if they diverge.- Both fields are required for Pi compatibility.
- Open with one sentence on when to use the skill.
- Use numbered steps for workflows that have a fixed order.
- Use bullet lists for principles or guardrails without a strict order.
- Keep the instructions actionable — tell the model what to do, not just what the skill is.
- Reference relative paths (e.g. to config files or example directories) when useful. The gateway resolves relative paths against the skill’s directory.
Backend compatibility notes
Pi
Pi
Pi receives
SKILL.md as a native Pi skill file. The frontmatter name and description are read directly by Pi. Use adapters.pi.extraPrompt for any Pi-specific instruction that does not belong in the shared skill body.Codex
Codex
Codex receives a catalog listing all available skills, then reads
SKILL.md on demand when a skill is relevant. This means the full instruction body is only loaded when needed. Use adapters.codex.extraPrompt to add a short Codex-specific note without duplicating it in SKILL.md.Local
Local
The local backend inlines the full skill contents into the system prompt for every request where the skill is active. Keep
SKILL.md concise for local skills to avoid bloating the prompt. If a skill is not useful for conversational-only models, set adapters.local.enabled to false.Loading skills from external directories
If you maintain skills outside the project (shared across multiple Nuggets instances, or in a private repo), pointAGENT_SKILL_PATHS at those directories:
- An absolute path:
/home/you/shared-skills - A home-relative path:
~/team-skills - A path relative to the project root
skill.json), a parent directory of multiple skill directories, or an individual .md file for a simple markdown-only skill.
When two skills share the same name, the one loaded first wins. Skills from
AGENT_SKILL_PATHS are loaded before the built-in registry, so an external skill can override a built-in one by name.Activating and managing your skill
Once the gateway restarts with your skill in place, use slash commands to manage it:/skill use for trigger-based activation unless you want to force the skill on before a trigger fires.