pi-extension-selector
Switch installed Pi extensions and reusable profiles from inside Pi.
Package details
Install pi-extension-selector from npm and Pi will load the resources declared by the package manifest.
$ pi install npm:pi-extension-selector- Package
pi-extension-selector- Version
0.1.0- Published
- Jul 14, 2026
- Downloads
- 129/mo · 129/wk
- Author
- harrypan-12138
- License
- MIT
- Types
- extension
- Size
- 22.4 KB
- Dependencies
- 0 dependencies · 2 peers
Pi manifest JSON
{
"extensions": [
"./index.ts"
]
}Security note
Pi packages can execute code and influence agent behavior. Review the source before installing third-party packages.
README
Pi Extension Selector
Switch Pi extensions without leaving Pi. pi-extension-selector adds an interactive /extensions screen for enabling installed package extensions, managing local extensions, and saving reusable profiles.
Install
Install it as a standard Pi package:
pi install npm:pi-extension-selector
Restart Pi or run /reload, then open the selector:
/extensions
Use Enter or Space to toggle an extension. Press Escape to save the selection and reload Pi with the new extension set.
Features
- Discovers extension resources from npm packages already configured in Pi.
- Keeps non-extension package resources, such as skills and themes, loaded when an extension is disabled.
- Supports standalone
.ts/.jsextensions and Pi package directories in a local extension pool. - Saves named profiles so different coding workflows can use different extension sets.
- Preserves unrelated entries in
~/.pi/agent/settings.json. - Keeps the selector itself permanently loaded, so it cannot disable its own recovery UI.
Profiles
Pass a profile name to create or switch extension sets:
/extensions coding
/extensions review
/extensions minimal
The active profile and its enabled extensions are stored in ~/.pi/agent/extension-selector.json. Applying a profile updates Pi's package extension filters and calls Pi's native reload lifecycle, so commands, tools, event handlers, and providers are rebuilt cleanly.
Local extension pool
For extensions that are not installed as npm packages, place them under ~/.pi/agent/extension-pool:
~/.pi/agent/extension-pool/
├── permission-gate.ts
├── subagent/
│ └── index.ts
└── my-package/
├── package.json
└── src/index.ts
Package directories can declare one or more entry points with the standard Pi manifest:
{
"pi": {
"extensions": ["./src/index.ts"]
}
}
The pool is intentionally outside ~/.pi/agent/extensions, because Pi automatically loads everything in that directory before the selector can apply a profile. To use another location, set poolDir in ~/.pi/agent/extension-selector.json; absolute paths, ~/..., and paths relative to ~/.pi/agent are supported.
How package switching works
Pi package objects accept a resource filter for each resource type. The selector disables only extension resources:
{
"source": "npm:example-package",
"extensions": []
}
When the package is enabled again, its previous configuration is restored. Skills, prompts, and themes from the same package are not removed.
Development
git clone https://github.com/PanCodeInventory/pi-extension-selector.git
cd pi-extension-selector
npm install
npm test
npm run typecheck
To load the checkout directly while developing:
mkdir -p ~/.pi/agent/extensions ~/.pi/agent/extension-pool
ln -s "$PWD" ~/.pi/agent/extensions/pi-extension-selector
The project targets Pi 0.80.6 or newer and Node.js 22.19.0 or newer.
License
MIT