본문으로 건너뛰기

Manifest Reference

이 문서는 union-cli YAML manifest의 전체 스키마를 설명합니다. manifest는 plugins/ 디렉토리에 배치하며, npm run build 시 CLI 커맨드로 변환됩니다.

아키텍처 먼저 이해하기

manifest가 빌드 파이프라인에서 어떻게 처리되는지 알고 싶다면 Architecture를 먼저 읽어보세요.


전체 스키마 구조

# ── 최상위 필드 (필수) ──
name: <string> # 플러그인 이름
namespace: <string> # CLI 네임스페이스 (커맨드 첫 단어)
description: <string> # 플러그인 설명
provider:
type: http | cli | python | js # Provider 타입
config: { ... } # Provider별 설정

# ── 커맨드 목록 (필수, 최소 1개) ──
commands:
- id: <topic>:<action> # 커맨드 ID
description: <string> # 커맨드 설명
http: { ... } # HTTP Provider 커맨드 설정
cli: { ... } # CLI Provider 커맨드 설정
python: { ... } # Python Provider 커맨드 설정
js: { ... } # JS Provider 커맨드 설정
args: [ ... ] # 위치 인자
flags: [ ... ] # 옵션 플래그
examples: [ ... ] # 사용 예시
outputParser: <string> # CLI Provider 출력 파서
overrideGlobalFlags: [ ... ] # CLI Provider globalFlags 대체
dangerous: <boolean> # 위험 동작 표시
successMessage: <string> # 성공 메시지 템플릿

최상위 필드

name Required

플러그인의 이름입니다. 식별 및 로깅 목적으로 사용됩니다.

name: my-api-service

namespace Required

CLI에서 커맨드의 첫 번째 단어로 사용되는 네임스페이스입니다. 소문자 시작, 소문자/숫자/하이픈만 허용됩니다 (^[a-z][a-z0-9-]*$).

namespace: api
# → my-cli api users list
namespace 중복 불가

하나의 프로젝트에서 같은 namespace를 가진 manifest가 2개 이상이면 빌드 에러가 발생합니다.


description Required

플러그인의 설명입니다. --help 출력에 표시됩니다.

description: "내 서비스의 REST API를 CLI로 사용"

Provider 설정

provider.type Required

설명
httpREST API 호출 (fetch)
cli외부 CLI 바이너리 래핑 (spawn)
pythonPython 함수 호출 (JSON-RPC)
jsNode.js 모듈 호출 (in-process)

provider.config Required

Provider 타입에 따라 다른 설정 객체를 사용합니다.

provider:
type: http
config:
baseUrl: "https://api.example.com/v1" # Required. 환경변수 치환 지원
auth: # Optional. 인증 설정
type: bearer
token:
env: "API_TOKEN"
headers: # Optional. 기본 헤더
X-Custom: "value"
timeout: 30000 # Optional. 타임아웃 (ms, 기본 30000)
필드타입기본값설명
baseUrl Requiredstring-API 기본 URL. ${VAR:-default} 환경변수 치환 지원
authobject-인증 설정 (Auth 가이드 참고)
headersobject-모든 요청에 추가할 기본 헤더
timeoutnumber30000요청 타임아웃 (밀리초)

commands 섹션

커맨드 배열입니다. 최소 1개 이상 필요합니다.

id Required

커맨드의 고유 식별자입니다. topic:action 형태로 작성합니다 (^[a-z][a-z0-9-]*:[a-z][a-z0-9-]*$).

commands:
- id: users:list # → my-cli <namespace> users list
- id: users:create # → my-cli <namespace> users create

같은 manifest 내에서 중복 불가합니다.

oclif에서의 변환

id: users:list + namespace: api 조합은 my-cli api users list로 변환됩니다 (topicSeparator가 공백일 때).

description Required

커맨드 설명입니다. --help에 표시됩니다.


커맨드별 Provider 설정

Provider 타입에 맞는 설정 섹션이 필요합니다. Provider 타입과 커맨드 설정이 일치하지 않으면 빌드 에러가 발생합니다.

