packages/coding-agent/docs/skills.md
pi can create skills. Ask it to build one for your use case.
Skills are self-contained capability packages that the agent loads on-demand. A skill provides specialized workflows, setup instructions, helper scripts, and reference documentation for specific tasks.
Pi implements the Agent Skills standard, warning about violations but remaining lenient.
Security: Skills can instruct the model to perform any action and may include executable code the model invokes. Review skill content before use.
Pi loads skills from:
~/.pi/agent/skills/~/.agents/skills/.pi/skills/.agents/skills/ in cwd and ancestor directories (up to git repo root, or filesystem root when not in a repo)skills/ directories or pi.skills entries in package.jsonskills array with files or directories--skill <path> (repeatable, additive even with --no-skills)Discovery rules:
~/.pi/agent/skills/ and .pi/skills/, direct root .md files are discovered as individual skillsSKILL.md are discovered recursively~/.agents/skills/ and project .agents/skills/, root .md files are ignoredDisable discovery with --no-skills (explicit --skill paths still load).
To use skills from Claude Code or OpenAI Codex, add their directories to settings:
{
"skills": [
"~/.claude/skills",
"~/.codex/skills"
]
}
For project-level Claude Code skills, add to .pi/settings.json:
{
"skills": ["../.claude/skills"]
}
read to load the full SKILL.md (models don't always do this; use prompting or /skill:name to force it)This is progressive disclosure: only descriptions are always in context, full instructions load on-demand.
Skills register as /skill:name commands:
/skill:brave-search # Load and execute the skill
/skill:pdf-tools extract # Load skill with arguments
Arguments after the command are appended to the skill content as User: <args>.
Toggle skill commands via /settings in interactive mode or in settings.json:
{
"enableSkillCommands": true
}
A skill is a directory with a SKILL.md file. Everything else is freeform.
my-skill/
├── SKILL.md # Required: frontmatter + instructions
├── scripts/ # Helper scripts
│ └── process.sh
├── references/ # Detailed docs loaded on-demand
│ └── api-reference.md
└── assets/
└── template.json
---
name: my-skill
description: What this skill does and when to use it. Be specific.
---
# My Skill
## Setup
Run once before first use:
```bash
cd /path/to/skill && npm install
```
## Usage
```bash
./scripts/process.sh <input>
```
Use relative paths from the skill directory:
See [the reference guide](references/REFERENCE.md) for details.
Per the Agent Skills specification:
| Field | Required | Description |
|---|---|---|
name | Yes | Max 64 chars. Lowercase a-z, 0-9, hyphens. Must match parent directory. |
description | Yes | Max 1024 chars. What the skill does and when to use it. |
license | No | License name or reference to bundled file. |
compatibility | No | Max 500 chars. Environment requirements. |
metadata | No | Arbitrary key-value mapping. |
allowed-tools | No | Space-delimited list of pre-approved tools (experimental). |
disable-model-invocation | No | When true, skill is hidden from system prompt. Users must use /skill:name. |
Valid: pdf-processing, data-analysis, code-review
Invalid: PDF-Processing, -pdf, pdf--processing
The description determines when the agent loads the skill. Be specific.
Good:
description: Extracts text and tables from PDF files, fills PDF forms, and merges multiple PDFs. Use when working with PDF documents.
Poor:
description: Helps with PDFs.
Pi validates skills against the Agent Skills standard. Most issues produce warnings but still load the skill:
Unknown frontmatter fields are ignored.
Exception: Skills with missing description are not loaded.
Name collisions (same name from different locations) warn and keep the first skill found.
brave-search/
├── SKILL.md
├── search.js
└── content.js
SKILL.md:
---
name: brave-search
description: Web search and content extraction via Brave Search API. Use for searching documentation, facts, or any web content.
---
# Brave Search
## Setup
```bash
cd /path/to/brave-search && npm install
```
## Search
```bash
./search.js "query" # Basic search
./search.js "query" --content # Include page content
```
## Extract Page Content
```bash
./content.js https://example.com
```