Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

cc-switch

English | 中文

Crates.ioDownloadsCILicensePlatforms

一个 CLI 工具,用于管理多个 Claude / Codex 配置并在它们之间自动切换。全平台支持:Linux、macOS、Windows(x86_64 + ARM64)。

零后台进程:cc-switch 切换配置、启动 Claude / Codex 后立即退出——不留守护进程、不监听端口、不占用资源。

📘 Codex 用户:完整配置管理文档请直接查看 docs/codex.md


核心特性

  • 🚀 零后台 — 启动 Claude / Codex 后立即退出,绝不驻留
  • 🛡️ 默认 Bypass Permissions On — cc-switch 启动 Claude 时自动加 --dangerously-skip-permissions,工具调用不再每次确认(详见下方说明)
  • 🧩 多配置切换 — 交互式 TUI + use 快捷命令
  • ⌨️ 天然支持 Vim 键位 — 交互模式下 j / k 上下移动、n / p 翻页,专为 Vim 极客而生
  • 🎯 StatusLine 集成 — 在 Claude Code 状态栏实时显示当前别名(详见 StatusLine 集成
  • 全 Shell 补全 + Fish 动态别名补全 — Fish / Zsh / Bash / PowerShell / Elvish 全部支持,Fish 额外提供 <Tab> 实时列出配置名
  • 📂 Codex 支持 — 同一工具管理 Claude 和 OpenAI Codex 两套认证
  • 🌍 全平台 — macOS / Linux / Windows(x86_64 + ARM64),自动处理 Windows 上的 npm claude.cmd / codex.cmd shim

🛡️ 关于默认 Bypass Permissions

无论是 cc-switch use <name> 还是交互模式选择配置,cc-switch 都会自动以 --dangerously-skip-permissions 启动 Claude——文件读写、Bash 执行等操作不再逐条弹出确认。这是为极客 / 重度用户优化的默认行为。

🌟 强烈推荐:先安装别名(cs / cx / co)

本文档所有示例都使用别名,请先一次性把下面三个别名加到 shell 配置里 —— 一行回车即可,后面的命令会短很多。

别名等价命令用途
cscc-switch主命令的短别名(输入 cs 即进入交互模式)
cxcc-switch codexCodex 子命令的短别名
cocc-switch ompOMP 子命令的短别名

Fish:

echo"alias cs='cc-switch'">> ~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">> ~/.config/fish/config.fish
echo"alias co='cc-switch omp'">> ~/.config/fish/config.fish

Zsh:

cat >>~/.zshrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

Bash:

cat >>~/.bashrc <<'EOF'alias cs='cc-switch'alias cx='cc-switch codex'alias co='cc-switch omp'EOF

PowerShell:

Set-Alias-Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

加完后重开终端(或 source 一下配置),下面所有示例就能直接用 cs / cx / co

快速开始

# 安装
cargo install cc-switch
# ===== Claude 配置 =====
cs add work sk-ant-work-xxx https://api.anthropic.com
cs # 进入交互菜单,选择 'work'
cs use work # 或直接切换并启动 Claude(cs 随后退出)# ===== Codex 配置 =====(完整文档:docs/codex.md)
cx add work --from-file # 默认从 ~/.codex/auth.json 导入
cx use work # 切换并启动 Codex# 列出所有配置
cs list # Claude
cx list # Codex

安装

macOS / Linux

方式 1 — Homebrew(推荐):

brew install Linuxdazhao/cc-switch/cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .tar.gz,将 cc-switch 放到 PATH 中。

Windows

方式 1 — Scoop(推荐,v0.1.18+):

scoop bucket add cc-switch https://github.com/Linuxdazhao/scoop-cc-switch
scoop install cc-switch

方式 2 — Cargo:

cargo install cc-switch

方式 3 — 预编译二进制:Releases 下载对应架构的 .zip,将 cc-switch.exe 放到 PATH 中。

主要命令

Claude 配置管理

命令作用
cc-switch add <名称>添加新配置
cc-switch list显示所有配置(JSON 或纯文本)
cc-switch remove <名称...>删除一个或多个配置
cc-switch use <名称>快速切换配置并启动 Claude(启动后 cc-switch 退出)
cc-switch进入交互模式

Codex 配置管理

命令作用
cc-switch codex add <名称>添加新配置
cc-switch codex list显示所有配置
cc-switch codex remove <名称...>删除配置
cc-switch codex use <名称>切换配置并启动 Codex
cc-switch codex进入交互模式

完整文档:docs/codex.md

通用命令

命令作用
cc-switch statusline install安装 Claude Code statusLine 包装器(显示当前别名)
cc-switch statusline uninstall卸载 statusLine 包装器
cc-switch completion <shell>生成 Shell 补全脚本

工作模式:为什么是"零后台"

cc-switch 是一个一次性命令

  1. 你执行 cs use work
  2. cc-switch 修改 ~/.claude/settings.json(或写入 ~/.codex/auth.json
  3. cc-switch 用新环境变量 exec 启动 claude --dangerously-skip-permissions(或 codex
  4. cc-switch 进程立即退出——后续完全是 Claude / Codex 自己在跑

这意味着:

  • ✅ 没有常驻进程、没有端口监听、没有 PID 锁
  • ✅ 不需要 cs start / cs stop
  • ✅ 关掉 Claude,环境也跟着结束,无残留
  • ✅ 退出后系统看不到任何 cc-switch 痕迹(除了配置文件)
  • 🛡️ 启动的 Claude 默认开启 bypass permissions(见上文核心特性中的说明)

高级用法

交互模式

# Claude 交互模式
cs
# Codex 交互模式
cx
# 导航操作(同时支持箭头键和 Vim 键位):# - ↑↓ 或 k/j:上下移动# - 1-9:直接跳转到对应配置# - N/PageDown:下一页(>9 个配置时)# - P/PageUp:上一页# - R:重置为默认 Claude(仅 Claude 模式)# - E:编辑配置# - Q:退出

快速切换(use 命令)

# 切换到指定配置并启动 Claude
cs use work
# 切换并发送提示词
cs use work "帮我写一个 Python 脚本"# 切换并恢复之前的会话
cs use work --resume c8439f36-44a9-4d85-9e88-de35e004fdd4
cs use work -r c8439f36-44a9-4d85-9e88-de35e004fdd4
# 切换并继续最近的会话
cs use work --continue
cs use work -c

完整配置添加

# 添加包含所有选项的配置
cs add work -t sk-ant-xxx -u https://api.anthropic.com \
-m claude-3-5-sonnet-20241022 \
--small-fast-model claude-3-haiku-20240307 \
--max-thinking-tokens 8192 \
--api-timeout-ms 300000 \
--disable-nonessential-traffic 1 \
--default-sonnet-model claude-3-5-sonnet-20241022 \
--default-opus-model claude-3-opus-20240229 \
--default-haiku-model claude-3-haiku-20240307
# 使用 DeepSeek API
cs add deepseek \
-t $DEEPSEEK_API_KEY \
-u https://api.deepseek.com/anthropic \
-m deepseek-v4-pro[1m] \
--default-opus-model deepseek-v4-pro \
--default-sonnet-model deepseek-v4-pro \
--default-haiku-model deepseek-v4-flash \
--subagent-model deepseek-v4-pro \
--disable-nonessential-traffic 1 \
--disable-nonstreaming-fallback 1 \
--effort-level max
# 强制覆盖添加
cs add work -t sk-ant-xxx -u https://api.anthropic.com -f
# 交互模式添加
cs add work -i
# 从 JSON 文件导入(需要显式提供别名)
cs add work --from-file # 从 ~/.claude/settings.json 导入
cs add work --from-file config.json # 从指定文件导入

存储模式

⚠️多开 Claude 实例时务必使用 env 模式(默认值)。

  • env 模式(默认,推荐):写入 settings.jsonenv 字段。Claude 在启动时把这些值读入进程环境变量,之后不再监听文件变化。多开多窗口、多会话各自独立,互不影响。
  • config 模式:写入 settings.json 的根级配置字段(camelCase)。Claude 在运行时会热读取最新值——这意味着你切换一次配置,所有正在运行的 Claude 实例都会被改成新配置。除非你确实只开一个窗口并希望切换立即生效,否则不要用。
cs --store env # 写入到 env 字段(默认,多开安全)
cs --store config # 写入到根级别 camelCase(会影响正在运行的实例)

列出配置

cs list # JSON 格式(默认)
cs list -p # 纯文本格式

移除多个配置

cs remove work
cs remove work personal test-config

配置迁移

# 从旧路径迁移(~/.cc_auto_switch/)到新路径
cs --migrate

StatusLine 集成

cc-switch 可以在 Claude Code 的状态栏左侧实时显示当前配置别名,方便你随时确认正在使用哪套 API。

# 安装(首次或升级后运行)
cs statusline install
# 卸载
cs statusline uninstall

工作方式:

  • cc-switch 生成一个 shell 包装脚本(~/.claude/cc_auto_switch_statusline.sh
  • 自动检测 ccstatusline(优先 bunx,回退到 npx),并把它作为底层 statusLine 命令
  • 状态栏前缀会显示 [别名],例如 [work] /Users/you/project | claude-sonnet-4-6 | $0.12
  • 如果你的 settings.json 里已有 statusLine 命令,会被包装而非覆盖
  • 卸载时自动还原为原始命令

依赖:系统需安装 bunnpm(用来运行 ccstatusline)。

Shell 集成

生成补全脚本

升级后请重新生成补全脚本,以获取新子命令(如 codexstatusline)的补全支持。

Fish / Zsh / Bash

# Fish(推荐,唯一支持动态别名补全)
cc-switch completion fish >~/.config/fish/completions/cc-switch.fish
# Zsh
cc-switch completion zsh >~/.zsh/completions/_cc-switch
echo'fpath=(~/.zsh/completions $fpath)'>>~/.zshrc
# Bash(含 Windows 上的 Git Bash)
cc-switch completion bash >~/.bash_completion.d/cc-switch
echo'source ~/.bash_completion.d/cc-switch'>>~/.bashrc
# Elvish 也受支持
cc-switch completion elvish

PowerShell(Windows)

不要直接将补全脚本重定向到 $PROFILE——这会覆盖已有的别名、模块或主题配置。请写入独立文件后再从 $PROFILE 中 dot-source:

$completionDir=Split-Path-Parent $PROFILEif (-not (Test-Path$completionDir)) { New-Item-ItemType Directory -Path $completionDir|Out-Null }
$completionPath=Join-Path$completionDir'cc-switch.completion.ps1'
cc-switch completion powershell |Out-File-Encoding utf8 $completionPath$line=". '$completionPath'"if (-not ((Test-Path$PROFILE) -and (Select-String-Path $PROFILE-Pattern ([regex]::Escape($line)) -Quiet))) {
Add-Content-Path $PROFILE-Value $line
}

该脚本是幂等的,可以反复执行。

CMD(Windows)

CMD 没有补全机制,直接使用命令即可。

补全支持矩阵

Fish / Zsh / Bash / PowerShell / Elvish 全部支持完整的子命令、参数、标志补全。 此外,所有 shell 都可启用"动态别名补全"——按 <Tab> 实时列出当前所有配置名(Fish 开箱即用;其他 shell 复制下文片段即可)。

Shell静态补全(命令 / 参数 / 标志)动态别名补全(use <Tab> 列出配置)
Fish✅ 自动自动(Claude + Codex 双模式)
Zsh✅ 自动⚙️ 需手动添加片段(见下
Bash✅ 自动⚙️ 需手动添加片段(见下
PowerShell✅ 自动⚙️ 需手动添加片段(见下
Elvish✅ 自动⚙️ 可用 edit:completion:arg-completer 自行实现

工作原理:cc-switch --list-aliasescc-switch --list-codex-aliases 这两个标志会输出当前所有配置名,任何 shell 都可以调用。Fish 生成的脚本已经把它们接入补全;其他 shell 只需追加几行片段即可。

在其他 shell 中启用动态别名补全

以下片段都是追加cc-switch completion <shell> 生成的脚本之后,不会破坏静态补全。

Zsh 动态别名补全

把下面内容加到 ~/.zshrc必须在补全脚本被 source、compinit 完成之后):

_cc_switch_dynamic_aliases() {
local -a aliases
local words_count=$#words
local cmd1=$words[2]
local cmd2=$words[3]
# cc-switch codex use|remove <TAB>if [[ "$cmd1"=="codex"&& ("$cmd2" == "use"||"$cmd2" == "remove") &&$words_count-ge 4 ]];then
aliases=("${(@f)$(cc-switch --list-codex-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi# cc-switch use|switch|remove <TAB>if [[ ("$cmd1" == "use"||"$cmd1" == "switch"||"$cmd1" == "remove") &&$words_count-ge 3 ]];then
aliases=("${(@f)$(cc-switch --list-aliases 2>/dev/null)}")
compadd -a aliases
return 0
fi
}
# 在 clap 生成的 _cc-switch 之前优先匹配
compdef _cc_switch_dynamic_aliases cc-switch

Bash 动态别名补全

把下面内容加到 ~/.bashrc必须在 source ~/.bash_completion.d/cc-switch 之后):

_cc_switch_with_aliases() {
# 先让 clap 生成的补全跑一遍(处理子命令、flag 等)
_cc-switch "$@"# 然后在别名位置覆盖 COMPREPLYlocal cur="${COMP_WORDS[COMP_CWORD]}"local prev="${COMP_WORDS[COMP_CWORD-1]}"local cmd1="${COMP_WORDS[1]:-}"case"$prev"in
use|switch|remove)
if [[ "$cmd1"=="codex" ]];then
COMPREPLY=($(compgen -W "$(cc-switch --list-codex-aliases 2>/dev/null)" -- "$cur"))
else
COMPREPLY=($(compgen -W "$(cc-switch --list-aliases 2>/dev/null)" -- "$cur"))
fi
;;
esac
}
complete -F _cc_switch_with_aliases -o nosort cc-switch

PowerShell 动态别名补全

PowerShell 的 Register-ArgumentCompleter 可以和现有补全共存,无需替换。加到你的 PowerShell $PROFILE(或前述 cc-switch.completion.ps1 末尾):

Register-ArgumentCompleter-CommandName cc-switch -Native -ScriptBlock {
param($wordToComplete,$commandAst,$cursorPosition)
$tokens=$commandAst.CommandElements|ForEach-Object { $_.ToString() }
$count=$tokens.Countif ($count-lt2) { return }
$cmd1=$tokens[1]
$cmd2=if ($count-ge3) { $tokens[2] } else { '' }
# cc-switch codex use|remove <TAB>if ($cmd1-eq'codex'-and ($cmd2-eq'use'-or$cmd2-eq'remove')) {
cc-switch --list-codex-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
return
}
# cc-switch use|switch|remove <TAB>if ($cmd1-in'use','switch','remove') {
cc-switch --list-aliases 2>$null|Where-Object { $_-like"$wordToComplete*" } |ForEach-Object {
[System.Management.Automation.CompletionResult]::new($_,$_,'ParameterValue',$_)
}
}
}

别名安装回顾

别名在文档开头已经介绍(跳转)。这里再贴一遍便于查阅:

# Fishecho"alias cs='cc-switch'">>~/.config/fish/config.fish
echo"alias cx='cc-switch codex'">>~/.config/fish/config.fish
echo"alias co='cc-switch omp'">>~/.config/fish/config.fish
# Zsh / Bashecho"alias cs='cc-switch'">>~/.zshrc # 或 ~/.bashrcecho"alias cx='cc-switch codex'">>~/.zshrc
echo"alias co='cc-switch omp'">>~/.zshrc
# PowerShell
Set-Alias -Name cs -Value cc-switch
functioncx { cc-switch codex @args }
functionco { cc-switch omp @args }

💡 Fish 用户提示:使用 cs 别名时,按 Tab 同样能享受动态补全——Fish 会把别名解开到原命令进行补全。

导入 / 导出

Claude 配置从 JSON 导入

# 显式提供别名后从指定文件导入
cs add my-work --from-file my-work-config.json
# 期望的 JSON 格式:# {# "env": {# "ANTHROPIC_AUTH_TOKEN": "sk-ant-xxx",# "ANTHROPIC_BASE_URL": "https://api.anthropic.com",# "ANTHROPIC_MODEL": "claude-3-5-sonnet-20241022"# }# }

Codex 配置从 auth.json 导入

cx add work --from-file # 默认 ~/.codex/auth.json

完整文档:docs/codex.md

工作原理

cc-switch 将配置存储在 ~/.claude/cc_auto_switch_setting.json 中:

  • Claude 配置:更新 Claude 的 settings.json 文件,设置适当的环境变量
  • Codex 配置:写入 ~/.codex/auth.json 文件,Codex CLI 从该文件读取认证信息

这意味着:

  • ✅ 不修改全局配置
  • ✅ 配置之间完全隔离
  • ✅ 安全的 API 密钥管理
  • ✅ 适用于任何 Claude / Codex 安装
  • ✅ 保留其他设置
  • ✅ 支持自定义设置目录

环境变量

Claude 配置

工具在切换配置时设置以下环境变量:

  • ANTHROPIC_AUTH_TOKEN - 你的 API 令牌
  • ANTHROPIC_BASE_URL - API 端点 URL
  • ANTHROPIC_MODEL - 自定义模型(可选)
  • ANTHROPIC_SMALL_FAST_MODEL - 后台任务快速模型(可选)
  • ANTHROPIC_MAX_THINKING_TOKENS - 最大思考令牌限制(可选)
  • API_TIMEOUT_MS - API 超时时间(毫秒)(可选)
  • CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC - 禁用非必要流量标志(可选)
  • ANTHROPIC_DEFAULT_SONNET_MODEL - 默认 Sonnet 模型(可选)
  • ANTHROPIC_DEFAULT_OPUS_MODEL - 默认 Opus 模型(可选)
  • ANTHROPIC_DEFAULT_HAIKU_MODEL - 默认 Haiku 模型(可选)
  • CLAUDE_CODE_SUBAGENT_MODEL - 子代理模型(可选)
  • CLAUDE_CODE_DISABLE_NONSTREAMING_FALLBACK - 禁用非流式回退标志(可选)
  • CLAUDE_CODE_EFFORT_LEVEL - 努力级别(可选,如 'max')
  • CC_SWITCH_CURRENT_ALIAS - 当前别名(由 cc-switch 自动注入,供 statusLine 读取)

Codex 配置

Codex 配置存储在 ~/.codex/auth.json,支持两种认证模式:

chatgpt 模式(OAuth)

  • id_tokenaccess_tokenrefresh_tokenaccount_id

apikey 模式

  • OPENAI_API_KEY

完整文档:docs/codex.md

开发

# 克隆
git clone https://github.com/Linuxdazhao/cc_auto_switch.git
cd cc-switch
# 构建
cargo build --release
# 测试
cargo test

许可证

MIT 许可证 - 详见 LICENSE_zh 文件。


Linuxdazhao 用 ❤️ 制作

About

管理多个 Claude / Codex 配置 + 可选的 Rust daemon 透明代理。📊 内置聚合仪表盘:实时查看请求、结构化对话、token 统计。⚡ 不开 daemon 时零后台:切换并启动 Claude / Codex 后立即退出。🌍 全平台:Linux / macOS / Windows(x86_64 + ARM64)。

Topics

Resources

Stars

21 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages