claude-multi changelog for Claude Code.

This page tracks claude-multi CLI releases for Claude Code. Entries come fromCHANGELOG.md and cover CLI behavior, provider templates, installs, and migrations. Day-to-day website CSS and CI changes are not listed unless they shipped with a release.

Latest release

v0.13.2

Changed3Fixed4
Changed3 entries
  • Provider templates now map the Fable alias. Claude Code resolves fable to claude-fable-5-1 unless ANTHROPIC_DEFAULT_FABLE_MODEL is set, and third-party Anthropic-compatible endpoints reject that ID. Every template maps the alias to its primary model.
  • Effort now reaches custom model IDs. GLM, MiniMax, DeepSeek, and Kimi set CLAUDE_CODE_ALWAYS_ENABLE_EFFORT=1 alongside CLAUDE_CODE_EFFORT_LEVEL so Claude Code sends the effort parameter for model names it does not recognize.
  • Provider documentation and examples now include the Fable slot. The provider pages, docs tables, website examples, llms.txt, and the monthly review checklist match the shipped templates.
Fixed4 entries
  • The monthly model-review workflow now links to the live Xiaomi MiMo Claude Code page and includes the Fable and effort checks.
  • Environment-variable documentation now matches current Claude Code behavior for API_TIMEOUT_MS, CLAUDE_AUTOCOMPACT_PCT_OVERRIDE, CLAUDE_CODE_MAX_CONTEXT_TOKENS, CLAUDE_CODE_SUBAGENT_MODEL, and ANTHROPIC_AUTH_TOKEN. DeepSeek and Kimi notes no longer claim their fixed thinking budgets are provider-side limits.
  • README now separates doctor check from doctor fix and shows the POSIX shell wrapper that claude-multi actually generates.
  • The Xiaomi MiMo provider page links to the live platform.xiaomimimo.com signup page, and the MiniMax, GLM, Kimi, and DeepSeek source links use their canonical URLs.

Earlier releases29

v0.13.1
5 entries
Changed
  • Removed the remaining Deno code paths. Package-manager detection, version lookup, upgrade commands, Claude Code update commands, and the Windows wrapper path lookup now cover Bun, npm, and pnpm only. This is internal cleanup; the user-facing Deno removal shipped in 0.13.0.
  • Sitemap lastmod values are now derived from git history at build time instead of a hardcoded date. Static pages use the last commit that touched their source files, and blog and provider pages keep using their frontmatter dates. The docs deploy checks out full history so the dates are accurate.
  • Updated GitHub Actions to current Node 24 releases: actions/checkout@v7, actions/setup-node@v7, oven-sh/setup-bun@v2, softprops/action-gh-release@v3, actions/github-script@v9, actions/upload-artifact@v7, and actions/download-artifact@v8. This removes the Node 20 deprecation warnings from CI.
Added
  • Monthly provider model review workflow. On the first of each month it opens a GitHub issue with the current expected models, official vendor documentation links, and the verification commands. It does not create duplicates while an earlier review issue is open.
v0.13.0
11 entries
Changed
  • 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.
  • 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.
  • 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.
  • 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.
  • Provider pages, docs, FAQ, and the environment-variable reference now match the shipped templates.
  • 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.
  • The npm package no longer installs the Astro site dependencies. They moved to devDependencies, so a global install pulls only the CLI bundle.
  • Added a prepack build and a test gate to the publish workflow, so a manual publish cannot ship an untested or unbuilt tarball.
Fixed
  • claude-multi add --config <dir> now uses the supplied directory. It previously joined the path under ~/.claude- and created an unintended nested directory.
v0.12.0
1 entry
Changed
  • 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.
v0.11.1
5 entries
Fixed
  • Existing instances can now pick up provider template changes. claude-multi doctor check spots model and structural environment values that differ from the current template, even when the stored migration version is current. Run claude-multi doctor fix to back up the instance settings and apply the update.
  • The GLM 5.3 mapping now reaches existing GLM instances. Model slots update to glm-5.3[1m]; a legacy MAX_OUTPUT_TOKENS=64000 becomes 128000; obsolete GLM auto-compaction overrides are removed. MiniMax instances still using the old 64K output limit move to 512K.
  • Provider detection now accepts endpoints with a trailing slash, so a valid edited GLM URL does not cause template sync to be skipped.
  • The TUI migration option and health warning no longer appear for a version mismatch with no work to do.
