বৈশিষ্ট্য

অ্যাকাউন্টগুলোর মধ্যে শেয়ার করা

সর্বশেষ আপডেট ১৯ অক্টোবর, ২০২৬
ccam 0.6.0 এবং Claude Code 2.1.302 দিয়ে যাচাই করা

এই পাতাটি ইংরেজি থেকে মেশিনে অনুবাদ করা হয়েছে। সংশোধন স্বাগত। GitHub-এ এই পাতা সম্পাদনা করুন

এই পৃষ্ঠায়

প্রতিটি অ্যাকাউন্টের নিজস্ব ফোল্ডার আছে, কিন্তু তার ভেতরের বেশিরভাগ জিনিস আলাদা রাখার দরকার নেই। ccam share একবারে একটি অ্যাকাউন্ট ও একটি আইটেমের জন্য শেয়ার চালু বা বন্ধ করে: অ্যাকাউন্টের ফাইল বা ফোল্ডার একটি গ্রুপ ফোল্ডারে সরানো হয় এবং একটি সিম্বলিক লিংক দিয়ে প্রতিস্থাপিত হয়, তাই গ্রুপের প্রতিটি অ্যাকাউন্ট একই কপি পড়ে ও লেখে। ccam add-এর পরে কোনো অ্যাকাউন্ট কী শেয়ার করে তা বদলাতে, বা কয়েকটি অ্যাকাউন্টকে তাদের নিজস্ব একটি গ্রুপে রাখতে এটি ব্যবহার করুন।

ব্যবহার

ccam share work                       # show what work shares, and with which group
ccam share work --history on          # share conversation history with the default group
ccam share side --history team        # share it with the group team instead
ccam share work --settings off        # give work its own copy of settings.json again
ccam share work --memory off --fresh  # stop sharing CLAUDE.md and start with no file
ccam share work --settings on --yes --prefer merge   # no questions; merge JSON on conflicts
ccam --dry-run share work --history on               # print the plan, change nothing

আইটেম অপশন ছাড়া ccam share বর্তমান অবস্থা প্রিন্ট করে:

$ ccam share work
Sharing for work
  MCP servers                        shared (group default)  --mcp
  settings.json                      shared (group default)  --settings
  global CLAUDE.md                   shared (group default)  --memory
  agents, commands, skills, plugins  shared (group default)  --extensions
  conversation history               local                   --history

অপশন দিলে ccam একটি পরিকল্পনা প্রিন্ট করে, গ্রুপের কপি থেকে আলাদা প্রতিটি ফাইলের বিষয়ে জিজ্ঞেস করে, এবং কিছু বদলানোর আগে জিজ্ঞেস করে Proceed? [y/N]। নতুন অ্যাকাউন্ট কথোপকথনের ইতিহাস ছাড়া বাকি সবকিছু শেয়ার করে; MCP সার্ভার, সেটিংস ও ইতিহাস শেয়ার করুন ব্যবহারকারীর দিক থেকে প্রতিটি আইটেম বর্ণনা করে।

অপশন

অপশন কী করে ডিফল্ট
--mcp <on|off|group> MCP সার্ভার অপরিবর্তিত
--settings <on|off|group> settings.json অপরিবর্তিত
--memory <on|off|group> গ্লোবাল CLAUDE.md অপরিবর্তিত
--extensions <on|off|group> agents/, commands/, skills/, plugins/, output-styles/, rules/ অপরিবর্তিত
--history <on|off|group> projects/ ও history.jsonl অপরিবর্তিত
--fresh শেয়ার বন্ধ করার সময় গ্রুপের বিষয়বস্তু কপি করার বদলে খালি অবস্থা থেকে শুরু করে বন্ধ
--prefer <group|mine|merge> দ্বন্দ্ব কীভাবে মীমাংসা হবে জিজ্ঞেস করে; --yes দিলে প্রতিটি আইটেমের ডিফল্ট
-y, --yes জিজ্ঞেস না করেই চালায়; দ্বন্দ্ব --prefer অনুসরণ করে বন্ধ
-h, --help share-এর সাহায্য
--dry-run (গ্লোবাল) মানা হয়: দ্বন্দ্বের বিষয়ে জিজ্ঞেস করে, পরিকল্পনা প্রিন্ট করে, কিছু বদলায় না বন্ধ

মান on মানে গ্রুপ default, off মানে লোকাল (শেয়ার করা নয়), আর অন্য যেকোনো মান একটি গ্রুপের নাম। গ্রুপের নাম ~/.local/share/ccam/groups/-এর নিচে ফোল্ডারের নাম হয়, তাই ccam share side --history ../x invalid group name: "../x" দিয়ে ব্যর্থ হয়। অ্যাকাউন্ট দেওয়া হয় নাম বা নম্বর দিয়ে, এবং শুধু আপনার উল্লেখ করা আইটেমগুলো বদলায়।

এটি কীভাবে কাজ করে

সংশ্লিষ্ট ফাইলগুলো:

  • ~/.config/ccam/config.toml: প্রতিটি অ্যাকাউন্টের [profile.share] টেবিল, প্রতি আইটেমে একটি মান।
  • ~/.local/share/ccam/profiles/<name>/: অ্যাকাউন্টের CLAUDE_CONFIG_DIR।
  • ~/.local/share/ccam/groups/<group>/: শেয়ার করা কপিগুলো।
  1. internal/cli/share.go কনফিগ পড়ে, config.Share.Set দিয়ে অ্যাকাউন্টের সেটিংসের একটি কপিতে প্রতিটি --<item> মান প্রয়োগ করে, এবং অ্যাকাউন্টটি চলতে থাকলে প্রত্যাখ্যান করে।
  2. share.Build বর্তমান সেটিংস লক্ষ্যের সঙ্গে তুলনা করে ধাপগুলোর তালিকা দেয়। এটি শুধু ডিস্ক পড়ে: share.Layout-এর প্রতিটি পাথের জন্য os.Lstat ও os.Readlink। পরিকল্পনাটি অপারেশনের একটি তালিকা: গ্রুপের খালি জায়গায় সরানো (adopt), গ্রুপে না থাকা ফাইলগুলো সরানো (merge dir), মীমাংসিত দ্বন্দ্ব গ্রুপে লেখা, ব্যাকআপ, আনলিংক, লিংক, আবার কপি করা, প্লাগইন পাথ আবার লেখা এবং প্লাগইন রেজিস্ট্রি মার্জ করা।
  3. দ্বন্দ্বগুলো মীমাংসা হয়, প্রশ্নের মাধ্যমে বা --prefer দিয়ে।
  4. Plan.Describe পরিকল্পনাটি প্রিন্ট করে, এবং ccam জিজ্ঞেস করে।
  5. কিছু সরানোর আগেই লক্ষ্য সেটিংস config.toml-এ লেখা হয়। Plan.Apply মাঝপথে থেমে গেলে ccam doctor --fix ও আবার চালানো সংরক্ষিত লক্ষ্যের দিকে তাদের পরিকল্পনা তৈরি করে এবং পরিবর্তনটি শেষ করে।
  6. Plan.Apply ধাপগুলো ক্রমানুসারে চালায়। প্রতিটি ধাপ ডেটা গ্রুপে বা ব্যাকআপ ফোল্ডারে সরায়; কিছুই মুছে ফেলা হয় না।

share.Layout হলো প্রতিটি আইটেমের আওতাভুক্ত পাথগুলোর একটি অনুমোদিত তালিকা। এর বাইরের কোনো কিছু কখনও গ্রুপে পৌঁছাতে পারে না। share.Never .credentials.json ও .claude.json-এর নাম দেয়, এবং কোনোটি কখনও কাঠামোতে দেখা দিলে Build একটি অভ্যন্তরীণ ত্রুটি দিয়ে থেমে যায়। mcp আইটেমের কোনো পাথ নেই: সার্ভার তালিকা থাকে .claude.json-এর ভেতরে, তাই MCP শেয়ার এর বদলে গ্রুপের mcp.json-এর মাধ্যমে কাজ করে, আর --mcp শুধু সেটিংটি বদলায়।

side ইতিহাস চালু করলে এবং গ্রুপে আগে থেকেই বিষয়বস্তু থাকলে একটি ফোল্ডার, projects/-এর ক্ষেত্রে যা ঘটে:

