@bifos/nhncloud-cli 0.1.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/package.json ADDED
@@ -0,0 +1,48 @@
1
+ {
2
+ "name": "@bifos/nhncloud-cli",
3
+ "version": "0.1.0",
4
+ "description": "CLI tool for NHN Cloud services — AI agent & terminal friendly",
5
+ "keywords": [
6
+ "nhncloud",
7
+ "cli",
8
+ "logncrash",
9
+ "deploy",
10
+ "nhn"
11
+ ],
12
+ "bin": {
13
+ "nhncloud": "dist/index.js"
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "skills",
18
+ "README.md"
19
+ ],
20
+ "engines": {
21
+ "node": ">=20"
22
+ },
23
+ "publishConfig": {
24
+ "access": "public"
25
+ },
26
+ "scripts": {
27
+ "build": "tsup",
28
+ "dev": "tsup --watch",
29
+ "test": "vitest run --passWithNoTests",
30
+ "test:watch": "vitest"
31
+ },
32
+ "license": "MIT",
33
+ "dependencies": {
34
+ "@inquirer/core": "^11.2.0",
35
+ "@inquirer/prompts": "^8.5.0",
36
+ "chalk": "^5.6.2",
37
+ "cli-table3": "^0.6.5",
38
+ "commander": "^14.0.3",
39
+ "ky": "^1.14.3",
40
+ "ora": "^9.3.0"
41
+ },
42
+ "devDependencies": {
43
+ "@types/node": "^25.5.0",
44
+ "tsup": "^8.5.1",
45
+ "typescript": "^6.0.2",
46
+ "vitest": "^4.1.5"
47
+ }
48
+ }
@@ -0,0 +1,252 @@
1
+ ---
2
+ name: nhncloud-cli
3
+ description: NHN Cloud 서비스 CLI. 자격증명 설정(configure), Log & Crash 로그 검색(logncrash search), Deploy 배포 실행 등 NHN Cloud PaaS API 를 터미널·AI 에이전트에서 호출한다.
4
+ ---
5
+
6
+ # nhncloud-cli
7
+
8
+ NHN Cloud PaaS 서비스를 AWS CLI 방식으로 호출하는 TypeScript CLI.
9
+ `configure`, `logncrash search`, `deploy` 명령을 지원한다.
10
+
11
+ ## 설치
12
+
13
+ ```bash
14
+ npm install -g @bifos/nhncloud-cli
15
+ ```
16
+
17
+ ## 초기 설정 — `nhncloud configure`
18
+
19
+ **첫 설정은 `nhncloud configure` 로 한다.**
20
+ 대화형 마법사가 profile → UAK → logncrash 순으로 안내하고 저장 전 연결을 테스트한다.
21
+
22
+ ```bash
23
+ # 기본 profile 대화형 설정
24
+ nhncloud configure
25
+
26
+ # 특정 profile 대화형 설정
27
+ nhncloud configure --profile staging
28
+
29
+ # CI/자동화 — flag 로 비대화형 설정
30
+ nhncloud configure \
31
+ --uak-id <id> --uak-secret <secret> \
32
+ --logncrash-appkey <key> --logncrash-secret <secret> \
33
+ [--no-verify]
34
+ ```
35
+
36
+ ### configure 옵션
37
+
38
+ | 옵션 | 설명 |
39
+ |------|------|
40
+ | `--profile <name>` | 대상 profile (기본 `default`) |
41
+ | `--uak-id <id>` | 개인 UAK ID |
42
+ | `--uak-secret <secret>` | 개인 UAK Secret |
43
+ | `--logncrash-appkey <key>` | logncrash appkey |
44
+ | `--logncrash-secret <secret>` | logncrash secret |
45
+ | `--no-verify` | 연결 테스트 생략 |
46
+
47
+ 저장 파일 구조 (`~/.nhncloud/credentials.json`, mode 0600):
48
+
49
+ ```json
50
+ {
51
+ "version": 1,
52
+ "profiles": {
53
+ "default": {
54
+ "userAccessKey": {
55
+ "id": "<uak-id>",
56
+ "secret": "<uak-secret>"
57
+ },
58
+ "logncrash": {
59
+ "appkey": "<appkey>",
60
+ "secret": "<secretkey>"
61
+ }
62
+ }
63
+ }
64
+ }
65
+ ```
66
+
67
+ UAK 는 NHN Cloud 콘솔 → 계정 → User Access Key 에서 발급한다.
68
+ logncrash appkey 와 secret 은 콘솔 → Log & Crash Search → 프로젝트 설정에서 확인한다.
69
+
70
+ 선택적으로 `~/.nhncloud/config.json` 으로 기본 profile 을 지정할 수 있다.
71
+
72
+ ```json
73
+ {
74
+ "version": 1,
75
+ "defaultProfile": "default"
76
+ }
77
+ ```
78
+
79
+ ## 출력 모드
80
+
81
+ | 플래그 | 설명 | 용도 |
82
+ |--------|------|------|
83
+ | (없음) | 사람이 읽기 좋은 테이블 | 기본 |
84
+ | `--json` | JSON 출력 (stdout) | 파싱, 체이닝 |
85
+ | `--quiet` | 핵심 식별자만 출력 | 스크립팅 |
86
+
87
+ **AI 에이전트는 `--json` 을 사용하여 구조화된 데이터를 파싱하라.**
88
+
89
+ ---
90
+
91
+ ## 의도 → 커맨드 매핑
92
+
93
+ | 의도 | 커맨드 |
94
+ |------|--------|
95
+ | 최초 자격증명 설정 | `nhncloud configure` |
96
+ | CI/자동화 자격증명 설정 | `nhncloud configure --uak-id <id> --uak-secret <secret> --no-verify` |
97
+ | 최근 1시간 로그 검색 | `nhncloud logncrash search --query '*' --from 1h --to now` |
98
+ | 특정 logType 필터 검색 | `nhncloud logncrash search --query 'logType:"ERROR"' --from 1h --to now` |
99
+ | 시간 범위 지정 검색 | `nhncloud logncrash search --query '*' --from 2024-01-01T00:00:00+09:00 --to 2024-01-01T12:00:00+09:00` |
100
+ | 페이지네이션 | `nhncloud logncrash search --query '*' --from 1h --to now --page 1 --size 50` |
101
+ | 다른 profile 사용 | `nhncloud logncrash search --query '*' --from 1h --to now --profile staging` |
102
+
103
+ ## logncrash search 옵션
104
+
105
+ | 옵션 | 필수 | 설명 |
106
+ |------|:---:|------|
107
+ | `--query <lucene>` | 예 | Lucene 질의 문자열. API 에 그대로 전달 |
108
+ | `--from <time>` | 예 | 검색 시작. ISO8601 또는 상대시간 |
109
+ | `--to <time>` | 예 | 검색 끝. 형식 동일 |
110
+ | `--page <n>` | 아니오 | pageNumber (기본 0) |
111
+ | `--size <n>` | 아니오 | pageSize (기본 10, 최대 100) |
112
+ | `--profile <name>` | 아니오 | 사용할 profile 이름 |
113
+
114
+ 전역 옵션: `--json` / `--quiet` / `--no-color`
115
+
116
+ ## 시간 입력 형식
117
+
118
+ - 상대시간: `1h` (1시간 전), `30m` (30분 전), `2d` (2일 전), `now` (현재)
119
+ - ISO8601 직접 입력: `2024-01-01T00:00:00+09:00`
120
+
121
+ API 제약:
122
+
123
+ - 검색 시작(`--from`)은 최근 90일 이내여야 한다.
124
+ - 검색 범위(`--to` - `--from`)는 31일 이하여야 한다.
125
+
126
+ ## 체이닝 예시
127
+
128
+ ```bash
129
+ # 오류 로그 추출 후 jq 로 본문만 보기
130
+ nhncloud logncrash search \
131
+ --query 'logType:"ERROR"' \
132
+ --from 1h --to now \
133
+ --json | jq '.data[].logBody'
134
+
135
+ # 전체 건수만 확인
136
+ nhncloud logncrash search \
137
+ --query '*' \
138
+ --from 1h --to now \
139
+ --json | jq '.totalItems'
140
+ ```
141
+
142
+ ## 에러 코드
143
+
144
+ | 상황 | exit code |
145
+ |------|-----------|
146
+ | 자격증명 파일 없음·형식 오류 | 4 (CONFIG_ERROR) |
147
+ | 인증 실패 (401/403) | 2 (AUTH_ERROR) |
148
+ | API 오류 / 봉투 isSuccessful:false | 1 (API_ERROR) |
149
+ | 시간 범위 초과·필수 옵션 누락 | 3 (PARAM_ERROR) |
150
+
151
+ ---
152
+
153
+ ## deploy — NHN Cloud Deploy 배포 실행
154
+
155
+ `deploy` 명령군은 NHN Cloud Deploy v2.1 API 를 호출한다.
156
+ UAK(User Access Key) 를 OAuth `client_credentials` 로 교환한 Bearer 토큰으로 인증하며, 토큰은 만료 전까지 캐시한다.
157
+
158
+ ### deploy 설정
159
+
160
+ **`~/.nhncloud/credentials.json`** 에 profile 공통 `userAccessKey` 블록을 추가한다.
161
+ `nhncloud configure` 로 설정하는 것을 권장한다.
162
+
163
+ ```json
164
+ {
165
+ "version": 1,
166
+ "profiles": {
167
+ "default": {
168
+ "userAccessKey": {
169
+ "id": "<user-access-key-id>",
170
+ "secret": "<user-access-key-secret>"
171
+ }
172
+ }
173
+ }
174
+ }
175
+ ```
176
+
177
+ **`~/.nhncloud/config.json`** 에 deploy target 추가 (배포 좌표 — 비밀 아님):
178
+
179
+ ```json
180
+ {
181
+ "version": 1,
182
+ "defaultProfile": "default",
183
+ "deploy": {
184
+ "targets": {
185
+ "my-service": {
186
+ "appKey": "<appKey>",
187
+ "artifactId": "<artifactId>",
188
+ "serverGroupId": "<serverGroupId>",
189
+ "scenarioIds": "<id1,id2>"
190
+ }
191
+ }
192
+ }
193
+ }
194
+ ```
195
+
196
+ UAK 는 NHN Cloud 콘솔 → 계정 → User Access Key 에서 발급한다.
197
+ 배포 좌표(appKey·artifactId·serverGroupId·scenarioIds)는 Deploy 콘솔에서 확인한다.
198
+
199
+ ### 의도 → 커맨드 매핑
200
+
201
+ | 의도 | 커맨드 |
202
+ |------|--------|
203
+ | 배포 실행 (동기 완료 대기) | `nhncloud deploy run my-service` |
204
+ | 배포 실행 (즉시 반환) | `nhncloud deploy run my-service --async` |
205
+ | 특정 호스트만 배포 | `nhncloud deploy run my-service --target-hosts <host1,host2>` |
206
+ | 아티팩트 목록 조회 | `nhncloud deploy artifacts my-service` |
207
+ | 서버그룹 목록 조회 | `nhncloud deploy server-groups my-service` |
208
+ | 배포 이력 조회 | `nhncloud deploy histories my-service` |
209
+ | 다른 profile 사용 | `nhncloud deploy run my-service --profile staging` |
210
+
211
+ ### deploy run 옵션
212
+
213
+ | 옵션 | 필수 | 설명 |
214
+ |------|:---:|------|
215
+ | `<target>` | 예 | config.json 의 deploy target 이름 |
216
+ | `--app-key <k>` | 아니오 | target 의 appKey override |
217
+ | `--artifact-id <id>` | 아니오 | target 의 artifactId override |
218
+ | `--server-group-id <id>` | 아니오 | target 의 serverGroupId override |
219
+ | `--scenario-ids <csv>` | 아니오 | target 의 scenarioIds override |
220
+ | `--target-hosts <csv>` | 아니오 | 대상 호스트 (생략 시 서버그룹 전체) |
221
+ | `--concurrent <n>` | 아니오 | 병렬 배포 수 (기본 1) |
222
+ | `--next-when-fail` | 아니오 | 시나리오 실패 시에도 진행 |
223
+ | `--note <s>` | 아니오 | 배포 메모 |
224
+ | `--async` | 아니오 | 즉시 반환 (기본은 완료 대기) |
225
+ | `--profile <name>` | 아니오 | 사용할 profile 이름 |
226
+
227
+ **동기 모드 (`--async` 미지정, 기본값)**: 서버가 배포 완료까지 응답을 보류한다.
228
+ 긴 배포는 수 분이 걸릴 수 있으나 CLI 자체 폴링 없이 응답을 기다린다.
229
+
230
+ **비동기 모드 (`--async`)**: 즉시 `deploying` 상태를 반환한다.
231
+ 완료 확인은 `deploy histories` 로 한다.
232
+
233
+ ### 체이닝 예시
234
+
235
+ ```bash
236
+ # artifactId 확인 후 배포 실행
237
+ nhncloud deploy artifacts my-service --json | jq -r '.[0].artifactId'
238
+
239
+ # 특정 아티팩트로 override 하여 배포
240
+ nhncloud deploy run my-service --artifact-id <artifactId>
241
+
242
+ # 배포 이력에서 최근 상태만 확인
243
+ nhncloud deploy histories my-service --json | jq '.[0] | {deployKey, deployStatus}'
244
+ ```
245
+
246
+ ### deploy 에러 코드
247
+
248
+ | 상황 | exit code |
249
+ |------|-----------|
250
+ | UAK 누락 / config target 없음 | 4 (CONFIG_ERROR) 또는 3 (PARAM_ERROR) |
251
+ | OAuth 인증 실패 (401/403) | 2 (AUTH_ERROR) |
252
+ | Deploy API 오류 / 봉투 실패 | 1 (API_ERROR) |