A personal toolkit of extensions and skills for pi-coding-agent, plus the pi, herdr and Paseo config they run on.
Node, pi and herdr (the terminal multiplexer pi runs in) all come from the mise registry:
mise use -g node pi herdrpi install git:github.com/fcatuhe/pi-waresOne package, each ware toggled on or off in pi config. Update with mise up, then pi update --all.
Some skills drive CLIs this package does not install:
| CLI | Install | Then |
|---|---|---|
agent-browser |
mise use -g npm:agent-browser |
~/.pi/agent/git/github.com/fcatuhe/pi-wares/skills/agent-browser/setup.sh, which points it at the first of Brave Origin, Brave, Chromium and Chrome installed. The skill runs it on first use. |
gog |
mise use -g github:openclaw/gogcli |
Create a Google Cloud OAuth "Desktop app" client, download its credentials.json, then gog auth credentials set credentials.json and gog auth add you@example.com. |
brave-search, if you switch it on, needs npm install in its folder once and BRAVE_API_KEY in your shell profile: create a "Free AI" subscription at api-dashboard.search.brave.com (card required, not charged), then an API key.
config/ holds the reference pi, herdr and Paseo config, and /wares-doctor compares this machine against it:
/wares-doctor # report what is missing
/wares-doctor:apply # add it, keeping the values you set
/wares-doctor:force # add it, and overwrite what you set differently
A ware keeps its own config and state under ~/.pi/agent/<ware>/.
On a machine with no browser, subscription-token-login/ adds a Long-lived token (1 year, headless) method to Anthropic's /login. Mint the token with npx -y @anthropic-ai/claude-code@latest setup-token on any machine that has Claude Code, then paste it.
herdr-app/ builds ~/Applications/Herdr.app, a Ghostty bundle rebranded as Herdr that opens straight into the herdr session. pi loads nothing from it: run ./herdr-app/build.sh once per Mac, and again when the launcher or the logo changes.
paseo/ holds the pi extensions that adapt pi to Paseo and the Paseo plugins that change the app.
pi-token-refresher/ is a systemd timer that refreshes pi's OAuth logins and MCP tokens before they expire, so a pi that Paseo kills never holds a rotated refresh token unsaved. pi loads nothing from it: enable the timer once per machine.
Each ware has a README beside its code.
| Ware | What it does |
|---|---|
compact-footer/ |
Folds pi's 3-line footer into 2 by merging statuses onto the path line. |
subscription-usage-pace/ |
Footer status: subscription usage bar, pace marker, reset countdown. |
token-rate/ |
Footer status: output tokens per second of streaming, over the last 5 messages. |
| Ware | What it does |
|---|---|
subscription-tool-alias/ |
Renames extension tools to mcp__* on the wire for OAuth subscription transports, and back before they execute. |
subscription-web-search/ |
websearch and webfetch on the subscription token: search returns links, fetch reads one page and answers about it. |
subscription-token-login/ |
Adds a sk-ant-oat01 token method to Anthropic's /login: one paste, good for a year. |
subscription-switch/ |
/subscription-switch moves pi between Anthropic subscriptions, picked by email. |
| Ware | What it does |
|---|---|
tab-title/ |
Syncs the herdr tab label and the pi session name, both directions, and names the Paseo agent after the session. |
auto-session-name/ |
Names an unnamed session two-words with haiku after the first turn, once. |
radio/ |
radio_call calls another agent session on this machine: the message lands in its transcript as a named peer, not as its owner typing. |
model-shortcuts/ |
Slash shortcuts for model and thinking level: /<name>, /<name>:high, /high. |
bang-zsh/ |
Hands a ! command bash cannot find to an interactive zsh, so your zsh aliases and functions resolve. |
| Ware | What it does |
|---|---|
minimal-collapse/ |
Collapsed tool calls shrink to one line with no output. Alt+O or /minimal-collapse switches it, Ctrl+O stays pi's expand. |
| Ware | What it does |
|---|---|
policies/ |
House rules in the system prompt, one extension per policy so pi config toggles them one by one. |
| Ware | What it does |
|---|---|
wares-doctor/ |
/wares-doctor checks this machine against config/, :apply writes what is missing, :force also overwrites what differs. |
Loaded on demand rather than injected, so they can be as long as they need. The policies point at them.
| Skill | What it does |
|---|---|
pull-request/ |
Branch name, title convention and body structure for a pull request. |
agent-browser/ |
Headed Chrome on a shared logged-in profile, one tab per agent, for the agent-browser CLI. |
rails-review/ |
Rails review that cites the repo's own patterns, the gem source for the version in Gemfile.lock, and Fizzy, Campfire and Writebook. |
The /rails-review [base ref or paths] prompt sends a resolved scope, by default the uncommitted changes, to the rails-review subagent, or to a new Paseo agent inside Paseo, and reports what it found.
skills-available/ sits outside the pi manifest, so nothing loads it. exa-search/ (keyless Exa web search and extraction) and brave-search/ (below) wait there as a second opinion to subscription-web-search, or for when it hits a rate limit.
Switch one on by naming its path in settings, since a + force-include in the package filter cannot reach a folder the manifest never lists:
{
"skills": ["~/.pi/agent/git/github.com/fcatuhe/pi-wares/skills-available/exa-search/SKILL.md"]
}pi --skill <path> does the same for a single run.
Upstream copies, so one install covers them. They drift: resync deliberately.
| Ware | What it does | Upstream, copied at |
|---|---|---|
extensions/handoff/ |
/handoff <goal> starts a new linked session with an LLM-written brief. Off inside Paseo, which has paseo-handoff. |
pi's examples/extensions/handoff.ts, verbatim as handoff.ts, at pi 0.87.1. |
skills/gog/ |
Google Workspace automation through gog: auth state, JSON output, scoped reads and writes. |
openclaw/gogcli .agents/skills/gog/SKILL.md (MIT), verbatim, at v0.41.0. Resync when gog --version moves. |
skills-available/brave-search/ |
Web search and page-to-markdown extraction through the Brave Search API. | badlogic/pi-skills brave-search/ (MIT), verbatim, at 90bb51c. Its own package.json: run npm install in the folder once before switching it on. |
Third-party pi extensions installed as npm dependencies and listed in the pi manifest, each toggled on its own in pi config.
| Package | What it does |
|---|---|
@ogulcancelik/pi-codex-subagents |
Session-scoped subagents: templates, waits, steering, live overlay, per-spawn model routing. |
@ogulcancelik/pi-herdr-worktree-jump |
herdr_worktree_jump forks the session into a new herdr worktree, or back into the main checkout, in a pane of its own. |
Ranges are carets, and pi re-runs npm install only on a fresh install or a new commit on this repo's default branch: push one, then pi update --extensions picks up newer releases within the major.
The subagents' config and the rails-review template are machine state, shipped in config/ and written by /wares-doctor.
The worktree jump needs herdr 0.8.0, a herdr pane and a persisted session, and registers nothing otherwise. It moves only on request, since uncommitted changes stay behind in the old checkout.
Shared helpers live in lib/: pi does not load it, the wares import from it. Code is formatted by biome with 2-space indents (npm run format, checked in CI), and npm test runs every test.
pi-wares/
package.json pi manifest, bundled npm dependencies, scripts
biome.json formatter config
config/ reference config wares-doctor compares against
extensions/
model-shortcuts/
index.ts entry point (required filename), pi API and fs
shortcuts.ts pure logic, no pi imports
test.ts self-check, run by npm test
README.md the ware's docs
lib/ shared helpers imported by the wares
prompts/ one .md per slash command, filename is the command
skills/ one folder per skill, each a SKILL.md
skills-available/ same shape, unlisted: opt in by path
herdr-app/ macOS app that launches herdr, not a ware
paseo/ pi extensions for Paseo, and Paseo plugins
node_modules/ bundled external extensions (gitignored)
.npmrc sets legacy-peer-deps=true because pi provides the @earendil-works/* and typebox peers at runtime.
MIT