গ্রুপে ওই পাথে এখনও কিছু না থাকলে অ্যাকাউন্টটিই প্রথম সেটি শেয়ার করে, এবং তার ফোল্ডারটি ব্যাকআপ ছাড়াই যেমন আছে তেমনই সেখানে সরানো হয়। অন্যথায় mergeDir গ্রুপে না থাকা প্রতিটি ফাইল গ্রুপে সরায়, আর দুই দিকেই থাকা ফাইলগুলো অ্যাকাউন্টের ফোল্ডারে থেকে যায়, তাই গ্রুপের সংস্করণ রাখা হয়। তারপর অ্যাকাউন্টের ফোল্ডারটি অ্যাকাউন্ট ফোল্ডারের ভেতরে .ccam-backup/<time>/-এ যায়, এবং os.Symlink তার জায়গায় একটি লিংক বসায়। কথোপকথনের ফাইলের নাম তাদের সেশন ID অনুযায়ী হয়, তাই একাধিক অ্যাকাউন্টের ইতিহাস কোনো সংঘাত ছাড়াই একত্র হয়।

সরানোর জন্য rename(2) ব্যবহার হয়, এবং ভিন্ন ফাইল সিস্টেমের মধ্যে এটি কপি ও মুছে ফেলায় ফিরে যায়। সরানো ট্রির ভেতরের যে আপেক্ষিক লিংক তার বাইরে নির্দেশ করত, সেটি পূর্ণ লিংক হিসেবে আবার লেখা হয় (fsutil.PortableLink), তাই নতুন জায়গা থেকেও সেটি ঠিকমতো পৌঁছায়। plugins/ রেজিস্ট্রি (installed_plugins.json, known_marketplaces.json) অ্যাকাউন্ট ফোল্ডারের মধ্য দিয়ে পূর্ণ পাথ রাখে; ccam সেগুলোকে গ্রুপের ফোল্ডারে নির্দেশ করায় এবং গ্রুপে আগে থেকেই রেজিস্ট্রি থাকলে অ্যাকাউন্টের এন্ট্রিগুলো তাতে মার্জ করে।

কোনো আইটেম বন্ধ করলে লিংকটি উল্টে যায়:

ccam লিংকটি সরায় শুধু যদি সেটি groups ফোল্ডারের ভেতরে নির্দেশ করে, তারপর CopyTree দিয়ে গ্রুপের বর্তমান বিষয়বস্তু অ্যাকাউন্টে কপি করে। --fresh দিলে কপি বাদ যায় এবং অ্যাকাউন্টটি ওই পাথে কিছু ছাড়াই শুরু হয়। অন্য অ্যাকাউন্টগুলোর জন্য গ্রুপ তার বিষয়বস্তু রেখে দেয়। একটি আইটেম এক গ্রুপ থেকে অন্য গ্রুপে সরালে সেটি আনলিংক হয়ে নতুন গ্রুপের সঙ্গে লিংক হয়, পুরোনো গ্রুপ যেমন আছে তেমনই থাকে; পরিকল্পনা একটি Note: লাইনে তা জানায়।

দুই দিকেই আলাদা বিষয়বস্তু নিয়ে থাকা একটি একক ফাইল হলো দ্বন্দ্ব:

share.NewConflict ফাইলটির জন্য উপযুক্ত পছন্দগুলোর তালিকা দেয়। history.jsonl দেয় merge by line, keep group ও use mine, মার্জ প্রথমে। অন্য .json ফাইল দেয় keep group, use mine ও merge JSON। বাকি সবকিছু দেয় keep group ও use mine। প্রথম পছন্দটিই ডিফল্ট:

history.jsonl differs from the group's copy.
  mine:  ~/.local/share/ccam/profiles/side/history.jsonl
  group: ~/.local/share/ccam/groups/default/history.jsonl
  1) merge by line
  2) keep group
  3) use mine
Choice [1]:

merge JSON (MergeJSONBytes) অবজেক্টগুলো রিকার্সিভভাবে মার্জ করে, অ্যারেগুলো ডুপ্লিকেট ছাড়া যুক্ত করে, এবং দুই দিকেই একই কী ভিন্নভাবে নির্ধারিত থাকলে গ্রুপের মান রাখে, তাই অন্য অ্যাকাউন্টগুলো আচরণে কোনো পরিবর্তন দেখে না। merge by line গ্রুপের লাইনগুলো রাখে, তারপর আপনার যে লাইনগুলো তাতে নেই সেগুলো যোগ করে। keep group ছাড়া প্রতিটি পছন্দ প্রথমে অ্যাকাউন্ট ফোল্ডারের .ccam-backup/<time>/group/-এ গ্রুপের কপি সংরক্ষণ করে, তারপর fsutil.AtomicWrite দিয়ে ফলাফল লেখে। আপনার নিজের ফাইল সবসময় ব্যাকআপে যায়।

