The pi adapter: what one package.json key changes

Measured on pi 0.85.0, 2026-09-08. pi resolves a package through the pi key, else the default skills/ extensions/ prompts/ themes/ directories at the package root. OrchestKit had neither, so pi install registered nothing and said nothing. Flip the manifest below to see what pi's own resolver returns for each shape.

1. The manifest, three shapes

0


      

2. What the loader is actually asked

Two pi entry points, and they can disagree. collectPackageResources decides which FILES get registered, which is what pi list shows. loadSkillsFromDir decides which of those files becomes a skill the model can see. A file that registers but never parses is invisible and raises nothing, which is the 108-versus-107 row below.

ShapeFiles registeredSkills parsedDiagnostics

3. The MCP allowlist, per server

.pi/mcp.json.example. includeTools is fail-closed at metadata-build time: an excluded tool never enters the tool map and is not reachable through the mcp proxy either. It is a convenience filter, not a perimeter, because pi ships a bash tool and inherits the environment that started it.

4. Reproduce it