ฟีเจอร์

การใช้ร่วมกันระหว่างบัญชี

อัปเดตล่าสุด 19 ตุลาคม 2569
ตรวจสอบกับ 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 ระดับ global ไม่เปลี่ยน
--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 (global) รองรับ: ถามเรื่องความขัดแย้ง พิมพ์แผน และไม่เปลี่ยนแปลงสิ่งใด ปิด

ค่า 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 อ่านการตั้งค่า นำค่าของแต่ละ --<item> ไปใช้กับสำเนาของการตั้งค่าบัญชีด้วย config.Share.Set และปฏิเสธหากบัญชีกำลังทำงาน
  2. share.Build เปรียบเทียบการตั้งค่าปัจจุบันกับเป้าหมายแล้วระบุขั้นตอน โดยอ่านดิสก์อย่างเดียว: os.Lstat และ os.Readlink สำหรับทุกพาธใน share.Layout แผนคือรายการของการดำเนินการ ได้แก่ ย้ายเข้าไปในตำแหน่งที่ว่างของกลุ่ม (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 จะเปลี่ยนเพียงการตั้งค่าเท่านั้น

นี่คือสิ่งที่เกิดขึ้นกับโฟลเดอร์หนึ่งโฟลเดอร์ projects/ เมื่อ side เปิดการใช้ประวัติร่วมกันและกลุ่มมีเนื้อหาอยู่แล้ว:

หากกลุ่มยังไม่มีสิ่งใดในพาธนั้น บัญชีนี้จะเป็นบัญชีแรกที่ใช้ร่วมกัน และโฟลเดอร์ของบัญชีจะถูกย้ายไปที่นั่นตามเดิมโดยไม่มีการสำรอง ในกรณีอื่น mergeDir จะย้ายแต่ละไฟล์ที่กลุ่มยังไม่มีเข้าไปในกลุ่ม ส่วนไฟล์ที่มีอยู่ทั้งสองฝั่งจะยังคงอยู่ในโฟลเดอร์ของบัญชี เวอร์ชันของกลุ่มจึงถูกเก็บไว้ จากนั้นโฟลเดอร์ของบัญชีจะไปอยู่ที่ .ccam-backup/<time>/ ภายในโฟลเดอร์ของบัญชี และ os.Symlink จะวางลิงก์ไว้แทนที่ ไฟล์การสนทนาตั้งชื่อตาม session 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 โดยใช้การตั้งค่าที่บันทึกไว้ทั้งสองฝั่ง ซึ่งสร้างทุกขั้นตอนจากสิ่งที่อยู่บนดิสก์ เก็บเนื้อหาของกลุ่มไว้เมื่อขัดแย้งกัน และสำรองทุกสิ่งที่แทนที่

ความปลอดภัยและกรณีพิเศษ

  • บัญชีที่กำลังทำงาน ccam จะไม่เปลี่ยนการใช้ร่วมกันในขณะที่ Claude Code กำลังทำงานด้วยบัญชีนั้น (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 จะเตือนและถามก่อนทำงานต่อ