--prefer group, mine বা merge জিজ্ঞেস না করেই প্রতিটি দ্বন্দ্বের মীমাংসা করে; merge মানে merge JSON বা merge by line, ফাইলটি যেটি দেয়, আর যে ফাইল কোনোটিই দেয় না সেটি ডিফল্ট রাখে। শুধু --yes প্রতিটি ফাইলের ডিফল্ট নেয়।

প্রতিবার চালু করার সময় share.Check কাঠামোর প্রতিটি পাথকে সেটিংয়ের সঙ্গে শুধু lstat ও readlink দিয়ে তুলনা করে, যা চালু করার পথের জন্য একে যথেষ্ট সস্তা রাখে। অনুপস্থিত লিংক সঙ্গে সঙ্গে তৈরি হয়, কারণ হারানোর কিছু নেই। যেখানে লিংক থাকার কথা সেখানে আসল ফাইল, ভুল জায়গায় লিংক, বা বাসি লিংক চালু করা থামিয়ে দেয়:

ccam: stopped because of share link problems:
  ~/.local/share/ccam/profiles/work/CLAUDE.md: set to shared but is a real file, not a link
Repair them with `ccam doctor --fix`, then run again

ccam doctor --fix দুই দিকেই সংরক্ষিত সেটিংস দিয়ে share.Build চালায়, যা ডিস্কে যা আছে তা থেকে প্রতিটি ধাপ বের করে, দ্বন্দ্বে গ্রুপের বিষয়বস্তু রাখে এবং যা প্রতিস্থাপন করে তার ব্যাকআপ রাখে।

নিরাপত্তা ও বিশেষ ক্ষেত্র

  • চলমান অ্যাকাউন্ট। অ্যাকাউন্ট হিসেবে Claude Code চলতে থাকলে ccam শেয়ার বদলাতে রাজি হয় না (account work is running; quit it first, then change its sharing), কারণ সেশনটি যে ফাইলগুলো সরানো হচ্ছে সেগুলোতে লিখতে থাকে এবং এর মধ্যে যোগ করা লাইনগুলো হারিয়ে যেত। --dry-run তবুও পরিকল্পনা প্রিন্ট করে।
  • ব্যাকআপ। প্রতিটি পরিকল্পনা অ্যাকাউন্ট ফোল্ডারে নিজস্ব .ccam-backup/<time>/ ফোল্ডার পায়, একই সেকেন্ডে দুটি পরিকল্পনা শুরু হলে একটি নম্বরযুক্ত প্রত্যয়সহ। ccam কখনও এগুলো মুছে ফেলে না।
  • আংশিক ব্যর্থতা। কোনো ধাপ ব্যর্থ হলে ccam ত্রুটি ও মূল ফাইলগুলো কোথায় আছে তা প্রিন্ট করে, এবং আপনাকে ccam doctor --fix দিয়ে শেষ করতে বলে। লক্ষ্য আগেই সংরক্ষিত, তাই মেরামত সেদিকেই এগোয়।
  • আপনার নিজের লিংক। কোনো পাথ যদি আগে থেকেই আপনার তৈরি করা একটি লিংক হয়, যেমন একটি dotfiles রিপোজিটরির দিকে, এবং গ্রুপ খালি থাকে, তাহলে ccam লিংকের লক্ষ্যটি গ্রুপে কপি করে এবং লিংকটিকেই ব্যাকআপে সরায়। লক্ষ্যটি স্পর্শ করা হয় না।
  • লগইন ফাইল। .credentials.json ও .claude.json কখনও গ্রুপে লিংক, সরানো বা কপি করা হয় না।
  • একই ফোল্ডারে দুটি অ্যাকাউন্ট। যে অ্যাকাউন্টগুলো ইতিহাস শেয়ার করে, সেগুলো একই ফাইলে লেখে। একই ইতিহাস গ্রুপের দ্বিতীয় একটি অ্যাকাউন্ট এমন ফোল্ডারে চালু হলে যেখানে একটি আগে থেকেই চলছে, ccam সতর্ক করে এবং চালিয়ে যাওয়ার আগে জিজ্ঞেস করে।