kiwoom-cli 2.1.0__tar.gz → 2.2.0__tar.gz

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 (53) hide show
  1. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/PKG-INFO +128 -50
  2. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/README.md +127 -49
  3. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/__init__.py +1 -1
  4. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/auth.py +15 -1
  5. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/order.py +20 -20
  6. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/exchange.py +3 -4
  7. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/order_ops.py +5 -5
  8. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/config.py +32 -9
  9. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/formatters.py +13 -1
  10. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/main.py +97 -46
  11. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/streaming.py +8 -8
  12. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli.egg-info/PKG-INFO +128 -50
  13. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli.egg-info/SOURCES.txt +1 -0
  14. kiwoom_cli-2.2.0/tests/test_auth.py +64 -0
  15. kiwoom_cli-2.2.0/tests/test_auth_cli.py +236 -0
  16. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_cli.py +25 -0
  17. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_credentials.py +29 -0
  18. kiwoom_cli-2.2.0/tests/test_json_purity.py +82 -0
  19. kiwoom_cli-2.1.0/tests/test_auth.py +0 -30
  20. kiwoom_cli-2.1.0/tests/test_auth_cli.py +0 -97
  21. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/LICENSE +0 -0
  22. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/api_spec.py +0 -0
  23. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/client.py +0 -0
  24. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/__init__.py +0 -0
  25. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/_constants.py +0 -0
  26. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/account.py +0 -0
  27. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/dashboard.py +0 -0
  28. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/market.py +0 -0
  29. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/stock.py +0 -0
  30. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/stream.py +0 -0
  31. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/__init__.py +0 -0
  32. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/_constants.py +0 -0
  33. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/account_ops.py +0 -0
  34. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/detect.py +0 -0
  35. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/us/stock_ops.py +0 -0
  36. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/commands/watch.py +0 -0
  37. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli/output.py +0 -0
  38. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli.egg-info/dependency_links.txt +0 -0
  39. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli.egg-info/entry_points.txt +0 -0
  40. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli.egg-info/requires.txt +0 -0
  41. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/kiwoom_cli.egg-info/top_level.txt +0 -0
  42. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/pyproject.toml +0 -0
  43. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/setup.cfg +0 -0
  44. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_account.py +0 -0
  45. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_client.py +0 -0
  46. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_formatters.py +0 -0
  47. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_formatters_property.py +0 -0
  48. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_market.py +0 -0
  49. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_migration.py +0 -0
  50. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_order.py +0 -0
  51. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_stock.py +0 -0
  52. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_us.py +0 -0
  53. {kiwoom_cli-2.1.0 → kiwoom_cli-2.2.0}/tests/test_us_account.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kiwoom-cli
3
- Version: 2.1.0
3
+ Version: 2.2.0
4
4
  Summary: User-friendly CLI for the Kiwoom Securities REST API (키움증권)
5
5
  License: LicenseRef-kiwoom-cli-Source-Available-1.0
6
6
  Project-URL: Homepage, https://github.com/gejyn14/kiwoom-cli
@@ -37,30 +37,60 @@ Dynamic: license-file
37
37
 
38
38
  # kiwoom-cli
39
39
 
40
- 키움증권 REST API 터미널에서 사용하기 위한 CLI 도구.
40
+ **키움증권 REST API 전체를 터미널에서.** 시세 조회부터 주문, 실시간 스트리밍, 미국주식까지 — 명령어 하나로.
41
41
 
