0 前言

这篇笔记记录我现在使用的 Pi Agent 配置. 目标不是介绍所有功能, 而是在系统重装后, 能按顺序恢复到当前可用状态.

本文参考如下内容:

1 安装 Pi Agent

1.1 安装主程序

使用 pnpm 安装:

pnpm add -g --ignore-scripts @earendil-works/pi-coding-agent
mkdir -p ~/.pi/agent
chmod 700 ~/.pi/agent

1.2 settings.json

创建 ~/.pi/agent/settings.json, 内容如下:

{
  "theme": "dark",
  "defaultProvider": "lvbibir-newapi",
  "defaultModel": "gpt-5.6-sol",
  "defaultThinkingLevel": "high",
  "outputPad": 0,
  "treeFilterMode": "default",
  "tuiMode": "fullscreen"
}

1.3 SYSTEM.md

~/.pi/agent/SYSTEM.md 是当前全局提示词, 它会替换 Pi 内置的默认系统提示词. 项目自己的 AGENTS.md 仍会作为上下文继续补充规则;

1.4 skills

参考

2 配置扩展

# AGENT 全局配置

## 1. 基础设置

环境: WSL2 Ubuntu (无 GUI)
语言: 中文回复, 英文标点

## 2. 工作流程

### 预检查 (3 个问题)
1. **Real?** - 这是真实问题还是过度设计?
2. **Reuse?** - 有现成代码可以复用吗?
3. **Risk?** - 可能会破坏什么? 谁依赖它?

### 任务级别
| 级别 | 标准 | 行动 |
|-------|----------|--------|
| Simple | 1 个文件, <20  | 直接执行 |
| Medium | 2-5 个文件 | 简短计划  实现 |
| Complex | 架构变更 | 研究  提案 (等待)  实现  验证 |

### 编码原则
- **KISS**: 简单优先
- **DRY**: 消除重复
- **Read before write**: 理解后再修改

### 红线
- 不复制粘贴重复代码
- 不破坏现有行为 (除非明确重构)
- 关键路径必须有错误处理
- 不盲目实现, 必须先理解

## 3. 开发环境

### Python
- **必需**: `uv` (不使用 pip/venv/virtualenv)
- 如不可用: 停止并询问用户

### Node.js
- 版本: `fnm` (遵循 `.nvmrc`)
- 包管理: 优先使用 `pnpm`

### Shell
- 默认: WSL2 上的 Bash
- Windows 路径: `/mnt/c/...`

## 4. 安全规范

- 不硬编码 secrets/passwords/tokens
- 不提交 `.env`  credentials
- 在信任边界验证输入

## 5. 版本控制

使用 git commit skill

## 6. 工具与搜索

### 搜索优先原则
- **有任何不确定的内容必须先进行搜索, 不猜测**
- 使用工具: 首选 smart-search-cli skill
- 优先级: 官方文档 > Changelog > GitHub > 社区
- 版本敏感: 先检查 lockfile/config, 然后搜索该版本

### 工具优先级
- 保持工具调用叙述简短。
- 优先选择专用工具而不是 shell 等效工具:
  - 使用 "read" 来检查文件内容, 而不是 "cat" 或 "sed -n"
  - 使用 "ffgrep" 而不是 "grep" 来搜索文件内容
  - 使用 "fffind" 按名称或概念查找相关文件, 而不是 "find"

2.1 安装扩展

pi install npm:@narumitw/pi-goal
pi install npm:@narumitw/pi-plan-mode
pi install npm:@juicesharp/rpiv-ask-user-question
pi install npm:@juicesharp/rpiv-todo
pi install npm:pi-mcp-adapter
pi install npm:@ff-labs/pi-fff
pi install npm:pi-cache-optimizer
pi install npm:pi-add-dir
pi install npm:pi-workspace-history
pi install npm:@narumitw/pi-caffeinate
pi install npm:@tmustier/pi-raw-paste
pi install npm:pi-open-tui
pi install npm:pi-provider-newapi
pi install npm:@gotgenes/pi-permission-system
pi install npm:pi-tool-display
pi install npm:pi-hosts

后续使用 pi update --extensions 更新全部扩展.

扩展 用途
pi-goal 提供 /goal, 适合需要持续推进到完成或确认阻塞的任务
pi-plan-mode 提供只读 /plan 模式, 先讨论方案再动手
rpiv-ask-user-question 让 Agent 用结构化选项提问, 适合需要用户决策的场景
rpiv-todo 提供持久化任务清单, 并在 TUI 中显示进度
pi-mcp-adapter 按需发现, 描述和调用 MCP 工具, 减少常驻工具定义占用
pi-fff 提供快速文件名搜索和内容搜索
pi-cache-optimizer 优化 prompt cache 命中率, 降低重复上下文成本
pi-add-dir 把工作区外目录加入当前 session, 自动加载其中的 AGENTS.md, CLAUDE.md 和 Skills
pi-workspace-history 记录工作区变更, 提供撤销和恢复能力
pi-caffeinate Agent 运行时阻止系统休眠, 适合长时间任务
pi-raw-paste 使用 /paste 做一次性原样粘贴
pi-open-tui 自定义 TUI 顶部, 编辑器, Footer 和遥测显示
pi-provider-newapi 动态发现 NewAPI 网关中的模型
pi-permission-system 对 bash, 路径, 外部目录等操作做权限控制
pi-tool-display 工具输出降噪
pi-hosts 远程连接服务器

2.2 tool-display

mkdir -p ~/.pi/agent/extensions/pi-tool-display
vim ~/.pi/agent/extensions/pi-tool-display/config.json

