<!-- task=02_cli_test_layout_cleanup plan=0 tag=REFACTOR -->

# CLI 어댑터 테스트 디렉토리 구조 정리

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

아래 체크리스트를 순서대로 완료하고, 각 항목의 중간 검증과 최종 검증을 실제로 실행하세요. 구현이 끝나면 `agent-task/02_cli_test_layout_cleanup/CODE_REVIEW.md`의 모든 섹션을 실제 구현 내용과 명령 출력으로 채우세요. `CODE_REVIEW.md`의 `이 파일을 읽는 리뷰 에이전트에게` 섹션에 있는 아카이브 지시(`*.log`로 이름 변경, `complete.log` 작성)는 구현 에이전트가 수행하면 안 되며, 리뷰 스킬 전용입니다.

## 배경

`apps/node/internal/adapters/cli/` 아래에 `oneshot/`, `persistent/`, `lifecycle/` 디렉토리가 존재하지만 각 디렉토리에는 `*_test.go` 파일만 들어있고, 실제 구현은 부모 `cli` 패키지의 `oneshot.go`, `persistent.go` 등에 있습니다. 패키지 선언도 `oneshot_test`, `persistent_test`, `lifecycle_test`로 black-box 테스트입니다. 디렉토리 이름이 sub-package의 존재를 암시해 처음 보는 사람이 잘못된 모듈 경계를 추론할 수 있습니다. 구현은 이미 부모 패키지에 모여 있으므로, 테스트 파일도 부모 디렉토리로 옮겨 단일 패키지 black-box 테스트로 통합합니다.

### [REFACTOR-1] 테스트 파일을 cli 부모 디렉토리로 이동

#### 문제

다음 파일들이 의미 없는 sub-디렉토리에 격리되어 있습니다:

- `apps/node/internal/adapters/cli/oneshot/cli_test.go` (package `oneshot_test`)
- `apps/node/internal/adapters/cli/persistent/execute_test.go` (package `persistent_test`)
- `apps/node/internal/adapters/cli/persistent/codex_exec_test.go` (package `persistent_test`)
- `apps/node/internal/adapters/cli/lifecycle/cli_test.go` (package `lifecycle_test`)

세 디렉토리 모두 구현 파일 없이 테스트만 들어 있고, 모두 부모 `cli` 패키지를 import해 동작을 검증합니다.

#### 해결 방법

각 테스트 파일을 부모 `apps/node/internal/adapters/cli/` 디렉토리로 이동하고, 패키지 선언을 `cli_test`로 통일합니다. 파일명은 충돌 방지를 위해 다음과 같이 rename합니다:

| 기존 경로 | 새 경로 |
|----------|--------|
| `cli/oneshot/cli_test.go` | `cli/oneshot_blackbox_test.go` |
| `cli/persistent/execute_test.go` | `cli/persistent_execute_blackbox_test.go` |
| `cli/persistent/codex_exec_test.go` | `cli/codex_exec_blackbox_test.go` |
| `cli/lifecycle/cli_test.go` | `cli/lifecycle_blackbox_test.go` |

이동 후 빈 디렉토리(`oneshot/`, `persistent/`, `lifecycle/`)는 삭제합니다. `cli/internal/testutil/`은 외부 패키지에서 import 가능한 그대로 유지합니다.

#### 수정 파일 및 체크리스트

- [ ] `git mv apps/node/internal/adapters/cli/oneshot/cli_test.go apps/node/internal/adapters/cli/oneshot_blackbox_test.go`
- [ ] `git mv apps/node/internal/adapters/cli/persistent/execute_test.go apps/node/internal/adapters/cli/persistent_execute_blackbox_test.go`
- [ ] `git mv apps/node/internal/adapters/cli/persistent/codex_exec_test.go apps/node/internal/adapters/cli/codex_exec_blackbox_test.go`
- [ ] `git mv apps/node/internal/adapters/cli/lifecycle/cli_test.go apps/node/internal/adapters/cli/lifecycle_blackbox_test.go`
- [ ] 이동된 4개 파일의 `package` 선언을 `cli_test`로 변경한다.
- [ ] 빈 디렉토리 `apps/node/internal/adapters/cli/oneshot/`, `persistent/`, `lifecycle/`를 `rmdir`로 제거한다.
- [ ] 같은 이름의 헬퍼/심볼이 두 파일에 동시 존재하면 prefix(`oneshot_`, `persistent_` 등)로 rename해 충돌을 푼다.

#### 테스트 작성

새 테스트는 추가하지 않는다. 이 항목은 파일 이동/패키지 명 변경만 수행하며, 기존 테스트 케이스가 그대로 동작하는 것이 회귀 검증 자체이다.

#### 중간 검증

```bash
ls apps/node/internal/adapters/cli/
go test ./apps/node/internal/adapters/cli/...
```

예상 결과: `oneshot/`, `persistent/`, `lifecycle/` 디렉토리가 사라지고, 4개 `*_blackbox_test.go`가 부모에 있다. `go test`는 단일 패키지 `iop/apps/node/internal/adapters/cli`에서 모두 PASS.

## 수정 파일 요약

| 파일 | 항목 |
|------|------|
| `apps/node/internal/adapters/cli/oneshot_blackbox_test.go` (이동/리네임) | REFACTOR-1 |
| `apps/node/internal/adapters/cli/persistent_execute_blackbox_test.go` (이동/리네임) | REFACTOR-1 |
| `apps/node/internal/adapters/cli/codex_exec_blackbox_test.go` (이동/리네임) | REFACTOR-1 |
| `apps/node/internal/adapters/cli/lifecycle_blackbox_test.go` (이동/리네임) | REFACTOR-1 |

## 최종 검증

```bash
go build ./...
go test ./apps/node/...
find apps/node/internal/adapters/cli -type d
```

예상 결과: build/test 모두 PASS. `find` 결과는 `apps/node/internal/adapters/cli`, `apps/node/internal/adapters/cli/internal`, `apps/node/internal/adapters/cli/internal/testutil`만 보인다.