42
- - 207개 API 전체 지원 (188 REST + 19 WebSocket 실시간)
43
- - 종목 조회, 호가, 차트, 계좌, 주문, 순위, 업종, 테마, ETF, ELW, 금현물
44
- - 출력 형식: Rich 테이블 / JSON / CSV (`-f json`, `-f csv`)
45
- - 실시간 WebSocket 스트리밍 (체결, 호가, VI, 잔고 등)
46
- - AI 에이전트 친화적: 구조화된 JSON 출력, exit code (0/1/2/3)
47
-
48
- ## 설치
42
+ [![PyPI](https://img.shields.io/pypi/v/kiwoom-cli)](https://pypi.org/project/kiwoom-cli/)
43
+ [![Python](https://img.shields.io/pypi/pyversions/kiwoom-cli)](https://pypi.org/project/kiwoom-cli/)
44
+ [![CI](https://github.com/gejyn14/kiwoom-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/gejyn14/kiwoom-cli/actions/workflows/ci.yml)
45
+ [![Downloads](https://img.shields.io/pypi/dm/kiwoom-cli)](https://pypi.org/project/kiwoom-cli/)
46
+ [![License](https://img.shields.io/badge/license-Source--Available-blue)](LICENSE)
49
47
 
50
48
  ```bash
51
49
  pip install kiwoom-cli
52
50
  ```
53
51
 
52
+ ```bash
53
+ $ kiwoom stock price 005930 # 삼성전자 현재가
54
+ $ kiwoom order buy NVDA 10 --price 213.04 # 미국주식도 그대로
55
+ $ kiwoom -f json account balance | jq # AI 에이전트·스크립트 친화
56
+ ```
57
+
58
+ ## 왜 kiwoom-cli인가
59
+
60
+ - **236개 API 전체 지원** — REST 217개 + WebSocket 실시간 19종. 시세·차트·계좌·주문·순위·업종·테마·ETF·ELW·금현물·미국주식까지 키움 REST API를 빠짐없이 커버합니다.
61
+ - **프롬프트 제로** — 인증정보는 OS 키체인에 저장되고, 어떤 명령도 비밀번호를 묻지 않습니다. `gh`/`aws`/`docker`와 같은 모델. 크론잡, CI, AI 에이전트가 그대로 돌립니다.
62
+ - **AI 에이전트 퍼스트** — 구조화된 JSON 출력(`-f json`), 일관된 exit code(0/1/2/3), 주문 확인 게이트(`--confirm`). Claude Code, 자동매매 스크립트에 바로 연결됩니다.
63
+ - **미국주식 자동 라우팅** — `005930`은 국내로, `NVDA`는 미국으로. 거래소(NASDAQ/NYSE/AMEX)도 자동 판별. 국내+미국 통합 잔고를 원화 총계로 보여줍니다.
64
+ - **사람에게도 친절** — Rich 테이블, 상승=빨강/하락=파랑 색상, 실시간 TUI 대시보드, shell 자동완성.
65
+ - **246개 테스트 + CI** — Python 3.10–3.13 매트릭스, CodeQL 정적 분석.
66
+
67
+ > 📖 **전체 문서는 [Wiki](https://github.com/gejyn14/kiwoom-cli/wiki)에서** — 설치 가이드, 명령어 레퍼런스, 미국주식·AI 에이전트·멀티 프로필 가이드, 릴리스 노트.
68
+
69
+ ## 최근 업데이트
70
+
71
+ ### v2.1 — 비밀번호 프롬프트 완전 제거 (2026-07)
72
+
73
+ 앱 자체 암호화 계층을 걷어내고 모든 인증정보를 OS 키체인에 직접 저장합니다. `config setup`, `auth login` 어디서도 더 이상 비밀번호를 묻지 않습니다. 기존 사용자는 업그레이드 후 `kiwoom config setup` 한 번만 다시 실행하면 됩니다.
74
+
75
+ ### v2.0 — 미국주식 지원 (2026-07)
76
+
77
+ 미국주식 29개 엔드포인트를 기존 명령 체계에 그대로 통합했습니다. 티커만 입력하면 시장을 자동 판별하므로 미국 주문도 국내 주문과 똑같이 짧습니다. 소수점 가격, stop/stop-limit/vwap/twap 주문유형, 환전(`account exchange`), 국내+미국 통합 계좌 뷰를 지원합니다.
78
+
79
+ 전체 변경 내역: [CHANGELOG](CHANGELOG.md) · [Wiki 릴리스 노트](https://github.com/gejyn14/kiwoom-cli/wiki/Release-Notes)
80
+
54
81
  ## 시작하기
55
82
 
83
+ [키움증권 REST API](https://openapi.kiwoom.com)에서 appkey/secretkey를 발급받은 뒤:
84
+
56
85
  ```bash
57
- # 1. 초기 설정 (appkey, secretkey 입력)
86
+ # 1. 초기 설정 (appkey, secretkey → OS 키체인)
87
+ # 토큰 저장 방식도 여기서 선택: keychain (기본) 또는 env (KIWOOM_TOKEN 직접 관리)
58
88
  kiwoom config setup
59
89
 
60
90
  # 2. 토큰 발급
61
91
  kiwoom auth login
62
92
 
63
- # 3. 사용 (프롬프트 없음)
93
+ # 3. 끝. 이후 모든 명령은 프롬프트 없이 동작
64
94
  kiwoom stock info 005930
65
95
  ```
66
96
 
@@ -79,14 +109,25 @@ kiwoom config show # 현재 설정 확인
79
109
 
80
110
  ### 환경변수 설정
81
111
 
82
- 도메인과 계좌번호는 환경변수로도 설정 가능합니다.
112
+ 도메인, 계좌번호, 프로필, 토큰은 환경변수로도 설정 가능합니다.
83
113
 
84
114
  ```bash
85
115
  export KIWOOM_DOMAIN="prod" # prod 또는 mock
86
116
  export KIWOOM_ACCOUNT="1234567" # 선택
117
+ export KIWOOM_PROFILE="isa" # 선택
118
+ export KIWOOM_TOKEN="..." # 선택: 키체인 대신 사용할 접근토큰 (샌드박스/CI용)
87
119
  ```
88
120
 
89
- appkey/secretkey는 보안을 위해 환경변수를 지원하지 않습니다. 반드시 `kiwoom config setup`으로 OS 키체인에 저장하세요.
121
+ appkey/secretkey는 보안을 위해 환경변수를 지원하지 않습니다. 반드시 `kiwoom config setup`으로 OS 키체인에 저장하세요. `KIWOOM_TOKEN`은 만료·폐기 가능한 접근토큰만 담는 통로로, 키체인에 접근할 수 없는 환경(샌드박스, CI, AI 에이전트)에서 사용합니다 — 설정 시 키체인 토큰보다 우선합니다.
122
+
123
+ ### 토큰 저장 방식 (keychain vs env)
124
+
125
+ `config setup`에서 토큰 저장 방식을 선택합니다.
126
+
127
+ - **keychain** (기본): `auth login`이 토큰을 OS 키체인에 저장합니다. 본인 터미널에서 쓰는 일반적인 방식.
128
+ - **env**: 토큰을 키체인에 저장하지 않습니다. `auth login`이 토큰과 `export KIWOOM_TOKEN=...` 명령을 출력하면 셸에서 실행하세요. 키체인 접근이 불가능한 환경(샌드박스, CI, 컨테이너)이 주 작업 환경일 때 적합합니다.
129
+
130
+ 이후 전환은 `kiwoom config set token_storage keychain|env`.
90
131
 
91
132
  ### 멀티 프로필
92
133
 
@@ -111,17 +152,58 @@ kiwoom -p isa account balance
111
152
  kiwoom -p isa auth login
112
153
  ```
113
154
 
155
+ ## AI 에이전트와 함께 쓰기
156
+
157
+ kiwoom-cli는 AI 에이전트가 도구로 쓰는 것을 처음부터 염두에 두고 설계됐습니다.
158
+
159
+ ```bash
160
+ # 구조화된 JSON — 파싱이 필요 없는 출력
161
+ kiwoom -f json stock info 005930
162
+ kiwoom -f json market rank volume | jq '.[].stk_nm'
163
+
164
+ # 일관된 exit code — 0=성공, 1=입력오류, 2=API오류, 3=인증필요
165
+ kiwoom stock price 005930 || echo "재시도 또는 재인증"
166
+
167
+ # 주문은 기본 확인 게이트, 자동화 시에만 --confirm으로 명시적 스킵
168
+ kiwoom order buy 005930 10 --type market --confirm
169
+ ```
170
+
171
+ - 어떤 명령도 비밀번호·생체인증을 요구하지 않으므로 에이전트 세션이 중간에 멈추지 않습니다.
172
+ - 페이지네이션(연속조회)은 자동 처리 — 에이전트가 커서를 관리할 필요가 없습니다.
173
+ - 자세한 패턴은 [Wiki: AI 에이전트 가이드](https://github.com/gejyn14/kiwoom-cli/wiki/AI-Agents) 참고.
174
+
175
+ ### 샌드박스 환경 (키체인 접근 불가)
176
+
177
+ 샌드박스 셸, CI, 컨테이너에서는 OS 키체인을 읽을 수 없습니다. 이때는 본인 터미널에서 토큰을 발급받아 `KIWOOM_TOKEN`으로 전달하세요 — appkey/secretkey는 키체인 밖으로 나가지 않고, 토큰은 만료·폐기 가능합니다.
178
+
179
+ ```bash
180
+ # 본인 터미널에서 (하루 1회 정도) — env 모드라면 login이 export 명령을 그대로 출력
181
+ kiwoom config set token_storage env
182
+ kiwoom auth login
183
+ export KIWOOM_TOKEN='...' # login 출력의 export 라인을 복사해 실행
184
+
185
+ # 이 셸에서 에이전트를 실행하면 환경변수가 상속되어 모든 명령이 동작
186
+ kiwoom auth status # 토큰 있음 (환경변수 KIWOOM_TOKEN)
187
+ ```
188
+
189
+ keychain 모드를 유지하면서 일회성으로 꺼내 쓰려면:
190
+
191
+ ```bash
192
+ export KIWOOM_TOKEN=$(security find-generic-password -s kiwoom-cli -a "default:token" -w) # macOS
193
+ ```
194
+
114
195
  ## 명령어 구조
115
196
 
116
197
  ```
117
- kiwoom [--format table|json|csv] [--no-color]
118
- ├── config 설정 (setup / show / domain)
198
+ kiwoom [--format table|json|csv] [--no-color] [-p 프로필]
199
+ ├── config 설정 (setup / show / domain / profiles)
119
200
  ├── auth 인증 (login / logout / status)
120
201
  ├── stock 종목 조회 (info / orderbook / chart / compare ...)
121
202
  ├── account 계좌 조회 (balance / deposit / returns / pnl ...)
122
203
  ├── order 주문 (buy / sell / modify / cancel / credit / gold)
123
204
  ├── market 시장 정보 (rank / sector / theme / etf / elw / gold)
124
205
  ├── stream 실시간 스트리밍 (quote / orderbook / order / vi ...)
206
+ ├── watch 실시간 종목 모니터링 (TUI)
125
207
  ├── dashboard 대시보드 (계좌 + 거래량 상위 한눈에)
126
208
  └── api Raw API 호출
127
209
  ```
@@ -145,6 +227,7 @@ kiwoom stock sync # 전 시장 종목 리스트 다운로
145
227
  kiwoom stock search 삼성 # 캐시에서 종목 검색
146
228
  kiwoom stock search 삼성 --market kospi # 코스피만 필터
147
229
  kiwoom stock watchlist "005930|000660" # 관심종목
230
+ kiwoom stock compare 005930 000660 # 종목 비교 (최대 여러 종목)
148
231
  ```
149
232
 
150
233
  ### 차트
@@ -197,6 +280,7 @@ kiwoom stock credit trend 005930 --date 20260301 --type loan
197
280
  | `search` | 종목 검색 (캐시 기반, 시장/유형 필터) |
198
281
  | `watchlist` | 관심종목 |
199
282
  | `brokers` | 회원사 리스트 |
283
+ | `compare` | 복수 종목 비교 |
200
284
  | `chart *` | 틱/분봉/일봉/주봉/월봉/년봉, 투자자별 차트 |
201
285
  | `investor *` | 기관매매, 투자자별매매, 프로그램매매 등 10개 |
202
286
  | `analysis *` | 거래상세, 거래량갱신, 매물대, PER, VI, 증권사 등 10개 |
@@ -211,7 +295,7 @@ kiwoom stock credit trend 005930 --date 20260301 --type loan
211
295
 
212
296
  ```bash
213
297
  kiwoom account list # 계좌번호
214
- kiwoom account balance # 잔고 + 보유종목 + 손익
298
+ kiwoom account balance # 잔고 + 보유종목 + 손익 (국내+미국 통합)
215
299
  kiwoom account deposit # 예수금
216
300
  kiwoom account asset # 추정자산
217
301
  kiwoom account today # 당일현황
@@ -253,6 +337,9 @@ kiwoom account orderable amount 005930 --side buy --price 70000
253
337
  | `orderable` | `amount` | 주문가능 금액 |
254
338
  | `orderable` | `margin-qty` | 증거금율별 수량 |
255
339
  | `orderable` | `credit-qty` | 신용보증금율별 수량 |
340
+ | `exchange` | `rate` | 환율 조회 |
341
+ | `exchange` | `estimate` | 환전 예상금액 |
342
+ | `exchange` | `apply` | 환전 신청 |
256
343
  | `history` | `transactions` | 위탁종합 거래내역 |
257
344
  | `history` | `journal` | 당일 매매일지 |
258
345
 
@@ -281,11 +368,13 @@ kiwoom account exchange apply 1000000 --confirm # 원화 → 달러 환전
281
368
  - 정정은 가격만 가능(전량), 취소는 전량 취소만 지원됩니다 (키움 API 제약).
282
369
  - 계좌 조회 명령(`balance/deposit/pnl/orders/history`)은 기본 통합 표시이며 `--market kr|us`로 필터링합니다.
283
370
 
371
+ 자세한 가이드: [Wiki: 미국주식](https://github.com/gejyn14/kiwoom-cli/wiki/US-Stocks)
372
+
284
373
  ---
285
374
 
286
375
  ## order - 주문
287
376
 
288
- 모든 주문에 `--confirm` 필수.
377
+ 주문은 실행 전 미리보기 + 대화형 확인이 기본입니다. 자동화 시에만 `--confirm`으로 스킵하세요.
289
378
 
290
379
  ```bash
291
380
  # 주식
@@ -400,27 +489,13 @@ kiwoom stream types # 타입 코드 목록
400
489
 
401
490
  ---
402
491
 
403
- ## Raw API
404
-
405
- ```bash
406
- kiwoom api ka10001 '{"stk_cd":"005930"}' # 테이블 출력
407
- kiwoom api ka10001 '{"stk_cd":"005930"}' --raw # JSON 원본
408
- ```
409
-
410
- ---
411
-
412
- ## dashboard - 대시보드
492
+ ## dashboard / Raw API
413
493
 
414
494
  ```bash
415
495
  kiwoom dashboard # 계좌 요약 + 거래량 상위 한눈에
416
- ```
417
-
418
- ## 종목 비교
419
496
 
420
- ```bash
421
- kiwoom stock compare 005930 000660 # 삼성전자 vs SK하이닉스
422
- kiwoom stock compare 005930 000660 035420 # 3종목 비교
423
- kiwoom -f json stock compare 005930 000660 # JSON 출력
497
+ kiwoom api ka10001 '{"stk_cd":"005930"}' # Raw API — 테이블 출력
498
+ kiwoom api ka10001 '{"stk_cd":"005930"}' --raw # JSON 원본
424
499
  ```
425
500
 
426
501
  ---
@@ -466,13 +541,30 @@ eval (env _KIWOOM_COMPLETE=fish_source kiwoom)
466
541
  | 2 | API/네트워크 오류 |
467
542
  | 3 | 인증 필요 (토큰 만료) |
468
543
 
544
+ ## 보안
545
+
546
+ 모든 인증정보(appkey, secretkey, 토큰)는 **OS 키체인**(macOS Keychain / Windows Credential Manager / Linux Secret Service)에 저장됩니다. 파일로 존재하지 않으며, 키체인이 디스크 저장 시 암호화를 담당합니다. `gh`, `aws`, `docker` CLI와 동일한 모델입니다.
547
+
548
+ | 항목 | 저장 방식 | 프롬프트 |
549
+ | ------------------ | ------------------------------------------ | :------: |
550
+ | appkey / secretkey | OS 키체인 | X |
551
+ | 토큰 | OS 키체인 또는 KIWOOM_TOKEN 환경변수 (선택) | X |
552
+ | config.toml | 도메인, 계좌번호, 토큰 저장 방식만 | X |
553
+
554
+ - 모든 명령어는 비밀번호/생체인증 프롬프트 없이 동작 (AI 에이전트·자동화 친화적)
555
+ - 앱 자체 암호화 계층은 의도적으로 두지 않음 — 추가 계층은 명령마다 잠금 해제 프롬프트를 요구하게 되어 CLI 사용성을 해침
556
+ - v2.0 이하에서 업그레이드한 경우: 암호화 저장소 형식이 제거되어 `kiwoom config setup`을 한 번 다시 실행해야 합니다
557
+ - 주문은 기본적으로 미리보기 + 대화형 확인을 거칩니다 (`--confirm`으로 스킵)
558
+
559
+ 자세한 내용: [Wiki: 보안 모델](https://github.com/gejyn14/kiwoom-cli/wiki/Security) · [SECURITY.md](SECURITY.md)
560
+
469
561
  ## 참고
470
562
 
471
563
  | 항목 | 값 |
472
564
  | ---------------- | ---------------------------------------- |
473
- | 설정 파일 | `~/.kiwoom/config.toml` (도메인, 계좌만) |
565
+ | 설정 파일 | `~/.kiwoom/config.toml` (도메인, 계좌, 토큰 저장 방식만) |
474
566
  | appkey/secretkey | OS 키체인 |
475
- | 토큰 | OS 키체인 |
567
+ | 토큰 | OS 키체인 또는 KIWOOM_TOKEN 환경변수 (setup에서 선택) |
476
568
  | 캐시 디렉터리 | `~/.kiwoom/cache/` |
477
569
  | 운영 도메인 | `https://api.kiwoom.com` |
478
570
  | 모의투자 도메인 | `https://mockapi.kiwoom.com` |
@@ -484,20 +576,6 @@ eval (env _KIWOOM_COMPLETE=fish_source kiwoom)
484
576
  - 종목코드 6자리: `005930` (삼성전자)
485
577
  - 금현물: `M04020000` (1kg), `M04020100` (미니 100g)
486
578
 
487
- ## 보안
488
-
489
- 모든 인증정보(appkey, secretkey, 토큰)는 **OS 키체인**(macOS Keychain / Windows Credential Manager / Linux Secret Service)에 저장됩니다. 파일로 존재하지 않으며, 키체인이 디스크 저장 시 암호화를 담당합니다. `gh`, `aws`, `docker` CLI와 동일한 모델입니다.
490
-
491
- | 항목 | 저장 방식 | 프롬프트 |
492
- | ------------------ | ------------------ | :------: |
493
- | appkey / secretkey | OS 키체인 | X |
494
- | 토큰 | OS 키체인 | X |
495
- | config.toml | 도메인, 계좌번호만 | X |
496
-
497
- - 모든 명령어는 비밀번호/생체인증 프롬프트 없이 동작 (AI 에이전트·자동화 친화적)
498
- - 앱 자체 암호화 계층은 의도적으로 두지 않음 — 추가 계층은 명령마다 잠금 해제 프롬프트를 요구하게 되어 CLI 사용성을 해침
499
- - v2.0 이하에서 업그레이드한 경우: 암호화 저장소 형식이 제거되어 `kiwoom config setup`을 한 번 다시 실행해야 합니다
500
-
501
579
  ## License
502
580
 
503
581
  kiwoom-cli **Source-Available License, Version 1.0** — see [LICENSE](LICENSE).
@@ -1,29 +1,59 @@
1
1
  # kiwoom-cli
2
2
 
3
- 키움증권 REST API 터미널에서 사용하기 위한 CLI 도구.
3
+ **키움증권 REST API 전체를 터미널에서.** 시세 조회부터 주문, 실시간 스트리밍, 미국주식까지 — 명령어 하나로.
4
4
 
5
- - 207개 API 전체 지원 (188 REST + 19 WebSocket 실시간)
6
- - 종목 조회, 호가, 차트, 계좌, 주문, 순위, 업종, 테마, ETF, ELW, 금현물
7
- - 출력 형식: Rich 테이블 / JSON / CSV (`-f json`, `-f csv`)
8
- - 실시간 WebSocket 스트리밍 (체결, 호가, VI, 잔고 등)
9
- - AI 에이전트 친화적: 구조화된 JSON 출력, exit code (0/1/2/3)
10
-
11
- ## 설치
5
+ [![PyPI](https://img.shields.io/pypi/v/kiwoom-cli)](https://pypi.org/project/kiwoom-cli/)
6
+ [![Python](https://img.shields.io/pypi/pyversions/kiwoom-cli)](https://pypi.org/project/kiwoom-cli/)
7
+ [![CI](https://github.com/gejyn14/kiwoom-cli/actions/workflows/ci.yml/badge.svg)](https://github.com/gejyn14/kiwoom-cli/actions/workflows/ci.yml)
8
+ [![Downloads](https://img.shields.io/pypi/dm/kiwoom-cli)](https://pypi.org/project/kiwoom-cli/)
9
+ [![License](https://img.shields.io/badge/license-Source--Available-blue)](LICENSE)
12
10
 
13
11
  ```bash
14
12
  pip install kiwoom-cli
15
13
  ```
16
14
 
15
+ ```bash
16
+ $ kiwoom stock price 005930 # 삼성전자 현재가
17
+ $ kiwoom order buy NVDA 10 --price 213.04 # 미국주식도 그대로
18
+ $ kiwoom -f json account balance | jq # AI 에이전트·스크립트 친화
19
+ ```
20
+
21
+ ## 왜 kiwoom-cli인가
22
+
23
+ - **236개 API 전체 지원** — REST 217개 + WebSocket 실시간 19종. 시세·차트·계좌·주문·순위·업종·테마·ETF·ELW·금현물·미국주식까지 키움 REST API를 빠짐없이 커버합니다.
24
+ - **프롬프트 제로** — 인증정보는 OS 키체인에 저장되고, 어떤 명령도 비밀번호를 묻지 않습니다. `gh`/`aws`/`docker`와 같은 모델. 크론잡, CI, AI 에이전트가 그대로 돌립니다.
25
+ - **AI 에이전트 퍼스트** — 구조화된 JSON 출력(`-f json`), 일관된 exit code(0/1/2/3), 주문 확인 게이트(`--confirm`). Claude Code, 자동매매 스크립트에 바로 연결됩니다.
26
+ - **미국주식 자동 라우팅** — `005930`은 국내로, `NVDA`는 미국으로. 거래소(NASDAQ/NYSE/AMEX)도 자동 판별. 국내+미국 통합 잔고를 원화 총계로 보여줍니다.
27
+ - **사람에게도 친절** — Rich 테이블, 상승=빨강/하락=파랑 색상, 실시간 TUI 대시보드, shell 자동완성.
28
+ - **246개 테스트 + CI** — Python 3.10–3.13 매트릭스, CodeQL 정적 분석.
29
+
30
+ > 📖 **전체 문서는 [Wiki](https://github.com/gejyn14/kiwoom-cli/wiki)에서** — 설치 가이드, 명령어 레퍼런스, 미국주식·AI 에이전트·멀티 프로필 가이드, 릴리스 노트.
31
+
32
+ ## 최근 업데이트
33
+
34
+ ### v2.1 — 비밀번호 프롬프트 완전 제거 (2026-07)
35
+
36
+ 앱 자체 암호화 계층을 걷어내고 모든 인증정보를 OS 키체인에 직접 저장합니다. `config setup`, `auth login` 어디서도 더 이상 비밀번호를 묻지 않습니다. 기존 사용자는 업그레이드 후 `kiwoom config setup` 한 번만 다시 실행하면 됩니다.
37
+
38
+ ### v2.0 — 미국주식 지원 (2026-07)
39
+
40
+ 미국주식 29개 엔드포인트를 기존 명령 체계에 그대로 통합했습니다. 티커만 입력하면 시장을 자동 판별하므로 미국 주문도 국내 주문과 똑같이 짧습니다. 소수점 가격, stop/stop-limit/vwap/twap 주문유형, 환전(`account exchange`), 국내+미국 통합 계좌 뷰를 지원합니다.
41
+
42
+ 전체 변경 내역: [CHANGELOG](CHANGELOG.md) · [Wiki 릴리스 노트](https://github.com/gejyn14/kiwoom-cli/wiki/Release-Notes)
43
+
17
44
  ## 시작하기
18
45
 
46
+ [키움증권 REST API](https://openapi.kiwoom.com)에서 appkey/secretkey를 발급받은 뒤:
47
+
19
48
  ```bash
20
- # 1. 초기 설정 (appkey, secretkey 입력)
49
+ # 1. 초기 설정 (appkey, secretkey → OS 키체인)
50
+ # 토큰 저장 방식도 여기서 선택: keychain (기본) 또는 env (KIWOOM_TOKEN 직접 관리)
21
51
  kiwoom config setup
22
52
 
23
53
  # 2. 토큰 발급
24
54
  kiwoom auth login
25
55
 
26
- # 3. 사용 (프롬프트 없음)
56
+ # 3. 끝. 이후 모든 명령은 프롬프트 없이 동작
27
57
  kiwoom stock info 005930
28
58
  ```
29
59
 
@@ -42,14 +72,25 @@ kiwoom config show # 현재 설정 확인
42
72
 
43
73
  ### 환경변수 설정
44
74
 
45
- 도메인과 계좌번호는 환경변수로도 설정 가능합니다.
75
+ 도메인, 계좌번호, 프로필, 토큰은 환경변수로도 설정 가능합니다.
46
76
 
47
77
  ```bash
48
78
  export KIWOOM_DOMAIN="prod" # prod 또는 mock
49
79
  export KIWOOM_ACCOUNT="1234567" # 선택
80
+ export KIWOOM_PROFILE="isa" # 선택
81
+ export KIWOOM_TOKEN="..." # 선택: 키체인 대신 사용할 접근토큰 (샌드박스/CI용)
50
82
  ```
51
83
 
52
- appkey/secretkey는 보안을 위해 환경변수를 지원하지 않습니다. 반드시 `kiwoom config setup`으로 OS 키체인에 저장하세요.
84
+ appkey/secretkey는 보안을 위해 환경변수를 지원하지 않습니다. 반드시 `kiwoom config setup`으로 OS 키체인에 저장하세요. `KIWOOM_TOKEN`은 만료·폐기 가능한 접근토큰만 담는 통로로, 키체인에 접근할 수 없는 환경(샌드박스, CI, AI 에이전트)에서 사용합니다 — 설정 시 키체인 토큰보다 우선합니다.
85
+
86
+ ### 토큰 저장 방식 (keychain vs env)
87
+
88
+ `config setup`에서 토큰 저장 방식을 선택합니다.
89
+
90
+ - **keychain** (기본): `auth login`이 토큰을 OS 키체인에 저장합니다. 본인 터미널에서 쓰는 일반적인 방식.
91
+ - **env**: 토큰을 키체인에 저장하지 않습니다. `auth login`이 토큰과 `export KIWOOM_TOKEN=...` 명령을 출력하면 셸에서 실행하세요. 키체인 접근이 불가능한 환경(샌드박스, CI, 컨테이너)이 주 작업 환경일 때 적합합니다.
92
+
93
+ 이후 전환은 `kiwoom config set token_storage keychain|env`.
53
94
 
54
95
  ### 멀티 프로필
55
96
 
@@ -74,17 +115,58 @@ kiwoom -p isa account balance
74
115
  kiwoom -p isa auth login
75
116
  ```
76
117
 
118
+ ## AI 에이전트와 함께 쓰기
119
+
120
+ kiwoom-cli는 AI 에이전트가 도구로 쓰는 것을 처음부터 염두에 두고 설계됐습니다.
121
+
122
+ ```bash
123
+ # 구조화된 JSON — 파싱이 필요 없는 출력
124
+ kiwoom -f json stock info 005930
125
+ kiwoom -f json market rank volume | jq '.[].stk_nm'
126
+
127
+ # 일관된 exit code — 0=성공, 1=입력오류, 2=API오류, 3=인증필요
128
+ kiwoom stock price 005930 || echo "재시도 또는 재인증"
129
+
130
+ # 주문은 기본 확인 게이트, 자동화 시에만 --confirm으로 명시적 스킵
131
+ kiwoom order buy 005930 10 --type market --confirm
132
+ ```
133
+
134
+ - 어떤 명령도 비밀번호·생체인증을 요구하지 않으므로 에이전트 세션이 중간에 멈추지 않습니다.
135
+ - 페이지네이션(연속조회)은 자동 처리 — 에이전트가 커서를 관리할 필요가 없습니다.
136
+ - 자세한 패턴은 [Wiki: AI 에이전트 가이드](https://github.com/gejyn14/kiwoom-cli/wiki/AI-Agents) 참고.
137
+
138
+ ### 샌드박스 환경 (키체인 접근 불가)
139
+
140
+ 샌드박스 셸, CI, 컨테이너에서는 OS 키체인을 읽을 수 없습니다. 이때는 본인 터미널에서 토큰을 발급받아 `KIWOOM_TOKEN`으로 전달하세요 — appkey/secretkey는 키체인 밖으로 나가지 않고, 토큰은 만료·폐기 가능합니다.
141
+
142
+ ```bash
143
+ # 본인 터미널에서 (하루 1회 정도) — env 모드라면 login이 export 명령을 그대로 출력
144
+ kiwoom config set token_storage env
145
+ kiwoom auth login
146
+ export KIWOOM_TOKEN='...' # login 출력의 export 라인을 복사해 실행
147
+
148
+ # 이 셸에서 에이전트를 실행하면 환경변수가 상속되어 모든 명령이 동작
149
+ kiwoom auth status # 토큰 있음 (환경변수 KIWOOM_TOKEN)
150
+ ```
151
+
152
+ keychain 모드를 유지하면서 일회성으로 꺼내 쓰려면:
153
+
154
+ ```bash
155
+ export KIWOOM_TOKEN=$(security find-generic-password -s kiwoom-cli -a "default:token" -w) # macOS
156
+ ```
157
+
77
158
  ## 명령어 구조
78
159
 
79
160
  ```
80
- kiwoom [--format table|json|csv] [--no-color]
81
- ├── config 설정 (setup / show / domain)
161
+ kiwoom [--format table|json|csv] [--no-color] [-p 프로필]
162
+ ├── config 설정 (setup / show / domain / profiles)
82
163
  ├── auth 인증 (login / logout / status)
83
164
  ├── stock 종목 조회 (info / orderbook / chart / compare ...)
84
165
  ├── account 계좌 조회 (balance / deposit / returns / pnl ...)
85
166
  ├── order 주문 (buy / sell / modify / cancel / credit / gold)
86
167
  ├── market 시장 정보 (rank / sector / theme / etf / elw / gold)
87
168
  ├── stream 실시간 스트리밍 (quote / orderbook / order / vi ...)
169
+ ├── watch 실시간 종목 모니터링 (TUI)
88
170
  ├── dashboard 대시보드 (계좌 + 거래량 상위 한눈에)
89
171
  └── api Raw API 호출
90
172
  ```
@@ -108,6 +190,7 @@ kiwoom stock sync # 전 시장 종목 리스트 다운로
108
190
  kiwoom stock search 삼성 # 캐시에서 종목 검색
109
191
  kiwoom stock search 삼성 --market kospi # 코스피만 필터
110
192
  kiwoom stock watchlist "005930|000660" # 관심종목
193
+ kiwoom stock compare 005930 000660 # 종목 비교 (최대 여러 종목)
111
194
  ```
112
195
 
113
196
  ### 차트
@@ -160,6 +243,7 @@ kiwoom stock credit trend 005930 --date 20260301 --type loan
160
243
  | `search` | 종목 검색 (캐시 기반, 시장/유형 필터) |
161
244
  | `watchlist` | 관심종목 |
162
245
  | `brokers` | 회원사 리스트 |
246
+ | `compare` | 복수 종목 비교 |
163
247
  | `chart *` | 틱/분봉/일봉/주봉/월봉/년봉, 투자자별 차트 |
164
248
  | `investor *` | 기관매매, 투자자별매매, 프로그램매매 등 10개 |
165
249
  | `analysis *` | 거래상세, 거래량갱신, 매물대, PER, VI, 증권사 등 10개 |
@@ -174,7 +258,7 @@ kiwoom stock credit trend 005930 --date 20260301 --type loan
174
258
 
175
259
  ```bash
176
260
  kiwoom account list # 계좌번호
177
- kiwoom account balance # 잔고 + 보유종목 + 손익
261
+ kiwoom account balance # 잔고 + 보유종목 + 손익 (국내+미국 통합)
178
262
  kiwoom account deposit # 예수금
179
263
  kiwoom account asset # 추정자산
180
264
  kiwoom account today # 당일현황
@@ -216,6 +300,9 @@ kiwoom account orderable amount 005930 --side buy --price 70000
216
300
  | `orderable` | `amount` | 주문가능 금액 |
217
301
  | `orderable` | `margin-qty` | 증거금율별 수량 |
218
302
  | `orderable` | `credit-qty` | 신용보증금율별 수량 |
303
+ | `exchange` | `rate` | 환율 조회 |
304
+ | `exchange` | `estimate` | 환전 예상금액 |
305
+ | `exchange` | `apply` | 환전 신청 |
219
306
  | `history` | `transactions` | 위탁종합 거래내역 |
220
307
  | `history` | `journal` | 당일 매매일지 |
221
308
 
@@ -244,11 +331,13 @@ kiwoom account exchange apply 1000000 --confirm # 원화 → 달러 환전
244
331
  - 정정은 가격만 가능(전량), 취소는 전량 취소만 지원됩니다 (키움 API 제약).
245
332
  - 계좌 조회 명령(`balance/deposit/pnl/orders/history`)은 기본 통합 표시이며 `--market kr|us`로 필터링합니다.
246
333
 
334
+ 자세한 가이드: [Wiki: 미국주식](https://github.com/gejyn14/kiwoom-cli/wiki/US-Stocks)
335
+
247
336
  ---
248
337
 
249
338
  ## order - 주문
250
339
 
251
- 모든 주문에 `--confirm` 필수.
340
+ 주문은 실행 전 미리보기 + 대화형 확인이 기본입니다. 자동화 시에만 `--confirm`으로 스킵하세요.
252
341
 
253
342
  ```bash
254
343
  # 주식
@@ -363,27 +452,13 @@ kiwoom stream types # 타입 코드 목록
363
452
 
364
453
  ---
365
454
 
366
- ## Raw API
367
-
368
- ```bash
369
- kiwoom api ka10001 '{"stk_cd":"005930"}' # 테이블 출력
370
- kiwoom api ka10001 '{"stk_cd":"005930"}' --raw # JSON 원본
371
- ```
372
-
373
- ---
374
-
375
- ## dashboard - 대시보드
455
+ ## dashboard / Raw API
376
456
 
377
457
  ```bash
378
458
  kiwoom dashboard # 계좌 요약 + 거래량 상위 한눈에
379
- ```
380
-
381
- ## 종목 비교
382
459
 
383
- ```bash
384
- kiwoom stock compare 005930 000660 # 삼성전자 vs SK하이닉스
385
- kiwoom stock compare 005930 000660 035420 # 3종목 비교
386
- kiwoom -f json stock compare 005930 000660 # JSON 출력
460
+ kiwoom api ka10001 '{"stk_cd":"005930"}' # Raw API — 테이블 출력
461
+ kiwoom api ka10001 '{"stk_cd":"005930"}' --raw # JSON 원본
387
462
  ```
388
463
 
389
464
  ---
@@ -429,13 +504,30 @@ eval (env _KIWOOM_COMPLETE=fish_source kiwoom)
429
504
  | 2 | API/네트워크 오류 |
430
505
  | 3 | 인증 필요 (토큰 만료) |
431
506
 
507
+ ## 보안
508
+
509
+ 모든 인증정보(appkey, secretkey, 토큰)는 **OS 키체인**(macOS Keychain / Windows Credential Manager / Linux Secret Service)에 저장됩니다. 파일로 존재하지 않으며, 키체인이 디스크 저장 시 암호화를 담당합니다. `gh`, `aws`, `docker` CLI와 동일한 모델입니다.
510
+
511
+ | 항목 | 저장 방식 | 프롬프트 |
512
+ | ------------------ | ------------------------------------------ | :------: |
513
+ | appkey / secretkey | OS 키체인 | X |
514
+ | 토큰 | OS 키체인 또는 KIWOOM_TOKEN 환경변수 (선택) | X |
515
+ | config.toml | 도메인, 계좌번호, 토큰 저장 방식만 | X |
516
+
517
+ - 모든 명령어는 비밀번호/생체인증 프롬프트 없이 동작 (AI 에이전트·자동화 친화적)
518
+ - 앱 자체 암호화 계층은 의도적으로 두지 않음 — 추가 계층은 명령마다 잠금 해제 프롬프트를 요구하게 되어 CLI 사용성을 해침
519
+ - v2.0 이하에서 업그레이드한 경우: 암호화 저장소 형식이 제거되어 `kiwoom config setup`을 한 번 다시 실행해야 합니다
520
+ - 주문은 기본적으로 미리보기 + 대화형 확인을 거칩니다 (`--confirm`으로 스킵)
521
+
522
+ 자세한 내용: [Wiki: 보안 모델](https://github.com/gejyn14/kiwoom-cli/wiki/Security) · [SECURITY.md](SECURITY.md)
523
+
432
524
  ## 참고
433
525
 
434
526
  | 항목 | 값 |
435
527
  | ---------------- | ---------------------------------------- |
436
- | 설정 파일 | `~/.kiwoom/config.toml` (도메인, 계좌만) |
528
+ | 설정 파일 | `~/.kiwoom/config.toml` (도메인, 계좌, 토큰 저장 방식만) |
437
529
  | appkey/secretkey | OS 키체인 |
438
- | 토큰 | OS 키체인 |
530
+ | 토큰 | OS 키체인 또는 KIWOOM_TOKEN 환경변수 (setup에서 선택) |
439
531
  | 캐시 디렉터리 | `~/.kiwoom/cache/` |
440
532
  | 운영 도메인 | `https://api.kiwoom.com` |
441
533
  | 모의투자 도메인 | `https://mockapi.kiwoom.com` |
@@ -447,20 +539,6 @@ eval (env _KIWOOM_COMPLETE=fish_source kiwoom)
447
539
  - 종목코드 6자리: `005930` (삼성전자)
448
540
  - 금현물: `M04020000` (1kg), `M04020100` (미니 100g)
449
541
 
450
- ## 보안
451
-
452
- 모든 인증정보(appkey, secretkey, 토큰)는 **OS 키체인**(macOS Keychain / Windows Credential Manager / Linux Secret Service)에 저장됩니다. 파일로 존재하지 않으며, 키체인이 디스크 저장 시 암호화를 담당합니다. `gh`, `aws`, `docker` CLI와 동일한 모델입니다.
453
-
454
- | 항목 | 저장 방식 | 프롬프트 |
455
- | ------------------ | ------------------ | :------: |
456
- | appkey / secretkey | OS 키체인 | X |
457
- | 토큰 | OS 키체인 | X |
458
- | config.toml | 도메인, 계좌번호만 | X |
459
-
460
- - 모든 명령어는 비밀번호/생체인증 프롬프트 없이 동작 (AI 에이전트·자동화 친화적)
461
- - 앱 자체 암호화 계층은 의도적으로 두지 않음 — 추가 계층은 명령마다 잠금 해제 프롬프트를 요구하게 되어 CLI 사용성을 해침
462
- - v2.0 이하에서 업그레이드한 경우: 암호화 저장소 형식이 제거되어 `kiwoom config setup`을 한 번 다시 실행해야 합니다
463
-
464
542
  ## License
465
543
 
466
544
  kiwoom-cli **Source-Available License, Version 1.0** — see [LICENSE](LICENSE).
@@ -1,3 +1,3 @@
1
1
  """Kiwoom Securities REST API CLI."""
2
2
 
3
- __version__ = "2.1.0"
3
+ __version__ = "2.2.0"
@@ -3,10 +3,19 @@
3
3
  Tokens are stored in the OS keychain (plain, not encrypted).
4
4
  Tokens are short-lived and can be re-issued, so the security risk
5
5
  of plain keychain storage is low compared to appkey/secretkey.
6
+
7
+ KIWOOM_TOKEN 환경변수가 설정되어 있으면 키체인보다 우선합니다. 키체인에
8
+ 접근할 수 없는 샌드박스/CI/AI 에이전트 환경을 위한 통로로, 만료되는
9
+ 토큰만 허용됩니다 — appkey/secretkey는 여전히 환경변수를 지원하지 않습니다.
10
+
11
+ 프로필의 token_storage가 "env"이면 save_token은 키체인에 쓰지 않습니다.
12
+ auth login이 토큰을 출력하고, 사용자가 KIWOOM_TOKEN으로 직접 관리합니다.
6
13
  """
7
14
 
8
15
  from __future__ import annotations
9
16
 
17
+ import os
18
+
10
19
  import keyring
11
20
 
12
21
  from . import config
@@ -16,12 +25,17 @@ KEYRING_SERVICE = config.KEYRING_SERVICE
16
25
 
17
26
  def save_token(token: str, profile: str | None = None) -> None:
18
27
  p = config.resolve_profile(profile)
28
+ if config.get_token_storage(p) == "env":
29
+ return
19
30
  keyring.set_password(KEYRING_SERVICE, f"{p}:token", token)
20
31
 
21
32
 
22
33
  def load_token(profile: str | None = None) -> str | None:
34
+ env = os.environ.get("KIWOOM_TOKEN")
35
+ if env:
36
+ return env
23
37
  p = config.resolve_profile(profile)
24
- return keyring.get_password(KEYRING_SERVICE, f"{p}:token")
38
+ return config._keyring_get(f"{p}:token")
25
39
 
26
40
 
27
41
  def delete_token(profile: str | None = None) -> None: