@bolta-io/cli 0.1.1 → 0.3.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.
Files changed (119) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/CLAUDE.md +35 -31
  3. package/README.md +26 -27
  4. package/dist/bin/bolta.js +14 -29
  5. package/dist/bin/bolta.js.map +1 -1
  6. package/dist/src/client/bolta-client.d.ts +24 -27
  7. package/dist/src/client/bolta-client.d.ts.map +1 -1
  8. package/dist/src/client/bolta-client.js +106 -84
  9. package/dist/src/client/bolta-client.js.map +1 -1
  10. package/dist/src/commands/cash-receipt/cancel.js +3 -3
  11. package/dist/src/commands/cash-receipt/cancel.js.map +1 -1
  12. package/dist/src/commands/cash-receipt/issue.js +3 -3
  13. package/dist/src/commands/cash-receipt/issue.js.map +1 -1
  14. package/dist/src/commands/cash-receipt/status.d.ts.map +1 -1
  15. package/dist/src/commands/cash-receipt/status.js +3 -8
  16. package/dist/src/commands/cash-receipt/status.js.map +1 -1
  17. package/dist/src/commands/certificate/index.d.ts.map +1 -1
  18. package/dist/src/commands/certificate/index.js +19 -42
  19. package/dist/src/commands/certificate/index.js.map +1 -1
  20. package/dist/src/commands/config/index.d.ts.map +1 -1
  21. package/dist/src/commands/config/index.js +17 -54
  22. package/dist/src/commands/config/index.js.map +1 -1
  23. package/dist/src/commands/examples/index.d.ts.map +1 -1
  24. package/dist/src/commands/examples/index.js +8 -9
  25. package/dist/src/commands/examples/index.js.map +1 -1
  26. package/dist/src/commands/guide/index.d.ts.map +1 -1
  27. package/dist/src/commands/guide/index.js +35 -29
  28. package/dist/src/commands/guide/index.js.map +1 -1
  29. package/dist/src/commands/invoice/amend.d.ts.map +1 -1
  30. package/dist/src/commands/invoice/amend.js +25 -33
  31. package/dist/src/commands/invoice/amend.js.map +1 -1
  32. package/dist/src/commands/invoice/get.d.ts.map +1 -1
  33. package/dist/src/commands/invoice/get.js +2 -7
  34. package/dist/src/commands/invoice/get.js.map +1 -1
  35. package/dist/src/commands/invoice/index.d.ts.map +1 -1
  36. package/dist/src/commands/invoice/index.js +10 -6
  37. package/dist/src/commands/invoice/index.js.map +1 -1
  38. package/dist/src/commands/invoice/issue-request.d.ts.map +1 -1
  39. package/dist/src/commands/invoice/issue-request.js +6 -16
  40. package/dist/src/commands/invoice/issue-request.js.map +1 -1
  41. package/dist/src/commands/invoice/issue.d.ts.map +1 -1
  42. package/dist/src/commands/invoice/issue.js +6 -16
  43. package/dist/src/commands/invoice/issue.js.map +1 -1
  44. package/dist/src/commands/invoice/reference-id.d.ts +2 -0
  45. package/dist/src/commands/invoice/reference-id.d.ts.map +1 -0
  46. package/dist/src/commands/invoice/reference-id.js +8 -0
  47. package/dist/src/commands/invoice/reference-id.js.map +1 -0
  48. package/dist/src/commands/invoice/status.d.ts.map +1 -1
  49. package/dist/src/commands/invoice/status.js +6 -8
  50. package/dist/src/commands/invoice/status.js.map +1 -1
  51. package/dist/src/commands/issuer/create.d.ts +4 -0
  52. package/dist/src/commands/issuer/create.d.ts.map +1 -0
  53. package/dist/src/commands/issuer/create.js +24 -0
  54. package/dist/src/commands/issuer/create.js.map +1 -0
  55. package/dist/src/commands/issuer/get.d.ts +3 -0
  56. package/dist/src/commands/issuer/get.d.ts.map +1 -0
  57. package/dist/src/commands/issuer/get.js +14 -0
  58. package/dist/src/commands/issuer/get.js.map +1 -0
  59. package/dist/src/commands/issuer/index.d.ts +3 -0
  60. package/dist/src/commands/issuer/index.d.ts.map +1 -0
  61. package/dist/src/commands/issuer/index.js +31 -0
  62. package/dist/src/commands/issuer/index.js.map +1 -0
  63. package/dist/src/commands/schema/index.d.ts.map +1 -1
  64. package/dist/src/commands/schema/index.js +3 -4
  65. package/dist/src/commands/schema/index.js.map +1 -1
  66. package/dist/src/commands/supplier/legacy.d.ts +3 -0
  67. package/dist/src/commands/supplier/legacy.d.ts.map +1 -0
  68. package/dist/src/commands/supplier/legacy.js +75 -0
  69. package/dist/src/commands/supplier/legacy.js.map +1 -0
  70. package/dist/src/config/config-manager.d.ts +7 -9
  71. package/dist/src/config/config-manager.d.ts.map +1 -1
  72. package/dist/src/config/config-manager.js +28 -48
  73. package/dist/src/config/config-manager.js.map +1 -1
  74. package/dist/src/types/api.d.ts +40 -7
  75. package/dist/src/types/api.d.ts.map +1 -1
  76. package/dist/src/utils/client.d.ts +10 -15
  77. package/dist/src/utils/client.d.ts.map +1 -1
  78. package/dist/src/utils/client.js +26 -8
  79. package/dist/src/utils/client.js.map +1 -1
  80. package/dist/src/utils/errors.d.ts +1 -1
  81. package/dist/src/utils/errors.d.ts.map +1 -1
  82. package/dist/src/utils/errors.js +2 -2
  83. package/dist/src/utils/errors.js.map +1 -1
  84. package/dist/src/utils/legacy-issuer.d.ts +28 -0
  85. package/dist/src/utils/legacy-issuer.d.ts.map +1 -0
  86. package/dist/src/utils/legacy-issuer.js +45 -0
  87. package/dist/src/utils/legacy-issuer.js.map +1 -0
  88. package/dist/src/utils/output.d.ts +7 -3
  89. package/dist/src/utils/output.d.ts.map +1 -1
  90. package/dist/src/utils/output.js +14 -4
  91. package/dist/src/utils/output.js.map +1 -1
  92. package/dist/src/{commands/cash-receipt/validation.d.ts → validators/parse.d.ts} +1 -1
  93. package/dist/src/validators/parse.d.ts.map +1 -0
  94. package/dist/src/{commands/cash-receipt/validation.js → validators/parse.js} +2 -2
  95. package/dist/src/validators/parse.js.map +1 -0
  96. package/dist/src/validators/schemas.d.ts +2 -1
  97. package/dist/src/validators/schemas.d.ts.map +1 -1
  98. package/dist/src/validators/schemas.js +28 -11
  99. package/dist/src/validators/schemas.js.map +1 -1
  100. package/llms.txt +38 -36
  101. package/package.json +1 -1
  102. package/dist/src/commands/cash-receipt/validation.d.ts.map +0 -1
  103. package/dist/src/commands/cash-receipt/validation.js.map +0 -1
  104. package/dist/src/commands/supplier/create.d.ts +0 -4
  105. package/dist/src/commands/supplier/create.d.ts.map +0 -1
  106. package/dist/src/commands/supplier/create.js +0 -40
  107. package/dist/src/commands/supplier/create.js.map +0 -1
  108. package/dist/src/commands/supplier/get.d.ts +0 -3
  109. package/dist/src/commands/supplier/get.d.ts.map +0 -1
  110. package/dist/src/commands/supplier/get.js +0 -19
  111. package/dist/src/commands/supplier/get.js.map +0 -1
  112. package/dist/src/commands/supplier/index.d.ts +0 -3
  113. package/dist/src/commands/supplier/index.d.ts.map +0 -1
  114. package/dist/src/commands/supplier/index.js +0 -56
  115. package/dist/src/commands/supplier/index.js.map +0 -1
  116. package/dist/src/commands/supplier/legacy-customer.d.ts +0 -5
  117. package/dist/src/commands/supplier/legacy-customer.d.ts.map +0 -1
  118. package/dist/src/commands/supplier/legacy-customer.js +0 -56
  119. package/dist/src/commands/supplier/legacy-customer.js.map +0 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @bolta-io/cli
