Pi Code Agent 教學手冊(Enterprise Edition)

版本:v0.80.2(2026 年 7 月 1 日更新)
適用對象:資深工程師、架構師、DevOps 工程師
技術棧:Java / Spring Boot / Vue / TypeScript / Redis / Kafka / PostgreSQL
授權:MIT License
開發公司Earendil Inc.
開源統計:⭐ 66.7k+ Stars、220+ Contributors、240+ Releases、8.2k+ Forks


目錄(Table of Contents)

  1. 概述(Overview)
  2. 核心設計哲學(Architecture Philosophy)
  3. 系統架構設計(System Architecture)
  4. 安裝與環境建置(Installation & Setup)
  5. 基本使用教學(Getting Started)
  6. Context Engineering(上下文工程)
  7. PLAN.md 開發模式
  8. Extensions / Skills / Prompt Templates / Themes
  9. Pi Agent + SSDLC(企業重點)
  10. 實戰案例(Hands-on)
  11. 維運與監控(Operations)
  12. 升級與版本管理(Upgrade Strategy)
  13. OSS Session 共享與社群貢獻
  14. Best Practices(企業建議)
  15. Anti-Patterns(重要)
  16. 容器化與沙箱安全(Containerization & Sandboxing)
  17. 結論(Conclusion)
  18. 檢查清單(Checklist)

1. 概述(Overview)

1.1 Pi Code Agent 是什麼

Pi(又名 Pi Coding Agent)是由 Mario Zechner(badlogic)Earendil Inc. 開發的極簡終端 AI 程式碼開發工具,以 MIT License 開源於 GitHub。其核心定位為:

  • 極簡終端控制框架(Minimal Terminal Coding Harness)——適應開發者工作流,而非強迫開發者適應工具
  • 預設僅掛載 4 個工具readwriteeditbash),透過內建全量 7 個工具(加上 grepfindls)即可覆蓋絕大多數開發場景
  • 透過 TypeScript Extensions、Skills、Prompt Templates、Themes 四大擴充機制進行無限延伸
  • 透過 Pi Packages 機制(npm / git / SSH / HTTPS)分享與安裝擴充套件
  • 支援 15+ LLM Provider(數百個模型)(Anthropic、OpenAI、Google Gemini、Google Vertex、Azure OpenAI、Amazon Bedrock、DeepSeek、Mistral、Groq、Cerebras、xAI、Hugging Face、Kimi For Coding、MiniMax、NVIDIA、OpenRouter、Ollama、Vercel AI Gateway、ZAI、OpenCode Zen、OpenCode Go、Cloudflare AI Gateway、Cloudflare Workers AI、Fireworks、Together AI、Xiaomi MiMo 等)
  • 支援 本地模型:透過 Ollama 或相容 OpenAI API 的本地服務,可完全離線運行
  • npm 套件名稱:@earendil-works/pi-coding-agent
  • Monorepo(earendil-works/pi)包含 4 個核心套件:
套件用途
@earendil-works/pi-ai統一多 Provider LLM API(OpenAI / Anthropic / Google 等)
@earendil-works/pi-agent-coreAgent 執行時期與工具呼叫狀態管理
@earendil-works/pi-coding-agent互動式編碼 Agent CLI
@earendil-works/pi-tui終端 UI 差異渲染函式庫
  • 4 種運行模式:Interactive(互動)、Print / JSON(非互動)、RPC(JSON stdin/stdout 協議)、SDK(TypeScript 程式化嵌入)
  • 另有獨立專案 earendil-works/pi-chat 提供 Slack / 聊天自動化整合
  • 官方鼓勵開發者 共享 OSS 編碼 Session,協助改善模型與工具評估

Pi 的設計理念是「適應你的工作流,而非讓你適應工具」。官方自述:「Pi is aggressively extensible so it doesn’t have to dictate your workflow.」

v0.80.2 新功能摘要

  • 完整的容器化支援(Gondolin micro-VM、Plain Docker、OpenShell)
  • Project Trust 機制(信任專案控制)
  • Pi Orchestrator(實驗性多代理協調器)
  • 供應鏈安全強化(npm-shrinkwrap、依賴釘選、CI 安全掃描)
  • Custom Editor API、Overlay 元件、Autocomplete Provider
  • withFileMutationQueue() 並行工具檔案安全機制
  • 支援 NVIDIA 與 Ollama 本地模型 Provider

1.2 與其他工具比較

特性Pi Code AgentClaude CodeGitHub CopilotCursor
運行環境Terminal(CLI)Terminal(CLI)VS Code / IDE獨立 IDE
開源✅ MIT✅ MIT(v1.0.34+)❌ 閉源❌ 閉源
可擴充性✅ Extension/Skill/Prompt/Theme✅ Hooks/MCP✅ MCP/Extension❌ 有限
Plan Mode✅ PLAN.md + Extension 範例✅ 內建❌ 無✅ 內建
Sub-Agents✅ Extension 範例可實作✅ 內建✅ 有限❌ 無
MCP 支援✅ Extension 範例可整合✅ 原生✅ 原生✅ 原生
多模型切換✅ 15+ Provider❌ Anthropic only✅ 多模型✅ 多模型
Session 管理✅ 樹狀分支/Fork/Clone✅ 基本❌ 無❌ 無
成本控制✅ 即時顯示 Token/Cost❌ 有限❌ 訂閱制❌ 訂閱制
自訂系統提示✅ AGENTS.md / SYSTEM.md✅ CLAUDE.md✅ Instructions❌ Rules
SDK/嵌入✅ TypeScript SDK + RPC❌ 無❌ 無❌ 無
套件生態✅ Pi Packages (npm/git)❌ 無✅ Marketplace❌ 無
容器化/沙箱✅ Gondolin/Docker/OpenShell✅ 內建沙箱❌ 無❌ 無
本地模型✅ Ollama 支援❌ 無❌ 無✅ Ollama

重要澄清:Pi 不「內建」Plan Mode、Sub-Agents、MCP 等功能,但透過其 Extension 系統皆可實現。官方 examples/extensions/ 提供了 55+ 個範例檔案與 8 個完整目錄範例,涵蓋以下類別:

類別代表範例
生命週期與安全permission-gate.tsprotected-paths.tsconfirm-destructive.tsdirty-repo-guard.tssandbox/
自訂工具todo.tstool-override.tsdynamic-tools.tsstructured-output.tsssh.tssubagent/
命令與 UIplan-mode/preset.tshandoff.tsinteractive-shell.tsdoom-overlay/modal-editor.tssnake.ts
Git 整合git-checkpoint.tsauto-commit-on-exit.tsgit-merge-and-resolve.ts
系統提示與壓縮pirate.tsclaude-rules.tscustom-compaction.tstrigger-compact.ts
自訂 Providercustom-provider-anthropic/custom-provider-gitlab-duo/
Session 後設資料session-name.tsbookmark.ts
訊息與通訊message-renderer.tsevent-bus.tsnotify.ts

Pi 的哲學是不在核心中堆疊功能,而是讓使用者按需組裝。你甚至可以直接請 Pi 為你建構 Extension——pi can create extensions

1.3 適用場景

✅ 適合使用 Pi 的情境

  • 企業級專案開發:需要完全透明、可審計的 AI 開發流程
  • 多模型策略:同一專案中需切換不同 LLM(如 Claude 做設計、GPT 做測試)
  • 客製化工作流:團隊有獨特的開發規範或安全要求
  • CLI 優先的開發者:習慣終端操作、tmux 工作流
  • 成本敏感環境:需要精確控制 Token 使用量

⚠️ 不適合的情境

  • 需要圖形化介面的開發者(建議用 Cursor 或 Copilot)
  • 不熟悉終端操作的初學者
  • 需要即開即用、零配置的場景

實務建議:建議團隊中至少一位成員熟悉 TypeScript,以便開發自訂 Extension。Pi 的價值在於可塑性,投入客製化的時間會在長期開發中獲得回報。


2. 核心設計哲學(Architecture Philosophy)

2.1 極簡主義(Minimalism)

Pi 的核心僅提供七個內建工具,其中預設啟用四個readwriteeditbash):

工具用途預設啟用
read讀取檔案內容(支援圖片辨識)
write寫入檔案
edit編輯檔案(差異替換,支援多區域批次編輯)
bash執行 Shell 命令(串流輸出、可攔截)
grep正則搜尋檔案內容❌(需明確啟用)
find搜尋檔案路徑❌(需明確啟用)
ls列出目錄內容❌(需明確啟用)

設計考量:Pi 在 v0.70+ 後將預設工具精簡為 4 個,因為 bash 已可執行 grepfindls 等效操作。若專案需要更精細的工具控制,可透過 --tools 明確指定。

# 啟用全部 7 個內建工具
pi --tools read,bash,edit,write,grep,find,ls

# 唯讀模式(Code Review 用)
pi --tools read,grep,find,ls -p "Review the code"

# 禁用所有工具
pi --no-tools

# 禁用內建工具但保留 Extension 工具
pi --no-builtin-tools

# 排除特定工具(保留其餘)
pi --exclude-tools bash,write

設計理念:不內建功能,讓使用者透過 Extension 自行擴充。這確保核心保持輕量且穩定。

2.2 可觀測性(Observability)

