发一句 "hi",就消耗掉当天 10% 的模型配额;MCP 服务器空挂着不做事,常驻占用 15% 左右的上下文窗口;Plan Mode、Subagents 听起来高级,本质上只是上下文管理的技巧。Claude Code、Cursor、Copilot——它们都是黑盒。系统提示词里写了什么你不知道,.env 何时被读取你无法控制。每一个"高级功能"的背后,都在悄悄吃掉你看不见的上下文配额。
那么问题来了:为了让 AI 辅助编程,你真的需要这么重的工具吗?
有一个叫 pi 的开源项目,给出了一个完全不同的答案。
pi 是什么:一个完全透明的 AI Coding Agent CLI
pi 是一个开放、模块化的 AI 编程命令行工具。它的核心理念是:把所有接口和 hooks 完全开放,提供 100% 的定制能力。具体来说,它提供四层可定制机制:
- 可扩展(Extensions):用 TypeScript 编写插件,拦截每一次工具调用,在 AI 执行前进行审查
- 可定制(Prompts):将工程规范、代码风格、最佳实践编写为 Prompt 模板,每次对话自动注入
- 可复用(Skills):将常用的复杂工作流打包为 Skill,让 AI 按照标准流程自动执行
- 可分发(Packages):打包成 npm 包,一行命令分享给团队
你甚至可以用 pi 来改造 pi 本身。
下面以一个叫 safe-coder 的安全防护配置包为例,逐一拆解这些机制的实现。
安装与启动
前提条件很简单:Node.js(建议 LTS 版本)和 npm/pnpm/yarn。全局安装 pi 后就能直接使用 pi 命令。
pi 支持从 npm 直接安装配置包,比如安装 safe-coder 后,它的所有扩展、Skill、Prompt 模板会自动加载到 pi 中。在项目目录中启动 pi,它会自动扫描配置,加载所有扩展和 Skill,进入交互界面。
Extensions:给 AI 加装安全门禁
Extension 是 pi 最核心的能力。你可以用 TypeScript 编写函数,监听 AI 的每一次工具调用,然后决定:放行、拦截、还是弹出确认框让用户决定。
每个 Extension 是一个默认导出的函数,接收 ExtensionAPI 对象。文件支持直接用 TypeScript 编写,无需编译——pi 内部使用 jiti 即时加载。
来看两个实际的例子。
权限门(Permission Gate) 包含两层防护:一是危险命令检测,拦截 rm -rf、sudo、chmod 777 等高危操作并弹出确认框;二是工作目录边界保护,AI 尝试读写 pi 启动目录之外的文件时,必须先经过确认。
路径保护(Protected Paths) 则更细粒度:对 .env 文件的任何操作全部拦截,对 .git/ 和 node_modules/ 只拦截写入和编辑操作。
想想看,如果你用 Claude Code 让 AI 帮你重构项目,它突然去改了你的 .env 文件怎么办?有了这层拦截机制,你至少能在执行前看到并确认。
注册 Extension 非常简单,pi 启动时会自动扫描 extensions/ 目录下的所有 .ts 文件并加载。
Prompt 模板:把工程规范变成 AI 的行为准则
这个设计很巧妙。你可以为不同任务类型定义专属的系统提示词,当 AI 执行某类任务时,对应的 Prompt 模板自动注入上下文。
每个模板是一个 Markdown 文件,用 YAML frontmatter 声明描述,正文是提示词内容,$@ 作为用户输入的占位符。
比如你写一个代码审查模板 prompts/review.md,里面定义好你团队的审查标准——安全检查、性能考量、代码风格要求。之后每次让 AI 做 code review,这些规范都会自动带上。再写一个代码实现模板 prompts/implement.md,定义实现代码时必须遵守的原则。
这其实解决了一个很现实的问题:团队里每个人用 AI 编程时的"标准"不一样,产出质量参差不齐。有了 Prompt 模板,标准就被固化下来了。
Skills:渐进式披露的能力包
Skill 是 pi 对 Agent Skills 标准的实现。它本质上是一个自包含的能力包:将某类任务的完整工作流、所需脚本、参考文档打包在一起,AI 按需加载,按步骤执行。
它的工作原理值得注意:
- 启动时,pi 扫描所有 Skill 目录,只读取每个 Skill 的名称和描述注入系统提示词
- 当用户任务匹配某个 Skill 时,AI 自动加载完整的
SKILL.md文件 - AI 按照 Skill 中的指令,使用相对路径调用 Skill 自带的脚本和资源
这种机制叫"渐进式披露"(Progressive Disclosure)——平时只占用少量上下文,需要时才加载全部内容。对比前面提到的 MCP 服务器常驻占用 15% 上下文窗口,这个设计在资源利用上显然更聪明。
Skill 的命名有规范:1 到 64 个字符,只允许小写字母、数字、连字符。描述质量很关键——描述越具体,AI 越能准确判断何时使用该 Skill。你也可以手动触发某个 Skill,不依赖 AI 的自动判断。
打造你自己的配置包:五步走
第一步,克隆 safe-coder 作为模板,给你的包起个名字。
第二步,添加你的 Extension。在 extensions/ 目录下新建 .ts 文件,pi 会自动加载。比如你可以写一个扩展,禁止 AI 在工作时间之外执行部署命令——这对一人公司来说尤其有用,避免半夜调试时 AI 帮你"部署"了一个有问题的版本。
第三步,编写你的 Prompt 模板。在 prompts/ 下新建 Markdown 文件,添加 frontmatter 描述,正文写你的标准和要求。
第四步,创建你的 Skill。在 skills/ 下新建目录,添加 SKILL.md,定义完整的工作流步骤。
第五步,发布为 npm 包。一行命令就能分享给团队或社区。
一个完整的 pi 配置包结构大致如下:extensions/ 放扩展,prompts/ 放模板,skills/ 放能力包,package.json 将所有组件关联在一起。
这对独立开发者意味着什么
pi 代表了一种思路:AI 编程工具不一定要越做越重。当你能完全掌控系统提示词、工具调用的拦截逻辑、上下文的加载时机,你实际上获得了比任何商业工具都更精确的控制力。
对于一人公司来说,这意味着你可以把自己的工程规范、安全策略、工作流程沉淀成一个可复用的 npm 包。换个项目、换台电脑,一行命令就恢复你所有的 AI 编程配置。
当然,这也意味着更高的上手门槛——你需要有 TypeScript 基础,需要理解 AI Agent 的工具调用机制。但如果你已经在用 Claude Code 或 Cursor 做日常开发,不妨思考一个问题:你现在用的工具里,有多少功能是你真正需要的,又有多少只是在消耗你的上下文配额?