Changed
  • Migrations and the instance-details "Sync template" action now use the same provider environment sync code. Model and structural settings follow the current template. API keys and user-tuned values stay in place, except for documented legacy defaults that need an upgrade.
v0.11.0
5 entries
Changed
  • GLM template updated for GLM-5.3: Opus and sonnet slots now use glm-5.3[1m] (sonnet follows Z.ai's official Claude Code example); haiku and small/fast stay on glm-5-turbo. GLM-5.2 and GLM-5.1 are no longer served on the GLM Coding Plan, and requests for them auto-route to GLM-5.3. MAX_OUTPUT_TOKENS raised from 64000 to 128000 to match the documented 128K max output of both models. Thinking can no longer be disabled on GLM-5.3 (reasoning_effort low/high/max); the template keeps high.
  • New points-based GLM Coding Plan pricing documented on the provider page and in the GLM-5.3 blog post. The legacy 3x peak / 2x off-peak multiplier model was discontinued for new users on 2026-07-30.
  • Model and context-window references updated across the provider docs, environment-variables guide, FAQ, providers table, and llms.txt.
Fixed
  • CI check-version job no longer fails when there is nothing new to publish. It now exits 0 on a skip (equal or older version) and relies on the should_publish output to gate publishing, so pushes without a version bump keep CI green.
v0.10.0
5 entries
Changed
  • GLM template moved to a three-tier model mapping: Opus slot now uses glm-5.2[1m], sonnet uses glm-5.1, haiku uses glm-5-turbo. The previous template put GLM-5.1 in opus and reused GLM-5-Turbo for both sonnet and haiku, so there was no real middle tier.
  • GLM-5.2 is the new opus-tier model with a 1,000,000-token context window, exposed through the [1m] model-name suffix. GLM-5.1 and GLM-5-Turbo are 200K models.
  • Removed the global CLAUDE_CODE_AUTO_COMPACT_WINDOW (131072) and CLAUDE_AUTOCOMPACT_PCT_OVERRIDE overrides from the GLM template. A single global window cannot fit a 1M model and two 200K models at once, so each tier now carries its own size: the [1m] suffix for GLM-5.2, and Claude Code's default 200K assumption for the other two, which matches their real limit.
  • Updated GLM model and context-window references across the provider docs, FAQ, environment-variables guide, and glossary to reflect the three models.
v0.9.0
3 entries
Changed
  • Kimi template updated with tiered model mapping: Opus slot now uses kimi-k2.7-code, sonnet uses kimi-k2.6, haiku uses kimi-k2.5. Previous template used kimi-k2.5 for all roles.
  • Kimi template context window corrected from 128K to 256K (matching actual model spec).
v0.8.2
6 entries
Added
  • Granular sync modes for plugins and skills: Replaced the binary auto-sync toggle (on/off) with three sync modes: auto (symlink entire directories, existing behavior), half-manual (symlink individual plugins/skills, new installs stay isolated), and full-manual (independent copy, no symlinks). Only downgrades are allowed: auto → half-manual → full-manual.
    • New CLI flags: --half-manual, --sync-mode <mode> on the add command.
    • auto-sync command now accepts: auto, half-manual, full-manual, on (legacy), off (legacy).
    • halfSyncPluginsAndSkills() in config.ts: converts whole-directory symlinks to real directories with individual item symlinks.
    • getSyncMode() resolves the effective mode from the new syncMode field, falling back to the deprecated autoSync boolean for backward compatibility.
    • canConvertSyncMode() and availableSyncModeConversions() in constants.ts enforce downgrade-only rule.
    • copyAllFromDefault() now accepts a SyncMode parameter instead of a boolean.
    • detectBrokenSymlinks() now detects broken individual symlinks inside real directories (half-manual mode), in addition to broken directory-level symlinks.
    • TUI ToggleAutoSync screen rewritten as Sync Mode screen with color-coded mode labels and available-downgrade display.
    • Instance info screen (ShowInstanceInfo) shows sync mode with color-coded labels instead of binary on/off.
    • plugin install/remove commands blocked when instance is in half-manual mode (individually symlinked plugins cannot be individually managed).
    • fix-symlinks command handles all three modes.
Changed
  • Responsive header with hamburger dropdown navigation: The docs site header now collapses into a hamburger menu on tablet/mobile viewports (< 60rem). A custom <nav-dropdown> web component handles open/close with keyboard escape, outside-click dismiss, and coordination with Starlight's mobile sidebar.
  • Sticky sidebar with CSS grid overlay: On desktop (≥ 72rem), the docs page uses a CSS grid where the sidebar and main content overlap in the same grid cell. The sidebar uses position: sticky so it scrolls with the page but stops at the bottom, never overlapping the site footer.
  • SSR site footer: A full-width site footer is now injected during Astro's SSR build via a Vite plugin, so it spans the full viewport without sidebar overlap. Includes product links, docs links, and version number.
  • Header spacing and navigation density adjusted for better visual balance.
  • Instance.autoSync field deprecated in favor of Instance.syncMode. Old configs with autoSync: false resolve to full-manual via getSyncMode().
v0.8.1
3 entries
Fixed
  • CLI build output moved from dist/ to build/: The CLI and Astro docs builds both output to dist/, causing the published npm package to contain the docs site HTML instead of cli.js. Global installs would fail with Module not found ... dist/cli.js. The CLI now builds to build/cli.js, eliminating the collision.
  • Updated bin/claude-multi.js to resolve ../build/cli.js instead of ../dist/cli.js.
  • Updated CI workflows (ci.yml, publish.yml) to verify build/cli.js instead of dist/cli.js.
v0.8.0
6 entries
Changed
  • MiniMax template updated from M2.7 to M3: All model slots now point to MiniMax-M3 (opus, sonnet, haiku, small/fast). M3 brings a 1M-token context window, frontier-level coding and agentic scores, native image/video input, and toggleable thinking.
  • Removed auto-compaction override from the MiniMax template. M3's 1M context window makes the 128K override unnecessary.
  • MiniMax template MAX_OUTPUT_TOKENS raised from 64K to 512K.
  • MiniMax template CLAUDE_CODE_EFFORT_LEVEL set to max.
  • MiniMax template description updated to reflect M3 capabilities.
v0.7.0
19 entries
Changed
  • Removed pinned Claude Code binary: claude-multi no longer installs its own copy of @anthropic-ai/claude-code into ~/.claude-multi/bin/. All instance wrappers now resolve to the user's globally installed claude binary via which claude/where claude. This means instances auto-update together with the global claude binary.
  • getClaudePath() in wrapper.ts simplified to two priorities: CLAUDE_MULTI_CLAUDE_PATH env override, then global PATH. The pinned binary check was removed.
  • doctor fix no longer installs a pinned Claude binary. It verifies claude is available in PATH and regenerates stale wrappers.
  • Health check for wrapper binary paths now compares against the resolved global claude path instead of PINNED_CLAUDE_BIN. Also gained a Windows .cmd regex pattern.
  • fixWrapperVersions() in health.ts rewritten to use tryGetClaudePath() instead of PINNED_CLAUDE_BIN.
  • Instance migration (v0.6.2) updated to use tryGetClaudePath() instead of the deleted tryGetGlobalClaudePath(). Added console.warn when claude binary is not found during wrapper regeneration.
  • TUNABLE_ENV_VARS local duplicate removed from migration.ts v0.6.3. Now imports the canonical set from constants/env.ts (was missing CLAUDE_CODE_AUTO_COMPACT_WINDOW and CLAUDE_AUTOCOMPACT_PCT_OVERRIDE).
  • PATH membership check in the add command uses path.dirname() and path.delimiter instead of Unix-specific lastIndexOf('/') and split(':').
  • where claude output split fixed to handle Windows \r\n line endings.
  • Version warning banner and isThirdPartyApiBroken check removed from the TUI (the affected versions are ancient).
Removed
  • PINNED_BIN_DIR and PINNED_CLAUDE_BIN constants from paths.ts.
  • COMPATIBLE_CLAUDE_VERSION, isThirdPartyApiBroken(), getPinnedBinaryVersion(), installPinnedClaude() from version.ts.
  • getGlobalClaudePath() and tryGetGlobalClaudePath() from wrapper.ts (became identical to getClaudePath() and tryGetClaudePath() after pinning removal).
  • ccVersion state, installFailed doctor result, and version warning banner from App.tsx.
Fixed
  • v0.6.3 migration TUNABLE_ENV_VARS local duplicate was missing two entries (CLAUDE_CODE_AUTO_COMPACT_WINDOW, CLAUDE_AUTOCOMPACT_PCT_OVERRIDE), causing auto-compaction settings to be overwritten with template defaults during migration.
  • Health check and doctor fix were fighting the v0.6.2 migration: migration set wrappers to global path, doctor overwrote them back to pinned binary. Both now use the same global path resolution.
  • where claude output on Windows was split on \n only, missing \r\n carriage returns.
  • add command PATH check was Unix-only (lastIndexOf('/') and split(':')).
  • Health check had no regex for Windows .cmd wrapper format.
v0.6.5
10 entries
Added
  • 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).
  • 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.
  • detectTemplateMismatch() and detectWrapperMismatch() in instance-diagnostics.ts: compare an instance's current settings/wrapper against the expected provider template.
  • 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.