2
2
 
3
+ ## 0.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 5f12b82: 세금계산서 수정발행 3종에 선택형 `--reference-id`를 추가하고, 모든 세금계산서 명령에서 요청자 관리번호를 앞뒤 공백 없는 출력 가능한 ASCII 1~255자로 검증합니다. 관리번호를 사용한 요청은 자동 재전송하지 않습니다. 손상된 응답처럼 접수 결과를 확인하지 못한 경우에는 `NETWORK_ERROR`와 함께 `invoice status`로 접수 여부를 확인하도록 안내합니다.
8
+
9
+ ## 0.2.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 1570031: 발급자 관리와 인증서 API를 issuer 계약으로 전환하고 발행 기본 인증에서 별도 발급자 키를 제거합니다. 기존 supplier/customer 명령과 키 설정은 2026-12-31까지 숨김 호환으로 유지하며, 레거시 키로 403이 발생하면 설정 출처에 맞는 해제 방법을 안내합니다. `bolta guide issuer`는 CLI가 실제 지원하는 발행 흐름만 안내합니다.
14
+
3
15
  ## 0.1.1
4
16
 
5
17
  ### Patch Changes
package/CLAUDE.md CHANGED
@@ -7,24 +7,20 @@
7
7
  ```bash
8
8
  # 인증 설정 (환경변수)
9
9
  export BOLTA_API_KEY="test_your_key"
10
- export BOLTA_SUPPLIER_KEY="SupplierKey_abc123"
11
10
 
12
11
  # 또는 config 명령어로 설정
13
12
  bolta config set api-key test_your_key
14
- bolta config set supplier-key SupplierKey_abc123
15
13
  ```
16
14
 
17
- ## 핵심 개념: Supplier Key (중요!)
15
+ ## 핵심 개념: 발급자
18
16
 
19
- supplierKey는 세금계산서나 현금영수증을 발행하는 **공급자 본인**을 식별하는 키입니다.
17
+ 발급자는 세금계산서나 현금영수증 발행에 사용하는 인증서의 소유자입니다.
20
18
 