Pi 的每一個操作都是可見且可中斷的

  • 所有工具呼叫的輸入/輸出皆在終端即時顯示
  • Ctrl+O 展開/收合工具輸出
  • Ctrl+T 展開/收合 Thinking Block
  • Escape 可隨時中斷操作(連按兩下開啟 /tree
  • Ctrl+G 開啟外部編輯器(如 vim、nano)
  • Session 以 JSONL 格式儲存,完全可追溯
# Session 儲存位置
~/.pi/agent/sessions/<encoded-cwd>/

# 也可自訂 Session 目錄
pi --session-dir /path/to/sessions

2.3 PLAN.md 驅動開發

Pi 刻意不內建 Plan Mode,原因如下:

  1. 內建 Plan Mode 是「黑盒」——你無法版控、無法跨會話共享
  2. PLAN.md 是純文字檔,可以 Git 版控
  3. 團隊成員可以共同編輯 PLAN.md
  4. AI 和人類都可以讀寫 PLAN.md

如果你真的需要 Plan Mode,Pi 提供了官方 Extension 範例 examples/extensions/plan-mode/ 來實作,包含步驟追蹤、進度小工具和唯讀 bash 允許清單。

2.4 明確的「不做」原則

Pi 的設計哲學中有數項刻意不做的決定:

不做的事替代方案理由
No Sub-Agentstmux 多實例 / Extension 實作子代理使偵錯複雜化,tmux 提供完整可觀測性
No Built-in To-dos使用 TODO.md 檔案內建待辦會混淆模型,純文字檔更可靠
No Permission PopupsPLAN.md + Extension 權限閘門彈出視窗中斷工作流,PLAN.md 提供更好的控制
No Background Bash使用 tmux背景執行缺乏可觀測性,tmux 提供完整控制
No Built-in MCPExtension 整合 / CLI 工具 + SkillsMCP 可透過 Extension 實現,但官方建議使用 CLI 工具搭配 README(見 Why?
No GUITUI 終端介面CLI 天然適合自動化、遠端連線和管道操作

2.5 優點與缺點分析

優點

項目說明
完全透明所有操作可見、可追溯、可審計
高度可擴充TypeScript Extension 可做任何事
多模型支援30+ Provider,隨時切換
成本可控即時顯示 Token 用量與費用
無廠商鎖定開源 MIT,可自行 Fork
輕量快速啟動快,資源佔用低
多運行模式Interactive / Print / RPC / SDK
完整 SDK可程式化嵌入自有系統

缺點

項目說明
學習曲線需熟悉終端操作與 TypeScript
無 GUI不適合需要視覺化的工作流
需自行配置不像 Cursor 般即開即用
社群較小相比 Copilot/Cursor,生態系較年輕

實務案例:某團隊將 Pi 用於後端 API 開發(利用 Claude 模型),同時用 GitHub Copilot 處理前端 Vue 元件。Pi 的多模型支援讓他們可以在同一終端中切換使用最適合各階段的模型。


3. 系統架構設計(System Architecture)

3.1 企業級 Web 系統架構圖

以下展示使用 Pi Agent 開發大型 Web 系統的完整架構:

graph TB
    subgraph "AI Agent Layer"
        PI[Pi Code Agent]
        EXT[Extensions]
        SKL[Skills]
        PT[Prompt Templates]
        PI --> EXT
        PI --> SKL
        PI --> PT
    end

    subgraph "Frontend Layer"
        VUE[Vue 3 + TypeScript]
        TAILWIND[Tailwind CSS]
        VUE --> TAILWIND
    end

    subgraph "API Gateway"
        GW[API Gateway / Nginx]
    end

    subgraph "Backend Layer"
        SB[Spring Boot 3.x]
        CTRL[Controller Layer]
        SVC[Service Layer]
        REPO[Repository Layer]
        SB --> CTRL --> SVC --> REPO
    end

    subgraph "Messaging Layer"
        KAFKA[Apache Kafka]
        RMQ[RabbitMQ]
    end

    subgraph "Cache Layer"
        REDIS[Redis Cluster]
    end

    subgraph "Data Layer"
        PG[(PostgreSQL)]
        ORACLE[(Oracle)]
        DB2[(DB2)]
    end

    subgraph "Batch Layer"
        BATCH[Spring Batch]
    end

    subgraph "DevOps Layer"
        GIT[Git / GitHub]
        CI[GitHub Actions]
        DOCKER[Podman / Docker]
    end

    PI -.->|生成/修改程式碼| VUE
    PI -.->|生成/修改程式碼| SB
    PI -.->|生成測試| SB
    PI -.->|生成配置| CI

    VUE --> GW --> CTRL
    SVC --> KAFKA
    SVC --> RMQ
    SVC --> REDIS
    REPO --> PG
    REPO --> ORACLE
    REPO --> DB2
    BATCH --> PG
    GIT --> CI --> DOCKER

3.2 Pi 在架構中的定位

Pi Agent 運作在開發者工作站層,而非系統運行時:

graph LR
    subgraph "Developer Workstation"
        DEV[開發者]
        PI[Pi Agent]
        TERM[Terminal / tmux]
        DEV --> TERM --> PI
    end

    subgraph "Source Control"
        GIT[Git Repository]
    end

    subgraph "CI/CD"
        GHA[GitHub Actions]
    end

    subgraph "Runtime"
        APP[Application]
    end

    PI -->|產生程式碼| GIT
    GIT -->|觸發| GHA
    GHA -->|部署| APP

3.3 Agent 參與開發流程

Pi Agent 在 SDLC 各階段的參與方式:

階段Pi 的角色使用方式
需求分析協助產生 User StoryPrompt Template
系統設計生成架構文件、API SpecPLAN.md + Skill
開發生成/修改程式碼互動模式
測試生成測試案例Extension + Skill
Code ReviewAI 審查程式碼唯讀模式
部署生成 CI/CD 配置Prompt Template
維運Log 分析、問題診斷互動模式

3.4 多模型策略架構

graph TD
    PI[Pi Agent] --> |Ctrl+L 切換| MS{Model Selector}
    MS --> ANT[Anthropic Claude]
    MS --> OAI[OpenAI GPT-4o]
    MS --> GEM[Google Gemini]
    MS --> AZ[Azure OpenAI]
    MS --> BED[Amazon Bedrock]

    ANT --> |適合| DESIGN[架構設計 / 複雜邏輯]
    OAI --> |適合| CODE[程式碼生成]
    GEM --> |適合| DOC[文件撰寫]
    AZ --> |適合| ENTERPRISE[企業合規環境]
    BED --> |適合| BATCH_AI[批次處理]

實務建議:建議在 settings.json 中設定 scopedModels,讓 Ctrl+P 可以快速在常用模型間切換,避免每次都要搜尋。


4. 安裝與環境建置(Installation & Setup)

4.1 系統需求

項目需求
Node.jsv18.0+(建議 v20 LTS)
npmv9.0+(或 pnpm / yarn)
作業系統Windows / macOS / Linux / Android(Termux)
終端建議使用 Windows Terminal / iTerm2 / Alacritty / Kitty
Gitv2.30+

平台支援說明

  • Windows:需使用 Windows Terminal;不支援原生 Ctrl+Z 暫停,但其餘功能完整。詳見 docs/windows.md
  • macOS / Linux:完整支援,包含 Ctrl+Z 暫停/恢復。Linux ARM64(musl)亦支援。
  • Android(Termux)pkg install nodejs termux-api git && npm install -g --ignore-scripts @earendil-works/pi-coding-agent
  • tmux:建議搭配使用,需啟用 set -g extended-keys on。詳見 docs/tmux.md

4.2 安裝步驟

Windows

# 1. 確認 Node.js 版本
node --version  # 需 >= 18

# 2. 全域安裝 Pi Coding Agent
npm install -g --ignore-scripts @earendil-works/pi-coding-agent

# 3. 確認安裝成功
pi --version

macOS / Linux

# 1. 確認 Node.js 版本
node --version  # 需 >= 18

# 2a. 全域安裝(npm)
npm install -g --ignore-scripts @earendil-works/pi-coding-agent

# 2b. 替代方式:使用 Installer Script
curl -fsSL https://pi.dev/install.sh | sh

# 3. 確認安裝
pi --version

解安裝

# npm 安裝的解安裝
npm uninstall -g @earendil-works/pi-coding-agent

# pnpm 安裝的解安裝
pnpm remove -g @earendil-works/pi-coding-agent

# yarn 安裝的解安裝
yarn global remove @earendil-works/pi-coding-agent

4.3 認證設定

Pi 支援兩種認證方式:

方式一:API Key(推薦用於企業環境)

# Anthropic
export ANTHROPIC_API_KEY=sk-ant-xxx

# OpenAI
export OPENAI_API_KEY=sk-xxx

# DeepSeek
export DEEPSEEK_API_KEY=xxx

# Google Gemini
export GOOGLE_API_KEY=xxx

# Google Vertex AI
export GOOGLE_CLOUD_API_KEY=xxx  # 或使用 Application Default Credentials

# Azure OpenAI
export AZURE_OPENAI_API_KEY=xxx
export AZURE_OPENAI_ENDPOINT=https://xxx.openai.azure.com

# Amazon Bedrock
# 使用 AWS CLI 預設認證鏈,或設定:
export AWS_ACCESS_KEY_ID=xxx
export AWS_SECRET_ACCESS_KEY=xxx
export AWS_REGION=us-east-1
# 替代方式:Bearer Token
export AWS_BEARER_TOKEN_BEDROCK=xxx

# Mistral
export MISTRAL_API_KEY=xxx

# Groq
export GROQ_API_KEY=xxx

# Cerebras
export CEREBRAS_API_KEY=xxx

# xAI (Grok)
export XAI_API_KEY=xxx

# Hugging Face
export HF_TOKEN=xxx

# Kimi For Coding (Moonshot AI)
export KIMI_API_KEY=xxx

# MiniMax / MiniMax China
export MINIMAX_API_KEY=xxx

# OpenRouter
export OPENROUTER_API_KEY=xxx

# Cloudflare AI Gateway
export CLOUDFLARE_API_KEY=xxx

# Cloudflare Workers AI
export CLOUDFLARE_WORKERS_AI_API_KEY=xxx

# Fireworks
export FIREWORKS_API_KEY=xxx

# Together AI
export TOGETHER_API_KEY=xxx

# Xiaomi MiMo
export XIAOMI_API_KEY=xxx
# 另支援 Xiaomi MiMo Token Plan(China / Amsterdam / Singapore 三個區域版本)

# ZAI (z.ai)
export ZAI_API_KEY=xxx

# OpenCode Zen
export OPENCODE_ZEN_API_KEY=xxx

# OpenCode Go
export OPENCODE_API_KEY=xxx

# Vercel AI Gateway
export VERCEL_API_KEY=xxx

安全提醒

  • 請勿將 API Key 寫入程式碼或 Git 中。使用環境變數或 Secret Manager。
  • auth.json 中可使用 Shell 命令解析:"anthropic": "!security find-generic-password -ws 'anthropic'"
  • API Key 也可存於 ~/.pi/agent/auth.json{ "anthropic": "sk-ant-xxx" }

方式二:OAuth 訂閱登入

pi
/login  # 在互動模式中登入

支援的訂閱服務:

訂閱服務說明
Anthropic Claude Pro/Max注意:第三方使用扣除額外用量,依 Token 計費
OpenAI ChatGPT Plus/Pro(Codex)支援 gpt-4oo3o4-mini 等模型
GitHub Copilot支援 Copilot Business/Enterprise 帳戶

自訂 Provider 與模型:若你的 Provider 使用 OpenAI / Anthropic / Google 相容 API,可在 ~/.pi/agent/models.json 中新增自訂模型定義。若需自訂 OAuth 或特殊 API 協議,可透過 Extension 實作。詳見 docs/models.mddocs/custom-provider.md

4.4 供應鏈安全

Pi v0.80.2 持續強化供應鏈安全機制,是所有開源 AI Agent 中措施最完善的之一:

安全措施說明
--ignore-scripts 預設npm install 加入 --ignore-scripts 防止 postinstall 惡意腳本
npm-shrinkwrap.json所有依賴版本完全鎖定(由根 lockfile 產生),可重現建構
依賴釘選(pinned deps)直接外部依賴固定到精確版本;.npmrc 設定 save-exact=truemin-release-age=2,避免引入當日新發佈的套件
Lockfile 保護Pre-commit hook 阻擋意外 lockfile 提交,除非設定 PI_ALLOW_LOCKFILE_CHANGE=1
CI 安全掃描持續整合使用 npm ci --ignore-scripts,排程工作流執行 npm audit --omit=devnpm audit signatures --omit=dev
生命週期腳本白名單Shrinkwrap 產生時有明確的 lifecycle scripts 白名單,新增依賴腳本須經過審查
Release 煙霧測試釋出前使用 npm run release:local 在隔離環境中建構、打包、安裝驗證
Pi Packages 權限模型Extension 執行於主程序內,擁有系統存取權限——安裝前務必審查原始碼
# 確認安裝完整性
npm ls -g @earendil-works/pi-coding-agent

# 離線模式(不檢查更新、不送遙測資料)
pi --offline
# 或設定環境變數
export PI_OFFLINE=true

進階環境變數

變數用途
PI_OFFLINE完全離線模式(停用更新檢查、套件更新檢查、安裝遙測)
PI_SKIP_VERSION_CHECK僅跳過啟動時的 pi.dev 版本檢查(不影響遙測)
PI_TELEMETRY0/false/no 停用安裝/更新遙測;1/true/yes 啟用。不影響版本檢查
PI_CACHE_RETENTIONlong 延長 Prompt Cache(Anthropic: 1 小時、OpenAI: 24 小時)
PI_CODING_AGENT_DIR自訂全域設定目錄(取代 ~/.pi/agent
PI_CODING_AGENT_SESSION_DIR自訂 Session 儲存路徑(可被 --session-dir 覆蓋)
PI_PACKAGE_DIR自訂已安裝 Pi Packages 目錄(適用 Nix/Guix 等路徑 tokenize 不佳的環境)
VISUAL / EDITOR指定 Ctrl+G 開啟的外部編輯器(如 vim、nano、code)
PI_ALLOW_LOCKFILE_CHANGE1 允許 pre-commit hook 提交 lockfile 變更(供維護者使用)

4.5 專案初始化

# 進入專案目錄
cd /path/to/your-project

# 建立 Pi 專案配置目錄
mkdir -p .pi/extensions .pi/skills .pi/prompts .pi/themes

# 建立 AGENTS.md(專案指引)
cat > AGENTS.md << 'EOF'
# 專案指引

## 技術棧
- 後端:Java 21 + Spring Boot 3.5
- 前端:Vue 3 + TypeScript + Tailwind CSS
- 資料庫:PostgreSQL 16
- 快取:Redis 7
- 訊息佇列:Kafka 3.x

## 程式碼規範
- 使用 Clean Architecture
- Controller → Service → Repository 分層
- 所有 API 必須有 Swagger 文件
- 測試覆蓋率 > 80%

## 命名規範
- 類別:PascalCase
- 方法/變數:camelCase
- 常數:UPPER_SNAKE_CASE
- 資料表:snake_case
EOF

4.6 全域設定

# 建立全域配置目錄
mkdir -p ~/.pi/agent/prompts ~/.pi/agent/skills ~/.pi/agent/extensions

# 編輯全域設定
cat > ~/.pi/agent/settings.json << 'EOF'
{
  "provider": "anthropic",
  "model": "claude-sonnet-4-20250514",
  "thinking": "medium",
  "enableInstallTelemetry": false,
  "compaction": {
    "enabled": true,
    "mode": "auto"
  }
}
EOF

4.7 專案層級設定

cat > .pi/settings.json << 'EOF'
{
  "provider": "anthropic",
  "model": "claude-sonnet-4-20250514",
  "thinking": "high",
  "tools": ["read", "write", "edit", "bash", "grep", "find", "ls"]
}
EOF

4.8 目錄結構一覽

your-project/
├── .pi/                          # Pi 專案配置
│   ├── settings.json             # 專案設定(覆蓋全域,唯讀版控用)
│   ├── extensions/               # 專案 Extension
│   ├── skills/                   # 專案 Skill
│   ├── prompts/                  # 專案 Prompt Template
│   └── themes/                   # 專案 Theme
├── .agents/                      # Agent Skills 標準路徑(替代 .pi/skills/)
│   └── skills/                   # 依 Agent Skills 標準組織
├── AGENTS.md                     # 專案指引(Pi 啟動時自動載入)
├── CLAUDE.md                     # AGENTS.md 的別名(相容 Claude Code 用戶)
├── SYSTEM.md                     # 自訂系統提示(取代預設系統提示)
├── APPEND_SYSTEM.md              # 附加到系統提示末尾(不取代)
├── PLAN.md                       # 開發計畫(手動維護)
├── src/                          # 原始碼
├── test/                         # 測試
└── ...

~/.pi/agent/                      # 全域配置
├── auth.json                     # API Key 與 OAuth Token
├── settings.json                 # 全域設定
├── models.json                   # 自訂模型定義
├── keybindings.json              # 自訂快捷鍵
├── sessions/                     # Session 儲存
│   └── <encoded-cwd>/           # 依專案路徑編碼
├── extensions/                   # 全域 Extension
├── skills/                       # 全域 Skill(也支援 ~/.agents/skills/)
├── prompts/                      # 全域 Prompt Template
├── themes/                       # 全域 Theme
└── bin/                          # 託管二進位檔(fd, rg)

Context Files 載入順序:Pi 會從當前目錄向上遍歷父目錄,依序載入所有找到的 AGENTS.md(或 CLAUDE.md)。SYSTEM.md 取代預設系統提示;APPEND_SYSTEM.md 則附加在末尾。

4.9 常見錯誤與解法

錯誤原因解法
command not found: pinpm 全域路徑未加入 PATH確認 npm prefix -g 路徑在 PATH 中
ANTHROPIC_API_KEY not set未設定環境變數export ANTHROPIC_API_KEY=sk-ant-xxx 或在 auth.json 中設定
Context overflowSession 過長使用 /compact/new 開新 Session
Model not found模型名稱錯誤pi --list-models 查看可用模型
Windows 下 Alt+Enter 無效Windows Terminal 預設全螢幕在 Windows Terminal 設定中重新映射
Node.js 版本太舊Pi 需要 Node 18+升級 Node.js 至 v20 LTS
ERR_MODULE_NOT_FOUNDpnpm 嚴格模式缺少依賴重新安裝 npm install -g --ignore-scripts @earendil-works/pi-coding-agent
tmux 中 Shift+Enter 無效tmux 未啟用 extended-keys在 tmux.conf 加入 set -g extended-keys on
Ctrl+Z 在 Windows 下崩潰Windows 不支援 SIGTSTPv0.67.4+ 已修復,更新到最新版

實務建議:企業環境中建議統一使用 nvm(Node Version Manager)管理 Node.js 版本,並在專案中放置 .nvmrc 檔案指定版本。若使用 pnpm 或其他套件管理器,可在 settings.json 中設定 "npmCommand": "pnpm" 以確保相容。


5. 基本使用教學(Getting Started)

5.1 啟動 Pi Agent

# 基本啟動(互動模式)
pi

# 帶初始 Prompt 啟動
pi "列出 src/ 下所有 Java 檔案"

# 繼續上次 Session
pi -c

# 瀏覽並選擇 Session
pi -r

# 無 Session 模式(不儲存歷史)
pi --no-session

# 指定模型啟動
pi --provider anthropic --model claude-sonnet-4-20250514

# 簡寫模型指定
pi --model anthropic/claude-sonnet-4-20250514

# 指定思考等級(含 xhigh 超高思考)
pi --model sonnet:high "解決這個複雜問題"
pi --thinking xhigh "設計整個微服務架構"

# 從先前 Session 分支(fork)
pi --fork <session-id-or-path>

# 恢復指定 Session
pi --session <session-id-or-path>

# 不載入任何 Context Files
pi --no-context-files
pi -nc

# 附加系統提示
pi --append-system-prompt "所有回應使用繁體中文"

# 限制可用工具
pi --tools read,grep,find,ls  # 唯讀模式
pi --no-tools                  # 完全禁用工具

5.2 生成程式碼

範例 1:生成 Spring Boot REST Controller

> 請幫我建立一個 UserController,包含 CRUD API,使用 Clean Architecture 分層:
> - Controller:處理 HTTP 請求
> - Service:業務邏輯
> - Repository:資料存取
> - Entity:資料模型
> 使用 JPA + PostgreSQL

範例 2:生成 Vue 元件

> 建立一個 UserList.vue 元件:
> - 使用 Composition API + TypeScript
> - 使用 Tailwind CSS 排版
> - 包含搜尋、分頁功能
> - 呼叫 /api/users GET API

5.3 修改檔案

> 在 UserService.java 中新增一個 searchUsers 方法:
> - 參數:keyword (String), pageable (Pageable)
> - 回傳:Page<UserDTO>
> - 支援模糊搜尋 name 和 email

Pi 會使用 edit 工具進行差異替換,你可以在終端看到具體修改的內容。

5.4 執行指令

> 執行 Maven 測試

Pi 會呼叫 bash 工具執行:

mvn test

你也可以直接在終端中用 ! 前綴執行命令:

!mvn clean compile    # 執行並將輸出傳給 LLM
!!mvn clean compile   # 執行但不傳給 LLM

5.5 Debug 技巧

> 這個測試失敗了,請分析原因:
> @src/test/java/com/example/UserServiceTest.java
> 
> 錯誤訊息:
> java.lang.NullPointerException at UserService.java:42

使用 @ 前綴可以引入檔案內容到 Prompt 中。

5.6 常用互動模式操作

快捷鍵一覽

操作快捷鍵說明
模型管理
切換模型Ctrl+L開啟模型選擇器(保留編輯器文字)
快速切換模型Ctrl+P在 Scoped Models 間向前循環
反向切換模型Shift+Ctrl+P在 Scoped Models 間向後循環
思考控制
切換思考等級Shift+Taboff → minimal → low → medium → high → xhigh
展開/收合思考Ctrl+T查看 LLM 的思考過程
工具與輸出
展開/收合工具輸出Ctrl+O查看或隱藏工具執行細節
Session 管理
開啟 Session TreeEscape × 2連按兩次 Escape 開啟 /tree
編輯器
送出訊息(Steering)Enter送出轉向訊息(如 Agent 正在運行,會在當前工具批次後插入)
送出訊息(Follow-up)Alt+Enter送出後續訊息(等待 Agent 完成後才送出)
多行輸入Shift+Enter換行(tmux 需啟用 extended-keys)
外部編輯器Ctrl+G在 vim/nano 等外部編輯器中編輯輸入
引用檔案@輸入 @ 後模糊搜尋檔案引入
路徑補全Tab自動補全路徑和斜線命令
貼上圖片Ctrl+V貼上剪貼簿圖片(Windows 用 Alt+V
Kill Line / YankCtrl+K / Ctrl+YEmacs 風格 kill ring 操作
UndoCtrl+Z復原上一步編輯
Word 前進 / 後退Alt+F / Alt+BShell 風格單詞導航
中斷與退出
中斷Escape中斷當前操作
清除輸入Ctrl+C清除編輯器內容
退出Ctrl+C × 2連按兩次退出 Pi

Message Queue(訊息佇列機制)

Pi 具備獨特的訊息佇列機制,讓你在 Agent 運行中仍可送出訊息:

訊息類型快捷鍵行為
Steering(轉向)Enter在當前工具批次完成後立即插入,用於引導方向
Follow-up(後續)Alt+Enter等待 Agent 完全完成後才送出,用於追加任務
# 情境範例:Agent 正在修改 UserService.java
# 你突然想到還需要加入驗證邏輯:

Steering(Enter): "等等,請在 createUser 方法中加入 email 格式驗證"
→ Agent 會在完成當前工具操作後讀取此訊息,改變方向

Follow-up(Alt+Enter): "完成後請一併寫測試"
→ Agent 會先完成所有手頭工作,然後才處理此訊息

企業建議:Steering 和 Follow-up 的行為可透過 /settings 調整 steeringModefollowUpMode

常用斜線命令

命令說明
/new開啟新 Session
/tree開啟 Session Tree(檢視分支歷史)
/fork從先前的訊息分支出新 Session
/clone複製當前分支到新 Session
/resume瀏覽並恢復先前 Session
/model切換 LLM 模型
/scoped-models啟用/停用 Ctrl+P 循環中的模型
/thinking切換思考等級
/compact手動壓縮 Session 上下文
/share上傳為 private GitHub Gist,產生可分享 HTML 連結
/export匯出 Session 為 HTML 檔案
/import從 JSONL 檔案匯入並恢復 Session
/trust儲存專案信任決策(寫入 ~/.pi/agent/trust.json
/changelog顯示版本更新日誌
/copy複製最後回應到剪貼簿
/config檢視/切換已載入的資源(啟用/停用 Extension、Skill 等)
/settings開啟設定選單(思考等級、主題、訊息傳遞模式、傳輸協議)
/reload熱重載所有資源(快捷鍵、AGENTS.md / Extension / Skill / Prompt / 主題自動熱重載)
/loginOAuth 訂閱登入
/logout登出 OAuth 認證
/name為當前 Session 命名
/session顯示當前 Session ID、路徑、訊息數、Token 與費用統計
/hotkeys顯示所有快捷鍵
/quit退出 Pi

CLI 啟動選項

# 為 Session 命名(方便 /resume 搜尋)
pi --name "feature-login-refactor"
pi -n "fix bug #1234"

# 離線模式(不檢查更新、不送遙測)
pi --offline

# 排除特定工具(保留其餘)
pi --exclude-tools bash,write
pi -xt bash,write

# 僅使用 Extension 工具,不載入內建工具
pi --no-builtin-tools
pi -nbt

# 停用所有資源探索,只載入指定的
pi --no-extensions -e ./my-ext.ts  # 僅載入指定 Extension
pi --no-skills --skill ./my-skill  # 僅載入指定 Skill
pi --no-prompt-templates           # 停用 Prompt Template 探索
pi --no-themes                     # 停用 Theme 探索

# 附加系統提示(可重複使用)
pi --append-system-prompt "所有回應使用繁體中文"
pi --append-system-prompt "遵循 Clean Architecture"

# 指定 API Key(覆蓋環境變數)
pi --api-key sk-ant-xxx

# 指定模型循環清單(Ctrl+P 使用)
pi --models "claude-*,gpt-4o"

# 列出可用模型
pi --list-models
pi --list-models "claude"  # 搜尋篩選

# Project Trust 控制(v0.80+ 新增)
pi --approve       # 信任專案本地設定(僅本次)
pi -a              # 簡寫
pi --no-approve    # 忽略專案本地設定(僅本次)
pi -na             # 簡寫

5.7 非互動模式(Print / JSON / RPC)

Pi 提供多種非互動運行模式,適合自動化與整合:

# 印出回應後退出
pi -p "分析 pom.xml 的依賴是否有安全漏洞"

# 管線輸入
cat README.md | pi -p "幫我翻譯成英文"

# 唯讀模式審查
pi --tools read,grep,find,ls -p "Review src/ 的程式碼品質"

# 指定思考等級
pi -p --thinking high "重構 UserService 為 Clean Architecture"

JSON 模式

# 結構化輸出(適合程式處理)
pi --mode json -p "列出所有 TODO" | jq '.result'

RPC 模式

# JSON 協議透過 stdin/stdout(適合 IDE 整合)
pi --mode rpc
# 送入 JSON 命令,接收 JSON 事件

重要:RPC 模式使用嚴格的 LF 分隔 JSONL 格式。客戶端必須僅以 \n 分割記錄,不可使用 Node.js readline 等通用行讀取器(它們會在 JSON 負載中的 Unicode 分隔符號上誤分割)。

實務建議:非互動模式非常適合整合到 CI/CD Pipeline 中,例如在 PR 建立時自動進行 Code Review。RPC 模式特別適合建構自有的前端 UI 或 IDE 外掛。

5.8 SDK 模式(程式化嵌入)

Pi 可作為 TypeScript 函式庫嵌入到自有系統中。SDK API 需要明確建構認證、模型註冊與 Session 管理元件:

import {
  AuthStorage,
  createAgentSession,
  ModelRegistry,
  SessionManager,
} from "@earendil-works/pi-coding-agent";

// 建構必要元件
const authStorage = AuthStorage.create();
const modelRegistry = ModelRegistry.create(authStorage);

// 建立 Agent Session
const { session } = await createAgentSession({
  sessionManager: SessionManager.inMemory(), // 或使用持久化 Session
  authStorage,
  modelRegistry,
});

// 送出訊息
await session.prompt("請審查 src/main/java 目錄下的 Controller 是否符合 RESTful 規範");

// 進階:多 Session 管理(使用 AgentSessionRuntime)
// 適合需要同時管理多個 Session 並在運行時替換的場景
// 詳見 docs/sdk.md 與 examples/sdk/

實際案例openclaw/openclaw 專案使用 Pi SDK 建構了法律文件自動化處理系統。進階的多 Session 運行時替換,可使用 createAgentSessionRuntime()AgentSessionRuntime


6. Context Engineering(上下文工程)

6.1 Context Files 體系

Pi 使用多層級的 Context Files 來建構 LLM 的系統提示。理解這套體系是有效使用 Pi 的關鍵。

檔案作用優先級
AGENTS.md專案指引,描述技術棧、規範、架構自動載入,從 cwd 向上遍歷所有父目錄
CLAUDE.mdAGENTS.md 的別名(相容 Claude Code 用戶)AGENTS.md 等效
SYSTEM.md完全取代預設系統提示取代,非附加
APPEND_SYSTEM.md附加到系統提示末尾附加,不取代
Skills任務專精指引(如「寫測試」、「做 Code Review」)由 Agent 自動選擇或手動 @skill-name 觸發
Prompt Templates可重複使用的提示範本透過 /template-name 觸發

AGENTS.md 的作用鏈

~/.pi/agent/AGENTS.md           ← 全域指引(個人偏好)
  ↓
~/projects/company/AGENTS.md    ← 公司層級指引
  ↓
~/projects/company/my-app/AGENTS.md  ← 專案層級指引(cwd)

Pi 會依序載入從 cwd 到根目錄路徑上所有找到的 AGENTS.md,全部注入系統提示。

Project Trust 機制(v0.80+)

Pi 在互動模式啟動時,會對含有 .pi/ 目錄或 .agents/skills 的專案進行信任決策。未受信任的專案不會載入其本地 Extension、設定與 Skills,確保安全:

情境行為
首次進入含 .pi/ 的專案顯示信任提示,等候使用者決定
已儲存信任決策直接套用(存於 ~/.pi/agent/trust.json
非互動模式(-p、RPC、JSON)defaultProjectTrust 設定決定(預設 ask
CLI 覆蓋--approve / -a 強制信任;--no-approve / -na 強制拒絕
# 在互動模式中儲存信任決策
/trust

# 全域設定預設行為(settings.json)
{
  "defaultProjectTrust": "ask"  // "ask" | "always" | "never"
}

企業建議:在 CI/CD 環境中建議設定 defaultProjectTrust: "always" 或使用 --approve 旗標,避免自動化流程卡在信任提示。生產環境的安全邊界應由容器化(§16)而非 Trust 機制來保障。

6.2 AGENTS.md 撰寫最佳實務

# AGENTS.md - Spring Boot 微服務專案

## 技術棧
- Java 21 + Spring Boot 3.5 + Spring Cloud 2024
- PostgreSQL 16 + Redis 7 + Kafka 3.x
- Vue 3 + TypeScript + Tailwind CSS

## 架構原則
- Clean Architecture:Controller → Service → Repository
- 所有 API 必須有 OpenAPI 3.0 文件
- 禁止在 Controller 中寫業務邏輯

## 程式碼規範
- 測試覆蓋率 > 80%
- 所有 public 方法需有 JavaDoc
- 使用 Lombok @Slf4j 記錄日誌
- 例外處理使用 @ControllerAdvice

## 禁止事項
- 不得使用 System.out.println
- 不得在程式碼中硬編碼密碼或金鑰
- 不得跳過測試

6.3 SYSTEM.md vs APPEND_SYSTEM.md

用途使用的檔案範例場景
完全覆蓋系統提示SYSTEM.md建構特殊用途 Agent(如 SQL-only Agent)
在預設提示上增補APPEND_SYSTEM.md加入團隊特有的安全檢查清單
CLI 附加--append-system-prompt "..."臨時增加指令(支援多次使用)
禁用 Context Files--no-context-files / -nc乾淨執行,不載入任何專案 Context
# 範例:使用 SYSTEM.md 建構唯讀稽核 Agent
cat > SYSTEM.md << 'EOF'
You are a code auditor. You can only use read, grep, and find tools.
Never modify any files. Report findings in a structured format.
EOF

# 範例:附加安全檢查到現有提示
cat > APPEND_SYSTEM.md << 'EOF'
## Additional Security Requirements
- Always check for SQL injection vulnerabilities
- Flag any hardcoded credentials
- Verify input validation on all API endpoints
EOF

7. PLAN.md 開發模式

7.1 為什麼 Pi 不用 Plan Mode

議題內建 Plan ModePLAN.md
可版控✅ Git 追蹤
跨會話共享✅ 任何 Session 可讀
多人協作✅ 團隊共同編輯
透明度❌ 黑盒✅ 純文字
格式自由❌ 固定格式✅ 自訂格式
AI 可讀寫❌ 僅 AI 內部✅ AI + 人類皆可

7.2 PLAN.md 範本

# PLAN.md - 使用者管理模組

## 專案資訊
- **模組名稱**:User Management
- **負責人**:@chihhung
- **Sprint**:Sprint 23(2026/04/21 - 2026/05/02)
- **狀態**:🔄 進行中

## 目標
建立完整的使用者管理功能,包含 CRUD、搜尋、權限控制。

## 任務分解

### Phase 1:後端 API(預估 3 天)

- [x] 建立 User Entity + JPA 設定
- [x] 建立 UserRepository
- [ ] 建立 UserService(含業務邏輯)
  - [ ] createUser()
  - [ ] updateUser()
  - [ ] deleteUser()
  - [ ] searchUsers()
- [ ] 建立 UserController
  - [ ] POST /api/users
  - [ ] PUT /api/users/{id}
  - [ ] DELETE /api/users/{id}
  - [ ] GET /api/users?keyword=xxx&page=0&size=20
- [ ] 建立 UserDTO + Mapper
- [ ] 撰寫 JUnit 測試(覆蓋率 > 80%)

### Phase 2:前端 UI(預估 2 天)

- [ ] UserList.vue - 使用者列表
- [ ] UserForm.vue - 新增/編輯表單
- [ ] UserDetail.vue - 使用者詳情
- [ ] API 整合(axios)
- [ ] 元件測試

### Phase 3:進階功能(預估 2 天)

- [ ] 角色權限(RBAC)
- [ ] 操作日誌(Audit Log)
- [ ] 匯出 Excel

## 技術決策
- 使用 Spring Data JPA Specification 做動態查詢
- DTO 轉換使用 MapStruct
- 密碼加密使用 BCrypt
- API 文件使用 SpringDoc OpenAPI

## 注意事項
- 所有 API 需加入 @PreAuthorize 權限控制
- 密碼欄位不得出現在 Response 中
- 刪除改用軟刪除(isDeleted flag)

7.3 任務拆解原則

graph TD
    EPIC[Epic / 使用者故事] --> F1[Feature 1]
    EPIC --> F2[Feature 2]
    F1 --> T1[Task 1.1 - Entity]
    F1 --> T2[Task 1.2 - Repository]
    F1 --> T3[Task 1.3 - Service]
    F1 --> T4[Task 1.4 - Controller]
    F1 --> T5[Task 1.5 - Test]
    F2 --> T6[Task 2.1 - Vue 元件]
    F2 --> T7[Task 2.2 - API 整合]
    F2 --> T8[Task 2.3 - 元件測試]

拆解原則

  1. 每個 Task 應在 30 分鐘內完成
  2. 每個 Task 應有明確的完成標準
  3. Task 之間的依賴關係要清楚標示
  4. 使用 Checkbox 追蹤進度

7.4 Sprint 規劃範例

# Sprint 23 PLAN.md

## Sprint 目標
完成使用者管理模組的後端 API 與前端 UI。

## 每日任務安排

### Day 1(Mon)
- [ ] 設計 DB Schema(users, roles, user_roles)
- [ ] 建立 Entity + Repository
- [ ] Pi Prompt: "根據 PLAN.md 的 DB Schema 建立 JPA Entity"

### Day 2(Tue)
- [ ] 建立 Service Layer
- [ ] Pi Prompt: "建立 UserService,實作 PLAN.md Phase 1 的所有方法"

### Day 3(Wed)
- [ ] 建立 Controller + DTO
- [ ] 撰寫 Swagger 文件
- [ ] Pi Prompt: "建立 UserController,使用 SpringDoc 註解"

### Day 4(Thu)
- [ ] 撰寫 JUnit 測試
- [ ] Pi Prompt: "為 UserService 撰寫完整的 JUnit 5 測試"

### Day 5(Fri)
- [ ] 前端 UserList.vue
- [ ] Pi Prompt: "建立 UserList.vue,使用 Composition API + Tailwind"

## Retrospective(Sprint 結束後填寫)
- 什麼做得好:
- 什麼需要改進:
- Pi 使用心得:

7.5 實戰:開發 Web API 的 PLAN.md

在 Pi 互動模式中使用 PLAN.md:

> 請讀取 PLAN.md,然後開始執行 Phase 1 中尚未完成的第一個任務
> @PLAN.md 目前進度到哪了?請繼續下一個待辦事項
> 我完成了 UserService,請更新 PLAN.md 將該項標記為完成,
> 並告訴我下一步該做什麼

實務建議:每次開始工作前,先讓 Pi 讀取 PLAN.md 了解上下文。這比重新描述需求更有效率,也確保 AI 的輸出與計畫一致。


8. Extensions / Skills / Prompt Templates / Themes

8.1 概覽

Pi 的四大擴充機制:

機制用途載入時機開發語言
Extension自訂工具、命令、快捷鍵、UI、Provider啟動時TypeScript
Skill按需載入的能力包(指令 + 工具)自動匹配或 @skill-name 觸發Markdown + YAML Frontmatter
Prompt Template可重用的 Prompt 範本/name 展開Markdown + YAML Frontmatter
Theme自訂終端配色主題啟動時,支援熱重載JSON

8.2 Prompt Templates

放置位置:

  • 全域:~/.pi/agent/prompts/
  • 專案:.pi/prompts/

範例:Code Review 模板

<!-- .pi/prompts/review.md -->
請對以下程式碼進行 Code Review,檢查:

1. **安全性**:SQL Injection、XSS、CSRF、敏感資訊洩漏
2. **效能**:N+1 Query、不必要的迴圈、記憶體洩漏
3. **可維護性**:命名規範、方法長度、單一職責
4. **測試**:是否有對應測試、邊界條件
5. **Clean Architecture**:是否違反分層規則

目標檔案:{{file}}

請用表格格式輸出發現的問題,包含:嚴重度、行號、問題描述、建議修改。

使用方式:

/review

範例:測試生成模板

<!-- .pi/prompts/gen-test.md -->
請為 {{file}} 生成完整的 JUnit 5 測試:

要求:
1. 使用 @ExtendWith(MockitoExtension.class)
2. 每個 public 方法至少 3 個測試案例(正常、邊界、異常)
3. 使用 @DisplayName 描述測試目的
4. Mock 外部依賴
5. 使用 AssertJ 斷言
6. 測試覆蓋率目標 > 80%

範例:帶引數提示的 Prompt Template

---
argument-hint: 要產生 API 的資源名稱(如 User, Order)
---
請為 {{input}} 資源建立完整的 RESTful API:

1. Entity + JPA 註解
2. Repository(Spring Data JPA)
3. Service(含 DTO 轉換)
4. Controller(含 Swagger 註解)
5. JUnit 測試

8.3 Skills

Skills 遵循 Agent Skills 標準,是按需載入的能力包。LLM 會根據上下文自動選擇適當的 Skill,或由使用者透過 @skill-name 手動觸發。

放置位置:

  • 全域:~/.pi/agent/skills/
  • 專案:.pi/skills/.agents/skills/(兩者皆支援)

範例:資料庫遷移 Skill

<!-- .pi/skills/db-migration/SKILL.md -->
# Database Migration Skill

使用此 Skill 管理資料庫 Schema 遷移。

## 工具

### flyway-migrate
執行 Flyway 遷移:
```bash
mvn flyway:migrate

flyway-info

查看遷移狀態:

mvn flyway:info

步驟

  1. src/main/resources/db/migration/ 下建立遷移檔案
  2. 命名規範:V{版號}__{描述}.sql(如 V1.0__create_users_table.sql
  3. 執行 flyway-migrate 套用變更
  4. 執行 flyway-info 確認狀態

注意事項

  • 已套用的遷移檔案不可修改
  • 使用 V 前綴做版本遷移,R 前綴做可重複遷移
  • 生產環境遷移前必須先在 SIT/UAT 驗證

使用方式:

/skill:db-migration

或 AI 會根據上下文自動載入相關 Skill。

### 8.4 Extensions

Extensions 是 TypeScript 模組,擁有完整的 Pi API 存取權限。預設匯出函式可為同步或 `async`——Pi 會等待非同步初始化完成後才繼續啟動,這對需要在啟動前取得遠端模型清單的場景特別有用。

放置位置:
- 全域:`~/.pi/agent/extensions/`
- 專案:`.pi/extensions/`(需通過 Project Trust)

#### Extension 能力一覽

| 能力 | 說明 |
|------|------|
| 自訂工具 | 註冊新工具或完全取代內建工具(含 `promptSnippet` / `promptGuidelines`) |
| 並行工具安全 | 使用 `withFileMutationQueue()` 確保並行工具不互相覆寫檔案 |
| 子代理(Sub-agents) | 委派任務給專業化子代理,使用隔離的上下文視窗 |
| Plan Mode | 實作 Claude Code 風格的計畫模式(含步驟追蹤、進度 Widget) |
| 自訂壓縮 | 自訂上下文壓縮與摘要策略(含 `session_before_compact` 事件) |
| 權限閘門 | 路徑保護與危險操作確認(含 `project_trust` 事件) |
| 自訂編輯器與 UI | 替換編輯器(Vim/Emacs 模式)、Overlay 浮動面板、Widget、Status Line、Header/Footer |
| Autocomplete Provider | 自訂編輯器自動補全(如 GitHub Issue `#` 補全) |
| SSH / Sandbox 執行 | 透過 SSH 委派工具到遠端、Gondolin micro-VM 沙箱 |
| MCP 伺服器整合 | 透過 Extension 連接 MCP 伺服器 |
| Git 自動化 | Checkpoint、Auto-commit、Merge 與衝突解決 |
| 自訂 Provider | 實作自訂 LLM Provider(含 OAuth、動態模型探索) |
| 遊戲 | Doom(Overlay)、Snake、Space Invaders 等(等待時娛樂) |

#### Extension 生命週期(v0.80+ 完整事件流)

pi starts ├─► project_trust(決定是否信任專案) ├─► session_start { reason: “startup” } └─► resources_discover { reason: “startup” } │ user sends prompt ├─► input(可攔截、轉換或處理) ├─► before_agent_start(可注入訊息、修改系統提示) ├─► agent_start │ ┌─── turn(LLM 呼叫工具時重複) ───┐ │ ├─► turn_start │ ├─► context(可修改訊息歷史) │ ├─► before_provider_request │ ├─► after_provider_response │ │ ├─► tool_execution_start │ │ ├─► tool_call(可阻擋) │ │ ├─► tool_result(可修改) │ │ └─► tool_execution_end │ └─► turn_end └─► agent_end

session switch/fork/exit ├─► session_before_switch / session_before_fork ├─► session_shutdown └─► session_start { reason: “new” | “resume” | “fork” }


> **重要設計原則**:
> - Extension factory 中**不應**啟動背景資源(進程、Socket、Timer);應延遲到 `session_start` 或首次使用時
> - 使用 `session_shutdown` 清理 Session 生命週期中開啟的資源
> - Async factory 會阻擋啟動流程直到完成——適合用於從遠端取得模型清單

#### 範例 1:Git Checkpoint Extension

```typescript
// .pi/extensions/git-checkpoint.ts
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";

export default function (pi: ExtensionAPI) {
  // 在每次工具呼叫後自動 Git Commit
  pi.on("tool_result", async (event, ctx) => {
    if (event.toolName === "write" || event.toolName === "edit") {
      const filePath = event.args?.filePath || event.args?.file_path;
      if (filePath) {
        await ctx.bash(`git add ${filePath} && git commit -m "pi: auto-checkpoint ${filePath}" --no-verify`, {
          silent: true,
        });
      }
    }
  });

  // 註冊 rollback 命令
  pi.registerCommand("rollback", {
    description: "回滾到上一個 Git checkpoint",
    handler: async (args, ctx) => {
      await ctx.bash("git log --oneline -10");
      ctx.ui.notify("使用 git revert <commit> 來回滾特定變更", "info");
    },
  });
}

範例 2:Permission Gate Extension

// .pi/extensions/permission-gate.ts
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";

export default function (pi: ExtensionAPI) {
  pi.on("tool_call", async (event, ctx) => {
    // 攔截危險的 bash 命令
    if (event.toolName === "bash" && event.input.command?.includes("rm -rf")) {
      const ok = await ctx.ui.confirm("⚠️ 危險操作", "確定要執行 rm -rf 嗎?");
      if (!ok) return { block: true, reason: "使用者取消了危險操作" };
    }
  });
}

範例 3:自訂工具(使用 TypeBox Schema)

// .pi/extensions/deploy-tool.ts
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { Type } from "typebox";
import { StringEnum } from "@earendil-works/pi-ai";

export default function (pi: ExtensionAPI) {
  pi.registerTool({
    name: "deploy",
    label: "Deploy",
    description: "部署應用程式到指定環境",
    parameters: Type.Object({
      // 使用 StringEnum 確保 Google API 相容性
      environment: StringEnum(["dev", "sit", "uat"] as const, {
        description: "目標環境",
      }),
      version: Type.String({ description: "版本號(如 1.2.3)" }),
    }),
    async execute(toolCallId, params, onUpdate, ctx, signal) {
      if (params.environment === "prod") {
        return {
          content: [{ type: "text", text: "生產環境部署必須透過 CI/CD Pipeline" }],
          details: { blocked: true },
        };
      }

      ctx.ui.notify(`開始部署 v${params.version} 到 ${params.environment}...`, "info");

      const result = await ctx.bash(
        `./scripts/deploy.sh --env ${params.environment} --version ${params.version}`
      );

      return {
        content: [{ type: "text", text: result }],
        details: { environment: params.environment, version: params.version },
      };
    },
  });
}

重要提醒:定義工具參數的字串列舉時,務必使用 StringEnum(來自 @earendil-works/pi-ai)而非 Type.Union([Type.Literal(...)]),後者在 Google API 中無法正常運作。

範例 4:並行工具檔案安全(withFileMutationQueue)

Pi 預設並行執行同一批次中的工具呼叫。當多個工具同時修改同一檔案時,可能發生 race condition。使用 withFileMutationQueue() 確保安全:

import { withFileMutationQueue } from "@earendil-works/pi-coding-agent";
import { readFile, writeFile } from "node:fs/promises";
import { resolve } from "node:path";

async execute(_toolCallId, params, _signal, _onUpdate, ctx) {
  const absolutePath = resolve(ctx.cwd, params.path);

  // 佇列化整個讀取-修改-寫入操作
  return withFileMutationQueue(absolutePath, async () => {
    const current = await readFile(absolutePath, "utf8");
    const next = current.replace(params.oldText, params.newText);
    await writeFile(absolutePath, next, "utf8");

    return {
      content: [{ type: "text", text: `Updated ${params.path}` }],
      details: {},
    };
  });
}

設計要點:佇列化的範圍應涵蓋整個 read-modify-write 操作,而非僅最後的 write。Pi 會透過 realpath() 統一 symlink 別名,確保同一檔案的所有修改都排入同一佇列。

範例 5:自訂 Autocomplete Provider

在編輯器中新增自訂自動補全邏輯(如 GitHub Issue # 補全),疊加在內建的斜線命令與路徑補全之上:

import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";

export default function (pi: ExtensionAPI) {
  pi.on("session_start", async (_event, ctx) => {
    // 從 GitHub CLI 預載 issue 列表
    const result = await pi.exec("gh", ["issue", "list", "--json", "number,title", "-L", "50"]);
    const issues = JSON.parse(result.stdout || "[]");

    ctx.ui.addAutocompleteProvider((current) => ({
      triggerCharacters: ["#"],
      async getSuggestions(lines, line, col, options) {
        const beforeCursor = (lines[line] ?? "").slice(0, col);
        const match = beforeCursor.match(/(?:^|[ \t])#([^\s#]*)$/);
        if (!match) return current.getSuggestions(lines, line, col, options);

        return {
          prefix: `#${match[1] ?? ""}`,
          items: issues.map((i: any) => ({
            value: `#${i.number}`,
            label: `#${i.number}`,
            description: i.title,
          })),
        };
      },
      applyCompletion: current.applyCompletion,
      shouldTriggerFileCompletion: current.shouldTriggerFileCompletion,
    }));
  });
}

範例 6:Custom Editor(Vim 模式)

替換 Pi 的預設編輯器為 Vim 風格的模態編輯器:

import { CustomEditor, type ExtensionAPI } from "@earendil-works/pi-coding-agent";
import { matchesKey } from "@earendil-works/pi-tui";

class VimEditor extends CustomEditor {
  private mode: "normal" | "insert" = "insert";

  handleInput(data: string): void {
    if (matchesKey(data, "escape") && this.mode === "insert") {
      this.mode = "normal";
      return;
    }
    if (this.mode === "normal" && data === "i") {
      this.mode = "insert";
      return;
    }
    super.handleInput(data); // 委派給內建的 app 快捷鍵 + 文字編輯
  }
}

export default function (pi: ExtensionAPI) {
  pi.on("session_start", (_event, ctx) => {
    ctx.ui.setEditorComponent((_tui, theme, keybindings) =>
      new VimEditor(theme, keybindings)
    );
  });
}

進階 UI 能力:v0.80+ 支援 Overlay 浮動面板(ctx.ui.custom({ overlay: true }))、自訂 Footer(ctx.ui.setFooter())、Working Indicator 動畫(ctx.ui.setWorkingIndicator())、以及帶 Timeout 的對話框(ctx.ui.confirm("...", { timeout: 5000 }))。完整 TUI API 見 tui.md

