一键导入
pi-fullstack-debug
Pi Agent 全栈调试指南。从前端到 RPC 通信到后端的完整调试链路。 当用户遇到"接口调用失败"、"WebSocket 断连"、"功能不工作"、"数据不对"、 "页面白屏"、"组件不渲染"、"报错了"等调试场景时使用此 Skill。 也适用于排查性能问题、内存泄漏、连接超时等问题。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Pi Agent 全栈调试指南。从前端到 RPC 通信到后端的完整调试链路。 当用户遇到"接口调用失败"、"WebSocket 断连"、"功能不工作"、"数据不对"、 "页面白屏"、"组件不渲染"、"报错了"等调试场景时使用此 Skill。 也适用于排查性能问题、内存泄漏、连接超时等问题。
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
新增 RPC 模块的完整开发流程。当用户需要给 AI Agent 模板添加新功能(如新的工具、服务、面板)时, 使用此 Skill 引导完成类型定义 → Handler 实现 → 注册编排 → 前端调用 → 测试的完整流程。 当用户提到"新增功能"、"添加模块"、"新 RPC 方法"、"新增 handler"、"添加 XXX 功能"时, 都应该使用此 Skill,即使用户没有明确提到 "RPC" 或 "模块"。
Pi Agent 模板的开发和维护规范。涵盖主题系统(CSS 变量)、i18n 国际化、组件开发、 Zustand Store 管理、测试编写等完整规范。 当用户需要修改模板 UI、添加新组件、修改样式、添加新语言、创建新 Store、 或维护现有模板功能时,使用此 Skill。 当用户提到"组件"、"样式"、"主题"、"语言"、"Store"、"模板"时触发。
从零创建一个新的 pi-agent 模板类型(像 general/chat/agent/browser-agent 那样)。 当用户说"新建一个模板"、"加一种模板类型"、"照着 browser-agent 再做一个"、"我想加个 xxx 模板"时使用此 Skill。 本 Skill 覆盖:目录脚手架 → 端口规划 → 双模式配置 → CLI 注册 → 同步脚本 → 测试 → 发布校验的完整链路。 注意:与 pi-template-dev(模板内部写代码的规范)不同,本 Skill 是"造模板本身"。
| name | pi-fullstack-debug |
| version | 1.0.0 |
| description | Pi Agent 全栈调试指南。从前端到 RPC 通信到后端的完整调试链路。 当用户遇到"接口调用失败"、"WebSocket 断连"、"功能不工作"、"数据不对"、 "页面白屏"、"组件不渲染"、"报错了"等调试场景时使用此 Skill。 也适用于排查性能问题、内存泄漏、连接超时等问题。 |
用户操作
→ React 组件(templates/agent/src/mainview/)
→ Store action(templates/agent/src/mainview/stores/)
→ apiClient.call()(templates/agent/src/mainview/lib/api-client.ts)
→ RPCClient(@dyyz1993/rpc-core)
→ Transport 层(WebSocket / IPC)
→ Server Handler(templates/agent/src/gateway/)
→ 业务逻辑 → 文件系统 / Git / Bash
关键文件:
| 层级 | 文件 | 职责 |
|---|---|---|
| API 客户端 | templates/agent/src/mainview/lib/api-client.ts | RPC 调用入口,自动选择 IPC/WS |
| RPC 缓存 | templates/agent/src/mainview/lib/rpc-cache.ts | GET 类方法缓存(TTL 2-5s) |
| 连接管理 | templates/agent/src/mainview/stores/use-connection-store.ts | 连接初始化、重试、状态 |
| WebSocket 传输 | packages/rpc-core/src/transports/websocket.ts | WS 连接、心跳、重连 |
| 服务端入口 | templates/agent/src/server.ts | HTTP + WS 网关,端口自动协商 |
| WS 处理 | templates/agent/src/gateway/ws-handler.ts | 认证、方法路由、事件推送 |
| HTTP 路由 | templates/agent/src/gateway/http-routes.ts | 文件端点 /file/{path}, /info/{path} |
| 路径安全 | templates/agent/src/shared/lib/path-security.ts | 沙箱限制,防止路径穿越 |
| Bash 安全 | templates/agent/src/shared/lib/bash-security.ts | 命令黑名单,危险命令拦截 |
| RPC Schema | templates/agent/src/shared/rpc-schema.ts | 所有方法和事件的类型定义 |
症状: 白屏、组件不显示、UI 不更新
排查步骤:
useXxxStore.getState() 在 Console 中查看当前状态useConnectionStore.getState() 确认 ready: trueindex.css 中 :root 和 .dark 都有定义常见原因:
initializeConnection 未调用)症状: "Connecting to RPC server..." 一直转、接口超时、WebSocket 断连
排查步骤:
.server-port 文件是否存在,内容是否为有效端口
cat .server-port # 应输出端口号如 3100
curl http://localhost:$(cat .server-port)/health # 应返回 {"status":"ok"}
?token= / localStorage rpc-auth-token / 默认值 pi-agent-template-tokenlsof -i :3100-3110,可能有残留进程vite.config.ts 中 /ws 代理的 rewrite 规则是否正确WebSocketTransport 默认最多重连 10 次,指数退避 3s→30s常见原因:
findAvailablePort 从 3100 开始尝试)/ws → / rewrite 缺失)症状: "Method not found"、参数错误、返回 null
排查步骤:
Available RPC methods: ...shared/register-all-handlers.ts 确认 handler 已注册server-config.ts 的 logDir 决定websocat 发送 JSON-RPC 消息测试症状: "Access denied: path outside allowed roots"、"Command blocked for safety"
路径安全 (path-security.ts):
allowedRoots 下的路径(默认 process.cwd())../)validatePath() 会在 resolve 后检查是否在允许范围内Bash 安全 (bash-security.ts):
rm -rf /、mkfs、dd if=、shutdown、reboot、fork bomb 等allowedCommands 后只允许指定命令isCommandAllowed() 先检查黑名单再检查白名单排查:
import { isRpcPathAllowed, setAllowedRoots } from "../shared/lib/path-security";
import { isCommandAllowed, setCommandPolicy } from "../shared/lib/bash-security";
// 调试路径
isRpcPathAllowed("/some/path"); // false 说明被拦截
setAllowedRoots(["/expanded/path"]); // 扩展允许范围
// 调试命令
isCommandAllowed("rm -rf /tmp/test"); // 检查是否被拦截
症状: 数据不对、重复渲染、状态不更新
排查:
useXxxStore.getState()rpcCache 默认 TTL 2s,可缓存的方法见 CACHEABLE_METHODS
file.listDir: 2s, file.readFile: 3s, git.status: 2s, git.branches: 5srpcCache.clear() 或 rpcCache.invalidate("method.name")。批量失效用 rpcCache.invalidateAll(["method.a", "method.b"])症状: UI 卡顿、内存持续增长
排查:
rpcCache.prune() 清理过期条目(默认 TTL × 10 后清理)apiClient.unsubscribe()bun test # 运行所有测试
bun test tests/path/to/test.ts # 运行特定测试
用于测试后端 Handler、安全模块、工具函数。
npx vitest # 运行所有
npx vitest path/to/test.tsx # 运行特定文件
用于测试 React 组件、Store、前端工具函数。
# 需要先启动后端
bun run dev # 启动 Vite + Backend
npx playwright test # 运行 E2E
E2E 无后端 Mock 方案: E2E 测试依赖真实后端。如果只想测试 UI,可:
bun run server.tsapiClient 模块// 检查连接
useConnectionStore.getState();
// 检查任意 Store
useXxxStore.getState();
// 清除 RPC 缓存
rpcCache.clear();
// 检查 API client 状态
apiClient.isConnected();
apiClient.getTransport();
?token=xxx 传递ws-handler.ts 在 upgrade 时验证 TokenallowedRoots 下的路径allowedRoots = [process.cwd()]rm -rf /、mkfs、dd、shutdown、reboot、fork bomb 等setCommandPolicy() 自定义| 问题 | 症状 | 快速修复 |
|---|---|---|
| WS 重连后订阅丢失 | 重连后事件不推送 | 需在 onReconnect 中重新订阅 |
| Bash 输出无限增长 | BashPanel 卡顿 | 截断输出或限制缓冲区 |
| 端口冲突 | 启动失败 / 连接失败 | 清理残留进程 kill $(lsof -t -i:3100-3110) |
| Vite 代理路径不匹配 | 永远显示 "Connecting..." | 确认 vite.config.ts 的 rewrite 规则 |
| 长对话卡顿 | ChatPanel 渲染慢 | 消息虚拟化或限制显示条数 |
| E2E 多 agent 干扰 | 浏览器页面跳转 about:blank | 用隔离 AGENT_BROWSER_SOCKET_DIR |