21
- - 획득: 공급자의 사업자 정보로 `bolta supplier create` 호출 → 응답의 supplierKey
22
- - 설정: `bolta config set supplier-key <값>` 또는 `BOLTA_SUPPLIER_KEY` 환경변수
23
- - API 단위로 독립 관리 (test_/live_ 키별로 별도 생성 필요, 상호 호환 안 됨)
19
+ - 등록: `bolta issuer create` 호출 → 응답의 `issuerId`
20
+ - 관리: `issuerId`는 발급자 조회와 인증서 등록·조회·해제에만 사용
21
+ - 발행: API 키로 인증하고 요청 본문의 사업자등록번호로 발급자를 선택
24
22
 
25
- **주의: Supplier-Key에 받는 쪽의 키를 넣지 마세요.** 받는 쪽 정보는 세금계산서 JSON의 `supplied` 또는 현금영수증 JSON의 `recipient` 필드에 포함합니다.
26
-
27
- > 구 명칭 `customer`(명령어·`--customer-key`·`BOLTA_CUSTOMER_KEY`·`config set customer-key`)는 deprecated이며 당분간 동작합니다(경고 출력).
23
+ 일반 정발행과 역발행은 `supplier.identificationNumber`, 현금영수증은 `issuer.businessRegistrationNumber`를 사용합니다.
28
24
 
29
25
  ## 요금 안내
30
26
 
@@ -38,19 +34,19 @@ Bolta API는 **사전 충전 포인트 차감 방식** 유료 서비스입니다
38
34
 
39
35
  ### 세금계산서 발행 (가장 일반적인 업무)
40
36
 
41
- 1. **공급자 등록** (최초 1회):
37
+ 1. **발급자 등록** (최초 1회):
42
38
  ```bash
43
- bolta supplier create --data '{"identificationNumber":"1234567890","organizationName":"주식회사 테스트","representativeName":"홍길동"}'
39
+ bolta issuer create --data '{"identificationNumber":"1234567890","organizationName":"주식회사 테스트","representativeName":"홍길동"}'
44
40
  ```
45
41
 
46
42
  2. **인증서 확인** (정발행 시 공급자 인증서 필요):
47
43
  ```bash
48
- bolta certificate status SupplierKey_abc123
44
+ bolta certificate status <issuerId>
49
45
  ```
50
46
 
51
47
  3. **세금계산서 정발행**:
52
48
  ```bash
53
- bolta invoice issue --data '{
49
+ bolta invoice issue --reference-id inv-2026-001 --data '{
54
50
  "date": "2026-03-25",
55
51
  "purpose": "CLAIM",
56
52
  "taxType": "TAXABLE",
@@ -58,7 +54,7 @@ bolta invoice issue --data '{
58
54
  "identificationNumber": "1234567890",
59
55
  "organizationName": "공급자",
60
56
  "representativeName": "김공급",
61
- "manager": {"email": "supplier@example.com"}
57
+ "manager": {"email": "seller@example.com"}
62
58
  },
63
59
  "supplied": {
64
60
  "identificationNumber": "0987654321",
@@ -75,7 +71,14 @@ bolta invoice issue --data '{
75
71
  }'
76
72
  ```
77
73
 
78
- 4. **발행 결과 확인**:
74
+ 4. **접수 여부 확인** (발행 응답을 받지 못한 경우):
75
+ ```bash
76
+ bolta invoice status --reference-id inv-2026-001
77
+ ```
78
+
79
+ 같은 요청을 다시 보내지 마세요. 같은 API 키의 세금계산서 발행 계열에서는 요청자 관리번호를 재사용할 수 없습니다. 중복이면 API가 `400 INVALID_REQUEST`를 반환합니다.
80
+
81
+ 5. **발행 결과 확인**:
79
82
  ```bash
80
83
  bolta invoice get <issuanceKey>
81
84
  ```
@@ -106,18 +109,18 @@ bolta cash-receipt status --reference-id cash-2026-001
106
109
 
107
110
  | 커맨드 | 설명 | 데이터 필요 |
108
111
  |--------|------|------------|
109
- | `bolta supplier create` | 공급자 생성 | --data |
110
- | `bolta supplier get <key>` | 공급자 조회 | - |
111
- | `bolta certificate url <key>` | 인증서 등록 URL | - |
112
- | `bolta certificate status <key>` | 인증서 상태 | - |
113
- | `bolta certificate deregister <key>` | 인증서 해제 | - |
114
- | `bolta invoice issue` | 세금계산서 정발행 | --data |
115
- | `bolta invoice issue-request` | 역발행 요청 | --data |
112
+ | `bolta issuer create` | 발급자 등록 | --data |
113
+ | `bolta issuer get <issuerId>` | 발급자 조회 | - |
114
+ | `bolta certificate url <issuerId>` | 인증서 등록 URL | - |
115
+ | `bolta certificate status <issuerId>` | 인증서 상태 | - |
116
+ | `bolta certificate deregister <issuerId>` | 인증서 해제 | - |
117
+ | `bolta invoice issue [--reference-id <id>]` | 세금계산서 정발행 | --data |
118
+ | `bolta invoice issue-request [--reference-id <id>]` | 역발행 요청 | --data |
116
119
  | `bolta invoice get <issuanceKey>` | 세금계산서 조회 | - |
