A collection of skills and extensions for pi coding agent.
Skills are self-contained capability packages that the agent loads on-demand. They provide specialized workflows, setup instructions, helper scripts, and reference documentation for specific tasks.
See the Agent Skills specification for the standard format.
Each skill is a directory containing a SKILL.md file:
skills/
└── my-skill/
├── SKILL.md # Required: frontmatter + instructions
├── scripts/ # Helper scripts
├── references/ # Detailed docs loaded on-demand
└── assets/ # Templates and other assets
| Skill | Description |
|---|---|
| opencode-go-models | Model routing guide for OpenCode Go subscription — quickly pick the right model (GLM-5.1, MiMo-V2-Pro, Kimi K2.5, etc.) for any task |
| uv-python | Use uv instead of pip/python/venv — run scripts with uv run, add deps with uv add, inline script metadata for standalone scripts |
- Create a new directory under
skills/:mkdir skills/my-skill - Create
SKILL.mdwith proper frontmatter:--- name: my-skill description: What this skill does and when to use it. --- # My Skill ## Usage Instructions here...
- Add any helper scripts, references, or assets
Extensions are TypeScript modules that extend pi's behavior. They can subscribe to lifecycle events, register custom tools, add commands, and more.
Each extension is a .ts file in the extensions/ directory:
extensions/
└── my-extension.ts # Single file extension
| Extension | Description |
|---|---|
| answer | Extract questions from assistant responses into an interactive Q&A — use /answer command or Ctrl+. shortcut |
| tokens-per-second | Display real-time token generation speed (TPS) during assistant streaming — use /tps command to toggle or show last stats |
| uv | Redirect Python tooling to uv — blocks pip/poetry/venv and redirects python through uv run |
- Create a new file under
extensions/:extensions/my-extension.ts - Export a default function that receives
ExtensionAPI:
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
pi.registerCommand("hello", {
description: "Say hello",
handler: async (args, ctx) => {
ctx.ui.notify(`Hello ${args || "world"}!`, "info");
},
});
}See the pi extensions documentation for full details.
Symlink the repo directories into ~/.pi/agent/ so pi auto-loads everything. This way, adding a new extension or skill to the repo automatically makes it available in pi.
REPO=/path/to/pi-coding-agent-skills
# Replace existing directories with symlinks
rm -rf ~/.pi/agent/extensions # back up any standalone extensions first!
rm -rf ~/.pi/agent/skills
ln -s $REPO/extensions ~/.pi/agent/extensions
ln -s $REPO/skills ~/.pi/agent/skills
ln -s $REPO/intercepted-commands ~/.pi/agent/intercepted-commandsNote: The
intercepted-commandssymlink is required by theuvextension, which resolves shim paths relative to__dirname/../intercepted-commands. Without it, the PATH-based interception won't work.
If you have non-repo extensions (e.g., omarchy-system-theme.ts), move them to a separate directory and reference them in settings.json:
{
"extensions": ["/home/pmalla/.pi/agent/extensions-local/omarchy-system-theme.ts"]
}MIT