Superpowers 的 Pi 工具映射机制:把“动作语言”翻译成 Pi 原生工具
Superpowers 的技能文档刻意只描述“动作”(dispatch a subagent、create a todo、read a file),而不指名任何具体工具;在 Pi 运行环境下,这些动作究竟落到哪些真实工具,由 Pi 工具映射参考 负责翻译。本篇围绕这份映射文档展开:它如何定义 subagent 派发与任务跟踪两条动作的 Pi 等价物、为什么这两项能力在 Pi 核心中都是“可降级”的,以及 Pi 扩展 的引导注入(bootstrap)是如何把这份映射连同 using-superpowers 技能一起送进模型上下文的。读完后,你将能在 Pi 环境下正确运行 Superpowers 的全部技能,并理解“能力缺失时不伪造工具调用”这一设计原则的实现依据。
一、背景:技能说“动作”,映射表说“工具”
Superpowers 的跨平台设计有一条硬性规则:技能正文只写动作,不写工具名。在 移植指南 中,这一点被表述为“Skills name actions, not tools”——skills/ 下的内容是所有 harness 共享的唯一事实来源,每个 harness 各自提供一层“动作词表 → 真实工具名”的翻译,翻译内容放在 skills/using-superpowers/references/<harness>-tools.md 和/或引导注入器中。
入口是 using-superpowers 技能。它在每次会话开始时被注入模型上下文,要求模型在任何回应(包括澄清提问)之前先检查是否有适用的技能;其 Platform Adaptation 一节按 harness 分发到各自的参考文件:
| Harness | 参考文件 |
|---|---|
| Codex | references/codex-tools.md |
| Pi | references/pi-tools.md |
| Antigravity | references/antigravity-tools.md |
也就是说,pi-tools.md 不是独立文档,而是整条“会话启动 → 技能发现 → 动作执行”链路中,模型把技能指令翻译为 Pi 工具调用时的查阅依据。
二、Pi 工具映射表(完整继承)
pi-tools.md 的核心是一张两行映射表,完整保留如下:
| Action skills request | Pi equivalent |
|---|---|
Dispatch a subagent(Subagent (general-purpose): 模板) |
若可用,使用已安装子代理工具,例如 pi-subagents 提供的 subagent |
| Task tracking("create a todo"、"mark complete") | 若已安装 todo/task 工具则使用之;否则在 plan 文件或 TODO.md 中跟踪任务 |
这里的 Subagent (general-purpose): 模板指的是各技能自带的提示词模板格式,例如 code-reviewer.md、implementer-prompt.md、spec-document-reviewer-prompt.md 以及 dispatching-parallel-agents 技能 中都以 Subagent (general-purpose): "..." 的形式描述一次子代理派发。在 Claude Code 上它对应 Task 工具;在 Pi 上则按上表解析为可选的 subagent 工具或顺序执行的降级路径。
值得注意的一个设计细节:映射表只覆盖“有降级空间”的两类动作(子代理、任务清单),而读文件、写文件、执行命令这类动作不需要专门映射,因为 Pi 的内置工具本身就是小写的 read、write、edit、bash(以及可选的 grep、find、ls),与动作语义一一对应——这一点由扩展内嵌的映射文本直接写明(见第五节)。
三、Subagents:核心不内置,禁止伪造 Task 调用
参考文档对子代理的立场非常明确,原文规则是:
Pi core does not ship a standard subagent tool. The
pi-subagentspackage is a strong optional companion and provides asubagenttool with single-agent, chain, parallel, async, forked-context, and resume/status workflows. If no subagent tool is available, do not fabricateTaskcalls; execute sequentially in the current session or explain that the optional subagent capability is not installed.
拆解为三条可执行的判断逻辑:
- 检测优先:先判断会话中是否存在子代理工具(如
pi-subagents包提供的subagent,支持单代理、链式、并行、异步、分叉上下文、恢复/状态查询等模式)。存在则直接使用它执行 Superpowers 的子代理工作流。 - 不伪造调用:不存在时,严禁虚构
Task调用。模型不能假设某个不存在于当前工具清单的工具名并“调用”它。 - 降级路径:无子代理工具时,在当前会话内顺序执行相应工作,或直接向用户说明“可选的子代理能力未安装”。
这条规则与 移植指南 的能力清单一致:子代理/任务派发被归类为“Degradable”能力——“skill 已为缺失工具写好降级话术;你的映射职责是工具存在时指向真实工具、不存在时复用降级话术”。Codex 参考文件 也是同一思路的另一实例:Codex 需要在 ~/.codex/config.toml 中显式开启 multi_agent = true 才有 spawn_agent/wait_agent/close_agent,开启前子代理类技能同样只能走降级。
这一“可降级”定位在仓库测试中也有对应物:Claude Code 集成的测试脚本 test-subagent-driven-development-integration.sh 会以 TodoWrite/TaskCreate 等工具名为基准统计会话行为,而 Pi 场景下的行为验收标准则是“按映射表和降级路径执行”。
四、Task lists:TodoWrite 的语义归属
参考文档对任务清单的规定:
Pi core does not ship a standard task-list tool. If a todo/task extension is installed, use its documented tool. Otherwise use Superpowers plan files, checklists in Markdown, or a repo-local
TODO.mdfor task tracking. Older Superpowers docs may refer toTodoWrite; treat that as the task-tracking action above.
这里解决了一个真实的兼容性问题:Superpowers 的早期技能文档使用 Claude Code 的工具词表写作,因此可能直接出现 TodoWrite 这个名字。pi-tools.md 的裁决是——在 Pi 上,TodoWrite 不是一个工具名,而是一个“任务跟踪动作”的旧称,它应解析为上表第二行的 Pi 等价物:
- 已安装 todo/task 扩展 → 用该扩展文档中的工具;
- 未安装 → 用 Superpowers 的 plan 文件、Markdown checklist,或仓库本地
TODO.md跟踪进度。
这个“旧工具名 → 动作语义”的归一化并非 Pi 独有。移植指南 的 Part 8 附录对 create/update todos 动作同样注明“把旧的 TodoWrite 引用视为该动作”;而 OpenCode 支持设计文档 中 TodoWrite → update_plan 的映射则是另一个 harness 的同构例子。对 Pi 而言,降级方案(plan 文件 / TODO.md)与 Superpowers 其他技能本身的工作方式自洽——例如 executing-plans、writing-plans 等技能本来就以 Markdown plan 文件为载体,任务清单落在 plan 文件里并不破坏任何既有流程。
五、源码佐证:映射如何进入 Pi 会话
参考文档是“静态”的查阅材料,而真正让它在每个 Pi 会话生效的是 superpowers Pi 扩展。从源码结构看,注入链路如下:
1. 包清单声明 Pi 集成。 根 package.json 中:
keywords包含pi-package,使包可被 Pi 识别为可安装包;pi.skills: ["./skills"]声明技能目录,让 Pi 原生技能系统发现全部技能;pi.extensions: ["./.pi/extensions/superpowers.ts"]声明扩展入口。
2. 扩展注册五个生命周期钩子。 superpowers.ts 中依次注册:
resources_discover:上报skillPaths: [skillsDir],把整个skills/目录交给 Pi 的技能发现机制;session_start/session_compact:把injectBootstrap标记置为true——会话启动和会话压缩(compaction)后都需要重新注入引导;context:在构造发给模型的上下文时执行注入(见下);agent_end:把标记置回false,清除一次性注入状态。
3. 引导消息 = SKILL.md 正文 + 内嵌 Pi 映射。 getBootstrapContent()(L59-L81)读取 skills/using-superpowers/SKILL.md,剥离 YAML frontmatter 后拼成如下结构,作为一条 user 角色消息注入,并整体包在 <EXTREMELY_IMPORTANT> 标记中:
<EXTREMELY_IMPORTANT>
superpowers:using-superpowers bootstrap for pi
You have superpowers.
...(using-superpowers SKILL.md 正文)...
## Pi tool mapping
...(piToolMapping() 内嵌映射文本)...
</EXTREMELY_IMPORTANT>
其中 piToolMapping()(L88-L98)内嵌的映射文本与 pi-tools.md 参考文件同源同义,补充了参考文件之外的两点 Pi 事实:其一,Pi 有原生技能系统但没有 Claude Code 的 Skill 工具,技能适用时用 read 加载相应 SKILL.md,或由人工显式调用 /skill:name;其二,内置编码工具是小写的 read、write、edit、bash 加可选 grep、find、ls,分别对应读文件、建/改文件、跑 shell 命令、搜内容、按名找文件、列目录这些动作。
4. 防重复与压缩后重注入。 context 处理器(L35-L56)先检查消息中是否已含 BOOTSTRAP_MARKER(superpowers:using-superpowers bootstrap for pi),已存在则直接返回、不重复注入;否则用 firstNonCompactionSummaryIndex() 找到首条非 compactionSummary 消息的位置,把引导消息插在它之前——即位于所有压缩摘要之后、真实对话之前。agent_end 事件则清除“待注入”状态,避免启动注入跨越回合残留。
5. 测试锁定上述行为。 tests/pi/test-pi-extension.mjs 用 node --experimental-strip-types --test 运行,覆盖了:
- 清单断言:
pi.skills为["./skills"]、pi.extensions指向扩展文件、keywords含pi-package(L45-L52); - 钩子断言:五个事件各注册且仅注册一个 handler,且不注册
session_before_compact(引导只在压缩后注入,不在压缩前注入)(L54-L61); - 注入断言:启动上下文恰好注入一条 user 消息,内容同时匹配
/You have superpowers/与/Pi tool mapping/;重复请求不产生第二条;agent_end后不再注入(L72-L101); - 压缩断言:
session_compact之后,引导消息插入在compactionSummary消息之后(L103-L119); - 参考文档断言:L121-L137 确认
skills/using-superpowers/references/pi-tools.md存在,并只针对映射表的表格行(|开头的行)断言其中有一行匹配/subagent/i、一行匹配/todo|task/i。注释特别说明只匹配表格行的原因:整篇文档的散文里同样出现这些词,若匹配全文,则即使表格被删掉测试也会通过——这正是该测试要防的回归。
这套测试与映射参考文档构成了“文档—注入—回归”三层闭环:即使有人删掉映射表,扩展行为测试与文档测试会立即变红。
六、适用前提与限制
- 适用对象:Pi(pi-coding-agent)作为 harness 运行 Superpowers 的场景。
pi-tools.md仅覆盖 Pi 特有的差异项,Pi 上无差异的动作不需要查阅它。 - 能力前提:子代理工作流依赖可选的
pi-subagents包;任务清单工具同样以“已安装扩展”为前提。两者缺失时技能仍可运行,但dispatching-parallel-agents、subagent-driven-development等技能会退化为当前会话顺序执行——从仓库文档的表述看,这是设计内行为而非缺陷。 - 与内嵌映射的关系:
pi-tools.md参考文件与 superpowers.ts 中piToolMapping()的文本内容语义一致,但后者是会话内实际送达模型的版本,前者是技能文档树中的查阅版本(SKILL.md的 Platform Adaptation 指向它)。若两者出现分歧,从 移植指南 的“code wins”原则看,以扩展实际注入的文本为准。 - 版本依据:以上全部结论基于本仓库当前代码(
package.json版本 6.2.0)及其测试;Pi 事件名、pi-subagents的接口能力等属于外部生态事实,文中仅转述仓库文档与测试所确认的范围。
七、延伸阅读
- 技能入口与平台分发规则:skills/using-superpowers/SKILL.md
- 同族映射参考:Codex 工具映射、Antigravity 工具映射
- 跨 harness 移植方法论(动作语言、引导注入、验收测试):docs/porting-to-a-new-harness.md
- Pi 扩展与评测后端的实施计划(Task 2 即本文参考文档的创建任务):docs/superpowers/plans/2026-05-07-pi-extension-and-evals.md
- 回归测试:tests/pi/test-pi-extension.mjs
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00