claude-multi 0.5.7 → 0.6.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.
Files changed (3) hide show
  1. package/CHANGELOG.md +40 -14
  2. package/dist/cli.js +2798 -441
  3. package/package.json +13 -4
package/CHANGELOG.md CHANGED
@@ -5,19 +5,45 @@ 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.6.0] - 2026-05-29
9
+
10
+ ### Added
11
+ - **`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.153 (the last version before 3rd-party API breakage) before fixing wrappers. Works from both CLI and TUI.
12
+ - **Version verification on pinned binary**: `getPinnedBinaryVersion()` reads the installed version and triggers a reinstall if it's v2.1.154+.
13
+ - **`COMPATIBLE_CLAUDE_VERSION` constant** (`src/version.ts`): single source of truth for the pinned version (`2.1.153`).
14
+ - **`PINNED_CLAUDE_BIN` in `src/paths.ts`**: shared path constant (previously duplicated in `wrapper.ts` and `health.ts`).
15
+
16
+ ### Changed
17
+ - **Global version banner**: now reads "Run 'claude-multi doctor fix' to install a compatible version" instead of the passive "wait for a fix" message.
18
+ - **TUI "Fix wrappers" action**: installs the pinned binary first if missing, then fixes wrappers. Both the menu option and the `f` key in the health screen follow this flow.
19
+ - **Wrapper scripts now use pinned binary by default**: `getClaudePath()` checks `~/.claude-multi/bin` before falling back to global `which claude`, so new instances automatically use the compatible version.
20
+
21
+ ### Fixed
22
+ - **Tests**: integration tests updated for current version and help output.
23
+
24
+ ## [0.5.8] - 2026-05-28
25
+
26
+ ### Added
27
+ - **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.
28
+ - **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.
29
+
30
+ ### Changed
31
+ - **`--provider` error message** (`src/cli.ts`): unknown provider error now dynamically lists all available providers instead of hardcoding three names.
32
+ - **Region advisory**: both the interactive prompts and Ink TUI display a highlighted message reminding users to check their Xiaomi account console for the correct region.
33
+
8
34
  ## [0.5.7] - 2026-05-27
9
35
 
10
36
  ### Added
11
37
  - **Provider templates** (`src/templates.ts`): five new AI provider templates
12
- - **Xiaomi MiMo** (`mimo`): MiMo-V2.5-Pro and MiMo-V2.5 via xiaomimimo.com — pay-per-token API
38
+ - **Xiaomi MiMo** (`mimo`): MiMo-V2.5-Pro and MiMo-V2.5 via xiaomimimo.com, pay-per-token API
13
39
  - **Xiaomi MiMo Token Plan** (`mimo-token`): MiMo-V2.5-Pro via xiaomimimo.com subscription; replace base URL with your regional endpoint (CN/SG/EU) from the subscription console
14
- - **Moonshot Kimi** (`kimi`): Kimi K2.6 (opus) and Kimi K2.5 (sonnet/haiku) via moonshot.ai — pay-per-token
15
- - **Alibaba Qwen** (`qwen`): Qwen3-Coder-Next/Plus/Flash via Alibaba DashScope — pay-per-token API
40
+ - **Moonshot Kimi** (`kimi`): Kimi K2.6 (opus) and Kimi K2.5 (sonnet/haiku) via moonshot.ai, pay-per-token
41
+ - **Alibaba Qwen** (`qwen`): Qwen3-Coder-Next/Plus/Flash via Alibaba DashScope, pay-per-token API
16
42
  - **Alibaba Qwen Coding Plan** (`qwen-coding`): Qwen3-Coder-Next/Plus/Flash via DashScope Coding Plan subscription
17
43
 
18
44
  ### Changed
19
45
  - **GLM template** (`glm`): display name updated to "GLM Coding Plan"; description now clarifies the Anthropic endpoint is coding-plan-only (standard Z.ai pay-per-token API has no Anthropic-compatible URL)
20
- - **Kimi template** (`kimi`): sonnet/haiku tiers use `kimi-k2.5` instead of `kimi-k2.6` — same family, ~37% cheaper; legacy K2 series EOL'd May 25 2026
46
+ - **Kimi template** (`kimi`): sonnet/haiku tiers use `kimi-k2.5` instead of `kimi-k2.6`, same family, ~37% cheaper; legacy K2 series EOL'd May 25 2026
21
47
 
22
48
  ## [0.5.6] - 2026-05-23
23
49
 
@@ -27,7 +53,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
27
53
  ### Changed
28
54
  - **Runtime-agnostic launcher** (`bin/claude-multi.js`): polyglot bin entry is simultaneously valid POSIX sh and ESM JavaScript
29
55
  - On Linux/macOS: shell shebang detects bun/node/deno and execs the correct runtime
30
- - On Windows + bun global install: bun's `.exe` shim reads the `.js` extension and runs directly as ESM — no `/bin/sh` lookup required
56
+ - On Windows + bun global install: bun's `.exe` shim reads the `.js` extension and runs directly as ESM, no `/bin/sh` lookup required
31
57
  - On Windows + npm install: npm's `.cmd` shim calls `node` on the `.js` file
32
58
  - Shebang changed to `#!/usr/bin/env bun` so bun's Windows shim can resolve itself in `PATH`
33
59
 
@@ -44,10 +70,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
44
70
 
45
71
  ### Changed
46
72
  - **Cross-runtime support**: all package-manager operations (`upgradeClaudeMulti`, `getCurrentVersion`, `updateClaudeCode`) now use the detected package manager instead of hard-coding bun commands
47
- - `getLatestVersion()` replaced `bun pm npm view` with a direct `fetch()` to the npm registry — works in any runtime
73
+ - `getLatestVersion()` replaced `bun pm npm view` with a direct `fetch()` to the npm registry, works in any runtime
48
74
  - `getDefaultBinaryPath()` selects the correct global bin directory for the active package manager on Windows (was always `%LOCALAPPDATA%\bun\bin`)
49
75
  - Generated wrapper shebang changed from `#!/usr/bin/env bun` to `#!/usr/bin/env node`
50
- - Default action (no subcommand) always launches the Ink TUI and awaits `waitUntilExit()` — the `CLAUDE_MULTI_INK=false` prompts fallback is removed
76
+ - Default action (no subcommand) always launches the Ink TUI and awaits `waitUntilExit()`, the `CLAUDE_MULTI_INK=false` prompts fallback is removed
51
77
  - Update check is now **opt-in**: set `CLAUDE_MULTI_UPDATE_CHECK=true` to enable; it no longer runs on every invocation
52
78
  - Removed `interactive` / `i` command alias (default action covers this)
53
79
 
@@ -117,11 +143,11 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
117
143
  - Verify MCP configuration
118
144
  - Copy between instances
119
145
  - **CLI Plugin Commands**: 5 new `plugins` sub-commands
120
- - `plugins install <instance> <ids...>` — install plugins with collision detection
121
- - `plugins remove <instance> <ids...>` — remove plugins with symlink guard
122
- - `plugins list-defaults` — list all 50 default plugins with category/MCP badges
123
- - `plugins list-installed [instance]` — list installed plugins per instance
124
- - `plugins check-collisions <instance> <ids...>` — detect MCP name conflicts
146
+ - `plugins install <instance> <ids...>`, install plugins with collision detection
147
+ - `plugins remove <instance> <ids...>`, remove plugins with symlink guard
148
+ - `plugins list-defaults`, list all 50 default plugins with category/MCP badges
149
+ - `plugins list-installed [instance]`, list installed plugins per instance
150
+ - `plugins check-collisions <instance> <ids...>`, detect MCP name conflicts
125
151
  - **Provider Templates**: DeepSeek provider template added
126
152
  - **Instance State**: `initializeInstanceState()` creates `.claude.json` with `hasCompletedOnboarding: true`
127
153
  - **Provider Env**: `mergeProviderEnv()` integrates provider template env vars into instance settings
@@ -131,7 +157,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
131
157
  - `copyAllFromDefault()` restored `autoSync` parameter for symlink-based plugin sync
132
158
  - `syncPluginsAndSkills()` creates actual symlinks instead of copying files
133
159
  - Broken symlink detection uses `lstatSync` (works when `existsSync` returns false)
134
- - `~/.claude` is strictly read-only — never modified by any operation
160
+ - `~/.claude` is strictly read-only, never modified by any operation
135
161
  - Atomic file writes for both config.json and settings.json (temp-file-rename pattern)
136
162
  - Lazy path resolution in migration.ts and health.ts for testability
137
163
 
@@ -139,7 +165,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
139
165
  - `syncPluginsAndSkills` was doing recursive copy instead of creating symlinks
140
166
  - `copyAllFromDefault` `autoSync` parameter was removed, breaking symlink-based sync
141
167
  - Broken symlinks not cleaned before creating new ones (used `lstatSync` instead of `existsSync`)
142
- - `isClaudeCodeRunning()` blocked tests — skips in `NODE_ENV=test`
168
+ - `isClaudeCodeRunning()` blocked tests, skips in `NODE_ENV=test`
143
169
  - `writeFileSync` not imported in config.ts
144
170
  - `McpSourceDetails` prop name mismatch in ManageMcp
145
171
  - `renameSync` dynamic import in `saveConfigAtomic` replaced with top-level import