Pi 可以帮助你创建 Pi 包。让它打包你的扩展、技能、提示模板或主题。
Pi 包
Pi 包会打包扩展、技能、提示模板和主题,以便你通过 npm 或 git 分享它们。包可以在 package.json 的 pi 键下声明资源,也可以使用约定目录。
目录
安装和管理
安全性: Pi 包会以完整系统访问权限运行。扩展会执行任意代码,技能可以指示模型执行任何操作,包括运行可执行文件。安装第三方包前请先审查源代码。
pi install npm:@foo/bar@1.0.0
pi install git:github.com/user/repo@v1
pi install https://github.com/user/repo # 原始 URL 也可用
pi install /absolute/path/to/package
pi install ./relative/path/to/package
pi remove npm:@foo/bar
pi list # 显示设置中已安装的包
pi update # 仅更新 pi
pi update --all # 更新 pi、更新包,并协调固定的 git ref
pi update --extensions # 仅更新包并协调固定的 git ref
pi update --self # 仅更新 pi
pi update --self --force # 即使当前已安装也重新安装 pi
pi update npm:@foo/bar # 更新单个包
pi update --extension npm:@foo/bar
这些命令用于管理 Pi 包,pi update 可以更新 Pi CLI 安装。要卸载 Pi 本身,请参阅 快速开始。
默认情况下,install 和 remove 会写入用户设置(~/.pi/agent/settings.json)。使用 -l 可改为写入项目设置(.pi/settings.json)。项目设置可以与团队共享,并且在项目受信任后,Pi 会在启动时自动安装任何缺失的包。
如果想在不安装的情况下试用某个包,请使用 --extension 或 -e。这只会为当前运行安装到临时目录:
pi -e npm:@foo/bar
pi -e git:github.com/user/repo
包来源
Pi 在设置和 pi install 中接受三种来源类型。
npm
npm:@scope/pkg@1.2.3
npm:pkg
- 带版本的规范会被固定,并且包更新(
pi update --extensions、pi update --all)会跳过它们。 - 用户安装位于
~/.pi/agent/npm/下。 - 项目安装位于
.pi/npm/下。 - 在
settings.json中设置npmCommand,可将 npm 包查找和安装操作固定到特定包装命令,例如mise或asdf。
示例:
{
"npmCommand": ["mise", "exec", "node@20", "--", "npm"]
}
git
git:github.com/user/repo@v1
git:git@github.com:user/repo@v1
https://github.com/user/repo@v1
ssh://git@github.com/user/repo@v1
- 没有
git:前缀时,只接受协议 URL(https://、http://、ssh://、git://)。 - 有
git:前缀时,接受简写格式,包括github.com/user/repo和git@github.com:user/repo。 - HTTPS 和 SSH URL 都受支持。
- SSH URL 会自动使用你配置的 SSH 密钥(遵循
~/.ssh/config)。 - 对于非交互式运行(例如 CI),你可以设置
GIT_TERMINAL_PROMPT=0来禁用凭据提示,并设置GIT_SSH_COMMAND(例如ssh -o BatchMode=yes -o ConnectTimeout=5)以快速失败。 - refs 是固定的标签或提交。
pi update --extensions和pi update --all不会将它们移动到更新的 refs,但会将现有克隆协调到配置的 ref。 - 使用
pi install git:host/user/repo@new-ref更新设置,并将现有包移动到新的固定 ref。 - 克隆到
~/.pi/agent/git/<host>/<path>(全局)或.pi/git/<host>/<path>(项目)。 - 当协调过程改变 checkout 时,Pi 会重置并清理克隆,然后在存在
package.json时运行npm install。
SSH 示例:
# git@host:path 简写(需要 git: 前缀)
pi install git:git@github.com:user/repo
# ssh:// 协议格式
pi install ssh://git@github.com/user/repo
# 带版本 ref
pi install git:git@github.com:user/repo@v1.0.0
本地路径
/absolute/path/to/package
./relative/path/to/package
本地路径指向磁盘上的文件或目录,并会在不复制的情况下添加到设置中。相对路径会相对于它们所在的设置文件解析。如果路径是文件,它会作为单个扩展加载。如果路径是目录,Pi 会使用包规则加载资源。
创建 Pi 包
向 package.json 添加 pi 清单,或使用约定目录。包含 pi-package 关键字以便被发现。
{
"name": "my-package",
"keywords": ["pi-package"],
"pi": {
"extensions": ["./extensions"],
"skills": ["./skills"],
"prompts": ["./prompts"],
"themes": ["./themes"]
}
}
路径相对于包根目录。数组支持 glob 模式和 !exclusions。
图库元数据
包图库 会显示标记有 pi-package 的包。添加 video 或 image 字段以显示预览:
{
"name": "my-package",
"keywords": ["pi-package"],
"pi": {
"extensions": ["./extensions"],
"video": "https://example.com/demo.mp4",
"image": "https://example.com/screenshot.png"
}
}
- video:仅支持 MP4。在桌面端,悬停时自动播放。点击会打开全屏播放器。
- image:PNG、JPEG、GIF 或 WebP。显示为静态预览。
如果两者都已设置,video 优先。
包结构
约定目录
如果不存在 pi 清单,Pi 会从这些目录自动发现资源:
extensions/加载.ts和.js文件skills/递归查找SKILL.md文件夹,并将顶层.md文件作为技能加载prompts/加载.md文件themes/加载.json文件
依赖
第三方运行时依赖应放在 package.json 的 dependencies 中。不注册扩展、技能、提示模板或主题的依赖也应放在 dependencies 中。当 Pi 从 npm 或 git 安装包时,它会运行 npm install,因此这些依赖会自动安装。
Pi 为扩展和技能捆绑核心包。如果你导入其中任何一个,请在 peerDependencies 中使用 "*" 范围列出它们,并且不要捆绑它们:@earendil-works/pi-ai、@earendil-works/pi-agent-core、@earendil-works/pi-coding-agent、@earendil-works/pi-tui、typebox。
其他 Pi 包必须捆绑在你的 tarball 中。将它们添加到 dependencies 和 bundledDependencies,然后通过 node_modules/ 路径引用它们的资源。Pi 使用独立的模块根加载包,因此单独安装不会冲突或共享模块。
示例:
{
"dependencies": {
"shitty-extensions": "^1.0.1"
},
"bundledDependencies": ["shitty-extensions"],
"pi": {
"extensions": ["extensions", "node_modules/shitty-extensions/extensions"],
"skills": ["skills", "node_modules/shitty-extensions/skills"]
}
}
包过滤
使用设置中的对象形式过滤包加载的内容:
{
"packages": [
"npm:simple-pkg",
{
"source": "npm:my-package",
"extensions": ["extensions/*.ts", "!extensions/legacy.ts"],
"skills": [],
"prompts": ["prompts/review.md"],
"themes": ["+themes/legacy.json"]
}
]
}
+path 和 -path 是相对于包根目录的精确路径。
- 省略某个键会加载该类型的全部内容。
- 使用
[]会不加载该类型的任何内容。 !pattern会排除匹配项。+path强制包含精确路径。-path强制排除精确路径。- 过滤器叠加在清单之上。它们会缩小已允许内容的范围。
启用和禁用资源
使用 pi config 启用或禁用来自已安装包和本地目录的扩展、技能、提示模板和主题。全局(~/.pi/agent)和项目(.pi/)作用域均适用。
作用域和去重
包可以同时出现在全局和项目设置中。如果同一个包同时出现在两者中,项目条目优先。身份由以下内容确定:
- npm:包名
- git:不含 ref 的仓库 URL
- local:解析后的绝对路径