pi-configs
Personal pi configuration. Extensions, agents, skills, and themes that shape how I work with AI day-to-day.
This is an evolving workbench — some things are battle-tested, some are experimental, some exist because they seemed interesting and haven't been fully evaluated yet.
Structure
extensions/ Pi-only TypeScript extensions: tools, UI, hooks, and session behavior
agents/ Pi subagent definitions loaded by the subagent package/tool
skills/ Loose pi-local skills and compatibility adapters
plugins/ Claude Code plugin bundles exposed through the local marketplace
packages/ Local package/fork code and workspace packages
scripts/ Repo-local automation and eval helpers
themes/ Color themes
The portability boundary is intentional:
- Put shareable domain bundles in
plugins/. A plugin may contain skills, slash commands, agents, LSP settings, MCP config, or other Claude Code plugin metadata.
- Put pi runtime behavior in
extensions/. These files call the pi extension API directly and are not portable to Claude Code or Codex without being rewritten as MCP tools, CLIs, or skills.
- Put package-shaped code in
packages/. If it has its own package.json, tests, changelog, README, and source tree, it does not belong at the repo root.
- Put only loose local skills in
skills/. If a skill belongs to a shareable domain such as Zig, the plugin copy is canonical and the root skill should be a pi compatibility adapter.
Extensions
Extensions are loaded automatically from the extensions/ directory on session start.
| Extension | What it does |
|---|
answer.ts | /answer command and Ctrl+. shortcut — presents an interactive TUI for answering questions extracted from the last assistant message |
btw.ts | /btw — floating side-chat overlay for tangential questions without polluting the main session |
compaction-model.ts | Uses a local llamacpp model for compaction when the active model is local |
cost.ts | /cost [days] — token usage summary broken down by date, project, and model |
cwd.ts | /cd command plus CWD-aware path handling for bash/read/write/edit/grep/find/ls, with zoxide support |
direnv.ts | Loads direnv environments for the current working directory and reports blocked/error status in the footer |
execute-command.ts | execute_command tool — lets the agent queue a slash command or message to fire after its current turn ends |
notion.ts | NotionRead and NotionSearch tools — read/search Notion using NOTION_TOKEN or the local macOS Notion app token |
notify.ts | Sends a native desktop notification (OSC 777) when the agent finishes a turn — requires Ghostty with desktop-notifications = true |
prompt-editor.ts | Named "modes" for model + thinking combinations — cycle with Ctrl+Space, pick with /mode or Ctrl+Shift+M |
setup.ts | Session defaults: activates grep, find, ls; auto-expands tool outputs; registers get_system_prompt, get_tools, get_last_payload introspection tools |
statusline.ts | Footer showing repo/directory, branch, dirty state, current time, extension statuses, model, thinking level, and token usage |
temporal-context.ts | Injects hidden temporal context only after long pauses, currently gaps of 30+ minutes between user/assistant messages |
webfetch.ts | webfetch and websearch tools — GitHub-URL-aware fetching and Exa-powered web search |
whimsical.ts | Animated loading messages with shimmer effect. Purely cosmetic. |
Agents
Custom agent definitions invoked as subagents via the subagent tool/package.
General purpose: