5.6 KiB
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.json -
Create:
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-package -
root
package.jsonhaspi.skills: ["./skills"] -
root
package.jsonhaspi.extensions: ["./extensions/superpowers.ts"] -
the extension registers
resources_discover,session_start,session_compact,context, andagent_end -
startup
contextinjects exactly one user-role bootstrap message -
agent_endclears startup injection -
session_compactre-enables injection -
the 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.url -
reads
skills/using-superpowers/SKILL.md -
strips YAML frontmatter
-
appends Pi-specific tool mapping
-
exposes
resources_discoverwith the skills path -
marks bootstrap pending on
session_startandsession_compact -
injects a user-role bootstrap message in
context -
inserts post-compact bootstrap after leading
compactionSummarymessages -
clears 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.md -
Modify:
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.yaml -
Modify:
evals/drill/backend.py -
Modify:
evals/drill/engine.py -
Modify:
evals/drill/normalizer.py -
Modify:
evals/tests/test_backend.py -
Modify:
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/sessions -
filter_pi_logs_by_cwd()keeps only session files whose headercwdmatches the scenario workdir -
normalize_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.md -
Modify:
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 -q
Expected: all tests pass.