claude-multi 0.11.1 → 0.13.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/CHANGELOG.md CHANGED
@@ -5,6 +5,30 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.13.0] - 2026-10-31
9
+
10
+ ### Changed
11
+ - **Provider templates refreshed for the October 2026 model lineups.** GLM now follows Z.ai's official Claude Code mapping: `glm-5.3[1m]` for opus and sonnet, `glm-5.3-flash[1m]` for haiku. GLM-5-Turbo is no longer a Coding Plan tier. MiniMax moves to `MiniMax-M3.1-Flash[1m]` in every slot. DeepSeek moves to `deepseek-flash[1m]` for opus, sonnet, and primary, with `deepseek-flash` for haiku and subagents. Kimi uses standard `kimi-k3.1-pro[1m]` in every slot, with Highspeed available as an optional faster tier. MiMo stays on V2.6 Pro and Flash.
12
+ - **Qwen templates updated.** Pay-as-you-go uses `qwen3.8-max`, `qwen3.7-plus`, and `qwen3.8-flash`. The Coding Plan uses `qwen3.7-plus` in every slot because Qwen3.8 is not included in that plan. The retired `qwen3-coder-next` and `qwen3-coder-plus` IDs are gone.
13
+ - **Output and context variables corrected.** Templates now use `CLAUDE_CODE_MAX_OUTPUT_TOKENS` instead of the inert `MAX_OUTPUT_TOKENS`, set `CLAUDE_CODE_MAX_CONTEXT_TOKENS` where needed, and use `CLAUDE_CODE_EFFORT_LEVEL` instead of undocumented effort variables. Deprecated `ANTHROPIC_SMALL_FAST_MODEL` entries are removed during sync.
14
+ - Existing instances pick up the new mappings through the template drift check. Run `claude-multi doctor check` to see the change, then `claude-multi doctor fix` to apply it. API keys and user-tuned values are preserved.
15
+ - Provider pages, docs, FAQ, and the environment-variable reference now match the shipped templates.
16
+ - **Node.js 22 or newer is required.** Ink 7 does not support Node 18 or 20. Bun 1+ remains supported, and npm and pnpm work on Node 22+. The advertised Deno install path was removed because the package launcher is a POSIX shell script and `deno install -g npm:claude-multi` cannot execute it.
17
+ - The npm package no longer installs the Astro site dependencies. They moved to `devDependencies`, so a global install pulls only the CLI bundle.
18
+ - Added a `prepack` build and a test gate to the publish workflow, so a manual publish cannot ship an untested or unbuilt tarball.
19
+
20
+ ### Fixed
21
+ - `claude-multi add --config <dir>` now uses the supplied directory. It previously joined the path under `~/.claude-` and created an unintended nested directory.
22
+
23
+ ### Blog
24
+ - Blog post: [A Claude Code MCP workflow that actually runs](https://claude-multi.hmziq.xyz/blog/claude-code-mcp-workflow-automation/)
25
+ - Blog post: [A reproducible LLM routing setup for Claude Code](https://claude-multi.hmziq.xyz/blog/llm-cost-optimization-routing/)
26
+
27
+ ## [0.12.0] - 2026-08-26
28
+
29
+ ### Changed
30
+ - **GLM template updated**: sonnet-tier now maps to `glm-5.3-flash[1m]` instead of mirroring `glm-5.3[1m]`. Three-tier split restored: opus → `glm-5.3[1m]`, sonnet → `glm-5.3-flash[1m]`, haiku → `glm-5-turbo`. Existing instances are migrated automatically on next launch.
31
+
8
32
  ## [0.11.1] - 2026-08-22
9
33
 
10
34
  ### Fixed
@@ -59,7 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
59
83
  - `getSyncMode()` resolves the effective mode from the new `syncMode` field, falling back to the deprecated `autoSync` boolean for backward compatibility.
60
84
  - `canConvertSyncMode()` and `availableSyncModeConversions()` in `constants.ts` enforce downgrade-only rule.
61
85
  - `copyAllFromDefault()` now accepts a `SyncMode` parameter instead of a boolean.
62
- - `detectBrokenSymlinks()` now detects broken individual symlinks inside real directories (half-manual mode), not just broken directory-level symlinks.
86
+ - `detectBrokenSymlinks()` now detects broken individual symlinks inside real directories (half-manual mode), in addition to broken directory-level symlinks.
63
87
  - TUI `ToggleAutoSync` screen rewritten as `Sync Mode` screen with color-coded mode labels and available-downgrade display.
64
88
  - Instance info screen (`ShowInstanceInfo`) shows sync mode with color-coded labels instead of binary on/off.
65
89
  - `plugin install/remove` commands blocked when instance is in half-manual mode (individually symlinked plugins cannot be individually managed).
@@ -122,9 +146,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
122
146
 
123
147
  ### Added
124
148
  - **Instance details actions**: The instance details screen now has action buttons. Press Enter on any instance to access: Update settings template, Update alias wrapper, and Override alias to standard. Each action shows a live mismatch indicator (✓ up to date, ⚠ mismatch detected, ✗ wrapper missing).
125
- - `syncProviderTemplateForInstance()` in `config.ts` — on-demand provider template sync for a single instance. Re-applies the latest template env vars while preserving API keys and user-customized tunable vars.
126
- - `detectTemplateMismatch()` and `detectWrapperMismatch()` in `instance-diagnostics.ts` — compare an instance's current settings/wrapper against the expected provider template.
127
- - `TUNABLE_ENV_VARS` shared constant in `constants/env.ts` — single source of truth for env vars that are preserved during template sync and excluded from staleness checks.
149
+ - `syncProviderTemplateForInstance()` in `config.ts`: on-demand provider template sync for a single instance. Re-applies the latest template env vars while preserving API keys and user-customized tunable vars.
150
+ - `detectTemplateMismatch()` and `detectWrapperMismatch()` in `instance-diagnostics.ts`: compare an instance's current settings/wrapper against the expected provider template.
151
+ - `TUNABLE_ENV_VARS` shared constant in `constants/env.ts`: single source of truth for env vars that are preserved during template sync and excluded from staleness checks.
128
152
 
129
153
  ### Changed
130
154
  - **Health screen rewrite**: Replaced static `IssueCard` list with a Select-based issue picker. Issues can now be selected, viewed in detail, and dismissed. Press Enter to view an issue, `d` to dismiss, `D` to dismiss all.
@@ -160,7 +184,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
160
184
  - Instance migration tests: fast-path skip on current-version instances, mixed instances (some current, some old), `.claude.json` updates when the wrapper file is missing, and a verification that regenerated wrappers contain the global claude path.
161
185
 
162
186
  ### Fixed
163
- - Health test compared `fixWrapperVersions` output against `generateWrapperScript()` (resolves via env override) instead of `buildWrapperScript(inst, PINNED_CLAUDE_BIN)` (what the function actually uses). Would break if `CLAUDE_MULTI_CLAUDE_PATH` was set.
187
+ - Health test compared `fixWrapperVersions` output against `generateWrapperScript()` (resolves via env override) instead of `buildWrapperScript(inst, PINNED_CLAUDE_BIN)` (what the function uses). Would break if `CLAUDE_MULTI_CLAUDE_PATH` was set.
164
188
 
165
189
  ### Added
166
190
  - Instances track the claude-multi version they were created with (`createdWithVersion`). New instances get the current version. Instances created before this field existed get `0.5` and show "before version tracking" in the UI.
@@ -172,15 +196,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
172
196
  - `instanceMigrationVersion` in config now stores the actual package version rather than a separate numbering scheme.
173
197
  - The legacy sentinel (`"0.5"`) is defined once as `LEGACY_INSTANCE_VERSION` and imported everywhere, instead of being hardcoded in multiple files.
174
198
  - Wrapper script template exists in a single place (`buildWrapperScript` in `wrapper.ts`). Migration and health check both delegate to it instead of duplicating the template string.
175
- - Instance migration only rewrites wrappers when the file content actually differs (version check + content diff), instead of unconditionally regenerating every wrapper.
199
+ - Instance migration only rewrites wrappers when the file content differs (version check + content diff), instead of unconditionally regenerating every wrapper.
176
200
  - `fixWrapperVersions` uses the canonical template targeting the pinned binary explicitly, with a content-diff check to avoid unnecessary writes.
177
201
 
178
202
  ### Fixed
179
203
  - Removed broken `compareVersions` references from `version.test.ts`.
180
- - `resolveClaudePath()` in `migration.ts` used `await` in a non-async function (TypeScript error). Removed — replaced by `generateWrapperScriptSafe` from `wrapper.ts`.
204
+ - `resolveClaudePath()` in `migration.ts` used `await` in a non-async function (TypeScript error). Removed, replaced by `generateWrapperScriptSafe` from `wrapper.ts`.
181
205
  - Unused imports (`COMPATIBLE_CLAUDE_VERSION`, `installPinnedClaude`, `getPinnedBinaryVersion`, `isThirdPartyApiBroken`, `PINNED_CLAUDE_BIN`) removed from `migration.ts`.
182
206
  - `config.ts` `loadConfig` backfill loop now handles `noUncheckedIndexedAccess` correctly (pre-existing TypeScript error).
183
- - `createBackup` changed from async to sync (had no `await` expressions — pre-existing lint warning).
207
+ - `createBackup` changed from async to sync (had no `await` expressions, pre-existing lint warning).
184
208
  - Array `.sort()` / `.reverse()` calls in `migration.ts` and `config.ts` changed to `.toSorted()` / `.toReversed()` (pre-existing lint warnings).
185
209
  - Duplicate `existsSync` import in `test/wrapper.test.ts` merged into single import.
186
210
 
@@ -189,15 +213,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
189
213
  ### Changed
190
214
  - Pinned Claude version updated from `2.1.153` to `2.1.156`. `isThirdPartyApiBroken()` now covers v2.1.154 through v2.1.155.
191
215
  - Auto-updates re-enabled. `PROVIDER_COMMON_ENV` no longer injects `DISABLE_AUTOUPDATER`/`DISABLE_UPDATES`. `autoUpdates` set to `true` in instance state.
192
- - `doctor fix` now reinstalls the pinned binary when its version differs from `COMPATIBLE_CLAUDE_VERSION`, not just when broken. Covers the upgrade path from the old v2.1.153 pin.
216
+ - `doctor fix` now reinstalls the pinned binary when its version differs from `COMPATIBLE_CLAUDE_VERSION` or when broken. Covers the upgrade path from the old v2.1.153 pin.
193
217
  - Unknown CLI subcommands exit with an error instead of falling through to the Ink TUI.
194
218
  - All version pinning and compatibility code tagged with `[SAFE PARK]` comments for easy discovery and reactivation.
195
219
 
196
220
  ## [0.6.0] - 2026-05-29
197
221
 
198
222
  ### Added
199
- - **`doctor fix` auto-installs pinned Claude binary**: when the compatible binary at `~/.claude-multi/bin` is missing or running an incompatible version, `doctor fix` now installs Claude Code v2.1.156 (the version that fixed the 3rd-party API breakage from v2.1.154–v2.1.155) before fixing wrappers. Works from both CLI and TUI.
200
- - **Version verification on pinned binary**: `getPinnedBinaryVersion()` reads the installed version and triggers a reinstall if it's v2.1.154–v2.1.155.
223
+ - **`doctor fix` auto-installs pinned Claude binary**: when the compatible binary at `~/.claude-multi/bin` is missing or running an incompatible version, `doctor fix` now installs Claude Code v2.1.156 (the version that fixed the 3rd-party API breakage from v2.1.154-v2.1.155) before fixing wrappers. Works from both CLI and TUI.
224
+ - **Version verification on pinned binary**: `getPinnedBinaryVersion()` reads the installed version and triggers a reinstall if it's v2.1.154-v2.1.155.
201
225
  - **`COMPATIBLE_CLAUDE_VERSION` constant** (`src/version.ts`): single source of truth for the pinned version (`2.1.156`).
202
226
  - **`PINNED_CLAUDE_BIN` in `src/paths.ts`**: shared path constant (previously duplicated in `wrapper.ts` and `health.ts`).
203
227
 
@@ -212,7 +236,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
212
236
  ## [0.5.8] - 2026-05-28
213
237
 
214
238
  ### Added
215
- - **Region selection for MiMo Token Plan** (`--region`): `mimo-token` provider now supports regional endpoints — China (`cn`), Singapore (`sgp`), Europe (`ams`). Users are prompted to pick a region after selecting `mimo-token` in all three entry points (CLI `--region` flag, interactive prompts, Ink TUI wizard). Defaults to `cn` for backward compatibility.
239
+ - **Region selection for MiMo Token Plan** (`--region`): `mimo-token` provider now supports regional endpoints: China (`cn`), Singapore (`sgp`), Europe (`ams`). Users are prompted to pick a region after selecting `mimo-token` in all three entry points (CLI `--region` flag, interactive prompts, Ink TUI wizard). Defaults to `cn` for backward compatibility.
216
240
  - **API key prefix mapping** (`API_KEY_PREFIXES`): `mimo-token` shows `tp_...` placeholder in the API key input; all other providers show `sk-...`. Extensible map for future providers with non-standard key formats.
217
241
 
218
242
  ### Changed
@@ -502,6 +526,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
502
526
  - Support for custom config and binary paths
503
527
  - Command-line interface built with Commander.js
504
528
 
529
+ [0.13.0]: https://github.com/hmziqrs/claude-multi/compare/v0.12.0...v0.13.0
530
+ [0.12.0]: https://github.com/hmziqrs/claude-multi/compare/v0.11.1...v0.12.0
505
531
  [0.11.0]: https://github.com/hmziqrs/claude-multi/compare/v0.10.0...v0.11.0
506
532
  [0.8.2]: https://github.com/hmziqrs/claude-multi/compare/v0.8.1...v0.8.2
507
533
  [0.8.1]: https://github.com/hmziqrs/claude-multi/compare/v0.8.0...v0.8.1
package/README.md CHANGED
@@ -23,201 +23,53 @@ https://github.com/user-attachments/assets/790edd9c-6ee2-425a-952c-397ad047d653
23
23
 
24
24
  ---
25
25
 
26
- ## Why?
26
+ ## Why claude-multi
27
27
 
28
28
  Claude Code is great. Switching between providers and model setups is not.
29
29
 
30
- If you want to try GLM today and DeepSeek tomorrow, you usually end up editing `settings.json` by hand, juggling env vars, swapping keys, or maintaining a bunch of shell aliases nobody asked for.
30
+ If you want to try GLM today and DeepSeek tomorrow, you usually end up editing `settings.json` by hand, juggling env vars, swapping keys, or maintaining a bunch of shell aliases.
31
31
 
32
- The other option is to use each provider's own CLI tool. That sounds clean until you realize every tool has its own workflow, its own flags, its own way of doing things. Learning a new harness for every model gets old fast.
32
+ The other option is each provider's own CLI tool. Every tool has its own workflow, its own flags, its own way of doing things. Learning a new harness for every model gets old fast.
33
33
 
34
- So I went the other way: keep one harness I already like, and put the providers behind it. That's claude-multi. One workflow, many providers.
35
-
36
- And because it's still Claude Code under the hood, you keep everything you already use. `/loop`, `/goal`, skills, MCP servers, plugins, all of it. Switching providers does not mean rebuilding your setup from scratch.
34
+ So I went the other way: keep one harness I already like, and put the providers behind it. It's still Claude Code under the hood, so `/loop`, `/goal`, skills, MCP servers, and plugins all keep working.
37
35
 
38
36
  ```bash
39
- claude # your normal Claude Code setup
40
- claude-glm # Claude Code using GLM / Z.ai config
41
- claude-deepseek # Claude Code using DeepSeek config
42
- claude-minimax # Claude Code using MiniMax config
43
- ```
44
-
45
- Each instance is isolated. All of them run the normal, unmodified Claude Code binary.
46
-
47
- ---
48
-
49
- ## Features
50
-
51
- * Multiple Claude Code instances, one `claude-<name>` command each.
52
- * Provider templates for GLM/Z.ai, MiniMax, DeepSeek, Xiaomi MiMo, Moonshot Kimi, and Qwen.
53
- * Isolated config directories. Every instance gets its own `~/.claude-<name>/`.
54
- * A full terminal UI that covers adding, listing, plugins, MCP, and sync.
55
- * Plugin management per instance: enable, disable, install, copy, remove.
56
- * MCP management: list and copy server configs between instances.
57
- * Optional auto-sync that symlinks plugins and skills from your default `~/.claude`.
58
- * `doctor` reports provider template updates for existing instances and can apply them after making a backup.
59
- * No fork. It wraps your existing `claude` binary instead of patching it.
60
-
61
- ---
62
-
63
- ## Requirements
64
-
65
- * Node.js 18+ or Bun 1+
66
- * Claude Code installed globally
67
-
68
- If you don't have Claude Code yet:
69
-
70
- ```bash
71
- npm install -g @anthropic-ai/claude-code
37
+ claude
38
+ claude-glm
39
+ claude-deepseek
40
+ claude-minimax
72
41
  ```
73
42
 
74
43
  ---
75
44
 
76
45
  ## Install
77
46
 
78
- Bun:
79
-
80
- ```bash
81
- bun add -g claude-multi
82
- ```
83
-
84
- npm:
85
-
86
- ```bash
87
- npm install -g claude-multi
88
- ```
89
-
90
- pnpm:
91
-
92
- ```bash
93
- pnpm add -g claude-multi
94
- ```
47
+ Requires Node.js 22+ or Bun 1+, and Claude Code installed globally (`npm install -g @anthropic-ai/claude-code`).
95
48
 
96
- Deno:
49
+ claude-multi installs globally with bun, npm, or pnpm.
97
50
 
98
51
  ```bash
99
- deno install -g -A -n claude-multi npm:claude-multi
52
+ bun add -g claude-multi
53
+ # or: npm install -g claude-multi
54
+ # or: pnpm add -g claude-multi
100
55
  ```
101
56
 
102
57
  ---
103
58
 
104
- ## Getting started
105
-
106
- Launch the TUI:
59
+ ## Quick start
107
60
 
108
61
  ```bash
109
62
  claude-multi
110
63
  ```
111
64
 
112
- That's the only command you need to remember. Everything else lives inside the terminal UI.
113
-
114
- ### The main menu
115
-
116
- When the TUI opens, you get something like this:
117
-
118
- ```
119
- 🤖 Claude Multi - Interactive Mode
120
-
121
- ➕ Add new instance
122
- 📋 List all instances
123
- ℹ️ Instance details
124
- 🔌 Manage plugins
125
- 🔄 Toggle auto-sync
126
- 🔗 Re-sync symlinks
127
- 🗑️ Remove instance
128
- ⚙️ MCP servers
129
- 🚪 Exit
130
- ```
131
-
132
- Arrow keys to move. `Enter` to pick. `ESC` to go back. `q` to quit.
133
-
134
- ### Setting up your first instance
135
-
136
- Pick **➕ Add new instance**. The wizard has eight steps.
137
-
138
- **1. Instance name**
139
-
140
- Pick something short like `glm`, `deepseek`, or `work`. Letters, numbers, hyphens, and underscores only. Whatever you type here becomes your command, so `glm` gives you `claude-glm`.
141
-
142
- **2. Provider template**
143
-
144
- Pick one:
145
-
146
- * `glm` for GLM / Z.ai
147
- * `minimax` for MiniMax
148
- * `deepseek` for DeepSeek
149
- * `None / Custom` if you want to set things up by hand later
150
-
151
- **3. API key** *(only if you picked a provider)*
152
-
153
- Paste your key. It's masked while you type and gets written into the instance's `settings.json`.
154
-
155
- **4. Confirm paths**
156
-
157
- The wizard shows where things will go:
158
-
159
- * Config: `~/.claude-<name>/`
160
- * Binary: `~/.local/bin/claude-<name>`
161
-
162
- Hit `y` to accept. The defaults are fine for almost everyone.
163
-
164
- **5. Copy options**
165
-
166
- If you already have a `~/.claude` setup, you can carry pieces of it into the new instance:
65
+ That's the only command to remember. Everything else happens in the terminal UI: pick Add new instance, and the wizard walks you through a name, a provider template, and an API key. When it finishes you have a `claude-<name>` command running real Claude Code against an isolated `~/.claude-<name>/` config.
167
66
 
168
- * **Nothing.** Start fresh, inherit nothing.
169
- * **Only `settings.json`.** Copy just the base settings file.
170
- * **Select plugins.** Cherry-pick plugins from your default setup.
171
- * **All files.** Settings, `CLAUDE.md`, plugins, skills, the whole thing.
67
+ Two things worth knowing:
172
68
 
173
- **6. Select plugins** *(only if you picked "Select plugins")*
69
+ - If the menu shows a `!` health hint, press `!` to see what's wrong and fix it.
70
+ - After upgrading claude-multi, run `claude-multi doctor check` to apply provider template updates. It backs up `settings.json` first and keeps any values you changed yourself.
174
71
 
175
- A multi-select list of every plugin in your default `~/.claude`. `space` toggles. `enter` confirms.
176
-
177
- **7. Auto-sync** *(only if you picked "All files")*
178
-
179
- This asks whether to symlink `plugins/` and `skills/` back to `~/.claude`. Say `y` if you want to install a plugin once and have it show up in every instance. Say `n` if you want this instance to have its own independent copies.
180
-
181
- **8. Done**
182
-
183
- The wizard prints the new instance and its paths:
184
-
185
- ```
186
- ✓ Instance 'glm' created successfully!
187
- ├─ Binary: /Users/you/.local/bin/claude-glm
188
- └─ Config: /Users/you/.claude-glm
189
- ```
190
-
191
- Run it:
192
-
193
- ```bash
194
- claude-glm
195
- ```
196
-
197
- That's a full Claude Code session on the provider you picked, with its own isolated config. Same `claude` you already know, just pointed at a different brain.
198
-
199
- ### Other TUI flows
200
-
201
- * **📋 List all instances.** Every instance with its provider, paths, and sync status.
202
- * **ℹ️ Instance details.** Pick one to inspect its full config.
203
- * **🔌 Manage plugins.** Pick an instance, then enable, disable, install, copy, or remove plugins for it.
204
- * **🔄 Toggle auto-sync.** Flip symlink syncing on or off for a chosen instance.
205
- * **🔗 Re-sync symlinks.** Rebuild broken plugin or skill symlinks after you've moved `~/.claude` around.
206
- * **🗑️ Remove instance.** Delete an instance, its wrapper, and optionally its config dir.
207
- * **⚙️ MCP servers.** View MCP configs and copy them between instances.
208
-
209
- If the menu shows a `!` health hint, press `!` to see what's wrong and fix it.
210
-
211
- ### Update an existing provider instance
212
-
213
- Provider templates change as providers ship new models or revise their settings. After updating claude-multi, check existing instances:
214
-
215
- ```bash
216
- claude-multi doctor check
217
- claude-multi doctor fix
218
- ```
219
-
220
- The TUI also shows `Run instance migrations` when an update is available. The sync updates model names and other template settings, while keeping API keys and values you changed yourself. It creates a backup before writing `settings.json`.
72
+ Full documentation: **https://claude-multi.hmziq.xyz**
221
73
 
222
74
  ---
223
75
 
@@ -230,17 +82,17 @@ The TUI also shows `Run instance migrations` when an update is available. The sy
230
82
  | DeepSeek | `api.deepseek.com` | `deepseek` |
231
83
  | Xiaomi MiMo | `api.xiaomimimo.com` | `mimo` |
232
84
  | Xiaomi MiMo (Token Plan) | `token-plan-cn.xiaomimimo.com` | `mimo-token` |
233
- | Moonshot Kimi | `api.moonshot.ai` | `kimi-k2.7-code, kimi-k2.6, kimi-k2.5` |
85
+ | Moonshot Kimi | `api.moonshot.ai` | `kimi` |
234
86
  | Alibaba Qwen | `dashscope-intl.aliyuncs.com` | `qwen` |
235
87
  | Alibaba Qwen Coding Plan | `coding-intl.dashscope.aliyuncs.com` | `qwen-coding` |
236
88
 
237
- The templates write `ANTHROPIC_BASE_URL`, `ANTHROPIC_MODEL`, and related env vars into `~/.claude-<name>/settings.json`. If you edit a setting, provider sync keeps your custom tunables but restores model slots to the current template.
89
+ Templates write `ANTHROPIC_BASE_URL`, `ANTHROPIC_MODEL`, and related env vars into `~/.claude-<name>/settings.json`. Provider sync keeps values you changed yourself and restores model slots to the current template.
238
90
 
239
91
  ---
240
92
 
241
93
  ## How it works
242
94
 
243
- Every instance gets a config dir at `~/.claude-<name>/` and a wrapper script at `~/.local/bin/claude-<name>`. The wrapper sets `CLAUDE_CONFIG_DIR` and then runs the unmodified `claude` binary. No fork, no patch.
95
+ Each instance is a config dir at `~/.claude-<name>/` plus a wrapper script at `~/.local/bin/claude-<name>` that sets `CLAUDE_CONFIG_DIR` and runs the unmodified `claude` binary. No fork, no patch. The instance registry lives in `~/.claude-multi/config.json`.
244
96
 
245
97
  ```js
246
98
  #!/usr/bin/env bun
@@ -248,79 +100,24 @@ process.env.CLAUDE_CONFIG_DIR = "/Users/you/.claude-glm"
248
100
  spawn("claude", process.argv.slice(2), { stdio: "inherit", env: process.env })
249
101
  ```
250
102
 
251
- Instance metadata sits in `~/.claude-multi/config.json`. When auto-sync is on, `plugins/` and `skills/` are symlinks back to `~/.claude/`, so installing a plugin once makes it show up everywhere.
252
-
253
- ---
254
-
255
- ## File locations
256
-
257
- | Path | Purpose |
258
- |---|---|
259
- | `~/.claude-multi/config.json` | claude-multi instance registry |
260
- | `~/.claude-<name>/` | config directory for one instance |
261
- | `~/.local/bin/claude-<name>` | generated wrapper command on Linux/macOS |
262
- | `~/.claude/` | your default Claude Code config. Treated as the source for copy and sync operations. |
263
-
264
- ---
265
-
266
- ## Auto-sync vs manual mode
267
-
268
- With auto-sync on, `plugins/` and `skills/` are symlinks pointing at your default `~/.claude/`. Install a plugin once, and every instance that opted in picks it up.
269
-
270
- Use manual mode when you want an instance that's fully independent. Just say `n` at the auto-sync step in the wizard. You can also flip this later from the main menu under **🔄 Toggle auto-sync**.
103
+ Auto-sync symlinks `plugins/` and `skills/` back to `~/.claude/`, so a plugin you install once shows up in every instance that opted in. Skip it (or toggle it later in the menu) if you want an instance fully independent.
271
104
 
272
105
  ---
273
106
 
274
107
  ## Troubleshooting
275
108
 
276
- ### `claude-<name>` command not found
277
-
278
- Your global binary directory probably isn't on `PATH`.
279
-
280
- For zsh on Linux/macOS:
281
-
282
- ```bash
283
- echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc
284
- source ~/.zshrc
285
- ```
286
-
287
- For Bash:
109
+ **`claude-<name>` command not found.** Your `~/.local/bin` probably isn't on `PATH`:
288
110
 
289
111
  ```bash
290
- echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
291
- source ~/.bashrc
112
+ echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
292
113
  ```
293
114
 
294
- ### Broken plugin or skill symlinks
295
-
296
- Open the TUI and pick **🔗 Re-sync symlinks**. Choose the broken instance (or all of them) and it rebuilds the links.
297
-
298
- ### Health warnings in the menu
299
-
300
- If the main menu shows a yellow or red banner, hit `!` to open the health screen. It lists what's wrong (missing binary, broken symlinks, stale registry entries, that kind of thing) and offers fixes for each one.
301
-
302
- ### Force the simpler prompts UI
303
-
304
- If the Ink TUI doesn't render right on your terminal:
305
-
306
- ```bash
307
- CLAUDE_MULTI_INK=false claude-multi
308
- ```
309
-
310
- You get a basic prompt-based UI with the same flows.
311
-
312
- ---
313
-
314
- ## Roadmap ideas
115
+ **Broken plugin or skill symlinks.** Pick Re-sync symlinks in the TUI.
315
116
 
316
- * More provider templates
317
- * Better docs for provider-specific models
318
- * Import and export instance profiles
319
- * Safer API key management
320
- * Preset workflows for coding, planning, review, and cheap exploration models
117
+ **The Ink TUI renders wrong.** `CLAUDE_MULTI_INK=false claude-multi` gets you the plain prompts UI with the same flows.
321
118
 
322
119
  ---
323
120
 
324
121
  ## License
325
122
 
326
- MIT. See [LICENSE](./LICENSE) for the full text. Copyright (c) 2026 hmziqrs.
123
+ MIT. See [LICENSE](./LICENSE). Copyright (c) 2026 hmziqrs.
@@ -1,7 +1,6 @@
1
1
  @echo off
2
2
  setlocal
3
- :: Resolve package root (bin\ -> ..\)
4
- set "_cli=%~dp0..\dist\cli.js"
3
+ set "_cli=%~dp0..\build\cli.js"
5
4
 
6
5
  where bun >nul 2>&1
7
6
  if not errorlevel 1 (
@@ -15,12 +14,6 @@ if not errorlevel 1 (
15
14
  exit /b %errorlevel%
16
15
  )
17
16
 
18
- where deno >nul 2>&1
19
- if not errorlevel 1 (
20
- deno run -A "%_cli%" %*
21
- exit /b %errorlevel%
22
- )
23
-
24
- echo claude-multi: no JavaScript runtime found (install bun, node, or deno) 1>&2
17
+ echo claude-multi: no JavaScript runtime found (install bun or node 22+) 1>&2
25
18
  exit /b 1
26
19
  endlocal
@@ -14,9 +14,7 @@ if command -v bun >/dev/null 2>&1; then
14
14
  exec bun "$CLI" "$@"
15
15
  elif command -v node >/dev/null 2>&1; then
16
16
  exec node "$CLI" "$@"
17
- elif command -v deno >/dev/null 2>&1; then
18
- exec deno run -A "$CLI" "$@"
19
17
  else
20
- echo "claude-multi: no JavaScript runtime found (install bun, node, or deno)" >&2
18
+ echo "claude-multi: no JavaScript runtime found (install bun or node 22+)" >&2
21
19
  exit 1
22
20
  fi