一键导入
create-pi-extension
Como criar uma extensão TypeScript para pi. Use quando o usuário precisar de hooks, tools customizadas, UI no TUI, ou persistência de estado.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
Como criar uma extensão TypeScript para pi. Use quando o usuário precisar de hooks, tools customizadas, UI no TUI, ou persistência de estado.
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
First-party, sovereign workflows form — author, list, and validate multi-step workflow specs (YAML, DAG of block/command/agent steps with typed I/O). Use when writing or checking .workflows/*.workflow.yaml. Execution (running workflows) is delivered by SP2; this slice provides the form (workflow_list, workflow_validate).
Conduz um experimento de dogfood onde a colônia Pi executa uma task do .project/tasks.json em dois tempos (research → código) com gates do operador. Use quando o operador quiser ativar um experimento colony-experiment-phase1 ou colony-experiment-phase2.
Use when a Pi session needs to continue local-safe work with low operator friction: discover focus, interview only for missing constraints, prepare bounded slices, use workers only behind gates, checkpoint, and stop on real risk.
Interact with web pages via browser automation: navigate, click, fill forms, screenshot, and evaluate JavaScript. Uses Chrome/Chromium remote debugging (CDP).
Operar o control-plane local-first do agents-lab com board canônico, long-runs bounded, handoff/checkpoint, rollout/rollback e espelhos externos sem perder governança.
Guia o cultivo de uma primitiva reutilizável. Use quando o usuário identificar um padrão recorrente que merece ser extraído como skill, extensão ou convenção.
| name | create-pi-extension |
| description | Como criar uma extensão TypeScript para pi. Use quando o usuário precisar de hooks, tools customizadas, UI no TUI, ou persistência de estado. |
Extensões são módulos TypeScript que se registram no ciclo de vida do pi. Use quando skills não são suficientes.
extensions/minha-extension.ts
Ou como pacote:
packages/minha-extension/
├── package.json
├── index.ts
└── README.md
import type { ExtensionAPI } from "@earendil-works/pi-coding-agent";
export default function (pi: ExtensionAPI) {
// Registrar tools, commands, eventos, etc.
}
import { Type } from "@sinclair/typebox";
pi.registerTool({
name: "minha_tool",
label: "Minha Tool",
description: "O que esta tool faz (visível ao LLM)",
parameters: Type.Object({
input: Type.String(),
}),
async execute(toolCallId, params, signal, onUpdate, ctx) {
return {
content: [{ type: "text", text: `Resultado: ${params.input}` }],
details: {},
};
},
});
pi.registerCommand("meu-comando", {
description: "O que o /meu-comando faz",
handler: async (args, ctx) => {
ctx.ui.notify("Executado!", "info");
},
});
// Quando a sessão inicia ou recarrega
pi.on("session_start", async (event, ctx) => {
// Reconstruir estado, configurar UI
});
// Antes de cada chamada ao LLM
pi.on("before_agent_start", async (event, ctx) => {
// Modificar system prompt, injetar contexto
});
// A cada tool call
pi.on("tool_call", async (event, ctx) => {
// Gate: retornar { cancelled: true, reason: "..." } para bloquear
});
// Quando a sessão encerra
pi.on("session_shutdown", async (event, ctx) => {
// Cleanup, salvar estado
});
{
"name": "@aretw0/minha-extension",
"keywords": ["pi-package"],
"type": "module",
"pi": {
"extensions": ["./index.ts"]
},
"peerDependencies": {
"@earendil-works/pi-coding-agent": "*",
"@earendil-works/pi-ai": "*",
"@earendil-works/pi-tui": "*",
"@sinclair/typebox": "*"
}
}
peerDependencies com "*" — o pi bundla esses pacotes, não inclua no seu tarball.
packages/minha-extension/.pi/settings.json:
{ "packages": ["./packages/minha-extension"] }
/reload → teste na mesma sessãoregisterTool() aplica imediatamente, sem reload| Necessidade | API |
|---|---|
| Tool para o LLM chamar | pi.registerTool() |
Comando /slash para o operador | pi.registerCommand() |
| Atalho de teclado | pi.registerShortcut() |
| Mensagem injetada no contexto | pi.sendMessage() |
| Widget no TUI | ctx.ui.setWidget() / ctx.ui.setStatus() |
| Diálogo com o usuário | ctx.ui.select() / ctx.ui.confirm() / ctx.ui.input() |
| Persistir estado na sessão | pi.appendEntry() + reconstruir em session_start |
| Reload após mudança | ctx.reload() dentro de um command handler |
Se a extensão incluir servidor HTTP, painel web, ou integração browser↔sessão,
use também /skill:create-pi-web-extension para seguir o contrato first-party
(mode local|lan|public, health endpoint, token auth e e2e via test-harness).
Para exemplos reais de extensões e padrões arquiteturais:
# Ver a extension monitor-provider-patch como referência de extension first-party
gh api repos/aretw0/agents-lab/contents/packages/pi-stack/extensions --jq '.[].name'
# Ver exemplos oficiais do pi
gh api repos/badlogic/pi-mono/contents/packages/coding-agent/examples/extensions --jq '.[].name'
Docs relevantes:
docs/research/extension-factory-blueprint.md — design da fábrica@earendil-works/pi-coding-agent/docs/extensions.md/skill:create-pi-theme, /skill:create-pi-prompt)