一键导入
pi-extensions
Pi extension development master reference. Use when: building pi extensions, debugging extension behavior, or choosing the right pattern.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Pi extension development master reference. Use when: building pi extensions, debugging extension behavior, or choosing the right pattern.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | pi-extensions |
| description | Pi extension development master reference. Use when: building pi extensions, debugging extension behavior, or choosing the right pattern. |
| 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.
ARCHITECTURE.md §1–§5, then copy the matching pattern from PATTERNS.md.ANTI-PATTERNS.md first.references/startup-optimization.md — jiti bottleneck, .js vs .ts, discovery cost.PATTERNS.md §P12–§P14, then guides/02-paradigms.md for narrative.references/tui-beautiful-rendering.md — box drawing, overlays, badges, SVG widgets.references/extension-patterns-from-source.md — agent coordination, tasks, feeds.PATTERNS.md §P19–§P20, then guides/07-advanced-patterns.md.ANTI-PATTERNS.md §A2, then guides/05-rpc-mode.md.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 startup optimization, speed up extension loading
└─► references/startup-optimization.md
I need provider plugins, OAuth, overrides
└─► guides/07-advanced-patterns.md
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)
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)
| 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 |
| 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 |
| 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 |
references/startup-optimization.md | Startup perf: jiti transpilation, .js vs .ts, measuring bottlenecks |
| File | Topic |
|---|---|
tutorials/tool-browser.md | Build a searchable tool list with fuzzy filtering |
| File | Purpose |
|---|---|
examples/gallery.md | Annotated real-world extensions |
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.
// 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";
Use pi.registerProvider() for proxies, custom endpoints, or team-wide model configs. See PATTERNS.md §P19–P20 and guides/07-advanced-patterns.md.
Register a tool with the same name as a built-in (read, bash, edit, write) to wrap or replace it. See PATTERNS.md §P4.
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.
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