Changed
  • 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.
  • Post-migration stale state fixed: After running doctor fix, the health check warning no longer persists. The config is now reloaded before health checks re-run.
  • Migration lock staleness: Added a 30-minute staleness check to the migration lock file. Prevents stale locks from blocking migrations after crashes or PID reuse.
  • Atomic health status writes: saveHealthStatus() now uses write-to-temp + rename to prevent file corruption on crash or concurrent access.
  • Doctor fix guard: handleDoctorFix is now guarded against double-invocation from rapid keypresses.
  • Removed pre-existing TypeScript type errors in migration.ts v0.6.3 migration body (narrow Record type inference on newEnv).
v0.6.4
3 entries
Added
  • Instance migration (0.6.3) syncs provider template env vars to existing instances. Detects the provider from ANTHROPIC_BASE_URL in settings.json and re-applies the latest template (model names, thinking tokens, output limits). Preserves API keys and user-added env vars.
  • detectProvider() and getProviderByBaseUrl() in templates.ts match a base URL to a provider template name.
  • providerTemplate field on the Instance type. New instances store it; migration backfills it for existing instances.
v0.6.3
24 entries
Changed
  • Instance migrations regenerate wrappers pointing to the globally installed claude binary (via which claude), not the pinned binary at ~/.claude-multi/bin. Wrappers that already match the expected content are left untouched.
  • runMigration and createBackup are synchronous now (had no await expressions).
  • MiMo (pay-per-token and Token Plan) models bumped to mimo-v2.5-pro[1m] and mimo-v2.5[1m] (1M context window variants).
  • Kimi opus model changed from kimi-k2.6 to kimi-k2.5.
  • Provider templates now include explicit thinking and output token limits:
    • MiniMax: 32K thinking, 64K output
    • DeepSeek: 32K thinking, 128K output
    • MiMo (both plans): 128K output
    • Kimi: 16K thinking, 64K output
    • Qwen and Qwen Coding Plan: 16K thinking, 64K output
