AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
Pi is a terminal-based coding harness designed for AI-driven development workflows. This skill provides the necessary guidance to install, configure, and extend the Pi agent. It covers the full lifecycle of Pi usage, including setting up providers and models, integrating via SDK or RPC, developing custom extensions and TUI components, and managing agent sessions. The skill also details how to utilize the Pi ecosystem, including subagents, MCP adapters, and web access tools, while adhering to security and configuration best practices.
What it does
- Installs and configures the Pi terminal coding agent and its environment.
- Integrates Pi into custom applications using the SDK, RPC mode, or JSON event streams.
- Develops custom extensions, skills, prompt templates, and TUI components for Pi.
- Manages model providers, local llama.cpp routing, and agent settings.
- Orchestrates complex tasks using subagents, MCP servers, and interactive interview forms.
- Handles session persistence, branching, and context compaction for long-running tasks.
When to use it
- When you need to set up or operate the Pi terminal coding agent.
- When building custom extensions or tools to extend Pi's native capabilities.
- When integrating Pi into a larger Node.js application or a language-agnostic process.
- When configuring local models or custom providers for specific coding tasks.
- When managing complex agent sessions, branching, or automated project workflows.
Advantages
- Provides a unified interface for terminal-based AI coding tasks.
- Supports flexible integration patterns including SDK, RPC, and JSON event streams.
- Highly extensible through custom TypeScript extensions and packages.
- Enables local model execution and custom provider implementation.
- Maintains structured session history and context through automated compaction.
Usage examples
- “How do I install the Pi coding agent?”
- The agent provides the command npm install -g --ignore-scripts @earendil-works/pi-coding-agent to install the Pi CLI globally.
- “Summarize the current project using Pi.”
- The agent executes pi -p "Summarize this codebase" to analyze the files in the current directory.
- “How can I run Pi in RPC mode for my application?”
- The agent suggests using pi --mode rpc --no-session to start a stateless subprocess for integration.
- “How do I install a subagent package?”
- The agent uses the command pi install npm:pi-subagents to add the delegation and orchestration package.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/k-dense-ai/pi-agent/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip pi-agent.zip -d .agents/skills
Documentation by K-Dense Inc.
Pi Agent
Use this skill when the user wants to operate Pi or build on top of Pi. Pi is a minimal terminal coding harness extended through TypeScript extensions, skills, prompt templates, themes, packages, custom models/providers, SDK integrations, RPC mode, JSON event streams, and TUI components.
First Decision
Pick the reference before answering or coding:
| User intent | Read |
|---|---|
| What Pi is, docs map, install methods | references/overview.md |
| Install, authenticate, first run | references/quickstart.md |
| Day-to-day CLI usage, commands, modes, flags, project trust | references/usage.md |
| Provider auth, API keys, cloud provider setup | references/providers.md |
| Custom model entries, local models, proxies, compat flags | references/models.md |
Local llama.cpp router, /llama, model download/load | references/llama-cpp.md |
| Settings keys and defaults | references/settings.md |
PI_* and other environment variables | references/environment-variables.md |
| Extension development, custom tools, events, commands | references/extensions.md |
| Custom provider implementation, OAuth, custom streaming | references/custom-provider.md |
| Embed Pi in Node/TypeScript | references/sdk.md |
| Integrate from another process/language | references/rpc.md |
| Consume JSONL event output | references/json.md |
| Build terminal UI components | references/tui.md |
| Package extensions/skills/prompts/themes | references/packages.md |
| Delegate to subagents, chains, parallel runs, orchestration | references/pi-subagents.md |
| Connect MCP servers, codemode, MCP tool discovery/config | references/mcp.md (built-in), references/pi-mcp-adapter.md (optional adapter) |
| Interactive interview forms, structured user input | references/pi-interview.md |
| Web search, URL/PDF/repo fetching, video understanding | references/pi-web-access.md |
| Author Pi skills | references/skills.md |
| Prompt templates or themes | references/prompt-templates.md, references/themes.md |
| Sessions, branching, compaction, parsing JSONL | references/sessions.md, references/compaction.md, references/session-format.md |
| Security, sandboxing, trust | references/security.md, references/containerization.md |
| Keyboard or terminal issues | references/keybindings.md, references/terminal-setup.md, references/tmux.md, references/windows.md, references/termux.md, references/shell-aliases.md |
| Working on Pi itself | references/development.md |
Build-On-Pi Defaults
Prefer the SDK for Node/TypeScript apps that need type safety, direct state access, in-process custom tools/extensions, or custom resource loading. Use createAgentSession() for a single stable session; use createAgentSessionRuntime() when the app must replace sessions through new/resume/fork/clone/import flows. Auth and model lookup go through ModelRuntime.create().
Prefer RPC mode when the client is not Node.js, needs process isolation, or wants a language-agnostic JSONL protocol. Start with pi --mode rpc --no-session for stateless subprocess integration, then add session flags when persistence matters. Split records on \n only — Node readline is not protocol-compliant.
For RPC clients, correlate responses by unique request id, not arrival order,
and keep consuming events after a successful prompt response. Success means
accepted, queued, or handled; it is not completion. Subscribe before sending the
prompt, and wait for agent_settled for runs that actually start, because
agent_end may precede retries or queued work. If the response reports
disposition: "handled", no run started and no settled event is owed. See the
upstream RPC lifecycle.
Prefer JSON mode for one-shot command-line pipelines that only need streamed events, not bidirectional control: pi --mode json "prompt".
Use extensions for Pi-native behavior: custom tools, command handlers, event hooks, provider registration, custom compaction, path protection, project trust policy, UI prompts, widgets, and TUI components.
Use packages when sharing or installing reusable extensions, skills, prompt templates, or themes across machines or projects.
Safety Defaults
Pi is local and not sandboxed by default. Treat extensions, packages, skills, shell commands, and project-local .pi resources as code with the permissions of the Pi process. Project trust only guards which project inputs load — it is not a sandbox. For untrusted repos or unattended automation, isolate with Docker, OpenShell, Gondolin, a VM, or a remote sandbox.
Do not store secrets in project files. Prefer env vars, ~/.pi/agent/auth.json, OAuth via /login, or command-backed secret lookups in models.json/provider config.
Common Commands
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
pi
pi -p "Summarize this codebase"
pi --mode json "List files"
pi --mode rpc --no-session
pi --provider anthropic --model claude-sonnet-4-5
pi --model sonnet:high "Solve this complex problem"
pi --tools read,grep,find,ls -p "Review this repository"
pi --tui-mode fullscreen
pi install npm:pi-subagents
pi update --allSource Coverage
These references were reviewed against the official Pi 0.99.2 release (2026-09-30), its published npm runtime and declarations, and current Pi documentation. Source: earendil-works/pi v0.99.2. Ecosystem contracts were checked against published pi-subagents 0.74.0, pi-mcp-adapter 4.0.0, pi-interview 0.13.0, and pi-web-access 0.35.0 sources. These releases are the compatibility baseline, not interchangeable historical APIs.
Local checks cover CLI/RPC control, SDK sessions and transcript projection, mocked model/tool execution, extension loading, and example configuration/schema contracts. Authentication flows, paid model/search calls, graphical UI, and external sandboxes are documentation-verified only; deployment examples requiring them are illustrative. Check pi --version, pi --help, the installed package README, and TypeScript declarations before adapting examples to another release. Pi 0.99 includes native MCP; pi-subagents 0.74 removes workflowScript; adapter 4.0 uses mcp-adapter.json and /mcp-adapter.
Citing Scientific Agent Skills
This skill is part of Scientific Agent Skills by K-Dense. If it materially contributed to a manuscript, report, presentation, or code release, add the paper to the references or software section and tell the user you did so:
Kassis, T., Agarwal, V., He, Y., Patel, D., & Brueckner, A. M. (2026). Scientific Agent Skills: A Library of Procedural Knowledge for Research Agents. arXiv:2609.00065. https://doi.org/10.48550/arXiv.2609.00065
Always cite the current version. The DOI and https://arxiv.org/abs/2609.00065 resolve to the
latest arXiv version, so never append a version suffix such as v1. When network access is
available, fetch https://arxiv.org/abs/2609.00065 (or
http://export.arxiv.org/api/query?id_list=2609.00065) before writing the reference and take
the author list, year, and version from that record. If the record lists a journal reference
or publisher DOI, cite the published version instead.
Files
- ATTRIBUTION.mdAdded by AutoGineer910 B
- LICENSELicence file added by AutoGineer1.0 KiB
- SKILL.md8.1 KiB
- references/compaction.md5.7 KiB
- references/containerization.md3.8 KiB
- references/custom-provider.md9.0 KiB
- references/development.md1.9 KiB
- references/environment-variables.md4.0 KiB
- references/extensions.md19.7 KiB
- references/json.md3.6 KiB
- references/keybindings.md5.6 KiB
- references/llama-cpp.md3.4 KiB
- references/mcp.md5.9 KiB
- references/models.md9.4 KiB
- references/overview.md2.1 KiB
- references/packages.md6.2 KiB
- references/pi-interview.md7.9 KiB
- references/pi-mcp-adapter.md23.9 KiB
- references/pi-subagents.md44.8 KiB
- references/pi-web-access.md15.0 KiB
- references/prompt-templates.md1.8 KiB
- references/providers.md9.1 KiB
- references/quickstart.md2.7 KiB
- references/rpc.md9.4 KiB
- references/sdk.md13.1 KiB
- references/security.md4.7 KiB
- references/session-format.md6.1 KiB
- references/sessions.md3.0 KiB
- references/settings.md8.4 KiB
- references/shell-aliases.md772 B
- references/skills.md4.1 KiB
- references/terminal-setup.md4.3 KiB
- references/termux.md1.3 KiB
- references/themes.md2.2 KiB
- references/tmux.md1.7 KiB
- references/tui.md7.7 KiB
- references/usage.md8.6 KiB
- references/windows.md1.1 KiB
references/sdk.md
SDK
Source: https://pi.dev/docs/latest/sdk
Reviewed against Pi 0.99.2 and the package versions listed in ../SKILL.md on 2026-09-30.
The SDK ships in the main package:
npm install @earendil-works/pi-coding-agentUse it to embed Pi, build custom UIs, automate workflows, spawn sub-agents, test behavior, or customize tools/resources in process.
Quick Start
import { createAgentSession, ModelRuntime, SessionManager } from "@earendil-works/pi-coding-agent";
const modelRuntime = await ModelRuntime.create();
const { session } = await createAgentSession({
sessionManager: SessionManager.inMemory(),
modelRuntime,
});
session.subscribe((event) => {
if (event.type === "message_update" && event.assistantMessageEvent.type === "text_delta") {
process.stdout.write(event.assistantMessageEvent.delta);
}
});
try {
await session.prompt("What files are in the current directory?");
} finally {
await session.extensionRunner.emit({ type: "session_shutdown", reason: "quit" });
session.dispose();
}createAgentSession() returns { session, extensionsResult, modelFallbackMessage? } and uses DefaultResourceLoader when no resourceLoader is passed.
AgentSession
Methods: prompt(text, options?), steer(text), followUp(text), subscribe(listener) (returns unsubscribe), setModel, setThinkingLevel, cycleModel, cycleThinkingLevel, navigateTree(targetId, { summarize, customInstructions, replaceInstructions, label }), compact(customInstructions?), abortCompaction(), abort(), dispose().
State: sessionFile, sessionId, agent, model, thinkingLevel, messages, isStreaming.
session.agent.state exposes messages, model, thinkingLevel, systemPrompt, tools, streamingMessage, errorMessage; SessionManager is authoritative for finalized context: assigning agent.state.messages does not replace persisted history. Restore external history with SessionManager.inMemory(cwd, options, entries) before creating the session. Use session.waitForIdle() to wait for the full session run.
Session replacement (new/resume/fork/clone/import) lives on AgentSessionRuntime, not AgentSession.
Runtime API
const createRuntime: CreateAgentSessionRuntimeFactory = async ({ cwd, sessionManager, sessionStartEvent }) => {
const services = await createAgentSessionServices({ cwd });
return {
...(await createAgentSessionFromServices({ services, sessionManager, sessionStartEvent })),
services,
diagnostics: services.diagnostics,
};
};
const runtime = await createAgentSessionRuntime(createRuntime, {
cwd: process.cwd(),
agentDir: getAgentDir(),
sessionManager: SessionManager.create(process.cwd()),
});await runtime.dispose() emits extension shutdown and releases the active session. AgentSessionRuntime owns newSession(), switchSession(path), fork(entryId), clone via fork(entryId, { position: "at" }), and importFromJsonl(). runtime.session changes after each, so re-subscribe to events and call runtime.session.bindExtensions(...) again if you manage extensions manually. Creation returns runtime.diagnostics; failures throw.
Prompting and Queueing
interface PromptOptions {
expandPromptTemplates?: boolean;
images?: ImageContent[];
streamingBehavior?: "steer" | "followUp";
source?: InputSource;
preflightResult?: (disposition: "started" | "queued" | "handled") => void;
}preflightResult is an internal RPC hook called only after acceptance with a disposition string. It is not called when preflight rejects; it no longer receives a boolean. Failures after acceptance surface through events and messages. prompt() resolves only after the full accepted run finishes, including retries.
Extension commands execute immediately even during streaming. File-based prompt templates expand before sending or queueing. Calling prompt() while streaming without streamingBehavior throws — use session.steer() (delivered after the current assistant turn's tool calls) or session.followUp() (after all work finishes). Both pass through extension input handlers, expand templates, reject extension commands, and return "queued" or "handled".
Events
message_update (with assistantMessageEvent deltas such as text_delta, thinking_delta), tool_execution_start / _update / _end, message_start / message_end, agent_start / agent_end / agent_settled, entry_appended, session_info_changed, thinking_level_changed, turn_start / turn_end, queue_update, compaction_start / compaction_end, auto_retry_start / auto_retry_end, summarization_retry_scheduled / summarization_retry_attempt_start / summarization_retry_finished.
Models and Auth
ModelRuntime replaces the older AuthStorage + ModelRegistry pair (a synchronous ModelRegistry facade remains exported for extension compatibility).
const modelRuntime = await ModelRuntime.create({ authPath, modelsPath, credentials });
modelRuntime.getModel(provider, id); // built-ins + models.json, no auth check
await modelRuntime.getAvailable(); // only models with valid auth
await modelRuntime.checkAuth(providerId);
modelRuntime.getProviders(); // provider.auth methods and status
await modelRuntime.setRuntimeApiKey(provider, key); // not persistedCredential priority: runtime overrides → auth.json → configured models.json API key → provider environment/ambient auth (native provider extensions can define their own resolution). getModel(provider, id) from @earendil-works/pi-ai/compat looks up built-ins only. Inject any pi-ai CredentialStore (for example InMemoryCredentialStore) via credentials.
Catalog Refresh and Deadlines
create() restores cached catalogs but does not refresh them from pi.dev by default. Opt in with ModelRuntime.create({ allowModelNetwork: true, modelRefreshTimeoutMs: 15_000 }). Remote catalogs persist to ~/.pi/agent/models-store.json (override with modelsStorePath, or inject modelsStore); refreshes are throttled to once per provider every four hours unless forced, and PI_OFFLINE disables model network access entirely.
Public model/auth operations and ModelRuntime.create({ signal }) accept optional abort signals and are unbounded when omitted — SDK applications own deadline policy:
const result = await modelRuntime.refresh({ providers: ["anthropic"], signal: AbortSignal.timeout(15_000) });
if (result.aborted) console.warn("Catalog refresh timed out; using cached models");
for (const [providerId, error] of result.errors) console.warn(providerId, error);Force an immediate refresh with await modelRuntime.refresh({ allowNetwork: true, force: true, signal }). Each refresh() starts a new provider generation, so it does not queue behind a stalled refresh and stale generations cannot publish afterward. A failed or timed-out refresh never undoes a successful credential operation.
login(), logout(), setRuntimeApiKey(), and removeRuntimeApiKey() are async and resolve once the affected provider's cached/built-in catalog, composition, and availability snapshot are locally consistent; they do not wait for remote freshness. If credentials committed but local synchronization failed, they reject with the exported CredentialSynchronizationError — inspect providerId, operation, credential, and cause rather than blindly retrying the credential mutation.
To match CLI parsing, use resolveCliModel({ cliModel, modelRuntime }) (uses all registered models so --api-key first-run flows resolve before stored auth exists) and resolveModelScopeWithDiagnostics(patterns, modelRuntime) (matches --models/enabledModels semantics and returns warnings instead of printing).
Session options also accept model, thinkingLevel (off…max), and scopedModels: [{ model, thinkingLevel }] for Ctrl+P cycling. With no model: restore from session, then settings default, then first available.
Tools
Built-ins: read, bash, powershell (native Windows), edit, write, grep, find, ls. Defaults: read, bash, edit, write. tools allowlists, excludeTools disables specific names after the allowlist, noTools: "all" disables everything, noTools: "builtin" keeps extension/custom tools. The edit tool returns details.diff for the TUI and details.patch as a standard unified patch for SDK consumers.
Define custom tools with defineTool() and pass them as customTools; include their names in tools if you use an allowlist. Tool factories are exported too: createCodingTools, createReadOnlyTools, createReadTool, createBashTool, createPowerShellTool, createEditTool, createWriteTool, createGrepTool, createFindTool, createLsTool.
Passing a custom cwd makes createAgentSession() build the selected built-in tools for that directory.
Resource Loading
DefaultResourceLoader discovers extensions, skills, prompts, themes, and context files. Options: cwd, agentDir, additionalExtensionPaths, extensionFactories (bare functions or InlineExtension { name, factory } so the startup list shows <inline:my-provider> instead of <inline:1>), settingsManager, systemPromptOverride, skillsOverride, promptsOverride, agentsFilesOverride, eventBus (from createEventBus()). Call await loader.reload(), then read getExtensions(), getSkills(), getPrompts(), getThemes(), getAgentsFiles().agentsFiles.
cwd drives project discovery (.pi/extensions, .pi/skills, .agents/skills up to the git root, .pi/prompts, AGENTS.md walk-up, session naming); agentDir drives global resources (extensions/, skills/, ~/.agents/skills/, prompts/, AGENTS.md, settings.json, models.json, auth.json, sessions/). With a custom ResourceLoader, cwd/agentDir still influence session naming and tool path resolution but no longer control discovery.
Sessions and Settings
SessionManager.inMemory(cwd?), create(cwd), continueRecent(cwd), open(path), list(cwd), listAll(onProgress?). Tree API: getEntries, getTree, getBranch, getLeafEntry, getEntry, getChildren, getLabel, appendLabelChange, branch, branchWithSummary, createBranchedSession. Full API in references/session-format.md.
SettingsManager.create(cwd?, agentDir?) merges global plus project settings; SettingsManager.inMemory(settings?) avoids file I/O for tests. applyOverrides({ compaction, retry, ... }) layers overrides. Getters/setters are synchronous for in-memory state and enqueue writes asynchronously — call await flush() for a durability boundary and drainErrors() to report write errors yourself (the manager never prints them).
Run Modes
InteractiveMode (full TUI), runPrintMode(runtime, { mode: "text", initialMessage, initialImages, messages }), runRpcMode(runtime). All take an AgentSessionRuntime. InteractiveMode options include migratedProviders, modelFallbackMessage, initialMessage, initialImages, initialMessages.
SDK vs RPC
Prefer the SDK for type safety, same-process integration, direct state access, or programmatic tools/extensions. Prefer RPC for other languages, process isolation, or language-agnostic clients.
Important Exports
createAgentSession, createAgentSessionRuntime, AgentSessionRuntime, createAgentSessionServices, createAgentSessionFromServices, ModelRuntime, ModelRegistry, CredentialSynchronizationError, resolveCliModel, resolveModelScopeWithDiagnostics, DefaultResourceLoader, ResourceLoader type, createEventBus, CONFIG_DIR_NAME, defineTool, getAgentDir, getPackageDir, getReadmePath, getDocsPath, getExamplesPath, SessionManager, SettingsManager, the tool factories above, InteractiveMode, runPrintMode, runRpcMode, and types for options, results, extensions (ExtensionAPI, ExtensionFactory, InlineExtension), tools, skills, and prompt templates.
Native MCP and codemode in SDK hosts
SDK sessions do not load the CLI's built-in extensions automatically. Add createCodemodeExtension(), createToolSearchExtension(), and createMcpExtension() to a DefaultResourceLoader through extensionFactories, enable the tools through defaultTools or MCP exposure, then call await session.bindExtensions({}) so session_start connects MCP servers. For a bare AgentSession, close extension-owned subprocesses before disposing: await session.extensionRunner.emit({ type: "session_shutdown", reason: "quit" }); session.dispose();. session.dispose() alone only disconnects session resources and did not close the MCP fixture in the local check. A host using AgentSessionRuntime should instead await runtime.dispose(). Follow the upstream SDK example.
ModelRuntime now also exposes getModelsOfType, getModelOfType, getAvailableOfType, getAllModels, getAllAvailable, generateImages, and classify. Chat and image entries may share an upstream ID; select by operation type. These operations resolve credentials through the runtime. They may incur provider charges and were not called against live providers in this review.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs network access, Needs an API key, Needs Node.js
The author says: Requires Node.js >= 22.19 and npm for Pi CLI and SDK usage. Pi package name is @earendil-works/pi-coding-agent.
Security
What our scanner noticed· Medium risk
- References to credential files
- Instructions that use the network
- Downloads piped into a shell
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Created by
- K-Dense Inc.
- Publisher
- K-Dense (Community)
- Source
- K-Dense-AI/scientific-agent-skills · skills/pi-agent · commit a25cf9e
- Licence
- MIT License (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE.md)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by K-Dense Inc. or K-Dense.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download pi-agent.zip