Pi:打包与分享AI扩展的命令行工具

badlogic 发布于 2026-07-17 阅读 11

Pi 是一个用于打包和分享 AI 扩展、技能、提示模板和主题的命令行工具。本文详细介绍了如何通过 npm、Git 或本地路径安装和管理包,包括 CLI 命令、包源类型、包结构(支持 manifest 或约定目录)、依赖管理(运行 npm install)、过滤加载特定资源,以及全局与项目级别的作用域与去重。文章还提供了创建包的步骤、安全警告和 SSH 示例,适合希望构建和分发 AI 组件(如 Agent 扩展)的开发者阅读。

Pi 包

Pi 包打包了扩展、技能、提示模板和主题,这样你就可以通过 npm 或 git 分享它们。一个包可以在 package.jsonpi 键下声明资源,或者使用约定目录。

目录

安装与管理

安全: 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 引用
pi update --extensions      # 仅更新包并同步固定的 git 引用
pi update --models          # 仅刷新模型目录
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 本身,请参阅快速开始

默认情况下,installremove 写入用户设置(~/.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 --extensionspi update --all)时跳过。
  • 用户安装放在 ~/.pi/agent/npm/ 下。
  • 项目安装放在 .pi/npm/ 下。
  • settings.json 中设置 npmCommand,以将 npm 包的查找和安装操作固定到特定的封装命令,例如 miseasdf

示例:

{
  "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/repogit@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)来快速失败。
  • 引用是固定的标签或提交。pi update --extensionspi update --all 不会将它们移动到更新的引用,但会同步现有克隆到配置的引用。
  • 使用 pi install git:host/user/repo@new-ref 来更新设置并将现有包移动到新的固定引用。
  • 克隆到 ~/.pi/agent/git/<host>/<path>(全局)或 .pi/git/<host>/<path>(项目)。
  • 当同步导致检出变化时,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

## 带有版本引用
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 标签的包。添加 videoimage 字段来展示预览:

{
  "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。显示为静态预览。

如果两者都设置,视频优先。

包结构

约定目录

如果没有 pi 清单,pi 会从以下目录自动发现资源:

  • extensions/ 加载 .ts.js 文件
  • skills/ 递归查找 SKILL.md 文件夹,并加载顶级 .md 文件作为技能
  • prompts/ 加载 .md 文件
  • themes/ 加载 .json 文件

依赖

第三方运行时依赖应该放在 package.jsondependencies 中。不注册扩展、技能、提示模板或主题的依赖也放在 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-tuitypebox

其他 pi 包必须打包在你的 tarball 中。将它们添加到 dependenciesbundledDependencies,然后通过 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 config 从全局设置(~/.pi/agent/settings.json)开始;按 Tab 键在全局和项目本地模式之间切换。使用 pi config -l 从项目覆盖(.pi/settings.json)开始,继承的全局资源会变暗显示。

作用域与去重

包可以同时出现在全局和项目设置中。如果同一个包同时出现在两者中,则项目条目优先,除非项目条目的 autoload: false,在这种情况下它作为对全局条目的增量应用。身份由以下因素决定:

  • npm: 包名
  • git: 不带引用的仓库 URL
  • local: 解析后的绝对路径
  • 原文链接: github.com/badlogic/pi-m...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~

相关文章

0 条评论