写入如下内容

{
  "enabled": true,
  "registerToolOverrides": {
    "read": true,
    "grep": true,
    "find": true,
    "ls": true,
    "bash": true,
    "edit": true,
    "write": true
  },
  "customToolOverrides": {
    "ffgrep": {
      "enabled": true,
      "kind": "generic",
      "outputMode": "summary"
    },
    "fffind": {
      "enabled": true,
      "kind": "generic",
      "outputMode": "summary"
    },
    "fff-multi-grep": {
      "enabled": true,
      "kind": "generic",
      "outputMode": "summary"
    },
    "rg": {
      "enabled": true,
      "kind": "generic",
      "outputMode": "summary"
    }
  },
  "enableNativeUserMessageBox": true,
  "readOutputMode": "summary",
  "searchOutputMode": "count",
  "mcpOutputMode": "summary",
  "previewLines": 8,
  "expandedPreviewMaxLines": 4000,
  "bashOutputMode": "summary",
  "bashCollapsedLines": 10,
  "diffViewMode": "auto",
  "diffIndicatorMode": "bars",
  "diffSplitMinWidth": 120,
  "diffCollapsedLines": 24,
  "diffWordWrap": true,
  "showTruncationHints": false,
  "showRtkCompactionHints": false
}

2.3 permission-system

参考资料

mkdir -p ~/.pi/agent/extensions/pi-permission-system/
vim ~/.pi/agent/extensions/pi-permission-system/config.json

写入如下内容:

{
  "$schema": "https://raw.githubusercontent.com/gotgenes/pi-packages/refs/heads/main/packages/pi-permission-system/schemas/permissions.schema.json",
  "debugLog": false,
  "permissionReviewLog": false,
  "yoloMode": false,

  "permission": {
    "*": "allow",
    "grep": "deny",
    "find": "deny",
    "external_directory": {
      "*": "allow"
    },
    "path": {
      "*": "allow",
      "~/.pi/agent/settings.json": "ask",
      "~/.pi/agent/trust.json": "ask",
      "~/.pi/agent/SYSTEM.md": "ask",
      "~/.pi/agent/APPEND_SYSTEM.md": "ask",
      "~/.pi/agent/npm/package.json": "ask",
      "~/.pi/agent/npm/package-lock.json": "ask",
      "~/.pi/agent/extensions/pi-permission-system/config.json": "ask"
    },
    "bash": {
      "*": "allow",
      
      "grep *": "deny",
      "find *": "deny"

      "rm *": "ask",
      "del *": "ask",
      "erase *": "ask",
      "rd *": "ask",
      "rmdir *": "ask",
      "mv *": "ask",

      "git clean *": "ask",
      "git reset --hard *": "ask",
      "git checkout -- *": "ask",
      "git restore *": "ask",
      "git branch -D *": "ask",
      "git stash drop *": "ask",
      "git stash clear *": "ask",
      "git push *": "ask",
    }
  }
}

2.4 MCP

当前没有配置 MCP Server, ~/.pi/agent/mcp.json 只有空对象:

{
  "mcpServers": {}
}

后续优先把跨工具共用的 MCP 放到 ~/.config/mcp/mcp.json, 项目自己的 MCP 放到 .mcp.json. Pi 专用覆盖再放到 ~/.pi/agent/mcp.json.pi/mcp.json.

2.5 newapi-provider

  • 添加 Provider

启动 Pi 后执行:

/newapi-provider-add lvbibir-newapi

Base URL 输入 NewAPI 根地址, 不要带 /v1:

https://example.lvbibir.com

然后录入 API Key:

/login lvbibir-newapi

API Key 由 Pi 保存到 auth.json, 不要写进 Provider 配置, models.json, 环境变量示例或这篇笔记.

  • 模型覆盖

当前只覆盖两个模型的上下文和最大输出长度. ~/.pi/agent/models.json 内容如下:

{
  "providers": {
    "lvbibir-newapi": {
      "modelOverrides": {
        "gpt-5.5": {
          "contextWindow": 1050000,
          "maxTokens": 128000
        },
        "gpt-5.6-sol": {
          "contextWindow": 1050000,
          "maxTokens": 128000
        }
      }
    }
  }
}

刷新动态模型目录:

pi update --models

也可以启动 Pi, 打开 /model 触发刷新. 刷新结果会写到 models-store.json, 这个文件是缓存, 不需要手动维护.

最后在 /model 中选择 lvbibir-newapi/gpt-5.6-sol. settings.json 中的默认 Provider 和默认模型只有在模型已经成功发现后才能正常工作.

2.6 排查扩展启动耗时

扩展安装多了以后可能会导致 pi 启动很慢, 可以通过如下命令排查每个扩展的启动耗时

PI_TIMING=1 PI_OFFLINE=1 pi -p >/tmp/pi.out 2>/tmp/pi.timing

perl -ne '
if (/^  (.+?) (module import|factory): (\d+)ms$/) {
  my ($path,$phase,$ms)=($1,$2,$3);
  my $pkg=$path;
  $pkg=$1 if $path =~ m#(?:^|/)node_modules/(@[^/]+/[^/]+|[^/]+)#;
  $sum{$pkg}+=$ms;
  $count{$pkg}++;
}
END {
  for my $pkg (sort { $sum{$b}<=>$sum{$a} } keys %sum) {
    printf "%6dms  %2d  %s\n", $sum{$pkg}, $count{$pkg}, $pkg
  }
}
' /tmp/pi.timing

以上.