Added
  • getGlobalClaudePath() and tryGetGlobalClaudePath() in wrapper.ts resolve the claude binary from the env override or PATH, skipping the pinned binary.
  • 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.
Fixed
  • 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.
Added
  • 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.
  • doctor and the TUI health screen report when instance migrations are pending or when an instance is running an older version.
  • doctor fix shows which instances need migration and asks for confirmation before running.
  • Version column added to list, info, and the Ink TUI instance cards and detail screens.
Changed
  • instanceMigrationVersion in config now stores the actual package version rather than a separate numbering scheme.
  • The legacy sentinel ("0.5") is defined once as LEGACY_INSTANCE_VERSION and imported everywhere, instead of being hardcoded in multiple files.
  • 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.
  • Instance migration only rewrites wrappers when the file content differs (version check + content diff), instead of unconditionally regenerating every wrapper.
  • fixWrapperVersions uses the canonical template targeting the pinned binary explicitly, with a content-diff check to avoid unnecessary writes.
Fixed
  • Removed broken compareVersions references from version.test.ts.
  • resolveClaudePath() in migration.ts used await in a non-async function (TypeScript error). Removed, replaced by generateWrapperScriptSafe from wrapper.ts.
  • Unused imports (COMPATIBLE_CLAUDE_VERSION, installPinnedClaude, getPinnedBinaryVersion, isThirdPartyApiBroken, PINNED_CLAUDE_BIN) removed from migration.ts.
  • config.ts loadConfig backfill loop now handles noUncheckedIndexedAccess correctly (pre-existing TypeScript error).
  • createBackup changed from async to sync (had no await expressions, pre-existing lint warning).
  • Array .sort() / .reverse() calls in migration.ts and config.ts changed to .toSorted() / .toReversed() (pre-existing lint warnings).
  • Duplicate existsSync import in test/wrapper.test.ts merged into single import.
