switcher-widget 1.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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Youkamii
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.en.md ADDED
@@ -0,0 +1,164 @@
1
+ <h1><img src="docs/logo.svg" width="26" alt="" /> switcher</h1>
2
+
3
+ [한국어](README.md) | **English** | [日本語](README.ja.md) | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | [हिन्दी](README.hi.md)
4
+
5
+ A desktop widget that switches between multiple Claude Code / Codex CLI accounts in one click, with per-account usage bars (Windows·macOS).
6
+
7
+ <p align="center"><img src="docs/screenshot.png" alt="switcher — Type 1 / 2 / 3" /></p>
8
+ <p align="center"><sub>Three view modes — Type 1 (full) · Type 2 (widget) · Type 3 (compact)</sub></p>
9
+
10
+ ## Windows
11
+
12
+ ### Install
13
+
14
+ **Install via npm (recommended — no security warnings)** — requires Node.js 18+
15
+
16
+ ```sh
17
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
18
+ switcher
19
+ ```
20
+
21
+ The first run of the `switcher` command automatically downloads the latest release build (subsequent runs start instantly). Since it isn't a browser download, no SmartScreen warning appears. Updates are automatic — every launch checks for a new release and applies it on the next launch.
22
+
23
+ **Direct download** — grab `switcher-win-x64.zip` from the [releases page](https://github.com/Youkamii/switcher/releases/latest), extract it, and run `switcher.exe`. (Windows 10/11, 64-bit)
24
+
25
+ - The binary is not code-signed, so Windows SmartScreen may show an "unknown publisher" warning on first launch. Click `More info` → `Run anyway`.
26
+ - The webview uses WebView2, which ships with Windows.
27
+
28
+ ### Run
29
+
30
+ - While running, it lives in the tray (right side of the taskbar) as a W icon. Closing the window (Alt+F4) does not quit it.
31
+ - Left-click the W tray icon to bring the window back. To quit completely, right-click the tray icon → Quit.
32
+ - Change the UI language via right-click on the tray icon → Settings → Language (한국어·English·日本語·简体中文·繁體中文·हिन्दी).
33
+ - On first launch, a `switcher` shortcut is created on the desktop automatically (not recreated if you delete it).
34
+ - Run at startup is enabled by default — turn it off via tray Settings → Run at startup.
35
+ - Every launch checks for a new release and auto-updates (applied on the next launch) — turn it off via tray Settings → Auto-update.
36
+
37
+ ## macOS
38
+
39
+ ### Install
40
+
41
+ **Install via npm (recommended — no security warnings)** — requires Node.js 18+
42
+
43
+ ```sh
44
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
45
+ switcher
46
+ ```
47
+
48
+ The first run of the `switcher` command automatically downloads the latest release build (subsequent runs start instantly). Since it isn't a browser download, no "unidentified developer" warning appears. To update, quit the widget and run the same install command again.
49
+
50
+ **Direct download** — grab `switcher-mac-arm64.zip` from the [releases page](https://github.com/Youkamii/switcher/releases/latest), extract it, and run `switcher.app`. Apple Silicon only — on Intel Macs, install via [Build from source](#build-from-source) below.
51
+
52
+ - The app is not code-signed, so the first launch may be blocked with an "unidentified developer" message. Open System Settings → Privacy & Security, scroll to the bottom, and click **Open Anyway**.
53
+
54
+ ### Run
55
+
56
+ - Launch `switcher.app`. It does not appear in the Dock or Cmd+Tab; it lives in the right side of the menu bar as a W icon.
57
+ - The widget stays on top across all desktops (Spaces) and even over full-screen apps.
58
+ - Left-click the menu bar W icon to toggle the window; right-click → Quit to exit completely.
59
+ - Changing the UI language on macOS is **under development** — the UI is currently shown in Korean.
60
+ - To start it at boot, add `switcher.app` under System Settings → General → Login Items.
61
+
62
+ ## Using the widget (Windows·macOS)
63
+
64
+ <table align="center">
65
+ <tr>
66
+ <td align="center" width="450">
67
+ <img src="docs/demo.gif" width="420" alt="Widget mode demo — double-click an account card to switch; clicks on empty areas pass through to the window behind" />
68
+ </td>
69
+ <td width="430">
70
+
71
+ **Widget mode behavior**
72
+
73
+ - **Double-click** an account card → switches auth to that account
74
+ - Clicks and drags outside the cards **pass through to the window behind**
75
+ - The active account is shown in higher saturation
76
+ - Move the window with the ☰ handle; cycle modes with the Type button at the top right
77
+ - On macOS, it stays visible across all Spaces and over full-screen apps
78
+
79
+ </td>
80
+ </tr>
81
+ </table>
82
+
83
+ ## Overview
84
+
85
+ Whether you use Claude Code or Codex, a terminal only holds one login at a time. Multi-account users re-run `/login` every time a limit fills up, go through browser auth again, and lose track of which account is active.
86
+
87
+ switcher removes that loop. Log in once per account, and from then on switching is a single click in the widget. Each account's usage (5-hour and weekly limits) is shown as bars, so you can see which account has headroom and hop over.
88
+
89
+ ## Features
90
+
91
+ - Account switching: one click, no re-login. Applies to newly opened terminals.
92
+ - Usage display: per account, 5 Hours / Weekly / per-model limits with time remaining until reset.
93
+ - Add accounts: open the login link shown in the widget, get a code, paste it in.
94
+ - Subscription tier: Max (5x yellow, 20x red) / Pro / Plus badges next to each account.
95
+ - Modes (Type1/2/3): full → widget → compact cycle. In widget/compact modes the buttons hide, clicks and drags pass through to the window behind, and double-clicking a card switches accounts. Move the window with the ☰ handle.
96
+ - The window height auto-fits the content. Lowering the opacity slider fades the background first, then the frame.
97
+ - UI language: tray → Settings → Language, 6 languages (Korean·English·Japanese·Simplified Chinese·Traditional Chinese·Hindi). Under development on macOS.
98
+ - Auto-update, run-at-startup, and desktop shortcut (Windows): toggled in tray Settings. Under development on macOS.
99
+
100
+ ## How it works
101
+
102
+ Both CLIs store their login token locally.
103
+
104
+ - Claude Code: `~/.claude/.credentials.json` (Windows) / on macOS, the **Keychain** item "Claude Code-credentials"
105
+ - Codex CLI: `~/.codex/auth.json` (same on both OSes)
106
+
107
+ On macOS, switcher reads and writes the Keychain the same way the Claude CLI does (via the built-in `security` tool) — no extra permission popups.
108
+
109
+ switcher keeps per-account tokens as profiles under `~/.switcher/` and swaps files in two steps when switching:
110
+
111
+ 1. Back up the currently active file into the current account's profile. Tokens refresh themselves frequently, so this step must come first.
112
+ 2. Copy the target account's profile into the active location.
113
+
114
+ Note: if a CLI session is running in a terminal, it's safest to finish it before switching. A live session that auto-refreshes its token may rewrite the active file, overwriting the account you just switched to with the previous account's token.
115
+
116
+ Chat history, memory, and settings live in local folders unrelated to the account, so your work environment stays intact across switches.
117
+
118
+ Usage is queried directly from the same usage API the CLI uses, with each account's token. A 60-second cache avoids rate limits. If a query is blocked, the last known values are shown.
119
+
120
+ Claude access tokens only live a few hours, so when a stored profile's token expires the widget re-issues it the same way the CLI does and writes it back to the profile — all profiles once at app start, then on demand per query. That keeps usage live even for accounts you aren't using. The token of the account currently in use is refreshed by the CLI itself, so the widget leaves it alone.
121
+
122
+ Adding an account is handled with an isolated login.
123
+
124
+ ## Adding an account
125
+
126
+ Press "+ Add account" in the widget and a login URL appears. Paste that URL into any browser you like.
127
+
128
+ - **Claude**: after logging in, the browser shows a code. Paste that code into the widget's input field and you're done.
129
+ - **Codex**: the widget shows the URL together with a one-time code (valid for 15 minutes). Enter that code in the browser and the rest is automatic.
130
+
131
+ **Before adding Codex for the first time**: device-code authentication is disabled by default on OpenAI accounts. If it's off, entering the code gets rejected with "enable device code authentication and try again".
132
+
133
+ - Personal accounts: chatgpt.com → profile → Settings → Security (or Data Controls) → enable **Codex device code authentication**
134
+ - Team/Business accounts: an admin enables it under Workspace Settings → Permissions & Roles
135
+
136
+ Note: the Claude CLI tries to open your default browser once when the login starts. You can close that window and continue in the browser where you pasted the widget's URL.
137
+
138
+ ## Tech
139
+
140
+ Tauri 2 + Rust, with a vanilla TypeScript frontend. Account switching, usage queries, and isolated logins are all handled in Rust.
141
+ Tokens never reach the webview.
142
+ CLI login screens are read through a virtual console (PTY).
143
+
144
+ ## Build from source
145
+
146
+ To build from source instead of downloading, you need the [Node.js](https://nodejs.org) and [Rust](https://rustup.rs) toolchains.
147
+
148
+ ```sh
149
+ git clone https://github.com/Youkamii/switcher.git
150
+ cd switcher
151
+ npm run setup
152
+ ```
153
+
154
+ `npm run setup` installs dependencies and builds the app in one go. Instead of dumping verbose logs, it shows a spinner and elapsed time.
155
+
156
+ The first build compiles all of Rust, so it **can take 5–10 minutes.** It isn't stuck — just wait. The output lands at `src-tauri\target\release\switcher.exe` on Windows and `src-tauri/target/release/bundle/macos/switcher.app` on macOS — feel free to move the app into your Applications folder.
157
+
158
+ For development, run `npm run tauri dev`.
159
+
160
+ ---
161
+
162
+ <div align="center">
163
+ <sub>Licensed under the <a href="LICENSE">MIT License</a> — free for any use, including commercial. Keep the copyright and license notice.</sub>
164
+ </div>
package/README.hi.md ADDED
@@ -0,0 +1,164 @@
1
+ <h1><img src="docs/logo.svg" width="26" alt="" /> switcher</h1>
2
+
3
+ [한국어](README.md) | [English](README.en.md) | [日本語](README.ja.md) | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | **हिन्दी**
4
+
5
+ Claude Code और Codex CLI अकाउंट्स को एक बटन से स्विच करने वाला डेस्कटॉप विजेट (Windows·macOS)।
6
+
7
+ <p align="center"><img src="docs/screenshot.png" alt="switcher — Type 1 / 2 / 3" /></p>
8
+ <p align="center"><sub>तीन व्यू मोड — Type 1 (फ़ुल) · Type 2 (विजेट) · Type 3 (कॉम्पैक्ट)</sub></p>
9
+
10
+ ## Windows
11
+
12
+ ### इंस्टॉलेशन
13
+
14
+ **npm से इंस्टॉल करें (अनुशंसित — कोई सुरक्षा चेतावनी नहीं)** — Node.js 18 या उससे ऊपर
15
+
16
+ ```sh
17
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
18
+ switcher
19
+ ```
20
+
21
+ `switcher` कमांड पहली बार चलने पर लेटेस्ट रिलीज़ बिल्ड अपने आप डाउनलोड कर लेती है (उसके बाद तुरंत खुलती है)। यह ब्राउज़र डाउनलोड नहीं है, इसलिए SmartScreen की चेतावनी नहीं आती। अपडेट अपने आप होता है — हर बार चलाने पर नई रिलीज़ की जाँच होती है और अगली बार चलाने पर लागू होती है।
22
+
23
+ **सीधा डाउनलोड** — [रिलीज़](https://github.com/Youkamii/switcher/releases/latest) से `switcher-win-x64.zip` डाउनलोड करें, unzip करके `switcher.exe` चलाएँ। (Windows 10/11 64-बिट)
24
+
25
+ - कोड साइनिंग नहीं है, इसलिए पहली बार चलाने पर Windows SmartScreen "अज्ञात प्रकाशक" की चेतावनी दिखा सकता है। `More info` → `Run anyway`।
26
+ - वेबव्यू के लिए Windows में पहले से शामिल WebView2 का उपयोग होता है।
27
+
28
+ ### चलाना
29
+
30
+ - चलते समय यह ट्रे (टास्कबार के दाएँ) में W आइकन के रूप में मौजूद रहता है। विंडो बंद करने (Alt+F4) पर भी बंद नहीं होता।
31
+ - विंडो फिर से सामने लाने के लिए ट्रे के W आइकन पर लेफ्ट-क्लिक करें। पूरी तरह बंद करने के लिए ट्रे आइकन पर राइट-क्लिक → बंद करें।
32
+ - UI भाषा बदलने के लिए ट्रे आइकन पर राइट-क्लिक → सेटिंग्स → भाषा (한국어·English·日本語·简体中文·繁體中文·हिन्दी)।
33
+ - पहली बार चलाने पर डेस्कटॉप पर `switcher` शॉर्टकट अपने आप बन जाता है (हटा देने पर दोबारा नहीं बनता)।
34
+ - बूट पर स्वतः चलना डिफ़ॉल्ट रूप से चालू है — ट्रे सेटिंग्स → बूट पर स्वतः चलाएँ से बंद कर सकते हैं।
35
+ - हर बार चलाने पर नई रिलीज़ की जाँच करके ऑटो-अपडेट होता है (अगली बार चलाने पर लागू) — ट्रे सेटिंग्स → ऑटो-अपडेट से बंद कर सकते हैं।
36
+
37
+ ## macOS
38
+
39
+ ### इंस्टॉलेशन
40
+
41
+ **npm से इंस्टॉल करें (अनुशंसित — कोई सुरक्षा चेतावनी नहीं)** — Node.js 18 या उससे ऊपर
42
+
43
+ ```sh
44
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
45
+ switcher
46
+ ```
47
+
48
+ `switcher` कमांड पहली बार चलने पर लेटेस्ट रिलीज़ बिल्ड अपने आप डाउनलोड कर लेती है (उसके बाद तुरंत खुलती है)। यह ब्राउज़र डाउनलोड नहीं है, इसलिए "अज्ञात डेवलपर" की चेतावनी नहीं आती। अपडेट के लिए विजेट बंद करके वही इंस्टॉल कमांड दोबारा चलाएँ।
49
+
50
+ **सीधा डाउनलोड** — [रिलीज़](https://github.com/Youkamii/switcher/releases/latest) से `switcher-mac-arm64.zip` डाउनलोड करें, unzip करके `switcher.app` चलाएँ। केवल Apple Silicon के लिए — Intel Mac पर नीचे दिए [सोर्स से बिल्ड करें](#सोर्स-से-बिल्ड-करें) से इंस्टॉल करें।
51
+
52
+ - कोड साइनिंग नहीं है, इसलिए पहली बार खोलने पर "अज्ञात डेवलपर" कहकर रोका जा सकता है। System Settings → Privacy & Security में सबसे नीचे दिखने वाले **Open Anyway** से चलाएँ।
53
+
54
+ ### चलाना
55
+
56
+ - `switcher.app` चलाएँ। यह Dock और Cmd+Tab में नहीं दिखता; मेन्यू बार के दाएँ W आइकन के रूप में मौजूद रहता है।
57
+ - विजेट सभी डेस्कटॉप (Space) और फ़ुल-स्क्रीन ऐप्स के ऊपर ओवरले के रूप में दिखता है।
58
+ - विंडो खोलना/छिपाना मेन्यू बार के W आइकन पर लेफ्ट-क्लिक टॉगल से; पूरी तरह बंद करने के लिए राइट-क्लिक → बंद करें।
59
+ - UI भाषा बदलना **विकासाधीन** है — फ़िलहाल कोरियाई में दिखता है।
60
+ - बूट पर अपने आप शुरू कराने के लिए System Settings → General → Login Items में `switcher.app` जोड़ें।
61
+
62
+ ## विजेट का उपयोग (Windows·macOS दोनों पर समान)
63
+
64
+ <table align="center">
65
+ <tr>
66
+ <td align="center" width="450">
67
+ <img src="docs/demo.gif" width="420" alt="विजेट मोड डेमो — अकाउंट कार्ड पर डबल-क्लिक से स्विच, खाली क्षेत्र के क्लिक पीछे की विंडो तक पास-थ्रू" />
68
+ </td>
69
+ <td width="430">
70
+
71
+ **विजेट मोड का व्यवहार**
72
+
73
+ - अकाउंट कार्ड पर **डबल-क्लिक** → उस अकाउंट पर ऑथेंटिकेशन स्विच
74
+ - कार्ड के बाहर क्लिक·ड्रैग **पीछे की विंडो तक सीधे पास-थ्रू** होते हैं
75
+ - सक्रिय अकाउंट ज़्यादा गहरे (हाई सैचुरेशन) रंग में दिखता है
76
+ - विंडो हिलाने के लिए ☰ हैंडल, मोड बदलने के लिए ऊपर दाएँ Type बटन
77
+ - Mac पर सभी डेस्कटॉप (Space) और फ़ुल-स्क्रीन ऐप्स के ऊपर भी ओवरले
78
+
79
+ </td>
80
+ </tr>
81
+ </table>
82
+
83
+ ## परिचय
84
+
85
+ Claude Code हो या Codex, एक टर्मिनल में एक समय पर सिर्फ़ एक ही अकाउंट लॉगिन रहता है। कई अकाउंट रखने वाले यूज़र को लिमिट भरते ही फिर से `/login` करना पड़ता है, ब्राउज़र ऑथेंटिकेशन दोबारा करना पड़ता है, और यह उलझन भी बनी रहती है कि अभी कौन-सा अकाउंट चल रहा है।
86
+
87
+ switcher इस पूरी प्रक्रिया को खत्म कर देता है। हर अकाउंट में बस शुरुआत में एक बार लॉगिन कर लें, उसके बाद विजेट में एक बटन से स्विच हो जाता है। हर अकाउंट का उपयोग (5-घंटे·साप्ताहिक लिमिट) बार के रूप में दिखता है, तो देखकर उस अकाउंट पर स्विच करें जिसमें गुंजाइश बची है।
88
+
89
+ ## फ़ीचर्स
90
+
91
+ - अकाउंट स्विचिंग: दोबारा लॉगिन किए बिना एक बटन। नए खुलने वाले टर्मिनल से लागू होता है।
92
+ - उपयोग डिस्प्ले: हर अकाउंट के लिए 5 Hours / Weekly / मॉडल-वार लिमिट और रीसेट तक बचा समय दिखता है।
93
+ - अकाउंट जोड़ना: विजेट में दिखने वाले लॉगिन लिंक से कोड लेकर दर्ज करें।
94
+ - सब्सक्रिप्शन लेवल: अकाउंट के बगल में Max (5x पीला, 20x लाल) / Pro / Plus दिखता है।
95
+ - मोड (Type1/2/3): फ़ुल → विजेट → कॉम्पैक्ट क्रम में बदलता है। विजेट·कॉम्पैक्ट में बटन छिप जाते हैं, क्लिक·ड्रैग पीछे की विंडो तक पास-थ्रू होते हैं, और अकाउंट कार्ड पर डबल-क्लिक से स्विच होता है। विंडो हिलाने के लिए ☰ हैंडल।
96
+ - विंडो की ऊँचाई कंटेंट के हिसाब से अपने आप एडजस्ट होती है। ओपैसिटी स्लाइडर घटाने पर पहले बैकग्राउंड, फिर फ़्रेम हल्का होता है।
97
+ - UI भाषा: ट्रे → सेटिंग्स → भाषा से 6 भाषाओं (कोरियाई·अंग्रेज़ी·जापानी·सरलीकृत चीनी·पारंपरिक चीनी·हिन्दी) में स्विच। macOS पर विकासाधीन।
98
+ - ऑटो-अपडेट·बूट पर स्वतः चलना·डेस्कटॉप शॉर्टकट (Windows): ट्रे सेटिंग्स से चालू/बंद। macOS पर विकासाधीन।
99
+
100
+ ## यह कैसे काम करता है
101
+
102
+ दोनों CLI लॉगिन टोकन लोकल में सेव करते हैं।
103
+
104
+ - Claude Code: `~/.claude/.credentials.json` (Windows) / macOS पर **कीचेन** की "Claude Code-credentials" एंट्री
105
+ - Codex CLI: `~/.codex/auth.json` (दोनों OS पर समान)
106
+
107
+ Mac पर switcher, Claude CLI के ही तरीके से (macOS के बिल्ट-इन `security` टूल से) कीचेन पढ़ता-लिखता है — कोई अलग परमिशन पॉपअप नहीं आता।
108
+
109
+ switcher हर अकाउंट के टोकन को `~/.switcher/` के नीचे प्रोफ़ाइल के रूप में रखता है और स्विच करते समय दो चरणों में फ़ाइलें बदलता है।
110
+
111
+ 1. पहले मौजूदा सक्रिय फ़ाइल का वर्तमान अकाउंट की प्रोफ़ाइल में बैकअप लेता है। टोकन समय-समय पर अपने आप रिफ़्रेश होते हैं, इसलिए यह चरण पहले होना ज़रूरी है।
112
+ 2. फिर टार्गेट अकाउंट की प्रोफ़ाइल को सक्रिय स्थान पर कॉपी करता है।
113
+
114
+ ध्यान दें: अगर टर्मिनल में कोई CLI सेशन चल रहा है, तो उसे बंद करके स्विच करना सुरक्षित है। चालू सेशन टोकन को अपने आप रिफ़्रेश करते हुए सक्रिय फ़ाइल फिर से लिख दे, तो अभी-अभी स्विच किया गया अकाउंट पुराने अकाउंट के टोकन से ओवरराइट हो सकता है।
115
+
116
+ बातचीत का इतिहास·मेमोरी·सेटिंग्स अकाउंट से स्वतंत्र लोकल फ़ोल्डर में रहते हैं, इसलिए अकाउंट बदलने पर भी वर्क एनवायरनमेंट वैसा ही रहता है।
117
+
118
+ उपयोग की जानकारी हर अकाउंट के टोकन से, CLI द्वारा इस्तेमाल किए जाने वाले usage API को सीधे क्वेरी करके ली जाती है। रेट लिमिट से बचने के लिए 60 सेकंड का कैश रखा गया है। क्वेरी विफल हो जाए तो पिछला मान दिखाया जाता है।
119
+
120
+ Claude का एक्सेस टोकन कुछ ही घंटों तक वैध रहता है, इसलिए स्टोर की गई प्रोफ़ाइल का टोकन एक्सपायर होने पर विजेट उसे CLI के ही तरीके से दोबारा जारी कर प्रोफ़ाइल में लिख देता है — ऐप शुरू होते समय एक बार सभी के लिए, उसके बाद क्वेरी के समय सिर्फ़ ज़रूरी के लिए। इसलिए इस्तेमाल में न रहे अकाउंट्स का उपयोग भी हमेशा रीयल-टाइम रहता है। जो अकाउंट अभी इस्तेमाल में है उसका टोकन CLI खुद रिफ़्रेश करता है, इसलिए विजेट उसे नहीं छूता।
121
+
122
+ अकाउंट जोड़ने का काम आइसोलेटेड लॉगिन से होता है।
123
+
124
+ ## अकाउंट जोड़ना
125
+
126
+ विजेट में "+ अकाउंट जोड़ें" दबाने पर लॉगिन URL दिखता है। उस URL को अपनी पसंद के ब्राउज़र में पेस्ट करें।
127
+
128
+ - **Claude**: ब्राउज़र में लॉगिन करने पर स्क्रीन पर एक कोड दिखता है। वह कोड विजेट के इनपुट बॉक्स में पेस्ट करते ही काम पूरा।
129
+ - **Codex**: विजेट में URL के साथ एक वन-टाइम कोड (15 मिनट वैध) दिखता है। ब्राउज़र में वह कोड दर्ज करें, बाकी अपने आप हो जाता है।
130
+
131
+ **पहली बार Codex जोड़ने से पहले**: डिवाइस कोड ऑथेंटिकेशन OpenAI अकाउंट में डिफ़ॉल्ट रूप से बंद रहता है। इसे चालू किए बिना कोड दर्ज करने पर "डिवाइस कोड ऑथेंटिकेशन सक्षम करके फिर से चलाएँ" कहकर अस्वीकार कर दिया जाता है।
132
+
133
+ - व्यक्तिगत अकाउंट: chatgpt.com → प्रोफ़ाइल → सेटिंग्स → सुरक्षा (या डेटा कंट्रोल) → **Codex डिवाइस कोड ऑथेंटिकेशन** चालू करें
134
+ - टीम·बिज़नेस अकाउंट: एडमिन वर्कस्पेस सेटिंग्स → परमिशन और रोल्स से सक्षम करे
135
+
136
+ नोट: Claude CLI लॉगिन शुरू करते समय डिफ़ॉल्ट ब्राउज़र एक बार खोलने की कोशिश करता है। उस विंडो को बंद कर सकते हैं; विजेट का URL पेस्ट किए हुए ब्राउज़र में आगे बढ़ें।
137
+
138
+ ## तकनीक
139
+
140
+ Tauri 2 + Rust, फ़्रंटएंड वनीला TypeScript। अकाउंट स्विचिंग·उपयोग क्वेरी·आइसोलेटेड लॉगिन — सब कुछ Rust में हैंडल होता है।
141
+ वेबव्यू तक टोकन कभी नहीं पहुँचता।
142
+ CLI की लॉगिन स्क्रीन वर्चुअल कंसोल (PTY) से पढ़ी जाती है।
143
+
144
+ ## सोर्स से बिल्ड करें
145
+
146
+ बिल्ड डाउनलोड करने के बजाय सोर्स से बिल्ड करना हो तो [Node.js](https://nodejs.org) और [Rust](https://rustup.rs) टूलचेन चाहिए।
147
+
148
+ ```sh
149
+ git clone https://github.com/Youkamii/switcher.git
150
+ cd switcher
151
+ npm run setup
152
+ ```
153
+
154
+ `npm run setup` डिपेंडेंसी इंस्टॉल और ऐप बिल्ड एक साथ कर देता है। लंबे-चौड़े लॉग की जगह सिर्फ़ लोडिंग इंडिकेटर और बीता हुआ समय दिखाता है।
155
+
156
+ पहली बार पूरा Rust कंपाइल होता है, इसलिए **5–10 मिनट लग सकते हैं।** लोडिंग अटकी नहीं है, बस इंतज़ार करें। आउटपुट: Windows में `src-tauri\target\release\switcher.exe`, macOS में `src-tauri/target/release/bundle/macos/switcher.app` — ऐप को Applications फ़ोल्डर में भी ले जा सकते हैं।
157
+
158
+ डेवलपमेंट रन के लिए `npm run tauri dev`।
159
+
160
+ ---
161
+
162
+ <div align="center">
163
+ <sub>Licensed under the <a href="LICENSE">MIT License</a> — free for any use, including commercial. Keep the copyright and license notice.</sub>
164
+ </div>
package/README.ja.md ADDED
@@ -0,0 +1,164 @@
1
+ <h1><img src="docs/logo.svg" width="26" alt="" /> switcher</h1>
2
+
3
+ [한국어](README.md) | [English](README.en.md) | **日本語** | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | [हिन्दी](README.hi.md)
4
+
5
+ Claude Code と Codex CLI のアカウントをボタンひとつで切り替えられるデスクトップウィジェット(Windows・macOS)。
6
+
7
+ <p align="center"><img src="docs/screenshot.png" alt="switcher — Type 1 / 2 / 3" /></p>
8
+ <p align="center"><sub>3つの表示モード — Type 1(フル)・Type 2(ウィジェット)・Type 3(コンパクト)</sub></p>
9
+
10
+ ## Windows
11
+
12
+ ### インストール
13
+
14
+ **npm でインストール(推奨 — セキュリティ警告なし)** — Node.js 18 以上
15
+
16
+ ```sh
17
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
18
+ switcher
19
+ ```
20
+
21
+ `switcher` コマンドの初回実行時に最新のリリースビルドを自動でダウンロードします(2回目以降はすぐ起動します)。ブラウザ経由のダウンロードではないため、SmartScreen の警告は表示されません。アップデートは自動です — 起動のたびに新しいリリースを確認し、次回起動から反映されます。
22
+
23
+ **直接ダウンロード** — [リリース](https://github.com/Youkamii/switcher/releases/latest)から `switcher-win-x64.zip` をダウンロードして展開し、`switcher.exe` を実行します。(Windows 10/11 64ビット)
24
+
25
+ - コード署名がないため、初回実行時に Windows SmartScreen が「発行元不明」の警告を表示することがあります。`詳細情報` → `実行` で起動できます。
26
+ - WebView には Windows に標準搭載されている WebView2 を使用します。
27
+
28
+ ### 実行
29
+
30
+ - 起動中はトレイ(タスクバー右側)に W アイコンとして常駐します。ウィンドウを閉じても(Alt+F4)終了しません。
31
+ - ウィンドウを再び表示するにはトレイの W アイコンを左クリック。完全に終了するにはトレイアイコンを右クリック → 終了。
32
+ - UI 言語はトレイアイコンを右クリック → 設定 → 言語 から変更できます(한국어・English・日本語・简体中文・繁體中文・हिन्दी)。
33
+ - 初回起動時にデスクトップへ `switcher` のショートカットが自動作成されます(削除すれば再作成されません)。
34
+ - 起動時の自動実行は既定でオンです — トレイの設定 → 起動時に自動実行 からオフにできます。
35
+ - 起動のたびに新しいリリースを確認して自動アップデートします(次回起動から反映) — トレイの設定 → 自動アップデート からオフにできます。
36
+
37
+ ## macOS
38
+
39
+ ### インストール
40
+
41
+ **npm でインストール(推奨 — セキュリティ警告なし)** — Node.js 18 以上
42
+
43
+ ```sh
44
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
45
+ switcher
46
+ ```
47
+
48
+ `switcher` コマンドの初回実行時に最新のリリースビルドを自動でダウンロードします(2回目以降はすぐ起動します)。ブラウザ経由のダウンロードではないため、「開発元を確認できません」という警告は表示されません。アップデートするには、ウィジェットを終了して同じインストールコマンドをもう一度実行してください。
49
+
50
+ **直接ダウンロード** — [リリース](https://github.com/Youkamii/switcher/releases/latest)から `switcher-mac-arm64.zip` をダウンロードして展開し、`switcher.app` を実行します。Apple Silicon 専用 — Intel Mac は下記の[ソースからビルド](#ソースからビルド)でインストールしてください。
51
+
52
+ - コード署名がないため、初回起動時に「開発元を確認できません」とブロックされることがあります。システム設定 → プライバシーとセキュリティ の最下部に表示される **このまま開く** から実行してください。
53
+
54
+ ### 実行
55
+
56
+ - `switcher.app` を起動します。Dock や Cmd+Tab には現れず、メニューバー右側に W アイコンとして常駐します。
57
+ - ウィジェットはすべてのデスクトップ(Space)とフルスクリーンアプリの上にオーバーレイ表示されます。
58
+ - ウィンドウの表示と非表示はメニューバーの W アイコンを左クリックで切り替え、完全に終了するには右クリック → 終了。
59
+ - UI 言語の変更は**開発進行中** — 現在は韓国語で表示されます。
60
+ - 起動時に自動で立ち上げたい場合は、システム設定 → 一般 → ログイン項目 に `switcher.app` を追加してください。
61
+
62
+ ## ウィジェットの使い方(Windows・macOS 共通)
63
+
64
+ <table align="center">
65
+ <tr>
66
+ <td align="center" width="450">
67
+ <img src="docs/demo.gif" width="420" alt="ウィジェットモードのデモ — アカウントカードをダブルクリックで切り替え、空き領域のクリックは背後のウィンドウへ通過" />
68
+ </td>
69
+ <td width="430">
70
+
71
+ **ウィジェットモードの動作**
72
+
73
+ - アカウントカードを**ダブルクリック** → そのアカウントへ認証を切り替え
74
+ - カード外のクリック・ドラッグは**背後のウィンドウへそのまま通過**
75
+ - アクティブなアカウントは高い彩度で表示されます
76
+ - ウィンドウの移動は ☰ ハンドル、モードの切り替えは右上の Type ボタン
77
+ - Mac ではすべてのデスクトップ(Space)とフルスクリーンアプリの上でもオーバーレイ表示
78
+
79
+ </td>
80
+ </tr>
81
+ </table>
82
+
83
+ ## 概要
84
+
85
+ Claude Code でも Codex でも、ひとつのターミナルで使うときにログインできるアカウントはひとつだけです。複数アカウントを使い分けるユーザーは、上限に達するたびに `/login` をやり直し、ブラウザ認証をもう一度通し、いま自分がどのアカウントを使っているのかさえ分からなくなります。
86
+
87
+ switcher はこの手間をなくします。アカウントごとに最初の1回だけログインしておけば、以降はウィジェットのボタンひとつで切り替えられます。各アカウントの使用量(5時間・週間の上限)がバーで見えるので、余裕のあるアカウントを確認して乗り換えるだけです。
88
+
89
+ ## 機能
90
+
91
+ - アカウント切り替え: 再ログインなしでボタンひとつ。新しく開くターミナルから適用されます。
92
+ - 使用量表示: アカウントごとに 5 Hours / Weekly / モデル別の上限と、リセットまでの残り時間が確認できます。
93
+ - アカウント追加: ウィジェットに表示されるログインリンクからコードを発行して入力します。
94
+ - サブスクリプションレベル: アカウントの横に Max(5x は黄、20x は赤)/ Pro / Plus が表示されます。
95
+ - モード(Type1/2/3): フル → ウィジェット → コンパクトの順に循環。ウィジェット・コンパクトではボタンが隠れ、クリック・ドラッグは背後のウィンドウへ通過し、アカウントカードをダブルクリックすると切り替わります。ウィンドウの移動は ☰ ハンドル。
96
+ - ウィンドウの高さは内容に合わせて自動調整されます。透明度スライダーを下げると、まず背景が、次に枠組みが薄くなります。
97
+ - UI 言語: トレイ → 設定 → 言語 から6言語(韓国語・英語・日本語・簡体字中国語・繁体字中国語・ヒンディー語)を切り替え。macOS は開発進行中。
98
+ - 自動アップデート・起動時の自動実行・デスクトップショートカット(Windows): トレイの設定でオン/オフ。macOS は開発進行中。
99
+
100
+ ## 仕組み
101
+
102
+ どちらの CLI もログイントークンをローカルに保存します。
103
+
104
+ - Claude Code: `~/.claude/.credentials.json`(Windows)/ macOS は**キーチェーン**の「Claude Code-credentials」項目
105
+ - Codex CLI: `~/.codex/auth.json`(両 OS 共通)
106
+
107
+ Mac では、switcher は Claude CLI と同じ方法(macOS 内蔵の `security` ツール)でキーチェーンを読み書きします — 追加の権限ポップアップなしで動作します。
108
+
109
+ switcher はアカウントごとのトークンを `~/.switcher/` 配下のプロファイルとして保管し、切り替え時に2段階でファイルを入れ替えます。
110
+
111
+ 1. まず、現在アクティブなファイルを現在のアカウントのプロファイルへバックアップします。トークンは随時自動更新されるため、この手順が先でなければなりません。
112
+ 2. 対象アカウントのプロファイルをアクティブな場所へコピーします。
113
+
114
+ 注意: ターミナルで CLI セッションが動作中の場合は、終了してから切り替えるのが安全です。起動したままのセッションがトークンを自動更新してアクティブなファイルを書き戻すと、切り替えたばかりのアカウントが以前のアカウントのトークンで上書きされることがあります。
115
+
116
+ 会話履歴・メモリ・設定はアカウントとは無関係のローカルフォルダにあるため、アカウントを切り替えても作業環境はそのままです。
117
+
118
+ 使用量は、各アカウントのトークンで CLI が使う使用量 API を直接照会します。リクエスト制限を避けるため60秒のキャッシュを持ちます。照会に失敗した場合は直前の値を表示します。
119
+
120
+ Claude のアクセストークンは寿命が数時間しかないため、保管庫プロファイルのトークンが期限切れになると、ウィジェットが CLI と同じ方法で再発行してプロファイルに書き戻します — アプリ起動時に全体を一度、その後は照会時に必要なものだけ。これにより、使っていないアカウントの使用量も常にリアルタイムです。現在使用中のアカウントのトークンは CLI 自身が更新するため、ウィジェットは触りません。
121
+
122
+ アカウント追加は隔離ログインで処理します。
123
+
124
+ ## アカウント追加
125
+
126
+ ウィジェットの「+ アカウント追加」を押すとログイン用の URL が表示されます。その URL を好きなブラウザに貼り付けてください。
127
+
128
+ - **Claude**: ブラウザでログインすると画面にコードが表示されます。そのコードをウィジェットの入力欄に貼り付ければ完了です。
129
+ - **Codex**: ウィジェットに URL と一緒にワンタイムコード(15分間有効)が表示されます。ブラウザでそのコードを入力すれば、あとは自動です。
130
+
131
+ **Codex を初めて追加する前に**: デバイスコード認証は OpenAI アカウントでデフォルトで無効になっています。有効にしないと、コードを入力しても「デバイスコード認証を有効にしてから再実行してください」と拒否されます。
132
+
133
+ - 個人アカウント: chatgpt.com → プロフィール → 設定 → セキュリティ(またはデータコントロール)→ **Codex デバイスコード認証** を有効化
134
+ - チーム・ビジネスアカウント: 管理者がワークスペース設定 → 権限とロール から有効化
135
+
136
+ 補足: Claude CLI はログイン開始時にデフォルトブラウザを一度開こうとします。そのウィンドウは閉じても構いません。ウィジェットの URL を貼り付けたブラウザで進めれば大丈夫です。
137
+
138
+ ## 技術
139
+
140
+ Tauri 2 + Rust、フロントはバニラ TypeScript。アカウント切り替え・使用量照会・隔離ログインはすべて Rust 側で処理します。
141
+ WebView にトークンは渡されません。
142
+ CLI のログイン画面は仮想コンソール(PTY)で読み取ります。
143
+
144
+ ## ソースからビルド
145
+
146
+ ビルド済みを使う代わりにソースからビルドするには、[Node.js](https://nodejs.org) と [Rust](https://rustup.rs) のツールチェーンが必要です。
147
+
148
+ ```sh
149
+ git clone https://github.com/Youkamii/switcher.git
150
+ cd switcher
151
+ npm run setup
152
+ ```
153
+
154
+ `npm run setup` が依存関係のインストールとアプリのビルドをまとめて処理します。長々としたログを吐き出す代わりに、ローディング表示と経過時間だけを表示します。
155
+
156
+ 初回は Rust を丸ごとコンパイルするため **5〜10分かかることがあります。** ローディングが止まっているわけではないので、そのままお待ちください。成果物は Windows では `src-tauri\target\release\switcher.exe`、macOS では `src-tauri/target/release/bundle/macos/switcher.app` — アプリはアプリケーションフォルダへ移動しても構いません。
157
+
158
+ 開発実行は `npm run tauri dev`。
159
+
160
+ ---
161
+
162
+ <div align="center">
163
+ <sub>Licensed under the <a href="LICENSE">MIT License</a> — free for any use, including commercial. Keep the copyright and license notice.</sub>
164
+ </div>
package/README.md ADDED
@@ -0,0 +1,164 @@
1
+ <h1><img src="docs/logo.svg" width="26" alt="" /> switcher</h1>
2
+
3
+ **한국어** | [English](README.en.md) | [日本語](README.ja.md) | [简体中文](README.zh-CN.md) | [繁體中文](README.zh-TW.md) | [हिन्दी](README.hi.md)
4
+
5
+ Claude Code와 Codex CLI 계정을 버튼 하나로 갈아타는 데스크톱 위젯 (Windows·macOS).
6
+
7
+ <p align="center"><img src="docs/screenshot.png" alt="switcher — Type 1 / 2 / 3" /></p>
8
+ <p align="center"><sub>세 가지 보기 모드 — Type 1 (전체) · Type 2 (위젯) · Type 3 (컴팩트)</sub></p>
9
+
10
+ ## Windows
11
+
12
+ ### 설치
13
+
14
+ **npm으로 설치 (권장 — 보안 경고 없음)** — Node.js 18 이상
15
+
16
+ ```sh
17
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
18
+ switcher
19
+ ```
20
+
21
+ `switcher` 명령이 처음 실행될 때 최신 릴리스 빌드를 자동으로 받아온다(이후에는 바로 뜬다). 브라우저 다운로드가 아니라서 SmartScreen 경고가 뜨지 않는다. 업데이트는 자동이다 — 실행할 때마다 새 릴리스를 확인해 다음 실행부터 반영된다.
22
+
23
+ **직접 다운로드** — [릴리스](https://github.com/Youkamii/switcher/releases/latest)에서 `switcher-win-x64.zip`을 받아 압축을 풀고 `switcher.exe`를 실행. (Windows 10/11 64비트)
24
+
25
+ - 코드 서명이 없어서 처음 실행할 때 Windows SmartScreen이 "알 수 없는 게시자" 경고를 띄울 수 있다. `추가 정보` → `실행`.
26
+ - 웹뷰는 Windows에 기본 포함된 WebView2를 사용한다.
27
+
28
+ ### 실행
29
+
30
+ - 켜져 있는 동안은 트레이(작업표시줄 오른쪽)에 W 아이콘으로 상주한다. 창을 닫아도(Alt+F4) 꺼지지 않음.
31
+ - 창을 다시 활성화하려면 트레이의 W 아이콘을 좌클릭. 완전히 종료하려면 트레이 아이콘 우클릭 → 종료.
32
+ - UI 언어는 트레이 아이콘 우클릭 → 설정 → 언어에서 바꾼다 (한국어·English·日本語·简体中文·繁體中文·हिन्दी).
33
+ - 첫 실행 때 바탕화면에 `switcher` 바로가기가 자동으로 생긴다 (지우면 다시 만들지 않음).
34
+ - 부팅 시 자동 실행은 기본으로 켜져 있다 — 트레이 설정 → 부팅 시 자동 실행에서 끌 수 있다.
35
+ - 실행할 때마다 새 릴리스를 확인해 자동 업데이트한다 (다음 실행부터 반영) — 트레이 설정 → 자동 업데이트에서 끌 수 있다.
36
+
37
+ ## macOS
38
+
39
+ ### 설치
40
+
41
+ **npm으로 설치 (권장 — 보안 경고 없음)** — Node.js 18 이상
42
+
43
+ ```sh
44
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
45
+ switcher
46
+ ```
47
+
48
+ `switcher` 명령이 처음 실행될 때 최신 릴리스 빌드를 자동으로 받아온다(이후에는 바로 뜬다). 브라우저 다운로드가 아니라서 "확인되지 않은 개발자" 경고가 뜨지 않는다. 업데이트는 위젯을 끄고 같은 설치 명령을 다시 실행.
49
+
50
+ **직접 다운로드** — [릴리스](https://github.com/Youkamii/switcher/releases/latest)에서 `switcher-mac-arm64.zip`을 받아 압축을 풀고 `switcher.app`을 실행. Apple Silicon 전용 — 인텔 맥은 아래 [직접 빌드](#직접-빌드)로 설치.
51
+
52
+ - 코드 서명이 없어서 처음 열 때 "확인되지 않은 개발자"라며 막힐 수 있다. 시스템 설정 → 개인정보 보호 및 보안 맨 아래에 나타나는 **그래도 열기**로 실행.
53
+
54
+ ### 실행
55
+
56
+ - `switcher.app` 실행. Dock과 Cmd+Tab에는 나타나지 않고 메뉴바 오른쪽에 W 아이콘으로 상주.
57
+ - 위젯은 모든 데스크탑(Space)과 전체화면 앱 위에서 오버뷰로 표시된다.
58
+ - 창을 열고 숨기는 건 메뉴바 W 아이콘 좌클릭 토글, 완전히 종료하려면 우클릭 → 종료.
59
+ - UI 언어 변경은 **개발 진행중** — 현재는 한국어로 표시된다.
60
+ - 부팅할 때 자동으로 켜지게 하려면 시스템 설정 → 일반 → 로그인 항목에 `switcher.app`을 추가한다.
61
+
62
+ ## 위젯 사용법 (Windows·macOS 공통)
63
+
64
+ <table align="center">
65
+ <tr>
66
+ <td align="center" width="450">
67
+ <img src="docs/demo.gif" width="420" alt="위젯 모드 데모 — 계정 카드 더블클릭 전환, 빈 영역은 뒤 창으로 클릭 통과" />
68
+ </td>
69
+ <td width="430">
70
+
71
+ **위젯 모드 동작**
72
+
73
+ - 계정 카드를 **더블클릭** → 해당 계정으로 인증 전환
74
+ - 카드 밖 클릭·드래그는 **뒤 창으로 그대로 통과**
75
+ - 활성화된 계정은 높은 채도로 표시 됨
76
+ - 창 이동은 ☰ 핸들, 모드 순환은 오른쪽 위 Type 버튼
77
+ - 맥에서는 모든 데스크탑(Space)과 전체화면 앱 위에서도 오버뷰
78
+
79
+ </td>
80
+ </tr>
81
+ </table>
82
+
83
+ ## 개요
84
+
85
+ Claude Code든 Codex든 한 터미널에서 사용할 때, 한 계정만 로그인된다. 다계정 유저는 한도가 찰 때마다 `/login`을 다시 하고, 브라우저 인증을 다시 거치고, 지금 어느 계정을 쓰고 있는지도 헷갈린다.
86
+
87
+ switcher는 이 과정을 없앤다. 계정마다 처음 한 번만 로그인해 두면, 그다음부터는 위젯에서 버튼 한 번으로 전환된다. 각 계정의 사용량(5시간·주간 한도)이 막대로 보이니, 어느 계정에 여유가 있는지 보고 갈아타면 된다.
88
+
89
+ ## 기능
90
+
91
+ - 계정 전환: 재로그인 없이 버튼 한 번. 새로 여는 터미널부터 적용된다.
92
+ - 사용량 표시: 계정마다 5 Hours / Weekly / 모델별 한도와 리셋까지 남은 시간이 보인다.
93
+ - 계정 추가: 위젯에 표시되는 로그인 링크에서 코드 발급 후 입력한다.
94
+ - 구독 레벨: 계정 옆에 Max(5x는 노랑, 20x는 빨강) / Pro / Plus가 붙는다.
95
+ - 모드(Type1/2/3): 전체 → 위젯 → 컴팩트 순환. 위젯·컴팩트에서는 버튼이 숨고 클릭·드래그가 뒤 창으로 통과하며, 계정 카드를 더블클릭하면 전환된다. 창 이동은 ☰ 핸들.
96
+ - 창 높이는 내용에 맞춰 자동 조절된다. 투명도 슬라이더를 내리면 배경이 먼저, 골조가 나중에 옅어진다.
97
+ - UI 언어: 트레이 → 설정 → 언어에서 6개 언어(한국어·영어·일본어·간체중문·번체중문·힌디) 전환. macOS는 개발 진행중.
98
+ - 자동 업데이트·부팅 시 자동 실행·바탕화면 바로가기 (Windows): 트레이 설정에서 켜고 끈다. macOS는 개발 진행중.
99
+
100
+ ## 동작
101
+
102
+ 두 CLI 모두 로그인 토큰을 로컬에 저장한다.
103
+
104
+ - Claude Code: `~/.claude/.credentials.json` (Windows) / macOS는 **키체인**의 "Claude Code-credentials" 항목
105
+ - Codex CLI: `~/.codex/auth.json` (두 OS 동일)
106
+
107
+ 맥에서 switcher는 클로드 CLI와 같은 방식(macOS 내장 `security` 도구)으로 키체인을 읽고 쓴다 — 별도 권한 팝업 없이 동작한다.
108
+
109
+ switcher는 계정별 토큰을 `~/.switcher/` 아래 프로필로 보관하고 전환할 때 두 단계로 파일을 교체한다.
110
+
111
+ 1. 지금 활성 파일을 현재 계정 프로필에 백업한다. 토큰이 수시로 자동 갱신되므로 이 순서가 먼저여야 한다.
112
+ 2. 대상 계정 프로필을 활성 위치로 복사한다.
113
+
114
+ 주의: 터미널에서 CLI 세션이 돌아가는 중이라면 끝내고 전환하는 게 안전하다. 켜둔 세션이 토큰을 자동 갱신하면서 활성 파일을 다시 쓰면, 방금 전환한 계정이 이전 계정 토큰으로 덮일 수 있다.
115
+
116
+ 대화 기록·메모리·설정은 계정과 무관한 로컬 폴더에 있어서 계정을 바꿔도 작업 환경은 그대로다.
117
+
118
+ 사용량은 각 계정의 토큰으로 CLI가 쓰는 사용량 API를 직접 조회한다. 요청 제한을 피하려고 60초 캐시를 둔다. 조회가 막히면 직전 값을 보여준다.
119
+
120
+ 클로드 액세스 토큰은 수명이 몇 시간뿐이라, 보관함 프로필의 토큰이 만료되면 위젯이 CLI와 같은 방식으로 재발급해 프로필에 되쓴다 — 앱을 켤 때 한 번 전체를, 이후엔 조회할 때 필요한 것만. 그래서 안 쓰는 계정의 사용량도 계속 실시간이다. 지금 쓰는 계정의 토큰은 CLI가 스스로 갱신하므로 위젯이 건드리지 않는다.
121
+
122
+ 계정 추가는 격리 로그인으로 처리한다.
123
+
124
+ ## 계정 추가
125
+
126
+ 위젯의 "+ 계정 추가"를 누르면 로그인 주소가 나온다. 그 주소를 원하는 브라우저에 붙여넣는다.
127
+
128
+ - **Claude**: 브라우저에서 로그인하면 화면에 코드가 나온다. 그 코드를 위젯 입력칸에 붙여넣으면 끝.
129
+ - **Codex**: 위젯에 주소와 함께 일회용 코드(15분 유효)가 뜬다. 브라우저에서 그 코드를 입력하면 나머지는 자동이다.
130
+
131
+ **Codex를 처음 추가하기 전에**: 장치 코드 인증이 OpenAI 계정에서 기본으로 꺼져 있다. 켜지 않으면 코드를 입력해도 "장치 코드 인증을 활성화한 뒤 다시 실행하세요"라며 거부된다.
132
+
133
+ - 개인 계정: chatgpt.com → 프로필 → 설정 → 보안(또는 데이터 제어) → **Codex 장치 코드 인증** 켜기
134
+ - 팀·비즈니스 계정: 관리자가 워크스페이스 설정 → 권한 및 역할에서 활성화
135
+
136
+ 참고: Claude CLI는 로그인을 시작할 때 기본 브라우저를 한 번 열려고 한다. 그 창은 닫아도 되고, 위젯의 주소를 붙여넣은 브라우저에서 진행하면 된다.
137
+
138
+ ## 기술
139
+
140
+ Tauri 2 + Rust, 프론트는 바닐라 TypeScript. 계정 전환·사용량 조회·격리 로그인은 전부 Rust에서 처리한다.
141
+ 웹뷰에는 토큰이 올라가지 않는다.
142
+ CLI 로그인 화면은 가상 콘솔(PTY)로 읽는다.
143
+
144
+ ## 직접 빌드
145
+
146
+ 받아서 쓰는 대신 소스에서 빌드하려면 [Node.js](https://nodejs.org)와 [Rust](https://rustup.rs) 툴체인이 필요하다.
147
+
148
+ ```sh
149
+ git clone https://github.com/Youkamii/switcher.git
150
+ cd switcher
151
+ npm run setup
152
+ ```
153
+
154
+ `npm run setup`이 의존성 설치와 앱 빌드를 한 번에 처리한다. 장황한 로그를 쏟아내는 대신 로딩 표시와 경과 시간만 보여준다.
155
+
156
+ 처음에는 Rust를 통째로 컴파일하기 때문에 **5~10분 걸릴 수 있다.** 로딩이 멈춘 게 아니니 기다리면 된다. 결과물은 Windows `src-tauri\target\release\switcher.exe`, macOS `src-tauri/target/release/bundle/macos/switcher.app` — 앱을 응용 프로그램 폴더로 옮겨도 된다.
157
+
158
+ 개발 실행은 `npm run tauri dev`.
159
+
160
+ ---
161
+
162
+ <div align="center">
163
+ <sub>Licensed under the <a href="LICENSE">MIT License</a> — free for any use, including commercial. Keep the copyright and license notice.</sub>
164
+ </div>
@@ -0,0 +1,164 @@
1
+ <h1><img src="docs/logo.svg" width="26" alt="" /> switcher</h1>
2
+
3
+ [한국어](README.md) | [English](README.en.md) | [日本語](README.ja.md) | **简体中文** | [繁體中文](README.zh-TW.md) | [हिन्दी](README.hi.md)
4
+
5
+ 一键切换 Claude Code 与 Codex CLI 账号的桌面小组件(Windows·macOS)。
6
+
7
+ <p align="center"><img src="docs/screenshot.png" alt="switcher — Type 1 / 2 / 3" /></p>
8
+ <p align="center"><sub>三种视图模式 — Type 1(完整)· Type 2(小组件)· Type 3(紧凑)</sub></p>
9
+
10
+ ## Windows
11
+
12
+ ### 安装
13
+
14
+ **通过 npm 安装(推荐 — 无安全警告)** — 需要 Node.js 18 及以上
15
+
16
+ ```sh
17
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
18
+ switcher
19
+ ```
20
+
21
+ `switcher` 命令首次运行时会自动下载最新的发布版构建(之后会直接启动)。由于不是通过浏览器下载,不会触发 SmartScreen 警告。更新是自动的 — 每次启动都会检查新版本,下次启动生效。
22
+
23
+ **直接下载** — 从[发布页](https://github.com/Youkamii/switcher/releases/latest)下载 `switcher-win-x64.zip`,解压后运行 `switcher.exe`。(Windows 10/11 64 位)
24
+
25
+ - 由于没有代码签名,首次运行时 Windows SmartScreen 可能会弹出“未知发布者”警告。点击 `更多信息` → `仍要运行`。
26
+ - 网页视图使用 Windows 自带的 WebView2。
27
+
28
+ ### 运行
29
+
30
+ - 运行期间会以 W 图标常驻托盘(任务栏右侧)。即使关闭窗口(Alt+F4)也不会退出。
31
+ - 左键点击托盘的 W 图标可重新唤出窗口。要完全退出,右键点击托盘图标 → 退出。
32
+ - UI 语言可在右键点击托盘图标 → 设置 → 语言中切换(한국어·English·日本語·简体中文·繁體中文·हिन्दी)。
33
+ - 首次运行时会自动在桌面创建 `switcher` 快捷方式(删除后不会重新创建)。
34
+ - 开机自启动默认开启 — 可在托盘 设置 → 开机自启动 中关闭。
35
+ - 每次启动都会检查新版本并自动更新(下次启动生效)— 可在托盘 设置 → 自动更新 中关闭。
36
+
37
+ ## macOS
38
+
39
+ ### 安装
40
+
41
+ **通过 npm 安装(推荐 — 无安全警告)** — 需要 Node.js 18 及以上
42
+
43
+ ```sh
44
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
45
+ switcher
46
+ ```
47
+
48
+ `switcher` 命令首次运行时会自动下载最新的发布版构建(之后会直接启动)。由于不是通过浏览器下载,不会触发“无法验证开发者”警告。更新时先退出小组件,再重新执行同一条安装命令即可。
49
+
50
+ **直接下载** — 从[发布页](https://github.com/Youkamii/switcher/releases/latest)下载 `switcher-mac-arm64.zip`,解压后运行 `switcher.app`。仅支持 Apple Silicon — Intel Mac 请通过下方的[从源码构建](#从源码构建)安装。
51
+
52
+ - 由于没有代码签名,首次打开时可能会提示“无法验证开发者”而被拦截。前往 系统设置 → 隐私与安全性,在页面最底部点击**仍要打开**即可运行。
53
+
54
+ ### 运行
55
+
56
+ - 运行 `switcher.app`。它不会出现在 Dock 和 Cmd+Tab 中,而是以 W 图标常驻菜单栏右侧。
57
+ - 小组件会悬浮显示在所有桌面(Space)和全屏应用之上。
58
+ - 左键点击菜单栏的 W 图标可切换窗口的打开/隐藏,要完全退出,右键点击 → 退出。
59
+ - UI 语言切换功能**开发中** — 目前以韩语显示。
60
+ - 要开机自启,前往 系统设置 → 通用 → 登录项,添加 `switcher.app`。
61
+
62
+ ## 小组件使用方法(Windows·macOS 通用)
63
+
64
+ <table align="center">
65
+ <tr>
66
+ <td align="center" width="450">
67
+ <img src="docs/demo.gif" width="420" alt="小组件模式演示 — 双击账号卡片切换,空白区域点击穿透到后方窗口" />
68
+ </td>
69
+ <td width="430">
70
+
71
+ **小组件模式的行为**
72
+
73
+ - **双击**账号卡片 → 切换到该账号的认证
74
+ - 卡片以外的点击·拖拽会**直接穿透到后方窗口**
75
+ - 当前激活的账号以高饱和度显示
76
+ - 移动窗口用 ☰ 手柄,循环切换模式用右上角的 Type 按钮
77
+ - 在 Mac 上还会悬浮显示在所有桌面(Space)和全屏应用之上
78
+
79
+ </td>
80
+ </tr>
81
+ </table>
82
+
83
+ ## 概述
84
+
85
+ 无论 Claude Code 还是 Codex,在同一个终端里都只能登录一个账号。多账号用户每当额度用满,就得重新 `/login`、重新走一遍浏览器认证,还常常搞不清当前用的是哪个账号。
86
+
87
+ switcher 省掉了这个过程。每个账号只需首次登录一次,之后在小组件里点一下按钮即可切换。各账号的用量(5 小时·每周额度)以进度条显示,看哪个账号还有余量,切换过去就行。
88
+
89
+ ## 功能
90
+
91
+ - 账号切换:无需重新登录,一键完成。从新打开的终端开始生效。
92
+ - 用量显示:每个账号都能看到 5 Hours / Weekly / 各模型的额度,以及距离重置的剩余时间。
93
+ - 添加账号:通过小组件中显示的登录链接获取代码后输入即可。
94
+ - 订阅级别:账号旁会标注 Max(5x 为黄色,20x 为红色)/ Pro / Plus。
95
+ - 模式(Type1/2/3):按完整 → 小组件 → 紧凑循环切换。在小组件·紧凑模式下按钮会隐藏,点击·拖拽穿透到后方窗口,双击账号卡片即可切换账号。移动窗口用 ☰ 手柄。
96
+ - 窗口高度会根据内容自动调节。调低透明度滑块时,背景先变淡,框架随后变淡。
97
+ - UI 语言:在托盘 → 设置 → 语言中可切换 6 种语言(韩语·英语·日语·简体中文·繁体中文·印地语)。macOS 版开发中。
98
+ - 自动更新·开机自启动·桌面快捷方式(Windows):在托盘设置中开关。macOS 版开发中。
99
+
100
+ ## 工作原理
101
+
102
+ 两个 CLI 都把登录令牌保存在本地。
103
+
104
+ - Claude Code:`~/.claude/.credentials.json`(Windows)/ macOS 为**钥匙串**中的 “Claude Code-credentials” 条目
105
+ - Codex CLI:`~/.codex/auth.json`(两个系统相同)
106
+
107
+ 在 Mac 上,switcher 以与 Claude CLI 相同的方式(macOS 内置的 `security` 工具)读写钥匙串 — 无需额外的权限弹窗即可工作。
108
+
109
+ switcher 把各账号的令牌以配置文件形式保存在 `~/.switcher/` 下,切换时分两步替换文件。
110
+
111
+ 1. 先把当前活动文件备份到当前账号的配置文件中。由于令牌会随时自动刷新,这一步必须在前。
112
+ 2. 再把目标账号的配置文件复制到活动位置。
113
+
114
+ 注意:如果终端里还有 CLI 会话在运行,建议先结束再切换。留着的会话在自动刷新令牌时会重写活动文件,刚切换好的账号可能被旧账号的令牌覆盖。
115
+
116
+ 对话记录·记忆·设置都存放在与账号无关的本地文件夹里,切换账号后工作环境保持不变。
117
+
118
+ 用量通过各账号的令牌直接查询 CLI 所用的用量 API。为避免触发请求限制,设有 60 秒缓存。查询失败时显示上一次的值。
119
+
120
+ Claude 的访问令牌寿命只有几个小时,因此当保管的配置文件中的令牌过期时,小组件会以与 CLI 相同的方式重新签发并写回配置文件 — 启动应用时全部刷新一次,之后仅在查询时按需刷新。所以未使用账号的用量也始终保持实时。当前使用中账号的令牌由 CLI 自行刷新,小组件不会去动它。
121
+
122
+ 添加账号通过隔离登录处理。
123
+
124
+ ## 添加账号
125
+
126
+ 点击小组件中的“+ 添加账号”会显示登录地址。把该地址粘贴到任意浏览器中。
127
+
128
+ - **Claude**:在浏览器中登录后,页面上会显示一个代码。把它粘贴到小组件的输入框即可。
129
+ - **Codex**:小组件会显示地址和一次性代码(15 分钟有效)。在浏览器中输入该代码,剩下的会自动完成。
130
+
131
+ **首次添加 Codex 之前**:设备代码认证在 OpenAI 账号中默认是关闭的。若不开启,即使输入代码也会被拒绝,提示“请先启用设备代码认证后重试”。
132
+
133
+ - 个人账号:chatgpt.com → 个人资料 → 设置 → 安全(或数据控制)→ 开启 **Codex 设备代码认证**
134
+ - 团队·企业账号:由管理员在工作区设置 → 权限与角色中启用
135
+
136
+ 备注:Claude CLI 在开始登录时会尝试打开一次默认浏览器。那个窗口可以直接关掉,在粘贴了小组件地址的浏览器中继续即可。
137
+
138
+ ## 技术
139
+
140
+ Tauri 2 + Rust,前端为原生 TypeScript(vanilla)。账号切换·用量查询·隔离登录全部在 Rust 中处理。
141
+ 令牌不会进入网页视图。
142
+ CLI 的登录界面通过虚拟控制台(PTY)读取。
143
+
144
+ ## 从源码构建
145
+
146
+ 如果不想直接下载而是从源码构建,需要 [Node.js](https://nodejs.org) 和 [Rust](https://rustup.rs) 工具链。
147
+
148
+ ```sh
149
+ git clone https://github.com/Youkamii/switcher.git
150
+ cd switcher
151
+ npm run setup
152
+ ```
153
+
154
+ `npm run setup` 一次完成依赖安装和应用构建。它不会刷出冗长的日志,只显示加载指示和已用时间。
155
+
156
+ 首次构建需要完整编译 Rust,**可能耗时 5~10 分钟。** 加载并没有卡住,耐心等待即可。产物为 Windows `src-tauri\target\release\switcher.exe`、macOS `src-tauri/target/release/bundle/macos/switcher.app` — 也可以把应用移动到“应用程序”文件夹。
157
+
158
+ 开发运行使用 `npm run tauri dev`。
159
+
160
+ ---
161
+
162
+ <div align="center">
163
+ <sub>Licensed under the <a href="LICENSE">MIT License</a> — free for any use, including commercial. Keep the copyright and license notice.</sub>
164
+ </div>
@@ -0,0 +1,164 @@
1
+ <h1><img src="docs/logo.svg" width="26" alt="" /> switcher</h1>
2
+
3
+ [한국어](README.md) | [English](README.en.md) | [日本語](README.ja.md) | [简体中文](README.zh-CN.md) | **繁體中文** | [हिन्दी](README.hi.md)
4
+
5
+ 一鍵切換 Claude Code 與 Codex CLI 帳號的桌面小工具(Windows·macOS)。
6
+
7
+ <p align="center"><img src="docs/screenshot.png" alt="switcher — Type 1 / 2 / 3" /></p>
8
+ <p align="center"><sub>三種檢視模式 — Type 1(完整)· Type 2(小工具)· Type 3(精簡)</sub></p>
9
+
10
+ ## Windows
11
+
12
+ ### 安裝
13
+
14
+ **以 npm 安裝(建議 — 無安全性警告)** — 需 Node.js 18 以上
15
+
16
+ ```sh
17
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
18
+ switcher
19
+ ```
20
+
21
+ 第一次執行 `switcher` 指令時,會自動下載最新發行版本的建置檔(之後就會直接啟動)。因為不是透過瀏覽器下載,所以不會出現 SmartScreen 警告。更新是自動的 — 每次啟動都會檢查新版本,下次啟動生效。
22
+
23
+ **直接下載** — 從[發行版本](https://github.com/Youkamii/switcher/releases/latest)下載 `switcher-win-x64.zip`,解壓縮後執行 `switcher.exe`。(Windows 10/11 64 位元)
24
+
25
+ - 因為沒有程式碼簽章,第一次執行時 Windows SmartScreen 可能會顯示「未知的發行者」警告。點選 `其他資訊` → `仍要執行`。
26
+ - WebView 使用 Windows 內建的 WebView2。
27
+
28
+ ### 執行
29
+
30
+ - 執行期間會以 W 圖示常駐在系統匣(工作列右側)。即使關閉視窗(Alt+F4)也不會結束。
31
+ - 要重新叫出視窗,左鍵點擊系統匣的 W 圖示;要完全結束,右鍵點擊系統匣圖示 → 結束。
32
+ - UI 語言可在右鍵點擊系統匣圖示 → 設定 → 語言中切換(한국어·English·日本語·简体中文·繁體中文·हिन्दी)。
33
+ - 首次執行時會自動在桌面建立 `switcher` 捷徑(刪除後不會重新建立)。
34
+ - 開機自動啟動預設開啟 — 可在系統匣 設定 → 開機自動啟動 中關閉。
35
+ - 每次啟動都會檢查新版本並自動更新(下次啟動生效) — 可在系統匣 設定 → 自動更新 中關閉。
36
+
37
+ ## macOS
38
+
39
+ ### 安裝
40
+
41
+ **以 npm 安裝(建議 — 無安全性警告)** — 需 Node.js 18 以上
42
+
43
+ ```sh
44
+ npm install -g https://github.com/Youkamii/switcher/releases/latest/download/switcher-npm.tgz
45
+ switcher
46
+ ```
47
+
48
+ 第一次執行 `switcher` 指令時,會自動下載最新發行版本的建置檔(之後就會直接啟動)。因為不是透過瀏覽器下載,所以不會出現「未識別的開發者」警告。要更新時,先結束小工具,再重新執行同一個安裝指令即可。
49
+
50
+ **直接下載** — 從[發行版本](https://github.com/Youkamii/switcher/releases/latest)下載 `switcher-mac-arm64.zip`,解壓縮後執行 `switcher.app`。僅支援 Apple Silicon — Intel Mac 請改用下方的[從原始碼建置](#從原始碼建置)安裝。
51
+
52
+ - 因為沒有程式碼簽章,第一次打開時可能會以「未識別的開發者」為由被擋下。請到系統設定 → 隱私權與安全性,點擊最下方出現的**強制打開**來執行。
53
+
54
+ ### 執行
55
+
56
+ - 執行 `switcher.app`。它不會出現在 Dock 與 Cmd+Tab,而是以 W 圖示常駐在選單列右側。
57
+ - 小工具會覆疊顯示在所有桌面(Space)與全螢幕 App 之上。
58
+ - 左鍵點擊選單列的 W 圖示可切換視窗的開啟/隱藏;要完全結束,右鍵點擊 → 結束。
59
+ - UI 語言切換**開發中** — 目前僅以韓文顯示。
60
+ - 若要開機自動啟動,請到系統設定 → 一般 → 登入項目加入 `switcher.app`。
61
+
62
+ ## 小工具使用方式(Windows·macOS 通用)
63
+
64
+ <table align="center">
65
+ <tr>
66
+ <td align="center" width="450">
67
+ <img src="docs/demo.gif" width="420" alt="小工具模式示範 — 雙擊帳號卡片即切換,空白區域的點擊會穿透到後方視窗" />
68
+ </td>
69
+ <td width="430">
70
+
71
+ **小工具模式的運作**
72
+
73
+ - **雙擊**帳號卡片 → 切換為該帳號的認證
74
+ - 卡片以外的點擊與拖曳會**直接穿透到後方視窗**
75
+ - 目前啟用的帳號會以較高的飽和度顯示
76
+ - 移動視窗用 ☰ 把手,切換模式用右上角的 Type 按鈕
77
+ - 在 Mac 上也會覆疊顯示在所有桌面(Space)與全螢幕 App 之上
78
+
79
+ </td>
80
+ </tr>
81
+ </table>
82
+
83
+ ## 概觀
84
+
85
+ 不論是 Claude Code 還是 Codex,在同一部終端機裡一次只能登入一個帳號。擁有多個帳號的使用者每次額度用滿,就得重新 `/login`、重新走一次瀏覽器認證,還常常搞不清楚現在用的是哪個帳號。
86
+
87
+ switcher 把這整段流程省掉。每個帳號只要最初登入一次,之後在小工具裡按一個按鈕就能切換。各帳號的用量(5 小時·每週額度)以長條顯示,看哪個帳號還有餘裕,換過去就行。
88
+
89
+ ## 功能
90
+
91
+ - 帳號切換:免重新登入,一鍵完成。從新開啟的終端機開始生效。
92
+ - 用量顯示:每個帳號都能看到 5 Hours / Weekly / 各模型的額度,以及距離重置的剩餘時間。
93
+ - 新增帳號:透過小工具顯示的登入連結取得代碼後輸入即可。
94
+ - 訂閱等級:帳號旁會標示 Max(5x 為黃色、20x 為紅色)/ Pro / Plus。
95
+ - 模式(Type1/2/3):依完整 → 小工具 → 精簡循環切換。在小工具與精簡模式下按鈕會隱藏,點擊與拖曳會穿透到後方視窗,雙擊帳號卡片即可切換帳號。移動視窗用 ☰ 把手。
96
+ - 視窗高度會依內容自動調整。調低透明度滑桿時,背景會先變淡,框架其後才變淡。
97
+ - UI 語言:在系統匣 → 設定 → 語言中可切換 6 種語言(韓文、英文、日文、簡體中文、繁體中文、印地文)。macOS 版開發中。
98
+ - 自動更新、開機自動啟動、桌面捷徑(Windows):在系統匣設定中開關。macOS 版開發中。
99
+
100
+ ## 運作方式
101
+
102
+ 兩個 CLI 都把登入權杖儲存在本機。
103
+
104
+ - Claude Code:`~/.claude/.credentials.json`(Windows)/ macOS 則是**鑰匙圈**中的「Claude Code-credentials」項目
105
+ - Codex CLI:`~/.codex/auth.json`(兩個作業系統相同)
106
+
107
+ 在 Mac 上,switcher 以與 Claude CLI 相同的方式(macOS 內建的 `security` 工具)讀寫鑰匙圈 — 不會跳出額外的權限視窗。
108
+
109
+ switcher 把各帳號的權杖以設定檔形式保存在 `~/.switcher/` 之下,切換時分兩個步驟替換檔案。
110
+
111
+ 1. 先把目前的作用中檔案備份到現在這個帳號的設定檔。權杖會隨時自動更新,所以這一步必須在前。
112
+ 2. 再把目標帳號的設定檔複製到作用中位置。
113
+
114
+ 注意:如果終端機裡還有 CLI 工作階段在執行,先結束再切換比較安全。留著的工作階段在自動更新權杖時會重寫作用中檔案,剛切換好的帳號可能因此被前一個帳號的權杖蓋掉。
115
+
116
+ 對話紀錄、記憶與設定都放在與帳號無關的本機資料夾,所以就算切換帳號,工作環境也維持原樣。
117
+
118
+ 用量是以各帳號的權杖直接查詢 CLI 所使用的用量 API。為了避免觸發請求限制,設有 60 秒快取。查詢被擋下時,會顯示前一次的數值。
119
+
120
+ Claude 的存取權杖壽命只有幾個小時,所以當保管庫設定檔裡的權杖過期時,小工具會以與 CLI 相同的方式重新取得並寫回設定檔 — 啟動 App 時整批更新一次,之後只在查詢時更新需要的部分。因此就連沒在用的帳號,用量也始終是即時的。目前使用中帳號的權杖由 CLI 自行更新,小工具不會去動它。
121
+
122
+ 新增帳號則以隔離登入處理。
123
+
124
+ ## 新增帳號
125
+
126
+ 按下小工具的「+ 新增帳號」就會出現登入網址。把該網址貼到你想用的瀏覽器。
127
+
128
+ - **Claude**:在瀏覽器完成登入後,畫面上會出現一組代碼。把代碼貼到小工具的輸入欄就完成了。
129
+ - **Codex**:小工具會連同網址一起顯示一組一次性代碼(15 分鐘內有效)。在瀏覽器輸入該代碼後,其餘步驟會自動完成。
130
+
131
+ **第一次新增 Codex 之前**:裝置代碼認證在 OpenAI 帳號中預設是關閉的。若未開啟,即使輸入代碼也會被以「請先啟用裝置代碼認證後再重試」為由拒絕。
132
+
133
+ - 個人帳號:chatgpt.com → 個人檔案 → 設定 → 安全性(或資料控制)→ 開啟 **Codex 裝置代碼認證**
134
+ - 團隊·企業帳號:由管理員在工作區設定 → 權限與角色中啟用
135
+
136
+ 附註:Claude CLI 在開始登入時會嘗試打開一次預設瀏覽器。那個視窗關掉也沒關係,直接在貼上小工具網址的瀏覽器裡進行即可。
137
+
138
+ ## 技術
139
+
140
+ Tauri 2 + Rust,前端為 vanilla TypeScript。帳號切換、用量查詢與隔離登入全部在 Rust 端處理。
141
+ 權杖不會進入 WebView。
142
+ CLI 的登入畫面透過虛擬主控台(PTY)讀取。
143
+
144
+ ## 從原始碼建置
145
+
146
+ 若不想直接下載,而想從原始碼自行建置,需要 [Node.js](https://nodejs.org) 與 [Rust](https://rustup.rs) 工具鏈。
147
+
148
+ ```sh
149
+ git clone https://github.com/Youkamii/switcher.git
150
+ cd switcher
151
+ npm run setup
152
+ ```
153
+
154
+ `npm run setup` 會一次完成相依套件安裝與 App 建置。它不會傾倒冗長的記錄,只顯示載入指示與經過時間。
155
+
156
+ 第一次會完整編譯 Rust,因此**可能需要 5~10 分鐘。**這不是載入卡住了,耐心等候即可。產出物在 Windows 為 `src-tauri\target\release\switcher.exe`,macOS 為 `src-tauri/target/release/bundle/macos/switcher.app` — 也可以把 App 移到應用程式資料夾。
157
+
158
+ 開發模式執行請用 `npm run tauri dev`。
159
+
160
+ ---
161
+
162
+ <div align="center">
163
+ <sub>Licensed under the <a href="LICENSE">MIT License</a> — free for any use, including commercial. Keep the copyright and license notice.</sub>
164
+ </div>
package/package.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "switcher-widget",
3
+ "version": "1.1.0",
4
+ "description": "Desktop widget that switches between multiple Claude Code / Codex CLI accounts in one click, with per-account usage bars (Windows/macOS)",
5
+ "license": "MIT",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/Youkamii/switcher.git"
9
+ },
10
+ "homepage": "https://github.com/Youkamii/switcher#readme",
11
+ "keywords": [
12
+ "claude-code",
13
+ "codex",
14
+ "account-switcher",
15
+ "widget",
16
+ "tauri",
17
+ "cli"
18
+ ],
19
+ "engines": {
20
+ "node": ">=18"
21
+ },
22
+ "files": [
23
+ "scripts/launch.mjs",
24
+ "scripts/dist.mjs"
25
+ ],
26
+ "type": "module",
27
+ "bin": {
28
+ "switcher": "scripts/launch.mjs"
29
+ },
30
+ "scripts": {
31
+ "setup": "node scripts/setup.mjs",
32
+ "dev": "vite",
33
+ "build": "tsc && vite build",
34
+ "preview": "vite preview",
35
+ "tauri": "tauri"
36
+ },
37
+ "dependencies": {
38
+ "@tauri-apps/api": "^2"
39
+ },
40
+ "devDependencies": {
41
+ "@tauri-apps/cli": "^2",
42
+ "typescript": "~5.6.2",
43
+ "vite": "^6.0.3"
44
+ }
45
+ }
@@ -0,0 +1,96 @@
1
+ // npm 설치본이 쓰는 빌드 내려받기 공용 모듈.
2
+ // GitHub 릴리스에서 OS에 맞는 zip을 받아 패키지 안(bin-dist/)에 풀어둔다.
3
+ // 브라우저를 거치지 않으므로 격리(quarantine)·SmartScreen 딱지가 붙지 않는다.
4
+ import { spawnSync } from "node:child_process";
5
+ import fs from "node:fs";
6
+ import os from "node:os";
7
+ import path from "node:path";
8
+ import { fileURLToPath } from "node:url";
9
+
10
+ const ROOT = path.dirname(path.dirname(fileURLToPath(import.meta.url)));
11
+ const DIST = path.join(ROOT, "bin-dist");
12
+
13
+ const ASSETS = {
14
+ "darwin-arm64": { zip: "switcher-mac-arm64.zip", entry: "switcher.app" },
15
+ "win32-x64": { zip: "switcher-win-x64.zip", entry: "switcher.exe" },
16
+ // 윈도우 ARM은 x64 에뮬레이션으로 돈다
17
+ "win32-arm64": { zip: "switcher-win-x64.zip", entry: "switcher.exe" },
18
+ };
19
+
20
+ export function platformAsset() {
21
+ return ASSETS[`${process.platform}-${process.arch}`] ?? null;
22
+ }
23
+
24
+ /// 설치된 실행 대상 경로 (없으면 null)
25
+ export function installedEntry() {
26
+ const asset = platformAsset();
27
+ if (!asset) return null;
28
+ const entry = path.join(DIST, asset.entry);
29
+ return fs.existsSync(entry) ? entry : null;
30
+ }
31
+
32
+ async function download(url, dest) {
33
+ const res = await fetch(url, { redirect: "follow" });
34
+ if (!res.ok) return false;
35
+ fs.writeFileSync(dest, Buffer.from(await res.arrayBuffer()));
36
+ return true;
37
+ }
38
+
39
+ function extract(zip, dir) {
40
+ // 맥은 ditto가 서명·심볼릭 링크를 온전히 보존한다.
41
+ if (process.platform === "darwin") {
42
+ return spawnSync("ditto", ["-xk", zip, dir], { stdio: "ignore" }).status === 0;
43
+ }
44
+ // 윈도우는 내장 tar(bsdtar)가 zip을 푼다. 단 PATH의 "tar"는 Git Bash에서
45
+ // GNU tar(zip 해제 불가)로 잡혀 첫 실행이 죽는다 — System32의 bsdtar를
46
+ // 절대 경로로 지정해 어느 셸에서 실행해도 같은 도구를 쓴다.
47
+ const sysTar = path.join(
48
+ process.env.SystemRoot ?? "C:\\Windows",
49
+ "System32",
50
+ "tar.exe",
51
+ );
52
+ const tar = fs.existsSync(sysTar) ? sysTar : "tar";
53
+ return spawnSync(tar, ["-xf", zip, "-C", dir], { stdio: "ignore" }).status === 0;
54
+ }
55
+
56
+ /// 빌드가 없으면 릴리스에서 받아온다. 성공하면 실행 대상 경로를 돌려준다.
57
+ export async function ensureDist() {
58
+ const asset = platformAsset();
59
+ if (!asset) {
60
+ throw new Error(
61
+ `이 플랫폼(${process.platform}-${process.arch})용 빌드가 없습니다 — 소스 빌드(npm run setup)를 사용하세요`,
62
+ );
63
+ }
64
+ const existing = installedEntry();
65
+ if (existing) return existing;
66
+
67
+ if (typeof fetch !== "function") {
68
+ throw new Error("Node 18 이상이 필요합니다 — node를 업데이트하세요");
69
+ }
70
+ const version = JSON.parse(
71
+ fs.readFileSync(path.join(ROOT, "package.json"), "utf8"),
72
+ ).version;
73
+ // 패키지 버전과 같은 릴리스를 먼저, 없으면(방금 버전만 올린 사이) 최신 릴리스를 받는다
74
+ const urls = [
75
+ `https://github.com/Youkamii/switcher/releases/download/v${version}/${asset.zip}`,
76
+ `https://github.com/Youkamii/switcher/releases/latest/download/${asset.zip}`,
77
+ ];
78
+ fs.mkdirSync(DIST, { recursive: true });
79
+ const tmp = path.join(os.tmpdir(), `switcher-${process.pid}-${asset.zip}`);
80
+ try {
81
+ let got = false;
82
+ for (const url of urls) {
83
+ if (await download(url, tmp)) {
84
+ got = true;
85
+ break;
86
+ }
87
+ }
88
+ if (!got) throw new Error("릴리스 다운로드에 실패했습니다 — 네트워크를 확인하세요");
89
+ if (!extract(tmp, DIST)) throw new Error("압축 해제에 실패했습니다");
90
+ } finally {
91
+ fs.rmSync(tmp, { force: true });
92
+ }
93
+ const entry = installedEntry();
94
+ if (!entry) throw new Error("압축 해제 결과에 실행 파일이 없습니다");
95
+ return entry;
96
+ }
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env node
2
+ // `switcher` 명령 — 받아둔 빌드를 띄운다 (없으면 먼저 받아온다).
3
+ // 이미 떠 있으면 앱의 단일 인스턴스 가드가 기존 창을 앞으로 가져온다.
4
+ import { spawn } from "node:child_process";
5
+ import { ensureDist } from "./dist.mjs";
6
+
7
+ const entry = await ensureDist();
8
+ if (process.platform === "darwin") {
9
+ spawn("open", [entry], { stdio: "ignore" });
10
+ } else {
11
+ spawn(entry, [], { detached: true, stdio: "ignore" }).unref();
12
+ }