117
120
  | `bolta invoice status --reference-id <id>` | 상태 조회 | - |
118
- | `bolta invoice amend termination <key> --date <date>` | 수정: 계약해제 | - |
119
- | `bolta invoice amend change-supply-cost <key>` | 수정: 가액변동 | --data |
120
- | `bolta invoice amend double-issuance <key>` | 수정: 착오 이중발급 | - |
121
+ | `bolta invoice amend termination <key> --date <date> [--reference-id <id>]` | 수정: 계약해제 | - |
122
+ | `bolta invoice amend change-supply-cost <key> [--reference-id <id>]` | 수정: 가액변동 | --data |
123
+ | `bolta invoice amend double-issuance <key> [--reference-id <id>]` | 수정: 착오 이중발급 | - |
121
124
  | `bolta cash-receipt issue --reference-id <id>` | 현금영수증 발행 | --data |
122
125
  | `bolta cash-receipt status --reference-id <id>` | 현금영수증 상태 조회 | - |
123
126
  | `bolta cash-receipt cancel <key> --reference-id <id>` | 현금영수증 전액 취소 | - |
@@ -128,8 +131,6 @@ bolta cash-receipt status --reference-id cash-2026-001
128
131
  | `bolta schema [command]` | 입력 스키마 | - |
129
132
  | `bolta guide [topic]` | 주요 개념 안내 | - |
130
133
 
131
- > 인증서 명령의 `<key>`에는 신규 supplierKey를 쓰세요. deprecated `CustomerKey_` 키도 당분간 동작합니다.
132
-
133
134
  ## 입력 방법
134
135
 
135
136
  데이터가 필요한 커맨드에서 3가지 방식 지원:
@@ -152,11 +153,12 @@ bolta cash-receipt status --reference-id cash-2026-001
152
153
  | `AUTH_ERROR` | API 키 없음/잘못됨 | `bolta config set api-key <key>` |
153
154
  | `VALIDATION_ERROR` | 입력 데이터 오류 | `bolta schema <command>`로 스키마 확인 |
154
155
  | `INPUT_ERROR` | 명령어·옵션·입력 방식 오류 | `bolta --help` 또는 하위 명령의 `--help`로 사용법 확인 |
156
+ | `INVALID_REQUEST` | 세금계산서 요청 검증 실패 또는 요청자 관리번호 중복 | `error.message` 확인. 중복이면 `invoice status`로 기존 요청 확인 |
155
157
  | `HTTP_402` | 포인트 잔액 부족 | https://developers.bolta.io 에서 포인트 충전 |
156
158
  | `HTTP_400` | 잘못된 요청 | error.message 확인, 필수 필드 누락 체크 |
157
- | `HTTP_404` | 리소스 없음 | issuanceKey/supplierKey 확인 |
158
- | `HTTP_429` | 요청 제한 초과 | 자동 재시도 (최대 3회) |
159
- | `NETWORK_ERROR` | 네트워크 오류 | 인터넷 연결 확인 |
159
+ | `HTTP_404` | 리소스 없음 | issuanceKey/issuerId 확인 |
160
+ | `HTTP_429` | 요청 제한 초과 | 일반 요청은 자동 재시도. 관리번호가 있는 세금계산서 요청은 `invoice status`로 접수 여부 확인 |
161
+ | `NETWORK_ERROR` | 네트워크 오류 또는 응답 본문 읽기 실패 | 인터넷 연결 확인. 세금계산서 관리번호를 사용했다면 재전송하지 말고 `invoice status`로 접수 여부 확인 |
160
162
 
161
163
  ## 개발 명령어
162
164
 
@@ -178,4 +180,6 @@ npm test # 테스트 실행
178
180
  - `taxType`이 TAX_FREE이면 모든 품목의 `tax`를 null로 설정하고, ZERO_RATE이면 0으로 설정
179
181
  - 사업자등록번호는 하이픈 있어도 되고 없어도 됨 (자동 변환)
180
182
  - 계약 해제(`amend termination`)는 원본 세금계산서의 품목 공급가액이 음수인 경우 사용 불가
183
+ - 세금계산서 `--reference-id`는 선택 사항이며 앞뒤 공백 없는 출력 가능한 ASCII 1~255자. 같은 API 키의 정발행·역발행·수정발행에서 재사용 불가
184
+ - 관리번호를 넣은 세금계산서 요청은 CLI가 자동 재전송하지 않음. 응답을 받지 못했거나 본문을 읽지 못하면 `invoice status`로 확인
181
185
  - `--dry-run` 옵션으로 실제 API 호출 없이 요청 데이터 확인 가능
package/README.md CHANGED
@@ -35,11 +35,9 @@ Bolta API를 사용하려면 API 키가 필요합니다. 환경변수 또는 CLI
35
35
  ```bash
36
36
  # 방법 1: 환경변수 (권장)
37
37
  export BOLTA_API_KEY="test_your_key"
38
- export BOLTA_SUPPLIER_KEY="SupplierKey_abc123"
39
38
 
40
39
  # 방법 2: CLI 명령 (영구 저장 - ~/.bolta/config.json)
41
40
  bolta config set api-key test_your_key
42
- bolta config set supplier-key SupplierKey_abc123
43
41
 
44
42
  # 연결 테스트
45
43
  bolta config test
@@ -49,42 +47,40 @@ bolta config test
49
47
 
50
48
  ### 커맨드 전체 목록
51
49
 
52
- #### 공급자 관리
50
+ #### 발급자 관리
53
51
 
54
52
  ```bash
