بنقرة واحدة
extending-pi
// Plan and build Pi for Excel extensions safely: choose skill vs extension plugin vs connection, create flat SKILL.md skills, and handle API keys without asking users to paste secrets in chat.
// Plan and build Pi for Excel extensions safely: choose skill vs extension plugin vs connection, create flat SKILL.md skills, and handle API keys without asking users to paste secrets in chat.
Local terminal access via the tmux bridge. Use when the user asks about running shell commands, setting up the tmux bridge, or troubleshooting terminal connectivity.
Native Python execution via the local Python bridge. Use when the user asks about running Python locally, setting up the Python bridge, LibreOffice conversion, or troubleshooting Python connectivity.
Discover and call tools from configured MCP servers. Use when external capabilities are needed beyond built-in workbook tools.
Search the public web for up-to-date facts. Works out of the box with Jina (default, no API key needed); optionally Serper, Tavily, or Brave Search. Use when workbook context is insufficient and fresh external references are needed.
| name | extending-pi |
| description | Plan and build Pi for Excel extensions safely: choose skill vs extension plugin vs connection, create flat SKILL.md skills, and handle API keys without asking users to paste secrets in chat. |
Use this skill when the user asks to extend Pi, add capabilities, or integrate an external API/tool.
/set-key ... style commands that take secrets from the prompt input./tools → Connections) for secret entry.curl, Node scripts, and CLI checks).When recommending bridge setup, read the relevant setup skill before giving commands:
python-bridgetmux-bridge| Goal | Build | Why |
|---|---|---|
| Teach Pi a workflow, process, or decision rubric | Skill | Lowest maintenance; mostly instruction logic |
| Add runtime behavior (slash command, tool, widget, event handling, storage/http) | Extension plugin | Requires executable code |
| Add secure credential/config setup for extension tools | Extension connection | First-class setup/status/preflight/error guidance |
| Save one-off user/workbook preferences | instructions tool | Not an extension |
Heuristic: if instructions + existing tools are enough, build a skill first.
skill-creator, flat profile)For this repo, default to flat skills: one skills/<name>/SKILL.md file.
Only add extra folders if clearly needed.
description; make it precise.name, descriptionnameskills/<name>/SKILL.md.---
name: my-skill
description: What it does + when to use it.
compatibility: Optional constraints.
---
skills tool (install/uninstall) when available; otherwise use /extensions → Skills.skills tool:
action="list"action="read" for the new skill.Use when the user needs new executable behavior.
activate(api).registerCommand, registerTool, widget, etc.).extensions_manager (install_code, set_enabled, reload, uninstall).Minimal skeleton:
export function activate(api) {
api.registerCommand("hello_ext", {
description: "Example command",
handler: () => api.toast("Hello from extension"),
});
return () => {
api.widget.dismiss();
api.overlay.dismiss();
};
}
http.fetch(..., { connection })For API-backed extension tools:
activate(api).httpAuth on the connection definition with a strict allowedHosts list.requiresConnection./tools → Connections for secret entry.api.http.fetch(url, { connection: "<id>" }).Connection registration template:
api.connections.register({
id: "acme",
title: "Acme API",
capability: "query Acme records",
authKind: "api_key",
secretFields: [{ id: "apiKey", label: "API key", required: true, maskInUi: true }],
httpAuth: {
placement: "header",
headerName: "Authorization",
valueTemplate: "Bearer {apiKey}",
allowedHosts: ["api.acme.com"],
},
setupHint: "Open /tools → Connections → Extension connections",
});
Tool call template:
const response = await api.http.fetch("https://api.acme.com/v1/search?q=...", {
method: "GET",
connection: "acme",
});
connections.getSecretsOnly when Tier 1 cannot support the integration (SDK bootstrap, custom request signing, etc.):
const secrets = await api.connections.getSecrets("acme");
Guardrails:
connections.secrets.read capability./tools → Connections./set-key ... slash commandsWhen generating API-backed extension code, use docs/extensions-secure-connection-bundle.md as the default scaffold.
Default scaffold requirements:
httpAuthallowedHostsrequiresConnectiondocs/extensions.mddocs/extensions-secure-connection-bundle.mddocs/agent-skills-interop.mdskill-creator