8.5 自動生成 Extension

你可以直接請 Pi 幫你寫 Extension:

> 幫我寫一個 Pi Extension,功能如下:
> 1. 註冊一個 /stats 命令,顯示目前專案的程式碼統計(行數、檔案數)
> 2. 在每次 Session 開始時,自動載入 PLAN.md 的內容
> 3. 把 Extension 放在 .pi/extensions/ 目錄下

8.6 Pi Packages(套件分享)

將 Extension、Skill、Prompt Template、Theme 打包為 Pi Package。可在 npmjs.comDiscord 上搜尋社群套件。

// package.json
{
  "name": "@myteam/pi-enterprise-tools",
  "version": "1.0.0",
  "keywords": ["pi-package"],
  "pi": {
    "extensions": ["./extensions"],
    "skills": ["./skills"],
    "prompts": ["./prompts"],
    "themes": ["./themes"]
  }
}

自動探索:若 package.json 中沒有 pi 欄位,Pi 會自動從慣例目錄(extensions/skills/prompts/themes/)中探索資源。

安裝與管理:

# 從 npm 安裝
pi install npm:@myteam/pi-enterprise-tools

# 從 npm 安裝指定版本(pinned version)
pi install npm:@myteam/pi-enterprise-tools@1.2.3

# 從 Git 安裝(支援多種 URL 格式)
pi install git:github.com/myteam/pi-enterprise-tools
pi install git:github.com/myteam/pi-enterprise-tools@v1.3.0  # pin 到 tag
pi install git:git@github.com:myteam/pi-enterprise-tools       # SSH 格式
pi install https://github.com/myteam/pi-enterprise-tools        # HTTPS 格式
pi install ssh://git@github.com/myteam/pi-enterprise-tools      # SSH URL 格式