http:
method: GET | POST | PUT | PATCH | DELETE
path: "/users/{user_id}" # Path parameter는 {name} 형식
body: # Optional. 정적 body (flags와 병합)
source: "cli"
필드설명
method RequiredHTTP 메서드: GET, POST, PUT, PATCH, DELETE
path Required엔드포인트 경로. {name} 형식으로 path parameter 지원
body정적 body 값. flags의 httpMap: body와 병합됩니다

args (위치 인자)

커맨드에 전달하는 위치 기반 인자입니다. 순서대로 매핑됩니다.

args:
- name: user_id
required: true
description: "사용자 ID"
default: "default-user"
필드타입기본값설명
name Requiredstring-인자 이름
requiredbooleanfalse필수 여부
descriptionstring-인자 설명
defaultany-기본값

HTTP Provider에서 path parameter로 활용:

http:
path: "/users/{user_id}"
args:
- name: user_id
required: true

flags (옵션 플래그)

커맨드에 전달하는 이름 기반 옵션입니다.

기본 속성

필드타입기본값설명
name Requiredstring-플래그 이름 (--name으로 사용)
typestringstring값 타입: string, number, boolean
charstring-단축키 (-l 등). 1자. -h-q는 사용 불가
requiredbooleanfalse필수 여부
defaultany-기본값
descriptionstring-플래그 설명
optionsstring[]-허용 값 목록 (enum)

Provider별 매핑 속성

필드설명
httpMap매핑 대상: query, body, header
httpNameAPI 파라미터 이름이 플래그 이름과 다를 때 사용
httpBodyTypebody 값 변환: json, array, number-array

httpMap 요약:

httpMap동작예시
query?name=value--status active?status=active
bodyJSON body field--name John{"name":"John"}
headerHTTP header--trace-id abctrace-id: abc

httpName으로 플래그 이름과 API 파라미터 이름을 다르게 매핑할 수 있습니다:

flags:
- name: status
httpMap: query
httpName: "filter_status" # → ?filter_status=active

자세한 매핑 예시와 httpBodyType 변환은 Provider 가이드 - HTTP Provider를 참조하세요.

Flag 타입별 동작

- name: status
type: string # 또는 type 생략 (기본값)
default: "active"
options: ["active", "inactive", "all"]
# → --status active

제약 사항

예약된 플래그 이름

다음 이름은 표준 플래그와 충돌하므로 사용할 수 없습니다:

  • json, debug, quiet, no-color, format, help

다음 단축키는 사용할 수 없습니다:

  • -h (help), -q (quiet)
민감 정보 경고

다음 이름 패턴은 빌드 시 경고가 출력됩니다 (ps/history 노출 위험):

  • password, secret, token, api-key, api_key, credential, auth-token, auth_token

민감 정보는 SecretRef를 사용하여 환경변수나 파일에서 읽어오세요.


examples

사용 예시 목록입니다. --help에 표시됩니다.

examples:
- "my-cli api users list --limit 50"
- "my-cli api users list --status active --json"

outputParser (CLI Provider 전용)

CLI 바이너리의 stdout 출력을 파싱하는 방식입니다. CLI Provider에서만 사용됩니다.

동작
jsonJSON.parse (기본값)
yamlYAML 파싱
line단일 문자열
lines줄바꿈 분리 → 문자열 배열
table공백 구분 테이블 파싱
csv콤마 구분 테이블 파싱
regex원본 그대로 반환

overrideGlobalFlags (CLI Provider 전용)

특정 커맨드에서 provider의 globalFlags를 대체합니다.

# globalFlags를 ["-o", "yaml"]로 대체
overrideGlobalFlags: ["-o", "yaml"]

# globalFlags 비활성화
overrideGlobalFlags: []
정보

overrideGlobalFlags를 빈 배열([])로 설정하면 해당 커맨드에서 globalFlags가 완전히 비활성화됩니다. 이는 로그 출력처럼 JSON 형식이 필요 없는 커맨드에 유용합니다.


dangerous

위험한 동작(삭제, 초기화 등)을 수행하는 커맨드에 설정합니다.

commands:
- id: data:reset
description: "전체 데이터 초기화"
dangerous: true
http:
method: DELETE
path: "/data"

