Extension 是 Pi 最核心的扩展点,允许用 TypeScript 模块注册自定义工具、命令、事件处理器、UI 组件等。

基本结构

export default function (pi: ExtensionAPI) {
  // 注册自定义工具
  pi.registerTool({ name: "deploy", ... });
 
  // 注册斜杠命令
  pi.registerCommand("stats", { ... });
 
  // 监听事件
  pi.on("tool_call", async (event, ctx) => { ... });
}

默认导出也可以是 async 函数,Pi 会在启动继续之前等待异步工厂完成(适合一次性初始化,如提前拉取远程模型列表后调用 pi.registerProvider())。

能力范围

Extension 可以做到的事情(几乎无限):

  • 自定义工具(或完全替换内置工具)
  • 实现 sub-agents 和 plan mode
  • 自定义 compaction 和摘要逻辑
  • 权限门控和路径保护
  • 自定义编辑器和 UI 组件(状态栏、页眉、页脚、Overlay)
  • Git checkpoint 和自动提交
  • SSH 和沙箱执行
  • MCP server 集成
  • 让 pi 看起来像 Claude Code
  • 游戏(甚至 Doom 能跑)

加载位置

按优先级(从低到高):

  1. ~/.pi/agent/extensions/ — 全局用户扩展
  2. .pi/extensions/ — 项目级扩展(需要项目信任)
  3. pi -e <path|npm|git> — CLI 一次性加载

与 Skills 的区别

维度ExtensionSkill
语言TypeScriptMarkdown
能力完整 API 访问注入到 context 的指令
复杂度高,需编译低,纯文本
适用场景工具、UI、事件处理使用流程、工作方法

Pi Packages

Extension 可以通过 pi-packages 发布和安装,npm 或 git 均可:

pi install npm:@foo/pi-tools
pi install git:github.com/user/repo

安全警告:Pi 包以完整系统权限运行,Extension 可执行任意代码。安装第三方包前请审查源码。