<!-- task=02+edge_setup_cli plan=1 tag=REVIEW_EDGECLI -->

# Edge Setup CLI Follow-up Plan

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

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

## 배경

plan=0 리뷰 결과는 `FAIL`이다. edge CLI 구현 자체는 추가되었지만, 기록된 검증 출력이 현재 워크트리에서 재현되지 않고 dev 배포 문서가 현재 구현되지 않은 node CLI 명령을 공식 운영 경로처럼 안내한다.

## 의존 관계 및 구현 순서

- 선행 로그: `plan_cloud_G07_0.log`, `code_review_cloud_G07_0.log`
- 이 follow-up은 `code_review_cloud_G07_0.log`의 Required 이슈를 닫기 위한 작업이다.
- `agent-task/03+node_setup_cli`와 병렬일 수 있지만, 이 task 단독 완료 상태에서도 `docs/deploy-dev.md`가 현재 코드와 모순되면 안 된다.

## 분석 결과

### 읽은 파일

- `agent-task/02+edge_setup_cli/code_review_cloud_G07_0.log`
- `agent-task/02+edge_setup_cli/plan_cloud_G07_0.log`
- `apps/edge/cmd/edge/main.go`
- `apps/node/cmd/node/main.go`
- `docs/deploy-dev.md`
- `go.mod`
- `../proto-socket/go/go.mod`

### 실패 요약

- `go test -count=1 ./apps/edge/cmd/edge ./packages/hostsetup` 재실행 결과 edge cmd 패키지가 `git.toki-labs.com/toki/proto-socket/go/packets` missing module 오류로 실패했다.
- `docs/deploy-dev.md`는 `iop-node setup`, `iop-node config check`를 현재 제공 명령처럼 안내하지만 현재 node CLI에는 없다.

### 범위 결정 근거

- Required 이슈만 좁게 닫는다.
- edge CLI 명령 동작 자체를 재설계하지 않는다.
- node CLI 구현은 이 task에서 추가하지 않는다. 문서는 현재 코드와 병렬 task 관계를 고려해 정리한다.
- `packages/hostsetup` 변경은 새 Required 이슈가 확인되지 않으면 불필요하게 확장하지 않는다. 유지가 필요하면 이유를 review 파일에 기록한다.

### 빌드 등급

- build: `cloud-G07`, review: `cloud-G07`
- 근거: 검증 신뢰 실패와 Go module/CLI 재검증이 포함된다.

## 구현 체크리스트

- [ ] [REVIEW_EDGECLI-1] edge cmd 검증이 현재 워크트리에서 재현되도록 Go module/import 계약을 정리한다.
- [ ] [REVIEW_EDGECLI-2] `docs/deploy-dev.md`의 node CLI 안내가 현재 구현 상태와 모순되지 않게 정리한다.
- [ ] 중간 검증과 최종 검증 명령을 실행하고 실제 출력을 기록한다.
- [ ] CODE_REVIEW-*-G??.md의 구현 에이전트 소유 섹션을 실제 구현 내용과 검증 출력으로 채운다. 이 항목이 완료되기 전에는 구현이 완료된 것이 아니다.

### [REVIEW_EDGECLI-1] edge cmd 검증이 현재 워크트리에서 재현되도록 Go module/import 계약을 정리한다

#### 문제

리뷰 재실행에서 edge cmd 패키지가 다음 오류로 실패했다.

```text
../proto-socket/go/base_client.go:8:2: no required module provides package git.toki-labs.com/toki/proto-socket/go/packets
```

`go.mod`는 `git.toki-labs.com/toki/common-proto-socket/go`를 `../proto-socket/go`로 replace하지만, 해당 local module 내부 코드는 `git.toki-labs.com/toki/proto-socket/go/packets`를 import한다.

#### 해결 방법

현재 repo와 local proto-socket module의 실제 module path를 대조한 뒤 최소 변경으로 정리한다. 후보는 다음 중 하나다.

- `go.mod`에 canonical `git.toki-labs.com/toki/proto-socket/go` require/replace를 추가해 local module 내부 import를 만족시킨다.
- 또는 iop 쪽 import/require 경계를 canonical module path로 일관되게 바꾼다.

선택한 방식은 `계획 대비 변경 사항` 또는 `주요 설계 결정`에 이유를 기록한다.

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

- [ ] `go.mod` 및 필요 시 `go.sum` 수정.
- [ ] 필요 시 proto-socket import를 참조하는 Go 파일 수정.
- [ ] edge cmd 검증 명령이 현재 워크트리에서 성공하는지 확인.

#### 중간 검증

```bash
go test -count=1 ./apps/edge/cmd/edge ./packages/hostsetup
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
```

### [REVIEW_EDGECLI-2] `docs/deploy-dev.md`의 node CLI 안내가 현재 구현 상태와 모순되지 않게 정리한다

#### 문제

현재 `apps/node/cmd/node/main.go`에는 `setup`과 `config check`가 없다. 그런데 `docs/deploy-dev.md`는 `iop-node setup`, `iop-node config check`를 현재 운영 CLI 표면처럼 안내한다.

#### 해결 방법

이 edge follow-up에서는 node CLI를 구현하지 않는다. 대신 문서를 현재 구현과 일치시킨다.

- edge CLI 표면은 현재형으로 유지한다.
- node setup/check는 `agent-task/03+node_setup_cli` 완료 후 제공될 항목임을 명시하거나, 현재형 운영 CLI 표면에서 제거한다.
- `iop-node config print`처럼 현재 존재하는 명령은 그대로 둘 수 있다.

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

- [ ] `docs/deploy-dev.md` 수정.
- [ ] node CLI 현재 등록 명령과 문서 문구가 모순되지 않는지 확인.

#### 중간 검증

```bash
rg --sort path -n "iop-node setup|iop-node config check|sudo iop-node setup" docs/deploy-dev.md apps/node/cmd/node/main.go
```

위 검색 결과가 남는 경우, 현재 구현된 명령인지 또는 후속 task 예정임이 같은 문맥에서 명확해야 한다.

## 수정 파일 요약

| 파일 | 항목 |
|---|---|
| `go.mod` | REVIEW_EDGECLI-1 |
| `go.sum` | REVIEW_EDGECLI-1, 필요 시 |
| `apps/**` Go import 파일 | REVIEW_EDGECLI-1, 필요 시 |
| `docs/deploy-dev.md` | REVIEW_EDGECLI-2 |

## 최종 검증

```bash
gofmt -w apps/edge/cmd/edge packages/hostsetup
go test -count=1 ./apps/edge/cmd/edge ./packages/hostsetup
go test -count=1 ./packages/config ./packages/hostsetup ./packages/version
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
rg --sort path -n "iop-node setup|iop-node config check|sudo iop-node setup" docs/deploy-dev.md apps/node/cmd/node/main.go
```

검색 결과가 남는 경우, 해당 hit가 금지 명령의 공식 현재 경로 소개가 아니거나 node follow-up 예정임이 명확해야 한다.

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