# 專案本地安裝(僅當前專案,不影響全域)
pi install npm:@myteam/pi-enterprise-tools -l

# 列出已安裝套件
pi list

# 更新所有套件(跳過 pinned 版本)
pi update

# 更新 Pi 本體 + 所有已安裝套件(含 reconcile pinned git refs)
pi update --all

# 僅更新 Pi 本體
pi update --self

# 強制重新安裝 Pi 本體
pi update --self --force

# 僅更新所有已安裝 Extension 套件
pi update --extensions

# 更新特定套件
pi update npm:@myteam/pi-enterprise-tools

# 移除套件(remove 與 uninstall 為同義)
pi remove npm:@myteam/pi-enterprise-tools
pi uninstall npm:@myteam/pi-enterprise-tools

# 啟用/停用已安裝資源
pi config

Pinned 版本行為:Git 套件使用 @ref 指定的 tag 或 commit 為 pinned 版本,pi update 時會跳過。若要移至新版,需重新執行 pi install git:host/user/repo@new-ref

Node 版本管理器整合:若使用 mise、nvm 等版本管理器,可在 settings.json 中設定 "npmCommand": ["mise", "exec", "node@20", "--", "npm"],確保套件安裝使用穩定的 npm 環境。

安全提醒:Pi Packages 擁有完整的系統存取權限。Extension 可執行任意程式碼,Skill 可指示模型執行任何操作。安裝第三方套件前,請務必審查原始碼

