# Milestone: Pi CLI Provider Integration

## 위치

- Roadmap: [ROADMAP.md](../../../ROADMAP.md)
- Phase: [PHASE.md](../PHASE.md)

## 목표

Node CLI adapter의 provider/profile 후보에 Pi를 추가해 `adapter=cli,target=pi` 실행을 OpenAI-compatible route와 내부 run dispatch에서 안정적으로 사용할 수 있게 한다.
Pi의 JSON streaming 출력은 IOP runtime event로 변환하고, 기본 config 예시는 tools-enabled Pi 실행을 기준으로 둔다.

## 상태

[계획]

## 승격 조건

- 없음

## 구현 잠금

- 상태: 해제
- SDD: 불필요
- SDD 문서: 없음
- SDD 사유: 기존 `CLIProfileConf`, CLI adapter 실행 모델, OpenAI-compatible `adapter + target` route를 재사용하는 provider profile 추가이며 새 wire/API/schema 계약을 만들지 않는다.
- 잠금 해제 조건: 없음
- 결정 필요: 없음

## 범위

- Node CLI adapter가 Pi를 실행 가능한 target profile로 등록하고, 기본 실행은 headless JSON stream 모드를 사용한다.
- Pi profile은 기본적으로 tools-enabled 실행을 유지한다. 스트리밍 회피용 `--no-tools`를 기본 예시나 smoke 기준으로 사용하지 않는다.
- Pi JSON stream의 `message_update`/text delta, completion, error event를 IOP runtime event로 변환한다.
- OpenAI-compatible route 또는 model alias가 `adapter=cli,target=pi`로 연결될 때 workspace-bound prompt가 Pi 실행으로 전달되는지 확인한다.
- Pi 실행에 필요한 로컬 설정 파일과 model/provider 설정은 Pi 자체 설정을 source of truth로 두고, IOP config는 Pi command/profile/route만 소유한다.

## 기능

### Epic: [profile] Pi CLI profile

Pi를 Node CLI adapter의 일반 실행 target으로 등록하고, dev/local config에서 바로 켤 수 있는 예시를 제공한다.

- [ ] [pi-profile] `nodes[].providers[].cli.profiles.pi` 또는 동등한 CLI profile 예시가 `command=pi`, JSON streaming mode, workspace 전달, timeout 기본값을 포함한다. 검증: config roundtrip에서 `target=pi`가 CLI adapter capability로 노출된다.
- [ ] [pi-route] OpenAI-compatible `model_routes` 또는 provider catalog 예시가 `model=pi`를 `adapter=cli,target=pi`로 라우팅하고, CLI target 특성상 `metadata.workspace`가 필요한 경로임을 문서화한다.
- [ ] [tools-enabled] 기본 Pi profile과 smoke 예시는 `--no-tools`를 사용하지 않는다. 검증: tools 포함 요청에서도 첫 text delta가 completion 이전에 관측된다.

### Epic: [stream] Pi JSON stream 변환

Pi headless JSON 출력 이벤트를 IOP runtime event로 변환해 기존 CLI streaming 경로와 같은 의미로 제공한다.

- [ ] [pi-emitter] Pi JSON stream emitter가 text delta, final message, usage/error event를 파싱해 `runtime.RuntimeEvent`로 변환한다. 검증: fake Pi JSON lines fixture에서 delta가 순서대로 emit되고 completion event가 한 번만 발생한다.
- [ ] [pi-error] Pi 프로세스 종료, malformed JSON, provider error, context window exceeded 같은 실패가 route error와 log에 구분되어 남는다. 검증: 각 실패 fixture가 사용자에게 원인 메시지를 보존한 error event로 변환된다.
- [ ] [pi-workspace] workspace-bound 실행에서 Pi 프로세스 cwd와 session/no-session 정책이 profile 설정에 맞게 적용된다. 검증: 상대 workspace 요청이 해당 checkout에서 실행되고, workspace가 필요한 route에서 누락 시 입력 오류를 반환한다.

### Epic: [docs-tests] 문서와 검증

운영자가 Pi CLI provider를 켜고 문제를 재현할 수 있도록 예시와 smoke를 남긴다.

- [ ] [config-docs] Edge/Node 운영 문서와 config sample에 Pi profile, route 예시, 필수 Pi 설정 파일, context window/client 설정 주의사항을 추가한다.
- [ ] [unit-tests] CLI emitter, profile capability, route mapping, workspace-required error에 대한 단위 테스트가 추가된다.
- [ ] [dev-smoke] dev-runtime에서 `adapter=cli,target=pi`로 짧은 OpenAI-compatible streaming smoke를 실행하고, tools-enabled 요청이 completion 전 delta를 반환하는 근거를 남긴다.

## 완료 리뷰

- 상태: 없음
- 요청일: 없음
- 완료 근거: 기능 Task가 아직 충족되지 않았다.
- 검토 항목:
  - [ ] Pi profile이 CLI adapter capability와 config sample에 노출된다
  - [ ] Pi JSON stream emitter가 delta/error/completion을 안정적으로 변환한다
  - [ ] tools-enabled streaming smoke 근거가 남아 있다
- 리뷰 코멘트: 없음

## 범위 제외

- Pi 자체 provider/model 설정 파일의 소유권 이전 또는 자동 생성. Pi 설정은 Pi가 소유하고 IOP는 실행 profile과 route만 소유한다.
- Pi TUI 화면 렌더링을 IOP terminal bridge로 중계하는 기능.
- Pi 내부 tool 목록, MCP 정책, auth/provider 설정을 IOP schema로 재정의하는 기능.
- CLI Agent Group Grade Routing의 agent group assignment 정책. Pi는 이 Milestone에서 routing 가능한 CLI target으로 준비하고, grade routing 편입은 후속 Milestone에서 다룬다.

## 작업 컨텍스트

- 관련 경로: `apps/node/internal/adapters/cli`, `packages/go/config`, `configs/edge.yaml`, `configs/edge-compose.yaml.tmpl`, [README.md](../../../../apps/edge/README.md), [openai-compatible-api.md](../../../../agent-contract/outer/openai-compatible-api.md)
- 표준선(선택): 내부 실행 개념은 기존처럼 `adapter + target`을 유지한다. Pi는 새 top-level adapter가 아니라 `cli` adapter의 target/profile로 추가한다.
- 선행 작업: CLI Automation Runtime 안정화, OpenAI Workspace Agent Execution Contract
- 후속 작업: CLI Agent Group Grade Routing에서 Pi target을 agent group 후보로 포함한다.
- 확인 필요: 없음
