# 출력과 종료 코드

> Nodaro CLI 출력을 표나 JSON으로 읽고, --watch로 실행이 끝날 때까지 따라가고, 스크립트에서 실패, 취소, 보류된 실행의 종료 코드로 분기하세요.

Source: https://nodaro.ai/ko/docs/developers/cli/output

Nodaro CLI의 **출력**은 기본적으로 터미널에서 읽기 쉬운 형태이며, `--json`을 지정하면 기계가 읽을 수 있는 형태가 됩니다. `--watch`를 지정하면 실행 명령이 실행이 끝날 때까지 기다린 다음 결과를 종료 코드로 알려 주므로, 셸 스크립트나 CI 작업이 그에 따라 분기할 수 있습니다.

## 표와 JSON
`--json`을 지정하지 않으면 `list` 명령은 작은 ASCII 표를, `get` 명령은 서식이 지정된 JSON 블록을 출력합니다. 모든 읽기 명령은 `--json`을 받으며, 이때 전체 페이로드를 `jq`에 바로 넘길 수 있는 형태로 출력합니다.

```bash
nodaro projects list --json | jq '.[].id'
nodaro workflows run wf_abc --json
```

## --watch로 실행 따라가기
실행 명령은 Nodaro가 실행을 접수하는 즉시 반환합니다. 실행이 끝날 때까지 계속 폴링하려면 `--watch`를 추가하세요.

```bash
nodaro workflows run wf_abc --watch
nodaro nodes run generate-image --param prompt="a snow leopard" --watch --poll-interval 1000
```

`--watch`는 `workflows run`, `apps run`, `nodes run` 같은 실행 명령, `executions get`, 그리고 [에셋](https://nodaro.ai/docs/developers/cli/asset-commands) 그룹과 [미디어](https://nodaro.ai/docs/developers/cli/media-commands) 그룹의 생성 명령에서 작동합니다. `--poll-interval`은 두 번의 폴링 사이 간격을 밀리초 단위로 설정합니다.

## 종료 코드
| 코드 | 의미 |
| --- | --- |
| `0` | 성공입니다. |
| `1` | 권한 없음, 찾을 수 없음, 인수 오류 또는 네트워크 오류입니다. |
| `2` | `--watch`가 끝났고 실행이 실패했습니다. |
| `3` | 작업이 검토를 위해 보류되어(`pending_review`) `--watch`가 멈췄습니다. 사람이 결정하는 중이며, 실패가 아닙니다. |
| `130` | `--watch`가 끝났고 실행이 취소되었습니다. |

`--json`을 지정하면 CLI는 페이로드를 출력하고 코드 `2`, `3`, `130`을 설정하지 않은 채 반환합니다. 이 모드에서는 출력의 `status` 필드로 분기하세요.

```bash
status=$(nodaro workflows run wf_abc --watch --json | jq -r '.status')
```

토큰이 없거나, 만료되었거나, 유효하지 않으면 CLI는 그 사실을 알리고 `nodaro auth login`을 제안한 뒤 코드 `1`로 종료합니다. 그 밖의 API 오류에서는 메시지와 오류 코드를 출력합니다. 오류 코드 목록은 [오류](https://nodaro.ai/docs/developers/api/errors)에 있습니다.

## 작업이 검토를 위해 보류된 경우
일부 배포 환경은 생성 결과를 공개하기 전에 검토합니다. 이런 배포 환경에서는 작업이 `pending_review` 상태가 될 수 있습니다. 처리는 끝났고, 크레딧은 예약된 상태로 남으며, 사람이 결과 공개 여부를 결정합니다.

이 상태는 저절로 바뀌지 않으므로 `--watch`는 폴링을 멈춥니다. `awaiting review (a human decision is pending; not a failure)`를 출력하고 코드 `3`으로 종료합니다.

- **요청을 다시 실행하지 마세요.** 중복된 요청도 보류됩니다.
- `nodaro jobs get <id>`로 **나중에 다시 확인하세요.** 작업은 다음 세 가지 상태 중 하나로 끝납니다.

| 상태 | 의미 |
| --- | --- |
| `completed` | 결과가 승인되어 공개되었습니다. |
| `failed` | 결과가 거부되었습니다. `error_hint.kind`는 `policy-block`이고, `error_hint.reason`은 사용자에게 보여 줄 텍스트입니다. |
| `cancelled` | 작업이 취소되었습니다. |

```bash
nodaro nodes run generate-image --param prompt="..." --watch
case $? in
  0) echo "released" ;;
  3) echo "awaiting review, check back later" ;;
  *) echo "failed" ;;
esac
```

## 자주 묻는 질문

### Nodaro CLI에서 기계가 읽을 수 있는 출력을 얻으려면 어떻게 하나요?

읽기 명령에 --json을 추가하세요. 이를 지정하지 않으면 list 명령은 작은 표를, get 명령은 서식이 지정된 JSON 블록을 출력합니다.

### Nodaro CLI의 종료 코드 3은 무엇을 뜻하나요?

작업이 검토를 위해 보류되었다는 뜻입니다. 처리는 끝났고, 사람이 결과 공개 여부를 결정하는 동안 크레딧은 예약된 상태로 남습니다. 실패가 아니므로 요청을 다시 실행하지 마세요. 나중에 nodaro jobs get으로 다시 확인하세요.

### 실행이 실패했는데 스크립트에서 종료 코드 2가 보이지 않는 이유는 무엇인가요?

--json을 지정하면 CLI는 결과를 출력하고 종료 코드 2, 3, 130을 설정하지 않은 채 반환합니다. 대신 JSON 출력의 status 필드를 읽으세요.

### CI 작업이 Nodaro 실행을 기다리게 하려면 어떻게 하나요?

실행 명령에 --watch를 추가하세요. CLI는 실행이 끝날 때까지 폴링하고, 성공하면 0, 실패하면 2, 취소되면 130으로 종료하므로 다음 단계가 그 결과에 따라 진행될 수 있습니다.
