Pi Extension and Evals Implementation Plan
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Add first-class Pi package support for Superpowers and add Pi as a Drill eval backend.
Architecture: The Pi package is declared in the root package.json and loads existing skills/ plus a small Pi extension. The extension injects the using-superpowers bootstrap into provider context as a user-role message on session startup and after compaction, with Pi-specific tool mapping. Drill gains a pi backend, Pi session-log normalization, and tests.
Tech Stack: Pi TypeScript extension API, Node built-in test runner, Drill Python eval harness, pytest.
Task 1: Pi package manifest and extension tests
Files:
Modify:
package.jsonCreate:
tests/pi/test-pi-extension.mjs[ ] Step 1: Write failing package/extension tests
Create tests/pi/test-pi-extension.mjs with tests that import extensions/superpowers.ts, register fake Pi handlers, and assert:
root
package.jsonhaskeywordscontainingpi-packageroot
package.jsonhaspi.skills: ["./skills"]root
package.jsonhaspi.extensions: ["./extensions/superpowers.ts"]the extension registers
resources_discover,session_start,session_compact,context, andagent_endstartup
contextinjects exactly one user-role bootstrap messageagent_endclears startup injectionsession_compactre-enables injectionthe extension does not register
session_before_compact[ ] Step 2: Run tests and verify RED
Run: node --experimental-strip-types --test tests/pi/test-pi-extension.mjs
Expected: FAIL because extensions/superpowers.ts does not exist and package.json lacks the pi manifest.
- [ ] Step 3: Implement manifest fields
Update package.json with description, keywords, pi.extensions, and pi.skills while preserving existing name, version, type, and main.
- [ ] Step 4: Implement
extensions/superpowers.ts
Create a zero-runtime-dependency extension that:
locates the package root from
import.meta.urlreads
skills/using-superpowers/SKILL.mdstrips YAML frontmatter
appends Pi-specific tool mapping
exposes
resources_discoverwith the skills pathmarks bootstrap pending on
session_startandsession_compactinjects a user-role bootstrap message in
contextinserts post-compact bootstrap after leading
compactionSummarymessagesclears pending bootstrap on
agent_end[ ] Step 5: Run tests and verify GREEN
Run: node --experimental-strip-types --test tests/pi/test-pi-extension.mjs
Expected: PASS.
Task 2: Pi tool mapping reference
Files:
Create:
skills/using-superpowers/references/pi-tools.mdModify:
tests/pi/test-pi-extension.mjs[ ] Step 1: Write failing test for Pi reference doc
Add assertions that skills/using-superpowers/references/pi-tools.md exists and documents mappings for Skill, Task, TodoWrite, and built-in tool names.
- [ ] Step 2: Run tests and verify RED
Run: node --experimental-strip-types --test tests/pi/test-pi-extension.mjs
Expected: FAIL because pi-tools.md does not exist.
- [ ] Step 3: Add Pi reference doc
Create skills/using-superpowers/references/pi-tools.md explaining Pi-native skills, optional pi-subagents, no canonical todo/tasklist plugin, and built-in lowercase tools.
- [ ] Step 4: Run tests and verify GREEN
Run: node --experimental-strip-types --test tests/pi/test-pi-extension.mjs
Expected: PASS.
Task 3: Drill Pi backend and session log normalization
Files:
Create:
evals/backends/pi.yamlModify:
evals/drill/backend.pyModify:
evals/drill/engine.pyModify:
evals/drill/normalizer.pyModify:
evals/tests/test_backend.pyModify:
evals/tests/test_normalizer.py[ ] Step 1: Write failing backend/normalizer tests
Add pytest coverage for:
load_backend("pi")returnsfamily == "pi"Pi backend command starts with
piand includes-e ${SUPERPOWERS_ROOT}_resolve_log_dir()for Pi points under~/.pi/agent/sessionsfilter_pi_logs_by_cwd()keeps only session files whose headercwdmatches the scenario workdirnormalize_pi_logs()extractstoolCallblocks from Pi assistant session entries and maps built-in lowercase tools to canonical names[ ] Step 2: Run tests and verify RED
Run: uv run pytest evals/tests/test_backend.py evals/tests/test_normalizer.py -q
Expected: FAIL because the Pi backend and normalizer do not exist.
- [ ] Step 3: Add
evals/backends/pi.yaml
Configure the backend to run pi -e ${SUPERPOWERS_ROOT}, use permissive TUI readiness, /quit shutdown, and Pi session log location.
- [ ] Step 4: Implement Pi family support
Update Backend.family, Engine._resolve_log_dir, Engine._collect_tool_calls, and normalizer.py with Pi log filtering and normalizing.
- [ ] Step 5: Run tests and verify GREEN
Run: uv run pytest evals/tests/test_backend.py evals/tests/test_normalizer.py -q
Expected: PASS.
Task 4: Documentation and full verification
Files:
Modify:
README.mdModify:
evals/README.md[ ] Step 1: Document Pi install and eval backend
Add Pi to README quickstart/install list and add backend entry/usage to evals/README.md.
- [ ] Step 2: Run verification
Run:
node --experimental-strip-types --test tests/pi/test-pi-extension.mjs
uv run pytest evals/tests/test_backend.py evals/tests/test_setup.py evals/tests/test_normalizer.py -qExpected: all tests pass.