8.7 Themes(配色主題)

自訂終端 UI 的配色方案:

放置位置:

  • 全域:~/.pi/agent/themes/
  • 專案:.pi/themes/
// .pi/themes/corporate.json
{
  "name": "Corporate Blue",
  "colors": {
    "primary": "#0078D4",
    "secondary": "#106EBE",
    "accent": "#FFB900",
    "background": "#1E1E1E",
    "text": "#D4D4D4",
    "success": "#4CAF50",
    "error": "#F44336",
    "warning": "#FF9800"
  }
}

settings.json 中指定主題:

{
  "theme": "corporate"
}

提示:主題支援 /reload 熱重載,修改後不需重啟 Pi。


9. Pi Agent + SSDLC(企業重點)

9.1 SSDLC 流程概覽

graph LR
    subgraph "SSDLC with Pi Agent"
        REQ[需求分析] --> DES[安全設計]
        DES --> DEV[安全開發]
        DEV --> TEST[安全測試]
        TEST --> REV[Code Review]
        REV --> SCAN[安全掃描]
        SCAN --> DEPLOY[安全部署]
        DEPLOY --> MON[監控維運]
        MON --> OPT[持續優化]
        OPT --> REQ
    end

9.2 各階段 Pi 整合方式

(1) 安全設計(Secure Design)

> @PLAN.md 請針對使用者管理模組進行威脅模型分析(Threat Modeling),
> 使用 STRIDE 方法,並產出安全設計文件

(2) 安全開發(Secure Coding)

建立 Secure Coding 的 Prompt Template:

<!-- .pi/prompts/secure-code.md -->
請在撰寫程式碼時遵循以下安全規範:

1. **輸入驗證**:所有外部輸入必須驗證(使用 Jakarta Validation)
2. **SQL 防注入**:使用 JPA Parameterized Query,禁止字串拼接
3. **XSS 防護**:輸出編碼,使用 OWASP Java Encoder
4. **CSRF 防護**:啟用 Spring Security CSRF Token
5. **認證授權**:使用 @PreAuthorize 控制 API 存取
6. **敏感資料**:密碼使用 BCrypt,日誌不得記錄敏感欄位
7. **錯誤處理**:不得將堆疊追蹤回傳給客戶端
8. **依賴安全**:不使用已知漏洞的依賴

(3) AI Code Review

# 使用唯讀模式進行安全審查
pi --tools read,grep,find,ls -p \
  "請對 src/main/java/com/example/controller/ 目錄下的所有 Controller 進行安全審查,
   檢查 OWASP Top 10 風險,以表格格式輸出結果"

(4) SAST / DAST 整合

<!-- .pi/skills/security-scan/SKILL.md -->
# Security Scan Skill

## SAST(靜態分析)
```bash
# SpotBugs 安全掃描
mvn spotbugs:check

# SonarQube 掃描
mvn sonar:sonar -Dsonar.host.url=http://sonarqube:9000
```

## Dependency Scan
```bash
# OWASP Dependency Check
mvn org.owasp:dependency-check-maven:check
```

## 步驟
1. 執行 SAST 掃描
2. 分析報告
3. 修復發現的漏洞
4. 重新掃描驗證

(5) CI/CD 安全整合

# .github/workflows/ssdlc.yml
name: SSDLC Pipeline

on:
  pull_request:
    branches: [main, develop]

jobs:
  security-scan:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup Java
        uses: actions/setup-java@v4
        with:
          distribution: 'temurin'
          java-version: '21'

      - name: SAST - SpotBugs
        run: mvn spotbugs:check

      - name: Dependency Check
        run: mvn org.owasp:dependency-check-maven:check

      - name: Unit Tests
        run: mvn test

      - name: AI Code Review (Pi)
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          npm install -g --ignore-scripts @earendil-works/pi-coding-agent
          pi --tools read,grep,find,ls -p \
            "Review all changed files for security issues. Output as JSON." \
            --mode json > review-results.json

      - name: Upload Results
        uses: actions/upload-artifact@v4
        with:
          name: security-reports
          path: |
            target/spotbugsXml.xml
            target/dependency-check-report.html
            review-results.json

9.3 DevSecOps 流程圖

graph TB
    subgraph "Development(Pi Agent)"
        CODE[撰寫程式碼] --> REVIEW[AI Code Review]
        REVIEW --> FIX[修復問題]
        FIX --> COMMIT[Git Commit]
    end

    subgraph "CI Pipeline(GitHub Actions)"
        COMMIT --> BUILD[Build]
        BUILD --> SAST[SAST 掃描]
        BUILD --> DEP[依賴掃描]
        BUILD --> TEST[自動化測試]
        SAST --> GATE{安全門檻}
        DEP --> GATE
        TEST --> GATE
    end

    subgraph "CD Pipeline"
        GATE -->|通過| DEPLOY_DEV[部署 DEV]
        DEPLOY_DEV --> DAST[DAST 掃描]
        DAST --> DEPLOY_SIT[部署 SIT]
        DEPLOY_SIT --> UAT[UAT 驗證]
        UAT --> PROD[部署 PROD]
        GATE -->|失敗| NOTIFY[通知開發者]
        NOTIFY --> CODE
    end

    subgraph "Monitoring"
        PROD --> LOG[日誌監控]
        PROD --> ALERT[告警]
        ALERT --> CODE
    end

實務建議:在 PR 流程中整合 Pi 的非互動模式做自動 Code Review,可以在人工 Review 前先過濾掉明顯的安全問題,大幅提升效率。


10. 實戰案例(Hands-on)

10.1 案例概述

使用 Pi 從零建立一個任務管理系統(Task Manager)

技術棧

  • 後端:Spring Boot 3.5 + Java 21
  • 前端:Vue 3 + TypeScript + Tailwind CSS
  • 資料庫:PostgreSQL 16
  • API 文件:SpringDoc OpenAPI

10.2 Step 1:初始化專案

> 請幫我用 Spring Initializr 建立一個 Spring Boot 3.5 專案:
> - Group: com.example
> - Artifact: task-manager
> - Dependencies: Spring Web, Spring Data JPA, PostgreSQL Driver,
>   Spring Validation, SpringDoc OpenAPI
> - Java 21
> - 使用 Maven

10.3 Step 2:設計 DB Schema

> 設計 Task Manager 的資料庫 Schema:
> 
> tasks 表:
> - id (BIGSERIAL, PK)
> - title (VARCHAR 200, NOT NULL)
> - description (TEXT)
> - status (VARCHAR 20: TODO/IN_PROGRESS/DONE)
> - priority (VARCHAR 10: LOW/MEDIUM/HIGH)
> - assignee (VARCHAR 100)
> - due_date (TIMESTAMP)
> - created_at (TIMESTAMP, DEFAULT NOW())
> - updated_at (TIMESTAMP)
> - is_deleted (BOOLEAN, DEFAULT FALSE)
> 
> 請產生 Flyway 遷移腳本 V1.0__create_tasks_table.sql

10.4 Step 3:建立後端 API

> 根據 tasks 表建立完整的後端程式碼:
> 
> 1. TaskEntity.java - JPA Entity
> 2. TaskRepository.java - Spring Data JPA Repository
> 3. TaskService.java - 業務邏輯(含 DTO 轉換)
> 4. TaskController.java - REST API Controller
> 5. TaskDTO.java - 資料傳輸物件
> 6. TaskStatus.java / TaskPriority.java - Enum
> 
> API 規格:
> - POST   /api/tasks         建立任務
> - GET    /api/tasks          查詢任務列表(支援分頁、篩選)
> - GET    /api/tasks/{id}     查詢單一任務
> - PUT    /api/tasks/{id}     更新任務
> - DELETE /api/tasks/{id}     軟刪除任務
> 
> 要求:
> - 使用 Clean Architecture 分層
> - 加入 Jakarta Validation
> - 加入 SpringDoc Swagger 註解
> - 使用 Specification 做動態查詢

10.5 Step 4:撰寫測試

> 為 TaskService 撰寫完整的 JUnit 5 測試:
> - 使用 MockitoExtension
> - 每個方法至少 3 個測試案例
> - 包含正常流程、邊界條件、異常處理
> - 使用 AssertJ 斷言

10.6 Step 5:建立前端

> 使用 Vue 3 + TypeScript + Tailwind CSS 建立前端頁面:
> 
> 1. TaskList.vue - 任務列表頁
>    - 表格顯示所有任務
>    - 支援狀態篩選、搜尋
>    - 分頁功能
>    
> 2. TaskForm.vue - 新增/編輯任務的表單
>    - 表單驗證
>    - 日期選擇器
>    
> 3. api/taskApi.ts - API 呼叫層
>    - 使用 axios
>    - 統一錯誤處理

