Tính năng
Quản lý tài khoản
Trang này được dịch máy từ tiếng Anh. Mọi góp ý chỉnh sửa đều được hoan nghênh. Sửa trang này trên GitHub
Mỗi tài khoản ccam là một thư mục cấu hình Claude Code riêng với thông tin đăng nhập riêng. Các lệnh này tạo, đăng nhập, liệt kê, đổi tên và xóa tài khoản, cũng như đăng ký các thư mục bạn đã có.
Cách dùng
ccam add # wizard on a terminal: name, shared items, shortcut, login
ccam add work --shortcut ccwork # no wizard: log in, then create the ccwork command
ccam add side --no-login --share history=team
ccam login side # run claude auth login inside the account
ccam logout side # remove the login token
ccam list # table of accounts; ccam ls is the same
ccam list --json # machine-readable
ccam use 2 # make slot 2 the default account
ccam rename side personal
ccam remove personal # asks, then moves the folder to the trash
ccam import # find ~/.claude and ~/.claude-* and ask about each
ccam import ~/.claude-ops --name ops
ccam completion zsh > "${fpath[1]}/_ccam"Ở bất kỳ lệnh nào nhận <name|number>, bạn có thể đưa tên tài khoản hoặc số slot của nó, tức cột # của ccam list.
ccam add chạy trên terminal mà không có tùy chọn nào sẽ mở một trình hướng dẫn. Nó hỏi tên, rồi hiển thị một danh sách kiểm (checklist) các mục dùng chung (mọi thứ trừ lịch sử hội thoại đã được đánh dấu), rồi hỏi Create a shortcut command for work? [y/N] và, nếu bạn trả lời y, hỏi tiếp Shortcut name [ccwork]:. Bất kỳ tùy chọn nào trong --share, --shortcut hoặc --no-login, hoặc một pipe thay cho terminal, đều bỏ qua trình hướng dẫn; khi đó bắt buộc phải có tên và không có lệnh tắt nào được tạo trừ khi --shortcut nêu tên một lệnh.
ccam list hiển thị slot, tên, lệnh tắt, email, các mục dùng chung và lần dùng gần nhất, với * đứng trước tài khoản mặc định:
$ ccam list
# Name Shortcut Email Shared Last used
* 1 work ccwork user@example.com mcp settings md ext -
2 personal - me@side.dev settings md ext history@team -Với --json, mỗi tài khoản là một đối tượng gồm slot, shortcut, name, email, default, dir, last_used (bị bỏ đi khi tài khoản chưa từng được khởi động) và share. share ánh xạ từng mục (mcp, settings, memory, extensions, history) tới tên nhóm của nó hoặc tới "local".
Tùy chọn
| Tùy chọn | Tác dụng | Mặc định |
|---|---|---|
ccam add --no-login |
Tạo tài khoản mà không đăng nhập; đăng nhập sau bằng ccam login <name> |
tắt |
ccam add --share <item=group> |
Dùng chung một mục với một nhóm, hoặc item=local để giữ riêng. Có thể lặp lại |
mcp, settings, memory, extensions trong default; history riêng |
ccam add --shortcut <command> |
Tạo thêm lệnh tắt này trong ~/.local/bin |
không có |
ccam list --json |
In các tài khoản dưới dạng JSON | tắt |
ccam remove -y, --yes |
Xóa mà không hỏi | tắt |
ccam import --name <name> |
Tên tài khoản cho thư mục bạn đưa vào | lấy từ tên thư mục |
ccam import -y, --yes |
Nhập mọi thư mục tìm thấy mà không hỏi | tắt |
--dry-run |
Được ccam list và ccam completion hỗ trợ, vì chúng không thay đổi gì. Bị add, login, logout, use, rename, remove và import từ chối, với thông báo --dry-run is not supported by `ccam add`; nothing was changed (nêu tên lệnh) |
tắt |
ccam login, ccam logout, ccam use và ccam rename không có tùy chọn riêng. ccam completion nhận bash hoặc zsh; giá trị khác sẽ thất bại với only bash and zsh are supported.
Tên tài khoản dài từ 1 đến 32 ký tự gồm a-z, 0-9, - và _, bắt đầu bằng một chữ cái hoặc chữ số. Tên không được chỉ gồm chữ số, vì ccam 2 nghĩa là slot 2. Tên cũng không được trùng với một lệnh của ccam (add, list, ls, run, use, next, usage, u, share, mcp, login, logout, rename, remove, rm, import, migrate, doctor, shims, shortcut, completion, help, version, statusline, update), nên ccam <name> không bao giờ mơ hồ. Danh sách này là config.Reserved trong internal/config.
Cách hoạt động
ccam add work --shortcut ccwork chạy các bước sau trong addProfile (internal/cli/profiles.go):
config.ValidateNamekiểm tra tên, vàshim.Checkkiểm tra lệnh tắt trước khi bất cứ thứ gì được tạo.profile.Addtạo~/.local/share/ccam/profiles/work/với quyền0700và gán cho tài khoản số slot trống thấp nhất (Config.NextSlot), nên số của một tài khoản đã xóa sẽ được dùng lại. Tài khoản đầu tiên trở thành tài khoản mặc định.applyShareliên kết thư mục mới, còn trống vào các nhóm dùng chung của nó bằngshare.BuildrồiApply, ví dụsettings.jsontớigroups/default/settings.json. Nếu bước này thất bại, thư mục mới bị xóa, vì một thư mục còn sót lại sẽ chặn mọi lần thử lại vớifolder already exists.- Tài khoản được lưu vào
~/.config/ccam/config.tomlquafsutil.AtomicWrite: một tệp tạm,fsync, rồirename, nên một sự cố không bao giờ để lại cấu hình dở dang. runLoginkhởi độngclaude auth loginvớiCLAUDE_CONFIG_DIRtrỏ tới thư mục tài khoản. Nếu đăng nhập thất bại, tài khoản vẫn được giữ, và ccam in ra lỗi cùng lời nhắc chạyccam login worksau.profile.ReadEmaillấyoauthAccount.emailAddressra khỏiprofiles/work/.claude.json. Tệp đó có thể nặng vài megabyte, nênTopLevelValuechỉ quét tìm một khóa đó thay vì phân tích cả tệp.shim.Installliên kết~/.local/bin/ccworktới tệp thực thi ccam, và khi khởi động tệp này traargv[0]trongconfig.toml.
Việc đăng nhập có thể mất vài phút, và trong lúc đó một ccam khác có thể lưu cấu hình. Vì vậy các lệnh phải chờ sẽ lưu qua env.update, hàm này tải lại config.toml, áp dụng đúng một thay đổi (ở đây là email) rồi lưu. ccam remove cũng tải lại sau câu hỏi xác nhận vì lý do tương tự.
ccam login chạy bước 5 và 6 cho một tài khoản đã có. ccam logout chạy claude auth logout trong tài khoản và xóa email đã lưu. ccam use chỉ ghi lại default trong config.toml.
Đăng nhập trên máy từ xa
Qua SSH, phần trình duyệt của claude auth login có thể không hoạt động. Claude Code chờ việc đăng nhập trên một máy chủ callback tại http://localhost:<port>/callback trên máy chủ, nhưng trình duyệt hoàn tất việc đăng nhập lại chạy trên máy tính của bạn, nơi địa chỉ đó không dẫn đến đâu và trình duyệt hiển thị lỗi như ERR_CONNECTION_REFUSED. Địa chỉ đó vẫn mang mã dùng một lần, nên ccam có thể chuyển nó đi:
runLogin không giao terminal của bạn cho Claude Code. Nó nối đầu vào chuẩn của Claude Code với một pipe và relayLogin sao chép từng dòng bạn gõ vào đó, nên mã được dán ở lời nhắc Paste code here của Claude Code vẫn đến nơi. Khi một dòng là địa chỉ callback, callbackURL chỉ chấp nhận nó nếu máy chủ là localhost, 127.0.0.1 hoặc [::1], có cổng, đường dẫn là /callback và có cả code lẫn state; có thể bỏ http://. Sau đó deliverCallback gửi yêu cầu tới địa chỉ đó trên máy chủ với giới hạn 10 giây và không đi theo chuyển hướng, giống như trình duyệt lẽ ra đã làm. Yêu cầu đến máy chủ callback của claude auth login đang chờ (đường nét đứt trong sơ đồ). Claude Code nhận mã và lưu thông tin đăng nhập, trên Linux là trong .credentials.json ở thư mục tài khoản. Một dòng được dán vào không bao giờ khiến ccam liên lạc với máy chủ khác.
ccam in ra dòng này trước khi bắt đầu đăng nhập:
On a remote machine? If the browser ends on a http://localhost:…/callback page that does not load, paste that address here.Khi thành công, nó in ra → Passed the sign-in to Claude Code on this machine.
Đổi tên, xóa và nhập
ccam rename và ccam remove tác động lên thư mục của tài khoản và lên những gì ccam lưu ở nơi khác dưới tên tài khoản. nameState liệt kê các đường dẫn đó: ~/.local/state/ccam/last-used/<name>, ~/.local/state/ccam/mcp/<name> và các bộ nhớ đệm mức sử dụng ~/.local/state/ccam/usage/<name>.json và <name>.statusline.json. ccam remove work xử lý chúng theo thứ tự sau:
ccam remove trước tiên từ chối nếu tài khoản đang chạy, rồi mới hỏi. Nếu tài khoản dùng chung tiện ích mở rộng, RewritePluginPaths ghi lại installed_plugins.json và known_marketplaces.json của nhóm, vì Claude Code lưu đường dẫn plugin tuyệt đối có thể đi qua thư mục của tài khoản này. profile.Trash chuyển thư mục vào ~/.local/share/ccam/trash/<name>-<time>/, tài khoản bị gỡ khỏi config.toml, các đường dẫn nameState bị xóa để một tài khoản cùng tên sau này không thừa hưởng chúng, và liên kết lệnh tắt bị gỡ bỏ. Để khôi phục, hãy chuyển thư mục từ thùng rác về chỗ cũ.
ccam rename đổi tên thư mục, ghi lại các đường dẫn plugin trong plugins/ của nó từ thư mục cũ sang thư mục mới, giữ nguyên trạng thái mặc định, và chuyển các đường dẫn nameState sang tên mới. Lệnh tắt giữ nguyên tên. Nếu việc ghi lại plugin thất bại, thư mục được đổi lại tên cũ, vì cấu hình chưa được lưu.
ccam import đăng ký một thư mục ngay tại chỗ, dưới dạng dir trong config.toml. Nó không bao giờ di chuyển hay sao chép thư mục: một refresh token bị sao chép sẽ khiến các bản sao đăng xuất lẫn nhau. Không có đối số thư mục, nó tìm các thư mục ~/.claude và ~/.claude-* chưa được đăng ký và hỏi về từng thư mục; tên được lấy từ thư mục (~/.claude là main, ~/.claude-work là work, ~/.claude-2 là acct2), và thư mục không suy ra được tên sẽ được liệt kê kèm lệnh --name cần dùng. Khi không có CLAUDE_CONFIG_DIR, Claude Code giữ .claude.json trong thư mục home của bạn, cạnh ~/.claude, nên khi bạn nhập ~/.claude mà nó không có .claude.json riêng, ccam tạo liên kết ~/.claude/.claude.json tới ~/.claude.json. Khi đó claude thông thường và ccam main thấy cùng một tài khoản. Tài khoản được nhập không dùng chung gì cho đến khi bạn chạy ccam share, và không có lệnh tắt nào được tạo.
ccam completion bash|zsh in ra một script tự hoàn thành (completion), script này cũng hoàn thành cả tên tài khoản.
An toàn và các trường hợp đặc biệt
ccam renamevàccam removetừ chối khi tài khoản đang chạy (refuseRunning), vớiwork is running; quit its Claude Code session first, vì phiên vẫn tiếp tục ghi vào thư mục.ccam removetrên một tài khoản đã nhập chỉ hủy đăng ký nó:✓ main unregistered (folder ... left in place).~/.claudecủa bạn không bị chuyển vào thùng rác.ccam addtừ chối một tên mà thư mục của nó đã tồn tại trongprofiles/, và gợi ý dùngccam import.ccam importtừ chối một thư mục đã được đăng ký, một đường dẫn không phải thư mục, và một tên đã có người dùng.ccam logoutvàccam loginkhông kiểm tra tài khoản có đang chạy hay không.- Nếu phần chuyển tiếp không liên lạc được với Claude Code, chẳng hạn sau khi việc đăng nhập đã kết thúc, nó in ra
ccam: could not pass the sign-in to Claude Code:kèm lý do. Lỗi HTTP thường có nghĩa là mã đã hết hạn; hãy bắt đầu đăng nhập lại.