<!-- task=m-agent-readable-repository-refactor/06_cli_adapter plan=0 tag=REFACTOR_ADAPTER_CLI -->

# CLI adapter 실행·세션·출력 책임 분해 계획

## 이 파일을 읽는 구현 에이전트에게

검증과 review stub 작성이 구현의 마지막 단계다. active 파일을 유지한다. Milestone 결정 차단 외에는 사용자에게 묻거나 `request_user_input`/`USER_REVIEW.md`/archive/complete 작업을 하지 않는다.

## 배경

CLI package에는 500~863줄 파일이 여러 개이고 `driveOpencodeSSE` 206줄, persistent `Execute` 183줄 등 subprocess/session/output 상태가 한 함수에 섞여 있다. profile별 wire/CLI 동작은 유지하면서 package 내부 책임을 드러낸다.

## 분석 결과

- 대상: `apps/node/internal/adapters/cli/{cli.go,codex_app_server.go,emitters.go,opencode_sse.go,persistent.go,persistent_output_filter.go,status/parser.go}`와 직접 tests.
- 테스트 환경: local node/testing profiles. 기준선 `go test -count=1 ./apps/node/internal/adapters/cli` 통과(46.898s).
- SDD: 불필요. adapter runtime 계약 보존형 분해.
- 분할 판단: CLI는 단일 package지만 profile subprocess/session/output-filter가 강하게 연결되어 package test와 real profile verification을 한 plan에서 수행한다.
- 제외: command args, login/workspace policy, session resume key, stdout/stderr filtering semantics, status parser output, 새 package.
- 빌드 등급: `cloud-G08`; 여러 외부 CLI profile의 상태 경계를 함께 검토한다.

## 구현 체크리스트

- [ ] CLI config/profile/command construction을 실행 lifecycle과 분리한다.
- [ ] persistent/Codex app-server/OpenCode SSE를 session state와 event decoding 단계로 분리한다.
- [ ] emitter/output filter/status parser 파일을 변경 이유 기준으로 분해하고 long function을 단계 함수로 축소한다.
- [ ] package/Node 회귀와 가능한 실제 CLI profile full-cycle, readability ratchet을 수행한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REFACTOR_ADAPTER_CLI-1] CLI construction과 execution 분리

문제: `cli.go`/`oneshot.go`가 profile resolution, workspace preflight, command construction, process execution을 교차 소유한다.

해결 방법: `cli.go`는 adapter facade, `profile.go`, `command.go`, `workspace.go`, `oneshot.go`는 각 단계만 소유한다.

- [ ] exact args/env/cwd와 error text를 보존한다.
- 테스트 작성: workspace/profile/blackbox assertions를 책임별 test file로 정리하되 제거하지 않는다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/cli -run 'Workspace|Command|OneShot|Exec'`

### [REFACTOR_ADAPTER_CLI-2] Persistent/app-server/OpenCode session 구조화

문제: session acquire/start/reuse, protocol decode, cancellation, terminal event가 긴 함수에 섞여 있다.

해결 방법: profile별 session context와 decoder/driver/finalizer를 명명한다. global/session-scoped event 필터와 terminal ownership을 유지한다.

- [ ] consecutive execute reuse와 cancel/terminate를 보존한다.
- 테스트 작성: 기존 app-server/OpenCode/persistent blackbox의 message order와 resume assertion을 유지한다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/cli -run 'Persistent|AppServer|Opencode|Resume|Cancel'`

### [REFACTOR_ADAPTER_CLI-3] Output/status 책임과 실제 경로 검증

문제: emitter/filter/status parser가 500~735줄 파일과 120줄 이상 checker를 포함한다.

해결 방법: protocol decode, terminal sanitation, usage screen parse, result mapping을 응집 파일/단계 함수로 나눈다.

- [ ] ANSI/cursor repaint, partial line, reasoning/content/tool event 변환을 보존한다.
- 테스트 작성: parser table test를 유지·보강한다.
- 중간 검증: `GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/cli ./apps/node/internal/adapters/cli/status`

## 최종 검증

```bash
gofmt -d apps/node/internal/adapters/cli/*.go apps/node/internal/adapters/cli/status/*.go
GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/internal/adapters/cli ./apps/node/internal/adapters/cli/status
GOCACHE=/tmp/iop-go-cache go test -count=1 ./apps/node/...
make readability-audit
git diff --check
```

이어 `e2e-smoke` `mode=real-cli`, `scope=CLI adapter responsibility split`, profiles=`claude,antigravity,codex,opencode`를 수행한다. 준비되지 않은 profile은 명령·실제 blocker를 profile별 기록한다.

모든 코드 변경 완료 후 반드시 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 채운다. 이 파일 작성이 구현의 마지막 단계다.
