خصوصیات
اکاؤنٹس کا انتظام
اس صفحے کا انگریزی سے مشینی ترجمہ کیا گیا ہے۔ اصلاحات کا خیرمقدم ہے۔ اس صفحے میں GitHub پر ترمیم کریں
ccam کا ہر اکاؤنٹ Claude Code کا ایک الگ کنفیگ فولڈر ہے جس کا اپنا لاگ اِن ہوتا ہے۔ یہ کمانڈز اکاؤنٹس بناتی ہیں، ان میں سائن اِن کرتی ہیں، ان کی فہرست دکھاتی ہیں، ان کے نام بدلتی ہیں اور انہیں ہٹاتی ہیں، اور ان فولڈرز کو رجسٹر کرتی ہیں جو آپ کے پاس پہلے سے ہیں۔
استعمال
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"جہاں بھی کوئی کمانڈ <name|number> لیتی ہے، آپ اکاؤنٹ کا نام یا اس کا سلاٹ نمبر دے سکتے ہیں، یعنی ccam list کا # کالم۔
ٹرمینل پر بغیر آپشنز کے ccam add ایک وزرڈ کھولتا ہے۔ یہ نام پوچھتا ہے، پھر شیئر کیے جانے والے آئٹمز کی ایک چیک لسٹ دکھاتا ہے (گفتگو کی ہسٹری کے سوا سب کچھ چیک ہوتا ہے)، پھر Create a shortcut command for work? [y/N] پوچھتا ہے اور y پر Shortcut name [ccwork]:۔ --share، --shortcut یا --no-login میں سے کوئی بھی، یا ٹرمینل کے بجائے pipe، وزرڈ کو چھوڑ دیتا ہے؛ تب نام دینا لازمی ہے اور کوئی شارٹ کٹ نہیں بنتا جب تک --shortcut کسی کا نام نہ دے۔
ccam list سلاٹ، نام، شارٹ کٹ، ای میل، شیئر کیے گئے آئٹمز اور آخری استعمال دکھاتا ہے، اور ڈیفالٹ اکاؤنٹ سے پہلے * ہوتا ہے:
$ 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 ---json کے ساتھ ہر اکاؤنٹ ایک آبجیکٹ ہے جس میں slot، shortcut، name، email، default، dir، last_used (جب اکاؤنٹ کبھی شروع نہ ہوا ہو تو شامل نہیں) اور share ہوتے ہیں۔ share ہر آئٹم (mcp، settings، memory، extensions، history) کو اس کے گروپ کے نام یا "local" سے جوڑتا ہے۔
آپشنز
| آپشن | کیا کرتا ہے | ڈیفالٹ |
|---|---|---|
ccam add --no-login |
لاگ اِن کیے بغیر اکاؤنٹ بناتا ہے؛ بعد میں ccam login <name> سے لاگ اِن کریں |
بند |
ccam add --share <item=group> |
کسی آئٹم کو ایک گروپ کے ساتھ شیئر کرتا ہے، یا اسے نجی رکھنے کے لیے item=local۔ کئی بار دیا جا سکتا ہے |
mcp، settings، memory، extensions، default میں؛ history لوکل |
ccam add --shortcut <command> |
~/.local/bin میں یہ شارٹ کٹ کمانڈ بھی بناتا ہے |
کوئی نہیں |
ccam list --json |
اکاؤنٹس کو JSON میں پرنٹ کرتا ہے | بند |
ccam remove -y، --yes |
پوچھے بغیر ہٹاتا ہے | بند |
ccam import --name <name> |
آپ کے دیے گئے فولڈر کے لیے اکاؤنٹ کا نام | فولڈر کے نام سے اخذ |
ccam import -y، --yes |
ملنے والا ہر فولڈر پوچھے بغیر امپورٹ کرتا ہے | بند |
--dry-run |
ccam list اور ccam completion اسے لاگو کرتے ہیں، کیونکہ وہ کچھ تبدیل نہیں کرتے۔ add، login، logout، use، rename، remove اور import اسے --dry-run is not supported by `ccam add`; nothing was changed کے ساتھ مسترد کرتے ہیں (کمانڈ کے نام کے ساتھ) |
بند |
ccam login، ccam logout، ccam use اور ccam rename کے اپنے کوئی آپشنز نہیں۔ ccam completion، bash یا zsh لیتا ہے؛ اس کے علاوہ کچھ بھی only bash and zsh are supported کے ساتھ ناکام ہوتا ہے۔
اکاؤنٹ کے نام a-z، 0-9، - اور _ کے 1 سے 32 حروف ہوتے ہیں، جو کسی حرف یا ہندسے سے شروع ہوں۔ نام صرف ہندسوں پر مشتمل نہیں ہو سکتا، کیونکہ ccam 2 کا مطلب سلاٹ 2 ہے۔ نام کوئی 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)، اس لیے ccam <name> کبھی مبہم نہیں ہوتا۔ یہ فہرست internal/config میں config.Reserved ہے۔
یہ کیسے کام کرتا ہے
ccam add work --shortcut ccwork، addProfile (internal/cli/profiles.go) میں یہ مراحل چلاتا ہے:
- کچھ بھی بنانے سے پہلے
config.ValidateNameنام جانچتا ہے، اورshim.Checkشارٹ کٹ جانچتا ہے۔ profile.Add،~/.local/share/ccam/profiles/work/کو موڈ0700کے ساتھ بناتا ہے اور اکاؤنٹ کو سب سے کم خالی سلاٹ نمبر (Config.NextSlot) دیتا ہے، اس لیے ہٹائے گئے اکاؤنٹ کا نمبر دوبارہ استعمال ہوتا ہے۔ پہلا اکاؤنٹ ڈیفالٹ بن جاتا ہے۔applyShareنئے، خالی فولڈر کوshare.Buildاور پھرApplyسے اس کے شیئر گروپس سے لنک کرتا ہے، مثلاًsettings.jsonکوgroups/default/settings.jsonسے۔ اگر یہ ناکام ہو تو نیا فولڈر ہٹا دیا جاتا ہے، کیونکہ بچا ہوا فولڈر ہر دوبارہ کوشش کوfolder already existsکے ساتھ روک دے گا۔- اکاؤنٹ
fsutil.AtomicWriteکے ذریعے~/.config/ccam/config.tomlمیں محفوظ ہوتا ہے: ایک عارضی فائل،fsync، پھرrename، اس لیے کریش کبھی آدھا کنفیگ نہیں چھوڑتا۔ runLogin،CLAUDE_CONFIG_DIRکو اکاؤنٹ فولڈر پر مقرر کر کےclaude auth loginشروع کرتا ہے۔ اگر لاگ اِن ناکام ہو تو اکاؤنٹ برقرار رہتا ہے، اور ccam غلطی پرنٹ کر کے بتاتا ہے کہ بعد میںccam login workچلائیں۔profile.ReadEmail،profiles/work/.claude.jsonسےoauthAccount.emailAddressنکالتا ہے۔ یہ فائل کئی میگا بائٹ کی ہو سکتی ہے، اس لیےTopLevelValueپوری فائل پارس کرنے کے بجائے صرف اسی ایک key کو تلاش کرتا ہے۔shim.Install،~/.local/bin/ccworkکو ccam بائنری سے لنک کرتا ہے، جو شروع ہوتے وقتargv[0]کوconfig.tomlمیں تلاش کرتی ہے۔
لاگ اِن میں کئی منٹ لگ سکتے ہیں، اور اس دوران کوئی دوسرا ccam کنفیگ محفوظ کر سکتا ہے۔ اس لیے انتظار کرنے والی کمانڈز env.update کے ذریعے محفوظ کرتی ہیں، جو config.toml دوبارہ لوڈ کرتا ہے، صرف ایک تبدیلی (یہاں، ای میل) لاگو کرتا ہے اور محفوظ کرتا ہے۔ اسی وجہ سے ccam remove اپنے سوال کے بعد دوبارہ لوڈ کرتا ہے۔
ccam login کسی موجودہ اکاؤنٹ کے لیے مرحلہ 5 اور 6 چلاتا ہے۔ ccam logout اکاؤنٹ میں claude auth logout چلاتا ہے اور محفوظ ای میل صاف کر دیتا ہے۔ ccam use صرف config.toml میں default دوبارہ لکھتا ہے۔
ریموٹ مشین پر سائن اِن
SSH پر claude auth login کا براؤزر والا حصہ ٹوٹ سکتا ہے۔ Claude Code سرور پر http://localhost:<port>/callback کے ایک callback سرور پر سائن اِن کا انتظار کرتا ہے، لیکن جو براؤزر سائن اِن مکمل کرتا ہے وہ آپ کے کمپیوٹر پر چلتا ہے، جہاں یہ پتا کہیں نہیں جاتا اور براؤزر ERR_CONNECTION_REFUSED جیسی غلطی دکھاتا ہے۔ اس پتے میں پھر بھی ایک بار استعمال ہونے والا کوڈ ہوتا ہے، اس لیے ccam اسے پہنچا سکتا ہے:
runLogin آپ کا ٹرمینل Claude Code کے حوالے نہیں کرتا۔ یہ Claude Code کے اسٹینڈرڈ اِن پٹ کو ایک pipe سے جوڑتا ہے اور relayLogin آپ کی ٹائپ کی ہوئی ہر لائن اس میں کاپی کرتا ہے، اس لیے Claude Code کے Paste code here پرامپٹ پر چسپاں کیا گیا کوڈ پھر بھی پہنچ جاتا ہے۔ جب کوئی لائن callback پتا ہو تو callbackURL اسے صرف تب قبول کرتا ہے جب ہوسٹ localhost، 127.0.0.1 یا [::1] ہو، پورٹ دیا گیا ہو، راستہ /callback ہو اور code اور state دونوں موجود ہوں؛ http:// چھوڑا جا سکتا ہے۔ پھر deliverCallback سرور پر اس پتے کی درخواست 10 سیکنڈ کی حد کے ساتھ اور ری ڈائریکٹس پر عمل کیے بغیر کرتا ہے، جیسے براؤزر کرتا۔ درخواست انتظار کرنے والے claude auth login کے callback سرور تک پہنچتی ہے (ڈایاگرام میں ڈیش والی لائن)۔ Claude Code کوڈ وصول کر کے لاگ اِن محفوظ کرتا ہے، Linux پر اکاؤنٹ فولڈر کی .credentials.json میں۔ چسپاں کی گئی کوئی لائن کبھی ccam کو کسی دوسرے ہوسٹ سے رابطہ نہیں کروا سکتی۔
لاگ اِن شروع ہونے سے پہلے ccam یہ پرنٹ کرتا ہے:
On a remote machine? If the browser ends on a http://localhost:…/callback page that does not load, paste that address here.کامیابی پر یہ → Passed the sign-in to Claude Code on this machine. پرنٹ کرتا ہے۔
جب لاگ اِن ٹرمینل پر اِن پٹ کا انتظار کر رہا ہو تو ccam ٹرمینل کی echo اور لائن موڈ بند کر دیتا ہے اور آپ کے ٹائپ کیے ہوئے ہر حرف کے لیے ایک * دکھاتا ہے، اس لیے چسپاں کیا گیا کوڈ یا callback پتا اسکرین پر نظر نہیں آتا۔ readLine لائن کی ایڈیٹنگ خود کرتا ہے: Enter لائن بھیجتا ہے، Backspace ایک حرف مٹاتا ہے، اور خالی لائن پر Ctrl+D اِن پٹ ختم کرتا ہے۔ لاگ اِن ختم ہونے پر ٹرمینل بحال ہو جاتا ہے، اور Ctrl+C، SIGTERM یا SIGHUP پر بھی، جو اب بھی ccam کو ختم کرتے ہیں۔ اگر اسٹینڈرڈ اِن پٹ اور اسٹینڈرڈ ایرر پر ٹرمینل نہ ہو تو لائنیں جیسے آتی ہیں ویسے ہی کاپی ہوتی ہیں۔
نام بدلنا، ہٹانا اور امپورٹ کرنا
ccam rename اور ccam remove اکاؤنٹ کے فولڈر پر اور ان چیزوں پر عمل کرتے ہیں جو ccam اکاؤنٹ کے نام سے دوسری جگہوں پر رکھتا ہے۔ nameState ان راستوں کی فہرست ہے: ~/.local/state/ccam/last-used/<name>، ~/.local/state/ccam/mcp/<name> اور استعمال کے کیش ~/.local/state/ccam/usage/<name>.json اور <name>.statusline.json۔ ccam remove work انہیں اس ترتیب سے سنبھالتا ہے:
ccam remove پہلے انکار کرتا ہے اگر اکاؤنٹ چل رہا ہو، پھر پوچھتا ہے۔ اگر اکاؤنٹ ایکسٹینشنز شیئر کرتا ہو تو RewritePluginPaths گروپ کی installed_plugins.json اور known_marketplaces.json دوبارہ لکھتا ہے، کیونکہ Claude Code پلگ اِنز کے مکمل راستے محفوظ کرتا ہے جو اس اکاؤنٹ کے فولڈر سے گزر سکتے ہیں۔ profile.Trash فولڈر کو ~/.local/share/ccam/trash/<name>-<time>/ میں منتقل کرتا ہے، اکاؤنٹ config.toml سے نکل جاتا ہے، nameState کے راستے حذف ہو جاتے ہیں تاکہ بعد میں اسی نام کا اکاؤنٹ انہیں وراثت میں نہ پائے، اور شارٹ کٹ کا لنک ہٹا دیا جاتا ہے۔ واپس لانے کے لیے فولڈر کو trash سے واپس منتقل کریں۔
ccam rename فولڈر کا نام بدلتا ہے، اس کے plugins/ میں پلگ اِن کے راستے پرانے فولڈر سے نئے فولڈر پر دوبارہ لکھتا ہے، ڈیفالٹ کو ساتھ لے جاتا ہے، اور nameState کے راستوں کو نئے نام پر منتقل کرتا ہے۔ شارٹ کٹ کمانڈ اپنا نام برقرار رکھتی ہے۔ اگر پلگ اِن کے راستے دوبارہ لکھنا ناکام ہو تو فولڈر کا نام واپس بدل دیا جاتا ہے، کیونکہ کنفیگ محفوظ نہیں ہوتا۔
ccam import کسی فولڈر کو اس کی جگہ پر ہی، config.toml میں dir کے طور پر رجسٹر کرتا ہے۔ یہ اسے کبھی منتقل یا کاپی نہیں کرتا: کاپی کیا گیا ریفریش ٹوکن کاپیوں کو ایک دوسرے کو لاگ آؤٹ کروا دے گا۔ فولڈر آرگیومنٹ کے بغیر یہ غیر رجسٹر شدہ ~/.claude اور ~/.claude-* فولڈرز تلاش کرتا ہے اور ہر ایک کے بارے میں پوچھتا ہے؛ نام فولڈر سے آتے ہیں (~/.claude سے main، ~/.claude-work سے work، ~/.claude-2 سے acct2)، اور جس فولڈر کا نام اخذ نہ ہو سکے وہ استعمال کرنے کے لیے --name کمانڈ کے ساتھ دکھایا جاتا ہے۔ CLAUDE_CONFIG_DIR کے بغیر Claude Code، .claude.json کو آپ کے ہوم فولڈر میں ~/.claude کے ساتھ رکھتا ہے، اس لیے جب آپ ~/.claude امپورٹ کریں اور اس میں اپنی .claude.json نہ ہو تو ccam، ~/.claude/.claude.json سے ~/.claude.json کا لنک بناتا ہے۔ تب سادہ claude اور ccam main ایک ہی اکاؤنٹ دیکھتے ہیں۔ امپورٹ کیے گئے اکاؤنٹس تب تک کچھ شیئر نہیں کرتے جب تک آپ ccam share نہ چلائیں، اور کوئی شارٹ کٹ نہیں بنتا۔
ccam completion bash|zsh ایک completion اسکرپٹ پرنٹ کرتا ہے جو اکاؤنٹس کے نام بھی مکمل کرتا ہے۔
حفاظت اور خاص صورتیں
ccam renameاورccam removeاکاؤنٹ چلنے کے دوران (refuseRunning)work is running; quit its Claude Code session firstکے ساتھ انکار کرتے ہیں، کیونکہ سیشن فولڈر میں لکھتا رہتا ہے۔- امپورٹ کیے گئے اکاؤنٹ پر
ccam removeصرف اس کی رجسٹریشن ختم کرتا ہے:✓ main unregistered (folder ... left in place)۔ آپ کا~/.claude، trash میں منتقل نہیں ہوتا۔ ccam addایسا نام مسترد کرتا ہے جس کا فولڈرprofiles/میں پہلے سے موجود ہو، اورccam importکی طرف رہنمائی کرتا ہے۔ccam importپہلے سے رجسٹر شدہ فولڈر، ایسا راستہ جو فولڈر نہ ہو، اور پہلے سے لیا گیا نام مسترد کرتا ہے۔ccam logoutاورccam loginیہ نہیں جانچتے کہ اکاؤنٹ چل رہا ہے یا نہیں۔- اگر ریلے Claude Code تک نہ پہنچ سکے، مثلاً لاگ اِن ختم ہونے کے بعد، تو یہ وجہ کے ساتھ
ccam: could not pass the sign-in to Claude Code:پرنٹ کرتا ہے۔ HTTP غلطی کا عام طور پر مطلب ہے کہ کوڈ کی میعاد ختم ہو گئی؛ لاگ اِن دوبارہ شروع کریں۔