Files
kandev/docs/plans/pi-runtime-surfaces/plan.md
T
Edan Binshtok 2afab22705 fix(agents): make Pi MCP eager and pin adapter (#3546)
Co-authored-by: cybertronic <cybertronic@gmail.com>
Co-authored-by: Carlos Florencio <carlosmflorencio@gmail.com>
2026-09-09 19:50:40 +01:00

93 lines
4.3 KiB
Markdown

---
spec: docs/specs/cli/requirements/cli-mode-parity.md
created: 2026-08-16
status: complete
---
# Implementation Plan: Separate Pi Runtime Surfaces
## Overview
Pi's built-in definition assigns the managed command
`npx --yes --prefer-offline pi-acp@<effective-version>` to structured ACP
execution, while interactive passthrough uses `pi`. Registry metadata confirms
that `pi-acp` publishes the ACP adapter binary, while
`@earendil-works/pi-coding-agent` publishes the interactive `pi` binary. The
repair keeps the ACP adapter on structured and inference paths, launches `pi`
for passthrough, and makes installation and discovery agree on that executable.
The durable managed-runtime boundary is recorded in
[`docs/decisions/2026-08-12-validated-managed-runtime-version-selection.md`](../../decisions/2026-08-12-validated-managed-runtime-version-selection.md),
and the observable behavior is specified in
[`docs/specs/cli/requirements/cli-mode-parity.md`](../../specs/cli/requirements/cli-mode-parity.md) and
[`docs/specs/agents/requirements/runtime-updates.md`](../../specs/agents/requirements/runtime-updates.md).
---
## Backend
### Pi agent definition
- Update `apps/backend/internal/agent/agents/pi_acp.go` so
`BuildCommand`, `Runtime().Cmd`, and `InferenceConfig().Command` remain
`npx --yes --prefer-offline pi-acp@<effective-version>`.
- Change `PassthroughConfig.PassthroughCmd` to the globally installed `pi`
executable. Do not route the passthrough path through managed ACP package or
version resolution.
- Make `IsInstalled` probe `pi`, the executable provisioned for users and
required by passthrough, with a non-interactive `--version` check instead of
accepting an adapter-only `pi-acp` installation or an unrelated `pi`
executable that cannot satisfy the full integration.
- Change `InstallScript` to the supplied safe install recipe:
`npm install -g --ignore-scripts @earendil-works/pi-coding-agent`.
### Public documentation
- Update `docs/public/agents-and-profiles.md` to identify `pi` as Pi's detected
and passthrough executable, document the exact install command, and explain
that structured sessions continue through `pi-acp`.
- Clarify the Pi entry in `README.md` so the supported-agent table does not
imply that the ACP adapter is also the interactive CLI.
## Tests
- **What:** Structured Pi chat and inference use
`npx --yes --prefer-offline pi-acp@<effective-version>`, while
`PassthroughCmd` is exactly `pi`; the install recipe and detection binary
match the interactive package.
**File:** `apps/backend/internal/agent/agents/new_acp_agents_test.go`.
**How:** Change the Pi row in the shared command-surface contract before the
production edit. Confirm the command, installation, and detection tests fail
for the reported mismatch, then pass after the repair.
- **What:** The lifecycle's real Pi passthrough resolution, including MCP
project-file materialization, returns `pi` rather than the ACP adapter.
**File:**
`apps/backend/internal/agent/runtime/lifecycle/manager_passthrough_test.go`.
**How:** Extend `TestPassthroughPiWritesProjectFile` to assert the resolved
command argv as well as the existing `.pi/mcp.json` contract. This covers the
registry-to-lifecycle passthrough path where a future managed-runtime change
could otherwise reintroduce the conflation.
No browser E2E is needed because the settings UI and passthrough terminal UI do
not change; the behavior is the backend command selected behind the existing
profile mode.
## Verification Results
- Red: the focused Go contract run failed on Pi's old passthrough command and
install script, as expected.
- Green: the focused Go command, including the `pi --version` collision
regression, passed with 43 tests across the agents and lifecycle packages.
- PR fixup: the detection probe now uses `WithCommandCheck("pi", "--version")`
and restores the rationale comment for the remaining binary-name tradeoff.
- Public docs: `node --test scripts/validate-public-docs.test.mjs` passed all
61 tests, `node scripts/validate-public-docs.mjs` validated 41 pages, and
`git diff --check` passed.
## Implementation Tasks
- [x] [task-01-correct-pi-execution-surfaces](task-01-correct-pi-execution-surfaces.md)
Execution is sequential in the primary conversation. There are no parallel
candidates for this single vertical repair.