<!-- task=02+edge_setup_cli plan=0 tag=EDGECLI -->

# Edge Setup CLI Plan

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

**구현 마지막 단계에서 `CODE_REVIEW-*-G??.md`의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채우는 것은 필수다. 이 파일을 채우기 전에는 작업이 완료된 것이 아니다.** 구현 체크리스트를 기준으로 작업하고 리뷰 스텁을 채워라. 리뷰 파일의 아카이브 지시와 `코드리뷰 전용 체크리스트`는 리뷰 에이전트 전용이다.

## 배경

Edge 바이너리는 field host에서 직접 실행된다. edge CLI에는 운영 설치 진입점 `setup`, artifact 확인용 `version`, 설정 검증용 `config check/print`가 필요하다.

## 의존 관계 및 구현 순서

- 선행 작업: `agent-task/01_setup_cli_core`가 `complete.log`를 만든 뒤 시작한다.
- 이 작업은 edge CLI와 edge 문서만 소유한다. node CLI 변경은 `agent-task/03+node_setup_cli`가 소유한다.
- `agent-task/03+node_setup_cli`와는 서로 의존하지 않는다. 둘 다 `agent-task/01_setup_cli_core` 완료 후 병렬 구현 가능하다.

## 분석 결과

### 읽은 파일

- `agent-ops/skills/common/plan/SKILL.md`
- `apps/edge/cmd/edge/main.go`
- `apps/edge/cmd/edge/console.go`
- `apps/edge/README.md`
- `packages/config/config.go`
- `packages/config/config_test.go`
- `packages/version/version.go`
- `configs/edge.yaml`
- `docs/architecture.md`
- `docs/deploy-dev.md`
- `go.mod`

### 테스트 커버리지 공백

- edge `version`: 구현/테스트 없음.
- edge `config print/check`: 구현/테스트 없음.
- edge `setup --dry-run`: 구현/테스트 없음.

### 심볼 참조

- renamed/removed symbol: none.
- 추가 후보: edge `versionCmd`, `configCmd`, `setupCmd`.

### 범위 결정 근거

- `packages/hostsetup` 구현은 선행 task 소유.
- node CLI는 변경하지 않는다.
- edge transport/service/console runtime은 변경하지 않는다.

### 빌드 등급

- build: `cloud-G07`, review: `cloud-G07`. cobra CLI, setup dry-run, bin-level 검증이 포함된다.

## 구현 체크리스트

- [ ] [EDGECLI-1] edge CLI에 `version`, `config print`, `config check`를 추가한다.
- [ ] [EDGECLI-2] edge CLI에 `setup`을 추가한다.
- [ ] [EDGECLI-3] edge README와 dev 배포 문서를 edge CLI 표면에 맞게 갱신한다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [EDGECLI-1] edge CLI에 `version`, `config print`, `config check`를 추가한다

#### 문제

`apps/edge/cmd/edge/main.go:30`은 `serveCmd()`와 `consoleCmd()`만 등록한다.

```go
root.AddCommand(serveCmd(), consoleCmd())
```

#### 해결 방법

`packages/version`과 `gopkg.in/yaml.v3`를 import한다. `versionCmd`는 `version.Version`을 출력한다. `configCmd`는 `print`, `check`를 제공하고 `config.LoadEdge(cfgFile)`를 사용한다.

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

- [ ] `apps/edge/cmd/edge/main.go` 수정.
- [ ] `apps/edge/cmd/edge/main_test.go` 추가.

#### 테스트 작성

- `TestRootCmdIncludesOperationalCommands`
- `TestVersionCmdPrintsVersion`
- `TestConfigCheckCmdLoadsEdgeConfig`

#### 중간 검증

```bash
go test -count=1 ./apps/edge/cmd/edge
go run ./apps/edge/cmd/edge version
go run ./apps/edge/cmd/edge config check --config configs/edge.yaml
```

### [EDGECLI-2] edge CLI에 `setup`을 추가한다

#### 문제

Edge host에서 systemd 환경을 준비하는 공식 명령이 없다.

#### 해결 방법

선행 task의 `packages/hostsetup`을 사용한다. 기본값:

- config: `/etc/iop/edge.yaml`
- data dir: `/var/lib/iop/edge`
- unit: `/etc/systemd/system/iop-edge.service`
- service command: `serve --config <config>`

`setup`은 자체 `--config` 기본값으로 `/etc/iop/edge.yaml`을 사용한다. root persistent `--config`의 dev 기본값과 혼동하지 않도록 명시 테스트를 추가한다.

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

- [ ] `apps/edge/cmd/edge/main.go`에 `setupCmd` 추가.
- [ ] `apps/edge/cmd/edge/main_test.go`에 dry-run 테스트 추가.

#### 테스트 작성

- `TestSetupDryRunUsesEdgeDefaults`
- `TestSetupDryRunAcceptsExplicitConfig`

#### 중간 검증

```bash
go test -count=1 ./apps/edge/cmd/edge
go run ./apps/edge/cmd/edge setup --dry-run --binary /usr/local/bin/iop-edge
```

### [EDGECLI-3] edge README와 dev 배포 문서를 edge CLI 표면에 맞게 갱신한다

#### 문제

구현 후 문서가 실제 edge CLI와 일치해야 한다.

#### 해결 방법

`apps/edge/README.md`에 `version`, `config check`, `setup --dry-run`, `setup --enable --start` 예시를 추가한다. `docs/deploy-dev.md` edge 섹션도 실제 옵션과 맞춘다.

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

- [ ] `apps/edge/README.md` 수정.
- [ ] `docs/deploy-dev.md` edge 관련 문구 확인/수정.

#### 테스트 작성

문서 전용 테스트는 생략한다. deterministic search로 금지 명령이 공식 경로로 소개되지 않는지 확인한다.

#### 중간 검증

```bash
rg --sort path -n "service install|service status|\\brender\\b" docs apps/edge/README.md
```

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `apps/edge/cmd/edge/main.go` | EDGECLI-1, EDGECLI-2 |
| `apps/edge/cmd/edge/main_test.go` | EDGECLI-1, EDGECLI-2 |
| `apps/edge/README.md` | EDGECLI-3 |
| `docs/deploy-dev.md` | EDGECLI-3 |

## 최종 검증

```bash
gofmt -w apps/edge/cmd/edge
go test -count=1 ./apps/edge/cmd/edge
go run ./apps/edge/cmd/edge version
go run ./apps/edge/cmd/edge config check --config configs/edge.yaml
go run ./apps/edge/cmd/edge setup --dry-run --binary /usr/local/bin/iop-edge
rg --sort path -n "service install|service status|\\brender\\b" docs apps/edge/README.md
```

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