claude-ai-switcher 1.1.4

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 (83) hide show
  1. package/AGENTS.md +265 -0
  2. package/ARCHITECTURE.md +162 -0
  3. package/CLAUDE.md +267 -0
  4. package/LICENSE +21 -0
  5. package/QWEN.md +429 -0
  6. package/README.md +833 -0
  7. package/dist/clients/claude-code.d.ts +92 -0
  8. package/dist/clients/claude-code.d.ts.map +1 -0
  9. package/dist/clients/claude-code.js +312 -0
  10. package/dist/clients/claude-code.js.map +1 -0
  11. package/dist/clients/opencode.d.ts +71 -0
  12. package/dist/clients/opencode.d.ts.map +1 -0
  13. package/dist/clients/opencode.js +604 -0
  14. package/dist/clients/opencode.js.map +1 -0
  15. package/dist/config.d.ts +37 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +122 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/display.d.ts +51 -0
  20. package/dist/display.d.ts.map +1 -0
  21. package/dist/display.js +118 -0
  22. package/dist/display.js.map +1 -0
  23. package/dist/hooks/index.d.ts +60 -0
  24. package/dist/hooks/index.d.ts.map +1 -0
  25. package/dist/hooks/index.js +223 -0
  26. package/dist/hooks/index.js.map +1 -0
  27. package/dist/hooks/token-tracker.js +280 -0
  28. package/dist/hooks/visual-enhancements.js +364 -0
  29. package/dist/index.d.ts +9 -0
  30. package/dist/index.d.ts.map +1 -0
  31. package/dist/index.js +1091 -0
  32. package/dist/index.js.map +1 -0
  33. package/dist/models.d.ts +34 -0
  34. package/dist/models.d.ts.map +1 -0
  35. package/dist/models.js +343 -0
  36. package/dist/models.js.map +1 -0
  37. package/dist/providers/alibaba.d.ts +25 -0
  38. package/dist/providers/alibaba.d.ts.map +1 -0
  39. package/dist/providers/alibaba.js +37 -0
  40. package/dist/providers/alibaba.js.map +1 -0
  41. package/dist/providers/anthropic.d.ts +14 -0
  42. package/dist/providers/anthropic.d.ts.map +1 -0
  43. package/dist/providers/anthropic.js +19 -0
  44. package/dist/providers/anthropic.js.map +1 -0
  45. package/dist/providers/gemini.d.ts +44 -0
  46. package/dist/providers/gemini.d.ts.map +1 -0
  47. package/dist/providers/gemini.js +156 -0
  48. package/dist/providers/gemini.js.map +1 -0
  49. package/dist/providers/glm.d.ts +25 -0
  50. package/dist/providers/glm.d.ts.map +1 -0
  51. package/dist/providers/glm.js +89 -0
  52. package/dist/providers/glm.js.map +1 -0
  53. package/dist/providers/ollama.d.ts +48 -0
  54. package/dist/providers/ollama.d.ts.map +1 -0
  55. package/dist/providers/ollama.js +174 -0
  56. package/dist/providers/ollama.js.map +1 -0
  57. package/dist/providers/openrouter.d.ts +24 -0
  58. package/dist/providers/openrouter.d.ts.map +1 -0
  59. package/dist/providers/openrouter.js +36 -0
  60. package/dist/providers/openrouter.js.map +1 -0
  61. package/dist/verify.d.ts +24 -0
  62. package/dist/verify.d.ts.map +1 -0
  63. package/dist/verify.js +262 -0
  64. package/dist/verify.js.map +1 -0
  65. package/package.json +57 -0
  66. package/scripts/copy-hooks.js +15 -0
  67. package/src/clients/claude-code.ts +340 -0
  68. package/src/clients/opencode.ts +618 -0
  69. package/src/config.ts +101 -0
  70. package/src/display.ts +151 -0
  71. package/src/hooks/index.ts +208 -0
  72. package/src/hooks/token-tracker.js +280 -0
  73. package/src/hooks/visual-enhancements.js +364 -0
  74. package/src/index.ts +1263 -0
  75. package/src/models.ts +366 -0
  76. package/src/providers/alibaba.ts +43 -0
  77. package/src/providers/anthropic.ts +23 -0
  78. package/src/providers/gemini.ts +136 -0
  79. package/src/providers/glm.ts +60 -0
  80. package/src/providers/ollama.ts +146 -0
  81. package/src/providers/openrouter.ts +42 -0
  82. package/src/verify.ts +258 -0
  83. package/tsconfig.json +19 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Chad Yantorno
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/QWEN.md ADDED
@@ -0,0 +1,429 @@
1
+ # Claude AI Switcher - Project Context
2
+
3
+ ## Project Overview
4
+
5
+ **Claude AI Switcher** is a TypeScript CLI tool that enables seamless switching between AI providers (Anthropic, Alibaba Coding Plan, GLM/Z.AI) for **Claude Code** and **OpenCode** clients. It manages configuration files, API keys, environment variables, and model alias env vars so users always know what model is active in Claude Code.
6
+
7
+ ### Key Features
8
+ - Quick switching between Anthropic (default), Alibaba Coding Plan, GLM/Z.AI, OpenRouter, Ollama, and Gemini providers
9
+ - **Model alias env vars** written to `~/.claude/settings.json` so Claude Code routes model tiers to the correct provider model (`ANTHROPIC_DEFAULT_OPUS_MODEL`, `ANTHROPIC_DEFAULT_SONNET_MODEL`, `ANTHROPIC_DEFAULT_HAIKU_MODEL`)
10
+ - **Separate client control** — `claude-switch claude <provider>` targets Claude Code only, `claude-switch opencode <provider>` targets OpenCode only, bare `claude-switch <provider>` updates both
11
+ - **Custom tier overrides** via `--opus`, `--sonnet`, `--haiku` flags
12
+ - Model information display with context windows and capabilities
13
+ - **Token tracking** — Visual context bar with percentage usage display (green/yellow/red/magenta color-coded)
14
+ - **Visual enhancements** — Model card showing active model, provider, context window, and capabilities
15
+ - Secure API key storage in `~/.claude-ai-switcher/config.json`
16
+ - Automatic backup of existing configurations
17
+ - Auto-onboarding to prevent Anthropic connection errors
18
+
19
+ ## Project Structure
20
+
21
+ ```
22
+ claude-ai-switcher/
23
+ ├── src/
24
+ │ ├── index.ts # Main CLI entry point (Commander.js)
25
+ │ ├── config.ts # API key and config management
26
+ │ ├── models.ts # Provider/model definitions + ModelTierMap
27
+ │ ├── display.ts # Console output utilities (chalk)
28
+ │ ├── verify.ts # API key verification
29
+ │ ├── hooks/
30
+ │ │ ├── index.ts # Hook manager (install/remove hooks)
31
+ │ │ ├── token-tracker.js # Token tracking script
32
+ │ │ └── visual-enhancements.js # Visual enhancements script
33
+ │ ├── clients/
34
+ │ │ ├── claude-code.ts # Claude Code config handler (~/.claude/)
35
+ │ │ └── opencode.ts # OpenCode config handler (~/.config/opencode/opencode.json)
36
+ │ └── providers/
37
+ │ ├── anthropic.ts # Anthropic provider config
38
+ │ ├── alibaba.ts # Alibaba Coding Plan config
39
+ │ ├── glm.ts # GLM/Z.AI provider (coding-helper)
40
+ │ ├── ollama.ts # Ollama provider (LiteLLM proxy)
41
+ │ ├── gemini.ts # Gemini provider (LiteLLM proxy)
42
+ │ ── openrouter.ts # OpenRouter provider config
43
+ ├── dist/ # Compiled JavaScript output
44
+ ├── package.json # Dependencies and scripts
45
+ ── tsconfig.json # TypeScript configuration
46
+ └── README.md # User documentation
47
+ ```
48
+
49
+ ## Building and Running
50
+
51
+ ### Prerequisites
52
+ - Node.js >= 18.0.0
53
+ - npm
54
+
55
+ ### Build Commands
56
+
57
+ ```bash
58
+ # Install dependencies (reproducible install from package-lock.json; does NOT modify it)
59
+ npm ci
60
+
61
+ # Build TypeScript to JavaScript
62
+ npm run build
63
+
64
+ # Run development version (ts-node)
65
+ npm run dev
66
+
67
+ # Run built version
68
+ npm start
69
+
70
+ # Clean build output
71
+ npm run clean
72
+ ```
73
+
74
+ ### Global Installation
75
+
76
+ ```bash
77
+ npm link # Install CLI globally as 'claude-switch'
78
+ ```
79
+
80
+ ### Usage
81
+
82
+ ```bash
83
+ # Setup wizard (first-time use)
84
+ claude-switch setup
85
+
86
+ # Switch BOTH clients
87
+ claude-switch anthropic
88
+ claude-switch alibaba
89
+ claude-switch alibaba qwen3.6-plus
90
+ claude-switch glm
91
+ claude-switch openrouter
92
+ claude-switch ollama
93
+ claude-switch gemini
94
+
95
+ # Switch Claude Code only
96
+ claude-switch claude anthropic
97
+ claude-switch claude alibaba qwen3.6-plus
98
+ claude-switch claude glm
99
+
100
+ # Switch OpenCode only
101
+ claude-switch opencode anthropic
102
+ claude-switch opencode alibaba qwen3.6-plus
103
+ claude-switch opencode glm
104
+
105
+ # Custom model tier aliases (Claude Code only)
106
+ claude-switch claude alibaba --opus qwen3-max-2026-01-23 --sonnet qwen3.6-plus --haiku kimi-k2.5
107
+ claude-switch glm --opus glm-5.2[1m] --sonnet glm-5-turbo --haiku glm-5v-turbo
108
+
109
+ # Specific configuration with qwen3.7-plus for opus, qwen3.6-plus for sonnet, kimi-k2.5 for haiku
110
+ claude-switch claude alibaba --opus qwen3.7-plus --sonnet qwen3.6-plus --haiku kimi-k2.5
111
+
112
+ # View information
113
+ claude-switch current # Show current configuration (both clients)
114
+ claude-switch list # List all providers and models
115
+ claude-switch models alibaba # Show models for specific provider
116
+
117
+ # API key management
118
+ claude-switch key alibaba # Check if API key is set
119
+ claude-switch key alibaba <key> # Set API key
120
+
121
+ # Hooks - Token tracking and visual enhancements
122
+ claude-switch hooks install # Install token tracker + visual enhancements
123
+ claude-switch hooks status # Show current token usage and visual status
124
+ claude-switch hooks reset # Reset token usage counters
125
+ claude-switch hooks remove # Remove all hooks
126
+ ```
127
+
128
+ ## Configuration Files
129
+
130
+ | Client | Config File | Purpose |
131
+ |--------|-------------|---------|
132
+ | Claude Code | `~/.claude/settings.json` | Environment variables for provider config + model alias env vars |
133
+ | Claude Code | `~/.claude.json` | Onboarding flag (`hasCompletedOnboarding`) |
134
+ | OpenCode | `~/.config/opencode/opencode.json` | Provider and agent configuration |
135
+ | API Keys | `~/.claude-ai-switcher/config.json` | Secure API key storage |
136
+ | Hooks | `~/.claude/hooks-config.json` | Hook installation status and configuration |
137
+ | Token Tracker | `~/.claude/token-tracker.js` | Token tracking script (installed via hooks) |
138
+ | Visual Enhancements | `~/.claude/visual-enhancements.js` | Visual enhancements script (installed via hooks) |
139
+ | Token Usage Data | `~/.claude/token-usage.json` | Session token usage tracking |
140
+
141
+ ## How It Works
142
+
143
+ ### Alibaba Coding Plan Configuration
144
+
145
+ When switching Claude Code to Alibaba, the tool writes these environment variables to `~/.claude/settings.json`:
146
+
147
+ ```json
148
+ {
149
+ "env": {
150
+ "ANTHROPIC_AUTH_TOKEN": "YOUR_API_KEY",
151
+ "ANTHROPIC_BASE_URL": "https://coding-intl.dashscope.aliyuncs.com/apps/anthropic",
152
+ "ANTHROPIC_MODEL": "qwen3.7-plus",
153
+ "ANTHROPIC_DEFAULT_OPUS_MODEL": "qwen3.7-plus",
154
+ "ANTHROPIC_DEFAULT_SONNET_MODEL": "qwen3.6-plus",
155
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL": "kimi-k2.5"
156
+ }
157
+ }
158
+ ```
159
+
160
+ - `ANTHROPIC_AUTH_TOKEN`, `ANTHROPIC_BASE_URL`, `ANTHROPIC_MODEL` — Route Claude Code to Alibaba's endpoint
161
+ - `ANTHROPIC_DEFAULT_*_MODEL` — Map Claude's model tiers (opus/sonnet/haiku) to specific Alibaba models
162
+ - **Opus**: `qwen3.7-plus` (default, 1M context)
163
+ - **Sonnet**: `qwen3.6-plus` (balanced, 1M context)
164
+ - **Haiku**: `kimi-k2.5` (200K context)
165
+
166
+ Switching back to Anthropic clears all these env vars.
167
+
168
+ ### GLM/Z.AI Configuration
169
+
170
+ GLM uses the `@z_ai/coding-helper` package to manage its configuration. The tool triggers `coding-helper auth reload claude` to apply GLM settings, plus sets the model tier aliases.
171
+
172
+ ## Model Alias Env Vars
173
+
174
+ When switching Claude Code to a non-Anthropic provider, the tool writes into `~/.claude/settings.json`:
175
+
176
+ ```json
177
+ {
178
+ "env": {
179
+ "ANTHROPIC_DEFAULT_OPUS_MODEL": "<model>",
180
+ "ANTHROPIC_DEFAULT_SONNET_MODEL": "<model>",
181
+ "ANTHROPIC_DEFAULT_HAIKU_MODEL": "<model>"
182
+ }
183
+ }
184
+ ```
185
+
186
+ Default tier maps per provider:
187
+
188
+ | Provider | opus | sonnet | haiku |
189
+ |----------|------|--------|-------|
190
+ | Alibaba | qwen3.7-plus (default), selected model (when specific model chosen) | qwen3.6-plus (default), qwen3.7-plus (when specific model chosen) | kimi-k2.5 (default), qwen3.6-plus (when specific model chosen) |
191
+ | GLM | glm-5.2[1m] | glm-5-turbo | glm-5v-turbo |
192
+ | Anthropic | (cleared) | (cleared) | (cleared) |
193
+
194
+ These are overridable per-switch with `--opus`, `--sonnet`, `--haiku` flags. Switching to Anthropic clears all three vars.
195
+
196
+ ## Provider Details
197
+
198
+ ### Alibaba Coding Plan
199
+ - **Endpoint**: `https://coding-intl.dashscope.aliyuncs.com/apps/anthropic`
200
+ - **Models**: qwen3.7-plus, qwen3.6-plus, qwen3-max-2026-01-23, qwen3-coder-next, qwen3-coder-plus, glm-5, glm-4.7, glm-4.7-flash, kimi-k2.5, MiniMax-M2.5
201
+ - **Context Windows**: 200K - 1M tokens
202
+ - **qwen3.7-plus**: 1M tokens (balanced, 1M context)
203
+ - **qwen3.6-plus**: 1M tokens (balanced, 1M context)
204
+ - **qwen3-coder-plus**: 1M tokens (code, 1M context)
205
+ - **qwen3-max-2026-01-23**: 262K tokens (complex reasoning)
206
+ - **qwen3-coder-next**: 262K tokens (coding agent)
207
+ - **glm-5**: 200K tokens (flagship GLM)
208
+ - **glm-4.7**: 256K tokens (balanced GLM)
209
+ - **glm-4.7-flash**: 256K tokens (fast GLM)
210
+ - **kimi-k2.5**: 200K tokens (multimodal, 200K context)
211
+ - **MiniMax-M2.5**: 200K tokens (reasoning, 200K context)
212
+ - **API Key Required**: Yes (from Alibaba Cloud Model Studio)
213
+
214
+ ### GLM/Z.AI
215
+ - **Managed by**: `@z_ai/coding-helper` package
216
+ - **Models**: glm-5.2[1m], glm-5v-turbo, glm-5-turbo, glm-5.1, glm-4.7
217
+ - **Context Windows**: 200K - 1M tokens
218
+ - **Setup**: `npm install -g @z_ai/coding-helper && coding-helper auth`
219
+
220
+ ### Anthropic (Default)
221
+ - **Models**: claude-opus-4-6, claude-opus-4-5, claude-sonnet-4-6, claude-sonnet-4-5, claude-haiku-4-5
222
+ - **Context Windows**: 200K tokens
223
+ - **Configuration**: Clears all provider env vars and model alias env vars to use native Claude
224
+
225
+ ## Hooks - Token Tracking & Visual Enhancements
226
+
227
+ ### Token Tracker (`~/.claude/token-tracker.js`)
228
+
229
+ Tracks token usage across Claude Code sessions with:
230
+ - **Input/Output token counting**
231
+ - **Total session token usage**
232
+ - **Visual context bar with percentage**
233
+ - **Color-coded alerts** (green <50%, yellow <75%, red <90%, magenta <100%)
234
+
235
+ #### Installation
236
+ ```bash
237
+ claude-switch hooks install # Install all hooks
238
+ claude-switch hooks install-token # Install only token tracker
239
+ ```
240
+
241
+ #### Usage
242
+ ```bash
243
+ claude-switch hooks status # Show current token usage
244
+ claude-switch hooks reset # Reset token counters
245
+ claude-switch hooks remove-token # Remove token tracker
246
+ ```
247
+
248
+ #### Output Example
249
+ ```
250
+ ╔══════════════════════════════════════════════════════════════╗
251
+ ║ 🤖 Active Model: Qwen3 6 Plus ║
252
+ ╠══════════════════════════════════════════════════════════════╣
253
+ ║ 📊 Token Usage: ║
254
+ ║ Input: 12,450 tokens ║
255
+ ║ Output: 8,320 tokens ║
256
+ ║ Total: 20,770 tokens ║
257
+ ╠══════════════════════════════════════════════════════════════╣
258
+ ║ Context Window: ║
259
+ ║ Used: 20,770 tokens ║
260
+ ║ Total: 1,000,000 tokens ║
261
+ ║ ████░░░░░░░░░░░░░░░░ 2.1% ║
262
+ ╚══════════════════════════════════════════════════════════════╝
263
+ ```
264
+
265
+ ### Visual Enhancements (`~/.claude/visual-enhancements.js`)
266
+
267
+ Provides visual display of active model and provider information:
268
+ - **Model card** with provider name, model, context window, and capabilities
269
+ - **Provider detection** from Claude Code settings
270
+ - **Context usage percentage bar**
271
+ - **Custom system prompt generation**
272
+
273
+ #### Installation
274
+ ```bash
275
+ claude-switch hooks install # Install all hooks
276
+ claude-switch hooks install-visual # Install only visual enhancements
277
+ ```
278
+
279
+ #### Usage
280
+ ```bash
281
+ claude-switch hooks status # Show visual status
282
+ claude-switch hooks remove-visual # Remove visual enhancements
283
+ ```
284
+
285
+ #### Output Example
286
+ ```
287
+ ┌─────────────────────────────────────────────────────────────┐
288
+ │ 🤖 Alibaba Model Studio │
289
+ ├─────────────────────────────────────────────────────────────┤
290
+ │ Model: qwen3.6-plus │
291
+ │ Context: 1M tokens │
292
+ │ Capabilities: │
293
+ │ Text Generation • Deep Thinking • Visual Understanding │
294
+ └─────────────────────────────────────────────────────────────┘
295
+ ```
296
+
297
+ ### Hook Configuration
298
+
299
+ Hooks are managed via `~/.claude/hooks-config.json`:
300
+ ```json
301
+ {
302
+ "tokenTracking": true,
303
+ "visualEnhancements": true,
304
+ "customPrompts": false,
305
+ "lastInstalled": "2026-05-05T07:00:00.000Z"
306
+ }
307
+ ```
308
+
309
+ ### Token Usage Tracking
310
+
311
+ Token usage is stored in `~/.claude/token-usage.json`:
312
+ ```json
313
+ {
314
+ "totalInputTokens": 12450,
315
+ "totalOutputTokens": 8320,
316
+ "sessionStart": "2026-05-05T07:00:00.000Z",
317
+ "lastUpdated": "2026-05-05T08:30:00.000Z"
318
+ }
319
+ ```
320
+
321
+ ## Development Conventions
322
+
323
+ ### Code Style
324
+ - **TypeScript**: Strict mode enabled (`strict: true` in tsconfig.json)
325
+ - **Module System**: CommonJS with ES2020 target
326
+ - **Naming**: camelCase for variables/functions, PascalCase for types/interfaces
327
+ - **Imports**: ES module syntax with `.js` extensions for relative imports
328
+ - **Error Handling**: Try-catch blocks with user-friendly error messages via `displayError()`
329
+
330
+ ### Architecture Patterns
331
+ - **Separation of Concerns**:
332
+ - `clients/` handles file I/O for specific AI clients
333
+ - `providers/` contains provider-specific configuration logic
334
+ - `models.ts` centralizes model definitions, tier maps, and `ModelTierMap` interface
335
+ - `display.ts` handles all console output formatting
336
+ - **Async/Await**: All file operations use async/await with fs-extra
337
+ - **Interface Definitions**: TypeScript interfaces for all config objects
338
+
339
+ ### Key Types
340
+
341
+ ```typescript
342
+ // ModelTierMap defines which model maps to each Anthropic tier
343
+ interface ModelTierMap {
344
+ opus: string;
345
+ sonnet: string;
346
+ haiku: string;
347
+ }
348
+
349
+ // GLM default: best model per tier
350
+ const GLM_DEFAULT_TIER_MAP: ModelTierMap = {
351
+ opus: "glm-5.2[1m]",
352
+ sonnet: "glm-5-turbo",
353
+ haiku: "glm-5v-turbo"
354
+ };
355
+
356
+ // Alibaba default: opus = selected model, sonnet = qwen3.7-plus, haiku = qwen3.6-plus
357
+ function getAlibabaTierMap(model: string): ModelTierMap
358
+ ```
359
+
360
+ ### Command Structure
361
+
362
+ ```
363
+ claude-switch <provider> → both clients
364
+ claude-switch claude <provider> → Claude Code only
365
+ claude-switch opencode <provider> → OpenCode only
366
+
367
+ Tier override flags (Claude Code only):
368
+ --opus <model>
369
+ --sonnet <model>
370
+ --haiku <model>
371
+
372
+ Hooks commands:
373
+ claude-switch hooks install → Install all hooks
374
+ claude-switch hooks install-token → Install token tracker only
375
+ claude-switch hooks install-visual → Install visual enhancements only
376
+ claude-switch hooks status → Show current status
377
+ claude-switch hooks reset → Reset token counters
378
+ claude-switch hooks remove → Remove all hooks
379
+ claude-switch hooks remove-token → Remove token tracker
380
+ claude-switch hooks remove-visual → Remove visual enhancements
381
+ ```
382
+
383
+ ### Testing Practices
384
+ - Manual testing via CLI commands
385
+ - Configuration backup before modifications
386
+ - Validation of model IDs before applying configuration
387
+
388
+ ### Key Dependencies
389
+ - `commander`: CLI framework
390
+ - `chalk`: Terminal styling
391
+ - `fs-extra`: Enhanced file system operations
392
+ - `ora`: Loading spinners
393
+
394
+ ## External Dependencies
395
+
396
+ ### Required for Full Functionality
397
+ - **Claude Code**: For Claude Code client support
398
+ - **OpenCode**: For OpenCode client support
399
+ - **@z_ai/coding-helper**: Required for GLM/Z.AI provider support
400
+
401
+ ### API Key Sources
402
+ - **Alibaba**: [Alibaba Cloud Model Studio](https://modelstudio.console.alibabacloud.com/)
403
+ - **GLM/Z.AI**: Via `coding-helper auth` interactive setup
404
+ - **Anthropic**: Uses system/default Anthropic configuration
405
+
406
+ ## Safety Features
407
+
408
+ 1. **Backup Before Modify**: All config file modifications create timestamped backups
409
+ 2. **Directory Creation**: Uses `fs.ensureDir()` to safely create directories
410
+ 3. **Onboarding Auto-Complete**: Sets `hasCompletedOnboarding: true` to prevent connection errors
411
+ 4. **Local-Only Storage**: No cloud sync of API keys or configurations
412
+ 5. **Existence Checks**: Validates config files before reading/writing
413
+ 6. **Env Var Cleanup**: Clears provider-specific env vars when switching between providers
414
+ 7. **Hook Safety**: Hooks are optional and can be removed at any time without affecting core functionality
415
+ 8. **Token Usage Privacy**: Token usage data stored locally only, never transmitted
416
+
417
+ ## Common Issues & Solutions
418
+
419
+ | Issue | Solution |
420
+ |-------|----------|
421
+ | `coding-helper not found` | `npm install -g @z_ai/coding-helper` |
422
+ | `API Key not found` | Run `claude-switch setup` or `claude-switch key alibaba <key>` |
423
+ | `Unable to connect to Anthropic services` | Run any switch command to auto-set onboarding flag |
424
+ | Config file issues | Run `claude-switch current` to diagnose |
425
+ | Model aliases not working | Check `~/.claude/settings.json` for `env` section |
426
+ | Hooks not installed | Run `claude-switch hooks install` |
427
+ | Token tracker not showing | Check `~/.claude/token-tracker.js` exists |
428
+ | Visual enhancements not showing | Check `~/.claude/visual-enhancements.js` exists |
429
+ | Token usage not resetting | Run `claude-switch hooks reset` |