@bifos/nhncloud-cli 0.17.0 → 0.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -5,10 +5,11 @@
5
5
  [![CI](https://github.com/jon890/nhncloud-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/jon890/nhncloud-cli/actions/workflows/ci.yml)
6
6
  [![license](https://img.shields.io/npm/l/@bifos/nhncloud-cli.svg)](https://github.com/jon890/nhncloud-cli/blob/main/LICENSE)
7
7
 
8
- [NHN Cloud](https://www.nhncloud.com) 를 AI 에이전트가 다룰 수 있게 만든 CLI 다.
8
+ [NHN Cloud](https://www.nhncloud.com) 를 터미널과 AI 에이전트에서 쓸 수 있게 해 주는 비공식 CLI 예요.
9
+ NHN 이 만든 공식 제품이 아니에요.
9
10
 
10
- Compute·Network·Block Storage·Load Balancer·Container Registry·Kubernetes·Container Service·Log & Crash·Deploy·API Gateway 를 명령 한 줄로 다루고, 결과를 `--json` 으로 내보낸다.
11
- Claude Code 같은 에이전트에 스킬로 설치하면 "인스턴스 목록 보여줘" 같은 자연어 지시를 그대로 처리한다.
11
+ 인스턴스, 네트워크, 로드밸런서, Kubernetes, 컨테이너 레지스트리와 컨테이너 서비스, 로그 검색, 배포, API Gateway, 키 관리를 명령 한 줄로 다루고, 결과를 `--json` 으로 내보내요.
12
+ Claude Code 에 스킬로 설치하면 "인스턴스 목록 보여줘" 같은 말을 그대로 알아듣고 처리해요.
12
13
 
13
14
  ```bash
14
15
  npm install -g @bifos/nhncloud-cli
@@ -16,110 +17,115 @@ nhncloud configure
16
17
  nhncloud skills install
17
18
  ```
18
19
 
19
- ## 설치와 설정
20
+ ```
21
+ "인스턴스 목록 보여줘"
22
+ "kr1 리전에 인스턴스 만들고 ACTIVE 될 때까지 기다려줘"
23
+ "최근 1시간 에러 로그 찾아줘"
24
+ "배포 실행하고 완료되면 알려줘"
25
+ "클러스터 kubeconfig 받아줘"
26
+ ```
27
+
28
+ ## 이런 분께 맞아요
20
29
 
21
- Node.js 20 이상이 필요하다.
30
+ - NHN Cloud 콘솔을 열지 않고 터미널에서 리소스를 확인하고 바꾸고 싶은 분
31
+ - AI 에이전트에게 인스턴스 관리, 로그 조회, 배포 실행을 맡기고 싶은 분
32
+ - 로그 추출이나 배포처럼 반복되는 작업을 스크립트로 자동화하고 싶은 분
33
+
34
+ ## 빠른 시작
35
+
36
+ Node.js 20 이상이 필요해요.
37
+
38
+ ### 1. 설치해요
22
39
 
23
40
  ```bash
24
41
  npm install -g @bifos/nhncloud-cli
25
42
  ```
26
43
 
27
- `nhncloud configure` 가 profile 과 서비스별 자격증명을 대화형으로 받는다.
28
- 공통 UAK, Log & Crash appkey, iaas 자격증명, NCR appkey, NCS appkey, Deploy appkey 순으로 입력한다.
29
- appkey 는 명령 옵션으로 지정할 수 없고 profile 에만 둔다.
30
- 여러 프로젝트를 다루려면 profile 을 나눠 `--profile` 로 전환한다.
31
- 저장 전 연결 테스트를 자동으로 수행한다 (`--no-verify` 로 생략).
44
+ ### 2. 자격증명을 설정해요
45
+
46
+ 아래 명령을 실행하면 profile 과 서비스별 자격증명을 차례로 물어봐요.
47
+ 쓰는 서비스의 값만 입력해도 돼요.
48
+ 저장하기 전에 연결 테스트를 자동으로 수행해요.
32
49
 
33
50
  ```bash
34
51
  nhncloud configure
35
- nhncloud doctor # 설정이 제대로 됐는지 확인
36
52
  ```
37
53
 
38
- 자격증명은 `~/.nhncloud/credentials.json`(mode 0600), 설정은 `~/.nhncloud/config.json` 에 저장한다.
39
- profile 우선순위는 `--profile` > `NHNCLOUD_PROFILE` > `config.defaultProfile` > `default` 다.
40
-
41
- 공공기관용 NHN Cloud를 사용한다면 해당 profile의 `credentials.json` 블록에 `"environment": "gov"`를 추가한다.
42
- 기존 profile은 이 필드를 생략하면 일반망을 사용한다.
43
- 공공망 endpoint 선택은 OAuth, Deploy, NCR, IaaS 호출에 적용된다.
44
- 공공망 NCR은 `kr1`, IaaS는 `kr1`과 `kr2`만 지원한다.
45
-
46
- ```json
47
- {
48
- "version": 1,
49
- "profiles": {
50
- "public-project": {
51
- "environment": "gov",
52
- "userAccessKey": { "id": "<uak-id>", "secret": "<uak-secret>" },
53
- "deploy": { "appkey": "<appkey>" }
54
- }
55
- }
56
- }
57
- ```
54
+ 인스턴스, 네트워크 같은 IaaS 명령을 쓴다면 두 값을 특히 조심해 주세요.
58
55
 
59
- `nhncloud deploy artifacts --profile public-project --json`으로 조회할 수 있다.
60
- 현재 `configure`의 연결 테스트는 일반망 주소를 사용하므로, 공공망 자격증명을 저장할 때는 `--no-verify`를 지정한다.
61
- 공공망 표시를 추가한 뒤 조회 명령으로 연결과 권한을 확인한다.
56
+ - "API 비밀번호"(`--iaas-password`)는 콘솔 로그인 비밀번호가 아니라 IAM 의 **API 비밀번호**예요. IAM 사용자 상세 페이지의 "API 비밀번호 설정"에서 따로 발급해요.
57
+ - "IAM username"(`--iaas-username`)은 계정 이메일이나 IAM 계정 ID 예요. tenantId 와 비슷하게 생긴 UUID 형태의 "API 사용자 ID"가 아니에요.
62
58
 
63
- > **iaas 자격증명의 함정 두 가지**
64
- >
65
- > `--iaas-password` 는 NHN Cloud 콘솔 IAM 의 **API 비밀번호**다. 로그인 비밀번호와 다르다.
66
- > IAM 사용자 상세 페이지의 "API 비밀번호 설정"에서 따로 발급한다.
67
- >
68
- > `--iaas-username` 은 계정 이메일 또는 **IAM 계정 ID(사번)** 다.
69
- > tenantId 와 비슷하게 생긴 "API 사용자 ID"(UUID) 가 아니다.
59
+ 나머지 입력 항목은 [IaaS 가이드](skills/nhncloud-cli/references/iaas.md)에 있어요.
60
+ 공공기관용 NHN Cloud 설정은 [공통 가이드](skills/nhncloud-cli/references/common.md)에 있어요.
70
61
 
71
- CI·자동화는 flag 로 비대화형 설정한다. 비밀번호는 환경변수를 권장한다.
62
+ ### 3. 설정을 확인해요
72
63
 
73
64
  ```bash
74
- NHNCLOUD_IAAS_PASSWORD=<api-password> nhncloud configure \
75
- --uak-id <uak-id> --uak-secret <uak-secret> \
76
- --logncrash-appkey <appkey> \
77
- [--deploy-appkey <appkey>] [--ncr-appkey <appkey>] [--ncs-appkey <appkey>] \
78
- --iaas-tenant-id <tenant-id> --iaas-username <iam-username> --iaas-region kr1 \
79
- --no-verify
65
+ nhncloud doctor
80
66
  ```
81
67
 
82
- 에이전트에서 쓰려면 스킬을 설치한다. Claude Code 가 이 CLI 의 사용법을 알게 된다.
68
+ `doctor` 는 외부 API 를 호출하지 않고 자격증명과 스킬 설치 상태만 확인해요.
69
+
70
+ ### 4. 첫 명령을 실행해요
71
+
72
+ ```bash
73
+ nhncloud instance list --region kr1 # 인스턴스 목록
74
+ nhncloud network list --region kr1 # VPC 목록
75
+ ```
76
+
77
+ `--region` 은 IaaS 와 NKS 계열에서 결과가 달라지므로, 기본값에 기대지 말고 직접 지정하는 편이 안전해요.
78
+
79
+ ### 5. AI 에이전트에 연결해요 (선택)
80
+
81
+ Claude Code 를 쓴다면 스킬을 설치해요. 에이전트가 이 CLI 의 사용법을 알게 돼요.
83
82
 
84
83
  ```bash
85
84
  nhncloud skills install
86
85
  nhncloud skills status
87
86
  ```
88
87
 
89
- 전역 설치 없이 `npx --yes @bifos/nhncloud-cli@latest skills install` 로도 설치된다.
90
- 관리 저장소에 복사되므로 임시 패키지 경로가 사라져도 남는다.
91
- CLI 를 새 버전으로 올린 뒤에는 `nhncloud skills update` 를 실행해야 스킬도 갱신된다.
88
+ 이제 에이전트에게 한국어로 시키면 돼요.
89
+ 에이전트가 알맞은 `nhncloud` 명령을 고르고, 필요하면 인스턴스 id 나 VPC id 를 먼저 조회해요.
92
90
 
93
- 상태는 `current`, `missing`, `outdated`, `broken`, `unmanaged`, `modified`, `corrupt` 중 하나이고, 출력에 딸린 복구 명령을 따르면 된다.
94
- 사용자 항목이나 수정·손상된 저장소는 자동으로 덮어쓰지 않는다.
91
+ CLI 를 새 버전으로 올린 뒤에는 `nhncloud skills update` 를 한 번 실행해 주세요. 그래야 스킬도 함께 갱신돼요.
92
+ 전역 설치 없이 `npx --yes @bifos/nhncloud-cli@latest skills install` 로도 설치할 수 있어요.
95
93
 
96
- ## 사용법
94
+ ## 할 수 있는 일
97
95
 
98
- 설정을 마치면 에이전트에게 한국어로 시키면 된다.
96
+ | 영역 | 대표 명령 | 가이드 |
97
+ | --- | --- | --- |
98
+ | Compute 인스턴스 | `nhncloud instance` | [IaaS](skills/nhncloud-cli/references/iaas.md) |
99
+ | 네트워크, 보안그룹 | `nhncloud network` | [IaaS](skills/nhncloud-cli/references/iaas.md) |
100
+ | Block Storage | `nhncloud volume` | [IaaS](skills/nhncloud-cli/references/iaas.md) |
101
+ | Floating IP | `nhncloud floatingip` | [IaaS](skills/nhncloud-cli/references/iaas.md) |
102
+ | Load Balancer, IP ACL | `nhncloud loadbalancer` | [Load Balancer](skills/nhncloud-cli/references/loadbalancer.md) |
103
+ | Log & Crash | `nhncloud logncrash` | [Log & Crash](skills/nhncloud-cli/references/logncrash.md) |
104
+ | Deploy | `nhncloud deploy` | [Deploy](skills/nhncloud-cli/references/deploy.md) |
105
+ | Container Registry | `nhncloud ncr` | [NCR](skills/nhncloud-cli/references/ncr.md) |
106
+ | Kubernetes Service | `nhncloud nks` | [NKS](skills/nhncloud-cli/references/nks.md) |
107
+ | Container Service | `nhncloud ncs` | [NCS](skills/nhncloud-cli/references/ncs.md) |
108
+ | API Gateway | `nhncloud apigateway` | [API Gateway](skills/nhncloud-cli/references/apigateway.md) |
109
+ | Secure Key Manager | `nhncloud skm` | [SKM](skills/nhncloud-cli/references/skm.md) |
110
+ | 설정과 진단 | `nhncloud configure`, `nhncloud doctor`, `nhncloud skills` | [공통](skills/nhncloud-cli/references/common.md) |
111
+
112
+ 명령과 옵션 전체는 카탈로그로 확인할 수 있어요.
113
+ 외부 API 를 호출하지 않고 명령 트리 정보만 출력해요.
99
114
 
115
+ ```bash
116
+ nhncloud commands --json | jq '.commands[] | select(.path=="nks cluster list")'
100
117
  ```
101
- "인스턴스 목록 보여줘"
102
- "kr1 리전에 인스턴스 만들고 ACTIVE 될 때까지 기다려줘"
103
- "최근 1시간 에러 로그 찾아줘"
104
- "배포 실행하고 완료되면 알려줘"
105
- "이 로드밸런서에 IP ACL 그룹 붙여줘"
106
- "클러스터 kubeconfig 받아줘"
107
- "레지스트리 이미지 태그 목록 보여줘"
108
- ```
109
-
110
- 에이전트가 알맞은 `nhncloud` 명령으로 옮기고, 필요하면 인스턴스 id 나 VPC id 를 먼저 조회한다.
111
-
112
- 에이전트가 쓰는 명령 카탈로그와 판단 기준은 [스킬 문서](skills/nhncloud-cli/SKILL.md)에 있다.
113
- 서비스별 상세는 [references/](skills/nhncloud-cli/references/) 아래 파일로 나뉘어 있다.
114
118
 
115
119
  ## 에이전트 없이 직접 쓰기
116
120
 
117
- 터미널에서 바로 쓸 수도 있다.
121
+ 터미널에서 바로 써도 돼요.
118
122
 
119
123
  ```bash
120
124
  nhncloud instance list # 인스턴스 목록
121
125
  nhncloud instance get <instance-id> # 인스턴스 상세
122
126
  nhncloud network list # VPC 목록
127
+ nhncloud network security-group list # 보안그룹 목록
128
+ nhncloud instance security-group add <instance-id> <group> --yes # 인스턴스에 보안그룹 연결
123
129
  nhncloud volume list # 블록 스토리지 볼륨
124
130
  nhncloud floatingip list # Floating IP
125
131
  nhncloud loadbalancer list # 로드밸런서
@@ -130,13 +136,16 @@ nhncloud deploy scenarios --artifact-id <id> --server-group-id <id> # 서버그
130
136
  nhncloud logncrash available-token # 남은 조회 토큰과 추정 대기 시간
131
137
  nhncloud logncrash search --query '*' --from 1h --to now # 최근 1시간 로그
132
138
  nhncloud logncrash export --query '<lucene>' --from 1h --to now --output logs.jsonl # 대량 로그 파일 저장
133
- nhncloud apigateway service list # API Gateway 서비스
134
- nhncloud apigateway stage update <service-id> <stage-id> --description "설명" --yes # API Gateway 스테이지 수정
135
- nhncloud apigateway stage import-resources <service-id> <stage-id> --yes # 리소스를 스테이지로 반영
136
- nhncloud apigateway stage deploy create <service-id> <stage-id> --yes # API Gateway 스테이지 배포
139
+ nhncloud apigateway service list # API Gateway 서비스
140
+ nhncloud apigateway stage deploy create <service-id> <stage-id> --yes # API Gateway 스테이지 배포
141
+ nhncloud skm key list <keystore-id> # Secure Key Manager 키 목록
142
+ nhncloud skm secret get <key-id> --quiet # 기밀 데이터 원문
137
143
  ```
138
144
 
139
- 전체 명령과 옵션은 `--help` 로 본다.
145
+ 삭제처럼 되돌리기 어려운 일부 명령은 `--yes` 를 붙여야 실행돼요. 비대화형 환경에서 `--yes` 가 없으면 API 를 호출하기 전에 끝나요.
146
+ 확인 없이 바로 실행되는 변경 명령도 있으니, 에이전트에게 맡기기 전에 [공통 가이드](skills/nhncloud-cli/references/common.md)의 「되돌릴 수 없는 명령」 절을 먼저 봐 주세요.
147
+
148
+ 명령과 옵션은 `--help` 로 볼 수 있어요.
140
149
 
141
150
  ```bash
142
151
  nhncloud --help
@@ -144,143 +153,57 @@ nhncloud instance --help
144
153
  nhncloud instance create --help
145
154
  ```
146
155
 
147
- 기계가 읽을 카탈로그가 필요하면 `commands` 를 쓴다. 외부 API 를 호출하지 않고 Commander 트리 메타데이터만 출력한다.
148
-
149
- ```bash
150
- nhncloud commands --json | jq '.commands[] | select(.path=="nks cluster list")'
151
- ```
152
-
153
- 출력은 세 가지 모드다.
156
+ ### 출력 형식을 골라요
154
157
 
155
- | 플래그 | 출력 | 쓰는 곳 |
158
+ | 옵션 | 출력 | 쓰는 곳 |
156
159
  | --- | --- | --- |
157
- | (없음) | 사람이 읽는 표 | 터미널 |
158
- | `--json` | JSON | 파싱, 명령 연결 |
159
- | `--quiet` | 명령이 문서화한 핵심 값 한 줄 | 스크립트 |
160
-
161
- 전역 옵션이라 모든 명령에 붙일 수 있다. `--no-color` 와 `--request-timeout <sec>` 도 같은 자리에서 쓴다.
162
- 요청 타임아웃은 초 단위이며 기본값은 30초, 허용 범위는 1~3600초다.
163
- `NHNCLOUD_REQUEST_TIMEOUT` 환경변수로도 지정할 수 있으며 명령줄 옵션이 환경변수보다 우선한다.
164
-
165
- `--json` 은 CLI 가 가공한 출력 계약이라 원본 응답의 최상위 래퍼를 그대로 보존하지 않는다.
166
- 예를 들어 `instance get --json` 은 `.server.status` 가 아니라 `.status` 를 읽는다.
167
- 명령별 shape 는 [common.md 의 JSON shape 요약](skills/nhncloud-cli/references/common.md)에 있다.
160
+ | (없음) | 사람이 읽기 좋은 표 | 터미널 |
161
+ | `--json` | JSON | 다른 프로그램에서 읽을 때 |
162
+ | `--quiet` | 명령이 문서화한 핵심 값 한 줄 | 셸 스크립트 |
168
163
 
169
164
  ```bash
170
165
  nhncloud instance get <instance-id> --json | jq -r '.status'
171
166
  nhncloud logncrash available-token --json | jq -r '.availableToken'
172
- nhncloud logncrash search --query '*' --from 1h --to now --json | jq -r '.data[].logBody'
173
167
  ```
174
168
 
175
- ### 종료 코드
169
+ `--json` 은 CLI 가 가공한 출력이라 원본 응답과 모양이 달라요. 명령별 모양은 「할 수 있는 일」 표의 서비스별 가이드에 있어요.
170
+ 요청 타임아웃, 환경변수, 비대화형 설정은 [공통 가이드](skills/nhncloud-cli/references/common.md)에 있어요.
176
171
 
177
- | 코드 | 의미 |
178
- | :---: | --- |
179
- | 0 | 성공 |
180
- | 1 | API 오류 |
181
- | 2 | 인증 실패 (401/403) |
182
- | 3 | 입력 오류 (파라미터·시간 범위) |
183
- | 4 | 설정 오류 (자격증명 누락) |
172
+ ## 더 알아보기
184
173
 
185
- ### 되돌리기 어려운 명령의 확인
186
-
187
- 삭제·전체 교체처럼 되돌리기 어려운 명령은 실행 전 확인을 요구한다.
188
- 자동화·파이프 등 비대화형 실행에서는 `--yes` 를 명시해야 한다.
189
- 플래그가 없으면 API 를 호출하기 전에 종료 코드 3 으로 끝난다.
190
-
191
- `--region` 은 IaaS 와 NKS 계열에서 결과를 가르므로, 기본값에 기대지 말고 명시하는 편이 안전하다.
192
-
193
- ## 프로젝트 구조
194
-
195
- ```
196
- src/
197
- index.ts CLI 진입점
198
- api/ 공통 endpoint, 응답 봉투, HTTP 오류 처리 (ky)
199
- services/ 서비스별 API 클라이언트와 타입 가드
200
- commands/ Commander.js 명령 정의
201
- config/ ~/.nhncloud/ 자격증명·설정 스키마와 profile 해석
202
- cache/ ~/.nhncloud/cache/ 토큰 캐시
203
- formatters/ 표·JSON·quiet 출력
204
- skill/ Claude Code 스킬 설치·갱신
205
- utils/ 에러, 스피너, 종료 코드
206
- ```
174
+ | 문서 | 내용 |
175
+ | --- | --- |
176
+ | [스킬 문서](skills/nhncloud-cli/SKILL.md) | 에이전트가 읽는 명령 목록과 판단 기준 |
177
+ | [공통 가이드](skills/nhncloud-cli/references/common.md) | 초기 설정, profile, 공공망, 출력 모드, 타임아웃 |
178
+ | [문제 해결](skills/nhncloud-cli/references/troubleshooting.md) | 종료 코드와 증상별 대처 |
179
+ | [docs/data-schema.md](docs/data-schema.md) | 자격증명과 설정 파일 스키마 |
180
+ | [docs/code-architecture.md](docs/code-architecture.md) | 코드 구조와 경계 |
207
181
 
208
- `commands/`는 `services/`, `api/`, `config/`의 기능을 조합한다.
209
- `services/`가 `commands/`를 import하지 않는 경계와 상세 의존 방향은 `docs/code-architecture.md`를 기준으로 삼는다.
182
+ ## 문제가 생기면
210
183
 
211
- | 문서 | 담는 것 |
212
- | --- | --- |
213
- | [docs/prd.md](docs/prd.md) | 제품 목적과 범위 |
214
- | [docs/flow.md](docs/flow.md) | 사용자 흐름 |
215
- | [docs/code-architecture.md](docs/code-architecture.md) | 디렉터리 트리, 레이어, 경계 |
216
- | [docs/data-schema.md](docs/data-schema.md) | 자격증명과 캐시 스키마 |
217
- | [docs/adr/INDEX.md](docs/adr/INDEX.md) | 기술 의사결정 기록 |
218
- | [docs/pitfalls/INDEX.md](docs/pitfalls/INDEX.md) | 반복해서 발견된 회피 패턴 |
184
+ - 설정이 의심되면 `nhncloud doctor` 를 먼저 실행해 보세요.
185
+ - 에이전트가 새 명령을 모르면 `nhncloud skills update` 를 실행해 주세요.
186
+ - 종료 코드별 대처는 [문제 해결](skills/nhncloud-cli/references/troubleshooting.md)에 있어요.
187
+ - 버그나 제안은 [GitHub Issues](https://github.com/jon890/nhncloud-cli/issues) 에 남겨 주세요. 설정 문제라면 `nhncloud doctor` 출력을 함께 붙여 주세요. 비밀값은 가려 주세요.
219
188
 
220
189
  ## 기여하기
221
190
 
222
- 이슈와 PR 모두 환영한다.
223
-
224
- ### 개발 환경
191
+ 이슈와 PR 모두 환영해요.
192
+ 개발 환경은 아래 명령으로 준비해요.
225
193
 
226
194
  ```bash
227
195
  git clone https://github.com/jon890/nhncloud-cli.git
228
196
  cd nhncloud-cli
229
197
  pnpm install
230
-
231
- pnpm run build # tsup 으로 dist/index.js 단일 번들 생성
232
- pnpm test # vitest
233
- pnpm tsc --noEmit # 타입 검사 (빌드는 타입을 검사하지 않는다)
234
-
235
- node dist/index.js --help # 빌드 결과 직접 실행
236
- node dist/index.js commands --json
198
+ pnpm run build
199
+ pnpm tsc --noEmit
200
+ pnpm test
237
201
  ```
238
202
 
239
- `pnpm` 을 쓴다. 빌드는 `tsup`(esbuild) 이 담당하고 `tsc` 는 타입 검사 전용이므로,
240
- 타입 오류를 잡으려면 `pnpm tsc --noEmit` 를 따로 돌려야 한다.
241
-
242
- ### 새 명령을 추가할 때
243
-
244
- 1. [공식 API 문서](https://docs.nhncloud.com)로 엔드포인트와 요청·응답 구조를 먼저 확인한다. 확정할 수 없으면 추측해 구현하지 않는다
245
- 2. `src/services/<service>/` 에 API 클라이언트와 타입 가드를 둔다. 공식 예제 JSON 과 필드 타입을 맞춘다
246
- 3. `src/commands/<service>/` 에 명령을 정의한다. 인접한 명령의 구조를 따르는 것이 가장 빠르다
247
- 4. 출력은 `src/formatters/` 에서 표·JSON·quiet 세 모드를 모두 지원한다
248
- 5. `src/**/*.test.ts` 에 테스트를 추가한다
249
- 6. 명령이나 옵션이 바뀌면 이 README 와 `skills/nhncloud-cli/references/` 를 함께 갱신한다
250
-
251
- HTTP 호출은 `ky` 만 쓰고, 사용자 오류는 `NhnCloudCliError` 와 `src/utils/exit-codes.ts` 의 종료 코드를 쓴다.
252
- 데이터는 stdout, 진행 상황·경고·오류는 stderr 로 분리한다.
253
-
254
- NHN Cloud API 가 문서와 다르거나 직관에 반하면 [docs/adr/](docs/adr/) 에 기록한다.
255
- 엔드포인트 버전 이중 prefix 나 200 응답 속 `isSuccessful: false`처럼 직관에 반하는 동작은 관련 ADR과 반복 함정 문서에서 확인한다.
256
-
257
- ### PR 을 낼 때
258
-
259
- - 커밋과 PR 제목은 `type(scope): 설명` 형식을 쓴다
260
- - 커밋 메시지와 PR 본문은 한국어로 쓴다
261
- - PR 을 열면 CI 가 타입 검사·테스트·빌드를 돌리고, Claude 가 코드 리뷰를 남긴다
262
- - 리뷰의 🔴 항목은 머지 전에 반영한다
263
-
264
- 이 저장소와 npm 패키지는 공개된다.
265
- 문서·코드·테스트 fixture·이슈 본문에 실제 자격증명이나 사용자 리소스 ID 를 남기지 않고 `<instance-id>` 같은 placeholder 로 바꾼다.
266
-
267
- ### 버그와 제안
268
-
269
- [GitHub Issues](https://github.com/jon890/nhncloud-cli/issues) 에 올린다.
270
- 설정 문제라면 `nhncloud doctor` 출력을 함께 붙이면 진단이 빠르다 (비밀값은 가려서 붙인다).
271
-
272
- ## 기술 스택
273
-
274
- | 분류 | 사용 |
275
- | --- | --- |
276
- | 언어·런타임 | TypeScript, Node.js 20+ |
277
- | CLI 프레임워크 | Commander.js |
278
- | HTTP | ky |
279
- | 출력 | chalk, cli-table3, ora |
280
- | 대화형 입력 | @inquirer/prompts |
281
- | 빌드 | tsup (CJS 단일 번들) |
282
- | 테스트 | vitest |
203
+ 새 명령을 추가하는 규칙은 [AGENTS.md](AGENTS.md) 와 [docs/code-architecture.md](docs/code-architecture.md) 에 있어요.
204
+ 커밋과 PR 제목은 `type(scope): 설명` 형식으로, 커밋 메시지와 PR 본문은 한국어로 써 주세요.
205
+ 이 저장소는 공개돼요. 실제 자격증명이나 리소스 ID 는 남기지 말고 `<instance-id>` 같은 placeholder 를 써 주세요.
283
206
 
284
207
  ## 라이선스
285
208
 
286
- MIT
209
+ [MIT](LICENSE)