55
- # 공급자 생성
56
- bolta supplier create --data '{
53
+ # 발급자 등록
54
+ bolta issuer create --data '{
57
55
  "identificationNumber": "1234567890",
58
56
  "organizationName": "주식회사 테스트",
59
57
  "representativeName": "홍길동"
60
58
  }'
61
59
 
62
- # 공급자 조회
63
- bolta supplier get <supplierKey>
60
+ # 발급자 조회
61
+ bolta issuer get <issuerId>
64
62
  ```
65
63
 
66
- > 구 `customer` 명령(`bolta customer ...`)은 deprecated이며 당분간 동작합니다(경고 출력).
67
-
68
64
  #### 인증서 관리
69
65
 
70
66
  ```bash
71
67
  # 인증서 등록 URL 조회
72
- bolta certificate url <supplierKey>
68
+ bolta certificate url <issuerId>
73
69
 
74
70
  # 인증서 등록 상태 조회
75
- bolta certificate status <supplierKey>
71
+ bolta certificate status <issuerId>
76
72
 
77
73
  # 인증서 해제
78
- bolta certificate deregister <supplierKey>
74
+ bolta certificate deregister <issuerId>
79
75
  ```
80
76
 
81
- > deprecated `CustomerKey_` 키도 인증서 명령에서 당분간 사용할 있습니다.
77
+ `issuerId`는 발급자와 인증서 관리에만 사용합니다. 발행 요청은 본문의 사업자등록번호로 발급자를 찾습니다.
82
78
 
83
79
  #### 세금계산서 발행/조회
84
80
 
85
81
  ```bash
86
82
  # 세금계산서 정발행
87
- bolta invoice issue --data '{
83
+ bolta invoice issue --reference-id inv-2026-001 --data '{
88
84
  "date": "2026-03-25",
89
85
  "purpose": "CLAIM",
90
86
  "taxType": "TAXABLE",
@@ -92,7 +88,7 @@ bolta invoice issue --data '{
92
88
  "identificationNumber": "1234567890",
93
89
  "organizationName": "공급자 주식회사",
94
90
  "representativeName": "김공급",
95
- "manager": { "email": "supplier@example.com" }
91
+ "manager": { "email": "seller@example.com" }
96
92
  },