10.7 Step 6:部署配置

> 建立部署配置:
> 
> 1. Dockerfile(多階段建置)
> 2. docker-compose.yml(含 PostgreSQL)
> 3. application-dev.yml
> 4. application-prod.yml(敏感資訊用環境變數)

10.8 完整開發流程圖

sequenceDiagram
    participant DEV as 開發者
    participant PI as Pi Agent
    participant GIT as Git
    participant CI as CI/CD

    DEV->>PI: 讀取 PLAN.md,開始 Phase 1
    PI->>PI: 生成 Entity + Repository
    DEV->>PI: 確認,繼續 Service
    PI->>PI: 生成 Service + DTO
    DEV->>PI: 確認,繼續 Controller
    PI->>PI: 生成 Controller + Swagger
    DEV->>PI: 生成測試
    PI->>PI: 生成 JUnit 測試
    DEV->>PI: !mvn test (執行測試)
    PI->>DEV: 測試結果:12 passed, 0 failed
    DEV->>PI: 更新 PLAN.md,開始 Phase 2
    PI->>PI: 生成 Vue 元件
    DEV->>GIT: git push
    GIT->>CI: 觸發 Pipeline
    CI->>CI: Build → Test → Scan → Deploy

實務建議:每完成一個 Phase,使用 /compact 壓縮上下文,避免 Token 用量過高。同時用 /tree 標記重要節點方便回溯。


11. 維運與監控(Operations)

11.1 Log 設計

Pi 的所有操作記錄在 Session 檔案中(JSONL 格式):

# Session 儲存位置
ls ~/.pi/agent/sessions/

# 匯出 Session 為 HTML(方便閱讀與分享)
pi --export session-file.jsonl output.html

# 上傳為 GitHub Gist 分享
# 在互動模式中使用 /share 命令

建議的 Log 管理策略

# 定期清理過舊的 Session
find ~/.pi/agent/sessions/ -name "*.jsonl" -mtime +30 -delete

# 保留重要 Session(加入 Git 追蹤)
cp ~/.pi/agent/sessions/important-session.jsonl \
   ./docs/ai-sessions/

11.2 Agent 行為監控

# 使用 JSON 模式監控 Agent 行為
pi --mode json -p "執行安全掃描" 2>&1 | tee agent-log.json

# 監控 Token 使用量
# 在互動模式中,Footer 會即時顯示:
# - Total Tokens
# - Cache Usage
# - Cost(美元)

使用 /session 命令查看統計

/session
# 輸出:
# Session ID: abc123
# Messages: 45
# Total Tokens: 125,000
# Cache Tokens: 89,000
# Cost: $0.42

11.3 Debug 方法

狀況解法
Agent 產出的程式碼有 Bug貼上錯誤訊息,讓 Pi 分析修復
Agent 不遵循 AGENTS.md檢查 AGENTS.md 格式是否正確,重啟 Session
Context 過大導致回應品質下降使用 /compact 壓縮上下文
Extension 不運作使用 --verbose 啟動查看載入日誌
工具呼叫失敗Ctrl+O 展開工具輸出查看錯誤
# Verbose 模式啟動(顯示詳細載入資訊)
pi --verbose

11.4 成本控制

Token 使用量最佳化

策略說明
使用 Compaction自動壓縮舊訊息,減少 Token 用量
選擇適當模型簡單任務用小模型(如 Haiku),複雜任務用大模型
善用 Prompt Cache固定的系統提示會被快取,降低成本
唯讀模式Code Review 使用 --tools read 避免不必要的工具呼叫
非互動模式明確任務用 -p 模式,避免多輪對話
# 延長 Prompt Cache(降低重複成本)
export PI_CACHE_RETENTION=long
# Anthropic: 1 小時快取
# OpenAI: 24 小時快取

成本估算參考(以 Claude Sonnet 為例)

任務類型預估 Token預估成本
生成一個 CRUD API5,000-10,000$0.03-0.06
Code Review(單檔)3,000-5,000$0.02-0.03
完整模組開發(1 天)50,000-100,000$0.30-0.60
Sprint(5 天)250,000-500,000$1.50-3.00

實務建議:建議團隊設定每月 Token 預算上限,並透過 /session 定期檢視成本。使用 Ctrl+P 切換模型可以有效控制成本——初步探索用低成本模型,精細調整用高品質模型。


12. 升級與版本管理(Upgrade Strategy)

12.1 Pi 升級方式

# 查看當前版本
pi --version

# 升級到最新版(建議方式)
pi update --self

# 強制重新安裝(即使版本相同)
pi update --self --force

# 或使用 npm 手動升級
npm update -g @earendil-works/pi-coding-agent

# 安裝特定版本
npm install -g --ignore-scripts @earendil-works/pi-coding-agent@0.80.2

# 查看更新日誌
# 在互動模式中
/changelog

v0.80.2 重點更新摘要

