xz-pi-subagents
Focused multi-agent delegation with an interactive under-editor task list for Pi
Package details
Install xz-pi-subagents from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:xz-pi-subagents- Package
xz-pi-subagents- Version
0.1.7- Published
- Sep 11, 2026
- Downloads
- 426/mo · 426/wk
- Author
- xuzan
- License
- MIT
- Types
- extension
- Size
- 73.6 KB
- Dependencies
- 0 dependencies · 3 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
xz-pi-subagents
一个专注于 main 分派任务 → 多个子 agent 执行 → main 等待汇总 的 Pi 扩展。
只有一个模型工具 xz_subagents_run,另提供 /agent_show 重新展示任务面板;没有角色管理中心、后台守护、递归 agent、记忆或复杂工作流。
安装
要求 Node.js 22+、Pi 0.84.4+(使用 Pi npm 安装中的 CLI)。
从本仓库根目录安装本地包:
pi install ./xz-pi-subagents
在 Pi 中执行 /reload 或重启。包发布到 npm 后也可使用 pi install npm:xz-pi-subagents。
扩展、skills 和工具均以当前用户权限运行。独立进程和工具白名单不是沙箱,安装前请检查源码。
平时怎么用
直接向 main 提出需求:
用两个 agent 分别阅读 src/auth.ts 和 test/auth.test.ts,分析登录实现与测试覆盖,等他们完成后你汇总。
main 会调用工具创建任务,不需要你写 JSON,也不需要先创建角色。任务 name 是这次运行的显示名称,不是预先注册的 agent 类型。
──────────────────────────────────────────────
> 主输入框
──────────────────────────────────────────────
↓ 查看子任务(空输入框)
main 等待子任务 · 1/2
● auth-scout 运行中 · 18s · 1200 tokens read
✓ test-review 已完成 · 12s · 800 tokens 检查测试
显示真实状态、耗时、当前工具,以及已结束模型消息报告的 token 用量;未报告用量时显示 0,不估算完成百分比。
键盘操作
| 位置 | 按键 | 行为 |
|---|---|---|
| 空输入框 | ↓ |
打开或重新显示当前批次列表,先选中 main |
| 列表 | ↑ / ↓ |
选择任务 |
| 列表 | Enter |
子任务:打开实时详情;main:回输入框 |
| 列表 / 详情 | x,3 秒内再按 x |
确认取消当前子任务;其他任务继续 |
| 详情 | ↑ / ↓、PgUp / PgDn |
滚动任务说明、输出、工具参数和结果 |
| 详情 | Home / End |
顶部 / 恢复跟随最新输出 |
| 详情 | Esc |
返回列表,不取消任务 |
| 列表 | Esc |
隐藏整个底部面板,返回输入框,不取消任务 |
| 列表选中 main | ↑ |
退出列表导航,回输入框,面板仍显示 |
| 主输入框 | Pi 的中止键(默认 Esc) |
中止 main 当前操作,并取消本批次全部子任务 |
普通文字输入会退出列表导航并交还现有编辑器。补全菜单、其他对话框、Vim 的 h/j/k/l 与 ex/visual 模式不被接管。xz-pi-vim 中,输入框的 Esc 先遵循 Vim 自己的模式切换规则。
隐藏面板 ≠ 取消任务 ≠ 删除日志。 面板隐藏后任务仍然执行,状态更新不会自动把它弹回来;空输入框按 ↓ 或执行 /agent_show 可重新打开。新批次开始会自动显示面板。
从 main 中止整批后,等执行器完成停止/回收才自动隐藏面板。如果正在阅读详情,或出现了失败(例如无法确认进程回收),保留界面供检查;详情 Esc 返回列表,再按 Esc 隐藏。
已结束任务的内存记录保留到下一批次或会话重载,隐藏面板不会清空它们。详情默认只显示最近约 60 KB 的对话,较早输出可从事件文件查看。关闭详情不关闭子进程;任务完成后详情也不会自动消失。
模型工具
main 调用示例(不是用户命令):
xz_subagents_run({
tasks: [
{ name: "auth-scout", operation: "inspect", task: "读取 src/auth.ts,分析登录流程,不修改文件。" },
{ name: "test-review", operation: "review", task: "读取 test/auth.test.ts,检查边界情况覆盖。" }
],
context: "重点关注 token 过期和并发刷新。",
concurrency: 4
})
- 每批 1–8 个任务;每个 main 会话一次只接受一批。必须把并行任务放进同一次调用。
concurrency:1–4,默认 4;适用于两种工具模式,不再仅限 read 任务。operation:general/inspect/research/implement/test/review/integrate,用于约束职责和结构化结果;省略为兼容模式general。- 任务级
context会追加到批次公共context后,只发给该任务。 exclusive:每个任务可设置,默认false。设为true时先等待本批次活动任务结束,再独占执行;后续任务等待它完成,不插队。- 子任务没有自动超时,会一直运行到完成、失败、明确取消或会话关闭。
- 失败任务立即进入
failed终态,不等待快捷键处理、不自动重试,也不会阻塞批次;其他任务继续运行。 - 所有任务进入完成、失败或取消状态后才返回,结果保持输入顺序。某个任务失败不会丢弃其他任务的结果;main 可根据错误决定是否另行委派更小、更准确的任务。
- main 模型等待,但 Node 事件循环不阻塞,所以 UI 仍可刷新、打开详情、取消任务。
- 有依赖的任务由 main 分轮安排,上一轮结果作为下一轮
context。
工具权限与并发
| 模式 | 默认工具 | 调度 |
|---|---|---|
mode: "read"(默认) |
main 当前启用的 read/bash/grep/find/ls 的交集 |
默认并行 |
mode: "write" |
main 当前启用的工具,剔除已知 agent 调度工具 | 默认并行 |
tools 可以进一步缩小白名单,不能增加 main 当前未启用的工具。tools: [] 禁用所有工具。
默认 Pi 常只启用 read/bash/edit/write,因此 read 模式通常获得 read + bash,可用 rg/find/ls/git 侦察仓库。子 Agent 会收到禁止修改文件和外部状态的明确提示,但 bash 技术上可以修改状态,所以 read/write 是行为与工具访问约束,不是系统级沙箱。需要 MCP 或其他扩展时选择 write 模式并用 tools 缩小白名单。
mode 只决定工具访问,不决定是否串行。 独立网页调研可以使用 write 模式和精简工具白名单,并行执行:
xz_subagents_run({
tasks: [
{ name: "ios-native", mode: "write", operation: "research", task: "搜索 XCUITest/Appium 方案,不修改文件或设备。", tools: ["web_search", "fetch_content"] },
{ name: "ios-light", mode: "write", operation: "research", task: "搜索 Maestro/simctl 方案,不修改文件或设备。", tools: ["web_search", "fetch_content"] }
],
concurrency: 2
})
控制同一浏览器/设备、修改相同文件等有冲突的任务,应由 main 显式设置 exclusive: true。只读任务需要稳定工作区快照时也可以指定独占。独占只覆盖本批次,不覆盖其他 Pi 会话或外部进程。
所有子 Agent 始终共享 main 当前项目目录。并行实现应分配互不重叠的文件;本包不创建隔离工作区、不管理 Git Worktree,也不捕获或集成 Patch。Git Worktree 是独立的 xz-pi-worktree 包职责。
read 模式按工具名限制并允许 bash。若受信任扩展覆盖了同名工具,仍执行该扩展实现;它不能保证文件系统只读。
Skills、MCP 与上下文
Skills
- 未指定
skills且子 agent 的最终工具包含read时,默认转发 main 当前加载的 skill 文件目录信息,子 agent 按需读取。 - 最终工具不包含
read时,未显式指定的 skills 自动关闭,适合仅使用网页搜索或 MCP 的工具型任务。 skills: ["code-review"]只选择指定 skill,skills: []显式关闭。- 找不到指定 skill 或无法加载其文件时报错。
- 显式选择非空 skills 必须保留
read工具。 - 不把全部 skill 正文复制进每个子代理的上下文。
MCP 与扩展
子 Pi 使用相同的 cwd、Pi agentDir 和环境变量,按 Pi 规则重新加载全局/已信任项目的配置与扩展。main 当前工具来源中的可定位扩展文件也会显式转发,覆盖常见的临时 -e 工具扩展。
例如使用已经安装、配置好的 pi-mcp-adapter:
xz_subagents_run({
tasks: [{
name: "docs", mode: "write", operation: "research",
task: "通过已配置的 context7 MCP 查询这个库的 API,返回来源。",
tools: ["read", "mcp"],
skills: []
}]
})
mcpScript、namespace proxy、direct tools 同样按实际注册的工具名加入 tools。所需工具必须已在 main 启用,并能在子 Pi 初始化时注册。direct tools 尚未进入缓存/注册表时会明确失败,不会自动扩大工具权限。
重要边界:
- 继承的是配置和可加载文件,不是父进程连接、临时授权或内存中的 MCP server。
- 仅通过 SDK 内存注入的工具、动态 provider、临时 API key,以及无法定位来源文件的扩展,不保证能在子进程重建。必要能力缺失会失败。
- MCP 的审批规则保持不变。headless 子进程不能弹审批框,需要审批的调用会拒绝;不会自动批准或开启原本禁用的 server。
- 多个代理操作同一个浏览器、设备或远端服务并不天然安全:main 必须为冲突任务选择
exclusive: true。独立的只读查询无需因使用 MCP 而强制串行。 - 不额外安装 MCP adapter,不复制认证信息到任务文件,也不修改用户 settings/mcp 配置。
模型与提示词
默认使用 main 当前模型和 thinking;任务可指定 model: "provider/modelId"。新进程从已有 Pi 配置/环境解析认证。
子代理默认是新对话,不复制 main 聊天历史和运行时系统提示词。加载标准 Pi 系统提示词、适用的 AGENTS.md / CLAUDE.md、所选 skills,再追加子任务职责。main 提供的批次背景用顶层 context 传入,任务私有背景用 tasks[].context 传入。未信任项目不会因委派而自动获得信任;Pi 的上下文文件仍遵循其原有加载规则。
除兼容模式 general 外,子代理必须在最终回复附带 XZ_SUBAGENT_RESULT JSON,包含状态、摘要、实际命令/退出码、测试证据、发现、假设和阻塞项。原始全文仍写入 output.md,结构化结果写入 result.json 并返回 main;缺失或非法结构化结果会把任务标记失败,避免仅凭自然语言“已完成”进入下一阶段。
输出、取消与清理
- main 收到的汇总最多 50 KB / 2000 行,单任务按批次数均分正文预算;截断会提示读取文件。
- 每个任务在系统临时目录生成独立的
xz-pi-subagent-*私有目录,写入output.md、events.jsonl、result.json、stderr.log,以及启动配置和职责提示词。 - 子进程使用
--no-session:这些产物不是可通过/resume续聊的原生 Pi 子会话。当前批次 UI 记录在内存中,不跨 Pi 重启恢复;main 的返回摘要和路径随主会话工具结果保存(主会话开启保存时)。 - 输出文件不存入仓库,也不写进 npm 包。目录和文件限制为当前用户访问。
- 每个事件流最多 32 MiB,单行 JSON 最多 4 MiB;超限会停止任务并标记失败。stderr 仅保留最后 16 KB。
- 取消先终止进程树,宽限后强制结束,不能仅凭“发出了 kill”就认为任务完成。
- reload、切换会话和退出时回收本批次任务。若 main 意外退出,子进程的父进程存活检测会请求停止。
- 关闭面板、关闭详情或取消任务都不会主动删除日志。临时目录(macOS 通常是
/var/folders/.../T/)可能在系统清理或重启时被清除,但不是保证每次重启都删除,也不保证长期保留。重要结果请另存到项目目录。 - 本包不自动删除历史产物。日志可能包含任务和工具的敏感输出,不要直接公开。
- 进程树清理是尽力而为,不保证回收自行 daemonize/逃逸的第三方进程,也不能撤销远程任务。macOS 上已验证取消;Windows 有
taskkill /T分支,尚未做真实 Windows 终端验收。
开发与测试
仓库根目录:
npm install --ignore-scripts
npm run check -w xz-pi-subagents
npm pack --dry-run -w xz-pi-subagents
测试包含:两种模式默认并发、read 模式的 bash/搜索能力、显式独占、批量等待、失败立即终结且不重试、无自动超时、取消竞态、TERM 忽略后的强制回收、JSON/UTF-8 分帧、面板隐藏与 /agent_show 重开、取消后自动隐藏与日志保留、UI 导航、宽度限制、Vim 兼容,以及真实 Pi CLI 配合本地模拟模型的集成测试(两个 write 模式子进程调用搜索 fixture,验证它们实际重叠运行)。集成测试不使用真实 API key,也不消耗模型费用。
可选真实 MCP adapter 验证(只访问测试创建的本地 stdio MCP,不读取个人 MCP 配置):
XZ_TEST_MCP_ADAPTER="$HOME/.pi/agent/npm/node_modules/pi-mcp-adapter/index.ts" \
npm test -w xz-pi-subagents
使用另一份 Pi 安装验证 CLI 兼容性:设置 XZ_TEST_PI_PACKAGE_DIR 为该 @earendil-works/pi-coding-agent 的包根目录。
手动终端验收可运行 test/fixtures/ui-host.mjs(参数为仓库绝对路径);它输出临时 agentDir 和 cwd。在另一个终端以 PI_CODING_AGENT_DIR=<agentDir> PI_OFFLINE=1 pi --model fixture/model --thinking off 从该 cwd 启动,输入任意任务即可得到两个持续输出的子代理。fixture 同时加载本仓库的 Vim 扩展。
参考
- pi-subagents-lite:底部列表、键盘导航、实时详情与取消交互。
- pi-subagents:资源加载边界、执行生命周期和结果产物。
- Pi 官方 subagent 示例:独立 CLI 子进程与 JSON 事件流。
独立实现精简执行器与界面,没有把上述完整框架作为运行依赖。使用 Pi 扩展接口;补全焦点兼容层只读检查当前编辑器的 autocompleteState(Pi 暂无公开 getter),遇到未知布局会放弃接管按键,不修改编辑器内部状态。