v0.6.1
5 entries
Changed
  • Pinned Claude version updated from 2.1.153 to 2.1.156. isThirdPartyApiBroken() now covers v2.1.154 through v2.1.155.
  • Auto-updates re-enabled. PROVIDER_COMMON_ENV no longer injects DISABLE_AUTOUPDATER/DISABLE_UPDATES. autoUpdates set to true in instance state.
  • 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.
  • Unknown CLI subcommands exit with an error instead of falling through to the Ink TUI.
  • All version pinning and compatibility code tagged with [SAFE PARK] comments for easy discovery and reactivation.
v0.6.0
8 entries
Added
  • 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.
  • Version verification on pinned binary: getPinnedBinaryVersion() reads the installed version and triggers a reinstall if it's v2.1.154-v2.1.155.
  • COMPATIBLE_CLAUDE_VERSION constant (src/version.ts): single source of truth for the pinned version (2.1.156).
  • PINNED_CLAUDE_BIN in src/paths.ts: shared path constant (previously duplicated in wrapper.ts and health.ts).
Changed
  • Global version banner: now reads "Run 'claude-multi doctor fix' to install a compatible version" instead of the passive "wait for a fix" message.
  • 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.
  • 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.
Fixed
  • Tests: integration tests updated for current version and help output.
v0.5.8
4 entries
Added
  • 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.
  • 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.
Changed
  • --provider error message (src/cli.ts): unknown provider error now dynamically lists all available providers instead of hardcoding three names.
  • 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.
v0.5.7
3 entries
Added
  • Provider templates (src/templates.ts): five new AI provider templates
    • Xiaomi MiMo (mimo): MiMo-V2.5-Pro and MiMo-V2.5 via xiaomimimo.com, pay-per-token API
    • 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
    • Moonshot Kimi (kimi): Kimi K2.6 (opus) and Kimi K2.5 (sonnet/haiku) via moonshot.ai, pay-per-token
    • Alibaba Qwen (qwen): Qwen3-Coder-Next/Plus/Flash via Alibaba DashScope, pay-per-token API
    • Alibaba Qwen Coding Plan (qwen-coding): Qwen3-Coder-Next/Plus/Flash via DashScope Coding Plan subscription
Changed
  • 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)
  • 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
v0.5.6
6 entries
Added
  • robots.txt route (src/web/pages/robots.txt.ts): serves sitemap reference and user-agent directives for the docs site
Changed
  • Runtime-agnostic launcher (bin/claude-multi.js): polyglot bin entry is simultaneously valid POSIX sh and ESM JavaScript
    • On Linux/macOS: shell shebang detects bun/node/deno and execs the correct runtime
    • On Windows + bun global install: bun's .exe shim reads the .js extension and runs directly as ESM, no /bin/sh lookup required
    • On Windows + npm install: npm's .cmd shim calls node on the .js file
    • Shebang changed to #!/usr/bin/env bun so bun's Windows shim can resolve itself in PATH
CI
  • Add cross-platform install verification workflow covering bun, node, and deno on Linux, Windows, and macOS
  • Separate build into its own job; test jobs download the artifact instead of rebuilding
  • Publish workflow now includes version bump step and enhanced post-publish verification
  • Add ci:test-install script to trigger the install-verification workflow from local
v0.5.5
15 entries
Added
  • Runtime detection (src/util/runtime.ts): detectPackageManager() identifies the active package manager (bun / npm / pnpm / deno) at runtime
Changed
  • Cross-runtime support: all package-manager operations (upgradeClaudeMulti, getCurrentVersion, updateClaudeCode) now use the detected package manager instead of hard-coding bun commands
  • getLatestVersion() replaced bun pm npm view with a direct fetch() to the npm registry, works in any runtime
  • getDefaultBinaryPath() selects the correct global bin directory for the active package manager on Windows (was always %LOCALAPPDATA%\bun\bin)
  • Generated wrapper shebang changed from #!/usr/bin/env bun to #!/usr/bin/env node
  • Default action (no subcommand) always launches the Ink TUI and awaits waitUntilExit(), the CLAUDE_MULTI_INK=false prompts fallback is removed
  • Update check is now opt-in: set CLAUDE_MULTI_UPDATE_CHECK=true to enable; it no longer runs on every invocation
  • Removed interactive / i command alias (default action covers this)
Fixed
  • AddInstance provider selection: choosing "None" now correctly resets selectedProvider to null and sets useProvider to false; choosing a provider correctly sets useProvider to true
  • getCurrentVersion() handles pnpm's array-shaped JSON response
CI
  • Publish workflow: skip git tag creation when the tag already exists remotely
  • Publish workflow: make git tagging optional via workflow input
  • Switch publish workflow from bun to npm with OIDC trusted publishing (no token)
  • Update Node.js to 24.x in CI and deployment workflows
  • Add ci:publish script to trigger versioned publish from local
v0.5.1
1 entry
Changed
  • Interactive-first launch: Running claude-multi with no arguments now opens the Ink TUI directly instead of printing help text
    • CLI subcommands (add, remove, list, etc.) continue to work as before
    • --help and --version flags are unaffected
    • CLAUDE_MULTI_INK=false still falls back to the prompts-based interactive mode
v0.5.0
32 entries
Added
  • Ink-based Interactive UI: Full terminal UI built with Ink + React
    • Home screen with instance list, menu, and health warning banner
    • Animated components: Header, StatusBar, StepIndicator, InstanceCard, IssueCard, WarningBanner
    • Screens: AddInstance, RemoveInstance, ShowInstanceInfo, ToggleAutoSync, FixSymlinks, HealthScreen, ManagePlugins, ManageMcp, ListInstances
    • Keyboard navigation: arrow keys, Enter, ESC, ! for health, q to quit
    • useConfig, useNavigation, useHealthCheck, useAnimations hooks
  • Per-Instance Plugin Management: Granular plugin control per instance
    • PluginInfo interface with id, name, category (internal/external), hasMcp, mcpServerNames, enabled, isSymlink
    • scanPluginsFromDir() discovers plugins from both plugins/ and external_plugins/ subdirs
    • listDefaultPlugins() / listInstancePlugins() for querying available and installed plugins
    • copySinglePlugin() / copySelectedPlugins() for individual or batch install with rollback
    • removeSinglePlugin() with rename-to-backup safety pattern
    • detectMcpCollisions() to check MCP server name conflicts before install
    • validatePluginOperation() pre-flight checks (configDir, symlink, plugin existence, collisions)
    • Handles 12 internal LSP plugins without plugin.json (falls back to dir name)
    • Supports both flat {"serverName": config} and nested {"mcpServers": {"serverName": config}} .mcp.json formats
    • Coordinates with installed_plugins.json v2 format (scope, installPath, version, timestamps)
    • Symlink detection: refuses per-plugin operations when auto-sync is active
  • Migration System (src/migration.ts): Safe v1 → v2 config upgrade
    • runMigration() with 4-step procedure: backup → validate → transform → save
    • PID-based lock file prevents concurrent migrations
    • Automatic backup of config.json + instance settings.json (keeps last 3)
    • Failure flag: sets migrationStatus: "failed" with error details, prevents auto-retry
    • clearMigrationFailure() for explicit retry
    • CLAUDE_MULTI_HOME env override for testability
  • Health Check System (src/health.ts): Detects and reports issues
    • Checks: migration failure, missing configDir, missing binary, corrupted settings.json, broken symlinks
    • Persistent health status at ~/.claude-multi/health-status.json
    • dismissIssue() / dismissAllIssues() for acknowledging warnings
    • Warning banner on home screen with ! key to review
    • HealthScreen with list/detail views, retry, dismiss actions
  • ManagePlugins Screen: Full plugin management UI
    • Install plugins from default (MultiSelect with MCP badge, [ext] tag)
    • Remove installed plugins
    • Enable/disable plugins
    • List installed plugins with status indicators
    • Symlink detection with warning
  • ManageMcp Screen: Enhanced MCP server management
    • List MCP servers with source attribution ([pluginName] or [custom])
    • Add custom MCP server (name + JSON config input)
    • Remove custom MCP server (select from custom servers)
    • Verify MCP configuration
    • Copy between instances
  • CLI Plugin Commands: 5 new plugins sub-commands
    • plugins install <instance> <ids...>, install plugins with collision detection
    • plugins remove <instance> <ids...>, remove plugins with symlink guard
    • plugins list-defaults, list all 50 default plugins with category/MCP badges
    • plugins list-installed [instance], list installed plugins per instance
    • plugins check-collisions <instance> <ids...>, detect MCP name conflicts
  • Provider Templates: DeepSeek provider template added
  • Instance State: initializeInstanceState() creates .claude.json with hasCompletedOnboarding: true
  • Provider Env: mergeProviderEnv() integrates provider template env vars into instance settings
  • Screenshot Capture: scripts/capture-screens.tsx for automated UI screenshots