dangerous: true 설정 시:

  • 실행 전 정말 실행하시겠습니까? (y/N): 확인 프롬프트 표시
  • --force 플래그 자동 추가 (확인 건너뛰기)
  • 비-TTY 환경에서는 --force 없이 실행 불가 (CI/CD 안전장치)

successMessage

커맨드 성공 시 표시할 사용자 정의 메시지입니다. {argName} 또는 {flagName}으로 값을 삽입할 수 있습니다.

successMessage: "사용자 {name}이(가) 성공적으로 생성되었습니다."

stderr로 출력되어 파이프 오염을 방지합니다. --quiet 시 표시되지 않습니다. 미설정 시 GET이 아닌 HTTP method에서 "POST 요청 완료 (123ms)" 형태의 기본 메시지가 표시됩니다.


인증 (Auth)

지원 타입

타입설정동작
nonetype: none인증 없이 요청
bearertype: bearer + tokenAuthorization: Bearer {token}
basictype: basic + credentialsAuthorization: Basic {base64}
jwttype: jwt + tokenEndpoint + credentials자동 토큰 발급 + TTL 캐싱
api-keytype: api-key + token + headerName{headerName}: {token}
cookietype: cookie + serviceNameOAuth 브라우저 로그인 → 쿠키 저장

SecretRef (비밀값 참조)

토큰, 비밀번호 등은 직접 YAML에 넣지 않고 참조로 선언합니다. 4가지 소스(env, file, command, value)를 지원합니다.

자세한 설명과 예시는 인증 가이드 -- SecretRef를 참조하세요.

Auth 타입별 설정

auth:
type: bearer
token:
env: "API_TOKEN"

각 인증 타입의 동작 방식과 상세 설정은 인증 가이드를 참조하세요.


환경변수 치환

manifest의 문자열 값에서 환경변수를 참조할 수 있습니다.

문법설명
${VAR_NAME}환경변수 값으로 치환. 없으면 빈 문자열
${VAR_NAME:-default}환경변수가 없으면 기본값 사용
baseUrl: "${BASE_URL:-https://default.example.com}/api/v1"

환경변수 치환은 provider.config.baseUrl (init hook 및 codegen에서 해석)과 SecretRef의 env 필드 (런타임에 process.env에서 읽기)에서 수행됩니다.

환경변수 치환이 아키텍처에서 어떻게 동작하는지에 대한 자세한 내용은 Architecture - 환경변수 치환을 참고하세요.


전체 예시

HTTP Provider 전체 예시

다음은 인증, 다양한 플래그 매핑, dangerous 커맨드를 포함한 완전한 HTTP Provider manifest입니다.

name: my-service
namespace: svc
description: "내 서비스 API"

provider:
type: http
config:
baseUrl: "${SVC_URL:-https://api.example.com}/v1"
auth:
type: jwt
tokenEndpoint: "/auth/token"
tokenTTL: 1800
credentials:
username:
env: "SVC_USER"
password:
env: "SVC_PASS"
headers:
X-Client: "union-cli"
timeout: 15000

commands:
# ── 조회: GET + query parameters ──
- id: users:list
description: "사용자 목록 조회"
http: { method: GET, path: "/users" }
flags:
- name: limit
type: number
default: 20
httpMap: query
- name: status
options: ["active", "inactive"]
httpMap: query

# ── 상세 조회: GET + path parameter ──
- id: users:get
description: "사용자 상세 조회"
http: { method: GET, path: "/users/{user_id}" }
args:
- name: user_id
required: true

# ── 생성: POST + body mapping + successMessage ──
- id: users:create
description: "사용자 생성"
http: { method: POST, path: "/users" }
successMessage: "사용자 {name}이(가) 생성되었습니다."
flags:
- name: name
required: true
httpMap: body
- name: email
required: true
httpMap: body
- name: roles
httpMap: body
httpBodyType: array

# ── 삭제: DELETE + dangerous ──
- id: users:delete
description: "사용자 삭제"
dangerous: true
http: { method: DELETE, path: "/users/{user_id}" }
args:
- name: user_id
required: true

CLI Provider 전체 예시는 Provider 가이드 - CLI Provider를 참조하세요.