功能說明
容器化支援新增 Gondolin(micro-VM)、Plain Docker、OpenShell 三種沙箱模式
Project Trust專案信任機制,控制是否載入專案本地 Extension 與設定
Pi Orchestrator(實驗性)多代理協調器,支援自動化任務分派
Custom Editor API完整的自訂編輯器 API(Vim/Emacs 模式支援)
Overlay 元件浮動面板 UI,支援定位、焦點管理、響應式顯示
Autocomplete Provider可疊加的自訂自動補全邏輯(如 #issue 補全)
withFileMutationQueue並行工具檔案修改佇列,防止 race condition
Supply-chain 強化npm-shrinkwrap、依賴釘選、lifecycle scripts 白名單
Named Startup Sessions--name / -n 在啟動時命名 Session
可點擊檔案路徑OSC 8 file:// 超連結,支援 tmux
NVIDIA / Ollama Provider新增本地模型與 NVIDIA GPU 推論支援
pi update –all一次更新 Pi 本體與所有已安裝套件
Timed Dialogs帶倒計時的對話框(timeout 選項)
before_provider_request攔截並修改 Provider 請求 payload
after_provider_response接收 HTTP 狀態碼與回應標頭

12.2 升級前檢查清單

  1. ✅ 備份自訂 Extension(~/.pi/agent/extensions/
  2. ✅ 備份設定檔(~/.pi/agent/settings.json
  3. ✅ 檢查 CHANGELOG 是否有 Breaking Change
  4. ✅ 在非生產環境先測試
  5. ✅ 確認 Extension API 相容性

12.3 Prompt / Extension 版本管理

# 建議將 Pi 配置納入 Git 版控
your-project/
├── .pi/
│   ├── settings.json          # Git 追蹤
│   ├── extensions/            # Git 追蹤
│   │   ├── git-checkpoint.ts
│   │   └── permission-gate.ts
│   ├── skills/                # Git 追蹤
│   ├── prompts/               # Git 追蹤
│   └── .gitignore             # 排除 npm/git 安裝的套件
├── AGENTS.md                  # Git 追蹤
├── PLAN.md                    # Git 追蹤
└── ...

.pi/.gitignore 建議內容:

# 安裝的第三方套件
npm/
git/

12.4 與 Git 整合策略

graph LR
    subgraph "Git Branch Strategy"
        MAIN[main] --> DEV[develop]
        DEV --> FEAT[feature/xxx]
        FEAT --> DEV
        DEV --> MAIN
    end

    subgraph "Pi 配置隨分支管理"
        FEAT --> |.pi/| PI_FEAT[分支專屬 Prompt]
        DEV --> |.pi/| PI_DEV[開發環境設定]
        MAIN --> |.pi/| PI_MAIN[正式環境設定]
    end

實務建議:每次 Pi 大版本更新(如 0.67 → 0.68)時,建議先在 Feature Branch 測試,確認所有自訂 Extension 正常運作後再合併到 develop。


13. OSS Session 共享與社群貢獻

13.1 為什麼共享 Session 很重要

Pi 官方積極推動開源 Session 共享計畫。公開的 OSS 編碼 Session 資料可協助改善:

  • 模型品質:提供真實世界開發工作流,取代人工基準測試
  • 提示工程:發現有效的 Prompt 模式與反模式
  • 工具呼叫:優化工具使用策略與錯誤恢復
  • 評估基準:建立基於真實任務的評估資料集

13.2 共享方式

使用 badlogic/pi-share-hf 工具將 Session 上傳至 Hugging Face:

# 前置需求
# 1. Hugging Face 帳戶
# 2. Hugging Face CLI
# 3. pi-share-hf 工具

# 安裝 pi-share-hf
git clone https://github.com/badlogic/pi-share-hf
cd pi-share-hf
# 依照 README.md 完成設定

# Pi 內建的分享方式
/share  # 上傳為 private GitHub Gist,產生可分享 HTML 連結
/export session.html  # 匯出為 HTML 檔案

13.3 社群參與管道

管道說明
Discord社群討論、套件分享、問題求助
GitHub Discussions功能討論與提案
GitHub IssuesBug 回報(新貢獻者的 Issue/PR 預設自動關閉,維護者每日審查)
CONTRIBUTING.md貢獻指南
Hugging Face 資料集Mario Zechner 的 pi-mono 工作 Session 公開資料集

企業建議:企業內部也可建立自己的 Session 資料庫,用於新人訓練、最佳實務傳承、以及團隊開發模式分析。使用 /export 匯出的 HTML 檔案可納入內部知識管理系統。


14. Best Practices(企業建議)

14.1 團隊使用規範

統一開發環境

# 在專案根目錄放置 .nvmrc
echo "20" > .nvmrc

# 在 AGENTS.md 中明確指定規範
# 所有成員使用相同的 AGENTS.md

程式碼品質標準

規範標準
測試覆蓋率> 80%
Code Review人工 + AI 雙重審查
Commit MessageConventional Commits
分支策略Git Flow 或 Trunk-based
文件Swagger + JavaDoc

14.2 Prompt Engineering 原則

原則一:具體明確

❌ 不好的 Prompt:
"幫我寫一個 API"

✅ 好的 Prompt:
"建立 GET /api/tasks API,支援以下查詢參數:
- status (enum: TODO/IN_PROGRESS/DONE)
- priority (enum: LOW/MEDIUM/HIGH)
- keyword (模糊搜尋 title 和 description)
- page (預設 0)
- size (預設 20)
回傳 Page<TaskDTO>,使用 Spring Data JPA Specification"

原則二:提供上下文

✅ 好的做法:
> @src/main/java/com/example/entity/Task.java
> @src/main/java/com/example/repository/TaskRepository.java
> 基於這些既有檔案,建立 TaskService

原則三:分步執行

✅ 好的做法:
第一步:> 建立 TaskEntity.java
第二步:> 確認後,建立 TaskRepository.java
第三步:> 確認後,建立 TaskService.java

❌ 不好的做法:
> 幫我一次建立完整的後端,包含 Entity、Repository、Service、Controller、Test

原則四:善用 Steering Message

在 Pi 工作時,可以用 Enter 送出引導訊息:

(Pi 正在寫 Service...)
> 記得加入交易管理 @Transactional
(Pi 收到後會在當前工具完成後調整)

14.3 Session 管理建議

原則說明
一個功能一個 Session避免 Context 混亂
定期 Compact長 Session 用 /compact 壓縮
標記重要節點使用 /treeShift+L 標記
匯出重要 Session/export/share 保存
使用 /fork從某個節點分支探索不同方案

14.4 團隊導入策略

graph LR
    P1[Phase 1<br/>個人試用] --> P2[Phase 2<br/>小組導入]
    P2 --> P3[Phase 3<br/>團隊推廣]
    P3 --> P4[Phase 4<br/>流程整合]

    P1 --> |2 週| P2
    P2 --> |1 月| P3
    P3 --> |1 月| P4
階段目標行動
Phase 1熟悉工具1-2 位成員試用,建立基礎 Prompt Template
Phase 2建立規範3-5 人小組使用,共建 AGENTS.md 和 Extension
Phase 3全面推廣團隊統一使用,分享最佳實務
Phase 4流程整合整合 CI/CD,建立自動化 Code Review

15. Anti-Patterns(重要)

15.1 不該這樣用 Pi 的方式

Anti-Pattern問題正確做法
🚫 一次要求過大Context 爆掉、品質下降分步執行,每步確認
🚫 不看 AI 輸出直接套用可能有安全漏洞或邏輯錯誤每次輸出都 Review
🚫 不用 AGENTS.mdAI 不了解專案規範維護完整的 AGENTS.md
🚫 長期不 CompactToken 浪費、回應變慢定期 /compact
🚫 把 API Key 寫在程式碼中安全風險使用環境變數
🚫 讓 AI 修改 Production 配置安全風險使用 Permission Gate Extension
🚫 不測試 AI 生成的程式碼品質風險必須跑測試驗證
🚫 直接用 AI 生成的 SQL 跑 DB資料風險先 Review 再執行
🚫 安裝未審查的第三方 Package安全風險審查原始碼後再安裝
🚫 不同步 PLAN.md團隊進度不透明每日更新 PLAN.md

15.2 常見踩雷

踩雷 1:Context Pollution

問題:在同一個 Session 中做了太多不同的事,AI 開始混淆上下文。
解法:一個功能一個 Session。用 /new 開新 Session。

踩雷 2:Model Hallucination

問題:AI 生成了不存在的 API 或方法。
解法:
1. 提供明確的上下文(@file)
2. 使用高思考等級(--thinking high)
3. 要求 AI 先讀取相關檔案再回答

踩雷 3:Prompt Template 衝突

問題:全域和專案層級的 Prompt Template 名稱衝突。
解法:專案層級優先。使用有意義的命名前綴,如 proj-review。

踩雷 4:Extension 相容性

問題:Pi 升級後自訂 Extension 無法載入。
解法:
1. 查看 CHANGELOG 中的 Breaking Changes
2. 使用 --verbose 查看錯誤訊息
3. 更新 Extension API 呼叫

踩雷 5:成本失控

問題:月底發現 API 費用超出預算。
解法:
1. 使用 /session 定期檢視成本
2. 簡單任務用低成本模型(Ctrl+P 切換)
3. 善用 Prompt Cache(PI_CACHE_RETENTION=long)
4. Code Review 用唯讀模式(--tools read)

16. 容器化與沙箱安全(Containerization & Sandboxing)

16.1 為什麼需要容器化

Pi 刻意不內建權限系統。預設情況下,Pi 以啟動它的使用者權限運行,可存取檔案系統、網路與進程。這在開發環境中是合理的,但在以下情境中需要更強的隔離邊界:

情境風險建議方案
執行不受信任的程式碼惡意 Extension 或 LLM 指令可能刪除檔案Gondolin / Docker
多租戶共享環境使用者間缺乏隔離Docker / OpenShell
CI/CD 自動化自動化 Agent 可能修改非預期路徑Docker + --tools 限制
企業合規要求稽核需要明確的安全邊界OpenShell + 政策控制

16.2 三種容器化模式

(1) Gondolin Extension(推薦:開發環境)

Gondolin 將 Pi 主進程與 Provider 認證保留在宿主機,僅將內建工具(readwriteeditbash)與 ! 命令路由到本地 Linux micro-VM:

graph LR
    subgraph "Host(宿主機)"
        PI[Pi 主進程]
        AUTH[API Key / OAuth]
        PI --> AUTH
    end

    subgraph "Gondolin micro-VM"
        TOOLS[內建工具執行]
        FS[隔離檔案系統]
        TOOLS --> FS
    end

    PI -->|工具呼叫路由| TOOLS

特點

  • API Key 不進入 VM,降低洩漏風險
  • 工具呼叫在隔離環境中執行
  • 宿主機的 Extension 仍可正常運作
  • 適合日常開發使用
# 使用 Gondolin Extension
pi -e gondolin

(2) Plain Docker(推薦:CI/CD)

將整個 Pi 進程放入 Docker 容器中執行:

# Dockerfile.pi-agent
FROM node:20-slim

# 安裝 Pi
RUN npm install -g --ignore-scripts @earendil-works/pi-coding-agent

# 安裝常用工具
RUN apt-get update && apt-get install -y git curl jq && rm -rf /var/lib/apt/lists/*

# 設定非 root 使用者
RUN useradd -m -s /bin/bash piuser
USER piuser
WORKDIR /workspace

ENTRYPOINT ["pi"]
# 建構映像
docker build -f Dockerfile.pi-agent -t pi-agent .

# 執行(掛載專案目錄,傳入 API Key)
docker run --rm -it \
  -v $(pwd):/workspace \
  -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
  pi-agent -p "Review the code for security issues"

# CI/CD 中的唯讀審查模式
docker run --rm \
  -v $(pwd):/workspace:ro \
  -e ANTHROPIC_API_KEY=$ANTHROPIC_API_KEY \
  pi-agent --tools read,grep,find,ls -p "Audit this codebase"

企業建議

  • 使用 :ro 唯讀掛載防止意外修改
  • 搭配 --tools read,grep,find,ls 限制可用工具
  • 在 CI Pipeline 中每次建立新容器,確保乾淨環境

(3) OpenShell(推薦:高安全企業環境)

OpenShell 提供政策控制的沙箱,支援細粒度的網路、檔案系統與進程存取控制:

# 使用 OpenShell 沙箱執行 Pi
openshell run --policy strict -- pi -p "Generate unit tests"

特點

  • 支援 RBAC 風格的政策定義
  • 可限制網路出站規則(如僅允許存取 LLM API endpoint)
  • 可限制檔案系統存取範圍
  • 適合金融、醫療等高合規要求行業

16.3 企業容器化部署架構

graph TB
    subgraph "Developer Workstation"
        DEV[開發者]
        GOND[Gondolin micro-VM]
        DEV --> GOND
    end

    subgraph "CI/CD Pipeline"
        GHA[GitHub Actions]
        DOCKER[Docker Container]
        GHA --> DOCKER
    end

    subgraph "Secure Review Environment"
        OPENSHELL[OpenShell Sandbox]
        POLICY[Security Policy]
        OPENSHELL --> POLICY
    end

    subgraph "LLM Providers"
        ANTHROPIC[Anthropic API]
        OPENAI[OpenAI API]
    end

    GOND -->|API 呼叫| ANTHROPIC
    DOCKER -->|API 呼叫| OPENAI
    OPENSHELL -->|受控 API 呼叫| ANTHROPIC

16.4 安全邊界建議

層級機制保護範圍
應用層Permission Gate Extension個別命令攔截(如 rm -rf
專案層Project Trust + .pi/settings.json限制專案載入未審查 Extension
工具層--tools / --exclude-tools限制 Agent 可使用的工具
系統層Gondolin / Docker / OpenShellOS 級別的檔案系統與網路隔離
網路層防火牆 / Proxy限制 API 出站目的地

實務建議:企業環境中建議採用分層防禦策略——開發環境使用 Gondolin + Permission Gate Extension,CI/CD 使用 Docker + 唯讀工具限制,安全審查使用 OpenShell + 嚴格政策。不要僅依賴單一層級的安全機制。


17. 結論(Conclusion)

17.1 Pi Code Agent 的定位

Pi Code Agent 是一個極簡但極度可擴充的 AI 程式碼開發工具。它不試圖成為萬能工具,而是提供一個堅實的基礎框架,讓團隊根據自身需求進行客製化。

17.2 核心價值

價值說明
透明所有操作可見、可追溯、可審計
可控成本可控、行為可控、風險可控
可擴充Extension 可實現任何工作流
無鎖定開源 MIT、多模型支援、無廠商綁定

17.3 建議的導入路徑

  1. 先從 Prompt Template 開始 — 最低學習成本,最高 ROI
  2. 逐步引入 Skills — 按需載入專業能力
  3. 根據痛點開發 Extension — 解決團隊特定問題
  4. 整合 CI/CD — 自動化 Code Review 和安全掃描
  5. 建立 Pi Package — 在團隊間共享最佳實務

17.4 持續學習資源

資源連結
官方網站https://pi.dev/
官方文件https://pi.dev/docs/latest
GitHub 源碼https://github.com/earendil-works/pi
npm 套件https://www.npmjs.com/package/@earendil-works/pi-coding-agent
Discord 社群https://discord.com/invite/3cU7Bz4UPx
Extension 範例https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples/extensions
Skills 範例https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples/skills
Prompt 範例https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples/prompts
Theme 範例https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples/themes
SDK 範例https://github.com/earendil-works/pi/tree/main/packages/coding-agent/examples/sdk
設計哲學部落格https://mariozechner.at/posts/2025-11-30-pi-coding-agent/
為何不需要 MCPhttps://mariozechner.at/posts/2025-11-02-what-if-you-dont-need-mcp/
CHANGELOGhttps://github.com/earendil-works/pi/blob/main/CHANGELOG.md
Agent Skills 標準https://agentskills.io/
CONTRIBUTING 指南https://github.com/earendil-works/pi/blob/main/CONTRIBUTING.md
Pi Package 搜尋https://www.npmjs.com/search?q=keywords%3Api-package
Session 共享工具https://github.com/badlogic/pi-share-hf

18. 檢查清單(Checklist)

✅ 新進成員快速上手清單

環境建置

  • 安裝 Node.js v20 LTS
  • 安裝 Pi:npm install -g --ignore-scripts @earendil-works/pi-coding-agent
  • 確認版本:pi --version
  • 設定 API Key(環境變數)
  • 測試啟動:pi "Hello, Pi!"

專案設定

  • 閱讀專案 AGENTS.md(或 CLAUDE.md
  • 閱讀專案 PLAN.md
  • 確認 .pi/settings.json 設定
  • 確認 SYSTEM.md / APPEND_SYSTEM.md 是否存在
  • 了解可用的 Prompt Templates(/ 查看)
  • 了解可用的 Skills(/skill: 查看)
  • 了解已安裝的 Extensions(啟動時顯示)
  • 了解已安裝的 Pi Packages(pi list

基本操作

  • 學會使用 @ 引入檔案
  • 學會使用 Tab 路徑補全
  • 學會使用 Ctrl+L 切換模型
  • 學會使用 Ctrl+P 快速切換常用模型
  • 學會使用 Shift+Tab 調整思考等級(含 xhigh
  • 學會使用 Ctrl+O 展開/收合工具輸出
  • 學會使用 Ctrl+T 展開/收合思考過程
  • 學會使用 Ctrl+G 開啟外部編輯器
  • 學會使用 ! 執行 Shell 命令(!! 不送輸出給 LLM)
  • 學會使用 /compact 壓縮上下文
  • 學會使用 /tree 導航 Session
  • 學會使用 /clone 複製 Session
  • 學會使用 /export 匯出 Session
  • 學會使用 /share 上傳 Session 為 GitHub Gist
  • 學會使用 /reload 熱重載資源
  • 學會使用 /config 啟用/停用已安裝資源
  • 了解 Steering(Enter)與 Follow-up(Alt+Enter)訊息佇列
  • 學會使用 --name / -n 為 Session 命名

開發流程

  • 開始工作前先讀 PLAN.md
  • 一個功能一個 Session
  • 每個 AI 輸出都要 Review
  • 定期 /compact
  • 完成任務後更新 PLAN.md
  • 重要 Session 用 /export 保存

安全規範

  • 不在程式碼中寫入 API Key
  • 不讓 AI 直接修改 Production 配置
  • 安裝第三方 Package 前審查原始碼
  • AI 生成的程式碼必須通過測試
  • AI 生成的 SQL 必須 Review 後再執行

成本控制

  • 了解 /session 查看 Token/Cost
  • 簡單任務用低成本模型
  • 善用 Prompt Cache(PI_CACHE_RETENTION=long
  • Code Review 用唯讀模式(--tools read,grep,find,ls

社群參與


文件維護:本手冊隨 Pi Code Agent 版本更新而修訂。最後更新日期:2026 年 7 月 1 日。