Changed
  • copyAllFromDefault() restored autoSync parameter for symlink-based plugin sync
  • syncPluginsAndSkills() creates actual symlinks instead of copying files
  • Broken symlink detection uses lstatSync (works when existsSync returns false)
  • ~/.claude is strictly read-only, never modified by any operation
  • Atomic file writes for both config.json and settings.json (temp-file-rename pattern)
  • Lazy path resolution in migration.ts and health.ts for testability
Fixed
  • syncPluginsAndSkills was doing recursive copy instead of creating symlinks
  • copyAllFromDefault autoSync parameter was removed, breaking symlink-based sync
  • Broken symlinks not cleaned before creating new ones (used lstatSync instead of existsSync)
  • isClaudeCodeRunning() blocked tests, skips in NODE_ENV=test
  • writeFileSync not imported in config.ts
  • McpSourceDetails prop name mismatch in ManageMcp
  • renameSync dynamic import in saveConfigAtomic replaced with top-level import
  • TypeScript: updateInstanceAutoSync object possibly undefined after bounds check
Tests
  • 155 tests, 0 failures across 16 test files
  • test/plugin-management.test.ts (18 tests): scanning, copy, remove, MCP helpers, atomic writes
  • test/e2e/plugin-flow.test.ts (6 tests): CLI plugin operations end-to-end
  • test/migration.test.ts (15 tests): migration, backup, lock, failure recovery
  • test/health.test.ts (15 tests): health checks, persistence, dismiss
  • test/ink/ (31 tests): component rendering, screen navigation, animation hooks
  • test/config.test.ts (53 tests): sync/unsync, copyAllFromDefault, symlink cycles
v0.4.3
7 entries
Added
  • Broken Symlink Detection: Automatically detect and fix broken symlinks
    • New isBrokenSymlink() and detectBrokenSymlinks() functions
    • Auto-fix broken symlinks when creating or updating instances
    • Handles edge cases: broken symlinks, existing directories, incorrect symlink targets
  • fix-symlinks Command: Fix broken symlinks for existing instances
    • Interactive instance selection with multi-select support
    • --all flag to fix all instances at once
    • Auto-fixes instances with auto-sync enabled, warns for manual mode
    • Clear status indicators for broken symlinks vs. valid symlinks
  • Interactive Re-sync: Added "Re-sync symlinks" option to interactive mode menu
    • Quick access to symlink diagnosis and repair from interactive UI
  • Test Suite: Comprehensive tests for symlink detection and fixing
    • Tests for broken symlink detection
    • Tests for valid symlink handling
    • Tests for mixed scenarios (broken + valid symlinks)
    • Error handling tests for non-existent paths
Fixed
  • Symlink creation now uses lstatSync for proper broken symlink detection
  • Previously, existsSync() returned false for broken symlinks, preventing detection
  • Now correctly identifies and repairs broken symlinks in all scenarios
