Pi extension development master reference. Use when: building pi extensions, debugging extension behavior, or choosing the right pattern.
Resources
13Install
npx skillscat add dwsy/pi-extensions-skill Install via the SkillsCat registry.
Pi Extensions โ LLM Master Reference
Start Here (Read Order)
| Priority | Document | Read When |
|---|---|---|
| 1 | `ARCHITECTURE.md` | Before writing ANY extension code |
| 2 | `PATTERNS.md` | When you need copy-paste code for a specific task |
| 3 | `ANTI-PATTERNS.md` | When reviewing or debugging extension code |
The guides/ and references/ directories contain deeper narratives and examples. Use them after scanning the three master docs above.
One-Line Directives
- Writing a new extension? โ Read `ARCHITECTURE.md` ยง1โยง5, then copy the matching pattern from `PATTERNS.md`.
- Extension is broken? โ Check `ANTI-PATTERNS.md` first.
- Need TUI component? โ `PATTERNS.md` ยงP12โยงP14, then `guides/02-paradigms.md` for narrative.
- Need beautiful TUI rendering? โ `references/tui-beautiful-rendering.md` โ box drawing, overlays, badges, SVG widgets.
- Need multi-agent patterns? โ `references/extension-patterns-from-source.md` โ agent coordination, tasks, feeds.
- Need custom provider/OAuth? โ `PATTERNS.md` ยงP19โยงP20, then `guides/07-advanced-patterns.md`.
- Need RPC safety? โ `ANTI-PATTERNS.md` ยงA2, then `guides/05-rpc-mode.md`.
Master Decision Trees
Which document do I need?
I need to understand how extensions work
โโโบ ARCHITECTURE.md
I need working code to copy
โโโบ PATTERNS.md
I need to know what NOT to do
โโโบ ANTI-PATTERNS.md
I need a step-by-step first tutorial
โโโบ guides/01-quickstart.md
I need deep narrative on tools/events/UI
โโโบ guides/02-paradigms.md
I need state persistence strategies
โโโบ guides/03-state.md
I need production architecture (workflows, memory)
โโโบ guides/04-production.md
I need RPC mode specifics
โโโบ guides/05-rpc-mode.md
I need pi internals (loader, runner, binding)
โโโบ guides/06-internals.md
I need provider plugins, OAuth, overrides
โโโบ guides/07-advanced-patterns.mdWhich paradigm should I use?
Need LLM to perform action? โโโโโโโโโโโโโโโโบ Tool (PATTERNS P2โP5)
Need user to type /command? โโโโโโโโโโโโโโโโบ Command (PATTERNS P6โP7)
Need keyboard shortcut? โโโโโโโโโโโโโโโโโโโโบ Shortcut (guides/02-paradigms.md)
Need to react to system events? โโโโโโโโโโโโบ Event handler (PATTERNS P8โP11)
Need interactive TUI? โโโโโโโโโโโโโโโโโโโโโโบ Custom UI (PATTERNS P12โP14)
Need to inject a model provider? โโโโโโโโโโโบ registerProvider (PATTERNS P19โP20)
Need to override a built-in tool? โโโโโโโโโโบ Tool override (PATTERNS P4)Which state persistence mechanism?
State should go to LLM context? โโโโโโโโโโโโบ sendMessage({ customType, ... })
State is extension-private? โโโโโโโโโโโโโโโโบ appendEntry("customType", data)
State is user preference (cross-project)? โโบ File in ~/.pi/agent/
State is project-local? โโโโโโโโโโโโโโโโโโโโบ File in .pi/
State is temporary cache? โโโโโโโโโโโโโโโโโโบ Local variable (reconstructed on reload)Document Map
Master References (Read First)
| File | Purpose | Length |
|---|---|---|
| `ARCHITECTURE.md` | Mental model, execution flow, exact event semantics | ~9KB |
| `PATTERNS.md` | 38 copy-paste patterns with exact imports | ~17KB |
| `ANTI-PATTERNS.md` | 15 common mistakes with corrections | ~9KB |
Progressive Guides (Read as Needed)
| File | Level | Topic |
|---|---|---|
| `guides/01-quickstart.md` | ๐ฑ Beginner | First extension in 5 minutes |
| `guides/02-paradigms.md` | ๐ฟ Intermediate | Tools, commands, events, UI deep dive |
| `guides/03-state.md` | ๐ณ Advanced | Persistent and branch-resilient state |
| `guides/04-production.md` | ๐๏ธ Expert | Multi-mode, workflows, memory systems |
| `guides/05-rpc-mode.md` | ๐ RPC | RPC mode compatibility and degradation |
| `guides/06-internals.md` | โ๏ธ Internals | Loader, runner, event dispatch, binding |
| `guides/07-advanced-patterns.md` | ๐ Advanced | Provider plugins, OAuth, tool overrides, file mutation queues |
Reference Docs
| File | Purpose |
|---|---|
| `references/api.md` | Complete API documentation |
| `references/api-quickref.md` | Quick reference card |
| `references/events.md` | Full event reference |
| `references/examples.md` | Additional code examples |
| `references/ui-components.md` | TUI component catalog |
| `references/extension-patterns-from-source.md` | Multi-agent, diff rendering, config patterns from 10+ extensions |
| `references/tui-beautiful-rendering.md` | Beautiful TUI: box drawing, transcript, overlays, badges, SVG/HTML widgets |
Tutorials
| File | Topic |
|---|---|
| `tutorials/tool-browser.md` | Build a searchable tool list with fuzzy filtering |
Examples
| File | Purpose |
|---|---|
| `examples/gallery.md` | Annotated real-world extensions |
5-Minute Quick Test
Prerequisite: This skill is installed (cloned to
skills/pi-extensions).
Below creates a sample Extension, placed in~/.pi/agent/extensions/โ separate from the skill directory.
# 1. Create the sample extension file
mkdir -p ~/.pi/agent/extensions
cat > ~/.pi/agent/extensions/hello.ts << 'EOF'
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 from Pi Extensions!", "success");
},
});
}
EOF
# 2. Test with -e flag (temporary load)
pi -e ~/.pi/agent/extensions/hello.ts
# Then type: /hello
#
# Tip: Extensions in ~/.pi/agent/extensions/ are auto-discovered.
# The -e flag is only needed for temporary testing.Quick Import Cheat Sheet
// Core types
import type { ExtensionAPI, ExtensionContext } from "@earendil-works/pi-coding-agent";
// Schema
import { Type } from "@sinclair/typebox";
import { StringEnum } from "@earendil-works/pi-ai";
// TUI
import { Container, Text, SelectList } from "@earendil-works/pi-tui";
// Utilities
import { withFileMutationQueue } from "@earendil-works/pi-coding-agent";
import { isToolCallEventType, isBashToolResult } from "@earendil-works/pi-coding-agent";Hot Topics
Dynamic Model Injection
Use pi.registerProvider() for proxies, custom endpoints, or team-wide model configs. See `PATTERNS.md` ยงP19โP20 and `guides/07-advanced-patterns.md`.
Tool Override
Register a tool with the same name as a built-in (read, bash, edit, write) to wrap or replace it. See `PATTERNS.md` ยงP4.
Parallel Execution Safety
Custom tools that mutate files must use withFileMutationQueue() to avoid race conditions with built-in edit/write. See `PATTERNS.md` ยงP5 and `ANTI-PATTERNS.md` ยงA4.
RPC Safety
ctx.hasUI is true in RPC, but custom() returns undefined. Use select/confirm/input/editor for blocking dialogs that work in both modes. See `ANTI-PATTERNS.md` ยงA2 and `guides/05-rpc-mode.md`.
Master references: ARCHITECTURE ยท PATTERNS ยท ANTI-PATTERNS