97
93
  "supplied": {
98
94
  "identificationNumber": "0987654321",
@@ -114,23 +110,27 @@ bolta invoice issue --data '{
114
110
  bolta examples invoice-issue-foreign-supplied
115
111
 
116
112
  # 세금계산서 역발행 요청 (공급받는자는 사업자등록번호만 허용)
117
- bolta invoice issue-request --data '{...}'
113
+ bolta invoice issue-request --reference-id inv-2026-002 --data '{...}'
118
114
 
119
115
  # 세금계산서 조회
120
116
  bolta invoice get <issuanceKey>
121
117
 
122
- # Client-Reference-Id로 상태 조회
118
+ # Bolta-Client-Reference-Id로 상태 조회
123
119
  bolta invoice status --reference-id <id>
124
120
  ```
125
121
 
122
+ 세금계산서의 `--reference-id`는 선택 사항입니다. 앞뒤 공백 없는 출력 가능한 ASCII 1~255자를 입력하세요. 같은 API 키의 정발행·역발행·수정발행에서 이미 사용한 값은 요청 내용이나 명령이 달라도 다시 사용할 수 없습니다. 중복이면 API가 `400 INVALID_REQUEST`를 반환합니다.
123
+
124
+ 응답을 받지 못했거나 응답 본문을 읽지 못했다면 같은 요청을 다시 보내지 마세요. 요청에 사용한 값으로 `bolta invoice status --reference-id <id>`를 실행해 접수 여부를 확인하세요. 새 발행 요청에는 사용하지 않은 값을 입력합니다.
125
+
126
126
  #### 수정발행
127
127
 
128
128
  ```bash
129
129
  # 수정발행: 계약 해제
130
- bolta invoice amend termination <issuanceKey> --date 2026-03-25
130
+ bolta invoice amend termination <issuanceKey> --date 2026-03-25 --reference-id amend-2026-001
131
131
 
132
132
  # 수정발행: 공급가액 변동
133
- bolta invoice amend change-supply-cost <issuanceKey> --data '{
133
+ bolta invoice amend change-supply-cost <issuanceKey> --reference-id amend-2026-002 --data '{
134
134
  "date": "2026-03-25",
135
135
  "taxType": "TAXABLE",
136
136
  "items": [{
@@ -142,7 +142,7 @@ bolta invoice amend change-supply-cost <issuanceKey> --data '{
142
142
  }'
143
143
 
144
144
  # 수정발행: 착오에 의한 이중발급 (입력 데이터 불필요)
145
- bolta invoice amend double-issuance <issuanceKey>
145
+ bolta invoice amend double-issuance <issuanceKey> --reference-id amend-2026-003
146
146
  ```
147
147
 
148
148
  #### 현금영수증
@@ -185,7 +185,7 @@ bolta cash-receipt status --reference-id cash-2026-001-cancel
185
185
  #### 설정
186
186
 
187
187
  ```bash
188
- bolta config set <key> <value> # api-key, supplier-key, base-url
188
+ bolta config set <key> <value> # api-key, base-url, update-check
189
189
  bolta config show # 현재 설정 확인
190
190
  bolta config test # API 연결 테스트
191
191
  ```
@@ -193,7 +193,7 @@ bolta config test # API 연결 테스트
193
193
  #### 도움말
194
194
 
195
195
  ```bash
196
- # 주요 개념 안내 (supplier-key, payment, workflow, cash-receipt, glossary)
196
+ # 주요 개념 안내 (issuer, payment, workflow, cash-receipt, glossary)
197
197
  bolta guide [topic]
198
198
 
199
199
  # 바로 쓸 수 있는 샘플 JSON
@@ -237,8 +237,6 @@ cat invoice.json | bolta invoice issue --stdin
237
237
  | 옵션 | 설명 |
238
238
  |------|------|
239
239
  | `--api-key <key>` | API 키 오버라이드 |
240
- | `--supplier-key <key>` | Supplier Key 오버라이드 |
241
- | `--customer-key <key>` | (deprecated) `--supplier-key`를 사용하세요 |
242
240
  | `--verbose` | 상세 로그 출력 (stderr) |
243
241
  | `--dry-run` | API 호출 없이 요청 데이터만 출력 |
244
242
 
@@ -261,11 +259,12 @@ cat invoice.json | bolta invoice issue --stdin
261
259
  | `AUTH_ERROR` | API 키 없음/잘못됨 | `bolta config set api-key <key>` |
262
260
  | `VALIDATION_ERROR` | 입력 데이터 오류 | `bolta schema <command>`로 스키마 확인 |
263
261
  | `INPUT_ERROR` | 명령어·옵션·입력 방식 오류 | `bolta --help` 또는 하위 명령의 `--help`로 사용법 확인 |
262
+ | `INVALID_REQUEST` | 세금계산서 요청 검증 실패 또는 요청자 관리번호 중복 | `error.message` 확인. 중복이면 `invoice status`로 기존 요청 확인 |
264
263
  | `HTTP_402` | 포인트 잔액 부족 | https://developers.bolta.io 에서 포인트 충전 |
265
264
  | `HTTP_400` | 잘못된 요청 | error.message 확인 |
266
- | `HTTP_404` | 리소스 없음 | issuanceKey/supplierKey 확인 |
267
- | `HTTP_429` | 요청 제한 초과 | 자동 재시도 (최대 3회) |
268
- | `NETWORK_ERROR` | 네트워크 오류 | 인터넷 연결 확인 |
265
+ | `HTTP_404` | 리소스 없음 | issuanceKey/issuerId 확인 |
266
+ | `HTTP_429` | 요청 제한 초과 | 일반 요청은 자동 재시도. 관리번호가 있는 세금계산서 요청은 `invoice status`로 접수 여부 확인 |
267
+ | `NETWORK_ERROR` | 네트워크 오류 또는 응답 본문 읽기 실패 | 인터넷 연결 확인. 세금계산서 관리번호를 사용했다면 재전송하지 말고 `invoice status`로 접수 여부 확인 |
269
268
 
270
269
  ---
271
270
 
package/dist/bin/bolta.js CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env node
2
- import { Command, CommanderError } from 'commander';
3
- import { registerSupplierCommands } from '../src/commands/supplier/index.js';
2
+ import { Command, CommanderError, Option } from 'commander';
3
+ import { registerIssuerCommands } from '../src/commands/issuer/index.js';
4
+ import { registerLegacyIssuerCommands } from '../src/commands/supplier/legacy.js';
4
5
  import { registerCertificateCommands } from '../src/commands/certificate/index.js';
5
6
  import { registerInvoiceCommands } from '../src/commands/invoice/index.js';
6
7
  import { registerConfigCommands } from '../src/commands/config/index.js';
@@ -10,7 +11,7 @@ import { registerUpdateCommands } from '../src/commands/update/index.js';
10
11
  import { maybeNudgeUpdate, refreshUpdateCache, UPDATE_CACHE_COMMAND, } from '../src/commands/update/nudge.js';
11
12
  import { registerGuideCommand } from '../src/commands/guide/index.js';
12
13
  import { registerCashReceiptCommands } from '../src/commands/cash-receipt/index.js';
13
- import { outputError, deprecationWarning } from '../src/utils/output.js';
14
+ import { legacyIssuerWarning, outputError } from '../src/utils/output.js';
14
15
  import { BoltaInputError } from '../src/utils/errors.js';
15
16
  import { getCurrentVersion } from '../src/utils/version.js';
16
17
  import { loadConfig, saveConfig } from '../src/config/config-manager.js';
@@ -25,24 +26,30 @@ program
25
26
  .description('Bolta API CLI - 전자세금계산서·현금영수증 발행/조회/관리 도구 (AI 에이전트 최적화)')
26
27
  .version(getCurrentVersion())
27
28
  .option('--api-key <key>', 'Bolta API 키 (환경변수 BOLTA_API_KEY 대체)')
28
- .option('--supplier-key <key>', 'Supplier Key (환경변수 BOLTA_SUPPLIER_KEY 대체)')
29
- .option('--customer-key <key>', '(deprecated) --supplier-key를 사용하세요')
29
+ .addOption(new Option('--supplier-key <key>').hideHelp())
30
+ .addOption(new Option('--customer-key <key>').hideHelp())
30
31
  .option('--verbose', '상세 로그 출력 (stderr)', false)
31
32
  .option('--dry-run', 'API 호출 없이 요청 데이터만 출력', false)
32
33
  .hook('preAction', (thisCommand, actionCommand) => {
33
34
  const opts = thisCommand.optsWithGlobals();
35
+ if (opts.supplierKey) {
36
+ legacyIssuerWarning("'--supplier-key' 플래그");
37
+ }
38
+ else if (opts.customerKey) {
39
+ legacyIssuerWarning("'--customer-key' 플래그");
40
+ }
34
41
  if (opts.verbose) {
35
42
  process.env.BOLTA_VERBOSE = '1';
36
43
  }
37
44
  // 백그라운드 캐시 갱신 자식 프로세스: 힌트/넛지 없이 본연의 작업만 (재귀 spawn 방지)
38
45
  if (actionCommand.name() === UPDATE_CACHE_COMMAND)
39
46
  return;
40
- warnDeprecatedUsage();
41
47
  const config = loadConfig();
42
48
  checkFirstRun(actionCommand, config);
43
49
  checkForUpdate(actionCommand, config);
44
50
  });
45
- registerSupplierCommands(program);
51
+ registerIssuerCommands(program);
52
+ registerLegacyIssuerCommands(program);
46
53
  registerCertificateCommands(program);
47
54
  registerInvoiceCommands(program);
48
55
  registerCashReceiptCommands(program);
@@ -51,28 +58,6 @@ registerExamplesCommand(program);
51
58
  registerSchemaCommand(program);
52
59
  registerUpdateCommands(program);
53
60
  registerGuideCommand(program);
54
- // 값을 받는 전역 옵션(공백 구분 형태일 때 다음 토큰을 값으로 소비)
55
- const GLOBAL_VALUE_OPTIONS = new Set(['--api-key', '--supplier-key', '--customer-key']);
56
- function warnDeprecatedUsage() {
57
- // 구 명령어 'customer'를 alias로 사용한 경우 경고.
58
- // 첫 번째 위치 인자(=명령어)만 검사해 데이터 값에 'customer'가 들어가도 오탐하지 않는다.
59
- // (--customer-key 플래그/BOLTA_CUSTOMER_KEY/config customer-key는 resolveSupplierKey에서 경고)
60
- const argv = process.argv.slice(2);
61
- for (let i = 0; i < argv.length; i++) {
62
- const token = argv[i];
63
- if (GLOBAL_VALUE_OPTIONS.has(token)) {
64
- i++; // 옵션 값 건너뛰기
65
- continue;
66
- }
67
- if (token.startsWith('-'))
68
- continue; // boolean 플래그(--verbose 등)
69
- // 첫 위치 인자 = 명령어
70
- if (token === 'customer') {
71
- deprecationWarning("'customer' 명령어는 'supplier'로 변경되었습니다. 'bolta supplier ...'를 사용하세요.");
72
- }
73
- break;
74
- }
75
- }
76
61
  function checkFirstRun(actionCommand, config) {
77
62
  const commandName = actionCommand.name();
78
63
  const parentName = actionCommand.parent?.name();
@@ -1 +1 @@
1
- {"version":3,"file":"bolta.js","sourceRoot":"","sources":["../../bin/bolta.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bolta.js","sourceRoot":"","sources":["../../bin/bolta.ts"],"names":[],"mappings":"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"}
@@ -1,53 +1,50 @@
1
- import type { CreateTaxInvoiceRequest, IssuanceResponse, TaxInvoiceDetail, StatusResponse, AmendTerminationRequest, AmendChangeSupplyCostRequest, CreateSupplierRequest, SupplierResponse, CreateCustomerRequest, LegacyCustomerResponse, CertificateUrlResponse, CreateCashReceiptRequest, CashReceiptCancellationResponse, CashReceiptStatusResponse } from '../types/api.js';
1
+ import type { CreateTaxInvoiceRequest, IssuanceResponse, TaxInvoiceDetail, StatusResponse, AmendTerminationRequest, AmendChangeSupplyCostRequest, CreateIssuerRequest, IssuerResponse, CreateSupplierRequest, LegacySupplierResponse, CreateCustomerRequest, LegacyCustomerResponse, CertificateUrlResponse, CertificateStatusResponse, CreateCashReceiptRequest, CashReceiptCancellationResponse, CashReceiptStatusResponse } from '../types/api.js';
2
+ import { type LegacyIssuerHeader } from '../utils/legacy-issuer.js';
2
3
  interface ClientConfig {
3
4
  apiKey: string;
4
5
  baseUrl: string;
5
- supplierKey?: string;
6
- /** supplierKey를 어느 소스에서 가져왔는지(env/config 등). 진단 로그·에러에 노출된다. */
7
- supplierKeySource?: string;
6
+ /** 구 설정이 남아 있을 때만 지정한다. 지정하면 Supplier-Key 헤더를 싣는다. */
7
+ legacyIssuer?: LegacyIssuerHeader;
8
8
  timeout?: number;
9
9
  maxRetries?: number;
10
10
  }
11
+ export interface TaxInvoiceRequestOptions {
12
+ referenceId?: string;
13
+ }
11
14
  export declare class BoltaClient {
12
15
  private readonly baseUrl;
13
16
  private readonly encodedApiKey;
14
- private readonly supplierKey?;
15
- private readonly supplierKeySource;
17
+ private readonly legacyIssuer?;
16
18
  private readonly timeout;
17
19
  private readonly maxRetries;
18
20
  constructor(config: ClientConfig);
19
- createSupplier(data: CreateSupplierRequest): Promise<SupplierResponse>;
20
- getSupplier(supplierKey: string): Promise<SupplierResponse>;
21
- /** @deprecated 신규 코드에서는 createSupplier를 사용하세요. */
21
+ createIssuer(data: CreateIssuerRequest): Promise<IssuerResponse>;
22
+ getIssuer(issuerId: string): Promise<IssuerResponse>;
23
+ /** @deprecated 2026-12-31까지 숨김 `supplier` CLI 호환용입니다. */
24
+ createSupplier(data: CreateSupplierRequest): Promise<LegacySupplierResponse>;
25
+ /** @deprecated 2026-12-31까지 숨김 `supplier` CLI 호환용입니다. */
26
+ getSupplier(supplierKey: string): Promise<LegacySupplierResponse>;
27
+ /** @deprecated 2026-12-31까지 숨김 `customer` CLI 호환용입니다. */
22
28
  createCustomer(data: CreateCustomerRequest): Promise<LegacyCustomerResponse>;
23
- /** @deprecated 신규 코드에서는 getSupplier를 사용하세요. */
29
+ /** @deprecated 2026-12-31까지 숨김 `customer` CLI 호환용입니다. */
24
30
  getCustomer(customerKey: string): Promise<LegacyCustomerResponse>;
25
- getCertificateUrl(supplierKey: string): Promise<CertificateUrlResponse>;
26
- getCertificateStatus(supplierKey: string): Promise<unknown>;
27
- deregisterCertificate(supplierKey: string): Promise<unknown>;
28
- issueTaxInvoice(data: CreateTaxInvoiceRequest, options?: {
29
- supplierKey?: string;
30
- referenceId?: string;
31
- }): Promise<IssuanceResponse>;
32
- issueRequestTaxInvoice(data: CreateTaxInvoiceRequest, options?: {
33
- supplierKey?: string;
34
- referenceId?: string;
35
- }): Promise<IssuanceResponse>;
31
+ getCertificateUrl(issuerId: string): Promise<CertificateUrlResponse>;
32
+ getCertificateStatus(issuerId: string): Promise<CertificateStatusResponse>;
33
+ deregisterCertificate(issuerId: string): Promise<unknown>;
34
+ issueTaxInvoice(data: CreateTaxInvoiceRequest, options?: TaxInvoiceRequestOptions): Promise<IssuanceResponse>;
35
+ issueRequestTaxInvoice(data: CreateTaxInvoiceRequest, options?: TaxInvoiceRequestOptions): Promise<IssuanceResponse>;
36
36
  getTaxInvoice(issuanceKey: string): Promise<TaxInvoiceDetail>;
37
37
  getTaxInvoiceStatus(clientReferenceId: string): Promise<StatusResponse>;
38
- amendTermination(issuanceKey: string, data: AmendTerminationRequest, supplierKey?: string): Promise<IssuanceResponse>;
39
- amendChangeSupplyCost(issuanceKey: string, data: AmendChangeSupplyCostRequest, supplierKey?: string): Promise<IssuanceResponse>;
40
- amendDoubleIssuance(issuanceKey: string, supplierKey?: string): Promise<IssuanceResponse>;
38
+ amendTermination(issuanceKey: string, data: AmendTerminationRequest, options?: TaxInvoiceRequestOptions): Promise<IssuanceResponse>;
39
+ amendChangeSupplyCost(issuanceKey: string, data: AmendChangeSupplyCostRequest, options?: TaxInvoiceRequestOptions): Promise<IssuanceResponse>;
40
+ amendDoubleIssuance(issuanceKey: string, options?: TaxInvoiceRequestOptions): Promise<IssuanceResponse>;
41
41
  issueCashReceipt(data: CreateCashReceiptRequest, options: {
42
- supplierKey: string;
43
42
  referenceId: string;
44
43
  }): Promise<IssuanceResponse>;
45
44
  getCashReceiptStatus(clientReferenceId: string): Promise<CashReceiptStatusResponse>;
46
45
  cancelCashReceipt(issuanceKey: string, options: {
47
- supplierKey: string;
48
46
  referenceId: string;
49
47
  }): Promise<CashReceiptCancellationResponse>;
50
- private certificatePath;
51
48
  private request;
52
49
  }
53
50
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"bolta-client.d.ts","sourceRoot":"","sources":["../../../src/client/bolta-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"bolta-client.d.ts","sourceRoot":"","sources":["../../../src/client/bolta-client.ts"],"names":[],"mappings":"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"}