v0.4.2
2 entries
Fixed
  • Auto-sync symlinks now use absolute paths instead of relative paths
    • Previously used hardcoded ../../.claude/ which assumed instances were in ~/.claude-instances/
    • Now uses homedir() to resolve absolute paths, working for any instance location
    • Fixes broken symlinks when instances are created directly in home directory (e.g., ~/.claude-tester/)
Added
  • Symlink test suite to verify both relative and absolute symlink behaviors
v0.4.1
3 entries
Added
  • Test Suite: Comprehensive sandboxing tests for auto-sync functionality
    • 46 tests covering syncPluginsAndSkills, unsyncPluginsAndSkills, copySettingsFromDefault, and copyAllFromDefault
    • Real file system operations in temporary directories with complete isolation
    • AutoSyncTestHelper class for test utilities and assertions
    • Test helper functions to override default Claude directory for testing
    • Integration tests for sync/unsync cycles and auto-sync toggle
Fixed
  • macOS compatibility: Fixed rmSync usage to properly handle both symlinks and directories
  • Security: copySettingsFromDefault now uses whitelist approach to only copy safe settings (exclude sensitive data like env and mcpServers)
v0.4.0
6 entries
Added
  • Auto-Sync for Plugins and Skills: Share plugins/skills across instances via symlinks
    • New --auto-sync and --manual flags for add command
    • Auto-sync enabled by default when copying all files
    • auto-sync <name> <on|off> command to toggle for existing instances
    • Interactive mode option to toggle auto-sync setting
    • Instance info/list now display auto-sync status
  • Bun Runtime Support: Migrated from npm/node to Bun
    • All npm commands replaced with bun equivalents
    • Build target changed from node to bun
    • Shebangs updated to use bun instead of node
    • Windows binary path changed to %LOCALAPPDATA%\bun\bin
Changed
  • Plugins and skills directories now use symlinks by default (auto-sync mode)
  • When auto-sync is enabled, plugins/skills are symlinked from ~/.claude
  • When auto-sync is disabled, files are copied to instance config directory
Fixed
  • Removed unused code and improved error handling
v0.3.0
4 entries
Added
  • Provider Templates: Built-in templates for popular AI providers
    • GLM (智谱AI) template with GLM-4.5-air and GLM-4.6 models
    • MiniMax template with MiniMax-M2 model
    • Interactive provider selection with secure API key prompt
    • CLI flags: --provider <name> and --api-key <key>
    • Auto-configuration of base URLs, model mappings, and optimal settings
  • Quick Start Guide: Added quick start section with provider template examples
Changed
  • Interactive mode now prompts for provider templates before config copying
  • Enhanced instance creation flow with provider-first approach
v0.2.0
9 entries
Added
  • Windows Support: Full cross-platform support for Windows
    • Generates .cmd batch wrapper scripts on Windows
    • Uses where command instead of which on Windows
    • Default binary path set to %APPDATA%\npm on Windows
    • Skips Unix-specific chmod operations on Windows
  • Cross-platform CI: GitHub Actions now tests on Ubuntu, Windows, and macOS
  • Platform Documentation: Added platform-specific notes and Windows PATH setup guide
  • Test Suite: Added comprehensive tests for wrapper script generation on all platforms
Changed
  • Binary naming convention: Windows wrappers now use .cmd extension (e.g., claude-test.cmd)
  • Improved getClaudePath() to handle platform-specific path detection
  • Enhanced wrapper generation to create appropriate script types per platform
Fixed
  • TypeScript strict null checks in config.ts
  • Windows compatibility issues with shebang and chmod operations
v0.1.0
13 entries
Added
  • Initial release
  • Basic instance management (add, remove, list, info)
  • Wrapper script generation for multiple Claude Code instances
  • Interactive and non-interactive modes for creating instances
  • Settings and config copying from default Claude installation
  • MCP (Model Context Protocol) server configuration support
  • Version checking and update commands
  • CI/CD workflows for automated testing and npm publishing
Features
  • Create isolated Claude Code instances with custom aliases
  • Copy settings, plugins, and MCP configurations between instances
  • Manage multiple instances simultaneously
  • Support for custom config and binary paths
  • Command-line interface built with Commander.js