claude-multi 0.12.0 → 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 +32 -12
- package/README.md +28 -231
- package/bin/claude-multi.cmd +2 -9
- package/bin/claude-multi.js +1 -3
- package/build/cli.js +2532 -19831
- package/package.json +17 -18
package/CHANGELOG.md
CHANGED
|
@@ -5,6 +5,25 @@ 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
|
+
|
|
8
27
|
## [0.12.0] - 2026-08-26
|
|
9
28
|
|
|
10
29
|
### Changed
|
|
@@ -64,7 +83,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
64
83
|
- `getSyncMode()` resolves the effective mode from the new `syncMode` field, falling back to the deprecated `autoSync` boolean for backward compatibility.
|
|
65
84
|
- `canConvertSyncMode()` and `availableSyncModeConversions()` in `constants.ts` enforce downgrade-only rule.
|
|
66
85
|
- `copyAllFromDefault()` now accepts a `SyncMode` parameter instead of a boolean.
|
|
67
|
-
- `detectBrokenSymlinks()` now detects broken individual symlinks inside real directories (half-manual mode),
|
|
86
|
+
- `detectBrokenSymlinks()` now detects broken individual symlinks inside real directories (half-manual mode), in addition to broken directory-level symlinks.
|
|
68
87
|
- TUI `ToggleAutoSync` screen rewritten as `Sync Mode` screen with color-coded mode labels and available-downgrade display.
|
|
69
88
|
- Instance info screen (`ShowInstanceInfo`) shows sync mode with color-coded labels instead of binary on/off.
|
|
70
89
|
- `plugin install/remove` commands blocked when instance is in half-manual mode (individually symlinked plugins cannot be individually managed).
|
|
@@ -127,9 +146,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
127
146
|
|
|
128
147
|
### Added
|
|
129
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).
|
|
130
|
-
- `syncProviderTemplateForInstance()` in `config.ts
|
|
131
|
-
- `detectTemplateMismatch()` and `detectWrapperMismatch()` in `instance-diagnostics.ts
|
|
132
|
-
- `TUNABLE_ENV_VARS` shared constant in `constants/env.ts
|
|
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.
|
|
133
152
|
|
|
134
153
|
### Changed
|
|
135
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.
|
|
@@ -165,7 +184,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
165
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.
|
|
166
185
|
|
|
167
186
|
### Fixed
|
|
168
|
-
- Health test compared `fixWrapperVersions` output against `generateWrapperScript()` (resolves via env override) instead of `buildWrapperScript(inst, PINNED_CLAUDE_BIN)` (what the function
|
|
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.
|
|
169
188
|
|
|
170
189
|
### Added
|
|
171
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.
|
|
@@ -177,15 +196,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
177
196
|
- `instanceMigrationVersion` in config now stores the actual package version rather than a separate numbering scheme.
|
|
178
197
|
- The legacy sentinel (`"0.5"`) is defined once as `LEGACY_INSTANCE_VERSION` and imported everywhere, instead of being hardcoded in multiple files.
|
|
179
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.
|
|
180
|
-
- Instance migration only rewrites wrappers when the file content
|
|
199
|
+
- Instance migration only rewrites wrappers when the file content differs (version check + content diff), instead of unconditionally regenerating every wrapper.
|
|
181
200
|
- `fixWrapperVersions` uses the canonical template targeting the pinned binary explicitly, with a content-diff check to avoid unnecessary writes.
|
|
182
201
|
|
|
183
202
|
### Fixed
|
|
184
203
|
- Removed broken `compareVersions` references from `version.test.ts`.
|
|
185
|
-
- `resolveClaudePath()` in `migration.ts` used `await` in a non-async function (TypeScript error). Removed
|
|
204
|
+
- `resolveClaudePath()` in `migration.ts` used `await` in a non-async function (TypeScript error). Removed, replaced by `generateWrapperScriptSafe` from `wrapper.ts`.
|
|
186
205
|
- Unused imports (`COMPATIBLE_CLAUDE_VERSION`, `installPinnedClaude`, `getPinnedBinaryVersion`, `isThirdPartyApiBroken`, `PINNED_CLAUDE_BIN`) removed from `migration.ts`.
|
|
187
206
|
- `config.ts` `loadConfig` backfill loop now handles `noUncheckedIndexedAccess` correctly (pre-existing TypeScript error).
|
|
188
|
-
- `createBackup` changed from async to sync (had no `await` expressions
|
|
207
|
+
- `createBackup` changed from async to sync (had no `await` expressions, pre-existing lint warning).
|
|
189
208
|
- Array `.sort()` / `.reverse()` calls in `migration.ts` and `config.ts` changed to `.toSorted()` / `.toReversed()` (pre-existing lint warnings).
|
|
190
209
|
- Duplicate `existsSync` import in `test/wrapper.test.ts` merged into single import.
|
|
191
210
|
|
|
@@ -194,15 +213,15 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
194
213
|
### Changed
|
|
195
214
|
- Pinned Claude version updated from `2.1.153` to `2.1.156`. `isThirdPartyApiBroken()` now covers v2.1.154 through v2.1.155.
|
|
196
215
|
- Auto-updates re-enabled. `PROVIDER_COMMON_ENV` no longer injects `DISABLE_AUTOUPDATER`/`DISABLE_UPDATES`. `autoUpdates` set to `true` in instance state.
|
|
197
|
-
- `doctor fix` now reinstalls the pinned binary when its version differs from `COMPATIBLE_CLAUDE_VERSION
|
|
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.
|
|
198
217
|
- Unknown CLI subcommands exit with an error instead of falling through to the Ink TUI.
|
|
199
218
|
- All version pinning and compatibility code tagged with `[SAFE PARK]` comments for easy discovery and reactivation.
|
|
200
219
|
|
|
201
220
|
## [0.6.0] - 2026-05-29
|
|
202
221
|
|
|
203
222
|
### Added
|
|
204
|
-
- **`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
|
|
205
|
-
- **Version verification on pinned binary**: `getPinnedBinaryVersion()` reads the installed version and triggers a reinstall if it's v2.1.154
|
|
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.
|
|
206
225
|
- **`COMPATIBLE_CLAUDE_VERSION` constant** (`src/version.ts`): single source of truth for the pinned version (`2.1.156`).
|
|
207
226
|
- **`PINNED_CLAUDE_BIN` in `src/paths.ts`**: shared path constant (previously duplicated in `wrapper.ts` and `health.ts`).
|
|
208
227
|
|
|
@@ -217,7 +236,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
217
236
|
## [0.5.8] - 2026-05-28
|
|
218
237
|
|
|
219
238
|
### Added
|
|
220
|
-
- **Region selection for MiMo Token Plan** (`--region`): `mimo-token` provider now supports regional endpoints
|
|
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.
|
|
221
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.
|
|
222
241
|
|
|
223
242
|
### Changed
|
|
@@ -507,6 +526,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
|
507
526
|
- Support for custom config and binary paths
|
|
508
527
|
- Command-line interface built with Commander.js
|
|
509
528
|
|
|
529
|
+
[0.13.0]: https://github.com/hmziqrs/claude-multi/compare/v0.12.0...v0.13.0
|
|
510
530
|
[0.12.0]: https://github.com/hmziqrs/claude-multi/compare/v0.11.1...v0.12.0
|
|
511
531
|
[0.11.0]: https://github.com/hmziqrs/claude-multi/compare/v0.10.0...v0.11.0
|
|
512
532
|
[0.8.2]: https://github.com/hmziqrs/claude-multi/compare/v0.8.1...v0.8.2
|
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
|
|
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
|
|
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.
|
|
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
|
|
40
|
-
claude-glm
|
|
41
|
-
claude-deepseek
|
|
42
|
-
claude-minimax
|
|
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
|
-
|
|
49
|
+
claude-multi installs globally with bun, npm, or pnpm.
|
|
97
50
|
|
|
98
51
|
```bash
|
|
99
|
-
|
|
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
|
-
##
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"' >> ~/.
|
|
291
|
-
source ~/.bashrc
|
|
112
|
+
echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.zshrc && source ~/.zshrc
|
|
292
113
|
```
|
|
293
114
|
|
|
294
|
-
|
|
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
|
-
|
|
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)
|
|
123
|
+
MIT. See [LICENSE](./LICENSE). Copyright (c) 2026 hmziqrs.
|
package/bin/claude-multi.cmd
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
@echo off
|
|
2
2
|
setlocal
|
|
3
|
-
|
|
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
|
-
|
|
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
|
package/bin/claude-multi.js
CHANGED
|
@@ -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
|
|
18
|
+
echo "claude-multi: no JavaScript runtime found (install bun or node 22+)" >&2
|
|
21
19
|
exit 1
|
|
22
20
|
fi
|